From 9aaf87c6d2947544932366b98a9966049b4a9794 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9on=20Hagenaars-Keus?= <7457283+LeonHagenaarsKeus@users.noreply.github.com> Date: Mon, 4 Aug 2025 14:16:38 +0200 Subject: [PATCH 01/96] docs: Updated putty link (#3020) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Solves issue #3019 (incorrect putty link) - putty.org is not affiliated with the putty software - the site now hosts links to interviews about a recent pandemic - this pull request updates the link to the actual project page Co-authored-by: Léon Hagenaars-Keus --- docs/docs/development/usb-logging.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/development/usb-logging.mdx b/docs/docs/development/usb-logging.mdx index 45c54ad04bd..98948b6d287 100644 --- a/docs/docs/development/usb-logging.mdx +++ b/docs/docs/development/usb-logging.mdx @@ -68,7 +68,7 @@ sudo tio /dev/ttyACM0 -On Windows, you can use [PuTTY](https://www.putty.org/). Once installed, use Device Manager to figure out which COM port your controller is communicating on (listed under 'Ports (COM & LPT)') and specify that as the 'Serial line' in PuTTY. +On Windows, you can use [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html). Once installed, use Device Manager to figure out which COM port your controller is communicating on (listed under 'Ports (COM & LPT)') and specify that as the 'Serial line' in PuTTY. ![Controller COM port](../assets/usb-logging/com.jpg) From e57bf5af3720b15d4a7c61d10d5cc0b85017829c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 22:29:08 +0100 Subject: [PATCH 02/96] chore(deps): bump the docusaurus-minor-patch group across 1 directory with 3 updates (#2973) Bumps the docusaurus-minor-patch group with 3 updates in the /docs directory: [@docusaurus/core](https://github.com/facebook/docusaurus/tree/HEAD/packages/docusaurus), [@docusaurus/preset-classic](https://github.com/facebook/docusaurus/tree/HEAD/packages/docusaurus-preset-classic) and [@docusaurus/theme-mermaid](https://github.com/facebook/docusaurus/tree/HEAD/packages/docusaurus-theme-mermaid). Updates `@docusaurus/core` from 3.8.0 to 3.8.1 - [Release notes](https://github.com/facebook/docusaurus/releases) - [Changelog](https://github.com/facebook/docusaurus/blob/main/CHANGELOG.md) - [Commits](https://github.com/facebook/docusaurus/commits/v3.8.1/packages/docusaurus) Updates `@docusaurus/preset-classic` from 3.8.0 to 3.8.1 - [Release notes](https://github.com/facebook/docusaurus/releases) - [Changelog](https://github.com/facebook/docusaurus/blob/main/CHANGELOG.md) - [Commits](https://github.com/facebook/docusaurus/commits/v3.8.1/packages/docusaurus-preset-classic) Updates `@docusaurus/theme-mermaid` from 3.8.0 to 3.8.1 - [Release notes](https://github.com/facebook/docusaurus/releases) - [Changelog](https://github.com/facebook/docusaurus/blob/main/CHANGELOG.md) - [Commits](https://github.com/facebook/docusaurus/commits/v3.8.1/packages/docusaurus-theme-mermaid) --- updated-dependencies: - dependency-name: "@docusaurus/core" dependency-version: 3.8.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: docusaurus-minor-patch - dependency-name: "@docusaurus/preset-classic" dependency-version: 3.8.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: docusaurus-minor-patch - dependency-name: "@docusaurus/theme-mermaid" dependency-version: 3.8.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: docusaurus-minor-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/package-lock.json | 854 +++++++++++++++++++++-------------------- docs/package.json | 6 +- 2 files changed, 445 insertions(+), 415 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index d4d6acd75b0..60deb282fa9 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -8,9 +8,9 @@ "name": "docs", "version": "0.0.0", "dependencies": { - "@docusaurus/core": "^3.8.0", - "@docusaurus/preset-classic": "^3.8.0", - "@docusaurus/theme-mermaid": "^3.8.0", + "@docusaurus/core": "^3.8.1", + "@docusaurus/preset-classic": "^3.8.1", + "@docusaurus/theme-mermaid": "^3.8.1", "@fortawesome/fontawesome-svg-core": "^6.7.1", "@fortawesome/free-solid-svg-icons": "^6.7.1", "@fortawesome/react-fontawesome": "^0.2.0", @@ -50,6 +50,21 @@ "webpack": "^5.97.1" } }, + "node_modules/@algolia/abtesting": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.1.0.tgz", + "integrity": "sha512-sEyWjw28a/9iluA37KLGu8vjxEIlb60uxznfTUmXImy7H5NvbpSO6yYgmgH5KiD7j+zTUUihiST0jEP12IoXow==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@algolia/autocomplete-core": { "version": "1.17.9", "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.9.tgz", @@ -96,99 +111,99 @@ } }, "node_modules/@algolia/client-abtesting": { - "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==", + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.35.0.tgz", + "integrity": "sha512-uUdHxbfHdoppDVflCHMxRlj49/IllPwwQ2cQ8DLC4LXr3kY96AHBpW0dMyi6ygkn2MtFCc6BxXCzr668ZRhLBQ==", "license": "MIT", "dependencies": { - "@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" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.25.0.tgz", - "integrity": "sha512-AFbG6VDJX/o2vDd9hqncj1B6B4Tulk61mY0pzTtzKClyTDlNP0xaUiEKhl6E7KO9I/x0FJF5tDCm0Hn6v5x18A==", + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.35.0.tgz", + "integrity": "sha512-SunAgwa9CamLcRCPnPHx1V2uxdQwJGqb1crYrRWktWUdld0+B2KyakNEeVn5lln4VyeNtW17Ia7V7qBWyM/Skw==", "license": "MIT", "dependencies": { - "@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" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.25.0.tgz", - "integrity": "sha512-il1zS/+Rc6la6RaCdSZ2YbJnkQC6W1wiBO8+SH+DE6CPMWBU6iDVzH0sCKSAtMWl9WBxoN6MhNjGBnCv9Yy2bA==", + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.35.0.tgz", + "integrity": "sha512-ipE0IuvHu/bg7TjT2s+187kz/E3h5ssfTtjpg1LbWMgxlgiaZIgTTbyynM7NfpSJSKsgQvCQxWjGUO51WSCu7w==", "license": "MIT", "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-insights": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.25.0.tgz", - "integrity": "sha512-blbjrUH1siZNfyCGeq0iLQu00w3a4fBXm0WRIM0V8alcAPo7rWjLbMJMrfBtzL9X5ic6wgxVpDADXduGtdrnkw==", + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.35.0.tgz", + "integrity": "sha512-UNbCXcBpqtzUucxExwTSfAe8gknAJ485NfPN6o1ziHm6nnxx97piIbcBQ3edw823Tej2Wxu1C0xBY06KgeZ7gA==", "license": "MIT", "dependencies": { - "@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" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.25.0.tgz", - "integrity": "sha512-aywoEuu1NxChBcHZ1pWaat0Plw7A8jDMwjgRJ00Mcl7wGlwuPt5dJ/LTNcg3McsEUbs2MBNmw0ignXBw9Tbgow==", + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.35.0.tgz", + "integrity": "sha512-/KWjttZ6UCStt4QnWoDAJ12cKlQ+fkpMtyPmBgSS2WThJQdSV/4UWcqCUqGH7YLbwlj3JjNirCu3Y7uRTClxvA==", "license": "MIT", "dependencies": { - "@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" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { - "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==", + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.35.0.tgz", + "integrity": "sha512-8oCuJCFf/71IYyvQQC+iu4kgViTODbXDk3m7yMctEncRSRV+u2RtDVlpGGfPlJQOrAY7OONwJlSHkmbbm2Kp/w==", "license": "MIT", "dependencies": { - "@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" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.25.0.tgz", - "integrity": "sha512-9rUYcMIBOrCtYiLX49djyzxqdK9Dya/6Z/8sebPn94BekT+KLOpaZCuc6s0Fpfq7nx5J6YY5LIVFQrtioK9u0g==", + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.35.0.tgz", + "integrity": "sha512-FfmdHTrXhIduWyyuko1YTcGLuicVbhUyRjO3HbXE4aP655yKZgdTIfMhZ/V5VY9bHuxv/fGEh3Od1Lvv2ODNTg==", "license": "MIT", "dependencies": { - "@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" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" @@ -201,81 +216,81 @@ "license": "MIT" }, "node_modules/@algolia/ingestion": { - "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==", + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.35.0.tgz", + "integrity": "sha512-gPzACem9IL1Co8mM1LKMhzn1aSJmp+Vp434An4C0OBY4uEJRcqsLN3uLBlY+bYvFg8C8ImwM9YRiKczJXRk0XA==", "license": "MIT", "dependencies": { - "@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" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/monitoring": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.25.0.tgz", - "integrity": "sha512-Ls3i1AehJ0C6xaHe7kK9vPmzImOn5zBg7Kzj8tRYIcmCWVyuuFwCIsbuIIz/qzUf1FPSWmw0TZrGeTumk2fqXg==", + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.35.0.tgz", + "integrity": "sha512-w9MGFLB6ashI8BGcQoVt7iLgDIJNCn4OIu0Q0giE3M2ItNrssvb8C0xuwJQyTy1OFZnemG0EB1OvXhIHOvQwWw==", "license": "MIT", "dependencies": { - "@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" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.25.0.tgz", - "integrity": "sha512-79sMdHpiRLXVxSjgw7Pt4R1aNUHxFLHiaTDnN2MQjHwJ1+o3wSseb55T9VXU4kqy3m7TUme3pyRhLk5ip/S4Mw==", + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.35.0.tgz", + "integrity": "sha512-AhrVgaaXAb8Ue0u2nuRWwugt0dL5UmRgS9LXe0Hhz493a8KFeZVUE56RGIV3hAa6tHzmAV7eIoqcWTQvxzlJeQ==", "license": "MIT", "dependencies": { - "@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" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.25.0.tgz", - "integrity": "sha512-JLaF23p1SOPBmfEqozUAgKHQrGl3z/Z5RHbggBu6s07QqXXcazEsub5VLonCxGVqTv6a61AAPr8J1G5HgGGjEw==", + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.35.0.tgz", + "integrity": "sha512-diY415KLJZ6x1Kbwl9u96Jsz0OstE3asjXtJ9pmk1d+5gPuQ5jQyEsgC+WmEXzlec3iuVszm8AzNYYaqw6B+Zw==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.25.0" + "@algolia/client-common": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.25.0.tgz", - "integrity": "sha512-rtzXwqzFi1edkOF6sXxq+HhmRKDy7tz84u0o5t1fXwz0cwx+cjpmxu/6OQKTdOJFS92JUYHsG51Iunie7xbqfQ==", + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.35.0.tgz", + "integrity": "sha512-uydqnSmpAjrgo8bqhE9N1wgcB98psTRRQXcjc4izwMB7yRl9C8uuAQ/5YqRj04U0mMQ+fdu2fcNF6m9+Z1BzDQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.25.0" + "@algolia/client-common": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "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==", + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.35.0.tgz", + "integrity": "sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.25.0" + "@algolia/client-common": "5.35.0" }, "engines": { "node": ">= 14.0.0" @@ -349,9 +364,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", - "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", + "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -425,13 +440,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", - "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -506,16 +521,16 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "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==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "resolve": "^1.22.10" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -651,9 +666,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -1618,16 +1633,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "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==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.0.tgz", + "integrity": "sha512-dGopk9nZrtCs2+nfIem25UuHyt5moSJamArzIoh9/vezUQPmYDOzjaHDCkAzuGJibCIkPup8rMT2+wYB6S73cA==", "license": "MIT", "dependencies": { "@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", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", "semver": "^6.3.1" }, "engines": { @@ -1637,6 +1652,19 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-runtime/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -1962,12 +1990,12 @@ } }, "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==", + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.2.tgz", + "integrity": "sha512-FVFaVs2/dZgD3Y9ZD+AKNKjyGKzwu0C54laAXWUXgLcVXcCX6YZ6GhK2cp7FogSN2OA0Fu+QT8dP3FUdo9ShSQ==", "license": "MIT", "dependencies": { - "core-js-pure": "^3.30.2" + "core-js-pure": "^3.43.0" }, "engines": { "node": ">=6.9.0" @@ -2239,9 +2267,9 @@ } }, "node_modules/@csstools/postcss-cascade-layers": { - "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==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", + "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", "funding": [ { "type": "github", @@ -2602,9 +2630,9 @@ } }, "node_modules/@csstools/postcss-is-pseudo-class": { - "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==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", + "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", "funding": [ { "type": "github", @@ -3260,9 +3288,9 @@ } }, "node_modules/@docusaurus/babel": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.8.0.tgz", - "integrity": "sha512-9EJwSgS6TgB8IzGk1L8XddJLhZod8fXT4ULYMx6SKqyCBqCFpVCEjR/hNXXhnmtVM2irDuzYoVLGWv7srG/VOA==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.8.1.tgz", + "integrity": "sha512-3brkJrml8vUbn9aeoZUlJfsI/GqyFcDgQJwQkmBtclJgWDEQBKKeagZfOgx0WfUQhagL1sQLNW0iBdxnI863Uw==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.9", @@ -3275,8 +3303,8 @@ "@babel/runtime": "^7.25.9", "@babel/runtime-corejs3": "^7.25.9", "@babel/traverse": "^7.25.9", - "@docusaurus/logger": "3.8.0", - "@docusaurus/utils": "3.8.0", + "@docusaurus/logger": "3.8.1", + "@docusaurus/utils": "3.8.1", "babel-plugin-dynamic-import-node": "^2.3.3", "fs-extra": "^11.1.1", "tslib": "^2.6.0" @@ -3286,30 +3314,30 @@ } }, "node_modules/@docusaurus/bundler": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.8.0.tgz", - "integrity": "sha512-Rq4Z/MSeAHjVzBLirLeMcjLIAQy92pF1OI+2rmt18fSlMARfTGLWRE8Vb+ljQPTOSfJxwDYSzsK6i7XloD2rNA==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.8.1.tgz", + "integrity": "sha512-/z4V0FRoQ0GuSLToNjOSGsk6m2lQUG4FRn8goOVoZSRsTrU8YR2aJacX5K3RG18EaX9b+52pN4m1sL3MQZVsQA==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.9", - "@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", + "@docusaurus/babel": "3.8.1", + "@docusaurus/cssnano-preset": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", "babel-loader": "^9.2.1", - "clean-css": "^5.3.2", + "clean-css": "^5.3.3", "copy-webpack-plugin": "^11.0.0", - "css-loader": "^6.8.1", + "css-loader": "^6.11.0", "css-minimizer-webpack-plugin": "^5.0.1", "cssnano": "^6.1.2", "file-loader": "^6.2.0", "html-minifier-terser": "^7.2.0", - "mini-css-extract-plugin": "^2.9.1", + "mini-css-extract-plugin": "^2.9.2", "null-loader": "^4.0.1", - "postcss": "^8.4.26", - "postcss-loader": "^7.3.3", - "postcss-preset-env": "^10.1.0", + "postcss": "^8.5.4", + "postcss-loader": "^7.3.4", + "postcss-preset-env": "^10.2.1", "terser-webpack-plugin": "^5.3.9", "tslib": "^2.6.0", "url-loader": "^4.1.1", @@ -3329,18 +3357,18 @@ } }, "node_modules/@docusaurus/core": { - "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.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", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.8.1.tgz", + "integrity": "sha512-ENB01IyQSqI2FLtOzqSI3qxG2B/jP4gQPahl2C3XReiLebcVh5B5cB9KYFvdoOqOWPyr5gXK4sjgTKv7peXCrA==", + "license": "MIT", + "dependencies": { + "@docusaurus/babel": "3.8.1", + "@docusaurus/bundler": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/mdx-loader": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", "boxen": "^6.2.1", "chalk": "^4.1.2", "chokidar": "^3.5.3", @@ -3390,13 +3418,13 @@ } }, "node_modules/@docusaurus/cssnano-preset": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.8.0.tgz", - "integrity": "sha512-UJ4hAS2T0R4WNy+phwVff2Q0L5+RXW9cwlH6AEphHR5qw3m/yacfWcSK7ort2pMMbDn8uGrD38BTm4oLkuuNoQ==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.8.1.tgz", + "integrity": "sha512-G7WyR2N6SpyUotqhGznERBK+x84uyhfMQM2MmDLs88bw4Flom6TY46HzkRkSEzaP9j80MbTN8naiL1fR17WQug==", "license": "MIT", "dependencies": { "cssnano-preset-advanced": "^6.1.2", - "postcss": "^8.4.38", + "postcss": "^8.5.4", "postcss-sort-media-queries": "^5.2.0", "tslib": "^2.6.0" }, @@ -3405,9 +3433,9 @@ } }, "node_modules/@docusaurus/logger": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.8.0.tgz", - "integrity": "sha512-7eEMaFIam5Q+v8XwGqF/n0ZoCld4hV4eCCgQkfcN9Mq5inoZa6PHHW9Wu6lmgzoK5Kx3keEeABcO2SxwraoPDQ==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.8.1.tgz", + "integrity": "sha512-2wjeGDhKcExEmjX8k1N/MRDiPKXGF2Pg+df/bDDPnnJWHXnVEZxXj80d6jcxp1Gpnksl0hF8t/ZQw9elqj2+ww==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", @@ -3418,14 +3446,14 @@ } }, "node_modules/@docusaurus/mdx-loader": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.8.0.tgz", - "integrity": "sha512-mDPSzssRnpjSdCGuv7z2EIAnPS1MHuZGTaRLwPn4oQwszu4afjWZ/60sfKjTnjBjI8Vl4OgJl2vMmfmiNDX4Ng==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.8.1.tgz", + "integrity": "sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.8.0", - "@docusaurus/utils": "3.8.0", - "@docusaurus/utils-validation": "3.8.0", + "@docusaurus/logger": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", "@mdx-js/mdx": "^3.0.0", "@slorber/remark-comment": "^1.0.0", "escape-html": "^1.0.3", @@ -3457,12 +3485,12 @@ } }, "node_modules/@docusaurus/module-type-aliases": { - "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==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.8.1.tgz", + "integrity": "sha512-6xhvAJiXzsaq3JdosS7wbRt/PwEPWHr9eM4YNYqVlbgG1hSK3uQDXTVvQktasp3VO6BmfYWPozueLWuj4gB+vg==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.8.0", + "@docusaurus/types": "3.8.1", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -3476,19 +3504,19 @@ } }, "node_modules/@docusaurus/plugin-content-blog": { - "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.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", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.8.1.tgz", + "integrity": "sha512-vNTpMmlvNP9n3hGEcgPaXyvTljanAKIUkuG9URQ1DeuDup0OR7Ltvoc8yrmH+iMZJbcQGhUJF+WjHLwuk8HSdw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/mdx-loader": "3.8.1", + "@docusaurus/theme-common": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", "cheerio": "1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^11.1.1", @@ -3510,20 +3538,20 @@ } }, "node_modules/@docusaurus/plugin-content-docs": { - "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.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", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.8.1.tgz", + "integrity": "sha512-oByRkSZzeGNQByCMaX+kif5Nl2vmtj2IHQI2fWjCfCootsdKZDPFLonhIp5s3IGJO7PLUfe0POyw0Xh/RrGXJA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/mdx-loader": "3.8.1", + "@docusaurus/module-type-aliases": "3.8.1", + "@docusaurus/theme-common": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", "@types/react-router-config": "^5.0.7", "combine-promises": "^1.1.0", "fs-extra": "^11.1.1", @@ -3543,16 +3571,16 @@ } }, "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.8.0.tgz", - "integrity": "sha512-39EDx2y1GA0Pxfion5tQZLNJxL4gq6susd1xzetVBjVIQtwpCdyloOfQBAgX0FylqQxfJrYqL0DIUuq7rd7uBw==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.8.1.tgz", + "integrity": "sha512-a+V6MS2cIu37E/m7nDJn3dcxpvXb6TvgdNI22vJX8iUTp8eoMoPa0VArEbWvCxMY/xdC26WzNv4wZ6y0iIni/w==", "license": "MIT", "dependencies": { - "@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", + "@docusaurus/core": "3.8.1", + "@docusaurus/mdx-loader": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", "fs-extra": "^11.1.1", "tslib": "^2.6.0", "webpack": "^5.88.1" @@ -3566,14 +3594,15 @@ } }, "node_modules/@docusaurus/plugin-css-cascade-layers": { - "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==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.8.1.tgz", + "integrity": "sha512-VQ47xRxfNKjHS5ItzaVXpxeTm7/wJLFMOPo1BkmoMG4Cuz4nuI+Hs62+RMk1OqVog68Swz66xVPK8g9XTrBKRw==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.8.0", - "@docusaurus/types": "3.8.0", - "@docusaurus/utils-validation": "3.8.0", + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", "tslib": "^2.6.0" }, "engines": { @@ -3581,14 +3610,14 @@ } }, "node_modules/@docusaurus/plugin-debug": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.8.0.tgz", - "integrity": "sha512-teonJvJsDB9o2OnG6ifbhblg/PXzZvpUKHFgD8dOL1UJ58u0lk8o0ZOkvaYEBa9nDgqzoWrRk9w+e3qaG2mOhQ==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.8.1.tgz", + "integrity": "sha512-nT3lN7TV5bi5hKMB7FK8gCffFTBSsBsAfV84/v293qAmnHOyg1nr9okEw8AiwcO3bl9vije5nsUvP0aRl2lpaw==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.8.0", - "@docusaurus/types": "3.8.0", - "@docusaurus/utils": "3.8.0", + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", "fs-extra": "^11.1.1", "react-json-view-lite": "^2.3.0", "tslib": "^2.6.0" @@ -3602,14 +3631,14 @@ } }, "node_modules/@docusaurus/plugin-google-analytics": { - "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==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.8.1.tgz", + "integrity": "sha512-Hrb/PurOJsmwHAsfMDH6oVpahkEGsx7F8CWMjyP/dw1qjqmdS9rcV1nYCGlM8nOtD3Wk/eaThzUB5TSZsGz+7Q==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.8.0", - "@docusaurus/types": "3.8.0", - "@docusaurus/utils-validation": "3.8.0", + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", "tslib": "^2.6.0" }, "engines": { @@ -3621,14 +3650,14 @@ } }, "node_modules/@docusaurus/plugin-google-gtag": { - "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==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.8.1.tgz", + "integrity": "sha512-tKE8j1cEZCh8KZa4aa80zpSTxsC2/ZYqjx6AAfd8uA8VHZVw79+7OTEP2PoWi0uL5/1Is0LF5Vwxd+1fz5HlKg==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.8.0", - "@docusaurus/types": "3.8.0", - "@docusaurus/utils-validation": "3.8.0", + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", "@types/gtag.js": "^0.0.12", "tslib": "^2.6.0" }, @@ -3641,14 +3670,14 @@ } }, "node_modules/@docusaurus/plugin-google-tag-manager": { - "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==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.8.1.tgz", + "integrity": "sha512-iqe3XKITBquZq+6UAXdb1vI0fPY5iIOitVjPQ581R1ZKpHr0qe+V6gVOrrcOHixPDD/BUKdYwkxFjpNiEN+vBw==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.8.0", - "@docusaurus/types": "3.8.0", - "@docusaurus/utils-validation": "3.8.0", + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", "tslib": "^2.6.0" }, "engines": { @@ -3660,17 +3689,17 @@ } }, "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.8.0.tgz", - "integrity": "sha512-fGpOIyJvNiuAb90nSJ2Gfy/hUOaDu6826e5w5UxPmbpCIc7KlBHNAZ5g4L4ZuHhc4hdfq4mzVBsQSnne+8Ze1g==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.8.1.tgz", + "integrity": "sha512-+9YV/7VLbGTq8qNkjiugIelmfUEVkTyLe6X8bWq7K5qPvGXAjno27QAfFq63mYfFFbJc7z+pudL63acprbqGzw==", "license": "MIT", "dependencies": { - "@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", + "@docusaurus/core": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", "fs-extra": "^11.1.1", "sitemap": "^7.1.1", "tslib": "^2.6.0" @@ -3684,15 +3713,15 @@ } }, "node_modules/@docusaurus/plugin-svgr": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.8.0.tgz", - "integrity": "sha512-kEDyry+4OMz6BWLG/lEqrNsL/w818bywK70N1gytViw4m9iAmoxCUT7Ri9Dgs7xUdzCHJ3OujolEmD88Wy44OA==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.8.1.tgz", + "integrity": "sha512-rW0LWMDsdlsgowVwqiMb/7tANDodpy1wWPwCcamvhY7OECReN3feoFwLjd/U4tKjNY3encj0AJSTxJA+Fpe+Gw==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.8.0", - "@docusaurus/types": "3.8.0", - "@docusaurus/utils": "3.8.0", - "@docusaurus/utils-validation": "3.8.0", + "@docusaurus/core": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", "@svgr/core": "8.1.0", "@svgr/webpack": "^8.1.0", "tslib": "^2.6.0", @@ -3707,26 +3736,26 @@ } }, "node_modules/@docusaurus/preset-classic": { - "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.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" + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.8.1.tgz", + "integrity": "sha512-yJSjYNHXD8POMGc2mKQuj3ApPrN+eG0rO1UPgSx7jySpYU+n4WjBikbrA2ue5ad9A7aouEtMWUoiSRXTH/g7KQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/plugin-content-blog": "3.8.1", + "@docusaurus/plugin-content-docs": "3.8.1", + "@docusaurus/plugin-content-pages": "3.8.1", + "@docusaurus/plugin-css-cascade-layers": "3.8.1", + "@docusaurus/plugin-debug": "3.8.1", + "@docusaurus/plugin-google-analytics": "3.8.1", + "@docusaurus/plugin-google-gtag": "3.8.1", + "@docusaurus/plugin-google-tag-manager": "3.8.1", + "@docusaurus/plugin-sitemap": "3.8.1", + "@docusaurus/plugin-svgr": "3.8.1", + "@docusaurus/theme-classic": "3.8.1", + "@docusaurus/theme-common": "3.8.1", + "@docusaurus/theme-search-algolia": "3.8.1", + "@docusaurus/types": "3.8.1" }, "engines": { "node": ">=18.0" @@ -3737,31 +3766,31 @@ } }, "node_modules/@docusaurus/theme-classic": { - "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.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", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.8.1.tgz", + "integrity": "sha512-bqDUCNqXeYypMCsE1VcTXSI1QuO4KXfx8Cvl6rYfY0bhhqN6d2WZlRkyLg/p6pm+DzvanqHOyYlqdPyP0iz+iw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/mdx-loader": "3.8.1", + "@docusaurus/module-type-aliases": "3.8.1", + "@docusaurus/plugin-content-blog": "3.8.1", + "@docusaurus/plugin-content-docs": "3.8.1", + "@docusaurus/plugin-content-pages": "3.8.1", + "@docusaurus/theme-common": "3.8.1", + "@docusaurus/theme-translations": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", "@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.4.26", + "postcss": "^8.5.4", "prism-react-renderer": "^2.3.0", "prismjs": "^1.29.0", "react-router-dom": "^5.3.4", @@ -3778,15 +3807,15 @@ } }, "node_modules/@docusaurus/theme-common": { - "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==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.8.1.tgz", + "integrity": "sha512-UswMOyTnPEVRvN5Qzbo+l8k4xrd5fTFu2VPPfD6FcW/6qUtVLmJTQCktbAL3KJ0BVXGm5aJXz/ZrzqFuZERGPw==", "license": "MIT", "dependencies": { - "@docusaurus/mdx-loader": "3.8.0", - "@docusaurus/module-type-aliases": "3.8.0", - "@docusaurus/utils": "3.8.0", - "@docusaurus/utils-common": "3.8.0", + "@docusaurus/mdx-loader": "3.8.1", + "@docusaurus/module-type-aliases": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -3806,16 +3835,16 @@ } }, "node_modules/@docusaurus/theme-mermaid": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.8.0.tgz", - "integrity": "sha512-ou0NJM37p4xrVuFaZp8qFe5Z/qBq9LuyRTP4KKRa0u2J3zC4f3saBJDgc56FyvvN1OsmU0189KGEPUjTr6hFxg==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.8.1.tgz", + "integrity": "sha512-IWYqjyTPjkNnHsFFu9+4YkeXS7PD1xI3Bn2shOhBq+f95mgDfWInkpfBN4aYvx4fTT67Am6cPtohRdwh4Tidtg==", "license": "MIT", "dependencies": { - "@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", + "@docusaurus/core": "3.8.1", + "@docusaurus/module-type-aliases": "3.8.1", + "@docusaurus/theme-common": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", "mermaid": ">=11.6.0", "tslib": "^2.6.0" }, @@ -3828,19 +3857,19 @@ } }, "node_modules/@docusaurus/theme-search-algolia": { - "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==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.8.1.tgz", + "integrity": "sha512-NBFH5rZVQRAQM087aYSRKQ9yGEK9eHd+xOxQjqNpxMiV85OhJDD4ZGz6YJIod26Fbooy54UWVdzNU0TFeUUUzQ==", "license": "MIT", "dependencies": { "@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", + "@docusaurus/core": "3.8.1", + "@docusaurus/logger": "3.8.1", + "@docusaurus/plugin-content-docs": "3.8.1", + "@docusaurus/theme-common": "3.8.1", + "@docusaurus/theme-translations": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-validation": "3.8.1", "algoliasearch": "^5.17.1", "algoliasearch-helper": "^3.22.6", "clsx": "^2.0.0", @@ -3859,9 +3888,9 @@ } }, "node_modules/@docusaurus/theme-translations": { - "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==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.8.1.tgz", + "integrity": "sha512-OTp6eebuMcf2rJt4bqnvuwmm3NVXfzfYejL+u/Y1qwKhZPrjPoKWfk1CbOP5xH5ZOPkiAsx4dHdQBRJszK3z2g==", "license": "MIT", "dependencies": { "fs-extra": "^11.1.1", @@ -3879,9 +3908,9 @@ "license": "MIT" }, "node_modules/@docusaurus/types": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.8.0.tgz", - "integrity": "sha512-RDEClpwNxZq02c+JlaKLWoS13qwWhjcNsi2wG1UpzmEnuti/z1Wx4SGpqbUqRPNSd8QWWePR8Cb7DvG0VN/TtA==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.8.1.tgz", + "integrity": "sha512-ZPdW5AB+pBjiVrcLuw3dOS6BFlrG0XkS2lDGsj8TizcnREQg3J8cjsgfDviszOk4CweNfwo1AEELJkYaMUuOPg==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -3914,14 +3943,14 @@ } }, "node_modules/@docusaurus/utils": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.8.0.tgz", - "integrity": "sha512-2wvtG28ALCN/A1WCSLxPASFBFzXCnP0YKCAFIPcvEb6imNu1wg7ni/Svcp71b3Z2FaOFFIv4Hq+j4gD7gA0yfQ==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.8.1.tgz", + "integrity": "sha512-P1ml0nvOmEFdmu0smSXOqTS1sxU5tqvnc0dA4MTKV39kye+bhQnjkIKEE18fNOvxjyB86k8esoCIFM3x4RykOQ==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.8.0", - "@docusaurus/types": "3.8.0", - "@docusaurus/utils-common": "3.8.0", + "@docusaurus/logger": "3.8.1", + "@docusaurus/types": "3.8.1", + "@docusaurus/utils-common": "3.8.1", "escape-string-regexp": "^4.0.0", "execa": "5.1.1", "file-loader": "^6.2.0", @@ -3946,12 +3975,12 @@ } }, "node_modules/@docusaurus/utils-common": { - "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==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.8.1.tgz", + "integrity": "sha512-zTZiDlvpvoJIrQEEd71c154DkcriBecm4z94OzEE9kz7ikS3J+iSlABhFXM45mZ0eN5pVqqr7cs60+ZlYLewtg==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.8.0", + "@docusaurus/types": "3.8.1", "tslib": "^2.6.0" }, "engines": { @@ -3959,14 +3988,14 @@ } }, "node_modules/@docusaurus/utils-validation": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.8.0.tgz", - "integrity": "sha512-MrnEbkigr54HkdFeg8e4FKc4EF+E9dlVwsY3XQZsNkbv3MKZnbHQ5LsNJDIKDROFe8PBf5C4qCAg5TPBpsjrjg==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.8.1.tgz", + "integrity": "sha512-gs5bXIccxzEbyVecvxg6upTwaUbfa0KMmTj7HhHzc016AGyxH2o73k1/aOD0IFrdCsfJNt37MqNI47s2MgRZMA==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.8.0", - "@docusaurus/utils": "3.8.0", - "@docusaurus/utils-common": "3.8.0", + "@docusaurus/logger": "3.8.1", + "@docusaurus/utils": "3.8.1", + "@docusaurus/utils-common": "3.8.1", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", @@ -6518,33 +6547,34 @@ } }, "node_modules/algoliasearch": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.25.0.tgz", - "integrity": "sha512-n73BVorL4HIwKlfJKb4SEzAYkR3Buwfwbh+MYxg2mloFph2fFGV58E90QTzdbfzWrLn4HE5Czx/WTjI8fcHaMg==", - "license": "MIT", - "dependencies": { - "@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" + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.35.0.tgz", + "integrity": "sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg==", + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.1.0", + "@algolia/client-abtesting": "5.35.0", + "@algolia/client-analytics": "5.35.0", + "@algolia/client-common": "5.35.0", + "@algolia/client-insights": "5.35.0", + "@algolia/client-personalization": "5.35.0", + "@algolia/client-query-suggestions": "5.35.0", + "@algolia/client-search": "5.35.0", + "@algolia/ingestion": "1.35.0", + "@algolia/monitoring": "1.35.0", + "@algolia/recommend": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/algoliasearch-helper": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.25.0.tgz", - "integrity": "sha512-vQoK43U6HXA9/euCqLjvyNdM4G2Fiu/VFp4ae0Gau9sZeIKBPvUPnXfLYAe65Bg7PFuw03coeu5K6lTPSXRObw==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.26.0.tgz", + "integrity": "sha512-Rv2x3GXleQ3ygwhkhJubhhYGsICmShLAiqtUuJTUkr9uOCOXyF2E71LVT4XDnVffbknv8XgScP4U0Oxtgm+hIw==", "license": "MIT", "dependencies": { "@algolia/events": "^4.0.1" @@ -6920,13 +6950,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "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==", + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.3", + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { @@ -6956,12 +6986,12 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "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==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3" + "@babel/helper-define-polyfill-provider": "^0.6.5" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -7131,9 +7161,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", - "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", "funding": [ { "type": "opencollective", @@ -7150,8 +7180,8 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001718", - "electron-to-chromium": "^1.5.160", + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, @@ -7295,9 +7325,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001720", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001720.tgz", - "integrity": "sha512-Ec/2yV2nNPwb4DnTANEV99ZWwm3ZWfdlfkQbWSDDt+PsXEVYwlhPH8tdMaPunYTKKmz7AnHi2oNEi1GcmKCD8g==", + "version": "1.0.30001731", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001731.tgz", + "integrity": "sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==", "funding": [ { "type": "opencollective", @@ -7958,12 +7988,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.41.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", - "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.44.0.tgz", + "integrity": "sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==", "license": "MIT", "dependencies": { - "browserslist": "^4.24.4" + "browserslist": "^4.25.1" }, "funding": { "type": "opencollective", @@ -7971,9 +8001,9 @@ } }, "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==", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.44.0.tgz", + "integrity": "sha512-gvMQAGB4dfVUxpYD0k3Fq8J+n5bB6Ytl15lqlZrOIXFzxOhtPaObfkQGHtMRdyjIf7z2IeNULwi1jEwyS+ltKQ==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -8318,9 +8348,9 @@ } }, "node_modules/cssdb": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.3.0.tgz", - "integrity": "sha512-c7bmItIg38DgGjSwDPZOYF/2o0QU/sSgkWOMyl8votOfgFuyiFKWPesmCGEsrGLxEA9uL540cp8LdaGEjUGsZQ==", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.3.1.tgz", + "integrity": "sha512-XnDRQMXucLueX92yDe0LPKupXetWoFOgawr4O4X41l5TltgK2NVbJJVDnnOywDYfW1sTJ28AcXGKOqdRKwCcmQ==", "funding": [ { "type": "opencollective", @@ -9056,9 +9086,9 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -9461,9 +9491,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "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==", + "version": "1.5.194", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.194.tgz", + "integrity": "sha512-SdnWJwSUot04UR51I2oPD8kuP2VI37/CADR1OHsFOUzZIvfWJBO6q11k5P/uKNyTT3cdOsnyjkrZ+DDShqYqJA==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -15709,9 +15739,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.10.tgz", - "integrity": "sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", @@ -16717,9 +16747,9 @@ } }, "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "funding": [ { "type": "opencollective", @@ -16736,7 +16766,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.8", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -16957,9 +16987,9 @@ } }, "node_modules/postcss-custom-properties": { - "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==", + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", + "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", "funding": [ { "type": "github", @@ -17563,9 +17593,9 @@ } }, "node_modules/postcss-nesting": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.1.tgz", - "integrity": "sha512-VbqqHkOBOt4Uu3G8Dm8n6lU5+9cJFxiuty9+4rcoyRPO9zZS1JIs6td49VIoix3qYqELHlJIn46Oih9SAKo+yQ==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", + "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", "funding": [ { "type": "github", @@ -17578,7 +17608,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/selector-resolve-nested": "^3.0.0", + "@csstools/selector-resolve-nested": "^3.1.0", "@csstools/selector-specificity": "^5.0.0", "postcss-selector-parser": "^7.0.0" }, @@ -17590,9 +17620,9 @@ } }, "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.0.0.tgz", - "integrity": "sha512-ZoK24Yku6VJU1gS79a5PFmC8yn3wIapiKmPgun0hZgEI5AOqgH2kiPRsPz1qkGv4HL+wuDLH83yQyk6inMYrJQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", + "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", "funding": [ { "type": "github", @@ -17877,9 +17907,9 @@ } }, "node_modules/postcss-preset-env": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.2.0.tgz", - "integrity": "sha512-cl13sPBbSqo1Q7Ryb19oT5NZO5IHFolRbIMdgDq4f9w1MHYiL6uZS7uSsjXJ1KzRIcX5BMjEeyxmAevVXENa3Q==", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.2.4.tgz", + "integrity": "sha512-q+lXgqmTMdB0Ty+EQ31SuodhdfZetUlwCA/F0zRcd/XdxjzI+Rl2JhZNz5US2n/7t9ePsvuhCnEN4Bmu86zXlA==", "funding": [ { "type": "github", @@ -17892,7 +17922,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/postcss-cascade-layers": "^5.0.1", + "@csstools/postcss-cascade-layers": "^5.0.2", "@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", @@ -17904,7 +17934,7 @@ "@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.1", + "@csstools/postcss-is-pseudo-class": "^5.0.3", "@csstools/postcss-light-dark-function": "^2.0.9", "@csstools/postcss-logical-float-and-clear": "^3.0.0", "@csstools/postcss-logical-overflow": "^2.0.0", @@ -17926,7 +17956,7 @@ "@csstools/postcss-trigonometric-functions": "^4.0.9", "@csstools/postcss-unset-value": "^4.0.0", "autoprefixer": "^10.4.21", - "browserslist": "^4.24.5", + "browserslist": "^4.25.0", "css-blank-pseudo": "^7.0.1", "css-has-pseudo": "^7.0.2", "css-prefers-color-scheme": "^10.0.0", @@ -17937,7 +17967,7 @@ "postcss-color-hex-alpha": "^10.0.0", "postcss-color-rebeccapurple": "^10.0.0", "postcss-custom-media": "^11.0.6", - "postcss-custom-properties": "^14.0.5", + "postcss-custom-properties": "^14.0.6", "postcss-custom-selectors": "^8.0.5", "postcss-dir-pseudo-class": "^9.0.1", "postcss-double-position-gradients": "^6.0.2", @@ -17948,7 +17978,7 @@ "postcss-image-set-function": "^7.0.0", "postcss-lab-function": "^7.0.10", "postcss-logical": "^8.1.0", - "postcss-nesting": "^13.0.1", + "postcss-nesting": "^13.0.2", "postcss-opacity-percentage": "^3.0.0", "postcss-overflow-shorthand": "^6.0.0", "postcss-page-break": "^3.0.4", @@ -18596,9 +18626,9 @@ "license": "MIT" }, "node_modules/react-json-view-lite": { - "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==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.4.2.tgz", + "integrity": "sha512-m7uTsXDgPQp8R9bJO4HD/66+i218eyQPAb+7/dGQpwg8i4z2afTFqtHJPQFHvJfgDCjGQ1HSGlL3HtrZDa3Tdg==", "license": "MIT", "engines": { "node": ">=18" diff --git a/docs/package.json b/docs/package.json index a48fe5ef2b2..bb42cac0a50 100644 --- a/docs/package.json +++ b/docs/package.json @@ -15,9 +15,9 @@ "typecheck": "tsc" }, "dependencies": { - "@docusaurus/core": "^3.8.0", - "@docusaurus/preset-classic": "^3.8.0", - "@docusaurus/theme-mermaid": "^3.8.0", + "@docusaurus/core": "^3.8.1", + "@docusaurus/preset-classic": "^3.8.1", + "@docusaurus/theme-mermaid": "^3.8.1", "@fortawesome/fontawesome-svg-core": "^6.7.1", "@fortawesome/free-solid-svg-icons": "^6.7.1", "@fortawesome/react-fontawesome": "^0.2.0", From 90363719a2861787d54937d62654de0e8f047259 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 22:32:36 +0100 Subject: [PATCH 03/96] chore(deps): bump on-headers and compression in /docs (#2999) --- updated-dependencies: - dependency-name: on-headers dependency-version: 1.1.0 dependency-type: indirect - dependency-name: compression dependency-version: 1.8.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 60deb282fa9..e04cb6ab3c0 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -7733,16 +7733,16 @@ } }, "node_modules/compression": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz", - "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", "license": "MIT", "dependencies": { "bytes": "3.1.2", "compressible": "~2.0.18", "debug": "2.6.9", "negotiator": "~0.6.4", - "on-headers": "~1.0.2", + "on-headers": "~1.1.0", "safe-buffer": "5.2.1", "vary": "~1.1.2" }, @@ -16145,9 +16145,9 @@ } }, "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "license": "MIT", "engines": { "node": ">= 0.8" From cc19ff7c5bde53bb64382d9a18b64d63bdf6fb5e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 22:54:01 +0100 Subject: [PATCH 04/96] chore(deps): bump http-proxy-middleware from 2.0.7 to 2.0.9 in /docs (#2929) Bumps [http-proxy-middleware](https://github.com/chimurai/http-proxy-middleware) from 2.0.7 to 2.0.9. - [Release notes](https://github.com/chimurai/http-proxy-middleware/releases) - [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v2.0.9/CHANGELOG.md) - [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v2.0.7...v2.0.9) --- updated-dependencies: - dependency-name: http-proxy-middleware dependency-version: 2.0.9 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index e04cb6ab3c0..c2a741313c2 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -11822,9 +11822,9 @@ } }, "node_modules/http-proxy-middleware": { - "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==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", From 919bce7962db78139415ccf0e80fb858c89adb3d Mon Sep 17 00:00:00 2001 From: Nicolas Munnich <98408764+nmunnich@users.noreply.github.com> Date: Mon, 4 Aug 2025 23:44:16 +0100 Subject: [PATCH 05/96] fix(docs): Tweak layer tap example to be clearer (#3023) --- docs/docs/keymaps/behaviors/hold-tap.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/keymaps/behaviors/hold-tap.mdx b/docs/docs/keymaps/behaviors/hold-tap.mdx index 755230a29f0..fa20d54694d 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 -< 3 SPACE +< 1 A ``` ### Configuration From f3233c1b60e4cb4c095572740bcbcaf7111eb804 Mon Sep 17 00:00:00 2001 From: Nicolas Munnich <98408764+nmunnich@users.noreply.github.com> Date: Mon, 4 Aug 2025 23:54:03 +0100 Subject: [PATCH 06/96] fix(ci): Fix release please template bump (#3021) --- .github/workflows/release-please.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index 14fadc39403..56dfcfbc684 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -69,10 +69,10 @@ jobs: exit 1 fi - 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 + git config user.name github-actions[bot] + git config user.email 41898282+github-actions[bot]@users.noreply.github.com sed -i 's/^\(\s*\)revision: .*/\1revision: '"$VERSION"'/' config/west.yml sed -i 's|uses: zmkfirmware/zmk/.github/workflows/build-user-config.yml@.*|uses: zmkfirmware/zmk/.github/workflows/build-user-config.yml@'"$VERSION"'|' .github/workflows/build.yml git add . From a8a392807e1d3908bb53e90d35aae8558e2b96d1 Mon Sep 17 00:00:00 2001 From: Artem <7541981+efogdev@users.noreply.github.com> Date: Tue, 5 Aug 2025 02:20:39 +0300 Subject: [PATCH 07/96] chore(docs): correct a misleading _defconfig description (#3015) * docs: correct a misleading _defconfig description * chore(docs): improve _defconfig description Co-authored-by: Joel Spadin --------- Co-authored-by: Joel Spadin --- docs/docs/config/index.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/docs/config/index.md b/docs/docs/config/index.md index d449f4ddfe1..a92944b55ba 100644 --- a/docs/docs/config/index.md +++ b/docs/docs/config/index.md @@ -78,7 +78,9 @@ CONFIG_EC11=y CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y ``` -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. +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`. Note that options are _not_ prefixed with `CONFIG_` in these files. See [Zephyr's Kconfig documentation](https://docs.zephyrproject.org/3.5.0/build/kconfig/index.html) for more details on Kconfig files. From 45700887ba85aa6d21bb8f042619ab3a83d9351a Mon Sep 17 00:00:00 2001 From: Peter Cock Date: Thu, 7 Aug 2025 22:26:17 +0100 Subject: [PATCH 08/96] Suggest using cu for USB log viewing on macOS (#3027) * Suggest using cu for USB log viewing on macOS It may not be as friendly, but cu should be available while tio could be hard to install. * Polish wording Co-authored-by: Nicolas Munnich <98408764+nmunnich@users.noreply.github.com> * Suggest "man cu" for how to use this tool --------- Co-authored-by: Nicolas Munnich <98408764+nmunnich@users.noreply.github.com> --- docs/docs/development/usb-logging.mdx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/docs/development/usb-logging.mdx b/docs/docs/development/usb-logging.mdx index 98948b6d287..ad4bb2e475d 100644 --- a/docs/docs/development/usb-logging.mdx +++ b/docs/docs/development/usb-logging.mdx @@ -86,7 +86,13 @@ You can connect to the device with [tio](https://tio.github.io/) (can be install sudo tio /dev/tty.usbmodem14401 ``` -You should see tio printing `Disconnected` or `Connected` when you disconnect or reconnect the USB cable. +Alternatively, `cu` should be preinstalled (see `man cu` for usage instructions): + +```sh +sudo cu -l /dev/tty.usbmodem14401 +``` + +You should see the console printing `Disconnected` or `Connected` when you disconnect or reconnect the USB cable. From 3609ac6fc8d271add17e982cc7253a145b3d71ee Mon Sep 17 00:00:00 2001 From: Maxim <92534529+maxchaston@users.noreply.github.com> Date: Thu, 7 Aug 2025 22:33:38 +0100 Subject: [PATCH 09/96] docs: fix typo for pip requirements (#3029) --- docs/docs/development/local-toolchain/setup/native.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/development/local-toolchain/setup/native.mdx b/docs/docs/development/local-toolchain/setup/native.mdx index 822359f09b8..4f9db6ebfc4 100644 --- a/docs/docs/development/local-toolchain/setup/native.mdx +++ b/docs/docs/development/local-toolchain/setup/native.mdx @@ -206,7 +206,7 @@ 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 +pip install -r zephyr/scripts/requirements-extras.txt ``` From 61da930ed58a23b6fbfe8ea1988b4738b8ae84d3 Mon Sep 17 00:00:00 2001 From: Nicolas Munnich <98408764+nmunnich@users.noreply.github.com> Date: Fri, 8 Aug 2025 18:13:57 +0100 Subject: [PATCH 10/96] chore(ci): Set days before issue stale to 1000 (#3022) --- .github/workflows/stale.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 4804c38a117..ece7eda3182 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -22,6 +22,7 @@ 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 From c7fae18ae122b2465080507380dd55d096edd666 Mon Sep 17 00:00:00 2001 From: Marius Petcu Date: Sat, 9 Aug 2025 01:47:03 +0300 Subject: [PATCH 11/96] feat(boards): add support for nrf52840dongle_nrf52840 (#3011) This adds additional required configs for the Nordic NRF52840 Dongle (PCA10059), which was already supported by Zephyr, but didn't have flash settings and Bluetooth enabled. --- app/boards/nrf52840dongle_nrf52840.conf | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 app/boards/nrf52840dongle_nrf52840.conf diff --git a/app/boards/nrf52840dongle_nrf52840.conf b/app/boards/nrf52840dongle_nrf52840.conf new file mode 100644 index 00000000000..97e95bf7c14 --- /dev/null +++ b/app/boards/nrf52840dongle_nrf52840.conf @@ -0,0 +1,12 @@ +# Copyright (c) 2025 The ZMK Contributors +# SPDX-License-Identifier: MIT + +CONFIG_ZMK_BLE=y +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 From ccf20a1f5c1534a197d32279abbe0eaf651099d8 Mon Sep 17 00:00:00 2001 From: Nicolas Munnich <98408764+nmunnich@users.noreply.github.com> Date: Sun, 10 Aug 2025 22:00:35 +0100 Subject: [PATCH 12/96] feat(boards/shields): Add settings for Rpi Pico and add tester_rpi_pico shield (#2900) * feat(boards): Properly support settings for RPi Pico board. * feat(shields): Add a tester_rpi_pico shield --------- Co-authored-by: Peter Johanson --- app/boards/rpi_pico.conf | 7 ++ app/boards/rpi_pico.overlay | 15 +++ .../shields/tester_rpi_pico/Kconfig.defconfig | 12 +++ .../shields/tester_rpi_pico/Kconfig.shield | 2 + .../tester_rpi_pico-layouts.dtsi | 95 +++++++++++++++++++ .../tester_rpi_pico/tester_rpi_pico.keymap | 77 +++++++++++++++ .../tester_rpi_pico/tester_rpi_pico.overlay | 63 ++++++++++++ .../tester_rpi_pico/tester_rpi_pico.zmk.yml | 6 ++ 8 files changed, 277 insertions(+) create mode 100644 app/boards/rpi_pico.overlay create mode 100644 app/boards/shields/tester_rpi_pico/Kconfig.defconfig create mode 100644 app/boards/shields/tester_rpi_pico/Kconfig.shield create mode 100644 app/boards/shields/tester_rpi_pico/tester_rpi_pico-layouts.dtsi create mode 100644 app/boards/shields/tester_rpi_pico/tester_rpi_pico.keymap create mode 100644 app/boards/shields/tester_rpi_pico/tester_rpi_pico.overlay create mode 100644 app/boards/shields/tester_rpi_pico/tester_rpi_pico.zmk.yml diff --git a/app/boards/rpi_pico.conf b/app/boards/rpi_pico.conf index f0db8ed14dc..286ec25ab8b 100644 --- a/app/boards/rpi_pico.conf +++ b/app/boards/rpi_pico.conf @@ -3,3 +3,10 @@ CONFIG_SERIAL=n CONFIG_UART_CONSOLE=n CONFIG_UART_INTERRUPT_DRIVEN=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/rpi_pico.overlay b/app/boards/rpi_pico.overlay new file mode 100644 index 00000000000..5368ab290eb --- /dev/null +++ b/app/boards/rpi_pico.overlay @@ -0,0 +1,15 @@ + +&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/shields/tester_rpi_pico/Kconfig.defconfig b/app/boards/shields/tester_rpi_pico/Kconfig.defconfig new file mode 100644 index 00000000000..740c6b676e0 --- /dev/null +++ b/app/boards/shields/tester_rpi_pico/Kconfig.defconfig @@ -0,0 +1,12 @@ +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 new file mode 100644 index 00000000000..19246d1803c --- /dev/null +++ b/app/boards/shields/tester_rpi_pico/Kconfig.shield @@ -0,0 +1,2 @@ +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 new file mode 100644 index 00000000000..77eda01ee6d --- /dev/null +++ b/app/boards/shields/tester_rpi_pico/tester_rpi_pico-layouts.dtsi @@ -0,0 +1,95 @@ +/* + * 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 new file mode 100644 index 00000000000..f938b5ea4e7 --- /dev/null +++ b/app/boards/shields/tester_rpi_pico/tester_rpi_pico.keymap @@ -0,0 +1,77 @@ +#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>; + }; + }; +}; \ No newline at end of file diff --git a/app/boards/shields/tester_rpi_pico/tester_rpi_pico.overlay b/app/boards/shields/tester_rpi_pico/tester_rpi_pico.overlay new file mode 100644 index 00000000000..6fcacd708ae --- /dev/null +++ b/app/boards/shields/tester_rpi_pico/tester_rpi_pico.overlay @@ -0,0 +1,63 @@ +#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 new file mode 100644 index 00000000000..560eca58650 --- /dev/null +++ b/app/boards/shields/tester_rpi_pico/tester_rpi_pico.zmk.yml @@ -0,0 +1,6 @@ +file_format: "1" +id: tester_rpi_pico +name: TesterRpiPico +type: shield +url: https://zmk.dev/docs/troubleshooting/hardware-issues +requires: [rpi_pico] From 62007e500b694c13f062c196dcd3a6ef7192649e Mon Sep 17 00:00:00 2001 From: Nicolas Munnich <98408764+nmunnich@users.noreply.github.com> Date: Sat, 16 Aug 2025 09:05:27 +0100 Subject: [PATCH 13/96] docs: Add devicetree primer (#2715) * docs: Add devicetree primer * docs: Apply suggestions from code review Co-authored-by: Cem Aksoylar * docs: Move devicetree property types into primer and link to primer * docs: Changes from code review Co-authored-by: Cem Aksoylar --------- Co-authored-by: Cem Aksoylar --- docs/docs/config/index.md | 89 +------- docs/docs/development/devicetree.md | 322 ++++++++++++++++++++++++++++ docs/sidebars.js | 1 + 3 files changed, 326 insertions(+), 86 deletions(-) create mode 100644 docs/docs/development/devicetree.md diff --git a/docs/docs/config/index.md b/docs/docs/config/index.md index a92944b55ba..dd0e7ad737d 100644 --- a/docs/docs/config/index.md +++ b/docs/docs/config/index.md @@ -112,7 +112,9 @@ 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. +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 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: @@ -186,88 +188,3 @@ 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/development/devicetree.md b/docs/docs/development/devicetree.md new file mode 100644 index 00000000000..8c3401faf2b --- /dev/null +++ b/docs/docs/development/devicetree.md @@ -0,0 +1,322 @@ +--- +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/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. 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/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. 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/3.5.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/3.5.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/sidebars.js b/docs/sidebars.js index 3d55192b0b3..63b8ec3fe34 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -208,6 +208,7 @@ module.exports = { }, "development/module-creation", "development/usb-logging", + "development/devicetree", "development/studio-rpc-protocol", "development/new-behavior", ], From 9fcce45cb52a94d7436eb685e66d29645cf4ca2e Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sat, 16 Aug 2025 22:29:11 -0700 Subject: [PATCH 14/96] docs: Fix remaining typos for requirements extras (#3035) --- .../development/local-toolchain/setup/native.mdx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/docs/development/local-toolchain/setup/native.mdx b/docs/docs/development/local-toolchain/setup/native.mdx index 4f9db6ebfc4..467d13ca710 100644 --- a/docs/docs/development/local-toolchain/setup/native.mdx +++ b/docs/docs/development/local-toolchain/setup/native.mdx @@ -203,7 +203,7 @@ west zephyr-export 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: +If you are going to build firmware with [ZMK Studio](../../../features/studio.md), also install `requirements-extras.txt` dependencies: ```sh pip install -r zephyr/scripts/requirements-extras.txt @@ -301,10 +301,10 @@ west zephyr-export 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: +If you are going to build firmware with [ZMK Studio](../../../features/studio.md), also install `requirements-extras.txt` dependencies: ```sh -pip3 install -r zephyr/scripts/requirements-extra.txt +pip3 install -r zephyr/scripts/requirements-extras.txt ``` @@ -317,10 +317,10 @@ pip3 install -r zephyr/scripts/requirements-extra.txt 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: +If you are going to build firmware with [ZMK Studio](../../../features/studio.md), also install `requirements-extras.txt` dependencies: ```sh -pip install -r zephyr/scripts/requirements-extra.txt +pip install -r zephyr/scripts/requirements-extras.txt ``` @@ -332,10 +332,10 @@ pip install -r zephyr/scripts/requirements-extra.txt 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: +If you are going to build firmware with [ZMK Studio](../../../features/studio.md), also install `requirements-extras.txt` dependencies: ```sh -pip3 install -r zephyr/scripts/requirements-extra.txt +pip3 install -r zephyr/scripts/requirements-extras.txt ``` From 5225952f96f1c0445f64b898e895f5ed421771ae Mon Sep 17 00:00:00 2001 From: Kurtis Lew Date: Mon, 18 Aug 2025 04:15:58 -0400 Subject: [PATCH 15/96] chore(docs): Typo in CMake Arguments example code blocks (#3038) --- docs/docs/development/local-toolchain/build-flash.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/development/local-toolchain/build-flash.mdx b/docs/docs/development/local-toolchain/build-flash.mdx index 7b86a618d6f..5afe8e541aa 100644 --- a/docs/docs/development/local-toolchain/build-flash.mdx +++ b/docs/docs/development/local-toolchain/build-flash.mdx @@ -99,14 +99,14 @@ 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=kyra_left +west config build.cmake-args -- -DSHIELD=kyria_left ``` Multiple arguments are added by assigning a string to the configuration option: ```sh west config build.cmake-args \ - -- "-DSHIELD=kyra_left -DZMK_CONFIG=/absolute/path/to/zmk-config" + -- "-DSHIELD=kyria_left -DZMK_CONFIG=/absolute/path/to/zmk-config" ``` ### Pristine Building From 5144de677d6474ca40695c1841b725ba3160ccba Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Mon, 18 Aug 2025 12:04:35 -0700 Subject: [PATCH 16/96] docs: Document usage of persistent settings explicitly (#3036) --- docs/docs/config/settings.md | 48 +++++++++++++++++++ docs/docs/config/system.md | 19 +++++--- .../troubleshooting/connection-issues.mdx | 1 + docs/sidebars.js | 1 + 4 files changed, 62 insertions(+), 7 deletions(-) create mode 100644 docs/docs/config/settings.md diff --git a/docs/docs/config/settings.md b/docs/docs/config/settings.md new file mode 100644 index 00000000000..292d6b47053 --- /dev/null +++ b/docs/docs/config/settings.md @@ -0,0 +1,48 @@ +--- +title: Persistent Settings +sidebar_label: Settings +--- + +ZMK uses [Zephyr's settings subsystem](https://docs.zephyrproject.org/3.5.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](../development/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. + +:::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/system.md b/docs/docs/config/system.md index cae2b528588..3bc69ef0fbb 100644 --- a/docs/docs/config/system.md +++ b/docs/docs/config/system.md @@ -13,13 +13,18 @@ Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/ ### General -| 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 | +| Config | Type | Description | Default | +| --------------------------- | ------ | -------------------------------------------- | ------- | +| `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 | + +:::tip + +Because ZMK enables [the Zephyr setting](https://docs.zephyrproject.org/3.5.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) on the controller in order to take effect. + +::: ### HID diff --git a/docs/docs/troubleshooting/connection-issues.mdx b/docs/docs/troubleshooting/connection-issues.mdx index 6689885a9fe..3a8c1676417 100644 --- a/docs/docs/troubleshooting/connection-issues.mdx +++ b/docs/docs/troubleshooting/connection-issues.mdx @@ -16,6 +16,7 @@ description: Troubleshooting wireless connection issues of ZMK devices. - Replacing the controller for one of the halves. These issues can be resolved by flashing a settings reset firmware to both controllers. +See [persistent settings documentation](../config/settings.md) for more information. :::warning diff --git a/docs/sidebars.js b/docs/sidebars.js index 63b8ec3fe34..69de26e78c2 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -130,6 +130,7 @@ module.exports = { "config/layout", "config/kscan", "config/power", + "config/settings", "config/split", "config/system", "config/studio", From ee69b9e3c70420cd8466d87c05bb64e937bd6e9b Mon Sep 17 00:00:00 2001 From: Nicolas Munnich <98408764+nmunnich@users.noreply.github.com> Date: Mon, 18 Aug 2025 22:45:16 +0100 Subject: [PATCH 17/96] docs: Add a dedicated page on ZMK events (#2815) * docs: Added a dedicated page on ZMK events * docs: Apply suggestions from code review Co-authored-by: Cem Aksoylar * docs: Apply suggestions from code review Bring the code snipper in new-behavior back, touchups on the page * docs: clarify "calling" hold tap Adjustment after feedback from code review --------- Co-authored-by: Cem Aksoylar --- docs/docs/development/events.md | 180 +++++++++++++++++++++++++ docs/docs/development/new-behavior.mdx | 20 +-- docs/sidebars.js | 1 + 3 files changed, 182 insertions(+), 19 deletions(-) create mode 100644 docs/docs/development/events.md diff --git a/docs/docs/development/events.md b/docs/docs/development/events.md new file mode 100644 index 00000000000..e7de85f5aef --- /dev/null +++ b/docs/docs/development/events.md @@ -0,0 +1,180 @@ +--- +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/development/new-behavior.mdx b/docs/docs/development/new-behavior.mdx index 321b62e2fdb..dce5849bab7 100644 --- a/docs/docs/development/new-behavior.mdx +++ b/docs/docs/development/new-behavior.mdx @@ -215,7 +215,7 @@ Including `zmk/event_manager.h` is required for the following dependencies to fu - `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). +Events can be used similarly to hardware interrupts. See [Events](events.md) for more information on using events. ###### Listeners and subscriptions @@ -223,31 +223,13 @@ The condensed form of lines 192-225 of the tap-dance driver, shown below, does a ```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()`. diff --git a/docs/sidebars.js b/docs/sidebars.js index 69de26e78c2..0a20a29e867 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -212,6 +212,7 @@ module.exports = { "development/devicetree", "development/studio-rpc-protocol", "development/new-behavior", + "development/events", ], }, ], From f09e55192994a8fba6e103629ebad16d056ea23c Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Tue, 19 Aug 2025 17:27:21 -0700 Subject: [PATCH 18/96] docs: Add warning box for clearing settings for splits, generalize troubleshooting procedure (#3039) Co-authored-by: Nicolas Munnich <98408764+nmunnich@users.noreply.github.com> --- docs/blog/2023-10-05-zmk-sotf-6.md | 2 +- docs/docs/config/settings.md | 7 ++++++ docs/docs/config/system.md | 4 ++-- docs/docs/customization.md | 2 +- .../hardware-integration/soft-off-setup.mdx | 2 +- docs/docs/features/split-keyboards.md | 2 +- docs/docs/keymaps/behaviors/backlight.md | 2 +- docs/docs/keymaps/behaviors/bluetooth.md | 2 +- docs/docs/keymaps/behaviors/outputs.md | 2 +- docs/docs/keymaps/behaviors/power.md | 2 +- docs/docs/keymaps/behaviors/underglow.md | 2 +- .../troubleshooting/connection-issues.mdx | 24 +++++++++---------- docs/docs/user-setup.mdx | 2 +- 13 files changed, 31 insertions(+), 24 deletions(-) diff --git a/docs/blog/2023-10-05-zmk-sotf-6.md b/docs/blog/2023-10-05-zmk-sotf-6.md index 0e9f3768e7c..45c2af49720 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-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] 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] 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). diff --git a/docs/docs/config/settings.md b/docs/docs/config/settings.md index 292d6b47053..da162c75281 100644 --- a/docs/docs/config/settings.md +++ b/docs/docs/config/settings.md @@ -41,6 +41,13 @@ See example for building firmware using this shield in the [troubleshooting docs 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/system.md b/docs/docs/config/system.md index 3bc69ef0fbb..4575a50d118 100644 --- a/docs/docs/config/system.md +++ b/docs/docs/config/system.md @@ -19,10 +19,10 @@ Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/ | `CONFIG_ZMK_WPM` | bool | Enable calculating words per minute | n | | `CONFIG_HEAP_MEM_POOL_SIZE` | int | Size of the heap memory pool | 8192 | -:::tip +:::info Because ZMK enables [the Zephyr setting](https://docs.zephyrproject.org/3.5.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) on the controller in order to take effect. +changing `CONFIG_ZMK_KEYBOARD_NAME` requires [clearing the stored settings](./settings.md#clearing-persisted-settings) on the controller in order to take effect. ::: diff --git a/docs/docs/customization.md b/docs/docs/customization.md index e35bb426713..aacbe00e79f 100644 --- a/docs/docs/customization.md +++ b/docs/docs/customization.md @@ -50,7 +50,7 @@ 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-halves-unable-to-pair). +More troubleshooting information for split keyboards can be found [here](troubleshooting/connection-issues.mdx#split-keyboard-parts-unable-to-pair). ## Building Additional Keyboards diff --git a/docs/docs/development/hardware-integration/soft-off-setup.mdx b/docs/docs/development/hardware-integration/soft-off-setup.mdx index 097595b122e..690ca1720b1 100644 --- a/docs/docs/development/hardware-integration/soft-off-setup.mdx +++ b/docs/docs/development/hardware-integration/soft-off-setup.mdx @@ -166,7 +166,7 @@ Finally, we will list the `wakeup_scan` device in an additional configuration se Here are the properties for the node: - The `compatible` property for the node must be `zmk,soft-off-wakeup-sources`. -- The `wakeup-sources` property is a [phandle array](../../config/index.md#devicetree-property-types) pointing to all the devices that should be enabled during the shutdown process to be sure they can later wake the keyboard. +- The `wakeup-sources` property is a [phandle array](../devicetree.md#property-types) pointing to all the devices that should be enabled during the shutdown process to be sure they can later wake the keyboard. :::tip If you add your kscan to the `wakeup-sources` array, then your keyboard will wake upon pressing any key in your kscan. Essentially, this causes `&soft_off` to behave like a behavior that puts the keyboard in deep sleep. If you choose to do so, then you can omit everything aside from the `soft_off_wakers` node. diff --git a/docs/docs/features/split-keyboards.md b/docs/docs/features/split-keyboards.md index c10c305bdec..36cf9043498 100644 --- a/docs/docs/features/split-keyboards.md +++ b/docs/docs/features/split-keyboards.md @@ -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-halves-unable-to-pair) in the troubleshooting section. +For this, please follow [the specified procedure](../troubleshooting/connection-issues.mdx#split-keyboard-parts-unable-to-pair) in the troubleshooting section. :::warning If the central keyboard part is either advertising for a pairing or waiting for disconnected peripherals, it will consume more power and drain batteries faster. diff --git a/docs/docs/keymaps/behaviors/backlight.md b/docs/docs/keymaps/behaviors/backlight.md index 6dbb6e7b24c..c65b03efd5c 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 and hence persist across restarts and firmware flashes. +The backlight settings that are changed via the `&bl` behavior will be [saved to flash storage](../../config/settings.md) and hence persist across restarts and firmware flashes. They will also override the start values set by [`CONFIG_ZMK_BACKLIGHT_*_START` settings](../../config/lighting.md#kconfig-1). However the settings will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../../config/system.md#general) milliseconds in order to reduce potential wear on the flash memory. ::: diff --git a/docs/docs/keymaps/behaviors/bluetooth.md b/docs/docs/keymaps/behaviors/bluetooth.md index 93d0842814a..44e38d309d4 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 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](../../config/settings.md) and hence persist across restarts and firmware flashes. However it will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../../config/system.md#general) milliseconds in order to reduce potential wear on the flash memory. ::: diff --git a/docs/docs/keymaps/behaviors/outputs.md b/docs/docs/keymaps/behaviors/outputs.md index 20ce8a69681..98d2186ee71 100644 --- a/docs/docs/keymaps/behaviors/outputs.md +++ b/docs/docs/keymaps/behaviors/outputs.md @@ -45,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 and hence persist across restarts and firmware flashes. +The endpoint that is selected by the `&out` behavior will be [saved to flash storage](../../config/settings.md) and hence persist across restarts and firmware flashes. However it will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../../config/system.md#general) milliseconds in order to reduce potential wear on the flash memory. ::: diff --git a/docs/docs/keymaps/behaviors/power.md b/docs/docs/keymaps/behaviors/power.md index 4c3330805ab..1814e67c80c 100644 --- a/docs/docs/keymaps/behaviors/power.md +++ b/docs/docs/keymaps/behaviors/power.md @@ -44,7 +44,7 @@ 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 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](../../config/settings.md) and hence persist across restarts and firmware flashes. However it will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../../config/system.md#general) milliseconds in order to reduce potential wear on the flash memory. ::: diff --git a/docs/docs/keymaps/behaviors/underglow.md b/docs/docs/keymaps/behaviors/underglow.md index ecffca75658..245c6858165 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 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](../../config/settings.md) and hence persist across restarts and firmware flashes. They will also override the start values set by [`CONFIG_ZMK_RGB_*_START` settings](../../config/lighting.md#kconfig). However the settings will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../../config/system.md#general) milliseconds in order to reduce potential wear on the flash memory. ::: diff --git a/docs/docs/troubleshooting/connection-issues.mdx b/docs/docs/troubleshooting/connection-issues.mdx index 3a8c1676417..1d102d96d73 100644 --- a/docs/docs/troubleshooting/connection-issues.mdx +++ b/docs/docs/troubleshooting/connection-issues.mdx @@ -8,14 +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 Halves Unable to Pair +## Split Keyboard Parts Unable to Pair -[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: +[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: -- Switching which halves are the central/peripheral. -- Replacing the controller for one of the halves. +- Changing which part is the central. +- Replacing the controller for one of the parts. -These issues can be resolved by flashing a settings reset firmware to both controllers. +These issues can be resolved by flashing a settings reset firmware to both controllers to clear the stored pairing information. See [persistent settings documentation](../config/settings.md) for more information. :::warning @@ -46,16 +46,16 @@ If you use a [local development environment](../development/local-toolchain/setu ### Reset Split Keyboard Procedure -Perform the following steps to reset **_both_** halves of your split keyboard: +Perform the following steps to reset **_all_** parts of your split keyboard: -1. Put each half of the split keyboard into bootloader mode. -1. Flash one of the halves of the split with the 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). +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). -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. +If the central and a peripheral has not paired after completing these steps, it can help to reset the central and the peripheral at around the same time. Most commonly, this is done by grounding the reset pins for each of your keyboard's microcontrollers or pressing the reset buttons, or turning both off then on with a power switch. -Once this is done, you can remove/forget the keyboard on each host device and pair it again. +Once this is done, you should remove/forget the keyboard on any paired host device and pair it again, since the pairing information for them will also have been cleared from the keyboard. :::info diff --git a/docs/docs/user-setup.mdx b/docs/docs/user-setup.mdx index 9fd3331775e..7433292e9ad 100644 --- a/docs/docs/user-setup.mdx +++ b/docs/docs/user-setup.mdx @@ -232,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-halves-unable-to-pair). This is typically necessary if you +[recommended troubleshooting procedure](troubleshooting/connection-issues.mdx#split-keyboard-parts-unable-to-pair). This is typically necessary if you swapped firmware sides between controllers, like flashing left side firmware to the same controller after flashing the right, or vice versa. ::: From 0b5a103c187ad337b9f50d824667866c4d7252e1 Mon Sep 17 00:00:00 2001 From: Pete Johanson Date: Tue, 26 Aug 2025 03:26:20 -0600 Subject: [PATCH 19/96] fix(core): Generate correct keymap layer names for all builds (#3047) Properly account for studio and non-studio builds for the generation of the layer names stored within the keymap system. Fixes #3045 --- app/include/zmk/keymap.h | 17 ++++++++++++----- app/src/keymap.c | 11 +++-------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/app/include/zmk/keymap.h b/app/include/zmk/keymap.h index 9b7a00c61fd..eb8be9c4690 100644 --- a/app/include/zmk/keymap.h +++ b/app/include/zmk/keymap.h @@ -7,13 +7,20 @@ #pragma once #include +#include +#include + +#define ZMK_KEYMAP_LAYERS_FOREACH(_fn) \ + COND_CODE_1(IS_ENABLED(CONFIG_ZMK_STUDIO), (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_STUDIO), \ + (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 \ - (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) +#define ZMK_KEYMAP_LAYERS_LEN (ZMK_KEYMAP_LAYERS_FOREACH(ZMK_LAYER_CHILD_LEN_PLUS_ONE) 0) /** * @brief A layer ID is a stable identifier to refer to a layer, regardless of ordering. diff --git a/app/src/keymap.c b/app/src/keymap.c index 762dd4f4112..d5c5e19bf27 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -74,12 +74,7 @@ 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, \ - (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))}; + COND_CODE_0(no_init, (ZMK_KEYMAP_LAYERS_FOREACH_SEP(TRANSFORMED_LAYER, (, ))), (0))}; KEYMAP_VAR(zmk_keymap, COND_CODE_1(IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE), (), (const)), IS_ENABLED(CONFIG_ZMK_STUDIO)) @@ -89,14 +84,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] = { - DT_INST_FOREACH_CHILD_SEP(0, LAYER_NAME, (, ))}; + ZMK_KEYMAP_LAYERS_FOREACH_SEP(LAYER_NAME, (, ))}; static uint32_t changed_layer_names = 0; #else static const char *zmk_keymap_layer_names[ZMK_KEYMAP_LAYERS_LEN] = { - DT_INST_FOREACH_CHILD_SEP(0, LAYER_NAME, (, ))}; + ZMK_KEYMAP_LAYERS_FOREACH_SEP(LAYER_NAME, (, ))}; #endif From 9a8fdd66ead42bc1591bee7d0eff0e5f5bff8ddb Mon Sep 17 00:00:00 2001 From: Chris Helming Date: Tue, 2 Sep 2025 23:42:30 -0400 Subject: [PATCH 20/96] docs: Add missing semicolon to kscan.md composite example (#3052) --- docs/docs/config/kscan.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/config/kscan.md b/docs/docs/config/kscan.md index 6de0a4b1b67..416175fa6d3 100644 --- a/docs/docs/config/kscan.md +++ b/docs/docs/config/kscan.md @@ -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 From 8d06a9b7134efbb5ec745d638ab6c0de1fa72f18 Mon Sep 17 00:00:00 2001 From: Adrien LUDWIG <42720099+Adrien-LUDWIG@users.noreply.github.com> Date: Mon, 8 Sep 2025 18:15:41 +0200 Subject: [PATCH 21/96] docs: fix missing link and example introduction (#3064) * docs: fix example introduction * docs: fix missing link --- docs/docs/keymaps/behaviors/hold-tap.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/keymaps/behaviors/hold-tap.mdx b/docs/docs/keymaps/behaviors/hold-tap.mdx index fa20d54694d..c40212b8f03 100644 --- a/docs/docs/keymaps/behaviors/hold-tap.mdx +++ b/docs/docs/keymaps/behaviors/hold-tap.mdx @@ -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 a left hand behavior: +Below is an example of configuration to achieve this: ```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`] 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`](#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. From d5ba120d79fedc372db996b793d111f4c2cdf632 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Obernd=C3=B6rfer?= Date: Tue, 9 Sep 2025 19:48:24 +0200 Subject: [PATCH 22/96] docs: Fix hold-trigger-on-release description (#3065) --- docs/docs/keymaps/behaviors/hold-tap.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/keymaps/behaviors/hold-tap.mdx b/docs/docs/keymaps/behaviors/hold-tap.mdx index c40212b8f03..8ba945d433e 100644 --- a/docs/docs/keymaps/behaviors/hold-tap.mdx +++ b/docs/docs/keymaps/behaviors/hold-tap.mdx @@ -415,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 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 **not** listed in `hold-trigger-key-positions` producing a tap when _pressed_ before `tapping-term-ms` expires, they instead produce a tap when _released_ before `tapping-term-ms` expires. ```dts &mt { From d28f73bcfa3588f574d4e0180b74ab619687b2e8 Mon Sep 17 00:00:00 2001 From: Peter Cock Date: Tue, 9 Sep 2025 18:52:41 +0100 Subject: [PATCH 23/96] docs: documenting PASTE/COPY/CUT keycodes on macOS (#3058) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Testing PASTE/COPY/CUT on macOS Testing using ZMK Studio v0.3.1 to send these keys. Using Karabiner-EventViewer, nothing from C_AC_CUT, C_AC_COPY, C_AC_PASTE, nor from paste special which I assume would be called C_AC_PASTE_SPECIAL (while for example C_AC_SEARCH was detected). Did see K_CUT, K_COPY, K_PASTE, but they appear to do nothing by default. * Add macOS footnote for editing keys K_CUT, K_COPY, K_PASTE * Add macOS testing for K_UNDO, K_REDO etc. C_AC_UNDO - not even registering as a keypress K_UNDO - detected as a keypress, but no effect. Does not act like command+z C_AC_REDO - not even registering as a keypress K_AGAIN aka K_REDO - detected as a keypress, but no effect. Does not act like shift+command+z * None of the six 'Input Assist' consumer keys work on macOS Testing using ZMK Studio v0.3.1 to send these keys with macOS 15.6.1 (ARM), and watching for keypresses with Karabiner-EventViewer v15.5.0. --- .../docs/keymaps/_footnotes/macos-editing.mdx | 2 + .../keymaps/_footnotes/macos-undo-redo.mdx | 2 + docs/src/data/footnotes.js | 4 ++ docs/src/data/hid.js | 52 +++++++++++-------- 4 files changed, 39 insertions(+), 21 deletions(-) create mode 100644 docs/docs/keymaps/_footnotes/macos-editing.mdx create mode 100644 docs/docs/keymaps/_footnotes/macos-undo-redo.mdx diff --git a/docs/docs/keymaps/_footnotes/macos-editing.mdx b/docs/docs/keymaps/_footnotes/macos-editing.mdx new file mode 100644 index 00000000000..76c67d7f82b --- /dev/null +++ b/docs/docs/keymaps/_footnotes/macos-editing.mdx @@ -0,0 +1,2 @@ +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-undo-redo.mdx b/docs/docs/keymaps/_footnotes/macos-undo-redo.mdx new file mode 100644 index 00000000000..0e2c1538eee --- /dev/null +++ b/docs/docs/keymaps/_footnotes/macos-undo-redo.mdx @@ -0,0 +1,2 @@ +On macOS, `K_UNDO` and `K_REDO` are recognized as key presses, +but do nothing by default. diff --git a/docs/src/data/footnotes.js b/docs/src/data/footnotes.js index af0413901dd..15ed56ade81 100644 --- a/docs/src/data/footnotes.js +++ b/docs/src/data/footnotes.js @@ -7,13 +7,17 @@ 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 { example, iosApplication, iosPower, + macosEditing, macosPower, + macosUndoRedo, globe, }; diff --git a/docs/src/data/hid.js b/docs/src/data/hid.js index 1bca99bf7bc..9d1a7e5ad9b 100644 --- a/docs/src/data/hid.js +++ b/docs/src/data/hid.js @@ -3092,10 +3092,12 @@ export default [ windows: false, linux: true, android: false, - macos: null, + macos: true, ios: null, }, - footnotes: {}, + footnotes: { + macos: ["macosEditing"], + }, }, { names: ["K_UNDO"], @@ -3113,10 +3115,12 @@ export default [ windows: false, linux: true, android: false, - macos: null, + macos: true, ios: null, }, - footnotes: {}, + footnotes: { + macos: ["macosEditing"], + }, }, { names: ["K_CUT"], @@ -3134,10 +3138,12 @@ export default [ windows: false, linux: true, android: false, - macos: null, + macos: true, ios: null, }, - footnotes: {}, + footnotes: { + macos: ["macosEditing"], + }, }, { names: ["K_COPY"], @@ -3155,10 +3161,12 @@ export default [ windows: false, linux: true, android: false, - macos: null, + macos: true, ios: null, }, - footnotes: {}, + footnotes: { + macos: ["macosEditing"], + }, }, { names: ["K_PASTE"], @@ -3176,10 +3184,12 @@ export default [ windows: false, linux: true, android: false, - macos: null, + macos: true, ios: null, }, - footnotes: {}, + footnotes: { + macos: ["macosEditing"], + }, }, { names: ["K_FIND"], @@ -7146,7 +7156,7 @@ export default [ windows: false, linux: true, android: false, - macos: null, + macos: false, ios: null, }, footnotes: {}, @@ -7167,7 +7177,7 @@ export default [ windows: false, linux: true, android: false, - macos: null, + macos: false, ios: null, }, footnotes: {}, @@ -7188,7 +7198,7 @@ export default [ windows: false, linux: true, android: false, - macos: null, + macos: false, ios: null, }, footnotes: {}, @@ -7209,7 +7219,7 @@ export default [ windows: false, linux: true, android: false, - macos: null, + macos: false, ios: null, }, footnotes: {}, @@ -7629,7 +7639,7 @@ export default [ windows: false, linux: true, android: false, - macos: null, + macos: false, ios: null, }, footnotes: {}, @@ -7755,7 +7765,7 @@ export default [ windows: null, linux: true, android: null, - macos: null, + macos: false, ios: null, }, footnotes: {}, @@ -7776,7 +7786,7 @@ export default [ windows: null, linux: true, android: null, - macos: null, + macos: false, ios: null, }, footnotes: {}, @@ -7797,7 +7807,7 @@ export default [ windows: null, linux: true, android: null, - macos: null, + macos: false, ios: null, }, footnotes: {}, @@ -7818,7 +7828,7 @@ export default [ windows: null, linux: true, android: null, - macos: null, + macos: false, ios: null, }, footnotes: {}, @@ -7839,7 +7849,7 @@ export default [ windows: null, linux: true, android: null, - macos: null, + macos: false, ios: null, }, footnotes: {}, @@ -7860,7 +7870,7 @@ export default [ windows: null, linux: true, android: null, - macos: null, + macos: false, ios: null, }, footnotes: {}, From 522971f41d62d7e5d6664eb61c84d190781feeb9 Mon Sep 17 00:00:00 2001 From: Nicolas Munnich <98408764+nmunnich@users.noreply.github.com> Date: Wed, 10 Sep 2025 18:30:09 +0100 Subject: [PATCH 24/96] fix(ci): disable nrf5340dk from being built in our CI (#3066) This build is currently broken, and will be fixed once we bump to 4.1. --- ...0_cpuapp.zmk.yml => nrf5340dk_nrf5340_cpuapp.zmk.yml.disabled} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename app/boards/arm/nrf5340dk_nrf5340_cpuapp/{nrf5340dk_nrf5340_cpuapp.zmk.yml => nrf5340dk_nrf5340_cpuapp.zmk.yml.disabled} (100%) diff --git a/app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml b/app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml.disabled similarity index 100% rename from app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml rename to app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml.disabled From 197d104fc980832444fa589e9760cf4f2614822b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Vall=C3=A9e?= Date: Thu, 11 Sep 2025 00:48:33 +0200 Subject: [PATCH 25/96] chore(shields): Add missing display-name for existing keymaps (#3048) --- app/boards/shields/a_dux/a_dux.keymap | 1 + app/boards/shields/bat43/bat43.keymap | 3 +++ app/boards/shields/bfo9000/bfo9000.keymap | 2 ++ app/boards/shields/boardsource3x4/boardsource3x4.keymap | 6 +++++- app/boards/shields/boardsource5x12/boardsource5x12.keymap | 7 ++++++- app/boards/shields/chalice/chalice.keymap | 2 ++ app/boards/shields/clog/clog.keymap | 4 ++++ .../clueboard_california/clueboard_california.keymap | 3 ++- app/boards/shields/contra/contra.keymap | 5 ++++- app/boards/shields/corne/corne.keymap | 3 +++ app/boards/shields/cradio/cradio.keymap | 4 ++++ app/boards/shields/crbn/crbn.keymap | 4 ++++ app/boards/shields/eek/eek.keymap | 3 +++ app/boards/shields/elephant42/elephant42.keymap | 6 +++++- app/boards/shields/ergodash/ergodash.keymap | 3 +++ app/boards/shields/eternal_keypad/eternal_keypad.keymap | 3 +++ .../shields/eternal_keypad/eternal_keypad_lefty.keymap | 3 +++ app/boards/shields/fourier/fourier.keymap | 3 +++ app/boards/shields/helix/helix.keymap | 6 +++++- app/boards/shields/hummingbird/hummingbird.keymap | 1 + app/boards/shields/iris/iris.keymap | 3 +++ app/boards/shields/jiran/jiran.keymap | 2 ++ app/boards/shields/knob_goblin/knob_goblin.keymap | 2 ++ app/boards/shields/kyria/kyria.keymap | 2 ++ app/boards/shields/kyria/kyria_rev2.keymap | 2 ++ app/boards/shields/kyria/kyria_rev3.keymap | 2 ++ app/boards/shields/lily58/lily58.keymap | 3 +++ app/boards/shields/lotus58/lotus58.keymap | 3 +++ app/boards/shields/m60/m60.keymap | 2 ++ app/boards/shields/microdox/microdox.keymap | 4 ++++ app/boards/shields/naked60/naked60.keymap | 7 ++++++- app/boards/shields/osprette/osprette.keymap | 4 ++++ app/boards/shields/pancake/pancake.keymap | 4 ++++ app/boards/shields/qaz/qaz.keymap | 5 ++++- app/boards/shields/quefrency/quefrency.keymap | 2 ++ app/boards/shields/redox/redox.keymap | 4 ++++ app/boards/shields/reviung41/reviung41.keymap | 4 ++++ app/boards/shields/reviung53/reviung53.keymap | 7 ++++++- app/boards/shields/romac/romac.keymap | 2 ++ app/boards/shields/romac_plus/romac_plus.keymap | 4 +++- .../splitkb_aurora_corne/splitkb_aurora_corne.keymap | 3 +++ .../splitkb_aurora_helix/splitkb_aurora_helix.keymap | 4 ++++ .../splitkb_aurora_lily58/splitkb_aurora_lily58.keymap | 3 +++ .../splitkb_aurora_sofle/splitkb_aurora_sofle.keymap | 3 +++ .../splitkb_aurora_sweep/splitkb_aurora_sweep.keymap | 4 ++++ app/boards/shields/splitreus62/splitreus62.keymap | 1 + .../shields/tester_pro_micro/tester_pro_micro.keymap | 2 +- app/boards/shields/tester_rpi_pico/tester_rpi_pico.keymap | 2 +- app/boards/shields/tester_xiao/tester_xiao.keymap | 2 +- app/boards/shields/tg4x/tg4x.keymap | 3 +++ app/boards/shields/tidbit/tidbit.keymap | 2 ++ .../shields/two_percent_milk/two_percent_milk.keymap | 3 ++- app/boards/shields/waterfowl/waterfowl.keymap | 4 ++++ app/boards/shields/zmk_uno/zmk_uno.keymap | 1 + app/boards/shields/zmk_uno/zmk_uno_split.keymap | 1 + app/boards/shields/zodiark/zodiark.keymap | 3 +++ 56 files changed, 167 insertions(+), 14 deletions(-) diff --git a/app/boards/shields/a_dux/a_dux.keymap b/app/boards/shields/a_dux/a_dux.keymap index 0f162a33ce5..37452d5922c 100644 --- a/app/boards/shields/a_dux/a_dux.keymap +++ b/app/boards/shields/a_dux/a_dux.keymap @@ -14,6 +14,7 @@ // 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 0f7e2d551ec..a690ff38c9e 100644 --- a/app/boards/shields/bat43/bat43.keymap +++ b/app/boards/shields/bat43/bat43.keymap @@ -20,6 +20,7 @@ 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 @@ -29,6 +30,7 @@ >; }; 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 @@ -38,6 +40,7 @@ >; }; 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 18a2085c3b7..412fcbed985 100644 --- a/app/boards/shields/bfo9000/bfo9000.keymap +++ b/app/boards/shields/bfo9000/bfo9000.keymap @@ -19,6 +19,7 @@ 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 | [ | ] | \ | @@ -36,6 +37,7 @@ }; lower_layer { + display-name = "Lower Layer"; // | | | | | | | | | | | | | | | | | | | // | | | | | | | | | | | | | | | | | | | // | | | | | | | | | | | | | | | | | | | diff --git a/app/boards/shields/boardsource3x4/boardsource3x4.keymap b/app/boards/shields/boardsource3x4/boardsource3x4.keymap index c47126abcaa..c0a23b12323 100644 --- a/app/boards/shields/boardsource3x4/boardsource3x4.keymap +++ b/app/boards/shields/boardsource3x4/boardsource3x4.keymap @@ -13,6 +13,7 @@ compatible = "zmk,keymap"; default_layer { + display-name = "Default Layer"; bindings = < &tog 1 &kp C_PREV &kp C_PP &kp C_NEXT @@ -23,6 +24,7 @@ }; num_layer { + display-name = "Num Layer"; bindings = < &trans &kp N7 &kp N8 &kp N9 &trans &kp N4 &kp N5 &kp N6 @@ -31,6 +33,7 @@ }; lower_layer { + display-name = "Lower Layer"; bindings = < &bt BT_CLR &none &sys_reset &bootloader &trans &bt BT_SEL 3 &bt BT_SEL 4 &none @@ -39,6 +42,7 @@ }; raise_layer { + display-name = "Raise Layer"; bindings = < &kp 0x68 &kp 0x69 &kp 0x6A &kp 0x6B &kp 0x6C &kp 0x6D &kp 0x6E &kp 0x6F @@ -46,4 +50,4 @@ >; }; }; -}; \ No newline at end of file +}; diff --git a/app/boards/shields/boardsource5x12/boardsource5x12.keymap b/app/boards/shields/boardsource5x12/boardsource5x12.keymap index 8ae9939810b..3be2ae973d3 100644 --- a/app/boards/shields/boardsource5x12/boardsource5x12.keymap +++ b/app/boards/shields/boardsource5x12/boardsource5x12.keymap @@ -15,6 +15,7 @@ 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,6 +34,7 @@ }; lower_layer { + display-name = "Lower Layer"; // ------------------------------------------------------------------------------------------- // | ESC | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | // | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | DEL | @@ -49,6 +51,7 @@ }; 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 | @@ -65,6 +68,7 @@ }; 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)| @@ -81,6 +85,7 @@ }; 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| | | | @@ -96,4 +101,4 @@ >; }; }; -}; \ No newline at end of file +}; diff --git a/app/boards/shields/chalice/chalice.keymap b/app/boards/shields/chalice/chalice.keymap index c72e3ee1b81..92864046780 100644 --- a/app/boards/shields/chalice/chalice.keymap +++ b/app/boards/shields/chalice/chalice.keymap @@ -15,6 +15,7 @@ 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 @@ -26,6 +27,7 @@ }; 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 d00b00c9d5b..fb696d098e8 100644 --- a/app/boards/shields/clog/clog.keymap +++ b/app/boards/shields/clog/clog.keymap @@ -75,6 +75,7 @@ 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 @@ -84,6 +85,7 @@ }; 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 @@ -93,6 +95,7 @@ }; 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 @@ -102,6 +105,7 @@ }; 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 9af22fa1f27..0aec8c1092a 100644 --- a/app/boards/shields/clueboard_california/clueboard_california.keymap +++ b/app/boards/shields/clueboard_california/clueboard_california.keymap @@ -12,6 +12,7 @@ compatible = "zmk,keymap"; default_layer { + display-name = "Default Layer"; bindings = < &kp N9 &kp N8 &kp N7 &kp N6 @@ -22,4 +23,4 @@ >; }; }; -}; \ No newline at end of file +}; diff --git a/app/boards/shields/contra/contra.keymap b/app/boards/shields/contra/contra.keymap index 77b431b65b4..ccb18901fbc 100644 --- a/app/boards/shields/contra/contra.keymap +++ b/app/boards/shields/contra/contra.keymap @@ -17,6 +17,7 @@ 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 @@ -26,6 +27,7 @@ }; 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 @@ -35,6 +37,7 @@ }; 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 @@ -43,4 +46,4 @@ >; }; }; -}; \ No newline at end of file +}; diff --git a/app/boards/shields/corne/corne.keymap b/app/boards/shields/corne/corne.keymap index ea4c2e8997e..fa6d4744bd6 100644 --- a/app/boards/shields/corne/corne.keymap +++ b/app/boards/shields/corne/corne.keymap @@ -13,6 +13,7 @@ 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 | ; | ' | @@ -26,6 +27,7 @@ >; }; 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 | | | @@ -40,6 +42,7 @@ }; 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 ab952fb8462..6463cd6eb5e 100644 --- a/app/boards/shields/cradio/cradio.keymap +++ b/app/boards/shields/cradio/cradio.keymap @@ -33,6 +33,7 @@ keymap { compatible = "zmk,keymap"; default_layer { + display-name = "Default Layer"; bindings = < //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ //│ Q │ W │ E │ R │ T │ │ Y │ U │ I │ O │ P │ @@ -50,6 +51,7 @@ }; right_layer { + display-name = "Right Layer"; bindings = < //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ //│ INSERT │ 1 │ 2 │ 3 │ │ │ HOME │ PAGE DN │ PAGE UP │ END │ : │ @@ -67,6 +69,7 @@ }; left_layer { + display-name = "Left Layer"; bindings = < //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ //│ │ [ │ { │ } │ │ │ ^ │ ( │ ) │ ] │ ~ │ @@ -84,6 +87,7 @@ }; 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 08eab59ca1b..5316465ba9c 100644 --- a/app/boards/shields/crbn/crbn.keymap +++ b/app/boards/shields/crbn/crbn.keymap @@ -13,6 +13,7 @@ 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 | ; | ' | @@ -29,6 +30,7 @@ }; 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 @@ -40,6 +42,7 @@ }; 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 @@ -51,6 +54,7 @@ }; 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 74ecc4071e9..be2f108c068 100644 --- a/app/boards/shields/eek/eek.keymap +++ b/app/boards/shields/eek/eek.keymap @@ -14,6 +14,7 @@ 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 | ; | @@ -27,6 +28,7 @@ >; }; numbers { + display-name = "Numbers"; // -------------------------------------------------------------------------------------------------------------------------------------------------------------------- // 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | // TAB | BT_PRV | BT_NXT | VOL-| VOL+| | < | v | ∧ | > | ' | @@ -40,6 +42,7 @@ >; }; symbols { + display-name = "Symbols"; // -------------------------------------------------------------------------------------------------------------------------------------------------------------------- // ESC | F1 | F2 | F3 | F4 | | OUT_USB | OUT_BLE | | = | - | // CAPS| F5 | F6 | F7 | F8 | | [ | ] | | ` | \ | diff --git a/app/boards/shields/elephant42/elephant42.keymap b/app/boards/shields/elephant42/elephant42.keymap index 62484728ff8..db9a3bd6a1f 100644 --- a/app/boards/shields/elephant42/elephant42.keymap +++ b/app/boards/shields/elephant42/elephant42.keymap @@ -18,6 +18,7 @@ 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 @@ -27,6 +28,7 @@ }; 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 @@ -35,6 +37,7 @@ >; }; 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 @@ -44,6 +47,7 @@ }; 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 @@ -52,4 +56,4 @@ >; }; }; -}; \ No newline at end of file +}; diff --git a/app/boards/shields/ergodash/ergodash.keymap b/app/boards/shields/ergodash/ergodash.keymap index e384e504fbe..45b712964f1 100644 --- a/app/boards/shields/ergodash/ergodash.keymap +++ b/app/boards/shields/ergodash/ergodash.keymap @@ -18,6 +18,7 @@ compatible = "zmk,keymap"; default_layer { + display-name = "Default Layer"; /* QWERTY * .----------------------------------------------------------------------------------------------------------------------. * | ` | 1 | 2 | 3 | 4 | 5 | [ | | ] | 6 | 7 | 8 | 9 | 0 | PScr | @@ -40,6 +41,7 @@ >; }; lower_layer { + display-name = "Lower Layer"; /* .----------------------------------------------------------------------------------------------------------------------. * | F11 | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F12 | * |------+------+------+------+------+------+------+--------------------+------+------+------+------+------+------+------| @@ -61,6 +63,7 @@ >; }; raise_layer { + display-name = "Raise Layer"; /* .----------------------------------------------------------------------------------------------------------------------. * | | BT 0 | BT 1 | BT 2 | BT 3 | | BTCL | | | | | | | | | * |------+------+------+------+------+------+------+--------------------+------+------+------+------+------+------+------| diff --git a/app/boards/shields/eternal_keypad/eternal_keypad.keymap b/app/boards/shields/eternal_keypad/eternal_keypad.keymap index 40ac97dfdd9..51171228216 100644 --- a/app/boards/shields/eternal_keypad/eternal_keypad.keymap +++ b/app/boards/shields/eternal_keypad/eternal_keypad.keymap @@ -24,6 +24,7 @@ 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 @@ -34,6 +35,7 @@ }; 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 @@ -44,6 +46,7 @@ }; 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 4dec0bc87ea..80eb4af9d02 100644 --- a/app/boards/shields/eternal_keypad/eternal_keypad_lefty.keymap +++ b/app/boards/shields/eternal_keypad/eternal_keypad_lefty.keymap @@ -24,6 +24,7 @@ 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 @@ -34,6 +35,7 @@ }; 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 @@ -44,6 +46,7 @@ }; 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 819ddf61e34..17b1f81e07d 100644 --- a/app/boards/shields/fourier/fourier.keymap +++ b/app/boards/shields/fourier/fourier.keymap @@ -21,6 +21,7 @@ // ------------------------------------------- ----------------------------------------------- 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 @@ -37,6 +38,7 @@ // ------------------------------------------- ----------------------------------------------- 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 @@ -53,6 +55,7 @@ // ------------------------------------------- ----------------------------------------------- fn_layer { + display-name = "Fn Layer"; bindings = < &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 /**/ &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &none &kp F12 &kp CAPS &none &kp HOME &kp PG_UP &kp END &none /**/ &none &none &none &none &none &none diff --git a/app/boards/shields/helix/helix.keymap b/app/boards/shields/helix/helix.keymap index 80678fe6092..867ebc67a98 100644 --- a/app/boards/shields/helix/helix.keymap +++ b/app/boards/shields/helix/helix.keymap @@ -25,6 +25,7 @@ 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 | @@ -40,6 +41,7 @@ As such, those are in use within the default layer at this time.*/ >; }; lower_layer { + display-name = "Lower Layer"; // --------------------------------------------------------------------------------------------------------------------------------- // | | | | | | | | | | | | | | // | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | @@ -55,6 +57,7 @@ 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 | @@ -70,6 +73,7 @@ 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 | @@ -85,4 +89,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 31e33254eba..a50e541aab8 100644 --- a/app/boards/shields/hummingbird/hummingbird.keymap +++ b/app/boards/shields/hummingbird/hummingbird.keymap @@ -56,6 +56,7 @@ 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 1846509f7e9..affe1cc65eb 100644 --- a/app/boards/shields/iris/iris.keymap +++ b/app/boards/shields/iris/iris.keymap @@ -13,6 +13,7 @@ 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 | - | @@ -29,6 +30,7 @@ }; lower_layer { + display-name = "Lower Layer"; // ------------------------------------------------------------------------------------------------------------ // | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | | // | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | @@ -45,6 +47,7 @@ }; 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 77b943b2180..55494d368c0 100644 --- a/app/boards/shields/jiran/jiran.keymap +++ b/app/boards/shields/jiran/jiran.keymap @@ -13,6 +13,7 @@ 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 @@ -23,6 +24,7 @@ }; 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/knob_goblin/knob_goblin.keymap b/app/boards/shields/knob_goblin/knob_goblin.keymap index 8e4a7e6622a..1879c235018 100644 --- a/app/boards/shields/knob_goblin/knob_goblin.keymap +++ b/app/boards/shields/knob_goblin/knob_goblin.keymap @@ -13,6 +13,7 @@ compatible = "zmk,keymap"; default_layer { + display-name = "Default Layer"; bindings = < &trans &kp EQUAL &kp KP_SLASH &kp KP_MULTIPLY &kp KP_MINUS @@ -26,6 +27,7 @@ }; 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/kyria/kyria.keymap b/app/boards/shields/kyria/kyria.keymap index a11c13259e1..fd601b89604 100644 --- a/app/boards/shields/kyria/kyria.keymap +++ b/app/boards/shields/kyria/kyria.keymap @@ -13,6 +13,7 @@ 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 | ; | ' | @@ -28,6 +29,7 @@ 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.keymap b/app/boards/shields/kyria/kyria_rev2.keymap index a11c13259e1..fd601b89604 100644 --- a/app/boards/shields/kyria/kyria_rev2.keymap +++ b/app/boards/shields/kyria/kyria_rev2.keymap @@ -13,6 +13,7 @@ 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 | ; | ' | @@ -28,6 +29,7 @@ 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.keymap b/app/boards/shields/kyria/kyria_rev3.keymap index ac2fc044e73..aea8baf6fec 100644 --- a/app/boards/shields/kyria/kyria_rev3.keymap +++ b/app/boards/shields/kyria/kyria_rev3.keymap @@ -21,6 +21,7 @@ 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 | ; | ' | @@ -36,6 +37,7 @@ 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/lily58/lily58.keymap b/app/boards/shields/lily58/lily58.keymap index 75a2e8ae4c2..502f7be3f85 100644 --- a/app/boards/shields/lily58/lily58.keymap +++ b/app/boards/shields/lily58/lily58.keymap @@ -14,6 +14,7 @@ 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 | - | @@ -32,6 +33,7 @@ }; lower_layer { + display-name = "Lower Layer"; // ------------------------------------------------------------------------------------------------------------ // | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | | // | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | @@ -50,6 +52,7 @@ }; 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 e9846e81798..21a76955592 100644 --- a/app/boards/shields/lotus58/lotus58.keymap +++ b/app/boards/shields/lotus58/lotus58.keymap @@ -45,6 +45,7 @@ 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 @@ -63,6 +64,7 @@ }; lower_layer { + display-name = "Lower Layer"; // ------------------------------------------------------------------------------------------------------------ // | ` | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 | // | | ! | HOME| ^ | END | % | | VOL^ | PGUP | INS | ^ | PSCR | - | @@ -81,6 +83,7 @@ }; 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 fd187da5716..7fa07bbb7a5 100644 --- a/app/boards/shields/m60/m60.keymap +++ b/app/boards/shields/m60/m60.keymap @@ -13,6 +13,7 @@ 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 | [ | ] | \ | @@ -30,6 +31,7 @@ }; 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/microdox.keymap b/app/boards/shields/microdox/microdox.keymap index f13f58f44f8..2ebc7a48c40 100644 --- a/app/boards/shields/microdox/microdox.keymap +++ b/app/boards/shields/microdox/microdox.keymap @@ -13,6 +13,7 @@ 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 | ; | @@ -26,6 +27,7 @@ >; }; nav_layer { + display-name = "Nav Layer"; // ----------------------------------------------------------------------------------------- // |BTCLR| | ESC | ~ | | | TAB | HOME | UP | END | DEL | // | BT1 | GUI | ALT | CTRL | NUM | | / | LEFT | DOWN | RGT | BSPC | @@ -40,6 +42,7 @@ }; sym_layer { + display-name = "Sym Layer"; // ----------------------------------------------------------------------------------------- // | ! | @ | # | $ | % | | ^ | & | * | ( | ) | // | | | | | | | - | = | { | } | "|" | @@ -56,6 +59,7 @@ // 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/naked60/naked60.keymap b/app/boards/shields/naked60/naked60.keymap index 4f02d9a10cf..42494199663 100644 --- a/app/boards/shields/naked60/naked60.keymap +++ b/app/boards/shields/naked60/naked60.keymap @@ -15,6 +15,7 @@ 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,6 +34,7 @@ }; lower { + display-name = "Lower"; // ---------------------------------------------------------------------------------------------------------- // | ESC | F2 | F3 | F4 | F5 | F6 |-------|-------| F7 | F8 | F9 | F10 | F11 | F12 | // | ~ | ! | @ | # | $ | % |-------|-------| ^ | & | * | ( | ) | DEL | @@ -49,6 +51,7 @@ }; 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 | @@ -65,6 +68,7 @@ }; 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)| @@ -81,6 +85,7 @@ }; 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| | | | @@ -96,4 +101,4 @@ >; }; }; -}; \ No newline at end of file +}; diff --git a/app/boards/shields/osprette/osprette.keymap b/app/boards/shields/osprette/osprette.keymap index 77e62fa015b..7afd7ae8c0d 100644 --- a/app/boards/shields/osprette/osprette.keymap +++ b/app/boards/shields/osprette/osprette.keymap @@ -75,6 +75,7 @@ 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 @@ -84,6 +85,7 @@ }; 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 @@ -93,6 +95,7 @@ }; 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 @@ -102,6 +105,7 @@ }; 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 e5ca437263a..a6a4c1a43cf 100644 --- a/app/boards/shields/pancake/pancake.keymap +++ b/app/boards/shields/pancake/pancake.keymap @@ -19,6 +19,7 @@ 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 @@ -28,6 +29,7 @@ }; 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 @@ -37,6 +39,7 @@ }; 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 @@ -46,6 +49,7 @@ }; 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 c887fb03329..72b511007f0 100644 --- a/app/boards/shields/qaz/qaz.keymap +++ b/app/boards/shields/qaz/qaz.keymap @@ -29,6 +29,7 @@ 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 @@ -37,6 +38,7 @@ >; }; 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 @@ -46,6 +48,7 @@ }; 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 @@ -54,4 +57,4 @@ >; }; }; -}; \ No newline at end of file +}; diff --git a/app/boards/shields/quefrency/quefrency.keymap b/app/boards/shields/quefrency/quefrency.keymap index 7d519ad4573..d22da69dc69 100644 --- a/app/boards/shields/quefrency/quefrency.keymap +++ b/app/boards/shields/quefrency/quefrency.keymap @@ -21,6 +21,7 @@ // ------------------------------------------- ------------------------------------------------------ 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 @@ -39,6 +40,7 @@ // ------------------------------------------- ------------------------------------------------------ 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/redox.keymap b/app/boards/shields/redox/redox.keymap index ea4c09f9f4b..02db917552f 100644 --- a/app/boards/shields/redox/redox.keymap +++ b/app/boards/shields/redox/redox.keymap @@ -15,6 +15,7 @@ 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 | - | @@ -32,6 +33,7 @@ }; 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 | @@ -48,6 +50,7 @@ }; raise_layer { + display-name = "Raise Layer"; // ---------------------------------------------------------------------------------------------------------------------------- // | ESC | 1 | 2 | 3 | 4 | 5 | --- | 6 | 7 | 8 | 9 | 0 | DEL | // | ESC | ! | @ | # | $ | % | ( | --- | ) | ^ | & | * | ( | ) | DEL | @@ -64,6 +67,7 @@ }; 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/reviung41/reviung41.keymap b/app/boards/shields/reviung41/reviung41.keymap index 618052b2999..673c76f4094 100644 --- a/app/boards/shields/reviung41/reviung41.keymap +++ b/app/boards/shields/reviung41/reviung41.keymap @@ -14,6 +14,7 @@ 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 | ; | ' | @@ -28,6 +29,7 @@ }; lower_layer { + display-name = "Lower Layer"; // ------------------------------------------------------------------------------------ // | | ! | @ | # | $ | % | | ^ | & | * | ( | ) | DEL | // | | _ | + | { | } | "|" | | LFT | DWN | UP | RGT | ` | ~ | @@ -42,6 +44,7 @@ }; raise_layer { + display-name = "Raise Layer"; // ---------------------------------------------------------------------------- // | | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | DEL | // | | - | = | [ | ] | \ | | F1 | F2 | F3 | F4 | F5 | F6 | @@ -56,6 +59,7 @@ }; 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/reviung53/reviung53.keymap b/app/boards/shields/reviung53/reviung53.keymap index c3b3999487b..001c531afa7 100644 --- a/app/boards/shields/reviung53/reviung53.keymap +++ b/app/boards/shields/reviung53/reviung53.keymap @@ -22,6 +22,7 @@ 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 | @@ -39,6 +40,7 @@ }; lower_layer { + display-name = "Lower Layer"; // -------------------------------------------------------------------------------------------- // | | | | F9 | F10 | F11 | F12 | INS | PAU | SCR | PSCR | | // | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | | @@ -56,6 +58,7 @@ }; raise_layer { + display-name = "Raise Layer"; // -------------------------------------------------------------------------------------- // | | | | F9 | F10 | F11 | F12 | MUTE | VOL+ | VOL- | PLAY | | // | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | @@ -73,6 +76,7 @@ }; 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 | | | | | | | @@ -90,6 +94,7 @@ }; nav_layer { + display-name = "Nav Layer"; // ------------------------------------------------------------------------------------------------------------------------ // | | | ESC | | | | | | | | | DEL | // | TAB | | UP | | | | | | | | | BSPC | @@ -106,4 +111,4 @@ >; }; }; -}; \ No newline at end of file +}; diff --git a/app/boards/shields/romac/romac.keymap b/app/boards/shields/romac/romac.keymap index e48368a817c..3f6567526cb 100644 --- a/app/boards/shields/romac/romac.keymap +++ b/app/boards/shields/romac/romac.keymap @@ -13,6 +13,7 @@ compatible = "zmk,keymap"; default_layer { + display-name = "Default Layer"; // ------------------- // | 7 | 8 | 9 | // | 4 | 5 | 6 | @@ -28,6 +29,7 @@ }; nav_layer { + display-name = "Nav Layer"; // ----------------------- // | BTNXT | HOME | PGUP | // | BTPRV | END | PGDN | diff --git a/app/boards/shields/romac_plus/romac_plus.keymap b/app/boards/shields/romac_plus/romac_plus.keymap index 039f6eb6195..fd63e78b7c0 100644 --- a/app/boards/shields/romac_plus/romac_plus.keymap +++ b/app/boards/shields/romac_plus/romac_plus.keymap @@ -13,6 +13,7 @@ compatible = "zmk,keymap"; default_layer { + display-name = "Default Layer"; // -------------------------- // | 7 | 8 | 9 | // | 4 | 5 | 6 | @@ -30,6 +31,7 @@ }; nav_layer { + display-name = "Nav Layer"; // -------------------------- // | BT_CLR | HOME | PGUP | // | _ | END | PGDN | @@ -46,4 +48,4 @@ sensor-bindings = <&inc_dec_kp A B>; }; }; -}; \ No newline at end of file +}; 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 ea4c2e8997e..fa6d4744bd6 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap @@ -13,6 +13,7 @@ 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 | ; | ' | @@ -26,6 +27,7 @@ >; }; 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 | | | @@ -40,6 +42,7 @@ }; raise_layer { + display-name = "Raise Layer"; // ----------------------------------------------------------------------------------------- // | TAB | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BSPC | // | CTRL | | | | | | | - | = | [ | ] | \ | ` | 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 edec8fec306..cbbb8d811c7 100644 --- a/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix.keymap +++ b/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix.keymap @@ -33,6 +33,7 @@ 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 | @@ -48,6 +49,7 @@ As such, those are in use within the default layer at this time.*/ >; }; lower_layer { + display-name = "Lower Layer"; // --------------------------------------------------------------------------------------------------------------------------------- // | | | | | | | | | | | | | | // | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | @@ -63,6 +65,7 @@ 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 | @@ -78,6 +81,7 @@ 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/splitkb_aurora_lily58.keymap b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap index b8a9103b1d6..1a18e1dfd8f 100644 --- a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap @@ -14,6 +14,7 @@ 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 | - | @@ -32,6 +33,7 @@ }; lower_layer { + display-name = "Lower Layer"; // ------------------------------------------------------------------------------------------------------------ // | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | | // | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | @@ -50,6 +52,7 @@ }; raise_layer { + display-name = "Raise Layer"; // ------------------------------------------------------------------------------------------------------------ // | | | | | | | | | | | | | | // | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | diff --git a/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.keymap b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.keymap index 23127416762..61cdebd2692 100644 --- a/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.keymap +++ b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.keymap @@ -22,6 +22,7 @@ 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 | - | @@ -40,6 +41,7 @@ }; lower_layer { + display-name = "Lower Layer"; // ------------------------------------------------------------------------------------------------------------ // | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | | // | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | @@ -58,6 +60,7 @@ }; 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/splitkb_aurora_sweep.keymap b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap index 891a36b6dac..0e719f300bd 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap @@ -63,6 +63,7 @@ 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 @@ -72,6 +73,7 @@ }; 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 @@ -81,6 +83,7 @@ }; 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 @@ -90,6 +93,7 @@ }; 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 096660094ae..2a017881ef9 100644 --- a/app/boards/shields/splitreus62/splitreus62.keymap +++ b/app/boards/shields/splitreus62/splitreus62.keymap @@ -13,6 +13,7 @@ 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 c130bc4ff41..fbda0c49188 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/tester_rpi_pico.keymap b/app/boards/shields/tester_rpi_pico/tester_rpi_pico.keymap index f938b5ea4e7..9f263c87e02 100644 --- a/app/boards/shields/tester_rpi_pico/tester_rpi_pico.keymap +++ b/app/boards/shields/tester_rpi_pico/tester_rpi_pico.keymap @@ -74,4 +74,4 @@ PIN_MACRO(pin28, <&kp N2 &kp N8>) &pin28>; }; }; -}; \ No newline at end of file +}; diff --git a/app/boards/shields/tester_xiao/tester_xiao.keymap b/app/boards/shields/tester_xiao/tester_xiao.keymap index 8b22780b3eb..29a5f3db117 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/tg4x.keymap b/app/boards/shields/tg4x/tg4x.keymap index 5c71ae5c91c..8c272f79a5c 100644 --- a/app/boards/shields/tg4x/tg4x.keymap +++ b/app/boards/shields/tg4x/tg4x.keymap @@ -23,6 +23,7 @@ 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 @@ -32,6 +33,7 @@ }; 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 @@ -41,6 +43,7 @@ }; 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/tidbit.keymap b/app/boards/shields/tidbit/tidbit.keymap index 2a311365198..dbc9e907723 100644 --- a/app/boards/shields/tidbit/tidbit.keymap +++ b/app/boards/shields/tidbit/tidbit.keymap @@ -44,6 +44,7 @@ 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 @@ -56,6 +57,7 @@ }; 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/two_percent_milk.keymap b/app/boards/shields/two_percent_milk/two_percent_milk.keymap index 132793b3987..1e5002379c9 100644 --- a/app/boards/shields/two_percent_milk/two_percent_milk.keymap +++ b/app/boards/shields/two_percent_milk/two_percent_milk.keymap @@ -13,10 +13,11 @@ 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 197a34fa182..50cabf68271 100644 --- a/app/boards/shields/waterfowl/waterfowl.keymap +++ b/app/boards/shields/waterfowl/waterfowl.keymap @@ -13,6 +13,7 @@ compatible = "zmk,keymap"; default_layer { + display-name = "Default Layer"; /* QWERTY * * ,----------------------------------. ,----------------------------------. @@ -42,6 +43,7 @@ }; navnum_layer { + display-name = "Navnum Layer"; /* NAVNUM * * ,----------------------------------. ,----------------------------------. @@ -71,6 +73,7 @@ }; symbol_layer { + display-name = "Symbol Layer"; /* SYM * * ,----------------------------------. ,----------------------------------. @@ -100,6 +103,7 @@ }; function_layer { + display-name = "Function Layer"; /* FUNC * * ,----------------------------------. ,----------------------------------. diff --git a/app/boards/shields/zmk_uno/zmk_uno.keymap b/app/boards/shields/zmk_uno/zmk_uno.keymap index 186cdb60a38..7fe0a044c50 100644 --- a/app/boards/shields/zmk_uno/zmk_uno.keymap +++ b/app/boards/shields/zmk_uno/zmk_uno.keymap @@ -24,6 +24,7 @@ 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 d2daa6ead65..0e4798698bc 100644 --- a/app/boards/shields/zmk_uno/zmk_uno_split.keymap +++ b/app/boards/shields/zmk_uno/zmk_uno_split.keymap @@ -26,6 +26,7 @@ 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 82639edc8f6..7ca8d301e12 100644 --- a/app/boards/shields/zodiark/zodiark.keymap +++ b/app/boards/shields/zodiark/zodiark.keymap @@ -13,6 +13,7 @@ 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 | \ | @@ -31,6 +32,7 @@ }; 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 | @@ -49,6 +51,7 @@ }; raise_layer { + display-name = "Raise Layer"; // ------------------------------------------------------------------------------------------------------------ // |BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | RESET | // | | | | | | | | | | | | | | |BLOADER| From df3db57c4c35090760483ef4514c858dc1969981 Mon Sep 17 00:00:00 2001 From: Peter Cock Date: Fri, 12 Sep 2025 14:08:17 +0100 Subject: [PATCH 26/96] docs: K_VOLUME_UP and K_VOLUME_DOWN work in macOS (#3057) Tested via ZMK Studio, both the 'keyboard' and the 'consumer' volume up/down work on macOS Sequoia 15.6.1 --- docs/src/data/hid.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/data/hid.js b/docs/src/data/hid.js index 9d1a7e5ad9b..c990abd92c5 100644 --- a/docs/src/data/hid.js +++ b/docs/src/data/hid.js @@ -3249,7 +3249,7 @@ export default [ windows: false, linux: true, android: true, - macos: false, + macos: true, ios: null, }, footnotes: {}, @@ -3270,7 +3270,7 @@ export default [ windows: false, linux: true, android: true, - macos: false, + macos: true, ios: null, }, footnotes: {}, From 540bf2c32b033e20e42151ff0e4c94ed9c4238ae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Sep 2025 22:17:59 +0200 Subject: [PATCH 27/96] chore(deps): bump mermaid from 11.6.0 to 11.10.1 in /docs (#3042) Bumps [mermaid](https://github.com/mermaid-js/mermaid) from 11.6.0 to 11.10.1. - [Release notes](https://github.com/mermaid-js/mermaid/releases) - [Commits](https://github.com/mermaid-js/mermaid/compare/mermaid@11.6.0...mermaid@11.10.1) --- updated-dependencies: - dependency-name: mermaid dependency-version: 11.10.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/package-lock.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index c2a741313c2..775903de9a4 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -4519,9 +4519,9 @@ } }, "node_modules/@mermaid-js/parser": { - "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==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.2.tgz", + "integrity": "sha512-+PO02uGF6L6Cs0Bw8RpGhikVvMWEysfAyl27qTlroUB8jSWr1lL0Sf6zi78ZxlSnmgSY2AMMKVgghnN9jTtwkQ==", "license": "MIT", "dependencies": { "langium": "3.3.1" @@ -13241,15 +13241,15 @@ } }, "node_modules/marked": { - "version": "15.0.12", - "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", - "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.2.0.tgz", + "integrity": "sha512-LbbTuye+0dWRz2TS9KJ7wsnD4KAtpj0MVkWc90XvBa6AslXsT0hTBVH5k32pcSyHH1fst9XEFJunXHktVy0zlg==", "license": "MIT", "bin": { "marked": "bin/marked.js" }, "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/math-intrinsics": { @@ -13715,14 +13715,14 @@ } }, "node_modules/mermaid": { - "version": "11.6.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.6.0.tgz", - "integrity": "sha512-PE8hGUy1LDlWIHWBP05SFdqUHGmRcCcK4IzpOKPE35eOw+G9zZgcnMpyunJVUEOgb//KBORPjysKndw8bFLuRg==", + "version": "11.10.1", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.10.1.tgz", + "integrity": "sha512-0PdeADVWURz7VMAX0+MiMcgfxFKY4aweSGsjgFihe3XlMKNqmai/cugMrqTd3WNHM93V+K+AZL6Wu6tB5HmxRw==", "license": "MIT", "dependencies": { "@braintree/sanitize-url": "^7.0.4", "@iconify/utils": "^2.1.33", - "@mermaid-js/parser": "^0.4.0", + "@mermaid-js/parser": "^0.6.2", "@types/d3": "^7.4.3", "cytoscape": "^3.29.3", "cytoscape-cose-bilkent": "^4.1.0", @@ -13731,11 +13731,11 @@ "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.11", "dayjs": "^1.11.13", - "dompurify": "^3.2.4", - "katex": "^0.16.9", + "dompurify": "^3.2.5", + "katex": "^0.16.22", "khroma": "^2.1.0", "lodash-es": "^4.17.21", - "marked": "^15.0.7", + "marked": "^16.0.0", "roughjs": "^4.6.6", "stylis": "^4.3.6", "ts-dedent": "^2.2.0", From c44343509a6e02e7a1059ec032b708337ee6c5e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Sep 2025 22:23:33 +0200 Subject: [PATCH 28/96] chore(deps): bump brace-expansion in /docs (#3067) Bumps and [brace-expansion](https://github.com/juliangruber/brace-expansion). These dependencies needed to be updated together. Updates `brace-expansion` from 1.1.11 to 1.1.12 - [Release notes](https://github.com/juliangruber/brace-expansion/releases) - [Commits](https://github.com/juliangruber/brace-expansion/compare/1.1.11...v1.1.12) Updates `brace-expansion` from 2.0.1 to 2.0.2 - [Release notes](https://github.com/juliangruber/brace-expansion/releases) - [Commits](https://github.com/juliangruber/brace-expansion/compare/1.1.11...v1.1.12) --- updated-dependencies: - dependency-name: brace-expansion dependency-version: 1.1.12 dependency-type: indirect - dependency-name: brace-expansion dependency-version: 2.0.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/package-lock.json | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 775903de9a4..cdf4951aaca 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -4689,9 +4689,9 @@ } }, "node_modules/@npmcli/map-workspaces/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4765,9 +4765,9 @@ } }, "node_modules/@npmcli/package-json/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6130,9 +6130,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7139,9 +7139,9 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -21338,9 +21338,9 @@ } }, "node_modules/unified-engine/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { From 61de01abb00a73349a188ef2e10ad1cd040d31b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Mej=C3=ADa?= Date: Tue, 16 Sep 2025 23:23:46 +0200 Subject: [PATCH 29/96] feat(layouts): Add physical layout for Redox shield --- app/boards/shields/redox/redox-layouts.dtsi | 87 +++++++++++++++++++++ app/boards/shields/redox/redox.dtsi | 8 +- 2 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 app/boards/shields/redox/redox-layouts.dtsi diff --git a/app/boards/shields/redox/redox-layouts.dtsi b/app/boards/shields/redox/redox-layouts.dtsi new file mode 100644 index 00000000000..c998887f3d6 --- /dev/null +++ b/app/boards/shields/redox/redox-layouts.dtsi @@ -0,0 +1,87 @@ +/* + * 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.dtsi b/app/boards/shields/redox/redox.dtsi index 098be434481..5fb87773fa8 100644 --- a/app/boards/shields/redox/redox.dtsi +++ b/app/boards/shields/redox/redox.dtsi @@ -5,11 +5,17 @@ */ #include +#include "redox-layouts.dtsi" + + +&redox_physical_layout { + transform = <&default_transform>; +}; / { chosen { zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; + zmk,physical-layout = &redox_physical_layout; }; default_transform: keymap_transform_0 { From 4ec69cb7e658590adf6354027aca789b364a70c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Sep 2025 12:05:36 -0700 Subject: [PATCH 30/96] chore(deps): bump webpack-dev-server, @docusaurus/core, @docusaurus/preset-classic and @docusaurus/theme-mermaid (#3080) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/package-lock.json | 3138 +++++++++++++++++++++++----------------- docs/package.json | 6 +- 2 files changed, 1824 insertions(+), 1320 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index cdf4951aaca..734ebcd34be 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -8,9 +8,9 @@ "name": "docs", "version": "0.0.0", "dependencies": { - "@docusaurus/core": "^3.8.1", - "@docusaurus/preset-classic": "^3.8.1", - "@docusaurus/theme-mermaid": "^3.8.1", + "@docusaurus/core": "^3.9.1", + "@docusaurus/preset-classic": "^3.9.1", + "@docusaurus/theme-mermaid": "^3.9.1", "@fortawesome/fontawesome-svg-core": "^6.7.1", "@fortawesome/free-solid-svg-icons": "^6.7.1", "@fortawesome/react-fontawesome": "^0.2.0", @@ -50,60 +50,116 @@ "webpack": "^5.97.1" } }, + "node_modules/@ai-sdk/gateway": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-1.0.32.tgz", + "integrity": "sha512-TQRIM63EI/ccJBc7RxeB8nq/CnGNnyl7eu5stWdLwL41stkV5skVeZJe0QRvFbaOrwCkgUVE0yrUqJi4tgDC1A==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", + "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/provider-utils": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.10.tgz", + "integrity": "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/react": { + "version": "2.0.59", + "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-2.0.59.tgz", + "integrity": "sha512-whuMGkiRugJIQNJEIpt3gv53EsvQ6ub7Qh19ujbUcvXZKwoCCZlEGmUqEJqvPVRm95d4uYXFxEk0wqpxOpsm6g==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider-utils": "3.0.10", + "ai": "5.0.59", + "swr": "^2.2.5", + "throttleit": "2.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "zod": "^3.25.76 || ^4.1.8" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, "node_modules/@algolia/abtesting": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.1.0.tgz", - "integrity": "sha512-sEyWjw28a/9iluA37KLGu8vjxEIlb60uxznfTUmXImy7H5NvbpSO6yYgmgH5KiD7j+zTUUihiST0jEP12IoXow==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.5.0.tgz", + "integrity": "sha512-W/ohRkbKQsqDWALJg28X15KF7Tcyg53L1MfdOkLgvkcCcofdzGHSimHHeNG05ojjFw9HK8+VPhe/Vwq4MozIJg==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.39.0", + "@algolia/requester-browser-xhr": "5.39.0", + "@algolia/requester-fetch": "5.39.0", + "@algolia/requester-node-http": "5.39.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/autocomplete-core": { - "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==", + "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.17.9", - "@algolia/autocomplete-shared": "1.17.9" + "@algolia/autocomplete-plugin-algolia-insights": "1.19.2", + "@algolia/autocomplete-shared": "1.19.2" } }, "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "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==", + "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.17.9" + "@algolia/autocomplete-shared": "1.19.2" }, "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.17.9", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.9.tgz", - "integrity": "sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ==", + "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", @@ -111,99 +167,99 @@ } }, "node_modules/@algolia/client-abtesting": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.35.0.tgz", - "integrity": "sha512-uUdHxbfHdoppDVflCHMxRlj49/IllPwwQ2cQ8DLC4LXr3kY96AHBpW0dMyi6ygkn2MtFCc6BxXCzr668ZRhLBQ==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.39.0.tgz", + "integrity": "sha512-Vf0ZVe+qo3sHDrCinouJqlg8VoxM4Qo/KxNIqMYybkuctutfnp3kIY9OmESplOQ/9NGBthU9EG+4d5fBibWK/A==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.39.0", + "@algolia/requester-browser-xhr": "5.39.0", + "@algolia/requester-fetch": "5.39.0", + "@algolia/requester-node-http": "5.39.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.35.0.tgz", - "integrity": "sha512-SunAgwa9CamLcRCPnPHx1V2uxdQwJGqb1crYrRWktWUdld0+B2KyakNEeVn5lln4VyeNtW17Ia7V7qBWyM/Skw==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.39.0.tgz", + "integrity": "sha512-V16ITZxYIwcv1arNce65JZmn94Ft6vKlBZ//gXw8AvIH32glJz1KcbaVAUr9p7PYlGZ/XVHP6LxDgrpNdtwgcA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.39.0", + "@algolia/requester-browser-xhr": "5.39.0", + "@algolia/requester-fetch": "5.39.0", + "@algolia/requester-node-http": "5.39.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.35.0.tgz", - "integrity": "sha512-ipE0IuvHu/bg7TjT2s+187kz/E3h5ssfTtjpg1LbWMgxlgiaZIgTTbyynM7NfpSJSKsgQvCQxWjGUO51WSCu7w==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.39.0.tgz", + "integrity": "sha512-UCJTuwySEQeiKPWV3wruhuI/wHbDYenHzgL9pYsvh6r/u5Z+g61ip1iwdAlFp02CnywzI9O7+AQPh2ManYyHmQ==", "license": "MIT", "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-insights": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.35.0.tgz", - "integrity": "sha512-UNbCXcBpqtzUucxExwTSfAe8gknAJ485NfPN6o1ziHm6nnxx97piIbcBQ3edw823Tej2Wxu1C0xBY06KgeZ7gA==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.39.0.tgz", + "integrity": "sha512-s0ia8M/ZZR+iO2uLNTBrlQdEb6ZMAMcKMHckp5mcoglxrf8gHifL4LmdhGKdAxAn3UIagtqIP0RCnIymHUbm7A==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.39.0", + "@algolia/requester-browser-xhr": "5.39.0", + "@algolia/requester-fetch": "5.39.0", + "@algolia/requester-node-http": "5.39.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.35.0.tgz", - "integrity": "sha512-/KWjttZ6UCStt4QnWoDAJ12cKlQ+fkpMtyPmBgSS2WThJQdSV/4UWcqCUqGH7YLbwlj3JjNirCu3Y7uRTClxvA==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.39.0.tgz", + "integrity": "sha512-vZPIt7Lw+toNsHZUiPhNIc1Z3vUjDp7nzn6AMOaPC73gEuTq2iLPNvM06CSB6aHePo5eMeJIP5YEKBUQUA/PJA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.39.0", + "@algolia/requester-browser-xhr": "5.39.0", + "@algolia/requester-fetch": "5.39.0", + "@algolia/requester-node-http": "5.39.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.35.0.tgz", - "integrity": "sha512-8oCuJCFf/71IYyvQQC+iu4kgViTODbXDk3m7yMctEncRSRV+u2RtDVlpGGfPlJQOrAY7OONwJlSHkmbbm2Kp/w==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.39.0.tgz", + "integrity": "sha512-jcPQr3iKTWNVli2NYHPv02aNLwixDjPCpOgMp9CZTvEiPI6Ec4jHX+oFr3LDZagOFY9e1xJhc/JrgMGGW1sHnw==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.39.0", + "@algolia/requester-browser-xhr": "5.39.0", + "@algolia/requester-fetch": "5.39.0", + "@algolia/requester-node-http": "5.39.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.35.0.tgz", - "integrity": "sha512-FfmdHTrXhIduWyyuko1YTcGLuicVbhUyRjO3HbXE4aP655yKZgdTIfMhZ/V5VY9bHuxv/fGEh3Od1Lvv2ODNTg==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.39.0.tgz", + "integrity": "sha512-/IYpF10BpthGZEJQZMhMqV4AqWr5avcWfZm/SIKK1RvUDmzGqLoW/+xeJVX9C8ZnNkIC8hivbIQFaNaRw0BFZQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.39.0", + "@algolia/requester-browser-xhr": "5.39.0", + "@algolia/requester-fetch": "5.39.0", + "@algolia/requester-node-http": "5.39.0" }, "engines": { "node": ">= 14.0.0" @@ -216,99 +272,86 @@ "license": "MIT" }, "node_modules/@algolia/ingestion": { - "version": "1.35.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.35.0.tgz", - "integrity": "sha512-gPzACem9IL1Co8mM1LKMhzn1aSJmp+Vp434An4C0OBY4uEJRcqsLN3uLBlY+bYvFg8C8ImwM9YRiKczJXRk0XA==", + "version": "1.39.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.39.0.tgz", + "integrity": "sha512-IgSHKUiuecqLfBlXiuCSdRTdsO3/yvpmXrMFz8fAJ8M4QmDtHkOuD769dmybRYqsbYMHivw+lir4BgbRGMtOIQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.39.0", + "@algolia/requester-browser-xhr": "5.39.0", + "@algolia/requester-fetch": "5.39.0", + "@algolia/requester-node-http": "5.39.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/monitoring": { - "version": "1.35.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.35.0.tgz", - "integrity": "sha512-w9MGFLB6ashI8BGcQoVt7iLgDIJNCn4OIu0Q0giE3M2ItNrssvb8C0xuwJQyTy1OFZnemG0EB1OvXhIHOvQwWw==", + "version": "1.39.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.39.0.tgz", + "integrity": "sha512-8Xnd4+609SKC/hqVsuFc4evFBmvA2765/4NcH+Dpr756SKPbL1BY0X8kVxlmM3YBLNqnduSQxHxpDJUK58imCA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.39.0", + "@algolia/requester-browser-xhr": "5.39.0", + "@algolia/requester-fetch": "5.39.0", + "@algolia/requester-node-http": "5.39.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.35.0.tgz", - "integrity": "sha512-AhrVgaaXAb8Ue0u2nuRWwugt0dL5UmRgS9LXe0Hhz493a8KFeZVUE56RGIV3hAa6tHzmAV7eIoqcWTQvxzlJeQ==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.39.0.tgz", + "integrity": "sha512-D7Ye2Ss/5xqUkQUxKm/VqEJLt5kARd9IMmjdzlxaKhGgNlOemTay0lwBmOVFuJRp7UODjp5c9+K+B8g0ORObIw==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.39.0", + "@algolia/requester-browser-xhr": "5.39.0", + "@algolia/requester-fetch": "5.39.0", + "@algolia/requester-node-http": "5.39.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.35.0.tgz", - "integrity": "sha512-diY415KLJZ6x1Kbwl9u96Jsz0OstE3asjXtJ9pmk1d+5gPuQ5jQyEsgC+WmEXzlec3iuVszm8AzNYYaqw6B+Zw==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.39.0.tgz", + "integrity": "sha512-mgPte1ZJqpk9dkVs44J3wKAbHATvHZNlSpzhMdjMLIg/3qTycSZyDiomLiSlxE8CLsxyBAOJWnyKRHfom+Z1rg==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0" + "@algolia/client-common": "5.39.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.35.0.tgz", - "integrity": "sha512-uydqnSmpAjrgo8bqhE9N1wgcB98psTRRQXcjc4izwMB7yRl9C8uuAQ/5YqRj04U0mMQ+fdu2fcNF6m9+Z1BzDQ==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.39.0.tgz", + "integrity": "sha512-LIrCkrxu1WnO3ev1+w6NnZ12JZL/o+2H9w6oWnZAjQZIlA/Ym6M9QHkt+OQ/SwkuoiNkW3DAo+Pi4A2V9FPtqg==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0" + "@algolia/client-common": "5.39.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.35.0.tgz", - "integrity": "sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.39.0.tgz", + "integrity": "sha512-6beG+egPwXmvhAg+m0STCj+ZssDcjrLzf4L05aKm2nGglMXSSPz0cH/rM+kVD9krNfldiMctURd4wjojW1fV0w==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0" + "@algolia/client-common": "5.39.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", @@ -364,30 +407,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "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": { - "@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", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -412,15 +455,15 @@ } }, "node_modules/@babel/generator": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.3.tgz", - "integrity": "sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.3", - "@babel/types": "^7.27.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { @@ -428,12 +471,12 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "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==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" @@ -465,17 +508,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "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==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", + "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", "license": "MIT", "dependencies": { - "@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", + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.3", "semver": "^6.3.1" }, "engines": { @@ -495,12 +538,12 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-annotate-as-pure": "^7.27.1", "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, @@ -536,14 +579,23 @@ "@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.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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -563,14 +615,14 @@ } }, "node_modules/@babel/helper-module-transforms": { - "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==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -580,12 +632,12 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -601,14 +653,14 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-wrap-function": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -618,14 +670,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", - "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.26.5" + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -635,13 +687,13 @@ } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -675,39 +727,39 @@ } }, "node_modules/@babel/helper-wrap-function": { - "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==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", - "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "license": "MIT", "dependencies": { - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.10" + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.4.tgz", - "integrity": "sha512-BRmLHGwpUqLFR2jzx9orBuX/ABDkj2jLKOXrHDTN2aOKL+jFDDKaRNo9nyYsIl9h/UE/7lMKdDjKQQyxKKDZ7g==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.3" + "@babel/types": "^7.28.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -717,13 +769,13 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -733,12 +785,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -748,12 +800,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -763,14 +815,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -780,13 +832,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "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==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -820,12 +872,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -835,12 +887,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -850,12 +902,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -865,12 +917,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", - "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -896,12 +948,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -911,14 +963,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "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==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-remap-async-to-generator": "^7.25.9", - "@babel/traverse": "^7.26.8" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -928,14 +980,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -945,12 +997,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -960,12 +1012,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "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==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz", + "integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -975,13 +1027,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -991,13 +1043,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "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==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1007,17 +1059,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "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==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", "license": "MIT", "dependencies": { - "@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" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -1026,23 +1078,14 @@ "@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.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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/template": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1052,12 +1095,13 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "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==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", + "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -1067,13 +1111,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1083,12 +1127,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1098,13 +1142,13 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1114,12 +1158,28 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -1129,12 +1189,12 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1144,12 +1204,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1159,13 +1219,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1175,14 +1235,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1192,12 +1252,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1207,12 +1267,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1222,12 +1282,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1237,12 +1297,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1252,13 +1312,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1268,13 +1328,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1284,15 +1344,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", "license": "MIT", "dependencies": { - "@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" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1302,13 +1362,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1318,13 +1378,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1334,12 +1394,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1349,12 +1409,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1364,12 +1424,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1379,14 +1439,16 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "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==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9" + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -1396,13 +1458,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1412,12 +1474,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1427,13 +1489,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1443,12 +1505,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", - "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1458,13 +1520,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1474,14 +1536,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1491,12 +1553,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1521,12 +1583,12 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "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==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1536,16 +1598,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", "license": "MIT", "dependencies": { - "@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" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1555,12 +1617,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.25.9" + "@babel/plugin-transform-react-jsx": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1570,13 +1632,13 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1586,13 +1648,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "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==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "regenerator-transform": "^0.15.2" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1602,13 +1663,13 @@ } }, "node_modules/@babel/plugin-transform-regexp-modifiers": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1618,12 +1679,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1633,9 +1694,9 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.0.tgz", - "integrity": "sha512-dGopk9nZrtCs2+nfIem25UuHyt5moSJamArzIoh9/vezUQPmYDOzjaHDCkAzuGJibCIkPup8rMT2+wYB6S73cA==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.3.tgz", + "integrity": "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", @@ -1652,19 +1713,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", - "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5", - "core-js-compat": "^3.43.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -1675,12 +1723,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1690,13 +1738,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", - "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1706,12 +1754,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1721,12 +1769,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1736,12 +1784,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1751,16 +1799,16 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.8.tgz", - "integrity": "sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", + "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", "license": "MIT", "dependencies": { - "@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" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1770,12 +1818,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1785,13 +1833,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1801,13 +1849,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1817,13 +1865,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "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==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1833,79 +1881,80 @@ } }, "node_modules/@babel/preset-env": { - "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.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", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", + "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@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.3", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.26.0", - "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.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/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@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.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@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.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", - "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", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", "semver": "^6.3.1" }, "engines": { @@ -1939,17 +1988,17 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz", - "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz", + "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", "license": "MIT", "dependencies": { - "@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" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.27.1", + "@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" }, "engines": { "node": ">=6.9.0" @@ -1959,16 +2008,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz", - "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", + "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", "license": "MIT", "dependencies": { - "@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" + "@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.27.1" }, "engines": { "node": ">=6.9.0" @@ -1990,9 +2039,9 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.2.tgz", - "integrity": "sha512-FVFaVs2/dZgD3Y9ZD+AKNKjyGKzwu0C54laAXWUXgLcVXcCX6YZ6GhK2cp7FogSN2OA0Fu+QT8dP3FUdo9ShSQ==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.4.tgz", + "integrity": "sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ==", "license": "MIT", "dependencies": { "core-js-pure": "^3.43.0" @@ -2016,36 +2065,27 @@ } }, "node_modules/@babel/traverse": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", - "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.3", - "@babel/parser": "^7.27.4", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", - "@babel/types": "^7.27.3", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/types": "^7.28.4", + "debug": "^4.3.1" }, "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.27.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.3.tgz", - "integrity": "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -2134,9 +2174,9 @@ } }, "node_modules/@csstools/color-helpers": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", - "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", "funding": [ { "type": "github", @@ -2176,9 +2216,9 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.10.tgz", - "integrity": "sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", "funding": [ { "type": "github", @@ -2191,7 +2231,7 @@ ], "license": "MIT", "dependencies": { - "@csstools/color-helpers": "^5.0.2", + "@csstools/color-helpers": "^5.1.0", "@csstools/css-calc": "^2.1.4" }, "engines": { @@ -2243,10 +2283,33 @@ "node": ">=18" } }, - "node_modules/@csstools/media-query-list-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", - "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-alpha-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz", + "integrity": "sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==", "funding": [ { "type": "github", @@ -2257,13 +2320,19 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT", + "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": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" + "postcss": "^8.4" } }, "node_modules/@csstools/postcss-cascade-layers": { @@ -2328,9 +2397,38 @@ } }, "node_modules/@csstools/postcss-color-function": { - "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==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz", + "integrity": "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-function-display-p3-linear": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz", + "integrity": "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==", "funding": [ { "type": "github", @@ -2343,10 +2441,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.10", + "@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.1.0", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2357,9 +2455,9 @@ } }, "node_modules/@csstools/postcss-color-mix-function": { - "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==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz", + "integrity": "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==", "funding": [ { "type": "github", @@ -2372,10 +2470,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.10", + "@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.1.0", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2386,9 +2484,9 @@ } }, "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { - "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==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz", + "integrity": "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==", "funding": [ { "type": "github", @@ -2401,10 +2499,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.10", + "@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.1.0", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2415,9 +2513,37 @@ } }, "node_modules/@csstools/postcss-content-alt-text": { - "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==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz", + "integrity": "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-contrast-color-function": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz", + "integrity": "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==", "funding": [ { "type": "github", @@ -2430,9 +2556,10 @@ ], "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.1.0", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2496,9 +2623,9 @@ } }, "node_modules/@csstools/postcss-gamut-mapping": { - "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==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz", + "integrity": "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==", "funding": [ { "type": "github", @@ -2511,7 +2638,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-color-parser": "^3.1.0", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" }, @@ -2523,9 +2650,9 @@ } }, "node_modules/@csstools/postcss-gradients-interpolation-method": { - "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==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz", + "integrity": "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==", "funding": [ { "type": "github", @@ -2538,10 +2665,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.10", + "@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.1.0", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2552,9 +2679,9 @@ } }, "node_modules/@csstools/postcss-hwb-function": { - "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==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz", + "integrity": "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==", "funding": [ { "type": "github", @@ -2567,10 +2694,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.10", + "@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.1.0", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2581,9 +2708,9 @@ } }, "node_modules/@csstools/postcss-ic-unit": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.2.tgz", - "integrity": "sha512-lrK2jjyZwh7DbxaNnIUjkeDmU8Y6KyzRBk91ZkI5h8nb1ykEfZrtIVArdIjX4DHMIBGpdHrgP0n4qXDr7OHaKA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz", + "integrity": "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==", "funding": [ { "type": "github", @@ -2596,7 +2723,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^4.1.0", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, @@ -2691,9 +2818,9 @@ } }, "node_modules/@csstools/postcss-light-dark-function": { - "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==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz", + "integrity": "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==", "funding": [ { "type": "github", @@ -2708,7 +2835,7 @@ "dependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.1.0", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2942,9 +3069,9 @@ } }, "node_modules/@csstools/postcss-oklab-function": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.10.tgz", - "integrity": "sha512-ZzZUTDd0fgNdhv8UUjGCtObPD8LYxMH+MJsW9xlZaWTV8Ppr4PtxlHYNMmF4vVWGl0T6f8tyWAKjoI6vePSgAg==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz", + "integrity": "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==", "funding": [ { "type": "github", @@ -2957,10 +3084,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.10", + "@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.1.0", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -2971,9 +3098,9 @@ } }, "node_modules/@csstools/postcss-progressive-custom-properties": { - "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==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", + "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", "funding": [ { "type": "github", @@ -3023,9 +3150,9 @@ } }, "node_modules/@csstools/postcss-relative-color-syntax": { - "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==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz", + "integrity": "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==", "funding": [ { "type": "github", @@ -3038,10 +3165,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.10", + "@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.1.0", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -3144,9 +3271,9 @@ } }, "node_modules/@csstools/postcss-text-decoration-shorthand": { - "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==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz", + "integrity": "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==", "funding": [ { "type": "github", @@ -3159,7 +3286,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/color-helpers": "^5.0.2", + "@csstools/color-helpers": "^5.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -3250,21 +3377,24 @@ } }, "node_modules/@docsearch/css": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.9.0.tgz", - "integrity": "sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.1.0.tgz", + "integrity": "sha512-nuNKGjHj/FQeWgE9t+i83QD/V67QiaAmGY7xS9TVCRUiCqSljOgIKlsLoQZKKVwEG8f+OWKdznzZkJxGZ7d06A==", "license": "MIT" }, "node_modules/@docsearch/react": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.9.0.tgz", - "integrity": "sha512-mb5FOZYZIkRQ6s/NWnM98k879vu5pscWqTLubLFBO87igYYT4VzVazh4h5o/zCvTIZgEt3PvsCOMOswOUo9yHQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.1.0.tgz", + "integrity": "sha512-4GHI7TT3sJZ2Vs4Kjadv7vAkMrTsJqHvzvxO3JA7UT8iPRKaDottG5o5uNshPWhVVaBYPC35Ukf8bfCotGpjSg==", "license": "MIT", "dependencies": { - "@algolia/autocomplete-core": "1.17.9", - "@algolia/autocomplete-preset-algolia": "1.17.9", - "@docsearch/css": "3.9.0", - "algoliasearch": "^5.14.2" + "@ai-sdk/react": "^2.0.30", + "@algolia/autocomplete-core": "1.19.2", + "@docsearch/css": "4.1.0", + "ai": "^5.0.30", + "algoliasearch": "^5.28.0", + "marked": "^16.3.0", + "zod": "^4.1.8" }, "peerDependencies": { "@types/react": ">= 16.8.0 < 20.0.0", @@ -3288,9 +3418,9 @@ } }, "node_modules/@docusaurus/babel": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.8.1.tgz", - "integrity": "sha512-3brkJrml8vUbn9aeoZUlJfsI/GqyFcDgQJwQkmBtclJgWDEQBKKeagZfOgx0WfUQhagL1sQLNW0iBdxnI863Uw==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.9.1.tgz", + "integrity": "sha512-/uoi3oG+wvbVWNBRfPrzrEslOSeLxrQEyWMywK51TLDFTANqIRivzkMusudh5bdDty8fXzCYUT+tg5t697jYqg==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.9", @@ -3303,28 +3433,28 @@ "@babel/runtime": "^7.25.9", "@babel/runtime-corejs3": "^7.25.9", "@babel/traverse": "^7.25.9", - "@docusaurus/logger": "3.8.1", - "@docusaurus/utils": "3.8.1", + "@docusaurus/logger": "3.9.1", + "@docusaurus/utils": "3.9.1", "babel-plugin-dynamic-import-node": "^2.3.3", "fs-extra": "^11.1.1", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" } }, "node_modules/@docusaurus/bundler": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.8.1.tgz", - "integrity": "sha512-/z4V0FRoQ0GuSLToNjOSGsk6m2lQUG4FRn8goOVoZSRsTrU8YR2aJacX5K3RG18EaX9b+52pN4m1sL3MQZVsQA==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.9.1.tgz", + "integrity": "sha512-E1c9DgNmAz4NqbNtiJVp4UgjLtr8O01IgtXD/NDQ4PZaK8895cMiTOgb3k7mN0qX8A3lb8vqyrPJ842+yMpuUg==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.9", - "@docusaurus/babel": "3.8.1", - "@docusaurus/cssnano-preset": "3.8.1", - "@docusaurus/logger": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils": "3.8.1", + "@docusaurus/babel": "3.9.1", + "@docusaurus/cssnano-preset": "3.9.1", + "@docusaurus/logger": "3.9.1", + "@docusaurus/types": "3.9.1", + "@docusaurus/utils": "3.9.1", "babel-loader": "^9.2.1", "clean-css": "^5.3.3", "copy-webpack-plugin": "^11.0.0", @@ -3345,7 +3475,7 @@ "webpackbar": "^6.0.1" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { "@docusaurus/faster": "*" @@ -3357,18 +3487,18 @@ } }, "node_modules/@docusaurus/core": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.8.1.tgz", - "integrity": "sha512-ENB01IyQSqI2FLtOzqSI3qxG2B/jP4gQPahl2C3XReiLebcVh5B5cB9KYFvdoOqOWPyr5gXK4sjgTKv7peXCrA==", - "license": "MIT", - "dependencies": { - "@docusaurus/babel": "3.8.1", - "@docusaurus/bundler": "3.8.1", - "@docusaurus/logger": "3.8.1", - "@docusaurus/mdx-loader": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-common": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.9.1.tgz", + "integrity": "sha512-FWDk1LIGD5UR5Zmm9rCrXRoxZUgbwuP6FBA7rc50DVfzqDOMkeMe3NyJhOsA2dF0zBE3VbHEIMmTjKwTZJwbaA==", + "license": "MIT", + "dependencies": { + "@docusaurus/babel": "3.9.1", + "@docusaurus/bundler": "3.9.1", + "@docusaurus/logger": "3.9.1", + "@docusaurus/mdx-loader": "3.9.1", + "@docusaurus/utils": "3.9.1", + "@docusaurus/utils-common": "3.9.1", + "@docusaurus/utils-validation": "3.9.1", "boxen": "^6.2.1", "chalk": "^4.1.2", "chokidar": "^3.5.3", @@ -3402,14 +3532,14 @@ "update-notifier": "^6.0.2", "webpack": "^5.95.0", "webpack-bundle-analyzer": "^4.10.2", - "webpack-dev-server": "^4.15.2", + "webpack-dev-server": "^5.2.2", "webpack-merge": "^6.0.1" }, "bin": { "docusaurus": "bin/docusaurus.mjs" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { "@mdx-js/react": "^3.0.0", @@ -3418,9 +3548,9 @@ } }, "node_modules/@docusaurus/cssnano-preset": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.8.1.tgz", - "integrity": "sha512-G7WyR2N6SpyUotqhGznERBK+x84uyhfMQM2MmDLs88bw4Flom6TY46HzkRkSEzaP9j80MbTN8naiL1fR17WQug==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.9.1.tgz", + "integrity": "sha512-2y7+s7RWQMqBg+9ejeKwvZs7Bdw/hHIVJIodwMXbs2kr+S48AhcmAfdOh6Cwm0unJb0hJUshN0ROwRoQMwl3xg==", "license": "MIT", "dependencies": { "cssnano-preset-advanced": "^6.1.2", @@ -3429,31 +3559,31 @@ "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" } }, "node_modules/@docusaurus/logger": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.8.1.tgz", - "integrity": "sha512-2wjeGDhKcExEmjX8k1N/MRDiPKXGF2Pg+df/bDDPnnJWHXnVEZxXj80d6jcxp1Gpnksl0hF8t/ZQw9elqj2+ww==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.9.1.tgz", + "integrity": "sha512-C9iFzXwHzwvGlisE4bZx+XQE0JIqlGAYAd5LzpR7fEDgjctu7yL8bE5U4nTNywXKHURDzMt4RJK8V6+stFHVkA==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" } }, "node_modules/@docusaurus/mdx-loader": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.8.1.tgz", - "integrity": "sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.9.1.tgz", + "integrity": "sha512-/1PY8lqry8jCt0qZddJSpc0U2sH6XC27kVJZfpA7o2TiQ3mdBQyH5AVbj/B2m682B1ounE+XjI0LdpOkAQLPoA==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", + "@docusaurus/logger": "3.9.1", + "@docusaurus/utils": "3.9.1", + "@docusaurus/utils-validation": "3.9.1", "@mdx-js/mdx": "^3.0.0", "@slorber/remark-comment": "^1.0.0", "escape-html": "^1.0.3", @@ -3477,7 +3607,7 @@ "webpack": "^5.88.1" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -3485,12 +3615,12 @@ } }, "node_modules/@docusaurus/module-type-aliases": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.8.1.tgz", - "integrity": "sha512-6xhvAJiXzsaq3JdosS7wbRt/PwEPWHr9eM4YNYqVlbgG1hSK3uQDXTVvQktasp3VO6BmfYWPozueLWuj4gB+vg==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.1.tgz", + "integrity": "sha512-YBce3GbJGGcMbJTyHcnEOMvdXqg41pa5HsrMCGA5Rm4z0h0tHS6YtEldj0mlfQRhCG7Y0VD66t2tb87Aom+11g==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.8.1", + "@docusaurus/types": "3.9.1", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -3504,19 +3634,19 @@ } }, "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.8.1.tgz", - "integrity": "sha512-vNTpMmlvNP9n3hGEcgPaXyvTljanAKIUkuG9URQ1DeuDup0OR7Ltvoc8yrmH+iMZJbcQGhUJF+WjHLwuk8HSdw==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/logger": "3.8.1", - "@docusaurus/mdx-loader": "3.8.1", - "@docusaurus/theme-common": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-common": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.9.1.tgz", + "integrity": "sha512-vT6kIimpJLWvW9iuWzH4u7VpTdsGlmn4yfyhq0/Kb1h4kf9uVouGsTmrD7WgtYBUG1P+TSmQzUUQa+ALBSRTig==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.1", + "@docusaurus/logger": "3.9.1", + "@docusaurus/mdx-loader": "3.9.1", + "@docusaurus/theme-common": "3.9.1", + "@docusaurus/types": "3.9.1", + "@docusaurus/utils": "3.9.1", + "@docusaurus/utils-common": "3.9.1", + "@docusaurus/utils-validation": "3.9.1", "cheerio": "1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^11.1.1", @@ -3529,7 +3659,7 @@ "webpack": "^5.88.1" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { "@docusaurus/plugin-content-docs": "*", @@ -3538,20 +3668,20 @@ } }, "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.8.1.tgz", - "integrity": "sha512-oByRkSZzeGNQByCMaX+kif5Nl2vmtj2IHQI2fWjCfCootsdKZDPFLonhIp5s3IGJO7PLUfe0POyw0Xh/RrGXJA==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/logger": "3.8.1", - "@docusaurus/mdx-loader": "3.8.1", - "@docusaurus/module-type-aliases": "3.8.1", - "@docusaurus/theme-common": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-common": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.1.tgz", + "integrity": "sha512-DyLk9BIA6I9gPIuia8XIL+XIEbNnExam6AHzRsfrEq4zJr7k/DsWW7oi4aJMepDnL7jMRhpVcdsCxdjb0/A9xg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.1", + "@docusaurus/logger": "3.9.1", + "@docusaurus/mdx-loader": "3.9.1", + "@docusaurus/module-type-aliases": "3.9.1", + "@docusaurus/theme-common": "3.9.1", + "@docusaurus/types": "3.9.1", + "@docusaurus/utils": "3.9.1", + "@docusaurus/utils-common": "3.9.1", + "@docusaurus/utils-validation": "3.9.1", "@types/react-router-config": "^5.0.7", "combine-promises": "^1.1.0", "fs-extra": "^11.1.1", @@ -3563,7 +3693,7 @@ "webpack": "^5.88.1" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -3571,22 +3701,22 @@ } }, "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.8.1.tgz", - "integrity": "sha512-a+V6MS2cIu37E/m7nDJn3dcxpvXb6TvgdNI22vJX8iUTp8eoMoPa0VArEbWvCxMY/xdC26WzNv4wZ6y0iIni/w==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.9.1.tgz", + "integrity": "sha512-/1wFzRnXYASI+Nv9ck9IVPIMw0O5BGQ8ZVhDzEwhkL+tl44ycvSnY6PIe6rW2HLxsw61Z3WFwAiU8+xMMtMZpg==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/mdx-loader": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", + "@docusaurus/core": "3.9.1", + "@docusaurus/mdx-loader": "3.9.1", + "@docusaurus/types": "3.9.1", + "@docusaurus/utils": "3.9.1", + "@docusaurus/utils-validation": "3.9.1", "fs-extra": "^11.1.1", "tslib": "^2.6.0", "webpack": "^5.88.1" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -3594,36 +3724,36 @@ } }, "node_modules/@docusaurus/plugin-css-cascade-layers": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.8.1.tgz", - "integrity": "sha512-VQ47xRxfNKjHS5ItzaVXpxeTm7/wJLFMOPo1BkmoMG4Cuz4nuI+Hs62+RMk1OqVog68Swz66xVPK8g9XTrBKRw==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.9.1.tgz", + "integrity": "sha512-/QyW2gRCk/XE3ttCK/ERIgle8KJ024dBNKMu6U5SmpJvuT2il1n5jR/48Pp/9wEwut8WVml4imNm6X8JsL5A0Q==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", + "@docusaurus/core": "3.9.1", + "@docusaurus/types": "3.9.1", + "@docusaurus/utils": "3.9.1", + "@docusaurus/utils-validation": "3.9.1", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" } }, "node_modules/@docusaurus/plugin-debug": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.8.1.tgz", - "integrity": "sha512-nT3lN7TV5bi5hKMB7FK8gCffFTBSsBsAfV84/v293qAmnHOyg1nr9okEw8AiwcO3bl9vije5nsUvP0aRl2lpaw==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.9.1.tgz", + "integrity": "sha512-qPeAuk0LccC251d7jg2MRhNI+o7niyqa924oEM/AxnZJvIpMa596aAxkRImiAqNN6+gtLE1Hkrz/RHUH2HDGsA==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils": "3.8.1", + "@docusaurus/core": "3.9.1", + "@docusaurus/types": "3.9.1", + "@docusaurus/utils": "3.9.1", "fs-extra": "^11.1.1", "react-json-view-lite": "^2.3.0", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -3631,18 +3761,18 @@ } }, "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.8.1.tgz", - "integrity": "sha512-Hrb/PurOJsmwHAsfMDH6oVpahkEGsx7F8CWMjyP/dw1qjqmdS9rcV1nYCGlM8nOtD3Wk/eaThzUB5TSZsGz+7Q==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.9.1.tgz", + "integrity": "sha512-k4Qq2HphqOrIU/CevGPdEO1yJnWUI8m0zOJsYt5NfMJwNsIn/gDD6gv/DKD+hxHndQT5pacsfBd4BWHZVNVroQ==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", + "@docusaurus/core": "3.9.1", + "@docusaurus/types": "3.9.1", + "@docusaurus/utils-validation": "3.9.1", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -3650,19 +3780,19 @@ } }, "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.8.1.tgz", - "integrity": "sha512-tKE8j1cEZCh8KZa4aa80zpSTxsC2/ZYqjx6AAfd8uA8VHZVw79+7OTEP2PoWi0uL5/1Is0LF5Vwxd+1fz5HlKg==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.9.1.tgz", + "integrity": "sha512-n9BURBiQyJKI/Ecz35IUjXYwXcgNCSq7/eA07+ZYcDiSyH2p/EjPf8q/QcZG3CyEJPZ/SzGkDHePfcVPahY4Gg==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", + "@docusaurus/core": "3.9.1", + "@docusaurus/types": "3.9.1", + "@docusaurus/utils-validation": "3.9.1", "@types/gtag.js": "^0.0.12", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -3670,18 +3800,18 @@ } }, "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.8.1.tgz", - "integrity": "sha512-iqe3XKITBquZq+6UAXdb1vI0fPY5iIOitVjPQ581R1ZKpHr0qe+V6gVOrrcOHixPDD/BUKdYwkxFjpNiEN+vBw==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.9.1.tgz", + "integrity": "sha512-rZAQZ25ZuXaThBajxzLjXieTDUCMmBzfAA6ThElQ3o7Q+LEpOjCIrwGFau0KLY9HeG6x91+FwwsAM8zeApYDrg==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", + "@docusaurus/core": "3.9.1", + "@docusaurus/types": "3.9.1", + "@docusaurus/utils-validation": "3.9.1", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -3689,23 +3819,23 @@ } }, "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.8.1.tgz", - "integrity": "sha512-+9YV/7VLbGTq8qNkjiugIelmfUEVkTyLe6X8bWq7K5qPvGXAjno27QAfFq63mYfFFbJc7z+pudL63acprbqGzw==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.9.1.tgz", + "integrity": "sha512-k/bf5cXDxAJUYTzqatgFJwmZsLUbIgl6S8AdZMKGG2Mv2wcOHt+EQNN9qPyWZ5/9cFj+Q8f8DN+KQheBMYLong==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/logger": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-common": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", + "@docusaurus/core": "3.9.1", + "@docusaurus/logger": "3.9.1", + "@docusaurus/types": "3.9.1", + "@docusaurus/utils": "3.9.1", + "@docusaurus/utils-common": "3.9.1", + "@docusaurus/utils-validation": "3.9.1", "fs-extra": "^11.1.1", "sitemap": "^7.1.1", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -3713,22 +3843,22 @@ } }, "node_modules/@docusaurus/plugin-svgr": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.8.1.tgz", - "integrity": "sha512-rW0LWMDsdlsgowVwqiMb/7tANDodpy1wWPwCcamvhY7OECReN3feoFwLjd/U4tKjNY3encj0AJSTxJA+Fpe+Gw==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.9.1.tgz", + "integrity": "sha512-TeZOXT2PSdTNR1OpDJMkYqFyX7MMhbd4t16hQByXksgZQCXNyw3Dio+KaDJ2Nj+LA4WkOvsk45bWgYG5MAaXSQ==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", + "@docusaurus/core": "3.9.1", + "@docusaurus/types": "3.9.1", + "@docusaurus/utils": "3.9.1", + "@docusaurus/utils-validation": "3.9.1", "@svgr/core": "8.1.0", "@svgr/webpack": "^8.1.0", "tslib": "^2.6.0", "webpack": "^5.88.1" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -3736,29 +3866,29 @@ } }, "node_modules/@docusaurus/preset-classic": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.8.1.tgz", - "integrity": "sha512-yJSjYNHXD8POMGc2mKQuj3ApPrN+eG0rO1UPgSx7jySpYU+n4WjBikbrA2ue5ad9A7aouEtMWUoiSRXTH/g7KQ==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.9.1.tgz", + "integrity": "sha512-ZHga2xsxxsyd0dN1BpLj8S889Eu9eMBuj2suqxdw/vaaXu/FjJ8KEGbcaeo6nHPo8VQcBBnPEdkBtSDm2TfMNw==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/plugin-content-blog": "3.8.1", - "@docusaurus/plugin-content-docs": "3.8.1", - "@docusaurus/plugin-content-pages": "3.8.1", - "@docusaurus/plugin-css-cascade-layers": "3.8.1", - "@docusaurus/plugin-debug": "3.8.1", - "@docusaurus/plugin-google-analytics": "3.8.1", - "@docusaurus/plugin-google-gtag": "3.8.1", - "@docusaurus/plugin-google-tag-manager": "3.8.1", - "@docusaurus/plugin-sitemap": "3.8.1", - "@docusaurus/plugin-svgr": "3.8.1", - "@docusaurus/theme-classic": "3.8.1", - "@docusaurus/theme-common": "3.8.1", - "@docusaurus/theme-search-algolia": "3.8.1", - "@docusaurus/types": "3.8.1" + "@docusaurus/core": "3.9.1", + "@docusaurus/plugin-content-blog": "3.9.1", + "@docusaurus/plugin-content-docs": "3.9.1", + "@docusaurus/plugin-content-pages": "3.9.1", + "@docusaurus/plugin-css-cascade-layers": "3.9.1", + "@docusaurus/plugin-debug": "3.9.1", + "@docusaurus/plugin-google-analytics": "3.9.1", + "@docusaurus/plugin-google-gtag": "3.9.1", + "@docusaurus/plugin-google-tag-manager": "3.9.1", + "@docusaurus/plugin-sitemap": "3.9.1", + "@docusaurus/plugin-svgr": "3.9.1", + "@docusaurus/theme-classic": "3.9.1", + "@docusaurus/theme-common": "3.9.1", + "@docusaurus/theme-search-algolia": "3.9.1", + "@docusaurus/types": "3.9.1" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -3766,27 +3896,26 @@ } }, "node_modules/@docusaurus/theme-classic": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.8.1.tgz", - "integrity": "sha512-bqDUCNqXeYypMCsE1VcTXSI1QuO4KXfx8Cvl6rYfY0bhhqN6d2WZlRkyLg/p6pm+DzvanqHOyYlqdPyP0iz+iw==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/logger": "3.8.1", - "@docusaurus/mdx-loader": "3.8.1", - "@docusaurus/module-type-aliases": "3.8.1", - "@docusaurus/plugin-content-blog": "3.8.1", - "@docusaurus/plugin-content-docs": "3.8.1", - "@docusaurus/plugin-content-pages": "3.8.1", - "@docusaurus/theme-common": "3.8.1", - "@docusaurus/theme-translations": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-common": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.9.1.tgz", + "integrity": "sha512-LrAIu/mQ04nG6s1cssC0TMmICD8twFIIn/hJ5Pd9uIPQvtKnyAKEn12RefopAul5KfMo9kixPaqogV5jIJr26w==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.1", + "@docusaurus/logger": "3.9.1", + "@docusaurus/mdx-loader": "3.9.1", + "@docusaurus/module-type-aliases": "3.9.1", + "@docusaurus/plugin-content-blog": "3.9.1", + "@docusaurus/plugin-content-docs": "3.9.1", + "@docusaurus/plugin-content-pages": "3.9.1", + "@docusaurus/theme-common": "3.9.1", + "@docusaurus/theme-translations": "3.9.1", + "@docusaurus/types": "3.9.1", + "@docusaurus/utils": "3.9.1", + "@docusaurus/utils-common": "3.9.1", + "@docusaurus/utils-validation": "3.9.1", "@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", @@ -3799,7 +3928,7 @@ "utility-types": "^3.10.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -3807,15 +3936,15 @@ } }, "node_modules/@docusaurus/theme-common": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.8.1.tgz", - "integrity": "sha512-UswMOyTnPEVRvN5Qzbo+l8k4xrd5fTFu2VPPfD6FcW/6qUtVLmJTQCktbAL3KJ0BVXGm5aJXz/ZrzqFuZERGPw==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.9.1.tgz", + "integrity": "sha512-j9adi961F+6Ps9d0jcb5BokMcbjXAAJqKkV43eo8nh4YgmDj7KUNDX4EnOh/MjTQeO06oPY5cxp3yUXdW/8Ggw==", "license": "MIT", "dependencies": { - "@docusaurus/mdx-loader": "3.8.1", - "@docusaurus/module-type-aliases": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-common": "3.8.1", + "@docusaurus/mdx-loader": "3.9.1", + "@docusaurus/module-type-aliases": "3.9.1", + "@docusaurus/utils": "3.9.1", + "@docusaurus/utils-common": "3.9.1", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -3826,7 +3955,7 @@ "utility-types": "^3.10.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { "@docusaurus/plugin-content-docs": "*", @@ -3835,43 +3964,49 @@ } }, "node_modules/@docusaurus/theme-mermaid": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.8.1.tgz", - "integrity": "sha512-IWYqjyTPjkNnHsFFu9+4YkeXS7PD1xI3Bn2shOhBq+f95mgDfWInkpfBN4aYvx4fTT67Am6cPtohRdwh4Tidtg==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.9.1.tgz", + "integrity": "sha512-aKMFlQfxueVBPdCdrNSshG12fOkJXSn1sb6EhI/sGn3UpiTEiazJm4QLP6NoF78mqq8O5Ar2Yll+iHWLvCsuZQ==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/module-type-aliases": "3.8.1", - "@docusaurus/theme-common": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", + "@docusaurus/core": "3.9.1", + "@docusaurus/module-type-aliases": "3.9.1", + "@docusaurus/theme-common": "3.9.1", + "@docusaurus/types": "3.9.1", + "@docusaurus/utils-validation": "3.9.1", "mermaid": ">=11.6.0", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.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.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.8.1.tgz", - "integrity": "sha512-NBFH5rZVQRAQM087aYSRKQ9yGEK9eHd+xOxQjqNpxMiV85OhJDD4ZGz6YJIod26Fbooy54UWVdzNU0TFeUUUzQ==", - "license": "MIT", - "dependencies": { - "@docsearch/react": "^3.9.0", - "@docusaurus/core": "3.8.1", - "@docusaurus/logger": "3.8.1", - "@docusaurus/plugin-content-docs": "3.8.1", - "@docusaurus/theme-common": "3.8.1", - "@docusaurus/theme-translations": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-validation": "3.8.1", - "algoliasearch": "^5.17.1", - "algoliasearch-helper": "^3.22.6", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.9.1.tgz", + "integrity": "sha512-WjM28bzlgfT6nHlEJemkwyGVpvGsZWPireV/w+wZ1Uo64xCZ8lNOb4xwQRukDaLSed3oPBN0gSnu06l5VuCXHg==", + "license": "MIT", + "dependencies": { + "@docsearch/react": "^3.9.0 || ^4.1.0", + "@docusaurus/core": "3.9.1", + "@docusaurus/logger": "3.9.1", + "@docusaurus/plugin-content-docs": "3.9.1", + "@docusaurus/theme-common": "3.9.1", + "@docusaurus/theme-translations": "3.9.1", + "@docusaurus/utils": "3.9.1", + "@docusaurus/utils-validation": "3.9.1", + "algoliasearch": "^5.37.0", + "algoliasearch-helper": "^3.26.0", "clsx": "^2.0.0", "eta": "^2.2.0", "fs-extra": "^11.1.1", @@ -3880,7 +4015,7 @@ "utility-types": "^3.10.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -3888,16 +4023,16 @@ } }, "node_modules/@docusaurus/theme-translations": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.8.1.tgz", - "integrity": "sha512-OTp6eebuMcf2rJt4bqnvuwmm3NVXfzfYejL+u/Y1qwKhZPrjPoKWfk1CbOP5xH5ZOPkiAsx4dHdQBRJszK3z2g==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.9.1.tgz", + "integrity": "sha512-mUQd49BSGKTiM6vP9+JFgRJL28lMIN3PUvXjF3rzuOHMByUZUBNwCt26Z23GkKiSIOrRkjKoaBNTipR/MHdYSQ==", "license": "MIT", "dependencies": { "fs-extra": "^11.1.1", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" } }, "node_modules/@docusaurus/tsconfig": { @@ -3908,13 +4043,14 @@ "license": "MIT" }, "node_modules/@docusaurus/types": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.8.1.tgz", - "integrity": "sha512-ZPdW5AB+pBjiVrcLuw3dOS6BFlrG0XkS2lDGsj8TizcnREQg3J8cjsgfDviszOk4CweNfwo1AEELJkYaMUuOPg==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", + "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", "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", @@ -3943,14 +4079,14 @@ } }, "node_modules/@docusaurus/utils": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.8.1.tgz", - "integrity": "sha512-P1ml0nvOmEFdmu0smSXOqTS1sxU5tqvnc0dA4MTKV39kye+bhQnjkIKEE18fNOvxjyB86k8esoCIFM3x4RykOQ==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.9.1.tgz", + "integrity": "sha512-YAL4yhhWLl9DXuf5MVig260a6INz4MehrBGFU/CZu8yXmRiYEuQvRFWh9ZsjfAOyaG7za1MNmBVZ4VVAi/CiJA==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.8.1", - "@docusaurus/types": "3.8.1", - "@docusaurus/utils-common": "3.8.1", + "@docusaurus/logger": "3.9.1", + "@docusaurus/types": "3.9.1", + "@docusaurus/utils-common": "3.9.1", "escape-string-regexp": "^4.0.0", "execa": "5.1.1", "file-loader": "^6.2.0", @@ -3971,31 +4107,31 @@ "webpack": "^5.88.1" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" } }, "node_modules/@docusaurus/utils-common": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.8.1.tgz", - "integrity": "sha512-zTZiDlvpvoJIrQEEd71c154DkcriBecm4z94OzEE9kz7ikS3J+iSlABhFXM45mZ0eN5pVqqr7cs60+ZlYLewtg==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.9.1.tgz", + "integrity": "sha512-4M1u5Q8Zn2CYL2TJ864M51FV4YlxyGyfC3x+7CLuR6xsyTVNBNU4QMcPgsTHRS9J2+X6Lq7MyH6hiWXyi/sXUQ==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.8.1", + "@docusaurus/types": "3.9.1", "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" } }, "node_modules/@docusaurus/utils-validation": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.8.1.tgz", - "integrity": "sha512-gs5bXIccxzEbyVecvxg6upTwaUbfa0KMmTj7HhHzc016AGyxH2o73k1/aOD0IFrdCsfJNt37MqNI47s2MgRZMA==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.9.1.tgz", + "integrity": "sha512-5bzab5si3E1udrlZuVGR17857Lfwe8iFPoy5AvMP9PXqDfoyIKT7gDQgAmxdRDMurgHaJlyhXEHHdzDKkOxxZQ==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.8.1", - "@docusaurus/utils": "3.8.1", - "@docusaurus/utils-common": "3.8.1", + "@docusaurus/logger": "3.9.1", + "@docusaurus/utils": "3.9.1", + "@docusaurus/utils-common": "3.9.1", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", @@ -4003,7 +4139,7 @@ "tslib": "^2.6.0" }, "engines": { - "node": ">=18.0" + "node": ">=20.0" } }, "node_modules/@eslint-community/eslint-utils": { @@ -4395,17 +4531,23 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -4417,15 +4559,6 @@ "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.6", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", @@ -4443,9 +4576,9 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -4459,6 +4592,119 @@ "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": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.0.0.tgz", + "integrity": "sha512-NDigYR3PHqCnQLXYyoLbnEdzMMvzeiCWo1KOut7Q0CoIqg9tUAPKJ1iq/2nFhc5kZtexzutNY0LFjdwWL3Dw3Q==", + "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/json-pack": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.14.0.tgz", + "integrity": "sha512-LpWbYgVnKzphN5S6uss4M25jJ/9+m6q6UJoeN6zTkK4xAGhKsiBRPVeF7OYMWonn5repMQbE5vieRXcMUrKDKw==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.1", + "@jsonjoy.com/util": "^1.9.0", + "hyperdyperid": "^1.2.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/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/@leichtgewicht/ip-codec": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", @@ -4860,6 +5106,15 @@ "node": "^16.13.0 || >=18.0.0" } }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -4981,6 +5236,12 @@ "micromark-util-symbol": "^1.0.1" } }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "license": "MIT" + }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", @@ -5269,9 +5530,9 @@ } }, "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", "license": "MIT", "dependencies": { "@types/connect": "*", @@ -5614,9 +5875,9 @@ } }, "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", + "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", "license": "MIT", "dependencies": { "@types/body-parser": "*", @@ -5626,18 +5887,6 @@ } }, "node_modules/@types/express-serve-static-core": { - "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==", @@ -5700,9 +5949,9 @@ "license": "MIT" }, "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", "license": "MIT" }, "node_modules/@types/http-proxy": { @@ -5809,9 +6058,9 @@ } }, "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==", + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", + "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -5830,9 +6079,9 @@ "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.9.18", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", - "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", "license": "MIT" }, "node_modules/@types/range-parser": { @@ -5894,9 +6143,9 @@ } }, "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", "license": "MIT" }, "node_modules/@types/sax": { @@ -5909,9 +6158,9 @@ } }, "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", "license": "MIT", "dependencies": { "@types/mime": "^1", @@ -5928,9 +6177,9 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", + "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", "license": "MIT", "dependencies": { "@types/http-errors": "*", @@ -5968,9 +6217,9 @@ "license": "MIT" }, "node_modules/@types/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -6482,6 +6731,24 @@ "node": ">=8" } }, + "node_modules/ai": { + "version": "5.0.59", + "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.59.tgz", + "integrity": "sha512-SuAFxKXt2Ha9FiXB3gaOITkOg9ek/3QNVatGVExvTT4gNXc+hJpuNe1dmuwf6Z5Op4fzc8wdbsrYP27ZCXBzlw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/gateway": "1.0.32", + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.10", + "@opentelemetry/api": "1.9.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -6547,25 +6814,25 @@ } }, "node_modules/algoliasearch": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.35.0.tgz", - "integrity": "sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg==", - "license": "MIT", - "dependencies": { - "@algolia/abtesting": "1.1.0", - "@algolia/client-abtesting": "5.35.0", - "@algolia/client-analytics": "5.35.0", - "@algolia/client-common": "5.35.0", - "@algolia/client-insights": "5.35.0", - "@algolia/client-personalization": "5.35.0", - "@algolia/client-query-suggestions": "5.35.0", - "@algolia/client-search": "5.35.0", - "@algolia/ingestion": "1.35.0", - "@algolia/monitoring": "1.35.0", - "@algolia/recommend": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.39.0.tgz", + "integrity": "sha512-DzTfhUxzg9QBNGzU/0kZkxEV72TeA4MmPJ7RVfLnQwHNhhliPo7ynglEWJS791rNlLFoTyrKvkapwr/P3EXV9A==", + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.5.0", + "@algolia/client-abtesting": "5.39.0", + "@algolia/client-analytics": "5.39.0", + "@algolia/client-common": "5.39.0", + "@algolia/client-insights": "5.39.0", + "@algolia/client-personalization": "5.39.0", + "@algolia/client-query-suggestions": "5.39.0", + "@algolia/client-search": "5.39.0", + "@algolia/ingestion": "1.39.0", + "@algolia/monitoring": "1.39.0", + "@algolia/recommend": "5.39.0", + "@algolia/requester-browser-xhr": "5.39.0", + "@algolia/requester-fetch": "5.39.0", + "@algolia/requester-node-http": "5.39.0" }, "engines": { "node": ">= 14.0.0" @@ -6973,13 +7240,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "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==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3", - "core-js-compat": "^3.40.0" + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -7013,6 +7280,15 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.9.tgz", + "integrity": "sha512-hY/u2lxLrbecMEWSB0IpGzGyDyeoMFQhCvZd2jGFSE5I17Fh01sYUBPCJtkWERw7zrac9+cIghxm/ytJa2X8iA==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -7161,9 +7437,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", + "version": "4.26.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.2.tgz", + "integrity": "sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==", "funding": [ { "type": "opencollective", @@ -7180,9 +7456,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", - "node-releases": "^2.0.19", + "baseline-browser-mapping": "^2.8.3", + "caniuse-lite": "^1.0.30001741", + "electron-to-chromium": "^1.5.218", + "node-releases": "^2.0.21", "update-browserslist-db": "^1.1.3" }, "bin": { @@ -7198,6 +7475,21 @@ "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", @@ -7325,9 +7617,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001731", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001731.tgz", - "integrity": "sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==", + "version": "1.0.30001746", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001746.tgz", + "integrity": "sha512-eA7Ys/DGw+pnkWWSE/id29f2IcPHVoE8wxtvE5JdvD2V28VTDPy1yEeo11Guz0sJ4ZeGRcm3uaTcAqK1LXaphA==", "funding": [ { "type": "opencollective", @@ -7724,9 +8016,9 @@ } }, "node_modules/compressible/node_modules/mime-db": { - "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==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -7888,18 +8180,6 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "license": "MIT" }, - "node_modules/copy-text-to-clipboard": { - "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" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/copy-to-clipboard": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", @@ -7988,12 +8268,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.44.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.44.0.tgz", - "integrity": "sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==", + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", + "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", "license": "MIT", "dependencies": { - "browserslist": "^4.25.1" + "browserslist": "^4.25.3" }, "funding": { "type": "opencollective", @@ -8001,9 +8281,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.44.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.44.0.tgz", - "integrity": "sha512-gvMQAGB4dfVUxpYD0k3Fq8J+n5bB6Ytl15lqlZrOIXFzxOhtPaObfkQGHtMRdyjIf7z2IeNULwi1jEwyS+ltKQ==", + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.45.1.tgz", + "integrity": "sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -8132,9 +8412,9 @@ } }, "node_modules/css-declaration-sorter": { - "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==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.0.tgz", + "integrity": "sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==", "license": "ISC", "engines": { "node": "^14 || ^16 || >=18" @@ -8144,9 +8424,9 @@ } }, "node_modules/css-has-pseudo": { - "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==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz", + "integrity": "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==", "funding": [ { "type": "github", @@ -8307,9 +8587,9 @@ } }, "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", @@ -8348,9 +8628,9 @@ } }, "node_modules/cssdb": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.3.1.tgz", - "integrity": "sha512-XnDRQMXucLueX92yDe0LPKupXetWoFOgawr4O4X41l5TltgK2NVbJJVDnnOywDYfW1sTJ28AcXGKOqdRKwCcmQ==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.4.2.tgz", + "integrity": "sha512-PzjkRkRUS+IHDJohtxkIczlxPPZqRo0nXplsYXOMBRPjcVRjj1W4DfvRgshUYTVuUigU7ptVYkFJQ7abUB0nyg==", "funding": [ { "type": "opencollective", @@ -9167,16 +9447,32 @@ "node": ">=0.10.0" } }, - "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", + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "license": "MIT", "dependencies": { - "execa": "^5.0.0" + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" }, "engines": { - "node": ">= 10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/defer-to-connect": { @@ -9491,9 +9787,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.194", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.194.tgz", - "integrity": "sha512-SdnWJwSUot04UR51I2oPD8kuP2VI37/CADR1OHsFOUzZIvfWJBO6q11k5P/uKNyTT3cdOsnyjkrZ+DDShqYqJA==", + "version": "1.5.227", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.227.tgz", + "integrity": "sha512-ITxuoPfJu3lsNWUi2lBM2PaBPYgH3uqmxut5vmBxgYvyI4AlJ6P3Cai1O76mOrkJCBzq0IxWg/NtqOrpu/0gKA==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -10217,9 +10513,9 @@ } }, "node_modules/estree-util-value-to-estree": { - "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==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.4.0.tgz", + "integrity": "sha512-Zlp+gxis+gCfK12d3Srl2PdX2ybsEA8ZYy6vQGVQTNNYLEGRQQ56XB64bjemN8kxIKXP1nC9ip4Z+ILy9LGzvQ==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" @@ -10308,6 +10604,15 @@ "node": ">=0.8.x" } }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -10724,9 +11029,9 @@ "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "funding": [ { "type": "individual", @@ -10851,16 +11156,11 @@ "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": { @@ -11010,6 +11310,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -11038,6 +11339,22 @@ "node": ">= 6" } }, + "node_modules/glob-to-regex.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.0.1.tgz", + "integrity": "sha512-CG/iEvgQqfzoVsMUbxSJcwbG2JwyZ3naEqPkeltwl0BSS8Bp83k3xlGms+0QdWFUAwV+uvo80wNswKF6FWEkKg==", + "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", @@ -11618,22 +11935,6 @@ "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", @@ -11802,9 +12103,9 @@ } }, "node_modules/http-parser-js": { - "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==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", "license": "MIT" }, "node_modules/http-proxy": { @@ -11879,6 +12180,15 @@ "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", @@ -11992,6 +12302,7 @@ "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", @@ -12362,6 +12673,39 @@ "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", @@ -12391,6 +12735,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-network-error": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.0.tgz", + "integrity": "sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-npm": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", @@ -12830,6 +13186,12 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "license": "MIT" }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, "node_modules/json-schema-to-typescript": { "version": "15.0.4", "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-15.0.4.tgz", @@ -13002,13 +13364,13 @@ } }, "node_modules/launch-editor": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz", - "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==", + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz", + "integrity": "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==", "license": "MIT", "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" } }, "node_modules/layout-base": { @@ -13241,9 +13603,9 @@ } }, "node_modules/marked": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-16.2.0.tgz", - "integrity": "sha512-LbbTuye+0dWRz2TS9KJ7wsnD4KAtpj0MVkWc90XvBa6AslXsT0hTBVH5k32pcSyHH1fst9XEFJunXHktVy0zlg==", + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.3.0.tgz", + "integrity": "sha512-K3UxuKu6l6bmA5FUwYho8CfJBlsUWAooKtdGgMcERSpF7gcBUrCGsLH7wDaaNOzwq18JzSUDyoEb/YsrqMac3w==", "license": "MIT", "bin": { "marked": "bin/marked.js" @@ -13679,15 +14041,21 @@ } }, "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "license": "Unlicense", + "version": "4.47.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.47.0.tgz", + "integrity": "sha512-Xey8IZA57tfotV/TN4d6BmccQuhFP+CqRiI7TTNdipZdZBzF2WnzUcH//Cudw6X4zJiUbo/LTuU/HPA/iC/pNg==", + "license": "Apache-2.0", "dependencies": { - "fs-monkey": "^1.0.4" + "@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" }, - "engines": { - "node": ">= 4.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" } }, "node_modules/merge-descriptors": { @@ -15605,9 +15973,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "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==", + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz", + "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==", "license": "MIT", "dependencies": { "schema-utils": "^4.0.0", @@ -15833,9 +16201,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", + "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", "license": "MIT" }, "node_modules/nopt": { @@ -16157,6 +16525,7 @@ "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" @@ -16321,16 +16690,20 @@ } }, "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", "license": "MIT", "dependencies": { - "@types/retry": "0.12.0", + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", "retry": "^0.13.1" }, "engines": { - "node": ">=8" + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-retry/node_modules/retry": { @@ -16457,12 +16830,12 @@ "license": "ISC" }, "node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "license": "MIT", "dependencies": { - "entities": "^4.5.0" + "entities": "^6.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -16481,6 +16854,18 @@ "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", @@ -16520,6 +16905,7 @@ "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" @@ -16844,9 +17230,9 @@ } }, "node_modules/postcss-color-functional-notation": { - "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==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz", + "integrity": "sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==", "funding": [ { "type": "github", @@ -16859,10 +17245,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.10", + "@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.1.0", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -17158,9 +17544,9 @@ } }, "node_modules/postcss-double-position-gradients": { - "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==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz", + "integrity": "sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==", "funding": [ { "type": "github", @@ -17173,7 +17559,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^4.1.0", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, @@ -17318,9 +17704,9 @@ } }, "node_modules/postcss-lab-function": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.10.tgz", - "integrity": "sha512-tqs6TCEv9tC1Riq6fOzHuHcZyhg4k3gIAMB8GGY/zA1ssGdm6puHMVE7t75aOSoFg7UD2wyrFFhbldiCMyyFTQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz", + "integrity": "sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==", "funding": [ { "type": "github", @@ -17333,10 +17719,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.10", + "@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.1.0", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -17907,9 +18293,9 @@ } }, "node_modules/postcss-preset-env": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.2.4.tgz", - "integrity": "sha512-q+lXgqmTMdB0Ty+EQ31SuodhdfZetUlwCA/F0zRcd/XdxjzI+Rl2JhZNz5US2n/7t9ePsvuhCnEN4Bmu86zXlA==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.4.0.tgz", + "integrity": "sha512-2kqpOthQ6JhxqQq1FSAAZGe9COQv75Aw8WbsOvQVNJ2nSevc9Yx/IKZGuZ7XJ+iOTtVon7LfO7ELRzg8AZ+sdw==", "funding": [ { "type": "github", @@ -17922,20 +18308,23 @@ ], "license": "MIT-0", "dependencies": { + "@csstools/postcss-alpha-function": "^1.0.1", "@csstools/postcss-cascade-layers": "^5.0.2", - "@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-color-function": "^4.0.12", + "@csstools/postcss-color-function-display-p3-linear": "^1.0.1", + "@csstools/postcss-color-mix-function": "^3.0.12", + "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.2", + "@csstools/postcss-content-alt-text": "^2.0.8", + "@csstools/postcss-contrast-color-function": "^2.0.12", "@csstools/postcss-exponential-functions": "^2.0.9", "@csstools/postcss-font-format-keywords": "^4.0.0", - "@csstools/postcss-gamut-mapping": "^2.0.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-gamut-mapping": "^2.0.11", + "@csstools/postcss-gradients-interpolation-method": "^5.0.12", + "@csstools/postcss-hwb-function": "^4.0.12", + "@csstools/postcss-ic-unit": "^4.0.4", "@csstools/postcss-initial": "^2.0.1", "@csstools/postcss-is-pseudo-class": "^5.0.3", - "@csstools/postcss-light-dark-function": "^2.0.9", + "@csstools/postcss-light-dark-function": "^2.0.11", "@csstools/postcss-logical-float-and-clear": "^3.0.0", "@csstools/postcss-logical-overflow": "^2.0.0", "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", @@ -17945,38 +18334,38 @@ "@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.0", - "@csstools/postcss-oklab-function": "^4.0.10", - "@csstools/postcss-progressive-custom-properties": "^4.1.0", + "@csstools/postcss-oklab-function": "^4.0.12", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/postcss-random-function": "^2.0.1", - "@csstools/postcss-relative-color-syntax": "^3.0.10", + "@csstools/postcss-relative-color-syntax": "^3.0.12", "@csstools/postcss-scope-pseudo-class": "^4.0.1", "@csstools/postcss-sign-functions": "^1.1.4", "@csstools/postcss-stepped-value-functions": "^4.0.9", - "@csstools/postcss-text-decoration-shorthand": "^4.0.2", + "@csstools/postcss-text-decoration-shorthand": "^4.0.3", "@csstools/postcss-trigonometric-functions": "^4.0.9", "@csstools/postcss-unset-value": "^4.0.0", "autoprefixer": "^10.4.21", - "browserslist": "^4.25.0", + "browserslist": "^4.26.0", "css-blank-pseudo": "^7.0.1", - "css-has-pseudo": "^7.0.2", + "css-has-pseudo": "^7.0.3", "css-prefers-color-scheme": "^10.0.0", - "cssdb": "^8.3.0", + "cssdb": "^8.4.2", "postcss-attribute-case-insensitive": "^7.0.1", "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^7.0.10", + "postcss-color-functional-notation": "^7.0.12", "postcss-color-hex-alpha": "^10.0.0", "postcss-color-rebeccapurple": "^10.0.0", "postcss-custom-media": "^11.0.6", "postcss-custom-properties": "^14.0.6", "postcss-custom-selectors": "^8.0.5", "postcss-dir-pseudo-class": "^9.0.1", - "postcss-double-position-gradients": "^6.0.2", + "postcss-double-position-gradients": "^6.0.4", "postcss-focus-visible": "^10.0.1", "postcss-focus-within": "^9.0.1", "postcss-font-variant": "^5.0.0", "postcss-gap-properties": "^6.0.0", "postcss-image-set-function": "^7.0.0", - "postcss-lab-function": "^7.0.10", + "postcss-lab-function": "^7.0.12", "postcss-logical": "^8.1.0", "postcss-nesting": "^13.0.2", "postcss-opacity-percentage": "^3.0.0", @@ -18626,9 +19015,9 @@ "license": "MIT" }, "node_modules/react-json-view-lite": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.4.2.tgz", - "integrity": "sha512-m7uTsXDgPQp8R9bJO4HD/66+i218eyQPAb+7/dGQpwg8i4z2afTFqtHJPQFHvJfgDCjGQ1HSGlL3HtrZDa3Tdg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz", + "integrity": "sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==", "license": "MIT", "engines": { "node": ">=18" @@ -18874,9 +19263,9 @@ "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", "license": "MIT", "dependencies": { "regenerate": "^1.4.2" @@ -18891,15 +19280,6 @@ "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", @@ -18922,17 +19302,17 @@ } }, "node_modules/regexpu-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", "license": "MIT", "dependencies": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", + "regenerate-unicode-properties": "^10.2.2", "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", + "regjsparser": "^0.13.0", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "unicode-match-property-value-ecmascript": "^2.2.1" }, "engines": { "node": ">=4" @@ -18972,29 +19352,17 @@ "license": "MIT" }, "node_modules/regjsparser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~3.0.2" + "jsesc": "~3.1.0" }, "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", @@ -19370,22 +19738,6 @@ "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.2", "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", @@ -19422,6 +19774,18 @@ "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", @@ -19973,9 +20337,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -20708,6 +21072,19 @@ "node": ">= 10" } }, + "node_modules/swr": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.6.tgz", + "integrity": "sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/synckit": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.2.tgz", @@ -20821,6 +21198,34 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, + "node_modules/thingies": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", + "integrity": "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==", + "license": "MIT", + "engines": { + "node": ">=10.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "^2" + } + }, + "node_modules/throttleit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", + "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -20935,6 +21340,22 @@ "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", @@ -21267,18 +21688,18 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "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==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", "license": "MIT", "engines": { "node": ">=4" @@ -21754,6 +22175,15 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/use-sync-external-store": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -22198,44 +22628,50 @@ } }, "node_modules/webpack-dev-middleware": { - "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==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", + "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", "license": "MIT", "dependencies": { "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", + "memfs": "^4.43.1", + "mime-types": "^3.0.1", + "on-finished": "^2.4.1", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } } }, "node_modules/webpack-dev-middleware/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==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/webpack-dev-middleware/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==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "mime-db": "^1.54.0" }, "engines": { "node": ">= 0.6" @@ -22251,54 +22687,52 @@ } }, "node_modules/webpack-dev-server": { - "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.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", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz", + "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@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", "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", + "express": "^4.21.2", "graceful-fs": "^4.2.6", - "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", + "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": "^2.4.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.4", - "ws": "^8.13.0" + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" + "webpack": "^5.0.0" }, "peerDependenciesMeta": { "webpack": { @@ -22309,10 +22743,40 @@ } } }, + "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.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -22734,6 +23198,7 @@ "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": { @@ -22769,6 +23234,36 @@ } } }, + "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.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "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", @@ -22825,6 +23320,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zod": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.11.tgz", + "integrity": "sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", diff --git a/docs/package.json b/docs/package.json index bb42cac0a50..06378ef22f6 100644 --- a/docs/package.json +++ b/docs/package.json @@ -15,9 +15,9 @@ "typecheck": "tsc" }, "dependencies": { - "@docusaurus/core": "^3.8.1", - "@docusaurus/preset-classic": "^3.8.1", - "@docusaurus/theme-mermaid": "^3.8.1", + "@docusaurus/core": "^3.9.1", + "@docusaurus/preset-classic": "^3.9.1", + "@docusaurus/theme-mermaid": "^3.9.1", "@fortawesome/fontawesome-svg-core": "^6.7.1", "@fortawesome/free-solid-svg-icons": "^6.7.1", "@fortawesome/react-fontawesome": "^0.2.0", From 773892434931b74bdf54474b73c909779daa9471 Mon Sep 17 00:00:00 2001 From: Willow Herring <31960031+ReFil@users.noreply.github.com> Date: Mon, 3 Nov 2025 00:01:08 +0000 Subject: [PATCH 31/96] feat(split): Add HID indicators and physical layout set to Wired split (#3103) --- app/src/split/peripheral.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/src/split/peripheral.c b/app/src/split/peripheral.c index 4157ffa2205..e9317bb8b62 100644 --- a/app/src/split/peripheral.c +++ b/app/src/split/peripheral.c @@ -11,12 +11,17 @@ #include #include +#include #include #include #include #include +#if IS_ENABLED(CONFIG_ZMK_SPLIT_PERIPHERAL_HID_INDICATORS) +#include +#endif + #include #include @@ -51,6 +56,15 @@ int zmk_split_transport_peripheral_command_handler( LOG_ERR("Failed to invoke behavior %s: %d", binding.behavior_dev, err); } } + case ZMK_SPLIT_TRANSPORT_CENTRAL_CMD_TYPE_SET_PHYSICAL_LAYOUT: { + 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: { + 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; From f9be3ed9c08b35b1b86df24c0f04913f3b5e50f5 Mon Sep 17 00:00:00 2001 From: Peter Cock Date: Sat, 8 Nov 2025 22:05:53 +0000 Subject: [PATCH 32/96] docs: List some of the commonly used MCUs (#3111) --- docs/docs/hardware.mdx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/docs/hardware.mdx b/docs/docs/hardware.mdx index 75209923fa7..84d16908fab 100644 --- a/docs/docs/hardware.mdx +++ b/docs/docs/hardware.mdx @@ -40,7 +40,8 @@ export const toc = [ }, ]; -With the solid technical foundation of Zephyr™ RTOS, ZMK can support a wide diversity of hardware targets. +With the solid technical foundation of Zephyr™ RTOS, ZMK can support a wide diversity of hardware targets, +including but not limited to Nordic nRF52, Raspberry Pi RP2040/RP2350, most ST STM32 MCUs, and Microchip SAMD21. 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. From 5138c6fb14783b756c5a3e61581625c700f3555b Mon Sep 17 00:00:00 2001 From: Nicolas Munnich <98408764+nmunnich@users.noreply.github.com> Date: Fri, 14 Nov 2025 22:13:35 +0000 Subject: [PATCH 33/96] feat: Allow layer behaviors to "lock" layers on (#2717) * refactor(core)!: Allow layer behaviors to "lock" layers on Co-authored-by: Cem Aksoylar * docs: Added documentation note on locking layers Co-authored-by: Cem Aksoylar --------- Co-authored-by: Cem Aksoylar --- app/dts/behaviors/to_layer.dtsi | 1 + app/dts/behaviors/toggle_layer.dtsi | 1 + .../zmk,behavior-momentary-layer.yaml | 5 ++ .../behaviors/zmk,behavior-to-layer.yaml | 5 ++ .../behaviors/zmk,behavior-toggle-layer.yaml | 4 +- app/include/zmk/events/layer_state_changed.h | 5 +- app/include/zmk/keymap.h | 10 +-- app/src/behaviors/behavior_momentary_layer.c | 24 +++++-- app/src/behaviors/behavior_to_layer.c | 17 ++++- app/src/behaviors/behavior_toggle_layer.c | 12 ++-- app/src/conditional_layer.c | 34 ++++++---- app/src/keymap.c | 47 +++++++++---- app/src/pointing/input_processor_temp_layer.c | 4 +- .../locked-layers-2/events.patterns | 4 ++ .../locked-layers-2/keycode_events.snapshot | 17 +++++ .../locked-layers-2/native_posix_64.keymap | 66 +++++++++++++++++++ .../locked-layers/events.patterns | 4 ++ .../locked-layers/keycode_events.snapshot | 20 ++++++ .../locked-layers/native_posix_64.keymap | 64 ++++++++++++++++++ .../encoders/layers-1/keycode_events.snapshot | 2 +- .../encoders/layers-2/keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 2 +- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 6 +- .../to-layer/normal/keycode_events.snapshot | 8 +-- app/tests/toggle-layer/behavior_keymap.dtsi | 16 ++++- .../toggle-layer/locking/events.patterns | 3 + .../locking/keycode_events.snapshot | 16 +++++ .../locking/native_posix_64.keymap | 25 +++++++ .../toggle-mode-off/keycode_events.snapshot | 4 +- docs/docs/config/behaviors.md | 55 ++++++++++++++-- docs/docs/keymaps/behaviors/layers.md | 9 +++ 34 files changed, 432 insertions(+), 74 deletions(-) create mode 100644 app/tests/conditional-layer/locked-layers-2/events.patterns create mode 100644 app/tests/conditional-layer/locked-layers-2/keycode_events.snapshot create mode 100644 app/tests/conditional-layer/locked-layers-2/native_posix_64.keymap create mode 100644 app/tests/conditional-layer/locked-layers/events.patterns create mode 100644 app/tests/conditional-layer/locked-layers/keycode_events.snapshot create mode 100644 app/tests/conditional-layer/locked-layers/native_posix_64.keymap create mode 100644 app/tests/toggle-layer/locking/events.patterns create mode 100644 app/tests/toggle-layer/locking/keycode_events.snapshot create mode 100644 app/tests/toggle-layer/locking/native_posix_64.keymap diff --git a/app/dts/behaviors/to_layer.dtsi b/app/dts/behaviors/to_layer.dtsi index 532636a6ed2..89bc91ca56c 100644 --- a/app/dts/behaviors/to_layer.dtsi +++ b/app/dts/behaviors/to_layer.dtsi @@ -15,6 +15,7 @@ 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 81846e77c02..a0c85340374 100644 --- a/app/dts/behaviors/toggle_layer.dtsi +++ b/app/dts/behaviors/toggle_layer.dtsi @@ -15,6 +15,7 @@ compatible = "zmk,behavior-toggle-layer"; #binding-cells = <1>; display-name = "Toggle Layer"; + locking; }; }; }; diff --git a/app/dts/bindings/behaviors/zmk,behavior-momentary-layer.yaml b/app/dts/bindings/behaviors/zmk,behavior-momentary-layer.yaml index 5423e29c402..453dbcd2cb4 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-momentary-layer.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-momentary-layer.yaml @@ -6,3 +6,8 @@ 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-to-layer.yaml b/app/dts/bindings/behaviors/zmk,behavior-to-layer.yaml index cbafddf73a0..52deecd3c49 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-to-layer.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-to-layer.yaml @@ -6,3 +6,8 @@ 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 1ab0179c492..71d70a3aaf1 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-toggle-layer.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-toggle-layer.yaml @@ -10,9 +10,11 @@ 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/include/zmk/events/layer_state_changed.h b/app/include/zmk/events/layer_state_changed.h index 0d66853ecae..3bf5c870c21 100644 --- a/app/include/zmk/events/layer_state_changed.h +++ b/app/include/zmk/events/layer_state_changed.h @@ -12,12 +12,13 @@ struct zmk_layer_state_changed { uint8_t layer; bool state; + bool locked; int64_t timestamp; }; ZMK_EVENT_DECLARE(zmk_layer_state_changed); -static inline int raise_layer_state_changed(uint8_t layer, bool state) { +static inline int raise_layer_state_changed(uint8_t layer, bool state, bool locked) { return raise_zmk_layer_state_changed((struct zmk_layer_state_changed){ - .layer = layer, .state = state, .timestamp = k_uptime_get()}); + .layer = layer, .state = state, .locked = locked, .timestamp = k_uptime_get()}); } diff --git a/app/include/zmk/keymap.h b/app/include/zmk/keymap.h index eb8be9c4690..556e045677b 100644 --- a/app/include/zmk/keymap.h +++ b/app/include/zmk/keymap.h @@ -43,12 +43,14 @@ 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); -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); +int zmk_keymap_layer_activate(zmk_keymap_layer_id_t layer, bool locking); +int zmk_keymap_layer_deactivate(zmk_keymap_layer_id_t layer, bool locking); +int zmk_keymap_layer_toggle(zmk_keymap_layer_id_t layer, bool locking); +int zmk_keymap_layer_to(zmk_keymap_layer_id_t layer, bool locking); const char *zmk_keymap_layer_name(zmk_keymap_layer_id_t layer); const struct zmk_behavior_binding *zmk_keymap_get_layer_binding_at_idx(zmk_keymap_layer_id_t layer, diff --git a/app/src/behaviors/behavior_momentary_layer.c b/app/src/behaviors/behavior_momentary_layer.c index 78bf7a3b28d..61575d91b27 100644 --- a/app/src/behaviors/behavior_momentary_layer.c +++ b/app/src/behaviors/behavior_momentary_layer.c @@ -15,6 +15,8 @@ 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[] = { @@ -36,16 +38,22 @@ 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); - return zmk_keymap_layer_activate(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); } 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); - return zmk_keymap_layer_deactivate(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); } static const struct behavior_driver_api behavior_mo_driver_api = { @@ -56,5 +64,13 @@ static const struct behavior_driver_api behavior_mo_driver_api = { #endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) }; -BEHAVIOR_DT_INST_DEFINE(0, NULL, NULL, NULL, NULL, POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, - &behavior_mo_driver_api); +#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 diff --git a/app/src/behaviors/behavior_to_layer.c b/app/src/behaviors/behavior_to_layer.c index dae19ebccc5..61a9696501d 100644 --- a/app/src/behaviors/behavior_to_layer.c +++ b/app/src/behaviors/behavior_to_layer.c @@ -17,10 +17,15 @@ 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); - zmk_keymap_layer_to(binding->param1); + const struct behavior_to_config *cfg = zmk_behavior_get_binding(binding->behavior_dev)->config; + zmk_keymap_layer_to(binding->param1, cfg->locking); return ZMK_BEHAVIOR_OPAQUE; } @@ -59,7 +64,13 @@ static const struct behavior_driver_api behavior_to_driver_api = { #endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) }; -BEHAVIOR_DT_INST_DEFINE(0, NULL, NULL, NULL, NULL, POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, - &behavior_to_driver_api); +#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) #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 3194873eb10..755b583274b 100644 --- a/app/src/behaviors/behavior_toggle_layer.c +++ b/app/src/behaviors/behavior_toggle_layer.c @@ -25,6 +25,7 @@ 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, @@ -34,11 +35,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); + return zmk_keymap_layer_activate(binding->param1, cfg->locking); case OFF: - return zmk_keymap_layer_deactivate(binding->param1); + return zmk_keymap_layer_deactivate(binding->param1, cfg->locking); case FLIP: - return zmk_keymap_layer_toggle(binding->param1); + return zmk_keymap_layer_toggle(binding->param1, cfg->locking); default: return -ENOTSUP; }; @@ -79,13 +80,14 @@ static const struct behavior_driver_api behavior_tog_driver_api = { #endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) }; -#define KT_INST(n) \ +#define TG_INST(n) \ static const struct behavior_tog_config behavior_tog_config_##n = { \ .toggle_mode = DT_ENUM_IDX(DT_DRV_INST(n), toggle_mode), \ + .locking = DT_INST_PROP_OR(n, locking, false), \ }; \ BEHAVIOR_DT_INST_DEFINE(n, NULL, NULL, NULL, &behavior_tog_config_##n, POST_KERNEL, \ CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_tog_driver_api); -DT_INST_FOREACH_STATUS_OKAY(KT_INST) +DT_INST_FOREACH_STATUS_OKAY(TG_INST) #endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/src/conditional_layer.c b/app/src/conditional_layer.c index 9ba02a5ce4c..a65563ab32b 100644 --- a/app/src/conditional_layer.c +++ b/app/src/conditional_layer.c @@ -49,28 +49,31 @@ 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); -static void conditional_layer_activate(int8_t layer) { +// 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) { // 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)) { + if (!zmk_keymap_layer_active(layer) || (locking && !zmk_keymap_layer_locked(layer))) { LOG_DBG("layer %d", layer); - zmk_keymap_layer_activate(layer); + zmk_keymap_layer_activate(layer, locking); } } -static void conditional_layer_deactivate(int8_t layer) { +static void conditional_layer_deactivate(int8_t layer, bool locking) { // 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)) { + if (zmk_keymap_layer_active(layer) && (!zmk_keymap_layer_locked(layer) || locking)) { LOG_DBG("layer %d", layer); - zmk_keymap_layer_deactivate(layer); + zmk_keymap_layer_deactivate(layer, locking); } } 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 @@ -84,7 +87,6 @@ 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 @@ -92,23 +94,29 @@ 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; - then_layers |= BIT(cfg->then_layer); + WRITE_BIT(then_layers, cfg->then_layer, true); 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) { - then_layer_state |= BIT(cfg->then_layer); + 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); } } 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); + conditional_layer_activate(layer, locking); } else { - conditional_layer_deactivate(layer); + conditional_layer_deactivate(layer, locking); + WRITE_BIT(layer_locked_by_conditional, layer, false); } } } diff --git a/app/src/keymap.c b/app/src/keymap.c index d5c5e19bf27..a291d5f0140 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -23,6 +23,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #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; @@ -130,7 +131,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) { +static inline int set_layer_state(zmk_keymap_layer_id_t layer_id, bool state, bool locking) { int ret = 0; if (layer_id >= ZMK_KEYMAP_LAYERS_LEN) { return -EINVAL; @@ -141,12 +142,22 @@ static inline int set_layer_state(zmk_keymap_layer_id_t layer_id, bool state) { return 0; } + // Non-forcing disables should not change a locked active layer + if (!locking && !state && (_zmk_keymap_layer_locks & BIT(layer_id))) { + return ret; + } + zmk_keymap_layers_state_t old_state = _zmk_keymap_layer_state; + zmk_keymap_layers_state_t old_locks = _zmk_keymap_layer_locks; WRITE_BIT(_zmk_keymap_layer_state, layer_id, state); + if (locking) { + WRITE_BIT(_zmk_keymap_layer_locks, layer_id, state); + } // Don't send state changes unless there was an actual change - 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 (old_state != _zmk_keymap_layer_state || old_locks != _zmk_keymap_layer_locks) { + LOG_DBG("layer_changed: layer %d state %d locked %d", layer_id, state, locking); + + ret = raise_layer_state_changed(layer_id, state, locking); if (ret < 0) { LOG_WRN("Failed to raise layer state changed (%d)", ret); } @@ -165,6 +176,8 @@ 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 @@ -176,6 +189,10 @@ 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--) { @@ -192,26 +209,28 @@ 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) { return set_layer_state(layer, true); }; +int zmk_keymap_layer_activate(zmk_keymap_layer_id_t layer, bool locking) { + return set_layer_state(layer, true, locking); +}; -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) { - if (zmk_keymap_layer_active(layer)) { - return zmk_keymap_layer_deactivate(layer); +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); } - return zmk_keymap_layer_activate(layer); + return zmk_keymap_layer_activate(layer, locking); }; -int zmk_keymap_layer_to(zmk_keymap_layer_id_t layer) { +int zmk_keymap_layer_to(zmk_keymap_layer_id_t layer, bool locking) { for (int i = ZMK_KEYMAP_LAYERS_LEN - 1; i >= 0; i--) { - zmk_keymap_layer_deactivate(i); + zmk_keymap_layer_deactivate(i, locking); } - zmk_keymap_layer_activate(layer); + zmk_keymap_layer_activate(layer, locking); return 0; } diff --git a/app/src/pointing/input_processor_temp_layer.c b/app/src/pointing/input_processor_temp_layer.c index 999e93a3535..4d18f33d783 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); + zmk_keymap_layer_activate(state->toggle_layer, false); LOG_DBG("Layer %d activated", state->toggle_layer); } else { - zmk_keymap_layer_deactivate(state->toggle_layer); + zmk_keymap_layer_deactivate(state->toggle_layer, false); LOG_DBG("Layer %d deactivated", state->toggle_layer); } } diff --git a/app/tests/conditional-layer/locked-layers-2/events.patterns b/app/tests/conditional-layer/locked-layers-2/events.patterns new file mode 100644 index 00000000000..30bd2338f69 --- /dev/null +++ b/app/tests/conditional-layer/locked-layers-2/events.patterns @@ -0,0 +1,4 @@ +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 new file mode 100644 index 00000000000..1bd77bd973e --- /dev/null +++ b/app/tests/conditional-layer/locked-layers-2/keycode_events.snapshot @@ -0,0 +1,17 @@ +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 new file mode 100644 index 00000000000..aa17e285f10 --- /dev/null +++ b/app/tests/conditional-layer/locked-layers-2/native_posix_64.keymap @@ -0,0 +1,66 @@ +#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 new file mode 100644 index 00000000000..30bd2338f69 --- /dev/null +++ b/app/tests/conditional-layer/locked-layers/events.patterns @@ -0,0 +1,4 @@ +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 new file mode 100644 index 00000000000..4afa80c0989 --- /dev/null +++ b/app/tests/conditional-layer/locked-layers/keycode_events.snapshot @@ -0,0 +1,20 @@ +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 new file mode 100644 index 00000000000..5c6c15dbba6 --- /dev/null +++ b/app/tests/conditional-layer/locked-layers/native_posix_64.keymap @@ -0,0 +1,64 @@ +#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/encoders/layers-1/keycode_events.snapshot b/app/tests/encoders/layers-1/keycode_events.snapshot index 95019009b52..0adde28b193 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 +layer_changed: layer 2 state 1 locked 1 pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/encoders/layers-2/keycode_events.snapshot b/app/tests/encoders/layers-2/keycode_events.snapshot index 153dea9ce0e..38cbe27d9d9 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 -layer_changed: layer 2 state 1 +layer_changed: layer 1 state 1 locked 1 +layer_changed: layer 2 state 1 locked 1 pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 \ No newline at end of file diff --git a/app/tests/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 55fb9d57e7b..220da205912 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 +layer_changed: layer 1 state 1 locked 0 Dispatching handle_layer_state_changed movement_set: Mouse movement set to -1/0 scroll_set: Mouse scroll set to 0/0 @@ -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 +layer_changed: layer 1 state 0 locked 0 Dispatching handle_layer_state_changed 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 9520a4b4ea0..97ed7672d60 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 +layer_changed: layer 1 state 1 locked 0 Dispatching handle_layer_state_changed movement_set: Mouse movement set to -1/0 scroll_set: Mouse scroll set to 0/0 @@ -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 +layer_changed: layer 1 state 0 locked 0 Dispatching handle_layer_state_changed Position excluded, continuing Dispatching handle_position_state_changed diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/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 f082de9fa46..214b8fea004 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 +layer_changed: layer 1 state 1 locked 0 Dispatching handle_layer_state_changed movement_set: Mouse movement set to -1/0 scroll_set: Mouse scroll set to 0/0 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 b528b8d07ab..535554720cc 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 +layer_changed: layer 1 state 1 locked 0 Dispatching handle_layer_state_changed movement_set: Mouse movement set to -2/0 scroll_set: Mouse scroll set to 0/0 @@ -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 +layer_changed: layer 1 state 0 locked 0 Dispatching handle_layer_state_changed 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 a4b01e85ff5..6cc1d8d95ef 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 +layer_changed: layer 1 state 1 locked 0 Dispatching handle_layer_state_changed movement_set: Mouse movement set to -1/0 scroll_set: Mouse scroll set to 0/0 @@ -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 +layer_changed: layer 1 state 0 locked 0 Dispatching handle_layer_state_changed Deactivating layer that was activated by this processor -layer_changed: layer 1 state 1 +layer_changed: layer 1 state 1 locked 0 Dispatching handle_layer_state_changed movement_set: Mouse movement set to -1/0 scroll_set: Mouse scroll set to 0/0 diff --git a/app/tests/to-layer/normal/keycode_events.snapshot b/app/tests/to-layer/normal/keycode_events.snapshot index a98f7479ac9..dcb1335c00e 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 +layer_changed: layer 1 state 1 locked 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 -layer_changed: layer 0 state 1 +layer_changed: layer 1 state 0 locked 1 +layer_changed: layer 0 state 1 locked 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 +layer_changed: layer 1 state 1 locked 1 to_released: position 1 layer 1 diff --git a/app/tests/toggle-layer/behavior_keymap.dtsi b/app/tests/toggle-layer/behavior_keymap.dtsi index 7c712a874f5..8fbf4858ddf 100644 --- a/app/tests/toggle-layer/behavior_keymap.dtsi +++ b/app/tests/toggle-layer/behavior_keymap.dtsi @@ -3,13 +3,23 @@ #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 - &kp D &to 1>; + &mo 2 &to 1>; }; lower_layer { @@ -20,8 +30,8 @@ raise_layer { bindings = < - &kp W &kp U - &kp X &kp M>; + &kp W &tog 2 + &tog_off 2 &mo 2>; }; }; }; diff --git a/app/tests/toggle-layer/locking/events.patterns b/app/tests/toggle-layer/locking/events.patterns new file mode 100644 index 00000000000..05b8cd15e31 --- /dev/null +++ b/app/tests/toggle-layer/locking/events.patterns @@ -0,0 +1,3 @@ +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 new file mode 100644 index 00000000000..73f4d251d32 --- /dev/null +++ b/app/tests/toggle-layer/locking/keycode_events.snapshot @@ -0,0 +1,16 @@ +kp_pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +mo_pressed: position 2 layer 2 +tog_pressed: position 1 layer 2 +tog_released: position 1 layer 2 +mo_released: position 2 layer 2 +kp_pressed: usage_page 0x07 keycode 0x1A implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x1A implicit_mods 0x00 explicit_mods 0x00 +mo_pressed: position 3 layer 2 +mo_released: position 3 layer 2 +kp_pressed: usage_page 0x07 keycode 0x1A implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x1A implicit_mods 0x00 explicit_mods 0x00 +tog_pressed: position 1 layer 2 +tog_released: position 1 layer 2 +kp_pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/toggle-layer/locking/native_posix_64.keymap b/app/tests/toggle-layer/locking/native_posix_64.keymap new file mode 100644 index 00000000000..fc70576e9cd --- /dev/null +++ b/app/tests/toggle-layer/locking/native_posix_64.keymap @@ -0,0 +1,25 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; \ No newline at end of file diff --git a/app/tests/toggle-layer/toggle-mode-off/keycode_events.snapshot b/app/tests/toggle-layer/toggle-mode-off/keycode_events.snapshot index 94b7b3607e8..e7db477d5a3 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 +layer_changed: layer 1 state 1 locked 1 to_released: position 3 layer 1 kp_pressed: usage_page 0x0C keycode 0xB5 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x0C keycode 0xB5 implicit_mods 0x00 explicit_mods 0x00 tog_pressed: position 1 layer 1 -layer_changed: layer 1 state 0 +layer_changed: layer 1 state 0 locked 1 tog_released: position 1 layer 1 kp_pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 \ No newline at end of file diff --git a/docs/docs/config/behaviors.md b/docs/docs/config/behaviors.md index e301dc960f3..e7a7c04c43b 100644 --- a/docs/docs/config/behaviors.md +++ b/docs/docs/config/behaviors.md @@ -154,6 +154,29 @@ 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. @@ -166,10 +189,11 @@ 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` | +| Property | Type | Description | Default | +| ---------------- | ---- | --------------------------------------------------------------- | ------- | +| `#binding-cells` | int | Must be `<1>` | | +| `toggle-mode` | | One of `on`, `off`, and `flip` | `flip` | +| `locking` | bool | Whether the behavior can lock and unlock layers in the on state | false | You can use the following node to tweak the default behavior: @@ -177,6 +201,29 @@ 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. diff --git a/docs/docs/keymaps/behaviors/layers.md b/docs/docs/keymaps/behaviors/layers.md index 66501fccda4..37b23e8839e 100644 --- a/docs/docs/keymaps/behaviors/layers.md +++ b/docs/docs/keymaps/behaviors/layers.md @@ -82,6 +82,7 @@ Define a new behavior and assign `"on"` or `"off"` to `toggle-mode`: #binding-cells = <1>; display-name = "Toggle Layer On"; toggle-mode = "on"; + locking; }; }; }; @@ -89,6 +90,14 @@ 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. From e34793e8c7193bc868b95ec38d78f67956f759cb Mon Sep 17 00:00:00 2001 From: Kurtis Lew Date: Sun, 16 Nov 2025 16:02:35 -0800 Subject: [PATCH 34/96] feat(docs): Update New Behavior Guide (#3107) --- docs/docs/development/new-behavior.mdx | 882 +++++++++++++++++-------- 1 file changed, 619 insertions(+), 263 deletions(-) diff --git a/docs/docs/development/new-behavior.mdx b/docs/docs/development/new-behavior.mdx index dce5849bab7..6aed4fb8397 100644 --- a/docs/docs/development/new-behavior.mdx +++ b/docs/docs/development/new-behavior.mdx @@ -12,20 +12,27 @@ Before reading this section, it is **vital** that you read through our [clean ro ## Overview -This document outlines how to develop a [behavior](../keymaps/behaviors/index.mdx) for ZMK and prepare the changes for a pull request. +[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). -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. +:::info +If an out-of-tree behavior's use-case is deemed widespread enough to be merged into upstream ZMK, a new pull request may be issued instead. +While this page describes practices that maximize compatibility between module-focused development and pull-request-based workflows, we also note specific modifications required for the latter to work properly. +::: + +In the context of the Zephyr RTOS, behaviors are implemented as "devices", which consist of: + +- A devicetree binding file, which declares the behavior's properties +- A device driver written in C code +- Optionally, devicetree-source-include files (`.dtsi`), which contain predefined instances of the behavior that may be included directly in keymaps The general process for developing behaviors is: -1. [Create 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. [Create a new behavior repository](#creating-a-new-behavior-repository) +1. [Develop the behavior functionality](#developing-the-behavior-functionality) 1. [Test changes locally](#testing-changes-locally) 1. [Document behavior functionality](#documenting-behavior-functionality) -1. [Create a pull request for review and inclusion into the ZMK sources](#submitting-a-pull-request) +1. [Provide licensing information](#licensing-information) :::info Before developing new behaviors, developers should have a working knowledge of the Embedded Linux Devicetree. @@ -37,259 +44,497 @@ The following resources are provided for those seeking further understanding: ::: -## Creating the Behavior +## Creating a new Behavior Repository + +### Initializing a new Behavior Module + +1. Navigate to [the ZMK module template repository](https://github.com/zmkfirmware/zmk-module-template) +1. Select **"Use this template"** in the upper right corner, followed by **"Create a new repository"** +1. Choose an appropriate name for your new repository. + ZMK behavior modules should follow the naming convention, **`zmk-behavior-`**, using all lowercase letters and dashes to separate words +1. Complete the module's creation by selecting the repository's visibility, before clicking **"Create repository"** +1. Clone a copy of your module to your development environment. + The cloned repository should be easily accessible when [building and testing firmware using a local toolchain](./local-toolchain/build-flash.mdx#building-with-external-modules). + +Files unrelated to behavior development should be removed from your copy of the ZMK module template. +The minimum viable filesystem for a behavior follows the following structure: + +``` +zmk-behavior-/ +├── CMakeLists.txt +├── Kconfig +├── LICENSE +├── README.md +├── dts +│ ├── behaviors +// highlight-next-line +│ │ └── .dtsi (optional) +│ └── bindings +│ └── behaviors +// highlight-next-line +│ └── zmk,behavior-.yaml +├── include +│ └── dt-bindings +│ └── zmk +// highlight-next-line +│ └── .h (optional) +├── src +│ └── behaviors +// highlight-next-line +│ └── behavior_.c +// highlight-start +├── tests +│ └── +│ ├── behavior_keymap.dtsi +│ └── normal +│ ├── events.patterns +│ ├── keycode_events.snapshot +│ ├── native_posix.keymap +│ └── native_posix_64.keymap +// highlight-end +// highlight-next-line +├── west.yml (optional) +└── zephyr + └── module.yml +``` + +For more information on module preparation, such as details on the contents of `west.yml` and `zephyr/module.yml`, refer to the page on [module creation](./module-creation.md). + +Once the module's tree has been organized properly, the relevant files are now ready to be populated. +We will explain the purpose of the files listed in the tree above in order of increasing complexity. + +### Devicetree Bindings (`.yaml`) + +Devicetree bindings use `.yaml` files to declare their properties. -### Creating the Devicetree Binding (`.yaml`) +They are stored in `dts/bindings/behaviors/` and follow the same naming convention as the repository itself. -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: +The [mod-morph](../keymaps/behaviors/mod-morph.md)'s devicetree binding is presented below as a simple example. -```yaml title="app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml" +```yaml title="zmk/app/dts/bindings/behaviors/zmk,behavior-mod-morph.yaml" # Copyright (c) 2020 The ZMK Contributors # SPDX-License-Identifier: MIT // highlight-next-line -description: Hold or Tap behavior +description: Mod Morph Behavior // highlight-next-line -compatible: "zmk,behavior-hold-tap" +compatible: "zmk,behavior-mod-morph" // highlight-next-line -include: two_param.yaml +include: zero_param.yaml # Additional parameters // highlight-next-line properties: bindings: - type: phandles + type: phandle-array required: true - tapping-term-ms: + mods: type: int - tapping_term_ms: # deprecated - type: int - quick-tap-ms: - type: int - default: -1 - quick_tap_ms: # deprecated + required: true + keep-mods: type: int - flavor: - type: string required: false - default: "hold-preferred" - enum: - - "hold-preferred" - - "balanced" - - "tap-preferred" - - "tap-unless-interrupted" - retro-tap: - type: boolean - hold-trigger-key-positions: - type: array - required: false - default: [] + ``` -We see that the `.yaml` files used for new behaviors' devicetree bindings consist of the following properties: +It can be seen that the `.yaml` files used for new behaviors' devicetree bindings consist of the following fields: #### `description` -A brief statement of what the behavior is. The 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. +A brief statement of what the behavior is. +The `description` should be kept less than a sentence long because it is not a property seen by end-users. +Instead, detailed explanations of how the behavior works should be shared in the behavior's documentation. #### `compatible` -Allows 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`. +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). -As shown in the example above, `compatible: "zmk,behavior-hold-tap"` is the value of the `compatible` property of `zmk,behavior-hold-tap.yaml`. +In the example above, `zmk,behavior-mod-morph.yaml` lists `compatible: "zmk,behavior-mod-morph"`. -#### `include` +#### `include` additional parameters -Choose between `zero_param.yaml`, `one_param.yaml`, or `two_param.yaml` depending on how many additional parameters are required to complete the behavior's binding in a keymap. 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. +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. -#### `properties` (Optional) - -These are additional variables required to configure a particular instance of a behavior. `properties` can be of the following types: - -- `path` -- `compound` -- `array` -- `string` -- `string-array` -- `boolean` -- `int` -- `uint8-array` -- `phandle`. -- `phandle-array` -- `phandles` +| `include` | Example keymap binding | +| ----------------- | ---------------------- | +| `zero_param.yaml` | `&sys_reset` | +| `one_param.yaml` | `&kp A` | +| `two_param.yaml` | `&mt LSHFT Z` | :::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). +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. ::: -### Creating the Driver (`.c`) +#### `properties` (Optional) -:::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: +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/3.5.0/build/dts/bindings-syntax.html#properties). -- [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) +### Behavior Source Files (`.c`) -::: +Behavior source files are stored in in `src/behaviors/`. +They are labelled in lowercase, beginning with the prefix `behavior_`, and ending with the behavior's name, using underscores to separate multiple words. -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 developer may decide that there is a single global instance of a behavior, or multiple instances that act independently of one another. +Some examples of the former are layer behaviors, backlight control, or endpoint selection. +The latter includes keypresses, hold-taps, or tap-dances. -The code snippet below shows the essential components of a new driver. +The code templates below show the differences between these categories, along with the essential components of a behavior source file. -```c -#define DT_DRV_COMPAT zmk_ + + + +```c title="src/behaviors/behavior_.c" +/* + * Copyright (c) XXXX The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#define DT_DRV_COMPAT zmk_ // Dependencies #include -#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_pressed, +}; + +BEHAVIOR_DT_INST_DEFINE(0, // Instance Number (0) + _init, // Initialization Function + NULL, // Power Management Device Pointer + &_data, // Behavior Data Pointer + &_config, // Behavior Configuration Pointer + POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT // Initialization Level, Device Priority + &_driver_api); // API struct + +#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ + +``` + + + + + +```c title="src/behaviors/behavior_.c" +/* + * Copyright (c) XXXX The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#define DT_DRV_COMPAT zmk_ + +// Dependencies +#include +#include +#include + LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); +#include + #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) -// Instance-Unique Data Struct (Optional) -struct behavior__data { - bool example_data_param1; - bool example_data_param2; - bool example_data_param3; +// Instance-specific Data struct (Optional) +struct behavior__data { + bool data_param1; + bool data_param2; + bool data_param3; }; -// Instance-Unique Config Struct (Optional) -struct behavior__config { - bool example_config_param1; - bool example_config_param2; - bool example_config_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) { +static int _init(const struct device *dev) { return 0; }; -// API Structure -static const struct behavior_driver_api _driver_api = { +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_pressed, }; -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 +#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, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT \ // Initialization Level, Device Priority + &_driver_api); // API struct + +DT_INST_FOREACH_STATUS_OKAY(_INST) #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`) +A more thorough explanation of the contents of a behavior source file can be [found below](#developing-the-behavior-functionality). -#### Dependencies +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/`. -The dependencies required for any ZMK behavior are: +### Updating `Kconfig` -- `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_TRANSPARENT`: Used in the `binding_pressed` and `binding_released` functions for the transparent (`&trans`) behavior - - `struct`s: - - `zmk_behavior_binding`: Stores the name of the behavior device (`char *behavior_dev`) as a `string` and up to two additional parameters (`uint32_t param1`, `uint32_t param2`) - - `zmk_behavior_binding_event`: Contains layer, position, and timestamp data for an active `zmk_behavior_binding` +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. -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. +```Kconfig title="Kconfig" +config ZMK_BEHAVIOR_ + bool + default y + depends on DT_HAS_ZMK_BEHAVIOR__ENABLED + +if ZMK_BEHAVIOR_ + +config ZMK_BEHAVIOR__PROPERTY1 + + help -##### ZMK event manager +config ZMK_BEHAVIOR__PROPERTY2 + + help -Including `zmk/event_manager.h` is required for the following dependencies to function properly. +config ZMK_BEHAVIOR__PROPERTY3 + + help -- `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 +endif #ZMK_BEHAVIOR_ +``` -Events can be used similarly to hardware interrupts. See [Events](events.md) for more information on using events. +:::info +For an overview on Kconfig files, see [Configuration](../config/index.md#kconfig-files). -###### Listeners and subscriptions +For more examples of behavior-specific Kconfig settings, see [Behavior Configuration](../config/behaviors.md). +::: -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). +### Updating `CMakeLists.txt` -```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... -} +`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) ``` -#### `BEHAVIOR_DT_INST_DEFINE` +Other common ways of enabling/blocking the inclusion of sources via `CMakeLists.txt` include: -`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()`. +| 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 -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). +If submitting a pull request to upstream ZMK, the `target_sources` invocation would go inside `zmk/app/CMakeLists.txt` instead. ::: -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. +### Optional: Defining Common Use-Cases for the Behavior (`.dtsi`) -An example of this can be seen below, taking the `#define KP_INST(n)` from the hold-tap driver. +`.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. -```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); +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"; + }; + }; +}; -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. +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. -Behaviors also require the following parameters of `BEHAVIOR_DT_INST_DEFINE` to be changed: +:::warning -##### Initialization function (optional) +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. -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. +In the above example, `grave_escape` is too long, so it would need to be shortened, e.g. -##### API structure +```dts +// Behavior can be invoked on peripherals, so name must be <= 8 characters. +/omit-if-no-ref/ gresc: gresc { ... }; +``` + +::: -Comes in the form `static const struct behavior_driver_api _driver_api)`. Common items to include in the API Structure are: +After creating the `.dtsi` from above, you may `#include ` at the top of your keymap to access the new behavior definition. -- `.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`. - ::: +:::info +If submitting a pull request to upstream ZMK, this `#include` statement would go inside `zmk/app/dts/behaviors.dtsi`, instead of the keymap. +::: -##### Behavior metadata +## Developing the Behavior Functionality -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. +### Overview -You can see a few examples of how the metadata is implemented in practice for: +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/3.5.0/build/dts/api/api.html) +- [Zephyr Device Driver Model](https://docs.zephyrproject.org/3.5.0/kernel/drivers/index.html) + +::: + +:::warning +If submitting a pull request, any `.c` files should be formatted according to `clang-format` to ensure that automated checks run smoothly. +::: + +### Compatible: `#define DT_DRV_COMPAT` + +This field should match the [`compatible` field of your devicetree binding](#compatible), using all lowercase letters and underscores to separate words, instead of hyphens and commas. + +For example, the Caps Word behavior's devicetree binding lists `compatible: "zmk,behavior-caps-word"`, so the `DT_DRV_COMPAT` is `zmk_behavior_caps_word`. + +### Dependencies + +The dependencies required for any ZMK behavior are: + +- `zephyr/device.h`: [Zephyr Device APIs](https://docs.zephyrproject.org/apidoc/3.5.0/group__device__model.html) +- `drivers/behavior.h`: ZMK Behavior Functions (e.g. [locality](#zmk-api-struct), `behavior_keymap_binding_pressed`, `behavior_keymap_binding_released`, `behavior_sensor_keymap_binding_triggered`) +- `zephyr/logging/log.h`: [Zephyr Logging APIs](https://docs.zephyrproject.org/3.5.0/services/logging/index.html) (for more information on USB Logging in ZMK, see [USB Logging](usb-logging.mdx)). +- `zmk/behavior.h`: ZMK Behavior Information (e.g. parameters, position and timestamp of events) + - `return` values: + - `ZMK_BEHAVIOR_OPAQUE`: Used to terminate `on__binding_pressed` and `on__binding_released` functions that accept `(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event)` as parameters + - `ZMK_BEHAVIOR_TRANSPARENT`: Used in the `binding_pressed` and `binding_released` functions for the transparent (`&trans`) behavior + - `struct`s: + - `zmk_behavior_binding`: Stores the name of the behavior device (`char *behavior_dev`) as a `string` and up to two additional parameters (`uint32_t param1`, `uint32_t param2`) + - `zmk_behavior_binding_event`: Contains layer, position, and timestamp data for an active `zmk_behavior_binding` + +Other common dependencies include `zmk/keymap.h`, which allows behaviors to access layer information and extract behavior bindings from keymaps, and `zmk/event_manager.h` which is detailed below. + +### Behavior metadata + +Behavior metadata documents the possible combinations of parameters that can be used with the behavior when added to your keymap. +The metadata structure allows flexibility to specify different kinds of well known parameter types, such as a HID usage, different second parameters passed on the selected first parameter, etc. + +You can see a few examples of how the metadata is implemented in practice for the following behaviors: - [Key press](https://github.com/zmkfirmware/zmk/blob/main/app/src/behaviors/behavior_key_press.c#L21) - [RGB underglow](https://github.com/zmkfirmware/zmk/blob/main/app/src/behaviors/behavior_rgb_underglow.c#L23) @@ -297,10 +542,12 @@ You can see a few examples of how the metadata is implemented in practice for: 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 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 an example of this with the `&bt` behavior. In that scenario, all `&bt` "commands" that take a BT profile as a second parameter are grouped into one set, and all commands that take no arguments are grouped into another. -This allows the ZMK Studio UI to properly show a input for a profile only when the appropriate first "command" selection is made in the UI. Here is a snippet of that setup from the [behavior_bt.c](https://github.com/zmkfirmware/zmk/blob/main/app/src/behaviors/behavior_bt.c#L25) code: +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 @@ -390,135 +637,207 @@ static const struct behavior_driver_api behavior_bt_driver_api = { }; ``` -##### Data pointers (optional) +### ZMK API struct + +Comes in the form `static const struct behavior_driver_api _driver_api`. +The most relevant fields of `struct behavior_driver_api`, defined in `drivers/behavior.h`, are shown below. + +| Field | Description | +| ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| .binding_pressed | The function called when the key is pressed. Typically reserved for a function named [`on__binding_pressed`](#dependencies) | +| .binding_released | The function called when the key is pressed. Typically reserved for a function named [`on__binding_released`](#dependencies) | +| .locality | Describes how the behavior affects parts of a _split_ keyboard. | + +Locality has been discussed previously at compile-time. +Locality in the context of the API struct refers to runtime locality. +The `.locality` field may take the following values. + +- `BEHAVIOR_LOCALITY_CENTRAL`: Behavior only affects the central half, which is the case for most keymap-related behavior. +- `BEHAVIOR_LOCALITY_EVENT_SOURCE`: Behavior affects only the central _or_ peripheral half depending on which side invoked the behavior binding, such as [reset behaviors](../keymaps/behaviors/reset.md). +- `BEHAVIOR_LOCALITY_GLOBAL`: Behavior affects the entire keyboard, such as [external power](../keymaps/behaviors/power.md) and lighting-related behaviors that need to be synchronized across halves. + +:::note +For unibody keyboards, all locality values perform the same as `BEHAVIOR_LOCALITY_GLOBAL`. +::: + +The API struct's metadata-specific fields are shown below. + +| Field | Description | +| ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| .get_parameter_metadata | Callback function that can dynamically provide/populate the metadata describing the parameters to use with the behavior so the behavior may be used with [ZMK Studio](../features/studio.md). | +| .parameter_metadata | Pointer to metadata describing the parameters to use with the behavior so the behavior may be used with [ZMK Studio](../features/studio.md). | + +### Invoking `BEHAVIOR_DT_INST_DEFINE` + +`BEHAVIOR_DT_INST_DEFINE` is a special ZMK macro which uses Zephyr's `DEVICE_DT_INST_DEFINE` macro to define the driver instance, before adding it to a list of ZMK behaviors so that can be found by the function `zmk_behavior_get_binding()`. + +:::info +For more information on this function, refer to [Zephyr's documentation on the Device Driver Model](https://docs.zephyrproject.org/3.5.0/kernel/drivers/index.html#c.DEVICE_DT_INST_DEFINE). +::: -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 example `BEHAVIOR_DT_INST_DEFINE` call can be left as is with the first parameter, the instance number, equal to `0` for behaviors that only require a single instance (e.g. external power, backlighting, accessing layers). +For behaviors that can have multiple instances (e.g. hold-taps, tap-dances, sticky-keys), `BEHAVIOR_DT_INST_DEFINE` can be placed inside a `#define` statement, usually formatted as `#define _INST(n)`, that sets up any [data pointers](#optional-data-pointers) and/or [configuration pointers](#optional-configuration-pointers) that are unique to each instance. + +An example of this can be seen below, taking the `#define KP_INST(n)` from the hold-tap driver. + +```c +#define KP_INST(n) \ + static const struct behavior_hold_tap_config behavior_hold_tap_config_##n = { \ + .tapping_term_ms = DT_INST_PROP(n, tapping_term_ms), \ + .hold_behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 0), label), \ + .tap_behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 1), label), \ + .quick_tap_ms = DT_INST_PROP(n, quick_tap_ms), \ + .flavor = DT_ENUM_IDX(DT_DRV_INST(n), flavor), \ + .retro_tap = DT_INST_PROP(n, retro_tap), \ + .hold_trigger_key_positions = DT_INST_PROP(n, hold_trigger_key_positions), \ + .hold_trigger_key_positions_len = DT_INST_PROP_LEN(n, hold_trigger_key_positions), \ + }; \ + BEHAVIOR_DT_INST_DEFINE(n, behavior_hold_tap_init, NULL, NULL, &behavior_hold_tap_config_##n, \ + APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ + &behavior_hold_tap_driver_api); + +DT_INST_FOREACH_STATUS_OKAY(KP_INST) +``` + +Note that in the hold-tap example, the instance number, `0`, has been replaced by `n`, signifying the unique `node_id` of each instance of a behavior. +Furthermore, the DT_INST_FOREACH_STATUS_OKAY(KP_INST) macro iterates through each compatible, non-disabled devicetree node, creating and applying the proper values to any instance-specific configurations or data by invoking the KP_INST macro for each instance of the new behavior. + +Behaviors also require the following parameters of `BEHAVIOR_DT_INST_DEFINE` to be changed: + +#### Optional: Initialization function + +Comes in the form `static int _init(const struct device *dev)`. +Initialization functions preconfigure any data, like resetting timers and position for hold-taps and tap-dances. +All initialization functions `return 0;` once complete. + +The **second** argument of `BEHAVIOR_DT_INST_DEFINE` can be set to `NULL` instead if an initialization function is not required. + +#### Optional: Data pointers + +The data `struct` stores additional data required for **each new instance** of the behavior. +Regardless of the instance number, `n`, `behavior__data_##n` is typically initialized as an empty `struct`. +The data respective to each instance of the behavior can be accessed in functions like [`on__binding_pressed(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event)`](#dependencies) by extracting the behavior device from the keybind like so: ```c const struct device *dev = zmk_behavior_get_binding(binding->behavior_dev); -struct behavior__data *data = dev->data; +struct behavior__data *data = dev->data; ``` The variables stored inside the data `struct`, `data`, can be then modified as necessary. -The fourth cell of `BEHAVIOR_DT_INST_DEFINE` can be set to `NULL` instead if instance-specific data is not required. +The **fourth** argument of `BEHAVIOR_DT_INST_DEFINE` can be set to `NULL` instead if instance-specific data is not required. -##### Configuration pointers (optional) +#### Optional: Configuration pointers -The configuration `struct` stores the properties declared from the behavior's `.yaml` for **each new instance** of the behavior. As seen in the `#define KP_INST(n)` of the hold-tap example, the configuration `struct`, `behavior__config_##n`, for each instance number, `n`, can be initialized using the [Zephyr Devicetree Instance-based APIs](https://docs.zephyrproject.org/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` +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](#devicetree-bindings-yaml) from a user's keymap or [predefined use-case `.dtsi` files](#optional-defining-common-use-cases-for-the-behavior-dtsi) stored in `app/dts/behaviors/`. +We illustrate this further by comparing the [`#define KP_INST(n)` from the hold-tap driver](#invoking-behavior_dt_inst_define) and the [`properties` of the hold-tap devicetree binding](#devicetree-bindings-yaml). +The config structure instances should always be declared `const` so they are placed into flash, not RAM, by the linker. -The fifth cell of `BEHAVIOR_DT_INST_DEFINE` can be set to `NULL` instead if instance-specific configurations are not required. +The **fifth** argument of `BEHAVIOR_DT_INST_DEFINE` can be set to `NULL` instead if instance-specific configurations are not required. -:::warning -Remember that `.c` files should be formatted according to `clang-format` to ensure that checks run smoothly once the pull request is submitted. -::: +### Keycodes -### Updating `app/CmakeLists.txt` to Include the New Driver +Let us examine one of the simplest behavior actions: sending and releasing keycodes. -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. +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. -```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() +```c +static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event) { + LOG_DBG("position %d keycode 0x%02X", event.position, binding->param1); + return raise_zmk_keycode_state_changed_from_encoded(binding->param1, true, event.timestamp); +} + +static int on_keymap_binding_released(struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event) { + LOG_DBG("position %d keycode 0x%02X", event.position, binding->param1); + return raise_zmk_keycode_state_changed_from_encoded(binding->param1, false, event.timestamp); +} + +static const struct behavior_driver_api behavior_key_press_driver_api = { + .binding_pressed = on_keymap_binding_pressed, + .binding_released = on_keymap_binding_released, +#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) + .parameter_metadata = &metadata, +#endif // IS_ENABLED(CONFIG_ZMK_BEHAVIOR_METADATA) +}; ``` -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: +### Layers -- 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)` +All functions that interact with layers can be found in `keymap.h`. -### Defining Common Use-Cases for the Behavior (`.dtsi`) (Optional) +Layers can be identified in two ways: an "order-independent" `zmk_keymap_layer_id_t`, and an "order-dependent" `zmk_keymap_layer_index_t`. -`.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. +| 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. | -For the purpose of this section, we will discuss the structure of `app/dts/behaviors/gresc.dtsi` below. +### ZMK Events -```dts title="app/dts/behaviors/gresc.dtsi" -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ +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/`. -#include +To use the event manager, we `#include ` at the top of our behavior source file. -/ { - 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)>; - }; - }; -}; -``` +Some examples of events that are the most relevant to behavior development can be seen below. -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. +| 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 | -:::warning +:::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). +::: -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. +### Interacting with other behaviors and the ZMK Behavior Queue -In the above example, `grave_escape` is too long, so it would need to be shortened, e.g. +This section will refer to features found in `behavior.h` and `behavior_queue.h`. -```dts -// Behavior can be invoked on peripherals, so name must be <= 8 characters. -/omit-if-no-ref/ gresc: gresc { ... }; -``` +#### `#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. -After creating the `.dtsi` from above, update `app/dts/behaviors.dtsi` to include your newly predefined behavior instance, making it accessible by the devicetree. - -```dts title="app/dts/behaviors.dtsi" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -// highlight-next-line -#include -``` +| Function | Description | +| ------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `struct zmk_behavior_binding` | A `struct` containing the behavior binding's name stored as a C-string, and its parameters. | +| `struct zmk_behavior_binding_event` | A `struct` describing where and when a behavior binding is invoked based on its the layer, key position, and timestamp. For split keyboards, this also includes which part of the keyboard invoked the binding. | +| `zmk_behavior_get_binding(const char *name)` | Get a `const struct device*` for a behavior from its name field. | +| `zmk_behavior_invoke_binding(const struct zmk_behavior_binding *src_binding, struct zmk_behavior_binding_event event, bool pressed)` | Invoke a behavior given its binding and invoking event details. | + +#### `#include ` + +The behavior queue is leveraged by [macros](../keymaps/behaviors/macros.md) and [sensor rotation](../keymaps/behaviors/sensor-rotate.md) behaviors. +This queue ensures that behaviors may be invoked sequentially using specific time-based triggers without blocking the rest of the keyboard functionality. + +| Function | Description | +| ------------------------ | ---------------------------------------- | +| `zmk_behavior_queue_add` | Adds the behavior to the behavior queue. | ## Testing Changes Locally -Create a new folder in `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. +Create a new folder in `tests/` (or `app/tests/` if submitting a pull request) to develop virtual test sets for all common use cases of the behavior. +For pull requests, behaviors should be tested thoroughly on both virtual testing environments using `west test` and real hardware. :::note Zephyr currently does not support logging over Bluetooth, so any use of the serial monitor for hardware testing must be done over hardware UART or USB virtual UART. @@ -536,24 +855,52 @@ 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](#creating-the-devicetree-binding-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](#devicetree-bindings-yaml) should be configured manually by the user? What do they do, and if applicable, what are their default values? - What does an example implementation in a keymap look like? Include a code-snippet of the example implementation in the keymap file's `behaviors` node. - How does the behavior perform in edge cases? For example, tap-dances invoke the last binding in its list of `bindings` once the maximum number of keypresses has been reached. -Consider also including visual aids alongside written documentation if it adds clarity. +Including visual aids alongside written documentation for additional clarity may be helpful. + +:::info +If submitting a pull request, see [Documentation](contributing/documentation.md) for more information on writing, testing, and formatting ZMK documentation. +::: + +## Licensing Information + +:::danger +The ZMK Project and its contributors do not claim to be legal representatives, and any material below should not considered official legal advice. +When distributing your work, please review the terms and conditions associated with any relevant licenses thoroughly. +::: + +Developers may wish to share their work with the public, which is often done by sharing a link to a GitHub repository. +However, making a repository public does **not** automatically qualify the repository as open source, or permit others to use the works as they see fit. +To qualify a codebase as open source, authors must provide a license that in addition to their source code, satisfy criteria that includes but is not limited to: + +- The source code and license must be freely accessible and redistributable +- The source code may be freely modified, which may result in the creation of derivative works under the conditions of the included license +- The license must not discriminate against any person, group of persons, or specific fields of endeavor :::info -See [Documentation](contributing/documentation.md) for more information on writing, testing, and formatting ZMK documentation. +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) + ::: -## Submitting a Pull Request +### 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). -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. +[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. @@ -581,6 +928,15 @@ 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. ::: -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). +### 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. From ad7fbfef920d9907ca8f143e273fa9eb7d84b25a Mon Sep 17 00:00:00 2001 From: Artem <7541981+efogdev@users.noreply.github.com> Date: Thu, 4 Dec 2025 20:53:47 +0200 Subject: [PATCH 35/96] feat(ble): Use appearance set in the BT_DEVICE_APPEARANCE config (#3115) Properly use the BT_DEVICE_APPEARANCE Zephyr symbol to advertise the correct appearance, allowing overrides, for e.g. mice. Co-authored-by: Cem Aksoylar --- app/Kconfig | 3 +++ app/src/ble.c | 4 +++- docs/docs/config/bluetooth.md | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app/Kconfig b/app/Kconfig index 6b4e3509a0d..28e3014eb75 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -25,6 +25,9 @@ config USB_DEVICE_PID config USB_DEVICE_MANUFACTURER default "ZMK Project" +config BT_DEVICE_APPEARANCE + default 961 + config BT_DIS_PNP_VID default 0x1D50 diff --git a/app/src/ble.c b/app/src/ble.c index 2611eee5e49..eb2a697e6d2 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -65,13 +65,15 @@ static uint8_t active_profile; #define DEVICE_NAME CONFIG_BT_DEVICE_NAME #define DEVICE_NAME_LEN (sizeof(DEVICE_NAME) - 1) +#define DEVICE_APPEARANCE \ + (uint8_t) CONFIG_BT_DEVICE_APPEARANCE, (uint8_t)(CONFIG_BT_DEVICE_APPEARANCE >> 8) BUILD_ASSERT( DEVICE_NAME_LEN <= CONFIG_BT_DEVICE_NAME_MAX, "ERROR: BLE device name is too long. Max length: " STRINGIFY(CONFIG_BT_DEVICE_NAME_MAX)); static struct bt_data zmk_ble_ad[] = { - BT_DATA_BYTES(BT_DATA_GAP_APPEARANCE, 0xC1, 0x03), + BT_DATA_BYTES(BT_DATA_GAP_APPEARANCE, DEVICE_APPEARANCE), BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)), BT_DATA_BYTES(BT_DATA_UUID16_SOME, 0x12, 0x18, /* HID Service */ 0x0f, 0x18 /* Battery Service */ diff --git a/docs/docs/config/bluetooth.md b/docs/docs/config/bluetooth.md index 83fb9ec09d8..c9b8578c924 100644 --- a/docs/docs/config/bluetooth.md +++ b/docs/docs/config/bluetooth.md @@ -16,3 +16,4 @@ 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 | From 83eafcbf9b12226f1d0dbb30a77e6ddc332a4210 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sat, 6 Dec 2025 14:58:18 -0800 Subject: [PATCH 36/96] refactor(Kconfig): Move BT_DEVICE_APPEARANCE to defaults (#3128) --- app/Kconfig | 6 ------ app/Kconfig.defaults | 6 +++++- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 28e3014eb75..d5a3bccd16f 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -25,9 +25,6 @@ config USB_DEVICE_PID config USB_DEVICE_MANUFACTURER default "ZMK Project" -config BT_DEVICE_APPEARANCE - default 961 - config BT_DIS_PNP_VID default 0x1D50 @@ -222,9 +219,6 @@ 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 diff --git a/app/Kconfig.defaults b/app/Kconfig.defaults index 21b130580be..30aaef21080 100644 --- a/app/Kconfig.defaults +++ b/app/Kconfig.defaults @@ -5,6 +5,10 @@ config SYSTEM_WORKQUEUE_STACK_SIZE default 2048 if SOC_RP2040 default 2048 if ZMK_BLE +# Basic +config BT_DEVICE_APPEARANCE + default 961 + # HID if ZMK_HID_REPORT_TYPE_HKRO @@ -110,4 +114,4 @@ config ZMK_BATTERY_REPORT_INTERVAL default 60 # Imports -rsource "src/split/Kconfig.defaults" \ No newline at end of file +rsource "src/split/Kconfig.defaults" From d32ffb0a335ece70a9ce3dc3ce014676534ee99b Mon Sep 17 00:00:00 2001 From: Willow Herring <31960031+ReFil@users.noreply.github.com> Date: Sun, 7 Dec 2025 04:09:31 +0000 Subject: [PATCH 37/96] fix(split): Properly return from command handler (#3120) --- app/src/split/peripheral.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/split/peripheral.c b/app/src/split/peripheral.c index e9317bb8b62..b814df61909 100644 --- a/app/src/split/peripheral.c +++ b/app/src/split/peripheral.c @@ -55,13 +55,14 @@ 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: { - zmk_physical_layouts_select(cmd.data.set_physical_layout.layout_idx); + 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: { - raise_zmk_hid_indicators_changed((struct zmk_hid_indicators_changed){ + return raise_zmk_hid_indicators_changed((struct zmk_hid_indicators_changed){ .indicators = cmd.data.set_hid_indicators.indicators}); } #endif From ece2ce11b8c7245fbe2b4e41ec9fa7a870632e6c Mon Sep 17 00:00:00 2001 From: Genteure Date: Sun, 7 Dec 2025 15:38:05 +0800 Subject: [PATCH 38/96] fix(split): int to pointer cast in bas proxy (#3105) Direct int to pointer cast causing build to fail in some build environments. --- app/src/split/bluetooth/central_bas_proxy.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/split/bluetooth/central_bas_proxy.c b/app/src/split/bluetooth/central_bas_proxy.c index 3e89fb0b893..f706d78f59b 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)(uint32_t)attr->user_data; + const uint8_t source = *(uint8_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, i), \ + BT_GATT_PERM_READ, read_blvl, NULL, ((uint8_t[]){i})), \ BT_GATT_CCC(blvl_ccc_cfg_changed, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE), \ BT_GATT_CPF(&aux_level_cpf), BT_GATT_CUD(PERIPH_CUD(i), BT_GATT_PERM_READ), From 8de5b120aa1f16a13dd3e6f35a8e07d847307e08 Mon Sep 17 00:00:00 2001 From: Pete Johanson Date: Sun, 7 Dec 2025 01:43:13 -0700 Subject: [PATCH 39/96] docs: Add release version to the docs, with links and warning banner (#3122) Add versions to the sidebar of the documentation, and when viewing the deployment on zmk.dev, which tracks `main`, add a banner warning about possibly prefering the docs for a particular stable release. --- docs/docusaurus.config.js | 58 +++++++++++++++++++--- docs/src/css/custom.css | 15 ++++++ docs/src/theme/DocVersionBanner/index.tsx | 60 +++++++++++++++++++++++ docs/zmk-release-versions.json | 3 ++ 4 files changed, 129 insertions(+), 7 deletions(-) create mode 100644 docs/src/theme/DocVersionBanner/index.tsx create mode 100644 docs/zmk-release-versions.json diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 801eac9273a..7f3341e1cdb 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -1,6 +1,32 @@ +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].label + : versionNavbarItems.find((item) => { + return item.label === gitBranch.replace("-branch", ""); + }); module.exports = { title: "ZMK Firmware", @@ -11,6 +37,10 @@ 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"), @@ -51,16 +81,29 @@ module.exports = { label: "Docs", position: "left", }, - { to: "blog", label: "Blog", position: "left" }, + isDevelopmentVersion + ? { to: "blog", label: "Blog", position: "left" } + : { href: "https://zmk.dev/blog", label: "Blog", position: "left" }, { - to: "power-profiler", - label: "Power Profiler", + type: "dropdown", + label: "Tools", position: "left", + items: [ + { + to: "power-profiler", + label: "Power Profiler", + }, + { + to: "keymap-upgrader", + label: "Keymap Upgrader", + }, + ], }, { - to: "keymap-upgrader", - label: "Keymap Upgrader", - position: "left", + type: "dropdown", + label: versionDropDownLabel, + position: "right", + items: versionNavbarItems, }, { href: "https://zmk.studio/", @@ -69,7 +112,8 @@ module.exports = { }, { href: "https://github.com/zmkfirmware/zmk", - label: "GitHub", + "aria-label": "ZMK GitHub Repository", + className: "header-github-link", position: "right", }, ], diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css index e41a8bcec6a..a016416cef2 100644 --- a/docs/src/css/custom.css +++ b/docs/src/css/custom.css @@ -23,6 +23,21 @@ --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); +} + .docusaurus-highlight-code-line { display: block; margin: 0 calc(-1 * var(--ifm-pre-padding)); diff --git a/docs/src/theme/DocVersionBanner/index.tsx b/docs/src/theme/DocVersionBanner/index.tsx new file mode 100644 index 00000000000..2e7fe133298 --- /dev/null +++ b/docs/src/theme/DocVersionBanner/index.tsx @@ -0,0 +1,60 @@ +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/zmk-release-versions.json b/docs/zmk-release-versions.json new file mode 100644 index 00000000000..45d0cd614b2 --- /dev/null +++ b/docs/zmk-release-versions.json @@ -0,0 +1,3 @@ +{ + "releaseVersions": ["0.3"] +} From abb64ba316c29caddc49727ca2cac2f0ed5970c7 Mon Sep 17 00:00:00 2001 From: Pete Johanson Date: Sun, 7 Dec 2025 02:04:51 -0700 Subject: [PATCH 40/96] docs: Build fix on release branches (#3130) Small build fix for the navbar label for the version dropdown, when building in release version branches. --- docs/docusaurus.config.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 7f3341e1cdb..babf8c6e3a9 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -22,11 +22,13 @@ const versionNavbarItems = [ })), ]; -const versionDropDownLabel = isDevelopmentVersion - ? versionNavbarItems[0].label - : versionNavbarItems.find((item) => { - return item.label === gitBranch.replace("-branch", ""); - }); +const versionDropDownLabel = ( + isDevelopmentVersion + ? versionNavbarItems[0] + : versionNavbarItems.find((item) => { + return item.label === gitBranch.replace("-branch", ""); + }) +).label; module.exports = { title: "ZMK Firmware", From c06fa48ce59e016105d79c20942d085314502d8d Mon Sep 17 00:00:00 2001 From: Pete Johanson Date: Tue, 9 Dec 2025 17:43:22 -0700 Subject: [PATCH 41/96] feat!: Move to zephyr v4.1 (#3060) refactor: Move to Zephyr v4.1.0 Move to Zephyr v4.1.0, with various build/compilation fixes needed for basic use. refactor(tests): Move to native_sim for tests. feat(core): (Optionally) use Zephyr keyboard input devices Add ability to assign a keyboard `input` device to a physical layout, or use a chosen `zmk,matrix-input`. fix(pointing): Refactor for changes to input API Pass NULL user_data to input callbacks. fix(tests): Fix BLE test to account for Zephyr changes Handle additional read callback invocation once all matching characteristic have been read. fix(sensors): Initialize sensor data to 0 before fetching. Be sure we don't get back any uninitialized data by initializing the channel data to 0 before calling into the sensor API. refactor(input): Adjust split input to input API changes. Input callbacks now have a user_data parameter, adjust accordingly. chore(bluetooth): Minor cleanup of split BT code after refactor Small fixes and remove commented dead code left after the split refactor. refactor: Fix up BLE tests after Zephyr upgrade. Minor changes to snapshots based on newer Zephyr version. refactor(boards): Move to upstream xiao_ble board ID. Move to official upstream board definition for the Seeed XIAO BLE. refactor: Adjust metadata schema for HWMv2 board IDs w/ qualifiers Adjust our ZMK metadata to allow for board IDs that include qualifiers with slash delimeters. refactor!(boards): Move nice!nano to HWMv2, and proper revisioning Upgrade the nice!nano board to HWMv2, under the proper nicekeyboards vendor directory, and with proper revisions. Includes a breaking change to default the `2.0.0` version instead of the much older v1 (`1.0.0`). fix: Disable Nordic dt-bindings header checks. Disable the recently added Nordic dt-bindings header checks, which cause issues for our HID related headers. fix(studio): Correct `memset` usage. Use the correct memset call to clear our RPC memory. fix: Refactor for new Zephyr PM API Adjustments to our PM code to match Zephyr PM APIs. refactor(ble): Use correct BT opt for connectable. Adjust for upstream Zephyr BT API changes for advertising options. refactor(boards): Move MakerDiary M2 board to HWMv2. Run the HWMv2 script to convert the MakerDiary M2 board. fix(studio): Correct usage of thread analyzer API Fix up the RPC code that invoke the thread analyzer API to account for API changes. chore: Remove nanopb module override. Leverage nanopb version that's used by Zephyr. feat(core): mapper for magic bootloader values. To trigger bootloaders that use a magic value in RAM to trigger bootloader mode, add a mapping retained memory driver that maps write/read of boot mode values to a special magic value stored in the actually backing RAM. feat(behaviors): Add retention boot mode to reset. Support new generic Zephyr retention boot mode API in the reset behavior. feat: Add double tap to enter bootloader functionality Add ability to enter the bootloader if double tapping reset within the specified window. refactor(CI): Move to 4.1 container tags. Move to the new 4.1 tagged container, to ensure updated SDK, Python packages, etc. refactor(boards): Move nRFMicro to HWMv2 Refactor nRFMicro to HWMv2, using proper SoC, revisions, and variants (for flipped). Also move to devicetree setup of DCDC/HV DCDC. refactor(boards): Move QMK Proton-C to HWMv2 Move Proton-C to HWMv2 for use with Zephyr 4.1. chore(ci): Adjust core coverage for new board IDs. Use correct board IDs, with qualifiers, for our core coverage testing. refactor(boards): Move BDN9 to HWMv2 Move BDN9 to HWMv2, using the base `bdn9` ID, no longer including the `_rev2` suffix in the ID. refactor(boards): Move nice!60 to HWMv2 Migrate nice!60 to HWMv2. refactor: Adjust how we're searching/loading keymap files Use new post_boards_shields extension point for loading keymap files from board/shield directories. refactor(boards): Move planck rev6 to HWMv2. Move Planck board definition to HWMv2, including versioning tweaks. refactor(boards): Move OLKB Preonic to HWMv2 Move Preonic board definition to HWMv2 and remove `_rev3` variant suffix in favor of board versioning with `3.0.0` as the default. chore(deps): Pull in Zephyr optional group for nanopb. Ensure we enable nanopb by adding +optional group filter. fix(ci): Prevent slash characters in artifact names. Move to HWMv2 means board IDs often include slashes, so replace those with underscores when doing file uploads. fix(usb): Adjust Kconfig settings for USB. * Ensure USB isn't initialized automatically before we do, which can happen if USB CDC logging is used/enabled for a given board. * Adjust USB HID to initialize the USB class/interface before we enable the USB device itself. fix(display): Fix setting the small font for the mono theme. Adjust for modified mono theme init function to pass the small font. chore(ci): Fix changed board IDs for core coverage. Adjust board IDs for our core coverage after move to HWMv2 and board versioning consistently. * planck_rev6 -> planck * bdn9_rev2 -> bdn9 fix(underglow): Remove use of removed Kconfig WS2812 symbol refactor(boards): Move PW CKP boards to HWMv2 Migrate the bt60, bt65, and bt75 to HWMv2. refactor(boards): Move Puchi BLE to HWMv2 Migrate the Puchi BLE to HWMv2. refactor(boards): Migrate Ferris rev02 to HWMv2. Move Ferris rev02 to HMWv2, and remove the revision from the ID. refactor(boards): Move Pillbug to HWMv2 Migrate the MechWild PillBug board to HWMv2. refactor(boards): Migrate s40nc to HWMv2 Move the ShortyFortyNoCordy (s40nc) to HWMv2. refactor(boards): Move bluemicro840 board to HWMv2. Migrate bluemicro840 board to HWMv2, set up boot mode retention. fix(boards): Retore bootloader support on XIAO BLE. Set up necessary boot mode/retention to properly set GPREGRET to trigger Adafruit bootloader to run on the XIAO BLE. refactor(boards): Move Adv360 Pro to HWMv2. Migrate Adv360 Pro left/right to HWMv2. refactor(boards): Move Glove80 to HMWv2 Refactor the MoErgo Glove80 left/right to HWMv2. refactor(boards): Move Mikoto to HMWv2. Migrate Mikoto to HWMv2, with non-exact matching, tweaks to I2C selection to imply it for the 7.2.0 revision for the fuel gauge. refactor(boards): Move kbdfans Tofu65 2.0 to HMWv2 Move Tofu65 2.0 to HMWv2, with ID of just `tofu65`. refactor(boards): Remove dz60rgb board Remove dz60rgb, it's no longer readily available and we have other current stm32 reference designs for testing. refactor(boards): Move Corneish Zen to HMWv2 Move Corneish Zen to HMWv2, with IDs of `corneish_zen_left`/`corneish_zen_right`. refactor(boards): Migrate Corne-ish Zen status screen * refactor(boards): Add boot mode to the nice!nano using common dtsi * Add a new .dtsi for setting up nRF52 boot mode/retained memory settings * Adjust XIAO BLE to use the new include file * Add boot mode to to the nice!nano refactor(boards): Add boot mode support to nice!60 board Enable boot mode for nice!60 board. refactor(boards): Adjust Zephyr board metadata file locations Move the ZMK metadata files for upstream Zephyr boards to align with the HWMv2 directory structure that uses the vendor ID for the parent directory for a board directory. fix: Don't enable ZMK Display by default for a few shields By convention, avoid enabling ZMK Display by default on shields that may be built with under-resourced controllers (e.g. nRF52833 based ones). fix: Remove usage of renamed Kconfig from core coverage. Avoid using WS2812_LED_STRIP, since that Kconfig was renamed/split into SPI/GPIO/I2S symbols. refactor(boards): Adjust XIAO RP2040 override names, bootloader support Adjust the .conf/.overlay files to match the proper naming for the XIAO rp2040 board. Also add the necessary Kconfig/DTS bits for supporting bootloader using retained memory/boot mode retention. fix(display): Adjust stack sizes for display usage. Updated LVGL is bumping our stack size, so adjust the system work queue and dedicated display queue stack sizes as needed to account for this. feat(display): Add thread name to dedicated display queue. When thread names are enabled, pass a name to the dedicated display queue for better tracibility when using the thread analyzer. docs(blog): Add Zephyr upgrade post docs: Add bootloader integration page Add a dedicated page to outline steps to set up bootloader integration using the boot retention mechanism in newer Zephyr versions. fix(display): port nice!view display code * remove `lv_` prefix from old LVGL methods doc: Update local setup docs to use `west packages pip` Install Zephyr deps using the newer `west packages pip --install`. Signed-off-by: Peter Johanson refactor(split): Adjust BT split code for newer Zephyr APIs. refactor(boards): Adjust upstream RP2040 boards for boot mode retention Add necessary DTS/Kconfig settings to upstream RP2040 boards so they can use the ZMK bootloader functionality using the boot mode retention infrastructure. docs: Update Zephyr docs links to 4.1.0 version. Update all links to the Zephyr docs to the 4.1.0 versions to match our Zephyr version in use. docs: Add a note about using CMake v3 for maximum compatibility. Some optional modules, like libmetal, which is used on nRF5340, specifically require CMake v3, so add a note in the native toolchain setup about this. feat(pointing): Handle INPUT_BTN_TOUCH codes for mouse buttons Translate INPUT_BTN_TOUCH input codes into button 0 press/release for HID layer. chore(pointing): Clean up some warning messages. Properly check return code from queue-ing messages, and fix up some type warnings in our logging calls. * Fix input event codes line numbers fix(studio): Properly serialize GATT RPC indications. fix(core): Set a system work queue stack size of 2048 by default We use a fair amount of stack even without BLE or RP2040, so default to 2048 by default everywhere, and constrained platforms can lowes this if they really need. refactor(core): Move away from deprecated DIS Kconfig symbols Use the correct Device Information Service Kconfig symbols for our model number and manufacturer. refactor: Move upstream Zephyr board overrides to extensions dirs Newer Zephyr supports "board extensions" to formally do what we've added in ourselves via some hacks, so move all our board overlay/config file overrides for upstream Zephyr boards into that correct structure. fix(boards): Add xiao_ble sd_partition label for nosd snippet compat Upstream xiao_ble uses different naming convention for the partition labels, so add an additional label for the SD range, so the existing nrf52840-nosd snippet will still work with the board. fix(core): Don't force CBPRINTF_NANO, for proper formatting. The nano CBPRINTF implementation lacks some padded formatting needed to ensure consistent formatting of BLE addresses, which we use to store keys as strings in a few places, so use the complete CBPRINTF by default now. fix(boards): Remove some references to old nice_nano_v2 board ID. The nice!nano board definition now properly uses versioning, so avoid referring to it with old `nice_nano_v2` board ID. fix(boards): Remove nano overlays for old nice_nano_v2 board ID. With board versioning in place, we can remove the unused `nice_nano_v2.overlay` files from shields. --------- Signed-off-by: Peter Johanson Co-authored-by: Cem Aksoylar Co-authored-by: Nicolas Munnich Co-authored-by: snoyer --- .devcontainer/Dockerfile | 2 +- .github/workflows/ble-test.yml | 2 +- .github/workflows/build-user-config.yml | 4 +- .github/workflows/build.yml | 4 +- .../hardware-metadata-validation.yml | 2 +- .github/workflows/test.yml | 4 +- app/CMakeLists.txt | 1 + app/Kconfig | 29 +- app/Kconfig.defaults | 5 +- .../kb2040}/adafruit_kb2040.zmk.yml | 0 .../adafruit_qt_py_rp2040.zmk.yml | 0 ...rp2040.conf => adafruit_metro_rp2040.conf} | 0 app/boards/arm/adv360pro/Kconfig | 7 - app/boards/arm/adv360pro/Kconfig.board | 12 - app/boards/arm/bdn9/Kconfig.board | 8 - app/boards/arm/bdn9/bdn9_rev2.yml | 11 - app/boards/arm/bluemicro840/Kconfig.board | 8 - app/boards/arm/bt60/Kconfig | 7 - app/boards/arm/bt60/Kconfig.board | 12 - app/boards/arm/bt60/bt60_v1.zmk.yml | 13 - app/boards/arm/bt60/bt60_v1_hs.yaml | 15 - app/boards/arm/ckp/Kconfig | 8 - app/boards/arm/ckp/Kconfig.board | 16 - app/boards/arm/ckp/Kconfig.defconfig | 28 -- app/boards/arm/corneish_zen/Kconfig | 10 - app/boards/arm/corneish_zen/Kconfig.board | 24 - .../arm/corneish_zen/corneish_zen_v2.yaml | 20 - .../arm/corneish_zen/corneish_zen_v2.zmk.yml | 16 - app/boards/arm/dz60rgb/Kconfig.board | 6 - app/boards/arm/dz60rgb/Kconfig.defconfig | 11 - app/boards/arm/dz60rgb/dz60rgb_rev1.dts | 86 ---- app/boards/arm/dz60rgb/dz60rgb_rev1.keymap | 25 - app/boards/arm/dz60rgb/dz60rgb_rev1.yaml | 19 - app/boards/arm/dz60rgb/dz60rgb_rev1_defconfig | 26 - app/boards/arm/ferris/Kconfig.board | 8 - app/boards/arm/glove80/Kconfig | 8 - app/boards/arm/glove80/Kconfig.board | 10 - app/boards/arm/kbdfans_tofu65/Kconfig.board | 6 - app/boards/arm/mikoto/Kconfig.board | 8 - app/boards/arm/mikoto/revision.cmake | 7 - app/boards/arm/nice60/Kconfig.board | 6 - app/boards/arm/nice_nano/Kconfig | 13 - app/boards/arm/nice_nano/Kconfig.board | 13 - app/boards/arm/nice_nano/Kconfig.defconfig | 19 - app/boards/arm/nice_nano/nice_nano_v2.yaml | 15 - app/boards/arm/nice_nano/nice_nano_v2.zmk.yml | 10 - app/boards/arm/nrf52840_m2/Kconfig.board | 9 - app/boards/arm/nrfmicro/Kconfig | 10 - app/boards/arm/nrfmicro/Kconfig.board | 20 - app/boards/arm/nrfmicro/nrfmicro_11.dts | 110 ----- .../nrfmicro/nrfmicro_11_flipped_defconfig | 28 -- .../arm/nrfmicro/nrfmicro_13_52833.zmk.yml | 10 - app/boards/arm/pillbug/Kconfig.board | 6 - app/boards/arm/proton_c/Kconfig.board | 8 - app/boards/arm/proton_c/Kconfig.defconfig | 11 - app/boards/arm/proton_c/board.cmake | 7 - app/boards/arm/puchi_ble/Kconfig.board | 8 - app/boards/arm/puchi_ble/puchi_ble_v1.yaml | 15 - app/boards/arm/s40nc/Kconfig.board | 6 - .../adafruit_kb2040}/adafruit_kb2040.conf | 4 + .../adafruit_kb2040}/adafruit_kb2040.overlay | 2 + .../adafruit_qt_py_rp2040.conf | 4 + .../adafruit_qt_py_rp2040.overlay | 2 + .../blackpill_f401cc}/blackpill_f401cc.conf | 0 .../blackpill_f401cc.overlay | 0 .../blackpill_f401ce}/blackpill_f401ce.conf | 0 .../blackpill_f401ce.overlay | 0 .../blackpill_f411ce}/blackpill_f411ce.conf | 0 .../blackpill_f411ce.overlay | 0 .../boardsource_blok}/boardsource_blok.conf | 4 + .../boardsource_blok.overlay | 2 + .../native_sim/native_sim.overlay} | 0 .../native_sim/native_sim_64.overlay | 32 ++ .../native_sim/native_sim_native_64.conf} | 0 .../nrf52840dk}/nrf52840dk_nrf52840.conf | 0 .../nrf52840dongle_nrf52840.conf | 0 .../nrf5340dk}/nrf5340dk_nrf5340_cpuapp.conf | 0 .../nrf5340dk_nrf5340_cpuapp.overlay | 0 .../{ => extensions/nrf_bsim}/nrf52_bsim.conf | 0 .../nrf_bsim}/nrf52_bsim.overlay | 0 .../rp2040_042lcd}/01space_rp2040_042lcd.conf | 0 .../01space_rp2040_042lcd.overlay | 0 .../rpi_pico/rpi_pico.conf} | 9 +- .../rpi_pico}/rpi_pico.overlay | 1 + .../seeeduino_xiao}/seeeduino_xiao.conf | 0 .../sparkfun_pro_micro_rp2040.conf | 6 +- .../sparkfun_pro_micro_rp2040.overlay | 2 + app/boards/extensions/xiao_ble/xiao_ble.conf | 20 + .../xiao_ble/xiao_ble.overlay} | 4 + .../xiao_rp2040/xiao_rp2040.conf} | 7 +- .../xiao_rp2040/xiao_rp2040.overlay} | 2 + .../mikoto => joric/nrfmicro}/CMakeLists.txt | 0 app/boards/joric/nrfmicro/Kconfig | 4 + .../{arm => joric}/nrfmicro/Kconfig.defconfig | 9 +- app/boards/joric/nrfmicro/Kconfig.nrfmicro | 12 + .../nrfmicro/arduino_pro_micro_pins.dtsi | 0 .../arduino_pro_micro_pins_52833.dtsi | 0 .../arduino_pro_micro_pins_flipped.dtsi | 0 .../nrfmicro}/board.cmake | 0 app/boards/joric/nrfmicro/board.yml | 14 + .../nrfmicro/nrfmicro-flipped-pinctrl.dtsi | 0 .../nrfmicro/nrfmicro-pinctrl.dtsi | 0 .../{arm => joric}/nrfmicro/nrfmicro_11.yaml | 0 .../nrfmicro/nrfmicro_11_flipped.yaml | 0 .../{arm => joric}/nrfmicro/nrfmicro_13.yaml | 0 .../nrfmicro/nrfmicro_13_52833.yaml | 0 .../nrfmicro/nrfmicro_nrf52833.dts} | 4 + .../nrfmicro/nrfmicro_nrf52833.zmk.yml} | 7 +- .../nrfmicro/nrfmicro_nrf52833_1_3_0.overlay | 6 + .../nrfmicro_nrf52833_1_3_0_defconfig} | 6 +- .../nrfmicro/nrfmicro_nrf52840.dts} | 6 + .../nrfmicro/nrfmicro_nrf52840.zmk.yml} | 8 +- .../nrfmicro/nrfmicro_nrf52840_1_1_0.overlay | 15 + .../nrfmicro_nrf52840_1_1_0_defconfig} | 6 +- .../nrfmicro/nrfmicro_nrf52840_1_3_0.overlay | 30 ++ .../nrfmicro_nrf52840_1_3_0_defconfig} | 6 +- .../nrfmicro/nrfmicro_nrf52840_flipped.dts} | 6 + .../nrfmicro_nrf52840_flipped.zmk.yml} | 7 +- .../nrfmicro_nrf52840_flipped_1_1_0.overlay | 6 + ...nrfmicro_nrf52840_flipped_1_1_0_defconfig} | 6 +- app/boards/{arm => joric}/nrfmicro/pinmux.c | 0 .../nrfmicro}/pre_dt_board.cmake | 0 .../bluemicro840/Kconfig | 2 +- .../bluemicro840/Kconfig.bluemicro840 | 8 + .../bluemicro840/Kconfig.defconfig | 7 +- .../bluemicro840/arduino_pro_micro_pins.dtsi | 0 .../bluemicro840/bluemicro840-pinctrl.dtsi} | 0 .../bluemicro840/bluemicro840.dts} | 4 +- .../bluemicro840/bluemicro840.yaml} | 2 +- .../bluemicro840/bluemicro840.zmk.yml} | 2 +- .../bluemicro840/bluemicro840_defconfig | 22 + .../bluemicro840}/board.cmake | 0 .../jpconstantineau/bluemicro840/board.yml | 5 + .../bluemicro840/pre_dt_board.cmake | 0 .../tofu65}/Kconfig.defconfig | 4 +- app/boards/kbdfans/tofu65/Kconfig.tofu65 | 8 + app/boards/kbdfans/tofu65/board.yml | 5 + .../tofu65/tofu65.dts} | 23 +- .../tofu65/tofu65.keymap} | 0 .../tofu65/tofu65.yaml} | 2 +- .../tofu65/tofu65.zmk.yml} | 2 +- .../tofu65/tofu65_defconfig} | 5 +- app/boards/keebio/bdn9/Kconfig.bdn9 | 5 + .../{arm => keebio}/bdn9/Kconfig.defconfig | 4 - app/boards/{arm => keebio}/bdn9/README.md | 0 .../bdn9/bdn9-layouts.dtsi} | 0 .../bdn9_rev2.conf => keebio/bdn9/bdn9.conf} | 0 .../bdn9_rev2.dts => keebio/bdn9/bdn9.dts} | 2 +- .../bdn9/bdn9.keymap} | 0 .../bdn9_rev2.yaml => keebio/bdn9/bdn9.yaml} | 0 .../bdn9/bdn9.zmk.yml} | 7 +- .../bdn9/bdn9_defconfig} | 3 +- app/boards/{arm => keebio}/bdn9/board.cmake | 0 app/boards/keebio/bdn9/board.yml | 10 + .../puchi_ble}/CMakeLists.txt | 0 .../{arm => keycapsss}/puchi_ble/Kconfig | 0 .../puchi_ble/Kconfig.defconfig | 4 +- .../keycapsss/puchi_ble/Kconfig.puchi_ble | 10 + .../puchi_ble/arduino_pro_micro_pins.dtsi | 0 .../{arm => keycapsss}/puchi_ble/board.cmake | 0 app/boards/keycapsss/puchi_ble/board.yml | 5 + .../{arm => keycapsss}/puchi_ble/pinmux.c | 2 +- .../puchi_ble}/pre_dt_board.cmake | 0 .../puchi_ble/puchi_ble-pinctrl.dtsi} | 0 .../puchi_ble/puchi_ble.dts} | 4 +- .../puchi_ble/puchi_ble.yaml} | 4 +- .../puchi_ble/puchi_ble.zmk.yml} | 2 +- .../puchi_ble/puchi_ble_defconfig} | 6 +- .../kinesis/adv360pro/Kconfig.adv360pro_left | 10 + .../kinesis/adv360pro/Kconfig.adv360pro_right | 10 + .../adv360pro/Kconfig.defconfig | 0 .../{arm => kinesis}/adv360pro/README.md | 0 .../adv360pro/adv360pro-layouts.dtsi | 0 .../adv360pro/adv360pro-pinctrl.dtsi | 0 .../{arm => kinesis}/adv360pro/adv360pro.dtsi | 5 + .../adv360pro/adv360pro.keymap | 0 .../{arm => kinesis}/adv360pro/adv360pro.yaml | 0 .../adv360pro/adv360pro.zmk.yml | 0 .../adv360pro/adv360pro_left.dts | 0 .../adv360pro/adv360pro_left_defconfig | 5 - .../adv360pro/adv360pro_right.dts | 0 .../adv360pro/adv360pro_right_defconfig | 5 - .../{arm => kinesis}/adv360pro/board.cmake | 0 app/boards/kinesis/adv360pro/board.yml | 9 + .../adv360pro}/pre_dt_board.cmake | 0 .../corneish_zen/CMakeLists.txt | 0 .../corneish_zen/Kconfig.corneish_zen_left | 10 + .../corneish_zen/Kconfig.corneish_zen_right | 10 + .../corneish_zen/Kconfig.defconfig | 9 +- .../ckp => lowprokb/corneish_zen}/board.cmake | 0 app/boards/lowprokb/corneish_zen/board.yml | 23 + .../corneish_zen/corneish_zen.conf | 0 .../corneish_zen/corneish_zen.dtsi | 1 + .../corneish_zen/corneish_zen.keymap | 0 .../corneish_zen/corneish_zen.yaml | 2 +- .../corneish_zen/corneish_zen.zmk.yml} | 11 +- .../corneish_zen/corneish_zen_left.dts | 8 + .../corneish_zen_left_1_0_0.overlay} | 1 - .../corneish_zen_left_1_0_0_defconfig} | 5 +- .../corneish_zen_left_2_0_0.overlay} | 2 - .../corneish_zen_left_2_0_0_defconfig} | 5 +- .../corneish_zen/corneish_zen_right.dts | 8 + .../corneish_zen_right_1_0_0.overlay} | 2 - .../corneish_zen_right_1_0_0_defconfig} | 5 +- .../corneish_zen_right_2_0_0.overlay} | 2 - .../corneish_zen_right_2_0_0_defconfig} | 5 +- .../corneish_zen/custom_status_screen.c | 8 +- .../corneish_zen/custom_status_screen.h | 0 .../corneish_zen/pre_dt_board.cmake | 0 .../corneish_zen/widgets/battery_status.c | 14 +- .../corneish_zen/widgets/battery_status.h | 0 .../corneish_zen/widgets/icons/CMakeLists.txt | 0 .../widgets/icons/USB_connected.c | 16 +- .../corneish_zen/widgets/icons/batt_0.c | 16 +- .../corneish_zen/widgets/icons/batt_0_chg.c | 16 +- .../corneish_zen/widgets/icons/batt_100.c | 16 +- .../corneish_zen/widgets/icons/batt_100_chg.c | 16 +- .../corneish_zen/widgets/icons/batt_25.c | 16 +- .../corneish_zen/widgets/icons/batt_25_chg.c | 16 +- .../corneish_zen/widgets/icons/batt_5.c | 16 +- .../corneish_zen/widgets/icons/batt_50.c | 16 +- .../corneish_zen/widgets/icons/batt_50_chg.c | 16 +- .../corneish_zen/widgets/icons/batt_5_chg.c | 16 +- .../corneish_zen/widgets/icons/batt_75.c | 16 +- .../corneish_zen/widgets/icons/batt_75_chg.c | 16 +- .../widgets/icons/bluetooth_advertising.c | 16 +- .../widgets/icons/bluetooth_advertising_1.c | 16 +- .../widgets/icons/bluetooth_advertising_2.c | 16 +- .../widgets/icons/bluetooth_advertising_3.c | 16 +- .../widgets/icons/bluetooth_advertising_4.c | 16 +- .../widgets/icons/bluetooth_advertising_5.c | 16 +- .../widgets/icons/bluetooth_connected_1.c | 16 +- .../widgets/icons/bluetooth_connected_2.c | 16 +- .../widgets/icons/bluetooth_connected_3.c | 16 +- .../widgets/icons/bluetooth_connected_4.c | 16 +- .../widgets/icons/bluetooth_connected_5.c | 16 +- .../widgets/icons/bluetooth_connected_right.c | 16 +- .../icons/bluetooth_disconnected_right.c | 16 +- .../corneish_zen/widgets/icons/layers.c | 16 +- .../corneish_zen/widgets/icons/layers2.c | 16 +- .../corneish_zen/widgets/icons/zenlogo.c | 16 +- .../corneish_zen/widgets/layer_status.c | 0 .../corneish_zen/widgets/layer_status.h | 0 .../corneish_zen/widgets/output_status.c | 26 +- .../corneish_zen/widgets/output_status.h | 0 .../corneish_zen/widgets/peripheral_status.c | 6 +- .../corneish_zen/widgets/peripheral_status.h | 0 .../{arm => makerdiary}/nrf52840_m2/Kconfig | 0 .../nrf52840_m2/Kconfig.defconfig | 3 - .../nrf52840_m2/Kconfig.nrf52840_m2 | 8 + .../nrf52840_m2/board.cmake | 0 app/boards/makerdiary/nrf52840_m2/board.yml | 5 + .../nrf52840_m2/nrf52840_m2.dts | 1 + .../nrf52840_m2/nrf52840_m2.yaml | 0 .../nrf52840_m2/nrf52840_m2.zmk.yml | 0 .../nrf52840_m2/nrf52840_m2_defconfig | 4 - .../nrf52840_m2}/pre_dt_board.cmake | 0 app/boards/{arm => mechwild}/pillbug/Kconfig | 0 .../pillbug/Kconfig.defconfig | 3 - app/boards/mechwild/pillbug/Kconfig.pillbug | 8 + .../pillbug/blackpill_pins.dtsi | 0 .../{arm => mechwild}/pillbug/board.cmake | 0 app/boards/mechwild/pillbug/board.yml | 5 + .../pillbug/pillbug-pinctrl.dtsi | 0 .../{arm => mechwild}/pillbug/pillbug.dts | 2 + .../{arm => mechwild}/pillbug/pillbug.yaml | 0 .../{arm => mechwild}/pillbug/pillbug.zmk.yml | 0 .../pillbug/pillbug_defconfig | 4 - .../pillbug}/pre_dt_board.cmake | 0 .../{arm => mechwild}/s40nc/Kconfig.defconfig | 0 app/boards/mechwild/s40nc/Kconfig.s40nc | 8 + app/boards/{arm => mechwild}/s40nc/README.md | 0 .../{arm => mechwild}/s40nc/board.cmake | 0 app/boards/mechwild/s40nc/board.yml | 5 + .../s40nc}/pre_dt_board.cmake | 0 app/boards/{arm => mechwild}/s40nc/s40nc.dts | 2 + .../{arm => mechwild}/s40nc/s40nc.keymap | 0 app/boards/{arm => mechwild}/s40nc/s40nc.yaml | 0 .../{arm => mechwild}/s40nc/s40nc.zmk.yml | 0 .../{arm => mechwild}/s40nc/s40nc_defconfig | 4 - .../{arm => moergo}/glove80/CMakeLists.txt | 0 .../{arm => moergo}/glove80/Kconfig.defconfig | 10 - app/boards/moergo/glove80/Kconfig.glove80_lh | 8 + app/boards/moergo/glove80/Kconfig.glove80_rh | 8 + .../{arm => moergo}/glove80/board.cmake | 0 app/boards/moergo/glove80/board.yml | 9 + .../glove80/glove80-layouts.dtsi | 0 .../{arm => moergo}/glove80/glove80.dtsi | 5 + .../{arm => moergo}/glove80/glove80.keymap | 0 .../{arm => moergo}/glove80/glove80.yaml | 0 .../{arm => moergo}/glove80/glove80.zmk.yml | 0 .../glove80/glove80_lh-pinctrl.dtsi | 0 .../{arm => moergo}/glove80/glove80_lh.dts | 0 .../{arm => moergo}/glove80/glove80_lh.keymap | 0 .../glove80/glove80_lh_defconfig | 4 - .../glove80/glove80_rh-pinctrl.dtsi | 0 .../{arm => moergo}/glove80/glove80_rh.dts | 0 .../{arm => moergo}/glove80/glove80_rh.keymap | 0 .../glove80/glove80_rh_defconfig | 4 - .../glove80}/pre_dt_board.cmake | 0 app/boards/{arm => moergo}/glove80/readme.md | 0 .../glove80/usb_serial_number.c | 0 app/boards/native_posix.conf | 7 - app/boards/native_posix.overlay | 17 - .../{arm => nicekeyboards}/nice60/Kconfig | 0 .../nice60/Kconfig.defconfig | 0 .../nicekeyboards/nice60/Kconfig.nice60 | 8 + .../{arm => nicekeyboards}/nice60/README.md | 0 .../{arm => nicekeyboards}/nice60/board.cmake | 0 app/boards/nicekeyboards/nice60/board.yml | 5 + .../nice60/nice60-pinctrl.dtsi | 0 .../{arm => nicekeyboards}/nice60/nice60.dts | 5 + .../nice60/nice60.keymap | 0 .../{arm => nicekeyboards}/nice60/nice60.yaml | 0 .../nice60/nice60.zmk.yml | 0 .../nice60/nice60_defconfig | 8 +- .../nice60}/pre_dt_board.cmake | 0 .../nicekeyboards/nice_nano/Kconfig.nice_nano | 8 + .../nice_nano/arduino_pro_micro_pins.dtsi | 0 .../nice_nano}/board.cmake | 0 app/boards/nicekeyboards/nice_nano/board.yml | 11 + .../nice_nano/nice_nano-pinctrl.dtsi | 0 .../nice_nano/nice_nano.dts} | 8 + .../nice_nano/nice_nano.yaml | 0 .../nice_nano/nice_nano.zmk.yml | 6 +- .../nice_nano/nice_nano_1_0_0.overlay} | 5 +- .../nice_nano/nice_nano_1_0_0_defconfig} | 4 - .../nice_nano/nice_nano_2_0_0.overlay} | 7 +- .../nice_nano/nice_nano_2_0_0_defconfig} | 6 +- .../nice_nano}/pre_dt_board.cmake | 0 .../nrf52840dk_nrf52840.zmk.yml | 2 +- .../nrf5340dk_nrf5340_cpuapp.zmk.yml} | 2 +- .../{arm => olkb}/planck/CMakeLists.txt | 0 .../{arm => olkb}/planck/Kconfig.defconfig | 0 .../planck/Kconfig.planck} | 6 +- app/boards/{arm => olkb}/planck/board.cmake | 0 app/boards/olkb/planck/board.yml | 10 + .../planck/planck.dts} | 0 .../planck/planck.keymap} | 0 .../planck/planck.yaml} | 0 .../planck/planck.zmk.yml} | 7 +- .../planck/planck_6_0_0_defconfig} | 2 - .../{arm => olkb}/preonic/CMakeLists.txt | 0 .../{arm => olkb}/preonic/Kconfig.defconfig | 4 +- .../preonic/Kconfig.preonic} | 5 +- app/boards/{arm => olkb}/preonic/board.cmake | 0 app/boards/olkb/preonic/board.yml | 10 + .../preonic/preonic.dts} | 0 .../preonic/preonic.keymap} | 0 .../preonic/preonic.yaml} | 0 .../preonic/preonic.zmk.yml} | 5 +- .../preonic/preonic_defconfig} | 4 +- .../ferris/Kconfig.defconfig | 3 - .../pierrechevalier83/ferris/Kconfig.ferris | 13 + .../ferris/README.md | 2 +- .../ferris/board.cmake | 0 app/boards/pierrechevalier83/ferris/board.yml | 5 + .../ferris/ferris.dts} | 32 +- .../ferris/ferris.keymap} | 0 .../ferris/ferris.yaml} | 2 +- .../ferris/ferris.zmk.yml} | 2 +- .../ferris/ferris_defconfig} | 3 - app/boards/polarityworks/bt60/Kconfig.bt60 | 10 + app/boards/polarityworks/bt60/Kconfig.bt60_hs | 10 + .../polarityworks/bt60/Kconfig.defconfig | 22 + .../mikoto => polarityworks/bt60}/board.cmake | 0 app/boards/polarityworks/bt60/board.yml | 15 + .../bt60.dtsi => polarityworks/bt60/bt60.dts} | 34 +- .../bt60/bt60.yaml} | 2 +- .../bt60/bt60.zmk.yml} | 5 +- app/boards/polarityworks/bt60/bt60_1_0_0.dtsi | 38 ++ .../bt60/bt60_1_0_0.keymap} | 4 +- .../bt60/bt60_1_0_0.overlay} | 3 +- .../bt60/bt60_1_0_0_defconfig} | 6 +- .../bt60/bt60_2_0_0.keymap} | 4 +- .../bt60/bt60_2_0_0.overlay} | 5 +- .../bt60/bt60_2_0_0_defconfig} | 6 - .../bt60/bt60_hs.dts} | 4 +- .../bt60/bt60_hs.keymap} | 0 .../bt60/bt60_hs.zmk.yml} | 2 +- .../bt60/bt60_hs_defconfig} | 6 +- .../bt60}/pre_dt_board.cmake | 0 app/boards/polarityworks/bt65/Kconfig.bt65 | 10 + .../bt65}/Kconfig.defconfig | 13 +- .../bt65}/board.cmake | 0 app/boards/polarityworks/bt65/board.yml | 5 + .../bt65/bt65.dts} | 8 +- .../bt65/bt65.keymap} | 4 +- .../bt65/bt65.yaml} | 2 +- .../bt65/bt65.zmk.yml} | 2 +- .../bt65/bt65_defconfig} | 8 +- .../bt65}/pre_dt_board.cmake | 0 app/boards/polarityworks/bt75/Kconfig.bt75 | 10 + .../polarityworks/bt75/Kconfig.defconfig | 22 + .../bt75}/board.cmake | 0 app/boards/polarityworks/bt75/board.yml | 5 + .../bt75/bt75.dts} | 8 +- .../bt75/bt75.keymap} | 2 +- .../bt75/bt75.yaml} | 2 +- .../bt75/bt75.zmk.yml} | 2 +- .../bt75/bt75_defconfig} | 8 +- .../bt75}/pre_dt_board.cmake | 0 app/boards/polarityworks/common/ckp-base.dtsi | 61 +++ .../common}/ckp-pinctrl.dtsi | 0 .../ckp => polarityworks/common}/ckp.dtsi | 61 +-- app/boards/post_boards_shields.cmake | 100 ++++ app/boards/qmk/proton_c/Kconfig.proton_c | 5 + .../proton_c/arduino_pro_micro_pins.dtsi | 0 .../{arm/dz60rgb => qmk/proton_c}/board.cmake | 0 app/boards/qmk/proton_c/board.yml | 5 + app/boards/{arm => qmk}/proton_c/proton_c.dts | 0 .../{arm => qmk}/proton_c/proton_c.yaml | 0 .../{arm => qmk}/proton_c/proton_c.zmk.yml | 0 .../{arm => qmk}/proton_c/proton_c_defconfig | 2 - .../seeeduino_xiao/seeeduino_xiao.zmk.yml | 0 .../xiao_ble/xiao_ble.zmk.yml} | 2 +- .../xiao_rp2040/xiao_rp2040.zmk.yml} | 2 +- .../chalice/boards/nice_nano_v2.overlay | 46 -- app/boards/shields/chalice/chalice.conf | 1 - .../shields/corne/boards/nice_nano_v2.overlay | 46 -- app/boards/shields/corne/corne.conf | 1 - .../elephant42/boards/nice_nano_v2.overlay | 46 -- app/boards/shields/elephant42/elephant42.conf | 3 +- .../boards/nice_nano_v2.overlay | 46 -- .../eternal_keypad/eternal_keypad.conf | 1 - .../shields/helix/boards/nice_nano_v2.overlay | 46 -- app/boards/shields/helix/helix.conf | 1 - .../shields/jorne/boards/nice_nano_v2.overlay | 46 -- app/boards/shields/jorne/jorne.conf | 1 - .../shields/knob_goblin/knob_goblin.conf | 2 +- .../shields/kyria/boards/nice_nano_v2.overlay | 46 -- app/boards/shields/kyria/kyria.conf | 1 - app/boards/shields/kyria/kyria_rev2.conf | 1 - app/boards/shields/kyria/kyria_rev3.conf | 1 - app/boards/shields/leeloo/README.md | 28 +- .../leeloo/boards/nice_nano_v2.overlay | 46 -- app/boards/shields/leeloo/leeloo_rev2.conf | 5 +- app/boards/shields/leeloo_micro/README.md | 16 +- .../leeloo_micro/boards/nice_nano_v2.overlay | 46 -- .../shields/leeloo_micro/leeloo_micro.conf | 5 +- .../lily58/boards/nice_nano_v2.overlay | 46 -- .../microdox/boards/nice_nano_v2.overlay | 46 -- app/boards/shields/microdox/microdox.conf | 1 - app/boards/shields/microdox/microdox_v2.conf | 1 - app/boards/shields/murphpad/Kconfig.defconfig | 3 - .../murphpad/boards/nice_nano_v2.overlay | 46 -- app/boards/shields/murphpad/murphpad.conf | 5 +- app/boards/shields/nibble/README.md | 1 - .../shields/nibble/boards/nice_nano.conf | 2 - .../nibble/boards/nice_nano_v2.overlay | 46 -- .../shields/nice_view/Kconfig.defconfig | 4 +- app/boards/shields/nice_view/nice_view.conf | 1 + app/boards/shields/nice_view/widgets/art.c | 10 +- app/boards/shields/nice_view/widgets/bolt.c | 4 +- .../nice_view/widgets/peripheral_status.c | 12 +- app/boards/shields/nice_view/widgets/status.c | 66 +-- app/boards/shields/nice_view/widgets/status.h | 6 +- app/boards/shields/nice_view/widgets/util.c | 101 +++- app/boards/shields/nice_view/widgets/util.h | 17 +- .../shields/nice_view_adapter/README.md | 2 +- .../boards/nice_nano_v2.overlay | 35 -- .../shields/redox/boards/nice_nano_v2.overlay | 46 -- app/boards/shields/redox/redox.conf | 1 - .../reviung34/boards/nice_nano_v2.overlay | 47 -- app/boards/shields/reviung34/reviung34.conf | 1 - .../reviung41/boards/nice_nano_v2.overlay | 46 -- app/boards/shields/reviung41/reviung41.conf | 1 - .../reviung5/boards/nice_nano_v2.overlay | 52 -- app/boards/shields/reviung5/reviung5.conf | 1 - .../reviung53/boards/nice_nano_v2.overlay | 46 -- app/boards/shields/reviung53/reviung53.conf | 1 - .../romac_plus/boards/nice_nano_v2.overlay | 46 -- .../shields/snap/boards/nice_nano_v2.overlay | 46 -- app/boards/shields/snap/snap.conf | 3 +- app/boards/shields/sofle/Kconfig.defconfig | 6 - .../shields/sofle/boards/nice_nano_v2.overlay | 50 -- .../splitkb_aurora_corne/Kconfig.defconfig | 4 - .../boards/nice_nano_v2.overlay | 46 -- .../splitkb_aurora_helix/Kconfig.defconfig | 4 - .../boards/nice_nano_v2.overlay | 45 -- .../splitkb_aurora_lily58/Kconfig.defconfig | 4 - .../boards/nice_nano_v2.overlay | 45 -- .../splitkb_aurora_sofle/Kconfig.defconfig | 4 - .../boards/nice_nano_v2.overlay | 45 -- .../splitkb_aurora_sweep/Kconfig.defconfig | 4 - .../boards/nice_nano_v2.overlay | 46 -- app/boards/shields/tg4x/boards/nice_nano.conf | 2 - .../shields/tg4x/boards/nice_nano_v2.overlay | 46 -- .../tidbit/boards/nice_nano_v2.overlay | 46 -- app/boards/shields/tidbit/tidbit.conf | 2 - .../boards/nice_nano_v2.overlay | 46 -- .../two_percent_milk/two_percent_milk.conf | 3 +- app/boards/shields/zmk_uno/Kconfig.defconfig | 4 - .../sparkfun_pro_micro_rp2040.zmk.yml | 0 .../blackpill_f401cc/blackpill_f401cc.zmk.yml | 0 .../blackpill_f401ce/blackpill_f401ce.zmk.yml | 0 .../blackpill_f411ce/blackpill_f411ce.zmk.yml | 0 .../mikoto}/CMakeLists.txt | 0 app/boards/{arm => zhiayang}/mikoto/Kconfig | 12 - .../mikoto/Kconfig.defconfig | 3 - app/boards/zhiayang/mikoto/Kconfig.mikoto | 9 + .../mikoto/arduino_pro_micro_pins_v5.dtsi | 0 .../mikoto/arduino_pro_micro_pins_v6.dtsi | 0 app/boards/zhiayang/mikoto/board.cmake | 5 + app/boards/zhiayang/mikoto/board.yml | 14 + .../mikoto/mikoto-pinctrl.dtsi | 0 .../{arm => zhiayang}/mikoto/mikoto.dts | 5 + .../{arm => zhiayang}/mikoto/mikoto.yaml | 0 .../{arm => zhiayang}/mikoto/mikoto.zmk.yml | 0 .../mikoto/mikoto_5_20_0.overlay | 0 .../mikoto/mikoto_6_1_0.overlay | 0 .../mikoto/mikoto_7_2_0.conf | 0 .../mikoto/mikoto_7_2_0.overlay | 0 .../{arm => zhiayang}/mikoto/mikoto_defconfig | 4 - app/boards/{arm => zhiayang}/mikoto/pinmux.c | 0 app/boards/zhiayang/mikoto/pre_dt_board.cmake | 9 + app/core-coverage.yml | 28 +- app/dts/behaviors/reset.dtsi | 1 + .../behaviors/zmk,behavior-reset.yaml | 2 + .../zmk,bootmode-to-magic-mapper.yaml | 9 + app/dts/bindings/zmk,physical-layout.yaml | 3 + .../common/nordic/nrf52840_uf2_boot_mode.dtsi | 29 ++ app/include/zmk/physical_layouts.h | 3 + app/keymap-module/modules/modules.cmake | 160 ------ app/module/drivers/input/input_mock.c | 9 +- app/run-test.sh | 4 +- app/src/activity.c | 6 +- app/src/behavior.c | 8 +- app/src/behaviors/behavior_input_two_axis.c | 2 +- app/src/behaviors/behavior_reset.c | 28 +- app/src/ble.c | 3 +- app/src/boot/CMakeLists.txt | 3 + app/src/boot/Kconfig | 43 ++ app/src/boot/Kconfig.defaults | 27 ++ app/src/boot/bootmode_to_magic_mapper.c | 63 +++ app/src/boot/dbl_tap_bootloader.c | 16 + app/src/display/Kconfig | 9 +- app/src/display/main.c | 13 +- app/src/physical_layouts.c | 92 +++- app/src/pm.c | 6 +- app/src/pointing/input_listener.c | 13 +- app/src/pointing/input_processor_temp_layer.c | 8 +- app/src/pointing/input_split.c | 4 +- app/src/sensors.c | 2 +- app/src/split/bluetooth/central.c | 7 +- app/src/split/bluetooth/peripheral.c | 15 +- app/src/studio/gatt_rpc_transport.c | 40 +- app/src/studio/rpc.c | 4 +- .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../snapshot.log | 1 + .../ble/split/peripheral-input/snapshot.log | 1 + .../run-peripheral-behavior/snapshot.log | 2 +- .../ble/split/set-hid-indicators/snapshot.log | 2 +- ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../native_posix.keymap | 17 - ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../native_posix.keymap | 13 - ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../tap-when-rolling/native_posix.keymap | 13 - ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../kp-press-release/events.patterns | 1 + .../kp-press-release/keycode_events.snapshot | 2 + .../kp-press-release/native_sim.conf | 1 + .../kp-press-release/native_sim.keymap | 60 +++ ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...{native_posix.keymap => native_sim.keymap} | 0 app/tests/pointing/mkp/native_posix_64.keymap | 27 -- .../{native_posix_64.conf => native_sim.conf} | 0 ...{native_posix.keymap => native_sim.keymap} | 0 .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../transparent/normal/native_posix_64.keymap | 8 - .../normal/native_sim.keymap} | 0 .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 .../{native_posix_64.conf => native_sim.conf} | 0 ...tive_posix_64.keymap => native_sim.keymap} | 0 app/west.yml | 10 +- docs/blog/2025-xx-xx-zephyr-4-1.md | 455 ++++++++++++++++++ docs/docs/config/battery.md | 4 +- docs/docs/config/behaviors.md | 4 +- docs/docs/config/displays.md | 10 +- docs/docs/config/index.md | 14 +- docs/docs/config/kscan.md | 8 +- docs/docs/config/lighting.md | 6 +- docs/docs/config/settings.md | 2 +- docs/docs/config/system.md | 13 +- docs/docs/development/devicetree.md | 10 +- .../bootloader/_base-config.md | 13 + .../bootloader/adafruit-nrf52.mdx | 84 ++++ .../hardware-integration/bootloader/index.mdx | 31 ++ .../hardware-integration/bootloader/rp2.mdx | 70 +++ .../bootloader/samd21-uf2.mdx | 102 ++++ .../hardware-integration/bootloader/stm32.mdx | 71 +++ .../bootloader/tinyuf2.mdx | 102 ++++ .../hardware-integration/index.mdx | 14 +- .../hardware-integration/new-shield.mdx | 4 +- .../hardware-integration/pinctrl.mdx | 8 +- .../hardware-integration/pointing.mdx | 10 +- .../hardware-integration/soft-off-setup.mdx | 4 +- .../local-toolchain/build-flash.mdx | 12 +- .../local-toolchain/setup/native.mdx | 64 +-- docs/docs/development/module-creation.md | 8 +- docs/docs/development/new-behavior.mdx | 14 +- docs/docs/development/usb-logging.mdx | 4 +- docs/docs/faq.md | 8 +- docs/docs/features/modules.mdx | 8 +- docs/docs/features/studio.md | 2 +- docs/docs/intro.mdx | 2 +- .../keymaps/input-processors/behaviors.md | 4 +- .../keymaps/input-processors/code-mapper.md | 4 +- docs/docs/keymaps/input-processors/scaler.md | 4 +- .../keymaps/input-processors/transformer.md | 6 +- docs/docs/troubleshooting/building-issues.md | 2 +- .../troubleshooting/connection-issues.mdx | 6 +- docs/sidebars.js | 16 + schema/hardware-metadata.schema.json | 2 +- 872 files changed, 3167 insertions(+), 3412 deletions(-) rename app/boards/{arm/adafruit_kb2040 => adafruit/kb2040}/adafruit_kb2040.zmk.yml (100%) rename app/boards/{arm/adafruit_qt_py_rp2040 => adafruit/qt_py_rp2040}/adafruit_qt_py_rp2040.zmk.yml (100%) rename app/boards/{seeeduino_xiao_rp2040.conf => adafruit_metro_rp2040.conf} (100%) delete mode 100644 app/boards/arm/adv360pro/Kconfig delete mode 100644 app/boards/arm/adv360pro/Kconfig.board delete mode 100644 app/boards/arm/bdn9/Kconfig.board delete mode 100644 app/boards/arm/bdn9/bdn9_rev2.yml delete mode 100644 app/boards/arm/bluemicro840/Kconfig.board delete mode 100644 app/boards/arm/bt60/Kconfig delete mode 100644 app/boards/arm/bt60/Kconfig.board delete mode 100644 app/boards/arm/bt60/bt60_v1.zmk.yml delete mode 100644 app/boards/arm/bt60/bt60_v1_hs.yaml delete mode 100644 app/boards/arm/ckp/Kconfig delete mode 100644 app/boards/arm/ckp/Kconfig.board delete mode 100644 app/boards/arm/ckp/Kconfig.defconfig delete mode 100644 app/boards/arm/corneish_zen/Kconfig delete mode 100644 app/boards/arm/corneish_zen/Kconfig.board delete mode 100644 app/boards/arm/corneish_zen/corneish_zen_v2.yaml delete mode 100644 app/boards/arm/corneish_zen/corneish_zen_v2.zmk.yml delete mode 100644 app/boards/arm/dz60rgb/Kconfig.board delete mode 100644 app/boards/arm/dz60rgb/Kconfig.defconfig delete mode 100644 app/boards/arm/dz60rgb/dz60rgb_rev1.dts delete mode 100644 app/boards/arm/dz60rgb/dz60rgb_rev1.keymap delete mode 100644 app/boards/arm/dz60rgb/dz60rgb_rev1.yaml delete mode 100644 app/boards/arm/dz60rgb/dz60rgb_rev1_defconfig delete mode 100644 app/boards/arm/ferris/Kconfig.board delete mode 100644 app/boards/arm/glove80/Kconfig delete mode 100644 app/boards/arm/glove80/Kconfig.board delete mode 100644 app/boards/arm/kbdfans_tofu65/Kconfig.board delete mode 100644 app/boards/arm/mikoto/Kconfig.board delete mode 100644 app/boards/arm/mikoto/revision.cmake delete mode 100644 app/boards/arm/nice60/Kconfig.board delete mode 100644 app/boards/arm/nice_nano/Kconfig delete mode 100644 app/boards/arm/nice_nano/Kconfig.board delete mode 100644 app/boards/arm/nice_nano/Kconfig.defconfig delete mode 100644 app/boards/arm/nice_nano/nice_nano_v2.yaml delete mode 100644 app/boards/arm/nice_nano/nice_nano_v2.zmk.yml delete mode 100644 app/boards/arm/nrf52840_m2/Kconfig.board delete mode 100644 app/boards/arm/nrfmicro/Kconfig delete mode 100644 app/boards/arm/nrfmicro/Kconfig.board delete mode 100644 app/boards/arm/nrfmicro/nrfmicro_11.dts delete mode 100644 app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig delete mode 100644 app/boards/arm/nrfmicro/nrfmicro_13_52833.zmk.yml delete mode 100644 app/boards/arm/pillbug/Kconfig.board delete mode 100644 app/boards/arm/proton_c/Kconfig.board delete mode 100644 app/boards/arm/proton_c/Kconfig.defconfig delete mode 100644 app/boards/arm/proton_c/board.cmake delete mode 100644 app/boards/arm/puchi_ble/Kconfig.board delete mode 100644 app/boards/arm/puchi_ble/puchi_ble_v1.yaml delete mode 100644 app/boards/arm/s40nc/Kconfig.board rename app/boards/{ => extensions/adafruit_kb2040}/adafruit_kb2040.conf (50%) rename app/boards/{ => extensions/adafruit_kb2040}/adafruit_kb2040.overlay (68%) rename app/boards/{ => extensions/adafruit_qt_py_rp2040}/adafruit_qt_py_rp2040.conf (50%) rename app/boards/{ => extensions/adafruit_qt_py_rp2040}/adafruit_qt_py_rp2040.overlay (67%) rename app/boards/{ => extensions/blackpill_f401cc}/blackpill_f401cc.conf (100%) rename app/boards/{ => extensions/blackpill_f401cc}/blackpill_f401cc.overlay (100%) rename app/boards/{ => extensions/blackpill_f401ce}/blackpill_f401ce.conf (100%) rename app/boards/{ => extensions/blackpill_f401ce}/blackpill_f401ce.overlay (100%) rename app/boards/{ => extensions/blackpill_f411ce}/blackpill_f411ce.conf (100%) rename app/boards/{ => extensions/blackpill_f411ce}/blackpill_f411ce.overlay (100%) rename app/boards/{ => extensions/boardsource_blok}/boardsource_blok.conf (50%) rename app/boards/{ => extensions/boardsource_blok}/boardsource_blok.overlay (68%) rename app/boards/{native_posix_64.overlay => extensions/native_sim/native_sim.overlay} (100%) create mode 100644 app/boards/extensions/native_sim/native_sim_64.overlay rename app/boards/{native_posix_64.conf => extensions/native_sim/native_sim_native_64.conf} (100%) rename app/boards/{ => extensions/nrf52840dk}/nrf52840dk_nrf52840.conf (100%) rename app/boards/{ => extensions/nrf52840dongle}/nrf52840dongle_nrf52840.conf (100%) rename app/boards/{ => extensions/nrf5340dk}/nrf5340dk_nrf5340_cpuapp.conf (100%) rename app/boards/{ => extensions/nrf5340dk}/nrf5340dk_nrf5340_cpuapp.overlay (100%) rename app/boards/{ => extensions/nrf_bsim}/nrf52_bsim.conf (100%) rename app/boards/{ => extensions/nrf_bsim}/nrf52_bsim.overlay (100%) rename app/boards/{ => extensions/rp2040_042lcd}/01space_rp2040_042lcd.conf (100%) rename app/boards/{ => extensions/rp2040_042lcd}/01space_rp2040_042lcd.overlay (100%) rename app/boards/{seeeduino_xiao_ble.conf => extensions/rpi_pico/rpi_pico.conf} (70%) rename app/boards/{ => extensions/rpi_pico}/rpi_pico.overlay (82%) rename app/boards/{ => extensions/seeeduino_xiao}/seeeduino_xiao.conf (100%) rename app/boards/{ => extensions/sparkfun_pro_micro_rp2040}/sparkfun_pro_micro_rp2040.conf (67%) rename app/boards/{ => extensions/sparkfun_pro_micro_rp2040}/sparkfun_pro_micro_rp2040.overlay (88%) create mode 100644 app/boards/extensions/xiao_ble/xiao_ble.conf rename app/boards/{seeeduino_xiao_ble.overlay => extensions/xiao_ble/xiao_ble.overlay} (86%) rename app/boards/{rpi_pico.conf => extensions/xiao_rp2040/xiao_rp2040.conf} (66%) rename app/boards/{seeeduino_xiao_rp2040.overlay => extensions/xiao_rp2040/xiao_rp2040.overlay} (87%) rename app/boards/{arm/mikoto => joric/nrfmicro}/CMakeLists.txt (100%) create mode 100644 app/boards/joric/nrfmicro/Kconfig rename app/boards/{arm => joric}/nrfmicro/Kconfig.defconfig (50%) create mode 100644 app/boards/joric/nrfmicro/Kconfig.nrfmicro rename app/boards/{arm => joric}/nrfmicro/arduino_pro_micro_pins.dtsi (100%) rename app/boards/{arm => joric}/nrfmicro/arduino_pro_micro_pins_52833.dtsi (100%) rename app/boards/{arm => joric}/nrfmicro/arduino_pro_micro_pins_flipped.dtsi (100%) rename app/boards/{arm/bluemicro840 => joric/nrfmicro}/board.cmake (100%) create mode 100644 app/boards/joric/nrfmicro/board.yml rename app/boards/{arm => joric}/nrfmicro/nrfmicro-flipped-pinctrl.dtsi (100%) rename app/boards/{arm => joric}/nrfmicro/nrfmicro-pinctrl.dtsi (100%) rename app/boards/{arm => joric}/nrfmicro/nrfmicro_11.yaml (100%) rename app/boards/{arm => joric}/nrfmicro/nrfmicro_11_flipped.yaml (100%) rename app/boards/{arm => joric}/nrfmicro/nrfmicro_13.yaml (100%) rename app/boards/{arm => joric}/nrfmicro/nrfmicro_13_52833.yaml (100%) rename app/boards/{arm/nrfmicro/nrfmicro_13_52833.dts => joric/nrfmicro/nrfmicro_nrf52833.dts} (97%) rename app/boards/{arm/nrfmicro/nrfmicro_11_flipped.zmk.yml => joric/nrfmicro/nrfmicro_nrf52833.zmk.yml} (56%) create mode 100644 app/boards/joric/nrfmicro/nrfmicro_nrf52833_1_3_0.overlay rename app/boards/{arm/nrfmicro/nrfmicro_11_defconfig => joric/nrfmicro/nrfmicro_nrf52833_1_3_0_defconfig} (79%) rename app/boards/{arm/nrfmicro/nrfmicro_13.dts => joric/nrfmicro/nrfmicro_nrf52840.dts} (95%) rename app/boards/{arm/nrfmicro/nrfmicro_11.zmk.yml => joric/nrfmicro/nrfmicro_nrf52840.zmk.yml} (50%) create mode 100644 app/boards/joric/nrfmicro/nrfmicro_nrf52840_1_1_0.overlay rename app/boards/{arm/nrfmicro/nrfmicro_13_defconfig => joric/nrfmicro/nrfmicro_nrf52840_1_1_0_defconfig} (79%) create mode 100644 app/boards/joric/nrfmicro/nrfmicro_nrf52840_1_3_0.overlay rename app/boards/{arm/bluemicro840/bluemicro840_v1_defconfig => joric/nrfmicro/nrfmicro_nrf52840_1_3_0_defconfig} (79%) rename app/boards/{arm/nrfmicro/nrfmicro_11_flipped.dts => joric/nrfmicro/nrfmicro_nrf52840_flipped.dts} (95%) rename app/boards/{arm/nrfmicro/nrfmicro_13.zmk.yml => joric/nrfmicro/nrfmicro_nrf52840_flipped.zmk.yml} (52%) create mode 100644 app/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped_1_1_0.overlay rename app/boards/{arm/nrfmicro/nrfmicro_13_52833_defconfig => joric/nrfmicro/nrfmicro_nrf52840_flipped_1_1_0_defconfig} (78%) rename app/boards/{arm => joric}/nrfmicro/pinmux.c (100%) rename app/boards/{arm/adv360pro => joric/nrfmicro}/pre_dt_board.cmake (100%) rename app/boards/{arm => jpconstantineau}/bluemicro840/Kconfig (77%) create mode 100644 app/boards/jpconstantineau/bluemicro840/Kconfig.bluemicro840 rename app/boards/{arm => jpconstantineau}/bluemicro840/Kconfig.defconfig (69%) rename app/boards/{arm => jpconstantineau}/bluemicro840/arduino_pro_micro_pins.dtsi (100%) rename app/boards/{arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi => jpconstantineau/bluemicro840/bluemicro840-pinctrl.dtsi} (100%) rename app/boards/{arm/bluemicro840/bluemicro840_v1.dts => jpconstantineau/bluemicro840/bluemicro840.dts} (96%) rename app/boards/{arm/bluemicro840/bluemicro840_v1.yaml => jpconstantineau/bluemicro840/bluemicro840.yaml} (85%) rename app/boards/{arm/bluemicro840/bluemicro840_v1.zmk.yml => jpconstantineau/bluemicro840/bluemicro840.zmk.yml} (89%) create mode 100644 app/boards/jpconstantineau/bluemicro840/bluemicro840_defconfig rename app/boards/{arm/bt60 => jpconstantineau/bluemicro840}/board.cmake (100%) create mode 100644 app/boards/jpconstantineau/bluemicro840/board.yml rename app/boards/{arm => jpconstantineau}/bluemicro840/pre_dt_board.cmake (100%) rename app/boards/{arm/kbdfans_tofu65 => kbdfans/tofu65}/Kconfig.defconfig (74%) create mode 100644 app/boards/kbdfans/tofu65/Kconfig.tofu65 create mode 100644 app/boards/kbdfans/tofu65/board.yml rename app/boards/{arm/kbdfans_tofu65/kbdfans_tofu65_v2.dts => kbdfans/tofu65/tofu65.dts} (91%) rename app/boards/{arm/kbdfans_tofu65/kbdfans_tofu65_v2.keymap => kbdfans/tofu65/tofu65.keymap} (100%) rename app/boards/{arm/kbdfans_tofu65/kbdfans_tofu65_v2.yaml => kbdfans/tofu65/tofu65.yaml} (84%) rename app/boards/{arm/kbdfans_tofu65/kbdfans_tofu65_v2.zmk.yml => kbdfans/tofu65/tofu65.zmk.yml} (88%) rename app/boards/{arm/kbdfans_tofu65/kbdfans_tofu65_v2_defconfig => kbdfans/tofu65/tofu65_defconfig} (83%) create mode 100644 app/boards/keebio/bdn9/Kconfig.bdn9 rename app/boards/{arm => keebio}/bdn9/Kconfig.defconfig (78%) rename app/boards/{arm => keebio}/bdn9/README.md (100%) rename app/boards/{arm/bdn9/bdn9_rev2-layouts.dtsi => keebio/bdn9/bdn9-layouts.dtsi} (100%) rename app/boards/{arm/bdn9/bdn9_rev2.conf => keebio/bdn9/bdn9.conf} (100%) rename app/boards/{arm/bdn9/bdn9_rev2.dts => keebio/bdn9/bdn9.dts} (99%) rename app/boards/{arm/bdn9/bdn9_rev2.keymap => keebio/bdn9/bdn9.keymap} (100%) rename app/boards/{arm/bdn9/bdn9_rev2.yaml => keebio/bdn9/bdn9.yaml} (100%) rename app/boards/{arm/bdn9/bdn9_rev2.zmk.yml => keebio/bdn9/bdn9.zmk.yml} (72%) rename app/boards/{arm/bdn9/bdn9_rev2_defconfig => keebio/bdn9/bdn9_defconfig} (85%) rename app/boards/{arm => keebio}/bdn9/board.cmake (100%) create mode 100644 app/boards/keebio/bdn9/board.yml rename app/boards/{arm/nrfmicro => keycapsss/puchi_ble}/CMakeLists.txt (100%) rename app/boards/{arm => keycapsss}/puchi_ble/Kconfig (100%) rename app/boards/{arm => keycapsss}/puchi_ble/Kconfig.defconfig (81%) create mode 100644 app/boards/keycapsss/puchi_ble/Kconfig.puchi_ble rename app/boards/{arm => keycapsss}/puchi_ble/arduino_pro_micro_pins.dtsi (100%) rename app/boards/{arm => keycapsss}/puchi_ble/board.cmake (100%) create mode 100644 app/boards/keycapsss/puchi_ble/board.yml rename app/boards/{arm => keycapsss}/puchi_ble/pinmux.c (95%) rename app/boards/{arm/bt60 => keycapsss/puchi_ble}/pre_dt_board.cmake (100%) rename app/boards/{arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi => keycapsss/puchi_ble/puchi_ble-pinctrl.dtsi} (100%) rename app/boards/{arm/puchi_ble/puchi_ble_v1.dts => keycapsss/puchi_ble/puchi_ble.dts} (96%) rename app/boards/{arm/bt60/bt60_v1.yaml => keycapsss/puchi_ble/puchi_ble.yaml} (77%) rename app/boards/{arm/puchi_ble/puchi_ble_v1.zmk.yml => keycapsss/puchi_ble/puchi_ble.zmk.yml} (92%) rename app/boards/{arm/puchi_ble/puchi_ble_v1_defconfig => keycapsss/puchi_ble/puchi_ble_defconfig} (81%) create mode 100644 app/boards/kinesis/adv360pro/Kconfig.adv360pro_left create mode 100644 app/boards/kinesis/adv360pro/Kconfig.adv360pro_right rename app/boards/{arm => kinesis}/adv360pro/Kconfig.defconfig (100%) rename app/boards/{arm => kinesis}/adv360pro/README.md (100%) rename app/boards/{arm => kinesis}/adv360pro/adv360pro-layouts.dtsi (100%) rename app/boards/{arm => kinesis}/adv360pro/adv360pro-pinctrl.dtsi (100%) rename app/boards/{arm => kinesis}/adv360pro/adv360pro.dtsi (97%) rename app/boards/{arm => kinesis}/adv360pro/adv360pro.keymap (100%) rename app/boards/{arm => kinesis}/adv360pro/adv360pro.yaml (100%) rename app/boards/{arm => kinesis}/adv360pro/adv360pro.zmk.yml (100%) rename app/boards/{arm => kinesis}/adv360pro/adv360pro_left.dts (100%) rename app/boards/{arm => kinesis}/adv360pro/adv360pro_left_defconfig (90%) rename app/boards/{arm => kinesis}/adv360pro/adv360pro_right.dts (100%) rename app/boards/{arm => kinesis}/adv360pro/adv360pro_right_defconfig (90%) rename app/boards/{arm => kinesis}/adv360pro/board.cmake (100%) create mode 100644 app/boards/kinesis/adv360pro/board.yml rename app/boards/{arm/ckp => kinesis/adv360pro}/pre_dt_board.cmake (100%) rename app/boards/{arm => lowprokb}/corneish_zen/CMakeLists.txt (100%) create mode 100644 app/boards/lowprokb/corneish_zen/Kconfig.corneish_zen_left create mode 100644 app/boards/lowprokb/corneish_zen/Kconfig.corneish_zen_right rename app/boards/{arm => lowprokb}/corneish_zen/Kconfig.defconfig (88%) rename app/boards/{arm/ckp => lowprokb/corneish_zen}/board.cmake (100%) create mode 100644 app/boards/lowprokb/corneish_zen/board.yml rename app/boards/{arm => lowprokb}/corneish_zen/corneish_zen.conf (100%) rename app/boards/{arm => lowprokb}/corneish_zen/corneish_zen.dtsi (98%) rename app/boards/{arm => lowprokb}/corneish_zen/corneish_zen.keymap (100%) rename app/boards/{arm => lowprokb}/corneish_zen/corneish_zen.yaml (90%) rename app/boards/{arm/corneish_zen/corneish_zen_v1.zmk.yml => lowprokb/corneish_zen/corneish_zen.zmk.yml} (62%) create mode 100644 app/boards/lowprokb/corneish_zen/corneish_zen_left.dts rename app/boards/{arm/corneish_zen/corneish_zen_v1_left.dts => lowprokb/corneish_zen/corneish_zen_left_1_0_0.overlay} (99%) rename app/boards/{arm/corneish_zen/corneish_zen_v1_left_defconfig => lowprokb/corneish_zen/corneish_zen_left_1_0_0_defconfig} (92%) rename app/boards/{arm/corneish_zen/corneish_zen_v2_left.dts => lowprokb/corneish_zen/corneish_zen_left_2_0_0.overlay} (98%) rename app/boards/{arm/corneish_zen/corneish_zen_v2_left_defconfig => lowprokb/corneish_zen/corneish_zen_left_2_0_0_defconfig} (92%) create mode 100644 app/boards/lowprokb/corneish_zen/corneish_zen_right.dts rename app/boards/{arm/corneish_zen/corneish_zen_v1_right.dts => lowprokb/corneish_zen/corneish_zen_right_1_0_0.overlay} (99%) rename app/boards/{arm/corneish_zen/corneish_zen_v1_right_defconfig => lowprokb/corneish_zen/corneish_zen_right_1_0_0_defconfig} (92%) rename app/boards/{arm/corneish_zen/corneish_zen_v2_right.dts => lowprokb/corneish_zen/corneish_zen_right_2_0_0.overlay} (98%) rename app/boards/{arm/corneish_zen/corneish_zen_v2_right_defconfig => lowprokb/corneish_zen/corneish_zen_right_2_0_0_defconfig} (92%) rename app/boards/{arm => lowprokb}/corneish_zen/custom_status_screen.c (92%) rename app/boards/{arm => lowprokb}/corneish_zen/custom_status_screen.h (100%) rename app/boards/{arm => lowprokb}/corneish_zen/pre_dt_board.cmake (100%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/battery_status.c (83%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/battery_status.h (100%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/CMakeLists.txt (100%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/USB_connected.c (84%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/batt_0.c (85%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/batt_0_chg.c (85%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/batt_100.c (85%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/batt_100_chg.c (85%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/batt_25.c (85%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/batt_25_chg.c (85%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/batt_5.c (85%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/batt_50.c (85%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/batt_50_chg.c (85%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/batt_5_chg.c (85%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/batt_75.c (85%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/batt_75_chg.c (85%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/bluetooth_advertising.c (83%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/bluetooth_advertising_1.c (88%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/bluetooth_advertising_2.c (88%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/bluetooth_advertising_3.c (88%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/bluetooth_advertising_4.c (88%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/bluetooth_advertising_5.c (88%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/bluetooth_connected_1.c (88%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/bluetooth_connected_2.c (88%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/bluetooth_connected_3.c (88%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/bluetooth_connected_4.c (88%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/bluetooth_connected_5.c (88%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/bluetooth_connected_right.c (88%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/bluetooth_disconnected_right.c (88%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/layers.c (86%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/layers2.c (83%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/icons/zenlogo.c (92%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/layer_status.c (100%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/layer_status.h (100%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/output_status.c (81%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/output_status.h (100%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/peripheral_status.c (91%) rename app/boards/{arm => lowprokb}/corneish_zen/widgets/peripheral_status.h (100%) rename app/boards/{arm => makerdiary}/nrf52840_m2/Kconfig (100%) rename app/boards/{arm => makerdiary}/nrf52840_m2/Kconfig.defconfig (85%) create mode 100644 app/boards/makerdiary/nrf52840_m2/Kconfig.nrf52840_m2 rename app/boards/{arm => makerdiary}/nrf52840_m2/board.cmake (100%) create mode 100644 app/boards/makerdiary/nrf52840_m2/board.yml rename app/boards/{arm => makerdiary}/nrf52840_m2/nrf52840_m2.dts (97%) rename app/boards/{arm => makerdiary}/nrf52840_m2/nrf52840_m2.yaml (100%) rename app/boards/{arm => makerdiary}/nrf52840_m2/nrf52840_m2.zmk.yml (100%) rename app/boards/{arm => makerdiary}/nrf52840_m2/nrf52840_m2_defconfig (81%) rename app/boards/{arm/glove80 => makerdiary/nrf52840_m2}/pre_dt_board.cmake (100%) rename app/boards/{arm => mechwild}/pillbug/Kconfig (100%) rename app/boards/{arm => mechwild}/pillbug/Kconfig.defconfig (86%) create mode 100644 app/boards/mechwild/pillbug/Kconfig.pillbug rename app/boards/{arm => mechwild}/pillbug/blackpill_pins.dtsi (100%) rename app/boards/{arm => mechwild}/pillbug/board.cmake (100%) create mode 100644 app/boards/mechwild/pillbug/board.yml rename app/boards/{arm => mechwild}/pillbug/pillbug-pinctrl.dtsi (100%) rename app/boards/{arm => mechwild}/pillbug/pillbug.dts (97%) rename app/boards/{arm => mechwild}/pillbug/pillbug.yaml (100%) rename app/boards/{arm => mechwild}/pillbug/pillbug.zmk.yml (100%) rename app/boards/{arm => mechwild}/pillbug/pillbug_defconfig (83%) rename app/boards/{arm/mikoto => mechwild/pillbug}/pre_dt_board.cmake (100%) rename app/boards/{arm => mechwild}/s40nc/Kconfig.defconfig (100%) create mode 100644 app/boards/mechwild/s40nc/Kconfig.s40nc rename app/boards/{arm => mechwild}/s40nc/README.md (100%) rename app/boards/{arm => mechwild}/s40nc/board.cmake (100%) create mode 100644 app/boards/mechwild/s40nc/board.yml rename app/boards/{arm/nice60 => mechwild/s40nc}/pre_dt_board.cmake (100%) rename app/boards/{arm => mechwild}/s40nc/s40nc.dts (98%) rename app/boards/{arm => mechwild}/s40nc/s40nc.keymap (100%) rename app/boards/{arm => mechwild}/s40nc/s40nc.yaml (100%) rename app/boards/{arm => mechwild}/s40nc/s40nc.zmk.yml (100%) rename app/boards/{arm => mechwild}/s40nc/s40nc_defconfig (82%) rename app/boards/{arm => moergo}/glove80/CMakeLists.txt (100%) rename app/boards/{arm => moergo}/glove80/Kconfig.defconfig (86%) create mode 100644 app/boards/moergo/glove80/Kconfig.glove80_lh create mode 100644 app/boards/moergo/glove80/Kconfig.glove80_rh rename app/boards/{arm => moergo}/glove80/board.cmake (100%) create mode 100644 app/boards/moergo/glove80/board.yml rename app/boards/{arm => moergo}/glove80/glove80-layouts.dtsi (100%) rename app/boards/{arm => moergo}/glove80/glove80.dtsi (96%) rename app/boards/{arm => moergo}/glove80/glove80.keymap (100%) rename app/boards/{arm => moergo}/glove80/glove80.yaml (100%) rename app/boards/{arm => moergo}/glove80/glove80.zmk.yml (100%) rename app/boards/{arm => moergo}/glove80/glove80_lh-pinctrl.dtsi (100%) rename app/boards/{arm => moergo}/glove80/glove80_lh.dts (100%) rename app/boards/{arm => moergo}/glove80/glove80_lh.keymap (100%) rename app/boards/{arm => moergo}/glove80/glove80_lh_defconfig (96%) rename app/boards/{arm => moergo}/glove80/glove80_rh-pinctrl.dtsi (100%) rename app/boards/{arm => moergo}/glove80/glove80_rh.dts (100%) rename app/boards/{arm => moergo}/glove80/glove80_rh.keymap (100%) rename app/boards/{arm => moergo}/glove80/glove80_rh_defconfig (96%) rename app/boards/{arm/nice_nano => moergo/glove80}/pre_dt_board.cmake (100%) rename app/boards/{arm => moergo}/glove80/readme.md (100%) rename app/boards/{arm => moergo}/glove80/usb_serial_number.c (100%) delete mode 100644 app/boards/native_posix.conf delete mode 100644 app/boards/native_posix.overlay rename app/boards/{arm => nicekeyboards}/nice60/Kconfig (100%) rename app/boards/{arm => nicekeyboards}/nice60/Kconfig.defconfig (100%) create mode 100644 app/boards/nicekeyboards/nice60/Kconfig.nice60 rename app/boards/{arm => nicekeyboards}/nice60/README.md (100%) rename app/boards/{arm => nicekeyboards}/nice60/board.cmake (100%) create mode 100644 app/boards/nicekeyboards/nice60/board.yml rename app/boards/{arm => nicekeyboards}/nice60/nice60-pinctrl.dtsi (100%) rename app/boards/{arm => nicekeyboards}/nice60/nice60.dts (97%) rename app/boards/{arm => nicekeyboards}/nice60/nice60.keymap (100%) rename app/boards/{arm => nicekeyboards}/nice60/nice60.yaml (100%) rename app/boards/{arm => nicekeyboards}/nice60/nice60.zmk.yml (100%) rename app/boards/{arm => nicekeyboards}/nice60/nice60_defconfig (79%) rename app/boards/{arm/nrf52840_m2 => nicekeyboards/nice60}/pre_dt_board.cmake (100%) create mode 100644 app/boards/nicekeyboards/nice_nano/Kconfig.nice_nano rename app/boards/{arm => nicekeyboards}/nice_nano/arduino_pro_micro_pins.dtsi (100%) rename app/boards/{arm/corneish_zen => nicekeyboards/nice_nano}/board.cmake (100%) create mode 100644 app/boards/nicekeyboards/nice_nano/board.yml rename app/boards/{arm => nicekeyboards}/nice_nano/nice_nano-pinctrl.dtsi (100%) rename app/boards/{arm/nice_nano/nice_nano.dtsi => nicekeyboards/nice_nano/nice_nano.dts} (94%) rename app/boards/{arm => nicekeyboards}/nice_nano/nice_nano.yaml (100%) rename app/boards/{arm => nicekeyboards}/nice_nano/nice_nano.zmk.yml (64%) rename app/boards/{arm/nice_nano/nice_nano.dts => nicekeyboards/nice_nano/nice_nano_1_0_0.overlay} (85%) rename app/boards/{arm/nice_nano/nice_nano_defconfig => nicekeyboards/nice_nano/nice_nano_1_0_0_defconfig} (81%) rename app/boards/{arm/nice_nano/nice_nano_v2.dts => nicekeyboards/nice_nano/nice_nano_2_0_0.overlay} (92%) rename app/boards/{arm/nice_nano/nice_nano_v2_defconfig => nicekeyboards/nice_nano/nice_nano_2_0_0_defconfig} (76%) rename app/boards/{arm/nrfmicro => nicekeyboards/nice_nano}/pre_dt_board.cmake (100%) rename app/boards/{arm => nordic}/nrf52840dk_nrf52840/nrf52840dk_nrf52840.zmk.yml (88%) rename app/boards/{arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml.disabled => nordic/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml} (86%) rename app/boards/{arm => olkb}/planck/CMakeLists.txt (100%) rename app/boards/{arm => olkb}/planck/Kconfig.defconfig (100%) rename app/boards/{arm/planck/Kconfig.board => olkb/planck/Kconfig.planck} (55%) rename app/boards/{arm => olkb}/planck/board.cmake (100%) create mode 100644 app/boards/olkb/planck/board.yml rename app/boards/{arm/planck/planck_rev6.dts => olkb/planck/planck.dts} (100%) rename app/boards/{arm/planck/planck_rev6.keymap => olkb/planck/planck.keymap} (100%) rename app/boards/{arm/planck/planck_rev6.yaml => olkb/planck/planck.yaml} (100%) rename app/boards/{arm/planck/planck_rev6.zmk.yml => olkb/planck/planck.zmk.yml} (61%) rename app/boards/{arm/planck/planck_rev6_defconfig => olkb/planck/planck_6_0_0_defconfig} (85%) rename app/boards/{arm => olkb}/preonic/CMakeLists.txt (100%) rename app/boards/{arm => olkb}/preonic/Kconfig.defconfig (80%) rename app/boards/{arm/preonic/Kconfig.board => olkb/preonic/Kconfig.preonic} (55%) rename app/boards/{arm => olkb}/preonic/board.cmake (100%) create mode 100644 app/boards/olkb/preonic/board.yml rename app/boards/{arm/preonic/preonic_rev3.dts => olkb/preonic/preonic.dts} (100%) rename app/boards/{arm/preonic/preonic_rev3.keymap => olkb/preonic/preonic.keymap} (100%) rename app/boards/{arm/preonic/preonic_rev3.yaml => olkb/preonic/preonic.yaml} (100%) rename app/boards/{arm/preonic/preonic_rev3.zmk.yml => olkb/preonic/preonic.zmk.yml} (69%) rename app/boards/{arm/preonic/preonic_rev3_defconfig => olkb/preonic/preonic_defconfig} (74%) rename app/boards/{arm => pierrechevalier83}/ferris/Kconfig.defconfig (85%) create mode 100644 app/boards/pierrechevalier83/ferris/Kconfig.ferris rename app/boards/{arm => pierrechevalier83}/ferris/README.md (79%) rename app/boards/{arm => pierrechevalier83}/ferris/board.cmake (100%) create mode 100644 app/boards/pierrechevalier83/ferris/board.yml rename app/boards/{arm/ferris/ferris_rev02.dts => pierrechevalier83/ferris/ferris.dts} (85%) rename app/boards/{arm/ferris/ferris_rev02.keymap => pierrechevalier83/ferris/ferris.keymap} (100%) rename app/boards/{arm/ferris/ferris_rev02.yaml => pierrechevalier83/ferris/ferris.yaml} (83%) rename app/boards/{arm/ferris/ferris_rev02.zmk.yml => pierrechevalier83/ferris/ferris.zmk.yml} (90%) rename app/boards/{arm/ferris/ferris_rev02_defconfig => pierrechevalier83/ferris/ferris_defconfig} (84%) create mode 100644 app/boards/polarityworks/bt60/Kconfig.bt60 create mode 100644 app/boards/polarityworks/bt60/Kconfig.bt60_hs create mode 100644 app/boards/polarityworks/bt60/Kconfig.defconfig rename app/boards/{arm/mikoto => polarityworks/bt60}/board.cmake (100%) create mode 100644 app/boards/polarityworks/bt60/board.yml rename app/boards/{arm/bt60/bt60.dtsi => polarityworks/bt60/bt60.dts} (65%) rename app/boards/{arm/ckp/bt60_v2.yaml => polarityworks/bt60/bt60.yaml} (88%) rename app/boards/{arm/ckp/bt60_v2.zmk.yml => polarityworks/bt60/bt60.zmk.yml} (82%) create mode 100644 app/boards/polarityworks/bt60/bt60_1_0_0.dtsi rename app/boards/{arm/bt60/bt60_v1.keymap => polarityworks/bt60/bt60_1_0_0.keymap} (99%) rename app/boards/{arm/bt60/bt60_v1.dts => polarityworks/bt60/bt60_1_0_0.overlay} (99%) rename app/boards/{arm/bt60/bt60_v1_defconfig => polarityworks/bt60/bt60_1_0_0_defconfig} (79%) rename app/boards/{arm/ckp/bt60_v2.keymap => polarityworks/bt60/bt60_2_0_0.keymap} (99%) rename app/boards/{arm/ckp/bt60_v2.dts => polarityworks/bt60/bt60_2_0_0.overlay} (98%) rename app/boards/{arm/ckp/bt60_v2_defconfig => polarityworks/bt60/bt60_2_0_0_defconfig} (84%) rename app/boards/{arm/bt60/bt60_v1_hs.dts => polarityworks/bt60/bt60_hs.dts} (97%) rename app/boards/{arm/bt60/bt60_v1_hs.keymap => polarityworks/bt60/bt60_hs.keymap} (100%) rename app/boards/{arm/bt60/bt60_v1_hs.zmk.yml => polarityworks/bt60/bt60_hs.zmk.yml} (91%) rename app/boards/{arm/bt60/bt60_v1_hs_defconfig => polarityworks/bt60/bt60_hs_defconfig} (78%) rename app/boards/{arm/pillbug => polarityworks/bt60}/pre_dt_board.cmake (100%) create mode 100644 app/boards/polarityworks/bt65/Kconfig.bt65 rename app/boards/{arm/bt60 => polarityworks/bt65}/Kconfig.defconfig (55%) rename app/boards/{arm/nice_nano => polarityworks/bt65}/board.cmake (100%) create mode 100644 app/boards/polarityworks/bt65/board.yml rename app/boards/{arm/ckp/bt65_v1.dts => polarityworks/bt65/bt65.dts} (95%) rename app/boards/{arm/ckp/bt65_v1.keymap => polarityworks/bt65/bt65.keymap} (99%) rename app/boards/{arm/ckp/bt65_v1.yaml => polarityworks/bt65/bt65.yaml} (88%) rename app/boards/{arm/ckp/bt65_v1.zmk.yml => polarityworks/bt65/bt65.zmk.yml} (93%) rename app/boards/{arm/ckp/bt75_v1_defconfig => polarityworks/bt65/bt65_defconfig} (82%) rename app/boards/{arm/puchi_ble => polarityworks/bt65}/pre_dt_board.cmake (100%) create mode 100644 app/boards/polarityworks/bt75/Kconfig.bt75 create mode 100644 app/boards/polarityworks/bt75/Kconfig.defconfig rename app/boards/{arm/nrfmicro => polarityworks/bt75}/board.cmake (100%) create mode 100644 app/boards/polarityworks/bt75/board.yml rename app/boards/{arm/ckp/bt75_v1.dts => polarityworks/bt75/bt75.dts} (94%) rename app/boards/{arm/ckp/bt75_v1.keymap => polarityworks/bt75/bt75.keymap} (99%) rename app/boards/{arm/ckp/bt75_v1.yaml => polarityworks/bt75/bt75.yaml} (88%) rename app/boards/{arm/ckp/bt75_v1.zmk.yml => polarityworks/bt75/bt75.zmk.yml} (93%) rename app/boards/{arm/ckp/bt65_v1_defconfig => polarityworks/bt75/bt75_defconfig} (82%) rename app/boards/{arm/s40nc => polarityworks/bt75}/pre_dt_board.cmake (100%) create mode 100644 app/boards/polarityworks/common/ckp-base.dtsi rename app/boards/{arm/ckp => polarityworks/common}/ckp-pinctrl.dtsi (100%) rename app/boards/{arm/ckp => polarityworks/common}/ckp.dtsi (78%) create mode 100644 app/boards/post_boards_shields.cmake create mode 100644 app/boards/qmk/proton_c/Kconfig.proton_c rename app/boards/{arm => qmk}/proton_c/arduino_pro_micro_pins.dtsi (100%) rename app/boards/{arm/dz60rgb => qmk/proton_c}/board.cmake (100%) create mode 100644 app/boards/qmk/proton_c/board.yml rename app/boards/{arm => qmk}/proton_c/proton_c.dts (100%) rename app/boards/{arm => qmk}/proton_c/proton_c.yaml (100%) rename app/boards/{arm => qmk}/proton_c/proton_c.zmk.yml (100%) rename app/boards/{arm => qmk}/proton_c/proton_c_defconfig (82%) rename app/boards/{arm => seeed}/seeeduino_xiao/seeeduino_xiao.zmk.yml (100%) rename app/boards/{arm/seeeduino_xiao_ble/seeeduino_xiao_ble.zmk.yml => seeed/xiao_ble/xiao_ble.zmk.yml} (87%) rename app/boards/{arm/seeeduino_xiao_rp2040/seeeduino_xiao_rp2040.zmk.yml => seeed/xiao_rp2040/xiao_rp2040.zmk.yml} (85%) delete mode 100644 app/boards/shields/chalice/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/corne/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/elephant42/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/helix/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/jorne/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/kyria/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/leeloo/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/leeloo_micro/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/lily58/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/microdox/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/murphpad/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/nibble/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/redox/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/reviung34/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/reviung41/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/reviung5/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/reviung53/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/romac_plus/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/snap/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/sofle/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/splitkb_aurora_helix/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/splitkb_aurora_sofle/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/tg4x/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/tidbit/boards/nice_nano_v2.overlay delete mode 100644 app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay rename app/boards/{arm/sparkfun_pro_micro_rp2040 => sparkfun/pro_micro_rp2040}/sparkfun_pro_micro_rp2040.zmk.yml (100%) rename app/boards/{arm => weact}/blackpill_f401cc/blackpill_f401cc.zmk.yml (100%) rename app/boards/{arm => weact}/blackpill_f401ce/blackpill_f401ce.zmk.yml (100%) rename app/boards/{arm => weact}/blackpill_f411ce/blackpill_f411ce.zmk.yml (100%) rename app/boards/{arm/puchi_ble => zhiayang/mikoto}/CMakeLists.txt (100%) rename app/boards/{arm => zhiayang}/mikoto/Kconfig (74%) rename app/boards/{arm => zhiayang}/mikoto/Kconfig.defconfig (91%) create mode 100644 app/boards/zhiayang/mikoto/Kconfig.mikoto rename app/boards/{arm => zhiayang}/mikoto/arduino_pro_micro_pins_v5.dtsi (100%) rename app/boards/{arm => zhiayang}/mikoto/arduino_pro_micro_pins_v6.dtsi (100%) create mode 100644 app/boards/zhiayang/mikoto/board.cmake create mode 100644 app/boards/zhiayang/mikoto/board.yml rename app/boards/{arm => zhiayang}/mikoto/mikoto-pinctrl.dtsi (100%) rename app/boards/{arm => zhiayang}/mikoto/mikoto.dts (95%) rename app/boards/{arm => zhiayang}/mikoto/mikoto.yaml (100%) rename app/boards/{arm => zhiayang}/mikoto/mikoto.zmk.yml (100%) rename app/boards/{arm => zhiayang}/mikoto/mikoto_5_20_0.overlay (100%) rename app/boards/{arm => zhiayang}/mikoto/mikoto_6_1_0.overlay (100%) rename app/boards/{arm => zhiayang}/mikoto/mikoto_7_2_0.conf (100%) rename app/boards/{arm => zhiayang}/mikoto/mikoto_7_2_0.overlay (100%) rename app/boards/{arm => zhiayang}/mikoto/mikoto_defconfig (80%) rename app/boards/{arm => zhiayang}/mikoto/pinmux.c (100%) create mode 100644 app/boards/zhiayang/mikoto/pre_dt_board.cmake create mode 100644 app/dts/bindings/retained_mem/zmk,bootmode-to-magic-mapper.yaml create mode 100644 app/dts/common/nordic/nrf52840_uf2_boot_mode.dtsi create mode 100644 app/src/boot/CMakeLists.txt create mode 100644 app/src/boot/Kconfig create mode 100644 app/src/boot/Kconfig.defaults create mode 100644 app/src/boot/bootmode_to_magic_mapper.c create mode 100644 app/src/boot/dbl_tap_bootloader.c rename app/tests/backlight/basic/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/backlight/basic/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/backlight/config-brt/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/backlight/config-brt/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/backlight/config-on/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/backlight/config-on/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/backlight/config-step/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/backlight/config-step/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/backlight/cycle/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/backlight/cycle/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/backlight/low-brightness/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/backlight/low-brightness/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/caps-word/continue-with-modifiers/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/caps-word/continue-with-non-alpha-continue-list-item/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/caps-word/continue-with-non-modified-numeric-usage-id/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/caps-word/deactivate-by-non-alpha-non-continuation/{native_posix_64.keymap => native_sim.keymap} (100%) delete mode 100644 app/tests/caps-word/deactivate-by-second-press/native_posix.keymap rename app/tests/caps-word/deactivate-by-second-press/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/combo/combos-and-holdtaps-0/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/combo/combos-and-holdtaps-1/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/combo/combos-and-holdtaps-2/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/combo/combos-and-holdtaps-3/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/combo/combos-and-holdtaps-4/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/combo/layer-filter-0/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/combo/layer-filter-1/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/combo/multiple-timeouts/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/combo/overlapping-combos-0/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/combo/overlapping-combos-1/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/combo/overlapping-combos-2/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/combo/overlapping-combos-3/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/combo/overlapping-combos-4-different-timeouts/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/combo/partially-overlapping-combos/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/combo/press-release-long-combo-complete/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/combo/press-release-long-combo-incomplete/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/combo/press-release-long-combo-wrong-last-key/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/combo/press-release/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/combo/press-timeout/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/combo/press1-press2-release1-release2/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/combo/press1-press2-release2-release1/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/combo/press1-release1-press2-release2/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/combo/require-prior-idle/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/combo/slowrelease-disabled/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/combo/slowrelease-enabled/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/conditional-layer/chained-activation/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/conditional-layer/mo-overlap/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/conditional-layer/multiple-configs/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/conditional-layer/quad-layer/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/conditional-layer/same-layer-reached-both-ways/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/conditional-layer/same-layer-reached-differently/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/conditional-layer/tri-layer-alt-order/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/conditional-layer/tri-layer-lt/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/conditional-layer/tri-layer/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/encoders/layers-1/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/encoders/layers-2/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/encoders/rotate/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/gresc/gresc-press-release/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/gresc/gresc-two-instances/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/balanced/1-dn-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/balanced/2-dn-timer-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/balanced/5-quick-tap/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/balanced/6-retro-tap/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/balanced/7-positional/on-release-trigger/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/balanced/8-require-prior-idle/1-basic/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/balanced/8-require-prior-idle/2-double-hold/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/balanced/many-nested/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/hold-preferred/1-dn-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/hold-preferred/2-dn-timer-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/hold-preferred/5-quick-tap/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/hold-preferred/6-retro-tap/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/hold-preferred/8-require-prior-idle/1-basic/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/hold-preferred/8-require-prior-idle/2-double-hold/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/hold-while-undecided/1-tap/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/hold-while-undecided/2-hold/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/hold-while-undecided/3-linger/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/hold-while-undecided/4-linger-sk/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-preferred/1-dn-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-preferred/2-dn-timer-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-preferred/5-quick-tap/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-preferred/6-nested-timeouts/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-preferred/8-require-prior-idle/1-basic/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-preferred/8-require-prior-idle/2-double-hold/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-unless-interrupted/1-dn-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/1-basic/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/2-double-hold/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/key-repeat/ignore-other-usage-page-events/{native_posix_64.keymap => native_sim.keymap} (100%) delete mode 100644 app/tests/key-repeat/press-and-release-after-key-usage/native_posix.keymap rename app/tests/key-repeat/press-and-release-after-key-usage/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/key-repeat/press-and-release-with-explicit-modifiers/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet/{native_posix_64.keymap => native_sim.keymap} (100%) delete mode 100644 app/tests/key-repeat/tap-when-rolling/native_posix.keymap rename app/tests/key-repeat/tap-when-rolling/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/keypress/kp-press-release/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/keytoggle/kt-alt-tab/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/keytoggle/kt-modded-alpha/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/keytoggle/kt-off/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/keytoggle/kt-on/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/keytoggle/kt-press-release-nkro/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/keytoggle/kt-press-release-nkro/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/keytoggle/kt-press-release/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/macros/basic/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/macros/mo-plus-modifier-from-hold-tap/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/macros/mo-plus-modifier-macro/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/macros/place-holder-parameters/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/macros/press-mid-macro/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/macros/press-release/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/macros/timing-override/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/macros/wait-macro-release/{native_posix_64.keymap => native_sim.keymap} (100%) create mode 100644 app/tests/matrix-input/kp-press-release/events.patterns create mode 100644 app/tests/matrix-input/kp-press-release/keycode_events.snapshot create mode 100644 app/tests/matrix-input/kp-press-release/native_sim.conf create mode 100644 app/tests/matrix-input/kp-press-release/native_sim.keymap rename app/tests/mod-morph/1-no-morph/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/mod-morph/2a-masked-morph/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/mod-morph/2b-masked-morph-implicit-overwrite/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/mod-morph/2c-masked-morph-and-explicit-mods/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/mod-morph/3-unmasked-morph/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/modifiers/implicit/kp-rolling-symbols-same-key/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/momentary-layer/1-normal/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/momentary-layer/2-early-key-release/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/momentary-layer/3-covered/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/momentary-layer/4-nested/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/momentary-layer/5-nested-early-key-release/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/none/layered/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/none/normal/{native_posix.keymap => native_sim.keymap} (100%) delete mode 100644 app/tests/pointing/mkp/native_posix_64.keymap rename app/tests/pointing/mkp/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/pointing/mkp/{native_posix.keymap => native_sim.keymap} (100%) rename app/tests/pointing/mouse-move/move_diagonal/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/pointing/mouse-move/move_diagonal/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/pointing/mouse-move/move_x/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/pointing/mouse-move/move_x/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/pointing/mouse-move/move_y/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/pointing/mouse-move/move_y/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/pointing/mouse-move/processors/behaviors_basic/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/pointing/mouse-move/processors/behaviors_basic/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/pointing/mouse-move/processors/behaviors_hold_tap/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/pointing/mouse-move/processors/behaviors_hold_tap/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/pointing/mouse-move/processors/move_diagonal_scaling/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/pointing/mouse-move/processors/move_diagonal_scaling/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/pointing/mouse-move/processors/move_diagonal_xy_invert/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/pointing/mouse-move/processors/move_diagonal_xy_invert/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/pointing/mouse-move/processors/move_diagonal_xy_swap/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/pointing/mouse-move/processors/move_diagonal_xy_swap/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/pointing/mouse-move/processors/temp_layer/1-deactivate-layer-timeout/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/pointing/mouse-move/processors/temp_layer/1-deactivate-layer-timeout/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/pointing/mouse-move/processors/temp_layer/2a-deactivate-layer-position-trigger/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/pointing/mouse-move/processors/temp_layer/2a-deactivate-layer-position-trigger/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/pointing/mouse-move/processors/temp_layer/2b-deactivate-layer-position-not-trigger/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/pointing/mouse-move/processors/temp_layer/2b-deactivate-layer-position-not-trigger/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/pointing/mouse-move/processors/temp_layer/3-require-prior-idle-ms/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/pointing/mouse-move/processors/temp_layer/3-require-prior-idle-ms/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/pointing/mouse-move/processors/temp_layer/4-deactivated-layer-externally/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/pointing/mouse-move/processors/temp_layer/4-deactivated-layer-externally/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/pointing/mouse-scroll/move_diagonal/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/pointing/mouse-scroll/move_diagonal/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/pointing/mouse-scroll/move_hwheel/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/pointing/mouse-scroll/move_hwheel/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/pointing/mouse-scroll/move_wheel/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/pointing/mouse-scroll/move_wheel/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/pointing/mouse-scroll/processors/move_diagonal_xy_invert/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/pointing/mouse-scroll/processors/move_diagonal_xy_invert/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/sticky-keys/1-os-dn-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/sticky-keys/10-callum-mods-quick-release/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/sticky-keys/10-callum-mods/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/sticky-keys/10-sl-sl-kp/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/sticky-keys/11-lazy-timeout-during/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/sticky-keys/11-lazy-timeout/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/sticky-keys/11-lazy/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/sticky-keys/12-macro/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/sticky-keys/12-same-position-mods/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/sticky-keys/12-same-position-sk-sl/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/sticky-keys/8-lsk-osk-combination-quick-release/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/sticky-keys/8-lsk-osk-combination/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/sticky-keys/9-sk-dn-up-dn-up/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/tap-dance/1a-tap1/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/tap-dance/1b-tap2/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/tap-dance/1c-tap3/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/tap-dance/2a-hold1/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/tap-dance/2b-hold2/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/tap-dance/2c-hold3/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/tap-dance/3a-tap-int-mid/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/tap-dance/3b-tap-int-seq/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/tap-dance/3c-tap-int-after/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/tap-dance/3d-hold-int-mid/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/tap-dance/3e-hold-int-seq/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/tap-dance/3f-hold-int-after/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/tap-dance/4a-single/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/tap-dance/5a-tdint-mid/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/tap-dance/5b-tdint-seq/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/tap-dance/5c-tdint-after/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/tap-dance/5d-tdint-multiple/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/tap-dance/6-combo-tap2/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/to-layer/normal/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/toggle-layer/early-key-release/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/toggle-layer/normal/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/toggle-layer/toggle-mode-off/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/toggle-layer/toggle-mode-on/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/transparent/layered/{native_posix_64.keymap => native_sim.keymap} (100%) delete mode 100644 app/tests/transparent/normal/native_posix_64.keymap rename app/tests/{none/normal/native_posix_64.keymap => transparent/normal/native_sim.keymap} (100%) rename app/tests/wpm/1-single_keypress/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/wpm/1-single_keypress/{native_posix_64.keymap => native_sim.keymap} (100%) rename app/tests/wpm/2-multiple_keypress/{native_posix_64.conf => native_sim.conf} (100%) rename app/tests/wpm/2-multiple_keypress/{native_posix_64.keymap => native_sim.keymap} (100%) create mode 100644 docs/blog/2025-xx-xx-zephyr-4-1.md create mode 100644 docs/docs/development/hardware-integration/bootloader/_base-config.md create mode 100644 docs/docs/development/hardware-integration/bootloader/adafruit-nrf52.mdx create mode 100644 docs/docs/development/hardware-integration/bootloader/index.mdx create mode 100644 docs/docs/development/hardware-integration/bootloader/rp2.mdx create mode 100644 docs/docs/development/hardware-integration/bootloader/samd21-uf2.mdx create mode 100644 docs/docs/development/hardware-integration/bootloader/stm32.mdx create mode 100644 docs/docs/development/hardware-integration/bootloader/tinyuf2.mdx diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 5e123bd59e4..7e81e779d81 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/zmkfirmware/zmk-dev-arm:3.5 +FROM docker.io/zmkfirmware/zmk-dev-arm:4.1-branch COPY .bashrc tmp RUN mv /tmp/.bashrc ~/.bashrc diff --git a/.github/workflows/ble-test.yml b/.github/workflows/ble-test.yml index 7d76fb9e9d3..981fffd59df 100644 --- a/.github/workflows/ble-test.yml +++ b/.github/workflows/ble-test.yml @@ -35,7 +35,7 @@ jobs: test: ${{ fromJSON(needs.collect-tests.outputs.test-dirs) }} runs-on: ubuntu-latest container: - image: docker.io/zmkfirmware/zmk-build-arm:3.5 + image: docker.io/zmkfirmware/zmk-build-arm:4.1 steps: - name: Checkout uses: actions/checkout@v4 diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index cf3247d04e0..4d4e885ad17 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -57,7 +57,7 @@ jobs: echo "build_dir=$(mktemp -d)" >> $GITHUB_ENV - name: Prepare variables - shell: sh -x {0} + shell: bash -x {0} env: board: ${{ matrix.board }} shield: ${{ matrix.shield }} @@ -81,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: | diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3307b006aa9..32e084cbbed 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,7 +23,7 @@ jobs: if: ${{ always() }} runs-on: ubuntu-latest container: - image: docker.io/zmkfirmware/zmk-build-arm:3.5 + image: docker.io/zmkfirmware/zmk-build-arm:4.1 needs: compile-matrix strategy: matrix: @@ -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`; + const artifactName = `${{ matrix.board }}${shieldArgs.shield ? '-' + shieldArgs.shield : ''}${cmakeName}-zmk`.replaceAll('/', '_'); await artifact.uploadArtifact(artifactName, files, rootDirectory, options); } catch (e) { diff --git a/.github/workflows/hardware-metadata-validation.yml b/.github/workflows/hardware-metadata-validation.yml index 3e3faa0dfc3..c5fcd4a4d25 100644 --- a/.github/workflows/hardware-metadata-validation.yml +++ b/.github/workflows/hardware-metadata-validation.yml @@ -18,7 +18,7 @@ jobs: validate-metadata: runs-on: ubuntu-latest container: - image: docker.io/zmkfirmware/zmk-dev-arm:3.5 + image: docker.io/zmkfirmware/zmk-dev-arm:4.1 steps: - uses: actions/checkout@v4 - name: Install dependencies diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 93321760ef8..cf7d2912120 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -37,7 +37,7 @@ jobs: test: ${{ fromJSON(needs.collect-tests.outputs.test-dirs) }} runs-on: ubuntu-latest container: - image: docker.io/zmkfirmware/zmk-build-arm:3.5 + image: docker.io/zmkfirmware/zmk-build-arm:4.1 steps: - name: Checkout uses: actions/checkout@v4 @@ -66,7 +66,7 @@ jobs: run: west zephyr-export - name: Test ${{ matrix.test }} working-directory: app - run: west test tests/${{ matrix.test }} + run: ZMK_TESTS_VERBOSE=1 west test tests/${{ matrix.test }} - name: Archive artifacts if: ${{ always() }} uses: actions/upload-artifact@v4 diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 60c502fcd2a..cc38244a4c7 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -23,6 +23,7 @@ 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) diff --git a/app/Kconfig b/app/Kconfig index d5a3bccd16f..770c6ee1c37 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -31,10 +31,10 @@ config BT_DIS_PNP_VID config BT_DIS_PNP_PID default 0x615E -config BT_DIS_MODEL +config BT_DIS_MODEL_NUMBER_STR default ZMK_KEYBOARD_NAME -config BT_DIS_MANUF +config BT_DIS_MANUF_NAME_STR default "ZMK Project" # Hardware specific overrides @@ -131,6 +131,9 @@ config ZMK_USB_BOOT select USB_HID_BOOT_PROTOCOL select USB_DEVICE_SOF +config USB_DEVICE_INITIALIZE_AT_BOOT + default n + if ZMK_USB config USB_NUMOF_EP_WRITE_RETRIES @@ -185,10 +188,6 @@ 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 @@ -475,13 +474,15 @@ endmenu menu "Advanced" +rsource "src/boot/Kconfig" + menu "Initialization Priorities" if USB_DEVICE_STACK config ZMK_USB_INIT_PRIORITY int "USB Init Priority" - default 94 + default 96 config ZMK_USB_HID_INIT_PRIORITY int "USB HID Init Priority" @@ -650,6 +651,13 @@ endmenu # Advanced endmenu # ZMK +if SOC_FAMILY_NORDIC_NRF + +config NRF_SOC_VALIDATE_HEADERS_DISABLED + default y + +endif + config KERNEL_BIN_NAME default "zmk" @@ -684,11 +692,6 @@ 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" @@ -702,8 +705,6 @@ 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 30aaef21080..8800b454f40 100644 --- a/app/Kconfig.defaults +++ b/app/Kconfig.defaults @@ -2,8 +2,8 @@ # SPDX-License-Identifier: MIT config SYSTEM_WORKQUEUE_STACK_SIZE - default 2048 if SOC_RP2040 - default 2048 if ZMK_BLE + default 3072 if ZMK_DISPLAY + default 2048 # Basic config BT_DEVICE_APPEARANCE @@ -114,4 +114,5 @@ config ZMK_BATTERY_REPORT_INTERVAL default 60 # Imports +rsource "src/boot/Kconfig.defaults" rsource "src/split/Kconfig.defaults" diff --git a/app/boards/arm/adafruit_kb2040/adafruit_kb2040.zmk.yml b/app/boards/adafruit/kb2040/adafruit_kb2040.zmk.yml similarity index 100% rename from app/boards/arm/adafruit_kb2040/adafruit_kb2040.zmk.yml rename to app/boards/adafruit/kb2040/adafruit_kb2040.zmk.yml diff --git a/app/boards/arm/adafruit_qt_py_rp2040/adafruit_qt_py_rp2040.zmk.yml b/app/boards/adafruit/qt_py_rp2040/adafruit_qt_py_rp2040.zmk.yml similarity index 100% rename from app/boards/arm/adafruit_qt_py_rp2040/adafruit_qt_py_rp2040.zmk.yml rename to app/boards/adafruit/qt_py_rp2040/adafruit_qt_py_rp2040.zmk.yml diff --git a/app/boards/seeeduino_xiao_rp2040.conf b/app/boards/adafruit_metro_rp2040.conf similarity index 100% rename from app/boards/seeeduino_xiao_rp2040.conf rename to app/boards/adafruit_metro_rp2040.conf diff --git a/app/boards/arm/adv360pro/Kconfig b/app/boards/arm/adv360pro/Kconfig deleted file mode 100644 index 1840851c2bb..00000000000 --- a/app/boards/arm/adv360pro/Kconfig +++ /dev/null @@ -1,7 +0,0 @@ -# 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 deleted file mode 100644 index 51ebaec0791..00000000000 --- a/app/boards/arm/adv360pro/Kconfig.board +++ /dev/null @@ -1,12 +0,0 @@ -# -# 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/arm/bdn9/Kconfig.board b/app/boards/arm/bdn9/Kconfig.board deleted file mode 100644 index 76a204cc41a..00000000000 --- a/app/boards/arm/bdn9/Kconfig.board +++ /dev/null @@ -1,8 +0,0 @@ -# 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/arm/bdn9/bdn9_rev2.yml b/app/boards/arm/bdn9/bdn9_rev2.yml deleted file mode 100644 index 01ebd3e0b5c..00000000000 --- a/app/boards/arm/bdn9/bdn9_rev2.yml +++ /dev/null @@ -1,11 +0,0 @@ -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/arm/bluemicro840/Kconfig.board b/app/boards/arm/bluemicro840/Kconfig.board deleted file mode 100644 index e27940157b2..00000000000 --- a/app/boards/arm/bluemicro840/Kconfig.board +++ /dev/null @@ -1,8 +0,0 @@ -# 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/boards/arm/bt60/Kconfig b/app/boards/arm/bt60/Kconfig deleted file mode 100644 index d57a6b7efe3..00000000000 --- a/app/boards/arm/bt60/Kconfig +++ /dev/null @@ -1,7 +0,0 @@ -# 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 deleted file mode 100644 index 24c0a8b5b0c..00000000000 --- a/app/boards/arm/bt60/Kconfig.board +++ /dev/null @@ -1,12 +0,0 @@ -# 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/arm/bt60/bt60_v1.zmk.yml b/app/boards/arm/bt60/bt60_v1.zmk.yml deleted file mode 100644 index 4c0faf9fd9f..00000000000 --- a/app/boards/arm/bt60/bt60_v1.zmk.yml +++ /dev/null @@ -1,13 +0,0 @@ -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/arm/bt60/bt60_v1_hs.yaml b/app/boards/arm/bt60/bt60_v1_hs.yaml deleted file mode 100644 index 5a73753b5e2..00000000000 --- a/app/boards/arm/bt60/bt60_v1_hs.yaml +++ /dev/null @@ -1,15 +0,0 @@ -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/arm/ckp/Kconfig b/app/boards/arm/ckp/Kconfig deleted file mode 100644 index 7baf1486102..00000000000 --- a/app/boards/arm/ckp/Kconfig +++ /dev/null @@ -1,8 +0,0 @@ -# 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 deleted file mode 100644 index a98a31673f4..00000000000 --- a/app/boards/arm/ckp/Kconfig.board +++ /dev/null @@ -1,16 +0,0 @@ -# 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 deleted file mode 100644 index 376d4619fde..00000000000 --- a/app/boards/arm/ckp/Kconfig.defconfig +++ /dev/null @@ -1,28 +0,0 @@ -# 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/arm/corneish_zen/Kconfig b/app/boards/arm/corneish_zen/Kconfig deleted file mode 100644 index 33d926092ee..00000000000 --- a/app/boards/arm/corneish_zen/Kconfig +++ /dev/null @@ -1,10 +0,0 @@ -# -# 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 deleted file mode 100644 index ffb3ab1f4d5..00000000000 --- a/app/boards/arm/corneish_zen/Kconfig.board +++ /dev/null @@ -1,24 +0,0 @@ -# -# 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/arm/corneish_zen/corneish_zen_v2.yaml b/app/boards/arm/corneish_zen/corneish_zen_v2.yaml deleted file mode 100644 index 46a213d9c60..00000000000 --- a/app/boards/arm/corneish_zen/corneish_zen_v2.yaml +++ /dev/null @@ -1,20 +0,0 @@ -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 deleted file mode 100644 index 26981e05d16..00000000000 --- a/app/boards/arm/corneish_zen/corneish_zen_v2.zmk.yml +++ /dev/null @@ -1,16 +0,0 @@ -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/arm/dz60rgb/Kconfig.board b/app/boards/arm/dz60rgb/Kconfig.board deleted file mode 100644 index ba09e2dd43e..00000000000 --- a/app/boards/arm/dz60rgb/Kconfig.board +++ /dev/null @@ -1,6 +0,0 @@ -# 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 deleted file mode 100644 index 6e0592569de..00000000000 --- a/app/boards/arm/dz60rgb/Kconfig.defconfig +++ /dev/null @@ -1,11 +0,0 @@ -# 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/arm/dz60rgb/dz60rgb_rev1.dts b/app/boards/arm/dz60rgb/dz60rgb_rev1.dts deleted file mode 100644 index b8fac4e2807..00000000000 --- a/app/boards/arm/dz60rgb/dz60rgb_rev1.dts +++ /dev/null @@ -1,86 +0,0 @@ -/* - * 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 deleted file mode 100644 index eaf5d5daba0..00000000000 --- a/app/boards/arm/dz60rgb/dz60rgb_rev1.keymap +++ /dev/null @@ -1,25 +0,0 @@ -#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 deleted file mode 100644 index d2836218a78..00000000000 --- a/app/boards/arm/dz60rgb/dz60rgb_rev1.yaml +++ /dev/null @@ -1,19 +0,0 @@ -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 deleted file mode 100644 index 6b6c8a48de6..00000000000 --- a/app/boards/arm/dz60rgb/dz60rgb_rev1_defconfig +++ /dev/null @@ -1,26 +0,0 @@ -# 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 deleted file mode 100644 index 70ee895d8dd..00000000000 --- a/app/boards/arm/ferris/Kconfig.board +++ /dev/null @@ -1,8 +0,0 @@ -# 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/arm/glove80/Kconfig b/app/boards/arm/glove80/Kconfig deleted file mode 100644 index f1c12e7e314..00000000000 --- a/app/boards/arm/glove80/Kconfig +++ /dev/null @@ -1,8 +0,0 @@ -# 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 deleted file mode 100644 index f689103710f..00000000000 --- a/app/boards/arm/glove80/Kconfig.board +++ /dev/null @@ -1,10 +0,0 @@ -# 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/arm/kbdfans_tofu65/Kconfig.board b/app/boards/arm/kbdfans_tofu65/Kconfig.board deleted file mode 100644 index 954166b715f..00000000000 --- a/app/boards/arm/kbdfans_tofu65/Kconfig.board +++ /dev/null @@ -1,6 +0,0 @@ -# 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/arm/mikoto/Kconfig.board b/app/boards/arm/mikoto/Kconfig.board deleted file mode 100644 index b51dce8adb2..00000000000 --- a/app/boards/arm/mikoto/Kconfig.board +++ /dev/null @@ -1,8 +0,0 @@ -# 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/boards/arm/mikoto/revision.cmake b/app/boards/arm/mikoto/revision.cmake deleted file mode 100644 index 12fd4bd4da0..00000000000 --- a/app/boards/arm/mikoto/revision.cmake +++ /dev/null @@ -1,7 +0,0 @@ -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/arm/nice60/Kconfig.board b/app/boards/arm/nice60/Kconfig.board deleted file mode 100644 index 88db9ee861b..00000000000 --- a/app/boards/arm/nice60/Kconfig.board +++ /dev/null @@ -1,6 +0,0 @@ -# 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/arm/nice_nano/Kconfig b/app/boards/arm/nice_nano/Kconfig deleted file mode 100644 index 18a0a12e14a..00000000000 --- a/app/boards/arm/nice_nano/Kconfig +++ /dev/null @@ -1,13 +0,0 @@ -# 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 deleted file mode 100644 index 8dd16512358..00000000000 --- a/app/boards/arm/nice_nano/Kconfig.board +++ /dev/null @@ -1,13 +0,0 @@ -# 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 deleted file mode 100644 index 63102a571f9..00000000000 --- a/app/boards/arm/nice_nano/Kconfig.defconfig +++ /dev/null @@ -1,19 +0,0 @@ -# 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/boards/arm/nice_nano/nice_nano_v2.yaml b/app/boards/arm/nice_nano/nice_nano_v2.yaml deleted file mode 100644 index d050ce993f9..00000000000 --- a/app/boards/arm/nice_nano/nice_nano_v2.yaml +++ /dev/null @@ -1,15 +0,0 @@ -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 deleted file mode 100644 index 3d1149a0c25..00000000000 --- a/app/boards/arm/nice_nano/nice_nano_v2.zmk.yml +++ /dev/null @@ -1,10 +0,0 @@ -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/arm/nrf52840_m2/Kconfig.board b/app/boards/arm/nrf52840_m2/Kconfig.board deleted file mode 100644 index b2927ff2507..00000000000 --- a/app/boards/arm/nrf52840_m2/Kconfig.board +++ /dev/null @@ -1,9 +0,0 @@ -# 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/boards/arm/nrfmicro/Kconfig b/app/boards/arm/nrfmicro/Kconfig deleted file mode 100644 index 233ddbad460..00000000000 --- a/app/boards/arm/nrfmicro/Kconfig +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 441de5cff7e..00000000000 --- a/app/boards/arm/nrfmicro/Kconfig.board +++ /dev/null @@ -1,20 +0,0 @@ -# nrfmicro board configuration - -# Copyright (c) 2020 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config BOARD_NRFMICRO_11 - bool "nrfmicro_11" - depends on SOC_NRF52840_QIAA - -config BOARD_NRFMICRO_11_FLIPPED - bool "nrfmicro_11_flipped" - depends on SOC_NRF52840_QIAA - -config BOARD_NRFMICRO_13 - bool "nrfmicro_13" - depends on SOC_NRF52840_QIAA - -config BOARD_NRFMICRO_13_52833 - bool "nrfmicro_13_52833" - depends on SOC_NRF52833_QIAA diff --git a/app/boards/arm/nrfmicro/nrfmicro_11.dts b/app/boards/arm/nrfmicro/nrfmicro_11.dts deleted file mode 100644 index b80ed4c62c1..00000000000 --- a/app/boards/arm/nrfmicro/nrfmicro_11.dts +++ /dev/null @@ -1,110 +0,0 @@ -/* - * 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; - }; - - 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_HIGH>; - init-delay-ms = <50>; - }; -}; - -&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/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig b/app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig deleted file mode 100644 index 31cbfc9ae75..00000000000 --- a/app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig +++ /dev/null @@ -1,28 +0,0 @@ -# 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_52833.zmk.yml b/app/boards/arm/nrfmicro/nrfmicro_13_52833.zmk.yml deleted file mode 100644 index 757ff860a1c..00000000000 --- a/app/boards/arm/nrfmicro/nrfmicro_13_52833.zmk.yml +++ /dev/null @@ -1,10 +0,0 @@ -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/arm/pillbug/Kconfig.board b/app/boards/arm/pillbug/Kconfig.board deleted file mode 100644 index 70232e18a72..00000000000 --- a/app/boards/arm/pillbug/Kconfig.board +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (c) 2022 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config BOARD_PILLBUG - bool "PillBug" - depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/proton_c/Kconfig.board b/app/boards/arm/proton_c/Kconfig.board deleted file mode 100644 index 1596077fc1d..00000000000 --- a/app/boards/arm/proton_c/Kconfig.board +++ /dev/null @@ -1,8 +0,0 @@ -# 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 deleted file mode 100644 index eed4b830442..00000000000 --- a/app/boards/arm/proton_c/Kconfig.defconfig +++ /dev/null @@ -1,11 +0,0 @@ -# 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/boards/arm/proton_c/board.cmake b/app/boards/arm/proton_c/board.cmake deleted file mode 100644 index 9da8ea91122..00000000000 --- a/app/boards/arm/proton_c/board.cmake +++ /dev/null @@ -1,7 +0,0 @@ -# SPDX-License-Identifier: MIT - -board_runner_args(dfu-util "--pid=0483:df11" "--alt=0" "--dfuse") -board_runner_args(jlink "--device=STM32F303CC" "--speed=4000") - -include(${ZEPHYR_BASE}/boards/common/dfu-util.board.cmake) -include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) diff --git a/app/boards/arm/puchi_ble/Kconfig.board b/app/boards/arm/puchi_ble/Kconfig.board deleted file mode 100644 index 0f5b7f96d84..00000000000 --- a/app/boards/arm/puchi_ble/Kconfig.board +++ /dev/null @@ -1,8 +0,0 @@ -# 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/arm/puchi_ble/puchi_ble_v1.yaml b/app/boards/arm/puchi_ble/puchi_ble_v1.yaml deleted file mode 100644 index 18770722242..00000000000 --- a/app/boards/arm/puchi_ble/puchi_ble_v1.yaml +++ /dev/null @@ -1,15 +0,0 @@ -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/boards/arm/s40nc/Kconfig.board b/app/boards/arm/s40nc/Kconfig.board deleted file mode 100644 index e703d7269af..00000000000 --- a/app/boards/arm/s40nc/Kconfig.board +++ /dev/null @@ -1,6 +0,0 @@ -# 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/adafruit_kb2040.conf b/app/boards/extensions/adafruit_kb2040/adafruit_kb2040.conf similarity index 50% rename from app/boards/adafruit_kb2040.conf rename to app/boards/extensions/adafruit_kb2040/adafruit_kb2040.conf index 21c1893d91f..9c394f2c91e 100644 --- a/app/boards/adafruit_kb2040.conf +++ b/app/boards/extensions/adafruit_kb2040/adafruit_kb2040.conf @@ -2,3 +2,7 @@ CONFIG_CONSOLE=n CONFIG_SERIAL=n CONFIG_UART_CONSOLE=n CONFIG_ZMK_USB=y + +CONFIG_RETAINED_MEM=y +CONFIG_RETENTION=y +CONFIG_RETENTION_BOOT_MODE=y \ No newline at end of file diff --git a/app/boards/adafruit_kb2040.overlay b/app/boards/extensions/adafruit_kb2040/adafruit_kb2040.overlay similarity index 68% rename from app/boards/adafruit_kb2040.overlay rename to app/boards/extensions/adafruit_kb2040/adafruit_kb2040.overlay index 72b3adcaf41..bf3fd17a55f 100644 --- a/app/boards/adafruit_kb2040.overlay +++ b/app/boards/extensions/adafruit_kb2040/adafruit_kb2040.overlay @@ -4,4 +4,6 @@ * SPDX-License-Identifier: MIT */ +#include + &pro_micro_serial { status = "disabled"; }; diff --git a/app/boards/adafruit_qt_py_rp2040.conf b/app/boards/extensions/adafruit_qt_py_rp2040/adafruit_qt_py_rp2040.conf similarity index 50% rename from app/boards/adafruit_qt_py_rp2040.conf rename to app/boards/extensions/adafruit_qt_py_rp2040/adafruit_qt_py_rp2040.conf index 21c1893d91f..9c394f2c91e 100644 --- a/app/boards/adafruit_qt_py_rp2040.conf +++ b/app/boards/extensions/adafruit_qt_py_rp2040/adafruit_qt_py_rp2040.conf @@ -2,3 +2,7 @@ CONFIG_CONSOLE=n CONFIG_SERIAL=n CONFIG_UART_CONSOLE=n CONFIG_ZMK_USB=y + +CONFIG_RETAINED_MEM=y +CONFIG_RETENTION=y +CONFIG_RETENTION_BOOT_MODE=y \ No newline at end of file diff --git a/app/boards/adafruit_qt_py_rp2040.overlay b/app/boards/extensions/adafruit_qt_py_rp2040/adafruit_qt_py_rp2040.overlay similarity index 67% rename from app/boards/adafruit_qt_py_rp2040.overlay rename to app/boards/extensions/adafruit_qt_py_rp2040/adafruit_qt_py_rp2040.overlay index b5d2cdb2fd1..a68455c4a17 100644 --- a/app/boards/adafruit_qt_py_rp2040.overlay +++ b/app/boards/extensions/adafruit_qt_py_rp2040/adafruit_qt_py_rp2040.overlay @@ -4,4 +4,6 @@ * SPDX-License-Identifier: MIT */ +#include + &xiao_serial { status = "disabled"; }; diff --git a/app/boards/blackpill_f401cc.conf b/app/boards/extensions/blackpill_f401cc/blackpill_f401cc.conf similarity index 100% rename from app/boards/blackpill_f401cc.conf rename to app/boards/extensions/blackpill_f401cc/blackpill_f401cc.conf diff --git a/app/boards/blackpill_f401cc.overlay b/app/boards/extensions/blackpill_f401cc/blackpill_f401cc.overlay similarity index 100% rename from app/boards/blackpill_f401cc.overlay rename to app/boards/extensions/blackpill_f401cc/blackpill_f401cc.overlay diff --git a/app/boards/blackpill_f401ce.conf b/app/boards/extensions/blackpill_f401ce/blackpill_f401ce.conf similarity index 100% rename from app/boards/blackpill_f401ce.conf rename to app/boards/extensions/blackpill_f401ce/blackpill_f401ce.conf diff --git a/app/boards/blackpill_f401ce.overlay b/app/boards/extensions/blackpill_f401ce/blackpill_f401ce.overlay similarity index 100% rename from app/boards/blackpill_f401ce.overlay rename to app/boards/extensions/blackpill_f401ce/blackpill_f401ce.overlay diff --git a/app/boards/blackpill_f411ce.conf b/app/boards/extensions/blackpill_f411ce/blackpill_f411ce.conf similarity index 100% rename from app/boards/blackpill_f411ce.conf rename to app/boards/extensions/blackpill_f411ce/blackpill_f411ce.conf diff --git a/app/boards/blackpill_f411ce.overlay b/app/boards/extensions/blackpill_f411ce/blackpill_f411ce.overlay similarity index 100% rename from app/boards/blackpill_f411ce.overlay rename to app/boards/extensions/blackpill_f411ce/blackpill_f411ce.overlay diff --git a/app/boards/boardsource_blok.conf b/app/boards/extensions/boardsource_blok/boardsource_blok.conf similarity index 50% rename from app/boards/boardsource_blok.conf rename to app/boards/extensions/boardsource_blok/boardsource_blok.conf index 21c1893d91f..9c394f2c91e 100644 --- a/app/boards/boardsource_blok.conf +++ b/app/boards/extensions/boardsource_blok/boardsource_blok.conf @@ -2,3 +2,7 @@ CONFIG_CONSOLE=n CONFIG_SERIAL=n CONFIG_UART_CONSOLE=n CONFIG_ZMK_USB=y + +CONFIG_RETAINED_MEM=y +CONFIG_RETENTION=y +CONFIG_RETENTION_BOOT_MODE=y \ No newline at end of file diff --git a/app/boards/boardsource_blok.overlay b/app/boards/extensions/boardsource_blok/boardsource_blok.overlay similarity index 68% rename from app/boards/boardsource_blok.overlay rename to app/boards/extensions/boardsource_blok/boardsource_blok.overlay index 72b3adcaf41..bf3fd17a55f 100644 --- a/app/boards/boardsource_blok.overlay +++ b/app/boards/extensions/boardsource_blok/boardsource_blok.overlay @@ -4,4 +4,6 @@ * SPDX-License-Identifier: MIT */ +#include + &pro_micro_serial { status = "disabled"; }; diff --git a/app/boards/native_posix_64.overlay b/app/boards/extensions/native_sim/native_sim.overlay similarity index 100% rename from app/boards/native_posix_64.overlay rename to app/boards/extensions/native_sim/native_sim.overlay diff --git a/app/boards/extensions/native_sim/native_sim_64.overlay b/app/boards/extensions/native_sim/native_sim_64.overlay new file mode 100644 index 00000000000..277e45328b6 --- /dev/null +++ b/app/boards/extensions/native_sim/native_sim_64.overlay @@ -0,0 +1,32 @@ + +#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>; + }; +}; + +&sdl_dc { + width = <128>; + height = <32>; +}; \ No newline at end of file diff --git a/app/boards/native_posix_64.conf b/app/boards/extensions/native_sim/native_sim_native_64.conf similarity index 100% rename from app/boards/native_posix_64.conf rename to app/boards/extensions/native_sim/native_sim_native_64.conf diff --git a/app/boards/nrf52840dk_nrf52840.conf b/app/boards/extensions/nrf52840dk/nrf52840dk_nrf52840.conf similarity index 100% rename from app/boards/nrf52840dk_nrf52840.conf rename to app/boards/extensions/nrf52840dk/nrf52840dk_nrf52840.conf diff --git a/app/boards/nrf52840dongle_nrf52840.conf b/app/boards/extensions/nrf52840dongle/nrf52840dongle_nrf52840.conf similarity index 100% rename from app/boards/nrf52840dongle_nrf52840.conf rename to app/boards/extensions/nrf52840dongle/nrf52840dongle_nrf52840.conf diff --git a/app/boards/nrf5340dk_nrf5340_cpuapp.conf b/app/boards/extensions/nrf5340dk/nrf5340dk_nrf5340_cpuapp.conf similarity index 100% rename from app/boards/nrf5340dk_nrf5340_cpuapp.conf rename to app/boards/extensions/nrf5340dk/nrf5340dk_nrf5340_cpuapp.conf diff --git a/app/boards/nrf5340dk_nrf5340_cpuapp.overlay b/app/boards/extensions/nrf5340dk/nrf5340dk_nrf5340_cpuapp.overlay similarity index 100% rename from app/boards/nrf5340dk_nrf5340_cpuapp.overlay rename to app/boards/extensions/nrf5340dk/nrf5340dk_nrf5340_cpuapp.overlay diff --git a/app/boards/nrf52_bsim.conf b/app/boards/extensions/nrf_bsim/nrf52_bsim.conf similarity index 100% rename from app/boards/nrf52_bsim.conf rename to app/boards/extensions/nrf_bsim/nrf52_bsim.conf diff --git a/app/boards/nrf52_bsim.overlay b/app/boards/extensions/nrf_bsim/nrf52_bsim.overlay similarity index 100% rename from app/boards/nrf52_bsim.overlay rename to app/boards/extensions/nrf_bsim/nrf52_bsim.overlay diff --git a/app/boards/01space_rp2040_042lcd.conf b/app/boards/extensions/rp2040_042lcd/01space_rp2040_042lcd.conf similarity index 100% rename from app/boards/01space_rp2040_042lcd.conf rename to app/boards/extensions/rp2040_042lcd/01space_rp2040_042lcd.conf diff --git a/app/boards/01space_rp2040_042lcd.overlay b/app/boards/extensions/rp2040_042lcd/01space_rp2040_042lcd.overlay similarity index 100% rename from app/boards/01space_rp2040_042lcd.overlay rename to app/boards/extensions/rp2040_042lcd/01space_rp2040_042lcd.overlay diff --git a/app/boards/seeeduino_xiao_ble.conf b/app/boards/extensions/rpi_pico/rpi_pico.conf similarity index 70% rename from app/boards/seeeduino_xiao_ble.conf rename to app/boards/extensions/rpi_pico/rpi_pico.conf index 205f67e9127..147adc6d77f 100644 --- a/app/boards/seeeduino_xiao_ble.conf +++ b/app/boards/extensions/rpi_pico/rpi_pico.conf @@ -1,15 +1,16 @@ - 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 +CONFIG_FLASH_MAP=y + +CONFIG_RETAINED_MEM=y +CONFIG_RETENTION=y +CONFIG_RETENTION_BOOT_MODE=y \ No newline at end of file diff --git a/app/boards/rpi_pico.overlay b/app/boards/extensions/rpi_pico/rpi_pico.overlay similarity index 82% rename from app/boards/rpi_pico.overlay rename to app/boards/extensions/rpi_pico/rpi_pico.overlay index 5368ab290eb..b0aed761047 100644 --- a/app/boards/rpi_pico.overlay +++ b/app/boards/extensions/rpi_pico/rpi_pico.overlay @@ -1,3 +1,4 @@ +#include &uart0 { status = "disabled"; }; diff --git a/app/boards/seeeduino_xiao.conf b/app/boards/extensions/seeeduino_xiao/seeeduino_xiao.conf similarity index 100% rename from app/boards/seeeduino_xiao.conf rename to app/boards/extensions/seeeduino_xiao/seeeduino_xiao.conf diff --git a/app/boards/sparkfun_pro_micro_rp2040.conf b/app/boards/extensions/sparkfun_pro_micro_rp2040/sparkfun_pro_micro_rp2040.conf similarity index 67% rename from app/boards/sparkfun_pro_micro_rp2040.conf rename to app/boards/extensions/sparkfun_pro_micro_rp2040/sparkfun_pro_micro_rp2040.conf index 354d7007447..70b90914d9e 100644 --- a/app/boards/sparkfun_pro_micro_rp2040.conf +++ b/app/boards/extensions/sparkfun_pro_micro_rp2040/sparkfun_pro_micro_rp2040.conf @@ -8,4 +8,8 @@ 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 +CONFIG_FLASH_MAP=y + +CONFIG_RETAINED_MEM=y +CONFIG_RETENTION=y +CONFIG_RETENTION_BOOT_MODE=y \ No newline at end of file diff --git a/app/boards/sparkfun_pro_micro_rp2040.overlay b/app/boards/extensions/sparkfun_pro_micro_rp2040/sparkfun_pro_micro_rp2040.overlay similarity index 88% rename from app/boards/sparkfun_pro_micro_rp2040.overlay rename to app/boards/extensions/sparkfun_pro_micro_rp2040/sparkfun_pro_micro_rp2040.overlay index 21aa7dff7c6..ac83d9816f3 100644 --- a/app/boards/sparkfun_pro_micro_rp2040.overlay +++ b/app/boards/extensions/sparkfun_pro_micro_rp2040/sparkfun_pro_micro_rp2040.overlay @@ -4,6 +4,8 @@ * SPDX-License-Identifier: MIT */ +#include + &pro_micro_serial { status = "disabled"; }; // We override to 2MB for maximum compatibility diff --git a/app/boards/extensions/xiao_ble/xiao_ble.conf b/app/boards/extensions/xiao_ble/xiao_ble.conf new file mode 100644 index 00000000000..49eaacf6585 --- /dev/null +++ b/app/boards/extensions/xiao_ble/xiao_ble.conf @@ -0,0 +1,20 @@ + +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_UART_INTERRUPT_DRIVEN=n +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y + + +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +CONFIG_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/seeeduino_xiao_ble.overlay b/app/boards/extensions/xiao_ble/xiao_ble.overlay similarity index 86% rename from app/boards/seeeduino_xiao_ble.overlay rename to app/boards/extensions/xiao_ble/xiao_ble.overlay index 3b7710ef634..331b8fb7428 100644 --- a/app/boards/seeeduino_xiao_ble.overlay +++ b/app/boards/extensions/xiao_ble/xiao_ble.overlay @@ -4,6 +4,10 @@ * SPDX-License-Identifier: MIT */ +#include + +/* Add an sd_partition label for compatibility with the nosd snippet */ +sd_partition: &reserved_partition_0 { }; / { chosen { diff --git a/app/boards/rpi_pico.conf b/app/boards/extensions/xiao_rp2040/xiao_rp2040.conf similarity index 66% rename from app/boards/rpi_pico.conf rename to app/boards/extensions/xiao_rp2040/xiao_rp2040.conf index 286ec25ab8b..1f7d85b36e0 100644 --- a/app/boards/rpi_pico.conf +++ b/app/boards/extensions/xiao_rp2040/xiao_rp2040.conf @@ -1,7 +1,6 @@ CONFIG_CONSOLE=n CONFIG_SERIAL=n CONFIG_UART_CONSOLE=n -CONFIG_UART_INTERRUPT_DRIVEN=n CONFIG_ZMK_USB=y CONFIG_MPU_ALLOW_FLASH_WRITE=y @@ -9,4 +8,8 @@ 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 +CONFIG_FLASH_MAP=y + +CONFIG_RETAINED_MEM=y +CONFIG_RETENTION=y +CONFIG_RETENTION_BOOT_MODE=y diff --git a/app/boards/seeeduino_xiao_rp2040.overlay b/app/boards/extensions/xiao_rp2040/xiao_rp2040.overlay similarity index 87% rename from app/boards/seeeduino_xiao_rp2040.overlay rename to app/boards/extensions/xiao_rp2040/xiao_rp2040.overlay index e6ba8136498..8f2e8714366 100644 --- a/app/boards/seeeduino_xiao_rp2040.overlay +++ b/app/boards/extensions/xiao_rp2040/xiao_rp2040.overlay @@ -4,6 +4,8 @@ * SPDX-License-Identifier: MIT */ +#include + &xiao_serial { status = "disabled"; }; &code_partition { diff --git a/app/boards/arm/mikoto/CMakeLists.txt b/app/boards/joric/nrfmicro/CMakeLists.txt similarity index 100% rename from app/boards/arm/mikoto/CMakeLists.txt rename to app/boards/joric/nrfmicro/CMakeLists.txt diff --git a/app/boards/joric/nrfmicro/Kconfig b/app/boards/joric/nrfmicro/Kconfig new file mode 100644 index 00000000000..f8e10e63aba --- /dev/null +++ b/app/boards/joric/nrfmicro/Kconfig @@ -0,0 +1,4 @@ +config BOARD_NRFMICRO_CHARGER + bool "Enable battery charger" + default y + depends on (BOARD_NRFMICRO && BOARD_REVISION = "1.3.0") diff --git a/app/boards/arm/nrfmicro/Kconfig.defconfig b/app/boards/joric/nrfmicro/Kconfig.defconfig similarity index 50% rename from app/boards/arm/nrfmicro/Kconfig.defconfig rename to app/boards/joric/nrfmicro/Kconfig.defconfig index 38daacde3fd..9207183e488 100644 --- a/app/boards/arm/nrfmicro/Kconfig.defconfig +++ b/app/boards/joric/nrfmicro/Kconfig.defconfig @@ -3,7 +3,7 @@ # Copyright (c) 2020 The ZMK Contributors # SPDX-License-Identifier: MIT -if BOARD_NRFMICRO_11 || BOARD_NRFMICRO_11_FLIPPED || BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 +if BOARD_NRFMICRO_NRF52840 || BOARD_NRFMICRO_NRF52840_FLIPPED || BOARD_NRFMICRO_NRF52833 config BOARD default "nrfmicro" @@ -18,11 +18,12 @@ endif # USB_DEVICE_STACK config BT_CTLR default BT -if BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 +if BOARD_REVISION = "1.3.0" config BOARD_NRFMICRO_CHARGER default y -endif # BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 +endif # BOARD_REVISION = "1.3.0" -endif # BOARD_NRFMICRO_11 || BOARD_NRFMICRO_11_FLIPPED || BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 + +endif # BOARD_NRFMICRO_NRF52840 || BOARD_NRFMICRO_NRF52840_FLIPPED || BOARD_NRFMICRO_NRF52833 diff --git a/app/boards/joric/nrfmicro/Kconfig.nrfmicro b/app/boards/joric/nrfmicro/Kconfig.nrfmicro new file mode 100644 index 00000000000..bd5d31951af --- /dev/null +++ b/app/boards/joric/nrfmicro/Kconfig.nrfmicro @@ -0,0 +1,12 @@ +# nrfmicro board configuration + +# Copyright (c) 2020 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 + imply RETAINED_MEM if BOARD_NRFMICRO_NRF52840 || BOARD_NRFMICRO_NRF52840_FLIPPED + imply RETENTION if BOARD_NRFMICRO_NRF52840 || BOARD_NRFMICRO_NRF52840_FLIPPED + imply RETENTION_BOOT_MODE if BOARD_NRFMICRO_NRF52840 || BOARD_NRFMICRO_NRF52840_FLIPPED diff --git a/app/boards/arm/nrfmicro/arduino_pro_micro_pins.dtsi b/app/boards/joric/nrfmicro/arduino_pro_micro_pins.dtsi similarity index 100% rename from app/boards/arm/nrfmicro/arduino_pro_micro_pins.dtsi rename to app/boards/joric/nrfmicro/arduino_pro_micro_pins.dtsi diff --git a/app/boards/arm/nrfmicro/arduino_pro_micro_pins_52833.dtsi b/app/boards/joric/nrfmicro/arduino_pro_micro_pins_52833.dtsi similarity index 100% rename from app/boards/arm/nrfmicro/arduino_pro_micro_pins_52833.dtsi rename to app/boards/joric/nrfmicro/arduino_pro_micro_pins_52833.dtsi diff --git a/app/boards/arm/nrfmicro/arduino_pro_micro_pins_flipped.dtsi b/app/boards/joric/nrfmicro/arduino_pro_micro_pins_flipped.dtsi similarity index 100% rename from app/boards/arm/nrfmicro/arduino_pro_micro_pins_flipped.dtsi rename to app/boards/joric/nrfmicro/arduino_pro_micro_pins_flipped.dtsi diff --git a/app/boards/arm/bluemicro840/board.cmake b/app/boards/joric/nrfmicro/board.cmake similarity index 100% rename from app/boards/arm/bluemicro840/board.cmake rename to app/boards/joric/nrfmicro/board.cmake diff --git a/app/boards/joric/nrfmicro/board.yml b/app/boards/joric/nrfmicro/board.yml new file mode 100644 index 00000000000..1cfcc492fc4 --- /dev/null +++ b/app/boards/joric/nrfmicro/board.yml @@ -0,0 +1,14 @@ +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/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi b/app/boards/joric/nrfmicro/nrfmicro-flipped-pinctrl.dtsi similarity index 100% rename from app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi rename to app/boards/joric/nrfmicro/nrfmicro-flipped-pinctrl.dtsi diff --git a/app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi b/app/boards/joric/nrfmicro/nrfmicro-pinctrl.dtsi similarity index 100% rename from app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi rename to app/boards/joric/nrfmicro/nrfmicro-pinctrl.dtsi diff --git a/app/boards/arm/nrfmicro/nrfmicro_11.yaml b/app/boards/joric/nrfmicro/nrfmicro_11.yaml similarity index 100% rename from app/boards/arm/nrfmicro/nrfmicro_11.yaml rename to app/boards/joric/nrfmicro/nrfmicro_11.yaml diff --git a/app/boards/arm/nrfmicro/nrfmicro_11_flipped.yaml b/app/boards/joric/nrfmicro/nrfmicro_11_flipped.yaml similarity index 100% rename from app/boards/arm/nrfmicro/nrfmicro_11_flipped.yaml rename to app/boards/joric/nrfmicro/nrfmicro_11_flipped.yaml diff --git a/app/boards/arm/nrfmicro/nrfmicro_13.yaml b/app/boards/joric/nrfmicro/nrfmicro_13.yaml similarity index 100% rename from app/boards/arm/nrfmicro/nrfmicro_13.yaml rename to app/boards/joric/nrfmicro/nrfmicro_13.yaml diff --git a/app/boards/arm/nrfmicro/nrfmicro_13_52833.yaml b/app/boards/joric/nrfmicro/nrfmicro_13_52833.yaml similarity index 100% rename from app/boards/arm/nrfmicro/nrfmicro_13_52833.yaml rename to app/boards/joric/nrfmicro/nrfmicro_13_52833.yaml diff --git a/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts b/app/boards/joric/nrfmicro/nrfmicro_nrf52833.dts similarity index 97% rename from app/boards/arm/nrfmicro/nrfmicro_13_52833.dts rename to app/boards/joric/nrfmicro/nrfmicro_nrf52833.dts index 866276bbec4..5099701f8c9 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts +++ b/app/boards/joric/nrfmicro/nrfmicro_nrf52833.dts @@ -42,6 +42,10 @@ }; }; +®1 { + regulator-initial-mode = ; +}; + &adc { status = "okay"; }; diff --git a/app/boards/arm/nrfmicro/nrfmicro_11_flipped.zmk.yml b/app/boards/joric/nrfmicro/nrfmicro_nrf52833.zmk.yml similarity index 56% rename from app/boards/arm/nrfmicro/nrfmicro_11_flipped.zmk.yml rename to app/boards/joric/nrfmicro/nrfmicro_nrf52833.zmk.yml index b63ace2d652..918c0b353fe 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11_flipped.zmk.yml +++ b/app/boards/joric/nrfmicro/nrfmicro_nrf52833.zmk.yml @@ -1,6 +1,6 @@ file_format: "1" -id: nrfmicro_11_flipped -name: nRFMicro 1.1 (flipped) +id: nrfmicro/nrf52833 +name: nRFMicro (nRF52833) type: board arch: arm outputs: @@ -8,3 +8,6 @@ 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_nrf52833_1_3_0.overlay b/app/boards/joric/nrfmicro/nrfmicro_nrf52833_1_3_0.overlay new file mode 100644 index 00000000000..758f4ee89de --- /dev/null +++ b/app/boards/joric/nrfmicro/nrfmicro_nrf52833_1_3_0.overlay @@ -0,0 +1,6 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + diff --git a/app/boards/arm/nrfmicro/nrfmicro_11_defconfig b/app/boards/joric/nrfmicro/nrfmicro_nrf52833_1_3_0_defconfig similarity index 79% rename from app/boards/arm/nrfmicro/nrfmicro_11_defconfig rename to app/boards/joric/nrfmicro/nrfmicro_nrf52833_1_3_0_defconfig index 5ba4d6e1478..709f33d8eee 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11_defconfig +++ b/app/boards/joric/nrfmicro/nrfmicro_nrf52833_1_3_0_defconfig @@ -1,9 +1,5 @@ # 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 @@ -25,4 +21,4 @@ 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 +CONFIG_ZMK_BLE=y diff --git a/app/boards/arm/nrfmicro/nrfmicro_13.dts b/app/boards/joric/nrfmicro/nrfmicro_nrf52840.dts similarity index 95% rename from app/boards/arm/nrfmicro/nrfmicro_13.dts rename to app/boards/joric/nrfmicro/nrfmicro_nrf52840.dts index 0cb22e63ca9..149f4be3a4f 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13.dts +++ b/app/boards/joric/nrfmicro/nrfmicro_nrf52840.dts @@ -6,6 +6,8 @@ /dts-v1/; #include +#include + #include "arduino_pro_micro_pins.dtsi" #include "nrfmicro-pinctrl.dtsi" @@ -42,6 +44,10 @@ }; }; +®1 { + regulator-initial-mode = ; +}; + &adc { status = "okay"; }; diff --git a/app/boards/arm/nrfmicro/nrfmicro_11.zmk.yml b/app/boards/joric/nrfmicro/nrfmicro_nrf52840.zmk.yml similarity index 50% rename from app/boards/arm/nrfmicro/nrfmicro_11.zmk.yml rename to app/boards/joric/nrfmicro/nrfmicro_nrf52840.zmk.yml index 4160ec6a77b..a1cfb4fe320 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11.zmk.yml +++ b/app/boards/joric/nrfmicro/nrfmicro_nrf52840.zmk.yml @@ -1,6 +1,6 @@ file_format: "1" -id: nrfmicro_11 -name: nRFMicro 1.1/1.2 +id: nrfmicro/nrf52840 +name: nRFMicro (nRF52840) 1.1/1.2/1.3 type: board arch: arm outputs: @@ -8,3 +8,7 @@ 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/boards/joric/nrfmicro/nrfmicro_nrf52840_1_1_0.overlay b/app/boards/joric/nrfmicro/nrfmicro_nrf52840_1_1_0.overlay new file mode 100644 index 00000000000..ac8b205785d --- /dev/null +++ b/app/boards/joric/nrfmicro/nrfmicro_nrf52840_1_1_0.overlay @@ -0,0 +1,15 @@ +/* + * 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/boards/arm/nrfmicro/nrfmicro_13_defconfig b/app/boards/joric/nrfmicro/nrfmicro_nrf52840_1_1_0_defconfig similarity index 79% rename from app/boards/arm/nrfmicro/nrfmicro_13_defconfig rename to app/boards/joric/nrfmicro/nrfmicro_nrf52840_1_1_0_defconfig index 9ffb2766a66..709f33d8eee 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13_defconfig +++ b/app/boards/joric/nrfmicro/nrfmicro_nrf52840_1_1_0_defconfig @@ -1,9 +1,5 @@ # 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 @@ -25,4 +21,4 @@ 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 +CONFIG_ZMK_BLE=y diff --git a/app/boards/joric/nrfmicro/nrfmicro_nrf52840_1_3_0.overlay b/app/boards/joric/nrfmicro/nrfmicro_nrf52840_1_3_0.overlay new file mode 100644 index 00000000000..3963dc4348c --- /dev/null +++ b/app/boards/joric/nrfmicro/nrfmicro_nrf52840_1_3_0.overlay @@ -0,0 +1,30 @@ +/* + * 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/arm/bluemicro840/bluemicro840_v1_defconfig b/app/boards/joric/nrfmicro/nrfmicro_nrf52840_1_3_0_defconfig similarity index 79% rename from app/boards/arm/bluemicro840/bluemicro840_v1_defconfig rename to app/boards/joric/nrfmicro/nrfmicro_nrf52840_1_3_0_defconfig index 3e13e77d0b5..709f33d8eee 100644 --- a/app/boards/arm/bluemicro840/bluemicro840_v1_defconfig +++ b/app/boards/joric/nrfmicro/nrfmicro_nrf52840_1_3_0_defconfig @@ -1,9 +1,5 @@ # 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 @@ -21,6 +17,8 @@ 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/arm/nrfmicro/nrfmicro_11_flipped.dts b/app/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped.dts similarity index 95% rename from app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts rename to app/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped.dts index 7b89b62f88a..8f1d30312e6 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts +++ b/app/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped.dts @@ -6,6 +6,8 @@ /dts-v1/; #include +#include + #include "arduino_pro_micro_pins_flipped.dtsi" #include "nrfmicro-flipped-pinctrl.dtsi" @@ -34,6 +36,10 @@ }; }; +®1 { + regulator-initial-mode = ; +}; + &gpiote { status = "okay"; }; diff --git a/app/boards/arm/nrfmicro/nrfmicro_13.zmk.yml b/app/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped.zmk.yml similarity index 52% rename from app/boards/arm/nrfmicro/nrfmicro_13.zmk.yml rename to app/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped.zmk.yml index 8fd28d37794..252d04b9875 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13.zmk.yml +++ b/app/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped.zmk.yml @@ -1,6 +1,6 @@ file_format: "1" -id: nrfmicro_13 -name: nRFMicro 1.3/1.4 +id: nrfmicro/nrf52840/flipped +name: nRFMicro nRF52840 (flipped) type: board arch: arm outputs: @@ -8,3 +8,6 @@ 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/joric/nrfmicro/nrfmicro_nrf52840_flipped_1_1_0.overlay b/app/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped_1_1_0.overlay new file mode 100644 index 00000000000..758f4ee89de --- /dev/null +++ b/app/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped_1_1_0.overlay @@ -0,0 +1,6 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + diff --git a/app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig b/app/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped_1_1_0_defconfig similarity index 78% rename from app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig rename to app/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped_1_1_0_defconfig index f459f35636a..709f33d8eee 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig +++ b/app/boards/joric/nrfmicro/nrfmicro_nrf52840_flipped_1_1_0_defconfig @@ -1,9 +1,5 @@ # 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 @@ -25,4 +21,4 @@ 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 +CONFIG_ZMK_BLE=y diff --git a/app/boards/arm/nrfmicro/pinmux.c b/app/boards/joric/nrfmicro/pinmux.c similarity index 100% rename from app/boards/arm/nrfmicro/pinmux.c rename to app/boards/joric/nrfmicro/pinmux.c diff --git a/app/boards/arm/adv360pro/pre_dt_board.cmake b/app/boards/joric/nrfmicro/pre_dt_board.cmake similarity index 100% rename from app/boards/arm/adv360pro/pre_dt_board.cmake rename to app/boards/joric/nrfmicro/pre_dt_board.cmake diff --git a/app/boards/arm/bluemicro840/Kconfig b/app/boards/jpconstantineau/bluemicro840/Kconfig similarity index 77% rename from app/boards/arm/bluemicro840/Kconfig rename to app/boards/jpconstantineau/bluemicro840/Kconfig index ca060885f16..470b5559e26 100644 --- a/app/boards/arm/bluemicro840/Kconfig +++ b/app/boards/jpconstantineau/bluemicro840/Kconfig @@ -4,5 +4,5 @@ config BOARD_ENABLE_DCDC bool "Enable DCDC mode" select SOC_DCDC_NRF52X default y - depends on BOARD_BLUEMICRO840_V1 + depends on BOARD_BLUEMICRO840 diff --git a/app/boards/jpconstantineau/bluemicro840/Kconfig.bluemicro840 b/app/boards/jpconstantineau/bluemicro840/Kconfig.bluemicro840 new file mode 100644 index 00000000000..da3774d7c0c --- /dev/null +++ b/app/boards/jpconstantineau/bluemicro840/Kconfig.bluemicro840 @@ -0,0 +1,8 @@ +# Copyright (c) 2020 Pete Johanson, Derek Schmell +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_BLUEMICRO840 + select SOC_NRF52840_QIAA + imply RETAINED_MEM + imply RETENTION + imply RETENTION_BOOT_MODE diff --git a/app/boards/arm/bluemicro840/Kconfig.defconfig b/app/boards/jpconstantineau/bluemicro840/Kconfig.defconfig similarity index 69% rename from app/boards/arm/bluemicro840/Kconfig.defconfig rename to app/boards/jpconstantineau/bluemicro840/Kconfig.defconfig index ff61ec92f81..81573146e35 100644 --- a/app/boards/arm/bluemicro840/Kconfig.defconfig +++ b/app/boards/jpconstantineau/bluemicro840/Kconfig.defconfig @@ -3,10 +3,7 @@ # Copyright (c) 2020 Pete Johanson, Derek Schmell # SPDX-License-Identifier: MIT -if BOARD_BLUEMICRO840_V1 - -config BOARD - default "bluemicro840_v1" +if BOARD_BLUEMICRO840 if USB_DEVICE_STACK @@ -18,4 +15,4 @@ endif # USB_DEVICE_STACK config BT_CTLR default BT -endif # BOARD_BLUEMICRO840_V1 +endif # BOARD_BLUEMICRO840 diff --git a/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi b/app/boards/jpconstantineau/bluemicro840/arduino_pro_micro_pins.dtsi similarity index 100% rename from app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi rename to app/boards/jpconstantineau/bluemicro840/arduino_pro_micro_pins.dtsi diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi b/app/boards/jpconstantineau/bluemicro840/bluemicro840-pinctrl.dtsi similarity index 100% rename from app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi rename to app/boards/jpconstantineau/bluemicro840/bluemicro840-pinctrl.dtsi diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1.dts b/app/boards/jpconstantineau/bluemicro840/bluemicro840.dts similarity index 96% rename from app/boards/arm/bluemicro840/bluemicro840_v1.dts rename to app/boards/jpconstantineau/bluemicro840/bluemicro840.dts index 84d3ebaec99..6c4e8ced73f 100644 --- a/app/boards/arm/bluemicro840/bluemicro840_v1.dts +++ b/app/boards/jpconstantineau/bluemicro840/bluemicro840.dts @@ -6,8 +6,10 @@ /dts-v1/; #include +#include + #include "arduino_pro_micro_pins.dtsi" -#include "bluemicro840_v1-pinctrl.dtsi" +#include "bluemicro840-pinctrl.dtsi" / { model = "BlueMicro840_V1"; diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1.yaml b/app/boards/jpconstantineau/bluemicro840/bluemicro840.yaml similarity index 85% rename from app/boards/arm/bluemicro840/bluemicro840_v1.yaml rename to app/boards/jpconstantineau/bluemicro840/bluemicro840.yaml index 9e1dd54c29c..c36eee0c9d2 100644 --- a/app/boards/arm/bluemicro840/bluemicro840_v1.yaml +++ b/app/boards/jpconstantineau/bluemicro840/bluemicro840.yaml @@ -1,4 +1,4 @@ -identifier: bluemicro840_v1 +identifier: bluemicro840 name: BlueMicro840_V1 type: mcu arch: arm diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1.zmk.yml b/app/boards/jpconstantineau/bluemicro840/bluemicro840.zmk.yml similarity index 89% rename from app/boards/arm/bluemicro840/bluemicro840_v1.zmk.yml rename to app/boards/jpconstantineau/bluemicro840/bluemicro840.zmk.yml index c1d3c6b9463..10afcbf1f7b 100644 --- a/app/boards/arm/bluemicro840/bluemicro840_v1.zmk.yml +++ b/app/boards/jpconstantineau/bluemicro840/bluemicro840.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: bluemicro840_v1 +id: bluemicro840 name: BlueMicro840 v1 type: board arch: arm diff --git a/app/boards/jpconstantineau/bluemicro840/bluemicro840_defconfig b/app/boards/jpconstantineau/bluemicro840/bluemicro840_defconfig new file mode 100644 index 00000000000..b41fbe47f4e --- /dev/null +++ b/app/boards/jpconstantineau/bluemicro840/bluemicro840_defconfig @@ -0,0 +1,22 @@ +# 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/arm/bt60/board.cmake b/app/boards/jpconstantineau/bluemicro840/board.cmake similarity index 100% rename from app/boards/arm/bt60/board.cmake rename to app/boards/jpconstantineau/bluemicro840/board.cmake diff --git a/app/boards/jpconstantineau/bluemicro840/board.yml b/app/boards/jpconstantineau/bluemicro840/board.yml new file mode 100644 index 00000000000..0a9ebdd5dbd --- /dev/null +++ b/app/boards/jpconstantineau/bluemicro840/board.yml @@ -0,0 +1,5 @@ +board: + name: bluemicro840 + vendor: jpconstantineau + socs: + - name: nrf52840 diff --git a/app/boards/arm/bluemicro840/pre_dt_board.cmake b/app/boards/jpconstantineau/bluemicro840/pre_dt_board.cmake similarity index 100% rename from app/boards/arm/bluemicro840/pre_dt_board.cmake rename to app/boards/jpconstantineau/bluemicro840/pre_dt_board.cmake diff --git a/app/boards/arm/kbdfans_tofu65/Kconfig.defconfig b/app/boards/kbdfans/tofu65/Kconfig.defconfig similarity index 74% rename from app/boards/arm/kbdfans_tofu65/Kconfig.defconfig rename to app/boards/kbdfans/tofu65/Kconfig.defconfig index 0444f510105..0a524c4e23f 100644 --- a/app/boards/arm/kbdfans_tofu65/Kconfig.defconfig +++ b/app/boards/kbdfans/tofu65/Kconfig.defconfig @@ -1,7 +1,7 @@ # Copyright (c) 2023 The ZMK Contributors # SPDX-License-Identifier: MIT -if BOARD_KBDFANS_TOFU65_V2 +if BOARD_TOFU65 config ZMK_KEYBOARD_NAME default "kbdfans tofu65" @@ -9,4 +9,4 @@ config ZMK_KEYBOARD_NAME config RP2_FLASH_W25Q080 default y -endif # BOARD_KBDFANS_TOFU65_V2 +endif # BOARD_TOFU65 diff --git a/app/boards/kbdfans/tofu65/Kconfig.tofu65 b/app/boards/kbdfans/tofu65/Kconfig.tofu65 new file mode 100644 index 00000000000..3754f9369d1 --- /dev/null +++ b/app/boards/kbdfans/tofu65/Kconfig.tofu65 @@ -0,0 +1,8 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_TOFU65 + select SOC_RP2040 + 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 new file mode 100644 index 00000000000..a044fea2592 --- /dev/null +++ b/app/boards/kbdfans/tofu65/board.yml @@ -0,0 +1,5 @@ +board: + name: tofu65 + vendor: kbdfans + socs: + - name: rp2040 diff --git a/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.dts b/app/boards/kbdfans/tofu65/tofu65.dts similarity index 91% rename from app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.dts rename to app/boards/kbdfans/tofu65/tofu65.dts index bc6a9d02b4b..d1249c838eb 100644 --- a/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.dts +++ b/app/boards/kbdfans/tofu65/tofu65.dts @@ -5,7 +5,9 @@ /dts-v1/; -#include +#include +#include + #include #include @@ -15,17 +17,12 @@ 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>; @@ -107,11 +104,23 @@ 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/arm/kbdfans_tofu65/kbdfans_tofu65_v2.keymap b/app/boards/kbdfans/tofu65/tofu65.keymap similarity index 100% rename from app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.keymap rename to app/boards/kbdfans/tofu65/tofu65.keymap diff --git a/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.yaml b/app/boards/kbdfans/tofu65/tofu65.yaml similarity index 84% rename from app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.yaml rename to app/boards/kbdfans/tofu65/tofu65.yaml index e1089766da2..458b157f005 100644 --- a/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.yaml +++ b/app/boards/kbdfans/tofu65/tofu65.yaml @@ -1,4 +1,4 @@ -identifier: kbdfans_tofu65_v2 +identifier: tofu65 name: KBDfans Tofu65 2.0 type: mcu arch: arm diff --git a/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.zmk.yml b/app/boards/kbdfans/tofu65/tofu65.zmk.yml similarity index 88% rename from app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.zmk.yml rename to app/boards/kbdfans/tofu65/tofu65.zmk.yml index 382e7dd3603..b8ef43b362f 100644 --- a/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.zmk.yml +++ b/app/boards/kbdfans/tofu65/tofu65.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: kbdfans_tofu65_v2 +id: tofu65 name: KBDfans Tofu65 2.0 type: board arch: arm diff --git a/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2_defconfig b/app/boards/kbdfans/tofu65/tofu65_defconfig similarity index 83% rename from app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2_defconfig rename to app/boards/kbdfans/tofu65/tofu65_defconfig index 57014acf37a..a0ac1c3b92f 100644 --- a/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2_defconfig +++ b/app/boards/kbdfans/tofu65/tofu65_defconfig @@ -1,10 +1,6 @@ # 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 @@ -12,6 +8,7 @@ CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=125000000 # Enable reset by default CONFIG_RESET=y +CONFIG_CLOCK_CONTROL=y # Code partition needed to target the correct flash range CONFIG_USE_DT_CODE_PARTITION=y diff --git a/app/boards/keebio/bdn9/Kconfig.bdn9 b/app/boards/keebio/bdn9/Kconfig.bdn9 new file mode 100644 index 00000000000..29055ef5776 --- /dev/null +++ b/app/boards/keebio/bdn9/Kconfig.bdn9 @@ -0,0 +1,5 @@ +# Copyright (c) 2020 Pete Johanson +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_BDN9 + select SOC_STM32F072XB diff --git a/app/boards/arm/bdn9/Kconfig.defconfig b/app/boards/keebio/bdn9/Kconfig.defconfig similarity index 78% rename from app/boards/arm/bdn9/Kconfig.defconfig rename to app/boards/keebio/bdn9/Kconfig.defconfig index 96b7fe55329..3b6c065277a 100644 --- a/app/boards/arm/bdn9/Kconfig.defconfig +++ b/app/boards/keebio/bdn9/Kconfig.defconfig @@ -11,8 +11,4 @@ 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/arm/bdn9/README.md b/app/boards/keebio/bdn9/README.md similarity index 100% rename from app/boards/arm/bdn9/README.md rename to app/boards/keebio/bdn9/README.md diff --git a/app/boards/arm/bdn9/bdn9_rev2-layouts.dtsi b/app/boards/keebio/bdn9/bdn9-layouts.dtsi similarity index 100% rename from app/boards/arm/bdn9/bdn9_rev2-layouts.dtsi rename to app/boards/keebio/bdn9/bdn9-layouts.dtsi diff --git a/app/boards/arm/bdn9/bdn9_rev2.conf b/app/boards/keebio/bdn9/bdn9.conf similarity index 100% rename from app/boards/arm/bdn9/bdn9_rev2.conf rename to app/boards/keebio/bdn9/bdn9.conf diff --git a/app/boards/arm/bdn9/bdn9_rev2.dts b/app/boards/keebio/bdn9/bdn9.dts similarity index 99% rename from app/boards/arm/bdn9/bdn9_rev2.dts rename to app/boards/keebio/bdn9/bdn9.dts index 389d23b7de6..542c5341cab 100644 --- a/app/boards/arm/bdn9/bdn9_rev2.dts +++ b/app/boards/keebio/bdn9/bdn9.dts @@ -11,7 +11,7 @@ #include -#include "bdn9_rev2-layouts.dtsi" +#include "bdn9-layouts.dtsi" &physical_layout0 { transform = <&matrix_transform0>; diff --git a/app/boards/arm/bdn9/bdn9_rev2.keymap b/app/boards/keebio/bdn9/bdn9.keymap similarity index 100% rename from app/boards/arm/bdn9/bdn9_rev2.keymap rename to app/boards/keebio/bdn9/bdn9.keymap diff --git a/app/boards/arm/bdn9/bdn9_rev2.yaml b/app/boards/keebio/bdn9/bdn9.yaml similarity index 100% rename from app/boards/arm/bdn9/bdn9_rev2.yaml rename to app/boards/keebio/bdn9/bdn9.yaml diff --git a/app/boards/arm/bdn9/bdn9_rev2.zmk.yml b/app/boards/keebio/bdn9/bdn9.zmk.yml similarity index 72% rename from app/boards/arm/bdn9/bdn9_rev2.zmk.yml rename to app/boards/keebio/bdn9/bdn9.zmk.yml index 4680746f22d..4991888c44a 100644 --- a/app/boards/arm/bdn9/bdn9_rev2.zmk.yml +++ b/app/boards/keebio/bdn9/bdn9.zmk.yml @@ -1,6 +1,6 @@ file_format: "1" -id: bdn9_rev2 -name: BDN9 Rev2 +id: bdn9 +name: BDN9 (Rev2) type: board arch: arm outputs: @@ -9,3 +9,6 @@ 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/arm/bdn9/bdn9_rev2_defconfig b/app/boards/keebio/bdn9/bdn9_defconfig similarity index 85% rename from app/boards/arm/bdn9/bdn9_rev2_defconfig rename to app/boards/keebio/bdn9/bdn9_defconfig index a59fa522114..ce598bd23ed 100644 --- a/app/boards/arm/bdn9/bdn9_rev2_defconfig +++ b/app/boards/keebio/bdn9/bdn9_defconfig @@ -1,7 +1,5 @@ # SPDX-License-Identifier: MIT -CONFIG_SOC_SERIES_STM32F0X=y -CONFIG_SOC_STM32F072XB=y # 72MHz system clock CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=72000000 @@ -14,6 +12,7 @@ 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/arm/bdn9/board.cmake b/app/boards/keebio/bdn9/board.cmake similarity index 100% rename from app/boards/arm/bdn9/board.cmake rename to app/boards/keebio/bdn9/board.cmake diff --git a/app/boards/keebio/bdn9/board.yml b/app/boards/keebio/bdn9/board.yml new file mode 100644 index 00000000000..45eaad64145 --- /dev/null +++ b/app/boards/keebio/bdn9/board.yml @@ -0,0 +1,10 @@ +board: + name: bdn9 + vendor: keebio + socs: + - name: stm32f072xb + revision: + format: major.minor.patch + default: 2.0.0 + revisions: + - name: 2.0.0 diff --git a/app/boards/arm/nrfmicro/CMakeLists.txt b/app/boards/keycapsss/puchi_ble/CMakeLists.txt similarity index 100% rename from app/boards/arm/nrfmicro/CMakeLists.txt rename to app/boards/keycapsss/puchi_ble/CMakeLists.txt diff --git a/app/boards/arm/puchi_ble/Kconfig b/app/boards/keycapsss/puchi_ble/Kconfig similarity index 100% rename from app/boards/arm/puchi_ble/Kconfig rename to app/boards/keycapsss/puchi_ble/Kconfig diff --git a/app/boards/arm/puchi_ble/Kconfig.defconfig b/app/boards/keycapsss/puchi_ble/Kconfig.defconfig similarity index 81% rename from app/boards/arm/puchi_ble/Kconfig.defconfig rename to app/boards/keycapsss/puchi_ble/Kconfig.defconfig index 0ba7eefd043..0411ee3f217 100644 --- a/app/boards/arm/puchi_ble/Kconfig.defconfig +++ b/app/boards/keycapsss/puchi_ble/Kconfig.defconfig @@ -1,7 +1,7 @@ # Copyright (c) 2022 The ZMK Contributors # SPDX-License-Identifier: MIT -if BOARD_PUCHI_BLE_v1 +if BOARD_PUCHI_BLE config BOARD default "puchi_ble" @@ -16,4 +16,4 @@ endif # USB_DEVICE_STACK config BT_CTLR default BT -endif # BOARD_PUCHI_BLE_v1 +endif # BOARD_PUCHI_BLE diff --git a/app/boards/keycapsss/puchi_ble/Kconfig.puchi_ble b/app/boards/keycapsss/puchi_ble/Kconfig.puchi_ble new file mode 100644 index 00000000000..3132790266b --- /dev/null +++ b/app/boards/keycapsss/puchi_ble/Kconfig.puchi_ble @@ -0,0 +1,10 @@ +# Puchi-BLE board configuration + +# Copyright (c) 2022 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/boards/arm/puchi_ble/arduino_pro_micro_pins.dtsi b/app/boards/keycapsss/puchi_ble/arduino_pro_micro_pins.dtsi similarity index 100% rename from app/boards/arm/puchi_ble/arduino_pro_micro_pins.dtsi rename to app/boards/keycapsss/puchi_ble/arduino_pro_micro_pins.dtsi diff --git a/app/boards/arm/puchi_ble/board.cmake b/app/boards/keycapsss/puchi_ble/board.cmake similarity index 100% rename from app/boards/arm/puchi_ble/board.cmake rename to app/boards/keycapsss/puchi_ble/board.cmake diff --git a/app/boards/keycapsss/puchi_ble/board.yml b/app/boards/keycapsss/puchi_ble/board.yml new file mode 100644 index 00000000000..d192a306393 --- /dev/null +++ b/app/boards/keycapsss/puchi_ble/board.yml @@ -0,0 +1,5 @@ +board: + name: puchi_ble + vendor: keycapsss + socs: + - name: nrf52840 diff --git a/app/boards/arm/puchi_ble/pinmux.c b/app/boards/keycapsss/puchi_ble/pinmux.c similarity index 95% rename from app/boards/arm/puchi_ble/pinmux.c rename to app/boards/keycapsss/puchi_ble/pinmux.c index 8475cfb1bdc..42689383d51 100644 --- a/app/boards/arm/puchi_ble/pinmux.c +++ b/app/boards/keycapsss/puchi_ble/pinmux.c @@ -12,7 +12,7 @@ #include static int pinmux_puchi_ble_init(void) { -#if CONFIG_BOARD_PUCHI_BLE_v1 +#if CONFIG_BOARD_PUCHI_BLE 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/arm/bt60/pre_dt_board.cmake b/app/boards/keycapsss/puchi_ble/pre_dt_board.cmake similarity index 100% rename from app/boards/arm/bt60/pre_dt_board.cmake rename to app/boards/keycapsss/puchi_ble/pre_dt_board.cmake diff --git a/app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi b/app/boards/keycapsss/puchi_ble/puchi_ble-pinctrl.dtsi similarity index 100% rename from app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi rename to app/boards/keycapsss/puchi_ble/puchi_ble-pinctrl.dtsi diff --git a/app/boards/arm/puchi_ble/puchi_ble_v1.dts b/app/boards/keycapsss/puchi_ble/puchi_ble.dts similarity index 96% rename from app/boards/arm/puchi_ble/puchi_ble_v1.dts rename to app/boards/keycapsss/puchi_ble/puchi_ble.dts index 9f3194e036f..8195f5680d4 100644 --- a/app/boards/arm/puchi_ble/puchi_ble_v1.dts +++ b/app/boards/keycapsss/puchi_ble/puchi_ble.dts @@ -6,8 +6,10 @@ /dts-v1/; #include +#include + #include "arduino_pro_micro_pins.dtsi" -#include "puchi_ble_v1-pinctrl.dtsi" +#include "puchi_ble-pinctrl.dtsi" / { model = "puchi_ble"; diff --git a/app/boards/arm/bt60/bt60_v1.yaml b/app/boards/keycapsss/puchi_ble/puchi_ble.yaml similarity index 77% rename from app/boards/arm/bt60/bt60_v1.yaml rename to app/boards/keycapsss/puchi_ble/puchi_ble.yaml index 41fd7e40945..19d1b122f31 100644 --- a/app/boards/arm/bt60/bt60_v1.yaml +++ b/app/boards/keycapsss/puchi_ble/puchi_ble.yaml @@ -1,5 +1,5 @@ -identifier: bt60_v1 -name: BT60 V1 Soldered +identifier: puchi_ble +name: puchi_ble type: mcu arch: arm toolchain: diff --git a/app/boards/arm/puchi_ble/puchi_ble_v1.zmk.yml b/app/boards/keycapsss/puchi_ble/puchi_ble.zmk.yml similarity index 92% rename from app/boards/arm/puchi_ble/puchi_ble_v1.zmk.yml rename to app/boards/keycapsss/puchi_ble/puchi_ble.zmk.yml index f3114008043..18f6463cb2c 100644 --- a/app/boards/arm/puchi_ble/puchi_ble_v1.zmk.yml +++ b/app/boards/keycapsss/puchi_ble/puchi_ble.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: puchi_ble_v1 +id: puchi_ble name: Puchi-BLE V1 type: board arch: arm diff --git a/app/boards/arm/puchi_ble/puchi_ble_v1_defconfig b/app/boards/keycapsss/puchi_ble/puchi_ble_defconfig similarity index 81% rename from app/boards/arm/puchi_ble/puchi_ble_v1_defconfig rename to app/boards/keycapsss/puchi_ble/puchi_ble_defconfig index ab197df0a80..f6aaf5fde65 100644 --- a/app/boards/arm/puchi_ble/puchi_ble_v1_defconfig +++ b/app/boards/keycapsss/puchi_ble/puchi_ble_defconfig @@ -1,10 +1,6 @@ # 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 @@ -27,4 +23,4 @@ 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 +CONFIG_ZMK_BLE=y diff --git a/app/boards/kinesis/adv360pro/Kconfig.adv360pro_left b/app/boards/kinesis/adv360pro/Kconfig.adv360pro_left new file mode 100644 index 00000000000..dcb0218417e --- /dev/null +++ b/app/boards/kinesis/adv360pro/Kconfig.adv360pro_left @@ -0,0 +1,10 @@ +# +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT +# + +config BOARD_ADV360PRO_LEFT + select SOC_NRF52840_QIAA + imply RETAINED_MEM + imply RETENTION + imply RETENTION_BOOT_MODE \ No newline at end of file diff --git a/app/boards/kinesis/adv360pro/Kconfig.adv360pro_right b/app/boards/kinesis/adv360pro/Kconfig.adv360pro_right new file mode 100644 index 00000000000..69cde9d71a9 --- /dev/null +++ b/app/boards/kinesis/adv360pro/Kconfig.adv360pro_right @@ -0,0 +1,10 @@ +# +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT +# + +config BOARD_ADV360PRO_RIGHT + select SOC_NRF52840_QIAA + imply RETAINED_MEM + imply RETENTION + imply RETENTION_BOOT_MODE \ No newline at end of file diff --git a/app/boards/arm/adv360pro/Kconfig.defconfig b/app/boards/kinesis/adv360pro/Kconfig.defconfig similarity index 100% rename from app/boards/arm/adv360pro/Kconfig.defconfig rename to app/boards/kinesis/adv360pro/Kconfig.defconfig diff --git a/app/boards/arm/adv360pro/README.md b/app/boards/kinesis/adv360pro/README.md similarity index 100% rename from app/boards/arm/adv360pro/README.md rename to app/boards/kinesis/adv360pro/README.md diff --git a/app/boards/arm/adv360pro/adv360pro-layouts.dtsi b/app/boards/kinesis/adv360pro/adv360pro-layouts.dtsi similarity index 100% rename from app/boards/arm/adv360pro/adv360pro-layouts.dtsi rename to app/boards/kinesis/adv360pro/adv360pro-layouts.dtsi diff --git a/app/boards/arm/adv360pro/adv360pro-pinctrl.dtsi b/app/boards/kinesis/adv360pro/adv360pro-pinctrl.dtsi similarity index 100% rename from app/boards/arm/adv360pro/adv360pro-pinctrl.dtsi rename to app/boards/kinesis/adv360pro/adv360pro-pinctrl.dtsi diff --git a/app/boards/arm/adv360pro/adv360pro.dtsi b/app/boards/kinesis/adv360pro/adv360pro.dtsi similarity index 97% rename from app/boards/arm/adv360pro/adv360pro.dtsi rename to app/boards/kinesis/adv360pro/adv360pro.dtsi index ca7eaacca07..d9a00b01822 100644 --- a/app/boards/arm/adv360pro/adv360pro.dtsi +++ b/app/boards/kinesis/adv360pro/adv360pro.dtsi @@ -7,6 +7,7 @@ /dts-v1/; #include +#include #include #include @@ -71,6 +72,10 @@ }; +®1 { + regulator-initial-mode = ; +}; + &pwm0 { status = "okay"; pinctrl-0 = <&pwm0_default>; diff --git a/app/boards/arm/adv360pro/adv360pro.keymap b/app/boards/kinesis/adv360pro/adv360pro.keymap similarity index 100% rename from app/boards/arm/adv360pro/adv360pro.keymap rename to app/boards/kinesis/adv360pro/adv360pro.keymap diff --git a/app/boards/arm/adv360pro/adv360pro.yaml b/app/boards/kinesis/adv360pro/adv360pro.yaml similarity index 100% rename from app/boards/arm/adv360pro/adv360pro.yaml rename to app/boards/kinesis/adv360pro/adv360pro.yaml diff --git a/app/boards/arm/adv360pro/adv360pro.zmk.yml b/app/boards/kinesis/adv360pro/adv360pro.zmk.yml similarity index 100% rename from app/boards/arm/adv360pro/adv360pro.zmk.yml rename to app/boards/kinesis/adv360pro/adv360pro.zmk.yml diff --git a/app/boards/arm/adv360pro/adv360pro_left.dts b/app/boards/kinesis/adv360pro/adv360pro_left.dts similarity index 100% rename from app/boards/arm/adv360pro/adv360pro_left.dts rename to app/boards/kinesis/adv360pro/adv360pro_left.dts diff --git a/app/boards/arm/adv360pro/adv360pro_left_defconfig b/app/boards/kinesis/adv360pro/adv360pro_left_defconfig similarity index 90% rename from app/boards/arm/adv360pro/adv360pro_left_defconfig rename to app/boards/kinesis/adv360pro/adv360pro_left_defconfig index 6eb5a8d042a..7a8db4dc14f 100644 --- a/app/boards/arm/adv360pro/adv360pro_left_defconfig +++ b/app/boards/kinesis/adv360pro/adv360pro_left_defconfig @@ -3,10 +3,6 @@ # 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 @@ -32,7 +28,6 @@ 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/arm/adv360pro/adv360pro_right.dts b/app/boards/kinesis/adv360pro/adv360pro_right.dts similarity index 100% rename from app/boards/arm/adv360pro/adv360pro_right.dts rename to app/boards/kinesis/adv360pro/adv360pro_right.dts diff --git a/app/boards/arm/adv360pro/adv360pro_right_defconfig b/app/boards/kinesis/adv360pro/adv360pro_right_defconfig similarity index 90% rename from app/boards/arm/adv360pro/adv360pro_right_defconfig rename to app/boards/kinesis/adv360pro/adv360pro_right_defconfig index b5174549ea4..1cda90c0c30 100644 --- a/app/boards/arm/adv360pro/adv360pro_right_defconfig +++ b/app/boards/kinesis/adv360pro/adv360pro_right_defconfig @@ -3,10 +3,6 @@ # 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 @@ -32,7 +28,6 @@ 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/arm/adv360pro/board.cmake b/app/boards/kinesis/adv360pro/board.cmake similarity index 100% rename from app/boards/arm/adv360pro/board.cmake rename to app/boards/kinesis/adv360pro/board.cmake diff --git a/app/boards/kinesis/adv360pro/board.yml b/app/boards/kinesis/adv360pro/board.yml new file mode 100644 index 00000000000..1332451e5fb --- /dev/null +++ b/app/boards/kinesis/adv360pro/board.yml @@ -0,0 +1,9 @@ +boards: + - name: adv360pro_left + vendor: kinesis + socs: + - name: nrf52840 + - name: adv360pro_right + vendor: kinesis + socs: + - name: nrf52840 diff --git a/app/boards/arm/ckp/pre_dt_board.cmake b/app/boards/kinesis/adv360pro/pre_dt_board.cmake similarity index 100% rename from app/boards/arm/ckp/pre_dt_board.cmake rename to app/boards/kinesis/adv360pro/pre_dt_board.cmake diff --git a/app/boards/arm/corneish_zen/CMakeLists.txt b/app/boards/lowprokb/corneish_zen/CMakeLists.txt similarity index 100% rename from app/boards/arm/corneish_zen/CMakeLists.txt rename to app/boards/lowprokb/corneish_zen/CMakeLists.txt diff --git a/app/boards/lowprokb/corneish_zen/Kconfig.corneish_zen_left b/app/boards/lowprokb/corneish_zen/Kconfig.corneish_zen_left new file mode 100644 index 00000000000..7c0dfd7caa6 --- /dev/null +++ b/app/boards/lowprokb/corneish_zen/Kconfig.corneish_zen_left @@ -0,0 +1,10 @@ +# +# Copyright (c) 2022 Darryl deHaan +# SPDX-License-Identifier: MIT +# + +config BOARD_CORNEISH_ZEN_LEFT + select SOC_NRF52840_QIAA + 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 new file mode 100644 index 00000000000..4d8e0320b47 --- /dev/null +++ b/app/boards/lowprokb/corneish_zen/Kconfig.corneish_zen_right @@ -0,0 +1,10 @@ +# +# Copyright (c) 2022 Darryl deHaan +# SPDX-License-Identifier: MIT +# + +config BOARD_CORNEISH_ZEN_RIGHT + select SOC_NRF52840_QIAA + imply RETAINED_MEM + imply RETENTION + imply RETENTION_BOOT_MODE diff --git a/app/boards/arm/corneish_zen/Kconfig.defconfig b/app/boards/lowprokb/corneish_zen/Kconfig.defconfig similarity index 88% rename from app/boards/arm/corneish_zen/Kconfig.defconfig rename to app/boards/lowprokb/corneish_zen/Kconfig.defconfig index 11f932b5302..e4ff579a49e 100644 --- a/app/boards/arm/corneish_zen/Kconfig.defconfig +++ b/app/boards/lowprokb/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_IMG + select LV_USE_IMAGE choice ZMK_DISPLAY_STATUS_SCREEN default ZMK_DISPLAY_STATUS_SCREEN_CUSTOM @@ -79,10 +79,3 @@ 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/arm/ckp/board.cmake b/app/boards/lowprokb/corneish_zen/board.cmake similarity index 100% rename from app/boards/arm/ckp/board.cmake rename to app/boards/lowprokb/corneish_zen/board.cmake diff --git a/app/boards/lowprokb/corneish_zen/board.yml b/app/boards/lowprokb/corneish_zen/board.yml new file mode 100644 index 00000000000..97d63ec6819 --- /dev/null +++ b/app/boards/lowprokb/corneish_zen/board.yml @@ -0,0 +1,23 @@ +boards: + - name: corneish_zen_left + vendor: lowprokb + socs: + - name: nrf52840 + 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 + 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/arm/corneish_zen/corneish_zen.conf b/app/boards/lowprokb/corneish_zen/corneish_zen.conf similarity index 100% rename from app/boards/arm/corneish_zen/corneish_zen.conf rename to app/boards/lowprokb/corneish_zen/corneish_zen.conf diff --git a/app/boards/arm/corneish_zen/corneish_zen.dtsi b/app/boards/lowprokb/corneish_zen/corneish_zen.dtsi similarity index 98% rename from app/boards/arm/corneish_zen/corneish_zen.dtsi rename to app/boards/lowprokb/corneish_zen/corneish_zen.dtsi index 788b7613a5b..583f7ed3d1f 100644 --- a/app/boards/arm/corneish_zen/corneish_zen.dtsi +++ b/app/boards/lowprokb/corneish_zen/corneish_zen.dtsi @@ -7,6 +7,7 @@ /dts-v1/; #include +#include #include diff --git a/app/boards/arm/corneish_zen/corneish_zen.keymap b/app/boards/lowprokb/corneish_zen/corneish_zen.keymap similarity index 100% rename from app/boards/arm/corneish_zen/corneish_zen.keymap rename to app/boards/lowprokb/corneish_zen/corneish_zen.keymap diff --git a/app/boards/arm/corneish_zen/corneish_zen.yaml b/app/boards/lowprokb/corneish_zen/corneish_zen.yaml similarity index 90% rename from app/boards/arm/corneish_zen/corneish_zen.yaml rename to app/boards/lowprokb/corneish_zen/corneish_zen.yaml index 7975b262af1..f4092f4fb45 100644 --- a/app/boards/arm/corneish_zen/corneish_zen.yaml +++ b/app/boards/lowprokb/corneish_zen/corneish_zen.yaml @@ -1,4 +1,4 @@ -identifier: corne-ish_zen_v2 +identifier: corne-ish_zen name: Corne-ish Zen v2 url: https://lowprokb.ca/collections/keyboards/products/corne-ish-zen type: mcu diff --git a/app/boards/arm/corneish_zen/corneish_zen_v1.zmk.yml b/app/boards/lowprokb/corneish_zen/corneish_zen.zmk.yml similarity index 62% rename from app/boards/arm/corneish_zen/corneish_zen_v1.zmk.yml rename to app/boards/lowprokb/corneish_zen/corneish_zen.zmk.yml index 8bb5e18ec6a..9630386de42 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v1.zmk.yml +++ b/app/boards/lowprokb/corneish_zen/corneish_zen.zmk.yml @@ -1,6 +1,6 @@ file_format: "1" -id: corneish_zen_v1 -name: Corneish Zen v1 +id: corneish_zen +name: Corneish Zen url: https://lowprokb.ca/collections/keyboards/products/corne-ish-zen type: board arch: arm @@ -11,6 +11,9 @@ features: outputs: - usb - ble +revisions: + - 2.0.0 + - 1.0.0 siblings: - - corneish_zen_v1_left - - corneish_zen_v1_right + - corneish_zen_left + - corneish_zen_right diff --git a/app/boards/lowprokb/corneish_zen/corneish_zen_left.dts b/app/boards/lowprokb/corneish_zen/corneish_zen_left.dts new file mode 100644 index 00000000000..6849efa39fd --- /dev/null +++ b/app/boards/lowprokb/corneish_zen/corneish_zen_left.dts @@ -0,0 +1,8 @@ +/* +* +* 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/arm/corneish_zen/corneish_zen_v1_left.dts b/app/boards/lowprokb/corneish_zen/corneish_zen_left_1_0_0.overlay similarity index 99% rename from app/boards/arm/corneish_zen/corneish_zen_v1_left.dts rename to app/boards/lowprokb/corneish_zen/corneish_zen_left_1_0_0.overlay index 4230147ecd9..9b6617b1db7 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v1_left.dts +++ b/app/boards/lowprokb/corneish_zen/corneish_zen_left_1_0_0.overlay @@ -5,7 +5,6 @@ * */ -#include "corneish_zen.dtsi" /{ chosen { diff --git a/app/boards/arm/corneish_zen/corneish_zen_v1_left_defconfig b/app/boards/lowprokb/corneish_zen/corneish_zen_left_1_0_0_defconfig similarity index 92% rename from app/boards/arm/corneish_zen/corneish_zen_v1_left_defconfig rename to app/boards/lowprokb/corneish_zen/corneish_zen_left_1_0_0_defconfig index d4de8ed3ca3..cba717e3971 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v1_left_defconfig +++ b/app/boards/lowprokb/corneish_zen/corneish_zen_left_1_0_0_defconfig @@ -3,9 +3,6 @@ # 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 @@ -50,7 +47,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_left.dts b/app/boards/lowprokb/corneish_zen/corneish_zen_left_2_0_0.overlay similarity index 98% rename from app/boards/arm/corneish_zen/corneish_zen_v2_left.dts rename to app/boards/lowprokb/corneish_zen/corneish_zen_left_2_0_0.overlay index 42839b61646..a72c9be23ec 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts +++ b/app/boards/lowprokb/corneish_zen/corneish_zen_left_2_0_0.overlay @@ -5,8 +5,6 @@ * */ -#include "corneish_zen.dtsi" - /{ chosen { zephyr,display = &epd; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig b/app/boards/lowprokb/corneish_zen/corneish_zen_left_2_0_0_defconfig similarity index 92% rename from app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig rename to app/boards/lowprokb/corneish_zen/corneish_zen_left_2_0_0_defconfig index b6670fd8df5..a549c29c717 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig +++ b/app/boards/lowprokb/corneish_zen/corneish_zen_left_2_0_0_defconfig @@ -3,9 +3,6 @@ # 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 @@ -46,7 +43,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.dts b/app/boards/lowprokb/corneish_zen/corneish_zen_right.dts new file mode 100644 index 00000000000..6849efa39fd --- /dev/null +++ b/app/boards/lowprokb/corneish_zen/corneish_zen_right.dts @@ -0,0 +1,8 @@ +/* +* +* 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/arm/corneish_zen/corneish_zen_v1_right.dts b/app/boards/lowprokb/corneish_zen/corneish_zen_right_1_0_0.overlay similarity index 99% rename from app/boards/arm/corneish_zen/corneish_zen_v1_right.dts rename to app/boards/lowprokb/corneish_zen/corneish_zen_right_1_0_0.overlay index 820d316378b..2059485694b 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v1_right.dts +++ b/app/boards/lowprokb/corneish_zen/corneish_zen_right_1_0_0.overlay @@ -5,8 +5,6 @@ * */ -#include "corneish_zen.dtsi" - /{ chosen { zephyr,display = &epd; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v1_right_defconfig b/app/boards/lowprokb/corneish_zen/corneish_zen_right_1_0_0_defconfig similarity index 92% rename from app/boards/arm/corneish_zen/corneish_zen_v1_right_defconfig rename to app/boards/lowprokb/corneish_zen/corneish_zen_right_1_0_0_defconfig index ad78217f654..e44e010a419 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v1_right_defconfig +++ b/app/boards/lowprokb/corneish_zen/corneish_zen_right_1_0_0_defconfig @@ -3,9 +3,6 @@ # 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 @@ -50,7 +47,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_right.dts b/app/boards/lowprokb/corneish_zen/corneish_zen_right_2_0_0.overlay similarity index 98% rename from app/boards/arm/corneish_zen/corneish_zen_v2_right.dts rename to app/boards/lowprokb/corneish_zen/corneish_zen_right_2_0_0.overlay index b47d122fe54..dc8ef626c20 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts +++ b/app/boards/lowprokb/corneish_zen/corneish_zen_right_2_0_0.overlay @@ -5,8 +5,6 @@ * */ -#include "corneish_zen.dtsi" - /{ chosen { zephyr,display = &epd; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig b/app/boards/lowprokb/corneish_zen/corneish_zen_right_2_0_0_defconfig similarity index 92% rename from app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig rename to app/boards/lowprokb/corneish_zen/corneish_zen_right_2_0_0_defconfig index 90cfe7698d1..63b098e1369 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig +++ b/app/boards/lowprokb/corneish_zen/corneish_zen_right_2_0_0_defconfig @@ -3,9 +3,6 @@ # 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 @@ -46,7 +43,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/custom_status_screen.c b/app/boards/lowprokb/corneish_zen/custom_status_screen.c similarity index 92% rename from app/boards/arm/corneish_zen/custom_status_screen.c rename to app/boards/lowprokb/corneish_zen/custom_status_screen.c index 492239c8a57..86c1a226521 100644 --- a/app/boards/arm/corneish_zen/custom_status_screen.c +++ b/app/boards/lowprokb/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_img_create(screen); + LayersHeading = lv_image_create(screen); lv_obj_align(LayersHeading, LV_ALIGN_BOTTOM_MID, 0, -30); - lv_img_set_src(LayersHeading, &layers2); + lv_image_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_img_create(screen); - lv_img_set_src(zenlogo_icon, &zenlogo); + zenlogo_icon = lv_image_create(screen); + lv_image_set_src(zenlogo_icon, &zenlogo); lv_obj_align(zenlogo_icon, LV_ALIGN_BOTTOM_MID, 0, -5); #endif diff --git a/app/boards/arm/corneish_zen/custom_status_screen.h b/app/boards/lowprokb/corneish_zen/custom_status_screen.h similarity index 100% rename from app/boards/arm/corneish_zen/custom_status_screen.h rename to app/boards/lowprokb/corneish_zen/custom_status_screen.h diff --git a/app/boards/arm/corneish_zen/pre_dt_board.cmake b/app/boards/lowprokb/corneish_zen/pre_dt_board.cmake similarity index 100% rename from app/boards/arm/corneish_zen/pre_dt_board.cmake rename to app/boards/lowprokb/corneish_zen/pre_dt_board.cmake diff --git a/app/boards/arm/corneish_zen/widgets/battery_status.c b/app/boards/lowprokb/corneish_zen/widgets/battery_status.c similarity index 83% rename from app/boards/arm/corneish_zen/widgets/battery_status.c rename to app/boards/lowprokb/corneish_zen/widgets/battery_status.c index 622e39df6f0..044d3cee067 100644 --- a/app/boards/arm/corneish_zen/widgets/battery_status.c +++ b/app/boards/lowprokb/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_img_set_src(icon, state.usb_present ? &batt_100_chg : &batt_100); + lv_image_set_src(icon, state.usb_present ? &batt_100_chg : &batt_100); } else if (level > 74) { - lv_img_set_src(icon, state.usb_present ? &batt_75_chg : &batt_75); + lv_image_set_src(icon, state.usb_present ? &batt_75_chg : &batt_75); } else if (level > 49) { - lv_img_set_src(icon, state.usb_present ? &batt_50_chg : &batt_50); + lv_image_set_src(icon, state.usb_present ? &batt_50_chg : &batt_50); } else if (level > 24) { - lv_img_set_src(icon, state.usb_present ? &batt_25_chg : &batt_25); + lv_image_set_src(icon, state.usb_present ? &batt_25_chg : &batt_25); } else if (level > 5) { - lv_img_set_src(icon, state.usb_present ? &batt_5_chg : &batt_5); + lv_image_set_src(icon, state.usb_present ? &batt_5_chg : &batt_5); } else { - lv_img_set_src(icon, state.usb_present ? &batt_0_chg : &batt_0); + lv_image_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_img_create(parent); + widget->obj = lv_image_create(parent); sys_slist_append(&widgets, &widget->node); widget_battery_status_init(); diff --git a/app/boards/arm/corneish_zen/widgets/battery_status.h b/app/boards/lowprokb/corneish_zen/widgets/battery_status.h similarity index 100% rename from app/boards/arm/corneish_zen/widgets/battery_status.h rename to app/boards/lowprokb/corneish_zen/widgets/battery_status.h diff --git a/app/boards/arm/corneish_zen/widgets/icons/CMakeLists.txt b/app/boards/lowprokb/corneish_zen/widgets/icons/CMakeLists.txt similarity index 100% rename from app/boards/arm/corneish_zen/widgets/icons/CMakeLists.txt rename to app/boards/lowprokb/corneish_zen/widgets/icons/CMakeLists.txt diff --git a/app/boards/arm/corneish_zen/widgets/icons/USB_connected.c b/app/boards/lowprokb/corneish_zen/widgets/icons/USB_connected.c similarity index 84% rename from app/boards/arm/corneish_zen/widgets/icons/USB_connected.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/USB_connected.c index b3b60422257..266eaead996 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/USB_connected.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/USB_connected.c @@ -31,11 +31,15 @@ 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_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, +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), .data = USB_connected_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_0.c b/app/boards/lowprokb/corneish_zen/widgets/icons/batt_0.c similarity index 85% rename from app/boards/arm/corneish_zen/widgets/icons/batt_0.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/batt_0.c index a6066b95aac..4df34e652a0 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/batt_0.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/batt_0.c @@ -33,11 +33,15 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_0 ui 0x00, 0x00, 0x7c, 0x00, 0x00, }; -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, +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), .data = batt_0_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_0_chg.c b/app/boards/lowprokb/corneish_zen/widgets/icons/batt_0_chg.c similarity index 85% rename from app/boards/arm/corneish_zen/widgets/icons/batt_0_chg.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/batt_0_chg.c index 368ba288d34..95fd4eae33b 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/batt_0_chg.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/batt_0_chg.c @@ -33,11 +33,15 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_0_CH 0x00, 0x10, 0x00, 0x00, 0x00, }; -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, +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), .data = batt_0_chg_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_100.c b/app/boards/lowprokb/corneish_zen/widgets/icons/batt_100.c similarity index 85% rename from app/boards/arm/corneish_zen/widgets/icons/batt_100.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/batt_100.c index e6aa27bab2f..975508c213c 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/batt_100.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/batt_100.c @@ -33,11 +33,15 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_100 0x00, 0x00, 0x00, 0x00, 0x00, }; -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, +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), .data = batt_100_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_100_chg.c b/app/boards/lowprokb/corneish_zen/widgets/icons/batt_100_chg.c similarity index 85% rename from app/boards/arm/corneish_zen/widgets/icons/batt_100_chg.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/batt_100_chg.c index 9b2c18d4c8e..7c8b739ae01 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/batt_100_chg.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/batt_100_chg.c @@ -33,11 +33,15 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_100_ 0x00, 0x10, 0x00, 0x00, 0x00, }; -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, +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), .data = batt_100_chg_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_25.c b/app/boards/lowprokb/corneish_zen/widgets/icons/batt_25.c similarity index 85% rename from app/boards/arm/corneish_zen/widgets/icons/batt_25.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/batt_25.c index 2445ef39516..aae7338f4b3 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/batt_25.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/batt_25.c @@ -33,11 +33,15 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_25 u 0x00, 0x00, 0x00, 0x00, 0x00, }; -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, +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), .data = batt_25_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_25_chg.c b/app/boards/lowprokb/corneish_zen/widgets/icons/batt_25_chg.c similarity index 85% rename from app/boards/arm/corneish_zen/widgets/icons/batt_25_chg.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/batt_25_chg.c index 37c30812fd1..0e1852ee401 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/batt_25_chg.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/batt_25_chg.c @@ -33,11 +33,15 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_25_C 0x00, 0x10, 0x00, 0x00, 0x00, }; -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, +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), .data = batt_25_chg_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_5.c b/app/boards/lowprokb/corneish_zen/widgets/icons/batt_5.c similarity index 85% rename from app/boards/arm/corneish_zen/widgets/icons/batt_5.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/batt_5.c index e9824572f6f..e9427a8e506 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/batt_5.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/batt_5.c @@ -33,11 +33,15 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_5 ui 0x00, 0x00, 0x00, 0x00, 0x00, }; -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, +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), .data = batt_5_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_50.c b/app/boards/lowprokb/corneish_zen/widgets/icons/batt_50.c similarity index 85% rename from app/boards/arm/corneish_zen/widgets/icons/batt_50.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/batt_50.c index bbb0af48555..1e606bfc864 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/batt_50.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/batt_50.c @@ -33,11 +33,15 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_50 u 0x00, 0x00, 0x00, 0x00, 0x00, }; -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, +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), .data = batt_50_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_50_chg.c b/app/boards/lowprokb/corneish_zen/widgets/icons/batt_50_chg.c similarity index 85% rename from app/boards/arm/corneish_zen/widgets/icons/batt_50_chg.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/batt_50_chg.c index c2ced92e6ab..9e31d934df6 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/batt_50_chg.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/batt_50_chg.c @@ -33,11 +33,15 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_50_C 0x00, 0x10, 0x00, 0x00, 0x00, }; -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, +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), .data = batt_50_chg_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_5_chg.c b/app/boards/lowprokb/corneish_zen/widgets/icons/batt_5_chg.c similarity index 85% rename from app/boards/arm/corneish_zen/widgets/icons/batt_5_chg.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/batt_5_chg.c index 6a6d9d44604..5ed20b10cc1 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/batt_5_chg.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/batt_5_chg.c @@ -33,11 +33,15 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_5_CH 0x00, 0x10, 0x00, 0x00, 0x00, }; -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, +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), .data = batt_5_chg_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_75.c b/app/boards/lowprokb/corneish_zen/widgets/icons/batt_75.c similarity index 85% rename from app/boards/arm/corneish_zen/widgets/icons/batt_75.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/batt_75.c index 9918386d025..eaa78c750e1 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/batt_75.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/batt_75.c @@ -33,11 +33,15 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_75 u 0x00, 0x00, 0x00, 0x00, 0x00, }; -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, +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), .data = batt_75_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_75_chg.c b/app/boards/lowprokb/corneish_zen/widgets/icons/batt_75_chg.c similarity index 85% rename from app/boards/arm/corneish_zen/widgets/icons/batt_75_chg.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/batt_75_chg.c index 422aaabc7b4..5b2d796d84a 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/batt_75_chg.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/batt_75_chg.c @@ -33,11 +33,15 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_75_C 0x00, 0x10, 0x00, 0x00, 0x00, }; -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, +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), .data = batt_75_chg_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising.c b/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising.c similarity index 83% rename from app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising.c index daeee223a92..b57b59c8c03 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising.c @@ -32,11 +32,15 @@ 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_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, +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), .data = bluetooth_advertising_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_1.c b/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_1.c similarity index 88% rename from app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_1.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_1.c index cf5b8197454..28a65ac29f3 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_1.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_1.c @@ -37,11 +37,15 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_1 uint8_t 0x00, 0x00, 0x00, 0x00, 0x00, }; -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, +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), .data = bluetooth_advertising_1_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_2.c b/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_2.c similarity index 88% rename from app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_2.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_2.c index 184a5ce856b..4c7447cce79 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_2.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_2.c @@ -37,11 +37,15 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_2 uint8_t 0x00, 0x00, 0x00, 0x00, 0x00, }; -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, +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), .data = bluetooth_advertising_2_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_3.c b/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_3.c similarity index 88% rename from app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_3.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_3.c index e9665ff91cb..e2072eec2a6 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_3.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_3.c @@ -37,11 +37,15 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_3 uint8_t 0x00, 0x00, 0x00, 0x00, 0x00, }; -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, +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), .data = bluetooth_advertising_3_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_4.c b/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_4.c similarity index 88% rename from app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_4.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_4.c index d591f17f316..a92310770ff 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_4.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_4.c @@ -37,11 +37,15 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_4 uint8_t 0x00, 0x00, 0x00, 0x00, 0x00, }; -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, +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), .data = bluetooth_advertising_4_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_5.c b/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_5.c similarity index 88% rename from app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_5.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_5.c index 88213158197..53cb37895f2 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_5.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_advertising_5.c @@ -37,11 +37,15 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_5 uint8_t 0x00, 0x00, 0x00, 0x00, 0x00, }; -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, +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), .data = bluetooth_advertising_5_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_1.c b/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_1.c similarity index 88% rename from app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_1.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_1.c index a3cb5a2cd2d..179b7f6fa83 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_1.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_1.c @@ -37,11 +37,15 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_1 uint8_t 0x00, 0x00, 0x00, 0x00, 0x00, }; -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, +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), .data = bluetooth_connected_1_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_2.c b/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_2.c similarity index 88% rename from app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_2.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_2.c index 2ce5b939425..29122930e3a 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_2.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_2.c @@ -37,11 +37,15 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_2 uint8_t 0x00, 0x00, 0x00, 0x00, 0x00, }; -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, +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), .data = bluetooth_connected_2_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_3.c b/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_3.c similarity index 88% rename from app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_3.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_3.c index edac091f618..c25c163bf9f 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_3.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_3.c @@ -37,11 +37,15 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_3 uint8_t 0x00, 0x00, 0x00, 0x00, 0x00, }; -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, +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), .data = bluetooth_connected_3_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_4.c b/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_4.c similarity index 88% rename from app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_4.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_4.c index e79d6cb6d6c..83ae53c2a68 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_4.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_4.c @@ -37,11 +37,15 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_4 uint8_t 0x00, 0x00, 0x00, 0x00, 0x00, }; -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, +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), .data = bluetooth_connected_4_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_5.c b/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_5.c similarity index 88% rename from app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_5.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_5.c index b567aa2dfe0..9dbbcea9406 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_5.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_5.c @@ -37,11 +37,15 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_5 uint8_t 0x00, 0x00, 0x00, 0x00, 0x00, }; -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, +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), .data = bluetooth_connected_5_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_right.c b/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_right.c similarity index 88% rename from app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_right.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_right.c index 2a28a9039a5..6e14c17b08e 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_right.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_connected_right.c @@ -39,11 +39,15 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BLUETOOTH 0x00, 0x00, 0x00, 0x00, 0x00, }; -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, +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), .data = bluetooth_connected_right_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_disconnected_right.c b/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_disconnected_right.c similarity index 88% rename from app/boards/arm/corneish_zen/widgets/icons/bluetooth_disconnected_right.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_disconnected_right.c index 37974d698f6..71c67957475 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_disconnected_right.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/bluetooth_disconnected_right.c @@ -39,11 +39,15 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BLUETOOTH 0x00, 0x00, 0x00, 0x00, 0x00, }; -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, +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), .data = bluetooth_disconnected_right_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/layers.c b/app/boards/lowprokb/corneish_zen/widgets/icons/layers.c similarity index 86% rename from app/boards/arm/corneish_zen/widgets/icons/layers.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/layers.c index 86bc8dfcfe8..d6f4baabf40 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/layers.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/layers.c @@ -34,11 +34,15 @@ 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_img_dsc_t layers = { - .header.always_zero = 0, - .header.w = 35, - .header.h = 35, - .data_size = 183, - .header.cf = LV_IMG_CF_INDEXED_1BIT, +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), .data = layers_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/layers2.c b/app/boards/lowprokb/corneish_zen/widgets/icons/layers2.c similarity index 83% rename from app/boards/arm/corneish_zen/widgets/icons/layers2.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/layers2.c index 068b07576ae..53f6a445e78 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/layers2.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/layers2.c @@ -30,11 +30,15 @@ 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_img_dsc_t layers2 = { - .header.always_zero = 0, - .header.w = 78, - .header.h = 12, - .data_size = 128, - .header.cf = LV_IMG_CF_INDEXED_1BIT, +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), .data = layers2_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/icons/zenlogo.c b/app/boards/lowprokb/corneish_zen/widgets/icons/zenlogo.c similarity index 92% rename from app/boards/arm/corneish_zen/widgets/icons/zenlogo.c rename to app/boards/lowprokb/corneish_zen/widgets/icons/zenlogo.c index cc424041645..677df489398 100644 --- a/app/boards/arm/corneish_zen/widgets/icons/zenlogo.c +++ b/app/boards/lowprokb/corneish_zen/widgets/icons/zenlogo.c @@ -48,11 +48,15 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_ZENLOGO u 0x00, 0x00, 0x00, 0x00, 0x00, }; -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, +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), .data = zenlogo_map, }; diff --git a/app/boards/arm/corneish_zen/widgets/layer_status.c b/app/boards/lowprokb/corneish_zen/widgets/layer_status.c similarity index 100% rename from app/boards/arm/corneish_zen/widgets/layer_status.c rename to app/boards/lowprokb/corneish_zen/widgets/layer_status.c diff --git a/app/boards/arm/corneish_zen/widgets/layer_status.h b/app/boards/lowprokb/corneish_zen/widgets/layer_status.h similarity index 100% rename from app/boards/arm/corneish_zen/widgets/layer_status.h rename to app/boards/lowprokb/corneish_zen/widgets/layer_status.h diff --git a/app/boards/arm/corneish_zen/widgets/output_status.c b/app/boards/lowprokb/corneish_zen/widgets/output_status.c similarity index 81% rename from app/boards/arm/corneish_zen/widgets/output_status.c rename to app/boards/lowprokb/corneish_zen/widgets/output_status.c index 8e9457ebefe..a54aaada07e 100644 --- a/app/boards/arm/corneish_zen/widgets/output_status.c +++ b/app/boards/lowprokb/corneish_zen/widgets/output_status.c @@ -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_img_set_src(icon, &USB_connected); + lv_image_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_img_set_src(icon, &bluetooth_connected_1); + lv_image_set_src(icon, &bluetooth_connected_1); break; case 1: - lv_img_set_src(icon, &bluetooth_connected_2); + lv_image_set_src(icon, &bluetooth_connected_2); break; case 2: - lv_img_set_src(icon, &bluetooth_connected_3); + lv_image_set_src(icon, &bluetooth_connected_3); break; case 3: - lv_img_set_src(icon, &bluetooth_connected_4); + lv_image_set_src(icon, &bluetooth_connected_4); break; case 4: - lv_img_set_src(icon, &bluetooth_connected_5); + lv_image_set_src(icon, &bluetooth_connected_5); break; } } else { - lv_img_set_src(icon, &bluetooth_disconnected_right); + lv_image_set_src(icon, &bluetooth_disconnected_right); } } else { switch (state.selected_endpoint.ble.profile_index) { case 0: - lv_img_set_src(icon, &bluetooth_advertising_1); + lv_image_set_src(icon, &bluetooth_advertising_1); break; case 1: - lv_img_set_src(icon, &bluetooth_advertising_2); + lv_image_set_src(icon, &bluetooth_advertising_2); break; case 2: - lv_img_set_src(icon, &bluetooth_advertising_3); + lv_image_set_src(icon, &bluetooth_advertising_3); break; case 3: - lv_img_set_src(icon, &bluetooth_advertising_4); + lv_image_set_src(icon, &bluetooth_advertising_4); break; case 4: - lv_img_set_src(icon, &bluetooth_advertising_5); + lv_image_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_img_create(parent); + widget->obj = lv_image_create(parent); sys_slist_append(&widgets, &widget->node); diff --git a/app/boards/arm/corneish_zen/widgets/output_status.h b/app/boards/lowprokb/corneish_zen/widgets/output_status.h similarity index 100% rename from app/boards/arm/corneish_zen/widgets/output_status.h rename to app/boards/lowprokb/corneish_zen/widgets/output_status.h diff --git a/app/boards/arm/corneish_zen/widgets/peripheral_status.c b/app/boards/lowprokb/corneish_zen/widgets/peripheral_status.c similarity index 91% rename from app/boards/arm/corneish_zen/widgets/peripheral_status.c rename to app/boards/lowprokb/corneish_zen/widgets/peripheral_status.c index b94d45f692a..0f7c7c6d0a1 100644 --- a/app/boards/arm/corneish_zen/widgets/peripheral_status.c +++ b/app/boards/lowprokb/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_img_set_src(icon, - state.connected ? &bluetooth_connected_right : &bluetooth_disconnected_right); + lv_image_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_img_create(parent); + widget->obj = lv_image_create(parent); sys_slist_append(&widgets, &widget->node); diff --git a/app/boards/arm/corneish_zen/widgets/peripheral_status.h b/app/boards/lowprokb/corneish_zen/widgets/peripheral_status.h similarity index 100% rename from app/boards/arm/corneish_zen/widgets/peripheral_status.h rename to app/boards/lowprokb/corneish_zen/widgets/peripheral_status.h diff --git a/app/boards/arm/nrf52840_m2/Kconfig b/app/boards/makerdiary/nrf52840_m2/Kconfig similarity index 100% rename from app/boards/arm/nrf52840_m2/Kconfig rename to app/boards/makerdiary/nrf52840_m2/Kconfig diff --git a/app/boards/arm/nrf52840_m2/Kconfig.defconfig b/app/boards/makerdiary/nrf52840_m2/Kconfig.defconfig similarity index 85% rename from app/boards/arm/nrf52840_m2/Kconfig.defconfig rename to app/boards/makerdiary/nrf52840_m2/Kconfig.defconfig index a5227fc0a10..a7851c3b148 100644 --- a/app/boards/arm/nrf52840_m2/Kconfig.defconfig +++ b/app/boards/makerdiary/nrf52840_m2/Kconfig.defconfig @@ -3,9 +3,6 @@ if BOARD_NRF52840_M2 -config BOARD - default "nrf52480_m2" - if USB_DEVICE_STACK config USB_NRFX diff --git a/app/boards/makerdiary/nrf52840_m2/Kconfig.nrf52840_m2 b/app/boards/makerdiary/nrf52840_m2/Kconfig.nrf52840_m2 new file mode 100644 index 00000000000..acb746cdcd7 --- /dev/null +++ b/app/boards/makerdiary/nrf52840_m2/Kconfig.nrf52840_m2 @@ -0,0 +1,8 @@ +# Copyright (c) 2020 The ZMK Contributors +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_NRF52840_M2 + select SOC_NRF52840_QIAA + imply RETAINED_MEM + imply RETENTION + imply RETENTION_BOOT_MODE diff --git a/app/boards/arm/nrf52840_m2/board.cmake b/app/boards/makerdiary/nrf52840_m2/board.cmake similarity index 100% rename from app/boards/arm/nrf52840_m2/board.cmake rename to app/boards/makerdiary/nrf52840_m2/board.cmake diff --git a/app/boards/makerdiary/nrf52840_m2/board.yml b/app/boards/makerdiary/nrf52840_m2/board.yml new file mode 100644 index 00000000000..a1675e245cf --- /dev/null +++ b/app/boards/makerdiary/nrf52840_m2/board.yml @@ -0,0 +1,5 @@ +board: + name: nrf52840_m2 + vendor: makerdiary + socs: + - name: nrf52840 diff --git a/app/boards/arm/nrf52840_m2/nrf52840_m2.dts b/app/boards/makerdiary/nrf52840_m2/nrf52840_m2.dts similarity index 97% rename from app/boards/arm/nrf52840_m2/nrf52840_m2.dts rename to app/boards/makerdiary/nrf52840_m2/nrf52840_m2.dts index 39569f0b760..f9ffee623e2 100644 --- a/app/boards/arm/nrf52840_m2/nrf52840_m2.dts +++ b/app/boards/makerdiary/nrf52840_m2/nrf52840_m2.dts @@ -6,6 +6,7 @@ /dts-v1/; #include +#include / { model = "Makerdiary nRF52840 M.2 module"; diff --git a/app/boards/arm/nrf52840_m2/nrf52840_m2.yaml b/app/boards/makerdiary/nrf52840_m2/nrf52840_m2.yaml similarity index 100% rename from app/boards/arm/nrf52840_m2/nrf52840_m2.yaml rename to app/boards/makerdiary/nrf52840_m2/nrf52840_m2.yaml diff --git a/app/boards/arm/nrf52840_m2/nrf52840_m2.zmk.yml b/app/boards/makerdiary/nrf52840_m2/nrf52840_m2.zmk.yml similarity index 100% rename from app/boards/arm/nrf52840_m2/nrf52840_m2.zmk.yml rename to app/boards/makerdiary/nrf52840_m2/nrf52840_m2.zmk.yml diff --git a/app/boards/arm/nrf52840_m2/nrf52840_m2_defconfig b/app/boards/makerdiary/nrf52840_m2/nrf52840_m2_defconfig similarity index 81% rename from app/boards/arm/nrf52840_m2/nrf52840_m2_defconfig rename to app/boards/makerdiary/nrf52840_m2/nrf52840_m2_defconfig index 93eef9e6ef8..d0b01539e98 100644 --- a/app/boards/arm/nrf52840_m2/nrf52840_m2_defconfig +++ b/app/boards/makerdiary/nrf52840_m2/nrf52840_m2_defconfig @@ -1,10 +1,6 @@ # 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/arm/glove80/pre_dt_board.cmake b/app/boards/makerdiary/nrf52840_m2/pre_dt_board.cmake similarity index 100% rename from app/boards/arm/glove80/pre_dt_board.cmake rename to app/boards/makerdiary/nrf52840_m2/pre_dt_board.cmake diff --git a/app/boards/arm/pillbug/Kconfig b/app/boards/mechwild/pillbug/Kconfig similarity index 100% rename from app/boards/arm/pillbug/Kconfig rename to app/boards/mechwild/pillbug/Kconfig diff --git a/app/boards/arm/pillbug/Kconfig.defconfig b/app/boards/mechwild/pillbug/Kconfig.defconfig similarity index 86% rename from app/boards/arm/pillbug/Kconfig.defconfig rename to app/boards/mechwild/pillbug/Kconfig.defconfig index 48427ed3ec2..e29ed6789b3 100644 --- a/app/boards/arm/pillbug/Kconfig.defconfig +++ b/app/boards/mechwild/pillbug/Kconfig.defconfig @@ -3,9 +3,6 @@ if BOARD_PILLBUG -config BOARD - default "PillBug" - if USB_DEVICE_STACK config USB_NRFX diff --git a/app/boards/mechwild/pillbug/Kconfig.pillbug b/app/boards/mechwild/pillbug/Kconfig.pillbug new file mode 100644 index 00000000000..b8e0e148274 --- /dev/null +++ b/app/boards/mechwild/pillbug/Kconfig.pillbug @@ -0,0 +1,8 @@ +# Copyright (c) 2022 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/boards/arm/pillbug/blackpill_pins.dtsi b/app/boards/mechwild/pillbug/blackpill_pins.dtsi similarity index 100% rename from app/boards/arm/pillbug/blackpill_pins.dtsi rename to app/boards/mechwild/pillbug/blackpill_pins.dtsi diff --git a/app/boards/arm/pillbug/board.cmake b/app/boards/mechwild/pillbug/board.cmake similarity index 100% rename from app/boards/arm/pillbug/board.cmake rename to app/boards/mechwild/pillbug/board.cmake diff --git a/app/boards/mechwild/pillbug/board.yml b/app/boards/mechwild/pillbug/board.yml new file mode 100644 index 00000000000..abd15044f7e --- /dev/null +++ b/app/boards/mechwild/pillbug/board.yml @@ -0,0 +1,5 @@ +board: + name: pillbug + vendor: mechwild + socs: + - name: nrf52840 diff --git a/app/boards/arm/pillbug/pillbug-pinctrl.dtsi b/app/boards/mechwild/pillbug/pillbug-pinctrl.dtsi similarity index 100% rename from app/boards/arm/pillbug/pillbug-pinctrl.dtsi rename to app/boards/mechwild/pillbug/pillbug-pinctrl.dtsi diff --git a/app/boards/arm/pillbug/pillbug.dts b/app/boards/mechwild/pillbug/pillbug.dts similarity index 97% rename from app/boards/arm/pillbug/pillbug.dts rename to app/boards/mechwild/pillbug/pillbug.dts index cf4f62fc98b..cb2db7c467f 100644 --- a/app/boards/arm/pillbug/pillbug.dts +++ b/app/boards/mechwild/pillbug/pillbug.dts @@ -7,6 +7,8 @@ /dts-v1/; #include +#include + #include "pillbug-pinctrl.dtsi" #include "blackpill_pins.dtsi" diff --git a/app/boards/arm/pillbug/pillbug.yaml b/app/boards/mechwild/pillbug/pillbug.yaml similarity index 100% rename from app/boards/arm/pillbug/pillbug.yaml rename to app/boards/mechwild/pillbug/pillbug.yaml diff --git a/app/boards/arm/pillbug/pillbug.zmk.yml b/app/boards/mechwild/pillbug/pillbug.zmk.yml similarity index 100% rename from app/boards/arm/pillbug/pillbug.zmk.yml rename to app/boards/mechwild/pillbug/pillbug.zmk.yml diff --git a/app/boards/arm/pillbug/pillbug_defconfig b/app/boards/mechwild/pillbug/pillbug_defconfig similarity index 83% rename from app/boards/arm/pillbug/pillbug_defconfig rename to app/boards/mechwild/pillbug/pillbug_defconfig index 9ec72c417ef..f325d3588a4 100644 --- a/app/boards/arm/pillbug/pillbug_defconfig +++ b/app/boards/mechwild/pillbug/pillbug_defconfig @@ -1,10 +1,6 @@ # 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/arm/mikoto/pre_dt_board.cmake b/app/boards/mechwild/pillbug/pre_dt_board.cmake similarity index 100% rename from app/boards/arm/mikoto/pre_dt_board.cmake rename to app/boards/mechwild/pillbug/pre_dt_board.cmake diff --git a/app/boards/arm/s40nc/Kconfig.defconfig b/app/boards/mechwild/s40nc/Kconfig.defconfig similarity index 100% rename from app/boards/arm/s40nc/Kconfig.defconfig rename to app/boards/mechwild/s40nc/Kconfig.defconfig diff --git a/app/boards/mechwild/s40nc/Kconfig.s40nc b/app/boards/mechwild/s40nc/Kconfig.s40nc new file mode 100644 index 00000000000..749f8f11d12 --- /dev/null +++ b/app/boards/mechwild/s40nc/Kconfig.s40nc @@ -0,0 +1,8 @@ +# 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/arm/s40nc/README.md b/app/boards/mechwild/s40nc/README.md similarity index 100% rename from app/boards/arm/s40nc/README.md rename to app/boards/mechwild/s40nc/README.md diff --git a/app/boards/arm/s40nc/board.cmake b/app/boards/mechwild/s40nc/board.cmake similarity index 100% rename from app/boards/arm/s40nc/board.cmake rename to app/boards/mechwild/s40nc/board.cmake diff --git a/app/boards/mechwild/s40nc/board.yml b/app/boards/mechwild/s40nc/board.yml new file mode 100644 index 00000000000..3df3c330f08 --- /dev/null +++ b/app/boards/mechwild/s40nc/board.yml @@ -0,0 +1,5 @@ +board: + name: s40nc + vendor: mechwild + socs: + - name: nrf52840 diff --git a/app/boards/arm/nice60/pre_dt_board.cmake b/app/boards/mechwild/s40nc/pre_dt_board.cmake similarity index 100% rename from app/boards/arm/nice60/pre_dt_board.cmake rename to app/boards/mechwild/s40nc/pre_dt_board.cmake diff --git a/app/boards/arm/s40nc/s40nc.dts b/app/boards/mechwild/s40nc/s40nc.dts similarity index 98% rename from app/boards/arm/s40nc/s40nc.dts rename to app/boards/mechwild/s40nc/s40nc.dts index 4c37030db33..814a080176e 100644 --- a/app/boards/arm/s40nc/s40nc.dts +++ b/app/boards/mechwild/s40nc/s40nc.dts @@ -6,6 +6,8 @@ /dts-v1/; #include +#include + #include / { diff --git a/app/boards/arm/s40nc/s40nc.keymap b/app/boards/mechwild/s40nc/s40nc.keymap similarity index 100% rename from app/boards/arm/s40nc/s40nc.keymap rename to app/boards/mechwild/s40nc/s40nc.keymap diff --git a/app/boards/arm/s40nc/s40nc.yaml b/app/boards/mechwild/s40nc/s40nc.yaml similarity index 100% rename from app/boards/arm/s40nc/s40nc.yaml rename to app/boards/mechwild/s40nc/s40nc.yaml diff --git a/app/boards/arm/s40nc/s40nc.zmk.yml b/app/boards/mechwild/s40nc/s40nc.zmk.yml similarity index 100% rename from app/boards/arm/s40nc/s40nc.zmk.yml rename to app/boards/mechwild/s40nc/s40nc.zmk.yml diff --git a/app/boards/arm/s40nc/s40nc_defconfig b/app/boards/mechwild/s40nc/s40nc_defconfig similarity index 82% rename from app/boards/arm/s40nc/s40nc_defconfig rename to app/boards/mechwild/s40nc/s40nc_defconfig index b523ceb80b7..79d4175f7ec 100644 --- a/app/boards/arm/s40nc/s40nc_defconfig +++ b/app/boards/mechwild/s40nc/s40nc_defconfig @@ -1,10 +1,6 @@ # 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/arm/glove80/CMakeLists.txt b/app/boards/moergo/glove80/CMakeLists.txt similarity index 100% rename from app/boards/arm/glove80/CMakeLists.txt rename to app/boards/moergo/glove80/CMakeLists.txt diff --git a/app/boards/arm/glove80/Kconfig.defconfig b/app/boards/moergo/glove80/Kconfig.defconfig similarity index 86% rename from app/boards/arm/glove80/Kconfig.defconfig rename to app/boards/moergo/glove80/Kconfig.defconfig index b79c752f73a..6280a15120e 100644 --- a/app/boards/arm/glove80/Kconfig.defconfig +++ b/app/boards/moergo/glove80/Kconfig.defconfig @@ -52,14 +52,4 @@ 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/Kconfig.glove80_lh b/app/boards/moergo/glove80/Kconfig.glove80_lh new file mode 100644 index 00000000000..97590cd72ef --- /dev/null +++ b/app/boards/moergo/glove80/Kconfig.glove80_lh @@ -0,0 +1,8 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_GLOVE80_LH + select SOC_NRF52840_QIAA + 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 new file mode 100644 index 00000000000..07450baa546 --- /dev/null +++ b/app/boards/moergo/glove80/Kconfig.glove80_rh @@ -0,0 +1,8 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_GLOVE80_RH + select SOC_NRF52840_QIAA + imply RETAINED_MEM + imply RETENTION + imply RETENTION_BOOT_MODE diff --git a/app/boards/arm/glove80/board.cmake b/app/boards/moergo/glove80/board.cmake similarity index 100% rename from app/boards/arm/glove80/board.cmake rename to app/boards/moergo/glove80/board.cmake diff --git a/app/boards/moergo/glove80/board.yml b/app/boards/moergo/glove80/board.yml new file mode 100644 index 00000000000..fcbd7cf577d --- /dev/null +++ b/app/boards/moergo/glove80/board.yml @@ -0,0 +1,9 @@ +boards: + - name: glove80_rh + vendor: moergo + socs: + - name: nrf52840 + - name: glove80_lh + vendor: moergo + socs: + - name: nrf52840 diff --git a/app/boards/arm/glove80/glove80-layouts.dtsi b/app/boards/moergo/glove80/glove80-layouts.dtsi similarity index 100% rename from app/boards/arm/glove80/glove80-layouts.dtsi rename to app/boards/moergo/glove80/glove80-layouts.dtsi diff --git a/app/boards/arm/glove80/glove80.dtsi b/app/boards/moergo/glove80/glove80.dtsi similarity index 96% rename from app/boards/arm/glove80/glove80.dtsi rename to app/boards/moergo/glove80/glove80.dtsi index ae760163205..cf3ce7cc620 100644 --- a/app/boards/arm/glove80/glove80.dtsi +++ b/app/boards/moergo/glove80/glove80.dtsi @@ -5,6 +5,7 @@ /dts-v1/; #include +#include #include #include "glove80-layouts.dtsi" @@ -47,6 +48,10 @@ }; }; +®1 { + regulator-initial-mode = ; +}; + &adc { status = "okay"; }; diff --git a/app/boards/arm/glove80/glove80.keymap b/app/boards/moergo/glove80/glove80.keymap similarity index 100% rename from app/boards/arm/glove80/glove80.keymap rename to app/boards/moergo/glove80/glove80.keymap diff --git a/app/boards/arm/glove80/glove80.yaml b/app/boards/moergo/glove80/glove80.yaml similarity index 100% rename from app/boards/arm/glove80/glove80.yaml rename to app/boards/moergo/glove80/glove80.yaml diff --git a/app/boards/arm/glove80/glove80.zmk.yml b/app/boards/moergo/glove80/glove80.zmk.yml similarity index 100% rename from app/boards/arm/glove80/glove80.zmk.yml rename to app/boards/moergo/glove80/glove80.zmk.yml diff --git a/app/boards/arm/glove80/glove80_lh-pinctrl.dtsi b/app/boards/moergo/glove80/glove80_lh-pinctrl.dtsi similarity index 100% rename from app/boards/arm/glove80/glove80_lh-pinctrl.dtsi rename to app/boards/moergo/glove80/glove80_lh-pinctrl.dtsi diff --git a/app/boards/arm/glove80/glove80_lh.dts b/app/boards/moergo/glove80/glove80_lh.dts similarity index 100% rename from app/boards/arm/glove80/glove80_lh.dts rename to app/boards/moergo/glove80/glove80_lh.dts diff --git a/app/boards/arm/glove80/glove80_lh.keymap b/app/boards/moergo/glove80/glove80_lh.keymap similarity index 100% rename from app/boards/arm/glove80/glove80_lh.keymap rename to app/boards/moergo/glove80/glove80_lh.keymap diff --git a/app/boards/arm/glove80/glove80_lh_defconfig b/app/boards/moergo/glove80/glove80_lh_defconfig similarity index 96% rename from app/boards/arm/glove80/glove80_lh_defconfig rename to app/boards/moergo/glove80/glove80_lh_defconfig index a93f27cd8f2..9973e953e00 100644 --- a/app/boards/arm/glove80/glove80_lh_defconfig +++ b/app/boards/moergo/glove80/glove80_lh_defconfig @@ -1,10 +1,6 @@ # 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 diff --git a/app/boards/arm/glove80/glove80_rh-pinctrl.dtsi b/app/boards/moergo/glove80/glove80_rh-pinctrl.dtsi similarity index 100% rename from app/boards/arm/glove80/glove80_rh-pinctrl.dtsi rename to app/boards/moergo/glove80/glove80_rh-pinctrl.dtsi diff --git a/app/boards/arm/glove80/glove80_rh.dts b/app/boards/moergo/glove80/glove80_rh.dts similarity index 100% rename from app/boards/arm/glove80/glove80_rh.dts rename to app/boards/moergo/glove80/glove80_rh.dts diff --git a/app/boards/arm/glove80/glove80_rh.keymap b/app/boards/moergo/glove80/glove80_rh.keymap similarity index 100% rename from app/boards/arm/glove80/glove80_rh.keymap rename to app/boards/moergo/glove80/glove80_rh.keymap diff --git a/app/boards/arm/glove80/glove80_rh_defconfig b/app/boards/moergo/glove80/glove80_rh_defconfig similarity index 96% rename from app/boards/arm/glove80/glove80_rh_defconfig rename to app/boards/moergo/glove80/glove80_rh_defconfig index ef29d682a54..d45e0ded8d3 100644 --- a/app/boards/arm/glove80/glove80_rh_defconfig +++ b/app/boards/moergo/glove80/glove80_rh_defconfig @@ -1,10 +1,6 @@ # 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 diff --git a/app/boards/arm/nice_nano/pre_dt_board.cmake b/app/boards/moergo/glove80/pre_dt_board.cmake similarity index 100% rename from app/boards/arm/nice_nano/pre_dt_board.cmake rename to app/boards/moergo/glove80/pre_dt_board.cmake diff --git a/app/boards/arm/glove80/readme.md b/app/boards/moergo/glove80/readme.md similarity index 100% rename from app/boards/arm/glove80/readme.md rename to app/boards/moergo/glove80/readme.md diff --git a/app/boards/arm/glove80/usb_serial_number.c b/app/boards/moergo/glove80/usb_serial_number.c similarity index 100% rename from app/boards/arm/glove80/usb_serial_number.c rename to app/boards/moergo/glove80/usb_serial_number.c diff --git a/app/boards/native_posix.conf b/app/boards/native_posix.conf deleted file mode 100644 index c3d0260e866..00000000000 --- a/app/boards/native_posix.conf +++ /dev/null @@ -1,7 +0,0 @@ -CONFIG_GPIO=n -CONFIG_ZMK_BLE=n -CONFIG_LOG=y -CONFIG_LOG_BACKEND_SHOW_COLOR=n -CONFIG_ZMK_LOG_LEVEL_DBG=y -CONFIG_DEBUG=y -CONFIG_SYS_CLOCK_TICKS_PER_SEC=1000 diff --git a/app/boards/native_posix.overlay b/app/boards/native_posix.overlay deleted file mode 100644 index d5ebcf18454..00000000000 --- a/app/boards/native_posix.overlay +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include -#include - -/ { - chosen { - zmk,kscan = &kscan; - }; - - kscan: kscan { - compatible = "zmk,kscan-mock"; - - rows = <2>; - columns = <2>; - exit-after; - }; -}; diff --git a/app/boards/arm/nice60/Kconfig b/app/boards/nicekeyboards/nice60/Kconfig similarity index 100% rename from app/boards/arm/nice60/Kconfig rename to app/boards/nicekeyboards/nice60/Kconfig diff --git a/app/boards/arm/nice60/Kconfig.defconfig b/app/boards/nicekeyboards/nice60/Kconfig.defconfig similarity index 100% rename from app/boards/arm/nice60/Kconfig.defconfig rename to app/boards/nicekeyboards/nice60/Kconfig.defconfig diff --git a/app/boards/nicekeyboards/nice60/Kconfig.nice60 b/app/boards/nicekeyboards/nice60/Kconfig.nice60 new file mode 100644 index 00000000000..bfeedf0f917 --- /dev/null +++ b/app/boards/nicekeyboards/nice60/Kconfig.nice60 @@ -0,0 +1,8 @@ +# Copyright (c) 2021 Nick Winans +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_NICE60 + select SOC_NRF52840_QIAA + imply RETAINED_MEM + imply RETENTION + imply RETENTION_BOOT_MODE \ No newline at end of file diff --git a/app/boards/arm/nice60/README.md b/app/boards/nicekeyboards/nice60/README.md similarity index 100% rename from app/boards/arm/nice60/README.md rename to app/boards/nicekeyboards/nice60/README.md diff --git a/app/boards/arm/nice60/board.cmake b/app/boards/nicekeyboards/nice60/board.cmake similarity index 100% rename from app/boards/arm/nice60/board.cmake rename to app/boards/nicekeyboards/nice60/board.cmake diff --git a/app/boards/nicekeyboards/nice60/board.yml b/app/boards/nicekeyboards/nice60/board.yml new file mode 100644 index 00000000000..fdbe7cef1ed --- /dev/null +++ b/app/boards/nicekeyboards/nice60/board.yml @@ -0,0 +1,5 @@ +board: + name: nice60 + vendor: nicekeyboards + socs: + - name: nrf52840 diff --git a/app/boards/arm/nice60/nice60-pinctrl.dtsi b/app/boards/nicekeyboards/nice60/nice60-pinctrl.dtsi similarity index 100% rename from app/boards/arm/nice60/nice60-pinctrl.dtsi rename to app/boards/nicekeyboards/nice60/nice60-pinctrl.dtsi diff --git a/app/boards/arm/nice60/nice60.dts b/app/boards/nicekeyboards/nice60/nice60.dts similarity index 97% rename from app/boards/arm/nice60/nice60.dts rename to app/boards/nicekeyboards/nice60/nice60.dts index 35eececd439..acecda4d8e6 100644 --- a/app/boards/arm/nice60/nice60.dts +++ b/app/boards/nicekeyboards/nice60/nice60.dts @@ -6,6 +6,7 @@ /dts-v1/; #include +#include #include #include @@ -92,6 +93,10 @@ 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/arm/nice60/nice60.keymap b/app/boards/nicekeyboards/nice60/nice60.keymap similarity index 100% rename from app/boards/arm/nice60/nice60.keymap rename to app/boards/nicekeyboards/nice60/nice60.keymap diff --git a/app/boards/arm/nice60/nice60.yaml b/app/boards/nicekeyboards/nice60/nice60.yaml similarity index 100% rename from app/boards/arm/nice60/nice60.yaml rename to app/boards/nicekeyboards/nice60/nice60.yaml diff --git a/app/boards/arm/nice60/nice60.zmk.yml b/app/boards/nicekeyboards/nice60/nice60.zmk.yml similarity index 100% rename from app/boards/arm/nice60/nice60.zmk.yml rename to app/boards/nicekeyboards/nice60/nice60.zmk.yml diff --git a/app/boards/arm/nice60/nice60_defconfig b/app/boards/nicekeyboards/nice60/nice60_defconfig similarity index 79% rename from app/boards/arm/nice60/nice60_defconfig rename to app/boards/nicekeyboards/nice60/nice60_defconfig index fabcb7eddf4..9b3a9144f3a 100644 --- a/app/boards/arm/nice60/nice60_defconfig +++ b/app/boards/nicekeyboards/nice60/nice60_defconfig @@ -1,10 +1,6 @@ # 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 @@ -24,11 +20,9 @@ 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 \ No newline at end of file +CONFIG_ZMK_BLE=y diff --git a/app/boards/arm/nrf52840_m2/pre_dt_board.cmake b/app/boards/nicekeyboards/nice60/pre_dt_board.cmake similarity index 100% rename from app/boards/arm/nrf52840_m2/pre_dt_board.cmake rename to app/boards/nicekeyboards/nice60/pre_dt_board.cmake diff --git a/app/boards/nicekeyboards/nice_nano/Kconfig.nice_nano b/app/boards/nicekeyboards/nice_nano/Kconfig.nice_nano new file mode 100644 index 00000000000..d1be26ef973 --- /dev/null +++ b/app/boards/nicekeyboards/nice_nano/Kconfig.nice_nano @@ -0,0 +1,8 @@ +# Copyright (c) 2020 Pete Johanson +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_NICE_NANO + select SOC_NRF52840_QIAA + imply RETAINED_MEM + imply RETENTION + imply RETENTION_BOOT_MODE \ No newline at end of file diff --git a/app/boards/arm/nice_nano/arduino_pro_micro_pins.dtsi b/app/boards/nicekeyboards/nice_nano/arduino_pro_micro_pins.dtsi similarity index 100% rename from app/boards/arm/nice_nano/arduino_pro_micro_pins.dtsi rename to app/boards/nicekeyboards/nice_nano/arduino_pro_micro_pins.dtsi diff --git a/app/boards/arm/corneish_zen/board.cmake b/app/boards/nicekeyboards/nice_nano/board.cmake similarity index 100% rename from app/boards/arm/corneish_zen/board.cmake rename to app/boards/nicekeyboards/nice_nano/board.cmake diff --git a/app/boards/nicekeyboards/nice_nano/board.yml b/app/boards/nicekeyboards/nice_nano/board.yml new file mode 100644 index 00000000000..89171957c9c --- /dev/null +++ b/app/boards/nicekeyboards/nice_nano/board.yml @@ -0,0 +1,11 @@ +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/boards/arm/nice_nano/nice_nano-pinctrl.dtsi b/app/boards/nicekeyboards/nice_nano/nice_nano-pinctrl.dtsi similarity index 100% rename from app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi rename to app/boards/nicekeyboards/nice_nano/nice_nano-pinctrl.dtsi diff --git a/app/boards/arm/nice_nano/nice_nano.dtsi b/app/boards/nicekeyboards/nice_nano/nice_nano.dts similarity index 94% rename from app/boards/arm/nice_nano/nice_nano.dtsi rename to app/boards/nicekeyboards/nice_nano/nice_nano.dts index 839845c8e8c..0595ce137ac 100644 --- a/app/boards/arm/nice_nano/nice_nano.dtsi +++ b/app/boards/nicekeyboards/nice_nano/nice_nano.dts @@ -4,10 +4,14 @@ * SPDX-License-Identifier: MIT */ +/dts-v1/; + #include +#include #include "nice_nano-pinctrl.dtsi" #include "arduino_pro_micro_pins.dtsi" + / { model = "nice!nano"; compatible = "nice,nano"; @@ -26,6 +30,10 @@ }; }; +®1 { + regulator-initial-mode = ; +}; + &adc { status = "okay"; }; diff --git a/app/boards/arm/nice_nano/nice_nano.yaml b/app/boards/nicekeyboards/nice_nano/nice_nano.yaml similarity index 100% rename from app/boards/arm/nice_nano/nice_nano.yaml rename to app/boards/nicekeyboards/nice_nano/nice_nano.yaml diff --git a/app/boards/arm/nice_nano/nice_nano.zmk.yml b/app/boards/nicekeyboards/nice_nano/nice_nano.zmk.yml similarity index 64% rename from app/boards/arm/nice_nano/nice_nano.zmk.yml rename to app/boards/nicekeyboards/nice_nano/nice_nano.zmk.yml index 1799c0def49..2245a89ee57 100644 --- a/app/boards/arm/nice_nano/nice_nano.zmk.yml +++ b/app/boards/nicekeyboards/nice_nano/nice_nano.zmk.yml @@ -1,6 +1,6 @@ file_format: "1" id: nice_nano -name: nice!nano v1 +name: nice!nano type: board arch: arm outputs: @@ -8,3 +8,7 @@ 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/arm/nice_nano/nice_nano.dts b/app/boards/nicekeyboards/nice_nano/nice_nano_1_0_0.overlay similarity index 85% rename from app/boards/arm/nice_nano/nice_nano.dts rename to app/boards/nicekeyboards/nice_nano/nice_nano_1_0_0.overlay index 06be88e1c51..6c1590bb2a0 100644 --- a/app/boards/arm/nice_nano/nice_nano.dts +++ b/app/boards/nicekeyboards/nice_nano/nice_nano_1_0_0.overlay @@ -1,12 +1,9 @@ /* - * Copyright (c) 2021 The ZMK Contributors + * Copyright (c) 2025 The ZMK Contributors * * SPDX-License-Identifier: MIT */ -/dts-v1/; -#include "nice_nano.dtsi" - / { chosen { zmk,battery = &vbatt; diff --git a/app/boards/arm/nice_nano/nice_nano_defconfig b/app/boards/nicekeyboards/nice_nano/nice_nano_1_0_0_defconfig similarity index 81% rename from app/boards/arm/nice_nano/nice_nano_defconfig rename to app/boards/nicekeyboards/nice_nano/nice_nano_1_0_0_defconfig index 6b7fcab252d..babddaac9b2 100644 --- a/app/boards/arm/nice_nano/nice_nano_defconfig +++ b/app/boards/nicekeyboards/nice_nano/nice_nano_1_0_0_defconfig @@ -1,9 +1,5 @@ # SPDX-License-Identifier: MIT -CONFIG_SOC_SERIES_NRF52X=y -CONFIG_SOC_NRF52840_QIAA=y -CONFIG_BOARD_NICE_NANO=y - # Enable MPU CONFIG_ARM_MPU=y diff --git a/app/boards/arm/nice_nano/nice_nano_v2.dts b/app/boards/nicekeyboards/nice_nano/nice_nano_2_0_0.overlay similarity index 92% rename from app/boards/arm/nice_nano/nice_nano_v2.dts rename to app/boards/nicekeyboards/nice_nano/nice_nano_2_0_0.overlay index c4f7a821c04..34c635ffa97 100644 --- a/app/boards/arm/nice_nano/nice_nano_v2.dts +++ b/app/boards/nicekeyboards/nice_nano/nice_nano_2_0_0.overlay @@ -4,9 +4,6 @@ * SPDX-License-Identifier: MIT */ -/dts-v1/; -#include "nice_nano.dtsi" - / { chosen { zmk,battery = &vbatt; @@ -23,3 +20,7 @@ compatible = "zmk,battery-nrf-vddh"; }; }; + +®0 { + status = "okay"; +}; diff --git a/app/boards/arm/nice_nano/nice_nano_v2_defconfig b/app/boards/nicekeyboards/nice_nano/nice_nano_2_0_0_defconfig similarity index 76% rename from app/boards/arm/nice_nano/nice_nano_v2_defconfig rename to app/boards/nicekeyboards/nice_nano/nice_nano_2_0_0_defconfig index 6b5044e5ef0..03d08c91c04 100644 --- a/app/boards/arm/nice_nano/nice_nano_v2_defconfig +++ b/app/boards/nicekeyboards/nice_nano/nice_nano_2_0_0_defconfig @@ -1,9 +1,5 @@ # 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 @@ -24,4 +20,4 @@ CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y CONFIG_ZMK_BLE=y -CONFIG_ZMK_USB=y \ No newline at end of file +CONFIG_ZMK_USB=y diff --git a/app/boards/arm/nrfmicro/pre_dt_board.cmake b/app/boards/nicekeyboards/nice_nano/pre_dt_board.cmake similarity index 100% rename from app/boards/arm/nrfmicro/pre_dt_board.cmake rename to app/boards/nicekeyboards/nice_nano/pre_dt_board.cmake diff --git a/app/boards/arm/nrf52840dk_nrf52840/nrf52840dk_nrf52840.zmk.yml b/app/boards/nordic/nrf52840dk_nrf52840/nrf52840dk_nrf52840.zmk.yml similarity index 88% rename from app/boards/arm/nrf52840dk_nrf52840/nrf52840dk_nrf52840.zmk.yml rename to app/boards/nordic/nrf52840dk_nrf52840/nrf52840dk_nrf52840.zmk.yml index 2a0d99460d8..47cb6461a98 100644 --- a/app/boards/arm/nrf52840dk_nrf52840/nrf52840dk_nrf52840.zmk.yml +++ b/app/boards/nordic/nrf52840dk_nrf52840/nrf52840dk_nrf52840.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: nrf52840dk_nrf52840 +id: nrf52840dk/nrf52840 name: Nordic nRF52840 DK type: board arch: arm diff --git a/app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml.disabled b/app/boards/nordic/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml similarity index 86% rename from app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml.disabled rename to app/boards/nordic/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml index 444de996b53..96a461fe8e2 100644 --- a/app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml.disabled +++ b/app/boards/nordic/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: nrf5340dk_nrf5340_cpuapp +id: nrf5340dk/nrf5340/cpuapp name: Nordic nRF5340 DK type: board arch: arm diff --git a/app/boards/arm/planck/CMakeLists.txt b/app/boards/olkb/planck/CMakeLists.txt similarity index 100% rename from app/boards/arm/planck/CMakeLists.txt rename to app/boards/olkb/planck/CMakeLists.txt diff --git a/app/boards/arm/planck/Kconfig.defconfig b/app/boards/olkb/planck/Kconfig.defconfig similarity index 100% rename from app/boards/arm/planck/Kconfig.defconfig rename to app/boards/olkb/planck/Kconfig.defconfig diff --git a/app/boards/arm/planck/Kconfig.board b/app/boards/olkb/planck/Kconfig.planck similarity index 55% rename from app/boards/arm/planck/Kconfig.board rename to app/boards/olkb/planck/Kconfig.planck index 28b7381fb03..f8d42f0681e 100644 --- a/app/boards/arm/planck/Kconfig.board +++ b/app/boards/olkb/planck/Kconfig.planck @@ -3,6 +3,6 @@ # Copyright (c) 2020 The ZMK Contributors # SPDX-License-Identifier: MIT -config BOARD_PLANCK_REV6 - bool "Planck V6 Keyboard" - depends on SOC_STM32F303XC +config BOARD_PLANCK + bool "Planck Keyboard" + select SOC_STM32F303XC diff --git a/app/boards/arm/planck/board.cmake b/app/boards/olkb/planck/board.cmake similarity index 100% rename from app/boards/arm/planck/board.cmake rename to app/boards/olkb/planck/board.cmake diff --git a/app/boards/olkb/planck/board.yml b/app/boards/olkb/planck/board.yml new file mode 100644 index 00000000000..b81bcddbfa6 --- /dev/null +++ b/app/boards/olkb/planck/board.yml @@ -0,0 +1,10 @@ +board: + name: planck + vendor: olkb + socs: + - name: stm32f303xc + revision: + format: major.minor.patch + default: 6.0.0 + revisions: + - name: 6.0.0 diff --git a/app/boards/arm/planck/planck_rev6.dts b/app/boards/olkb/planck/planck.dts similarity index 100% rename from app/boards/arm/planck/planck_rev6.dts rename to app/boards/olkb/planck/planck.dts diff --git a/app/boards/arm/planck/planck_rev6.keymap b/app/boards/olkb/planck/planck.keymap similarity index 100% rename from app/boards/arm/planck/planck_rev6.keymap rename to app/boards/olkb/planck/planck.keymap diff --git a/app/boards/arm/planck/planck_rev6.yaml b/app/boards/olkb/planck/planck.yaml similarity index 100% rename from app/boards/arm/planck/planck_rev6.yaml rename to app/boards/olkb/planck/planck.yaml diff --git a/app/boards/arm/planck/planck_rev6.zmk.yml b/app/boards/olkb/planck/planck.zmk.yml similarity index 61% rename from app/boards/arm/planck/planck_rev6.zmk.yml rename to app/boards/olkb/planck/planck.zmk.yml index f9d42424742..42e83d12f9e 100644 --- a/app/boards/arm/planck/planck_rev6.zmk.yml +++ b/app/boards/olkb/planck/planck.zmk.yml @@ -1,6 +1,6 @@ file_format: "1" -id: planck_rev6 -name: Planck Rev6 +id: planck +name: Planck (Rev6) type: board arch: arm features: @@ -9,3 +9,6 @@ features: outputs: - usb url: https://olkb.com/collections/planck +revisions: + - "6.0.0" +default_revision: "6.0.0" diff --git a/app/boards/arm/planck/planck_rev6_defconfig b/app/boards/olkb/planck/planck_6_0_0_defconfig similarity index 85% rename from app/boards/arm/planck/planck_rev6_defconfig rename to app/boards/olkb/planck/planck_6_0_0_defconfig index f453063900f..154e7687b61 100644 --- a/app/boards/arm/planck/planck_rev6_defconfig +++ b/app/boards/olkb/planck/planck_6_0_0_defconfig @@ -1,7 +1,5 @@ # 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/arm/preonic/CMakeLists.txt b/app/boards/olkb/preonic/CMakeLists.txt similarity index 100% rename from app/boards/arm/preonic/CMakeLists.txt rename to app/boards/olkb/preonic/CMakeLists.txt diff --git a/app/boards/arm/preonic/Kconfig.defconfig b/app/boards/olkb/preonic/Kconfig.defconfig similarity index 80% rename from app/boards/arm/preonic/Kconfig.defconfig rename to app/boards/olkb/preonic/Kconfig.defconfig index 86b2e3d0ef4..ab7b9b52548 100644 --- a/app/boards/arm/preonic/Kconfig.defconfig +++ b/app/boards/olkb/preonic/Kconfig.defconfig @@ -3,7 +3,7 @@ # Copyright (c) 2022 The ZMK Contributors # SPDX-License-Identifier: MIT -if BOARD_PREONIC_REV3 +if BOARD_PREONIC 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_REV3 +endif # BOARD_PREONIC diff --git a/app/boards/arm/preonic/Kconfig.board b/app/boards/olkb/preonic/Kconfig.preonic similarity index 55% rename from app/boards/arm/preonic/Kconfig.board rename to app/boards/olkb/preonic/Kconfig.preonic index 39f35db6b50..d7caf7336f1 100644 --- a/app/boards/arm/preonic/Kconfig.board +++ b/app/boards/olkb/preonic/Kconfig.preonic @@ -3,6 +3,5 @@ # Copyright (c) 2022 The ZMK Contributors # SPDX-License-Identifier: MIT -config BOARD_PREONIC_REV3 - bool "Preonic V3 Keyboard" - depends on SOC_STM32F303XC +config BOARD_PREONIC + select SOC_STM32F303XC diff --git a/app/boards/arm/preonic/board.cmake b/app/boards/olkb/preonic/board.cmake similarity index 100% rename from app/boards/arm/preonic/board.cmake rename to app/boards/olkb/preonic/board.cmake diff --git a/app/boards/olkb/preonic/board.yml b/app/boards/olkb/preonic/board.yml new file mode 100644 index 00000000000..688df6846f7 --- /dev/null +++ b/app/boards/olkb/preonic/board.yml @@ -0,0 +1,10 @@ +board: + name: preonic + vendor: olkb + socs: + - name: stm32f303xc + revision: + format: major.minor.patch + default: 3.0.0 + revisions: + - name: 3.0.0 diff --git a/app/boards/arm/preonic/preonic_rev3.dts b/app/boards/olkb/preonic/preonic.dts similarity index 100% rename from app/boards/arm/preonic/preonic_rev3.dts rename to app/boards/olkb/preonic/preonic.dts diff --git a/app/boards/arm/preonic/preonic_rev3.keymap b/app/boards/olkb/preonic/preonic.keymap similarity index 100% rename from app/boards/arm/preonic/preonic_rev3.keymap rename to app/boards/olkb/preonic/preonic.keymap diff --git a/app/boards/arm/preonic/preonic_rev3.yaml b/app/boards/olkb/preonic/preonic.yaml similarity index 100% rename from app/boards/arm/preonic/preonic_rev3.yaml rename to app/boards/olkb/preonic/preonic.yaml diff --git a/app/boards/arm/preonic/preonic_rev3.zmk.yml b/app/boards/olkb/preonic/preonic.zmk.yml similarity index 69% rename from app/boards/arm/preonic/preonic_rev3.zmk.yml rename to app/boards/olkb/preonic/preonic.zmk.yml index bd9d95794da..692f91a83f5 100644 --- a/app/boards/arm/preonic/preonic_rev3.zmk.yml +++ b/app/boards/olkb/preonic/preonic.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: preonic_rev3 +id: preonic name: Preonic Rev3 type: board arch: arm @@ -8,3 +8,6 @@ features: outputs: - usb url: https://olkb.com/collections/preonic +revisions: + - "3.0.0" +default_revision: "3.0.0" diff --git a/app/boards/arm/preonic/preonic_rev3_defconfig b/app/boards/olkb/preonic/preonic_defconfig similarity index 74% rename from app/boards/arm/preonic/preonic_rev3_defconfig rename to app/boards/olkb/preonic/preonic_defconfig index e063827a4e2..fbe05d58953 100644 --- a/app/boards/arm/preonic/preonic_rev3_defconfig +++ b/app/boards/olkb/preonic/preonic_defconfig @@ -1,7 +1,5 @@ # 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,4 +12,4 @@ CONFIG_GPIO=y # clock configuration CONFIG_CLOCK_CONTROL=y -CONFIG_ZMK_USB=y \ No newline at end of file +CONFIG_ZMK_USB=y diff --git a/app/boards/arm/ferris/Kconfig.defconfig b/app/boards/pierrechevalier83/ferris/Kconfig.defconfig similarity index 85% rename from app/boards/arm/ferris/Kconfig.defconfig rename to app/boards/pierrechevalier83/ferris/Kconfig.defconfig index 420ea01fab9..1c8ed02c25c 100644 --- a/app/boards/arm/ferris/Kconfig.defconfig +++ b/app/boards/pierrechevalier83/ferris/Kconfig.defconfig @@ -5,9 +5,6 @@ if BOARD_FERRIS -config BOARD - default "ferris_rev02" - config ZMK_KEYBOARD_NAME default "Ferris rev 0.2" diff --git a/app/boards/pierrechevalier83/ferris/Kconfig.ferris b/app/boards/pierrechevalier83/ferris/Kconfig.ferris new file mode 100644 index 00000000000..66f0aa237cb --- /dev/null +++ b/app/boards/pierrechevalier83/ferris/Kconfig.ferris @@ -0,0 +1,13 @@ +# Ferris board configuration + +# Copyright (c) 2020 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_FERRIS + select SOC_STM32F072XB + imply RETAINED_MEM + imply RETENTION + imply RETENTION_BOOT_MODE + imply STM32_BOOTLOADER + imply RTC + imply BBRAM diff --git a/app/boards/arm/ferris/README.md b/app/boards/pierrechevalier83/ferris/README.md similarity index 79% rename from app/boards/arm/ferris/README.md rename to app/boards/pierrechevalier83/ferris/README.md index b6fdcdf26ae..3dbfb1ba454 100644 --- a/app/boards/arm/ferris/README.md +++ b/app/boards/pierrechevalier83/ferris/README.md @@ -3,7 +3,7 @@ ## Standard Build ``` -west build -p -d build/ferris --board ferris_rev02 +west build -p -d build/ferris --board ferris ``` ## Flashing diff --git a/app/boards/arm/ferris/board.cmake b/app/boards/pierrechevalier83/ferris/board.cmake similarity index 100% rename from app/boards/arm/ferris/board.cmake rename to app/boards/pierrechevalier83/ferris/board.cmake diff --git a/app/boards/pierrechevalier83/ferris/board.yml b/app/boards/pierrechevalier83/ferris/board.yml new file mode 100644 index 00000000000..3bed9d0b436 --- /dev/null +++ b/app/boards/pierrechevalier83/ferris/board.yml @@ -0,0 +1,5 @@ +board: + name: ferris + vendor: pierrechevalier83 + socs: + - name: stm32f072xb diff --git a/app/boards/arm/ferris/ferris_rev02.dts b/app/boards/pierrechevalier83/ferris/ferris.dts similarity index 85% rename from app/boards/arm/ferris/ferris_rev02.dts rename to app/boards/pierrechevalier83/ferris/ferris.dts index 1ec9a8043e9..c49ae602a50 100644 --- a/app/boards/arm/ferris/ferris_rev02.dts +++ b/app/boards/pierrechevalier83/ferris/ferris.dts @@ -106,7 +106,7 @@ clock-frequency = ; right_io: mcp23017@20 { - compatible = "microchip,mcp230xx"; + compatible = "microchip,mcp23017"; status = "okay"; gpio-controller; reg = <0x20>; @@ -147,9 +147,37 @@ 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/arm/ferris/ferris_rev02.keymap b/app/boards/pierrechevalier83/ferris/ferris.keymap similarity index 100% rename from app/boards/arm/ferris/ferris_rev02.keymap rename to app/boards/pierrechevalier83/ferris/ferris.keymap diff --git a/app/boards/arm/ferris/ferris_rev02.yaml b/app/boards/pierrechevalier83/ferris/ferris.yaml similarity index 83% rename from app/boards/arm/ferris/ferris_rev02.yaml rename to app/boards/pierrechevalier83/ferris/ferris.yaml index f4cbdcaf72c..d2dbfa0a322 100644 --- a/app/boards/arm/ferris/ferris_rev02.yaml +++ b/app/boards/pierrechevalier83/ferris/ferris.yaml @@ -1,4 +1,4 @@ -identifier: ferris_rev02 +identifier: ferris name: Ferris 0.2 type: mcu arch: arm diff --git a/app/boards/arm/ferris/ferris_rev02.zmk.yml b/app/boards/pierrechevalier83/ferris/ferris.zmk.yml similarity index 90% rename from app/boards/arm/ferris/ferris_rev02.zmk.yml rename to app/boards/pierrechevalier83/ferris/ferris.zmk.yml index da3a7f53469..841f437a4d3 100644 --- a/app/boards/arm/ferris/ferris_rev02.zmk.yml +++ b/app/boards/pierrechevalier83/ferris/ferris.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: ferris_rev02 +id: ferris name: Ferris 0.2 type: board arch: arm diff --git a/app/boards/arm/ferris/ferris_rev02_defconfig b/app/boards/pierrechevalier83/ferris/ferris_defconfig similarity index 84% rename from app/boards/arm/ferris/ferris_rev02_defconfig rename to app/boards/pierrechevalier83/ferris/ferris_defconfig index bd03c3050d7..eb55b019386 100644 --- a/app/boards/arm/ferris/ferris_rev02_defconfig +++ b/app/boards/pierrechevalier83/ferris/ferris_defconfig @@ -1,8 +1,5 @@ # 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/polarityworks/bt60/Kconfig.bt60 b/app/boards/polarityworks/bt60/Kconfig.bt60 new file mode 100644 index 00000000000..62c6c3dd527 --- /dev/null +++ b/app/boards/polarityworks/bt60/Kconfig.bt60 @@ -0,0 +1,10 @@ +# CKP BT60 board configuration + +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_BT60 + select SOC_NRF52840_QIAA + 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 new file mode 100644 index 00000000000..f026d266b72 --- /dev/null +++ b/app/boards/polarityworks/bt60/Kconfig.bt60_hs @@ -0,0 +1,10 @@ +# BT60 HS board configuration + +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_BT60_HS + select SOC_NRF52840_QIAA + 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 new file mode 100644 index 00000000000..1b681d07cab --- /dev/null +++ b/app/boards/polarityworks/bt60/Kconfig.defconfig @@ -0,0 +1,22 @@ +# 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/arm/mikoto/board.cmake b/app/boards/polarityworks/bt60/board.cmake similarity index 100% rename from app/boards/arm/mikoto/board.cmake rename to app/boards/polarityworks/bt60/board.cmake diff --git a/app/boards/polarityworks/bt60/board.yml b/app/boards/polarityworks/bt60/board.yml new file mode 100644 index 00000000000..2db078f6bbd --- /dev/null +++ b/app/boards/polarityworks/bt60/board.yml @@ -0,0 +1,15 @@ +boards: + - name: bt60_hs + vendor: polarityworks + socs: + - name: nrf52840 + - name: bt60 + vendor: polarityworks + 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/boards/arm/bt60/bt60.dtsi b/app/boards/polarityworks/bt60/bt60.dts similarity index 65% rename from app/boards/arm/bt60/bt60.dtsi rename to app/boards/polarityworks/bt60/bt60.dts index 5e176e60244..d4c52c1c9c9 100644 --- a/app/boards/arm/bt60/bt60.dtsi +++ b/app/boards/polarityworks/bt60/bt60.dts @@ -1,17 +1,14 @@ /* -* Copyright (c) 2021 Polarity Works +* Copyright (c) 2022 The ZMK Contributors * * SPDX-License-Identifier: MIT */ /dts-v1/; #include -#include +#include / { - model = "BT60"; - compatible = "polarityworks,bt60"; - chosen { zephyr,code-partition = &code_partition; zephyr,sram = &sram0; @@ -19,35 +16,9 @@ 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)>; }; }; @@ -71,7 +42,6 @@ zephyr_udc0: &usbd { status = "okay"; }; - &flash0 { /* * For more information, see: diff --git a/app/boards/arm/ckp/bt60_v2.yaml b/app/boards/polarityworks/bt60/bt60.yaml similarity index 88% rename from app/boards/arm/ckp/bt60_v2.yaml rename to app/boards/polarityworks/bt60/bt60.yaml index 2a3f3b47a47..c2dc3736b5a 100644 --- a/app/boards/arm/ckp/bt60_v2.yaml +++ b/app/boards/polarityworks/bt60/bt60.yaml @@ -1,4 +1,4 @@ -identifier: bt60_v2 +identifier: bt60 name: BT60 V2 type: mcu arch: arm diff --git a/app/boards/arm/ckp/bt60_v2.zmk.yml b/app/boards/polarityworks/bt60/bt60.zmk.yml similarity index 82% rename from app/boards/arm/ckp/bt60_v2.zmk.yml rename to app/boards/polarityworks/bt60/bt60.zmk.yml index eef36a4e27c..bec416a970f 100644 --- a/app/boards/arm/ckp/bt60_v2.zmk.yml +++ b/app/boards/polarityworks/bt60/bt60.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: bt60_v2 +id: bt60 name: BT60 V2 type: board arch: arm @@ -12,4 +12,7 @@ features: outputs: - usb - ble +revisions: + - 2.0.0 + - 1.0.0 url: https://polarityworks.com/btckp diff --git a/app/boards/polarityworks/bt60/bt60_1_0_0.dtsi b/app/boards/polarityworks/bt60/bt60_1_0_0.dtsi new file mode 100644 index 00000000000..d760b284410 --- /dev/null +++ b/app/boards/polarityworks/bt60/bt60_1_0_0.dtsi @@ -0,0 +1,38 @@ +/* +* 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/arm/bt60/bt60_v1.keymap b/app/boards/polarityworks/bt60/bt60_1_0_0.keymap similarity index 99% rename from app/boards/arm/bt60/bt60_v1.keymap rename to app/boards/polarityworks/bt60/bt60_1_0_0.keymap index 65442b582e0..9395769578b 100644 --- a/app/boards/arm/bt60/bt60_v1.keymap +++ b/app/boards/polarityworks/bt60/bt60_1_0_0.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_v1.keymap" + #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt60.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_v2.keymap" + #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt60.keymap" #endif }; }; diff --git a/app/boards/arm/bt60/bt60_v1.dts b/app/boards/polarityworks/bt60/bt60_1_0_0.overlay similarity index 99% rename from app/boards/arm/bt60/bt60_v1.dts rename to app/boards/polarityworks/bt60/bt60_1_0_0.overlay index 5790458d0d4..c132266d372 100644 --- a/app/boards/arm/bt60/bt60_v1.dts +++ b/app/boards/polarityworks/bt60/bt60_1_0_0.overlay @@ -4,8 +4,7 @@ * SPDX-License-Identifier: MIT */ -/dts-v1/; -#include "bt60.dtsi" +#include "bt60_1_0_0.dtsi" #include #include #include diff --git a/app/boards/arm/bt60/bt60_v1_defconfig b/app/boards/polarityworks/bt60/bt60_1_0_0_defconfig similarity index 79% rename from app/boards/arm/bt60/bt60_v1_defconfig rename to app/boards/polarityworks/bt60/bt60_1_0_0_defconfig index 04adb8a3cd8..6925f175079 100644 --- a/app/boards/arm/bt60/bt60_v1_defconfig +++ b/app/boards/polarityworks/bt60/bt60_1_0_0_defconfig @@ -1,9 +1,5 @@ # 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 @@ -25,4 +21,4 @@ CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y CONFIG_ZMK_USB=y -CONFIG_ZMK_BLE=y \ No newline at end of file +CONFIG_ZMK_BLE=y diff --git a/app/boards/arm/ckp/bt60_v2.keymap b/app/boards/polarityworks/bt60/bt60_2_0_0.keymap similarity index 99% rename from app/boards/arm/ckp/bt60_v2.keymap rename to app/boards/polarityworks/bt60/bt60_2_0_0.keymap index 478cf7bdef9..c9829589cce 100644 --- a/app/boards/arm/ckp/bt60_v2.keymap +++ b/app/boards/polarityworks/bt60/bt60_2_0_0.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_v2.keymap" + #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt60.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_v2.keymap" + #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt60.keymap" #endif }; diff --git a/app/boards/arm/ckp/bt60_v2.dts b/app/boards/polarityworks/bt60/bt60_2_0_0.overlay similarity index 98% rename from app/boards/arm/ckp/bt60_v2.dts rename to app/boards/polarityworks/bt60/bt60_2_0_0.overlay index 1cdb0307a2c..c9aac427bd5 100644 --- a/app/boards/arm/ckp/bt60_v2.dts +++ b/app/boards/polarityworks/bt60/bt60_2_0_0.overlay @@ -4,8 +4,7 @@ * SPDX-License-Identifier: MIT */ -/dts-v1/; -#include "ckp.dtsi" +#include "../common/ckp.dtsi" #include #include #include @@ -14,7 +13,7 @@ / { model = "BT60_V2"; - compatible = "polarityworks,bt60_v2"; + compatible = "polarityworks,bt60"; chosen { zmk,physical-layout = &layout_60_ansi; diff --git a/app/boards/arm/ckp/bt60_v2_defconfig b/app/boards/polarityworks/bt60/bt60_2_0_0_defconfig similarity index 84% rename from app/boards/arm/ckp/bt60_v2_defconfig rename to app/boards/polarityworks/bt60/bt60_2_0_0_defconfig index fd1ae985995..27b0681e3e3 100644 --- a/app/boards/arm/ckp/bt60_v2_defconfig +++ b/app/boards/polarityworks/bt60/bt60_2_0_0_defconfig @@ -1,9 +1,5 @@ # 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 @@ -32,8 +28,6 @@ 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/arm/bt60/bt60_v1_hs.dts b/app/boards/polarityworks/bt60/bt60_hs.dts similarity index 97% rename from app/boards/arm/bt60/bt60_v1_hs.dts rename to app/boards/polarityworks/bt60/bt60_hs.dts index 23d4d55bbd1..c152a62a051 100644 --- a/app/boards/arm/bt60/bt60_v1_hs.dts +++ b/app/boards/polarityworks/bt60/bt60_hs.dts @@ -4,8 +4,8 @@ * SPDX-License-Identifier: MIT */ -/dts-v1/; -#include "bt60.dtsi" +#include "bt60.dts" +#include "bt60_1_0_0.dtsi" #include / { diff --git a/app/boards/arm/bt60/bt60_v1_hs.keymap b/app/boards/polarityworks/bt60/bt60_hs.keymap similarity index 100% rename from app/boards/arm/bt60/bt60_v1_hs.keymap rename to app/boards/polarityworks/bt60/bt60_hs.keymap diff --git a/app/boards/arm/bt60/bt60_v1_hs.zmk.yml b/app/boards/polarityworks/bt60/bt60_hs.zmk.yml similarity index 91% rename from app/boards/arm/bt60/bt60_v1_hs.zmk.yml rename to app/boards/polarityworks/bt60/bt60_hs.zmk.yml index 1c61f6b2a56..2d156370f92 100644 --- a/app/boards/arm/bt60/bt60_v1_hs.zmk.yml +++ b/app/boards/polarityworks/bt60/bt60_hs.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: bt60_v1_hs +id: bt60_hs name: BT60 V1 Hotswap type: board arch: arm diff --git a/app/boards/arm/bt60/bt60_v1_hs_defconfig b/app/boards/polarityworks/bt60/bt60_hs_defconfig similarity index 78% rename from app/boards/arm/bt60/bt60_v1_hs_defconfig rename to app/boards/polarityworks/bt60/bt60_hs_defconfig index f16d82ac41d..6925f175079 100644 --- a/app/boards/arm/bt60/bt60_v1_hs_defconfig +++ b/app/boards/polarityworks/bt60/bt60_hs_defconfig @@ -1,9 +1,5 @@ # 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 @@ -25,4 +21,4 @@ CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y CONFIG_ZMK_USB=y -CONFIG_ZMK_BLE=y \ No newline at end of file +CONFIG_ZMK_BLE=y diff --git a/app/boards/arm/pillbug/pre_dt_board.cmake b/app/boards/polarityworks/bt60/pre_dt_board.cmake similarity index 100% rename from app/boards/arm/pillbug/pre_dt_board.cmake rename to app/boards/polarityworks/bt60/pre_dt_board.cmake diff --git a/app/boards/polarityworks/bt65/Kconfig.bt65 b/app/boards/polarityworks/bt65/Kconfig.bt65 new file mode 100644 index 00000000000..3aaa410c24a --- /dev/null +++ b/app/boards/polarityworks/bt65/Kconfig.bt65 @@ -0,0 +1,10 @@ +# CKP BT65 board configuration + +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_BT65 + select SOC_NRF52840_QIAA + imply RETAINED_MEM + imply RETENTION + imply RETENTION_BOOT_MODE diff --git a/app/boards/arm/bt60/Kconfig.defconfig b/app/boards/polarityworks/bt65/Kconfig.defconfig similarity index 55% rename from app/boards/arm/bt60/Kconfig.defconfig rename to app/boards/polarityworks/bt65/Kconfig.defconfig index c44901bd8d4..ac6b221e194 100644 --- a/app/boards/arm/bt60/Kconfig.defconfig +++ b/app/boards/polarityworks/bt65/Kconfig.defconfig @@ -1,10 +1,10 @@ -# Copyright (c) 2021 Polarity Works +# Copyright (c) 2022 The ZMK Contributors # SPDX-License-Identifier: MIT -if BOARD_BT60_V1_HS || BOARD_BT60_V1 +config ZMK_KEYBOARD_NAME + default "BT65" if BOARD_BT65 -config BOARD - default "bt60" +if BOARD_BT65 if USB @@ -19,7 +19,4 @@ endif # USB config BT_CTLR default BT -config ZMK_KEYBOARD_NAME - default "BT60" - -endif # BOARD_BT60 +endif # BOARD_BT65 diff --git a/app/boards/arm/nice_nano/board.cmake b/app/boards/polarityworks/bt65/board.cmake similarity index 100% rename from app/boards/arm/nice_nano/board.cmake rename to app/boards/polarityworks/bt65/board.cmake diff --git a/app/boards/polarityworks/bt65/board.yml b/app/boards/polarityworks/bt65/board.yml new file mode 100644 index 00000000000..97f443cfd03 --- /dev/null +++ b/app/boards/polarityworks/bt65/board.yml @@ -0,0 +1,5 @@ +board: + name: bt65 + vendor: polarityworks + socs: + - name: nrf52840 diff --git a/app/boards/arm/ckp/bt65_v1.dts b/app/boards/polarityworks/bt65/bt65.dts similarity index 95% rename from app/boards/arm/ckp/bt65_v1.dts rename to app/boards/polarityworks/bt65/bt65.dts index 77e81289f04..d7de5143ddc 100644 --- a/app/boards/arm/ckp/bt65_v1.dts +++ b/app/boards/polarityworks/bt65/bt65.dts @@ -5,7 +5,11 @@ */ /dts-v1/; -#include "ckp.dtsi" +#include +#include + +#include "../common/ckp-base.dtsi" +#include "../common/ckp.dtsi" #include #include #include @@ -14,7 +18,7 @@ / { model = "BT65_V1"; - compatible = "polarityworks,bt65_v1"; + compatible = "polarityworks,bt65"; chosen { zmk,physical-layout = &layout_65_ansi; diff --git a/app/boards/arm/ckp/bt65_v1.keymap b/app/boards/polarityworks/bt65/bt65.keymap similarity index 99% rename from app/boards/arm/ckp/bt65_v1.keymap rename to app/boards/polarityworks/bt65/bt65.keymap index da4941438e3..b3b34b21916 100644 --- a/app/boards/arm/ckp/bt65_v1.keymap +++ b/app/boards/polarityworks/bt65/bt65.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_v1.keymap" + #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt65.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_v1.keymap" + #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt65.keymap" #endif }; diff --git a/app/boards/arm/ckp/bt65_v1.yaml b/app/boards/polarityworks/bt65/bt65.yaml similarity index 88% rename from app/boards/arm/ckp/bt65_v1.yaml rename to app/boards/polarityworks/bt65/bt65.yaml index 61edacce6c2..52bc38ae958 100644 --- a/app/boards/arm/ckp/bt65_v1.yaml +++ b/app/boards/polarityworks/bt65/bt65.yaml @@ -1,4 +1,4 @@ -identifier: bt65_v1 +identifier: bt65 name: BT65_V1 type: mcu arch: arm diff --git a/app/boards/arm/ckp/bt65_v1.zmk.yml b/app/boards/polarityworks/bt65/bt65.zmk.yml similarity index 93% rename from app/boards/arm/ckp/bt65_v1.zmk.yml rename to app/boards/polarityworks/bt65/bt65.zmk.yml index b0be40bbb79..136ace23c6c 100644 --- a/app/boards/arm/ckp/bt65_v1.zmk.yml +++ b/app/boards/polarityworks/bt65/bt65.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: bt65_v1 +id: bt65 name: BT65 type: board arch: arm diff --git a/app/boards/arm/ckp/bt75_v1_defconfig b/app/boards/polarityworks/bt65/bt65_defconfig similarity index 82% rename from app/boards/arm/ckp/bt75_v1_defconfig rename to app/boards/polarityworks/bt65/bt65_defconfig index b4d85338aec..27b0681e3e3 100644 --- a/app/boards/arm/ckp/bt75_v1_defconfig +++ b/app/boards/polarityworks/bt65/bt65_defconfig @@ -1,9 +1,5 @@ # 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 @@ -32,10 +28,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 CONFIG_ZMK_USB=y -CONFIG_ZMK_BLE=y \ No newline at end of file +CONFIG_ZMK_BLE=y diff --git a/app/boards/arm/puchi_ble/pre_dt_board.cmake b/app/boards/polarityworks/bt65/pre_dt_board.cmake similarity index 100% rename from app/boards/arm/puchi_ble/pre_dt_board.cmake rename to app/boards/polarityworks/bt65/pre_dt_board.cmake diff --git a/app/boards/polarityworks/bt75/Kconfig.bt75 b/app/boards/polarityworks/bt75/Kconfig.bt75 new file mode 100644 index 00000000000..43fe295d6ac --- /dev/null +++ b/app/boards/polarityworks/bt75/Kconfig.bt75 @@ -0,0 +1,10 @@ +# CKP BT75 board configuration + +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_BT75 + select SOC_NRF52840_QIAA + 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 new file mode 100644 index 00000000000..ded51c247f1 --- /dev/null +++ b/app/boards/polarityworks/bt75/Kconfig.defconfig @@ -0,0 +1,22 @@ +# 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/arm/nrfmicro/board.cmake b/app/boards/polarityworks/bt75/board.cmake similarity index 100% rename from app/boards/arm/nrfmicro/board.cmake rename to app/boards/polarityworks/bt75/board.cmake diff --git a/app/boards/polarityworks/bt75/board.yml b/app/boards/polarityworks/bt75/board.yml new file mode 100644 index 00000000000..d12dcb3a169 --- /dev/null +++ b/app/boards/polarityworks/bt75/board.yml @@ -0,0 +1,5 @@ +board: + name: bt75 + vendor: polarityworks + socs: + - name: nrf52840 diff --git a/app/boards/arm/ckp/bt75_v1.dts b/app/boards/polarityworks/bt75/bt75.dts similarity index 94% rename from app/boards/arm/ckp/bt75_v1.dts rename to app/boards/polarityworks/bt75/bt75.dts index 7c9ab664e3c..bfbef0a27ca 100644 --- a/app/boards/arm/ckp/bt75_v1.dts +++ b/app/boards/polarityworks/bt75/bt75.dts @@ -5,7 +5,11 @@ */ /dts-v1/; -#include "ckp.dtsi" +#include +#include + +#include "../common/ckp-base.dtsi" +#include "../common/ckp.dtsi" #include #include #include @@ -13,7 +17,7 @@ / { model = "BT75_V1"; - compatible = "polarityworks,bt75_v1"; + compatible = "polarityworks,bt75"; chosen { zmk,physical-layout = &layout_75_ansi; diff --git a/app/boards/arm/ckp/bt75_v1.keymap b/app/boards/polarityworks/bt75/bt75.keymap similarity index 99% rename from app/boards/arm/ckp/bt75_v1.keymap rename to app/boards/polarityworks/bt75/bt75.keymap index ff0db7b0c0d..42833cb0454 100644 --- a/app/boards/arm/ckp/bt75_v1.keymap +++ b/app/boards/polarityworks/bt75/bt75.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_v1.keymap" + #error "Layout not defined, please define a layout using by uncommenting the appropriate line in bt75.keymap" #endif }; diff --git a/app/boards/arm/ckp/bt75_v1.yaml b/app/boards/polarityworks/bt75/bt75.yaml similarity index 88% rename from app/boards/arm/ckp/bt75_v1.yaml rename to app/boards/polarityworks/bt75/bt75.yaml index e4faa09f52c..b628d81cf4c 100644 --- a/app/boards/arm/ckp/bt75_v1.yaml +++ b/app/boards/polarityworks/bt75/bt75.yaml @@ -1,4 +1,4 @@ -identifier: bt75_v1 +identifier: bt75 name: BT75_V1 type: mcu arch: arm diff --git a/app/boards/arm/ckp/bt75_v1.zmk.yml b/app/boards/polarityworks/bt75/bt75.zmk.yml similarity index 93% rename from app/boards/arm/ckp/bt75_v1.zmk.yml rename to app/boards/polarityworks/bt75/bt75.zmk.yml index e135abfac6a..d4424a4bb98 100644 --- a/app/boards/arm/ckp/bt75_v1.zmk.yml +++ b/app/boards/polarityworks/bt75/bt75.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: bt75_v1 +id: bt75 name: BT75 V1 type: board arch: arm diff --git a/app/boards/arm/ckp/bt65_v1_defconfig b/app/boards/polarityworks/bt75/bt75_defconfig similarity index 82% rename from app/boards/arm/ckp/bt65_v1_defconfig rename to app/boards/polarityworks/bt75/bt75_defconfig index be5f17eb54f..27b0681e3e3 100644 --- a/app/boards/arm/ckp/bt65_v1_defconfig +++ b/app/boards/polarityworks/bt75/bt75_defconfig @@ -1,9 +1,5 @@ # 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 @@ -32,10 +28,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 CONFIG_ZMK_USB=y -CONFIG_ZMK_BLE=y \ No newline at end of file +CONFIG_ZMK_BLE=y diff --git a/app/boards/arm/s40nc/pre_dt_board.cmake b/app/boards/polarityworks/bt75/pre_dt_board.cmake similarity index 100% rename from app/boards/arm/s40nc/pre_dt_board.cmake rename to app/boards/polarityworks/bt75/pre_dt_board.cmake diff --git a/app/boards/polarityworks/common/ckp-base.dtsi b/app/boards/polarityworks/common/ckp-base.dtsi new file mode 100644 index 00000000000..0b1d9d131a0 --- /dev/null +++ b/app/boards/polarityworks/common/ckp-base.dtsi @@ -0,0 +1,61 @@ +&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/arm/ckp/ckp-pinctrl.dtsi b/app/boards/polarityworks/common/ckp-pinctrl.dtsi similarity index 100% rename from app/boards/arm/ckp/ckp-pinctrl.dtsi rename to app/boards/polarityworks/common/ckp-pinctrl.dtsi diff --git a/app/boards/arm/ckp/ckp.dtsi b/app/boards/polarityworks/common/ckp.dtsi similarity index 78% rename from app/boards/arm/ckp/ckp.dtsi rename to app/boards/polarityworks/common/ckp.dtsi index b127cabc71a..ba3374687a0 100644 --- a/app/boards/arm/ckp/ckp.dtsi +++ b/app/boards/polarityworks/common/ckp.dtsi @@ -4,9 +4,6 @@ * SPDX-License-Identifier: MIT */ -/dts-v1/; -#include - #include #include @@ -119,8 +116,9 @@ }; }; -&adc { - status = "okay"; +&vbatt { + output-ohms = <100000>; + full-ohms = <(100000 + 100000)>; }; &pwm0 { @@ -130,59 +128,6 @@ 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/post_boards_shields.cmake b/app/boards/post_boards_shields.cmake new file mode 100644 index 00000000000..3bd7eb1da81 --- /dev/null +++ b/app/boards/post_boards_shields.cmake @@ -0,0 +1,100 @@ +# 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_DIR}) +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} "${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 new file mode 100644 index 00000000000..ba5edaf8f9a --- /dev/null +++ b/app/boards/qmk/proton_c/Kconfig.proton_c @@ -0,0 +1,5 @@ +# Copyright (c) 2020 Pete Johanson +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_PROTON_C + select SOC_STM32F303XC diff --git a/app/boards/arm/proton_c/arduino_pro_micro_pins.dtsi b/app/boards/qmk/proton_c/arduino_pro_micro_pins.dtsi similarity index 100% rename from app/boards/arm/proton_c/arduino_pro_micro_pins.dtsi rename to app/boards/qmk/proton_c/arduino_pro_micro_pins.dtsi diff --git a/app/boards/arm/dz60rgb/board.cmake b/app/boards/qmk/proton_c/board.cmake similarity index 100% rename from app/boards/arm/dz60rgb/board.cmake rename to app/boards/qmk/proton_c/board.cmake diff --git a/app/boards/qmk/proton_c/board.yml b/app/boards/qmk/proton_c/board.yml new file mode 100644 index 00000000000..54ecb64bbed --- /dev/null +++ b/app/boards/qmk/proton_c/board.yml @@ -0,0 +1,5 @@ +board: + name: proton_c + vendor: qmk + socs: + - name: stm32f303xc diff --git a/app/boards/arm/proton_c/proton_c.dts b/app/boards/qmk/proton_c/proton_c.dts similarity index 100% rename from app/boards/arm/proton_c/proton_c.dts rename to app/boards/qmk/proton_c/proton_c.dts diff --git a/app/boards/arm/proton_c/proton_c.yaml b/app/boards/qmk/proton_c/proton_c.yaml similarity index 100% rename from app/boards/arm/proton_c/proton_c.yaml rename to app/boards/qmk/proton_c/proton_c.yaml diff --git a/app/boards/arm/proton_c/proton_c.zmk.yml b/app/boards/qmk/proton_c/proton_c.zmk.yml similarity index 100% rename from app/boards/arm/proton_c/proton_c.zmk.yml rename to app/boards/qmk/proton_c/proton_c.zmk.yml diff --git a/app/boards/arm/proton_c/proton_c_defconfig b/app/boards/qmk/proton_c/proton_c_defconfig similarity index 82% rename from app/boards/arm/proton_c/proton_c_defconfig rename to app/boards/qmk/proton_c/proton_c_defconfig index c552bf15df9..f7abf012335 100644 --- a/app/boards/arm/proton_c/proton_c_defconfig +++ b/app/boards/qmk/proton_c/proton_c_defconfig @@ -1,7 +1,5 @@ # 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/arm/seeeduino_xiao/seeeduino_xiao.zmk.yml b/app/boards/seeed/seeeduino_xiao/seeeduino_xiao.zmk.yml similarity index 100% rename from app/boards/arm/seeeduino_xiao/seeeduino_xiao.zmk.yml rename to app/boards/seeed/seeeduino_xiao/seeeduino_xiao.zmk.yml diff --git a/app/boards/arm/seeeduino_xiao_ble/seeeduino_xiao_ble.zmk.yml b/app/boards/seeed/xiao_ble/xiao_ble.zmk.yml similarity index 87% rename from app/boards/arm/seeeduino_xiao_ble/seeeduino_xiao_ble.zmk.yml rename to app/boards/seeed/xiao_ble/xiao_ble.zmk.yml index 55bbe593283..270d8090616 100644 --- a/app/boards/arm/seeeduino_xiao_ble/seeeduino_xiao_ble.zmk.yml +++ b/app/boards/seeed/xiao_ble/xiao_ble.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: seeeduino_xiao_ble +id: xiao_ble name: Seeed Studio XIAO nRF52840 type: board arch: arm diff --git a/app/boards/arm/seeeduino_xiao_rp2040/seeeduino_xiao_rp2040.zmk.yml b/app/boards/seeed/xiao_rp2040/xiao_rp2040.zmk.yml similarity index 85% rename from app/boards/arm/seeeduino_xiao_rp2040/seeeduino_xiao_rp2040.zmk.yml rename to app/boards/seeed/xiao_rp2040/xiao_rp2040.zmk.yml index 1260a99284b..ea6f04f3025 100644 --- a/app/boards/arm/seeeduino_xiao_rp2040/seeeduino_xiao_rp2040.zmk.yml +++ b/app/boards/seeed/xiao_rp2040/xiao_rp2040.zmk.yml @@ -1,5 +1,5 @@ file_format: "1" -id: seeeduino_xiao_rp2040 +id: xiao_rp2040 name: Seeed Studio XIAO RP2040 type: board arch: arm diff --git a/app/boards/shields/chalice/boards/nice_nano_v2.overlay b/app/boards/shields/chalice/boards/nice_nano_v2.overlay deleted file mode 100644 index 424a617b237..00000000000 --- a/app/boards/shields/chalice/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/chalice/chalice.conf b/app/boards/shields/chalice/chalice.conf index da642256827..6ca70f41b04 100644 --- a/app/boards/shields/chalice/chalice.conf +++ b/app/boards/shields/chalice/chalice.conf @@ -1,3 +1,2 @@ # 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/corne/boards/nice_nano_v2.overlay b/app/boards/shields/corne/boards/nice_nano_v2.overlay deleted file mode 100644 index 424a617b237..00000000000 --- a/app/boards/shields/corne/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/corne/corne.conf b/app/boards/shields/corne/corne.conf index 974243c8aea..b10586ccf05 100644 --- a/app/boards/shields/corne/corne.conf +++ b/app/boards/shields/corne/corne.conf @@ -1,6 +1,5 @@ # 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/elephant42/boards/nice_nano_v2.overlay b/app/boards/shields/elephant42/boards/nice_nano_v2.overlay deleted file mode 100644 index 424a617b237..00000000000 --- a/app/boards/shields/elephant42/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/elephant42/elephant42.conf b/app/boards/shields/elephant42/elephant42.conf index 1b41763fa60..3a123f34038 100644 --- a/app/boards/shields/elephant42/elephant42.conf +++ b/app/boards/shields/elephant42/elephant42.conf @@ -1,6 +1,5 @@ # 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 \ No newline at end of file +# CONFIG_ZMK_DISPLAY=y diff --git a/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay b/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay deleted file mode 100644 index 424a617b237..00000000000 --- a/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/eternal_keypad/eternal_keypad.conf b/app/boards/shields/eternal_keypad/eternal_keypad.conf index 65fa295516d..5f7c33bc209 100644 --- a/app/boards/shields/eternal_keypad/eternal_keypad.conf +++ b/app/boards/shields/eternal_keypad/eternal_keypad.conf @@ -6,4 +6,3 @@ # Uncomment the following lines to enable RGB underglow # CONFIG_ZMK_RGB_UNDERGLOW=y -# CONFIG_WS2812_STRIP=y diff --git a/app/boards/shields/helix/boards/nice_nano_v2.overlay b/app/boards/shields/helix/boards/nice_nano_v2.overlay deleted file mode 100644 index 424a617b237..00000000000 --- a/app/boards/shields/helix/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/helix/helix.conf b/app/boards/shields/helix/helix.conf index a8e57338de1..d8cb2f2e4c8 100644 --- a/app/boards/shields/helix/helix.conf +++ b/app/boards/shields/helix/helix.conf @@ -3,4 +3,3 @@ # 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/jorne/boards/nice_nano_v2.overlay b/app/boards/shields/jorne/boards/nice_nano_v2.overlay deleted file mode 100644 index 424a617b237..00000000000 --- a/app/boards/shields/jorne/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/jorne/jorne.conf b/app/boards/shields/jorne/jorne.conf index c4e62fc0c3a..c94389a24ab 100644 --- a/app/boards/shields/jorne/jorne.conf +++ b/app/boards/shields/jorne/jorne.conf @@ -1,6 +1,5 @@ # 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 2eefae4d9e6..23673a47690 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/kyria/boards/nice_nano_v2.overlay b/app/boards/shields/kyria/boards/nice_nano_v2.overlay deleted file mode 100644 index 424a617b237..00000000000 --- a/app/boards/shields/kyria/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/kyria/kyria.conf b/app/boards/shields/kyria/kyria.conf index 7a0b5b6c54f..bb2b843ddfd 100644 --- a/app/boards/shields/kyria/kyria.conf +++ b/app/boards/shields/kyria/kyria.conf @@ -7,4 +7,3 @@ # 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.conf b/app/boards/shields/kyria/kyria_rev2.conf index 7a0b5b6c54f..bb2b843ddfd 100644 --- a/app/boards/shields/kyria/kyria_rev2.conf +++ b/app/boards/shields/kyria/kyria_rev2.conf @@ -7,4 +7,3 @@ # 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.conf b/app/boards/shields/kyria/kyria_rev3.conf index 7a0b5b6c54f..bb2b843ddfd 100644 --- a/app/boards/shields/kyria/kyria_rev3.conf +++ b/app/boards/shields/kyria/kyria_rev3.conf @@ -7,4 +7,3 @@ # Uncomment the following lines to enable RGB underglow # CONFIG_ZMK_RGB_UNDERGLOW=y -# CONFIG_WS2812_STRIP=y diff --git a/app/boards/shields/leeloo/README.md b/app/boards/shields/leeloo/README.md index 27d5e872b5a..c9c189b0ff1 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_v2 -- -DSHIELD=leeloo_left -west build -d build/right -p -b nice_nano_v2 -- -DSHIELD=leeloo_right +west build -d build/left -p -b nice_nano -- -DSHIELD=leeloo_left +west build -d build/right -p -b nice_nano -- -DSHIELD=leeloo_right ``` Build commands for the default keymap of Leeloo v2: ``` -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 +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 ``` Build commands for your custom keymap of Leeloo v1: ``` -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" +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" ``` Build commands for your custom keymap of Leeloo v2: ``` -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" +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" ``` ## 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_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" +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" ``` Build commands for the default keymap of Leeloo v2: ``` -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" +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" ``` Build commands for your custom keymap of Leeloo v2: ``` -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" +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" ``` # Support diff --git a/app/boards/shields/leeloo/boards/nice_nano_v2.overlay b/app/boards/shields/leeloo/boards/nice_nano_v2.overlay deleted file mode 100644 index e95fac9dcdb..00000000000 --- a/app/boards/shields/leeloo/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <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 8c1cf3eed7b..35b12c2d3f7 100644 --- a/app/boards/shields/leeloo/leeloo_rev2.conf +++ b/app/boards/shields/leeloo/leeloo_rev2.conf @@ -14,9 +14,6 @@ # 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 @@ -40,4 +37,4 @@ # Uncomment if you are experiencing connectivity issues; this # configuration item boosts the BLE transmit power. -# CONFIG_BT_CTLR_TX_PWR_PLUS_8=y \ No newline at end of file +# CONFIG_BT_CTLR_TX_PWR_PLUS_8=y diff --git a/app/boards/shields/leeloo_micro/README.md b/app/boards/shields/leeloo_micro/README.md index c1827f82b72..3471a35bb9c 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_v2 -- -DSHIELD=leeloo_micro_left -west build -d build/right -p -b nice_nano_v2 -- -DSHIELD=leeloo_micro_right +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 ``` Build commands for your custom keymap of Leeloo-Micro: ``` -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" +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" ``` ## 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_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" +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" ``` Build commands for your custom keymap of Leeloo-Micro: ``` -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" +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" ``` # 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 deleted file mode 100644 index ba29cb2c06b..00000000000 --- a/app/boards/shields/leeloo_micro/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <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 02c1d60587b..deba268a860 100644 --- a/app/boards/shields/leeloo_micro/leeloo_micro.conf +++ b/app/boards/shields/leeloo_micro/leeloo_micro.conf @@ -14,9 +14,6 @@ # 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 @@ -35,4 +32,4 @@ # Uncomment these two lines to add support for encoders # CONFIG_EC11=y -# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y \ No newline at end of file +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y diff --git a/app/boards/shields/lily58/boards/nice_nano_v2.overlay b/app/boards/shields/lily58/boards/nice_nano_v2.overlay deleted file mode 100644 index 424a617b237..00000000000 --- a/app/boards/shields/lily58/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/microdox/boards/nice_nano_v2.overlay b/app/boards/shields/microdox/boards/nice_nano_v2.overlay deleted file mode 100644 index 424a617b237..00000000000 --- a/app/boards/shields/microdox/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/microdox/microdox.conf b/app/boards/shields/microdox/microdox.conf index 0d38398c029..b5df29aaddc 100644 --- a/app/boards/shields/microdox/microdox.conf +++ b/app/boards/shields/microdox/microdox.conf @@ -1,6 +1,5 @@ # Uncomment the following lines to enable the Microdox RGB Underglow # CONFIG_ZMK_RGB_UNDERGLOW=y -# CONFIG_WS2812_STRIP=y # Uncomment the following line to enable the Microdox OLED Display # CONFIG_ZMK_DISPLAY=y diff --git a/app/boards/shields/microdox/microdox_v2.conf b/app/boards/shields/microdox/microdox_v2.conf index 0d38398c029..b5df29aaddc 100644 --- a/app/boards/shields/microdox/microdox_v2.conf +++ b/app/boards/shields/microdox/microdox_v2.conf @@ -1,6 +1,5 @@ # 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 3d9685843e1..9d80a13936b 100644 --- a/app/boards/shields/murphpad/Kconfig.defconfig +++ b/app/boards/shields/murphpad/Kconfig.defconfig @@ -6,9 +6,6 @@ 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_v2.overlay b/app/boards/shields/murphpad/boards/nice_nano_v2.overlay deleted file mode 100644 index 21bb17b000a..00000000000 --- a/app/boards/shields/murphpad/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <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 e9236917e16..c954a946c6a 100644 --- a/app/boards/shields/murphpad/murphpad.conf +++ b/app/boards/shields/murphpad/murphpad.conf @@ -6,10 +6,9 @@ CONFIG_EC11=y CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y -# Uncomment to disable OLED -#CONFIG_ZMK_DISPLAY=n +# Uncomment to enable OLED +#CONFIG_ZMK_DISPLAY=y # Uncomment both to enable underglow # Note that this will only work if an implementation exists for your board; check under the shield folder for board-specific overlays. #CONFIG_ZMK_RGB_UNDERGLOW=y -#CONFIG_WS2812_STRIP=y diff --git a/app/boards/shields/nibble/README.md b/app/boards/shields/nibble/README.md index 42646f97099..a6d2add5752 100644 --- a/app/boards/shields/nibble/README.md +++ b/app/boards/shields/nibble/README.md @@ -8,7 +8,6 @@ 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 14bed3d0fa3..d1b76b841b1 100644 --- a/app/boards/shields/nibble/boards/nice_nano.conf +++ b/app/boards/shields/nibble/boards/nice_nano.conf @@ -1,4 +1,2 @@ # 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_v2.overlay b/app/boards/shields/nibble/boards/nice_nano_v2.overlay deleted file mode 100644 index 3849a8fb1a2..00000000000 --- a/app/boards/shields/nibble/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/nice_view/Kconfig.defconfig b/app/boards/shields/nice_view/Kconfig.defconfig index c31cec89f0f..57126edfc06 100644 --- a/app/boards/shields/nice_view/Kconfig.defconfig +++ b/app/boards/shields/nice_view/Kconfig.defconfig @@ -25,7 +25,7 @@ choice ZMK_DISPLAY_STATUS_SCREEN endchoice config LV_Z_MEM_POOL_SIZE - default 4096 if ZMK_DISPLAY_STATUS_SCREEN_CUSTOM + default 8192 if ZMK_DISPLAY_STATUS_SCREEN_CUSTOM config ZMK_DISPLAY_STATUS_SCREEN_CUSTOM imply NICE_VIEW_WIDGET_STATUS @@ -33,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_IMG + select LV_USE_IMAGE 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 e6f9158f137..51408bb3d8b 100644 --- a/app/boards/shields/nice_view/nice_view.conf +++ b/app/boards/shields/nice_view/nice_view.conf @@ -2,3 +2,4 @@ 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/widgets/art.c b/app/boards/shields/nice_view/widgets/art.c index 56c8914629f..c91af376b2e 100644 --- a/app/boards/shields/nice_view/widgets/art.c +++ b/app/boards/shields/nice_view/widgets/art.c @@ -111,9 +111,8 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BALLOON u }; const lv_img_dsc_t balloon = { - .header.cf = LV_IMG_CF_INDEXED_1BIT, - .header.always_zero = 0, - .header.reserved = 0, + .header.cf = LV_COLOR_FORMAT_I1, + .header.w = 140, .header.h = 68, .data_size = 1232, @@ -219,9 +218,8 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_MOUNTAIN }; const lv_img_dsc_t mountain = { - .header.cf = LV_IMG_CF_INDEXED_1BIT, - .header.always_zero = 0, - .header.reserved = 0, + .header.cf = LV_COLOR_FORMAT_I1, + .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 74dcc2b00c6..bb5c5aa1382 100644 --- a/app/boards/shields/nice_view/widgets/bolt.c +++ b/app/boards/shields/nice_view/widgets/bolt.c @@ -35,9 +35,7 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BOLT uint }; const lv_img_dsc_t bolt = { - .header.cf = LV_IMG_CF_INDEXED_2BIT, - .header.always_zero = 0, - .header.reserved = 0, + .header.cf = LV_COLOR_FORMAT_I2, .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 e9002b33e75..40c338d3019 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 - lv_canvas_draw_rect(canvas, 0, 0, CANVAS_SIZE, CANVAS_SIZE, &rect_black_dsc); + canvas_draw_rect(canvas, 0, 0, CANVAS_SIZE, CANVAS_SIZE, &rect_black_dsc); // Draw battery draw_battery(canvas, state); // Draw output status - lv_canvas_draw_text(canvas, 0, 0, CANVAS_SIZE, &label_dsc, - state->connected ? LV_SYMBOL_WIFI : LV_SYMBOL_CLOSE); + canvas_draw_text(canvas, 0, 0, CANVAS_SIZE, &label_dsc, + state->connected ? LV_SYMBOL_WIFI : LV_SYMBOL_CLOSE); // Rotate canvas - rotate_canvas(canvas, cbuf); + rotate_canvas(canvas); } 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, LV_IMG_CF_TRUE_COLOR); + lv_canvas_set_buffer(top, widget->cbuf, CANVAS_SIZE, CANVAS_SIZE, CANVAS_COLOR_FORMAT); lv_obj_t *art = lv_img_create(widget->obj); bool random = sys_rand32_get() & 1; - lv_img_set_src(art, random ? &balloon : &mountain); + lv_image_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 9769f4d7b3e..601ff546e61 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, lv_color_t cbuf[], const struct status_state *state) { +static void draw_top(lv_obj_t *widget, 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, lv_color_t cbuf[], const struct status_st init_line_dsc(&line_dsc, LVGL_FOREGROUND, 1); // Fill background - lv_canvas_draw_rect(canvas, 0, 0, CANVAS_SIZE, CANVAS_SIZE, &rect_black_dsc); + lv_canvas_fill_bg(canvas, LVGL_BACKGROUND, LV_OPA_COVER); // Draw battery draw_battery(canvas, state); @@ -86,15 +86,15 @@ static void draw_top(lv_obj_t *widget, lv_color_t cbuf[], const struct status_st break; } - lv_canvas_draw_text(canvas, 0, 0, CANVAS_SIZE, &label_dsc, output_text); + canvas_draw_text(canvas, 0, 0, CANVAS_SIZE, &label_dsc, output_text); // Draw WPM - lv_canvas_draw_rect(canvas, 0, 21, 68, 42, &rect_white_dsc); - lv_canvas_draw_rect(canvas, 1, 22, 66, 40, &rect_black_dsc); + canvas_draw_rect(canvas, 0, 21, 68, 42, &rect_white_dsc); + 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]); - lv_canvas_draw_text(canvas, 42, 52, 24, &label_dsc_wpm, wpm_text); + 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, lv_color_t cbuf[], const struct status_st points[i].x = 2 + i * 7; points[i].y = 60 - (state->wpm[i] - min) * 36 / range; } - lv_canvas_draw_line(canvas, points, 10, &line_dsc); + canvas_draw_line(canvas, points, 10, &line_dsc); // Rotate canvas - rotate_canvas(canvas, cbuf); + rotate_canvas(canvas); } -static void draw_middle(lv_obj_t *widget, lv_color_t cbuf[], const struct status_state *state) { +static void draw_middle(lv_obj_t *widget, 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, lv_color_t cbuf[], const struct status init_label_dsc(&label_dsc_black, LVGL_BACKGROUND, &lv_font_montserrat_18, LV_TEXT_ALIGN_CENTER); // Fill background - lv_canvas_draw_rect(canvas, 0, 0, CANVAS_SIZE, CANVAS_SIZE, &rect_black_dsc); + lv_canvas_fill_bg(canvas, LVGL_BACKGROUND, LV_OPA_COVER); // Draw circles int circle_offsets[NICEVIEW_PROFILE_COUNT][2] = { @@ -152,33 +152,33 @@ static void draw_middle(lv_obj_t *widget, lv_color_t cbuf[], const struct status bool selected = i == state->active_profile_index; if (state->profiles_connected[i]) { - lv_canvas_draw_arc(canvas, circle_offsets[i][0], circle_offsets[i][1], 13, 0, 360, - &arc_dsc); + 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) - 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); + 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) { - lv_canvas_draw_arc(canvas, circle_offsets[i][0], circle_offsets[i][1], 9, 0, 359, - &arc_dsc_filled); + 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); - lv_canvas_draw_text(canvas, circle_offsets[i][0] - 8, circle_offsets[i][1] - 10, 16, - (selected ? &label_dsc_black : &label_dsc), label); + 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, cbuf); + rotate_canvas(canvas); } -static void draw_bottom(lv_obj_t *widget, lv_color_t cbuf[], const struct status_state *state) { +static void draw_bottom(lv_obj_t *widget, 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, lv_color_t cbuf[], const struct status init_label_dsc(&label_dsc, LVGL_FOREGROUND, &lv_font_montserrat_14, LV_TEXT_ALIGN_CENTER); // Fill background - lv_canvas_draw_rect(canvas, 0, 0, CANVAS_SIZE, CANVAS_SIZE, &rect_black_dsc); + lv_canvas_fill_bg(canvas, LVGL_BACKGROUND, LV_OPA_COVER); // Draw layer if (state->layer_label == NULL || strlen(state->layer_label) == 0) { @@ -195,13 +195,13 @@ static void draw_bottom(lv_obj_t *widget, lv_color_t cbuf[], const struct status sprintf(text, "LAYER %i", state->layer_index); - lv_canvas_draw_text(canvas, 0, 5, 68, &label_dsc, text); + canvas_draw_text(canvas, 0, 5, 68, &label_dsc, text); } else { - lv_canvas_draw_text(canvas, 0, 5, 68, &label_dsc, state->layer_label); + canvas_draw_text(canvas, 0, 5, 68, &label_dsc, state->layer_label); } // Rotate canvas - rotate_canvas(canvas, cbuf); + rotate_canvas(canvas); } 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->cbuf, &widget->state); + draw_top(widget->obj, &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->cbuf, &widget->state); - draw_middle(widget->obj, widget->cbuf2, &widget->state); + draw_top(widget->obj, &widget->state); + draw_middle(widget->obj, &widget->state); } static void output_status_update_cb(struct output_status_state state) { @@ -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->cbuf3, &widget->state); + draw_bottom(widget->obj, &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->cbuf, &widget->state); + draw_top(widget->obj, &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, LV_IMG_CF_TRUE_COLOR); + lv_canvas_set_buffer(top, widget->cbuf, CANVAS_SIZE, CANVAS_SIZE, CANVAS_COLOR_FORMAT); 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, LV_IMG_CF_TRUE_COLOR); + lv_canvas_set_buffer(middle, widget->cbuf2, CANVAS_SIZE, CANVAS_SIZE, CANVAS_COLOR_FORMAT); 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, LV_IMG_CF_TRUE_COLOR); + lv_canvas_set_buffer(bottom, widget->cbuf3, CANVAS_SIZE, CANVAS_SIZE, CANVAS_COLOR_FORMAT); 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 53a22518d73..66e41e5dc5c 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; - lv_color_t cbuf[CANVAS_SIZE * CANVAS_SIZE]; - lv_color_t cbuf2[CANVAS_SIZE * CANVAS_SIZE]; - lv_color_t cbuf3[CANVAS_SIZE * CANVAS_SIZE]; + uint8_t cbuf[CANVAS_BUF_SIZE]; + uint8_t cbuf2[CANVAS_BUF_SIZE]; + uint8_t cbuf3[CANVAS_BUF_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 b4915ab767f..90333910b71 100644 --- a/app/boards/shields/nice_view/widgets/util.c +++ b/app/boards/shields/nice_view/widgets/util.c @@ -10,18 +10,14 @@ LV_IMG_DECLARE(bolt); -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; - - 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 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)); + + 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); } void draw_battery(lv_obj_t *canvas, const struct status_state *state) { @@ -30,16 +26,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); - 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); + 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); if (state->charging) { - lv_draw_img_dsc_t img_dsc; - lv_draw_img_dsc_init(&img_dsc); - lv_canvas_draw_img(canvas, 9, -1, &bolt, &img_dsc); + lv_draw_image_dsc_t img_dsc; + lv_draw_image_dsc_init(&img_dsc); + canvas_draw_img(canvas, 9, -1, &bolt, &img_dsc); } } @@ -67,3 +63,68 @@ 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 686e5af2714..183d0ec34f9 100644 --- a/app/boards/shields/nice_view/widgets/util.h +++ b/app/boards/shields/nice_view/widgets/util.h @@ -11,6 +11,10 @@ #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() @@ -42,10 +46,21 @@ struct battery_status_state { #endif }; -void rotate_canvas(lv_obj_t *canvas, lv_color_t cbuf[]); +void rotate_canvas(lv_obj_t *canvas); 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 fe0a6f0760f..19812931c71 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_v2 -- -DSHIELD="lily58_left nice_view_adapter nice_view" +west build -b nice_nano -- -DSHIELD="lily58_left nice_view_adapter nice_view" ``` 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 deleted file mode 100644 index 45ba34dedeb..00000000000 --- a/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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/redox/boards/nice_nano_v2.overlay b/app/boards/shields/redox/boards/nice_nano_v2.overlay deleted file mode 100644 index 424a617b237..00000000000 --- a/app/boards/shields/redox/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/redox/redox.conf b/app/boards/shields/redox/redox.conf index a1837ef9fa3..25d3e6c40d9 100644 --- a/app/boards/shields/redox/redox.conf +++ b/app/boards/shields/redox/redox.conf @@ -1,3 +1,2 @@ # 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/reviung34/boards/nice_nano_v2.overlay b/app/boards/shields/reviung34/boards/nice_nano_v2.overlay deleted file mode 100644 index d14b95db76b..00000000000 --- a/app/boards/shields/reviung34/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,47 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <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.conf b/app/boards/shields/reviung34/reviung34.conf index 289f070ba3f..6ca70f41b04 100644 --- a/app/boards/shields/reviung34/reviung34.conf +++ b/app/boards/shields/reviung34/reviung34.conf @@ -1,3 +1,2 @@ # Uncomment the following lines to enable RGB underglow # CONFIG_ZMK_RGB_UNDERGLOW=y -# CONFIG_WS2812_STRIP=y diff --git a/app/boards/shields/reviung41/boards/nice_nano_v2.overlay b/app/boards/shields/reviung41/boards/nice_nano_v2.overlay deleted file mode 100644 index 59180064278..00000000000 --- a/app/boards/shields/reviung41/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <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 289f070ba3f..6ca70f41b04 100644 --- a/app/boards/shields/reviung41/reviung41.conf +++ b/app/boards/shields/reviung41/reviung41.conf @@ -1,3 +1,2 @@ # Uncomment the following lines to enable RGB underglow # CONFIG_ZMK_RGB_UNDERGLOW=y -# CONFIG_WS2812_STRIP=y diff --git a/app/boards/shields/reviung5/boards/nice_nano_v2.overlay b/app/boards/shields/reviung5/boards/nice_nano_v2.overlay deleted file mode 100644 index 540e345a0be..00000000000 --- a/app/boards/shields/reviung5/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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 d5d38739f5b..78ebd1d1e67 100644 --- a/app/boards/shields/reviung5/reviung5.conf +++ b/app/boards/shields/reviung5/reviung5.conf @@ -4,4 +4,3 @@ # 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_v2.overlay b/app/boards/shields/reviung53/boards/nice_nano_v2.overlay deleted file mode 100644 index 24905ac2e91..00000000000 --- a/app/boards/shields/reviung53/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; - 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 289f070ba3f..6ca70f41b04 100644 --- a/app/boards/shields/reviung53/reviung53.conf +++ b/app/boards/shields/reviung53/reviung53.conf @@ -1,3 +1,2 @@ # Uncomment the following lines to enable RGB underglow # CONFIG_ZMK_RGB_UNDERGLOW=y -# CONFIG_WS2812_STRIP=y diff --git a/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay b/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay deleted file mode 100644 index 424a617b237..00000000000 --- a/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/snap/boards/nice_nano_v2.overlay b/app/boards/shields/snap/boards/nice_nano_v2.overlay deleted file mode 100644 index 924151c719f..00000000000 --- a/app/boards/shields/snap/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/snap/snap.conf b/app/boards/shields/snap/snap.conf index e76bccb4815..64c7602b446 100644 --- a/app/boards/shields/snap/snap.conf +++ b/app/boards/shields/snap/snap.conf @@ -12,6 +12,5 @@ # 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 \ No newline at end of file +# CONFIG_ZMK_RGB_UNDERGLOW_SPD_START=1 diff --git a/app/boards/shields/sofle/Kconfig.defconfig b/app/boards/shields/sofle/Kconfig.defconfig index 4eb3d743b86..767ea35a4e9 100644 --- a/app/boards/shields/sofle/Kconfig.defconfig +++ b/app/boards/shields/sofle/Kconfig.defconfig @@ -43,10 +43,4 @@ endchoice endif # LVGL -if ZMK_RGB_UNDERGLOW - -config WS2812_STRIP - default y -endif - endif diff --git a/app/boards/shields/sofle/boards/nice_nano_v2.overlay b/app/boards/shields/sofle/boards/nice_nano_v2.overlay deleted file mode 100644 index f00f59f4397..00000000000 --- a/app/boards/shields/sofle/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,50 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <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/splitkb_aurora_corne/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig index d3ac6c77e26..addfb8d137e 100644 --- a/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig @@ -16,10 +16,6 @@ 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_v2.overlay b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay deleted file mode 100644 index 424a617b237..00000000000 --- a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/splitkb_aurora_helix/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_helix/Kconfig.defconfig index df32b83b237..d9bb0eac286 100644 --- a/app/boards/shields/splitkb_aurora_helix/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_helix/Kconfig.defconfig @@ -16,10 +16,6 @@ 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_v2.overlay b/app/boards/shields/splitkb_aurora_helix/boards/nice_nano_v2.overlay deleted file mode 100644 index 8228d530c82..00000000000 --- a/app/boards/shields/splitkb_aurora_helix/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,45 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <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_lily58/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig index 861db44f0b1..9edcf346479 100644 --- a/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig @@ -16,10 +16,6 @@ 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_v2.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay deleted file mode 100644 index 0845226602b..00000000000 --- a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,45 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <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_sofle/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_sofle/Kconfig.defconfig index 172548e87d7..603c35c7af2 100644 --- a/app/boards/shields/splitkb_aurora_sofle/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_sofle/Kconfig.defconfig @@ -16,10 +16,6 @@ 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_v2.overlay b/app/boards/shields/splitkb_aurora_sofle/boards/nice_nano_v2.overlay deleted file mode 100644 index 8228d530c82..00000000000 --- a/app/boards/shields/splitkb_aurora_sofle/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,45 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <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_sweep/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig index 6a0e37286c9..c84cf94cd75 100644 --- a/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig @@ -16,10 +16,6 @@ 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_v2.overlay b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay deleted file mode 100644 index 424a617b237..00000000000 --- a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/tg4x/boards/nice_nano.conf b/app/boards/shields/tg4x/boards/nice_nano.conf index 7b0779480ec..c93ed4de8bd 100644 --- a/app/boards/shields/tg4x/boards/nice_nano.conf +++ b/app/boards/shields/tg4x/boards/nice_nano.conf @@ -3,5 +3,3 @@ # 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_v2.overlay b/app/boards/shields/tg4x/boards/nice_nano_v2.overlay deleted file mode 100644 index 84441899991..00000000000 --- a/app/boards/shields/tg4x/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/tidbit/boards/nice_nano_v2.overlay b/app/boards/shields/tidbit/boards/nice_nano_v2.overlay deleted file mode 100644 index b0895433933..00000000000 --- a/app/boards/shields/tidbit/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/tidbit/tidbit.conf b/app/boards/shields/tidbit/tidbit.conf index 82bd3477eab..bb2d0d9a85b 100644 --- a/app/boards/shields/tidbit/tidbit.conf +++ b/app/boards/shields/tidbit/tidbit.conf @@ -7,8 +7,6 @@ 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/two_percent_milk/boards/nice_nano_v2.overlay b/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay deleted file mode 100644 index b0895433933..00000000000 --- a/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay +++ /dev/null @@ -1,46 +0,0 @@ -#include - -&pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; - - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; -}; - -&spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; - - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; diff --git a/app/boards/shields/two_percent_milk/two_percent_milk.conf b/app/boards/shields/two_percent_milk/two_percent_milk.conf index 4baccacfdf3..077ebcf6ba3 100644 --- a/app/boards/shields/two_percent_milk/two_percent_milk.conf +++ b/app/boards/shields/two_percent_milk/two_percent_milk.conf @@ -3,7 +3,6 @@ # 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 \ No newline at end of file +# CONFIG_ZMK_USB_LOGGING=y diff --git a/app/boards/shields/zmk_uno/Kconfig.defconfig b/app/boards/shields/zmk_uno/Kconfig.defconfig index 95602ca73f9..9898a6e6867 100644 --- a/app/boards/shields/zmk_uno/Kconfig.defconfig +++ b/app/boards/shields/zmk_uno/Kconfig.defconfig @@ -16,10 +16,6 @@ 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/arm/sparkfun_pro_micro_rp2040/sparkfun_pro_micro_rp2040.zmk.yml b/app/boards/sparkfun/pro_micro_rp2040/sparkfun_pro_micro_rp2040.zmk.yml similarity index 100% rename from app/boards/arm/sparkfun_pro_micro_rp2040/sparkfun_pro_micro_rp2040.zmk.yml rename to app/boards/sparkfun/pro_micro_rp2040/sparkfun_pro_micro_rp2040.zmk.yml diff --git a/app/boards/arm/blackpill_f401cc/blackpill_f401cc.zmk.yml b/app/boards/weact/blackpill_f401cc/blackpill_f401cc.zmk.yml similarity index 100% rename from app/boards/arm/blackpill_f401cc/blackpill_f401cc.zmk.yml rename to app/boards/weact/blackpill_f401cc/blackpill_f401cc.zmk.yml diff --git a/app/boards/arm/blackpill_f401ce/blackpill_f401ce.zmk.yml b/app/boards/weact/blackpill_f401ce/blackpill_f401ce.zmk.yml similarity index 100% rename from app/boards/arm/blackpill_f401ce/blackpill_f401ce.zmk.yml rename to app/boards/weact/blackpill_f401ce/blackpill_f401ce.zmk.yml diff --git a/app/boards/arm/blackpill_f411ce/blackpill_f411ce.zmk.yml b/app/boards/weact/blackpill_f411ce/blackpill_f411ce.zmk.yml similarity index 100% rename from app/boards/arm/blackpill_f411ce/blackpill_f411ce.zmk.yml rename to app/boards/weact/blackpill_f411ce/blackpill_f411ce.zmk.yml diff --git a/app/boards/arm/puchi_ble/CMakeLists.txt b/app/boards/zhiayang/mikoto/CMakeLists.txt similarity index 100% rename from app/boards/arm/puchi_ble/CMakeLists.txt rename to app/boards/zhiayang/mikoto/CMakeLists.txt diff --git a/app/boards/arm/mikoto/Kconfig b/app/boards/zhiayang/mikoto/Kconfig similarity index 74% rename from app/boards/arm/mikoto/Kconfig rename to app/boards/zhiayang/mikoto/Kconfig index b40fdcff510..0313f68b1c7 100644 --- a/app/boards/arm/mikoto/Kconfig +++ b/app/boards/zhiayang/mikoto/Kconfig @@ -1,15 +1,3 @@ -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.defconfig b/app/boards/zhiayang/mikoto/Kconfig.defconfig similarity index 91% rename from app/boards/arm/mikoto/Kconfig.defconfig rename to app/boards/zhiayang/mikoto/Kconfig.defconfig index 0710f6fde84..ec6ee532dd1 100644 --- a/app/boards/arm/mikoto/Kconfig.defconfig +++ b/app/boards/zhiayang/mikoto/Kconfig.defconfig @@ -5,9 +5,6 @@ if BOARD_MIKOTO -config BOARD - default "mikoto" - if USB config USB_NRFX diff --git a/app/boards/zhiayang/mikoto/Kconfig.mikoto b/app/boards/zhiayang/mikoto/Kconfig.mikoto new file mode 100644 index 00000000000..69ca49c0ec0 --- /dev/null +++ b/app/boards/zhiayang/mikoto/Kconfig.mikoto @@ -0,0 +1,9 @@ +# Copyright (c) 2020 The ZMK Contributors +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_MIKOTO + select SOC_NRF52840_QIAA + imply RETAINED_MEM + imply RETENTION + imply RETENTION_BOOT_MODE + imply I2C if BOARD_REVISION="7.2.0" diff --git a/app/boards/arm/mikoto/arduino_pro_micro_pins_v5.dtsi b/app/boards/zhiayang/mikoto/arduino_pro_micro_pins_v5.dtsi similarity index 100% rename from app/boards/arm/mikoto/arduino_pro_micro_pins_v5.dtsi rename to app/boards/zhiayang/mikoto/arduino_pro_micro_pins_v5.dtsi diff --git a/app/boards/arm/mikoto/arduino_pro_micro_pins_v6.dtsi b/app/boards/zhiayang/mikoto/arduino_pro_micro_pins_v6.dtsi similarity index 100% rename from app/boards/arm/mikoto/arduino_pro_micro_pins_v6.dtsi rename to app/boards/zhiayang/mikoto/arduino_pro_micro_pins_v6.dtsi diff --git a/app/boards/zhiayang/mikoto/board.cmake b/app/boards/zhiayang/mikoto/board.cmake new file mode 100644 index 00000000000..73fa64a9aa0 --- /dev/null +++ b/app/boards/zhiayang/mikoto/board.cmake @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: MIT + +board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") +include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) +include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/boards/zhiayang/mikoto/board.yml b/app/boards/zhiayang/mikoto/board.yml new file mode 100644 index 00000000000..d1f7155762b --- /dev/null +++ b/app/boards/zhiayang/mikoto/board.yml @@ -0,0 +1,14 @@ +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/boards/arm/mikoto/mikoto-pinctrl.dtsi b/app/boards/zhiayang/mikoto/mikoto-pinctrl.dtsi similarity index 100% rename from app/boards/arm/mikoto/mikoto-pinctrl.dtsi rename to app/boards/zhiayang/mikoto/mikoto-pinctrl.dtsi diff --git a/app/boards/arm/mikoto/mikoto.dts b/app/boards/zhiayang/mikoto/mikoto.dts similarity index 95% rename from app/boards/arm/mikoto/mikoto.dts rename to app/boards/zhiayang/mikoto/mikoto.dts index b8dca950308..c2a82a47ce9 100644 --- a/app/boards/arm/mikoto/mikoto.dts +++ b/app/boards/zhiayang/mikoto/mikoto.dts @@ -6,6 +6,7 @@ /dts-v1/; #include +#include / { model = "mikoto"; @@ -40,6 +41,10 @@ }; }; +®1 { + regulator-initial-mode = ; +}; + &adc { status = "okay"; }; diff --git a/app/boards/arm/mikoto/mikoto.yaml b/app/boards/zhiayang/mikoto/mikoto.yaml similarity index 100% rename from app/boards/arm/mikoto/mikoto.yaml rename to app/boards/zhiayang/mikoto/mikoto.yaml diff --git a/app/boards/arm/mikoto/mikoto.zmk.yml b/app/boards/zhiayang/mikoto/mikoto.zmk.yml similarity index 100% rename from app/boards/arm/mikoto/mikoto.zmk.yml rename to app/boards/zhiayang/mikoto/mikoto.zmk.yml diff --git a/app/boards/arm/mikoto/mikoto_5_20_0.overlay b/app/boards/zhiayang/mikoto/mikoto_5_20_0.overlay similarity index 100% rename from app/boards/arm/mikoto/mikoto_5_20_0.overlay rename to app/boards/zhiayang/mikoto/mikoto_5_20_0.overlay diff --git a/app/boards/arm/mikoto/mikoto_6_1_0.overlay b/app/boards/zhiayang/mikoto/mikoto_6_1_0.overlay similarity index 100% rename from app/boards/arm/mikoto/mikoto_6_1_0.overlay rename to app/boards/zhiayang/mikoto/mikoto_6_1_0.overlay diff --git a/app/boards/arm/mikoto/mikoto_7_2_0.conf b/app/boards/zhiayang/mikoto/mikoto_7_2_0.conf similarity index 100% rename from app/boards/arm/mikoto/mikoto_7_2_0.conf rename to app/boards/zhiayang/mikoto/mikoto_7_2_0.conf diff --git a/app/boards/arm/mikoto/mikoto_7_2_0.overlay b/app/boards/zhiayang/mikoto/mikoto_7_2_0.overlay similarity index 100% rename from app/boards/arm/mikoto/mikoto_7_2_0.overlay rename to app/boards/zhiayang/mikoto/mikoto_7_2_0.overlay diff --git a/app/boards/arm/mikoto/mikoto_defconfig b/app/boards/zhiayang/mikoto/mikoto_defconfig similarity index 80% rename from app/boards/arm/mikoto/mikoto_defconfig rename to app/boards/zhiayang/mikoto/mikoto_defconfig index 4b3bc7d9758..56aa9526f66 100644 --- a/app/boards/arm/mikoto/mikoto_defconfig +++ b/app/boards/zhiayang/mikoto/mikoto_defconfig @@ -1,9 +1,5 @@ # 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 diff --git a/app/boards/arm/mikoto/pinmux.c b/app/boards/zhiayang/mikoto/pinmux.c similarity index 100% rename from app/boards/arm/mikoto/pinmux.c rename to app/boards/zhiayang/mikoto/pinmux.c diff --git a/app/boards/zhiayang/mikoto/pre_dt_board.cmake b/app/boards/zhiayang/mikoto/pre_dt_board.cmake new file mode 100644 index 00000000000..05b0efe5f04 --- /dev/null +++ b/app/boards/zhiayang/mikoto/pre_dt_board.cmake @@ -0,0 +1,9 @@ +# +# 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/core-coverage.yml b/app/core-coverage.yml index bc36495a758..6dc6a05193c 100644 --- a/app/core-coverage.yml +++ b/app/core-coverage.yml @@ -1,6 +1,6 @@ board: - - nice_nano_v2 - - nrfmicro_13 + - nice_nano + - nrfmicro/nrf52840 - proton_c shield: - corne_left @@ -9,52 +9,52 @@ shield: - settings_reset - tidbit include: - - board: bdn9_rev2 + - board: bdn9 - board: nice60 - - board: seeeduino_xiao_ble + - board: xiao_ble shield: hummingbird - board: nrf52840_m2 shield: m60 - - board: planck_rev6 + - board: planck - board: proton_c shield: clueboard_california - - board: nice_nano_v2 + - board: nice_nano shield: kyria_left cmake-args: "-DCONFIG_ZMK_DISPLAY=y" nickname: "display" - - board: nice_nano_v2 + - board: nice_nano shield: kyria_left cmake-args: "-DCONFIG_ZMK_POINTING=y" nickname: "mouse" - board: sparkfun_pro_micro_rp2040 shield: reviung41 cmake-args: "-DSNIPPET='zmk-usb-logging'" - - board: nice_nano_v2 + - board: nice_nano shield: kyria_right cmake-args: "-DCONFIG_ZMK_DISPLAY=y" nickname: "display" - board: nice_nano shield: romac_plus - cmake-args: "-DCONFIG_ZMK_RGB_UNDERGLOW=y -DCONFIG_WS2812_STRIP=y" + cmake-args: "-DCONFIG_ZMK_RGB_UNDERGLOW=y" nickname: "underglow" - - board: nice_nano_v2 + - board: nice_nano shield: lily58_left nice_view_adapter nice_view nickname: "niceview" - - board: bdn9_rev2 + - board: bdn9 snippet: studio-rpc-usb-uart cmake-args: "-DCONFIG_ZMK_STUDIO=y" nickname: "stm32-studio" - - board: nice_nano_v2 + - board: nice_nano shield: reviung41 snippet: studio-rpc-usb-uart cmake-args: "-DCONFIG_ZMK_STUDIO=y" nickname: "nrf52-studio" - - board: nice_nano_v2 + - board: nice_nano shield: corne_left snippet: studio-rpc-usb-uart cmake-args: "-DCONFIG_ZMK_STUDIO=y" nickname: "split-left-studio" - - board: nice_nano_v2 + - board: nice_nano shield: corne_right snippet: studio-rpc-usb-uart cmake-args: "-DCONFIG_ZMK_STUDIO=y" diff --git a/app/dts/behaviors/reset.dtsi b/app/dts/behaviors/reset.dtsi index 2aa41d7d6e8..1b29f9d19aa 100644 --- a/app/dts/behaviors/reset.dtsi +++ b/app/dts/behaviors/reset.dtsi @@ -19,6 +19,7 @@ bootloader: bootload { compatible = "zmk,behavior-reset"; type = ; + bootloader; #binding-cells = <0>; display-name = "Bootloader"; }; diff --git a/app/dts/bindings/behaviors/zmk,behavior-reset.yaml b/app/dts/bindings/behaviors/zmk,behavior-reset.yaml index 9eb7aa6a3c4..aeb9450eea9 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-reset.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-reset.yaml @@ -11,3 +11,5 @@ properties: type: type: int default: 0 + bootloader: + type: boolean 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 new file mode 100644 index 00000000000..5d8b70c6a97 --- /dev/null +++ b/app/dts/bindings/retained_mem/zmk,bootmode-to-magic-mapper.yaml @@ -0,0 +1,9 @@ +# 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 3f9b8c244bd..7ed4cdc3d2d 100644 --- a/app/dts/bindings/zmk,physical-layout.yaml +++ b/app/dts/bindings/zmk,physical-layout.yaml @@ -21,6 +21,9 @@ 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/common/nordic/nrf52840_uf2_boot_mode.dtsi b/app/dts/common/nordic/nrf52840_uf2_boot_mode.dtsi new file mode 100644 index 00000000000..9087426c03a --- /dev/null +++ b/app/dts/common/nordic/nrf52840_uf2_boot_mode.dtsi @@ -0,0 +1,29 @@ + +&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/zmk/physical_layouts.h b/app/include/zmk/physical_layouts.h index d5cf6527379..e28c194fec5 100644 --- a/app/include/zmk/physical_layouts.h +++ b/app/include/zmk/physical_layouts.h @@ -33,6 +33,9 @@ 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/keymap-module/modules/modules.cmake b/app/keymap-module/modules/modules.cmake index 6aa62885105..eed28907076 100644 --- a/app/keymap-module/modules/modules.cmake +++ b/app/keymap-module/modules/modules.cmake @@ -59,163 +59,3 @@ if (ZMK_CONFIG) 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/drivers/input/input_mock.c b/app/module/drivers/input/input_mock.c index 855b7dc378a..23282cd0417 100644 --- a/app/module/drivers/input/input_mock.c +++ b/app/module/drivers/input/input_mock.c @@ -48,10 +48,15 @@ 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], - cfg->events[base_idx + 3], K_NO_WAIT); + sync, K_NO_WAIT); - k_work_schedule(&data->work, K_MSEC(cfg->event_period)); + if (sync) { + k_work_schedule(&data->work, K_MSEC(cfg->event_period)); + } else { + k_work_schedule(&data->work, K_NO_WAIT); + } } int input_mock_init(const struct device *dev) { diff --git a/app/run-test.sh b/app/run-test.sh index 1b10ed930ad..e22adff1b4a 100755 --- a/app/run-test.sh +++ b/app/run-test.sh @@ -25,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_posix_64.keymap -exec dirname \{\} \;) +testcases=$(find $path -name native_sim.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 @@ -39,7 +39,7 @@ 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_posix_64 -p -- -DCONFIG_ASSERT=y -DZMK_CONFIG="$(realpath $path)" \ + -b native_sim/native/64 -p -- -DCONFIG_ASSERT=y -DZMK_CONFIG="$(realpath $path)" \ ${ZMK_EXTRA_MODULES:+-DZMK_EXTRA_MODULES="$(realpath ${ZMK_EXTRA_MODULES})"}" if [ -z ${ZMK_TESTS_VERBOSE} ]; then diff --git a/app/src/activity.c b/app/src/activity.c index b109d46d841..f4dc3562437 100644 --- a/app/src/activity.c +++ b/app/src/activity.c @@ -116,9 +116,11 @@ 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) { k_work_submit(¬e_activity_work); } +static void activity_input_listener(struct input_event *ev, void *user_data) { + k_work_submit(¬e_activity_work); +} -INPUT_CALLBACK_DEFINE(NULL, activity_input_listener); +INPUT_CALLBACK_DEFINE(NULL, activity_input_listener, NULL); #endif diff --git a/app/src/behavior.c b/app/src/behavior.c index 6d5bbca314f..c7899d62eae 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 (z_device_is_ready(item->device) && item->device->name == name) { + if (device_is_ready(item->device) && item->device->name == name) { return item->device; } } STRUCT_SECTION_FOREACH(zmk_behavior_ref, item) { - if (z_device_is_ready(item->device) && strcmp(item->device->name, name) == 0) { + if (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 (z_device_is_ready(item->device) && strcmp(item->device->name, name) == 0) { + if (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 (z_device_is_ready(item->device) && item->local_id == local_id) { + if (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 ea8e948d21c..40e82a8e40c 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", speed(config, code, state->speed, move_duration)); + LOG_DBG("Calculated speed: %f", (double)speed(config, code, state->speed, move_duration)); move = (move_duration > 0) ? (speed(config, code, state->speed, move_duration) * config->trigger_period_ms / 1000) diff --git a/app/src/behaviors/behavior_reset.c b/app/src/behaviors/behavior_reset.c index 61df15afdce..67f33aaedb2 100644 --- a/app/src/behaviors/behavior_reset.c +++ b/app/src/behaviors/behavior_reset.c @@ -14,11 +14,21 @@ #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, @@ -26,10 +36,20 @@ 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; - // TODO: Correct magic code for going into DFU? +#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 // 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; } @@ -43,7 +63,11 @@ static const struct behavior_driver_api behavior_reset_driver_api = { #define RST_INST(n) \ static const struct behavior_reset_config behavior_reset_config_##n = { \ - .type = DT_INST_PROP(n, type)}; \ + COND_CODE_1( \ + IS_ENABLED(CONFIG_RETENTION_BOOT_MODE), \ + (DT_INST_PROP(n, bootloader) ? BOOT_MODE_TYPE_BOOTLOADER : BOOT_MODE_TYPE_NORMAL), \ + (.type = DT_INST_PROP(n, type))), \ + }; \ BEHAVIOR_DT_INST_DEFINE(n, NULL, NULL, NULL, &behavior_reset_config_##n, POST_KERNEL, \ CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_reset_driver_api); diff --git a/app/src/ble.c b/app/src/ble.c index eb2a697e6d2..94c1b293646 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -56,8 +56,7 @@ enum advertising_type { #define CURR_ADV(adv) (adv << 4) #define ZMK_ADV_CONN_NAME \ - 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_LE_ADV_PARAM(BT_LE_ADV_OPT_CONN | BT_LE_ADV_OPT_USE_NAME | BT_LE_ADV_OPT_FORCE_NAME_IN_AD, \ BT_GAP_ADV_FAST_INT_MIN_2, BT_GAP_ADV_FAST_INT_MAX_2, NULL) static struct zmk_ble_profile profiles[ZMK_BLE_PROFILE_COUNT]; diff --git a/app/src/boot/CMakeLists.txt b/app/src/boot/CMakeLists.txt new file mode 100644 index 00000000000..6e75945a7e9 --- /dev/null +++ b/app/src/boot/CMakeLists.txt @@ -0,0 +1,3 @@ + +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) \ No newline at end of file diff --git a/app/src/boot/Kconfig b/app/src/boot/Kconfig new file mode 100644 index 00000000000..f98fbba5761 --- /dev/null +++ b/app/src/boot/Kconfig @@ -0,0 +1,43 @@ + +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 diff --git a/app/src/boot/Kconfig.defaults b/app/src/boot/Kconfig.defaults new file mode 100644 index 00000000000..29e4e9bc4b3 --- /dev/null +++ b/app/src/boot/Kconfig.defaults @@ -0,0 +1,27 @@ + +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_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 new file mode 100644 index 00000000000..f2b672bfa16 --- /dev/null +++ b/app/src/boot/bootmode_to_magic_mapper.c @@ -0,0 +1,63 @@ +/* + * 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 new file mode 100644 index 00000000000..254dc69dc64 --- /dev/null +++ b/app/src/boot/dbl_tap_bootloader.c @@ -0,0 +1,16 @@ +#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/display/Kconfig b/app/src/display/Kconfig index 5d5c81f479e..a6d1f59393c 100644 --- a/app/src/display/Kconfig +++ b/app/src/display/Kconfig @@ -29,11 +29,8 @@ choice LV_TXT_ENC endchoice -config LV_MEM_CUSTOM - default y - - config LV_Z_MEM_POOL_SIZE - default 4096 if ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN +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" @@ -67,7 +64,7 @@ if ZMK_DISPLAY_WORK_QUEUE_DEDICATED config ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE int "Stack size for dedicated UI thread/queue" - default 2048 + default 3072 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 da6686cac64..a86bfad51ca 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); - theme->font_small = CONFIG_ZMK_LV_FONT_DEFAULT_SMALL; + 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); - disp->theme = theme; + lv_display_set_theme(disp, theme); #endif // CONFIG_LV_USE_THEME_MONO } @@ -145,9 +145,14 @@ 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, NULL); + CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_PRIORITY, &config); #endif #if IS_ENABLED(CONFIG_ARCH_POSIX) diff --git a/app/src/physical_layouts.c b/app/src/physical_layouts.c index 8d384308892..15268b94196 100644 --- a/app/src/physical_layouts.c +++ b/app/src/physical_layouts.c @@ -9,6 +9,7 @@ #include #include #include +#include #if IS_ENABLED(CONFIG_SETTINGS) #include @@ -27,6 +28,16 @@ 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)) @@ -53,6 +64,10 @@ 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 " \ @@ -67,8 +82,18 @@ BUILD_ASSERT( .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), \ - .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 = INPUT_FOR_INST(n)), ()) \ + COND_CODE_1(UTIL_OR(DT_HAS_CHOSEN(zmk_kscan), DT_INST_PROP_LEN(n, kscan)), \ + (.kscan = DEVICE_DT_GET(COND_CODE_1(DT_INST_PROP_LEN(n, kscan), \ + (DT_INST_PHANDLE(n, kscan)), \ + (DT_CHOSEN(zmk_kscan))))), \ + ())}; \ + COND_CODE_1( \ + UTIL_AND(MATRIX_INPUT_SUPPORT, DT_INST_PROP_LEN(n, input)), \ + (INPUT_CALLBACK_DEFINE(INPUT_FOR_INST(n), zmk_physical_layout_input_event_cb, \ + (void *)&(_CONCAT(_zmk_physical_layout_, DT_DRV_INST(n))));), \ + ()) DT_INST_FOREACH_STATUS_OKAY(ZMK_LAYOUT_INST) @@ -135,12 +160,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 DT_HAS_CHOSEN(zmk_kscan) +#elif UTIL_OR(DT_HAS_CHOSEN(zmk_kscan), DT_HAS_CHOSEN(zmk_matrix_input)) #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) #warning \ - "Ignoring the physical layouts and using the chosen kscan with a synthetic transform. Consider setting a chosen physical layout instead." + "Ignoring the physical layouts and using the chosen kscan/matrix-input with a synthetic transform. Consider setting a chosen physical layout instead." #endif @@ -148,9 +173,19 @@ 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)}; @@ -180,6 +215,55 @@ 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 447eb351c9b..f4389e7eeb4 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_RUNTIME_EXCLUSIVE) +#if defined(CONFIG_PM_DEVICE_SYSTEM_MANAGED) /* 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_state_is_locked(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_wakeup_is_enabled(dev) || + pm_device_runtime_is_enabled(dev)) { continue; } diff --git a/app/src/pointing/input_listener.c b/app/src/pointing/input_listener.c index 28f25300032..431d9a7463b 100644 --- a/app/src/pointing/input_listener.c +++ b/app/src/pointing/input_listener.c @@ -128,6 +128,14 @@ 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: @@ -391,9 +399,10 @@ 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 input_handler_##n(struct input_event *evt, void *user_data) { \ input_handler(&config_##n, &data_##n, evt); \ - } INPUT_CALLBACK_DEFINE(DEVICE_DT_GET(DT_INST_PHANDLE(n, device)), input_handler_##n);), \ + } INPUT_CALLBACK_DEFINE(DEVICE_DT_GET(DT_INST_PHANDLE(n, device)), input_handler_##n, \ + NULL);), \ ()) DT_INST_FOREACH_STATUS_OKAY(IL_INST) diff --git a/app/src/pointing/input_processor_temp_layer.c b/app/src/pointing/input_processor_temp_layer.c index 4d18f33d783..455623123ef 100644 --- a/app/src/pointing/input_processor_temp_layer.c +++ b/app/src/pointing/input_processor_temp_layer.c @@ -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: %d", ev->timestamp); + LOG_DBG("Setting last_tapped_timestamp to: %lld", ev->timestamp); data->state.last_tapped_timestamp = ev->timestamp; ret = k_mutex_unlock(&data->lock); @@ -252,7 +252,11 @@ 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)); - k_work_submit(&layer_action_work); + if (ret < 0) { + LOG_ERR("Failed to enqueue action to enable layer %d (%d)", param1, ret); + } else { + k_work_submit(&layer_action_work); + } } if (param2 > 0) { diff --git a/app/src/pointing/input_split.c b/app/src/pointing/input_split.c index 615790a09a0..c3bcd4cc21f 100644 --- a/app/src/pointing/input_split.c +++ b/app/src/pointing/input_split.c @@ -54,7 +54,7 @@ int zmk_input_split_report_peripheral_event(uint8_t reg, uint8_t type, uint16_t ({})); \ 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 split_input_handler_##n(struct input_event *evt, void *user_data) { \ for (size_t i = 0; i < ARRAY_SIZE(processors_##n); i++) { \ int ret = zmk_input_processor_handle_event(processors_##n[i].dev, evt, \ processors_##n[i].param1, \ @@ -74,7 +74,7 @@ int zmk_input_split_report_peripheral_event(uint8_t reg, uint8_t type, uint16_t }}}; \ zmk_split_peripheral_report_event(&ev); \ } \ - INPUT_CALLBACK_DEFINE(DEVICE_DT_GET(DT_INST_PHANDLE(n, device)), split_input_handler_##n); + INPUT_CALLBACK_DEFINE(DEVICE_DT_GET(DT_INST_PHANDLE(n, device)), split_input_handler_##n, NULL); #endif diff --git a/app/src/sensors.c b/app/src/sensors.c index 90ea1903940..e1295de8551 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; + struct sensor_value value = {0}; err = sensor_channel_get(item->dev, item->trigger.chan, &value); if (err) { diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index 685deb51cbb..1a9fb0e8a14 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -966,10 +966,6 @@ 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) @@ -1288,8 +1284,7 @@ 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 for %d", - ev.event.data.key_position_event.position); + LOG_DBG("Trigger key position state change of type %d", ev.event.type); zmk_split_transport_central_peripheral_event_handler(&bt_central, ev.source, ev.event); } } diff --git a/app/src/split/bluetooth/peripheral.c b/app/src/split/bluetooth/peripheral.c index e4e7ba3a306..0d3ad2de6a4 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, zmk_ble_ad, ARRAY_SIZE(zmk_ble_ad), NULL, 0); + return bt_le_adv_start(BT_LE_ADV_CONN_FAST_2, zmk_ble_ad, ARRAY_SIZE(zmk_ble_ad), NULL, 0); } }; @@ -96,6 +96,13 @@ 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]; @@ -107,11 +114,6 @@ 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) { @@ -138,6 +140,7 @@ 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/studio/gatt_rpc_transport.c b/app/src/studio/gatt_rpc_transport.c index f0ab3152aa6..dff1825908b 100644 --- a/app/src/studio/gatt_rpc_transport.c +++ b/app/src/studio/gatt_rpc_transport.c @@ -25,6 +25,7 @@ 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) { @@ -125,8 +126,14 @@ 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) { @@ -139,34 +146,32 @@ static void notif_rpc_tx_cb(struct k_work *work) { return; } - uint16_t notify_size = get_notify_size_for_conn(conn); - uint8_t notify_bytes[notify_size]; + 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; + } - 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(notify_bytes + added, buf, len); + memcpy(indicate_buffer + added, buf, len); added += len; ring_buf_get_finish(tx_buf, len); } - rpc_indicate_params.data = notify_bytes; rpc_indicate_params.len = added; - int notify_attempts = 5; - do { - int err = bt_gatt_indicate(conn, &rpc_indicate_params); - if (err >= 0) { - break; - } - + int err = bt_gatt_indicate(conn, &rpc_indicate_params); + if (err < 0) { LOG_WRN("Failed to notify the response %d", err); - k_sleep(K_MSEC(200)); - } while (notify_attempts-- > 0); + k_sem_give(&indicate_sem); + } } bt_conn_unref(conn); @@ -178,6 +183,11 @@ 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; @@ -194,7 +204,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, sizeof(tx_state), 0); + memset(&tx_state, 0, sizeof(tx_state)); return &tx_state; } diff --git a/app/src/studio/rpc.c b/app/src/studio/rpc.c index 7b8dd605d29..af56148254d 100644 --- a/app/src/studio/rpc.c +++ b/app/src/studio/rpc.c @@ -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(); + thread_analyzer_print(0); #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(); + thread_analyzer_print(0); #endif // IS_ENABLED(CONFIG_THREAD_ANALYZER) if (err < 0) { LOG_ERR("Failed to send the RPC response %d", err); diff --git a/app/tests/backlight/basic/native_posix_64.conf b/app/tests/backlight/basic/native_sim.conf similarity index 100% rename from app/tests/backlight/basic/native_posix_64.conf rename to app/tests/backlight/basic/native_sim.conf diff --git a/app/tests/backlight/basic/native_posix_64.keymap b/app/tests/backlight/basic/native_sim.keymap similarity index 100% rename from app/tests/backlight/basic/native_posix_64.keymap rename to app/tests/backlight/basic/native_sim.keymap diff --git a/app/tests/backlight/config-brt/native_posix_64.conf b/app/tests/backlight/config-brt/native_sim.conf similarity index 100% rename from app/tests/backlight/config-brt/native_posix_64.conf rename to app/tests/backlight/config-brt/native_sim.conf diff --git a/app/tests/backlight/config-brt/native_posix_64.keymap b/app/tests/backlight/config-brt/native_sim.keymap similarity index 100% rename from app/tests/backlight/config-brt/native_posix_64.keymap rename to app/tests/backlight/config-brt/native_sim.keymap diff --git a/app/tests/backlight/config-on/native_posix_64.conf b/app/tests/backlight/config-on/native_sim.conf similarity index 100% rename from app/tests/backlight/config-on/native_posix_64.conf rename to app/tests/backlight/config-on/native_sim.conf diff --git a/app/tests/backlight/config-on/native_posix_64.keymap b/app/tests/backlight/config-on/native_sim.keymap similarity index 100% rename from app/tests/backlight/config-on/native_posix_64.keymap rename to app/tests/backlight/config-on/native_sim.keymap diff --git a/app/tests/backlight/config-step/native_posix_64.conf b/app/tests/backlight/config-step/native_sim.conf similarity index 100% rename from app/tests/backlight/config-step/native_posix_64.conf rename to app/tests/backlight/config-step/native_sim.conf diff --git a/app/tests/backlight/config-step/native_posix_64.keymap b/app/tests/backlight/config-step/native_sim.keymap similarity index 100% rename from app/tests/backlight/config-step/native_posix_64.keymap rename to app/tests/backlight/config-step/native_sim.keymap diff --git a/app/tests/backlight/cycle/native_posix_64.conf b/app/tests/backlight/cycle/native_sim.conf similarity index 100% rename from app/tests/backlight/cycle/native_posix_64.conf rename to app/tests/backlight/cycle/native_sim.conf diff --git a/app/tests/backlight/cycle/native_posix_64.keymap b/app/tests/backlight/cycle/native_sim.keymap similarity index 100% rename from app/tests/backlight/cycle/native_posix_64.keymap rename to app/tests/backlight/cycle/native_sim.keymap diff --git a/app/tests/backlight/low-brightness/native_posix_64.conf b/app/tests/backlight/low-brightness/native_sim.conf similarity index 100% rename from app/tests/backlight/low-brightness/native_posix_64.conf rename to app/tests/backlight/low-brightness/native_sim.conf diff --git a/app/tests/backlight/low-brightness/native_posix_64.keymap b/app/tests/backlight/low-brightness/native_sim.keymap similarity index 100% rename from app/tests/backlight/low-brightness/native_posix_64.keymap rename to app/tests/backlight/low-brightness/native_sim.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 fa40c20a67b..4c8f2c27fe8 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,3 +9,4 @@ 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/snapshot.log b/app/tests/ble/split/peripheral-input/snapshot.log index eaf0675def3..cf63c996e95 100644 --- a/app/tests/ble/split/peripheral-input/snapshot.log +++ b/app/tests/ble/split/peripheral-input/snapshot.log @@ -19,6 +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 diff --git a/app/tests/ble/split/run-peripheral-behavior/snapshot.log b/app/tests/ble/split/run-peripheral-behavior/snapshot.log index ae93d4d8097..2289d9c1f8d 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 3.5 Build 0 +peripheral 0 bt_hci_core: Firmware: Standard Bluetooth controller (0x00) Version 4.1 Build 0 peripheral 0 bt_id: No static addresses stored in controller peripheral 0 bt_hci_core: Identity: D1:0B:03:A3:ED:6F (random) peripheral 0 bt_hci_core: HCI: version 5.4 (0x0d) revision 0x0000, manufacturer 0x05f1 diff --git a/app/tests/ble/split/set-hid-indicators/snapshot.log b/app/tests/ble/split/set-hid-indicators/snapshot.log index 3e35cb2b70e..abec1666d18 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 3.5 Build 0 +peripheral 0 bt_hci_core: Firmware: Standard Bluetooth controller (0x00) Version 4.1 Build 0 peripheral 0 bt_id: No static addresses stored in controller peripheral 0 bt_hci_core: Identity: D1:0B:03:A3:ED:6F (random) peripheral 0 bt_hci_core: HCI: version 5.4 (0x0d) revision 0x0000, manufacturer 0x05f1 diff --git a/app/tests/caps-word/continue-with-modifiers/native_posix_64.keymap b/app/tests/caps-word/continue-with-modifiers/native_sim.keymap similarity index 100% rename from app/tests/caps-word/continue-with-modifiers/native_posix_64.keymap rename to app/tests/caps-word/continue-with-modifiers/native_sim.keymap diff --git a/app/tests/caps-word/continue-with-non-alpha-continue-list-item/native_posix_64.keymap b/app/tests/caps-word/continue-with-non-alpha-continue-list-item/native_sim.keymap similarity index 100% rename from app/tests/caps-word/continue-with-non-alpha-continue-list-item/native_posix_64.keymap rename to app/tests/caps-word/continue-with-non-alpha-continue-list-item/native_sim.keymap diff --git a/app/tests/caps-word/continue-with-non-modified-numeric-usage-id/native_posix_64.keymap b/app/tests/caps-word/continue-with-non-modified-numeric-usage-id/native_sim.keymap similarity index 100% rename from app/tests/caps-word/continue-with-non-modified-numeric-usage-id/native_posix_64.keymap rename to app/tests/caps-word/continue-with-non-modified-numeric-usage-id/native_sim.keymap diff --git a/app/tests/caps-word/deactivate-by-non-alpha-non-continuation/native_posix_64.keymap b/app/tests/caps-word/deactivate-by-non-alpha-non-continuation/native_sim.keymap similarity index 100% rename from app/tests/caps-word/deactivate-by-non-alpha-non-continuation/native_posix_64.keymap rename to app/tests/caps-word/deactivate-by-non-alpha-non-continuation/native_sim.keymap diff --git a/app/tests/caps-word/deactivate-by-second-press/native_posix.keymap b/app/tests/caps-word/deactivate-by-second-press/native_posix.keymap deleted file mode 100644 index 121a827cce6..00000000000 --- a/app/tests/caps-word/deactivate-by-second-press/native_posix.keymap +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include -#include -#include "../behavior_keymap.dtsi" - -&kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(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_posix_64.keymap b/app/tests/caps-word/deactivate-by-second-press/native_sim.keymap similarity index 100% rename from app/tests/caps-word/deactivate-by-second-press/native_posix_64.keymap rename to app/tests/caps-word/deactivate-by-second-press/native_sim.keymap diff --git a/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-0/native_sim.keymap similarity index 100% rename from app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap rename to app/tests/combo/combos-and-holdtaps-0/native_sim.keymap diff --git a/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-1/native_sim.keymap similarity index 100% rename from app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap rename to app/tests/combo/combos-and-holdtaps-1/native_sim.keymap diff --git a/app/tests/combo/combos-and-holdtaps-2/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-2/native_sim.keymap similarity index 100% rename from app/tests/combo/combos-and-holdtaps-2/native_posix_64.keymap rename to app/tests/combo/combos-and-holdtaps-2/native_sim.keymap diff --git a/app/tests/combo/combos-and-holdtaps-3/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-3/native_sim.keymap similarity index 100% rename from app/tests/combo/combos-and-holdtaps-3/native_posix_64.keymap rename to app/tests/combo/combos-and-holdtaps-3/native_sim.keymap diff --git a/app/tests/combo/combos-and-holdtaps-4/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-4/native_sim.keymap similarity index 100% rename from app/tests/combo/combos-and-holdtaps-4/native_posix_64.keymap rename to app/tests/combo/combos-and-holdtaps-4/native_sim.keymap diff --git a/app/tests/combo/layer-filter-0/native_posix_64.keymap b/app/tests/combo/layer-filter-0/native_sim.keymap similarity index 100% rename from app/tests/combo/layer-filter-0/native_posix_64.keymap rename to app/tests/combo/layer-filter-0/native_sim.keymap diff --git a/app/tests/combo/layer-filter-1/native_posix_64.keymap b/app/tests/combo/layer-filter-1/native_sim.keymap similarity index 100% rename from app/tests/combo/layer-filter-1/native_posix_64.keymap rename to app/tests/combo/layer-filter-1/native_sim.keymap diff --git a/app/tests/combo/multiple-timeouts/native_posix_64.keymap b/app/tests/combo/multiple-timeouts/native_sim.keymap similarity index 100% rename from app/tests/combo/multiple-timeouts/native_posix_64.keymap rename to app/tests/combo/multiple-timeouts/native_sim.keymap diff --git a/app/tests/combo/overlapping-combos-0/native_posix_64.keymap b/app/tests/combo/overlapping-combos-0/native_sim.keymap similarity index 100% rename from app/tests/combo/overlapping-combos-0/native_posix_64.keymap rename to app/tests/combo/overlapping-combos-0/native_sim.keymap diff --git a/app/tests/combo/overlapping-combos-1/native_posix_64.keymap b/app/tests/combo/overlapping-combos-1/native_sim.keymap similarity index 100% rename from app/tests/combo/overlapping-combos-1/native_posix_64.keymap rename to app/tests/combo/overlapping-combos-1/native_sim.keymap diff --git a/app/tests/combo/overlapping-combos-2/native_posix_64.keymap b/app/tests/combo/overlapping-combos-2/native_sim.keymap similarity index 100% rename from app/tests/combo/overlapping-combos-2/native_posix_64.keymap rename to app/tests/combo/overlapping-combos-2/native_sim.keymap diff --git a/app/tests/combo/overlapping-combos-3/native_posix_64.keymap b/app/tests/combo/overlapping-combos-3/native_sim.keymap similarity index 100% rename from app/tests/combo/overlapping-combos-3/native_posix_64.keymap rename to app/tests/combo/overlapping-combos-3/native_sim.keymap diff --git a/app/tests/combo/overlapping-combos-4-different-timeouts/native_posix_64.keymap b/app/tests/combo/overlapping-combos-4-different-timeouts/native_sim.keymap similarity index 100% rename from app/tests/combo/overlapping-combos-4-different-timeouts/native_posix_64.keymap rename to app/tests/combo/overlapping-combos-4-different-timeouts/native_sim.keymap diff --git a/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap b/app/tests/combo/partially-overlapping-combos/native_sim.keymap similarity index 100% rename from app/tests/combo/partially-overlapping-combos/native_posix_64.keymap rename to app/tests/combo/partially-overlapping-combos/native_sim.keymap diff --git a/app/tests/combo/press-release-long-combo-complete/native_posix_64.keymap b/app/tests/combo/press-release-long-combo-complete/native_sim.keymap similarity index 100% rename from app/tests/combo/press-release-long-combo-complete/native_posix_64.keymap rename to app/tests/combo/press-release-long-combo-complete/native_sim.keymap diff --git a/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap b/app/tests/combo/press-release-long-combo-incomplete/native_sim.keymap similarity index 100% rename from app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap rename to app/tests/combo/press-release-long-combo-incomplete/native_sim.keymap diff --git a/app/tests/combo/press-release-long-combo-wrong-last-key/native_posix_64.keymap b/app/tests/combo/press-release-long-combo-wrong-last-key/native_sim.keymap similarity index 100% rename from app/tests/combo/press-release-long-combo-wrong-last-key/native_posix_64.keymap rename to app/tests/combo/press-release-long-combo-wrong-last-key/native_sim.keymap diff --git a/app/tests/combo/press-release/native_posix_64.keymap b/app/tests/combo/press-release/native_sim.keymap similarity index 100% rename from app/tests/combo/press-release/native_posix_64.keymap rename to app/tests/combo/press-release/native_sim.keymap diff --git a/app/tests/combo/press-timeout/native_posix_64.keymap b/app/tests/combo/press-timeout/native_sim.keymap similarity index 100% rename from app/tests/combo/press-timeout/native_posix_64.keymap rename to app/tests/combo/press-timeout/native_sim.keymap diff --git a/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap b/app/tests/combo/press1-press2-release1-release2/native_sim.keymap similarity index 100% rename from app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap rename to app/tests/combo/press1-press2-release1-release2/native_sim.keymap diff --git a/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap b/app/tests/combo/press1-press2-release2-release1/native_sim.keymap similarity index 100% rename from app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap rename to app/tests/combo/press1-press2-release2-release1/native_sim.keymap diff --git a/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap b/app/tests/combo/press1-release1-press2-release2/native_sim.keymap similarity index 100% rename from app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap rename to app/tests/combo/press1-release1-press2-release2/native_sim.keymap diff --git a/app/tests/combo/require-prior-idle/native_posix_64.keymap b/app/tests/combo/require-prior-idle/native_sim.keymap similarity index 100% rename from app/tests/combo/require-prior-idle/native_posix_64.keymap rename to app/tests/combo/require-prior-idle/native_sim.keymap diff --git a/app/tests/combo/slowrelease-disabled/native_posix_64.keymap b/app/tests/combo/slowrelease-disabled/native_sim.keymap similarity index 100% rename from app/tests/combo/slowrelease-disabled/native_posix_64.keymap rename to app/tests/combo/slowrelease-disabled/native_sim.keymap diff --git a/app/tests/combo/slowrelease-enabled/native_posix_64.keymap b/app/tests/combo/slowrelease-enabled/native_sim.keymap similarity index 100% rename from app/tests/combo/slowrelease-enabled/native_posix_64.keymap rename to app/tests/combo/slowrelease-enabled/native_sim.keymap diff --git a/app/tests/conditional-layer/chained-activation/native_posix_64.keymap b/app/tests/conditional-layer/chained-activation/native_sim.keymap similarity index 100% rename from app/tests/conditional-layer/chained-activation/native_posix_64.keymap rename to app/tests/conditional-layer/chained-activation/native_sim.keymap diff --git a/app/tests/conditional-layer/mo-overlap/native_posix_64.keymap b/app/tests/conditional-layer/mo-overlap/native_sim.keymap similarity index 100% rename from app/tests/conditional-layer/mo-overlap/native_posix_64.keymap rename to app/tests/conditional-layer/mo-overlap/native_sim.keymap diff --git a/app/tests/conditional-layer/multiple-configs/native_posix_64.keymap b/app/tests/conditional-layer/multiple-configs/native_sim.keymap similarity index 100% rename from app/tests/conditional-layer/multiple-configs/native_posix_64.keymap rename to app/tests/conditional-layer/multiple-configs/native_sim.keymap diff --git a/app/tests/conditional-layer/quad-layer/native_posix_64.keymap b/app/tests/conditional-layer/quad-layer/native_sim.keymap similarity index 100% rename from app/tests/conditional-layer/quad-layer/native_posix_64.keymap rename to app/tests/conditional-layer/quad-layer/native_sim.keymap diff --git a/app/tests/conditional-layer/same-layer-reached-both-ways/native_posix_64.keymap b/app/tests/conditional-layer/same-layer-reached-both-ways/native_sim.keymap similarity index 100% rename from app/tests/conditional-layer/same-layer-reached-both-ways/native_posix_64.keymap rename to app/tests/conditional-layer/same-layer-reached-both-ways/native_sim.keymap diff --git a/app/tests/conditional-layer/same-layer-reached-differently/native_posix_64.keymap b/app/tests/conditional-layer/same-layer-reached-differently/native_sim.keymap similarity index 100% rename from app/tests/conditional-layer/same-layer-reached-differently/native_posix_64.keymap rename to app/tests/conditional-layer/same-layer-reached-differently/native_sim.keymap diff --git a/app/tests/conditional-layer/tri-layer-alt-order/native_posix_64.keymap b/app/tests/conditional-layer/tri-layer-alt-order/native_sim.keymap similarity index 100% rename from app/tests/conditional-layer/tri-layer-alt-order/native_posix_64.keymap rename to app/tests/conditional-layer/tri-layer-alt-order/native_sim.keymap diff --git a/app/tests/conditional-layer/tri-layer-lt/native_posix_64.keymap b/app/tests/conditional-layer/tri-layer-lt/native_sim.keymap similarity index 100% rename from app/tests/conditional-layer/tri-layer-lt/native_posix_64.keymap rename to app/tests/conditional-layer/tri-layer-lt/native_sim.keymap diff --git a/app/tests/conditional-layer/tri-layer/native_posix_64.keymap b/app/tests/conditional-layer/tri-layer/native_sim.keymap similarity index 100% rename from app/tests/conditional-layer/tri-layer/native_posix_64.keymap rename to app/tests/conditional-layer/tri-layer/native_sim.keymap diff --git a/app/tests/encoders/layers-1/native_posix_64.keymap b/app/tests/encoders/layers-1/native_sim.keymap similarity index 100% rename from app/tests/encoders/layers-1/native_posix_64.keymap rename to app/tests/encoders/layers-1/native_sim.keymap diff --git a/app/tests/encoders/layers-2/native_posix_64.keymap b/app/tests/encoders/layers-2/native_sim.keymap similarity index 100% rename from app/tests/encoders/layers-2/native_posix_64.keymap rename to app/tests/encoders/layers-2/native_sim.keymap diff --git a/app/tests/encoders/rotate/native_posix_64.keymap b/app/tests/encoders/rotate/native_sim.keymap similarity index 100% rename from app/tests/encoders/rotate/native_posix_64.keymap rename to app/tests/encoders/rotate/native_sim.keymap diff --git a/app/tests/gresc/gresc-press-release/native_posix_64.keymap b/app/tests/gresc/gresc-press-release/native_sim.keymap similarity index 100% rename from app/tests/gresc/gresc-press-release/native_posix_64.keymap rename to app/tests/gresc/gresc-press-release/native_sim.keymap diff --git a/app/tests/gresc/gresc-two-instances/native_posix_64.keymap b/app/tests/gresc/gresc-two-instances/native_sim.keymap similarity index 100% rename from app/tests/gresc/gresc-two-instances/native_posix_64.keymap rename to app/tests/gresc/gresc-two-instances/native_sim.keymap diff --git a/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/1-dn-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap rename to app/tests/hold-tap/balanced/1-dn-up/native_sim.keymap diff --git a/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/2-dn-timer-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap rename to app/tests/hold-tap/balanced/2-dn-timer-up/native_sim.keymap diff --git a/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap rename to app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_sim.keymap diff --git a/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap rename to app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_sim.keymap diff --git a/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap rename to app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_sim.keymap diff --git a/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap rename to app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_sim.keymap diff --git a/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap rename to app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_sim.keymap diff --git a/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap rename to app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_sim.keymap diff --git a/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap rename to app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_sim.keymap diff --git a/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap rename to app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_sim.keymap diff --git a/app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap b/app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap rename to app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/native_sim.keymap diff --git a/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/balanced/5-quick-tap/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap rename to app/tests/hold-tap/balanced/5-quick-tap/native_sim.keymap diff --git a/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap b/app/tests/hold-tap/balanced/6-retro-tap/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap rename to app/tests/hold-tap/balanced/6-retro-tap/native_sim.keymap diff --git a/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap rename to app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_sim.keymap diff --git a/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap rename to app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_sim.keymap diff --git a/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap rename to app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_sim.keymap diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap rename to app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_sim.keymap diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap rename to app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_sim.keymap diff --git a/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap rename to app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_sim.keymap diff --git a/app/tests/hold-tap/balanced/8-require-prior-idle/1-basic/native_posix_64.keymap b/app/tests/hold-tap/balanced/8-require-prior-idle/1-basic/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/balanced/8-require-prior-idle/1-basic/native_posix_64.keymap rename to app/tests/hold-tap/balanced/8-require-prior-idle/1-basic/native_sim.keymap diff --git a/app/tests/hold-tap/balanced/8-require-prior-idle/2-double-hold/native_posix_64.keymap b/app/tests/hold-tap/balanced/8-require-prior-idle/2-double-hold/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/balanced/8-require-prior-idle/2-double-hold/native_posix_64.keymap rename to app/tests/hold-tap/balanced/8-require-prior-idle/2-double-hold/native_sim.keymap diff --git a/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap b/app/tests/hold-tap/balanced/many-nested/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap rename to app/tests/hold-tap/balanced/many-nested/native_sim.keymap diff --git a/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/1-dn-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap rename to app/tests/hold-tap/hold-preferred/1-dn-up/native_sim.keymap diff --git a/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap rename to app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_sim.keymap diff --git a/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap rename to app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_sim.keymap diff --git a/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap rename to app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_sim.keymap diff --git a/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap rename to app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_sim.keymap diff --git a/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap rename to app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_sim.keymap diff --git a/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap rename to app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_sim.keymap diff --git a/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap rename to app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_sim.keymap diff --git a/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap rename to app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_sim.keymap diff --git a/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap rename to app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_sim.keymap diff --git a/app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap rename to app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/native_sim.keymap diff --git a/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/5-quick-tap/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap rename to app/tests/hold-tap/hold-preferred/5-quick-tap/native_sim.keymap diff --git a/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/6-retro-tap/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap rename to app/tests/hold-tap/hold-preferred/6-retro-tap/native_sim.keymap diff --git a/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap rename to app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_sim.keymap diff --git a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap rename to app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_sim.keymap diff --git a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap rename to app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_sim.keymap diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap rename to app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_sim.keymap diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap rename to app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_sim.keymap diff --git a/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap rename to app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_sim.keymap diff --git a/app/tests/hold-tap/hold-preferred/8-require-prior-idle/1-basic/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/8-require-prior-idle/1-basic/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/8-require-prior-idle/1-basic/native_posix_64.keymap rename to app/tests/hold-tap/hold-preferred/8-require-prior-idle/1-basic/native_sim.keymap diff --git a/app/tests/hold-tap/hold-preferred/8-require-prior-idle/2-double-hold/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/8-require-prior-idle/2-double-hold/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/8-require-prior-idle/2-double-hold/native_posix_64.keymap rename to app/tests/hold-tap/hold-preferred/8-require-prior-idle/2-double-hold/native_sim.keymap diff --git a/app/tests/hold-tap/hold-while-undecided/1-tap/native_posix_64.keymap b/app/tests/hold-tap/hold-while-undecided/1-tap/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/hold-while-undecided/1-tap/native_posix_64.keymap rename to app/tests/hold-tap/hold-while-undecided/1-tap/native_sim.keymap diff --git a/app/tests/hold-tap/hold-while-undecided/2-hold/native_posix_64.keymap b/app/tests/hold-tap/hold-while-undecided/2-hold/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/hold-while-undecided/2-hold/native_posix_64.keymap rename to app/tests/hold-tap/hold-while-undecided/2-hold/native_sim.keymap diff --git a/app/tests/hold-tap/hold-while-undecided/3-linger/native_posix_64.keymap b/app/tests/hold-tap/hold-while-undecided/3-linger/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/hold-while-undecided/3-linger/native_posix_64.keymap rename to app/tests/hold-tap/hold-while-undecided/3-linger/native_sim.keymap diff --git a/app/tests/hold-tap/hold-while-undecided/4-linger-sk/native_posix_64.keymap b/app/tests/hold-tap/hold-while-undecided/4-linger-sk/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/hold-while-undecided/4-linger-sk/native_posix_64.keymap rename to app/tests/hold-tap/hold-while-undecided/4-linger-sk/native_sim.keymap diff --git a/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/1-dn-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap rename to app/tests/hold-tap/tap-preferred/1-dn-up/native_sim.keymap diff --git a/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap rename to app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_sim.keymap diff --git a/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap rename to app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_sim.keymap diff --git a/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap rename to app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_sim.keymap diff --git a/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap rename to app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_sim.keymap diff --git a/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap rename to app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_sim.keymap diff --git a/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap rename to app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_sim.keymap diff --git a/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap rename to app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_sim.keymap diff --git a/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap rename to app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_sim.keymap diff --git a/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap rename to app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_sim.keymap diff --git a/app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap rename to app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/native_sim.keymap diff --git a/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/5-quick-tap/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap rename to app/tests/hold-tap/tap-preferred/5-quick-tap/native_sim.keymap diff --git a/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap rename to app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_sim.keymap diff --git a/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap rename to app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_sim.keymap diff --git a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap rename to app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_sim.keymap diff --git a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap rename to app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_sim.keymap diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap rename to app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_sim.keymap diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap rename to app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_sim.keymap diff --git a/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap rename to app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_sim.keymap diff --git a/app/tests/hold-tap/tap-preferred/8-require-prior-idle/1-basic/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/8-require-prior-idle/1-basic/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/8-require-prior-idle/1-basic/native_posix_64.keymap rename to app/tests/hold-tap/tap-preferred/8-require-prior-idle/1-basic/native_sim.keymap diff --git a/app/tests/hold-tap/tap-preferred/8-require-prior-idle/2-double-hold/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/8-require-prior-idle/2-double-hold/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/8-require-prior-idle/2-double-hold/native_posix_64.keymap rename to app/tests/hold-tap/tap-preferred/8-require-prior-idle/2-double-hold/native_sim.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap rename to app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_sim.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap rename to app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_sim.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap rename to app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_sim.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap rename to app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_sim.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap rename to app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_sim.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap rename to app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_sim.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap rename to app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_sim.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap rename to app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_sim.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap rename to app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_sim.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap rename to app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_sim.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap rename to app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/native_sim.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap rename to app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_sim.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/1-basic/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/1-basic/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/1-basic/native_posix_64.keymap rename to app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/1-basic/native_sim.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/2-double-hold/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/2-double-hold/native_sim.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/2-double-hold/native_posix_64.keymap rename to app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/2-double-hold/native_sim.keymap diff --git a/app/tests/key-repeat/ignore-other-usage-page-events/native_posix_64.keymap b/app/tests/key-repeat/ignore-other-usage-page-events/native_sim.keymap similarity index 100% rename from app/tests/key-repeat/ignore-other-usage-page-events/native_posix_64.keymap rename to app/tests/key-repeat/ignore-other-usage-page-events/native_sim.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 deleted file mode 100644 index 9078f304d58..00000000000 --- a/app/tests/key-repeat/press-and-release-after-key-usage/native_posix.keymap +++ /dev/null @@ -1,13 +0,0 @@ -#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_posix_64.keymap b/app/tests/key-repeat/press-and-release-after-key-usage/native_sim.keymap similarity index 100% rename from app/tests/key-repeat/press-and-release-after-key-usage/native_posix_64.keymap rename to app/tests/key-repeat/press-and-release-after-key-usage/native_sim.keymap diff --git a/app/tests/key-repeat/press-and-release-with-explicit-modifiers/native_posix_64.keymap b/app/tests/key-repeat/press-and-release-with-explicit-modifiers/native_sim.keymap similarity index 100% rename from app/tests/key-repeat/press-and-release-with-explicit-modifiers/native_posix_64.keymap rename to app/tests/key-repeat/press-and-release-with-explicit-modifiers/native_sim.keymap diff --git a/app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet/native_posix_64.keymap b/app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet/native_sim.keymap similarity index 100% rename from app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet/native_posix_64.keymap rename to app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet/native_sim.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 deleted file mode 100644 index bb129d14c7a..00000000000 --- a/app/tests/key-repeat/tap-when-rolling/native_posix.keymap +++ /dev/null @@ -1,13 +0,0 @@ -#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_posix_64.keymap b/app/tests/key-repeat/tap-when-rolling/native_sim.keymap similarity index 100% rename from app/tests/key-repeat/tap-when-rolling/native_posix_64.keymap rename to app/tests/key-repeat/tap-when-rolling/native_sim.keymap diff --git a/app/tests/keypress/kp-press-release/native_posix_64.keymap b/app/tests/keypress/kp-press-release/native_sim.keymap similarity index 100% rename from app/tests/keypress/kp-press-release/native_posix_64.keymap rename to app/tests/keypress/kp-press-release/native_sim.keymap diff --git a/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap b/app/tests/keytoggle/kt-alt-tab/native_sim.keymap similarity index 100% rename from app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap rename to app/tests/keytoggle/kt-alt-tab/native_sim.keymap diff --git a/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap b/app/tests/keytoggle/kt-modded-alpha/native_sim.keymap similarity index 100% rename from app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap rename to app/tests/keytoggle/kt-modded-alpha/native_sim.keymap diff --git a/app/tests/keytoggle/kt-off/native_posix_64.keymap b/app/tests/keytoggle/kt-off/native_sim.keymap similarity index 100% rename from app/tests/keytoggle/kt-off/native_posix_64.keymap rename to app/tests/keytoggle/kt-off/native_sim.keymap diff --git a/app/tests/keytoggle/kt-on/native_posix_64.keymap b/app/tests/keytoggle/kt-on/native_sim.keymap similarity index 100% rename from app/tests/keytoggle/kt-on/native_posix_64.keymap rename to app/tests/keytoggle/kt-on/native_sim.keymap diff --git a/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.conf b/app/tests/keytoggle/kt-press-release-nkro/native_sim.conf similarity index 100% rename from app/tests/keytoggle/kt-press-release-nkro/native_posix_64.conf rename to app/tests/keytoggle/kt-press-release-nkro/native_sim.conf diff --git a/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap b/app/tests/keytoggle/kt-press-release-nkro/native_sim.keymap similarity index 100% rename from app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap rename to app/tests/keytoggle/kt-press-release-nkro/native_sim.keymap diff --git a/app/tests/keytoggle/kt-press-release/native_posix_64.keymap b/app/tests/keytoggle/kt-press-release/native_sim.keymap similarity index 100% rename from app/tests/keytoggle/kt-press-release/native_posix_64.keymap rename to app/tests/keytoggle/kt-press-release/native_sim.keymap diff --git a/app/tests/macros/basic/native_posix_64.keymap b/app/tests/macros/basic/native_sim.keymap similarity index 100% rename from app/tests/macros/basic/native_posix_64.keymap rename to app/tests/macros/basic/native_sim.keymap diff --git a/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap b/app/tests/macros/mo-plus-modifier-from-hold-tap/native_sim.keymap similarity index 100% rename from app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap rename to app/tests/macros/mo-plus-modifier-from-hold-tap/native_sim.keymap diff --git a/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap b/app/tests/macros/mo-plus-modifier-macro/native_sim.keymap similarity index 100% rename from app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap rename to app/tests/macros/mo-plus-modifier-macro/native_sim.keymap diff --git a/app/tests/macros/place-holder-parameters/native_posix_64.keymap b/app/tests/macros/place-holder-parameters/native_sim.keymap similarity index 100% rename from app/tests/macros/place-holder-parameters/native_posix_64.keymap rename to app/tests/macros/place-holder-parameters/native_sim.keymap diff --git a/app/tests/macros/press-mid-macro/native_posix_64.keymap b/app/tests/macros/press-mid-macro/native_sim.keymap similarity index 100% rename from app/tests/macros/press-mid-macro/native_posix_64.keymap rename to app/tests/macros/press-mid-macro/native_sim.keymap diff --git a/app/tests/macros/press-release/native_posix_64.keymap b/app/tests/macros/press-release/native_sim.keymap similarity index 100% rename from app/tests/macros/press-release/native_posix_64.keymap rename to app/tests/macros/press-release/native_sim.keymap diff --git a/app/tests/macros/timing-override/native_posix_64.keymap b/app/tests/macros/timing-override/native_sim.keymap similarity index 100% rename from app/tests/macros/timing-override/native_posix_64.keymap rename to app/tests/macros/timing-override/native_sim.keymap diff --git a/app/tests/macros/wait-macro-release/native_posix_64.keymap b/app/tests/macros/wait-macro-release/native_sim.keymap similarity index 100% rename from app/tests/macros/wait-macro-release/native_posix_64.keymap rename to app/tests/macros/wait-macro-release/native_sim.keymap diff --git a/app/tests/matrix-input/kp-press-release/events.patterns b/app/tests/matrix-input/kp-press-release/events.patterns new file mode 100644 index 00000000000..833100f6ac4 --- /dev/null +++ b/app/tests/matrix-input/kp-press-release/events.patterns @@ -0,0 +1 @@ +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 new file mode 100644 index 00000000000..259501ba3d9 --- /dev/null +++ b/app/tests/matrix-input/kp-press-release/keycode_events.snapshot @@ -0,0 +1,2 @@ +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 new file mode 100644 index 00000000000..9ce5b96b3d0 --- /dev/null +++ b/app/tests/matrix-input/kp-press-release/native_sim.conf @@ -0,0 +1 @@ +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 new file mode 100644 index 00000000000..14e82d13f42 --- /dev/null +++ b/app/tests/matrix-input/kp-press-release/native_sim.keymap @@ -0,0 +1,60 @@ +#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_posix_64.keymap b/app/tests/mod-morph/1-no-morph/native_sim.keymap similarity index 100% rename from app/tests/mod-morph/1-no-morph/native_posix_64.keymap rename to app/tests/mod-morph/1-no-morph/native_sim.keymap diff --git a/app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap b/app/tests/mod-morph/2a-masked-morph/native_sim.keymap similarity index 100% rename from app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap rename to app/tests/mod-morph/2a-masked-morph/native_sim.keymap diff --git a/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_sim.keymap similarity index 100% rename from app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap rename to app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_sim.keymap diff --git a/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap b/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_sim.keymap similarity index 100% rename from app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap rename to app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_sim.keymap diff --git a/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_sim.keymap similarity index 100% rename from app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap rename to app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_sim.keymap diff --git a/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_sim.keymap similarity index 100% rename from app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap rename to app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_sim.keymap diff --git a/app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap b/app/tests/mod-morph/3-unmasked-morph/native_sim.keymap similarity index 100% rename from app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap rename to app/tests/mod-morph/3-unmasked-morph/native_sim.keymap diff --git a/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_sim.keymap similarity index 100% rename from app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap rename to app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_sim.keymap diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_sim.keymap similarity index 100% rename from app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap rename to app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_sim.keymap diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_sim.keymap similarity index 100% rename from app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap rename to app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_sim.keymap diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_sim.keymap similarity index 100% rename from app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap rename to app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_sim.keymap diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_sim.keymap similarity index 100% rename from app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap rename to app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_sim.keymap diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_sim.keymap similarity index 100% rename from app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap rename to app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_sim.keymap diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_sim.keymap similarity index 100% rename from app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap rename to app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_sim.keymap diff --git a/app/tests/modifiers/implicit/kp-rolling-symbols-same-key/native_posix_64.keymap b/app/tests/modifiers/implicit/kp-rolling-symbols-same-key/native_sim.keymap similarity index 100% rename from app/tests/modifiers/implicit/kp-rolling-symbols-same-key/native_posix_64.keymap rename to app/tests/modifiers/implicit/kp-rolling-symbols-same-key/native_sim.keymap diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_sim.keymap similarity index 100% rename from app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap rename to app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_sim.keymap diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_sim.keymap similarity index 100% rename from app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap rename to app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_sim.keymap diff --git a/app/tests/momentary-layer/1-normal/native_posix_64.keymap b/app/tests/momentary-layer/1-normal/native_sim.keymap similarity index 100% rename from app/tests/momentary-layer/1-normal/native_posix_64.keymap rename to app/tests/momentary-layer/1-normal/native_sim.keymap diff --git a/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap b/app/tests/momentary-layer/2-early-key-release/native_sim.keymap similarity index 100% rename from app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap rename to app/tests/momentary-layer/2-early-key-release/native_sim.keymap diff --git a/app/tests/momentary-layer/3-covered/native_posix_64.keymap b/app/tests/momentary-layer/3-covered/native_sim.keymap similarity index 100% rename from app/tests/momentary-layer/3-covered/native_posix_64.keymap rename to app/tests/momentary-layer/3-covered/native_sim.keymap diff --git a/app/tests/momentary-layer/4-nested/native_posix_64.keymap b/app/tests/momentary-layer/4-nested/native_sim.keymap similarity index 100% rename from app/tests/momentary-layer/4-nested/native_posix_64.keymap rename to app/tests/momentary-layer/4-nested/native_sim.keymap diff --git a/app/tests/momentary-layer/5-nested-early-key-release/native_posix_64.keymap b/app/tests/momentary-layer/5-nested-early-key-release/native_sim.keymap similarity index 100% rename from app/tests/momentary-layer/5-nested-early-key-release/native_posix_64.keymap rename to app/tests/momentary-layer/5-nested-early-key-release/native_sim.keymap diff --git a/app/tests/none/layered/native_posix_64.keymap b/app/tests/none/layered/native_sim.keymap similarity index 100% rename from app/tests/none/layered/native_posix_64.keymap rename to app/tests/none/layered/native_sim.keymap diff --git a/app/tests/none/normal/native_posix.keymap b/app/tests/none/normal/native_sim.keymap similarity index 100% rename from app/tests/none/normal/native_posix.keymap rename to app/tests/none/normal/native_sim.keymap diff --git a/app/tests/pointing/mkp/native_posix_64.keymap b/app/tests/pointing/mkp/native_posix_64.keymap deleted file mode 100644 index cec0b6e1b1b..00000000000 --- a/app/tests/pointing/mkp/native_posix_64.keymap +++ /dev/null @@ -1,27 +0,0 @@ -#include -#include -#include -#include - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &mkp LCLK &none - &none &mkp RCLK - >; - }; - }; -}; - - -&kscan { - events = < - ZMK_MOCK_PRESS (0,0,100) - ZMK_MOCK_PRESS (1,1,100) - ZMK_MOCK_RELEASE(1,1, 10) - ZMK_MOCK_RELEASE(0,0, 10) - >; -}; diff --git a/app/tests/pointing/mkp/native_posix_64.conf b/app/tests/pointing/mkp/native_sim.conf similarity index 100% rename from app/tests/pointing/mkp/native_posix_64.conf rename to app/tests/pointing/mkp/native_sim.conf diff --git a/app/tests/pointing/mkp/native_posix.keymap b/app/tests/pointing/mkp/native_sim.keymap similarity index 100% rename from app/tests/pointing/mkp/native_posix.keymap rename to app/tests/pointing/mkp/native_sim.keymap diff --git a/app/tests/pointing/mouse-move/move_diagonal/native_posix_64.conf b/app/tests/pointing/mouse-move/move_diagonal/native_sim.conf similarity index 100% rename from app/tests/pointing/mouse-move/move_diagonal/native_posix_64.conf rename to app/tests/pointing/mouse-move/move_diagonal/native_sim.conf diff --git a/app/tests/pointing/mouse-move/move_diagonal/native_posix_64.keymap b/app/tests/pointing/mouse-move/move_diagonal/native_sim.keymap similarity index 100% rename from app/tests/pointing/mouse-move/move_diagonal/native_posix_64.keymap rename to app/tests/pointing/mouse-move/move_diagonal/native_sim.keymap diff --git a/app/tests/pointing/mouse-move/move_x/native_posix_64.conf b/app/tests/pointing/mouse-move/move_x/native_sim.conf similarity index 100% rename from app/tests/pointing/mouse-move/move_x/native_posix_64.conf rename to app/tests/pointing/mouse-move/move_x/native_sim.conf diff --git a/app/tests/pointing/mouse-move/move_x/native_posix_64.keymap b/app/tests/pointing/mouse-move/move_x/native_sim.keymap similarity index 100% rename from app/tests/pointing/mouse-move/move_x/native_posix_64.keymap rename to app/tests/pointing/mouse-move/move_x/native_sim.keymap diff --git a/app/tests/pointing/mouse-move/move_y/native_posix_64.conf b/app/tests/pointing/mouse-move/move_y/native_sim.conf similarity index 100% rename from app/tests/pointing/mouse-move/move_y/native_posix_64.conf rename to app/tests/pointing/mouse-move/move_y/native_sim.conf diff --git a/app/tests/pointing/mouse-move/move_y/native_posix_64.keymap b/app/tests/pointing/mouse-move/move_y/native_sim.keymap similarity index 100% rename from app/tests/pointing/mouse-move/move_y/native_posix_64.keymap rename to app/tests/pointing/mouse-move/move_y/native_sim.keymap diff --git a/app/tests/pointing/mouse-move/processors/behaviors_basic/native_posix_64.conf b/app/tests/pointing/mouse-move/processors/behaviors_basic/native_sim.conf similarity index 100% rename from app/tests/pointing/mouse-move/processors/behaviors_basic/native_posix_64.conf rename to app/tests/pointing/mouse-move/processors/behaviors_basic/native_sim.conf diff --git a/app/tests/pointing/mouse-move/processors/behaviors_basic/native_posix_64.keymap b/app/tests/pointing/mouse-move/processors/behaviors_basic/native_sim.keymap similarity index 100% rename from app/tests/pointing/mouse-move/processors/behaviors_basic/native_posix_64.keymap rename to app/tests/pointing/mouse-move/processors/behaviors_basic/native_sim.keymap diff --git a/app/tests/pointing/mouse-move/processors/behaviors_hold_tap/native_posix_64.conf b/app/tests/pointing/mouse-move/processors/behaviors_hold_tap/native_sim.conf similarity index 100% rename from app/tests/pointing/mouse-move/processors/behaviors_hold_tap/native_posix_64.conf rename to app/tests/pointing/mouse-move/processors/behaviors_hold_tap/native_sim.conf diff --git a/app/tests/pointing/mouse-move/processors/behaviors_hold_tap/native_posix_64.keymap b/app/tests/pointing/mouse-move/processors/behaviors_hold_tap/native_sim.keymap similarity index 100% rename from app/tests/pointing/mouse-move/processors/behaviors_hold_tap/native_posix_64.keymap rename to app/tests/pointing/mouse-move/processors/behaviors_hold_tap/native_sim.keymap diff --git a/app/tests/pointing/mouse-move/processors/move_diagonal_scaling/native_posix_64.conf b/app/tests/pointing/mouse-move/processors/move_diagonal_scaling/native_sim.conf similarity index 100% rename from app/tests/pointing/mouse-move/processors/move_diagonal_scaling/native_posix_64.conf rename to app/tests/pointing/mouse-move/processors/move_diagonal_scaling/native_sim.conf diff --git a/app/tests/pointing/mouse-move/processors/move_diagonal_scaling/native_posix_64.keymap b/app/tests/pointing/mouse-move/processors/move_diagonal_scaling/native_sim.keymap similarity index 100% rename from app/tests/pointing/mouse-move/processors/move_diagonal_scaling/native_posix_64.keymap rename to app/tests/pointing/mouse-move/processors/move_diagonal_scaling/native_sim.keymap diff --git a/app/tests/pointing/mouse-move/processors/move_diagonal_xy_invert/native_posix_64.conf b/app/tests/pointing/mouse-move/processors/move_diagonal_xy_invert/native_sim.conf similarity index 100% rename from app/tests/pointing/mouse-move/processors/move_diagonal_xy_invert/native_posix_64.conf rename to app/tests/pointing/mouse-move/processors/move_diagonal_xy_invert/native_sim.conf diff --git a/app/tests/pointing/mouse-move/processors/move_diagonal_xy_invert/native_posix_64.keymap b/app/tests/pointing/mouse-move/processors/move_diagonal_xy_invert/native_sim.keymap similarity index 100% rename from app/tests/pointing/mouse-move/processors/move_diagonal_xy_invert/native_posix_64.keymap rename to app/tests/pointing/mouse-move/processors/move_diagonal_xy_invert/native_sim.keymap diff --git a/app/tests/pointing/mouse-move/processors/move_diagonal_xy_swap/native_posix_64.conf b/app/tests/pointing/mouse-move/processors/move_diagonal_xy_swap/native_sim.conf similarity index 100% rename from app/tests/pointing/mouse-move/processors/move_diagonal_xy_swap/native_posix_64.conf rename to app/tests/pointing/mouse-move/processors/move_diagonal_xy_swap/native_sim.conf diff --git a/app/tests/pointing/mouse-move/processors/move_diagonal_xy_swap/native_posix_64.keymap b/app/tests/pointing/mouse-move/processors/move_diagonal_xy_swap/native_sim.keymap similarity index 100% rename from app/tests/pointing/mouse-move/processors/move_diagonal_xy_swap/native_posix_64.keymap rename to app/tests/pointing/mouse-move/processors/move_diagonal_xy_swap/native_sim.keymap diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/1-deactivate-layer-timeout/native_posix_64.conf b/app/tests/pointing/mouse-move/processors/temp_layer/1-deactivate-layer-timeout/native_sim.conf similarity index 100% rename from app/tests/pointing/mouse-move/processors/temp_layer/1-deactivate-layer-timeout/native_posix_64.conf rename to app/tests/pointing/mouse-move/processors/temp_layer/1-deactivate-layer-timeout/native_sim.conf diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/1-deactivate-layer-timeout/native_posix_64.keymap b/app/tests/pointing/mouse-move/processors/temp_layer/1-deactivate-layer-timeout/native_sim.keymap similarity index 100% rename from app/tests/pointing/mouse-move/processors/temp_layer/1-deactivate-layer-timeout/native_posix_64.keymap rename to app/tests/pointing/mouse-move/processors/temp_layer/1-deactivate-layer-timeout/native_sim.keymap diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/2a-deactivate-layer-position-trigger/native_posix_64.conf b/app/tests/pointing/mouse-move/processors/temp_layer/2a-deactivate-layer-position-trigger/native_sim.conf similarity index 100% rename from app/tests/pointing/mouse-move/processors/temp_layer/2a-deactivate-layer-position-trigger/native_posix_64.conf rename to app/tests/pointing/mouse-move/processors/temp_layer/2a-deactivate-layer-position-trigger/native_sim.conf diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/2a-deactivate-layer-position-trigger/native_posix_64.keymap b/app/tests/pointing/mouse-move/processors/temp_layer/2a-deactivate-layer-position-trigger/native_sim.keymap similarity index 100% rename from app/tests/pointing/mouse-move/processors/temp_layer/2a-deactivate-layer-position-trigger/native_posix_64.keymap rename to app/tests/pointing/mouse-move/processors/temp_layer/2a-deactivate-layer-position-trigger/native_sim.keymap diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/2b-deactivate-layer-position-not-trigger/native_posix_64.conf b/app/tests/pointing/mouse-move/processors/temp_layer/2b-deactivate-layer-position-not-trigger/native_sim.conf similarity index 100% rename from app/tests/pointing/mouse-move/processors/temp_layer/2b-deactivate-layer-position-not-trigger/native_posix_64.conf rename to app/tests/pointing/mouse-move/processors/temp_layer/2b-deactivate-layer-position-not-trigger/native_sim.conf diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/2b-deactivate-layer-position-not-trigger/native_posix_64.keymap b/app/tests/pointing/mouse-move/processors/temp_layer/2b-deactivate-layer-position-not-trigger/native_sim.keymap similarity index 100% rename from app/tests/pointing/mouse-move/processors/temp_layer/2b-deactivate-layer-position-not-trigger/native_posix_64.keymap rename to app/tests/pointing/mouse-move/processors/temp_layer/2b-deactivate-layer-position-not-trigger/native_sim.keymap diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/3-require-prior-idle-ms/native_posix_64.conf b/app/tests/pointing/mouse-move/processors/temp_layer/3-require-prior-idle-ms/native_sim.conf similarity index 100% rename from app/tests/pointing/mouse-move/processors/temp_layer/3-require-prior-idle-ms/native_posix_64.conf rename to app/tests/pointing/mouse-move/processors/temp_layer/3-require-prior-idle-ms/native_sim.conf diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/3-require-prior-idle-ms/native_posix_64.keymap b/app/tests/pointing/mouse-move/processors/temp_layer/3-require-prior-idle-ms/native_sim.keymap similarity index 100% rename from app/tests/pointing/mouse-move/processors/temp_layer/3-require-prior-idle-ms/native_posix_64.keymap rename to app/tests/pointing/mouse-move/processors/temp_layer/3-require-prior-idle-ms/native_sim.keymap diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/4-deactivated-layer-externally/native_posix_64.conf b/app/tests/pointing/mouse-move/processors/temp_layer/4-deactivated-layer-externally/native_sim.conf similarity index 100% rename from app/tests/pointing/mouse-move/processors/temp_layer/4-deactivated-layer-externally/native_posix_64.conf rename to app/tests/pointing/mouse-move/processors/temp_layer/4-deactivated-layer-externally/native_sim.conf diff --git a/app/tests/pointing/mouse-move/processors/temp_layer/4-deactivated-layer-externally/native_posix_64.keymap b/app/tests/pointing/mouse-move/processors/temp_layer/4-deactivated-layer-externally/native_sim.keymap similarity index 100% rename from app/tests/pointing/mouse-move/processors/temp_layer/4-deactivated-layer-externally/native_posix_64.keymap rename to app/tests/pointing/mouse-move/processors/temp_layer/4-deactivated-layer-externally/native_sim.keymap diff --git a/app/tests/pointing/mouse-scroll/move_diagonal/native_posix_64.conf b/app/tests/pointing/mouse-scroll/move_diagonal/native_sim.conf similarity index 100% rename from app/tests/pointing/mouse-scroll/move_diagonal/native_posix_64.conf rename to app/tests/pointing/mouse-scroll/move_diagonal/native_sim.conf diff --git a/app/tests/pointing/mouse-scroll/move_diagonal/native_posix_64.keymap b/app/tests/pointing/mouse-scroll/move_diagonal/native_sim.keymap similarity index 100% rename from app/tests/pointing/mouse-scroll/move_diagonal/native_posix_64.keymap rename to app/tests/pointing/mouse-scroll/move_diagonal/native_sim.keymap diff --git a/app/tests/pointing/mouse-scroll/move_hwheel/native_posix_64.conf b/app/tests/pointing/mouse-scroll/move_hwheel/native_sim.conf similarity index 100% rename from app/tests/pointing/mouse-scroll/move_hwheel/native_posix_64.conf rename to app/tests/pointing/mouse-scroll/move_hwheel/native_sim.conf diff --git a/app/tests/pointing/mouse-scroll/move_hwheel/native_posix_64.keymap b/app/tests/pointing/mouse-scroll/move_hwheel/native_sim.keymap similarity index 100% rename from app/tests/pointing/mouse-scroll/move_hwheel/native_posix_64.keymap rename to app/tests/pointing/mouse-scroll/move_hwheel/native_sim.keymap diff --git a/app/tests/pointing/mouse-scroll/move_wheel/native_posix_64.conf b/app/tests/pointing/mouse-scroll/move_wheel/native_sim.conf similarity index 100% rename from app/tests/pointing/mouse-scroll/move_wheel/native_posix_64.conf rename to app/tests/pointing/mouse-scroll/move_wheel/native_sim.conf diff --git a/app/tests/pointing/mouse-scroll/move_wheel/native_posix_64.keymap b/app/tests/pointing/mouse-scroll/move_wheel/native_sim.keymap similarity index 100% rename from app/tests/pointing/mouse-scroll/move_wheel/native_posix_64.keymap rename to app/tests/pointing/mouse-scroll/move_wheel/native_sim.keymap diff --git a/app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/native_posix_64.conf b/app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/native_sim.conf similarity index 100% rename from app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/native_posix_64.conf rename to app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/native_sim.conf diff --git a/app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/native_posix_64.keymap b/app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/native_sim.keymap similarity index 100% rename from app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/native_posix_64.keymap rename to app/tests/pointing/mouse-scroll/processors/move_diagonal_scaling/native_sim.keymap diff --git a/app/tests/pointing/mouse-scroll/processors/move_diagonal_xy_invert/native_posix_64.conf b/app/tests/pointing/mouse-scroll/processors/move_diagonal_xy_invert/native_sim.conf similarity index 100% rename from app/tests/pointing/mouse-scroll/processors/move_diagonal_xy_invert/native_posix_64.conf rename to app/tests/pointing/mouse-scroll/processors/move_diagonal_xy_invert/native_sim.conf diff --git a/app/tests/pointing/mouse-scroll/processors/move_diagonal_xy_invert/native_posix_64.keymap b/app/tests/pointing/mouse-scroll/processors/move_diagonal_xy_invert/native_sim.keymap similarity index 100% rename from app/tests/pointing/mouse-scroll/processors/move_diagonal_xy_invert/native_posix_64.keymap rename to app/tests/pointing/mouse-scroll/processors/move_diagonal_xy_invert/native_sim.keymap diff --git a/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap b/app/tests/sticky-keys/1-os-dn-up/native_sim.keymap similarity index 100% rename from app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap rename to app/tests/sticky-keys/1-os-dn-up/native_sim.keymap diff --git a/app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap b/app/tests/sticky-keys/10-callum-mods-quick-release/native_sim.keymap similarity index 100% rename from app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap rename to app/tests/sticky-keys/10-callum-mods-quick-release/native_sim.keymap diff --git a/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap b/app/tests/sticky-keys/10-callum-mods/native_sim.keymap similarity index 100% rename from app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap rename to app/tests/sticky-keys/10-callum-mods/native_sim.keymap diff --git a/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap b/app/tests/sticky-keys/10-sl-sl-kp/native_sim.keymap similarity index 100% rename from app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap rename to app/tests/sticky-keys/10-sl-sl-kp/native_sim.keymap diff --git a/app/tests/sticky-keys/11-lazy-timeout-during/native_posix_64.keymap b/app/tests/sticky-keys/11-lazy-timeout-during/native_sim.keymap similarity index 100% rename from app/tests/sticky-keys/11-lazy-timeout-during/native_posix_64.keymap rename to app/tests/sticky-keys/11-lazy-timeout-during/native_sim.keymap diff --git a/app/tests/sticky-keys/11-lazy-timeout/native_posix_64.keymap b/app/tests/sticky-keys/11-lazy-timeout/native_sim.keymap similarity index 100% rename from app/tests/sticky-keys/11-lazy-timeout/native_posix_64.keymap rename to app/tests/sticky-keys/11-lazy-timeout/native_sim.keymap diff --git a/app/tests/sticky-keys/11-lazy/native_posix_64.keymap b/app/tests/sticky-keys/11-lazy/native_sim.keymap similarity index 100% rename from app/tests/sticky-keys/11-lazy/native_posix_64.keymap rename to app/tests/sticky-keys/11-lazy/native_sim.keymap diff --git a/app/tests/sticky-keys/12-macro/native_posix_64.keymap b/app/tests/sticky-keys/12-macro/native_sim.keymap similarity index 100% rename from app/tests/sticky-keys/12-macro/native_posix_64.keymap rename to app/tests/sticky-keys/12-macro/native_sim.keymap diff --git a/app/tests/sticky-keys/12-same-position-mods/native_posix_64.keymap b/app/tests/sticky-keys/12-same-position-mods/native_sim.keymap similarity index 100% rename from app/tests/sticky-keys/12-same-position-mods/native_posix_64.keymap rename to app/tests/sticky-keys/12-same-position-mods/native_sim.keymap diff --git a/app/tests/sticky-keys/12-same-position-sk-sl/native_posix_64.keymap b/app/tests/sticky-keys/12-same-position-sk-sl/native_sim.keymap similarity index 100% rename from app/tests/sticky-keys/12-same-position-sk-sl/native_posix_64.keymap rename to app/tests/sticky-keys/12-same-position-sk-sl/native_sim.keymap diff --git a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_sim.keymap similarity index 100% rename from app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap rename to app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_sim.keymap diff --git a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_sim.keymap similarity index 100% rename from app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap rename to app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_sim.keymap diff --git a/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap b/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_sim.keymap similarity index 100% rename from app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap rename to app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_sim.keymap diff --git a/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_sim.keymap similarity index 100% rename from app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap rename to app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_sim.keymap diff --git a/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap b/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_sim.keymap similarity index 100% rename from app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap rename to app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_sim.keymap diff --git a/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap b/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_sim.keymap similarity index 100% rename from app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap rename to app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_sim.keymap diff --git a/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_sim.keymap similarity index 100% rename from app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap rename to app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_sim.keymap diff --git a/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap b/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_sim.keymap similarity index 100% rename from app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap rename to app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_sim.keymap diff --git a/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_sim.keymap similarity index 100% rename from app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap rename to app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_sim.keymap diff --git a/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap b/app/tests/sticky-keys/8-lsk-osk-combination/native_sim.keymap similarity index 100% rename from app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap rename to app/tests/sticky-keys/8-lsk-osk-combination/native_sim.keymap diff --git a/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap b/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_sim.keymap similarity index 100% rename from app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap rename to app/tests/sticky-keys/9-sk-dn-up-dn-up/native_sim.keymap diff --git a/app/tests/tap-dance/1a-tap1/native_posix_64.keymap b/app/tests/tap-dance/1a-tap1/native_sim.keymap similarity index 100% rename from app/tests/tap-dance/1a-tap1/native_posix_64.keymap rename to app/tests/tap-dance/1a-tap1/native_sim.keymap diff --git a/app/tests/tap-dance/1b-tap2/native_posix_64.keymap b/app/tests/tap-dance/1b-tap2/native_sim.keymap similarity index 100% rename from app/tests/tap-dance/1b-tap2/native_posix_64.keymap rename to app/tests/tap-dance/1b-tap2/native_sim.keymap diff --git a/app/tests/tap-dance/1c-tap3/native_posix_64.keymap b/app/tests/tap-dance/1c-tap3/native_sim.keymap similarity index 100% rename from app/tests/tap-dance/1c-tap3/native_posix_64.keymap rename to app/tests/tap-dance/1c-tap3/native_sim.keymap diff --git a/app/tests/tap-dance/2a-hold1/native_posix_64.keymap b/app/tests/tap-dance/2a-hold1/native_sim.keymap similarity index 100% rename from app/tests/tap-dance/2a-hold1/native_posix_64.keymap rename to app/tests/tap-dance/2a-hold1/native_sim.keymap diff --git a/app/tests/tap-dance/2b-hold2/native_posix_64.keymap b/app/tests/tap-dance/2b-hold2/native_sim.keymap similarity index 100% rename from app/tests/tap-dance/2b-hold2/native_posix_64.keymap rename to app/tests/tap-dance/2b-hold2/native_sim.keymap diff --git a/app/tests/tap-dance/2c-hold3/native_posix_64.keymap b/app/tests/tap-dance/2c-hold3/native_sim.keymap similarity index 100% rename from app/tests/tap-dance/2c-hold3/native_posix_64.keymap rename to app/tests/tap-dance/2c-hold3/native_sim.keymap diff --git a/app/tests/tap-dance/3a-tap-int-mid/native_posix_64.keymap b/app/tests/tap-dance/3a-tap-int-mid/native_sim.keymap similarity index 100% rename from app/tests/tap-dance/3a-tap-int-mid/native_posix_64.keymap rename to app/tests/tap-dance/3a-tap-int-mid/native_sim.keymap diff --git a/app/tests/tap-dance/3b-tap-int-seq/native_posix_64.keymap b/app/tests/tap-dance/3b-tap-int-seq/native_sim.keymap similarity index 100% rename from app/tests/tap-dance/3b-tap-int-seq/native_posix_64.keymap rename to app/tests/tap-dance/3b-tap-int-seq/native_sim.keymap diff --git a/app/tests/tap-dance/3c-tap-int-after/native_posix_64.keymap b/app/tests/tap-dance/3c-tap-int-after/native_sim.keymap similarity index 100% rename from app/tests/tap-dance/3c-tap-int-after/native_posix_64.keymap rename to app/tests/tap-dance/3c-tap-int-after/native_sim.keymap diff --git a/app/tests/tap-dance/3d-hold-int-mid/native_posix_64.keymap b/app/tests/tap-dance/3d-hold-int-mid/native_sim.keymap similarity index 100% rename from app/tests/tap-dance/3d-hold-int-mid/native_posix_64.keymap rename to app/tests/tap-dance/3d-hold-int-mid/native_sim.keymap diff --git a/app/tests/tap-dance/3e-hold-int-seq/native_posix_64.keymap b/app/tests/tap-dance/3e-hold-int-seq/native_sim.keymap similarity index 100% rename from app/tests/tap-dance/3e-hold-int-seq/native_posix_64.keymap rename to app/tests/tap-dance/3e-hold-int-seq/native_sim.keymap diff --git a/app/tests/tap-dance/3f-hold-int-after/native_posix_64.keymap b/app/tests/tap-dance/3f-hold-int-after/native_sim.keymap similarity index 100% rename from app/tests/tap-dance/3f-hold-int-after/native_posix_64.keymap rename to app/tests/tap-dance/3f-hold-int-after/native_sim.keymap diff --git a/app/tests/tap-dance/4a-single/native_posix_64.keymap b/app/tests/tap-dance/4a-single/native_sim.keymap similarity index 100% rename from app/tests/tap-dance/4a-single/native_posix_64.keymap rename to app/tests/tap-dance/4a-single/native_sim.keymap diff --git a/app/tests/tap-dance/5a-tdint-mid/native_posix_64.keymap b/app/tests/tap-dance/5a-tdint-mid/native_sim.keymap similarity index 100% rename from app/tests/tap-dance/5a-tdint-mid/native_posix_64.keymap rename to app/tests/tap-dance/5a-tdint-mid/native_sim.keymap diff --git a/app/tests/tap-dance/5b-tdint-seq/native_posix_64.keymap b/app/tests/tap-dance/5b-tdint-seq/native_sim.keymap similarity index 100% rename from app/tests/tap-dance/5b-tdint-seq/native_posix_64.keymap rename to app/tests/tap-dance/5b-tdint-seq/native_sim.keymap diff --git a/app/tests/tap-dance/5c-tdint-after/native_posix_64.keymap b/app/tests/tap-dance/5c-tdint-after/native_sim.keymap similarity index 100% rename from app/tests/tap-dance/5c-tdint-after/native_posix_64.keymap rename to app/tests/tap-dance/5c-tdint-after/native_sim.keymap diff --git a/app/tests/tap-dance/5d-tdint-multiple/native_posix_64.keymap b/app/tests/tap-dance/5d-tdint-multiple/native_sim.keymap similarity index 100% rename from app/tests/tap-dance/5d-tdint-multiple/native_posix_64.keymap rename to app/tests/tap-dance/5d-tdint-multiple/native_sim.keymap diff --git a/app/tests/tap-dance/6-combo-tap2/native_posix_64.keymap b/app/tests/tap-dance/6-combo-tap2/native_sim.keymap similarity index 100% rename from app/tests/tap-dance/6-combo-tap2/native_posix_64.keymap rename to app/tests/tap-dance/6-combo-tap2/native_sim.keymap diff --git a/app/tests/to-layer/normal/native_posix_64.keymap b/app/tests/to-layer/normal/native_sim.keymap similarity index 100% rename from app/tests/to-layer/normal/native_posix_64.keymap rename to app/tests/to-layer/normal/native_sim.keymap diff --git a/app/tests/toggle-layer/early-key-release/native_posix_64.keymap b/app/tests/toggle-layer/early-key-release/native_sim.keymap similarity index 100% rename from app/tests/toggle-layer/early-key-release/native_posix_64.keymap rename to app/tests/toggle-layer/early-key-release/native_sim.keymap diff --git a/app/tests/toggle-layer/normal/native_posix_64.keymap b/app/tests/toggle-layer/normal/native_sim.keymap similarity index 100% rename from app/tests/toggle-layer/normal/native_posix_64.keymap rename to app/tests/toggle-layer/normal/native_sim.keymap diff --git a/app/tests/toggle-layer/toggle-mode-off/native_posix_64.keymap b/app/tests/toggle-layer/toggle-mode-off/native_sim.keymap similarity index 100% rename from app/tests/toggle-layer/toggle-mode-off/native_posix_64.keymap rename to app/tests/toggle-layer/toggle-mode-off/native_sim.keymap diff --git a/app/tests/toggle-layer/toggle-mode-on/native_posix_64.keymap b/app/tests/toggle-layer/toggle-mode-on/native_sim.keymap similarity index 100% rename from app/tests/toggle-layer/toggle-mode-on/native_posix_64.keymap rename to app/tests/toggle-layer/toggle-mode-on/native_sim.keymap diff --git a/app/tests/transparent/layered/native_posix_64.keymap b/app/tests/transparent/layered/native_sim.keymap similarity index 100% rename from app/tests/transparent/layered/native_posix_64.keymap rename to app/tests/transparent/layered/native_sim.keymap diff --git a/app/tests/transparent/normal/native_posix_64.keymap b/app/tests/transparent/normal/native_posix_64.keymap deleted file mode 100644 index 502f7ccc473..00000000000 --- a/app/tests/transparent/normal/native_posix_64.keymap +++ /dev/null @@ -1,8 +0,0 @@ -#include -#include -#include -#include "../behavior_keymap.dtsi" - -&kscan { - events = ; -}; \ No newline at end of file diff --git a/app/tests/none/normal/native_posix_64.keymap b/app/tests/transparent/normal/native_sim.keymap similarity index 100% rename from app/tests/none/normal/native_posix_64.keymap rename to app/tests/transparent/normal/native_sim.keymap diff --git a/app/tests/wpm/1-single_keypress/native_posix_64.conf b/app/tests/wpm/1-single_keypress/native_sim.conf similarity index 100% rename from app/tests/wpm/1-single_keypress/native_posix_64.conf rename to app/tests/wpm/1-single_keypress/native_sim.conf diff --git a/app/tests/wpm/1-single_keypress/native_posix_64.keymap b/app/tests/wpm/1-single_keypress/native_sim.keymap similarity index 100% rename from app/tests/wpm/1-single_keypress/native_posix_64.keymap rename to app/tests/wpm/1-single_keypress/native_sim.keymap diff --git a/app/tests/wpm/2-multiple_keypress/native_posix_64.conf b/app/tests/wpm/2-multiple_keypress/native_sim.conf similarity index 100% rename from app/tests/wpm/2-multiple_keypress/native_posix_64.conf rename to app/tests/wpm/2-multiple_keypress/native_sim.conf diff --git a/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap b/app/tests/wpm/2-multiple_keypress/native_sim.keymap similarity index 100% rename from app/tests/wpm/2-multiple_keypress/native_posix_64.keymap rename to app/tests/wpm/2-multiple_keypress/native_sim.keymap diff --git a/app/west.yml b/app/west.yml index ce0785e3349..d177f2bd1c0 100644 --- a/app/west.yml +++ b/app/west.yml @@ -7,7 +7,7 @@ manifest: projects: - name: zephyr remote: zmkfirmware - revision: v3.5.0+zmk-fixes + revision: v4.1.0+zmk-fixes clone-depth: 1 import: name-blocklist: @@ -18,7 +18,6 @@ manifest: - hal_microchip - hal_nxp - hal_openisa - - hal_silabs - hal_xtensa - hal_st - hal_ti @@ -29,13 +28,14 @@ manifest: - openthread - edtt - trusted-firmware-m - - name: nanopb - revision: 8c60555d6277a0360c876bd85d491fc4fb0cd74a - path: modules/lib/nanopb + - name: lvgl + revision: f1db87ee98f1810328a8419572fa42a3b5f352ae + path: modules/lib/gui/lvgl remote: zmkfirmware - name: zmk-studio-messages revision: 6cb4c283e76209d59c45fbcb218800cd19e9339d path: modules/msgs/zmk-studio-messages remote: zmkfirmware + group-filter: [+optional] self: west-commands: scripts/west-commands.yml diff --git a/docs/blog/2025-xx-xx-zephyr-4-1.md b/docs/blog/2025-xx-xx-zephyr-4-1.md new file mode 100644 index 00000000000..9d57f35b11b --- /dev/null +++ b/docs/blog/2025-xx-xx-zephyr-4-1.md @@ -0,0 +1,455 @@ +--- +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)! + + + +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 + +Since the changes are merged to ZMK `main`, you'll need to be using that version of ZMK to use/tests these changes. + +### Local Development + +To get the update, first pull the latest ZMK `main`: + +``` +git checkout main && git pull main +``` + +Once you have the updated ZMK code, update the referenced modules: + +``` +west update +``` + +To be sure you've got all the updated Python packages needed to build ZMK, use west again: + +``` +west packages pip --install +``` + +### GitHub Actions Builds + +To test these changes, you need to verify that the `west.yml` for your build is using a `revision: main` property. Once this is verified, simply run a new build and the updated Zephyr version will be used. + +## 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` (short: `nice_nano@1`) + - `nice_nano_v2` -> `nice_nano@2.0.0` (short: `nice_nano`) +- nRFMicro (`nrfmicro/nrf52840`) + - `nrfmicro_11` -> `nrfmicro@1.1.0/nrf52840` (short: `nrfmicro@1.1/nrf52840`) + - `nrfmicro_11_flipped` -> `nrfmicro@1.1.0/nrf52840/flipped` (short: `nrfmicro@1.1/nrf52840/flipped`) + - `nrfmicro_13` -> `nrfmicro@1.3.0/nrf52840` (short: `nrfmicro/nrf52840`) + - `nrfmicro_13_52833` -> `nrfmicro@1.3.0/nrf52833` (short: `nrfmicro/nrf52833`) +- Mikoto (`mikoto`) + - `mikoto` -> `mikoto@5.20.0` (short: `mikoto`) + - `mikoto@6.1` -> `mikoto@6.1.0` (short: `mikoto@6`) + - `mikoto@7.2` -> `mikoto@7.2.0` (short: `mikoto@7`) +- XIAO RP2040 (`xiao_rp2040`) + - `seeeduino_xiao_rp2040` -> `xiao_rp2040` +- XIAO nRF52840/BLE (`xiao_ble`) + - `seeeduino_xiao_ble` -> `xiao_ble` +- BT60 (`bt60`) + - `bt60_v1` -> `bt60@1.0.0` + - `bt60_v2` -> `bt60@2.0.0` + - `bt60_hs` -> `bt60_hs` +- Planck (`planck`) + - `planck_rev6` -> `planck` +- BDN9 (`bdn9`) + - `bdn9_rev2` -> `bdn9` +- Ferris Rev2 (`ferris`) + - `ferris_rev02` -> `ferris@2.0.0` (short: `ferris`) + +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. + +## Getting The Changes + +### User Config Repositories Using GitHub Actions + +Existing user repositories which are currently running ZMK's `main` branch 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 --user --update west`. +- Pull the latest ZMK `main` with `git pull` for your ZMK checkout +- Run `west update` to pull the updated Zephyr version and its dependencies + +From there, you should be ready to build as normal! + +## 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/development/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 728cb8b29d0..0c3ba752ce9 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/3.5.0/build/dts/intro-syntax-structure.html#aliases-and-chosen-nodes) +Applies to: [`/chosen` node](https://docs.zephyrproject.org/4.1.0/build/dts/intro-syntax-structure.html#aliases-and-chosen-nodes) | Property | Type | Description | | ------------- | ---- | --------------------------------------------- | @@ -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/3.5.0/build/dts/api/bindings/iio/afe/voltage-divider.html). +See [Zephyr's voltage divider documentation](https://docs.zephyrproject.org/4.1.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 e7a7c04c43b..ce53ee99296 100644 --- a/docs/docs/config/behaviors.md +++ b/docs/docs/config/behaviors.md @@ -403,8 +403,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/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. | | +| `x-input-code` | int | The [relative event code](https://github.com/zmkfirmware/zephyr/blob/v4.1.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L258) for generated input events for the X-axis. | | +| `y-input-code` | int | The [relative event code](https://github.com/zmkfirmware/zephyr/blob/v4.1.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L258) for generated input events for the Y-axis. | | | `trigger-period-ms` | int | How many milliseconds between generated input events based on the current speed/direction. | 16 | | `delay-ms` | int | How many milliseconds to delay any processing or event generation when first pressed. | 0 | | `time-to-max-speed-ms` | int | How many milliseconds it takes to accelerate to the curren max speed. | 0 | diff --git a/docs/docs/config/displays.md b/docs/docs/config/displays.md index 7f7189535bf..2896b418233 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/3.5.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/4.1.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/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) +- [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) -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). +A full list of drivers provided by Zephyr can be found in [Zephyr's Devicetree bindings index](https://docs.zephyrproject.org/4.1.0/build/dts/api/bindings.html). ### Chosen nodes -Applies to: [`/chosen` node](https://docs.zephyrproject.org/3.5.0/build/dts/intro-syntax-structure.html#aliases-and-chosen-nodes) +Applies to: [`/chosen` node](https://docs.zephyrproject.org/4.1.0/build/dts/intro-syntax-structure.html#aliases-and-chosen-nodes) | Property | Type | Description | | ----------------- | ---- | -------------------------------------------------------------------------------------------------------- | diff --git a/docs/docs/config/index.md b/docs/docs/config/index.md index dd0e7ad737d..bd7463acc77 100644 --- a/docs/docs/config/index.md +++ b/docs/docs/config/index.md @@ -37,14 +37,14 @@ ZMK will search for config files in: ...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/3.5.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/4.1.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/3.5.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/4.1.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/3.5.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/4.1.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/3.5.0/hardware/porting/shields.html) and [ZMK's new keyboard shield](../development/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/4.1.0/hardware/porting/shields.html) and [ZMK's new keyboard shield](../development/hardware-integration/new-shield.mdx) guide. ## Kconfig Files @@ -82,7 +82,7 @@ Files ending with `_defconfig` use the same syntax as `.conf` files. They set th 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/3.5.0/build/kconfig/index.html) for more details on Kconfig files. +See [Zephyr's Kconfig documentation](https://docs.zephyrproject.org/4.1.0/build/kconfig/index.html) for more details on Kconfig files. :::tip @@ -139,7 +139,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/3.5.0/build/dts/index.html) for more details on Devicetree files. +See [Zephyr's Devicetree guide](https://docs.zephyrproject.org/4.1.0/build/dts/index.html) for more details on Devicetree files. :::tip @@ -166,7 +166,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/3.5.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/4.1.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 (`;`). diff --git a/docs/docs/config/kscan.md b/docs/docs/config/kscan.md index 416175fa6d3..395342a2ae6 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/3.5.0/build/dts/intro-syntax-structure.html#aliases-and-chosen-nodes) +Applies to: [`/chosen` node](https://docs.zephyrproject.org/4.1.0/build/dts/intro-syntax-structure.html#aliases-and-chosen-nodes) | Property | Type | Description | | ---------------------- | ---- | ---------------------------------------------------------------------- | @@ -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/3.5.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/4.1.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/3.5.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/4.1.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/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)`. +The [GPIO flags](https://docs.zephyrproject.org/4.1.0/hardware/peripherals/gpio.html#api-reference) for the elements in `gpios` should be `GPIO_ACTIVE_HIGH`, and interrupt pins set in `interrupt-gpios` should have the flags `(GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)`. ## Composite Driver diff --git a/docs/docs/config/lighting.md b/docs/docs/config/lighting.md index 8734c70d647..ceb49db89a0 100644 --- a/docs/docs/config/lighting.md +++ b/docs/docs/config/lighting.md @@ -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/3.5.0/build/dts/intro-syntax-structure.html#aliases-and-chosen-nodes) +Applies to: [`/chosen` node](https://docs.zephyrproject.org/4.1.0/build/dts/intro-syntax-structure.html#aliases-and-chosen-nodes) | Property | Type | Description | | --------------- | ---- | -------------------------------------------- | @@ -87,7 +87,7 @@ Applies to: [`/chosen` node](https://docs.zephyrproject.org/3.5.0/build/dts/intr See the Zephyr devicetree bindings for LED drivers: -- [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) +- [gpio-leds](https://docs.zephyrproject.org/4.1.0/build/dts/api/bindings/led/gpio-leds.html) +- [pwm-leds](https://docs.zephyrproject.org/4.1.0/build/dts/api/bindings/led/pwm-leds.html) See the [backlight hardware integration page](../development/hardware-integration/lighting/backlight.mdx) for examples of the properties that must be set to enable backlighting. diff --git a/docs/docs/config/settings.md b/docs/docs/config/settings.md index da162c75281..b6245475ac2 100644 --- a/docs/docs/config/settings.md +++ b/docs/docs/config/settings.md @@ -3,7 +3,7 @@ title: Persistent Settings sidebar_label: Settings --- -ZMK uses [Zephyr's settings subsystem](https://docs.zephyrproject.org/3.5.0/services/settings/index.html) to store certain runtime settings in the "storage" partition of the controller's flash memory. +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. diff --git a/docs/docs/config/system.md b/docs/docs/config/system.md index 4575a50d118..fbbbaaa8d2f 100644 --- a/docs/docs/config/system.md +++ b/docs/docs/config/system.md @@ -21,7 +21,7 @@ Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/ :::info -Because ZMK enables [the Zephyr setting](https://docs.zephyrproject.org/3.5.0/kconfig.html#CONFIG_BT_DEVICE_NAME_DYNAMIC) that allows for runtime modification of the device BT name, +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. ::: @@ -93,7 +93,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/3.5.0/connectivity/bluetooth/bluetooth-arch.html) +See [Zephyr's Bluetooth stack architecture documentation](https://docs.zephyrproject.org/4.1.0/connectivity/bluetooth/bluetooth-arch.html) for more information on configuring Bluetooth. | Config | Type | Description | Default | @@ -120,6 +120,13 @@ Note that `CONFIG_BT_MAX_CONN` and `CONFIG_BT_MAX_PAIRED` should be set to the s | `CONFIG_ZMK_USB_LOGGING` | bool | Enable USB CDC ACM logging for debugging | n | | `CONFIG_ZMK_LOG_LEVEL` | int | Log level for ZMK debug messages | 4 | +### Double Tap To Bootloader + +| 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 | + ## Snippets :::danger @@ -132,7 +139,7 @@ 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/3.5.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/4.1.0/build/snippets/index.html) are a way to save common configuration separately when it applies to multiple different applications. Enable snippets by adding `snippet: ` to your `build.yaml` for the appropriate board: diff --git a/docs/docs/development/devicetree.md b/docs/docs/development/devicetree.md index 8c3401faf2b..f576b36e7c3 100644 --- a/docs/docs/development/devicetree.md +++ b/docs/docs/development/devicetree.md @@ -70,7 +70,7 @@ What properties a node may have varies drastically. Of the standard properties, #### 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. +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 @@ -124,14 +124,14 @@ 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) +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/3.5.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). +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: @@ -187,7 +187,7 @@ properties: 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/3.5.0/build/dts/bindings-syntax.html). +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. @@ -260,7 +260,7 @@ A devicetree is almost always constructed from multiple files. These files are g - `.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/3.5.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. +- 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 diff --git a/docs/docs/development/hardware-integration/bootloader/_base-config.md b/docs/docs/development/hardware-integration/bootloader/_base-config.md new file mode 100644 index 00000000000..3172ec9f2a3 --- /dev/null +++ b/docs/docs/development/hardware-integration/bootloader/_base-config.md @@ -0,0 +1,13 @@ +## 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/development/hardware-integration/bootloader/adafruit-nrf52.mdx b/docs/docs/development/hardware-integration/bootloader/adafruit-nrf52.mdx new file mode 100644 index 00000000000..0e06ea7ee2b --- /dev/null +++ b/docs/docs/development/hardware-integration/bootloader/adafruit-nrf52.mdx @@ -0,0 +1,84 @@ +--- +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/development/hardware-integration/bootloader/index.mdx b/docs/docs/development/hardware-integration/bootloader/index.mdx new file mode 100644 index 00000000000..5190c04b0b5 --- /dev/null +++ b/docs/docs/development/hardware-integration/bootloader/index.mdx @@ -0,0 +1,31 @@ +--- +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/development/hardware-integration/bootloader/rp2.mdx b/docs/docs/development/hardware-integration/bootloader/rp2.mdx new file mode 100644 index 00000000000..fce59b032c0 --- /dev/null +++ b/docs/docs/development/hardware-integration/bootloader/rp2.mdx @@ -0,0 +1,70 @@ +--- +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/system.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/development/hardware-integration/bootloader/samd21-uf2.mdx b/docs/docs/development/hardware-integration/bootloader/samd21-uf2.mdx new file mode 100644 index 00000000000..1894246ac54 --- /dev/null +++ b/docs/docs/development/hardware-integration/bootloader/samd21-uf2.mdx @@ -0,0 +1,102 @@ +--- +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/development/hardware-integration/bootloader/stm32.mdx b/docs/docs/development/hardware-integration/bootloader/stm32.mdx new file mode 100644 index 00000000000..6d7a45dd989 --- /dev/null +++ b/docs/docs/development/hardware-integration/bootloader/stm32.mdx @@ -0,0 +1,71 @@ +--- +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/system.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/development/hardware-integration/bootloader/tinyuf2.mdx b/docs/docs/development/hardware-integration/bootloader/tinyuf2.mdx new file mode 100644 index 00000000000..85386b4dc75 --- /dev/null +++ b/docs/docs/development/hardware-integration/bootloader/tinyuf2.mdx @@ -0,0 +1,102 @@ +--- +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/development/hardware-integration/index.mdx b/docs/docs/development/hardware-integration/index.mdx index 7222f5a7852..4fb51beffe9 100644 --- a/docs/docs/development/hardware-integration/index.mdx +++ b/docs/docs/development/hardware-integration/index.mdx @@ -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/3.5.0/glossary.html#term-board) and [shields](https://docs.zephyrproject.org/3.5.0/hardware/porting/shields.html). +Also see the Zephyr documentation on [boards](https://docs.zephyrproject.org/4.1.0/glossary.html#term-board) and [shields](https://docs.zephyrproject.org/4.1.0/hardware/porting/shields.html). ### What is a "board"? @@ -84,9 +84,9 @@ In that directory you'll have the following files, where there can be multiples └── .zmk.yml ``` -These files include [base Kconfig files](https://docs.zephyrproject.org/3.5.0/build/kconfig/index.html): +These files include [base Kconfig files](https://docs.zephyrproject.org/4.1.0/build/kconfig/index.html): -- 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.board` file that defines the toplevel [Kconfig](https://docs.zephyrproject.org/4.1.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_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 @@ -101,7 +101,7 @@ These files include [base Kconfig files](https://docs.zephyrproject.org/3.5.0/bu - `.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/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 [chosen](https://docs.zephyrproject.org/4.1.0/build/dts/intro-syntax-structure.html#aliases-and-chosen-nodes) node including `zmk,physical-layout` property among others, where each property references the nodes defined in the file. - A `.keymap` file that includes the default keymap for that keyboard. Users will be able to override this keymap in their user configs. And other miscellaneous ones: @@ -109,7 +109,7 @@ And other miscellaneous ones: - A `board.cmake` file with CMake directives for how to flash to the device. - A `.zmk.yml` file containing [metadata](hardware-metadata-files.md) for the keyboard. -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. +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. Also see the [new keyboard shield guide](new-shield.mdx#shield-overlays) for information on parts of the devicetree specifically related to ZMK. [^1]: @@ -142,8 +142,8 @@ These files include [base Kconfig files](new-shield.mdx#base-kconfig-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/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. + - Kscan, matrix transform and physical layout devicetree nodes as described above, where the kscan node uses the interconnect [nexus node](https://docs.zephyrproject.org/4.1.0/hardware/porting/shields.html#gpio-nexus-nodes) aliases such as `&pro_micro` for GPIO pins. + - A [chosen](https://docs.zephyrproject.org/4.1.0/build/dts/intro-syntax-structure.html#aliases-and-chosen-nodes) node including at least the `zmk,physical-layout` property, referring to the defined node. - A `.keymap` file that includes the default keymap for that keyboard. Users will be able to override this keymap in their user configs. And other miscellaneous ones: diff --git a/docs/docs/development/hardware-integration/new-shield.mdx b/docs/docs/development/hardware-integration/new-shield.mdx index 1cbc079d96b..6aa8c9cda02 100644 --- a/docs/docs/development/hardware-integration/new-shield.mdx +++ b/docs/docs/development/hardware-integration/new-shield.mdx @@ -61,7 +61,7 @@ The high level steps are: 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/3.5.0/hardware/porting/shields.html#shields) to get a proper understanding of the underlying system before continuing. +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. ## New ZMK Module Repository @@ -106,7 +106,7 @@ mkdir boards/shields/ You can check out the [`shields` folder](https://github.com/zmkfirmware/zmk/tree/main/app/boards/shields) in the ZMK repo that houses [the in-tree supported shields](../../hardware.mdx) in order to copy and modify as a starting point. ::: -There are two required [Kconfig](https://docs.zephyrproject.org/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`. +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`. diff --git a/docs/docs/development/hardware-integration/pinctrl.mdx b/docs/docs/development/hardware-integration/pinctrl.mdx index 7c61f50dcff..7722dbd0cd1 100644 --- a/docs/docs/development/hardware-integration/pinctrl.mdx +++ b/docs/docs/development/hardware-integration/pinctrl.mdx @@ -9,13 +9,13 @@ import InterconnectTabs from "@site/src/components/interconnect-tabs"; import Metadata from "@site/src/data/hardware-metadata.json"; :::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. +This page exists to provide a guide to [Pin Control](https://docs.zephyrproject.org/4.1.0/hardware/pinctrl/index.html#pin-control) for ZMK users and designers. Refer to [Zephyr's page on Pin Control](https://docs.zephyrproject.org/4.1.0/hardware/pinctrl/index.html#pin-control) for elaboration and more details on any of the points raised here. ::: A basic keyboard design as introduced in the [new shield guide](./new-shield.mdx) only uses its pins for the keyboard matrix. Many keyboard designs make use of advanced components or functionality, such as displays or shift registers. This results in the keyboard making use of communication protocols such as (but not limited to) SPI, I2C, or UART. Configuring pins for the usage of advanced functionality such as drivers for the previously named protocols is referred to as "Pin Control". :::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). +The details of pin control can vary from vendor to vendor. An attempt was made to be as general as possible, but it isn't possible to cover all possible cases. The approaches for the nRF52840 and RP2040 MCUs/SoCs are documented in their entirety below. For other MCUs/SoCs, please refer to the [Zephyr documentation](https://docs.zephyrproject.org/4.1.0/index.html) and the examples and other files found in-tree of [ZMK](https://github.com/zmkfirmware/zmk/tree/main/app/boards) and [ZMK's fork of Zephyr](https://github.com/zmkfirmware/zephyr). ::: ## Boards, Shields, and Modules @@ -110,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/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. +Child nodes are (generally, there are [exceptions](https://docs.zephyrproject.org/4.1.0/hardware/pinctrl/index.html#pin-configuration)) expected to contain one or more subnodes typically named "groupX". These are for grouping together pins that should be assigned the same state, such as enabling an internal pull-up. Below are some examples of SPI child nodes for the nRF52840 and the RP2040. Further examples are contained within the comments of the respecting `pinctrl.yaml` files. -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), 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) 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 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 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/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`: @@ -264,7 +264,7 @@ 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/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: +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: diff --git a/docs/docs/development/hardware-integration/soft-off-setup.mdx b/docs/docs/development/hardware-integration/soft-off-setup.mdx index 690ca1720b1..0f326b567b4 100644 --- a/docs/docs/development/hardware-integration/soft-off-setup.mdx +++ b/docs/docs/development/hardware-integration/soft-off-setup.mdx @@ -75,7 +75,7 @@ For this approach, you will need to make sure that the [soft off behavior](../.. ### GPIO key -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. +Zephyr's basic [GPIO Key](https://docs.zephyrproject.org/4.1.0/build/dts/api/bindings/input/gpio-keys.html) concept is used to configure the soft off GPIO pin. {/* secrettabs hides this tab selector. GPIO key changes its "orientation" between simple pin and matrix integrated. */} Keyboards with onboard MCU chips are simply treated as the - [board](https://docs.zephyrproject.org/3.5.0/hardware/porting/board_porting.html) + [board](https://docs.zephyrproject.org/4.1.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/3.5.0/hardware/porting/shields.html), + [shields](https://docs.zephyrproject.org/4.1.0/hardware/porting/shields.html), and treats the smaller MCU board as the true - [board](https://docs.zephyrproject.org/3.5.0/hardware/porting/board_porting.html). + [board](https://docs.zephyrproject.org/4.1.0/hardware/porting/board_porting.html). Given the following: @@ -94,7 +94,7 @@ west build -d ::: You can also add permanent CMake arguments to `west build` by using the -[`west config`](https://docs.zephyrproject.org/3.5.0/develop/west/config.html#west-config-cmd) +[`west config`](https://docs.zephyrproject.org/4.1.0/develop/west/config.html#west-config-cmd) command. These are invoked whenever a new build system is generated. To add permanent arguments, set the `build.cmake-args` configuration option. @@ -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/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. +Zephyr supports running the Bluetooth host and controller on separate processors. In such a configuration, ZMK always runs on the host processor, but you may need to build and flash separate firmware for the controller. Zephyr provides sample code which can be used as the controller firmware for Bluetooth HCI over [RPMsg](https://docs.zephyrproject.org/4.1.0/samples/bluetooth/hci_rpmsg/README.html), [SPI](https://docs.zephyrproject.org/4.1.0/samples/bluetooth/hci_spi/README.html), [UART](https://docs.zephyrproject.org/4.1.0/samples/bluetooth/hci_uart/README.html), and [USB](https://docs.zephyrproject.org/4.1.0/samples/bluetooth/hci_usb/README.html). See [Zephyr's Bluetooth Stack Architecture documentation](https://docs.zephyrproject.org/4.1.0/connectivity/bluetooth/bluetooth-arch.html) for more details. The following documentation shows how to build and flash ZMK for boards that use a dual-chip configuration. diff --git a/docs/docs/development/local-toolchain/setup/native.mdx b/docs/docs/development/local-toolchain/setup/native.mdx index 467d13ca710..3c82a60e961 100644 --- a/docs/docs/development/local-toolchain/setup/native.mdx +++ b/docs/docs/development/local-toolchain/setup/native.mdx @@ -73,13 +73,17 @@ export const WinTermTabs = (props) => ( ## 1. Install Zephyr Dependencies -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: +Open Zephyr's [Getting Started Guide](https://docs.zephyrproject.org/4.1.0/develop/getting_started/index.html) and follow the instructions under these sections: -- [Select and Update OS](https://docs.zephyrproject.org/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) +- [Select and Update OS](https://docs.zephyrproject.org/4.1.0/develop/getting_started/index.html#select-and-update-os) +- [Install Dependencies](https://docs.zephyrproject.org/4.1.0/develop/getting_started/index.html#install-dependencies) :::info -Zephyr's [Install Linux Host Dependencies](https://docs.zephyrproject.org/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. +Zephyr's [Install Linux Host Dependencies](https://docs.zephyrproject.org/4.1.0/develop/getting_started/installation_linux.html) page may be of use for users of Linux distributions which are not based on Ubuntu. +::: + +:::warning +Some optional Zephyr modules, like `libmetal`, are not compatible with CMake v4, so we recommend installing the latest CMake v3 release when installing the Zephyr dependencies. ::: ## 2. Source Code @@ -99,7 +103,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/3.5.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/4.1.0/develop/getting_started/index.html#get-zephyr-and-install-python-dependencies) instructions, but specialized for ZMK. ::: @@ -191,22 +195,16 @@ west update This step pulls down quite a bit of tooling, be patient! ::: -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. +6. Export a [Zephyr CMake package](https://docs.zephyrproject.org/4.1.0/build/zephyr_cmake_package.html#cmake-pkg). This allows CMake to automatically load boilerplate code required for building Zephyr applications. ```sh west zephyr-export ``` -7. Install the additional dependencies found in Zephyr's `requirements-base.txt`: +7. Install the additional Zephyr dependencies using `west`: ```sh -pip install -r zephyr/scripts/requirements-base.txt -``` - -If you are going to build firmware with [ZMK Studio](../../../features/studio.md), also install `requirements-extras.txt` dependencies: - -```sh -pip install -r zephyr/scripts/requirements-extras.txt +west packages pip --install ``` @@ -286,7 +284,7 @@ west update This step pulls down quite a bit of tooling, be patient! ::: -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. +3. Export a [Zephyr CMake package](https://docs.zephyrproject.org/4.1.0/build/zephyr_cmake_package.html#cmake-pkg). This allows CMake to automatically load boilerplate code required for building Zephyr applications. ```sh west zephyr-export @@ -295,47 +293,29 @@ west zephyr-export -4. Install the additional dependencies found in Zephyr's `requirements-base.txt`: - -```sh -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-extras.txt` dependencies: +4. Install the additional Zephyr dependencies using `west`: ```sh -pip3 install -r zephyr/scripts/requirements-extras.txt +west packages pip --install ``` -4. Install the additional dependencies found in Zephyr's `requirements-base.txt`: - -```sh -pip install -r zephyr/scripts/requirements-base.txt -``` - -If you are going to build firmware with [ZMK Studio](../../../features/studio.md), also install `requirements-extras.txt` dependencies: +4. Install the additional Zephyr dependencies using `west`: ```sh -pip install -r zephyr/scripts/requirements-extras.txt +west packages pip --install ``` -4. Install the additional dependencies found in Zephyr's `requirements-base.txt`. - -```sh -pip3 install -r zephyr/scripts/requirements-base.txt -``` - -If you are going to build firmware with [ZMK Studio](../../../features/studio.md), also install `requirements-extras.txt` dependencies: +4. Install the additional Zephyr dependencies using `west`: ```sh -pip3 install -r zephyr/scripts/requirements-extras.txt +west packages pip --install ``` @@ -345,7 +325,7 @@ pip3 install -r zephyr/scripts/requirements-extras.txt ## 4. 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). +Return to Zephyr's Getting Started Guide and [Install Zephyr SDK](https://docs.zephyrproject.org/4.1.0/develop/getting_started/index.html#install-zephyr-sdk). ### OS-Specific Notes @@ -360,7 +340,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/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. +Because Raspberry OS runs on the same architecture (but different ABI) as ARM keyboard MCUs, the operating system's installed [cross compilers](https://docs.zephyrproject.org/4.1.0/develop/toolchains/other_x_compilers.html) can be used to target the different ABI. Building for non-ARM MCUs has not been tested. First, the cross compiler should be installed: @@ -368,7 +348,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/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: +Next, we'll configure Zephyr with some [environment variables](https://docs.zephyrproject.org/4.1.0/develop/env_vars.html#env-vars) needed to find the cross compiler. Create a file named `~/.zephyrrc` if it doesn't exist, and add these lines to it: ```sh export ZEPHYR_TOOLCHAIN_VARIANT=cross-compile diff --git a/docs/docs/development/module-creation.md b/docs/docs/development/module-creation.md index edbd96b600a..f12a1944aa7 100644 --- a/docs/docs/development/module-creation.md +++ b/docs/docs/development/module-creation.md @@ -10,7 +10,7 @@ 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/3.5.0/develop/modules.html). +See also Zephyr's [page on modules](https://docs.zephyrproject.org/4.1.0/develop/modules.html). :::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. @@ -71,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/3.5.0/build/snippets/index.html). + - `snippet_root` points to the parent directory of a `snippets` directory, which contains [snippets](https://docs.zephyrproject.org/4.1.0/build/snippets/index.html). See the `zephyr/module.yml` found in the template for a usage example. ### Dependencies -If `zephyr/module.yml` has anything listed under `depends`, then you should also define a [west manifest](https://docs.zephyrproject.org/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. +If `zephyr/module.yml` has anything listed under `depends`, then you should also define a [west manifest](https://docs.zephyrproject.org/4.1.0/develop/west/manifest.html) file. While the `zephyr/module.yml` file defines _which_ modules your module depends on, the west manifest file defines _where_ said modules are found. This then allows automatic tooling to fetch the modules when building firmware. If `depends` is not present in `zephyr/module.yml`, then this file (named `west.yml` in the template) should be removed. It is recommended that you place the manifest file at the root of your module, though you can place it elsewhere. Be sure to note in your `README.md` that your module uses dependencies, so that users import these correctly. Below is an example `west.yml` file for a user that would be using your module, with the necessary `import` field if the module has dependencies: @@ -126,7 +126,7 @@ 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/3.5.0/build/snippets/index.html) | +| `snippets/` | Folder for [snippets](https://docs.zephyrproject.org/4.1.0/build/snippets/index.html) | Note that the `include` and `src` folders are not mandated by the module system, and all of these can be positioned anywhere in your module's filetree if you adjust the `zephyr/module.yml` accordingly. The `west.yml` file is not commonly present in any of the types. diff --git a/docs/docs/development/new-behavior.mdx b/docs/docs/development/new-behavior.mdx index 6aed4fb8397..2aca1ee90aa 100644 --- a/docs/docs/development/new-behavior.mdx +++ b/docs/docs/development/new-behavior.mdx @@ -39,8 +39,8 @@ Before developing new behaviors, developers should have a working knowledge of t 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/3.5.0/build/dts/api/api.html) -- [Zephyr Device Driver Model](https://docs.zephyrproject.org/3.5.0/kernel/drivers/index.html) +- [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) ::: @@ -174,7 +174,7 @@ See [Behavior Metadata](#behavior-metadata) for more information. #### `properties` (Optional) These are additional variables required to configure a particular instance of a behavior. -More information can be found in [ZMK's Devicetree primer](./devicetree.md) or [Zephyr's own documentation on Devicetree bindings](https://docs.zephyrproject.org/3.5.0/build/dts/bindings-syntax.html#properties). +More information can be found in [ZMK's Devicetree primer](./devicetree.md) or [Zephyr's own documentation on Devicetree bindings](https://docs.zephyrproject.org/4.1.0/build/dts/bindings-syntax.html#properties). ### Behavior Source Files (`.c`) @@ -497,8 +497,8 @@ We will review the components from the [behavior source templates](#behavior-sou 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) +- [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) ::: @@ -672,7 +672,7 @@ The API struct's metadata-specific fields are shown below. `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/3.5.0/kernel/drivers/index.html#c.DEVICE_DT_INST_DEFINE). +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). @@ -730,7 +730,7 @@ The **fourth** argument of `BEHAVIOR_DT_INST_DEFINE` can be set to `NULL` instea #### Optional: Configuration pointers The configuration `struct` stores the properties declared from the behavior's `.yaml` for **each new instance** of the behavior. -As seen in the `#define KP_INST(n)` of the hold-tap example, the configuration `struct`, `behavior__config_##n`, for each instance number, `n`, can be initialized using the [Zephyr Devicetree Instance-based APIs](https://docs.zephyrproject.org/3.5.0/build/dts/api/api.html#instance-based-apis), +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` diff --git a/docs/docs/development/usb-logging.mdx b/docs/docs/development/usb-logging.mdx index ad4bb2e475d..ace7aee843d 100644 --- a/docs/docs/development/usb-logging.mdx +++ b/docs/docs/development/usb-logging.mdx @@ -41,7 +41,7 @@ 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/3.5.0/services/logging/index.html). +Logging can be further configured using Kconfig described in [the Zephyr documentation](https://docs.zephyrproject.org/4.1.0/services/logging/index.html). For instance, setting `CONFIG_LOG_PROCESS_THREAD_STARTUP_DELAY_MS` to a large value such as `8000` might help catch issues that happen near keyboard boot, before you can connect to view the logs. @@ -103,7 +103,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/3.5.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/4.1.0/snippets/cdc-acm-console/README.html#requirements) steps. Usually, this just requires ensuring that the USB node has been tagged with the `zephyr_udc0` label, e.g. diff --git a/docs/docs/faq.md b/docs/docs/faq.md index da34f58b323..5abcc30f9b4 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/3.5.0/boards/index.html) many architectures, processors and boards. +- A _single_ platform [supporting](https://docs.zephyrproject.org/4.1.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/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. +- 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. - 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/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._ +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._ ### Does ZMK compile for AVR? diff --git a/docs/docs/features/modules.mdx b/docs/docs/features/modules.mdx index 83fbd9bfe0c..898c294b2e1 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/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: +ZMK makes use of [Zephyr modules](https://docs.zephyrproject.org/4.1.0/develop/modules.html) to include additional source code or configuration files into its build. You can think of them as similar to plugins or themes. The most common uses of this feature are: - Building firmware for a keyboard external to ZMK's tree - Adding functionality to ZMK, such as a driver or a behavior @@ -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/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). +1. Find the URL base (the parent URL) for the module and add it as an entry to the [remotes](https://docs.zephyrproject.org/4.1.0/develop/west/manifest.html#remotes). +2. Add the module as an entry to the [projects](https://docs.zephyrproject.org/4.1.0/develop/west/manifest.html#projects). Aside from the mandatory `name`, `remote`, and the commonly used `revision` properties, take note of the `import` property under `projects`. Some modules may have other modules as dependencies. This property allows the specifying of an additional west manifest file found in the tree of the module, which will automatically import all dependencies. -For more information on `west.yml`, see [West Manifests](https://docs.zephyrproject.org/3.5.0/develop/west/manifest.html). +For more information on `west.yml`, see [West Manifests](https://docs.zephyrproject.org/4.1.0/develop/west/manifest.html). #### Examples diff --git a/docs/docs/features/studio.md b/docs/docs/features/studio.md index 8b9556449a3..84a729a2595 100644 --- a/docs/docs/features/studio.md +++ b/docs/docs/features/studio.md @@ -176,7 +176,7 @@ To allow ZMK Studio to be used with a keyboard, the keyboard will need to have a - 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/3.5.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/4.1.0/snippets/cdc-acm-console/README.html). Firmware with ZMK Studio enabled require significantly more RAM. Some MCUs, such as the STM32F072 series, will require fine tuning of various settings in order to reduce the RAM consumption enough for a Studio enabled build to fit. diff --git a/docs/docs/intro.mdx b/docs/docs/intro.mdx index 714d2bf36e5..f73e5b696f2 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/3.5.0/boards/index.html) | ✅ | +| [Support for a Wide Range of 32-bit Microcontrollers](https://docs.zephyrproject.org/4.1.0/boards/index.html) | ✅ | | Support for AVR/8-bit Chips | ❌ | diff --git a/docs/docs/keymaps/input-processors/behaviors.md b/docs/docs/keymaps/input-processors/behaviors.md index a6244ed377c..9bda1dfadb8 100644 --- a/docs/docs/keymaps/input-processors/behaviors.md +++ b/docs/docs/keymaps/input-processors/behaviors.md @@ -76,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/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. +- `type` - The [type](https://github.com/zmkfirmware/zephyr/blob/v4.1.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L25) of events to scale. Usually, this is `INPUT_EV_KEY` for key/button events. The default value if omitted is `INPUT_EV_KEY`. +- `codes` - The specific codes of the given type to capture, e.g. [button event codes](https://github.com/zmkfirmware/zephyr/blob/v4.1.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L188). This list must be the same length as the `bindings` property. - `bindings` - The bindings to trigger when an event with the corresponding code is processed. diff --git a/docs/docs/keymaps/input-processors/code-mapper.md b/docs/docs/keymaps/input-processors/code-mapper.md index 62201ab4075..05e0bc847ca 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/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. +- `type` - The [type](https://github.com/zmkfirmware/zephyr/blob/v4.1.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L25) of events to scale. Usually, this is `INPUT_EV_REL` for relative events and `INPUT_EV_KEY` for key/button events. +- `map` - The specific codes of the given type to map, e.g. [relative event codes](https://github.com/zmkfirmware/zephyr/blob/v4.1.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L258). This list must be an even number of entries which is processed as a list of pairs of codes. The first code in the pair is the source code, and the second is the code to map it to. diff --git a/docs/docs/keymaps/input-processors/scaler.md b/docs/docs/keymaps/input-processors/scaler.md index fe6c6714289..2d0a30cfe5e 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/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) +- `type` - The [type](https://github.com/zmkfirmware/zephyr/blob/v4.1.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L25) of events to scale. Usually, this is `INPUT_EV_REL` for relative events. +- `codes` - The specific codes within the given type to scale, e.g. [relative event codes](https://github.com/zmkfirmware/zephyr/blob/v4.1.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L258) diff --git a/docs/docs/keymaps/input-processors/transformer.md b/docs/docs/keymaps/input-processors/transformer.md index 1c4a531ec10..65feb920294 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/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) +- `type` - The [type](https://github.com/zmkfirmware/zephyr/blob/v4.1.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L25) of events to transform. Usually, this is `INPUT_EV_REL` for relative events. +- `x-codes` - The specific X codes within the given type to transform, e.g. [relative event codes](https://github.com/zmkfirmware/zephyr/blob/v4.1.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L258) +- `y-codes` - The specific Y codes within the given type to transform, e.g. [relative event codes](https://github.com/zmkfirmware/zephyr/blob/v4.1.0%2Bzmk-fixes/include/zephyr/dt-bindings/input/input-event-codes.h#L258) diff --git a/docs/docs/troubleshooting/building-issues.md b/docs/docs/troubleshooting/building-issues.md index 13b861b10f9..dbff820ebdf 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/3.5.0/build/zephyr_cmake_package.html). +For more information, see [Zephyr's CMake Package](https://docs.zephyrproject.org/4.1.0/build/zephyr_cmake_package.html). ## West Build Errors diff --git a/docs/docs/troubleshooting/connection-issues.mdx b/docs/docs/troubleshooting/connection-issues.mdx index 1d102d96d73..b487289c5a4 100644 --- a/docs/docs/troubleshooting/connection-issues.mdx +++ b/docs/docs/troubleshooting/connection-issues.mdx @@ -77,7 +77,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/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. +- Disabling PHY 2Mbps ([`CONFIG_BT_CTLR_PHY_2M=n`](https://docs.zephyrproject.org/4.1.0/kconfig.html#CONFIG_BT_CTLR_PHY_2M)) helps to pair and connect for certain wireless chipset firmware versions, particularly on Windows (Realtek and Intel chips) and older Intel Macs with Broadcom chipsets. - Enabling passkey entry ([`CONFIG_ZMK_BLE_PASSKEY_ENTRY=y`](../config/bluetooth.md)) helps for certain Windows computers (work-managed ones in particular). This may also manifest in not sending keystrokes. ### Issues With Dual Boot Setups @@ -95,7 +95,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/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. +Other microcontrollers may have similar configuration options [found in the Zephyr documentation](https://docs.zephyrproject.org/4.1.0/search.html?q=CONFIG_CLOCK_CONTROL&check_keywords=yes&area=default). Do note that not all microcontrollers allow for the use of an internal oscillator, though. ## Issues While Connected @@ -107,7 +107,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/3.5.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/4.1.0/kconfig.html#CONFIG_BT_CTLR_TX_PWR) :::info This setting can also improve the connection strength between the keyboard halves for split keyboards. diff --git a/docs/sidebars.js b/docs/sidebars.js index 0a20a29e867..06bf9fb1268 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -157,6 +157,22 @@ module.exports = { "development/hardware-integration/soft-off-setup", "development/hardware-integration/pointing", "development/hardware-integration/battery", + { + type: "category", + label: "Bootloader", + link: { + type: "doc", + id: "development/hardware-integration/bootloader/index", + }, + collapsed: true, + items: [ + "development/hardware-integration/bootloader/adafruit-nrf52", + "development/hardware-integration/bootloader/tinyuf2", + "development/hardware-integration/bootloader/samd21-uf2", + "development/hardware-integration/bootloader/rp2", + "development/hardware-integration/bootloader/stm32", + ], + }, { type: "category", label: "Lighting", diff --git a/schema/hardware-metadata.schema.json b/schema/hardware-metadata.schema.json index e574ca8c735..85ba0c93bac 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", From 779c9876d1b252fea59159e02e355f1a4ab551be Mon Sep 17 00:00:00 2001 From: Pete Johanson Date: Tue, 9 Dec 2025 17:49:10 -0700 Subject: [PATCH 42/96] docs: Move the Zephyr 4.1 blog post to a specific pinned date (#3131) Avoid shifting URLs by pinning to the actual post date. --- docs/blog/{2025-xx-xx-zephyr-4-1.md => 2025-12-09-zephyr-4-1.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/blog/{2025-xx-xx-zephyr-4-1.md => 2025-12-09-zephyr-4-1.md} (100%) diff --git a/docs/blog/2025-xx-xx-zephyr-4-1.md b/docs/blog/2025-12-09-zephyr-4-1.md similarity index 100% rename from docs/blog/2025-xx-xx-zephyr-4-1.md rename to docs/blog/2025-12-09-zephyr-4-1.md From 3c0f0af94706e5049dc85dc8cd8fd17ff3b45fce Mon Sep 17 00:00:00 2001 From: Nicolas Munnich <98408764+nmunnich@users.noreply.github.com> Date: Wed, 10 Dec 2025 08:45:08 +0000 Subject: [PATCH 43/96] chore(tests): Write test builds to logfile (#3125) * tempfile necessary because running build command makes directory pristine, interfering with the build log being written. * Should be automatically picked up by the artifacts in CI tests --- app/run-test.sh | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/app/run-test.sh b/app/run-test.sh index e22adff1b4a..61563d0843b 100755 --- a/app/run-test.sh +++ b/app/run-test.sh @@ -8,7 +8,6 @@ # 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) @@ -42,16 +41,16 @@ build_cmd="west build ${ZMK_SRC_DIR:+-s $ZMK_SRC_DIR} -d ${ZMK_BUILD_DIR}/tests/ -b native_sim/native/64 -p -- -DCONFIG_ASSERT=y -DZMK_CONFIG="$(realpath $path)" \ ${ZMK_EXTRA_MODULES:+-DZMK_EXTRA_MODULES="$(realpath ${ZMK_EXTRA_MODULES})"}" -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 [ $? -gt 0 ]; then - echo "FAILED: $testcase did not build" | tee -a ${ZMK_BUILD_DIR}/tests/pass-fail.log +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 exit 1 fi From 958fa788067e18c2228d016fcd826000bb8f0320 Mon Sep 17 00:00:00 2001 From: Jakob Linke <36006+schuay@users.noreply.github.com> Date: Wed, 10 Dec 2025 09:49:34 +0100 Subject: [PATCH 44/96] fix(behaviors): correctly handle sensor rotation remainder (#3084) The original condition was always true, this commit fixes the condition to correctly handle the remainder for sensor rotation behaviors by using abs(). Co-authored-by: schuay --- app/src/behaviors/behavior_sensor_rotate_common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/behaviors/behavior_sensor_rotate_common.c b/app/src/behaviors/behavior_sensor_rotate_common.c index 278f1cb2be7..724612865e8 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 (remainder.val2 >= 1000000 || remainder.val2 <= 1000000) { + if (abs(remainder.val2) >= 1000000) { remainder.val1 += remainder.val2 / 1000000; remainder.val2 %= 1000000; } From fed2cf69da6de3f6a9a60bdef671da2abd648cdd Mon Sep 17 00:00:00 2001 From: carrefinho Date: Fri, 12 Dec 2025 00:08:03 -0500 Subject: [PATCH 45/96] blog: Clarify west upgrade command in Zephyr 4.1 update post (#3133) --- docs/blog/2025-12-09-zephyr-4-1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/blog/2025-12-09-zephyr-4-1.md b/docs/blog/2025-12-09-zephyr-4-1.md index 9d57f35b11b..13c81e40eb1 100644 --- a/docs/blog/2025-12-09-zephyr-4-1.md +++ b/docs/blog/2025-12-09-zephyr-4-1.md @@ -115,7 +115,7 @@ Once the container has rebuilt, VS Code will be running the 4.1 Docker image. 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 --user --update west`. +- 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 From c0990410da4c0a0c3776448e8c05ca2ce8778c8a Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 13 Dec 2025 17:37:14 -0600 Subject: [PATCH 46/96] fix: Add "optional" folder to .gitignore (#3141) Zephyr now has some modules that get placed under /optional/modules instead of /modules. Added that to .gitignore so Git doesn't try to treat those like Git modules. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 1ef282a9f82..50b8f687e94 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ /.west /bootloader /modules +/optional /tools /zephyr /zmk-config From 90b3ad2c9ec899fe2a76ca6d7fd83cd75a61baf2 Mon Sep 17 00:00:00 2001 From: carrefinho Date: Sat, 13 Dec 2025 23:38:58 -0500 Subject: [PATCH 47/96] blog: Merge duplicate "Getting The Changes" sections in Zephyr 4.1 post (#3142) --- docs/blog/2025-12-09-zephyr-4-1.md | 73 ++++++++++-------------------- 1 file changed, 23 insertions(+), 50 deletions(-) diff --git a/docs/blog/2025-12-09-zephyr-4-1.md b/docs/blog/2025-12-09-zephyr-4-1.md index 13c81e40eb1..758144df172 100644 --- a/docs/blog/2025-12-09-zephyr-4-1.md +++ b/docs/blog/2025-12-09-zephyr-4-1.md @@ -28,31 +28,38 @@ For all users, except those willing to accept periodic breaks they need to track ## Getting The Changes -Since the changes are merged to ZMK `main`, you'll need to be using that version of ZMK to use/tests these changes. +### User Config Repositories Using GitHub Actions -### Local Development +Existing user repositories that have `revision: main` in their `west.yml` will receive the changes automatically when rebuilding. -To get the update, first pull the latest ZMK `main`: +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. -``` -git checkout main && git pull main -``` +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. -Once you have the updated ZMK code, update the referenced modules: +### VS Code & Docker (Dev Container) -``` -west update -``` +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. -To be sure you've got all the updated Python packages needed to build ZMK, use west again: +Once the container has rebuilt, VS Code will be running the 4.1 Docker image. -``` -west packages pip --install -``` +### Local Host Development -### GitHub Actions Builds +The following steps will get you building ZMK locally against Zephyr 4.1: -To test these changes, you need to verify that the `west.yml` for your build is using a `revision: main` property. Once this is verified, simply run a new build and the updated Zephyr version will be used. +- 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! ## Board Revisions @@ -87,40 +94,6 @@ As part of this change, ZMK is now using board/shield revisions, rather than dup 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. -## Getting The Changes - -### User Config Repositories Using GitHub Actions - -Existing user repositories which are currently running ZMK's `main` branch 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 - -From there, you should be ready to build as normal! - ## 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. From 8af2f130a883f219df3c88773dbeb67e91d55356 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sat, 13 Dec 2025 23:15:54 -0800 Subject: [PATCH 48/96] docs: Update Corne-ish Zen mentions for Zephyr 4.1 upgrade renames (#3143) * docs: Fix mentions of Corne-ish Zen for HWMv2 change * blog: Add Corne-ish Zen to renamed boards in Zephyr 4.1 --- docs/blog/2025-12-09-zephyr-4-1.md | 5 +++++ docs/docs/troubleshooting/building-issues.md | 7 ++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/docs/blog/2025-12-09-zephyr-4-1.md b/docs/blog/2025-12-09-zephyr-4-1.md index 758144df172..6a6773465b4 100644 --- a/docs/blog/2025-12-09-zephyr-4-1.md +++ b/docs/blog/2025-12-09-zephyr-4-1.md @@ -91,6 +91,11 @@ As part of this change, ZMK is now using board/shield revisions, rather than dup - `bdn9_rev2` -> `bdn9` - Ferris Rev2 (`ferris`) - `ferris_rev02` -> `ferris@2.0.0` (short: `ferris`) +- Corne-ish Zen (`corneish_zen`) + - `corneish_zen_v2_left` -> `corneish_zen_left@2.0.0` (short: `corneish_zen_left`) + - `corneish_zen_v2_right` -> `corneish_zen_right@2.0.0` (short: `corneish_zen_right`) + - `corneish_zen_v1_left` -> `corneish_zen_left@1.0.0` (short: `corneish_zen_left@1`) + - `corneish_zen_v1_right` -> `corneish_zen_right@1.0.0` (short: `corneish_zen_right@1`) 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. diff --git a/docs/docs/troubleshooting/building-issues.md b/docs/docs/troubleshooting/building-issues.md index dbff820ebdf..fb256ef8d66 100644 --- a/docs/docs/troubleshooting/building-issues.md +++ b/docs/docs/troubleshooting/building-issues.md @@ -77,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_v2_left -- -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_left@2 -- -DZMK_CONFIG=/tmp/zmk-config/config -DZMK_EXTRA_MODULES=/__w/zmk-config/zmk-config ... -- ZMK Config Kconfig: /tmp/zmk-config/config/corneish_zen.conf ... @@ -98,9 +98,10 @@ 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_v2_left -- -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_left@2 -- -DZMK_CONFIG=/tmp/zmk-config/config -DZMK_EXTRA_MODULES=/__w/zmk-config/zmk-config ... --- Found BOARD.dts: /tmp/zmk-config/zmk/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts +-- Found BOARD.dts: /tmp/zmk-config/zmk/app/boards/lowprokb/corneish_zen/corneish_zen_left.dts +-- Found devicetree overlay: /tmp/zmk-config/zmk/app/boards/lowprokb/corneish_zen/corneish_zen_left_2_0_0.overlay -- Found devicetree overlay: /tmp/zmk-config/config/corneish_zen.keymap ... ``` From cb6ecc17748497ca43ab7b0f3e3f6d26642c208b Mon Sep 17 00:00:00 2001 From: Nicolas Munnich <98408764+nmunnich@users.noreply.github.com> Date: Sun, 14 Dec 2025 20:57:24 +0000 Subject: [PATCH 49/96] docs: Remove references to nice_nano_v2, seeeduino_xiao_ble and nrfmicro_13 (#3135) --- docs/docs/config/system.md | 4 ++-- docs/docs/customization.md | 8 ++++---- docs/docs/development/hardware-integration/dongle.mdx | 6 +++--- .../hardware-integration/hardware-metadata-files.md | 2 +- .../hardware-integration/lighting/underglow.md | 2 +- docs/docs/development/hardware-integration/pinctrl.mdx | 1 - docs/docs/development/local-toolchain/build-flash.mdx | 10 +++++----- docs/docs/development/usb-logging.mdx | 4 ++-- docs/docs/features/studio.md | 6 +++--- docs/docs/troubleshooting/connection-issues.mdx | 6 +++--- docs/docs/troubleshooting/hardware-issues.mdx | 4 ++-- 11 files changed, 26 insertions(+), 27 deletions(-) diff --git a/docs/docs/config/system.md b/docs/docs/config/system.md index fbbbaaa8d2f..36b29da7252 100644 --- a/docs/docs/config/system.md +++ b/docs/docs/config/system.md @@ -144,7 +144,7 @@ Re-flashing a bootloader built without the SoftDevice will require firmware buil Enable snippets by adding `snippet: ` to your `build.yaml` for the appropriate board: ```yaml -- board: nrfmicro_13_52833 +- board: nrfmicro@1.3.0/nrf52833 snippet: nrf52833-nosd shield: corne_left ``` @@ -152,7 +152,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_13_52833 -S nrf52833-nosd -- -DSHIELD=corne_left +west build -b nrfmicro@1.3.0/nrf52833 -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 aacbe00e79f..e2fc2c7b4d9 100644 --- a/docs/docs/customization.md +++ b/docs/docs/customization.md @@ -58,13 +58,13 @@ You can build additional keyboards with GitHub actions by appending them to `bui ```yaml include: - - board: nice_nano + - board: nice_nano@1 shield: corne_left - - board: nice_nano + - board: nice_nano@1 shield: corne_right - - board: nice_nano_v2 + - board: nice_nano shield: lily58_left - - board: nice_nano_v2 + - board: nice_nano shield: lily58_right ``` diff --git a/docs/docs/development/hardware-integration/dongle.mdx b/docs/docs/development/hardware-integration/dongle.mdx index 776b698af6d..543c66e19c8 100644 --- a/docs/docs/development/hardware-integration/dongle.mdx +++ b/docs/docs/development/hardware-integration/dongle.mdx @@ -289,12 +289,12 @@ include: # Your other keyboard parts here # ----------------------------------------- # Change the board appropriately, you can use any board - - board: nice_nano_v2 + - board: nice_nano shield: my_keyboard_dongle - - board: nice_nano_v2 + - board: nice_nano shield: settings_reset # Add these cmake-args to the peripherals you wish to use with the dongle - - board: nice_nano_v2 + - board: nice_nano shield: my_keyboard cmake-args: -DCONFIG_ZMK_SPLIT=y -DCONFIG_ZMK_SPLIT_ROLE_CENTRAL=n ``` diff --git a/docs/docs/development/hardware-integration/hardware-metadata-files.md b/docs/docs/development/hardware-integration/hardware-metadata-files.md index 13f51b55d0b..6a3c5a3301e 100644 --- a/docs/docs/development/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_11.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_nrf52840.zmk.yml`. ## Example File diff --git a/docs/docs/development/hardware-integration/lighting/underglow.md b/docs/docs/development/hardware-integration/lighting/underglow.md index 93fe64a7aea..d0d14a85439 100644 --- a/docs/docs/development/hardware-integration/lighting/underglow.md +++ b/docs/docs/development/hardware-integration/lighting/underglow.md @@ -11,7 +11,7 @@ See the documentation page on [pin control](../pinctrl.mdx) for detailed informa Shields written for boards which support RGB underglow should add a `boards/` folder underneath the shield folder. Inside this `boards/` folder, create a `.overlay` for any of the boards the shield can be used with. Place all hardware-specific configurations in these `.overlay` files. -For example: the `kyria` shield has a [`boards/nice_nano_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. +For example: the `kyria` shield has a [`boards/nice_nano.overlay`](https://github.com/zmkfirmware/zmk/blob/main/app/boards/shields/kyria/boards/nice_nano.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` and `nrfmicro_13` boards respectively. ### nRF52-Based Boards diff --git a/docs/docs/development/hardware-integration/pinctrl.mdx b/docs/docs/development/hardware-integration/pinctrl.mdx index 7722dbd0cd1..edd882d9b3f 100644 --- a/docs/docs/development/hardware-integration/pinctrl.mdx +++ b/docs/docs/development/hardware-integration/pinctrl.mdx @@ -28,7 +28,6 @@ Pin control is always defined for a _board_, never for a shield: boards/shields/sofle/ ├── boards/ │ ├── nice_nano.overlay - │ ├── nice_nano_v2.overlay │ ├── nrfmicro_11.overlay │ └── nrfmicro_13.overlay └── diff --git a/docs/docs/development/local-toolchain/build-flash.mdx b/docs/docs/development/local-toolchain/build-flash.mdx index 24c00bc96cf..561c59aef39 100644 --- a/docs/docs/development/local-toolchain/build-flash.mdx +++ b/docs/docs/development/local-toolchain/build-flash.mdx @@ -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_v2 -- -DSHIELD=kyria_left +west build -p -b nice_nano -- -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_v2 -- -DSHIELD=kyria_left +west build -d build/left -b nice_nano -- -DSHIELD=kyria_left ``` and then building right into `build/right`: ```sh -west build -d build/right -b nice_nano_v2 -- -DSHIELD=kyria_right +west build -d build/right -b nice_nano -- -DSHIELD=kyria_right ``` This produces `left` and `right` subfolders under the `build` directory and two separate .uf2 files. For future work on a specific half, use the `-d` parameter again to ensure you are building into the correct location. @@ -148,13 +148,13 @@ 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_v2 -- -DSHIELD=vendor_shield -DZMK_EXTRA_MODULES="C:/Users/myUser/Documents/my-vendor-keebs-module" +west build -b nice_nano -- -DSHIELD=vendor_shield -DZMK_EXTRA_MODULES="C:/Users/myUser/Documents/my-vendor-keebs-module" ``` When adding multiple modules, make sure they are separated by a semicolon, e.g.: ``` -west build -b nice_nano_v2 -- -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 -- -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 diff --git a/docs/docs/development/usb-logging.mdx b/docs/docs/development/usb-logging.mdx index ace7aee843d..5a9fc868ead 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_v2 + - board: nice_nano shield: corne_left snippet: zmk-usb-logging ``` @@ -36,7 +36,7 @@ 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_v2 -S zmk-usb-logging -- -DSHIELD="corne_left" +west build -b nice_nano -S zmk-usb-logging -- -DSHIELD="corne_left" ``` ### Additional Config diff --git a/docs/docs/features/studio.md b/docs/docs/features/studio.md index 84a729a2595..8cca1fb81e0 100644 --- a/docs/docs/features/studio.md +++ b/docs/docs/features/studio.md @@ -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_v2 + - board: nice_nano shield: corne_left snippet: studio-rpc-usb-uart cmake-args: -DCONFIG_ZMK_STUDIO=y - - board: nice_nano_v2 + - board: nice_nano 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_v2 \ +west build -d build/cl_studio -b nice_nano \ -S studio-rpc-usb-uart -- -DSHIELD=corne_left -DCONFIG_ZMK_STUDIO=y ``` diff --git a/docs/docs/troubleshooting/connection-issues.mdx b/docs/docs/troubleshooting/connection-issues.mdx index b487289c5a4..83cdd478a60 100644 --- a/docs/docs/troubleshooting/connection-issues.mdx +++ b/docs/docs/troubleshooting/connection-issues.mdx @@ -30,11 +30,11 @@ If you are using GitHub Actions to build your firmware as described in the [user ```yml include: - - board: nice_nano_v2 + - board: nice_nano shield: corne_left - - board: nice_nano_v2 + - board: nice_nano shield: corne_right - - board: nice_nano_v2 + - board: nice_nano shield: settings_reset ``` diff --git a/docs/docs/troubleshooting/hardware-issues.mdx b/docs/docs/troubleshooting/hardware-issues.mdx index 9890b6d0356..7cf49d7febf 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_v2 # Replace with the Pro Micro-compatible board you're using + - board: nice_nano # Replace with the Pro Micro-compatible board you're using shield: tester_pro_micro ``` @@ -89,7 +89,7 @@ include: # ------------------- # Your keyboards here # ------------------- - - board: seeeduino_xiao_ble # Replace with the Xiao-compatible board you're using + - board: xiao_ble # Replace with the Xiao-compatible board you're using shield: tester_xiao ``` From 8987f3979d7877114ede2f34edb5570a6b454460 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 14 Dec 2025 15:39:39 -0600 Subject: [PATCH 50/96] fix: Fix redundant const warning (#3139) Fixed a build warning about "const" being used twice. --- app/src/physical_layouts.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/src/physical_layouts.c b/app/src/physical_layouts.c index 15268b94196..31a8ac05741 100644 --- a/app/src/physical_layouts.c +++ b/app/src/physical_layouts.c @@ -72,12 +72,11 @@ BUILD_ASSERT( 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/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)] = { \ + static const struct zmk_key_physical_attrs _CONCAT(_zmk_physical_layout_keys_, \ + n)[DT_INST_PROP_LEN_OR(n, keys, 0)] = { \ LISTIFY(DT_INST_PROP_LEN_OR(n, keys, 0), ZKPA_INIT, (, ), n)}; \ ZMK_MATRIX_TRANSFORM_EXTERN(DT_INST_PHANDLE(n, transform)); \ - static const struct zmk_physical_layout const _CONCAT(_zmk_physical_layout_, \ - DT_DRV_INST(n)) = { \ + static const struct zmk_physical_layout _CONCAT(_zmk_physical_layout_, DT_DRV_INST(n)) = { \ .display_name = DT_INST_PROP_OR(n, display_name, "Layout #" #n), \ .matrix_transform = ZMK_MATRIX_TRANSFORM_T_FOR_NODE(DT_INST_PHANDLE(n, transform)), \ .keys = _CONCAT(_zmk_physical_layout_keys_, n), \ From 930b5cc058698986fabc1be96427c14937e983ea Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 14 Dec 2025 16:20:35 -0600 Subject: [PATCH 51/96] docs: Replace user setup script with ZMK CLI (#3137) This deletes the Bash and PowerShell setup scripts in favor of using ZMK CLI. The old setup scripts are broken, since the config repo template uses ZMK version 0.3, while the setup scripts use hardware metadata from the main branch. ZMK CLI doesn't have this issue, because it clones the version of ZMK listed in the config repo to get hardware metadata. Much of the "Installing ZMK" page has been rewritten to give instructions for installing ZMK CLI and using it to create and modify a config repo. The previously-hidden page on ZMK CLI has been added to the sidebar and repurposed into general documentation for the tool. --- docs/docs/user-setup.mdx | 375 +++++++++++++----- docs/docs/{user-setup-cli.mdx => zmk-cli.mdx} | 176 +------- docs/docusaurus.config.js | 1 - docs/package-lock.json | 35 +- docs/sidebars.js | 1 + .../setup-script-generation-plugin/index.js | 70 ---- docs/static/.gitignore | 5 - docs/static/_redirects | 3 +- 8 files changed, 325 insertions(+), 341 deletions(-) rename docs/docs/{user-setup-cli.mdx => zmk-cli.mdx} (53%) delete mode 100644 docs/src/setup-script-generation-plugin/index.js delete mode 100644 docs/static/.gitignore diff --git a/docs/docs/user-setup.mdx b/docs/docs/user-setup.mdx index 7433292e9ad..7d9b05481d8 100644 --- a/docs/docs/user-setup.mdx +++ b/docs/docs/user-setup.mdx @@ -6,14 +6,33 @@ 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 -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. +:::info[Something Isn't Working?] + +If you run into any issues when following these instructions, please [file an issue on GitHub](https://github.com/zmkfirmware/zmk-cli/issues) or [join us on Discord](https://zmk.dev/community/discord/invite) and let us know what went wrong so we can improve ZMK CLI and this guide. + ::: ## Summary @@ -24,170 +43,306 @@ 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. 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. +1. Use ZMK CLI to clone the repo to your computer so you can edit the files. +1. Select a keyboard to use and update the `build.yaml` file so GitHub will build firmware for that keyboard. +1. Add your own `.keymap` and `.conf` files to customize your keymap and enable/disable other ZMK features. +1. Commit and push the updates to trigger a new GitHub Action run to build the firmware. ## Prerequisites -The remainder of this guide assumes the following prerequisites: +You will need to install a few tools before you can get started. + +Many instructions in this guide use commands that need to be run in a terminal application. + +- On Windows, use [Windows Terminal](https://apps.microsoft.com/detail/9n0dx20hk701) or PowerShell. +- On other operating systems, the terminal program is usually just named "Terminal". + +### Install Git -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. +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 gives an error instead, install Git from https://git-scm.com/install/. Close and re-open your terminal and run the `git --version` command again to check if it installed correctly. :::note -If you need to, a quick read of [Learn The Basics Of Git In Under 10 Minutes](https://www.freecodecamp.org/news/learn-the-basics-of-git-in-under-10-minutes-da548267cc91/) will help you get started. +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. ::: -## GitHub Repo +### Set Up a GitHub Account -Before running the setup script, you will first need to create a new GitHub repository to host the config. +You will need a GitHub account. [Create an account](https://github.com/signup) if you don't have one yet. -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" +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: -## User Config Setup Script +#### Authenticate with GitHub CLI + +Install [GitHub CLI](https://cli.github.com/) and run the following command in a terminal. Follow the instructions it gives you, and it will open GitHub in a web browser for you to log in. + +```sh +gh auth login +``` -To start the setup process, run the following from your command line prompt: +#### 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. -```bash -bash -c "$(curl -fsSL https://zmk.dev/setup.sh)" +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 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 Python and pipx + +ZMK CLI requires Python version 3.10 or above. + +There are several ways you can install ZMK CLI, but for simplicity, this guide will use [pipx](https://pipx.pypa.io/stable/). (If you are already familiar with another Python package manager such as [uv](https://github.com/astral-sh/uv), you can install the `zmk` package with it instead, but that will not be covered in this guide.) + +The instructions for installing Python and pipx differ depending on your operating system. + + + + +Python comes preinstalled on most Linux distributions, but pipx needs to be installed separately. In case Python isn't already installed, this guide will have you install both. Pick the commands relevant to the distribution you are using: + +#### Ubuntu 23.04 or above + +```sh +sudo apt update +sudo apt install python3 pipx +pipx ensurepath ``` - - +#### Ubuntu 22.04 + +```sh +sudo apt update +sudo apt install python3 +python3 -m pip install --user pipx +python3 -m pipx ensurepath +``` -```bash -bash -c "$(wget https://zmk.dev/setup.sh -O -)" '' --wget +#### Ubuntu 20.04 + +Ubuntu 20.04 comes with an older version of Python. You can install Python 3.10 from the deadsnakes PPA with the following commands: + +```sh +sudo add-apt-repository ppa:deadsnakes/ppa +sudo apt install python3.10 +python3.10 -m pip install --user pipx +python3.10 -m pipx ensurepath +``` + +You will then need to replace `python3` with `python3.10` in the rest of the installation instructions. + +#### Fedora 35 or above + +```sh +sudo dnf install python3 pipx +pipx ensurepath ``` +If you have an older version of Fedora, you will need to update your operating system to a newer version or [build Python from source](https://docs.python.org/3/using/unix.html#building-python). + +#### Other distributions + +Install Python 3 and pipx using your distribution's package manager. If there is no package for pipx, install it with `pip` after installing Python: + +```sh +python3 -m pip install --user pipx +python3 -m pipx ensurepath +``` + +Check the version of Python you installed: + +```sh +python3 --version +``` + +If this prints a version less than 3.10, you will need to update your operating system to a newer version or [build Python from source](https://docs.python.org/3/using/unix.html#building-python). + - -```powershell -powershell -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://zmk.dev/setup.ps1'))" + + +Open https://www.python.org/downloads/ and select "Download Python install manager". Run the installer, then open a terminal and run the following command to install the latest version of Python 3: + +```sh +py install 3 +``` + +Next, install pipx: + +```sh +py -m pip install --user pipx +py -m pipx ensurepath ``` - -### Keyboard Selection + -When prompted, enter the number for the corresponding keyboard you would like to target: +First, install Homebrew from https://brew.sh/. Next, open a terminal and run: +```sh +brew install pipx +pipx ensurepath ``` -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: + +This should automatically install Python 3 if it is missing. + + + + +### Verify pipx Install + +Close and re-open your terminal, then run: + +```sh +pipx --version ``` -:::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. -::: +It should print a version number. If not, go back to the previous step and make sure you installed pipx correctly. You can also try logging out of your computer and logging back in to make sure any environment variables changes made during installation take effect. -### MCU Board Selection +### Install ZMK CLI -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: +Finally, we'll install ZMK CLI. Open a terminal and run: +```sh +pipx install zmk +zmk --version ``` -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: + +It should print a version number 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. + +## 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" ``` -### Keymap Customization +Then, [skip to the next step](#add-a-keyboard). -At the next prompt, you have an opportunity to decide if you want the stock keymap file copied in -for further customization: +
+ +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 `zmk-config` subfolder 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, you can enter its URL when prompted, for example: ``` -Copy in the stock keymap for customization? [Yn]: +Repository URL: https://github.com/myusername/zmk-config ``` -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`. +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. + +### Add a Keyboard + +To start building firmware for a new keyboard, run the following command: + +```sh +zmk keyboard add +``` + +Follow the instructions to select a keyboard (and controller board if necessary). It will add the keyboard to your repo's `build.yaml` file so GitHub knows to build it, and it will create `config/.keymap` and `config/.conf` files for you to edit. + +
+ My keyboard isn't listed -### 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. + +Run `zmk keyboard add` again, and the new keyboards should appear in the list. + +**Create It Yourself** + +If nobody has created a module for your keyboard yet, or if it is your own custom design, you will need to set it up yourself. Your config repo is already set up as a module, so you can define new keyboards there. See ZMK's [new keyboard shield guide](development/hardware-integration/new-shield.mdx) for more information. + +ZMK CLI can also help generate some of the boilerplate for defining a new keyboard: + +```sh +zmk keyboard new ``` -Only the GitHub username is required; if you are happy with the defaults offered in the square brackets, you can simply hit `Enter`. +
-:::note -If you are using SSH keys for git push, change GitHub Repo field to the SSH scheme, e.g. `git@github.com:petejohanson/zmk-config.git`. -::: +### Edit Your Keymap and Configuration -### Confirming Selections +See the [customizing ZMK](customization.md) documentation for instructions on editing your keymap and configuring ZMK settings. -The setup script will confirm all of your selections one last time, before performing the setup: +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 ``` -Preparing a user config for: -* MCU Board: nice_nano -* Shield: kyria -* GitHub Repo To Push (please create this in GH first!): https://github.com/petejohanson/zmk-config.git -Continue? [Yn]: +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 ``` -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. +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 -:::info +After you've changed your keymap to your liking, you need to commit and push your changes. -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. +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 for the password. (Go back to the [GitHub account setup instructions](#set-up-a-github-account) if you need to create a token.) ::: -## Installing the Firmware +## Install the Firmware ### Download the Archive -Once the setup script is complete and the new user config repository has been pushed, GitHub will automatically run the action -to build your keyboard firmware files. You can view the actions by clicking on the "Actions" tab on your GitHub repository. +Once you push a commit, GitHub will automatically run the action to build your keyboard firmware files. Run the following command to open the GitHub Actions page in your browser: + +```sh +zmk download +``` + +Or, you can manually open your GitHub repository in your browser and click the "Actions" tab at the top. ![](./assets/user-setup/github-actions-link.png) @@ -196,13 +351,13 @@ a link to download the `firmware` upload: ![](./assets/user-setup/firmware-archive.png) -Once downloaded, extract the zip and you can verify it should contain one or more `uf2` files, which will be copied to -your keyboard. +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 -### Flashing 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. -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. +First, put your keyboard into bootloader mode by double clicking the reset button (either on the MCU board itself, or the one that is part of your keyboard). The controller should appear in your OS as a new USB storage device. Once this happens, copy the correct UF2 file (e.g. left or right if working on a split), and paste it onto the root of that USB mass storage device. Once the flash is complete, the controller should unmount the USB storage, automatically restart and load your newly @@ -218,6 +373,12 @@ 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. diff --git a/docs/docs/user-setup-cli.mdx b/docs/docs/zmk-cli.mdx similarity index 53% rename from docs/docs/user-setup-cli.mdx rename to docs/docs/zmk-cli.mdx index d486d7635a6..c94bc16a6c0 100644 --- a/docs/docs/user-setup-cli.mdx +++ b/docs/docs/zmk-cli.mdx @@ -1,167 +1,24 @@ --- -title: (EXPERIMENTAL) Installing ZMK -sidebar_label: (EXPERIMENTAL) Installing ZMK +title: ZMK CLI +sidebar_label: ZMK CLI --- -This is an **experimental** command line program to help set up ZMK. [Click here to return to the main documentation](user-setup.mdx). +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. -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. +See the [ZMK installation guide](user-setup.mdx#prerequisites) for instructions on installing ZMK CLI. -The instructions below contain commands that need to be run in a terminal program. On 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". - -:::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. -::: - -## Installation - -### Preliminaries - -#### Make sure you have Git installed - -The below commands should print a version number if the program is installed. - -```sh -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. +## Using ZMK CLI -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. +The instructions below contain commands that need to be run in a terminal program. -## Using ZMK CLI +- On Windows, use [Windows Terminal](https://apps.microsoft.com/detail/9n0dx20hk701) or PowerShell. +- On other operating systems, the terminal program is usually just named "Terminal". 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 -:::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. +The `zmk init` command walks you through creating a GitHub repository, then clones it to your computer so you can edit it. See the [ZMK installation guide](user-setup.mdx#config-repo-setup) for more details on this command. ### Keyboard Management @@ -194,12 +51,19 @@ This won't walk you through all of the details of adding support for a new keybo [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 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 add # Add a module given the URL of the repo +zmk module remove # Remove an installed module +zmk module list # List the installed modules +zmk update # Update the local copies of ZMK and modules to their latest versions ``` +:::note + +ZMK CLI stores a copy of ZMK and any modules in a `.zmk` folder so it can read board and shield information from them. This folder is only used by ZMK CLI and is not necessary for building firmware, therefore ZMK CLI will automatically add it to your repo's `.gitignore` file. + +::: + ### Edit Keymap and Config Files The `zmk code` command will open ZMK files in a text editor: diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index babf8c6e3a9..54fe391a47f 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -49,7 +49,6 @@ module.exports = { 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: { diff --git a/docs/package-lock.json b/docs/package-lock.json index 734ebcd34be..e28c76ce5d3 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -255,6 +255,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.39.0.tgz", "integrity": "sha512-/IYpF10BpthGZEJQZMhMqV4AqWr5avcWfZm/SIKK1RvUDmzGqLoW/+xeJVX9C8ZnNkIC8hivbIQFaNaRw0BFZQ==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.39.0", "@algolia/requester-browser-xhr": "5.39.0", @@ -420,6 +421,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -2257,6 +2259,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -2279,6 +2282,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -2388,6 +2392,7 @@ "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", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -2809,6 +2814,7 @@ "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", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3672,6 +3678,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.1.tgz", "integrity": "sha512-DyLk9BIA6I9gPIuia8XIL+XIEbNnExam6AHzRsfrEq4zJr7k/DsWW7oi4aJMepDnL7jMRhpVcdsCxdjb0/A9xg==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/core": "3.9.1", "@docusaurus/logger": "3.9.1", @@ -4307,6 +4314,7 @@ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.2.tgz", "integrity": "sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==", "license": "MIT", + "peer": true, "dependencies": { "@fortawesome/fontawesome-common-types": "6.7.2" }, @@ -4752,6 +4760,7 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.0.tgz", "integrity": "sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -5401,6 +5410,7 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -6095,6 +6105,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -6276,6 +6287,7 @@ "integrity": "sha512-H+vqmWwT5xoNrXqWs/fesmssOW70gxFlgcMlYcBaWNPIEWDgLa4W9nkSPmhuOgLnXq9QYgkZ31fhDyLhleCsAg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.30.1", "@typescript-eslint/types": "8.30.1", @@ -6681,6 +6693,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -6754,6 +6767,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -6818,6 +6832,7 @@ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.39.0.tgz", "integrity": "sha512-DzTfhUxzg9QBNGzU/0kZkxEV72TeA4MmPJ7RVfLnQwHNhhliPo7ynglEWJS791rNlLFoTyrKvkapwr/P3EXV9A==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/abtesting": "1.5.0", "@algolia/client-abtesting": "5.39.0", @@ -7455,6 +7470,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.3", "caniuse-lite": "^1.0.30001741", @@ -7754,6 +7770,7 @@ "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@chevrotain/cst-dts-gen": "11.0.3", "@chevrotain/gast": "11.0.3", @@ -8477,6 +8494,7 @@ "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", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -8796,6 +8814,7 @@ "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.32.0.tgz", "integrity": "sha512-5JHBC9n75kz5851jeklCPmZWcg3hUe6sjqJvyk3+hVqFaKcHwHgxsjeN1yLmggoUc6STbtm9/NQyabQehfjvWQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10" } @@ -9205,6 +9224,7 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -10127,6 +10147,7 @@ "integrity": "sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", @@ -17151,6 +17172,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -18054,6 +18076,7 @@ "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", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -18942,6 +18965,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -18976,6 +19000,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -19032,6 +19057,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/react": "*" }, @@ -19060,6 +19086,7 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -19968,6 +19995,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -21288,6 +21316,7 @@ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -21433,7 +21462,8 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/type-check": { "version": "0.4.0", @@ -21594,6 +21624,7 @@ "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -22551,6 +22582,7 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -23325,6 +23357,7 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.11.tgz", "integrity": "sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/docs/sidebars.js b/docs/sidebars.js index 06bf9fb1268..af818d04f76 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -13,6 +13,7 @@ module.exports = { "faq", "user-setup", "customization", + "zmk-cli", { type: "category", label: "Troubleshooting", diff --git a/docs/src/setup-script-generation-plugin/index.js b/docs/src/setup-script-generation-plugin/index.js deleted file mode 100644 index 87e77141a93..00000000000 --- a/docs/src/setup-script-generation-plugin/index.js +++ /dev/null @@ -1,70 +0,0 @@ -/* - * 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/static/.gitignore b/docs/static/.gitignore deleted file mode 100644 index fc7d2745100..00000000000 --- a/docs/static/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ - -# Ignore generated setup script - -setup.ps1 -setup.sh diff --git a/docs/static/_redirects b/docs/static/_redirects index b73cf170e2b..c2e58decb9e 100644 --- a/docs/static/_redirects +++ b/docs/static/_redirects @@ -22,4 +22,5 @@ /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/development/hardware-integration/physical-layouts 301 -/docs/keymaps/behaviors/mod-tap /docs/keymaps/behaviors/hold-tap#mod-tap \ No newline at end of file +/docs/keymaps/behaviors/mod-tap /docs/keymaps/behaviors/hold-tap#mod-tap +/docs/user-setup-cli /docs/user-setup 301 From 0e05ee73b7ba324a33382a1d799a7ef686802be4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Dec 2025 21:16:53 +0100 Subject: [PATCH 52/96] chore(deps): bump node-forge from 1.3.1 to 1.3.2 in /docs (#3123) Bumps [node-forge](https://github.com/digitalbazaar/forge) from 1.3.1 to 1.3.2. - [Changelog](https://github.com/digitalbazaar/forge/blob/main/CHANGELOG.md) - [Commits](https://github.com/digitalbazaar/forge/compare/v1.3.1...v1.3.2) --- updated-dependencies: - dependency-name: node-forge dependency-version: 1.3.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index e28c76ce5d3..4ffa9e9504e 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -16202,9 +16202,9 @@ } }, "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==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.2.tgz", + "integrity": "sha512-6xKiQ+cph9KImrRh0VsjH2d8/GXA4FIMlgU4B757iI1ApvcyA9VlouP0yZJha01V+huImO+kKMU7ih+2+E14fw==", "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" From 7b31fb83c0b5abda65200be10570cde5acd4e981 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Dec 2025 21:18:04 +0100 Subject: [PATCH 53/96] chore(deps): bump js-yaml from 4.1.0 to 4.1.1 in /docs (#3113) Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 4.1.0 to 4.1.1. - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/4.1.0...4.1.1) --- updated-dependencies: - dependency-name: js-yaml dependency-version: 4.1.1 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/package-lock.json | 8 ++++---- docs/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 4ffa9e9504e..392904b8a02 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -16,7 +16,7 @@ "@fortawesome/react-fontawesome": "^0.2.0", "@mdx-js/react": "^3.1.0", "classnames": "^2.2.6", - "js-yaml": "^4.1.0", + "js-yaml": "^4.1.1", "react": "^18.0.0", "react-async": "^10.0.1", "react-copy-to-clipboard": "^5.0.3", @@ -13172,9 +13172,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "license": "MIT", "dependencies": { "argparse": "^2.0.1" diff --git a/docs/package.json b/docs/package.json index 06378ef22f6..263b41eb29b 100644 --- a/docs/package.json +++ b/docs/package.json @@ -23,7 +23,7 @@ "@fortawesome/react-fontawesome": "^0.2.0", "@mdx-js/react": "^3.1.0", "classnames": "^2.2.6", - "js-yaml": "^4.1.0", + "js-yaml": "^4.1.1", "react": "^18.0.0", "react-async": "^10.0.1", "react-copy-to-clipboard": "^5.0.3", From ce8d9a36274478c3475b629466a4c7bdef07b2ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Dec 2025 22:38:34 +0100 Subject: [PATCH 54/96] chore(deps): bump mdast-util-to-hast from 13.2.0 to 13.2.1 in /docs (#3146) Bumps [mdast-util-to-hast](https://github.com/syntax-tree/mdast-util-to-hast) from 13.2.0 to 13.2.1. - [Release notes](https://github.com/syntax-tree/mdast-util-to-hast/releases) - [Commits](https://github.com/syntax-tree/mdast-util-to-hast/compare/13.2.0...13.2.1) --- updated-dependencies: - dependency-name: mdast-util-to-hast dependency-version: 13.2.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 392904b8a02..25b9b6ba3c8 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -13992,9 +13992,9 @@ } }, "node_modules/mdast-util-to-hast": { - "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==", + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", From c64bda4160a9efd207d6e3d89939a2e72ab169b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Dec 2025 00:06:59 +0100 Subject: [PATCH 55/96] chore(deps-dev): bump the development group across 1 directory with 12 updates (#3099) Bumps the development group with 12 updates in the /docs directory: | Package | From | To | | --- | --- | --- | | [@docusaurus/module-type-aliases](https://github.com/facebook/docusaurus/tree/HEAD/packages/docusaurus-module-type-aliases) | `3.9.1` | `3.9.2` | | [@docusaurus/tsconfig](https://github.com/facebook/docusaurus/tree/HEAD/packages/docusaurus-tsconfig) | `3.7.0` | `3.9.2` | | [@docusaurus/types](https://github.com/facebook/docusaurus/tree/HEAD/packages/docusaurus-types) | `3.9.1` | `3.9.2` | | [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) | `9.23.0` | `9.38.0` | | [eslint](https://github.com/eslint/eslint) | `9.23.0` | `9.38.0` | | [eslint-plugin-mdx](https://github.com/mdx-js/eslint-mdx) | `3.3.2` | `3.6.2` | | [globals](https://github.com/sindresorhus/globals) | `16.0.0` | `16.4.0` | | [prettier](https://github.com/prettier/prettier) | `3.5.3` | `3.6.2` | | [string-replace-loader](https://github.com/Va1/string-replace-loader) | `3.1.0` | `3.2.0` | | [typescript](https://github.com/microsoft/TypeScript) | `5.8.2` | `5.9.3` | | [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.30.1` | `8.46.1` | | [webpack](https://github.com/webpack/webpack) | `5.98.0` | `5.102.1` | Updates `@docusaurus/module-type-aliases` from 3.9.1 to 3.9.2 - [Release notes](https://github.com/facebook/docusaurus/releases) - [Changelog](https://github.com/facebook/docusaurus/blob/main/CHANGELOG.md) - [Commits](https://github.com/facebook/docusaurus/commits/v3.9.2/packages/docusaurus-module-type-aliases) Updates `@docusaurus/tsconfig` from 3.7.0 to 3.9.2 - [Release notes](https://github.com/facebook/docusaurus/releases) - [Changelog](https://github.com/facebook/docusaurus/blob/main/CHANGELOG.md) - [Commits](https://github.com/facebook/docusaurus/commits/v3.9.2/packages/docusaurus-tsconfig) Updates `@docusaurus/types` from 3.9.1 to 3.9.2 - [Release notes](https://github.com/facebook/docusaurus/releases) - [Changelog](https://github.com/facebook/docusaurus/blob/main/CHANGELOG.md) - [Commits](https://github.com/facebook/docusaurus/commits/v3.9.2/packages/docusaurus-types) Updates `@eslint/js` from 9.23.0 to 9.38.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Commits](https://github.com/eslint/eslint/commits/v9.38.0/packages/js) Updates `eslint` from 9.23.0 to 9.38.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Commits](https://github.com/eslint/eslint/compare/v9.23.0...v9.38.0) Updates `eslint-plugin-mdx` from 3.3.2 to 3.6.2 - [Release notes](https://github.com/mdx-js/eslint-mdx/releases) - [Changelog](https://github.com/mdx-js/eslint-mdx/blob/master/CHANGELOG.md) - [Commits](https://github.com/mdx-js/eslint-mdx/compare/eslint-plugin-mdx@3.3.2...eslint-plugin-mdx@3.6.2) Updates `globals` from 16.0.0 to 16.4.0 - [Release notes](https://github.com/sindresorhus/globals/releases) - [Commits](https://github.com/sindresorhus/globals/compare/v16.0.0...v16.4.0) Updates `prettier` from 3.5.3 to 3.6.2 - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/3.5.3...3.6.2) Updates `string-replace-loader` from 3.1.0 to 3.2.0 - [Release notes](https://github.com/Va1/string-replace-loader/releases) - [Commits](https://github.com/Va1/string-replace-loader/commits) Updates `typescript` from 5.8.2 to 5.9.3 - [Release notes](https://github.com/microsoft/TypeScript/releases) - [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release-publish.yml) - [Commits](https://github.com/microsoft/TypeScript/compare/v5.8.2...v5.9.3) Updates `typescript-eslint` from 8.30.1 to 8.46.1 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.46.1/packages/typescript-eslint) Updates `webpack` from 5.98.0 to 5.102.1 - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.98.0...v5.102.1) --- updated-dependencies: - dependency-name: "@docusaurus/module-type-aliases" dependency-version: 3.9.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: development - dependency-name: "@docusaurus/tsconfig" dependency-version: 3.9.2 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: development - dependency-name: "@docusaurus/types" dependency-version: 3.9.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: development - dependency-name: "@eslint/js" dependency-version: 9.38.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: development - dependency-name: eslint dependency-version: 9.38.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: development - dependency-name: eslint-plugin-mdx dependency-version: 3.6.2 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: development - dependency-name: globals dependency-version: 16.4.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: development - dependency-name: prettier dependency-version: 3.6.2 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: development - dependency-name: string-replace-loader dependency-version: 3.2.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: development - dependency-name: typescript dependency-version: 5.9.3 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: development - dependency-name: typescript-eslint dependency-version: 8.46.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: development - dependency-name: webpack dependency-version: 5.102.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/package-lock.json | 1475 ++++++++++++++++++++++++++++++---------- docs/package.json | 24 +- 2 files changed, 1118 insertions(+), 381 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 25b9b6ba3c8..eeead1996ea 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -26,28 +26,28 @@ "web-tree-sitter": "^0.24.3" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^3.6.3", - "@docusaurus/tsconfig": "^3.6.3", - "@docusaurus/types": "^3.6.3", - "@eslint/js": "^9.23.0", + "@docusaurus/module-type-aliases": "^3.9.2", + "@docusaurus/tsconfig": "^3.9.2", + "@docusaurus/types": "^3.9.2", + "@eslint/js": "^9.39.2", "@types/glob": "^8.1.0", "@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.23.0", - "eslint-plugin-mdx": "^3.3.2", + "eslint": "^9.39.2", + "eslint-plugin-mdx": "^3.6.2", "eslint-plugin-react": "^7.37.5", - "globals": "^16.0.0", + "globals": "^16.5.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.4.2", - "string-replace-loader": "^3.1.0", - "typescript": "^5.7.2", - "typescript-eslint": "^8.30.1", - "webpack": "^5.97.1" + "prettier": "^3.7.4", + "string-replace-loader": "^3.3.0", + "typescript": "^5.9.3", + "typescript-eslint": "^8.50.0", + "webpack": "^5.104.0" } }, "node_modules/@ai-sdk/gateway": { @@ -3492,6 +3492,42 @@ } } }, + "node_modules/@docusaurus/bundler/node_modules/@docusaurus/types": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", + "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/bundler/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@docusaurus/core": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.9.1.tgz", @@ -3621,12 +3657,13 @@ } }, "node_modules/@docusaurus/module-type-aliases": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.1.tgz", - "integrity": "sha512-YBce3GbJGGcMbJTyHcnEOMvdXqg41pa5HsrMCGA5Rm4z0h0tHS6YtEldj0mlfQRhCG7Y0VD66t2tb87Aom+11g==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.2.tgz", + "integrity": "sha512-8qVe2QA9hVLzvnxP46ysuofJUIc/yYQ82tvA/rBTrnpXtCjNSFLxEZfd5U8cYZuJIVlkPxamsIgwd5tGZXfvew==", + "dev": true, "license": "MIT", "dependencies": { - "@docusaurus/types": "3.9.1", + "@docusaurus/types": "3.9.2", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -3673,6 +3710,42 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, + "node_modules/@docusaurus/plugin-content-blog/node_modules/@docusaurus/types": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", + "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-blog/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@docusaurus/plugin-content-docs": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.1.tgz", @@ -3707,6 +3780,61 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, + "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/module-type-aliases": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.1.tgz", + "integrity": "sha512-YBce3GbJGGcMbJTyHcnEOMvdXqg41pa5HsrMCGA5Rm4z0h0tHS6YtEldj0mlfQRhCG7Y0VD66t2tb87Aom+11g==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.9.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/types": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", + "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@docusaurus/plugin-content-pages": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.9.1.tgz", @@ -3730,6 +3858,42 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, + "node_modules/@docusaurus/plugin-content-pages/node_modules/@docusaurus/types": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", + "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@docusaurus/plugin-css-cascade-layers": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.9.1.tgz", @@ -3746,6 +3910,42 @@ "node": ">=20.0" } }, + "node_modules/@docusaurus/plugin-css-cascade-layers/node_modules/@docusaurus/types": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", + "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-css-cascade-layers/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@docusaurus/plugin-debug": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.9.1.tgz", @@ -3767,49 +3967,46 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/plugin-google-analytics": { + "node_modules/@docusaurus/plugin-debug/node_modules/@docusaurus/types": { "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.9.1.tgz", - "integrity": "sha512-k4Qq2HphqOrIU/CevGPdEO1yJnWUI8m0zOJsYt5NfMJwNsIn/gDD6gv/DKD+hxHndQT5pacsfBd4BWHZVNVroQ==", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", + "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.9.1", - "@docusaurus/types": "3.9.1", - "@docusaurus/utils-validation": "3.9.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.9.1.tgz", - "integrity": "sha512-n9BURBiQyJKI/Ecz35IUjXYwXcgNCSq7/eA07+ZYcDiSyH2p/EjPf8q/QcZG3CyEJPZ/SzGkDHePfcVPahY4Gg==", + "node_modules/@docusaurus/plugin-debug/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.9.1", - "@docusaurus/types": "3.9.1", - "@docusaurus/utils-validation": "3.9.1", - "@types/gtag.js": "^0.0.12", - "tslib": "^2.6.0" + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" }, "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "node": ">=10.0.0" } }, - "node_modules/@docusaurus/plugin-google-tag-manager": { + "node_modules/@docusaurus/plugin-google-analytics": { "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.9.1.tgz", - "integrity": "sha512-rZAQZ25ZuXaThBajxzLjXieTDUCMmBzfAA6ThElQ3o7Q+LEpOjCIrwGFau0KLY9HeG6x91+FwwsAM8zeApYDrg==", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.9.1.tgz", + "integrity": "sha512-k4Qq2HphqOrIU/CevGPdEO1yJnWUI8m0zOJsYt5NfMJwNsIn/gDD6gv/DKD+hxHndQT5pacsfBd4BWHZVNVroQ==", "license": "MIT", "dependencies": { "@docusaurus/core": "3.9.1", @@ -3825,21 +4022,168 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/plugin-sitemap": { + "node_modules/@docusaurus/plugin-google-analytics/node_modules/@docusaurus/types": { "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.9.1.tgz", - "integrity": "sha512-k/bf5cXDxAJUYTzqatgFJwmZsLUbIgl6S8AdZMKGG2Mv2wcOHt+EQNN9qPyWZ5/9cFj+Q8f8DN+KQheBMYLong==", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", + "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.9.1", - "@docusaurus/logger": "3.9.1", - "@docusaurus/types": "3.9.1", - "@docusaurus/utils": "3.9.1", - "@docusaurus/utils-common": "3.9.1", - "@docusaurus/utils-validation": "3.9.1", - "fs-extra": "^11.1.1", - "sitemap": "^7.1.1", - "tslib": "^2.6.0" + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.9.1.tgz", + "integrity": "sha512-n9BURBiQyJKI/Ecz35IUjXYwXcgNCSq7/eA07+ZYcDiSyH2p/EjPf8q/QcZG3CyEJPZ/SzGkDHePfcVPahY4Gg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.1", + "@docusaurus/types": "3.9.1", + "@docusaurus/utils-validation": "3.9.1", + "@types/gtag.js": "^0.0.12", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag/node_modules/@docusaurus/types": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", + "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.9.1.tgz", + "integrity": "sha512-rZAQZ25ZuXaThBajxzLjXieTDUCMmBzfAA6ThElQ3o7Q+LEpOjCIrwGFau0KLY9HeG6x91+FwwsAM8zeApYDrg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.1", + "@docusaurus/types": "3.9.1", + "@docusaurus/utils-validation": "3.9.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager/node_modules/@docusaurus/types": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", + "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.9.1.tgz", + "integrity": "sha512-k/bf5cXDxAJUYTzqatgFJwmZsLUbIgl6S8AdZMKGG2Mv2wcOHt+EQNN9qPyWZ5/9cFj+Q8f8DN+KQheBMYLong==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.1", + "@docusaurus/logger": "3.9.1", + "@docusaurus/types": "3.9.1", + "@docusaurus/utils": "3.9.1", + "@docusaurus/utils-common": "3.9.1", + "@docusaurus/utils-validation": "3.9.1", + "fs-extra": "^11.1.1", + "sitemap": "^7.1.1", + "tslib": "^2.6.0" }, "engines": { "node": ">=20.0" @@ -3849,6 +4193,42 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, + "node_modules/@docusaurus/plugin-sitemap/node_modules/@docusaurus/types": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", + "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@docusaurus/plugin-svgr": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.9.1.tgz", @@ -3872,6 +4252,42 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, + "node_modules/@docusaurus/plugin-svgr/node_modules/@docusaurus/types": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", + "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-svgr/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@docusaurus/preset-classic": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.9.1.tgz", @@ -3902,6 +4318,42 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, + "node_modules/@docusaurus/preset-classic/node_modules/@docusaurus/types": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", + "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/preset-classic/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@docusaurus/theme-classic": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.9.1.tgz", @@ -3942,6 +4394,61 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, + "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/module-type-aliases": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.1.tgz", + "integrity": "sha512-YBce3GbJGGcMbJTyHcnEOMvdXqg41pa5HsrMCGA5Rm4z0h0tHS6YtEldj0mlfQRhCG7Y0VD66t2tb87Aom+11g==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.9.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/types": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", + "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-classic/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@docusaurus/theme-common": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.9.1.tgz", @@ -3970,6 +4477,61 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, + "node_modules/@docusaurus/theme-common/node_modules/@docusaurus/module-type-aliases": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.1.tgz", + "integrity": "sha512-YBce3GbJGGcMbJTyHcnEOMvdXqg41pa5HsrMCGA5Rm4z0h0tHS6YtEldj0mlfQRhCG7Y0VD66t2tb87Aom+11g==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.9.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/theme-common/node_modules/@docusaurus/types": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", + "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-common/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@docusaurus/theme-mermaid": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.9.1.tgz", @@ -3988,14 +4550,69 @@ "node": ">=20.0" }, "peerDependencies": { - "@mermaid-js/layout-elk": "^0.1.9", + "@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-mermaid/node_modules/@docusaurus/module-type-aliases": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.1.tgz", + "integrity": "sha512-YBce3GbJGGcMbJTyHcnEOMvdXqg41pa5HsrMCGA5Rm4z0h0tHS6YtEldj0mlfQRhCG7Y0VD66t2tb87Aom+11g==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.9.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/theme-mermaid/node_modules/@docusaurus/types": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", + "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-mermaid/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" }, - "peerDependenciesMeta": { - "@mermaid-js/layout-elk": { - "optional": true - } + "engines": { + "node": ">=10.0.0" } }, "node_modules/@docusaurus/theme-search-algolia": { @@ -4043,16 +4660,17 @@ } }, "node_modules/@docusaurus/tsconfig": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.7.0.tgz", - "integrity": "sha512-vRsyj3yUZCjscgfgcFYjIsTcAru/4h4YH2/XAE8Rs7wWdnng98PgWKvP5ovVc4rmRpRg2WChVW0uOy2xHDvDBQ==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.9.2.tgz", + "integrity": "sha512-j6/Fp4Rlpxsc632cnRnl5HpOWeb6ZKssDj6/XzzAzVGXXfm9Eptx3rxCC+fDzySn9fHTS+CWJjPineCR1bB5WQ==", "dev": true, "license": "MIT" }, "node_modules/@docusaurus/types": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", - "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", + "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", + "dev": true, "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -4075,6 +4693,7 @@ "version": "5.10.0", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", @@ -4130,6 +4749,42 @@ "node": ">=20.0" } }, + "node_modules/@docusaurus/utils-common/node_modules/@docusaurus/types": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", + "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/utils-common/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@docusaurus/utils-validation": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.9.1.tgz", @@ -4149,10 +4804,46 @@ "node": ">=20.0" } }, + "node_modules/@docusaurus/utils/node_modules/@docusaurus/types": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", + "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/utils/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", - "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, "license": "MIT", "dependencies": { @@ -4179,13 +4870,13 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", - "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.6", + "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -4194,19 +4885,22 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", - "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", - "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4254,19 +4948,22 @@ } }, "node_modules/@eslint/js": { - "version": "9.23.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.23.0.tgz", - "integrity": "sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "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.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4274,32 +4971,19 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", - "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.13.0", + "@eslint/core": "^0.17.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", @@ -4481,9 +5165,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -4494,9 +5178,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { @@ -4838,9 +5522,9 @@ } }, "node_modules/@npmcli/config/node_modules/ci-info": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz", - "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", "dev": true, "funding": [ { @@ -4954,9 +5638,9 @@ } }, "node_modules/@npmcli/map-workspaces/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "dev": true, "license": "ISC", "dependencies": { @@ -5030,9 +5714,9 @@ } }, "node_modules/@npmcli/package-json/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "dev": true, "license": "ISC", "dependencies": { @@ -5136,16 +5820,16 @@ } }, "node_modules/@pkgr/core": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.0.tgz", - "integrity": "sha512-vsJDAkYR6qCPu+ioGScGiMYR7LvZYIXh/dlQeviqoTWNCVfKTLYD/LkNWH4Mxsv2a5vpIRc77FN5DnmK1eBggQ==", + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", "dev": true, "license": "MIT", "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://opencollective.com/pkgr" } }, "node_modules/@pnpm/config.env-replace": { @@ -5870,9 +6554,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, "node_modules/@types/estree-jsx": { @@ -6252,21 +6936,20 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "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==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.50.0.tgz", + "integrity": "sha512-O7QnmOXYKVtPrfYzMolrCTfkezCJS9+ljLdKW/+DCvRsc3UAz+sbH6Xcsv7p30+0OwUbeWfUDAQE0vpabZ3QLg==", "dev": true, "license": "MIT", "dependencies": { "@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", + "@typescript-eslint/scope-manager": "8.50.0", + "@typescript-eslint/type-utils": "8.50.0", + "@typescript-eslint/utils": "8.50.0", + "@typescript-eslint/visitor-keys": "8.50.0", + "ignore": "^7.0.0", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6276,23 +6959,33 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "@typescript-eslint/parser": "^8.50.0", "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.30.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.30.1.tgz", - "integrity": "sha512-H+vqmWwT5xoNrXqWs/fesmssOW70gxFlgcMlYcBaWNPIEWDgLa4W9nkSPmhuOgLnXq9QYgkZ31fhDyLhleCsAg==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.50.0.tgz", + "integrity": "sha512-6/cmF2piao+f6wSxUsJLZjck7OQsYyRtcOZS02k7XINSNlz93v6emM8WutDQSXnroG2xwYlEVHJI+cPA7CPM3Q==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@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", + "@typescript-eslint/scope-manager": "8.50.0", + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/typescript-estree": "8.50.0", + "@typescript-eslint/visitor-keys": "8.50.0", "debug": "^4.3.4" }, "engines": { @@ -6304,38 +6997,78 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.50.0.tgz", + "integrity": "sha512-Cg/nQcL1BcoTijEWyx4mkVC56r8dj44bFDvBdygifuS20f3OZCHmFbjF34DPSi07kwlFvqfv/xOLnJ5DquxSGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.50.0", + "@typescript-eslint/types": "^8.50.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.30.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.30.1.tgz", - "integrity": "sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.50.0.tgz", + "integrity": "sha512-xCwfuCZjhIqy7+HKxBLrDVT5q/iq7XBVBXLn57RTIIpelLtEIZHXAF/Upa3+gaCpeV1NNS5Z9A+ID6jn50VD4A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.30.1", - "@typescript-eslint/visitor-keys": "8.30.1" + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/visitor-keys": "8.50.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.50.0.tgz", + "integrity": "sha512-vxd3G/ybKTSlm31MOA96gqvrRGv9RJ7LGtZCn2Vrc5htA0zCDvcMqUkifcjrWNNKXHUU3WCkYOzzVSFBd0wa2w==", + "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.30.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.30.1.tgz", - "integrity": "sha512-64uBF76bfQiJyHgZISC7vcNz3adqQKIccVoKubyQcOnNcdJBvYOILV1v22Qhsw3tw3VQu5ll8ND6hycgAR5fEA==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.50.0.tgz", + "integrity": "sha512-7OciHT2lKCewR0mFoBrvZJ4AXTMe/sYOe87289WAViOocEmDjjv8MvIOT2XESuKj9jp8u3SZYUSh89QA4S1kQw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.30.1", - "@typescript-eslint/utils": "8.30.1", + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/typescript-estree": "8.50.0", + "@typescript-eslint/utils": "8.50.0", "debug": "^4.3.4", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6346,13 +7079,13 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.30.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.30.1.tgz", - "integrity": "sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.50.0.tgz", + "integrity": "sha512-iX1mgmGrXdANhhITbpp2QQM2fGehBse9LbTf0sidWK6yg/NE+uhV5dfU1g6EYPlcReYmkE9QLPq/2irKAmtS9w==", "dev": true, "license": "MIT", "engines": { @@ -6364,20 +7097,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.30.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.30.1.tgz", - "integrity": "sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.50.0.tgz", + "integrity": "sha512-W7SVAGBR/IX7zm1t70Yujpbk+zdPq/u4soeFSknWFdXIFuWsBGBOUu/Tn/I6KHSKvSh91OiMuaSnYp3mtPt5IQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.30.1", - "@typescript-eslint/visitor-keys": "8.30.1", + "@typescript-eslint/project-service": "8.50.0", + "@typescript-eslint/tsconfig-utils": "8.50.0", + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/visitor-keys": "8.50.0", "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" + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6387,7 +7121,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { @@ -6417,16 +7151,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.30.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.30.1.tgz", - "integrity": "sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.50.0.tgz", + "integrity": "sha512-87KgUXET09CRjGCi2Ejxy3PULXna63/bMYv72tCAlDJC3Yqwln0HiFJ3VJMst2+mEtNtZu5oFvX4qJGjKsnAgg==", "dev": true, "license": "MIT", "dependencies": { - "@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" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.50.0", + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/typescript-estree": "8.50.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6437,18 +7171,18 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.30.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.30.1.tgz", - "integrity": "sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.50.0.tgz", + "integrity": "sha512-Xzmnb58+Db78gT/CCj/PVCvK+zxbnsw6F+O1oheYszJbBSdEjVhQi3C/Xttzxgi/GLmpvOggRs1RFpiJ8+c34Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.30.1", - "eslint-visitor-keys": "^4.2.0" + "@typescript-eslint/types": "8.50.0", + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6459,9 +7193,9 @@ } }, "node_modules/@typescript-eslint/visitor-keys/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==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -6689,9 +7423,9 @@ } }, "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", "peer": true, "bin": { @@ -6701,6 +7435,18 @@ "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", @@ -7296,9 +8042,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.9.tgz", - "integrity": "sha512-hY/u2lxLrbecMEWSB0IpGzGyDyeoMFQhCvZd2jGFSE5I17Fh01sYUBPCJtkWERw7zrac9+cIghxm/ytJa2X8iA==", + "version": "2.9.8", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.8.tgz", + "integrity": "sha512-Y1fOuNDowLfgKOypdc9SPABfoWXuZHBOyCS4cD52IeZBhr4Md6CLLs6atcxVrzRmQ06E7hSlm5bHHApPKR/byA==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.js" @@ -7452,9 +8198,9 @@ } }, "node_modules/browserslist": { - "version": "4.26.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.2.tgz", - "integrity": "sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "funding": [ { "type": "opencollective", @@ -7472,11 +8218,11 @@ "license": "MIT", "peer": true, "dependencies": { - "baseline-browser-mapping": "^2.8.3", - "caniuse-lite": "^1.0.30001741", - "electron-to-chromium": "^1.5.218", - "node-releases": "^2.0.21", - "update-browserslist-db": "^1.1.3" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -7633,9 +8379,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001746", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001746.tgz", - "integrity": "sha512-eA7Ys/DGw+pnkWWSE/id29f2IcPHVoE8wxtvE5JdvD2V28VTDPy1yEeo11Guz0sJ4ZeGRcm3uaTcAqK1LXaphA==", + "version": "1.0.30001760", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz", + "integrity": "sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==", "funding": [ { "type": "opencollective", @@ -9807,9 +10553,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.227", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.227.tgz", - "integrity": "sha512-ITxuoPfJu3lsNWUi2lBM2PaBPYgH3uqmxut5vmBxgYvyI4AlJ6P3Cai1O76mOrkJCBzq0IxWg/NtqOrpu/0gKA==", + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -10006,9 +10752,9 @@ } }, "node_modules/es-module-lexer": { - "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", "license": "MIT" }, "node_modules/es-object-atoms": { @@ -10142,34 +10888,33 @@ } }, "node_modules/eslint": { - "version": "9.23.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.23.0.tgz", - "integrity": "sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.2", - "@eslint/config-helpers": "^0.2.0", - "@eslint/core": "^0.12.0", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.23.0", - "@eslint/plugin-kit": "^0.2.7", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "@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.3.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -10204,21 +10949,20 @@ } }, "node_modules/eslint-mdx": { - "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==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/eslint-mdx/-/eslint-mdx-3.6.2.tgz", + "integrity": "sha512-5hczn5iSSEcwtNtVXFwCKIk6iLEDaZpwc3vjYDl/B779OzaAAK/ou16J2xVdO6ecOLEO1WZqp7MRCQ/WsKDUig==", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.14.1", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "espree": "^9.6.1 || ^10.3.0", + "espree": "^9.6.1 || ^10.4.0", "estree-util-visit": "^2.0.0", "remark-mdx": "^3.1.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", - "synckit": "^0.11.2", - "tslib": "^2.8.1", + "synckit": "^0.11.8", "unified": "^11.0.5", "unified-engine": "^11.2.2", "unist-util-visit": "^5.0.0", @@ -10243,19 +10987,20 @@ } }, "node_modules/eslint-plugin-mdx": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-mdx/-/eslint-plugin-mdx-3.3.2.tgz", - "integrity": "sha512-zBvxCiKzahbTRvWPONDZups1As5clGjv1OLOLnX/p+OwdrZdcwJ3tiBihu6xeZuem9u6iwMkr9kHVurcuzbTCg==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-mdx/-/eslint-plugin-mdx-3.6.2.tgz", + "integrity": "sha512-RfMd5HYD/9+cqANhVWJbuBRg3huWUsAoGJNGmPsyiRD2X6BaG6bvt1omyk1ORlg81GK8ST7Ojt5fNAuwWhWU8A==", "dev": true, "license": "MIT", "dependencies": { - "eslint-mdx": "^3.3.2", + "eslint-mdx": "^3.6.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.2", - "tslib": "^2.8.1", + "synckit": "^0.11.8", "unified": "^11.0.5", "vfile": "^6.0.3" }, @@ -10332,9 +11077,9 @@ } }, "node_modules/eslint-scope": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", - "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -10362,9 +11107,9 @@ } }, "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==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -10388,15 +11133,15 @@ } }, "node_modules/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.14.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10406,9 +11151,9 @@ } }, "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==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -11407,9 +12152,9 @@ } }, "node_modules/globals": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.0.0.tgz", - "integrity": "sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==", + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", "dev": true, "license": "MIT", "engines": { @@ -11511,13 +12256,6 @@ "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", @@ -12281,9 +13019,9 @@ } }, "node_modules/import-meta-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", - "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", "dev": true, "license": "MIT", "funding": { @@ -13457,12 +14195,16 @@ } }, "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "license": "MIT", "engines": { "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/loader-utils": { @@ -16222,9 +16964,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", - "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "license": "MIT" }, "node_modules/nopt": { @@ -18640,9 +19382,9 @@ } }, "node_modules/prettier": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", - "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", + "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", "dev": true, "license": "MIT", "bin": { @@ -19972,9 +20714,9 @@ "license": "Apache-2.0" }, "node_modules/schema-utils": { - "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==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -20636,9 +21378,9 @@ } }, "node_modules/spdx-license-ids": { - "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==", + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", "dev": true, "license": "CC0-1.0" }, @@ -20715,36 +21457,19 @@ } }, "node_modules/string-replace-loader": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-replace-loader/-/string-replace-loader-3.1.0.tgz", - "integrity": "sha512-5AOMUZeX5HE/ylKDnEa/KKBqvlnFmRZudSOjVJHxhoJg9QYTwl1rECx7SLR8BBH7tfxb4Rp7EM2XVfQFxIhsbQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "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==", + "resolved": "https://registry.npmjs.org/string-replace-loader/-/string-replace-loader-3.3.0.tgz", + "integrity": "sha512-AZ3y7ktSHhd/Ebipczkp6vdfp01d2kQVwFujCGAgmogTB8t4dRhbsRGDKnyZAYqBbIA9QW7+D/IsACVJOOpcBg==", "dev": true, "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "schema-utils": "^4" }, "engines": { - "node": ">= 10.13.0" + "node": ">=4" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "peerDependencies": { + "webpack": "^5" } }, "node_modules/string-width": { @@ -21114,14 +21839,13 @@ } }, "node_modules/synckit": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.2.tgz", - "integrity": "sha512-1IUffI8zZ8qUMB3NUJIjk0RpLroG/8NkQDAWH1NbB2iJ0/5pn3M8rxfNzMz4GH9OnYaGYn31LEDSXJp/qIlxgA==", + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", + "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", "dev": true, "license": "MIT", "dependencies": { - "@pkgr/core": "^0.2.0", - "tslib": "^2.8.1" + "@pkgr/core": "^0.2.9" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -21131,12 +21855,16 @@ } }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "license": "MIT", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/terser": { @@ -21158,9 +21886,9 @@ } }, "node_modules/terser-webpack-plugin": { - "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==", + "version": "5.3.16", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", + "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", @@ -21279,14 +22007,14 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", - "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { - "fdir": "^6.4.3", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -21296,11 +22024,14 @@ } }, "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", - "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -21311,9 +22042,9 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "peer": true, @@ -21619,9 +22350,9 @@ } }, "node_modules/typescript": { - "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==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", "peer": true, @@ -21634,15 +22365,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.30.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.30.1.tgz", - "integrity": "sha512-D7lC0kcehVH7Mb26MRQi64LMyRJsj3dToJxM1+JVTl53DQSV5/7oUGWQLcKl1C1KnoVHxMMU2FNQMffr7F3Row==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.50.0.tgz", + "integrity": "sha512-Q1/6yNUmCpH94fbgMUMg2/BSAr/6U7GBk61kZTv1/asghQOWOjTlp9K8mixS5NcJmm2creY+UFfGeW/+OcA64A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.30.1", - "@typescript-eslint/parser": "8.30.1", - "@typescript-eslint/utils": "8.30.1" + "@typescript-eslint/eslint-plugin": "8.50.0", + "@typescript-eslint/parser": "8.50.0", + "@typescript-eslint/typescript-estree": "8.50.0", + "@typescript-eslint/utils": "8.50.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -21653,7 +22385,7 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/ufo": { @@ -21800,9 +22532,9 @@ } }, "node_modules/unified-engine/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "dev": true, "license": "ISC", "dependencies": { @@ -22028,9 +22760,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "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==", "funding": [ { "type": "opencollective", @@ -22387,9 +23119,9 @@ } }, "node_modules/vfile-reporter/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -22400,9 +23132,9 @@ } }, "node_modules/vfile-reporter/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, @@ -22425,9 +23157,9 @@ } }, "node_modules/vfile-reporter/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { @@ -22540,9 +23272,9 @@ "license": "ISC" }, "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", @@ -22578,35 +23310,37 @@ "license": "MIT" }, "node_modules/webpack": { - "version": "5.98.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", - "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", + "version": "5.104.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.0.tgz", + "integrity": "sha512-5DeICTX8BVgNp6afSPYXAFjskIgWGlygQH58bcozPOXgo2r/6xx39Y1+cULZ3gTxUYQP88jmwLj2anu4Xaq84g==", "license": "MIT", "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", + "enhanced-resolve": "^5.17.4", + "es-module-lexer": "^2.0.0", "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.2.0", + "loader-runner": "^4.3.1", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^4.3.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.4.4", + "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" @@ -22841,9 +23575,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", "license": "MIT", "engines": { "node": ">=10.13.0" @@ -23327,16 +24061,19 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", - "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "dev": true, "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { - "node": ">= 14" + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yocto-queue": { diff --git a/docs/package.json b/docs/package.json index 263b41eb29b..ade539e9c87 100644 --- a/docs/package.json +++ b/docs/package.json @@ -45,27 +45,27 @@ ] }, "devDependencies": { - "@docusaurus/module-type-aliases": "^3.6.3", - "@docusaurus/tsconfig": "^3.6.3", - "@docusaurus/types": "^3.6.3", - "@eslint/js": "^9.23.0", + "@docusaurus/module-type-aliases": "^3.9.2", + "@docusaurus/tsconfig": "^3.9.2", + "@docusaurus/types": "^3.9.2", + "@eslint/js": "^9.39.2", "@types/glob": "^8.1.0", "@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.23.0", - "eslint-plugin-mdx": "^3.3.2", + "eslint": "^9.39.2", + "eslint-plugin-mdx": "^3.6.2", "eslint-plugin-react": "^7.37.5", - "globals": "^16.0.0", + "globals": "^16.5.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.4.2", - "string-replace-loader": "^3.1.0", - "typescript": "^5.7.2", - "typescript-eslint": "^8.30.1", - "webpack": "^5.97.1" + "prettier": "^3.7.4", + "string-replace-loader": "^3.3.0", + "typescript": "^5.9.3", + "typescript-eslint": "^8.50.0", + "webpack": "^5.104.0" } } From ce73101049bcc76b279811cd45caf0ed440f26f1 Mon Sep 17 00:00:00 2001 From: Nicolas Munnich <98408764+nmunnich@users.noreply.github.com> Date: Wed, 17 Dec 2025 00:21:52 +0000 Subject: [PATCH 56/96] docs: Update hardware integration page with Zephyr 4.1 board setup (#3138) * docs: Update hardware integration page with Zephyr 4.1 board setup * docs: Apply suggestions from code review Co-authored-by: Cem Aksoylar --------- Co-authored-by: Cem Aksoylar --- .../development/hardware-integration/index.mdx | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/docs/development/hardware-integration/index.mdx b/docs/docs/development/hardware-integration/index.mdx index 4fb51beffe9..95e1e371551 100644 --- a/docs/docs/development/hardware-integration/index.mdx +++ b/docs/docs/development/hardware-integration/index.mdx @@ -68,33 +68,33 @@ 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/arm/planck) board directory. +You can see an example for the [Planck V6](https://github.com/zmkfirmware/zmk/tree/main/app/boards/olkb/planck) board directory. -With this type of keyboard, the full ZMK definition for the keyboard exists in the `/boards//` directory where `` is `zmk/app` or a [module](../../features/modules.mdx) root, e.g. `zmk/app/boards/arm/planck/`. +With this type of keyboard, the full ZMK definition for the keyboard exists in the `/boards//` directory where `` is `zmk/app` or a [module](../../features/modules.mdx) root, e.g. `zmk/app/boards/olkb/planck/`. In that directory you'll have the following files, where there can be multiples of files with ``s, corresponding to each keyboard part for [split keyboards](../../features/split-keyboards.md): ``` -├── Kconfig.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): -- A `Kconfig.board` file that defines the toplevel [Kconfig](https://docs.zephyrproject.org/4.1.0/build/kconfig/index.html) items for the board, including which SoC Kconfig setting it depends on. +- A `Kconfig.` file that defines the toplevel [Kconfig](https://docs.zephyrproject.org/4.1.0/build/kconfig/index.html) items for the board, including selecting the corresponding SoC Kconfig setting. - A `Kconfig.defconfig` file that sets some initial defaults when building this keyboard. This usually includes: - - Setting [`ZMK_KEYBOARD_NAME`](../../config/system.md#general) to a value, for the product name to be used for USB/BLE info, - - 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 + - Setting [`ZMK_KEYBOARD_NAME`](../../config/system.md#general) to a value, for the product name to be used for USB/BLE info [Configuration files](../../config/index.md#kconfig-files) that set the visible Kconfig symbols: - A `_defconfig` file that forces specific Kconfig settings that are specific to this hardware configuration. - These are mostly SoC settings around the specific hardware configuration. + These tend to be settings enabling various drivers or features, e.g. GPIO, USB support, or memory settings for ZMK Studio. [Devicetree files](../../config/index.md#devicetree-files): @@ -107,6 +107,7 @@ These files include [base Kconfig files](https://docs.zephyrproject.org/4.1.0/bu 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. From 040238a97dfb55ad84867c007944809425f1befe Mon Sep 17 00:00:00 2001 From: Nicolas Munnich <98408764+nmunnich@users.noreply.github.com> Date: Wed, 17 Dec 2025 17:04:39 +0000 Subject: [PATCH 57/96] chore(docs): Update docusaurus (#3147) dunno why dependabot didn't update these 3 together --- docs/package-lock.json | 3140 ++++++++++++++++------------------------ docs/package.json | 6 +- 2 files changed, 1214 insertions(+), 1932 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index eeead1996ea..0daf40e0559 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -8,9 +8,9 @@ "name": "docs", "version": "0.0.0", "dependencies": { - "@docusaurus/core": "^3.9.1", - "@docusaurus/preset-classic": "^3.9.1", - "@docusaurus/theme-mermaid": "^3.9.1", + "@docusaurus/core": "^3.9.2", + "@docusaurus/preset-classic": "^3.9.2", + "@docusaurus/theme-mermaid": "^3.9.2", "@fortawesome/fontawesome-svg-core": "^6.7.1", "@fortawesome/free-solid-svg-icons": "^6.7.1", "@fortawesome/react-fontawesome": "^0.2.0", @@ -51,13 +51,14 @@ } }, "node_modules/@ai-sdk/gateway": { - "version": "1.0.32", - "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-1.0.32.tgz", - "integrity": "sha512-TQRIM63EI/ccJBc7RxeB8nq/CnGNnyl7eu5stWdLwL41stkV5skVeZJe0QRvFbaOrwCkgUVE0yrUqJi4tgDC1A==", + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.21.tgz", + "integrity": "sha512-BwV7DU/lAm3Xn6iyyvZdWgVxgLu3SNXzl5y57gMvkW4nGhAOV5269IrJzQwGt03bb107sa6H6uJwWxc77zXoGA==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.10" + "@ai-sdk/provider-utils": "3.0.19", + "@vercel/oidc": "3.0.5" }, "engines": { "node": ">=18" @@ -79,14 +80,14 @@ } }, "node_modules/@ai-sdk/provider-utils": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.10.tgz", - "integrity": "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ==", + "version": "3.0.19", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.19.tgz", + "integrity": "sha512-W41Wc9/jbUVXVwCN/7bWa4IKe8MtxO3EyA0Hfhx6grnmiYlCvpI8neSYWFE0zScXJkgA/YK3BRybzgyiXuu6JA==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", - "eventsource-parser": "^3.0.5" + "eventsource-parser": "^3.0.6" }, "engines": { "node": ">=18" @@ -96,13 +97,13 @@ } }, "node_modules/@ai-sdk/react": { - "version": "2.0.59", - "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-2.0.59.tgz", - "integrity": "sha512-whuMGkiRugJIQNJEIpt3gv53EsvQ6ub7Qh19ujbUcvXZKwoCCZlEGmUqEJqvPVRm95d4uYXFxEk0wqpxOpsm6g==", + "version": "2.0.116", + "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-2.0.116.tgz", + "integrity": "sha512-kWe7ViRUHiQIEbslrLc8D0Zjafl/QwpBpeZ9xyryVDV4DlocbhFmTD7CeyWUWpVSLA+oJKndExcdbiK7T0zEWA==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider-utils": "3.0.10", - "ai": "5.0.59", + "@ai-sdk/provider-utils": "3.0.19", + "ai": "5.0.114", "swr": "^2.2.5", "throttleit": "2.1.0" }, @@ -110,7 +111,7 @@ "node": ">=18" }, "peerDependencies": { - "react": "^18 || ^19 || ^19.0.0-rc", + "react": "^18 || ~19.0.1 || ~19.1.2 || ^19.2.1", "zod": "^3.25.76 || ^4.1.8" }, "peerDependenciesMeta": { @@ -120,15 +121,15 @@ } }, "node_modules/@algolia/abtesting": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.5.0.tgz", - "integrity": "sha512-W/ohRkbKQsqDWALJg28X15KF7Tcyg53L1MfdOkLgvkcCcofdzGHSimHHeNG05ojjFw9HK8+VPhe/Vwq4MozIJg==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.12.0.tgz", + "integrity": "sha512-EfW0bfxjPs+C7ANkJDw2TATntfBKsFiy7APh+KO0pQ8A6HYa5I0NjFuCGCXWfzzzLXNZta3QUl3n5Kmm6aJo9Q==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.39.0", - "@algolia/requester-browser-xhr": "5.39.0", - "@algolia/requester-fetch": "5.39.0", - "@algolia/requester-node-http": "5.39.0" + "@algolia/client-common": "5.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" }, "engines": { "node": ">= 14.0.0" @@ -167,100 +168,99 @@ } }, "node_modules/@algolia/client-abtesting": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.39.0.tgz", - "integrity": "sha512-Vf0ZVe+qo3sHDrCinouJqlg8VoxM4Qo/KxNIqMYybkuctutfnp3kIY9OmESplOQ/9NGBthU9EG+4d5fBibWK/A==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.46.0.tgz", + "integrity": "sha512-eG5xV8rujK4ZIHXrRshvv9O13NmU/k42Rnd3w43iKH5RaQ2zWuZO6Q7XjaoJjAFVCsJWqRbXzbYyPGrbF3wGNg==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.39.0", - "@algolia/requester-browser-xhr": "5.39.0", - "@algolia/requester-fetch": "5.39.0", - "@algolia/requester-node-http": "5.39.0" + "@algolia/client-common": "5.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.39.0.tgz", - "integrity": "sha512-V16ITZxYIwcv1arNce65JZmn94Ft6vKlBZ//gXw8AvIH32glJz1KcbaVAUr9p7PYlGZ/XVHP6LxDgrpNdtwgcA==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.46.0.tgz", + "integrity": "sha512-AYh2uL8IUW9eZrbbT+wZElyb7QkkeV3US2NEKY7doqMlyPWE8lErNfkVN1NvZdVcY4/SVic5GDbeDz2ft8YIiQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.39.0", - "@algolia/requester-browser-xhr": "5.39.0", - "@algolia/requester-fetch": "5.39.0", - "@algolia/requester-node-http": "5.39.0" + "@algolia/client-common": "5.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.39.0.tgz", - "integrity": "sha512-UCJTuwySEQeiKPWV3wruhuI/wHbDYenHzgL9pYsvh6r/u5Z+g61ip1iwdAlFp02CnywzI9O7+AQPh2ManYyHmQ==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.46.0.tgz", + "integrity": "sha512-0emZTaYOeI9WzJi0TcNd2k3SxiN6DZfdWc2x2gHt855Jl9jPUOzfVTL6gTvCCrOlT4McvpDGg5nGO+9doEjjig==", "license": "MIT", "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-insights": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.39.0.tgz", - "integrity": "sha512-s0ia8M/ZZR+iO2uLNTBrlQdEb6ZMAMcKMHckp5mcoglxrf8gHifL4LmdhGKdAxAn3UIagtqIP0RCnIymHUbm7A==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.46.0.tgz", + "integrity": "sha512-wrBJ8fE+M0TDG1As4DDmwPn2TXajrvmvAN72Qwpuv8e2JOKNohF7+JxBoF70ZLlvP1A1EiH8DBu+JpfhBbNphQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.39.0", - "@algolia/requester-browser-xhr": "5.39.0", - "@algolia/requester-fetch": "5.39.0", - "@algolia/requester-node-http": "5.39.0" + "@algolia/client-common": "5.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.39.0.tgz", - "integrity": "sha512-vZPIt7Lw+toNsHZUiPhNIc1Z3vUjDp7nzn6AMOaPC73gEuTq2iLPNvM06CSB6aHePo5eMeJIP5YEKBUQUA/PJA==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.46.0.tgz", + "integrity": "sha512-LnkeX4p0ENt0DoftDJJDzQQJig/sFQmD1eQifl/iSjhUOGUIKC/7VTeXRcKtQB78naS8njUAwpzFvxy1CDDXDQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.39.0", - "@algolia/requester-browser-xhr": "5.39.0", - "@algolia/requester-fetch": "5.39.0", - "@algolia/requester-node-http": "5.39.0" + "@algolia/client-common": "5.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.39.0.tgz", - "integrity": "sha512-jcPQr3iKTWNVli2NYHPv02aNLwixDjPCpOgMp9CZTvEiPI6Ec4jHX+oFr3LDZagOFY9e1xJhc/JrgMGGW1sHnw==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.46.0.tgz", + "integrity": "sha512-aF9tc4ex/smypXw+W3lBPB1jjKoaGHpZezTqofvDOI/oK1dR2sdTpFpK2Ru+7IRzYgwtRqHF3znmTlyoNs9dpA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.39.0", - "@algolia/requester-browser-xhr": "5.39.0", - "@algolia/requester-fetch": "5.39.0", - "@algolia/requester-node-http": "5.39.0" + "@algolia/client-common": "5.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.39.0.tgz", - "integrity": "sha512-/IYpF10BpthGZEJQZMhMqV4AqWr5avcWfZm/SIKK1RvUDmzGqLoW/+xeJVX9C8ZnNkIC8hivbIQFaNaRw0BFZQ==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.0.tgz", + "integrity": "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==", "license": "MIT", - "peer": true, "dependencies": { - "@algolia/client-common": "5.39.0", - "@algolia/requester-browser-xhr": "5.39.0", - "@algolia/requester-fetch": "5.39.0", - "@algolia/requester-node-http": "5.39.0" + "@algolia/client-common": "5.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" }, "engines": { "node": ">= 14.0.0" @@ -273,81 +273,81 @@ "license": "MIT" }, "node_modules/@algolia/ingestion": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.39.0.tgz", - "integrity": "sha512-IgSHKUiuecqLfBlXiuCSdRTdsO3/yvpmXrMFz8fAJ8M4QmDtHkOuD769dmybRYqsbYMHivw+lir4BgbRGMtOIQ==", + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.46.0.tgz", + "integrity": "sha512-2LT0/Z+/sFwEpZLH6V17WSZ81JX2uPjgvv5eNlxgU7rPyup4NXXfuMbtCJ+6uc4RO/LQpEJd3Li59ke3wtyAsA==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.39.0", - "@algolia/requester-browser-xhr": "5.39.0", - "@algolia/requester-fetch": "5.39.0", - "@algolia/requester-node-http": "5.39.0" + "@algolia/client-common": "5.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/monitoring": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.39.0.tgz", - "integrity": "sha512-8Xnd4+609SKC/hqVsuFc4evFBmvA2765/4NcH+Dpr756SKPbL1BY0X8kVxlmM3YBLNqnduSQxHxpDJUK58imCA==", + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.46.0.tgz", + "integrity": "sha512-uivZ9wSWZ8mz2ZU0dgDvQwvVZV8XBv6lYBXf8UtkQF3u7WeTqBPeU8ZoeTyLpf0jAXCYOvc1mAVmK0xPLuEwOQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.39.0", - "@algolia/requester-browser-xhr": "5.39.0", - "@algolia/requester-fetch": "5.39.0", - "@algolia/requester-node-http": "5.39.0" + "@algolia/client-common": "5.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.39.0.tgz", - "integrity": "sha512-D7Ye2Ss/5xqUkQUxKm/VqEJLt5kARd9IMmjdzlxaKhGgNlOemTay0lwBmOVFuJRp7UODjp5c9+K+B8g0ORObIw==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.46.0.tgz", + "integrity": "sha512-O2BB8DuySuddgOAbhyH4jsGbL+KyDGpzJRtkDZkv091OMomqIA78emhhMhX9d/nIRrzS1wNLWB/ix7Hb2eV5rg==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.39.0", - "@algolia/requester-browser-xhr": "5.39.0", - "@algolia/requester-fetch": "5.39.0", - "@algolia/requester-node-http": "5.39.0" + "@algolia/client-common": "5.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.39.0.tgz", - "integrity": "sha512-mgPte1ZJqpk9dkVs44J3wKAbHATvHZNlSpzhMdjMLIg/3qTycSZyDiomLiSlxE8CLsxyBAOJWnyKRHfom+Z1rg==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.46.0.tgz", + "integrity": "sha512-eW6xyHCyYrJD0Kjk9Mz33gQ40LfWiEA51JJTVfJy3yeoRSw/NXhAL81Pljpa0qslTs6+LO/5DYPZddct6HvISQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.39.0" + "@algolia/client-common": "5.46.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.39.0.tgz", - "integrity": "sha512-LIrCkrxu1WnO3ev1+w6NnZ12JZL/o+2H9w6oWnZAjQZIlA/Ym6M9QHkt+OQ/SwkuoiNkW3DAo+Pi4A2V9FPtqg==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.46.0.tgz", + "integrity": "sha512-Vn2+TukMGHy4PIxmdvP667tN/MhS7MPT8EEvEhS6JyFLPx3weLcxSa1F9gVvrfHWCUJhLWoMVJVB2PT8YfRGcw==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.39.0" + "@algolia/client-common": "5.46.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.39.0.tgz", - "integrity": "sha512-6beG+egPwXmvhAg+m0STCj+ZssDcjrLzf4L05aKm2nGglMXSSPz0cH/rM+kVD9krNfldiMctURd4wjojW1fV0w==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.46.0.tgz", + "integrity": "sha512-xaqXyna5yBZ+r1SJ9my/DM6vfTqJg9FJgVydRJ0lnO+D5NhqGW/qaRG/iBGKr/d4fho34el6WakV7BqJvrl/HQ==", "license": "MIT", "dependencies": { - "@algolia/client-common": "5.39.0" + "@algolia/client-common": "5.46.0" }, "engines": { "node": ">= 14.0.0" @@ -366,15 +366,6 @@ "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", @@ -408,30 +399,29 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", - "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", - "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.4", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.4", - "@babel/types": "^7.28.4", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -457,13 +447,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -510,17 +500,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", - "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz", + "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.3", + "@babel/traverse": "^7.28.5", "semver": "^6.3.1" }, "engines": { @@ -540,13 +530,13 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", - "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "regexpu-core": "^6.2.0", + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", "semver": "^6.3.1" }, "engines": { @@ -591,13 +581,13 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", - "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -711,9 +701,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "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==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -756,12 +746,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", - "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.4" + "@babel/types": "^7.28.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -771,13 +761,13 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", - "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1014,9 +1004,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz", - "integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", + "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1097,13 +1087,13 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", - "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1191,9 +1181,9 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", - "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", + "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1284,9 +1274,9 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", - "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", + "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1346,15 +1336,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", - "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", + "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-module-transforms": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1491,9 +1481,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", - "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", + "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -1696,9 +1686,9 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.3.tgz", - "integrity": "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.5.tgz", + "integrity": "sha512-20NUVgOrinudkIBzQ2bNxP08YpKprUkRTiRSd2/Z5GOdPImJGkoN4Z7IQe1T5AdyKI1i5L6RBmluqdSzvaq9/w==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", @@ -1801,13 +1791,13 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", - "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.5.tgz", + "integrity": "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.28.5", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1" @@ -1883,16 +1873,16 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", - "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz", + "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.0", + "@babel/compat-data": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^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", @@ -1905,42 +1895,42 @@ "@babel/plugin-transform-async-generator-functions": "^7.28.0", "@babel/plugin-transform-async-to-generator": "^7.27.1", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-block-scoping": "^7.28.5", "@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-static-block": "^7.28.3", - "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.4", "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-destructuring": "^7.28.5", "@babel/plugin-transform-dotall-regex": "^7.27.1", "@babel/plugin-transform-duplicate-keys": "^7.27.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-dynamic-import": "^7.27.1", "@babel/plugin-transform-explicit-resource-management": "^7.28.0", - "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-exponentiation-operator": "^7.28.5", "@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.27.1", "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", "@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.28.5", "@babel/plugin-transform-modules-umd": "^7.27.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-new-target": "^7.27.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-rest-spread": "^7.28.4", "@babel/plugin-transform-object-super": "^7.27.1", "@babel/plugin-transform-optional-catch-binding": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.28.5", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regenerator": "^7.28.4", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", @@ -1990,14 +1980,14 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz", - "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-transform-react-display-name": "^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" @@ -2010,16 +2000,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", - "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", "license": "MIT", "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.27.1" + "@babel/plugin-transform-typescript": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2029,13 +2019,10 @@ } }, "node_modules/@babel/runtime": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", - "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, "engines": { "node": ">=6.9.0" } @@ -2067,17 +2054,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", - "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.4", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4", + "@babel/types": "^7.28.5", "debug": "^4.3.1" }, "engines": { @@ -2085,13 +2072,13 @@ } }, "node_modules/@babel/types": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", - "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2114,6 +2101,12 @@ "lodash-es": "4.17.21" } }, + "node_modules/@chevrotain/cst-dts-gen/node_modules/lodash-es": { + "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/@chevrotain/gast": { "version": "11.0.3", "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", @@ -2124,6 +2117,12 @@ "lodash-es": "4.17.21" } }, + "node_modules/@chevrotain/gast/node_modules/lodash-es": { + "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/@chevrotain/regexp-to-ast": { "version": "11.0.3", "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", @@ -2259,7 +2258,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -2282,7 +2280,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -2388,11 +2385,10 @@ } }, "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { - "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -2810,11 +2806,10 @@ } }, "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { - "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3103,6 +3098,28 @@ "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", @@ -3210,9 +3227,9 @@ } }, "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { - "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -3276,6 +3293,32 @@ "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", @@ -3382,21 +3425,44 @@ "node": ">=10.0.0" } }, + "node_modules/@docsearch/core": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@docsearch/core/-/core-4.3.1.tgz", + "integrity": "sha512-ktVbkePE+2h9RwqCUMbWXOoebFyDOxHqImAqfs+lC8yOU+XwEW4jgvHGJK079deTeHtdhUNj0PXHSnhJINvHzQ==", + "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.1.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.1.0.tgz", - "integrity": "sha512-nuNKGjHj/FQeWgE9t+i83QD/V67QiaAmGY7xS9TVCRUiCqSljOgIKlsLoQZKKVwEG8f+OWKdznzZkJxGZ7d06A==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.3.2.tgz", + "integrity": "sha512-K3Yhay9MgkBjJJ0WEL5MxnACModX9xuNt3UlQQkDEDZJZ0+aeWKtOkxHNndMRkMBnHdYvQjxkm6mdlneOtU1IQ==", "license": "MIT" }, "node_modules/@docsearch/react": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.1.0.tgz", - "integrity": "sha512-4GHI7TT3sJZ2Vs4Kjadv7vAkMrTsJqHvzvxO3JA7UT8iPRKaDottG5o5uNshPWhVVaBYPC35Ukf8bfCotGpjSg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.3.2.tgz", + "integrity": "sha512-74SFD6WluwvgsOPqifYOviEEVwDxslxfhakTlra+JviaNcs7KK/rjsPj89kVEoQc9FUxRkAofaJnHIR7pb4TSQ==", "license": "MIT", "dependencies": { "@ai-sdk/react": "^2.0.30", "@algolia/autocomplete-core": "1.19.2", - "@docsearch/css": "4.1.0", + "@docsearch/core": "4.3.1", + "@docsearch/css": "4.3.2", "ai": "^5.0.30", "algoliasearch": "^5.28.0", "marked": "^16.3.0", @@ -3424,9 +3490,9 @@ } }, "node_modules/@docusaurus/babel": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.9.1.tgz", - "integrity": "sha512-/uoi3oG+wvbVWNBRfPrzrEslOSeLxrQEyWMywK51TLDFTANqIRivzkMusudh5bdDty8fXzCYUT+tg5t697jYqg==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.9.2.tgz", + "integrity": "sha512-GEANdi/SgER+L7Japs25YiGil/AUDnFFHaCGPBbundxoWtCkA2lmy7/tFmgED4y1htAy6Oi4wkJEQdGssnw9MA==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.9", @@ -3439,8 +3505,8 @@ "@babel/runtime": "^7.25.9", "@babel/runtime-corejs3": "^7.25.9", "@babel/traverse": "^7.25.9", - "@docusaurus/logger": "3.9.1", - "@docusaurus/utils": "3.9.1", + "@docusaurus/logger": "3.9.2", + "@docusaurus/utils": "3.9.2", "babel-plugin-dynamic-import-node": "^2.3.3", "fs-extra": "^11.1.1", "tslib": "^2.6.0" @@ -3450,17 +3516,17 @@ } }, "node_modules/@docusaurus/bundler": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.9.1.tgz", - "integrity": "sha512-E1c9DgNmAz4NqbNtiJVp4UgjLtr8O01IgtXD/NDQ4PZaK8895cMiTOgb3k7mN0qX8A3lb8vqyrPJ842+yMpuUg==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.9.2.tgz", + "integrity": "sha512-ZOVi6GYgTcsZcUzjblpzk3wH1Fya2VNpd5jtHoCCFcJlMQ1EYXZetfAnRHLcyiFeBABaI1ltTYbOBtH/gahGVA==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.9", - "@docusaurus/babel": "3.9.1", - "@docusaurus/cssnano-preset": "3.9.1", - "@docusaurus/logger": "3.9.1", - "@docusaurus/types": "3.9.1", - "@docusaurus/utils": "3.9.1", + "@docusaurus/babel": "3.9.2", + "@docusaurus/cssnano-preset": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", "babel-loader": "^9.2.1", "clean-css": "^5.3.3", "copy-webpack-plugin": "^11.0.0", @@ -3492,55 +3558,19 @@ } } }, - "node_modules/@docusaurus/bundler/node_modules/@docusaurus/types": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", - "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/mdast": "^4.0.2", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.95.0", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/bundler/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "node_modules/@docusaurus/core": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.9.2.tgz", + "integrity": "sha512-HbjwKeC+pHUFBfLMNzuSjqFE/58+rLVKmOU3lxQrpsxLBOGosYco/Q0GduBb0/jEMRiyEqjNT/01rRdOMWq5pw==", "license": "MIT", "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@docusaurus/core": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.9.1.tgz", - "integrity": "sha512-FWDk1LIGD5UR5Zmm9rCrXRoxZUgbwuP6FBA7rc50DVfzqDOMkeMe3NyJhOsA2dF0zBE3VbHEIMmTjKwTZJwbaA==", - "license": "MIT", - "dependencies": { - "@docusaurus/babel": "3.9.1", - "@docusaurus/bundler": "3.9.1", - "@docusaurus/logger": "3.9.1", - "@docusaurus/mdx-loader": "3.9.1", - "@docusaurus/utils": "3.9.1", - "@docusaurus/utils-common": "3.9.1", - "@docusaurus/utils-validation": "3.9.1", + "@docusaurus/babel": "3.9.2", + "@docusaurus/bundler": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", "boxen": "^6.2.1", "chalk": "^4.1.2", "chokidar": "^3.5.3", @@ -3590,9 +3620,9 @@ } }, "node_modules/@docusaurus/cssnano-preset": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.9.1.tgz", - "integrity": "sha512-2y7+s7RWQMqBg+9ejeKwvZs7Bdw/hHIVJIodwMXbs2kr+S48AhcmAfdOh6Cwm0unJb0hJUshN0ROwRoQMwl3xg==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.9.2.tgz", + "integrity": "sha512-8gBKup94aGttRduABsj7bpPFTX7kbwu+xh3K9NMCF5K4bWBqTFYW+REKHF6iBVDHRJ4grZdIPbvkiHd/XNKRMQ==", "license": "MIT", "dependencies": { "cssnano-preset-advanced": "^6.1.2", @@ -3605,9 +3635,9 @@ } }, "node_modules/@docusaurus/logger": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.9.1.tgz", - "integrity": "sha512-C9iFzXwHzwvGlisE4bZx+XQE0JIqlGAYAd5LzpR7fEDgjctu7yL8bE5U4nTNywXKHURDzMt4RJK8V6+stFHVkA==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.9.2.tgz", + "integrity": "sha512-/SVCc57ByARzGSU60c50rMyQlBuMIJCjcsJlkphxY6B0GV4UH3tcA1994N8fFfbJ9kX3jIBe/xg3XP5qBtGDbA==", "license": "MIT", "dependencies": { "chalk": "^4.1.2", @@ -3618,14 +3648,14 @@ } }, "node_modules/@docusaurus/mdx-loader": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.9.1.tgz", - "integrity": "sha512-/1PY8lqry8jCt0qZddJSpc0U2sH6XC27kVJZfpA7o2TiQ3mdBQyH5AVbj/B2m682B1ounE+XjI0LdpOkAQLPoA==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.9.2.tgz", + "integrity": "sha512-wiYoGwF9gdd6rev62xDU8AAM8JuLI/hlwOtCzMmYcspEkzecKrP8J8X+KpYnTlACBUUtXNJpSoCwFWJhLRevzQ==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.9.1", - "@docusaurus/utils": "3.9.1", - "@docusaurus/utils-validation": "3.9.1", + "@docusaurus/logger": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", "@mdx-js/mdx": "^3.0.0", "@slorber/remark-comment": "^1.0.0", "escape-html": "^1.0.3", @@ -3660,7 +3690,6 @@ "version": "3.9.2", "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.2.tgz", "integrity": "sha512-8qVe2QA9hVLzvnxP46ysuofJUIc/yYQ82tvA/rBTrnpXtCjNSFLxEZfd5U8cYZuJIVlkPxamsIgwd5tGZXfvew==", - "dev": true, "license": "MIT", "dependencies": { "@docusaurus/types": "3.9.2", @@ -3677,19 +3706,19 @@ } }, "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.9.1.tgz", - "integrity": "sha512-vT6kIimpJLWvW9iuWzH4u7VpTdsGlmn4yfyhq0/Kb1h4kf9uVouGsTmrD7WgtYBUG1P+TSmQzUUQa+ALBSRTig==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.1", - "@docusaurus/logger": "3.9.1", - "@docusaurus/mdx-loader": "3.9.1", - "@docusaurus/theme-common": "3.9.1", - "@docusaurus/types": "3.9.1", - "@docusaurus/utils": "3.9.1", - "@docusaurus/utils-common": "3.9.1", - "@docusaurus/utils-validation": "3.9.1", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.9.2.tgz", + "integrity": "sha512-3I2HXy3L1QcjLJLGAoTvoBnpOwa6DPUa3Q0dMK19UTY9mhPkKQg/DYhAGTiBUKcTR0f08iw7kLPqOhIgdV3eVQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", "cheerio": "1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^11.1.1", @@ -3710,58 +3739,21 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/plugin-content-blog/node_modules/@docusaurus/types": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", - "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/mdast": "^4.0.2", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.95.0", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-blog/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.1.tgz", - "integrity": "sha512-DyLk9BIA6I9gPIuia8XIL+XIEbNnExam6AHzRsfrEq4zJr7k/DsWW7oi4aJMepDnL7jMRhpVcdsCxdjb0/A9xg==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", + "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "license": "MIT", - "peer": true, "dependencies": { - "@docusaurus/core": "3.9.1", - "@docusaurus/logger": "3.9.1", - "@docusaurus/mdx-loader": "3.9.1", - "@docusaurus/module-type-aliases": "3.9.1", - "@docusaurus/theme-common": "3.9.1", - "@docusaurus/types": "3.9.1", - "@docusaurus/utils": "3.9.1", - "@docusaurus/utils-common": "3.9.1", - "@docusaurus/utils-validation": "3.9.1", + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", "@types/react-router-config": "^5.0.7", "combine-promises": "^1.1.0", "fs-extra": "^11.1.1", @@ -3780,181 +3772,54 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/module-type-aliases": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.1.tgz", - "integrity": "sha512-YBce3GbJGGcMbJTyHcnEOMvdXqg41pa5HsrMCGA5Rm4z0h0tHS6YtEldj0mlfQRhCG7Y0VD66t2tb87Aom+11g==", + "node_modules/@docusaurus/plugin-content-pages": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.9.2.tgz", + "integrity": "sha512-s4849w/p4noXUrGpPUF0BPqIAfdAe76BLaRGAGKZ1gTDNiGxGcpsLcwJ9OTi1/V8A+AzvsmI9pkjie2zjIQZKA==", "license": "MIT", "dependencies": { - "@docusaurus/types": "3.9.1", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" + "@docusaurus/core": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0", + "webpack": "^5.88.1" }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/types": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", - "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/mdast": "^4.0.2", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.95.0", - "webpack-merge": "^5.9.0" + "engines": { + "node": ">=20.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/plugin-content-docs/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "node_modules/@docusaurus/plugin-css-cascade-layers": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.9.2.tgz", + "integrity": "sha512-w1s3+Ss+eOQbscGM4cfIFBlVg/QKxyYgj26k5AnakuHkKxH6004ZtuLe5awMBotIYF2bbGDoDhpgQ4r/kcj4rQ==", "license": "MIT", "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "tslib": "^2.6.0" }, "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.9.1.tgz", - "integrity": "sha512-/1wFzRnXYASI+Nv9ck9IVPIMw0O5BGQ8ZVhDzEwhkL+tl44ycvSnY6PIe6rW2HLxsw61Z3WFwAiU8+xMMtMZpg==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.1", - "@docusaurus/mdx-loader": "3.9.1", - "@docusaurus/types": "3.9.1", - "@docusaurus/utils": "3.9.1", - "@docusaurus/utils-validation": "3.9.1", - "fs-extra": "^11.1.1", - "tslib": "^2.6.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-pages/node_modules/@docusaurus/types": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", - "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/mdast": "^4.0.2", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.95.0", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-pages/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@docusaurus/plugin-css-cascade-layers": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.9.1.tgz", - "integrity": "sha512-/QyW2gRCk/XE3ttCK/ERIgle8KJ024dBNKMu6U5SmpJvuT2il1n5jR/48Pp/9wEwut8WVml4imNm6X8JsL5A0Q==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.1", - "@docusaurus/types": "3.9.1", - "@docusaurus/utils": "3.9.1", - "@docusaurus/utils-validation": "3.9.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/plugin-css-cascade-layers/node_modules/@docusaurus/types": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", - "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/mdast": "^4.0.2", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.95.0", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-css-cascade-layers/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" + "node": ">=20.0" } }, "node_modules/@docusaurus/plugin-debug": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.9.1.tgz", - "integrity": "sha512-qPeAuk0LccC251d7jg2MRhNI+o7niyqa924oEM/AxnZJvIpMa596aAxkRImiAqNN6+gtLE1Hkrz/RHUH2HDGsA==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.9.2.tgz", + "integrity": "sha512-j7a5hWuAFxyQAkilZwhsQ/b3T7FfHZ+0dub6j/GxKNFJp2h9qk/P1Bp7vrGASnvA9KNQBBL1ZXTe7jlh4VdPdA==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.9.1", - "@docusaurus/types": "3.9.1", - "@docusaurus/utils": "3.9.1", + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", "fs-extra": "^11.1.1", "react-json-view-lite": "^2.3.0", "tslib": "^2.6.0" @@ -3967,51 +3832,15 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/plugin-debug/node_modules/@docusaurus/types": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", - "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/mdast": "^4.0.2", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.95.0", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-debug/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.9.1.tgz", - "integrity": "sha512-k4Qq2HphqOrIU/CevGPdEO1yJnWUI8m0zOJsYt5NfMJwNsIn/gDD6gv/DKD+hxHndQT5pacsfBd4BWHZVNVroQ==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.9.2.tgz", + "integrity": "sha512-mAwwQJ1Us9jL/lVjXtErXto4p4/iaLlweC54yDUK1a97WfkC6Z2k5/769JsFgwOwOP+n5mUQGACXOEQ0XDuVUw==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.9.1", - "@docusaurus/types": "3.9.1", - "@docusaurus/utils-validation": "3.9.1", + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", "tslib": "^2.6.0" }, "engines": { @@ -4022,51 +3851,15 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/plugin-google-analytics/node_modules/@docusaurus/types": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", - "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/mdast": "^4.0.2", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.95.0", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-analytics/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.9.1.tgz", - "integrity": "sha512-n9BURBiQyJKI/Ecz35IUjXYwXcgNCSq7/eA07+ZYcDiSyH2p/EjPf8q/QcZG3CyEJPZ/SzGkDHePfcVPahY4Gg==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.9.2.tgz", + "integrity": "sha512-YJ4lDCphabBtw19ooSlc1MnxtYGpjFV9rEdzjLsUnBCeis2djUyCozZaFhCg6NGEwOn7HDDyMh0yzcdRpnuIvA==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.9.1", - "@docusaurus/types": "3.9.1", - "@docusaurus/utils-validation": "3.9.1", + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", "@types/gtag.js": "^0.0.12", "tslib": "^2.6.0" }, @@ -4078,51 +3871,15 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/plugin-google-gtag/node_modules/@docusaurus/types": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", - "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/mdast": "^4.0.2", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.95.0", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-gtag/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.9.1.tgz", - "integrity": "sha512-rZAQZ25ZuXaThBajxzLjXieTDUCMmBzfAA6ThElQ3o7Q+LEpOjCIrwGFau0KLY9HeG6x91+FwwsAM8zeApYDrg==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.9.2.tgz", + "integrity": "sha512-LJtIrkZN/tuHD8NqDAW1Tnw0ekOwRTfobWPsdO15YxcicBo2ykKF0/D6n0vVBfd3srwr9Z6rzrIWYrMzBGrvNw==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.9.1", - "@docusaurus/types": "3.9.1", - "@docusaurus/utils-validation": "3.9.1", + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", "tslib": "^2.6.0" }, "engines": { @@ -4133,182 +3890,21 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/plugin-google-tag-manager/node_modules/@docusaurus/types": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", - "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/mdast": "^4.0.2", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.95.0", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-tag-manager/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.9.1.tgz", - "integrity": "sha512-k/bf5cXDxAJUYTzqatgFJwmZsLUbIgl6S8AdZMKGG2Mv2wcOHt+EQNN9qPyWZ5/9cFj+Q8f8DN+KQheBMYLong==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.1", - "@docusaurus/logger": "3.9.1", - "@docusaurus/types": "3.9.1", - "@docusaurus/utils": "3.9.1", - "@docusaurus/utils-common": "3.9.1", - "@docusaurus/utils-validation": "3.9.1", - "fs-extra": "^11.1.1", - "sitemap": "^7.1.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-sitemap/node_modules/@docusaurus/types": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", - "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/mdast": "^4.0.2", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.95.0", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-sitemap/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@docusaurus/plugin-svgr": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.9.1.tgz", - "integrity": "sha512-TeZOXT2PSdTNR1OpDJMkYqFyX7MMhbd4t16hQByXksgZQCXNyw3Dio+KaDJ2Nj+LA4WkOvsk45bWgYG5MAaXSQ==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.1", - "@docusaurus/types": "3.9.1", - "@docusaurus/utils": "3.9.1", - "@docusaurus/utils-validation": "3.9.1", - "@svgr/core": "8.1.0", - "@svgr/webpack": "^8.1.0", - "tslib": "^2.6.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-svgr/node_modules/@docusaurus/types": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", - "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/mdast": "^4.0.2", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.95.0", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-svgr/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@docusaurus/preset-classic": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.9.1.tgz", - "integrity": "sha512-ZHga2xsxxsyd0dN1BpLj8S889Eu9eMBuj2suqxdw/vaaXu/FjJ8KEGbcaeo6nHPo8VQcBBnPEdkBtSDm2TfMNw==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.1", - "@docusaurus/plugin-content-blog": "3.9.1", - "@docusaurus/plugin-content-docs": "3.9.1", - "@docusaurus/plugin-content-pages": "3.9.1", - "@docusaurus/plugin-css-cascade-layers": "3.9.1", - "@docusaurus/plugin-debug": "3.9.1", - "@docusaurus/plugin-google-analytics": "3.9.1", - "@docusaurus/plugin-google-gtag": "3.9.1", - "@docusaurus/plugin-google-tag-manager": "3.9.1", - "@docusaurus/plugin-sitemap": "3.9.1", - "@docusaurus/plugin-svgr": "3.9.1", - "@docusaurus/theme-classic": "3.9.1", - "@docusaurus/theme-common": "3.9.1", - "@docusaurus/theme-search-algolia": "3.9.1", - "@docusaurus/types": "3.9.1" + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.9.2.tgz", + "integrity": "sha512-WLh7ymgDXjG8oPoM/T4/zUP7KcSuFYRZAUTl8vR6VzYkfc18GBM4xLhcT+AKOwun6kBivYKUJf+vlqYJkm+RHw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "fs-extra": "^11.1.1", + "sitemap": "^7.1.1", + "tslib": "^2.6.0" }, "engines": { "node": ">=20.0" @@ -4318,61 +3914,78 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/preset-classic/node_modules/@docusaurus/types": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", - "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", + "node_modules/@docusaurus/plugin-svgr": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.9.2.tgz", + "integrity": "sha512-n+1DE+5b3Lnf27TgVU5jM1d4x5tUh2oW5LTsBxJX4PsAPV0JGcmI6p3yLYtEY0LRVEIJh+8RsdQmRE66wSV8mw==", "license": "MIT", "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/mdast": "^4.0.2", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.95.0", - "webpack-merge": "^5.9.0" + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "@svgr/core": "8.1.0", + "@svgr/webpack": "^8.1.0", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/preset-classic/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" + "node_modules/@docusaurus/preset-classic": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.9.2.tgz", + "integrity": "sha512-IgyYO2Gvaigi21LuDIe+nvmN/dfGXAiMcV/murFqcpjnZc7jxFAxW+9LEjdPt61uZLxG4ByW/oUmX/DDK9t/8w==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/plugin-content-blog": "3.9.2", + "@docusaurus/plugin-content-docs": "3.9.2", + "@docusaurus/plugin-content-pages": "3.9.2", + "@docusaurus/plugin-css-cascade-layers": "3.9.2", + "@docusaurus/plugin-debug": "3.9.2", + "@docusaurus/plugin-google-analytics": "3.9.2", + "@docusaurus/plugin-google-gtag": "3.9.2", + "@docusaurus/plugin-google-tag-manager": "3.9.2", + "@docusaurus/plugin-sitemap": "3.9.2", + "@docusaurus/plugin-svgr": "3.9.2", + "@docusaurus/theme-classic": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/theme-search-algolia": "3.9.2", + "@docusaurus/types": "3.9.2" }, "engines": { - "node": ">=10.0.0" + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@docusaurus/theme-classic": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.9.1.tgz", - "integrity": "sha512-LrAIu/mQ04nG6s1cssC0TMmICD8twFIIn/hJ5Pd9uIPQvtKnyAKEn12RefopAul5KfMo9kixPaqogV5jIJr26w==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.1", - "@docusaurus/logger": "3.9.1", - "@docusaurus/mdx-loader": "3.9.1", - "@docusaurus/module-type-aliases": "3.9.1", - "@docusaurus/plugin-content-blog": "3.9.1", - "@docusaurus/plugin-content-docs": "3.9.1", - "@docusaurus/plugin-content-pages": "3.9.1", - "@docusaurus/theme-common": "3.9.1", - "@docusaurus/theme-translations": "3.9.1", - "@docusaurus/types": "3.9.1", - "@docusaurus/utils": "3.9.1", - "@docusaurus/utils-common": "3.9.1", - "@docusaurus/utils-validation": "3.9.1", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.9.2.tgz", + "integrity": "sha512-IGUsArG5hhekXd7RDb11v94ycpJpFdJPkLnt10fFQWOVxAtq5/D7hT6lzc2fhyQKaaCE62qVajOMKL7OiAFAIA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/plugin-content-blog": "3.9.2", + "@docusaurus/plugin-content-docs": "3.9.2", + "@docusaurus/plugin-content-pages": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/theme-translations": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "infima": "0.2.0-alpha.45", @@ -4394,71 +4007,16 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/module-type-aliases": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.1.tgz", - "integrity": "sha512-YBce3GbJGGcMbJTyHcnEOMvdXqg41pa5HsrMCGA5Rm4z0h0tHS6YtEldj0mlfQRhCG7Y0VD66t2tb87Aom+11g==", - "license": "MIT", - "dependencies": { - "@docusaurus/types": "3.9.1", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/types": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", - "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/mdast": "^4.0.2", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.95.0", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/theme-classic/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@docusaurus/theme-common": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.9.1.tgz", - "integrity": "sha512-j9adi961F+6Ps9d0jcb5BokMcbjXAAJqKkV43eo8nh4YgmDj7KUNDX4EnOh/MjTQeO06oPY5cxp3yUXdW/8Ggw==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.9.2.tgz", + "integrity": "sha512-6c4DAbR6n6nPbnZhY2V3tzpnKnGL+6aOsLvFL26VRqhlczli9eWG0VDUNoCQEPnGwDMhPS42UhSAnz5pThm5Ag==", "license": "MIT", "dependencies": { - "@docusaurus/mdx-loader": "3.9.1", - "@docusaurus/module-type-aliases": "3.9.1", - "@docusaurus/utils": "3.9.1", - "@docusaurus/utils-common": "3.9.1", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -4477,72 +4035,17 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/theme-common/node_modules/@docusaurus/module-type-aliases": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.1.tgz", - "integrity": "sha512-YBce3GbJGGcMbJTyHcnEOMvdXqg41pa5HsrMCGA5Rm4z0h0tHS6YtEldj0mlfQRhCG7Y0VD66t2tb87Aom+11g==", - "license": "MIT", - "dependencies": { - "@docusaurus/types": "3.9.1", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@docusaurus/theme-common/node_modules/@docusaurus/types": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", - "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/mdast": "^4.0.2", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.95.0", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/theme-common/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@docusaurus/theme-mermaid": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.9.1.tgz", - "integrity": "sha512-aKMFlQfxueVBPdCdrNSshG12fOkJXSn1sb6EhI/sGn3UpiTEiazJm4QLP6NoF78mqq8O5Ar2Yll+iHWLvCsuZQ==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.9.2.tgz", + "integrity": "sha512-5vhShRDq/ntLzdInsQkTdoKWSzw8d1jB17sNPYhA/KvYYFXfuVEGHLM6nrf8MFbV8TruAHDG21Fn3W4lO8GaDw==", "license": "MIT", "dependencies": { - "@docusaurus/core": "3.9.1", - "@docusaurus/module-type-aliases": "3.9.1", - "@docusaurus/theme-common": "3.9.1", - "@docusaurus/types": "3.9.1", - "@docusaurus/utils-validation": "3.9.1", + "@docusaurus/core": "3.9.2", + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", "mermaid": ">=11.6.0", "tslib": "^2.6.0" }, @@ -4560,75 +4063,20 @@ } } }, - "node_modules/@docusaurus/theme-mermaid/node_modules/@docusaurus/module-type-aliases": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.1.tgz", - "integrity": "sha512-YBce3GbJGGcMbJTyHcnEOMvdXqg41pa5HsrMCGA5Rm4z0h0tHS6YtEldj0mlfQRhCG7Y0VD66t2tb87Aom+11g==", - "license": "MIT", - "dependencies": { - "@docusaurus/types": "3.9.1", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@docusaurus/theme-mermaid/node_modules/@docusaurus/types": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", - "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/mdast": "^4.0.2", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.95.0", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/theme-mermaid/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@docusaurus/theme-search-algolia": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.9.1.tgz", - "integrity": "sha512-WjM28bzlgfT6nHlEJemkwyGVpvGsZWPireV/w+wZ1Uo64xCZ8lNOb4xwQRukDaLSed3oPBN0gSnu06l5VuCXHg==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.9.2.tgz", + "integrity": "sha512-GBDSFNwjnh5/LdkxCKQHkgO2pIMX1447BxYUBG2wBiajS21uj64a+gH/qlbQjDLxmGrbrllBrtJkUHxIsiwRnw==", "license": "MIT", "dependencies": { "@docsearch/react": "^3.9.0 || ^4.1.0", - "@docusaurus/core": "3.9.1", - "@docusaurus/logger": "3.9.1", - "@docusaurus/plugin-content-docs": "3.9.1", - "@docusaurus/theme-common": "3.9.1", - "@docusaurus/theme-translations": "3.9.1", - "@docusaurus/utils": "3.9.1", - "@docusaurus/utils-validation": "3.9.1", + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/plugin-content-docs": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/theme-translations": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", "algoliasearch": "^5.37.0", "algoliasearch-helper": "^3.26.0", "clsx": "^2.0.0", @@ -4647,9 +4095,9 @@ } }, "node_modules/@docusaurus/theme-translations": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.9.1.tgz", - "integrity": "sha512-mUQd49BSGKTiM6vP9+JFgRJL28lMIN3PUvXjF3rzuOHMByUZUBNwCt26Z23GkKiSIOrRkjKoaBNTipR/MHdYSQ==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.9.2.tgz", + "integrity": "sha512-vIryvpP18ON9T9rjgMRFLr2xJVDpw1rtagEGf8Ccce4CkTrvM/fRB8N2nyWYOW5u3DdjkwKw5fBa+3tbn9P4PA==", "license": "MIT", "dependencies": { "fs-extra": "^11.1.1", @@ -4670,7 +4118,6 @@ "version": "3.9.2", "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", - "dev": true, "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", @@ -4693,7 +4140,6 @@ "version": "5.10.0", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "dev": true, "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", @@ -4705,14 +4151,14 @@ } }, "node_modules/@docusaurus/utils": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.9.1.tgz", - "integrity": "sha512-YAL4yhhWLl9DXuf5MVig260a6INz4MehrBGFU/CZu8yXmRiYEuQvRFWh9ZsjfAOyaG7za1MNmBVZ4VVAi/CiJA==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.9.2.tgz", + "integrity": "sha512-lBSBiRruFurFKXr5Hbsl2thmGweAPmddhF3jb99U4EMDA5L+e5Y1rAkOS07Nvrup7HUMBDrCV45meaxZnt28nQ==", "license": "MIT", "dependencies": { - "@docusaurus/logger": "3.9.1", - "@docusaurus/types": "3.9.1", - "@docusaurus/utils-common": "3.9.1", + "@docusaurus/logger": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils-common": "3.9.2", "escape-string-regexp": "^4.0.0", "execa": "5.1.1", "file-loader": "^6.2.0", @@ -4737,107 +4183,35 @@ } }, "node_modules/@docusaurus/utils-common": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.9.1.tgz", - "integrity": "sha512-4M1u5Q8Zn2CYL2TJ864M51FV4YlxyGyfC3x+7CLuR6xsyTVNBNU4QMcPgsTHRS9J2+X6Lq7MyH6hiWXyi/sXUQ==", - "license": "MIT", - "dependencies": { - "@docusaurus/types": "3.9.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/utils-common/node_modules/@docusaurus/types": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", - "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/mdast": "^4.0.2", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.95.0", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/utils-common/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@docusaurus/utils-validation": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.9.1.tgz", - "integrity": "sha512-5bzab5si3E1udrlZuVGR17857Lfwe8iFPoy5AvMP9PXqDfoyIKT7gDQgAmxdRDMurgHaJlyhXEHHdzDKkOxxZQ==", - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.9.1", - "@docusaurus/utils": "3.9.1", - "@docusaurus/utils-common": "3.9.1", - "fs-extra": "^11.2.0", - "joi": "^17.9.2", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/utils/node_modules/@docusaurus/types": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.1.tgz", - "integrity": "sha512-ElekJ29sk39s5LTEZMByY1c2oH9FMtw7KbWFU3BtuQ1TytfIK39HhUivDEJvm5KCLyEnnfUZlvSNDXeyk0vzAA==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.9.2.tgz", + "integrity": "sha512-I53UC1QctruA6SWLvbjbhCpAw7+X7PePoe5pYcwTOEXD/PxeP8LnECAhTHHwWCblyUX5bMi4QLRkxvyZ+IT8Aw==", "license": "MIT", "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/mdast": "^4.0.2", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.95.0", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "@docusaurus/types": "3.9.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" } }, - "node_modules/@docusaurus/utils/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "node_modules/@docusaurus/utils-validation": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.9.2.tgz", + "integrity": "sha512-l7yk3X5VnNmATbwijJkexdhulNsQaNDwoagiwujXoxFbWLcxHQqNQ+c/IAlzrfMMOfa/8xSBZ7KEKDesE/2J7A==", "license": "MIT", "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" + "@docusaurus/logger": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "fs-extra": "^11.2.0", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=20.0" } }, "node_modules/@eslint-community/eslint-utils": { @@ -4859,10 +4233,23 @@ "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.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -4911,9 +4298,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4923,7 +4310,7 @@ "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", + "js-yaml": "^4.1.1", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, @@ -4998,7 +4385,6 @@ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.2.tgz", "integrity": "sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==", "license": "MIT", - "peer": true, "dependencies": { "@fortawesome/fontawesome-common-types": "6.7.2" }, @@ -5019,16 +4405,17 @@ } }, "node_modules/@fortawesome/react-fontawesome": { - "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==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.6.tgz", + "integrity": "sha512-mtBFIi1UsYQo7rYonYFkjgYKGoL8T+fEH6NGUpvuqtY3ytMsAoDaPo5rk25KuMtKDipY4bGYM/CkmCHA1N3FUg==", + "deprecated": "v0.2.x is no longer supported. Unless you are still using FontAwesome 5, please update to v3.1.1 or greater.", "license": "MIT", "dependencies": { "prop-types": "^15.8.1" }, "peerDependencies": { - "@fortawesome/fontawesome-svg-core": "~1 || ~6", - "react": ">=16.3" + "@fortawesome/fontawesome-svg-core": "~1 || ~6 || ~7", + "react": "^16.3 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/@hapi/hoek": { @@ -5057,33 +4444,19 @@ } }, "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" + "@humanwhocodes/retry": "^0.4.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", @@ -5099,9 +4472,9 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", - "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -5119,31 +4492,14 @@ "license": "MIT" }, "node_modules/@iconify/utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.3.0.tgz", - "integrity": "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.0.tgz", + "integrity": "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==", "license": "MIT", "dependencies": { - "@antfu/install-pkg": "^1.0.0", - "@antfu/utils": "^8.1.0", + "@antfu/install-pkg": "^1.1.0", "@iconify/types": "^2.0.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" + "mlly": "^1.8.0" } }, "node_modules/@isaacs/cliui": { @@ -5252,9 +4608,9 @@ } }, "node_modules/@jridgewell/source-map": { - "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==", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -5262,9 +4618,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { @@ -5301,9 +4657,9 @@ } }, "node_modules/@jsonjoy.com/buffers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.0.0.tgz", - "integrity": "sha512-NDigYR3PHqCnQLXYyoLbnEdzMMvzeiCWo1KOut7Q0CoIqg9tUAPKJ1iq/2nFhc5kZtexzutNY0LFjdwWL3Dw3Q==", + "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" @@ -5333,18 +4689,19 @@ } }, "node_modules/@jsonjoy.com/json-pack": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.14.0.tgz", - "integrity": "sha512-LpWbYgVnKzphN5S6uss4M25jJ/9+m6q6UJoeN6zTkK4xAGhKsiBRPVeF7OYMWonn5repMQbE5vieRXcMUrKDKw==", + "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.0.0", + "@jsonjoy.com/buffers": "^1.2.0", "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/json-pointer": "^1.0.1", + "@jsonjoy.com/json-pointer": "^1.0.2", "@jsonjoy.com/util": "^1.9.0", "hyperdyperid": "^1.2.0", - "thingies": "^2.5.0" + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" }, "engines": { "node": ">=10.0" @@ -5404,15 +4761,16 @@ "license": "MIT" }, "node_modules/@mdx-js/mdx": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.0.tgz", - "integrity": "sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", "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", @@ -5440,11 +4798,10 @@ } }, "node_modules/@mdx-js/react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.0.tgz", - "integrity": "sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", + "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", - "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -5458,9 +4815,9 @@ } }, "node_modules/@mermaid-js/parser": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.2.tgz", - "integrity": "sha512-+PO02uGF6L6Cs0Bw8RpGhikVvMWEysfAyl27qTlroUB8jSWr1lL0Sf6zi78ZxlSnmgSY2AMMKVgghnN9jTtwkQ==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.3.tgz", + "integrity": "sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==", "license": "MIT", "dependencies": { "langium": "3.3.1" @@ -5537,16 +4894,6 @@ "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", @@ -5568,16 +4915,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "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": "ISC", - "engines": { - "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", @@ -5874,9 +5211,9 @@ } }, "node_modules/@polka/url": { - "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==", + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", "license": "MIT" }, "node_modules/@sideway/address": { @@ -5930,9 +5267,9 @@ } }, "node_modules/@standard-schema/spec": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", - "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", "license": "MIT" }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { @@ -6094,7 +5431,6 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -6214,15 +5550,6 @@ "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", @@ -6310,9 +5637,9 @@ } }, "node_modules/@types/d3-array": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", "license": "MIT" }, "node_modules/@types/d3-axis": { @@ -6362,9 +5689,9 @@ "license": "MIT" }, "node_modules/@types/d3-dispatch": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", - "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", "license": "MIT" }, "node_modules/@types/d3-drag": { @@ -6569,21 +5896,21 @@ } }, "node_modules/@types/express": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", - "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", - "@types/serve-static": "*" + "@types/serve-static": "^1" } }, "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==", + "version": "4.19.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz", + "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -6649,9 +5976,9 @@ "license": "MIT" }, "node_modules/@types/http-proxy": { - "version": "1.17.16", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", - "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "version": "1.17.17", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", + "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -6702,9 +6029,9 @@ "license": "MIT" }, "node_modules/@types/lodash": { - "version": "4.17.16", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.16.tgz", - "integrity": "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ==", "dev": true, "license": "MIT" }, @@ -6743,12 +6070,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.13.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", - "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "version": "25.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz", + "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==", "license": "MIT", "dependencies": { - "undici-types": "~6.20.0" + "undici-types": "~7.16.0" } }, "node_modules/@types/node-forge": { @@ -6767,9 +6094,9 @@ "license": "MIT" }, "node_modules/@types/prop-types": { - "version": "15.7.14", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", - "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", "license": "MIT" }, "node_modules/@types/qs": { @@ -6785,14 +6112,13 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", - "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", + "version": "18.3.27", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", + "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", "license": "MIT", - "peer": true, "dependencies": { "@types/prop-types": "*", - "csstype": "^3.0.2" + "csstype": "^3.2.2" } }, "node_modules/@types/react-helmet": { @@ -6853,12 +6179,11 @@ } }, "node_modules/@types/send": { - "version": "0.17.5", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", - "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", "license": "MIT", "dependencies": { - "@types/mime": "^1", "@types/node": "*" } }, @@ -6872,14 +6197,24 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", - "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", "license": "MIT", "dependencies": { "@types/http-errors": "*", "@types/node": "*", - "@types/send": "*" + "@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": "*" } }, "node_modules/@types/sockjs": { @@ -6921,9 +6256,9 @@ } }, "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", "license": "MIT", "dependencies": { "@types/yargs-parser": "*" @@ -6980,7 +6315,6 @@ "integrity": "sha512-6/cmF2piao+f6wSxUsJLZjck7OQsYyRtcOZS02k7XINSNlz93v6emM8WutDQSXnroG2xwYlEVHJI+cPA7CPM3Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.50.0", "@typescript-eslint/types": "8.50.0", @@ -7192,25 +6526,21 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@ungap/structured-clone": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "license": "ISC" }, + "node_modules/@vercel/oidc": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.0.5.tgz", + "integrity": "sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 20" + } + }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", @@ -7427,7 +6757,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -7491,14 +6820,14 @@ } }, "node_modules/ai": { - "version": "5.0.59", - "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.59.tgz", - "integrity": "sha512-SuAFxKXt2Ha9FiXB3gaOITkOg9ek/3QNVatGVExvTT4gNXc+hJpuNe1dmuwf6Z5Op4fzc8wdbsrYP27ZCXBzlw==", + "version": "5.0.114", + "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.114.tgz", + "integrity": "sha512-q/lxcJA6avYn/TXTaE41VX6p9lN245mDU9bIGuPpfk6WxDMvmMoUKUIS0/aXAPYN3UmkUn/r9rvq/8C98RoCWw==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/gateway": "1.0.32", + "@ai-sdk/gateway": "2.0.21", "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.10", + "@ai-sdk/provider-utils": "3.0.19", "@opentelemetry/api": "1.9.0" }, "engines": { @@ -7513,7 +6842,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -7574,35 +6902,34 @@ } }, "node_modules/algoliasearch": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.39.0.tgz", - "integrity": "sha512-DzTfhUxzg9QBNGzU/0kZkxEV72TeA4MmPJ7RVfLnQwHNhhliPo7ynglEWJS791rNlLFoTyrKvkapwr/P3EXV9A==", - "license": "MIT", - "peer": true, - "dependencies": { - "@algolia/abtesting": "1.5.0", - "@algolia/client-abtesting": "5.39.0", - "@algolia/client-analytics": "5.39.0", - "@algolia/client-common": "5.39.0", - "@algolia/client-insights": "5.39.0", - "@algolia/client-personalization": "5.39.0", - "@algolia/client-query-suggestions": "5.39.0", - "@algolia/client-search": "5.39.0", - "@algolia/ingestion": "1.39.0", - "@algolia/monitoring": "1.39.0", - "@algolia/recommend": "5.39.0", - "@algolia/requester-browser-xhr": "5.39.0", - "@algolia/requester-fetch": "5.39.0", - "@algolia/requester-node-http": "5.39.0" + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.0.tgz", + "integrity": "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==", + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.12.0", + "@algolia/client-abtesting": "5.46.0", + "@algolia/client-analytics": "5.46.0", + "@algolia/client-common": "5.46.0", + "@algolia/client-insights": "5.46.0", + "@algolia/client-personalization": "5.46.0", + "@algolia/client-query-suggestions": "5.46.0", + "@algolia/client-search": "5.46.0", + "@algolia/ingestion": "1.46.0", + "@algolia/monitoring": "1.46.0", + "@algolia/recommend": "5.46.0", + "@algolia/requester-browser-xhr": "5.46.0", + "@algolia/requester-fetch": "5.46.0", + "@algolia/requester-node-http": "5.46.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/algoliasearch-helper": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.26.0.tgz", - "integrity": "sha512-Rv2x3GXleQ3ygwhkhJubhhYGsICmShLAiqtUuJTUkr9uOCOXyF2E71LVT4XDnVffbknv8XgScP4U0Oxtgm+hIw==", + "version": "3.26.1", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.26.1.tgz", + "integrity": "sha512-CAlCxm4fYBXtvc5MamDzP6Svu8rW4z9me4DCBY1rQ2UDJ0u0flWmusQ8M3nOExZsLLRcUwUPoRAPMrhzOG3erw==", "license": "MIT", "dependencies": { "@algolia/events": "^4.0.1" @@ -7752,18 +7079,20 @@ "license": "MIT" }, "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" + "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" }, "engines": { "node": ">= 0.4" @@ -7899,9 +7228,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "version": "10.4.23", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", + "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", "funding": [ { "type": "opencollective", @@ -7918,10 +7247,9 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001760", + "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, @@ -8042,9 +7370,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.9.8", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.8.tgz", - "integrity": "sha512-Y1fOuNDowLfgKOypdc9SPABfoWXuZHBOyCS4cD52IeZBhr4Md6CLLs6atcxVrzRmQ06E7hSlm5bHHApPKR/byA==", + "version": "2.9.9", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.9.tgz", + "integrity": "sha512-V8fbOCSeOFvlDj7LLChUcqbZrdKD9RU/VR260piF1790vT0mfLSwGc/Qzxv3IqiTukOpNtItePa0HBpMAj7MDg==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.js" @@ -8078,23 +7406,23 @@ } }, "node_modules/body-parser": { - "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==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", "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.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8", @@ -8216,7 +7544,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -8516,7 +7843,6 @@ "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@chevrotain/cst-dts-gen": "11.0.3", "@chevrotain/gast": "11.0.3", @@ -8538,6 +7864,12 @@ "chevrotain": "^11.0.0" } }, + "node_modules/chevrotain/node_modules/lodash-es": { + "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/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -8852,9 +8184,9 @@ } }, "node_modules/confbox": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", - "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", "license": "MIT" }, "node_modules/config-chain": { @@ -8867,6 +8199,12 @@ "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", @@ -8929,18 +8267,18 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", "license": "MIT" }, "node_modules/copy-to-clipboard": { @@ -9020,9 +8358,9 @@ } }, "node_modules/core-js": { - "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==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.47.0.tgz", + "integrity": "sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -9031,12 +8369,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.45.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", - "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.47.0.tgz", + "integrity": "sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==", "license": "MIT", "dependencies": { - "browserslist": "^4.25.3" + "browserslist": "^4.28.0" }, "funding": { "type": "opencollective", @@ -9044,9 +8382,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.45.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.45.1.tgz", - "integrity": "sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.47.0.tgz", + "integrity": "sha512-BcxeDbzUrRnXGYIVAGFtcGQVNpFcUhVjr6W7F8XktvQW2iJP9e66GP6xdKotCRFlrxBvNIBrhwKteRXqMV86Nw==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -9162,9 +8500,9 @@ } }, "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { - "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -9236,11 +8574,10 @@ } }, "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { - "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -9380,9 +8717,9 @@ } }, "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", "license": "BSD-2-Clause", "engines": { "node": ">= 6" @@ -9392,9 +8729,9 @@ } }, "node_modules/cssdb": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.4.2.tgz", - "integrity": "sha512-PzjkRkRUS+IHDJohtxkIczlxPPZqRo0nXplsYXOMBRPjcVRjj1W4DfvRgshUYTVuUigU7ptVYkFJQ7abUB0nyg==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.5.2.tgz", + "integrity": "sha512-Pmoj9RmD8RIoIzA2EQWO4D4RMeDts0tgAH0VXdlNdxjuBGI3a9wMOIcUwaPNmD4r2qtIa06gqkIf7sECl+cBCg==", "funding": [ { "type": "opencollective", @@ -9550,17 +8887,16 @@ "license": "CC0-1.0" }, "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, "node_modules/cytoscape": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.32.0.tgz", - "integrity": "sha512-5JHBC9n75kz5851jeklCPmZWcg3hUe6sjqJvyk3+hVqFaKcHwHgxsjeN1yLmggoUc6STbtm9/NQyabQehfjvWQ==", + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", + "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10" } @@ -9970,7 +9306,6 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -10056,9 +9391,9 @@ } }, "node_modules/dagre-d3-es": { - "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==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.13.tgz", + "integrity": "sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==", "license": "MIT", "dependencies": { "d3": "^7.9.0", @@ -10120,9 +9455,9 @@ } }, "node_modules/dayjs": { - "version": "1.11.13", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "version": "1.11.19", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", "license": "MIT" }, "node_modules/debounce": { @@ -10132,9 +9467,9 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -10149,9 +9484,9 @@ } }, "node_modules/decode-named-character-reference": { - "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==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", "license": "MIT", "dependencies": { "character-entities": "^2.0.0" @@ -10214,9 +9549,9 @@ } }, "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz", + "integrity": "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==", "license": "MIT", "dependencies": { "bundle-name": "^4.1.0", @@ -10230,9 +9565,9 @@ } }, "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "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" @@ -10464,9 +9799,9 @@ } }, "node_modules/dompurify": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.6.tgz", - "integrity": "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz", + "integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" @@ -10599,9 +9934,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -10631,18 +9966,18 @@ "license": "MIT" }, "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { - "version": "1.23.9", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", - "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", "dev": true, "license": "MIT", "dependencies": { @@ -10650,18 +9985,18 @@ "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", - "call-bound": "^1.0.3", + "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", + "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.0", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", @@ -10673,21 +10008,24 @@ "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.0", + "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.3", + "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.3", + "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", @@ -10696,7 +10034,7 @@ "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.18" + "which-typed-array": "^1.1.19" }, "engines": { "node": ">= 0.4" @@ -10724,27 +10062,27 @@ } }, "node_modules/es-iterator-helpers": { - "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==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", + "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", - "call-bound": "^1.0.3", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", + "es-abstract": "^1.24.1", "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", + "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.6", + "get-intrinsic": "^1.3.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.4", + "iterator.prototype": "^1.1.5", "safe-array-concat": "^1.1.3" }, "engines": { @@ -10893,7 +10231,6 @@ "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -11094,19 +10431,6 @@ } }, "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/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==", @@ -11150,19 +10474,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "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", @@ -11279,9 +10590,9 @@ } }, "node_modules/estree-util-value-to-estree": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.4.0.tgz", - "integrity": "sha512-Zlp+gxis+gCfK12d3Srl2PdX2ybsEA8ZYy6vQGVQTNNYLEGRQQ56XB64bjemN8kxIKXP1nC9ip4Z+ILy9LGzvQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz", + "integrity": "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" @@ -11403,39 +10714,39 @@ } }, "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "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.13.0", + "qs": "~6.14.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" @@ -11490,12 +10801,6 @@ "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", @@ -11550,9 +10855,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "funding": [ { "type": "github", @@ -11699,17 +11004,17 @@ } }, "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", "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.1", + "statuses": "~2.0.2", "unpipe": "~1.0.0" }, "engines": { @@ -11887,15 +11192,15 @@ } }, "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", "license": "MIT", "engines": { "node": "*" }, "funding": { - "type": "patreon", + "type": "github", "url": "https://github.com/sponsors/rawify" } }, @@ -11909,9 +11214,9 @@ } }, "node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -11983,6 +11288,16 @@ "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", @@ -12106,9 +11421,9 @@ } }, "node_modules/glob-to-regex.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.0.1.tgz", - "integrity": "sha512-CG/iEvgQqfzoVsMUbxSJcwbG2JwyZ3naEqPkeltwl0BSS8Bp83k3xlGms+0QdWFUAwV+uvo80wNswKF6FWEkKg==", + "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" @@ -12281,9 +11596,9 @@ } }, "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "license": "MIT", "dependencies": { "argparse": "^1.0.7", @@ -12536,15 +11851,15 @@ } }, "node_modules/hast-util-to-parse5": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", - "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" @@ -12554,16 +11869,6 @@ "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", @@ -12753,9 +12058,9 @@ } }, "node_modules/html-webpack-plugin": { - "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==", + "version": "5.6.5", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.5.tgz", + "integrity": "sha512-4xynFbKNNk+WlzXeQQ+6YYsH2g7mpfPszQZUi3ovKlj+pDmngQ7vRXjrrmGROabmKwyQkcgcX5hqfOwHbFmK5g==", "license": "MIT", "dependencies": { "@types/html-minifier-terser": "^6.0.0", @@ -12834,9 +12139,9 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "license": "BSD-2-Clause" }, "node_modules/http-deceiver": { @@ -12846,19 +12151,23 @@ "license": "MIT" }, "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/http-parser-js": { @@ -13075,15 +12384,19 @@ "license": "ISC" }, "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" + "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/inline-style-parser": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", - "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", "license": "MIT" }, "node_modules/internal-slot": { @@ -13120,9 +12433,9 @@ } }, "node_modules/ipaddr.js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", + "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", "license": "MIT", "engines": { "node": ">= 10" @@ -13392,14 +12705,15 @@ } }, "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" }, @@ -13494,6 +12808,19 @@ "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.0", "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.0.tgz", @@ -13507,9 +12834,9 @@ } }, "node_modules/is-npm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.1.0.tgz", + "integrity": "sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==", "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -14001,9 +13328,9 @@ } }, "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -14029,9 +13356,9 @@ } }, "node_modules/katex": { - "version": "0.16.22", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.22.tgz", - "integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==", + "version": "0.16.27", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.27.tgz", + "integrity": "sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw==", "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" @@ -14085,12 +13412,6 @@ "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": "3.3.1", "resolved": "https://registry.npmjs.org/langium/-/langium-3.3.1.tgz", @@ -14123,9 +13444,9 @@ } }, "node_modules/launch-editor": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz", - "integrity": "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.12.0.tgz", + "integrity": "sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==", "license": "MIT", "dependencies": { "picocolors": "^1.1.1", @@ -14221,23 +13542,6 @@ "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", @@ -14261,9 +13565,9 @@ "license": "MIT" }, "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "version": "4.17.22", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.22.tgz", + "integrity": "sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==", "license": "MIT" }, "node_modules/lodash.debounce": { @@ -14366,9 +13670,9 @@ } }, "node_modules/marked": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-16.3.0.tgz", - "integrity": "sha512-K3UxuKu6l6bmA5FUwYho8CfJBlsUWAooKtdGgMcERSpF7gcBUrCGsLH7wDaaNOzwq18JzSUDyoEb/YsrqMac3w==", + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", + "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", "license": "MIT", "bin": { "marked": "bin/marked.js" @@ -14804,9 +14108,9 @@ } }, "node_modules/memfs": { - "version": "4.47.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.47.0.tgz", - "integrity": "sha512-Xey8IZA57tfotV/TN4d6BmccQuhFP+CqRiI7TTNdipZdZBzF2WnzUcH//Cudw6X4zJiUbo/LTuU/HPA/iC/pNg==", + "version": "4.51.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.51.1.tgz", + "integrity": "sha512-Eyt3XrufitN2ZL9c/uIRMyDwXanLI88h/L3MoWqNY747ha3dMR9dWqp8cRT5ntjZ0U1TNuq4U91ZXK0sMBjYOQ==", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/json-pack": "^1.11.0", @@ -14846,27 +14150,27 @@ } }, "node_modules/mermaid": { - "version": "11.10.1", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.10.1.tgz", - "integrity": "sha512-0PdeADVWURz7VMAX0+MiMcgfxFKY4aweSGsjgFihe3XlMKNqmai/cugMrqTd3WNHM93V+K+AZL6Wu6tB5HmxRw==", + "version": "11.12.2", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.12.2.tgz", + "integrity": "sha512-n34QPDPEKmaeCG4WDMGy0OT6PSyxKCfy2pJgShP+Qow2KLrvWjclwbc3yXfSIf4BanqWEhQEpngWwNp/XhZt6w==", "license": "MIT", "dependencies": { - "@braintree/sanitize-url": "^7.0.4", - "@iconify/utils": "^2.1.33", - "@mermaid-js/parser": "^0.6.2", + "@braintree/sanitize-url": "^7.1.1", + "@iconify/utils": "^3.0.1", + "@mermaid-js/parser": "^0.6.3", "@types/d3": "^7.4.3", "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.11", - "dayjs": "^1.11.13", + "dagre-d3-es": "7.0.13", + "dayjs": "^1.11.18", "dompurify": "^3.2.5", "katex": "^0.16.22", "khroma": "^2.1.0", "lodash-es": "^4.17.21", - "marked": "^16.0.0", + "marked": "^16.2.1", "roughjs": "^4.6.6", "stylis": "^4.3.6", "ts-dedent": "^2.2.0", @@ -15476,9 +14780,9 @@ "license": "MIT" }, "node_modules/micromark-extension-mdx-expression": { - "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==", + "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==", "funding": [ { "type": "GitHub Sponsors", @@ -15558,12 +14862,11 @@ "license": "MIT" }, "node_modules/micromark-extension-mdx-jsx": { - "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==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", "license": "MIT", "dependencies": { - "@types/acorn": "^4.0.0", "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", @@ -15842,9 +15145,9 @@ "license": "MIT" }, "node_modules/micromark-factory-mdx-expression": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.2.tgz", - "integrity": "sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==", + "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==", "funding": [ { "type": "GitHub Sponsors", @@ -16374,9 +15677,9 @@ "license": "MIT" }, "node_modules/micromark-util-events-to-acorn": { - "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==", + "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==", "funding": [ { "type": "GitHub Sponsors", @@ -16389,7 +15692,6 @@ ], "license": "MIT", "dependencies": { - "@types/acorn": "^4.0.0", "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", @@ -16793,32 +16095,15 @@ } }, "node_modules/mlly": { - "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.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==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", "license": "MIT", "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" } }, "node_modules/mri": { @@ -16920,9 +16205,9 @@ } }, "node_modules/node-addon-api": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.3.1.tgz", - "integrity": "sha512-lytcDEdxKjGJPTLEfW4mYMigRezMlyJY8W4wxJK8zE533Jlb8L8dRuObJFWg2P+AuOIxoCgKF+2Oq4d4Zd0OUA==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", "license": "MIT", "engines": { "node": "^18 || ^20 || >= 21" @@ -16944,9 +16229,9 @@ } }, "node_modules/node-forge": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.2.tgz", - "integrity": "sha512-6xKiQ+cph9KImrRh0VsjH2d8/GXA4FIMlgU4B757iI1ApvcyA9VlouP0yZJha01V+huImO+kKMU7ih+2+E14fw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", + "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" @@ -17009,19 +16294,10 @@ "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.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", - "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.0.tgz", + "integrity": "sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==", "license": "MIT", "engines": { "node": ">=14.16" @@ -17516,9 +16792,9 @@ "license": "BlueOak-1.0.0" }, "node_modules/package-manager-detector": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.3.0.tgz", - "integrity": "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", "license": "MIT" }, "node_modules/param-case": { @@ -17847,9 +17123,9 @@ } }, "node_modules/pkg-dir/node_modules/yocto-queue": { - "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==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", "license": "MIT", "engines": { "node": ">=12.20" @@ -17859,14 +17135,14 @@ } }, "node_modules/pkg-types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.1.0.tgz", - "integrity": "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==", + "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.2.1", - "exsolve": "^1.0.1", - "pathe": "^2.0.3" + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" } }, "node_modules/points-on-curve": { @@ -17914,7 +17190,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -17950,9 +17225,9 @@ } }, "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { - "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -18194,9 +17469,9 @@ } }, "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { - "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -18232,9 +17507,9 @@ } }, "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { - "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -18360,9 +17635,9 @@ } }, "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { - "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -18398,9 +17673,9 @@ } }, "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { - "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -18687,9 +17962,9 @@ } }, "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { - "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -18715,9 +17990,9 @@ } }, "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { - "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -18814,11 +18089,10 @@ } }, "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { - "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -19058,9 +18332,9 @@ } }, "node_modules/postcss-preset-env": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.4.0.tgz", - "integrity": "sha512-2kqpOthQ6JhxqQq1FSAAZGe9COQv75Aw8WbsOvQVNJ2nSevc9Yx/IKZGuZ7XJ+iOTtVon7LfO7ELRzg8AZ+sdw==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.5.0.tgz", + "integrity": "sha512-xgxFQPAPxeWmsgy8cR7GM1PGAL/smA5E9qU7K//D4vucS01es3M0fDujhDJn3kY8Ip7/vVYcecbe1yY+vBo3qQ==", "funding": [ { "type": "github", @@ -19100,21 +18374,23 @@ "@csstools/postcss-nested-calc": "^4.0.0", "@csstools/postcss-normalize-display-values": "^4.0.0", "@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-random-function": "^2.0.1", "@csstools/postcss-relative-color-syntax": "^3.0.12", "@csstools/postcss-scope-pseudo-class": "^4.0.1", "@csstools/postcss-sign-functions": "^1.1.4", "@csstools/postcss-stepped-value-functions": "^4.0.9", + "@csstools/postcss-system-ui-font-family": "^1.0.0", "@csstools/postcss-text-decoration-shorthand": "^4.0.3", "@csstools/postcss-trigonometric-functions": "^4.0.9", "@csstools/postcss-unset-value": "^4.0.0", - "autoprefixer": "^10.4.21", - "browserslist": "^4.26.0", + "autoprefixer": "^10.4.22", + "browserslist": "^4.28.0", "css-blank-pseudo": "^7.0.1", "css-has-pseudo": "^7.0.3", "css-prefers-color-scheme": "^10.0.0", - "cssdb": "^8.4.2", + "cssdb": "^8.5.2", "postcss-attribute-case-insensitive": "^7.0.1", "postcss-clamp": "^4.1.0", "postcss-color-functional-notation": "^7.0.12", @@ -19174,9 +18450,9 @@ } }, "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { - "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -19267,9 +18543,9 @@ } }, "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { - "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -19500,9 +18776,9 @@ } }, "node_modules/property-information": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz", - "integrity": "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", "license": "MIT", "funding": { "type": "github", @@ -19547,9 +18823,9 @@ } }, "node_modules/pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz", + "integrity": "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==", "license": "MIT", "dependencies": { "escape-goat": "^4.0.0" @@ -19562,12 +18838,12 @@ } }, "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -19576,22 +18852,6 @@ "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", @@ -19643,15 +18903,15 @@ } }, "node_modules/raw-body": { - "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==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8" @@ -19693,6 +18953,12 @@ "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", @@ -19707,7 +18973,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -19742,7 +19007,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -19799,7 +19063,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", - "peer": true, "dependencies": { "@types/react": "*" }, @@ -19828,7 +19091,6 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -19954,9 +19216,9 @@ } }, "node_modules/recma-jsx": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.0.tgz", - "integrity": "sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", "license": "MIT", "dependencies": { "acorn-jsx": "^5.0.0", @@ -19968,6 +19230,9 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/recma-parse": { @@ -20043,12 +19308,6 @@ "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/regexp.prototype.flags": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", @@ -20238,9 +19497,9 @@ } }, "node_modules/remark-mdx": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.0.tgz", - "integrity": "sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", "license": "MIT", "dependencies": { "mdast-util-mdx": "^3.0.0", @@ -20268,9 +19527,9 @@ } }, "node_modules/remark-rehype": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.1.tgz", - "integrity": "sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==", + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", @@ -20432,12 +19691,12 @@ "license": "MIT" }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -20693,10 +19952,10 @@ "license": "MIT" }, "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "license": "ISC" + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", + "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", + "license": "BlueOak-1.0.0" }, "node_modules/scheduler": { "version": "0.23.2", @@ -20737,7 +19996,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -20807,9 +20065,9 @@ } }, "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -20834,24 +20092,24 @@ } }, "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", "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.1" + "statuses": "~2.0.2" }, "engines": { "node": ">= 0.8.0" @@ -20872,15 +20130,6 @@ "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", @@ -20999,15 +20248,15 @@ } }, "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.19.0" + "send": "~0.19.1" }, "engines": { "node": ">= 0.8.0" @@ -21302,12 +20551,12 @@ } }, "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "license": "BSD-3-Clause", "engines": { - "node": ">= 8" + "node": ">= 12" } }, "node_modules/source-map-js": { @@ -21433,20 +20682,34 @@ } }, "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/std-env": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", - "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", "license": "MIT" }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -21513,9 +20776,9 @@ "license": "MIT" }, "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { "node": ">=12" @@ -21525,9 +20788,9 @@ } }, "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -21722,21 +20985,21 @@ } }, "node_modules/style-to-js": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.16.tgz", - "integrity": "sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", "license": "MIT", "dependencies": { - "style-to-object": "1.0.8" + "style-to-object": "1.0.14" } }, "node_modules/style-to-object": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", - "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", "license": "MIT", "dependencies": { - "inline-style-parser": "0.2.4" + "inline-style-parser": "0.2.7" } }, "node_modules/stylehacks": { @@ -21826,13 +21089,13 @@ } }, "node_modules/swr": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.6.tgz", - "integrity": "sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.8.tgz", + "integrity": "sha512-gaCPRVoMq8WGDcWj9p4YWzCMPHzE0WNl6W8ADIx9c3JBEIdMkJGMzW+uzXvxHMltwcYACr9jP+32H8/hgwMR7w==", "license": "MIT", "dependencies": { "dequal": "^2.0.3", - "use-sync-external-store": "^1.4.0" + "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -21868,13 +21131,13 @@ } }, "node_modules/terser": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", - "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", + "version": "5.44.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", + "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -22001,10 +21264,13 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", - "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", - "license": "MIT" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/tinyglobby": { "version": "0.2.15", @@ -22047,7 +21313,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -22056,9 +21321,9 @@ } }, "node_modules/tinypool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.0.tgz", - "integrity": "sha512-7CotroY9a8DKsKprEy/a14aCCm8jYVmR7aFy4fpkZM8sdpNJbKkixuNjgM50yCmip2ezc8z4N7k3oe2+rfRJCQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", "license": "MIT", "engines": { "node": "^18.0.0 || >=20.0.0" @@ -22193,8 +21458,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", @@ -22355,7 +21619,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -22414,9 +21677,9 @@ } }, "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -22521,6 +21784,16 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unified-engine/node_modules/@types/node": { + "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, "node_modules/unified-engine/node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", @@ -22631,6 +21904,13 @@ "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", @@ -22661,9 +21941,9 @@ } }, "node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -22728,9 +22008,9 @@ } }, "node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -22852,9 +22132,9 @@ } }, "node_modules/update-notifier/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -22939,9 +22219,9 @@ } }, "node_modules/use-sync-external-store": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", - "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -23084,9 +22364,9 @@ } }, "node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -23314,7 +22594,6 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.0.tgz", "integrity": "sha512-5DeICTX8BVgNp6afSPYXAFjskIgWGlygQH58bcozPOXgo2r/6xx39Y1+cULZ3gTxUYQP88jmwLj2anu4Xaq84g==", "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -23432,15 +22711,19 @@ } }, "node_modules/webpack-dev-middleware/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", "dependencies": { "mime-db": "^1.54.0" }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/webpack-dev-middleware/node_modules/range-parser": { @@ -23922,9 +23205,9 @@ } }, "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { "node": ">=12" @@ -23934,9 +23217,9 @@ } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", "engines": { "node": ">=12" @@ -23946,9 +23229,9 @@ } }, "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -24090,11 +23373,10 @@ } }, "node_modules/zod": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.11.tgz", - "integrity": "sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.2.1.tgz", + "integrity": "sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/docs/package.json b/docs/package.json index ade539e9c87..5e940cbbe73 100644 --- a/docs/package.json +++ b/docs/package.json @@ -15,9 +15,9 @@ "typecheck": "tsc" }, "dependencies": { - "@docusaurus/core": "^3.9.1", - "@docusaurus/preset-classic": "^3.9.1", - "@docusaurus/theme-mermaid": "^3.9.1", + "@docusaurus/core": "^3.9.2", + "@docusaurus/preset-classic": "^3.9.2", + "@docusaurus/theme-mermaid": "^3.9.2", "@fortawesome/fontawesome-svg-core": "^6.7.1", "@fortawesome/free-solid-svg-icons": "^6.7.1", "@fortawesome/react-fontawesome": "^0.2.0", From 45de943485ac009660037eb81a7265e1cafe2b4e Mon Sep 17 00:00:00 2001 From: Niclas Date: Thu, 18 Dec 2025 06:46:05 +0100 Subject: [PATCH 58/96] build: add support for local config builds via act (#3124) Adds support for building the firmware in the config-repo locally via [act](https://github.com/nektos/act). Linux example command: ```shell act --artifact-server-path $PWD/.artifacts ``` MacOS (M2) example command: ```shell act --artifact-server-path $PWD/.artifacts \ --container-architecture \ linux/amd64 --container-daemon-socket - --- .github/workflows/build-user-config.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index 4d4e885ad17..072cf05dc19 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -49,6 +49,12 @@ 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@v4 From edb36b5838633ea7fdc006a5e4055781a36c7531 Mon Sep 17 00:00:00 2001 From: Robert U <978080+urob@users.noreply.github.com> Date: Thu, 18 Dec 2025 00:46:55 -0500 Subject: [PATCH 59/96] docs: Update native posix instructions for zephyr 4.1 (#3151) --- docs/docs/development/local-toolchain/posix-board.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/docs/development/local-toolchain/posix-board.md b/docs/docs/development/local-toolchain/posix-board.md index 5a809c02cca..37a37076b01 100644 --- a/docs/docs/development/local-toolchain/posix-board.md +++ b/docs/docs/development/local-toolchain/posix-board.md @@ -20,11 +20,10 @@ apt install -y gcc-multilib ## Building -To do this, you can build ZMK targeting the -`native_posix_64` board. +To do this, you can build ZMK targeting the `native_sim` board. ```sh -west build --pristine --board native_posix_64 -- -DZMK_CONFIG=tests/none/normal/ +west build --pristine --board native_sim/native/64 -- -DZMK_CONFIG=tests/none/normal/ ``` Once built, you can run the firmware locally: @@ -35,4 +34,4 @@ Once built, you can run the firmware locally: ## Virtual Key Events -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. +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. From 118359c83efa0758144489fd5e12cc6f5bdbad4c Mon Sep 17 00:00:00 2001 From: hyx0329 Date: Thu, 18 Dec 2025 13:52:27 +0800 Subject: [PATCH 60/96] fix(usb): Prevent unexpected USB disconnection caused by USB SOF (#3070) ZMK doesn't use SOF. Disable this to prevent unexpected USB disconnection. The disconnection is observed under 3 circumstances on a Linux host: 1. Keyboard just performed a firmware upgrade and USB is kept connected. 2. Keyboard is woken from USB power source and USB is kept connected. 3. Keyboard is connected when host is booting, and when Linux is just initialized. Disabling SOF processing will not affect boot protocol switching. Tested on Makerdiary M60. --- app/Kconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/app/Kconfig b/app/Kconfig index 770c6ee1c37..e1c4ada9f03 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -129,7 +129,6 @@ config ZMK_USB_BOOT bool "USB Boot Protocol Support" depends on ZMK_USB select USB_HID_BOOT_PROTOCOL - select USB_DEVICE_SOF config USB_DEVICE_INITIALIZE_AT_BOOT default n From 8266433d6b85cfecf57a4ba48e27e1eebb3de7b2 Mon Sep 17 00:00:00 2001 From: Nicolas Munnich <98408764+nmunnich@users.noreply.github.com> Date: Tue, 23 Dec 2025 00:05:23 +0100 Subject: [PATCH 61/96] chore(ci): Add warning about being on main branch when build fails (#3159) --- .github/workflows/build-user-config.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index 072cf05dc19..3f0527fbccb 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -122,6 +122,13 @@ 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 @@ -131,6 +138,15 @@ 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: ${{ env.display_name }} Kconfig file run: | if [ -f "${{ env.build_dir }}/zephyr/.config" ] From b68b29d053eec9fa77eb532e3a914210d7c7ba69 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Dec 2025 08:41:41 +0000 Subject: [PATCH 62/96] chore(deps-dev): bump the development group across 1 directory with 2 updates (#3162) Bumps the development group with 2 updates in the /docs directory: [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) and [webpack](https://github.com/webpack/webpack). Updates `typescript-eslint` from 8.50.0 to 8.50.1 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.50.1/packages/typescript-eslint) Updates `webpack` from 5.104.0 to 5.104.1 - [Release notes](https://github.com/webpack/webpack/releases) - [Changelog](https://github.com/webpack/webpack/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack/compare/v5.104.0...v5.104.1) --- updated-dependencies: - dependency-name: typescript-eslint dependency-version: 8.50.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: development - dependency-name: webpack dependency-version: 5.104.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/package-lock.json | 166 ++++++++++++++++++++++++----------------- docs/package.json | 4 +- 2 files changed, 101 insertions(+), 69 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 0daf40e0559..d37a7d21075 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -46,8 +46,8 @@ "prettier": "^3.7.4", "string-replace-loader": "^3.3.0", "typescript": "^5.9.3", - "typescript-eslint": "^8.50.0", - "webpack": "^5.104.0" + "typescript-eslint": "^8.50.1", + "webpack": "^5.104.1" } }, "node_modules/@ai-sdk/gateway": { @@ -256,6 +256,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.0.tgz", "integrity": "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", @@ -412,6 +413,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -2258,6 +2260,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -2280,6 +2283,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -2389,6 +2393,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -2810,6 +2815,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3744,6 +3750,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -4385,6 +4392,7 @@ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.2.tgz", "integrity": "sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==", "license": "MIT", + "peer": true, "dependencies": { "@fortawesome/fontawesome-common-types": "6.7.2" }, @@ -4802,6 +4810,7 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", + "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -5431,6 +5440,7 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -6116,6 +6126,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" @@ -6271,17 +6282,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.50.0.tgz", - "integrity": "sha512-O7QnmOXYKVtPrfYzMolrCTfkezCJS9+ljLdKW/+DCvRsc3UAz+sbH6Xcsv7p30+0OwUbeWfUDAQE0vpabZ3QLg==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.50.1.tgz", + "integrity": "sha512-PKhLGDq3JAg0Jk/aK890knnqduuI/Qj+udH7wCf0217IGi4gt+acgCyPVe79qoT+qKUvHMDQkwJeKW9fwl8Cyw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.50.0", - "@typescript-eslint/type-utils": "8.50.0", - "@typescript-eslint/utils": "8.50.0", - "@typescript-eslint/visitor-keys": "8.50.0", + "@typescript-eslint/scope-manager": "8.50.1", + "@typescript-eslint/type-utils": "8.50.1", + "@typescript-eslint/utils": "8.50.1", + "@typescript-eslint/visitor-keys": "8.50.1", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" @@ -6294,7 +6305,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.50.0", + "@typescript-eslint/parser": "^8.50.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -6310,16 +6321,17 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.50.0.tgz", - "integrity": "sha512-6/cmF2piao+f6wSxUsJLZjck7OQsYyRtcOZS02k7XINSNlz93v6emM8WutDQSXnroG2xwYlEVHJI+cPA7CPM3Q==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.50.1.tgz", + "integrity": "sha512-hM5faZwg7aVNa819m/5r7D0h0c9yC4DUlWAOvHAtISdFTc8xB86VmX5Xqabrama3wIPJ/q9RbGS1worb6JfnMg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.50.0", - "@typescript-eslint/types": "8.50.0", - "@typescript-eslint/typescript-estree": "8.50.0", - "@typescript-eslint/visitor-keys": "8.50.0", + "@typescript-eslint/scope-manager": "8.50.1", + "@typescript-eslint/types": "8.50.1", + "@typescript-eslint/typescript-estree": "8.50.1", + "@typescript-eslint/visitor-keys": "8.50.1", "debug": "^4.3.4" }, "engines": { @@ -6335,14 +6347,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.50.0.tgz", - "integrity": "sha512-Cg/nQcL1BcoTijEWyx4mkVC56r8dj44bFDvBdygifuS20f3OZCHmFbjF34DPSi07kwlFvqfv/xOLnJ5DquxSGQ==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.50.1.tgz", + "integrity": "sha512-E1ur1MCVf+YiP89+o4Les/oBAVzmSbeRB0MQLfSlYtbWU17HPxZ6Bhs5iYmKZRALvEuBoXIZMOIRRc/P++Ortg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.50.0", - "@typescript-eslint/types": "^8.50.0", + "@typescript-eslint/tsconfig-utils": "^8.50.1", + "@typescript-eslint/types": "^8.50.1", "debug": "^4.3.4" }, "engines": { @@ -6357,14 +6369,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.50.0.tgz", - "integrity": "sha512-xCwfuCZjhIqy7+HKxBLrDVT5q/iq7XBVBXLn57RTIIpelLtEIZHXAF/Upa3+gaCpeV1NNS5Z9A+ID6jn50VD4A==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.50.1.tgz", + "integrity": "sha512-mfRx06Myt3T4vuoHaKi8ZWNTPdzKPNBhiblze5N50//TSHOAQQevl/aolqA/BcqqbJ88GUnLqjjcBc8EWdBcVw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.50.0", - "@typescript-eslint/visitor-keys": "8.50.0" + "@typescript-eslint/types": "8.50.1", + "@typescript-eslint/visitor-keys": "8.50.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6375,9 +6387,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.50.0.tgz", - "integrity": "sha512-vxd3G/ybKTSlm31MOA96gqvrRGv9RJ7LGtZCn2Vrc5htA0zCDvcMqUkifcjrWNNKXHUU3WCkYOzzVSFBd0wa2w==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.50.1.tgz", + "integrity": "sha512-ooHmotT/lCWLXi55G4mvaUF60aJa012QzvLK0Y+Mp4WdSt17QhMhWOaBWeGTFVkb2gDgBe19Cxy1elPXylslDw==", "dev": true, "license": "MIT", "engines": { @@ -6392,15 +6404,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.50.0.tgz", - "integrity": "sha512-7OciHT2lKCewR0mFoBrvZJ4AXTMe/sYOe87289WAViOocEmDjjv8MvIOT2XESuKj9jp8u3SZYUSh89QA4S1kQw==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.50.1.tgz", + "integrity": "sha512-7J3bf022QZE42tYMO6SL+6lTPKFk/WphhRPe9Tw/el+cEwzLz1Jjz2PX3GtGQVxooLDKeMVmMt7fWpYRdG5Etg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.50.0", - "@typescript-eslint/typescript-estree": "8.50.0", - "@typescript-eslint/utils": "8.50.0", + "@typescript-eslint/types": "8.50.1", + "@typescript-eslint/typescript-estree": "8.50.1", + "@typescript-eslint/utils": "8.50.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -6417,9 +6429,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.50.0.tgz", - "integrity": "sha512-iX1mgmGrXdANhhITbpp2QQM2fGehBse9LbTf0sidWK6yg/NE+uhV5dfU1g6EYPlcReYmkE9QLPq/2irKAmtS9w==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.50.1.tgz", + "integrity": "sha512-v5lFIS2feTkNyMhd7AucE/9j/4V9v5iIbpVRncjk/K0sQ6Sb+Np9fgYS/63n6nwqahHQvbmujeBL7mp07Q9mlA==", "dev": true, "license": "MIT", "engines": { @@ -6431,16 +6443,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.50.0.tgz", - "integrity": "sha512-W7SVAGBR/IX7zm1t70Yujpbk+zdPq/u4soeFSknWFdXIFuWsBGBOUu/Tn/I6KHSKvSh91OiMuaSnYp3mtPt5IQ==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.50.1.tgz", + "integrity": "sha512-woHPdW+0gj53aM+cxchymJCrh0cyS7BTIdcDxWUNsclr9VDkOSbqC13juHzxOmQ22dDkMZEpZB+3X1WpUvzgVQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.50.0", - "@typescript-eslint/tsconfig-utils": "8.50.0", - "@typescript-eslint/types": "8.50.0", - "@typescript-eslint/visitor-keys": "8.50.0", + "@typescript-eslint/project-service": "8.50.1", + "@typescript-eslint/tsconfig-utils": "8.50.1", + "@typescript-eslint/types": "8.50.1", + "@typescript-eslint/visitor-keys": "8.50.1", "debug": "^4.3.4", "minimatch": "^9.0.4", "semver": "^7.6.0", @@ -6485,16 +6497,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.50.0.tgz", - "integrity": "sha512-87KgUXET09CRjGCi2Ejxy3PULXna63/bMYv72tCAlDJC3Yqwln0HiFJ3VJMst2+mEtNtZu5oFvX4qJGjKsnAgg==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.50.1.tgz", + "integrity": "sha512-lCLp8H1T9T7gPbEuJSnHwnSuO9mDf8mfK/Nion5mZmiEaQD9sWf9W4dfeFqRyqRjF06/kBuTmAqcs9sewM2NbQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.50.0", - "@typescript-eslint/types": "8.50.0", - "@typescript-eslint/typescript-estree": "8.50.0" + "@typescript-eslint/scope-manager": "8.50.1", + "@typescript-eslint/types": "8.50.1", + "@typescript-eslint/typescript-estree": "8.50.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6509,13 +6521,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.50.0.tgz", - "integrity": "sha512-Xzmnb58+Db78gT/CCj/PVCvK+zxbnsw6F+O1oheYszJbBSdEjVhQi3C/Xttzxgi/GLmpvOggRs1RFpiJ8+c34Q==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.50.1.tgz", + "integrity": "sha512-IrDKrw7pCRUR94zeuCSUWQ+w8JEf5ZX5jl/e6AHGSLi1/zIr0lgutfn/7JpfCey+urpgQEdrZVYzCaVVKiTwhQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/types": "8.50.1", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -6757,6 +6769,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -6842,6 +6855,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -6906,6 +6920,7 @@ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.0.tgz", "integrity": "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/abtesting": "1.12.0", "@algolia/client-abtesting": "5.46.0", @@ -7544,6 +7559,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -8578,6 +8594,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -8897,6 +8914,7 @@ "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10" } @@ -9306,6 +9324,7 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -10231,6 +10250,7 @@ "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -17190,6 +17210,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -18093,6 +18114,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -18973,6 +18995,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -19007,6 +19030,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -19063,6 +19087,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/react": "*" }, @@ -19091,6 +19116,7 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -19996,6 +20022,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -21313,6 +21340,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -21458,7 +21486,8 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/type-check": { "version": "0.4.0", @@ -21619,6 +21648,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -21628,16 +21658,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.50.0.tgz", - "integrity": "sha512-Q1/6yNUmCpH94fbgMUMg2/BSAr/6U7GBk61kZTv1/asghQOWOjTlp9K8mixS5NcJmm2creY+UFfGeW/+OcA64A==", + "version": "8.50.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.50.1.tgz", + "integrity": "sha512-ytTHO+SoYSbhAH9CrYnMhiLx8To6PSSvqnvXyPUgPETCvB6eBKmTI9w6XMPS3HsBRGkwTVBX+urA8dYQx6bHfQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.50.0", - "@typescript-eslint/parser": "8.50.0", - "@typescript-eslint/typescript-estree": "8.50.0", - "@typescript-eslint/utils": "8.50.0" + "@typescript-eslint/eslint-plugin": "8.50.1", + "@typescript-eslint/parser": "8.50.1", + "@typescript-eslint/typescript-estree": "8.50.1", + "@typescript-eslint/utils": "8.50.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -22590,10 +22620,11 @@ "license": "MIT" }, "node_modules/webpack": { - "version": "5.104.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.0.tgz", - "integrity": "sha512-5DeICTX8BVgNp6afSPYXAFjskIgWGlygQH58bcozPOXgo2r/6xx39Y1+cULZ3gTxUYQP88jmwLj2anu4Xaq84g==", + "version": "5.104.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz", + "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -23377,6 +23408,7 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.2.1.tgz", "integrity": "sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/docs/package.json b/docs/package.json index 5e940cbbe73..a6659656325 100644 --- a/docs/package.json +++ b/docs/package.json @@ -65,7 +65,7 @@ "prettier": "^3.7.4", "string-replace-loader": "^3.3.0", "typescript": "^5.9.3", - "typescript-eslint": "^8.50.0", - "webpack": "^5.104.0" + "typescript-eslint": "^8.50.1", + "webpack": "^5.104.1" } } From 308de56fb938057da7648a411ce0dce780dfc3f1 Mon Sep 17 00:00:00 2001 From: Alexander Krikun <54907805+krikun98@users.noreply.github.com> Date: Wed, 24 Dec 2025 19:16:59 +0400 Subject: [PATCH 63/96] fix(core): support magic bootloader values for nRF52833 (#3163) Enable ZMK_BOOTMODE_MAGIC_VALUE_BOOTLOADER_TYPE_ADAFRUIT_NRF52 for nRF52833, add nrf52833_uf2_boot_mode.dtsi as a copy of the nRF52840 file for easy inclusion. Enable retention for all nrfmicro subvariants (as this is the only in-tree board that uses the nRF52833). This fixes &bootloader for nRF52833 boards post-4.1 upgrade. --- app/boards/joric/nrfmicro/Kconfig.nrfmicro | 6 ++-- .../joric/nrfmicro/nrfmicro_nrf52833.dts | 2 ++ .../common/nordic/nrf52833_uf2_boot_mode.dtsi | 29 +++++++++++++++++++ app/src/boot/Kconfig.defaults | 2 +- 4 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 app/dts/common/nordic/nrf52833_uf2_boot_mode.dtsi diff --git a/app/boards/joric/nrfmicro/Kconfig.nrfmicro b/app/boards/joric/nrfmicro/Kconfig.nrfmicro index bd5d31951af..38b80a8093d 100644 --- a/app/boards/joric/nrfmicro/Kconfig.nrfmicro +++ b/app/boards/joric/nrfmicro/Kconfig.nrfmicro @@ -7,6 +7,6 @@ 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 - imply RETAINED_MEM if BOARD_NRFMICRO_NRF52840 || BOARD_NRFMICRO_NRF52840_FLIPPED - imply RETENTION if BOARD_NRFMICRO_NRF52840 || BOARD_NRFMICRO_NRF52840_FLIPPED - imply RETENTION_BOOT_MODE if BOARD_NRFMICRO_NRF52840 || BOARD_NRFMICRO_NRF52840_FLIPPED + imply RETAINED_MEM + imply RETENTION + imply RETENTION_BOOT_MODE diff --git a/app/boards/joric/nrfmicro/nrfmicro_nrf52833.dts b/app/boards/joric/nrfmicro/nrfmicro_nrf52833.dts index 5099701f8c9..a5cca787c9b 100644 --- a/app/boards/joric/nrfmicro/nrfmicro_nrf52833.dts +++ b/app/boards/joric/nrfmicro/nrfmicro_nrf52833.dts @@ -6,6 +6,8 @@ /dts-v1/; #include +#include + #include "arduino_pro_micro_pins_52833.dtsi" #include "nrfmicro-pinctrl.dtsi" diff --git a/app/dts/common/nordic/nrf52833_uf2_boot_mode.dtsi b/app/dts/common/nordic/nrf52833_uf2_boot_mode.dtsi new file mode 100644 index 00000000000..9087426c03a --- /dev/null +++ b/app/dts/common/nordic/nrf52833_uf2_boot_mode.dtsi @@ -0,0 +1,29 @@ + +&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/src/boot/Kconfig.defaults b/app/src/boot/Kconfig.defaults index 29e4e9bc4b3..41816bd865a 100644 --- a/app/src/boot/Kconfig.defaults +++ b/app/src/boot/Kconfig.defaults @@ -16,7 +16,7 @@ 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_NRF52840 + default ZMK_BOOTMODE_MAGIC_VALUE_BOOTLOADER_TYPE_ADAFRUIT_NRF52 if SOC_NRF52833 || SOC_NRF52840 endchoice From 8568d02b0bcf2c1876bf29210b294ac53b9521a6 Mon Sep 17 00:00:00 2001 From: Nicolas Munnich <98408764+nmunnich@users.noreply.github.com> Date: Wed, 24 Dec 2025 17:07:26 +0100 Subject: [PATCH 64/96] docs: Fix layers property of config combo page (#3167) --- docs/docs/config/combos.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/config/combos.md b/docs/docs/config/combos.md index 0400b16374d..8fd0e804860 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. `-1` allows all layers. | `<-1>` | +| `layers` | array | A list of layers on which the combo may be triggered. Omission of this property allows all layers. | `<-1>` | From a9e0befcb61c4f3b88b1264eab73ede9200f20d3 Mon Sep 17 00:00:00 2001 From: Nicolas Munnich <98408764+nmunnich@users.noreply.github.com> Date: Thu, 25 Dec 2025 08:34:48 +0100 Subject: [PATCH 65/96] docs: Also remove the erroneous default value for (#3170) layers property in combos config --- docs/docs/config/combos.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/config/combos.md b/docs/docs/config/combos.md index 8fd0e804860..b8203cb4e56 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. | `<-1>` | +| `layers` | array | A list of layers on which the combo may be triggered. Omission of this property allows all layers. | | From 40e06f3c0084751f7ae012a71d92d5801ac3b7a0 Mon Sep 17 00:00:00 2001 From: snoyer Date: Sun, 28 Dec 2025 12:32:42 +0400 Subject: [PATCH 66/96] feat(shields): Add Studio support to boardsource3x4 (#3154) * feat(shields): Add Studio support to boardsource3x4 * rename default transform * add position maps --- .../boardsource3x4-layouts.dtsi | 70 +++++++++++++++++++ .../boardsource3x4/boardsource3x4.keymap | 4 +- .../boardsource3x4/boardsource3x4.overlay | 35 +++++++++- .../boardsource3x4/boardsource3x4.zmk.yml | 1 + 4 files changed, 107 insertions(+), 3 deletions(-) create mode 100644 app/boards/shields/boardsource3x4/boardsource3x4-layouts.dtsi diff --git a/app/boards/shields/boardsource3x4/boardsource3x4-layouts.dtsi b/app/boards/shields/boardsource3x4/boardsource3x4-layouts.dtsi new file mode 100644 index 00000000000..0bbee3bd6ab --- /dev/null +++ b/app/boards/shields/boardsource3x4/boardsource3x4-layouts.dtsi @@ -0,0 +1,70 @@ +/* + * 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 c0a23b12323..5648d2359c7 100644 --- a/app/boards/shields/boardsource3x4/boardsource3x4.keymap +++ b/app/boards/shields/boardsource3x4/boardsource3x4.keymap @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 The ZMK Contributors + * Copyright (c) 2025 The ZMK Contributors * * SPDX-License-Identifier: MIT */ @@ -37,7 +37,7 @@ bindings = < &bt BT_CLR &none &sys_reset &bootloader &trans &bt BT_SEL 3 &bt BT_SEL 4 &none - &none &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 + &studio_unlock &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 >; }; diff --git a/app/boards/shields/boardsource3x4/boardsource3x4.overlay b/app/boards/shields/boardsource3x4/boardsource3x4.overlay index 0d63214dde4..37d0c3fcf0e 100644 --- a/app/boards/shields/boardsource3x4/boardsource3x4.overlay +++ b/app/boards/shields/boardsource3x4/boardsource3x4.overlay @@ -1,14 +1,47 @@ /* - * Copyright (c) 2020 The ZMK Contributors + * Copyright (c) 2025 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 fee279659a2..eee7fa40fc6 100644 --- a/app/boards/shields/boardsource3x4/boardsource3x4.zmk.yml +++ b/app/boards/shields/boardsource3x4/boardsource3x4.zmk.yml @@ -6,3 +6,4 @@ url: https://boardsource.xyz/store/5ecc2008eee64242946c98c1 requires: [pro_micro] features: - keys + - studio From 340e35c4619594b24fb8dae8354c5e4d0cfa12b3 Mon Sep 17 00:00:00 2001 From: Nicolas Munnich <98408764+nmunnich@users.noreply.github.com> Date: Mon, 29 Dec 2025 18:26:00 +0000 Subject: [PATCH 67/96] docs: Add redirect setup script informing users to switch to ZMK CLI (#3168) --- docs/src/templates/setup.ps1.mustache | 313 -------------------------- docs/src/templates/setup.sh.mustache | 304 ------------------------- docs/static/setup.ps1 | 3 + docs/static/setup.sh | 2 + 4 files changed, 5 insertions(+), 617 deletions(-) delete mode 100644 docs/src/templates/setup.ps1.mustache delete mode 100644 docs/src/templates/setup.sh.mustache create mode 100644 docs/static/setup.ps1 create mode 100644 docs/static/setup.sh diff --git a/docs/src/templates/setup.ps1.mustache b/docs/src/templates/setup.ps1.mustache deleted file mode 100644 index 33a4be38845..00000000000 --- a/docs/src/templates/setup.ps1.mustache +++ /dev/null @@ -1,313 +0,0 @@ -# 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 deleted file mode 100644 index 49b2ee22729..00000000000 --- a/docs/src/templates/setup.sh.mustache +++ /dev/null @@ -1,304 +0,0 @@ -#!/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/static/setup.ps1 b/docs/static/setup.ps1 new file mode 100644 index 00000000000..c54f6a51e51 --- /dev/null +++ b/docs/static/setup.ps1 @@ -0,0 +1,3 @@ +# 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 new file mode 100644 index 00000000000..ed5bd9dc770 --- /dev/null +++ b/docs/static/setup.sh @@ -0,0 +1,2 @@ +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 From f002882ecafc8065d9b618f6dbc0f15e38e5ffae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Dec 2025 10:56:32 +0000 Subject: [PATCH 68/96] chore(deps-dev): bump typescript-eslint (#3178) Bumps the development group in /docs with 1 update: [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint). Updates `typescript-eslint` from 8.50.1 to 8.51.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.51.0/packages/typescript-eslint) --- updated-dependencies: - dependency-name: typescript-eslint dependency-version: 8.51.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/package-lock.json | 136 ++++++++++++++++++++--------------------- docs/package.json | 2 +- 2 files changed, 69 insertions(+), 69 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index d37a7d21075..269453554d0 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -46,7 +46,7 @@ "prettier": "^3.7.4", "string-replace-loader": "^3.3.0", "typescript": "^5.9.3", - "typescript-eslint": "^8.50.1", + "typescript-eslint": "^8.51.0", "webpack": "^5.104.1" } }, @@ -6282,20 +6282,20 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.50.1.tgz", - "integrity": "sha512-PKhLGDq3JAg0Jk/aK890knnqduuI/Qj+udH7wCf0217IGi4gt+acgCyPVe79qoT+qKUvHMDQkwJeKW9fwl8Cyw==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.51.0.tgz", + "integrity": "sha512-XtssGWJvypyM2ytBnSnKtHYOGT+4ZwTnBVl36TA4nRO2f4PRNGz5/1OszHzcZCvcBMh+qb7I06uoCmLTRdR9og==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.50.1", - "@typescript-eslint/type-utils": "8.50.1", - "@typescript-eslint/utils": "8.50.1", - "@typescript-eslint/visitor-keys": "8.50.1", + "@typescript-eslint/scope-manager": "8.51.0", + "@typescript-eslint/type-utils": "8.51.0", + "@typescript-eslint/utils": "8.51.0", + "@typescript-eslint/visitor-keys": "8.51.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^2.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6305,7 +6305,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.50.1", + "@typescript-eslint/parser": "^8.51.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -6321,17 +6321,17 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.50.1.tgz", - "integrity": "sha512-hM5faZwg7aVNa819m/5r7D0h0c9yC4DUlWAOvHAtISdFTc8xB86VmX5Xqabrama3wIPJ/q9RbGS1worb6JfnMg==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.51.0.tgz", + "integrity": "sha512-3xP4XzzDNQOIqBMWogftkwxhg5oMKApqY0BAflmLZiFYHqyhSOxv/cd/zPQLTcCXr4AkaKb25joocY0BD1WC6A==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.50.1", - "@typescript-eslint/types": "8.50.1", - "@typescript-eslint/typescript-estree": "8.50.1", - "@typescript-eslint/visitor-keys": "8.50.1", + "@typescript-eslint/scope-manager": "8.51.0", + "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/typescript-estree": "8.51.0", + "@typescript-eslint/visitor-keys": "8.51.0", "debug": "^4.3.4" }, "engines": { @@ -6347,14 +6347,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.50.1.tgz", - "integrity": "sha512-E1ur1MCVf+YiP89+o4Les/oBAVzmSbeRB0MQLfSlYtbWU17HPxZ6Bhs5iYmKZRALvEuBoXIZMOIRRc/P++Ortg==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.51.0.tgz", + "integrity": "sha512-Luv/GafO07Z7HpiI7qeEW5NW8HUtZI/fo/kE0YbtQEFpJRUuR0ajcWfCE5bnMvL7QQFrmT/odMe8QZww8X2nfQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.50.1", - "@typescript-eslint/types": "^8.50.1", + "@typescript-eslint/tsconfig-utils": "^8.51.0", + "@typescript-eslint/types": "^8.51.0", "debug": "^4.3.4" }, "engines": { @@ -6369,14 +6369,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.50.1.tgz", - "integrity": "sha512-mfRx06Myt3T4vuoHaKi8ZWNTPdzKPNBhiblze5N50//TSHOAQQevl/aolqA/BcqqbJ88GUnLqjjcBc8EWdBcVw==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.51.0.tgz", + "integrity": "sha512-JhhJDVwsSx4hiOEQPeajGhCWgBMBwVkxC/Pet53EpBVs7zHHtayKefw1jtPaNRXpI9RA2uocdmpdfE7T+NrizA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.50.1", - "@typescript-eslint/visitor-keys": "8.50.1" + "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/visitor-keys": "8.51.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6387,9 +6387,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.50.1.tgz", - "integrity": "sha512-ooHmotT/lCWLXi55G4mvaUF60aJa012QzvLK0Y+Mp4WdSt17QhMhWOaBWeGTFVkb2gDgBe19Cxy1elPXylslDw==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.51.0.tgz", + "integrity": "sha512-Qi5bSy/vuHeWyir2C8u/uqGMIlIDu8fuiYWv48ZGlZ/k+PRPHtaAu7erpc7p5bzw2WNNSniuxoMSO4Ar6V9OXw==", "dev": true, "license": "MIT", "engines": { @@ -6404,17 +6404,17 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.50.1.tgz", - "integrity": "sha512-7J3bf022QZE42tYMO6SL+6lTPKFk/WphhRPe9Tw/el+cEwzLz1Jjz2PX3GtGQVxooLDKeMVmMt7fWpYRdG5Etg==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.51.0.tgz", + "integrity": "sha512-0XVtYzxnobc9K0VU7wRWg1yiUrw4oQzexCG2V2IDxxCxhqBMSMbjB+6o91A+Uc0GWtgjCa3Y8bi7hwI0Tu4n5Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.50.1", - "@typescript-eslint/typescript-estree": "8.50.1", - "@typescript-eslint/utils": "8.50.1", + "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/typescript-estree": "8.51.0", + "@typescript-eslint/utils": "8.51.0", "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^2.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6429,9 +6429,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.50.1.tgz", - "integrity": "sha512-v5lFIS2feTkNyMhd7AucE/9j/4V9v5iIbpVRncjk/K0sQ6Sb+Np9fgYS/63n6nwqahHQvbmujeBL7mp07Q9mlA==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.51.0.tgz", + "integrity": "sha512-TizAvWYFM6sSscmEakjY3sPqGwxZRSywSsPEiuZF6d5GmGD9Gvlsv0f6N8FvAAA0CD06l3rIcWNbsN1e5F/9Ag==", "dev": true, "license": "MIT", "engines": { @@ -6443,21 +6443,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.50.1.tgz", - "integrity": "sha512-woHPdW+0gj53aM+cxchymJCrh0cyS7BTIdcDxWUNsclr9VDkOSbqC13juHzxOmQ22dDkMZEpZB+3X1WpUvzgVQ==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.51.0.tgz", + "integrity": "sha512-1qNjGqFRmlq0VW5iVlcyHBbCjPB7y6SxpBkrbhNWMy/65ZoncXCEPJxkRZL8McrseNH6lFhaxCIaX+vBuFnRng==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.50.1", - "@typescript-eslint/tsconfig-utils": "8.50.1", - "@typescript-eslint/types": "8.50.1", - "@typescript-eslint/visitor-keys": "8.50.1", + "@typescript-eslint/project-service": "8.51.0", + "@typescript-eslint/tsconfig-utils": "8.51.0", + "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/visitor-keys": "8.51.0", "debug": "^4.3.4", "minimatch": "^9.0.4", "semver": "^7.6.0", "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^2.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6497,16 +6497,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.50.1.tgz", - "integrity": "sha512-lCLp8H1T9T7gPbEuJSnHwnSuO9mDf8mfK/Nion5mZmiEaQD9sWf9W4dfeFqRyqRjF06/kBuTmAqcs9sewM2NbQ==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.51.0.tgz", + "integrity": "sha512-11rZYxSe0zabiKaCP2QAwRf/dnmgFgvTmeDTtZvUvXG3UuAdg/GU02NExmmIXzz3vLGgMdtrIosI84jITQOxUA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.50.1", - "@typescript-eslint/types": "8.50.1", - "@typescript-eslint/typescript-estree": "8.50.1" + "@typescript-eslint/scope-manager": "8.51.0", + "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/typescript-estree": "8.51.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6521,13 +6521,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.50.1.tgz", - "integrity": "sha512-IrDKrw7pCRUR94zeuCSUWQ+w8JEf5ZX5jl/e6AHGSLi1/zIr0lgutfn/7JpfCey+urpgQEdrZVYzCaVVKiTwhQ==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.51.0.tgz", + "integrity": "sha512-mM/JRQOzhVN1ykejrvwnBRV3+7yTKK8tVANVN3o1O0t0v7o+jqdVu9crPy5Y9dov15TJk/FTIgoUGHrTOVL3Zg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.50.1", + "@typescript-eslint/types": "8.51.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -21461,9 +21461,9 @@ } }, "node_modules/ts-api-utils": { - "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==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.3.0.tgz", + "integrity": "sha512-6eg3Y9SF7SsAvGzRHQvvc1skDAhwI4YQ32ui1scxD1Ccr0G5qIIbUBT3pFTKX8kmWIQClHobtUdNuaBgwdfdWg==", "dev": true, "license": "MIT", "engines": { @@ -21658,16 +21658,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.50.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.50.1.tgz", - "integrity": "sha512-ytTHO+SoYSbhAH9CrYnMhiLx8To6PSSvqnvXyPUgPETCvB6eBKmTI9w6XMPS3HsBRGkwTVBX+urA8dYQx6bHfQ==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.51.0.tgz", + "integrity": "sha512-jh8ZuM5oEh2PSdyQG9YAEM1TCGuWenLSuSUhf/irbVUNW9O5FhbFVONviN2TgMTBnUmyHv7E56rYnfLZK6TkiA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.50.1", - "@typescript-eslint/parser": "8.50.1", - "@typescript-eslint/typescript-estree": "8.50.1", - "@typescript-eslint/utils": "8.50.1" + "@typescript-eslint/eslint-plugin": "8.51.0", + "@typescript-eslint/parser": "8.51.0", + "@typescript-eslint/typescript-estree": "8.51.0", + "@typescript-eslint/utils": "8.51.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" diff --git a/docs/package.json b/docs/package.json index a6659656325..3575eae4a58 100644 --- a/docs/package.json +++ b/docs/package.json @@ -65,7 +65,7 @@ "prettier": "^3.7.4", "string-replace-loader": "^3.3.0", "typescript": "^5.9.3", - "typescript-eslint": "^8.50.1", + "typescript-eslint": "^8.51.0", "webpack": "^5.104.1" } } From fee2404d5d886c455e3820f9ca624cf9275e9cb5 Mon Sep 17 00:00:00 2001 From: Nicolas Munnich <98408764+nmunnich@users.noreply.github.com> Date: Tue, 30 Dec 2025 18:04:58 +0000 Subject: [PATCH 69/96] docs: remove new shield clean room warning (#3180) --- .../development/hardware-integration/new-shield.mdx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/docs/development/hardware-integration/new-shield.mdx b/docs/docs/development/hardware-integration/new-shield.mdx index 6aa8c9cda02..73c80fe474f 100644 --- a/docs/docs/development/hardware-integration/new-shield.mdx +++ b/docs/docs/development/hardware-integration/new-shield.mdx @@ -40,10 +40,6 @@ 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: @@ -63,6 +59,15 @@ Many of the above files will differ depending on whether your keyboard is a unib 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](../contributing/clean-room.md)). + +We generally recommend licensing your shield under MIT, if you don't have a particular incentive to do otherwise. +::: + ## New ZMK Module Repository The first step to creating the shield is to create a new ZMK module repository from a template. From 76bf2e5774e40d18ae0e09d1078741040492ec6e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Jan 2026 18:01:18 +0100 Subject: [PATCH 70/96] chore(deps): bump qs from 6.14.0 to 6.14.1 in /docs (#3183) Bumps [qs](https://github.com/ljharb/qs) from 6.14.0 to 6.14.1. - [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md) - [Commits](https://github.com/ljharb/qs/compare/v6.14.0...v6.14.1) --- updated-dependencies: - dependency-name: qs dependency-version: 6.14.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 269453554d0..fd8050102e4 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -18860,9 +18860,9 @@ } }, "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" From cb786cd7d69f2a41f2968c2e5dd6a269d417286b Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 2 Jan 2026 12:02:29 -0800 Subject: [PATCH 71/96] docs: Remove unneeded led strip config (#3186) --- docs/docs/features/lighting.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/docs/features/lighting.md b/docs/docs/features/lighting.md index 3d64b8701e3..b05355037ee 100644 --- a/docs/docs/features/lighting.md +++ b/docs/docs/features/lighting.md @@ -42,13 +42,11 @@ Here you can see the RGB underglow feature in action using WS2812 LEDs. ### Enabling RGB Underglow -To enable RGB underglow on your board or shield, simply enable the `CONFIG_ZMK_RGB_UNDERGLOW` and `CONFIG_*_STRIP` configuration values in the `.conf` file for your board or shield. +To enable RGB underglow on your board or shield, simply set the `CONFIG_ZMK_RGB_UNDERGLOW` configuration in the `.conf` file for your board or shield. For example: ```ini CONFIG_ZMK_RGB_UNDERGLOW=y -# 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. From 36dbf467644d4b4b6b9176241d42261d27fb18f2 Mon Sep 17 00:00:00 2001 From: Solodros <34903426+Solodros@users.noreply.github.com> Date: Thu, 8 Jan 2026 06:04:52 +0800 Subject: [PATCH 72/96] fix(split): correct async UART RX buffer definition (#3193) The RX buffer was previously defined as [RX_BUFFER_SIZE/2][2], which created (RX_BUFFER_SIZE/2) small 2-byte buffers instead of the two (RX_BUFFER_SIZE/2)-byte buffers required for DMA ping-pong operation. Update the buffer definition to [2][RX_BUFFER_SIZE/2] and apply the fix to both the central and peripheral wired split implementations. This prevents potential DMA RX data corruption when using async UART. --- app/src/split/wired/central.c | 2 +- app/src/split/wired/peripheral.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/split/wired/central.c b/app/src/split/wired/central.c index 157092f7836..7ba6614251c 100644 --- a/app/src/split/wired/central.c +++ b/app/src/split/wired/central.c @@ -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[RX_BUFFER_SIZE / 2][2]; +uint8_t async_rx_buf[2][RX_BUFFER_SIZE / 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 72300ca5059..b5b91cd979a 100644 --- a/app/src/split/wired/peripheral.c +++ b/app/src/split/wired/peripheral.c @@ -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[RX_BUFFER_SIZE / 2][2]; +uint8_t async_rx_buf[2][RX_BUFFER_SIZE / 2]; static struct zmk_split_wired_async_state async_state = { .rx_bufs = {async_rx_buf[0], async_rx_buf[1]}, From abce9deab76124d72c61a824aaa1affc3dbc1260 Mon Sep 17 00:00:00 2001 From: Solodros <34903426+Solodros@users.noreply.github.com> Date: Thu, 8 Jan 2026 06:16:24 +0800 Subject: [PATCH 73/96] fix(hid): initialize missing d_scroll_x field in mouse report (#3196) The static mouse_report definition did not initialize the d_scroll_x field. The zmk_hid_mouse_report_body structure contains five fields (buttons, d_x, d_y, d_scroll_y, d_scroll_x), but d_scroll_x was left uninitialized. Initialize d_scroll_x to 0 to ensure all fields in the mouse report are properly initialized and avoid potential undefined behavior. --- app/src/hid.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/hid.c b/app/src/hid.c index cf5a557f89a..d8700c3f4a8 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}}; + .body = {.buttons = 0, .d_x = 0, .d_y = 0, .d_scroll_y = 0, .d_scroll_x = 0}}; #endif // IS_ENABLED(CONFIG_ZMK_POINTING) From 43b09e0fae3fee528985b90154ca0f971c0b6bf6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 7 Jan 2026 23:22:33 +0100 Subject: [PATCH 74/96] chore(deps-dev): bump typescript-eslint (#3192) Bumps the development group in /docs with 1 update: [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint). Updates `typescript-eslint` from 8.51.0 to 8.52.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.52.0/packages/typescript-eslint) --- updated-dependencies: - dependency-name: typescript-eslint dependency-version: 8.52.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/package-lock.json | 194 +++++++++++++++++------------------------ docs/package.json | 2 +- 2 files changed, 82 insertions(+), 114 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index fd8050102e4..5414244fd53 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -46,7 +46,7 @@ "prettier": "^3.7.4", "string-replace-loader": "^3.3.0", "typescript": "^5.9.3", - "typescript-eslint": "^8.51.0", + "typescript-eslint": "^8.52.0", "webpack": "^5.104.1" } }, @@ -256,7 +256,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.0.tgz", "integrity": "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", @@ -413,7 +412,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -2260,7 +2258,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -2283,7 +2280,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -2393,7 +2389,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -2815,7 +2810,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3750,7 +3744,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "license": "MIT", - "peer": true, "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -4222,9 +4215,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4392,7 +4385,6 @@ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.2.tgz", "integrity": "sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==", "license": "MIT", - "peer": true, "dependencies": { "@fortawesome/fontawesome-common-types": "6.7.2" }, @@ -4810,7 +4802,6 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", - "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -5440,7 +5431,6 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -6126,7 +6116,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", "license": "MIT", - "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" @@ -6282,20 +6271,20 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.51.0.tgz", - "integrity": "sha512-XtssGWJvypyM2ytBnSnKtHYOGT+4ZwTnBVl36TA4nRO2f4PRNGz5/1OszHzcZCvcBMh+qb7I06uoCmLTRdR9og==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.52.0.tgz", + "integrity": "sha512-okqtOgqu2qmZJ5iN4TWlgfF171dZmx2FzdOv2K/ixL2LZWDStL8+JgQerI2sa8eAEfoydG9+0V96m7V+P8yE1Q==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.51.0", - "@typescript-eslint/type-utils": "8.51.0", - "@typescript-eslint/utils": "8.51.0", - "@typescript-eslint/visitor-keys": "8.51.0", - "ignore": "^7.0.0", + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.52.0", + "@typescript-eslint/type-utils": "8.52.0", + "@typescript-eslint/utils": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0", + "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.2.0" + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6305,7 +6294,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.51.0", + "@typescript-eslint/parser": "^8.52.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -6321,18 +6310,17 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.51.0.tgz", - "integrity": "sha512-3xP4XzzDNQOIqBMWogftkwxhg5oMKApqY0BAflmLZiFYHqyhSOxv/cd/zPQLTcCXr4AkaKb25joocY0BD1WC6A==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.52.0.tgz", + "integrity": "sha512-iIACsx8pxRnguSYhHiMn2PvhvfpopO9FXHyn1mG5txZIsAaB6F0KwbFnUQN3KCiG3Jcuad/Cao2FAs1Wp7vAyg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.51.0", - "@typescript-eslint/types": "8.51.0", - "@typescript-eslint/typescript-estree": "8.51.0", - "@typescript-eslint/visitor-keys": "8.51.0", - "debug": "^4.3.4" + "@typescript-eslint/scope-manager": "8.52.0", + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6347,15 +6335,15 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.51.0.tgz", - "integrity": "sha512-Luv/GafO07Z7HpiI7qeEW5NW8HUtZI/fo/kE0YbtQEFpJRUuR0ajcWfCE5bnMvL7QQFrmT/odMe8QZww8X2nfQ==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.52.0.tgz", + "integrity": "sha512-xD0MfdSdEmeFa3OmVqonHi+Cciab96ls1UhIF/qX/O/gPu5KXD0bY9lu33jj04fjzrXHcuvjBcBC+D3SNSadaw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.51.0", - "@typescript-eslint/types": "^8.51.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.52.0", + "@typescript-eslint/types": "^8.52.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6369,14 +6357,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.51.0.tgz", - "integrity": "sha512-JhhJDVwsSx4hiOEQPeajGhCWgBMBwVkxC/Pet53EpBVs7zHHtayKefw1jtPaNRXpI9RA2uocdmpdfE7T+NrizA==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.52.0.tgz", + "integrity": "sha512-ixxqmmCcc1Nf8S0mS0TkJ/3LKcC8mruYJPOU6Ia2F/zUUR4pApW7LzrpU3JmtePbRUTes9bEqRc1Gg4iyRnDzA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.51.0", - "@typescript-eslint/visitor-keys": "8.51.0" + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6387,9 +6375,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.51.0.tgz", - "integrity": "sha512-Qi5bSy/vuHeWyir2C8u/uqGMIlIDu8fuiYWv48ZGlZ/k+PRPHtaAu7erpc7p5bzw2WNNSniuxoMSO4Ar6V9OXw==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.52.0.tgz", + "integrity": "sha512-jl+8fzr/SdzdxWJznq5nvoI7qn2tNYV/ZBAEcaFMVXf+K6jmXvAFrgo/+5rxgnL152f//pDEAYAhhBAZGrVfwg==", "dev": true, "license": "MIT", "engines": { @@ -6404,17 +6392,17 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.51.0.tgz", - "integrity": "sha512-0XVtYzxnobc9K0VU7wRWg1yiUrw4oQzexCG2V2IDxxCxhqBMSMbjB+6o91A+Uc0GWtgjCa3Y8bi7hwI0Tu4n5Q==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.52.0.tgz", + "integrity": "sha512-JD3wKBRWglYRQkAtsyGz1AewDu3mTc7NtRjR/ceTyGoPqmdS5oCdx/oZMWD5Zuqmo6/MpsYs0wp6axNt88/2EQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.51.0", - "@typescript-eslint/typescript-estree": "8.51.0", - "@typescript-eslint/utils": "8.51.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.2.0" + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0", + "@typescript-eslint/utils": "8.52.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6429,9 +6417,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.51.0.tgz", - "integrity": "sha512-TizAvWYFM6sSscmEakjY3sPqGwxZRSywSsPEiuZF6d5GmGD9Gvlsv0f6N8FvAAA0CD06l3rIcWNbsN1e5F/9Ag==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.52.0.tgz", + "integrity": "sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==", "dev": true, "license": "MIT", "engines": { @@ -6443,21 +6431,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.51.0.tgz", - "integrity": "sha512-1qNjGqFRmlq0VW5iVlcyHBbCjPB7y6SxpBkrbhNWMy/65ZoncXCEPJxkRZL8McrseNH6lFhaxCIaX+vBuFnRng==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.52.0.tgz", + "integrity": "sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.51.0", - "@typescript-eslint/tsconfig-utils": "8.51.0", - "@typescript-eslint/types": "8.51.0", - "@typescript-eslint/visitor-keys": "8.51.0", - "debug": "^4.3.4", - "minimatch": "^9.0.4", - "semver": "^7.6.0", + "@typescript-eslint/project-service": "8.52.0", + "@typescript-eslint/tsconfig-utils": "8.52.0", + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.2.0" + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6497,16 +6485,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.51.0.tgz", - "integrity": "sha512-11rZYxSe0zabiKaCP2QAwRf/dnmgFgvTmeDTtZvUvXG3UuAdg/GU02NExmmIXzz3vLGgMdtrIosI84jITQOxUA==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.52.0.tgz", + "integrity": "sha512-wYndVMWkweqHpEpwPhwqE2lnD2DxC6WVLupU/DOt/0/v+/+iQbbzO3jOHjmBMnhu0DgLULvOaU4h4pwHYi2oRQ==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.51.0", - "@typescript-eslint/types": "8.51.0", - "@typescript-eslint/typescript-estree": "8.51.0" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.52.0", + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6521,13 +6509,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.51.0.tgz", - "integrity": "sha512-mM/JRQOzhVN1ykejrvwnBRV3+7yTKK8tVANVN3o1O0t0v7o+jqdVu9crPy5Y9dov15TJk/FTIgoUGHrTOVL3Zg==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.52.0.tgz", + "integrity": "sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/types": "8.52.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -6769,7 +6757,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -6855,7 +6842,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -6920,7 +6906,6 @@ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.0.tgz", "integrity": "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/abtesting": "1.12.0", "@algolia/client-abtesting": "5.46.0", @@ -7559,7 +7544,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -8594,7 +8578,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -8914,7 +8897,6 @@ "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10" } @@ -9324,7 +9306,6 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -10250,7 +10231,6 @@ "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -17210,7 +17190,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -18114,7 +18093,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -18995,7 +18973,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -19030,7 +19007,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -19087,7 +19063,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", - "peer": true, "dependencies": { "@types/react": "*" }, @@ -19116,7 +19091,6 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -20022,7 +19996,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -21340,7 +21313,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -21461,9 +21433,9 @@ } }, "node_modules/ts-api-utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.3.0.tgz", - "integrity": "sha512-6eg3Y9SF7SsAvGzRHQvvc1skDAhwI4YQ32ui1scxD1Ccr0G5qIIbUBT3pFTKX8kmWIQClHobtUdNuaBgwdfdWg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", "dev": true, "license": "MIT", "engines": { @@ -21486,8 +21458,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", @@ -21648,7 +21619,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -21658,16 +21628,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.51.0.tgz", - "integrity": "sha512-jh8ZuM5oEh2PSdyQG9YAEM1TCGuWenLSuSUhf/irbVUNW9O5FhbFVONviN2TgMTBnUmyHv7E56rYnfLZK6TkiA==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.52.0.tgz", + "integrity": "sha512-atlQQJ2YkO4pfTVQmQ+wvYQwexPDOIgo+RaVcD7gHgzy/IQA+XTyuxNM9M9TVXvttkF7koBHmcwisKdOAf2EcA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.51.0", - "@typescript-eslint/parser": "8.51.0", - "@typescript-eslint/typescript-estree": "8.51.0", - "@typescript-eslint/utils": "8.51.0" + "@typescript-eslint/eslint-plugin": "8.52.0", + "@typescript-eslint/parser": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0", + "@typescript-eslint/utils": "8.52.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -22624,7 +22594,6 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz", "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -23408,7 +23377,6 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.2.1.tgz", "integrity": "sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/docs/package.json b/docs/package.json index 3575eae4a58..dfdc1d95bb0 100644 --- a/docs/package.json +++ b/docs/package.json @@ -65,7 +65,7 @@ "prettier": "^3.7.4", "string-replace-loader": "^3.3.0", "typescript": "^5.9.3", - "typescript-eslint": "^8.51.0", + "typescript-eslint": "^8.52.0", "webpack": "^5.104.1" } } From f85ec7e7a24be10f1cf59025a192569dc0b33167 Mon Sep 17 00:00:00 2001 From: Pete Johanson Date: Wed, 7 Jan 2026 16:05:13 -0700 Subject: [PATCH 75/96] SoC: stm32c0 support (#3174) deps: Use hal_stm32 with stm32c0 USB device fixes. Pull in ZMK fork of hal_stm32 with USB device driver fixes for stm32c0. feat: Add nBOOT_SEL bit setup for STM32 G0/C0 targets Newer STM32 C0 and G0 series SoCs do not by default allow use of the BOOT0 pin/button to enter the bootloader once something has been flash to the device, which is a change from previous series, and usually not what's wanted for keyboards running ZMK. To address this, add some optional, but default initialization code to check the nBOOT_SEL bit and override it if necessary to ensure BOOT pin/button functionality. docs: Extract bootloader config into a dedicated page. Pull the bootloader intergration options out of the system configuration page into their own dedicated one. Co-authored-by: Nicolas Munnich <98408764+nmunnich@users.noreply.github.com> --------- Co-authored-by: Nicolas Munnich <98408764+nmunnich@users.noreply.github.com> --- app/src/boot/CMakeLists.txt | 3 +- app/src/boot/Kconfig | 8 +++++ app/src/boot/Kconfig.defaults | 1 + app/src/boot/stm32_enforce_nboot_sel.c | 46 ++++++++++++++++++++++++++ app/west.yml | 6 ++++ docs/docs/config/bootloader.md | 42 +++++++++++++++++++++++ docs/docs/config/system.md | 7 ---- docs/sidebars.js | 1 + 8 files changed, 106 insertions(+), 8 deletions(-) create mode 100644 app/src/boot/stm32_enforce_nboot_sel.c create mode 100644 docs/docs/config/bootloader.md diff --git a/app/src/boot/CMakeLists.txt b/app/src/boot/CMakeLists.txt index 6e75945a7e9..264c1aa7d25 100644 --- a/app/src/boot/CMakeLists.txt +++ b/app/src/boot/CMakeLists.txt @@ -1,3 +1,4 @@ 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) \ No newline at end of file +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 index f98fbba5761..8cd550c224e 100644 --- a/app/src/boot/Kconfig +++ b/app/src/boot/Kconfig @@ -41,3 +41,11 @@ 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 index 41816bd865a..9fb225759ca 100644 --- a/app/src/boot/Kconfig.defaults +++ b/app/src/boot/Kconfig.defaults @@ -25,3 +25,4 @@ config ZMK_BOOTMODE_BOOTLOADER_MAGIC_VALUE default 0x57 if ZMK_BOOTMODE_MAGIC_VALUE_BOOTLOADER_TYPE_ADAFRUIT_NRF52 endif + diff --git a/app/src/boot/stm32_enforce_nboot_sel.c b/app/src/boot/stm32_enforce_nboot_sel.c new file mode 100644 index 00000000000..f7e79c12ebf --- /dev/null +++ b/app/src/boot/stm32_enforce_nboot_sel.c @@ -0,0 +1,46 @@ +#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/west.yml b/app/west.yml index d177f2bd1c0..0d9d1e024c8 100644 --- a/app/west.yml +++ b/app/west.yml @@ -28,6 +28,12 @@ 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 diff --git a/docs/docs/config/bootloader.md b/docs/docs/config/bootloader.md new file mode 100644 index 00000000000..7b4d22527dc --- /dev/null +++ b/docs/docs/config/bootloader.md @@ -0,0 +1,42 @@ +--- +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/development/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/system.md b/docs/docs/config/system.md index 36b29da7252..e00dfd7a0b2 100644 --- a/docs/docs/config/system.md +++ b/docs/docs/config/system.md @@ -120,13 +120,6 @@ Note that `CONFIG_BT_MAX_CONN` and `CONFIG_BT_MAX_PAIRED` should be set to the s | `CONFIG_ZMK_USB_LOGGING` | bool | Enable USB CDC ACM logging for debugging | n | | `CONFIG_ZMK_LOG_LEVEL` | int | Log level for ZMK debug messages | 4 | -### Double Tap To Bootloader - -| 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 | - ## Snippets :::danger diff --git a/docs/sidebars.js b/docs/sidebars.js index af818d04f76..0b81c9c0b07 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -122,6 +122,7 @@ module.exports = { "config/battery", "config/behaviors", "config/bluetooth", + "config/bootloader", "config/combos", "config/displays", "config/encoders", From 70ab6b243a90b556d113fcdd0c8de1ef3dccdc1e Mon Sep 17 00:00:00 2001 From: cormoran Date: Thu, 8 Jan 2026 08:09:13 +0900 Subject: [PATCH 76/96] fix(studio): avoid decoding buffer overflow (#3185) This patch fixes studio rpc bug. Protobuf decoding buffer overflows when multiple frames are in rx buffer. --- app/src/studio/rpc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/studio/rpc.c b/app/src/studio/rpc.c index af56148254d..8dd711e1e2f 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); + uint32_t len = ring_buf_get_claim(&rpc_rx_buf, &buffer, count - write_offset); if (len > 0) { for (int i = 0; i < len; i++) { From 19582174f3a446a07d40f479020b4ebb1aad8ddb Mon Sep 17 00:00:00 2001 From: Nicolas Munnich <98408764+nmunnich@users.noreply.github.com> Date: Thu, 8 Jan 2026 01:01:05 +0100 Subject: [PATCH 77/96] chore: Add basic tests for Studio's layer manipulation (#3164) chore: Add test behaviors for Studio testing chore: Add basic tests for studio layer adjustment chore: Fixes from code review --- app/include/zmk/keymap.h | 5 +- app/module/CMakeLists.txt | 1 + app/module/Kconfig | 3 +- .../zmk,behavior_add_layer.yaml | 8 ++ .../zmk,behavior_move_layer.yaml | 8 ++ .../zmk,behavior_remove_layer.yaml | 8 ++ ...zmk,behavior_set_layer_binding_at_idx.yaml | 13 +++ app/module/test-behaviors/CMakeLists.txt | 6 ++ app/module/test-behaviors/Kconfig | 2 + .../test-behaviors/behavior_add_layer.c | 50 +++++++++ .../test-behaviors/behavior_move_layer.c | 47 ++++++++ .../test-behaviors/behavior_remove_layer.c | 49 +++++++++ .../behavior_set_layer_binding_at_idx.c | 100 ++++++++++++++++++ app/run-test.sh | 6 ++ .../studio/add-layer/basic/events.patterns | 4 + .../studio/add-layer/basic/extra-cmake-args | 5 + .../add-layer/basic/keycode_events.snapshot | 6 ++ .../studio/add-layer/basic/native_sim.conf | 1 + .../studio/add-layer/basic/native_sim.keymap | 23 ++++ .../studio/add-layer/behavior_keymap.dtsi | 32 ++++++ .../studio/move-layer/basic/events.patterns | 3 + .../studio/move-layer/basic/extra-cmake-args | 5 + .../move-layer/basic/keycode_events.snapshot | 8 ++ .../studio/move-layer/basic/native_sim.conf | 1 + .../studio/move-layer/basic/native_sim.keymap | 26 +++++ .../studio/move-layer/behavior_keymap.dtsi | 34 ++++++ .../studio/remove-layer/basic/events.patterns | 3 + .../remove-layer/basic/extra-cmake-args | 5 + .../basic/keycode_events.snapshot | 7 ++ .../studio/remove-layer/basic/native_sim.conf | 1 + .../remove-layer/basic/native_sim.keymap | 25 +++++ .../studio/remove-layer/behavior_keymap.dtsi | 34 ++++++ .../remove-default-layer/events.patterns | 5 + .../remove-default-layer/extra-cmake-args | 5 + .../keycode_events.snapshot | 8 ++ .../remove-default-layer/native_sim.conf | 1 + .../remove-default-layer/native_sim.keymap | 26 +++++ .../remove-layer/remove-default-layer/pending | 2 + 38 files changed, 573 insertions(+), 3 deletions(-) create mode 100644 app/module/dts/bindings/test-behaviors/zmk,behavior_add_layer.yaml create mode 100644 app/module/dts/bindings/test-behaviors/zmk,behavior_move_layer.yaml create mode 100644 app/module/dts/bindings/test-behaviors/zmk,behavior_remove_layer.yaml create mode 100644 app/module/dts/bindings/test-behaviors/zmk,behavior_set_layer_binding_at_idx.yaml create mode 100644 app/module/test-behaviors/CMakeLists.txt create mode 100644 app/module/test-behaviors/Kconfig create mode 100644 app/module/test-behaviors/behavior_add_layer.c create mode 100644 app/module/test-behaviors/behavior_move_layer.c create mode 100644 app/module/test-behaviors/behavior_remove_layer.c create mode 100644 app/module/test-behaviors/behavior_set_layer_binding_at_idx.c create mode 100644 app/tests/studio/add-layer/basic/events.patterns create mode 100644 app/tests/studio/add-layer/basic/extra-cmake-args create mode 100644 app/tests/studio/add-layer/basic/keycode_events.snapshot create mode 100644 app/tests/studio/add-layer/basic/native_sim.conf create mode 100644 app/tests/studio/add-layer/basic/native_sim.keymap create mode 100644 app/tests/studio/add-layer/behavior_keymap.dtsi create mode 100644 app/tests/studio/move-layer/basic/events.patterns create mode 100644 app/tests/studio/move-layer/basic/extra-cmake-args create mode 100644 app/tests/studio/move-layer/basic/keycode_events.snapshot create mode 100644 app/tests/studio/move-layer/basic/native_sim.conf create mode 100644 app/tests/studio/move-layer/basic/native_sim.keymap create mode 100644 app/tests/studio/move-layer/behavior_keymap.dtsi create mode 100644 app/tests/studio/remove-layer/basic/events.patterns create mode 100644 app/tests/studio/remove-layer/basic/extra-cmake-args create mode 100644 app/tests/studio/remove-layer/basic/keycode_events.snapshot create mode 100644 app/tests/studio/remove-layer/basic/native_sim.conf create mode 100644 app/tests/studio/remove-layer/basic/native_sim.keymap create mode 100644 app/tests/studio/remove-layer/behavior_keymap.dtsi create mode 100644 app/tests/studio/remove-layer/remove-default-layer/events.patterns create mode 100644 app/tests/studio/remove-layer/remove-default-layer/extra-cmake-args create mode 100644 app/tests/studio/remove-layer/remove-default-layer/keycode_events.snapshot create mode 100644 app/tests/studio/remove-layer/remove-default-layer/native_sim.conf create mode 100644 app/tests/studio/remove-layer/remove-default-layer/native_sim.keymap create mode 100644 app/tests/studio/remove-layer/remove-default-layer/pending diff --git a/app/include/zmk/keymap.h b/app/include/zmk/keymap.h index 556e045677b..c7b2681d595 100644 --- a/app/include/zmk/keymap.h +++ b/app/include/zmk/keymap.h @@ -11,11 +11,12 @@ #include #define ZMK_KEYMAP_LAYERS_FOREACH(_fn) \ - COND_CODE_1(IS_ENABLED(CONFIG_ZMK_STUDIO), (DT_FOREACH_CHILD(DT_INST(0, zmk_keymap), _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_STUDIO), \ + 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))) diff --git a/app/module/CMakeLists.txt b/app/module/CMakeLists.txt index db886ac6987..8c4afb069a1 100644 --- a/app/module/CMakeLists.txt +++ b/app/module/CMakeLists.txt @@ -1,4 +1,5 @@ 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 52c013151a9..e86c0d6baeb 100644 --- a/app/module/Kconfig +++ b/app/module/Kconfig @@ -1,3 +1,4 @@ rsource "drivers/Kconfig" -rsource "lib/Kconfig" \ No newline at end of file +rsource "lib/Kconfig" +rsource "test-behaviors/Kconfig" \ No newline at end of file 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 new file mode 100644 index 00000000000..f07ef60886f --- /dev/null +++ b/app/module/dts/bindings/test-behaviors/zmk,behavior_add_layer.yaml @@ -0,0 +1,8 @@ +# 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 new file mode 100644 index 00000000000..b23448d6560 --- /dev/null +++ b/app/module/dts/bindings/test-behaviors/zmk,behavior_move_layer.yaml @@ -0,0 +1,8 @@ +# 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 new file mode 100644 index 00000000000..cdc20a8aac8 --- /dev/null +++ b/app/module/dts/bindings/test-behaviors/zmk,behavior_remove_layer.yaml @@ -0,0 +1,8 @@ +# 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 new file mode 100644 index 00000000000..078587d43fe --- /dev/null +++ b/app/module/dts/bindings/test-behaviors/zmk,behavior_set_layer_binding_at_idx.yaml @@ -0,0 +1,13 @@ +# 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 new file mode 100644 index 00000000000..b228f5816ec --- /dev/null +++ b/app/module/test-behaviors/CMakeLists.txt @@ -0,0 +1,6 @@ +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 new file mode 100644 index 00000000000..6a9458db1ab --- /dev/null +++ b/app/module/test-behaviors/Kconfig @@ -0,0 +1,2 @@ +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 new file mode 100644 index 00000000000..47927cb721a --- /dev/null +++ b/app/module/test-behaviors/behavior_add_layer.c @@ -0,0 +1,50 @@ +/* + * 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 new file mode 100644 index 00000000000..74551629d6e --- /dev/null +++ b/app/module/test-behaviors/behavior_move_layer.c @@ -0,0 +1,47 @@ +/* + * 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 new file mode 100644 index 00000000000..58c7fafd408 --- /dev/null +++ b/app/module/test-behaviors/behavior_remove_layer.c @@ -0,0 +1,49 @@ +/* + * 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 new file mode 100644 index 00000000000..49bf0dd38a4 --- /dev/null +++ b/app/module/test-behaviors/behavior_set_layer_binding_at_idx.c @@ -0,0 +1,100 @@ +/* + * 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/run-test.sh b/app/run-test.sh index 61563d0843b..cd944c9a551 100755 --- a/app/run-test.sh +++ b/app/run-test.sh @@ -41,6 +41,12 @@ build_cmd="west build ${ZMK_SRC_DIR:+-s $ZMK_SRC_DIR} -d ${ZMK_BUILD_DIR}/tests/ -b native_sim/native/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" +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) diff --git a/app/tests/studio/add-layer/basic/events.patterns b/app/tests/studio/add-layer/basic/events.patterns new file mode 100644 index 00000000000..8b349f8d946 --- /dev/null +++ b/app/tests/studio/add-layer/basic/events.patterns @@ -0,0 +1,4 @@ +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 new file mode 100644 index 00000000000..c5e4f18efeb --- /dev/null +++ b/app/tests/studio/add-layer/basic/extra-cmake-args @@ -0,0 +1,5 @@ +-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 new file mode 100644 index 00000000000..83fbf0fe1b1 --- /dev/null +++ b/app/tests/studio/add-layer/basic/keycode_events.snapshot @@ -0,0 +1,6 @@ +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 new file mode 100644 index 00000000000..3fb69a9d401 --- /dev/null +++ b/app/tests/studio/add-layer/basic/native_sim.conf @@ -0,0 +1 @@ +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 new file mode 100644 index 00000000000..59ac62a2017 --- /dev/null +++ b/app/tests/studio/add-layer/basic/native_sim.keymap @@ -0,0 +1,23 @@ +#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 new file mode 100644 index 00000000000..243a6e0f8bc --- /dev/null +++ b/app/tests/studio/add-layer/behavior_keymap.dtsi @@ -0,0 +1,32 @@ +#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 new file mode 100644 index 00000000000..a3fbafba30d --- /dev/null +++ b/app/tests/studio/move-layer/basic/events.patterns @@ -0,0 +1,3 @@ +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 new file mode 100644 index 00000000000..c5e4f18efeb --- /dev/null +++ b/app/tests/studio/move-layer/basic/extra-cmake-args @@ -0,0 +1,5 @@ +-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 new file mode 100644 index 00000000000..365afc62016 --- /dev/null +++ b/app/tests/studio/move-layer/basic/keycode_events.snapshot @@ -0,0 +1,8 @@ +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 new file mode 100644 index 00000000000..3fb69a9d401 --- /dev/null +++ b/app/tests/studio/move-layer/basic/native_sim.conf @@ -0,0 +1 @@ +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 new file mode 100644 index 00000000000..91afb094323 --- /dev/null +++ b/app/tests/studio/move-layer/basic/native_sim.keymap @@ -0,0 +1,26 @@ +#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 new file mode 100644 index 00000000000..014bba467b0 --- /dev/null +++ b/app/tests/studio/move-layer/behavior_keymap.dtsi @@ -0,0 +1,34 @@ +#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 new file mode 100644 index 00000000000..2b04f256abe --- /dev/null +++ b/app/tests/studio/remove-layer/basic/events.patterns @@ -0,0 +1,3 @@ +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 new file mode 100644 index 00000000000..c5e4f18efeb --- /dev/null +++ b/app/tests/studio/remove-layer/basic/extra-cmake-args @@ -0,0 +1,5 @@ +-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 new file mode 100644 index 00000000000..4aa4cd639c0 --- /dev/null +++ b/app/tests/studio/remove-layer/basic/keycode_events.snapshot @@ -0,0 +1,7 @@ +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 new file mode 100644 index 00000000000..3fb69a9d401 --- /dev/null +++ b/app/tests/studio/remove-layer/basic/native_sim.conf @@ -0,0 +1 @@ +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 new file mode 100644 index 00000000000..9f026de9464 --- /dev/null +++ b/app/tests/studio/remove-layer/basic/native_sim.keymap @@ -0,0 +1,25 @@ +#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 new file mode 100644 index 00000000000..14f093df803 --- /dev/null +++ b/app/tests/studio/remove-layer/behavior_keymap.dtsi @@ -0,0 +1,34 @@ +#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 new file mode 100644 index 00000000000..b11b5a68d5e --- /dev/null +++ b/app/tests/studio/remove-layer/remove-default-layer/events.patterns @@ -0,0 +1,5 @@ +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 new file mode 100644 index 00000000000..c5e4f18efeb --- /dev/null +++ b/app/tests/studio/remove-layer/remove-default-layer/extra-cmake-args @@ -0,0 +1,5 @@ +-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 new file mode 100644 index 00000000000..ad99cc87c8d --- /dev/null +++ b/app/tests/studio/remove-layer/remove-default-layer/keycode_events.snapshot @@ -0,0 +1,8 @@ +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 new file mode 100644 index 00000000000..3fb69a9d401 --- /dev/null +++ b/app/tests/studio/remove-layer/remove-default-layer/native_sim.conf @@ -0,0 +1 @@ +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 new file mode 100644 index 00000000000..1aa43a6a51c --- /dev/null +++ b/app/tests/studio/remove-layer/remove-default-layer/native_sim.keymap @@ -0,0 +1,26 @@ +#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 new file mode 100644 index 00000000000..2e474100689 --- /dev/null +++ b/app/tests/studio/remove-layer/remove-default-layer/pending @@ -0,0 +1,2 @@ +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 From 6cd927f77b0493baa23fc1056087c9e561b05dbb Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 17 Dec 2024 18:24:28 -0700 Subject: [PATCH 78/96] [CHERRY-PICK #2721] feat(pointing): Release pressed keys on disconnect Match the behavior for key press release on split peripheral disconnect, and track pressed input keys to release them as needed on disconnect. --- app/include/zmk/pointing/input_split.h | 3 +- app/src/pointing/Kconfig | 5 +++ app/src/pointing/input_split.c | 60 ++++++++++++++++++++++++++ app/src/split/bluetooth/central.c | 2 +- 4 files changed, 68 insertions(+), 2 deletions(-) diff --git a/app/include/zmk/pointing/input_split.h b/app/include/zmk/pointing/input_split.h index 812035477e2..235ea4954b1 100644 --- a/app/include/zmk/pointing/input_split.h +++ b/app/include/zmk/pointing/input_split.h @@ -7,4 +7,5 @@ #pragma once int zmk_input_split_report_peripheral_event(uint8_t reg, uint8_t type, uint16_t code, int32_t value, - bool sync); \ No newline at end of file + bool sync); +int zmk_input_split_peripheral_disconnected(uint8_t reg); \ No newline at end of file diff --git a/app/src/pointing/Kconfig b/app/src/pointing/Kconfig index 43bc784fa1e..fc91f1449d8 100644 --- a/app/src/pointing/Kconfig +++ b/app/src/pointing/Kconfig @@ -78,6 +78,11 @@ 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_split.c b/app/src/pointing/input_split.c index c3bcd4cc21f..bc3ed3103a0 100644 --- a/app/src/pointing/input_split.c +++ b/app/src/pointing/input_split.c @@ -26,11 +26,40 @@ struct zis_entry { static const struct zis_entry proxy_inputs[] = {DT_INST_FOREACH_STATUS_OKAY(ZIS_ENTRY)}; +#define PLUS_ONE(n) +1 + +static uint16_t proxy_active_keys[(0 DT_INST_FOREACH_STATUS_OKAY(PLUS_ONE))] + [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) { + if (value) { + int ret = replace_active_key(i, 0, code); + if (ret < 0) { + LOG_WRN("Failed to track pressed key %d", ret); + } + } else { + int ret = replace_active_key(i, code, 0); + if (ret < 0) { + LOG_WRN("Failed to untrack released key %d", ret); + } + } + } return input_report(proxy_inputs[i].dev, type, code, value, sync, K_NO_WAIT); } } @@ -38,6 +67,37 @@ 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); diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index 1a9fb0e8a14..b4b61ce7750 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -122,7 +122,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; - // memset(&peripheral_input_slots[i], 0, sizeof(struct peripheral_input_slot)); + zmk_input_split_peripheral_disconnected(peripheral_input_slots[i].reg); } } } From 6b0c4def383ae1402d2043599766f5d21c95ebb6 Mon Sep 17 00:00:00 2001 From: Chris Andreae Date: Sat, 28 May 2022 20:15:51 +0900 Subject: [PATCH 79/96] rgb_underglow: refresh more frequently for smoother RGB underglow --- app/src/rgb_underglow.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 3453fb44e0d..d78df1b3af0 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -274,7 +274,7 @@ static int zmk_rgb_underglow_init(void) { #endif if (state.on) { - k_timer_start(&underglow_tick, K_NO_WAIT, K_MSEC(50)); + k_timer_start(&underglow_tick, K_NO_WAIT, K_MSEC(25)); } return 0; @@ -312,7 +312,7 @@ int zmk_rgb_underglow_on(void) { state.on = true; state.animation_step = 0; - k_timer_start(&underglow_tick, K_NO_WAIT, K_MSEC(50)); + k_timer_start(&underglow_tick, K_NO_WAIT, K_MSEC(25)); return zmk_rgb_underglow_save_state(); } From 57e51f3779d694e04399221b0968b0f356477c0a Mon Sep 17 00:00:00 2001 From: Donald Gordon Date: Wed, 13 Jul 2022 22:39:44 +1200 Subject: [PATCH 80/96] RGB underglow status support Adds Glove80's status indicator using RGB underglow support. Requires ZMK PR#999 and PR#1243. The underglow status is able to show layer state, battery levels, caps/num/scroll-lock, BLE and USB state. The underglow positions selected for each of these indicators is configured using the new devicetree node zmk,underglow-indicators, which takes an array of integer LED positions for each feature. --- .../bindings/zmk,underglow-indicators.yaml | 35 ++ app/include/dt-bindings/zmk/rgb.h | 2 + app/include/zmk/ble.h | 1 + app/include/zmk/endpoints.h | 2 + app/include/zmk/rgb_underglow.h | 1 + app/src/behaviors/behavior_rgb_underglow.c | 2 + app/src/ble.c | 17 + app/src/endpoints.c | 4 + app/src/rgb_underglow.c | 344 ++++++++++++++++-- 9 files changed, 387 insertions(+), 21 deletions(-) create mode 100644 app/dts/bindings/zmk,underglow-indicators.yaml diff --git a/app/dts/bindings/zmk,underglow-indicators.yaml b/app/dts/bindings/zmk,underglow-indicators.yaml new file mode 100644 index 00000000000..d5cdde80a9a --- /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/include/dt-bindings/zmk/rgb.h b/app/include/dt-bindings/zmk/rgb.h index c1a8008273c..657ac2fd528 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/zmk/ble.h b/app/include/zmk/ble.h index 92b2107d88b..c65addde614 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 a2ef3181a58..aabdb302133 100644 --- a/app/include/zmk/endpoints.h +++ b/app/include/zmk/endpoints.h @@ -68,6 +68,8 @@ int zmk_endpoints_toggle_transport(void); */ struct zmk_endpoint_instance zmk_endpoints_selected(void); +bool zmk_endpoints_preferred_transport_is_active(); + int zmk_endpoints_send_report(uint16_t usage_page); #if IS_ENABLED(CONFIG_ZMK_POINTING) diff --git a/app/include/zmk/rgb_underglow.h b/app/include/zmk/rgb_underglow.h index be0ef252290..0c45e1c68f7 100644 --- a/app/include/zmk/rgb_underglow.h +++ b/app/include/zmk/rgb_underglow.h @@ -27,3 +27,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/src/behaviors/behavior_rgb_underglow.c b/app/src/behaviors/behavior_rgb_underglow.c index 80cd518204c..2576486a4fc 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/ble.c b/app/src/ble.c index 94c1b293646..cd51739a771 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -144,6 +144,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/endpoints.c b/app/src/endpoints.c index ae0e5e7fd88..e96ce796d92 100644 --- a/app/src/endpoints.c +++ b/app/src/endpoints.c @@ -319,6 +319,10 @@ static struct zmk_endpoint_instance get_selected_instance(void) { return instance; } +bool zmk_endpoints_preferred_transport_is_active(void) { + return preferred_transport == get_selected_transport(); +} + static int zmk_endpoints_init(void) { #if IS_ENABLED(CONFIG_SETTINGS) k_work_init_delayable(&endpoints_save_work, endpoints_save_preferred_work); diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index d78df1b3af0..e93cda91b9f 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -12,6 +12,13 @@ #include #include +#include +#include +#include +#include +#include +#include + #include #include @@ -20,12 +27,15 @@ #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) @@ -58,11 +68,14 @@ struct rgb_underglow_state { 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,6 +83,8 @@ static struct rgb_underglow_state state; static const struct device *const ext_power = DEVICE_DT_GET(DT_INST(0, zmk_ext_power_generic)); #endif +void zmk_rgb_set_ext_power(void); + static struct zmk_led_hsb 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; @@ -175,6 +190,235 @@ static void zmk_rgb_underglow_effect_swirl(void) { state.animation_step = state.animation_step % HUE_MAX; } +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(); + } + + // fast path: no status indicators, battery level OK + if (blend == 0 && bat0 >= 20) { + led_strip_update_rgb(led_strip, pixels, STRIP_NUM_PIXELS); + return; + } + // battery below minimum charge + if (bat0 < 10) { + memset(pixels, 0, sizeof(struct led_rgb) * STRIP_NUM_PIXELS); + if (state.on) { + int c_power = ext_power_get(ext_power); + if (c_power && !state.status_active) { + // power is on, RGB underglow is on, but battery is too low + state.on = false; + reset_ext_power = true; + } + } + } + + 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); + } + } + + // battery below 20%, reduce LED brightness + 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 +#else +#define UNDERGLOW_INDICATORS_ENABLED 0 +#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; + } + + // originally, six levels, 0 .. 100 + + 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}; + } + + // BATTERY STATUS +#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 // CONFIG_ZMK_SPLIT_BLE_CENTRAL_BATTERY_LEVEL_FETCHING +#endif // CONFIG_ZMK_BATTERY_REPORTING + + // CAPSLOCK/NUMLOCK/SCROLLOCK STATUS + 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; + + // LAYER STATUS + 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) { // connected AND active + status_pixels[ble_pixel] = white; + } else if (status == 2) { // connected + status_pixels[ble_pixel] = dull_green; + } else if (status == 1) { // paired + status_pixels[ble_pixel] = red; + } else if (status == 0) { // unused + 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) { // connected AND active + status_pixels[DT_PROP(UNDERGLOW_INDICATORS, usb_state)] = white; + } else if (usb_state == ZMK_USB_CONN_HID) { // connected + status_pixels[DT_PROP(UNDERGLOW_INDICATORS, usb_state)] = dull_green; + } else if (usb_state == ZMK_USB_CONN_POWERED) { // powered + status_pixels[DT_PROP(UNDERGLOW_INDICATORS, usb_state)] = red; + } else if (usb_state == ZMK_USB_CONN_NONE) { // disconnected + 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 // underglow_indicators exists + static void zmk_rgb_underglow_tick(struct k_work *work) { switch (state.current_effect) { case UNDERGLOW_EFFECT_SOLID: @@ -191,10 +435,7 @@ static void zmk_rgb_underglow_tick(struct k_work *work) { break; } - int err = led_strip_update_rgb(led_strip, pixels, STRIP_NUM_PIXELS); - if (err < 0) { - LOG_ERR("Failed to update the RGB strip (%d)", err); - } + zmk_led_write_pixels(); } K_WORK_DEFINE(underglow_tick_work, zmk_rgb_underglow_tick); @@ -297,20 +538,47 @@ 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) { + 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) + // force power off, when battery low (<10%) + if (state.on && !state.status_active) { + if (zmk_battery_state_of_charge() < 10) { + desired_state = false; + } + } +#endif // CONFIG_ZMK_BATTERY_REPORTING + + 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 +#endif // CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER +} + +int zmk_rgb_underglow_on(void) { + if (!led_strip) + return -ENODEV; state.on = true; + zmk_rgb_set_ext_power(); + state.animation_step = 0; k_timer_start(&underglow_tick, K_NO_WAIT, K_MSEC(25)); @@ -322,7 +590,7 @@ static void zmk_rgb_underglow_off_handler(struct k_work *work) { pixels[i] = (struct led_rgb){r : 0, g : 0, b : 0}; } - led_strip_update_rgb(led_strip, pixels, STRIP_NUM_PIXELS); + zmk_led_write_pixels(); } K_WORK_DEFINE(underglow_off_work, zmk_rgb_underglow_off_handler); @@ -331,19 +599,11 @@ int zmk_rgb_underglow_off(void) { if (!led_strip) return -ENODEV; -#if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) - if (ext_power != NULL) { - int rc = ext_power_disable(ext_power); - if (rc != 0) { - LOG_ERR("Unable to disable EXT_POWER: %d", rc); - } - } -#endif - 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(); } @@ -374,6 +634,48 @@ int zmk_rgb_underglow_toggle(void) { return state.on ? zmk_rgb_underglow_off() : zmk_rgb_underglow_on(); } +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; +} + 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; From 2876b2ac31c4a6a78505b17cdbd9ad0291668520 Mon Sep 17 00:00:00 2001 From: Donald Gordon Date: Sat, 21 Jan 2023 15:33:21 +1300 Subject: [PATCH 81/96] ext_power: add Kconfig for initial ext_power state Adds a Kconfig setting for the default EXT_POWER status at initialization time. Previously it was always initialized to on if no saved value was present. --- app/Kconfig | 10 ++++++++++ app/src/ext_power_generic.c | 14 +++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index e1c4ada9f03..3aebce6f193 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -430,6 +430,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" diff --git a/app/src/ext_power_generic.c b/app/src/ext_power_generic.c index 3975e038a0d..facbbc9abcd 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); From 3c2af96df8e07e17de83464f7fc1748559f8853c Mon Sep 17 00:00:00 2001 From: Chris Andreae Date: Wed, 15 Feb 2023 14:10:21 +0900 Subject: [PATCH 82/96] Include the serial number in the Bluetooth device name --- app/Kconfig | 10 ++++++ .../moergo/glove80/glove80_lh_defconfig | 2 ++ app/boards/moergo/glove80/usb_serial_number.c | 31 ++++++++++------- app/src/ble.c | 33 +++++++++++++++++++ 4 files changed, 65 insertions(+), 11 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 3aebce6f193..0354df90a55 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -210,6 +210,16 @@ config ZMK_BLE_MOUSE_REPORT_QUEUE_SIZE config ZMK_BLE_CLEAR_BONDS_ON_START bool "Configuration that clears all bond information from the keyboard on startup." +config ZMK_BLE_DEVICE_NAME_APPEND_SN + bool "Append the device serial number to the Bluetooth device name" + default n + select BT_DEVICE_NAME_DYNAMIC + +config ZMK_BLE_DEVICE_NAME_SN_CHARS + int "Number of hexadecimal digits of serial number to append to the BT device name" + default 6 + depends on ZMK_BLE_DEVICE_NAME_APPEND_SN + # HID GATT notifications sent this way are *not* picked up by Linux, and possibly others. config BT_GATT_NOTIFY_MULTIPLE default n diff --git a/app/boards/moergo/glove80/glove80_lh_defconfig b/app/boards/moergo/glove80/glove80_lh_defconfig index 9973e953e00..37bbae37f5c 100644 --- a/app/boards/moergo/glove80/glove80_lh_defconfig +++ b/app/boards/moergo/glove80/glove80_lh_defconfig @@ -12,6 +12,8 @@ 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" diff --git a/app/boards/moergo/glove80/usb_serial_number.c b/app/boards/moergo/glove80/usb_serial_number.c index 44d7ee20363..6254cdc4d73 100644 --- a/app/boards/moergo/glove80/usb_serial_number.c +++ b/app/boards/moergo/glove80/usb_serial_number.c @@ -14,14 +14,15 @@ LOG_MODULE_DECLARE(usb_descriptor); int base16_encode(const uint8_t *data, int length, uint8_t *result, int bufSize); +void fill_serial_number(char *buf, int length); +/** + * nrf52840 hwinfo returns a 64-bit hardware id. Glove80 uses this as a + * serial number, encoded as base16 into the last 16 characters of the + * CONFIG_USB_DEVICE_SN template. If insufficient template space is + * available, instead return the static serial number string. + */ uint8_t *usb_update_sn_string_descriptor(void) { - /* - * nrf52840 hwinfo returns a 64-bit hardware id. Glove80 uses this as a - * serial number, encoded as base16 into the last 16 characters of the - * CONFIG_USB_DEVICE_SN template. If insufficient template space is - * available, instead return the static serial number string. - */ const uint8_t template_len = sizeof(CONFIG_USB_DEVICE_SN); const uint8_t sn_len = 16; @@ -33,17 +34,25 @@ uint8_t *usb_update_sn_string_descriptor(void) { static uint8_t serial[sizeof(CONFIG_USB_DEVICE_SN)]; strncpy(serial, CONFIG_USB_DEVICE_SN, template_len); + const uint8_t offset = template_len - sn_len - 1; + fill_serial_number(serial + offset, sn_len); + serial[template_len - 1] = '\0'; + + return serial; +} + +/** + * Writes the first `length` bytes of the device serial number into buf + */ +void fill_serial_number(char *buf, int length) { uint8_t hwid[8]; memset(hwid, 0, sizeof(hwid)); uint8_t hwlen = hwinfo_get_device_id(hwid, sizeof(hwid)); if (hwlen > 0) { - const uint8_t offset = template_len - sn_len - 1; - LOG_HEXDUMP_DBG(&hwid, sn_len, "Serial Number"); - base16_encode(hwid, hwlen, serial + offset, sn_len + 1); + LOG_HEXDUMP_DBG(&hwid, 16, "Serial Number"); + base16_encode(hwid, hwlen, buf, length); } - - return serial; } int base16_encode(const uint8_t *data, int length, uint8_t *result, int bufSize) { diff --git a/app/src/ble.c b/app/src/ble.c index cd51739a771..ab54ec0e872 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -62,11 +62,34 @@ enum advertising_type { static struct zmk_ble_profile profiles[ZMK_BLE_PROFILE_COUNT]; static uint8_t active_profile; +#if IS_ENABLED(CONFIG_ZMK_BLE_DEVICE_NAME_APPEND_SN) + +static char bt_device_name[sizeof(CONFIG_BT_DEVICE_NAME) + CONFIG_ZMK_BLE_DEVICE_NAME_SN_CHARS + 1]; + +void fill_serial_number(char *buf, int length); + +// configure the BT device name by appending a serial number prefix to +// CONFIG_BT_DEVICE_NAME +void init_bt_device_name(void) { + strncpy(bt_device_name, CONFIG_BT_DEVICE_NAME, sizeof(bt_device_name)); + bt_device_name[sizeof(CONFIG_BT_DEVICE_NAME) - 1] = ' '; + fill_serial_number(&bt_device_name[sizeof(CONFIG_BT_DEVICE_NAME)], + CONFIG_ZMK_BLE_DEVICE_NAME_SN_CHARS); + bt_device_name[sizeof(bt_device_name) - 1] = '\0'; +} + +#define DEVICE_NAME bt_device_name +#define DEVICE_NAME_LEN (sizeof(bt_device_name) - 1) + +#else + #define DEVICE_NAME CONFIG_BT_DEVICE_NAME #define DEVICE_NAME_LEN (sizeof(DEVICE_NAME) - 1) #define DEVICE_APPEARANCE \ (uint8_t) CONFIG_BT_DEVICE_APPEARANCE, (uint8_t)(CONFIG_BT_DEVICE_APPEARANCE >> 8) +#endif + BUILD_ASSERT( DEVICE_NAME_LEN <= CONFIG_BT_DEVICE_NAME_MAX, "ERROR: BLE device name is too long. Max length: " STRINGIFY(CONFIG_BT_DEVICE_NAME_MAX)); @@ -749,6 +772,10 @@ static int zmk_ble_complete_startup(void) { } static int zmk_ble_init(void) { +#if IS_ENABLED(CONFIG_ZMK_BLE_DEVICE_NAME_APPEND_SN) + init_bt_device_name(); +#endif + int err = bt_enable(NULL); if (err < 0 && err != -EALREADY) { @@ -756,6 +783,12 @@ static int zmk_ble_init(void) { return err; } +#if IS_ENABLED(CONFIG_ZMK_BLE_DEVICE_NAME_APPEND_SN) + if (strcmp(bt_get_name(), bt_device_name) != 0) { + bt_set_name(bt_device_name); + } +#endif + #if IS_ENABLED(CONFIG_SETTINGS) settings_register(&profiles_handler); k_work_init_delayable(&ble_save_work, ble_save_profile_work); From ae387c0644ef039a99af7b41de3e13f8c027683e Mon Sep 17 00:00:00 2001 From: Chris Andreae Date: Sat, 18 Sep 2021 20:38:30 +0900 Subject: [PATCH 83/96] Add build environment using Nix --- .gitattributes | 1 + README-NIX.md | 39 +++ default.nix | 53 ++++ nix/cmake-shell.nix | 17 ++ nix/generate-pin.rb | 34 +++ nix/manifest.json | 325 +++++++++++++++++++++++++ nix/pinned-nixpkgs.json | 4 + nix/pinned-nixpkgs.nix | 17 ++ nix/update-manifest/default.nix | 11 + nix/update-manifest/update-manifest.sh | 39 +++ nix/west-manifest.patch | 17 ++ nix/west-shell.nix | 50 ++++ nix/zephyr.nix | 52 ++++ nix/zmk.nix | 116 +++++++++ 14 files changed, 775 insertions(+) create mode 100644 README-NIX.md create mode 100644 default.nix create mode 100644 nix/cmake-shell.nix create mode 100755 nix/generate-pin.rb create mode 100644 nix/manifest.json create mode 100644 nix/pinned-nixpkgs.json create mode 100644 nix/pinned-nixpkgs.nix create mode 100644 nix/update-manifest/default.nix create mode 100755 nix/update-manifest/update-manifest.sh create mode 100644 nix/west-manifest.patch create mode 100644 nix/west-shell.nix create mode 100644 nix/zephyr.nix create mode 100644 nix/zmk.nix diff --git a/.gitattributes b/.gitattributes index 3d05d86d31a..af12493a041 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4,3 +4,4 @@ # Docker on Windows. .bashrc text eol=lf *.sh text eol=lf +*.nix text eol=lf diff --git a/README-NIX.md b/README-NIX.md new file mode 100644 index 00000000000..a65c376a4a2 --- /dev/null +++ b/README-NIX.md @@ -0,0 +1,39 @@ +# Building Zephyr™ Mechanical Keyboard (ZMK) Firmware with Nix + +This extension is added by MoErgo for the Glove80 keyboard. + +Nix makes setup significantly easier. With this approach `west` is not needed. +You can however still choose to build using the standard Zephyr `west` toolchain +if you wish. + +# To build a target + +In ZMK root directory, + + nix-build -A *target* [-o *output_directory*] + +For example, + + nix-build -A glove80_left -o left + +The `output_directory` nix creates is a symlink. If you prefer not to rely on +symlink (perhaps because you are using WSL on Windows), you can make a copy of +the resulting `uf2` file using: + + cp -f $(nix-build -A *target* --no-out-link)/zmk.uf2 . + +# To build Glove80 + +In ZMK root directory, + + cp -f $(nix-build -A glove80_combined --no-out-link)/glove80.uf2 . + +# Adding new targets + +Edit default.nix and add an target based on zmk + +An example is: + + glove80_left = zmk.override { + board = "glove80_lh"; + }; diff --git a/default.nix b/default.nix new file mode 100644 index 00000000000..57d15753a44 --- /dev/null +++ b/default.nix @@ -0,0 +1,53 @@ +{ pkgs ? (import ./nix/pinned-nixpkgs.nix {}) }: +let + inherit (pkgs) newScope; + inherit (pkgs.lib) makeScope; +in + +makeScope newScope (self: with self; { + west = pkgs.python3Packages.west.overrideAttrs(attrs: { + patches = (attrs.patches or []) ++ [./nix/west-manifest.patch]; + }); + + # To update the pinned Zephyr dependecies using west and update-manifest: + # nix shell -f . west -c west init -l app + # nix shell -f . west -c west update + # nix shell -f . update-manifest -c update-manifest > nix/manifest.json + # Note that any `group-filter` groups in west.yml need to be temporarily + # removed, as `west update-manifest` requires all dependencies to be fetched. + update-manifest = callPackage ./nix/update-manifest { inherit west; }; + + combine_uf2 = a: b: + let combine = name: pkgs.runCommandNoCC "combined_${a.name}_${b.name}" {} + '' + mkdir -p $out + cat ${a}/zmk.uf2 ${b}/zmk.uf2 > $out/${name}.uf2 + ''; + in (combine "glove80") // { __functor = self: name: combine name; }; + + zephyr = callPackage ./nix/zephyr.nix { }; + + zmk = callPackage ./nix/zmk.nix { }; + + zmk_settings_reset = zmk.override { + shield = "settings_reset"; + }; + + glove80_left = zmk.override { + board = "glove80_lh"; + }; + + glove80_right = zmk.override { + board = "glove80_rh"; + }; + + glove80_combined = combine_uf2 glove80_left glove80_right "glove80"; + + glove80_v0_left = zmk.override { + board = "glove80_v0_lh"; + }; + + glove80_v0_right = zmk.override { + board = "glove80_v0_rh"; + }; +}) diff --git a/nix/cmake-shell.nix b/nix/cmake-shell.nix new file mode 100644 index 00000000000..de68e6cf502 --- /dev/null +++ b/nix/cmake-shell.nix @@ -0,0 +1,17 @@ +{ pkgs ? (import ./pinned-nixpkgs.nix {}) }: + +let + zmkPkgs = (import ../default.nix { inherit pkgs; }); + inherit (zmkPkgs) zmk zephyr; + + zmkCmake = pkgs.writeShellScriptBin "zmk-cmake" '' + export PATH=${pkgs.lib.makeBinPath zmk.nativeBuildInputs}:$PATH + export CMAKE_PREFIX_PATH=${zephyr} + + cmake -G Ninja ${pkgs.lib.escapeShellArgs zmk.cmakeFlags} "-DUSER_CACHE_DIR=/tmp/.cache" "$@" + ''; +in +pkgs.stdenv.mkDerivation { + name = "zmk-cmake-shell"; + nativeBuildInputs = zmk.nativeBuildInputs ++ [zmkCmake]; +} diff --git a/nix/generate-pin.rb b/nix/generate-pin.rb new file mode 100755 index 00000000000..b6bf682dff2 --- /dev/null +++ b/nix/generate-pin.rb @@ -0,0 +1,34 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require 'json' +require 'net/http' +require 'shellwords' + +def get_channel_url(channel) + uri = URI("https://channels.nixos.org/#{channel}") + res = Net::HTTP.get_response(uri) + raise 'Not a redirect' unless res.is_a?(Net::HTTPRedirection) + res['location'] +end + +def fetch_tarball(url) + hash = `nix-prefetch-url --unpack #{Shellwords.escape(url)}` + raise 'Prefetch failed' unless $?.success? + hash.chomp +end + +def generate_pin(channel) + channel_url = get_channel_url(channel) + nixexprs = "#{channel_url}/nixexprs.tar.xz" + hash = fetch_tarball(nixexprs) + { url: nixexprs, sha256: hash } +end + +def main + channel = ENV.fetch('CHANNEL', 'nixpkgs-unstable') + pin = generate_pin(channel) + puts JSON.pretty_generate(pin) +end + +main diff --git a/nix/manifest.json b/nix/manifest.json new file mode 100644 index 00000000000..4dee75b64dc --- /dev/null +++ b/nix/manifest.json @@ -0,0 +1,325 @@ +[ + { + "clone-depth": 1, + "name": "zephyr", + "revision": "7a7c0b521f233b6d936ede5d53b8d64b00abc11e", + "url": "https://github.com/zmkfirmware/zephyr", + "west-commands": "scripts/west-commands.yml", + "sha256": "15vwrmql4jcx559s50p3bn8cp34jz07axa980x2fkw80zwpl37j3" + }, + { + "name": "nanopb", + "path": "modules/lib/nanopb", + "revision": "8c60555d6277a0360c876bd85d491fc4fb0cd74a", + "url": "https://github.com/zmkfirmware/nanopb", + "sha256": "1w77q47cvhg7xmfzbws4w2pn1zr74vh9lyzj0cf1p8gz0n2l3q1g" + }, + { + "name": "zmk-studio-messages", + "path": "modules/msgs/zmk-studio-messages", + "revision": "6cb4c283e76209d59c45fbcb218800cd19e9339d", + "url": "https://github.com/zmkfirmware/zmk-studio-messages", + "sha256": "0yspr4ia6hxa29dy0v86qc8j3nvvnx2xx5qzsmnidpx9s233bz09" + }, + { + "groups": ["optional"], + "name": "chre", + "path": "modules/lib/chre", + "revision": "3b32c76efee705af146124fb4190f71be5a4e36e", + "url": "https://github.com/zephyrproject-rtos/chre", + "sha256": "0gpdyji7380xi61lxdxzmmrdlab5wf37023rzanfwrwa6kvly9zd" + }, + { + "groups": ["optional"], + "name": "lz4", + "path": "modules/lib/lz4", + "revision": "8e303c264fc21c2116dc612658003a22e933124d", + "url": "https://github.com/zephyrproject-rtos/lz4", + "sha256": "1kqs7gxg17gvws01rir8p6gmzp54y12s1898lflhsb418122v8nf" + }, + { + "groups": ["optional"], + "name": "psa-arch-tests", + "path": "modules/tee/tf-m/psa-arch-tests", + "revision": "6a17330e0dfb5f319730f974d5b05f7b7f04757b", + "url": "https://github.com/zephyrproject-rtos/psa-arch-tests", + "sha256": "0dmqfi1364arj5izbyyyc0031qrb3jg89s6rm918bfzb18p8sg18" + }, + { + "groups": ["optional"], + "name": "tf-m-tests", + "path": "modules/tee/tf-m/tf-m-tests", + "revision": "a878426da78fbd1486dfc29d6c6b82be4ee79e72", + "url": "https://github.com/zephyrproject-rtos/tf-m-tests", + "sha256": "13lrvx1vkwynxrf1dk3qcyziddhxsqkzich638khv1hmvb3i8bsf" + }, + { + "groups": ["optional"], + "name": "zscilib", + "path": "modules/lib/zscilib", + "revision": "34c3432e81085bb717e4871d21ca419ae0058ec5", + "url": "https://github.com/zephyrproject-rtos/zscilib", + "sha256": "1i0vp1zcak8c6040pcc48wbpgz3k36ay3w71438v36g86262wf4f" + }, + { + "name": "acpica", + "path": "modules/lib/acpica", + "revision": "0333c2af13179f9b33d495cf7cb9a509f751cbb1", + "url": "https://github.com/zephyrproject-rtos/acpica", + "sha256": "04864is6iisjfasvlwgfsmgnlihdg43cfcc3hpqkzb446x2ix4iw" + }, + { + "name": "canopennode", + "path": "modules/lib/canopennode", + "revision": "dec12fa3f0d790cafa8414a4c2930ea71ab72ffd", + "url": "https://github.com/zephyrproject-rtos/canopennode", + "sha256": "0x6l56q5zdrz78iarfwxiwc05wwq4krg9xhx1z8kjarkwf6q9f85" + }, + { + "groups": ["hal"], + "name": "cmsis", + "path": "modules/hal/cmsis", + "revision": "5a00331455dd74e31e80efa383a489faea0590e3", + "url": "https://github.com/zephyrproject-rtos/cmsis", + "sha256": "00zqyin7bn6jwp7kq51dfs7sinwj5dhx4s981gdm171mmx7rx06n" + }, + { + "name": "cmsis-dsp", + "path": "modules/lib/cmsis-dsp", + "revision": "ff7b5fd1ea5f094665c090c343ec44e74dc0b193", + "url": "https://github.com/zephyrproject-rtos/cmsis-dsp", + "sha256": "0ycznb30fmh35sz3gsg3gzdh9shk8ad90k4849lmx21jzxr6jrai" + }, + { + "name": "cmsis-nn", + "path": "modules/lib/cmsis-nn", + "revision": "0c8669d81381ccf3b1a01d699f3b68b50134a99f", + "url": "https://github.com/zephyrproject-rtos/cmsis-nn", + "sha256": "1bnlyklzlhjrx8b66y6fy9im9wipx4shkq3mla5k7iw7kn3kqs7z" + }, + { + "groups": ["fs"], + "name": "fatfs", + "path": "modules/fs/fatfs", + "revision": "427159bf95ea49b7680facffaa29ad506b42709b", + "url": "https://github.com/zephyrproject-rtos/fatfs", + "sha256": "1pj6ik1bdyn07zsm0006n818mjzpbhhpsca4cw5imw66mhjy2pg6" + }, + { + "groups": ["hal"], + "name": "hal_ambiq", + "path": "modules/hal/ambiq", + "revision": "0a7c99325aa73a1ef777501da91c2c6608661e56", + "url": "https://github.com/zephyrproject-rtos/hal_ambiq", + "sha256": "1s1xv746p7c1ccyp2j1b36hrm9pp7dlpb8v4fclpd6wl3jcdjj74" + }, + { + "groups": ["hal"], + "name": "hal_atmel", + "path": "modules/hal/atmel", + "revision": "5ab43007eda3f380c125f957f03638d2e8d1144d", + "url": "https://github.com/zephyrproject-rtos/hal_atmel", + "sha256": "0csnr0npgfraf4g11dn4f77ywm2qd80y65a12kx68f7bfm8flf9j" + }, + { + "groups": ["hal"], + "name": "hal_ethos_u", + "path": "modules/hal/ethos_u", + "revision": "90ada2ea5681b2a2722a10d2898eac34c2510791", + "url": "https://github.com/zephyrproject-rtos/hal_ethos_u", + "sha256": "12nv46xhi8v6k36l7qgmlsp58vc1d0zw5wqizv30acj5si2bz3y3" + }, + { + "groups": ["hal"], + "name": "hal_gigadevice", + "path": "modules/hal/gigadevice", + "revision": "2994b7dde8b0b0fa9b9c0ccb13474b6a486cddc3", + "url": "https://github.com/zephyrproject-rtos/hal_gigadevice", + "sha256": "16h3l09ikbb4sqql7nlnfdxqvsgcdywrwckf83r4mjs9pgxiq1qa" + }, + { + "groups": ["hal"], + "name": "hal_intel", + "path": "modules/hal/intel", + "revision": "b3b43d4e3da7ba483611bbbea7ef8af92c69df31", + "url": "https://github.com/zephyrproject-rtos/hal_intel", + "sha256": "1m2d0vwa2iip80rfzip8av41lga2p8zm0gzxhd6x11b3lq05vkb2" + }, + { + "groups": ["hal"], + "name": "hal_nordic", + "path": "modules/hal/nordic", + "revision": "d054a315eb888ba70e09e5f6decd4097b0276d1f", + "url": "https://github.com/zephyrproject-rtos/hal_nordic", + "sha256": "0ypny416ylb2w5jg4bg55xvfg0yhqlbrakzvm0w23lnamg49kd6j" + }, + { + "groups": ["hal"], + "name": "hal_nuvoton", + "path": "modules/hal/nuvoton", + "revision": "3e0a4c4d3328b2f72b164219add19d5308b53cb5", + "url": "https://github.com/zephyrproject-rtos/hal_nuvoton", + "sha256": "1xc1cr4c0d0zzmbdrfb7xr8zzq0aifki1l50wcrn9dsi9c1ww12g" + }, + { + "groups": ["hal"], + "name": "hal_quicklogic", + "path": "modules/hal/quicklogic", + "revision": "b3a66fe6d04d87fd1533a5c8de51d0599fcd08d0", + "url": "https://github.com/zephyrproject-rtos/hal_quicklogic", + "sha256": "0hk1x72kibaw3xkspy9822vh28ax3bk11b80qn8l4dwrm0wx34sy" + }, + { + "groups": ["hal"], + "name": "hal_renesas", + "path": "modules/hal/renesas", + "revision": "a6cf2af9140e014fbbc48d2b6deb802231dd369f", + "url": "https://github.com/zephyrproject-rtos/hal_renesas", + "sha256": "000dmd1z72n9blw1pdjskkpz978k3pa6fzg60lhcaj9y24kl9y6z" + }, + { + "groups": ["hal"], + "name": "hal_rpi_pico", + "path": "modules/hal/rpi_pico", + "revision": "fba7162cc7bee06d0149622bbcaac4e41062d368", + "url": "https://github.com/zephyrproject-rtos/hal_rpi_pico", + "sha256": "01q3rf427vvfl0hn3af84hmb3g78dnd8n6saddy7mljha0z0dzda" + }, + { + "groups": ["hal"], + "name": "hal_stm32", + "path": "modules/hal/stm32", + "revision": "89ef0a3383edebf661073073bcdf6e2836fe90ee", + "url": "https://github.com/zephyrproject-rtos/hal_stm32", + "sha256": "0z7q5xg1rn9c3anjvi2kl0hgik3y3r25svwf97w1cjhjx1rhqmpv" + }, + { + "groups": ["hal"], + "name": "hal_telink", + "path": "modules/hal/telink", + "revision": "38573af589173259801ae6c2b34b7d4c9e626746", + "url": "https://github.com/zephyrproject-rtos/hal_telink", + "sha256": "16lzqnzwl2ij0jvbg9x1cgh54kv76dbmpcn4xhd5m4wph3yix78z" + }, + { + "groups": ["hal"], + "name": "hal_wurthelektronik", + "path": "modules/hal/wurthelektronik", + "revision": "24ca9873c3d608fad1fea0431836bc8f144c132e", + "url": "https://github.com/zephyrproject-rtos/hal_wurthelektronik", + "sha256": "0s2b3j40b7qd85np46n4vh0zjmwymnpxd8r42nhss6xznn11g2h8" + }, + { + "groups": ["hal"], + "name": "libmetal", + "path": "modules/hal/libmetal", + "revision": "b91611a6f47dd29fb24c46e5621e797557f80ec6", + "url": "https://github.com/zephyrproject-rtos/libmetal", + "sha256": "0pj0g6zaxiylpdiizf03jil4q2sq1z9px7cfxlv95ddnbv6rjjcz" + }, + { + "name": "liblc3", + "path": "modules/lib/liblc3", + "revision": "448f3de31f49a838988a162ef1e23a89ddf2d2ed", + "url": "https://github.com/zephyrproject-rtos/liblc3", + "sha256": "07r923k1y05sq1sl9740z33cz64pqm2n7x8rr2ws460fij64aixp" + }, + { + "groups": ["fs"], + "name": "littlefs", + "path": "modules/fs/littlefs", + "revision": "ca583fd297ceb48bced3c2548600dc615d67af24", + "url": "https://github.com/zephyrproject-rtos/littlefs", + "sha256": "10xpjrnp5n1j1xbay2qwmg2w314fw9pgzv3kz1mn3pgadhckfgdn" + }, + { + "name": "lvgl", + "path": "modules/lib/gui/lvgl", + "revision": "8a6a2d1d29d17d1e4bdc94c243c146a39d635fdd", + "url": "https://github.com/zephyrproject-rtos/lvgl", + "sha256": "0rsmlh358f4g2yidak916pxhkgckfrnck2a5hcsh9larsdnsnf24" + }, + { + "groups": ["crypto"], + "name": "mbedtls", + "path": "modules/crypto/mbedtls", + "revision": "c38dc78d9a8dcbe43b898cc1171ab33ba3e6fc26", + "url": "https://github.com/zephyrproject-rtos/mbedtls", + "sha256": "0661myy0wjz38nypbyfw51x10mzg57syb5c28irblgjm2w25wbi7" + }, + { + "groups": ["debug"], + "name": "mipi-sys-t", + "path": "modules/debug/mipi-sys-t", + "revision": "a819419603a2dfcb47f7f39092e1bc112e45d1ef", + "url": "https://github.com/zephyrproject-rtos/mipi-sys-t", + "sha256": "1ba0h4p3n0ldk5pjilj7z2i62b09vjq6ma668rqpr3w2hrg6941v" + }, + { + "name": "nrf_hw_models", + "path": "modules/bsim_hw_models/nrf_hw_models", + "revision": "f4595802d32d103718bf50b3d390b7a450895843", + "url": "https://github.com/zephyrproject-rtos/nrf_hw_models", + "sha256": "04p6nfyrv38vq0dhdz0g11zqlrqhw43lydyyr06vlrijm0zja8p5" + }, + { + "name": "open-amp", + "path": "modules/lib/open-amp", + "revision": "42b7c577714b8f22ce82a901e19c1814af4609a8", + "url": "https://github.com/zephyrproject-rtos/open-amp", + "sha256": "0ch1iv4c3v3zx1l2clm4mawyd83kvxl3b5sd6m7r2sn6wpr456w9" + }, + { + "groups": ["debug"], + "name": "percepio", + "path": "modules/debug/percepio", + "revision": "a3728efccc47dd372f40e6313589ca4c5cc7d5e9", + "url": "https://github.com/zephyrproject-rtos/percepio", + "sha256": "0fhz6jwsni7s79p5pwmynxn4yzrr40yd8m51y20d8jf1ka6dh4gw" + }, + { + "name": "picolibc", + "path": "modules/lib/picolibc", + "revision": "d07c38ff051386f8e09a143ea0a6c1d6d66dd1d8", + "url": "https://github.com/zephyrproject-rtos/picolibc", + "sha256": "1pb4piwyib1mmqjyycq8xanvx9aps6mz4w2ijgrn1fjgfh5f7zpq" + }, + { + "groups": ["debug"], + "name": "segger", + "path": "modules/debug/segger", + "revision": "9d0191285956cef43daf411edc2f1a7788346def", + "url": "https://github.com/zephyrproject-rtos/segger", + "sha256": "11wbzyd2n006ygh72ixhqcmgn1yrzk3kq3c0piqvrfgqmv7p8yzn" + }, + { + "groups": ["crypto"], + "name": "tinycrypt", + "path": "modules/crypto/tinycrypt", + "revision": "3e9a49d2672ec01435ffbf0d788db6d95ef28de0", + "url": "https://github.com/zephyrproject-rtos/tinycrypt", + "sha256": "19d2q9y23yzz9i383q3cldjl3k5mryx9762cab23zy3ijdnmj2z6" + }, + { + "groups": ["tee"], + "name": "trusted-firmware-a", + "path": "modules/tee/tf-a/trusted-firmware-a", + "revision": "421dc050278287839f5c70019bd6aec617f2bbdb", + "url": "https://github.com/zephyrproject-rtos/trusted-firmware-a", + "sha256": "029sha3dpagbvfnk5h6ad69pvs5ahwps3cxkzbfrdbq2xm8x3j2y" + }, + { + "name": "uoscore-uedhoc", + "path": "modules/lib/uoscore-uedhoc", + "revision": "5fe2cb613bd7e4590bd1b00c2adf181ac0229379", + "url": "https://github.com/zephyrproject-rtos/uoscore-uedhoc", + "sha256": "0z31lbibkvhw5dfps4l7049gggfczh5qqfjb4s3csnr447m81gdd" + }, + { + "name": "zcbor", + "path": "modules/lib/zcbor", + "revision": "67fd8bb88d3136738661fa8bb5f9989103f4599e", + "url": "https://github.com/zephyrproject-rtos/zcbor", + "sha256": "16138k7xlahf63dfvplm8c2m0kxs1g17gcx1fa31y4gcfbi3b0k7" + } +] diff --git a/nix/pinned-nixpkgs.json b/nix/pinned-nixpkgs.json new file mode 100644 index 00000000000..35b15a4811c --- /dev/null +++ b/nix/pinned-nixpkgs.json @@ -0,0 +1,4 @@ +{ + "url": "https://releases.nixos.org/nixpkgs/nixpkgs-25.05pre716127.566e53c2ad75/nixexprs.tar.xz", + "sha256": "182d5xq2w70znk61b8bn0cyq4jmp7vw239vmxbmsvv13zrjainbv" +} diff --git a/nix/pinned-nixpkgs.nix b/nix/pinned-nixpkgs.nix new file mode 100644 index 00000000000..c62cf91d1f9 --- /dev/null +++ b/nix/pinned-nixpkgs.nix @@ -0,0 +1,17 @@ +{ system ? builtins.currentSystem }: + +let + pin = builtins.fromJSON (builtins.readFile ./pinned-nixpkgs.json); + + nixpkgsSrc = builtins.fetchTarball { + inherit (pin) url sha256; + }; +in + +import nixpkgsSrc { + inherit system; + config = { + allowUnfree = true; + }; + overlays = []; # prevent impure overlays +} diff --git a/nix/update-manifest/default.nix b/nix/update-manifest/default.nix new file mode 100644 index 00000000000..eb858c16dbb --- /dev/null +++ b/nix/update-manifest/default.nix @@ -0,0 +1,11 @@ +{ runCommand, lib, makeWrapper, west, remarshal, nix-prefetch-git, jq, git }: + +runCommand "update-manifest" { + nativeBuildInputs = [ makeWrapper ]; +} '' + mkdir -p $out/bin $out/libexec + cp ${./update-manifest.sh} $out/libexec/update-manifest.sh + makeWrapper $out/libexec/update-manifest.sh $out/bin/update-manifest \ + --set PATH ${lib.makeBinPath [ west remarshal nix-prefetch-git jq git ]} + patchShebangs $out +'' diff --git a/nix/update-manifest/update-manifest.sh b/nix/update-manifest/update-manifest.sh new file mode 100755 index 00000000000..1f717a5a2b6 --- /dev/null +++ b/nix/update-manifest/update-manifest.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash + +set -euo pipefail + +ignored_modules=(hal_espressif sof tflite-micro thrift bsim babblesim babblesim_base \ + babblesim_ext_2G4_libPhyComv1 babblesim_ext_2G4_channel_NtNcable \ + babblesim_ext_2G4_channel_multiatt babblesim_ext_2G4_modem_magic \ + babblesim_ext_2G4_modem_BLE_simple babblesim_ext_2G4_device_burst_interferer \ + babblesim_ext_2G4_device_WLAN_actmod babblesim_ext_2G4_phy_v1 \ + babblesim_ext_2G4_device_playback babblesim_ext_libCryptov1) + +prefetch_project() { + local p=$1 + local name + name="$(jq -r .name <<< "$p")" + + if [[ " ${ignored_modules[*]} " =~ " ${name} " ]]; then + echo "Skipping: $name" >&2 + return + fi + + echo "Prefetching: $name" >&2 + + sha256=$(nix-prefetch-git \ + --quiet \ + --fetch-submodules \ + --url "$(jq -r .url <<< "$p")" \ + --rev "$(jq -r .revision <<< "$p")" \ + | jq -r .sha256) + + jq --arg sha256 "$sha256" '. + $ARGS.named' <<< "$p" +} + + +west manifest --freeze | \ + yaml2json | \ + jq -c '.manifest.projects[]' | \ + while read -r p; do prefetch_project "$p"; done | \ + jq --slurp diff --git a/nix/west-manifest.patch b/nix/west-manifest.patch new file mode 100644 index 00000000000..f6f82b75735 --- /dev/null +++ b/nix/west-manifest.patch @@ -0,0 +1,17 @@ +diff --git a/src/west/manifest.py b/src/west/manifest.py +index e28fade..f3d3784 100644 +--- a/src/west/manifest.py ++++ b/src/west/manifest.py +@@ -1618,8 +1618,10 @@ class Manifest: + ''' + def pdict(p): + if not p.is_cloned(): +- raise RuntimeError(f'cannot freeze; project {p.name} ' +- 'is uncloned') ++ # For the purposes of exporting a frozen manifest for Nix, this ++ # is sufficient, as a package whose revision is not represented ++ # as a SHA will fail the prefetch. ++ return Project.as_dict(p) + try: + sha = p.sha(QUAL_MANIFEST_REV_BRANCH) + except subprocess.CalledProcessError as e: diff --git a/nix/west-shell.nix b/nix/west-shell.nix new file mode 100644 index 00000000000..a9be5f8db62 --- /dev/null +++ b/nix/west-shell.nix @@ -0,0 +1,50 @@ +{ pkgs ? (import ./pinned-nixpkgs.nix {}) }: + +let + # from zephyr/scripts/requirements-base.txt + pythonDependencies = ps: with ps; [ + pyelftools + pyyaml + packaging + progress + anytree + intelhex + west + ]; + + requiredStdenv = + if pkgs.stdenv.hostPlatform.isLinux + then pkgs.multiStdenv + else pkgs.stdenv; +in +with pkgs; +# requires multiStdenv to build 32-bit test binaries +requiredStdenv.mkDerivation { + name = "zmk-shell"; + + buildInputs = [ + # ZMK dependencies + gitFull + wget + autoconf + automake + bzip2 + ccache + dtc # devicetree compiler + dfu-util + gcc + libtool + ninja + cmake + xz + (python3.withPackages(pythonDependencies)) + + # ARM toolchain + gcc-arm-embedded + ]; + + ZEPHYR_TOOLCHAIN_VARIANT = "gnuarmemb"; + GNUARMEMB_TOOLCHAIN_PATH = gcc-arm-embedded; + + shellHook = "if [ ! -d \"zephyr\" ]; then west init -l app/ ; west update; west zephyr-export; fi; source zephyr/zephyr-env.sh"; +} diff --git a/nix/zephyr.nix b/nix/zephyr.nix new file mode 100644 index 00000000000..d7c1bd05624 --- /dev/null +++ b/nix/zephyr.nix @@ -0,0 +1,52 @@ +{ stdenvNoCC, lib, fetchgit, runCommand }: +let + manifestJSON = builtins.fromJSON (builtins.readFile ./manifest.json); + + mkModule = { name, revision, url, sha256, ... }: + stdenvNoCC.mkDerivation (finalAttrs: { + name = "zmk-module-${name}"; + + src = fetchgit { + inherit name url sha256; + rev = revision; + }; + + dontUnpack = true; + dontBuild = true; + + installPhase = '' + mkdir $out + ln -s ${finalAttrs.src} $out/${name} + ''; + + passthru = { + modulePath = "${finalAttrs.finalPackage}/${name}"; + }; + }); + + modules = lib.listToAttrs (lib.forEach manifestJSON ({ name, ... }@args: + lib.nameValuePair name (mkModule args))); +in + + +# Zephyr with no modules, from the frozen manifest. +# For now the modules are passed through as passthru +stdenvNoCC.mkDerivation { + name = "zephyr"; + src = modules.zephyr.src; + + dontBuild = true; + + # This awkward structure is required by + # COMMAND ${PYTHON_EXECUTABLE} ${ZEPHYR_BASE}/../tools/uf2/utils/uf2conv.py + installPhase = '' + mkdir -p $out/zephyr + mv * $out/zephyr + + # uf2 is gone, not sure what replaced it + ''; + + passthru = { + modules = removeAttrs modules ["zephyr"]; + }; +} diff --git a/nix/zmk.nix b/nix/zmk.nix new file mode 100644 index 00000000000..d523f90acaf --- /dev/null +++ b/nix/zmk.nix @@ -0,0 +1,116 @@ +{ stdenvNoCC, lib, buildPackages +, cmake, ninja, dtc, gcc-arm-embedded +, zephyr +, board ? "glove80_lh" +, shield ? null +, keymap ? null +, kconfig ? null +, extraModules ? [] +, snippets ? [] +}: + + +let + # from zephyr/scripts/requirements-base.txt + packageOverrides = pyself: pysuper: { + can = pysuper.can.overrideAttrs (_: { + # horribly flaky test suite full of assertions about timing. + # > assert 0.1 <= took < inc(0.3) + # E assert 0.31151700019836426 < 0.3 + # E + where 0.3 = inc(0.3) + doCheck = false; + doInstallCheck = false; + }); + + canopen = pysuper.can.overrideAttrs (_: { + # Also has timing sensitive tests + # task = self.network.send_periodic(0x123, [1, 2, 3], 0.01) + # time.sleep(0.1) + # > self.assertTrue(9 <= bus.queue.qsize() <= 11) + # E AssertionError: False is not true + doCheck = false; + doInstallCheck = false; + }); + }; + + python = (buildPackages.python3.override { inherit packageOverrides; }).withPackages (ps: with ps; [ + pyelftools + pyyaml + canopen + packaging + progress + anytree + intelhex + + # TODO: this was required but not in shell.nix + pykwalify + ]); + + requiredZephyrModules = [ + "cmsis" "hal_nordic" "tinycrypt" "picolibc" "lvgl" "picolibc" "segger" + ]; + + zephyrModuleDeps = + let modules = lib.attrVals requiredZephyrModules zephyr.modules; + in map (x: x.modulePath) modules; +in + +stdenvNoCC.mkDerivation { + name = "zmk_${board}"; + + sourceRoot = "source/app"; + + src = builtins.path { + name = "source"; + path = ./..; + filter = path: type: + let relPath = lib.removePrefix (toString ./.. + "/") (toString path); + in (lib.cleanSourceFilter path type) && ! ( + # Meta files + relPath == "nix" || lib.hasSuffix ".nix" path || + # Transient state + relPath == "build" || relPath == ".west" || + # Fetched by west + relPath == "modules" || relPath == "tools" || relPath == "zephyr" || + # Not part of ZMK + relPath == "lambda" || relPath == ".github" + ); + }; + + preConfigure = '' + cmakeFlagsArray+=("-DUSER_CACHE_DIR=$TEMPDIR/.cache") + ''; + + cmakeFlags = [ + # "-DZephyrBuildConfiguration_ROOT=${zephyr}/zephyr" + # TODO: is this required? if not, why not? + "-DZEPHYR_BASE=${zephyr}/zephyr" + "-DBOARD_ROOT=." + "-DBOARD=${board}" + "-DZEPHYR_TOOLCHAIN_VARIANT=gnuarmemb" + "-DGNUARMEMB_TOOLCHAIN_PATH=${gcc-arm-embedded}" + # TODO: maybe just use a cross environment for this gcc + "-DCMAKE_C_COMPILER=${gcc-arm-embedded}/bin/arm-none-eabi-gcc" + "-DCMAKE_CXX_COMPILER=${gcc-arm-embedded}/bin/arm-none-eabi-g++" + "-DCMAKE_AR=${gcc-arm-embedded}/bin/arm-none-eabi-ar" + "-DCMAKE_RANLIB=${gcc-arm-embedded}/bin/arm-none-eabi-ranlib" + "-DZEPHYR_MODULES=${lib.concatStringsSep ";" zephyrModuleDeps}" + ] ++ + (lib.optional (shield != null) "-DSHIELD=${shield}") ++ + (lib.optional (keymap != null) "-DKEYMAP_FILE=${keymap}") ++ + (lib.optional (kconfig != null) "-DEXTRA_CONF_FILE=${kconfig}") ++ + (lib.optional (extraModules != []) "-DZMK_EXTRA_MODULES=${lib.concatStringsSep ";" extraModules}") ++ + (lib.optional (snippets != []) "-DSNIPPET=${lib.concatStringsSep ";" snippets}"); + + nativeBuildInputs = [ cmake ninja python dtc gcc-arm-embedded ]; + buildInputs = [ zephyr ]; + + installPhase = '' + mkdir $out + cp zephyr/zmk.{uf2,hex,bin,elf} $out + cp zephyr/.config $out/zmk.kconfig + cp zephyr/zephyr.dts $out/zmk.dts + ''; + + passthru = { inherit zephyrModuleDeps; }; +} From 51b9f5a6385fd72e02ba3494092b58e95f4aa224 Mon Sep 17 00:00:00 2001 From: Chris Andreae Date: Sun, 18 Sep 2022 17:07:01 +0900 Subject: [PATCH 84/96] Github build action: build Glove80 combined firmware using Nix --- .github/workflows/build.yml | 13 +- .github/workflows/nix-build.yml | 62 +++++++++ app/west.yml | 5 + nix/manifest.json | 234 ++++++++++++++++---------------- nix/zmk.nix | 9 +- 5 files changed, 201 insertions(+), 122 deletions(-) create mode 100644 .github/workflows/nix-build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 32e084cbbed..023766d99b1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -20,7 +20,7 @@ permissions: {} jobs: build: - if: ${{ always() }} + if: ${{ false }} runs-on: ubuntu-latest container: image: docker.io/zmkfirmware/zmk-build-arm:4.1 @@ -139,7 +139,7 @@ jobs: throw new Error('Failed to build one or more configurations'); } compile-matrix: - if: ${{ !cancelled() }} + if: ${{ false && !cancelled() }} runs-on: ubuntu-latest needs: [core-coverage, board-changes, nightly] outputs: @@ -180,7 +180,7 @@ jobs: shieldArgs: JSON.stringify(shieldArgs), })); core-coverage: - if: ${{ needs.get-changed-files.outputs.core-changes == 'true' }} + if: ${{ false && needs.get-changed-files.outputs.core-changes == 'true' }} runs-on: ubuntu-latest needs: get-changed-files outputs: @@ -211,7 +211,7 @@ jobs: return [...include, ...coreCoverage.include]; board-changes: - if: ${{ needs.get-changed-files.outputs.board-changes == 'true' }} + if: ${{ false && needs.get-changed-files.outputs.board-changes == 'true' }} runs-on: ubuntu-latest needs: [get-grouped-hardware, get-changed-files] outputs: @@ -295,7 +295,7 @@ jobs: }); }))).flat(); nightly: - if: ${{ github.event_name == 'schedule' && github.repository_owner == 'zmkfirmware' }} + if: ${{ false && github.event_name == 'schedule' && github.repository_owner == 'zmkfirmware' }} runs-on: ubuntu-latest needs: get-grouped-hardware outputs: @@ -340,6 +340,7 @@ jobs: return [...includeOnboard, ...includeInterconnect]; get-grouped-hardware: + if: ${{ false }} runs-on: ubuntu-latest outputs: organized-metadata: ${{ steps.organize-metadata.outputs.result }} @@ -419,7 +420,7 @@ jobs: return JSON.stringify(grouped).replace(/\\/g,"\\\\").replace(/`/g,"\\`"); result-encoding: string get-changed-files: - if: ${{ github.event_name != 'schedule' }} + if: ${{ false && github.event_name != 'schedule' }} runs-on: ubuntu-latest outputs: changed-files: ${{ steps.changed-files.outputs.all_changed_files }} diff --git a/.github/workflows/nix-build.yml b/.github/workflows/nix-build.yml new file mode 100644 index 00000000000..6f6b0bbf866 --- /dev/null +++ b/.github/workflows/nix-build.yml @@ -0,0 +1,62 @@ +name: Build + +on: + push: + paths: + - ".github/workflows/nix-build.yml" + - "default.nix" + - "app/**" + - "nix/**" + branches: + - "**" + tags: + - "**" + pull_request: + paths: + - ".github/workflows/nix-build.yml" + - "default.nix" + - "app/**" + - "nix/**" + +jobs: + build: + name: Build Glove80 Firmware + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: cachix/install-nix-action@v27 + with: + nix_path: nixpkgs=channel:nixos-22.05 + - uses: cachix/cachix-action@v15 + with: + name: moergo-glove80-zmk-dev + authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" + skipPush: "${{ github.repository != 'moergo-sc/zmk' }}" + - name: Build Glove80 combined firmware + run: nix-build -A glove80_combined -o combined + - name: Copy result out of nix store + run: cp combined/glove80.uf2 glove80.uf2 + - name: Upload result + uses: actions/upload-artifact@v4 + with: + name: glove80.uf2 + path: glove80.uf2 + release: + name: Create Release for Tag + if: >- + github.repository == 'moergo-sc/zmk' + && github.event_name == 'push' + && contains(github.ref, 'refs/tags/v') + needs: build + runs-on: ubuntu-latest + steps: + - name: Download compiled firmware artifact + uses: actions/download-artifact@v4 + with: + name: glove80.uf2 + - name: Create Release for Tag + uses: ncipollo/release-action@v1 + with: + artifacts: "glove80.uf2" + artifactErrorsFailBuild: true + generateReleaseNotes: true diff --git a/app/west.yml b/app/west.yml index 0d9d1e024c8..3d7f562a880 100644 --- a/app/west.yml +++ b/app/west.yml @@ -4,6 +4,8 @@ manifest: url-base: https://github.com/zephyrproject-rtos - name: zmkfirmware url-base: https://github.com/zmkfirmware + - name: petejohanson + url-base: https://github.com/petejohanson projects: - name: zephyr remote: zmkfirmware @@ -42,6 +44,9 @@ manifest: revision: 6cb4c283e76209d59c45fbcb218800cd19e9339d path: modules/msgs/zmk-studio-messages remote: zmkfirmware + - name: cirque-input-module + remote: petejohanson + revision: 0de55f36bc720b5be3d8880dc856d4d78baf5214 group-filter: [+optional] self: west-commands: scripts/west-commands.yml diff --git a/nix/manifest.json b/nix/manifest.json index 4dee75b64dc..ff34a73ba71 100644 --- a/nix/manifest.json +++ b/nix/manifest.json @@ -1,325 +1,331 @@ [ { - "clone-depth": 1, "name": "zephyr", - "revision": "7a7c0b521f233b6d936ede5d53b8d64b00abc11e", "url": "https://github.com/zmkfirmware/zephyr", + "revision": "f742ae36021571445b199a6b3c2cb3a6e3193833", + "clone-depth": 1, "west-commands": "scripts/west-commands.yml", - "sha256": "15vwrmql4jcx559s50p3bn8cp34jz07axa980x2fkw80zwpl37j3" + "sha256": "0865rc77lvyvgipgpfcy7yfc7yv0y78ag2mlszli0rgxxp8fl54v" }, { "name": "nanopb", - "path": "modules/lib/nanopb", - "revision": "8c60555d6277a0360c876bd85d491fc4fb0cd74a", "url": "https://github.com/zmkfirmware/nanopb", + "revision": "8c60555d6277a0360c876bd85d491fc4fb0cd74a", + "path": "modules/lib/nanopb", "sha256": "1w77q47cvhg7xmfzbws4w2pn1zr74vh9lyzj0cf1p8gz0n2l3q1g" }, { "name": "zmk-studio-messages", - "path": "modules/msgs/zmk-studio-messages", - "revision": "6cb4c283e76209d59c45fbcb218800cd19e9339d", "url": "https://github.com/zmkfirmware/zmk-studio-messages", + "revision": "6cb4c283e76209d59c45fbcb218800cd19e9339d", + "path": "modules/msgs/zmk-studio-messages", "sha256": "0yspr4ia6hxa29dy0v86qc8j3nvvnx2xx5qzsmnidpx9s233bz09" }, { - "groups": ["optional"], + "name": "cirque-input-module", + "url": "https://github.com/petejohanson/cirque-input-module", + "revision": "0de55f36bc720b5be3d8880dc856d4d78baf5214", + "sha256": "1a2sngqmlk266x8lsjvr3wm3kv3fxn9885sx8sk3zskbvz3g5998" + }, + { "name": "chre", - "path": "modules/lib/chre", - "revision": "3b32c76efee705af146124fb4190f71be5a4e36e", "url": "https://github.com/zephyrproject-rtos/chre", + "revision": "3b32c76efee705af146124fb4190f71be5a4e36e", + "path": "modules/lib/chre", + "groups": ["optional"], "sha256": "0gpdyji7380xi61lxdxzmmrdlab5wf37023rzanfwrwa6kvly9zd" }, { - "groups": ["optional"], "name": "lz4", - "path": "modules/lib/lz4", - "revision": "8e303c264fc21c2116dc612658003a22e933124d", "url": "https://github.com/zephyrproject-rtos/lz4", + "revision": "8e303c264fc21c2116dc612658003a22e933124d", + "path": "modules/lib/lz4", + "groups": ["optional"], "sha256": "1kqs7gxg17gvws01rir8p6gmzp54y12s1898lflhsb418122v8nf" }, { - "groups": ["optional"], "name": "psa-arch-tests", - "path": "modules/tee/tf-m/psa-arch-tests", - "revision": "6a17330e0dfb5f319730f974d5b05f7b7f04757b", "url": "https://github.com/zephyrproject-rtos/psa-arch-tests", + "revision": "6a17330e0dfb5f319730f974d5b05f7b7f04757b", + "path": "modules/tee/tf-m/psa-arch-tests", + "groups": ["optional"], "sha256": "0dmqfi1364arj5izbyyyc0031qrb3jg89s6rm918bfzb18p8sg18" }, { - "groups": ["optional"], "name": "tf-m-tests", - "path": "modules/tee/tf-m/tf-m-tests", - "revision": "a878426da78fbd1486dfc29d6c6b82be4ee79e72", "url": "https://github.com/zephyrproject-rtos/tf-m-tests", + "revision": "a878426da78fbd1486dfc29d6c6b82be4ee79e72", + "path": "modules/tee/tf-m/tf-m-tests", + "groups": ["optional"], "sha256": "13lrvx1vkwynxrf1dk3qcyziddhxsqkzich638khv1hmvb3i8bsf" }, { - "groups": ["optional"], "name": "zscilib", - "path": "modules/lib/zscilib", - "revision": "34c3432e81085bb717e4871d21ca419ae0058ec5", "url": "https://github.com/zephyrproject-rtos/zscilib", + "revision": "34c3432e81085bb717e4871d21ca419ae0058ec5", + "path": "modules/lib/zscilib", + "groups": ["optional"], "sha256": "1i0vp1zcak8c6040pcc48wbpgz3k36ay3w71438v36g86262wf4f" }, { "name": "acpica", - "path": "modules/lib/acpica", - "revision": "0333c2af13179f9b33d495cf7cb9a509f751cbb1", "url": "https://github.com/zephyrproject-rtos/acpica", + "revision": "0333c2af13179f9b33d495cf7cb9a509f751cbb1", + "path": "modules/lib/acpica", "sha256": "04864is6iisjfasvlwgfsmgnlihdg43cfcc3hpqkzb446x2ix4iw" }, { "name": "canopennode", - "path": "modules/lib/canopennode", - "revision": "dec12fa3f0d790cafa8414a4c2930ea71ab72ffd", "url": "https://github.com/zephyrproject-rtos/canopennode", + "revision": "dec12fa3f0d790cafa8414a4c2930ea71ab72ffd", + "path": "modules/lib/canopennode", "sha256": "0x6l56q5zdrz78iarfwxiwc05wwq4krg9xhx1z8kjarkwf6q9f85" }, { - "groups": ["hal"], "name": "cmsis", - "path": "modules/hal/cmsis", - "revision": "5a00331455dd74e31e80efa383a489faea0590e3", "url": "https://github.com/zephyrproject-rtos/cmsis", + "revision": "5a00331455dd74e31e80efa383a489faea0590e3", + "path": "modules/hal/cmsis", + "groups": ["hal"], "sha256": "00zqyin7bn6jwp7kq51dfs7sinwj5dhx4s981gdm171mmx7rx06n" }, { "name": "cmsis-dsp", - "path": "modules/lib/cmsis-dsp", - "revision": "ff7b5fd1ea5f094665c090c343ec44e74dc0b193", "url": "https://github.com/zephyrproject-rtos/cmsis-dsp", + "revision": "ff7b5fd1ea5f094665c090c343ec44e74dc0b193", + "path": "modules/lib/cmsis-dsp", "sha256": "0ycznb30fmh35sz3gsg3gzdh9shk8ad90k4849lmx21jzxr6jrai" }, { "name": "cmsis-nn", - "path": "modules/lib/cmsis-nn", - "revision": "0c8669d81381ccf3b1a01d699f3b68b50134a99f", "url": "https://github.com/zephyrproject-rtos/cmsis-nn", + "revision": "0c8669d81381ccf3b1a01d699f3b68b50134a99f", + "path": "modules/lib/cmsis-nn", "sha256": "1bnlyklzlhjrx8b66y6fy9im9wipx4shkq3mla5k7iw7kn3kqs7z" }, { - "groups": ["fs"], "name": "fatfs", - "path": "modules/fs/fatfs", - "revision": "427159bf95ea49b7680facffaa29ad506b42709b", "url": "https://github.com/zephyrproject-rtos/fatfs", + "revision": "427159bf95ea49b7680facffaa29ad506b42709b", + "path": "modules/fs/fatfs", + "groups": ["fs"], "sha256": "1pj6ik1bdyn07zsm0006n818mjzpbhhpsca4cw5imw66mhjy2pg6" }, { - "groups": ["hal"], "name": "hal_ambiq", - "path": "modules/hal/ambiq", - "revision": "0a7c99325aa73a1ef777501da91c2c6608661e56", "url": "https://github.com/zephyrproject-rtos/hal_ambiq", + "revision": "0a7c99325aa73a1ef777501da91c2c6608661e56", + "path": "modules/hal/ambiq", + "groups": ["hal"], "sha256": "1s1xv746p7c1ccyp2j1b36hrm9pp7dlpb8v4fclpd6wl3jcdjj74" }, { - "groups": ["hal"], "name": "hal_atmel", - "path": "modules/hal/atmel", - "revision": "5ab43007eda3f380c125f957f03638d2e8d1144d", "url": "https://github.com/zephyrproject-rtos/hal_atmel", + "revision": "5ab43007eda3f380c125f957f03638d2e8d1144d", + "path": "modules/hal/atmel", + "groups": ["hal"], "sha256": "0csnr0npgfraf4g11dn4f77ywm2qd80y65a12kx68f7bfm8flf9j" }, { - "groups": ["hal"], "name": "hal_ethos_u", - "path": "modules/hal/ethos_u", - "revision": "90ada2ea5681b2a2722a10d2898eac34c2510791", "url": "https://github.com/zephyrproject-rtos/hal_ethos_u", + "revision": "90ada2ea5681b2a2722a10d2898eac34c2510791", + "path": "modules/hal/ethos_u", + "groups": ["hal"], "sha256": "12nv46xhi8v6k36l7qgmlsp58vc1d0zw5wqizv30acj5si2bz3y3" }, { - "groups": ["hal"], "name": "hal_gigadevice", - "path": "modules/hal/gigadevice", - "revision": "2994b7dde8b0b0fa9b9c0ccb13474b6a486cddc3", "url": "https://github.com/zephyrproject-rtos/hal_gigadevice", + "revision": "2994b7dde8b0b0fa9b9c0ccb13474b6a486cddc3", + "path": "modules/hal/gigadevice", + "groups": ["hal"], "sha256": "16h3l09ikbb4sqql7nlnfdxqvsgcdywrwckf83r4mjs9pgxiq1qa" }, { - "groups": ["hal"], "name": "hal_intel", - "path": "modules/hal/intel", - "revision": "b3b43d4e3da7ba483611bbbea7ef8af92c69df31", "url": "https://github.com/zephyrproject-rtos/hal_intel", + "revision": "b3b43d4e3da7ba483611bbbea7ef8af92c69df31", + "path": "modules/hal/intel", + "groups": ["hal"], "sha256": "1m2d0vwa2iip80rfzip8av41lga2p8zm0gzxhd6x11b3lq05vkb2" }, { - "groups": ["hal"], "name": "hal_nordic", - "path": "modules/hal/nordic", - "revision": "d054a315eb888ba70e09e5f6decd4097b0276d1f", "url": "https://github.com/zephyrproject-rtos/hal_nordic", - "sha256": "0ypny416ylb2w5jg4bg55xvfg0yhqlbrakzvm0w23lnamg49kd6j" + "revision": "884c4d61746bc35fbd379c169fc87ddb56c6461d", + "path": "modules/hal/nordic", + "groups": ["hal"], + "sha256": "1m17n858c03krmc45v13r9c4b73lmx8dag1sch4vy4szs07c5a1g" }, { - "groups": ["hal"], "name": "hal_nuvoton", - "path": "modules/hal/nuvoton", - "revision": "3e0a4c4d3328b2f72b164219add19d5308b53cb5", "url": "https://github.com/zephyrproject-rtos/hal_nuvoton", + "revision": "3e0a4c4d3328b2f72b164219add19d5308b53cb5", + "path": "modules/hal/nuvoton", + "groups": ["hal"], "sha256": "1xc1cr4c0d0zzmbdrfb7xr8zzq0aifki1l50wcrn9dsi9c1ww12g" }, { - "groups": ["hal"], "name": "hal_quicklogic", - "path": "modules/hal/quicklogic", - "revision": "b3a66fe6d04d87fd1533a5c8de51d0599fcd08d0", "url": "https://github.com/zephyrproject-rtos/hal_quicklogic", + "revision": "b3a66fe6d04d87fd1533a5c8de51d0599fcd08d0", + "path": "modules/hal/quicklogic", + "groups": ["hal"], "sha256": "0hk1x72kibaw3xkspy9822vh28ax3bk11b80qn8l4dwrm0wx34sy" }, { - "groups": ["hal"], "name": "hal_renesas", - "path": "modules/hal/renesas", - "revision": "a6cf2af9140e014fbbc48d2b6deb802231dd369f", "url": "https://github.com/zephyrproject-rtos/hal_renesas", + "revision": "a6cf2af9140e014fbbc48d2b6deb802231dd369f", + "path": "modules/hal/renesas", + "groups": ["hal"], "sha256": "000dmd1z72n9blw1pdjskkpz978k3pa6fzg60lhcaj9y24kl9y6z" }, { - "groups": ["hal"], "name": "hal_rpi_pico", - "path": "modules/hal/rpi_pico", - "revision": "fba7162cc7bee06d0149622bbcaac4e41062d368", "url": "https://github.com/zephyrproject-rtos/hal_rpi_pico", + "revision": "fba7162cc7bee06d0149622bbcaac4e41062d368", + "path": "modules/hal/rpi_pico", + "groups": ["hal"], "sha256": "01q3rf427vvfl0hn3af84hmb3g78dnd8n6saddy7mljha0z0dzda" }, { - "groups": ["hal"], "name": "hal_stm32", - "path": "modules/hal/stm32", - "revision": "89ef0a3383edebf661073073bcdf6e2836fe90ee", "url": "https://github.com/zephyrproject-rtos/hal_stm32", + "revision": "89ef0a3383edebf661073073bcdf6e2836fe90ee", + "path": "modules/hal/stm32", + "groups": ["hal"], "sha256": "0z7q5xg1rn9c3anjvi2kl0hgik3y3r25svwf97w1cjhjx1rhqmpv" }, { - "groups": ["hal"], "name": "hal_telink", - "path": "modules/hal/telink", - "revision": "38573af589173259801ae6c2b34b7d4c9e626746", "url": "https://github.com/zephyrproject-rtos/hal_telink", + "revision": "38573af589173259801ae6c2b34b7d4c9e626746", + "path": "modules/hal/telink", + "groups": ["hal"], "sha256": "16lzqnzwl2ij0jvbg9x1cgh54kv76dbmpcn4xhd5m4wph3yix78z" }, { - "groups": ["hal"], "name": "hal_wurthelektronik", - "path": "modules/hal/wurthelektronik", - "revision": "24ca9873c3d608fad1fea0431836bc8f144c132e", "url": "https://github.com/zephyrproject-rtos/hal_wurthelektronik", + "revision": "24ca9873c3d608fad1fea0431836bc8f144c132e", + "path": "modules/hal/wurthelektronik", + "groups": ["hal"], "sha256": "0s2b3j40b7qd85np46n4vh0zjmwymnpxd8r42nhss6xznn11g2h8" }, { - "groups": ["hal"], "name": "libmetal", - "path": "modules/hal/libmetal", - "revision": "b91611a6f47dd29fb24c46e5621e797557f80ec6", "url": "https://github.com/zephyrproject-rtos/libmetal", + "revision": "b91611a6f47dd29fb24c46e5621e797557f80ec6", + "path": "modules/hal/libmetal", + "groups": ["hal"], "sha256": "0pj0g6zaxiylpdiizf03jil4q2sq1z9px7cfxlv95ddnbv6rjjcz" }, { "name": "liblc3", - "path": "modules/lib/liblc3", - "revision": "448f3de31f49a838988a162ef1e23a89ddf2d2ed", "url": "https://github.com/zephyrproject-rtos/liblc3", + "revision": "448f3de31f49a838988a162ef1e23a89ddf2d2ed", + "path": "modules/lib/liblc3", "sha256": "07r923k1y05sq1sl9740z33cz64pqm2n7x8rr2ws460fij64aixp" }, { - "groups": ["fs"], "name": "littlefs", - "path": "modules/fs/littlefs", - "revision": "ca583fd297ceb48bced3c2548600dc615d67af24", "url": "https://github.com/zephyrproject-rtos/littlefs", + "revision": "ca583fd297ceb48bced3c2548600dc615d67af24", + "path": "modules/fs/littlefs", + "groups": ["fs"], "sha256": "10xpjrnp5n1j1xbay2qwmg2w314fw9pgzv3kz1mn3pgadhckfgdn" }, { "name": "lvgl", - "path": "modules/lib/gui/lvgl", - "revision": "8a6a2d1d29d17d1e4bdc94c243c146a39d635fdd", "url": "https://github.com/zephyrproject-rtos/lvgl", + "revision": "8a6a2d1d29d17d1e4bdc94c243c146a39d635fdd", + "path": "modules/lib/gui/lvgl", "sha256": "0rsmlh358f4g2yidak916pxhkgckfrnck2a5hcsh9larsdnsnf24" }, { - "groups": ["crypto"], "name": "mbedtls", - "path": "modules/crypto/mbedtls", - "revision": "c38dc78d9a8dcbe43b898cc1171ab33ba3e6fc26", "url": "https://github.com/zephyrproject-rtos/mbedtls", + "revision": "c38dc78d9a8dcbe43b898cc1171ab33ba3e6fc26", + "path": "modules/crypto/mbedtls", + "groups": ["crypto"], "sha256": "0661myy0wjz38nypbyfw51x10mzg57syb5c28irblgjm2w25wbi7" }, { - "groups": ["debug"], "name": "mipi-sys-t", - "path": "modules/debug/mipi-sys-t", - "revision": "a819419603a2dfcb47f7f39092e1bc112e45d1ef", "url": "https://github.com/zephyrproject-rtos/mipi-sys-t", + "revision": "a819419603a2dfcb47f7f39092e1bc112e45d1ef", + "path": "modules/debug/mipi-sys-t", + "groups": ["debug"], "sha256": "1ba0h4p3n0ldk5pjilj7z2i62b09vjq6ma668rqpr3w2hrg6941v" }, { "name": "nrf_hw_models", - "path": "modules/bsim_hw_models/nrf_hw_models", - "revision": "f4595802d32d103718bf50b3d390b7a450895843", "url": "https://github.com/zephyrproject-rtos/nrf_hw_models", + "revision": "f4595802d32d103718bf50b3d390b7a450895843", + "path": "modules/bsim_hw_models/nrf_hw_models", "sha256": "04p6nfyrv38vq0dhdz0g11zqlrqhw43lydyyr06vlrijm0zja8p5" }, { "name": "open-amp", - "path": "modules/lib/open-amp", - "revision": "42b7c577714b8f22ce82a901e19c1814af4609a8", "url": "https://github.com/zephyrproject-rtos/open-amp", + "revision": "42b7c577714b8f22ce82a901e19c1814af4609a8", + "path": "modules/lib/open-amp", "sha256": "0ch1iv4c3v3zx1l2clm4mawyd83kvxl3b5sd6m7r2sn6wpr456w9" }, { - "groups": ["debug"], "name": "percepio", - "path": "modules/debug/percepio", - "revision": "a3728efccc47dd372f40e6313589ca4c5cc7d5e9", "url": "https://github.com/zephyrproject-rtos/percepio", + "revision": "a3728efccc47dd372f40e6313589ca4c5cc7d5e9", + "path": "modules/debug/percepio", + "groups": ["debug"], "sha256": "0fhz6jwsni7s79p5pwmynxn4yzrr40yd8m51y20d8jf1ka6dh4gw" }, { "name": "picolibc", - "path": "modules/lib/picolibc", - "revision": "d07c38ff051386f8e09a143ea0a6c1d6d66dd1d8", "url": "https://github.com/zephyrproject-rtos/picolibc", + "revision": "d07c38ff051386f8e09a143ea0a6c1d6d66dd1d8", + "path": "modules/lib/picolibc", "sha256": "1pb4piwyib1mmqjyycq8xanvx9aps6mz4w2ijgrn1fjgfh5f7zpq" }, { - "groups": ["debug"], "name": "segger", - "path": "modules/debug/segger", - "revision": "9d0191285956cef43daf411edc2f1a7788346def", "url": "https://github.com/zephyrproject-rtos/segger", + "revision": "9d0191285956cef43daf411edc2f1a7788346def", + "path": "modules/debug/segger", + "groups": ["debug"], "sha256": "11wbzyd2n006ygh72ixhqcmgn1yrzk3kq3c0piqvrfgqmv7p8yzn" }, { - "groups": ["crypto"], "name": "tinycrypt", - "path": "modules/crypto/tinycrypt", - "revision": "3e9a49d2672ec01435ffbf0d788db6d95ef28de0", "url": "https://github.com/zephyrproject-rtos/tinycrypt", + "revision": "3e9a49d2672ec01435ffbf0d788db6d95ef28de0", + "path": "modules/crypto/tinycrypt", + "groups": ["crypto"], "sha256": "19d2q9y23yzz9i383q3cldjl3k5mryx9762cab23zy3ijdnmj2z6" }, { - "groups": ["tee"], "name": "trusted-firmware-a", - "path": "modules/tee/tf-a/trusted-firmware-a", - "revision": "421dc050278287839f5c70019bd6aec617f2bbdb", "url": "https://github.com/zephyrproject-rtos/trusted-firmware-a", + "revision": "421dc050278287839f5c70019bd6aec617f2bbdb", + "path": "modules/tee/tf-a/trusted-firmware-a", + "groups": ["tee"], "sha256": "029sha3dpagbvfnk5h6ad69pvs5ahwps3cxkzbfrdbq2xm8x3j2y" }, { "name": "uoscore-uedhoc", - "path": "modules/lib/uoscore-uedhoc", - "revision": "5fe2cb613bd7e4590bd1b00c2adf181ac0229379", "url": "https://github.com/zephyrproject-rtos/uoscore-uedhoc", + "revision": "5fe2cb613bd7e4590bd1b00c2adf181ac0229379", + "path": "modules/lib/uoscore-uedhoc", "sha256": "0z31lbibkvhw5dfps4l7049gggfczh5qqfjb4s3csnr447m81gdd" }, { "name": "zcbor", - "path": "modules/lib/zcbor", - "revision": "67fd8bb88d3136738661fa8bb5f9989103f4599e", "url": "https://github.com/zephyrproject-rtos/zcbor", + "revision": "67fd8bb88d3136738661fa8bb5f9989103f4599e", + "path": "modules/lib/zcbor", "sha256": "16138k7xlahf63dfvplm8c2m0kxs1g17gcx1fa31y4gcfbi3b0k7" } ] diff --git a/nix/zmk.nix b/nix/zmk.nix index d523f90acaf..f43c46662a9 100644 --- a/nix/zmk.nix +++ b/nix/zmk.nix @@ -47,12 +47,17 @@ let ]); requiredZephyrModules = [ - "cmsis" "hal_nordic" "tinycrypt" "picolibc" "lvgl" "picolibc" "segger" + "cmsis" "hal_nordic" "tinycrypt" "lvgl" "picolibc" "segger" "cirque-input-module" ]; + # Some Zephyr modules seemingly need a symlink indirection (modulePath), + # others don't (src). + # This is not the best way to fix it, but it works around the problem. + directZephyrModules = [ "cirque-input-module" ]; + zephyrModuleDeps = let modules = lib.attrVals requiredZephyrModules zephyr.modules; - in map (x: x.modulePath) modules; + in map (x: if builtins.elem x.src.name directZephyrModules then x.src else x.modulePath) modules; in stdenvNoCC.mkDerivation { From 9dc99897021791f5005d5723e6f49121e971ee4a Mon Sep 17 00:00:00 2001 From: Chris Andreae Date: Mon, 11 Oct 2021 16:49:33 +0900 Subject: [PATCH 85/96] Docker container and lambda function for performing firmware builds Provides an entry point that builds and returns a combined LH + RH keyboard firmware when provided a keymap via a POST body. Wraps compilation with ccache, and includes a pre-warmed cache of the build in /tmp/ccache. To maximize chance of a direct cache hit, changes the lambda driver to always build in /tmp/build. some back of the envelope measurements (2012 xeon e3-1230v2, nixos) clean build, no cache -> 21.308 clean build, cache -> 7.145 modified keymap, clean build, cache -> 12.127 --- .github/workflows/build-container.yml | 110 +++++++++++ .github/workflows/cleanup-container.yml | 43 ++++ .github/workflows/nix-build.yml | 2 +- lambda/.ruby-version | 1 + lambda/Gemfile | 3 + lambda/Gemfile.lock | 13 ++ lambda/api_version.txt | 1 + lambda/app.rb | 69 +++++++ lambda/compiler.rb | 161 +++++++++++++++ lambda/default.nix | 26 +++ lambda/gemset.nix | 12 ++ lambda/shell.nix | 9 + nix/ccache.nix | 43 ++++ nix/semver.nix | 16 ++ nix/semver.patch.gz | Bin 0 -> 734 bytes release.nix | 250 ++++++++++++++++++++++++ 16 files changed, 758 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/build-container.yml create mode 100644 .github/workflows/cleanup-container.yml create mode 100644 lambda/.ruby-version create mode 100644 lambda/Gemfile create mode 100644 lambda/Gemfile.lock create mode 100644 lambda/api_version.txt create mode 100644 lambda/app.rb create mode 100644 lambda/compiler.rb create mode 100644 lambda/default.nix create mode 100644 lambda/gemset.nix create mode 100644 lambda/shell.nix create mode 100644 nix/ccache.nix create mode 100644 nix/semver.nix create mode 100644 nix/semver.patch.gz create mode 100644 release.nix diff --git a/.github/workflows/build-container.yml b/.github/workflows/build-container.yml new file mode 100644 index 00000000000..faf379d36c6 --- /dev/null +++ b/.github/workflows/build-container.yml @@ -0,0 +1,110 @@ +name: Build Compiler Service Container + +on: + push: + tags: + - "*" + pull_request_target: + branches: + - main + +jobs: + build: + # This job must never be run on a PR from outside the same repository + if: github.repository == 'moergo-sc/zmk' && (github.event.pull_request == null || github.event.pull_request.head.repo.full_name == github.repository) + runs-on: ubuntu-latest + # These permissions are needed to interact with GitHub's OIDC Token endpoint. + permissions: + id-token: write + contents: read + env: + ECR_REPOSITORY: zmk-builder-lambda + VERSIONS_BUCKET: glove80firmwarepipelines-compilerversionsbucket44-zubaquiyjdam + UPDATE_COMPILER_VERSIONS_FUNCTION: arn:aws:lambda:us-east-1:431227615537:function:Glove80FirmwarePipelineSt-UpdateCompilerVersions2A-CNxPOHb4VSuV + REVISION_TAG: ${{ github.event.pull_request && github.event.pull_request.head.sha || github.sha }} + PR_NUMBER: ${{ github.event.number }} + steps: + - uses: actions/checkout@v4 + with: + repository: moergo-sc/zmk + ref: ${{ github.event.pull_request && github.event.pull_request.head.sha || github.sha }} + fetch-depth: 0 + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: arn:aws:iam::431227615537:role/GithubCompilerLambdaBuilder + aws-region: us-east-1 + - name: Extract container name from branch name + shell: bash + run: | + if [ "$GITHUB_HEAD_REF" ]; then + branch_ref="$GITHUB_HEAD_REF" + type="pr" + tag="pr${PR_NUMBER}.${GITHUB_HEAD_REF}" + elif [[ "$GITHUB_REF" == refs/tags/* ]]; then + branch_ref="$GITHUB_REF" + type="tag" + tag="${GITHUB_REF#refs/tags/}" + else + echo "Not a pull request or release tag" >&2 + exit 1 + fi + # Replace / with . in container tag names + tag="${tag//\//.}" + echo "VERSION_BRANCH=${branch_ref}" >> $GITHUB_ENV + echo "VERSION_TYPE=${type}" >> $GITHUB_ENV + echo "VERSION_NAME=${tag}" >> $GITHUB_ENV + id: extract_name + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v2 + - uses: cachix/install-nix-action@v27 + with: + nix_path: nixpkgs=channel:nixos-22.05 + - uses: cachix/cachix-action@v15 + with: + name: moergo-glove80-zmk-dev + authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" + - name: Build lambda image + run: nix-build release.nix --arg revision "\"${REVISION_TAG}\"" --arg firmwareVersion "\"${VERSION_NAME}\"" -A lambdaImage -o lambdaImage + - name: Import OCI image into docker-daemon + env: + REGISTRY: ${{ steps.login-ecr.outputs.registry }} + run: nix shell -f nix/pinned-nixpkgs.nix skopeo -c skopeo --insecure-policy copy oci:lambdaImage docker-daemon:$REGISTRY/$ECR_REPOSITORY:$REVISION_TAG + - name: Push container image to Amazon ECR + env: + REGISTRY: ${{ steps.login-ecr.outputs.registry }} + run: docker push $REGISTRY/$ECR_REPOSITORY:$REVISION_TAG + - name: Create JSON metadata to represent the built container + env: + REGISTRY: ${{ steps.login-ecr.outputs.registry }} + shell: bash + run: | + digest="$(docker inspect --format='{{index .RepoDigests 0}}' $REGISTRY/$ECR_REPOSITORY:$REVISION_TAG)" + digest="${digest##*@}" + api_version="$(cat lambda/api_version.txt)" + timestamp="$(date -u +"%Y%m%d.%H%M%S")" + + if [ "$VERSION_TYPE" = "pr" ]; then + release_name="$VERSION_NAME+$timestamp" + else + release_name="$VERSION_NAME" + fi + + jq -n '$ARGS.named' \ + --arg name "$release_name" \ + --arg version_name "$VERSION_NAME" \ + --arg revision "$REVISION_TAG" \ + --arg release_time "$timestamp" \ + --arg branch "$VERSION_BRANCH" \ + --arg digest "$digest" \ + --arg api_version "$api_version" \ + > "/tmp/$VERSION_NAME.json" + - name: Upload image metadata file to versions bucket + run: aws s3 cp "/tmp/$VERSION_NAME.json" "s3://$VERSIONS_BUCKET/images/$VERSION_NAME.json" + - name: Notify the build pipeline that the compile containers have updated + run: >- + aws lambda invoke --function-name $UPDATE_COMPILER_VERSIONS_FUNCTION + --invocation-type Event + --cli-binary-format raw-in-base64-out + /dev/null diff --git a/.github/workflows/cleanup-container.yml b/.github/workflows/cleanup-container.yml new file mode 100644 index 00000000000..886c4106d35 --- /dev/null +++ b/.github/workflows/cleanup-container.yml @@ -0,0 +1,43 @@ +name: Clean up PR Compiler Service Container + +on: + pull_request: + types: [closed] + branches: + - main + +jobs: + build: + if: github.repository == 'moergo-sc/zmk' + runs-on: ubuntu-latest + # These permissions are needed to interact with GitHub's OIDC Token endpoint. + permissions: + id-token: write + contents: read + env: + ECR_REPOSITORY: zmk-builder-lambda + VERSIONS_BUCKET: glove80firmwarepipelines-compilerversionsbucket44-zubaquiyjdam + UPDATE_COMPILER_VERSIONS_FUNCTION: arn:aws:lambda:us-east-1:431227615537:function:Glove80FirmwarePipelineSt-UpdateCompilerVersions2A-CNxPOHb4VSuV + PR_NUMBER: ${{ github.event.number }} + steps: + - name: Extract image tag name + shell: bash + run: | + tag="pr${PR_NUMBER}.${GITHUB_HEAD_REF}" + # Replace / with . in container tag names + tag="${tag//\//.}" + echo "VERSION_NAME=${tag}" >> $GITHUB_ENV + id: extract_name + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: arn:aws:iam::431227615537:role/GithubCompilerLambdaBuilder + aws-region: us-east-1 + - name: Delete the image metadata file from the versions s3 bucket + run: aws s3 rm s3://$VERSIONS_BUCKET/images/$VERSION_NAME.json + - name: Notify the build pipeline that the compile containers have updated + run: >- + aws lambda invoke --function-name $UPDATE_COMPILER_VERSIONS_FUNCTION + --invocation-type Event + --cli-binary-format raw-in-base64-out + /dev/null diff --git a/.github/workflows/nix-build.yml b/.github/workflows/nix-build.yml index 6f6b0bbf866..345a6bdcf3d 100644 --- a/.github/workflows/nix-build.yml +++ b/.github/workflows/nix-build.yml @@ -1,4 +1,4 @@ -name: Build +name: Build Glove80 Firmware on: push: diff --git a/lambda/.ruby-version b/lambda/.ruby-version new file mode 100644 index 00000000000..fd2a01863fd --- /dev/null +++ b/lambda/.ruby-version @@ -0,0 +1 @@ +3.1.0 diff --git a/lambda/Gemfile b/lambda/Gemfile new file mode 100644 index 00000000000..6b6bbf753ec --- /dev/null +++ b/lambda/Gemfile @@ -0,0 +1,3 @@ +source 'https://rubygems.org' +gem 'aws_lambda_ric' + diff --git a/lambda/Gemfile.lock b/lambda/Gemfile.lock new file mode 100644 index 00000000000..8b6c1f95c58 --- /dev/null +++ b/lambda/Gemfile.lock @@ -0,0 +1,13 @@ +GEM + remote: https://rubygems.org/ + specs: + aws_lambda_ric (2.0.0) + +PLATFORMS + ruby + +DEPENDENCIES + aws_lambda_ric + +BUNDLED WITH + 2.1.4 diff --git a/lambda/api_version.txt b/lambda/api_version.txt new file mode 100644 index 00000000000..00750edc07d --- /dev/null +++ b/lambda/api_version.txt @@ -0,0 +1 @@ +3 diff --git a/lambda/app.rb b/lambda/app.rb new file mode 100644 index 00000000000..7318124a6ef --- /dev/null +++ b/lambda/app.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true + +require 'stringio' +require 'digest' +require 'json' +require './compiler' + +module LambdaFunction + # Handle a non-HTTP compile request, returning a JSON body of either the + # compiled result or an error. + class Handler + REVISION = ENV.fetch('REVISION', 'unknown') + + def self.process(event:, context:) + return { type: 'keep_alive' } if event.has_key?('keep_alive') + + parse_base64_param = ->(param, required: true) do + if event.include?(param) + Base64.strict_decode64(event.fetch(param)) + elsif required + return error(status: 400, message: "Missing required argument: #{param}") + end + rescue ArgumentError + return error(status: 400, message: "Invalid Base64 in #{param} input") + end + + board = event.fetch('board', 'glove80') + keymap_data = parse_base64_param.('keymap') + kconfig_data = parse_base64_param.('kconfig', required: false) + + # Including kconfig settings that affect the RHS require building both + # firmware images, doubling compile time. Clients should omit rhs_kconfig + # where possible. + rhs_kconfig_data = parse_base64_param.('rhs_kconfig', required: false) + + result, log = + begin + log_compile(board, keymap_data, kconfig_data, rhs_kconfig_data) + + Compiler.new.compile(board, keymap_data, kconfig_data, rhs_kconfig_data) + rescue Compiler::CompileError => e + return error(status: e.status, message: e.message, detail: e.log) + end + + result = Base64.strict_encode64(result) + + { type: 'result', result: result, log: log, revision: REVISION } + rescue StandardError => e + error(status: 500, message: "Unexpected error: #{e.class}", detail: [e.message], exception: e) + end + + def self.log_compile(board, keymap_data, kconfig_data, rhs_kconfig_data) + keymap = Digest::SHA1.base64digest(keymap_data) + kconfig = kconfig_data ? Digest::SHA1.base64digest(kconfig_data) : 'nil' + rhs_kconfig = rhs_kconfig_data ? Digest::SHA1.base64digest(rhs_kconfig_data) : 'nil' + puts("Compiling with board: #{board}; keymap: #{keymap}; kconfig: #{kconfig}; rhs_kconfig: #{rhs_kconfig}") + end + + def self.error(status:, message:, detail: nil, exception: nil) + reported_error = { type: 'error', status:, message:, detail:, revision: REVISION } + + exception_detail = { class: exception.class, backtrace: exception.backtrace } if exception + logged_error = reported_error.merge(exception: exception_detail) + puts(JSON.dump(logged_error)) + + reported_error + end + end +end diff --git a/lambda/compiler.rb b/lambda/compiler.rb new file mode 100644 index 00000000000..fe9e91f2a5b --- /dev/null +++ b/lambda/compiler.rb @@ -0,0 +1,161 @@ +# frozen_string_literal: true + +require 'tmpdir' +require 'base64' +require 'json' +require 'open3' +require 'yaml' +require 'set' + +class Compiler + class CompileError < RuntimeError + attr_reader :status, :log + + def initialize(message, status: 400, log:) + super(message) + @status = status + @log = log + end + end + + def compile(board, keymap_data, lhs_kconfig_data, rhs_kconfig_data) + board_lh = board + '_lh' + board_rh = board + '_rh' + + if rhs_kconfig_data && !rhs_kconfig_data.empty? + lhs_result, lhs_output = compile_board(board_lh, keymap_data:, kconfig_data: lhs_kconfig_data, include_static_rhs: false) + rhs_result, rhs_output = compile_board(board_rh, keymap_data: nil, kconfig_data: rhs_kconfig_data, include_static_rhs: false) + [ + lhs_result.concat(rhs_result), + ["LHS Output:", *lhs_output, "RHS Output:", *rhs_output], + ] + else + compile_board(board_lh, keymap_data:, kconfig_data: lhs_kconfig_data, include_static_rhs: true) + end + end + + def compile_board(board, keymap_data:, kconfig_data:, include_static_rhs: false) + in_build_dir do + compile_command = ['compileZmk', '-b', board] + + if keymap_data + dts_parse_errors = validate_devicetree!(keymap_data) + File.open('build.keymap', 'w') { |io| io.write(keymap_data) } + compile_command << '-k' << './build.keymap' + end + + if kconfig_data + File.open('build.conf', 'w') { |io| io.write(kconfig_data) } + compile_command << '-c' << './build.conf' + + # If requesting USB logging, include the corresponding snippet that also + # enables necessary devicetree nodes + if kconfig_data =~ /CONFIG_ZMK_USB_LOGGING\s*=\s*y/ + compile_command << '-s' << 'zmk-usb-logging' + end + end + + if include_static_rhs + # Concatenate the pre-compiled glove80_rh image to the resulting uf2 + compile_command << '-m' + end + + compile_output = nil + + IO.popen(compile_command, 'rb', err: [:child, :out]) do |io| + compile_output = io.read + end + + compile_output = compile_output.split("\n") + + unless $?.success? + status = $?.exitstatus + raise CompileError.new("Compile failed with exit status #{status}", log: compile_output) + end + + unless File.exist?('zmk.uf2') + raise CompileError.new('Compile failed to produce result binary', status: 500, log: compile_output) + end + + if dts_parse_errors + # DTS validation failed to parse the DTS, yet the Zephyr build + # nonetheless succeeded. We can't allow returning the result, since we + # were unable to check it for unsafe dts sections. + raise CompileError.new('Syntax error validating device-tree input', log: dts_parse_errors) + end + + result = File.read('zmk.uf2') + + [result, compile_output] + end + end + + PERMITTED_DTS_SECTIONS = %w[ + behaviors macros combos conditional_layers keymap underglow-indicators + cirque_lh_listener cirque_rh_listener + input_processors + mkp_input_listener mmv_input_listener msc_input_listener + ].to_set.freeze + + PERMITTED_DTS_SECTION_PATTERNS = [ + /^zip_/ + ].freeze + + DTS_STUB = <<~EOF + /dts-v1/; + / { + underglow_indicators: underglow-indicators {}; + cirque_lh_listener: cirque_lh_listener {}; + cirque_rh_listener: cirque_rh_listener {}; + }; + EOF + + def validate_devicetree!(dtsi) + dts = DTS_STUB + dtsi + + stdout, stderr, status = + Open3.capture3({}, 'dts2yml', unsetenv_others: true, stdin_data: dts) + + unless status.success? + # The error output from dtc is much harder to understand than Zephyr's + # errors, and the line numbers don't match up due to preprocessing. Rather + # than raising these now, return the error output in order that it's only + # used in the case that the Zephyr build doesn't itself error. + return stderr.split("\n") + end + + data = + begin + YAML.safe_load(stdout) + rescue Psych::Exception => e + raise CompileError.new('Error parsing translated device-tree', status: 500, log: [e.message]) + end + + sections = data.flat_map(&:keys) + + invalid_sections = sections.reject do |section_name| + PERMITTED_DTS_SECTIONS.include?(section_name) || + PERMITTED_DTS_SECTION_PATTERNS.any? { |p| p.match?(section_name) } + end + + unless invalid_sections.empty? + raise CompileError.new( + "Device-tree included the non-permitted root sections: #{invalid_sections.inspect}", log: []) + end + + nil + end + + # Lambda is single-process per container, and we get substantial speedups + # from ccache by always building in the same path + BUILD_DIR = '/tmp/build' + + def in_build_dir + FileUtils.remove_entry(BUILD_DIR, true) + Dir.mkdir(BUILD_DIR) + Dir.chdir(BUILD_DIR) + yield + ensure + FileUtils.remove_entry(BUILD_DIR, true) rescue nil + end +end diff --git a/lambda/default.nix b/lambda/default.nix new file mode 100644 index 00000000000..6a34b0d1122 --- /dev/null +++ b/lambda/default.nix @@ -0,0 +1,26 @@ +{ pkgs ? import {} }: + +with pkgs; + +let + bundleEnv = bundlerEnv { + name = "lambda-bundler-env"; + ruby = ruby_3_1; + gemfile = ./Gemfile; + lockfile = ./Gemfile.lock; + gemset = ./gemset.nix; + }; + + source = stdenv.mkDerivation { + name = "lambda-builder"; + version = "0.0.1"; + src = ./.; + installPhase = '' + cp -r ./ $out + ''; + }; + +in +{ + inherit bundleEnv source; +} diff --git a/lambda/gemset.nix b/lambda/gemset.nix new file mode 100644 index 00000000000..6b2fd1a0207 --- /dev/null +++ b/lambda/gemset.nix @@ -0,0 +1,12 @@ +{ + aws_lambda_ric = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "19c4xlgnhgwf3n3z57z16nmr76jd2vihhshknm5zqip2g00awhi1"; + type = "gem"; + }; + version = "2.0.0"; + }; +} diff --git a/lambda/shell.nix b/lambda/shell.nix new file mode 100644 index 00000000000..2f1eca8bb75 --- /dev/null +++ b/lambda/shell.nix @@ -0,0 +1,9 @@ +{ pkgs ? (import {})}: + +let + lambda = import ./default.nix { inherit pkgs; }; +in +pkgs.stdenv.mkDerivation { + name = "lambda-shell"; + buildInputs = [lambda.bundleEnv.wrappedRuby]; +} diff --git a/nix/ccache.nix b/nix/ccache.nix new file mode 100644 index 00000000000..030153140e2 --- /dev/null +++ b/nix/ccache.nix @@ -0,0 +1,43 @@ +{ stdenv, lib, makeWrapper, ccache +, unwrappedCC ? stdenv.cc.cc, extraConfig ? "" }: + +# copied from ccache in nixpkgs, modified to glob over prefixes. Also doesn't +# pass lib. Why was it passing lib? +stdenv.mkDerivation { + name = "ccache-links"; + passthru = { + isClang = unwrappedCC.isClang or false; + isGNU = unwrappedCC.isGNU or false; + }; + nativeBuildInputs = [ makeWrapper ]; + buildCommand = '' + mkdir -p $out/bin + + wrap() { + local cname="$(basename $1)" + if [ -x "${unwrappedCC}/bin/$cname" ]; then + echo "Wrapping $1" + makeWrapper ${ccache}/bin/ccache $out/bin/$cname \ + --run ${lib.escapeShellArg extraConfig} \ + --add-flags ${unwrappedCC}/bin/$cname + fi + } + + wrapAll() { + for prog in "$@"; do + wrap "$prog" + done + } + + wrapAll ${unwrappedCC}/bin/{*cc,*c++,*gcc,*g++,*clang,*clang++} + + for executable in $(ls ${unwrappedCC}/bin); do + if [ ! -x "$out/bin/$executable" ]; then + ln -s ${unwrappedCC}/bin/$executable $out/bin/$executable + fi + done + for file in $(ls ${unwrappedCC} | grep -vw bin); do + ln -s ${unwrappedCC}/$file $out/$file + done + ''; +} diff --git a/nix/semver.nix b/nix/semver.nix new file mode 100644 index 00000000000..89f400fe5af --- /dev/null +++ b/nix/semver.nix @@ -0,0 +1,16 @@ +{ lib, stdenv, fetchFromGitHub, buildGoModule }: + +buildGoModule { + name = "semver"; + + src = fetchFromGitHub { + owner = "ffurrer2"; + repo = "semver"; + rev = "0d3cab9dd5738f5c9b986794b8d19f3ee6cd0112"; + sha256 = "sha256-2m6pAAGBtkmrSv2LwwFlcsyG2yUkhrWuTv+ynjilGxI="; + }; + + patches = [./semver.patch.gz]; + + vendorHash = "sha256-IotWZIiGNwdPkjK4C24kUXqsDZuLv53ThhYcJVj+Krk="; +} diff --git a/nix/semver.patch.gz b/nix/semver.patch.gz new file mode 100644 index 0000000000000000000000000000000000000000..e286d49c5fe088870aafe642b6a4fb9a16344c22 GIT binary patch literal 734 zcmV<40wMh$iwFqDHDzZ219N3s5dPf!iX-AfveZt}maeJT zTBIQ~iJ^)CLhP+h;&g^4DUMS%82=sHN#C}1u!f&bl=w*t;~?qzVN5oYvQ=26Xe*@?*3}v7>Xbp0XNAxkIw3bFV+Usy`Z0RIwu^iWeX`z9oVG QKPQU)1BLl4&2 + usage >&2 + exit 1 + fi + + ${realpath_coreutils}/bin/realpath "$1" + } + + keymap="" + kconfig="" + board="glove80_lh" + merge_rhs="" + snippet="" + + while getopts "hk:c:d:b:s:m" opt; do + case "$opt" in + h|\?) + usage >&2 + exit 1 + ;; + k) + keymap="$OPTARG" + ;; + c) + kconfig="$OPTARG" + ;; + b) + board="$OPTARG" + ;; + s) + snippet="$OPTARG" + ;; + m) + merge_rhs=t + ;; + esac + done + + if [ -n "$merge_rhs" ]; then + case "$board" in + glove80_lh) + merge_rhs_firmware="${zmk_glove80_rh}/zmk.uf2" + ;; + *) + echo "No pre-built RHS exists to merge with specified board '$board'" >&2 + exit 2 + ;; + esac + fi + + keymap="$(checkPath "$keymap" keymap)" + kconfig="$(checkPath "$kconfig" Kconfig)" + + export PATH=${lib.makeBinPath (with pkgs; zmk'.nativeBuildInputs ++ [ ccache ])}:$PATH + export CMAKE_PREFIX_PATH=${zephyr} + + export CCACHE_BASEDIR=$PWD + export CCACHE_NOHASHDIR=t + export CCACHE_COMPILERCHECK=none + + if [ -n "$DEBUG" ]; then ccache -z; fi + + declare -a cmakeExtraFlags + + if [ -n "$keymap" ]; then + cmakeExtraFlags+=("-DKEYMAP_FILE=$keymap") + fi + + if [ -n "$kconfig" ]; then + cmakeExtraFlags+=("-DEXTRA_CONF_FILE=$kconfig") + fi + + if [ -n "$snippet" ]; then + cmakeExtraFlags+=("-DSNIPPET=$snippet") + fi + + if ${semver}/bin/semver validate "${firmwareVersion}"; then + firmwareMajor="$(${semver}/bin/semver format "{{.Major}}" "${firmwareVersion}")" + firmwareMinor="$(${semver}/bin/semver format "{{.Minor}}" "${firmwareVersion}")" + firmwarePatch="$(${semver}/bin/semver format "{{.Patch}}" "${firmwareVersion}")" + else + firmwareMajor="0" + firmwareMinor="0" + firmwarePatch="0" + fi + + firmwareFlags="-DMOERGO_FIRMWARE_VERSION=${firmwareVersion};-DMOERGO_FIRMWARE_VERSION_MAJOR=$firmwareMajor;-DMOERGO_FIRMWARE_VERSION_MINOR=$firmwareMinor;-DMOERGO_FIRMWARE_VERSION_PATCH=$firmwarePatch" + + cmake -G Ninja -S ${zmk'.src}/app ${lib.escapeShellArgs zmk'.cmakeFlags} "-DUSER_CACHE_DIR=/tmp/.cache" "-DBOARD=$board" "-DBUILD_VERSION=${revision}" "-DDTS_EXTRA_CPPFLAGS=$firmwareFlags" "''${cmakeExtraFlags[@]}" + + ninja + + if [ -n "$DEBUG" ]; then ccache -s; fi + + if [ -z "$merge_rhs" ]; then + mv zephyr/zmk.uf2 zmk.uf2 + else + cat zephyr/zmk.uf2 "$merge_rhs_firmware" > zmk.uf2 + fi + ''; + + ccacheCache = pkgs.runCommandNoCC "ccache-cache" { + nativeBuildInputs = [ zmkCompileScript ]; + } '' + export CCACHE_DIR=$out + + mkdir /tmp/build + cd /tmp/build + + compileZmk -b glove80_lh -k ${zmk.src}/app/boards/arm/glove80/glove80.keymap + + rm -fr /tmp/build + mkdir /tmp/build + cd /tmp/build + + compileZmk -b glove80_rh -k ${zmk.src}/app/boards/arm/glove80/glove80.keymap + ''; + + entrypoint = pkgs.writeShellScriptBin "entrypoint" '' + set -euo pipefail + + if [ ! -d "$CCACHE_DIR" ]; then + cp -r ${ccacheCache} "$CCACHE_DIR" + chmod -R u=rwX,go=u-w "$CCACHE_DIR" + fi + + if [ ! -d /tmp/build ]; then + mkdir /tmp/build + fi + + exec "$@" + ''; + + startLambda = pkgs.writeShellScriptBin "startLambda" '' + set -euo pipefail + export PATH=${lib.makeBinPath [ zmkCompileScript dts2yml ]}:$PATH + cd ${lambda.source} + ${lambda.bundleEnv}/bin/bundle exec aws_lambda_ric "app.LambdaFunction::Handler.process" + ''; + + simulateLambda = pkgs.writeShellScriptBin "simulateLambda" '' + ${pkgs.aws-lambda-rie}/bin/aws-lambda-rie ${startLambda}/bin/startLambda + ''; + + lambdaImage = + let + appLayer = { + name = "app-layer"; + path = [ startLambda zmkCompileScript ]; + }; + in + ociTools.makeSimpleImage { + name = "zmk-builder-lambda"; + layers = [ baseLayer depsLayer appLayer ]; + config = { + User = "deploy"; + WorkingDir = "/tmp"; + Entrypoint = [ "${entrypoint}/bin/entrypoint" ]; + Cmd = [ "startLambda" ]; + Env = [ "CCACHE_DIR=/tmp/ccache" "REVISION=${revision}" ]; + }; + }; +in { + inherit lambdaImage zmkCompileScript dts2yml ccacheCache; + directLambdaImage = lambdaImage; + + # nix shell -f release.nix simulateLambda -c simulateLambda + inherit simulateLambda; +} From 3ca0acbc3a20cb68b070be0371ff6ce22b40a77d Mon Sep 17 00:00:00 2001 From: moergo-sc Date: Sun, 19 Sep 2021 13:05:21 +1200 Subject: [PATCH 86/96] Configure Glove80 board definitions for custom features Additionally adds a board definition for Glove80-v0, an early version of Glove80. --- app/boards/arm/glove80_v0/Kconfig | 7 + app/boards/arm/glove80_v0/Kconfig.board | 12 ++ app/boards/arm/glove80_v0/Kconfig.defconfig | 66 +++++++++ app/boards/arm/glove80_v0/board.cmake | 5 + app/boards/arm/glove80_v0/glove80_v0.dtsi | 100 +++++++++++++ app/boards/arm/glove80_v0/glove80_v0.keymap | 56 ++++++++ .../arm/glove80_v0/glove80_v0_lh-pinctrl.dtsi | 47 ++++++ app/boards/arm/glove80_v0/glove80_v0_lh.dts | 135 ++++++++++++++++++ .../arm/glove80_v0/glove80_v0_lh.keymap | 1 + app/boards/arm/glove80_v0/glove80_v0_lh.yaml | 15 ++ app/boards/arm/glove80_v0/glove80_v0_lh.yml | 10 ++ .../arm/glove80_v0/glove80_v0_lh_defconfig | 50 +++++++ .../arm/glove80_v0/glove80_v0_rh-pinctrl.dtsi | 47 ++++++ app/boards/arm/glove80_v0/glove80_v0_rh.dts | 118 +++++++++++++++ .../arm/glove80_v0/glove80_v0_rh.keymap | 1 + app/boards/arm/glove80_v0/glove80_v0_rh.yaml | 15 ++ app/boards/arm/glove80_v0/glove80_v0_rh.yml | 10 ++ .../arm/glove80_v0/glove80_v0_rh_defconfig | 50 +++++++ app/boards/moergo/glove80/glove80.keymap | 35 ++++- app/boards/moergo/glove80/glove80_lh.dts | 26 ++++ .../moergo/glove80/glove80_lh_defconfig | 21 +++ .../moergo/glove80/glove80_rh_defconfig | 10 +- 22 files changed, 832 insertions(+), 5 deletions(-) create mode 100644 app/boards/arm/glove80_v0/Kconfig create mode 100644 app/boards/arm/glove80_v0/Kconfig.board create mode 100644 app/boards/arm/glove80_v0/Kconfig.defconfig create mode 100644 app/boards/arm/glove80_v0/board.cmake create mode 100644 app/boards/arm/glove80_v0/glove80_v0.dtsi create mode 100644 app/boards/arm/glove80_v0/glove80_v0.keymap create mode 100644 app/boards/arm/glove80_v0/glove80_v0_lh-pinctrl.dtsi create mode 100644 app/boards/arm/glove80_v0/glove80_v0_lh.dts create mode 100644 app/boards/arm/glove80_v0/glove80_v0_lh.keymap create mode 100644 app/boards/arm/glove80_v0/glove80_v0_lh.yaml create mode 100644 app/boards/arm/glove80_v0/glove80_v0_lh.yml create mode 100644 app/boards/arm/glove80_v0/glove80_v0_lh_defconfig create mode 100644 app/boards/arm/glove80_v0/glove80_v0_rh-pinctrl.dtsi create mode 100644 app/boards/arm/glove80_v0/glove80_v0_rh.dts create mode 100644 app/boards/arm/glove80_v0/glove80_v0_rh.keymap create mode 100644 app/boards/arm/glove80_v0/glove80_v0_rh.yaml create mode 100644 app/boards/arm/glove80_v0/glove80_v0_rh.yml create mode 100644 app/boards/arm/glove80_v0/glove80_v0_rh_defconfig diff --git a/app/boards/arm/glove80_v0/Kconfig b/app/boards/arm/glove80_v0/Kconfig new file mode 100644 index 00000000000..f971e6c81da --- /dev/null +++ b/app/boards/arm/glove80_v0/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_GLOVE80_V0_LH || BOARD_GLOVE80_V0_RH) diff --git a/app/boards/arm/glove80_v0/Kconfig.board b/app/boards/arm/glove80_v0/Kconfig.board new file mode 100644 index 00000000000..ce97e890fbc --- /dev/null +++ b/app/boards/arm/glove80_v0/Kconfig.board @@ -0,0 +1,12 @@ +# nice!nano board configuration + +# Copyright (c) 2020 Pete Johanson +# SPDX-License-Identifier: MIT + +config BOARD_GLOVE80_V0_LH + bool "Glove80 v0 LH" + depends on SOC_NRF52840_QIAA + +config BOARD_GLOVE80_V0_RH + bool "Glove80 v0 RH" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/glove80_v0/Kconfig.defconfig b/app/boards/arm/glove80_v0/Kconfig.defconfig new file mode 100644 index 00000000000..9e68b18dc89 --- /dev/null +++ b/app/boards/arm/glove80_v0/Kconfig.defconfig @@ -0,0 +1,66 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if BOARD_GLOVE80_V0_LH +config BOARD + default "glove80 v0 lh" + +config ZMK_SPLIT_BLE_ROLE_CENTRAL + default y + +config ZMK_KEYBOARD_NAME + default "Glove80 V0 Left" +endif # BOARD_GLOVE80_V0_LH + +if BOARD_GLOVE80_V0_RH +config BOARD + default "glove80 v0 rh" + +config ZMK_KEYBOARD_NAME + default "Glove80 V0 Right" +endif # BOARD_GLOVE80_V0_RH + +if BOARD_GLOVE80_V0_LH || BOARD_GLOVE80_V0_RH + +config ZMK_SPLIT + default y + +config BT_CTLR + default BT + +config ZMK_BLE + default y + +config ZMK_USB + default y + +config ZMK_BATTERY_VOLTAGE_DIVIDER + default y + +config ZMK_BATTERY_NRF_VDDH + default y + +config PINCTRL + default y + +if USB + +config USB_NRFX + default y + +config USB_DEVICE_STACK + default y + +endif # USB + +if ZMK_BACKLIGHT + +config PWM + default y + +config LED_PWM + default y + +endif # ZMK_BACKLIGHT + +endif # BOARD_GLOVE80_V0_LH || BOARD_GLOVE80_V0_RH diff --git a/app/boards/arm/glove80_v0/board.cmake b/app/boards/arm/glove80_v0/board.cmake new file mode 100644 index 00000000000..fa847d50595 --- /dev/null +++ b/app/boards/arm/glove80_v0/board.cmake @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: MIT + +board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") +include(${ZEPHYR_BASE}/boards/common/blackmagicprobe.board.cmake) +include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/boards/arm/glove80_v0/glove80_v0.dtsi b/app/boards/arm/glove80_v0/glove80_v0.dtsi new file mode 100644 index 00000000000..dafa089dbd8 --- /dev/null +++ b/app/boards/arm/glove80_v0/glove80_v0.dtsi @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2020 Pete Johanson + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + chosen { + zmk,kscan = &kscan0; + zmk,matrix-transform = &default_transform; + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <6>; + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) +RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) +RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(0,6) RC(1,6) RC(2,6) RC(2,7) RC(1,7) RC(0,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,13) +RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(3,6) RC(4,6) RC(5,6) RC(5,7) RC(4,7) RC(3,7) RC(5,9) RC(5,10) RC(5,11) RC(5,12) RC(5,13) + >; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + + diode-direction = "row2col"; + debounce-press-ms = <1>; + debounce-release-ms = <25>; + }; + +}; + +&adc { + status = "okay"; +}; + +&gpiote { + status = "okay"; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +&usbd { + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + }; +}; + +&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/arm/glove80_v0/glove80_v0.keymap b/app/boards/arm/glove80_v0/glove80_v0.keymap new file mode 100644 index 00000000000..52a88125275 --- /dev/null +++ b/app/boards/arm/glove80_v0/glove80_v0.keymap @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include +#include + +#define HYPER LC(LS(LG(LALT))) + +// layers +#define DEFAULT 0 +#define LOWER 1 + +/ { + keymap { + compatible = "zmk,keymap"; + + default_layer { + // --------------------------------------------------------------------------------------------------------------------------------- + // | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | + // | = | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - | + // | TAB | Q | W | E | R | T | | Y | U | I | O | P | \ | + // | ESC | A | S | D | F | G | | H | J | K | L | ; | ' | + // | ` | Z | X | C | V | B | LSHFT | LCTRL | LOWER | | LGUI | RCTRL | RSHFT | N | M | , | . | / | PGUP | + // | MAGIC | HOME| END | LEFT | RIGHT| | BSPC | DEL | LALT | | RALT | RET | SPACE | | UP | DOWN | [ | ] | PGDN | + + + // MAGIC is currently bound to the same as LAYER - these will be fixed later + bindings = < + &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 + &kp EQUAL &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH + &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp GRAVE &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LCTRL &mo LOWER &kp LGUI &kp RCTRL &kp RSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp PG_UP + &mo LOWER &kp HOME &kp END &kp LEFT &kp RIGHT &kp BSPC &kp DEL &kp LALT &kp RALT &kp RET &kp SPACE &kp UP &kp DOWN &kp LBKT &kp RBKT &kp PG_DN + >; + }; + + lower_layer { + bindings = < + &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &none &none &none &kp F11 &kp F12 + &bt BT_CLR &bt BT_CLR &out OUT_USB &out OUT_BLE &out OUT_TOG &none &none &none &none &none &none &none + &bootloader &rgb_ug RGB_TOG &rgb_ug RGB_EFF &rgb_ug RGB_BRI &rgb_ug RGB_BRD &kp K_VOL_UP &none &none &none &none &none &bootloader + &sys_reset &none &none &none &none &kp K_VOL_DN &none &none &none &none &none &sys_reset + &ext_power EP_ON &ext_power EP_OFF &none &none &none &kp K_MUTE &none &kp HYPER &none &none &none &none &none &none &none &none &none &none + &none &kp CAPS &kp INS &none &none &none &none &none &none &none &none &none &none &none &none &none + >; + }; + }; +}; diff --git a/app/boards/arm/glove80_v0/glove80_v0_lh-pinctrl.dtsi b/app/boards/arm/glove80_v0/glove80_v0_lh-pinctrl.dtsi new file mode 100644 index 00000000000..f4437b601d2 --- /dev/null +++ b/app/boards/arm/glove80_v0/glove80_v0_lh-pinctrl.dtsi @@ -0,0 +1,47 @@ +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = , + , + ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + pwm0_default: pwm0_default { + group1 { + psels = ; + }; + }; + + pwm0_sleep: pwm0_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; + + uart0_default: uart0_default { + group1 { + psels = , + ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + +}; diff --git a/app/boards/arm/glove80_v0/glove80_v0_lh.dts b/app/boards/arm/glove80_v0/glove80_v0_lh.dts new file mode 100644 index 00000000000..db8ae5a3334 --- /dev/null +++ b/app/boards/arm/glove80_v0/glove80_v0_lh.dts @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2021 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +/dts-v1/; +#include +#include +#include "glove80_v0.dtsi" +#include "glove80_v0_lh-pinctrl.dtsi" + +/ { + model = "glove80_v0_lh"; + compatible = "glove80_v0_lh"; + + chosen { + zmk,underglow = &led_strip; + zmk,backlight = &power_led_backlight; + zmk,battery = &vbatt; + zmk,underglow-indicators = &underglow_indicators; + }; + + power_led_backlight: pwmleds { + compatible = "pwm-leds"; + pwm_led_0 { + pwms = <&pwm0 0 PWM_USEC(20) PWM_POLARITY_NORMAL>; + }; + }; + + // Node name must match original "EXT_POWER" label to preserve user settings. + EXT_POWER { + compatible = "zmk,ext-power-generic"; + control-gpios = <&gpio0 30 GPIO_ACTIVE_HIGH>; /**[SC] WS2812_CE */ + init-delay-ms = <10>; + }; + + vbatt: vbatt-divider { + compatible = "zmk,battery-voltage-divider"; + io-channels = <&adc 5>; + output-ohms = <820000>; /** Double check that this is right */ + full-ohms = <(1500000 + 820000)>; + }; + + vbatt-vddh { + compatible = "zmk,battery-nrf-vddh"; + }; + +/* + MoErgo 40 LEDs + + 34 28 22 16 10 + 35 29 23 17 11 6 + 36 30 24 18 12 7 + 37 31 25 19 13 8 + 38 32 26 20 14 9 + 39 33 27 21 15 + 0 1 2 + 3 4 5 +*/ + + underglow_indicators: underglow-indicators { + compatible = "zmk,underglow-indicators"; + layer-state = <35 29 23 17 11 6>; + bat-lhs = <36 30 24 18 12 7>; + bat-rhs = <37 31 25 19 13 8>; + capslock = <22>; + numlock = <16>; + scrolllock = <10>; + ble-state = <3 4 0 1>; + usb-state = <5>; + output-fallback = <15>; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + /* Cannot be used together with i2c0. */ + status = "okay"; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_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 = <2000000>; + + /* WS2812 */ + chain-length = <40>; /* 18 keys have underglow at the moment */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +&pwm0 { + status = "okay"; + pinctrl-0 = <&pwm0_default>; + pinctrl-1 = <&pwm0_sleep>; + pinctrl-names = "default", "sleep"; +}; + + +// [SC] Not sure if this section is necessary +&uart0 { + compatible = "nordic,nrf-uarte"; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; +}; + +&kscan0 { + row-gpios + = <&gpio0 26 GPIO_ACTIVE_HIGH> // LH ROW1 + , <&gpio0 5 GPIO_ACTIVE_HIGH> // LH ROW2 + , <&gpio0 7 GPIO_ACTIVE_HIGH> // LH ROW3 + , <&gpio1 8 GPIO_ACTIVE_HIGH> // LH ROW4 + , <&gpio0 11 GPIO_ACTIVE_HIGH> // LH ROW5 + , <&gpio0 12 GPIO_ACTIVE_HIGH> // LH ROW6 + ; + col-gpios + = <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH COL6 + , <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH COL5 + , <&gpio1 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH COL4 + , <&gpio1 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH COL3 + , <&gpio1 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH COL2 + , <&gpio1 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH COL1 + , <&gpio0 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH Thumb + ; +}; diff --git a/app/boards/arm/glove80_v0/glove80_v0_lh.keymap b/app/boards/arm/glove80_v0/glove80_v0_lh.keymap new file mode 100644 index 00000000000..1a5a04b3937 --- /dev/null +++ b/app/boards/arm/glove80_v0/glove80_v0_lh.keymap @@ -0,0 +1 @@ +#include "glove80_v0.keymap" \ No newline at end of file diff --git a/app/boards/arm/glove80_v0/glove80_v0_lh.yaml b/app/boards/arm/glove80_v0/glove80_v0_lh.yaml new file mode 100644 index 00000000000..56b575ac27e --- /dev/null +++ b/app/boards/arm/glove80_v0/glove80_v0_lh.yaml @@ -0,0 +1,15 @@ +identifier: glove80_v0_lh +name: Glove80_V0_LH +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - ble + - ieee802154 + - pwm + - watchdog diff --git a/app/boards/arm/glove80_v0/glove80_v0_lh.yml b/app/boards/arm/glove80_v0/glove80_v0_lh.yml new file mode 100644 index 00000000000..407021c51df --- /dev/null +++ b/app/boards/arm/glove80_v0/glove80_v0_lh.yml @@ -0,0 +1,10 @@ +file_format: "1" +id: glove80_v0_lh +name: Glove80_V0_LH +type: board +arch: arm +outputs: + - usb + - ble +url: https://www.moergo.com +exposes: diff --git a/app/boards/arm/glove80_v0/glove80_v0_lh_defconfig b/app/boards/arm/glove80_v0/glove80_v0_lh_defconfig new file mode 100644 index 00000000000..4d5676a1231 --- /dev/null +++ b/app/boards/arm/glove80_v0/glove80_v0_lh_defconfig @@ -0,0 +1,50 @@ +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_GLOVE80_V0_LH=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable GPIO +CONFIG_GPIO=y + +CONFIG_BUILD_OUTPUT_UF2=y + +CONFIG_USE_DT_CODE_PARTITION=y + +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +# Enable RGB underglow +CONFIG_ZMK_RGB_UNDERGLOW=y +CONFIG_WS2812_STRIP=y +CONFIG_SPI=y + +CONFIG_ZMK_RGB_UNDERGLOW_ON_START=n +CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y +CONFIG_ZMK_RGB_UNDERGLOW_BRT_STEP=4 + +CONFIG_ZMK_RGB_UNDERGLOW_EFF_START=3 +CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=285 +CONFIG_ZMK_RGB_UNDERGLOW_SAT_START=75 +CONFIG_ZMK_RGB_UNDERGLOW_BRT_START=20 + +# The power LED is implemented as a backlight +CONFIG_ZMK_BACKLIGHT=y +CONFIG_ZMK_BACKLIGHT_ON_START=y +CONFIG_ZMK_BACKLIGHT_BRT_START=5 +CONFIG_ZMK_BACKLIGHT_AUTO_OFF_IDLE=y +CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB=y + +# Turn on logging, and set ZMK logging to debug output +# Only for debugging +CONFIG_ZMK_USB_LOGGING=n + +# Turn on debugging to disable optimization +CONFIG_DEBUG=n diff --git a/app/boards/arm/glove80_v0/glove80_v0_rh-pinctrl.dtsi b/app/boards/arm/glove80_v0/glove80_v0_rh-pinctrl.dtsi new file mode 100644 index 00000000000..08f649f759f --- /dev/null +++ b/app/boards/arm/glove80_v0/glove80_v0_rh-pinctrl.dtsi @@ -0,0 +1,47 @@ +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = , + , + ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + pwm0_default: pwm0_default { + group1 { + psels = ; + }; + }; + + pwm0_sleep: pwm0_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; + + uart0_default: uart0_default { + group1 { + psels = , + ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + +}; diff --git a/app/boards/arm/glove80_v0/glove80_v0_rh.dts b/app/boards/arm/glove80_v0/glove80_v0_rh.dts new file mode 100644 index 00000000000..c2185da7817 --- /dev/null +++ b/app/boards/arm/glove80_v0/glove80_v0_rh.dts @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2021 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +/dts-v1/; +#include +#include +#include "glove80_v0.dtsi" +#include "glove80_v0_rh-pinctrl.dtsi" + +/ { + model = "glove80_v0_rh"; + compatible = "glove80_v0_rh"; + + chosen { + zmk,underglow = &led_strip; + zmk,backlight = &power_led_backlight; + zmk,battery = &vbatt; + }; + + leds { + compatible = "gpio-leds"; + red_led: led_0 { + gpios = <&gpio0 20 GPIO_ACTIVE_HIGH>; + }; + }; + + power_led_backlight: pwmleds { + compatible = "pwm-leds"; + pwm_led_0 { + pwms = <&pwm0 0 PWM_USEC(20) PWM_POLARITY_NORMAL>; + }; + }; + + // Node name must match original "EXT_POWER" label to preserve user settings. + EXT_POWER { + compatible = "zmk,ext-power-generic"; + control-gpios = <&gpio0 21 GPIO_ACTIVE_HIGH>; /**[SC] WS2812_CE */ + init-delay-ms = <10>; + }; + + vbatt: vbatt-divider { + compatible = "zmk,battery-voltage-divider"; + io-channels = <&adc 5>; + output-ohms = <820000>; /** Double check that this is right */ + full-ohms = <(1500000 + 820000)>; + }; + + vbatt-vddh { + compatible = "zmk,battery-nrf-vddh"; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + /* Cannot be used together with i2c0. */ + status = "okay"; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_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 = <2000000>; + + /* WS2812 */ + chain-length = <40>; + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +&pwm0 { + status = "okay"; + pinctrl-0 = <&pwm0_default>; + pinctrl-1 = <&pwm0_sleep>; + pinctrl-names = "default", "sleep"; +}; + +// [SC] Not sure if this section is necessary +&uart0 { + compatible = "nordic,nrf-uarte"; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; +}; + +&default_transform { + col-offset = <7>; +}; + +&kscan0 { + row-gpios + = <&gpio0 26 GPIO_ACTIVE_HIGH> // RH ROW1 + , <&gpio0 5 GPIO_ACTIVE_HIGH> // RH ROW2 + , <&gpio0 7 GPIO_ACTIVE_HIGH> // RH ROW3 + , <&gpio1 8 GPIO_ACTIVE_HIGH> // RH ROW4 + , <&gpio0 11 GPIO_ACTIVE_HIGH> // RH ROW5 + , <&gpio0 12 GPIO_ACTIVE_HIGH> // RH ROW6 + ; + col-gpios + = <&gpio0 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH Thumb + , <&gpio1 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH COL1 + , <&gpio1 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH COL2 + , <&gpio1 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH COL3 + , <&gpio1 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH COL4 + , <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH COL5 + , <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH COL6 + ; +}; diff --git a/app/boards/arm/glove80_v0/glove80_v0_rh.keymap b/app/boards/arm/glove80_v0/glove80_v0_rh.keymap new file mode 100644 index 00000000000..1a5a04b3937 --- /dev/null +++ b/app/boards/arm/glove80_v0/glove80_v0_rh.keymap @@ -0,0 +1 @@ +#include "glove80_v0.keymap" \ No newline at end of file diff --git a/app/boards/arm/glove80_v0/glove80_v0_rh.yaml b/app/boards/arm/glove80_v0/glove80_v0_rh.yaml new file mode 100644 index 00000000000..222ae1770e2 --- /dev/null +++ b/app/boards/arm/glove80_v0/glove80_v0_rh.yaml @@ -0,0 +1,15 @@ +identifier: glove80_v0_rh +name: Glove80_V0_RH +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - ble + - ieee802154 + - pwm + - watchdog diff --git a/app/boards/arm/glove80_v0/glove80_v0_rh.yml b/app/boards/arm/glove80_v0/glove80_v0_rh.yml new file mode 100644 index 00000000000..41333f08662 --- /dev/null +++ b/app/boards/arm/glove80_v0/glove80_v0_rh.yml @@ -0,0 +1,10 @@ +file_format: "1" +id: glove80_v0_rh +name: Glove80_V0_RH +type: board +arch: arm +outputs: + - usb + - ble +url: https://www.moergo.com +exposes: diff --git a/app/boards/arm/glove80_v0/glove80_v0_rh_defconfig b/app/boards/arm/glove80_v0/glove80_v0_rh_defconfig new file mode 100644 index 00000000000..71b5f2f6215 --- /dev/null +++ b/app/boards/arm/glove80_v0/glove80_v0_rh_defconfig @@ -0,0 +1,50 @@ +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_GLOVE80_V0_RH=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable GPIO +CONFIG_GPIO=y + +CONFIG_BUILD_OUTPUT_UF2=y + +CONFIG_USE_DT_CODE_PARTITION=y + +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +# Disable RGB underglow for now in RH +CONFIG_ZMK_RGB_UNDERGLOW=y +CONFIG_WS2812_STRIP=y +CONFIG_SPI=y + +CONFIG_ZMK_RGB_UNDERGLOW_ON_START=y +CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y +CONFIG_ZMK_RGB_UNDERGLOW_BRT_STEP=4 + +CONFIG_ZMK_RGB_UNDERGLOW_EFF_START=3 +CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=285 +CONFIG_ZMK_RGB_UNDERGLOW_SAT_START=75 +CONFIG_ZMK_RGB_UNDERGLOW_BRT_START=20 + +# The power LED is implemented as a backlight +CONFIG_ZMK_BACKLIGHT=y +CONFIG_ZMK_BACKLIGHT_ON_START=y +CONFIG_ZMK_BACKLIGHT_BRT_START=5 +CONFIG_ZMK_BACKLIGHT_AUTO_OFF_IDLE=y +CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB=y + +# Turn on logging, and set ZMK logging to debug output +# Only for debugging +CONFIG_ZMK_USB_LOGGING=n + +# Turn on debugging to disable optimization +CONFIG_DEBUG=n diff --git a/app/boards/moergo/glove80/glove80.keymap b/app/boards/moergo/glove80/glove80.keymap index 60129bd94e9..6806be79f97 100644 --- a/app/boards/moergo/glove80/glove80.keymap +++ b/app/boards/moergo/glove80/glove80.keymap @@ -11,10 +11,13 @@ #include #include +#define HYPER LC(LS(LG(LALT))) + // layers #define DEFAULT 0 #define LOWER 1 #define MAGIC 2 +#define FACTORY_TEST 3 / { behaviors { @@ -26,9 +29,24 @@ tapping-term-ms = <200>; bindings = <&mo LOWER>, <&to LOWER>; }; + + magic: magic_hold_tap { + compatible = "zmk,behavior-hold-tap"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <200>; + bindings = <&mo>, <&rgb_ug_status_macro>; + }; }; macros { + rgb_ug_status_macro: rgb_ug_status_macro_0 { + compatible = "zmk,behavior-macro"; + #binding-cells = <0>; + bindings + = <&rgb_ug RGB_STATUS>; + }; + bt_0: bt_profile_macro_0 { compatible = "zmk,behavior-macro"; #binding-cells = <0>; @@ -80,7 +98,7 @@ &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp GRAVE &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LCTRL &layer_td &kp LGUI &kp RCTRL &kp RSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp PG_UP - &mo MAGIC &kp HOME &kp END &kp LEFT &kp RIGHT &kp BSPC &kp DEL &kp LALT &kp RALT &kp RET &kp SPACE &kp UP &kp DOWN &kp LBKT &kp RBKT &kp PG_DN + &magic MAGIC 0 &kp HOME &kp END &kp LEFT &kp RIGHT &kp BSPC &kp DEL &kp LALT &kp RALT &kp RET &kp SPACE &kp UP &kp DOWN &kp LBKT &kp RBKT &kp PG_DN >; }; @@ -97,12 +115,23 @@ magic_layer { bindings = < - &bt BT_CLR &none &none &none &none &none &none &none &none &none + &bt BT_CLR &none &none &none &none &none &none &none &none &bt BT_CLR_ALL &none &none &none &none &none &none &none &none &none &none &none &none &none &rgb_ug RGB_SPI &rgb_ug RGB_SAI &rgb_ug RGB_HUI &rgb_ug RGB_BRI &rgb_ug RGB_TOG &none &none &none &none &none &none &bootloader &rgb_ug RGB_SPD &rgb_ug RGB_SAD &rgb_ug RGB_HUD &rgb_ug RGB_BRD &rgb_ug RGB_EFF &none &none &none &none &none &bootloader &sys_reset &none &none &none &none &none &bt_2 &bt_3 &none &none &none &none &none &none &none &none &none &sys_reset - &none &none &none &none &none &bt_0 &bt_1 &out OUT_USB &none &none &none &none &none &none &none &none + &none &none &none &none &none &bt_0 &bt_1 &out OUT_USB &none &none &none &none &none &none &none &to FACTORY_TEST + >; + }; + + factory_test_layer { + bindings = < + &kp N0 &kp N6 &kp N2 &kp N8 &kp N4 &kp N4 &kp N8 &kp N2 &kp N6 &kp N0 + &kp N1 &kp N7 &kp N3 &kp N9 &kp N5 &kp N0 &kp N0 &kp N5 &kp N9 &kp N3 &kp N7 &kp N1 + &kp N2 &kp N8 &kp N4 &kp N0 &kp N6 &kp N1 &kp N1 &kp N6 &kp N0 &kp N4 &kp N8 &kp N2 + &kp N3 &kp N9 &kp N5 &kp N1 &kp N7 &kp N2 &kp N2 &kp N7 &kp N1 &kp N5 &kp N9 &kp N3 + &kp N4 &kp N0 &kp N6 &kp N2 &kp N8 &kp N3 &kp N4 &kp N5 &kp N6 &kp N6 &kp N5 &kp N4 &kp N3 &kp N8 &kp N2 &kp N6 &kp N0 &kp N4 + &kp N5 &kp N1 &kp N7 &kp N3 &kp N9 &kp N7 &kp N8 &kp N9 &kp N9 &kp N8 &kp N7 &kp N9 &kp N3 &kp N7 &kp N1 &kp N5 >; }; }; diff --git a/app/boards/moergo/glove80/glove80_lh.dts b/app/boards/moergo/glove80/glove80_lh.dts index 2ed56688acf..f37661c68a4 100644 --- a/app/boards/moergo/glove80/glove80_lh.dts +++ b/app/boards/moergo/glove80/glove80_lh.dts @@ -17,6 +17,7 @@ zmk,underglow = &led_strip; zmk,backlight = &back_led_backlight; zmk,battery = &vbatt; + zmk,underglow-indicators = &underglow_indicators; }; back_led_backlight: pwmleds { @@ -37,6 +38,31 @@ compatible = "zmk,battery-nrf-vddh"; }; + /* + MoErgo 40 LEDs + + 34 28 22 16 10 + 35 29 23 17 11 6 + 36 30 24 18 12 7 + 37 31 25 19 13 8 + 38 32 26 20 14 9 + 39 33 27 21 15 + 0 1 2 + 3 4 5 + */ + underglow_indicators: underglow-indicators { + compatible = "zmk,underglow-indicators"; + layer-state = <35 29 23 17 11 6>; + bat-lhs = <36 30 24 18 12 7>; + bat-rhs = <37 31 25 19 13 8>; + capslock = <22>; + numlock = <16>; + scrolllock = <10>; + ble-state = <3 4 0 1>; + usb-state = <5>; + output-fallback = <15>; + }; + glove80_ext: connector { compatible = "moergo,glove80-ext"; #gpio-cells = <2>; diff --git a/app/boards/moergo/glove80/glove80_lh_defconfig b/app/boards/moergo/glove80/glove80_lh_defconfig index 37bbae37f5c..e13a24ae580 100644 --- a/app/boards/moergo/glove80/glove80_lh_defconfig +++ b/app/boards/moergo/glove80/glove80_lh_defconfig @@ -19,11 +19,25 @@ 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 @@ -49,6 +63,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 @@ -77,6 +94,10 @@ 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 + # 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_defconfig b/app/boards/moergo/glove80/glove80_rh_defconfig index d45e0ded8d3..417884718e5 100644 --- a/app/boards/moergo/glove80/glove80_rh_defconfig +++ b/app/boards/moergo/glove80/glove80_rh_defconfig @@ -1,8 +1,8 @@ # Copyright (c) 2021 The ZMK Contributors # SPDX-License-Identifier: MIT -# Enable both USB and BLE -CONFIG_ZMK_USB=y +# Enable BLE for split peripheral +CONFIG_ZMK_USB=n CONFIG_ZMK_BLE=y # Keyboard IDs @@ -17,6 +17,9 @@ CONFIG_BT_DIS_PNP_VID=0x16c0 CONFIG_BT_DIS_MANUF="MoErgo" CONFIG_BT_DIS_MODEL="Glove80 Right" +### Bluetooth configuration workarounds + +# Use higher radio transmit power CONFIG_BT_CTLR_TX_PWR_PLUS_8=y # Enable MPU @@ -44,6 +47,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 From ff41019b17eccb74aed0454302b1297ab204ee13 Mon Sep 17 00:00:00 2001 From: Chris Andreae Date: Wed, 15 Oct 2025 23:50:09 +0900 Subject: [PATCH 87/96] Add build support for snippets and snippets for touchpad sensitivity --- .../cirque-lh-sensitivity.overlay | 3 + .../cirque-lh-sensitivity-high/snippet.yml | 8 + .../cirque-lh-sensitivity.overlay | 3 + .../cirque-lh-sensitivity-low/snippet.yml | 8 + .../cirque-lh-sensitivity.overlay | 3 + .../cirque-lh-sensitivity-medium/snippet.yml | 8 + .../cirque-rh-sensitivity.overlay | 3 + .../cirque-rh-sensitivity-high/snippet.yml | 8 + .../cirque-rh-sensitivity.overlay | 3 + .../cirque-rh-sensitivity-low/snippet.yml | 8 + .../cirque-rh-sensitivity.overlay | 3 + .../cirque-rh-sensitivity-medium/snippet.yml | 8 + lambda/api_version.txt | 2 +- lambda/app.rb | 47 +-- lambda/compiler.rb | 17 +- lambda/param_parser.rb | 143 +++++++++ lambda/param_serializer.rb | 290 ++++++++++++++++++ 17 files changed, 535 insertions(+), 30 deletions(-) create mode 100644 app/snippets/cirque-lh-sensitivity-high/cirque-lh-sensitivity.overlay create mode 100644 app/snippets/cirque-lh-sensitivity-high/snippet.yml create mode 100644 app/snippets/cirque-lh-sensitivity-low/cirque-lh-sensitivity.overlay create mode 100644 app/snippets/cirque-lh-sensitivity-low/snippet.yml create mode 100644 app/snippets/cirque-lh-sensitivity-medium/cirque-lh-sensitivity.overlay create mode 100644 app/snippets/cirque-lh-sensitivity-medium/snippet.yml create mode 100644 app/snippets/cirque-rh-sensitivity-high/cirque-rh-sensitivity.overlay create mode 100644 app/snippets/cirque-rh-sensitivity-high/snippet.yml create mode 100644 app/snippets/cirque-rh-sensitivity-low/cirque-rh-sensitivity.overlay create mode 100644 app/snippets/cirque-rh-sensitivity-low/snippet.yml create mode 100644 app/snippets/cirque-rh-sensitivity-medium/cirque-rh-sensitivity.overlay create mode 100644 app/snippets/cirque-rh-sensitivity-medium/snippet.yml create mode 100644 lambda/param_parser.rb create mode 100644 lambda/param_serializer.rb diff --git a/app/snippets/cirque-lh-sensitivity-high/cirque-lh-sensitivity.overlay b/app/snippets/cirque-lh-sensitivity-high/cirque-lh-sensitivity.overlay new file mode 100644 index 00000000000..057a9d010aa --- /dev/null +++ b/app/snippets/cirque-lh-sensitivity-high/cirque-lh-sensitivity.overlay @@ -0,0 +1,3 @@ +&glidepoint { + sensitivity = "1x"; +}; diff --git a/app/snippets/cirque-lh-sensitivity-high/snippet.yml b/app/snippets/cirque-lh-sensitivity-high/snippet.yml new file mode 100644 index 00000000000..639fc6bb2ec --- /dev/null +++ b/app/snippets/cirque-lh-sensitivity-high/snippet.yml @@ -0,0 +1,8 @@ +name: cirque-lh-sensitivity-high +boards: + go60_lh: + append: + EXTRA_DTC_OVERLAY_FILE: cirque-lh-sensitivity.overlay + glove80_lh: + append: + EXTRA_DTC_OVERLAY_FILE: cirque-lh-sensitivity.overlay diff --git a/app/snippets/cirque-lh-sensitivity-low/cirque-lh-sensitivity.overlay b/app/snippets/cirque-lh-sensitivity-low/cirque-lh-sensitivity.overlay new file mode 100644 index 00000000000..6f99ed7828a --- /dev/null +++ b/app/snippets/cirque-lh-sensitivity-low/cirque-lh-sensitivity.overlay @@ -0,0 +1,3 @@ +&glidepoint { + sensitivity = "3x"; +}; diff --git a/app/snippets/cirque-lh-sensitivity-low/snippet.yml b/app/snippets/cirque-lh-sensitivity-low/snippet.yml new file mode 100644 index 00000000000..d379001fc14 --- /dev/null +++ b/app/snippets/cirque-lh-sensitivity-low/snippet.yml @@ -0,0 +1,8 @@ +name: cirque-lh-sensitivity-low +boards: + go60_lh: + append: + EXTRA_DTC_OVERLAY_FILE: cirque-lh-sensitivity.overlay + glove80_lh: + append: + EXTRA_DTC_OVERLAY_FILE: cirque-lh-sensitivity.overlay diff --git a/app/snippets/cirque-lh-sensitivity-medium/cirque-lh-sensitivity.overlay b/app/snippets/cirque-lh-sensitivity-medium/cirque-lh-sensitivity.overlay new file mode 100644 index 00000000000..53b3dd017e8 --- /dev/null +++ b/app/snippets/cirque-lh-sensitivity-medium/cirque-lh-sensitivity.overlay @@ -0,0 +1,3 @@ +&glidepoint { + sensitivity = "2x"; +}; diff --git a/app/snippets/cirque-lh-sensitivity-medium/snippet.yml b/app/snippets/cirque-lh-sensitivity-medium/snippet.yml new file mode 100644 index 00000000000..1652017fc7c --- /dev/null +++ b/app/snippets/cirque-lh-sensitivity-medium/snippet.yml @@ -0,0 +1,8 @@ +name: cirque-lh-sensitivity-medium +boards: + go60_lh: + append: + EXTRA_DTC_OVERLAY_FILE: cirque-lh-sensitivity.overlay + glove80_lh: + append: + EXTRA_DTC_OVERLAY_FILE: cirque-lh-sensitivity.overlay diff --git a/app/snippets/cirque-rh-sensitivity-high/cirque-rh-sensitivity.overlay b/app/snippets/cirque-rh-sensitivity-high/cirque-rh-sensitivity.overlay new file mode 100644 index 00000000000..057a9d010aa --- /dev/null +++ b/app/snippets/cirque-rh-sensitivity-high/cirque-rh-sensitivity.overlay @@ -0,0 +1,3 @@ +&glidepoint { + sensitivity = "1x"; +}; diff --git a/app/snippets/cirque-rh-sensitivity-high/snippet.yml b/app/snippets/cirque-rh-sensitivity-high/snippet.yml new file mode 100644 index 00000000000..5ddc9e2ff81 --- /dev/null +++ b/app/snippets/cirque-rh-sensitivity-high/snippet.yml @@ -0,0 +1,8 @@ +name: cirque-rh-sensitivity-high +boards: + go60_rh: + append: + EXTRA_DTC_OVERLAY_FILE: cirque-rh-sensitivity.overlay + glove80_rh: + append: + EXTRA_DTC_OVERLAY_FILE: cirque-rh-sensitivity.overlay diff --git a/app/snippets/cirque-rh-sensitivity-low/cirque-rh-sensitivity.overlay b/app/snippets/cirque-rh-sensitivity-low/cirque-rh-sensitivity.overlay new file mode 100644 index 00000000000..6f99ed7828a --- /dev/null +++ b/app/snippets/cirque-rh-sensitivity-low/cirque-rh-sensitivity.overlay @@ -0,0 +1,3 @@ +&glidepoint { + sensitivity = "3x"; +}; diff --git a/app/snippets/cirque-rh-sensitivity-low/snippet.yml b/app/snippets/cirque-rh-sensitivity-low/snippet.yml new file mode 100644 index 00000000000..21786f9d531 --- /dev/null +++ b/app/snippets/cirque-rh-sensitivity-low/snippet.yml @@ -0,0 +1,8 @@ +name: cirque-rh-sensitivity-low +boards: + go60_rh: + append: + EXTRA_DTC_OVERLAY_FILE: cirque-rh-sensitivity.overlay + glove80_rh: + append: + EXTRA_DTC_OVERLAY_FILE: cirque-rh-sensitivity.overlay diff --git a/app/snippets/cirque-rh-sensitivity-medium/cirque-rh-sensitivity.overlay b/app/snippets/cirque-rh-sensitivity-medium/cirque-rh-sensitivity.overlay new file mode 100644 index 00000000000..53b3dd017e8 --- /dev/null +++ b/app/snippets/cirque-rh-sensitivity-medium/cirque-rh-sensitivity.overlay @@ -0,0 +1,3 @@ +&glidepoint { + sensitivity = "2x"; +}; diff --git a/app/snippets/cirque-rh-sensitivity-medium/snippet.yml b/app/snippets/cirque-rh-sensitivity-medium/snippet.yml new file mode 100644 index 00000000000..faeca4f81cf --- /dev/null +++ b/app/snippets/cirque-rh-sensitivity-medium/snippet.yml @@ -0,0 +1,8 @@ +name: cirque-rh-sensitivity-medium +boards: + go60_rh: + append: + EXTRA_DTC_OVERLAY_FILE: cirque-rh-sensitivity.overlay + glove80_rh: + append: + EXTRA_DTC_OVERLAY_FILE: cirque-rh-sensitivity.overlay diff --git a/lambda/api_version.txt b/lambda/api_version.txt index 00750edc07d..b8626c4cff2 100644 --- a/lambda/api_version.txt +++ b/lambda/api_version.txt @@ -1 +1 @@ -3 +4 diff --git a/lambda/app.rb b/lambda/app.rb index 7318124a6ef..9da78e7a400 100644 --- a/lambda/app.rb +++ b/lambda/app.rb @@ -3,60 +3,61 @@ require 'stringio' require 'digest' require 'json' +require './param_parser' +require './param_serializer' require './compiler' module LambdaFunction # Handle a non-HTTP compile request, returning a JSON body of either the # compiled result or an error. class Handler + include ParamParser + REVISION = ENV.fetch('REVISION', 'unknown') def self.process(event:, context:) return { type: 'keep_alive' } if event.has_key?('keep_alive') - parse_base64_param = ->(param, required: true) do - if event.include?(param) - Base64.strict_decode64(event.fetch(param)) - elsif required - return error(status: 400, message: "Missing required argument: #{param}") - end - rescue ArgumentError - return error(status: 400, message: "Invalid Base64 in #{param} input") - end + self.new(event).process + end - board = event.fetch('board', 'glove80') - keymap_data = parse_base64_param.('keymap') - kconfig_data = parse_base64_param.('kconfig', required: false) + attr_reader :params + def initialize(event) + @params = event + end - # Including kconfig settings that affect the RHS require building both - # firmware images, doubling compile time. Clients should omit rhs_kconfig - # where possible. - rhs_kconfig_data = parse_base64_param.('rhs_kconfig', required: false) + def process + board = parse_param('board', with: ParamSerializer::String, default: 'glove80') + keymap_data = parse_param('keymap', with: ParamSerializer::Base64) + snippets = parse_array_param('snippets', with: ParamSerializer::String, default: []) + lhs_kconfig_data = parse_param('kconfig', with: ParamSerializer::Base64, default: nil) + rhs_kconfig_data = parse_param('rhs_kconfig', with: ParamSerializer::Base64, default: nil) result, log = begin - log_compile(board, keymap_data, kconfig_data, rhs_kconfig_data) - - Compiler.new.compile(board, keymap_data, kconfig_data, rhs_kconfig_data) + log_compile(board, keymap_data, lhs_kconfig_data, rhs_kconfig_data, snippets) + Compiler.new.compile(board, keymap_data, lhs_kconfig_data, rhs_kconfig_data, snippets) rescue Compiler::CompileError => e - return error(status: e.status, message: e.message, detail: e.log) + return error(status: e.status, message: e.message, detail: e.log, exception: e) end result = Base64.strict_encode64(result) { type: 'result', result: result, log: log, revision: REVISION } + rescue ParamParser::ParseError => e + error(status: 400, message: "Error parsing #{e.param}", detail: [e.message], exception: e) rescue StandardError => e error(status: 500, message: "Unexpected error: #{e.class}", detail: [e.message], exception: e) end - def self.log_compile(board, keymap_data, kconfig_data, rhs_kconfig_data) + def log_compile(board, keymap_data, kconfig_data, rhs_kconfig_data, snippets) keymap = Digest::SHA1.base64digest(keymap_data) kconfig = kconfig_data ? Digest::SHA1.base64digest(kconfig_data) : 'nil' rhs_kconfig = rhs_kconfig_data ? Digest::SHA1.base64digest(rhs_kconfig_data) : 'nil' - puts("Compiling with board: #{board}; keymap: #{keymap}; kconfig: #{kconfig}; rhs_kconfig: #{rhs_kconfig}") + puts("Compiling with board: #{board}; keymap: #{keymap}; kconfig: #{kconfig}; rhs_kconfig: #{rhs_kconfig}; snippets: #{snippets.inspect}") end - def self.error(status:, message:, detail: nil, exception: nil) + def error(status:, message:, detail: nil, exception: nil) reported_error = { type: 'error', status:, message:, detail:, revision: REVISION } exception_detail = { class: exception.class, backtrace: exception.backtrace } if exception diff --git a/lambda/compiler.rb b/lambda/compiler.rb index fe9e91f2a5b..dad7b6ede07 100644 --- a/lambda/compiler.rb +++ b/lambda/compiler.rb @@ -18,13 +18,13 @@ def initialize(message, status: 400, log:) end end - def compile(board, keymap_data, lhs_kconfig_data, rhs_kconfig_data) + def compile(board, keymap_data, lhs_kconfig_data, rhs_kconfig_data, snippets) board_lh = board + '_lh' board_rh = board + '_rh' - if rhs_kconfig_data && !rhs_kconfig_data.empty? - lhs_result, lhs_output = compile_board(board_lh, keymap_data:, kconfig_data: lhs_kconfig_data, include_static_rhs: false) - rhs_result, rhs_output = compile_board(board_rh, keymap_data: nil, kconfig_data: rhs_kconfig_data, include_static_rhs: false) + if rhs_kconfig_data || !snippets.empty? + lhs_result, lhs_output = compile_board(board_lh, keymap_data:, kconfig_data: lhs_kconfig_data, snippets:, include_static_rhs: false) + rhs_result, rhs_output = compile_board(board_rh, keymap_data: nil, kconfig_data: rhs_kconfig_data, snippets:, include_static_rhs: false) [ lhs_result.concat(rhs_result), ["LHS Output:", *lhs_output, "RHS Output:", *rhs_output], @@ -34,12 +34,13 @@ def compile(board, keymap_data, lhs_kconfig_data, rhs_kconfig_data) end end - def compile_board(board, keymap_data:, kconfig_data:, include_static_rhs: false) + def compile_board(board, keymap_data:, kconfig_data:, snippets: [], include_static_rhs: false) in_build_dir do compile_command = ['compileZmk', '-b', board] if keymap_data dts_parse_errors = validate_devicetree!(keymap_data) + File.open('build.keymap', 'w') { |io| io.write(keymap_data) } compile_command << '-k' << './build.keymap' end @@ -51,10 +52,14 @@ def compile_board(board, keymap_data:, kconfig_data:, include_static_rhs: false) # If requesting USB logging, include the corresponding snippet that also # enables necessary devicetree nodes if kconfig_data =~ /CONFIG_ZMK_USB_LOGGING\s*=\s*y/ - compile_command << '-s' << 'zmk-usb-logging' + snippets += ['zmk-usb-logging'] end end + unless snippets.empty? + compile_command << '-s' << snippets.uniq.join(';') + end + if include_static_rhs # Concatenate the pre-compiled glove80_rh image to the resulting uf2 compile_command << '-m' diff --git a/lambda/param_parser.rb b/lambda/param_parser.rb new file mode 100644 index 00000000000..afca34b8165 --- /dev/null +++ b/lambda/param_parser.rb @@ -0,0 +1,143 @@ +# frozen_string_literal: true + +# Copyright 2016 DMM.com LLC + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the “Software”), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +require './param_serializer' + +module ParamParser + class ParseError < RuntimeError + attr_accessor :param, :value + + def initialize(message, param, value) + super(message) + self.param = param + self.value = value + end + end + + PARAM_REQUIRED = Object.new + BLANK = Object.new + + # Parse the specified parameter, optionally deserializing with the provided + # ParamSerializer. If the parameter is missing and no default is + # provided, raises a ParseError. + # + # If `BLANK` is provided as a default, return a placeholder object that can be + # later stripped out with `remove_blanks` + # + # If `dump` is true, use the serializer to re-serialize any successfully + # parsed argument back to a canonical string. This can be useful to validate + # and normalize the input to another service without parsing it. A serializer + # must be passed to use this option. + def parse_param(param, with: nil, default: PARAM_REQUIRED, dump: false) + serializer = + case with + when String, Symbol + ParamSerializer.for!(with) + else + with + end + + parse = + if !params.has_key?(param) + raise ParseError.new("Required parameter '#{param}' missing", param, nil) if default == PARAM_REQUIRED + default + else + val = params[param] + if !serializer.nil? + begin + serializer.load(val) + rescue ParamSerializer::LoadError => ex + raise ParseError.new("Invalid parameter '#{param}': '#{val.inspect}' - #{ex.message}", param, val) + end + else + val + end + end + + if dump && parse != BLANK + begin + parse = serializer.dump(parse) + rescue NoMethodError => ex + raise ParseError.new("Serializer '#{serializer}' can't dump param '#{param}' #{val.inspect} - #{ex.message}", param, val) + end + end + + parse + end + + # Parse an array-typed param using the provided serializer for each member element. + def parse_array_param(param, with: nil, default: PARAM_REQUIRED, dump: false) + serializer = + case with + when String, Symbol + ParamSerializer.for!(with) + else + with + end + + vals = params[param] + + parses = + if vals.nil? + raise ParseError.new("Required parameter '#{param}' missing", param, nil) if default == PARAM_REQUIRED + default + elsif !vals.is_a?(Array) + raise ParseError.new("Invalid type for parameter '#{param}': '#{vals.class.name}'", param, vals) + elsif !serializer.nil? + vals.map do |val| + begin + serializer.load(val) + rescue ParamSerializer::LoadError => ex + raise ParseError.new("Invalid member in array parameter '#{param}': '#{val.inspect}' - #{ex.message}", param, val) + end + end + else + vals + end + + if dump && parses != BLANK + parses.map! { |v| serializer.dump(v) } + end + + parses + end + + # Convenience method to make it simpler to build a hash structure with + # optional members from parsed data. This method recursively traverses the + # provided structure and removes any instances of the sentinel value + # Parser::BLANK. + def remove_blanks(arg) + case arg + when Hash + arg.each do |k, v| + if v == BLANK + arg.delete(k) + else + remove_blanks(v) + end + end + when Array + arg.delete(BLANK) + arg.each { |e| remove_blanks(e) } + end + end +end diff --git a/lambda/param_serializer.rb b/lambda/param_serializer.rb new file mode 100644 index 00000000000..6042c0b5ca4 --- /dev/null +++ b/lambda/param_serializer.rb @@ -0,0 +1,290 @@ +# frozen_string_literal: true + +# Copyright 2016 DMM.com LLC + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the “Software”), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +require 'json' +require 'date' +require 'digest' + +class ParamSerializer + class LoadError < ArgumentError; end + class DumpError < ArgumentError; end + + attr_reader :clazz + + def initialize(clazz) + @clazz = clazz + end + + def dump(val, json: false) + matches_type!(val) + if json && self.class.json_value? + val + else + val.to_s + end + end + + def load(_val) + raise StandardError.new('unimplemented') + end + + def matches_type?(val) + val.is_a?(clazz) + end + + def matches_type!(val, err: DumpError) + unless matches_type?(val) + raise err.new("Incorrect type for #{self.class.name}: #{val.inspect}:#{val.class.name}") + end + true + end + + @registry = {} + class << self + def load(...) + singleton.load(...) + end + + def dump(...) + singleton.dump(...) + end + + def matches_type?(...) + singleton.matches_type?(...) + end + + def matches_type!(...) + singleton.matches_type!(...) + end + + def singleton + raise ArgumentError.new("Singleton instance not defined for abstract serializer '#{self.name}'") + end + + def json_value? + false + end + + def for(name) + @registry[name.to_s] + end + + def for!(name) + s = self.for(name) + raise ArgumentError.new("No serializer registered with name: '#{name}'") if s.nil? + s + end + + private + + def set_singleton! + instance = self.new + define_singleton_method(:singleton) { instance } + end + + def json_value! + define_singleton_method(:json_value?) { true } + end + end + + class String < ParamSerializer + def initialize + super(::String) + end + + def load(str) + matches_type!(str, err: LoadError) + str + end + + set_singleton! + json_value! + end + + class Integer < ParamSerializer + def initialize + super(::Integer) + end + + # JSON only supports floats, so we have to accept a value + # which may have already been parsed into a Ruby Float or Integer. + def load(str_or_num) + raise LoadError.new("Invalid integer: #{str_or_num}") unless [::String, ::Integer].any? { |t| str_or_num.is_a?(t) } + Integer(str_or_num) + rescue ArgumentError => e + raise LoadError.new(e.message) + end + + set_singleton! + json_value! + end + + class Float < ParamSerializer + def initialize + super(::Float) + end + + def load(str) + Float(str) + rescue TypeError, ArgumentError => _e + raise LoadError.new("Invalid type for conversion to Float") + end + + set_singleton! + json_value! + end + + class Boolean < ParamSerializer + def initialize + super(nil) + end + + def load(str) + str = str.downcase if str.is_a?(::String) + + if ['false', 'no', 'off', false, '0', 0].include?(str) + false + elsif ['true', 'yes', 'on', true, '1', 1].include?(str) + true + else + raise LoadError.new("Invalid boolean: #{str.inspect}") + end + end + + def matches_type?(val) + [true, false].include?(val) + end + + set_singleton! + json_value! + end + + class Numeric < ParamSerializer + def initialize + super(::Numeric) + end + + def load(str) + Float(str) + rescue TypeError, ArgumentError => _e + raise LoadError.new("Invalid type for conversion to Numeric") + end + + set_singleton! + json_value! + end + + # Abstract serializer for ISO8601 dates and times + class ISO8601 < ParamSerializer + def load(str) + raise TypeError.new unless str.is_a?(::String) + + clazz.parse(str) + rescue TypeError, ArgumentError => _e + raise LoadError.new("Invalid type for conversion to #{clazz}") + end + + def dump(val, json: nil) + matches_type!(val) + val.iso8601 + end + end + + class Date < ISO8601 + def initialize + super(::Date) + end + + set_singleton! + end + + class Time < ISO8601 + def initialize + super(::Time) + end + + set_singleton! + end + + class UUID < ParamSerializer::String + def load(str) + matches_type!(str, err: LoadError) + super + end + + def matches_type?(str) + super && /[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}/i.match?(str) + end + + set_singleton! + json_value! + end + + # Abstract serializer for members of a fixed set of lowercase strings, + # case-normalized on parse. + class StringEnum < ParamSerializer + def initialize(*members) + @member_set = members.map { |s| normalize(s) }.to_set.freeze + super(nil) + end + + def load(str) + val = normalize(str.to_s) + matches_type!(val, err: LoadError) + val + end + + def matches_type?(str) + str.is_a?(::String) && @member_set.include?(str) + end + + def normalize(str) + str.downcase + end + end + + class CaseSensitiveStringEnum < StringEnum + def normalize(str) + str + end + end + + class Base64 < ParamSerializer + def initialize + super(::String) + end + + def load(base64) + ::Base64.strict_decode64(base64) + rescue ArgumentError => _e + raise LoadError.new('Invalid Base64') + end + + def dump(str, json: nil) + matches_type!(str) + ::Base64.strict_encode64(str) + end + + set_singleton! + json_value! + end +end From 3d533f01e33f526ab31e396536ae4167c15de759 Mon Sep 17 00:00:00 2001 From: Chris Andreae Date: Sat, 2 Aug 2025 12:12:14 +0900 Subject: [PATCH 88/96] Add Go60 support to build infrastructure --- .github/workflows/build-container.yml | 1 + .github/workflows/nix-build.yml | 27 ++++++++++++++++++--------- release.nix | 16 ++++++++++++++++ 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build-container.yml b/.github/workflows/build-container.yml index faf379d36c6..3dd5a95c01d 100644 --- a/.github/workflows/build-container.yml +++ b/.github/workflows/build-container.yml @@ -99,6 +99,7 @@ jobs: --arg branch "$VERSION_BRANCH" \ --arg digest "$digest" \ --arg api_version "$api_version" \ + --argjson boards '["glove80", "go60"]' \ > "/tmp/$VERSION_NAME.json" - name: Upload image metadata file to versions bucket run: aws s3 cp "/tmp/$VERSION_NAME.json" "s3://$VERSIONS_BUCKET/images/$VERSION_NAME.json" diff --git a/.github/workflows/nix-build.yml b/.github/workflows/nix-build.yml index 345a6bdcf3d..d8f6d37be25 100644 --- a/.github/workflows/nix-build.yml +++ b/.github/workflows/nix-build.yml @@ -1,4 +1,4 @@ -name: Build Glove80 Firmware +name: Build Firmware on: push: @@ -20,8 +20,13 @@ on: jobs: build: - name: Build Glove80 Firmware + name: Build Firmware runs-on: ubuntu-latest + strategy: + matrix: + board: + - glove80 + - go60 steps: - uses: actions/checkout@v4 - uses: cachix/install-nix-action@v27 @@ -32,15 +37,15 @@ jobs: name: moergo-glove80-zmk-dev authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" skipPush: "${{ github.repository != 'moergo-sc/zmk' }}" - - name: Build Glove80 combined firmware - run: nix-build -A glove80_combined -o combined + - name: Build ${{ matrix.board }} combined firmware + run: nix-build -A ${{matrix.board}}_combined -o combined - name: Copy result out of nix store - run: cp combined/glove80.uf2 glove80.uf2 + run: cp combined/${{matrix.board}}.uf2 ${{matrix.board}}.uf2 - name: Upload result uses: actions/upload-artifact@v4 with: - name: glove80.uf2 - path: glove80.uf2 + name: ${{matrix.board}}.uf2 + path: ${{matrix.board}}.uf2 release: name: Create Release for Tag if: >- @@ -50,13 +55,17 @@ jobs: needs: build runs-on: ubuntu-latest steps: - - name: Download compiled firmware artifact + - name: Download Glove80 firmware artifact uses: actions/download-artifact@v4 with: name: glove80.uf2 + - name: Download Go60 firmware artifact + uses: actions/download-artifact@v4 + with: + name: go60.uf2 - name: Create Release for Tag uses: ncipollo/release-action@v1 with: - artifacts: "glove80.uf2" + artifacts: "glove80.uf2,go60.uf2" artifactErrorsFailBuild: true generateReleaseNotes: true diff --git a/release.nix b/release.nix index b1b1c39967e..8af9b5a6dfb 100644 --- a/release.nix +++ b/release.nix @@ -67,6 +67,7 @@ let }; }; zmk_glove80_rh = zmk.override { board = "glove80_rh"; }; + zmk_go60_rh = zmk.override { board = "go60_rh"; }; realpath_coreutils = if pkgs.stdenv.isDarwin then pkgs.coreutils else pkgs.busybox; in pkgs.writeShellScriptBin "compileZmk" '' set -eo pipefail @@ -122,6 +123,9 @@ let glove80_lh) merge_rhs_firmware="${zmk_glove80_rh}/zmk.uf2" ;; + go60_lh) + merge_rhs_firmware="${zmk_go60_rh}/zmk.uf2" + ;; *) echo "No pre-built RHS exists to merge with specified board '$board'" >&2 exit 2 @@ -195,6 +199,18 @@ let cd /tmp/build compileZmk -b glove80_rh -k ${zmk.src}/app/boards/arm/glove80/glove80.keymap + + rm -fr /tmp/build + mkdir /tmp/build + cd /tmp/build + + compileZmk -b go60_lh -k ${zmk.src}/app/boards/arm/go60/go60.keymap + + rm -fr /tmp/build + mkdir /tmp/build + cd /tmp/build + + compileZmk -b go60_rh -k ${zmk.src}/app/boards/arm/go60/go60.keymap ''; entrypoint = pkgs.writeShellScriptBin "entrypoint" '' From a547ce5d2ee27c6d0de656ba6c52c9d63357d99a Mon Sep 17 00:00:00 2001 From: Chris Andreae Date: Mon, 9 Dec 2024 14:54:34 +0900 Subject: [PATCH 89/96] Add Go60 board definition --- app/boards/arm/go60/CMakeLists.txt | 3 + app/boards/arm/go60/Kconfig | 8 + app/boards/arm/go60/Kconfig.board | 10 ++ app/boards/arm/go60/Kconfig.defconfig | 77 +++++++++ app/boards/arm/go60/board.cmake | 6 + app/boards/arm/go60/go60-layouts.dtsi | 74 +++++++++ app/boards/arm/go60/go60.dtsi | 111 +++++++++++++ app/boards/arm/go60/go60.keymap | 196 +++++++++++++++++++++++ app/boards/arm/go60/go60.yaml | 19 +++ app/boards/arm/go60/go60.zmk.yml | 17 ++ app/boards/arm/go60/go60_lh-pinctrl.dtsi | 66 ++++++++ app/boards/arm/go60/go60_lh.dts | 182 +++++++++++++++++++++ app/boards/arm/go60/go60_lh.keymap | 7 + app/boards/arm/go60/go60_lh_defconfig | 112 +++++++++++++ app/boards/arm/go60/go60_rh-pinctrl.dtsi | 66 ++++++++ app/boards/arm/go60/go60_rh.dts | 166 +++++++++++++++++++ app/boards/arm/go60/go60_rh.keymap | 7 + app/boards/arm/go60/go60_rh_defconfig | 92 +++++++++++ app/boards/arm/go60/pre_dt_board.cmake | 9 ++ app/boards/arm/go60/readme.md | 13 ++ app/boards/arm/go60/usb_serial_number.c | 67 ++++++++ default.nix | 10 ++ 22 files changed, 1318 insertions(+) create mode 100644 app/boards/arm/go60/CMakeLists.txt create mode 100644 app/boards/arm/go60/Kconfig create mode 100644 app/boards/arm/go60/Kconfig.board create mode 100644 app/boards/arm/go60/Kconfig.defconfig create mode 100644 app/boards/arm/go60/board.cmake create mode 100644 app/boards/arm/go60/go60-layouts.dtsi create mode 100644 app/boards/arm/go60/go60.dtsi create mode 100644 app/boards/arm/go60/go60.keymap create mode 100644 app/boards/arm/go60/go60.yaml create mode 100644 app/boards/arm/go60/go60.zmk.yml create mode 100644 app/boards/arm/go60/go60_lh-pinctrl.dtsi create mode 100644 app/boards/arm/go60/go60_lh.dts create mode 100644 app/boards/arm/go60/go60_lh.keymap create mode 100644 app/boards/arm/go60/go60_lh_defconfig create mode 100644 app/boards/arm/go60/go60_rh-pinctrl.dtsi create mode 100644 app/boards/arm/go60/go60_rh.dts create mode 100644 app/boards/arm/go60/go60_rh.keymap create mode 100644 app/boards/arm/go60/go60_rh_defconfig create mode 100644 app/boards/arm/go60/pre_dt_board.cmake create mode 100644 app/boards/arm/go60/readme.md create mode 100644 app/boards/arm/go60/usb_serial_number.c diff --git a/app/boards/arm/go60/CMakeLists.txt b/app/boards/arm/go60/CMakeLists.txt new file mode 100644 index 00000000000..3eb2cd276ea --- /dev/null +++ b/app/boards/arm/go60/CMakeLists.txt @@ -0,0 +1,3 @@ +zephyr_library() +zephyr_library_sources(usb_serial_number.c) +zephyr_library_include_directories(${ZEPHYR_BASE}/drivers) diff --git a/app/boards/arm/go60/Kconfig b/app/boards/arm/go60/Kconfig new file mode 100644 index 00000000000..c0ba7e5c526 --- /dev/null +++ b/app/boards/arm/go60/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_GO60_LH || BOARD_GO60_RH) diff --git a/app/boards/arm/go60/Kconfig.board b/app/boards/arm/go60/Kconfig.board new file mode 100644 index 00000000000..351f51b0f4b --- /dev/null +++ b/app/boards/arm/go60/Kconfig.board @@ -0,0 +1,10 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_GO60_LH + bool "Go60 LH" + depends on SOC_NRF52840_QIAA + +config BOARD_GO60_RH + bool "Go60 RH" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/go60/Kconfig.defconfig b/app/boards/arm/go60/Kconfig.defconfig new file mode 100644 index 00000000000..eb2ab28753f --- /dev/null +++ b/app/boards/arm/go60/Kconfig.defconfig @@ -0,0 +1,77 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if BOARD_GO60_LH + +config BOARD + default "go60 lh" + +config ZMK_SPLIT_ROLE_CENTRAL + default y + +endif # BOARD_GO60_LH + +if BOARD_GO60_RH + +config BOARD + default "go60 rh" + +endif # BOARD_GO60_RH + +if BOARD_GO60_LH || BOARD_GO60_RH + +config UART_0_INTERRUPT_DRIVEN + depends on !ZMK_SPLIT_WIRED_UART_MODE_ASYNC + +config ZMK_SPLIT + default y + +config ZMK_POINTING + default y + +config ZMK_POINTING_SMOOTH_SCROLLING + default n + +config ZMK_IDLE_TIMEOUT + default 120000 + +config BT_CTLR + default BT + +config ZMK_KSCAN_MATRIX_WAIT_BETWEEN_OUTPUTS + default 5 + +config PINCTRL + default y + +if USB + +config USB_NRFX + default y + +config USB_DEVICE_STACK + default y + +endif # USB + +if ZMK_BACKLIGHT + +config PWM + default y + +config LED_PWM + default y + +endif # ZMK_BACKLIGHT + +if ZMK_RGB_UNDERGLOW + +config SPI + default y + +config WS2812_STRIP + default y + +endif # ZMK_RGB_UNDERGLOW + +endif # BOARD_GO60_LH || BOARD_GO60_RH diff --git a/app/boards/arm/go60/board.cmake b/app/boards/arm/go60/board.cmake new file mode 100644 index 00000000000..ed0e07a508f --- /dev/null +++ b/app/boards/arm/go60/board.cmake @@ -0,0 +1,6 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") +include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) +include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/boards/arm/go60/go60-layouts.dtsi b/app/boards/arm/go60/go60-layouts.dtsi new file mode 100644 index 00000000000..c9f49263d9e --- /dev/null +++ b/app/boards/arm/go60/go60-layouts.dtsi @@ -0,0 +1,74 @@ +#include + +/ { + physical_layout0: physical_layout_0 { + compatible = "zmk,physical-layout"; + display-name = "Default"; + + kscan = <&kscan0>; + transform = <&matrix_transform0>; + + keys // w h x y rot rx ry + = <&key_physical_attrs 100 100 0 50 0 0 0> + , <&key_physical_attrs 100 100 100 50 0 0 0> + , <&key_physical_attrs 100 100 200 0 0 0 0> + , <&key_physical_attrs 100 100 300 0 0 0 0> + , <&key_physical_attrs 100 100 400 0 0 0 0> + , <&key_physical_attrs 100 100 500 0 0 0 0> + , <&key_physical_attrs 100 100 1150 0 0 0 0> + , <&key_physical_attrs 100 100 1250 0 0 0 0> + , <&key_physical_attrs 100 100 1350 0 0 0 0> + , <&key_physical_attrs 100 100 1450 0 0 0 0> + , <&key_physical_attrs 100 100 1550 50 0 0 0> + , <&key_physical_attrs 100 100 1650 50 0 0 0> + , <&key_physical_attrs 100 100 0 150 0 0 0> + , <&key_physical_attrs 100 100 100 150 0 0 0> + , <&key_physical_attrs 100 100 200 100 0 0 0> + , <&key_physical_attrs 100 100 300 100 0 0 0> + , <&key_physical_attrs 100 100 400 100 0 0 0> + , <&key_physical_attrs 100 100 500 100 0 0 0> + , <&key_physical_attrs 100 100 1150 100 0 0 0> + , <&key_physical_attrs 100 100 1250 100 0 0 0> + , <&key_physical_attrs 100 100 1350 100 0 0 0> + , <&key_physical_attrs 100 100 1450 100 0 0 0> + , <&key_physical_attrs 100 100 1550 150 0 0 0> + , <&key_physical_attrs 100 100 1650 150 0 0 0> + , <&key_physical_attrs 100 100 0 250 0 0 0> + , <&key_physical_attrs 100 100 100 250 0 0 0> + , <&key_physical_attrs 100 100 200 200 0 0 0> + , <&key_physical_attrs 100 100 300 200 0 0 0> + , <&key_physical_attrs 100 100 400 200 0 0 0> + , <&key_physical_attrs 100 100 500 200 0 0 0> + , <&key_physical_attrs 100 100 1150 200 0 0 0> + , <&key_physical_attrs 100 100 1250 200 0 0 0> + , <&key_physical_attrs 100 100 1350 200 0 0 0> + , <&key_physical_attrs 100 100 1450 200 0 0 0> + , <&key_physical_attrs 100 100 1550 250 0 0 0> + , <&key_physical_attrs 100 100 1650 250 0 0 0> + , <&key_physical_attrs 100 100 0 350 0 0 0> + , <&key_physical_attrs 100 100 100 350 0 0 0> + , <&key_physical_attrs 100 100 200 300 0 0 0> + , <&key_physical_attrs 100 100 300 300 0 0 0> + , <&key_physical_attrs 100 100 400 300 0 0 0> + , <&key_physical_attrs 100 100 500 300 0 0 0> + , <&key_physical_attrs 100 100 1150 300 0 0 0> + , <&key_physical_attrs 100 100 1250 300 0 0 0> + , <&key_physical_attrs 100 100 1350 300 0 0 0> + , <&key_physical_attrs 100 100 1450 300 0 0 0> + , <&key_physical_attrs 100 100 1550 350 0 0 0> + , <&key_physical_attrs 100 100 1650 350 0 0 0> + , <&key_physical_attrs 100 100 200 400 0 0 0> + , <&key_physical_attrs 100 100 300 400 0 0 0> + , <&key_physical_attrs 100 100 400 400 0 0 0> + , <&key_physical_attrs 100 100 520 410 1250 520 410> + , <&key_physical_attrs 100 100 640 440 2500 640 440> + , <&key_physical_attrs 100 100 750 495 3700 750 495> + , <&key_physical_attrs 100 100 915 550 (-3700) 915 550> + , <&key_physical_attrs 100 100 1015 480 (-2500) 1015 480> + , <&key_physical_attrs 100 100 1130 430 (-1250) 1130 430> + , <&key_physical_attrs 100 100 1250 400 0 0 0> + , <&key_physical_attrs 100 100 1350 400 0 0 0> + , <&key_physical_attrs 100 100 1450 400 0 0 0> + ; + }; +}; diff --git a/app/boards/arm/go60/go60.dtsi b/app/boards/arm/go60/go60.dtsi new file mode 100644 index 00000000000..12877602edd --- /dev/null +++ b/app/boards/arm/go60/go60.dtsi @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2021 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +/dts-v1/; +#include + +#include +#include "go60-layouts.dtsi" + +&physical_layout0 { + transform = <&matrix_transform0>; +}; + +/ { + chosen { + zmk,kscan = &kscan0; + zmk,physical-layout = &physical_layout0; + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + }; + + matrix_transform0: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <4>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) 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,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) + RC(4,2) RC(4,3) RC(4,4) RC(4,9) RC(4,10) RC(4,11) + RC(0,6) RC(1,6) RC(2,6) RC(2,7) RC(1,7) RC(0,7) + >; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + wakeup-source; + + diode-direction = "row2col"; + debounce-press-ms = <4>; + debounce-release-ms = <20>; + }; + + split_config { + compatible = "zmk,wired-split"; + device = <&uart0>; + half-duplex; + dir-gpios = <&gpio0 11 GPIO_ACTIVE_HIGH>; + detect-gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; + }; +}; + +&adc { + status = "okay"; +}; + +&gpiote { + status = "okay"; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +zephyr_udc0: &usbd { + status = "okay"; +}; + +&flash0 { + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + sd_partition: partition@0 { + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + reg = <0x00026000 0x000c6000>; + }; + + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ + + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + reg = <0x000ec000 0x00008000>; + }; + + boot_partition: partition@f4000 { + reg = <0x000f4000 0x0000c000>; + }; + }; +}; diff --git a/app/boards/arm/go60/go60.keymap b/app/boards/arm/go60/go60.keymap new file mode 100644 index 00000000000..7a921236b5d --- /dev/null +++ b/app/boards/arm/go60/go60.keymap @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +// layers +#define LAYER_Base 0 +#define LAYER_Keypad 1 +#define LAYER_SymbolNav 2 +#define LAYER_Magic 3 +#define LAYER_Factory 4 + +/ { + input_processors { + zip_click_to_right_click_mapper: zip_click_to_right_click_mapper { + compatible = "zmk,input-processor-code-mapper"; + #input-processor-cells = <0>; + type = ; + map = ; + }; + }; + + behaviors { + magic: magic { + compatible = "zmk,behavior-hold-tap"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <200>; + bindings = <&mo>, <&rgb_ug_status_macro>; + }; + + keypad_td: keypad_td { + compatible = "zmk,behavior-tap-dance"; + #binding-cells = <0>; + tapping-term-ms = <200>; + bindings = <&mo LAYER_Keypad>, <&to LAYER_Keypad>; + }; + + symbol_nav_td: symbol_nav_td { + compatible = "zmk,behavior-tap-dance"; + #binding-cells = <0>; + tapping-term-ms = <200>; + bindings = <&mo LAYER_SymbolNav>, <&to LAYER_SymbolNav>; + }; + + bt_0: bt_0 { + compatible = "zmk,behavior-tap-dance"; + #binding-cells = <0>; + tapping-term-ms = <200>; + bindings = <&bt_select_0>, <&bt BT_DISC 0>; + }; + bt_1: bt_1 { + compatible = "zmk,behavior-tap-dance"; + #binding-cells = <0>; + tapping-term-ms = <200>; + bindings = <&bt_select_1>, <&bt BT_DISC 1>; + }; + bt_2: bt_2 { + compatible = "zmk,behavior-tap-dance"; + #binding-cells = <0>; + tapping-term-ms = <200>; + bindings = <&bt_select_2>, <&bt BT_DISC 2>; + }; + bt_3: bt_3 { + compatible = "zmk,behavior-tap-dance"; + #binding-cells = <0>; + tapping-term-ms = <200>; + bindings = <&bt_select_3>, <&bt BT_DISC 3>; + }; + }; + + macros { + rgb_ug_status_macro: rgb_ug_status_macro { + compatible = "zmk,behavior-macro"; + #binding-cells = <0>; + bindings = <&rgb_ug RGB_STATUS>; + }; + + bt_select_0: bt_select_0 { + compatible = "zmk,behavior-macro"; + #binding-cells = <0>; + bindings + = <&out OUT_BLE>, + <&bt BT_SEL 0>; + }; + bt_select_1: bt_select_1 { + compatible = "zmk,behavior-macro"; + #binding-cells = <0>; + bindings + = <&out OUT_BLE>, + <&bt BT_SEL 1>; + }; + bt_select_2: bt_select_2 { + compatible = "zmk,behavior-macro"; + #binding-cells = <0>; + bindings + = <&out OUT_BLE>, + <&bt BT_SEL 2>; + }; + bt_select_3: bt_select_3 { + compatible = "zmk,behavior-macro"; + #binding-cells = <0>; + bindings + = <&out OUT_BLE>, + <&bt BT_SEL 3>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + layer_Base { + bindings = < + &kp EQUAL &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH + &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &magic LAYER_Magic 0 &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &keypad_td + &kp GRAVE &kp DEL &kp BSPC &kp LGUI &kp LBKT &kp RBKT + &symbol_nav_td &kp LSHFT &kp LCTRL &kp LALT &kp SPACE &mt RALT RET + >; + }; + + layer_Keypad { + bindings = < + &none &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 + &trans &none &kp HOME &kp UP &kp END &kp PG_UP &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp KP_MINUS &kp KP_SLASH &kp F12 + &trans &kp LC(Y) &kp LEFT &kp DOWN &kp RIGHT &kp PG_DN &kp KP_N4 &kp KP_N5 &kp KP_N6 &kp KP_PLUS &kp KP_MULTIPLY &kp KP_NUM + &magic LAYER_Magic 0 &kp LC(Z) &kp LC(X) &kp LC(C) &kp LC(V) &kp LS(LC(V)) &kp KP_N1 &kp KP_N2 &kp KP_N3 &kp KP_ENTER &kp EQUAL &to LAYER_Base + &none &trans &trans &kp KP_N0 &kp KP_DOT &kp BSPC + &mo LAYER_SymbolNav &trans &trans &trans &trans &kp KP_N0 + >; + }; + + layer_SymbolNav { + bindings = < + &kp INS &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 + &kp SLCK &kp EXCL &kp HOME &kp UP &kp END &kp PG_UP &kp LPAR &kp RPAR &kp UP &kp PRCNT &kp K_APP &kp F12 + &kp CAPS &kp AT &kp LEFT &kp DOWN &kp RIGHT &kp PG_DN &kp DLLR &kp LEFT &kp DOWN &kp RIGHT &kp PAUSE_BREAK &kp PSCRN + &magic LAYER_Magic 0 &kp HASH &kp LBKT &kp RBKT &kp LBRC &kp RBRC &kp AMPS &kp STAR &kp UNDER &kp PLUS &kp LSHFT &kp LCTRL + &kp CARET &trans &trans &trans &kp LC(LS(TAB)) &kp LC(TAB) + &to LAYER_Base &trans &trans &trans &trans &trans + >; + }; + + layer_Magic { + bindings = < + &bt BT_CLR &kp C_BRI_DN &kp C_BRI_UP &kp C_PREV &kp C_NEXT &kp C_PP &kp C_MUTE &kp C_VOL_DN &kp C_VOL_UP &none &none &bt BT_CLR_ALL + &bootloader &rgb_ug RGB_SPI &rgb_ug RGB_SAI &rgb_ug RGB_HUI &rgb_ug RGB_BRI &rgb_ug RGB_TOG &none &none &none &none &none &bootloader + &sys_reset &rgb_ug RGB_SPD &rgb_ug RGB_SAD &rgb_ug RGB_HUD &rgb_ug RGB_BRD &rgb_ug RGB_EFF &none &none &none &none &none &sys_reset + &none &none &bt_0 &bt_1 &bt_2 &bt_3 &none &none &none &none &none &to LAYER_Factory + &out OUT_USB &none &none &none &none &none + &none &none &none &none &none &none + >; + }; + + layer_Factory { + bindings = < + &kp N0 &kp N4 &kp N8 &kp N3 &kp N8 &kp N3 &kp N3 &kp N8 &kp N3 &kp N8 &kp N4 &kp N0 + &kp N1 &kp N5 &kp N9 &kp N4 &kp N9 &kp N4 &kp N4 &kp N9 &kp N4 &kp N9 &kp N5 &kp N1 + &kp N2 &kp N6 &kp N0 &kp N5 &kp N0 &kp N5 &kp N5 &kp N0 &kp N5 &kp N0 &kp N6 &kp N2 + &kp N3 &kp N7 &kp N1 &kp N6 &kp N1 &kp N6 &kp N6 &kp N1 &kp N6 &kp N1 &kp N7 &kp N3 + &kp N2 &kp N7 &kp N2 &kp N2 &kp N7 &kp N2 + &kp N7 &kp N8 &kp N9 &kp N9 &kp N8 &kp N7 + >; + }; + }; +}; + +&cirque_rh_listener { + input-processors = <&zip_xy_scaler 3 1>; + layer_2 { + layers = <2>; + input-processors = <&zip_xy_scaler 9 1>; + }; +}; + +&cirque_lh_listener { + input-processors = <&zip_xy_to_scroll_mapper>, <&zip_xy_scaler 1 8>, <&zip_click_to_right_click_mapper>; + layer_4 { + layers = <4>; + input-processors = <&zip_xy_scaler 3 1>; + }; +}; diff --git a/app/boards/arm/go60/go60.yaml b/app/boards/arm/go60/go60.yaml new file mode 100644 index 00000000000..a71c12f9168 --- /dev/null +++ b/app/boards/arm/go60/go60.yaml @@ -0,0 +1,19 @@ +identifier: go60 +name: Go60 +url: https://www.moergo.com/ +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - ble + - ieee802160 + - pwm + - watchdog + - gpio + - i2c + - spi diff --git a/app/boards/arm/go60/go60.zmk.yml b/app/boards/arm/go60/go60.zmk.yml new file mode 100644 index 00000000000..66455ab637b --- /dev/null +++ b/app/boards/arm/go60/go60.zmk.yml @@ -0,0 +1,17 @@ +file_format: "1" +id: go60 +name: Go60 +type: board +arch: arm +url: https://www.moergo.com/ +features: + - keys + - underglow + - backlight + - studio +outputs: + - usb + - ble +siblings: + - go60_lh + - go60_rh diff --git a/app/boards/arm/go60/go60_lh-pinctrl.dtsi b/app/boards/arm/go60/go60_lh-pinctrl.dtsi new file mode 100644 index 00000000000..24c289cee83 --- /dev/null +++ b/app/boards/arm/go60/go60_lh-pinctrl.dtsi @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2021 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + // SPI1 for Cirque module + spi1_default: spi1_default { + group1 { + psels = , // EXT1 + , // EXT3 + ; // EXT2 + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + // SPI3 for WS2812 backlight + spi3_default: spi3_default { + group1 { + psels = ; // WS2812_VEXT_DATA + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; + + pwm0_default: pwm0_default { + group1 { + psels = ; // rear LED + }; + }; + + pwm0_sleep: pwm0_sleep { + group1 { + psels = ; + bias-pull-down; + }; + }; + + uart0_default: uart0_default { + group1 { + psels = , // RS422_TXD + ; // RS422_RXD + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/go60/go60_lh.dts b/app/boards/arm/go60/go60_lh.dts new file mode 100644 index 00000000000..d88b2ff4308 --- /dev/null +++ b/app/boards/arm/go60/go60_lh.dts @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2021 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "go60.dtsi" +#include "go60_lh-pinctrl.dtsi" + +#include + +/ { + model = "go60_lh"; + compatible = "go60_lh"; + + chosen { + zmk,underglow = &led_strip; + zmk,backlight = &back_led_backlight; + zmk,battery = &vbatt; + zmk,underglow-indicators = &underglow_indicators; + }; + + back_led_backlight: pwmleds { + compatible = "pwm-leds"; + pwm_led_0 { + pwms = <&pwm0 0 PWM_USEC(20) PWM_POLARITY_NORMAL>; + }; + }; + + // Node name must match original "EXT_POWER" label to preserve user settings. + EXT_POWER { + compatible = "zmk,ext-power-generic"; + control-gpios = <&gpio1 11 GPIO_ACTIVE_HIGH>; /* WS2812_CE */ + init-delay-ms = <100>; + }; + + vbatt: vbatt { + compatible = "zmk,battery-nrf-vddh"; + }; + + /* + Go60 LEDs + 26 22 17 12 7 3 + 27 23 18 13 8 4 + 28 24 19 14 9 5 + 29 25 20 15 10 6 + 21 16 11 0 1 2 + */ + underglow_indicators: underglow-indicators { + compatible = "zmk,underglow-indicators"; + layer-state = <26 22 17 12 7 3>; + bat-lhs = <27 23 18 13 8 4>; + bat-rhs = <28 24 19 14 9 5>; + capslock = <0>; + numlock = <1>; + scrolllock = <2>; + output-fallback = <11>; + ble-state = <20 15 10 6>; + usb-state = <21>; + }; + + go60_ext: connector { + compatible = "moergo,go60-ext"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <1 0 &gpio0 19 0> /* EXT1 */ + , <2 0 &gpio0 21 0> /* EXT2 */ + , <3 0 &gpio0 22 0> /* EXT3 */ + , <4 0 &gpio0 23 0> /* EXT4 */ + , <5 0 &gpio0 25 0> /* EXT5 */ + ; + }; + + // Left hand Cirque + cirque_lh_listener: cirque_lh_listener { + compatible = "zmk,input-listener"; + device = <&glidepoint>; + }; + + // Right hand Cirque + inputs { + #address-cells = <1>; + #size-cells = <0>; + cirque_split: cirque_split@0 { + compatible = "zmk,input-split"; + reg = <0>; + }; + }; + + cirque_rh_listener: cirque_rh_listener { + compatible = "zmk,input-listener"; + device = <&cirque_split>; + }; +}; + +&spi1 { + status = "okay"; + + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + cs-gpios = <&go60_ext 5 GPIO_ACTIVE_LOW>; + + glidepoint: glidepoint@0 { + compatible = "cirque,pinnacle"; + reg = <0>; + spi-max-frequency = <1000000>; + status = "okay"; + dr-gpios = <&go60_ext 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>; + + sensitivity = "1x"; + rotate-90; + y-invert; + no-secondary-tap; + }; +}; + +&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 = <30>; + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +&pwm0 { + status = "okay"; + pinctrl-0 = <&pwm0_default>; + pinctrl-1 = <&pwm0_sleep>; + pinctrl-names = "default", "sleep"; +}; + +&uart0 { + status = "okay"; + compatible = "nordic,nrf-uarte"; + // Max stable speed with half duplex on nRF52 + current-speed = <921600>; + /* current-speed = <460800>; */ + /* current-speed = <230400>; */ + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; +}; + +&kscan0 { + row-gpios + = <&gpio1 1 GPIO_ACTIVE_HIGH> // LH ROW1 (KEYSCAN_OUT1) + , <&gpio1 3 GPIO_ACTIVE_HIGH> // LH ROW2 (KEYSCAN_OUT2) + , <&gpio1 5 GPIO_ACTIVE_HIGH> // LH ROW3 (KEYSCAN_OUT3) + , <&gpio1 7 GPIO_ACTIVE_HIGH> // LH ROW4 (KEYSCAN_OUT4) + , <&gpio1 6 GPIO_ACTIVE_HIGH> // LH ROW5 (KEYSCAN_OUT5) + ; + col-gpios + = <&gpio0 24 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH COL6 (KEYSCAN_IN7) + , <&gpio0 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH COL5 (KEYSCAN_IN6) + , <&gpio0 17 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH COL4 (KEYSCAN_IN5) + , <&gpio0 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH COL3 (KEYSCAN_IN4) + , <&gpio0 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH COL2 (KEYSCAN_IN3) + , <&gpio0 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH COL1 (KEYSCAN_IN2) + , <&gpio0 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH Thumb (KEYSCAN_IN1) + ; +}; diff --git a/app/boards/arm/go60/go60_lh.keymap b/app/boards/arm/go60/go60_lh.keymap new file mode 100644 index 00000000000..177b240aab9 --- /dev/null +++ b/app/boards/arm/go60/go60_lh.keymap @@ -0,0 +1,7 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "go60.keymap" diff --git a/app/boards/arm/go60/go60_lh_defconfig b/app/boards/arm/go60/go60_lh_defconfig new file mode 100644 index 00000000000..658481c82b8 --- /dev/null +++ b/app/boards/arm/go60/go60_lh_defconfig @@ -0,0 +1,112 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_GO60_LH=y + +# Enable both USB and BLE +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y + +# Keyboard IDs +CONFIG_ZMK_KEYBOARD_NAME="Go60 Left" +CONFIG_USB_DEVICE_PID=0x27db +CONFIG_USB_DEVICE_VID=0x16c0 +CONFIG_USB_DEVICE_MANUFACTURER="MoErgo" +CONFIG_USB_DEVICE_SN="moergo.com:GO60-0123456789ABCDEF" + +CONFIG_BT_DEVICE_NAME="Go60" + +CONFIG_BT_DIS_PNP_PID=0x27db +CONFIG_BT_DIS_PNP_VID=0x16c0 +CONFIG_BT_DIS_MANUF="MoErgo" +CONFIG_BT_DIS_MODEL="Go60" + +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 + +# Enable GPIO +CONFIG_GPIO=y + +# Build configurations +CONFIG_BUILD_OUTPUT_UF2=y +CONFIG_BUILD_OUTPUT_UF2_FAMILY_ID="0x9809B007" +CONFIG_USE_DT_CODE_PARTITION=y + +# Flash configuration +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +# Enable 32kHz crystal +CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y + +# Enable RGB underglow +CONFIG_ZMK_RGB_UNDERGLOW=y + +# 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=2 +CONFIG_ZMK_RGB_UNDERGLOW_BRT_MIN=2 + +# DO NOT CHANGE CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX TO ABOVE 40. Configuring +# BRT_MAX above 40% can draw more than 500mA current, which can potentially +# damage some computers. WARRANTY IS VOID IF BRT_MAX SET ABOVE 40. +CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX=40 + +CONFIG_ZMK_RGB_UNDERGLOW_EFF_START=3 +CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=285 +CONFIG_ZMK_RGB_UNDERGLOW_SAT_START=75 +CONFIG_ZMK_RGB_UNDERGLOW_BRT_START=16 + +# The power LED is implemented as a backlight +# For now, the power LED is acting as a "USB connected" indicator +CONFIG_ZMK_BACKLIGHT=y +CONFIG_ZMK_BACKLIGHT_ON_START=y +CONFIG_ZMK_BACKLIGHT_BRT_START=5 +CONFIG_ZMK_BACKLIGHT_AUTO_OFF_IDLE=y +CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB=y + +# The full two-byte consumer report space has compatibility issues with some +# operating systems, most notably macOS. Use the more basic single-byte usage +# space. +CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_BASIC=y + +# Enable USB boot protocol support +CONFIG_ZMK_USB_BOOT=y +CONFIG_ZMK_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 +# CONFIG_DEBUG_THREAD_INFO=y +# CONFIG_EXCEPTION_STACK_TRACE=y +# CONFIG_HW_STACK_PROTECTION=y +# CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_STACK_SIZE=1300 + +# Log via USB or Segger RTT +CONFIG_ZMK_USB_LOGGING=n +CONFIG_ZMK_RTT_LOGGING=n diff --git a/app/boards/arm/go60/go60_rh-pinctrl.dtsi b/app/boards/arm/go60/go60_rh-pinctrl.dtsi new file mode 100644 index 00000000000..cb7d22b6c27 --- /dev/null +++ b/app/boards/arm/go60/go60_rh-pinctrl.dtsi @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2021 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + // SPI1 for Cirque module + spi1_default: spi1_default { + group1 { + psels = , // EXT1 + , // EXT3 + ; // EXT2 + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + // SPI3 for WS2812 backlight + spi3_default: spi3_default { + group1 { + psels = ; // WS2812_VEXT_DATA + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; + + pwm0_default: pwm0_default { + group1 { + psels = ; // Rear LED + }; + }; + + pwm0_sleep: pwm0_sleep { + group1 { + psels = ; + bias-pull-down; + }; + }; + + uart0_default: uart0_default { + group1 { + psels = , // RS422_TXD + ; // RS422_RXD + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/go60/go60_rh.dts b/app/boards/arm/go60/go60_rh.dts new file mode 100644 index 00000000000..caf2a680a44 --- /dev/null +++ b/app/boards/arm/go60/go60_rh.dts @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2021 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + + +#include "go60.dtsi" +#include "go60_rh-pinctrl.dtsi" + +#include + +/ { + model = "go60_rh"; + compatible = "go60_rh"; + + chosen { + zmk,underglow = &led_strip; + zmk,backlight = &back_led_backlight; + zmk,battery = &vbatt; + }; + + back_led_backlight: pwmleds { + compatible = "pwm-leds"; + pwm_led_0 { + pwms = <&pwm0 0 PWM_USEC(20) PWM_POLARITY_NORMAL>; + }; + }; + + // Node name must match original "EXT_POWER" label to preserve user settings. + EXT_POWER { + compatible = "zmk,ext-power-generic"; + control-gpios = <&gpio1 11 GPIO_ACTIVE_HIGH>; /* WS2812_CE */ + init-delay-ms = <100>; + }; + + vbatt: vbatt { + compatible = "zmk,battery-nrf-vddh"; + }; + + go60_ext: connector { + compatible = "moergo,go60-ext"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <1 0 &gpio0 19 0> /* EXT1 */ + , <2 0 &gpio0 21 0> /* EXT2 */ + , <3 0 &gpio0 22 0> /* EXT3 */ + , <4 0 &gpio0 23 0> /* EXT4 */ + , <5 0 &gpio0 25 0> /* EXT5 */ + ; + }; + inputs { + #address-cells = <1>; + #size-cells = <0>; + cirque_split: cirque_split@0 { + compatible = "zmk,input-split"; + reg = <0>; + device = <&glidepoint>; + }; + }; + + // Disabled input listeners for the Cirques, to permit references in the keymap + cirque_lh_listener: cirque_lh_listener { + compatible = "zmk,input-listener"; + status = "disabled"; + }; + + cirque_rh_listener: cirque_rh_listener { + compatible = "zmk,input-listener"; + status = "disabled"; + }; +}; + +&spi1 { + status = "okay"; + + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + cs-gpios = <&go60_ext 5 GPIO_ACTIVE_LOW>; + + glidepoint: glidepoint@0 { + compatible = "cirque,pinnacle"; + reg = <0>; + spi-max-frequency = <1000000>; + status = "okay"; + dr-gpios = <&go60_ext 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>; + + sensitivity = "1x"; + rotate-90; + y-invert; + no-secondary-tap; + }; +}; + +&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 = <30>; + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +&pwm0 { + status = "okay"; + pinctrl-0 = <&pwm0_default>; + pinctrl-1 = <&pwm0_sleep>; + pinctrl-names = "default", "sleep"; +}; + + +&uart0 { + status = "okay"; + compatible = "nordic,nrf-uarte"; + // Max stable speed with half duplex on nRF52 + current-speed = <921600>; + /* current-speed = <460800>; */ + /* current-speed = <230400>; */ + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; +}; + +/* For right hand, the columns are offset by 7 */ +&matrix_transform0 { + col-offset = <7>; +}; + +&kscan0 { + row-gpios + = <&gpio1 1 GPIO_ACTIVE_HIGH> // LH ROW1 (KEYSCAN_OUT1) + , <&gpio1 3 GPIO_ACTIVE_HIGH> // LH ROW2 (KEYSCAN_OUT2) + , <&gpio1 5 GPIO_ACTIVE_HIGH> // LH ROW3 (KEYSCAN_OUT3) + , <&gpio1 7 GPIO_ACTIVE_HIGH> // LH ROW4 (KEYSCAN_OUT4) + , <&gpio1 6 GPIO_ACTIVE_HIGH> // LH ROW5 (KEYSCAN_OUT5) + ; + col-gpios + = <&gpio0 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH Thumb (KEYSCAN_IN1) + , <&gpio0 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH COL1 (KEYSCAN_IN2) + , <&gpio0 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH COL2 (KEYSCAN_IN3) + , <&gpio0 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH COL3 (KEYSCAN_IN4) + , <&gpio0 17 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH COL4 (KEYSCAN_IN5) + , <&gpio0 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH COL5 (KEYSCAN_IN6) + , <&gpio0 24 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH COL6 (KEYSCAN_IN7) + ; +}; diff --git a/app/boards/arm/go60/go60_rh.keymap b/app/boards/arm/go60/go60_rh.keymap new file mode 100644 index 00000000000..177b240aab9 --- /dev/null +++ b/app/boards/arm/go60/go60_rh.keymap @@ -0,0 +1,7 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "go60.keymap" diff --git a/app/boards/arm/go60/go60_rh_defconfig b/app/boards/arm/go60/go60_rh_defconfig new file mode 100644 index 00000000000..652e9dd0311 --- /dev/null +++ b/app/boards/arm/go60/go60_rh_defconfig @@ -0,0 +1,92 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_GO60_RH=y + +# Enable BLE for split peripheral +CONFIG_ZMK_USB=n +CONFIG_ZMK_BLE=y + +# Keyboard IDs +CONFIG_ZMK_KEYBOARD_NAME="Go60 Right" +CONFIG_USB_DEVICE_PID=0x27d9 +CONFIG_USB_DEVICE_VID=0x16c0 +CONFIG_USB_DEVICE_MANUFACTURER="MoErgo" +CONFIG_USB_DEVICE_SN="moergo.com:GO60-0123456789ABCDEF" + +CONFIG_BT_DIS_PNP_PID=0x27d9 +CONFIG_BT_DIS_PNP_VID=0x16c0 +CONFIG_BT_DIS_MANUF="MoErgo" +CONFIG_BT_DIS_MODEL="Go60 Right" + +CONFIG_BT_CTLR_TX_PWR_PLUS_8=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# Enable GPIO +CONFIG_GPIO=y + +# Build configurations +CONFIG_BUILD_OUTPUT_UF2=y +CONFIG_BUILD_OUTPUT_UF2_FAMILY_ID="0x980AB007" +CONFIG_USE_DT_CODE_PARTITION=y + +# Flash configuration +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +# Enable 32kHz crystal +CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y + +# Enable RGB underglow +CONFIG_ZMK_RGB_UNDERGLOW=y + +# 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=2 +CONFIG_ZMK_RGB_UNDERGLOW_BRT_MIN=2 + +# DO NOT CHANGE CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX TO ABOVE 40. Configuring +# BRT_MAX above 40% can draw more than 500mA current, which can potentially +# damage some computers. WARRANTY IS VOID IF BRT_MAX SET ABOVE 40. +CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX=40 + +CONFIG_ZMK_RGB_UNDERGLOW_EFF_START=3 +CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=285 +CONFIG_ZMK_RGB_UNDERGLOW_SAT_START=75 +CONFIG_ZMK_RGB_UNDERGLOW_BRT_START=16 + +# The power LED is implemented as a backlight +# For now, the power LED is acting as a "USB connected" indicator +CONFIG_ZMK_BACKLIGHT=y +CONFIG_ZMK_BACKLIGHT_ON_START=y +CONFIG_ZMK_BACKLIGHT_BRT_START=5 +CONFIG_ZMK_BACKLIGHT_AUTO_OFF_IDLE=y +CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB=y + +# The full two-byte consumer report space has compatibility issues with some +# operating systems, most notably macOS. Use the more basic single-byte usage +# space. +CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_BASIC=y + +# Turn on debugging to disable optimization. Debug messages can result in larger +# stacks, so enable stack protection and particularly a larger BLE peripheral stack. +# CONFIG_DEBUG=y +# CONFIG_DEBUG_THREAD_INFO=y +# CONFIG_EXCEPTION_STACK_TRACE=y +# CONFIG_HW_STACK_PROTECTION=y +# CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_STACK_SIZE=1300 + +# Log via USB or Segger RTT +CONFIG_ZMK_USB_LOGGING=n +CONFIG_ZMK_RTT_LOGGING=n diff --git a/app/boards/arm/go60/pre_dt_board.cmake b/app/boards/arm/go60/pre_dt_board.cmake new file mode 100644 index 00000000000..05b0efe5f04 --- /dev/null +++ b/app/boards/arm/go60/pre_dt_board.cmake @@ -0,0 +1,9 @@ +# +# Copyright (c) 2024 The ZMK Contributors +# SPDX-License-Identifier: MIT +# + +# Suppresses duplicate unit-address warning at build time for power, clock, acl and flash-controller +# https://docs.zephyrproject.org/latest/build/dts/intro-input-output.html + +list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled") \ No newline at end of file diff --git a/app/boards/arm/go60/readme.md b/app/boards/arm/go60/readme.md new file mode 100644 index 00000000000..8345306b97f --- /dev/null +++ b/app/boards/arm/go60/readme.md @@ -0,0 +1,13 @@ +## MoErgo Go60 + +This board definition provides ZMK support for the [MoErgo Go60](https://www.moergo.com) +keyboard. + +MoErgo additionally offers a customized version of ZMK which adds additional functionality such as +RGB status indicators, available on GitHub at [moergo-sc/zmk](https://github.com/moergo-sc/zmk). The +MoErgo customized ZMK fork is regularly updated to include the latest changes from mainline ZMK, but +will not always be completely up-to-date. MoErgo also offers an online layout configurator and +firmware builder application using the customized fork at [my.go60.com](https://my.go60.com). + +While mainline ZMK is expected to work well with Go60, MoErgo only provides support for use of +their customized fork. Likewise, the ZMK community cannot directly provide support for MoErgo's fork. diff --git a/app/boards/arm/go60/usb_serial_number.c b/app/boards/arm/go60/usb_serial_number.c new file mode 100644 index 00000000000..92a5ba7cabe --- /dev/null +++ b/app/boards/arm/go60/usb_serial_number.c @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include "usb_descriptor.h" + +#define LOG_LEVEL CONFIG_USB_DEVICE_LOG_LEVEL +#include +LOG_MODULE_DECLARE(usb_descriptor); + +int base16_encode(const uint8_t *data, int length, uint8_t *result, int bufSize); + +uint8_t *usb_update_sn_string_descriptor(void) { + /* + * nrf52840 hwinfo returns a 64-bit hardware id. Go60 uses this as a + * serial number, encoded as base16 into the last 16 characters of the + * CONFIG_USB_DEVICE_SN template. If insufficient template space is + * available, instead return the static serial number string. + */ + const uint8_t template_len = sizeof(CONFIG_USB_DEVICE_SN); + const uint8_t sn_len = 16; + + if (template_len < sn_len + 1) { + LOG_DBG("Serial number template too short"); + return CONFIG_USB_DEVICE_SN; + } + + static uint8_t serial[sizeof(CONFIG_USB_DEVICE_SN)]; + strncpy(serial, CONFIG_USB_DEVICE_SN, template_len); + + uint8_t hwid[8]; + memset(hwid, 0, sizeof(hwid)); + uint8_t hwlen = hwinfo_get_device_id(hwid, sizeof(hwid)); + + if (hwlen > 0) { + const uint8_t offset = template_len - sn_len - 1; + LOG_HEXDUMP_DBG(&hwid, sn_len, "Serial Number"); + base16_encode(hwid, hwlen, serial + offset, sn_len + 1); + } + + return serial; +} + +int base16_encode(const uint8_t *data, int length, uint8_t *result, int bufSize) { + const char hex[] = "0123456789ABCDEF"; + + int i = 0; + while (i < bufSize && i < length * 2) { + uint8_t nibble; + if (i % 2 == 0) { + nibble = data[i / 2] >> 4; + } else { + nibble = data[i / 2] & 0xF; + } + result[i] = hex[nibble]; + ++i; + } + if (i < bufSize) { + result[i] = '\0'; + } + return i; +} diff --git a/default.nix b/default.nix index 57d15753a44..78746af8e53 100644 --- a/default.nix +++ b/default.nix @@ -43,6 +43,16 @@ makeScope newScope (self: with self; { glove80_combined = combine_uf2 glove80_left glove80_right "glove80"; + go60_left = zmk.override { + board = "go60_lh"; + }; + + go60_right = zmk.override { + board = "go60_rh"; + }; + + go60_combined = combine_uf2 go60_left go60_right "go60"; + glove80_v0_left = zmk.override { board = "glove80_v0_lh"; }; From 226ae33db52667a8fbf926ee8860f18057253302 Mon Sep 17 00:00:00 2001 From: Chris Andreae Date: Sat, 10 Jan 2026 15:49:04 +0900 Subject: [PATCH 90/96] fixup! Move go60 board definition to boards/moergo --- app/boards/{arm => moergo}/go60/CMakeLists.txt | 0 app/boards/{arm => moergo}/go60/Kconfig | 0 app/boards/{arm => moergo}/go60/Kconfig.board | 0 app/boards/{arm => moergo}/go60/Kconfig.defconfig | 0 app/boards/{arm => moergo}/go60/board.cmake | 0 app/boards/{arm => moergo}/go60/go60-layouts.dtsi | 0 app/boards/{arm => moergo}/go60/go60.dtsi | 0 app/boards/{arm => moergo}/go60/go60.keymap | 0 app/boards/{arm => moergo}/go60/go60.yaml | 0 app/boards/{arm => moergo}/go60/go60.zmk.yml | 0 app/boards/{arm => moergo}/go60/go60_lh-pinctrl.dtsi | 0 app/boards/{arm => moergo}/go60/go60_lh.dts | 0 app/boards/{arm => moergo}/go60/go60_lh.keymap | 0 app/boards/{arm => moergo}/go60/go60_lh_defconfig | 0 app/boards/{arm => moergo}/go60/go60_rh-pinctrl.dtsi | 0 app/boards/{arm => moergo}/go60/go60_rh.dts | 0 app/boards/{arm => moergo}/go60/go60_rh.keymap | 0 app/boards/{arm => moergo}/go60/go60_rh_defconfig | 0 app/boards/{arm => moergo}/go60/pre_dt_board.cmake | 0 app/boards/{arm => moergo}/go60/readme.md | 0 app/boards/{arm => moergo}/go60/usb_serial_number.c | 0 21 files changed, 0 insertions(+), 0 deletions(-) rename app/boards/{arm => moergo}/go60/CMakeLists.txt (100%) rename app/boards/{arm => moergo}/go60/Kconfig (100%) rename app/boards/{arm => moergo}/go60/Kconfig.board (100%) rename app/boards/{arm => moergo}/go60/Kconfig.defconfig (100%) rename app/boards/{arm => moergo}/go60/board.cmake (100%) rename app/boards/{arm => moergo}/go60/go60-layouts.dtsi (100%) rename app/boards/{arm => moergo}/go60/go60.dtsi (100%) rename app/boards/{arm => moergo}/go60/go60.keymap (100%) rename app/boards/{arm => moergo}/go60/go60.yaml (100%) rename app/boards/{arm => moergo}/go60/go60.zmk.yml (100%) rename app/boards/{arm => moergo}/go60/go60_lh-pinctrl.dtsi (100%) rename app/boards/{arm => moergo}/go60/go60_lh.dts (100%) rename app/boards/{arm => moergo}/go60/go60_lh.keymap (100%) rename app/boards/{arm => moergo}/go60/go60_lh_defconfig (100%) rename app/boards/{arm => moergo}/go60/go60_rh-pinctrl.dtsi (100%) rename app/boards/{arm => moergo}/go60/go60_rh.dts (100%) rename app/boards/{arm => moergo}/go60/go60_rh.keymap (100%) rename app/boards/{arm => moergo}/go60/go60_rh_defconfig (100%) rename app/boards/{arm => moergo}/go60/pre_dt_board.cmake (100%) rename app/boards/{arm => moergo}/go60/readme.md (100%) rename app/boards/{arm => moergo}/go60/usb_serial_number.c (100%) diff --git a/app/boards/arm/go60/CMakeLists.txt b/app/boards/moergo/go60/CMakeLists.txt similarity index 100% rename from app/boards/arm/go60/CMakeLists.txt rename to app/boards/moergo/go60/CMakeLists.txt diff --git a/app/boards/arm/go60/Kconfig b/app/boards/moergo/go60/Kconfig similarity index 100% rename from app/boards/arm/go60/Kconfig rename to app/boards/moergo/go60/Kconfig diff --git a/app/boards/arm/go60/Kconfig.board b/app/boards/moergo/go60/Kconfig.board similarity index 100% rename from app/boards/arm/go60/Kconfig.board rename to app/boards/moergo/go60/Kconfig.board diff --git a/app/boards/arm/go60/Kconfig.defconfig b/app/boards/moergo/go60/Kconfig.defconfig similarity index 100% rename from app/boards/arm/go60/Kconfig.defconfig rename to app/boards/moergo/go60/Kconfig.defconfig diff --git a/app/boards/arm/go60/board.cmake b/app/boards/moergo/go60/board.cmake similarity index 100% rename from app/boards/arm/go60/board.cmake rename to app/boards/moergo/go60/board.cmake diff --git a/app/boards/arm/go60/go60-layouts.dtsi b/app/boards/moergo/go60/go60-layouts.dtsi similarity index 100% rename from app/boards/arm/go60/go60-layouts.dtsi rename to app/boards/moergo/go60/go60-layouts.dtsi diff --git a/app/boards/arm/go60/go60.dtsi b/app/boards/moergo/go60/go60.dtsi similarity index 100% rename from app/boards/arm/go60/go60.dtsi rename to app/boards/moergo/go60/go60.dtsi diff --git a/app/boards/arm/go60/go60.keymap b/app/boards/moergo/go60/go60.keymap similarity index 100% rename from app/boards/arm/go60/go60.keymap rename to app/boards/moergo/go60/go60.keymap diff --git a/app/boards/arm/go60/go60.yaml b/app/boards/moergo/go60/go60.yaml similarity index 100% rename from app/boards/arm/go60/go60.yaml rename to app/boards/moergo/go60/go60.yaml diff --git a/app/boards/arm/go60/go60.zmk.yml b/app/boards/moergo/go60/go60.zmk.yml similarity index 100% rename from app/boards/arm/go60/go60.zmk.yml rename to app/boards/moergo/go60/go60.zmk.yml diff --git a/app/boards/arm/go60/go60_lh-pinctrl.dtsi b/app/boards/moergo/go60/go60_lh-pinctrl.dtsi similarity index 100% rename from app/boards/arm/go60/go60_lh-pinctrl.dtsi rename to app/boards/moergo/go60/go60_lh-pinctrl.dtsi diff --git a/app/boards/arm/go60/go60_lh.dts b/app/boards/moergo/go60/go60_lh.dts similarity index 100% rename from app/boards/arm/go60/go60_lh.dts rename to app/boards/moergo/go60/go60_lh.dts diff --git a/app/boards/arm/go60/go60_lh.keymap b/app/boards/moergo/go60/go60_lh.keymap similarity index 100% rename from app/boards/arm/go60/go60_lh.keymap rename to app/boards/moergo/go60/go60_lh.keymap diff --git a/app/boards/arm/go60/go60_lh_defconfig b/app/boards/moergo/go60/go60_lh_defconfig similarity index 100% rename from app/boards/arm/go60/go60_lh_defconfig rename to app/boards/moergo/go60/go60_lh_defconfig diff --git a/app/boards/arm/go60/go60_rh-pinctrl.dtsi b/app/boards/moergo/go60/go60_rh-pinctrl.dtsi similarity index 100% rename from app/boards/arm/go60/go60_rh-pinctrl.dtsi rename to app/boards/moergo/go60/go60_rh-pinctrl.dtsi diff --git a/app/boards/arm/go60/go60_rh.dts b/app/boards/moergo/go60/go60_rh.dts similarity index 100% rename from app/boards/arm/go60/go60_rh.dts rename to app/boards/moergo/go60/go60_rh.dts diff --git a/app/boards/arm/go60/go60_rh.keymap b/app/boards/moergo/go60/go60_rh.keymap similarity index 100% rename from app/boards/arm/go60/go60_rh.keymap rename to app/boards/moergo/go60/go60_rh.keymap diff --git a/app/boards/arm/go60/go60_rh_defconfig b/app/boards/moergo/go60/go60_rh_defconfig similarity index 100% rename from app/boards/arm/go60/go60_rh_defconfig rename to app/boards/moergo/go60/go60_rh_defconfig diff --git a/app/boards/arm/go60/pre_dt_board.cmake b/app/boards/moergo/go60/pre_dt_board.cmake similarity index 100% rename from app/boards/arm/go60/pre_dt_board.cmake rename to app/boards/moergo/go60/pre_dt_board.cmake diff --git a/app/boards/arm/go60/readme.md b/app/boards/moergo/go60/readme.md similarity index 100% rename from app/boards/arm/go60/readme.md rename to app/boards/moergo/go60/readme.md diff --git a/app/boards/arm/go60/usb_serial_number.c b/app/boards/moergo/go60/usb_serial_number.c similarity index 100% rename from app/boards/arm/go60/usb_serial_number.c rename to app/boards/moergo/go60/usb_serial_number.c From 8c2633f5d6ff02b7a484de8811bfce226f718ce4 Mon Sep 17 00:00:00 2001 From: Chris Andreae Date: Sat, 10 Jan 2026 15:58:17 +0900 Subject: [PATCH 91/96] fixup! update nix manifest pin from west --- nix/manifest.json | 264 +++++++++++++++---------- nix/update-manifest/update-manifest.sh | 2 +- 2 files changed, 164 insertions(+), 102 deletions(-) diff --git a/nix/manifest.json b/nix/manifest.json index ff34a73ba71..3bb691d2e28 100644 --- a/nix/manifest.json +++ b/nix/manifest.json @@ -2,17 +2,25 @@ { "name": "zephyr", "url": "https://github.com/zmkfirmware/zephyr", - "revision": "f742ae36021571445b199a6b3c2cb3a6e3193833", + "revision": "ec36516990d40355238db3049bc1709191f99b4e", "clone-depth": 1, "west-commands": "scripts/west-commands.yml", - "sha256": "0865rc77lvyvgipgpfcy7yfc7yv0y78ag2mlszli0rgxxp8fl54v" + "sha256": "11y7dss08h29kk0zdjp718dhbz4vr1w5n4l2ki1cb47nghhi1fd8" }, { - "name": "nanopb", - "url": "https://github.com/zmkfirmware/nanopb", - "revision": "8c60555d6277a0360c876bd85d491fc4fb0cd74a", - "path": "modules/lib/nanopb", - "sha256": "1w77q47cvhg7xmfzbws4w2pn1zr74vh9lyzj0cf1p8gz0n2l3q1g" + "name": "hal_stm32", + "url": "https://github.com/zmkfirmware/hal_stm32", + "revision": "4fcc3a3f32abe1c4cb76d9d1cef967728dd03908", + "path": "modules/hal/stm32", + "groups": ["hal"], + "sha256": "0l0m69bz6m0d5b4bsc5w4ibpq763fhggdx3ff8fp0pmf4dvmvmdh" + }, + { + "name": "lvgl", + "url": "https://github.com/zmkfirmware/lvgl", + "revision": "f1db87ee98f1810328a8419572fa42a3b5f352ae", + "path": "modules/lib/gui/lvgl", + "sha256": "0cqbjjwz6xxj8xvlvh01cs1l95d2j5zhadrqdkad5wnrs4n11hp1" }, { "name": "zmk-studio-messages", @@ -27,6 +35,14 @@ "revision": "0de55f36bc720b5be3d8880dc856d4d78baf5214", "sha256": "1a2sngqmlk266x8lsjvr3wm3kv3fxn9885sx8sk3zskbvz3g5998" }, + { + "name": "canopennode", + "url": "https://github.com/zephyrproject-rtos/canopennode", + "revision": "dec12fa3f0d790cafa8414a4c2930ea71ab72ffd", + "path": "modules/lib/canopennode", + "groups": ["optional"], + "sha256": "0x6l56q5zdrz78iarfwxiwc05wwq4krg9xhx1z8kjarkwf6q9f85" + }, { "name": "chre", "url": "https://github.com/zephyrproject-rtos/chre", @@ -38,102 +54,126 @@ { "name": "lz4", "url": "https://github.com/zephyrproject-rtos/lz4", - "revision": "8e303c264fc21c2116dc612658003a22e933124d", + "revision": "11b8a1e22fa651b524494e55d22b69d3d9cebcfd", "path": "modules/lib/lz4", "groups": ["optional"], - "sha256": "1kqs7gxg17gvws01rir8p6gmzp54y12s1898lflhsb418122v8nf" + "sha256": "157b7xiz3nb6cv3fps5kikjnccz1xxz6imh2hprigz61pr8qkzp8" + }, + { + "name": "nanopb", + "url": "https://github.com/zephyrproject-rtos/nanopb", + "revision": "7307ce399b81ddcb3c3a5dc862c52d4754328d38", + "path": "modules/lib/nanopb", + "groups": ["optional"], + "sha256": "15mr6rkfzqslxb16x71izbinmpg0k9d15d7gpj7q8z32zpdalkmz" }, { "name": "psa-arch-tests", "url": "https://github.com/zephyrproject-rtos/psa-arch-tests", - "revision": "6a17330e0dfb5f319730f974d5b05f7b7f04757b", + "revision": "2cadb02a72eacda7042505dcbdd492371e8ce024", "path": "modules/tee/tf-m/psa-arch-tests", "groups": ["optional"], - "sha256": "0dmqfi1364arj5izbyyyc0031qrb3jg89s6rm918bfzb18p8sg18" + "sha256": "1bsnv5krnvlq7c9y2crqagyxs6ziiha8wl6i8d3w6apdhqn6m2m1" }, { "name": "tf-m-tests", "url": "https://github.com/zephyrproject-rtos/tf-m-tests", - "revision": "a878426da78fbd1486dfc29d6c6b82be4ee79e72", + "revision": "502ea90105ee18f20c78f710e2ba2ded0fc0756e", "path": "modules/tee/tf-m/tf-m-tests", "groups": ["optional"], - "sha256": "13lrvx1vkwynxrf1dk3qcyziddhxsqkzich638khv1hmvb3i8bsf" + "sha256": "0kshzi8gd2f83h6a4jzpp9xcjla30hv1lpccpxc16mbczd0kmrxd" + }, + { + "name": "zephyr-lang-rust", + "url": "https://github.com/zephyrproject-rtos/zephyr-lang-rust", + "revision": "37dc7fac3fb0372bc0e78e022bef87fcce68c48d", + "path": "modules/lang/rust", + "groups": ["optional"], + "sha256": "1w1wqypzf2fz9q6yngdamfay2l4zbhzb2sacbc10i45sdlvg2q4b" }, { "name": "zscilib", "url": "https://github.com/zephyrproject-rtos/zscilib", - "revision": "34c3432e81085bb717e4871d21ca419ae0058ec5", + "revision": "ee1b287d9dd07208d2cc52284240ac25bb66eae3", "path": "modules/lib/zscilib", "groups": ["optional"], - "sha256": "1i0vp1zcak8c6040pcc48wbpgz3k36ay3w71438v36g86262wf4f" + "sha256": "1yx2mm982v9zawkxyj9h5l8pnik21djn9h9y7mz6n4hqz8bz74q7" }, { "name": "acpica", "url": "https://github.com/zephyrproject-rtos/acpica", - "revision": "0333c2af13179f9b33d495cf7cb9a509f751cbb1", + "revision": "8d24867bc9c9d81c81eeac59391cda59333affd4", "path": "modules/lib/acpica", - "sha256": "04864is6iisjfasvlwgfsmgnlihdg43cfcc3hpqkzb446x2ix4iw" - }, - { - "name": "canopennode", - "url": "https://github.com/zephyrproject-rtos/canopennode", - "revision": "dec12fa3f0d790cafa8414a4c2930ea71ab72ffd", - "path": "modules/lib/canopennode", - "sha256": "0x6l56q5zdrz78iarfwxiwc05wwq4krg9xhx1z8kjarkwf6q9f85" + "sha256": "12nqkxm5di9rpmqj1z40b6qmim6pm43invzkdy3sa3isvix3n08g" }, { "name": "cmsis", "url": "https://github.com/zephyrproject-rtos/cmsis", - "revision": "5a00331455dd74e31e80efa383a489faea0590e3", + "revision": "d1b8b20b6278615b00e136374540eb1c00dcabe7", "path": "modules/hal/cmsis", "groups": ["hal"], - "sha256": "00zqyin7bn6jwp7kq51dfs7sinwj5dhx4s981gdm171mmx7rx06n" + "sha256": "025r5v4545gbbkawd7w09hzqjs3zjfq98ykq81d3xx0b1jx3lmz3" }, { "name": "cmsis-dsp", "url": "https://github.com/zephyrproject-rtos/cmsis-dsp", - "revision": "ff7b5fd1ea5f094665c090c343ec44e74dc0b193", + "revision": "d80a49b2bb186317dc1db4ac88da49c0ab77e6e7", "path": "modules/lib/cmsis-dsp", - "sha256": "0ycznb30fmh35sz3gsg3gzdh9shk8ad90k4849lmx21jzxr6jrai" + "sha256": "020y3d2zwhj8riikdpn2dakc7glybwa7hryk3329ba6745gh3p7g" }, { "name": "cmsis-nn", "url": "https://github.com/zephyrproject-rtos/cmsis-nn", - "revision": "0c8669d81381ccf3b1a01d699f3b68b50134a99f", + "revision": "e9328d612ea3ea7d0d210d3ac16ea8667c01abdd", "path": "modules/lib/cmsis-nn", - "sha256": "1bnlyklzlhjrx8b66y6fy9im9wipx4shkq3mla5k7iw7kn3kqs7z" + "sha256": "0a8js052ikl2m870z026iwmisza0nx4bkaiy0mip02i54vqzjgvc" + }, + { + "name": "cmsis_6", + "url": "https://github.com/zephyrproject-rtos/CMSIS_6", + "revision": "783317a3072554acbac86cca2ff24928cbf98d30", + "path": "modules/lib/cmsis_6", + "sha256": "112rzsz08sqzas76wj9s3frigjyhbfq2ng1nrqqfygd4gzh3q61h" }, { "name": "fatfs", "url": "https://github.com/zephyrproject-rtos/fatfs", - "revision": "427159bf95ea49b7680facffaa29ad506b42709b", + "revision": "16245c7c41d2b79e74984f49b5202551786b8a9b", "path": "modules/fs/fatfs", "groups": ["fs"], - "sha256": "1pj6ik1bdyn07zsm0006n818mjzpbhhpsca4cw5imw66mhjy2pg6" + "sha256": "163k9y83k5v16vmpcms50094s2jmyaphahkamh6g3nbjxc9zcym4" + }, + { + "name": "hal_adi", + "url": "https://github.com/zephyrproject-rtos/hal_adi", + "revision": "633fcecf3717aaa22079cf6121627a879f24df51", + "path": "modules/hal/adi", + "groups": ["hal"], + "sha256": "1l697dp4r84n3idd2zg6mwcpghabh0myd4dggij3jzpj27xndbrl" }, { "name": "hal_ambiq", "url": "https://github.com/zephyrproject-rtos/hal_ambiq", - "revision": "0a7c99325aa73a1ef777501da91c2c6608661e56", + "revision": "87a188b91aca22ce3ce7deb4a1cbf7780d784673", "path": "modules/hal/ambiq", "groups": ["hal"], - "sha256": "1s1xv746p7c1ccyp2j1b36hrm9pp7dlpb8v4fclpd6wl3jcdjj74" + "sha256": "0b1w1lkprkfkdw5jky833gm3g0p1qv27j2hgjhshzmrvxyd80y44" }, { "name": "hal_atmel", "url": "https://github.com/zephyrproject-rtos/hal_atmel", - "revision": "5ab43007eda3f380c125f957f03638d2e8d1144d", + "revision": "da767444cce3c1d9ccd6b8a35fd7c67dc82d489c", "path": "modules/hal/atmel", "groups": ["hal"], - "sha256": "0csnr0npgfraf4g11dn4f77ywm2qd80y65a12kx68f7bfm8flf9j" + "sha256": "0aj4f1x13vnl1ylpbp1gi6d0rdgcxnmmnbky9m95mq01x03xmd91" }, { "name": "hal_ethos_u", "url": "https://github.com/zephyrproject-rtos/hal_ethos_u", - "revision": "90ada2ea5681b2a2722a10d2898eac34c2510791", + "revision": "50ddffca1cc700112f25ad9bc077915a0355ee5d", "path": "modules/hal/ethos_u", "groups": ["hal"], - "sha256": "12nv46xhi8v6k36l7qgmlsp58vc1d0zw5wqizv30acj5si2bz3y3" + "sha256": "1vf7xbagnlfw5j0p0mmk4kamp141md6kr4bfsci976c9n53rp7zq" }, { "name": "hal_gigadevice", @@ -146,186 +186,208 @@ { "name": "hal_intel", "url": "https://github.com/zephyrproject-rtos/hal_intel", - "revision": "b3b43d4e3da7ba483611bbbea7ef8af92c69df31", + "revision": "0355bb816263c54eed23c7781034447af5d8200c", "path": "modules/hal/intel", "groups": ["hal"], - "sha256": "1m2d0vwa2iip80rfzip8av41lga2p8zm0gzxhd6x11b3lq05vkb2" + "sha256": "1dp8s3x7cnkywg3rlvaxq7zk0h7918v52w23bdhn1w96sjqflvy8" }, { "name": "hal_nordic", "url": "https://github.com/zephyrproject-rtos/hal_nordic", - "revision": "884c4d61746bc35fbd379c169fc87ddb56c6461d", + "revision": "37ca068d7b013fb65a2acc9306bffa48a3e72839", "path": "modules/hal/nordic", "groups": ["hal"], - "sha256": "1m17n858c03krmc45v13r9c4b73lmx8dag1sch4vy4szs07c5a1g" + "sha256": "0p0yfifvdgb8qyb3cjlawhvlahynfgsfkzp4lin8nnvxn6rj36nq" }, { "name": "hal_nuvoton", "url": "https://github.com/zephyrproject-rtos/hal_nuvoton", - "revision": "3e0a4c4d3328b2f72b164219add19d5308b53cb5", + "revision": "466c3eed9c98453fb23953bf0e0427fea01924be", "path": "modules/hal/nuvoton", "groups": ["hal"], - "sha256": "1xc1cr4c0d0zzmbdrfb7xr8zzq0aifki1l50wcrn9dsi9c1ww12g" + "sha256": "0mjb18s4qxpw1b1k4ispigb6ncxwa5wn4kwmran2ajidjph88gyi" }, { "name": "hal_quicklogic", "url": "https://github.com/zephyrproject-rtos/hal_quicklogic", - "revision": "b3a66fe6d04d87fd1533a5c8de51d0599fcd08d0", + "revision": "bad894440fe72c814864798c8e3a76d13edffb6c", "path": "modules/hal/quicklogic", "groups": ["hal"], - "sha256": "0hk1x72kibaw3xkspy9822vh28ax3bk11b80qn8l4dwrm0wx34sy" + "sha256": "0d7rnmfymvj3jy32105nv75z9lq1jn8bgqlyf1gb9kwa5x4v4mqh" }, { "name": "hal_renesas", "url": "https://github.com/zephyrproject-rtos/hal_renesas", - "revision": "a6cf2af9140e014fbbc48d2b6deb802231dd369f", + "revision": "3204903bdc5eda6869a40363560a69369c8d0e22", "path": "modules/hal/renesas", "groups": ["hal"], - "sha256": "000dmd1z72n9blw1pdjskkpz978k3pa6fzg60lhcaj9y24kl9y6z" + "sha256": "0scgfzx4xwqf6jx02xmphwkwmm1rb04i1245hc7dj6hdwq60vxbw" }, { - "name": "hal_rpi_pico", - "url": "https://github.com/zephyrproject-rtos/hal_rpi_pico", - "revision": "fba7162cc7bee06d0149622bbcaac4e41062d368", - "path": "modules/hal/rpi_pico", + "name": "hal_silabs", + "url": "https://github.com/zephyrproject-rtos/hal_silabs", + "revision": "8a173e9e566a396a19d18da4661cb54ce098f268", + "path": "modules/hal/silabs", "groups": ["hal"], - "sha256": "01q3rf427vvfl0hn3af84hmb3g78dnd8n6saddy7mljha0z0dzda" + "sha256": "0vxxy1kz5d7yd15pdv23xx34jbm6nw2ijn0w4glakpfz1aq8ahlc" }, { - "name": "hal_stm32", - "url": "https://github.com/zephyrproject-rtos/hal_stm32", - "revision": "89ef0a3383edebf661073073bcdf6e2836fe90ee", - "path": "modules/hal/stm32", + "name": "hal_tdk", + "url": "https://github.com/zephyrproject-rtos/hal_tdk", + "revision": "6727477af1e46fa43878102489b9672a9d24e39f", + "path": "modules/hal/tdk", "groups": ["hal"], - "sha256": "0z7q5xg1rn9c3anjvi2kl0hgik3y3r25svwf97w1cjhjx1rhqmpv" + "sha256": "13cdsjp46nls9gddach3q0yxz8i1h7mj7wd7k33gf57xc3sqr7sl" }, { "name": "hal_telink", "url": "https://github.com/zephyrproject-rtos/hal_telink", - "revision": "38573af589173259801ae6c2b34b7d4c9e626746", + "revision": "4226c7fc17d5a34e557d026d428fc766191a0800", "path": "modules/hal/telink", "groups": ["hal"], - "sha256": "16lzqnzwl2ij0jvbg9x1cgh54kv76dbmpcn4xhd5m4wph3yix78z" + "sha256": "0qjy385vp55k4yx5mig0d3dni50vh84pfzxgyv4xl53r7yv8q4s0" + }, + { + "name": "hal_wch", + "url": "https://github.com/zephyrproject-rtos/hal_wch", + "revision": "1de9d3e406726702ce7cfc504509a02ecc463554", + "path": "modules/hal/wch", + "groups": ["hal"], + "sha256": "18jh6yva1qj9pbk1kn9gax4jcaq0ss53hxh255nirk7sprlhyzhi" }, { "name": "hal_wurthelektronik", "url": "https://github.com/zephyrproject-rtos/hal_wurthelektronik", - "revision": "24ca9873c3d608fad1fea0431836bc8f144c132e", + "revision": "e3e2797b224fc48fdef1bc3e5a12a7c73108bba2", "path": "modules/hal/wurthelektronik", "groups": ["hal"], - "sha256": "0s2b3j40b7qd85np46n4vh0zjmwymnpxd8r42nhss6xznn11g2h8" + "sha256": "1c3ka9fwlxb8xfnkr3060pc2vswy392bspdqax3dppla69mz3zsx" }, { - "name": "libmetal", - "url": "https://github.com/zephyrproject-rtos/libmetal", - "revision": "b91611a6f47dd29fb24c46e5621e797557f80ec6", - "path": "modules/hal/libmetal", - "groups": ["hal"], - "sha256": "0pj0g6zaxiylpdiizf03jil4q2sq1z9px7cfxlv95ddnbv6rjjcz" + "name": "hostap", + "url": "https://github.com/zephyrproject-rtos/hostap", + "revision": "697fd2cf5cbbd0c5375fc34761b6a9d7489a67d2", + "path": "modules/lib/hostap", + "sha256": "06i5f2j8nsngcz1qyy37a0wlpd8zbq7frjspd9vya186dp98ahg8" }, { "name": "liblc3", "url": "https://github.com/zephyrproject-rtos/liblc3", - "revision": "448f3de31f49a838988a162ef1e23a89ddf2d2ed", + "revision": "48bbd3eacd36e99a57317a0a4867002e0b09e183", "path": "modules/lib/liblc3", - "sha256": "07r923k1y05sq1sl9740z33cz64pqm2n7x8rr2ws460fij64aixp" + "sha256": "03xd912k4szgph1l526s3lz7pj7dsslc5vykzlhx5klqrzms6srr" + }, + { + "name": "libmctp", + "url": "https://github.com/zephyrproject-rtos/libmctp", + "revision": "b97860e78998551af99931ece149eeffc538bdb1", + "path": "modules/lib/libmctp", + "sha256": "148psbbdm2hh4ygbsymc74ij4wgk4am8xhk4g8rkdi007w861bdf" + }, + { + "name": "libmetal", + "url": "https://github.com/zephyrproject-rtos/libmetal", + "revision": "3e8781aae9d7285203118c05bc01d4eb0ca565a7", + "path": "modules/hal/libmetal", + "groups": ["hal"], + "sha256": "0c533ajm371ldgxi26iwsb7dk1s3y2wfblms3156mk0m6yqkwp8i" }, { "name": "littlefs", "url": "https://github.com/zephyrproject-rtos/littlefs", - "revision": "ca583fd297ceb48bced3c2548600dc615d67af24", + "revision": "ed0531d59ee37f5fb2762bcf2fc8ba4efaf82656", "path": "modules/fs/littlefs", "groups": ["fs"], - "sha256": "10xpjrnp5n1j1xbay2qwmg2w314fw9pgzv3kz1mn3pgadhckfgdn" - }, - { - "name": "lvgl", - "url": "https://github.com/zephyrproject-rtos/lvgl", - "revision": "8a6a2d1d29d17d1e4bdc94c243c146a39d635fdd", - "path": "modules/lib/gui/lvgl", - "sha256": "0rsmlh358f4g2yidak916pxhkgckfrnck2a5hcsh9larsdnsnf24" + "sha256": "14k0qy9y9q02ixdhfwqqfpd3r2mkminxmkqpx491frb9mc1ypm50" }, { "name": "mbedtls", "url": "https://github.com/zephyrproject-rtos/mbedtls", - "revision": "c38dc78d9a8dcbe43b898cc1171ab33ba3e6fc26", + "revision": "4952e1328529ee549d412b498ea71c54f30aa3b1", "path": "modules/crypto/mbedtls", "groups": ["crypto"], - "sha256": "0661myy0wjz38nypbyfw51x10mzg57syb5c28irblgjm2w25wbi7" + "sha256": "1l51xyldrhfviq9imqkaglnmn6w8g9zkrm6mn5h0m7dcgkz68z52" }, { "name": "mipi-sys-t", "url": "https://github.com/zephyrproject-rtos/mipi-sys-t", - "revision": "a819419603a2dfcb47f7f39092e1bc112e45d1ef", + "revision": "33e5c23cbedda5ba12dbe50c4baefb362a791001", "path": "modules/debug/mipi-sys-t", "groups": ["debug"], - "sha256": "1ba0h4p3n0ldk5pjilj7z2i62b09vjq6ma668rqpr3w2hrg6941v" + "sha256": "10l7r0qhx8nnp656s1gfx976vsz7zc2a4mli3afiq358yqa9zjin" }, { "name": "nrf_hw_models", "url": "https://github.com/zephyrproject-rtos/nrf_hw_models", - "revision": "f4595802d32d103718bf50b3d390b7a450895843", + "revision": "73a5d5827a94820be65b7d276d28173ec10bab9f", "path": "modules/bsim_hw_models/nrf_hw_models", - "sha256": "04p6nfyrv38vq0dhdz0g11zqlrqhw43lydyyr06vlrijm0zja8p5" + "sha256": "1h0xyljyalm9qzzc8wr3yfinj57bzkphm3fj3msidg0kkl9h70af" + }, + { + "name": "nrf_wifi", + "url": "https://github.com/zephyrproject-rtos/nrf_wifi", + "revision": "e35f707a782b7c4c0eb83a3b06ca4e6eb693f29f", + "path": "modules/lib/nrf_wifi", + "sha256": "1bgpc00bq8zxywc4jwv4f9czm91x7nqsi9zb7jchrvbrp2wpkdy7" }, { "name": "open-amp", "url": "https://github.com/zephyrproject-rtos/open-amp", - "revision": "42b7c577714b8f22ce82a901e19c1814af4609a8", + "revision": "52bb1783521c62c019451cee9b05b8eda9d7425f", "path": "modules/lib/open-amp", - "sha256": "0ch1iv4c3v3zx1l2clm4mawyd83kvxl3b5sd6m7r2sn6wpr456w9" + "sha256": "0wig2x0cky2w28flqhiikd9qyx5ci0z3ycihssh2r0a7m6y3lhhx" }, { "name": "percepio", "url": "https://github.com/zephyrproject-rtos/percepio", - "revision": "a3728efccc47dd372f40e6313589ca4c5cc7d5e9", + "revision": "49e6dc202aa38c2a3edbafcc2dab85dec6aee973", "path": "modules/debug/percepio", "groups": ["debug"], - "sha256": "0fhz6jwsni7s79p5pwmynxn4yzrr40yd8m51y20d8jf1ka6dh4gw" + "sha256": "0qr4lwykb9mzcaghhsvrk4i7jmfk1n6lcazb0p3xvhwdv65i4clq" }, { "name": "picolibc", "url": "https://github.com/zephyrproject-rtos/picolibc", - "revision": "d07c38ff051386f8e09a143ea0a6c1d6d66dd1d8", + "revision": "82d62ed1ac55b4e34a12d0390aced2dc9af13fc9", "path": "modules/lib/picolibc", - "sha256": "1pb4piwyib1mmqjyycq8xanvx9aps6mz4w2ijgrn1fjgfh5f7zpq" + "sha256": "14s775xjy82497y954k3778wil22h61s5n623nrgrz4l3jiwjr6v" }, { "name": "segger", "url": "https://github.com/zephyrproject-rtos/segger", - "revision": "9d0191285956cef43daf411edc2f1a7788346def", + "revision": "cf56b1d9c80f81a26e2ac5727c9cf177116a4692", "path": "modules/debug/segger", "groups": ["debug"], - "sha256": "11wbzyd2n006ygh72ixhqcmgn1yrzk3kq3c0piqvrfgqmv7p8yzn" + "sha256": "1lgplfhj9fnq2j5xp6gfx8hmzcvf7l96gp5h7icym6q6cvvjc926" }, { "name": "tinycrypt", "url": "https://github.com/zephyrproject-rtos/tinycrypt", - "revision": "3e9a49d2672ec01435ffbf0d788db6d95ef28de0", + "revision": "1012a3ebee18c15ede5efc8332ee2fc37817670f", "path": "modules/crypto/tinycrypt", "groups": ["crypto"], - "sha256": "19d2q9y23yzz9i383q3cldjl3k5mryx9762cab23zy3ijdnmj2z6" + "sha256": "09501jlgjxhg6mln5np0ja2v3jya4l7gjxap08wnaw5bx0vs8295" }, { "name": "trusted-firmware-a", "url": "https://github.com/zephyrproject-rtos/trusted-firmware-a", - "revision": "421dc050278287839f5c70019bd6aec617f2bbdb", + "revision": "713ffbf96c5bcbdeab757423f10f73eb304eff07", "path": "modules/tee/tf-a/trusted-firmware-a", "groups": ["tee"], - "sha256": "029sha3dpagbvfnk5h6ad69pvs5ahwps3cxkzbfrdbq2xm8x3j2y" + "sha256": "1f33gsb10xjmxyvd7r352nin3dvln3vws9pg1sdvdv6j25yby7qg" }, { "name": "uoscore-uedhoc", "url": "https://github.com/zephyrproject-rtos/uoscore-uedhoc", - "revision": "5fe2cb613bd7e4590bd1b00c2adf181ac0229379", + "revision": "54abc109c9c0adfd53c70077744c14e454f04f4a", "path": "modules/lib/uoscore-uedhoc", - "sha256": "0z31lbibkvhw5dfps4l7049gggfczh5qqfjb4s3csnr447m81gdd" + "sha256": "102s98y3bhwsx9iip1x49ck5mixwnfw4d95plnz9wnl28lr8fq5v" }, { "name": "zcbor", "url": "https://github.com/zephyrproject-rtos/zcbor", - "revision": "67fd8bb88d3136738661fa8bb5f9989103f4599e", + "revision": "9b07780aca6fb21f82a241ba386ad9b379809337", "path": "modules/lib/zcbor", - "sha256": "16138k7xlahf63dfvplm8c2m0kxs1g17gcx1fa31y4gcfbi3b0k7" + "sha256": "1rsnh96vfc44npacsvrwcli9f3y9whk4ykqnn1pknnzlz0jmz31w" } ] diff --git a/nix/update-manifest/update-manifest.sh b/nix/update-manifest/update-manifest.sh index 1f717a5a2b6..94baee27274 100755 --- a/nix/update-manifest/update-manifest.sh +++ b/nix/update-manifest/update-manifest.sh @@ -2,7 +2,7 @@ set -euo pipefail -ignored_modules=(hal_espressif sof tflite-micro thrift bsim babblesim babblesim_base \ +ignored_modules=(hal_espressif hal_rpi_pico sof tflite-micro thrift bsim babblesim babblesim_base \ babblesim_ext_2G4_libPhyComv1 babblesim_ext_2G4_channel_NtNcable \ babblesim_ext_2G4_channel_multiatt babblesim_ext_2G4_modem_magic \ babblesim_ext_2G4_modem_BLE_simple babblesim_ext_2G4_device_burst_interferer \ From 3ffec366f080a0e39c422a22f895883df215e7f0 Mon Sep 17 00:00:00 2001 From: Chris Andreae Date: Sat, 10 Jan 2026 16:18:50 +0900 Subject: [PATCH 92/96] Update go60 for zephyr 4.1 --- app/boards/moergo/go60/Kconfig | 8 -------- app/boards/moergo/go60/Kconfig.board | 10 ---------- app/boards/moergo/go60/Kconfig.defconfig | 10 ---------- app/boards/moergo/go60/Kconfig.go60_lh | 8 ++++++++ app/boards/moergo/go60/Kconfig.go60_rh | 8 ++++++++ app/boards/moergo/go60/board.yml | 9 +++++++++ app/boards/moergo/go60/go60.dtsi | 9 +++++++++ app/boards/moergo/go60/go60_lh_defconfig | 4 ---- app/boards/moergo/go60/go60_rh_defconfig | 4 ---- 9 files changed, 34 insertions(+), 36 deletions(-) delete mode 100644 app/boards/moergo/go60/Kconfig delete mode 100644 app/boards/moergo/go60/Kconfig.board create mode 100644 app/boards/moergo/go60/Kconfig.go60_lh create mode 100644 app/boards/moergo/go60/Kconfig.go60_rh create mode 100644 app/boards/moergo/go60/board.yml diff --git a/app/boards/moergo/go60/Kconfig b/app/boards/moergo/go60/Kconfig deleted file mode 100644 index c0ba7e5c526..00000000000 --- a/app/boards/moergo/go60/Kconfig +++ /dev/null @@ -1,8 +0,0 @@ -# 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_GO60_LH || BOARD_GO60_RH) diff --git a/app/boards/moergo/go60/Kconfig.board b/app/boards/moergo/go60/Kconfig.board deleted file mode 100644 index 351f51b0f4b..00000000000 --- a/app/boards/moergo/go60/Kconfig.board +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright (c) 2021 The ZMK Contributors -# SPDX-License-Identifier: MIT - -config BOARD_GO60_LH - bool "Go60 LH" - depends on SOC_NRF52840_QIAA - -config BOARD_GO60_RH - bool "Go60 RH" - depends on SOC_NRF52840_QIAA diff --git a/app/boards/moergo/go60/Kconfig.defconfig b/app/boards/moergo/go60/Kconfig.defconfig index eb2ab28753f..6486fd11380 100644 --- a/app/boards/moergo/go60/Kconfig.defconfig +++ b/app/boards/moergo/go60/Kconfig.defconfig @@ -64,14 +64,4 @@ 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_GO60_LH || BOARD_GO60_RH diff --git a/app/boards/moergo/go60/Kconfig.go60_lh b/app/boards/moergo/go60/Kconfig.go60_lh new file mode 100644 index 00000000000..dd468963b5b --- /dev/null +++ b/app/boards/moergo/go60/Kconfig.go60_lh @@ -0,0 +1,8 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_GO60_LH + select SOC_NRF52840_QIAA + imply RETAINED_MEM + imply RETENTION + imply RETENTION_BOOT_MODE diff --git a/app/boards/moergo/go60/Kconfig.go60_rh b/app/boards/moergo/go60/Kconfig.go60_rh new file mode 100644 index 00000000000..cd227b75a50 --- /dev/null +++ b/app/boards/moergo/go60/Kconfig.go60_rh @@ -0,0 +1,8 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_GO60_RH + select SOC_NRF52840_QIAA + imply RETAINED_MEM + imply RETENTION + imply RETENTION_BOOT_MODE diff --git a/app/boards/moergo/go60/board.yml b/app/boards/moergo/go60/board.yml new file mode 100644 index 00000000000..b99230653bb --- /dev/null +++ b/app/boards/moergo/go60/board.yml @@ -0,0 +1,9 @@ +boards: + - name: go60_rh + vendor: moergo + socs: + - name: nrf52840 + - name: go60_lh + vendor: moergo + socs: + - name: nrf52840 diff --git a/app/boards/moergo/go60/go60.dtsi b/app/boards/moergo/go60/go60.dtsi index 12877602edd..d8db199fa67 100644 --- a/app/boards/moergo/go60/go60.dtsi +++ b/app/boards/moergo/go60/go60.dtsi @@ -5,6 +5,7 @@ /dts-v1/; #include +#include #include #include "go60-layouts.dtsi" @@ -54,6 +55,14 @@ }; }; +®0 { + status = "okay"; +}; + +®1 { + regulator-initial-mode = ; +}; + &adc { status = "okay"; }; diff --git a/app/boards/moergo/go60/go60_lh_defconfig b/app/boards/moergo/go60/go60_lh_defconfig index 658481c82b8..f3e82bf4137 100644 --- a/app/boards/moergo/go60/go60_lh_defconfig +++ b/app/boards/moergo/go60/go60_lh_defconfig @@ -1,10 +1,6 @@ # Copyright (c) 2021 The ZMK Contributors # SPDX-License-Identifier: MIT -CONFIG_SOC_SERIES_NRF52X=y -CONFIG_SOC_NRF52840_QIAA=y -CONFIG_BOARD_GO60_LH=y - # Enable both USB and BLE CONFIG_ZMK_USB=y CONFIG_ZMK_BLE=y diff --git a/app/boards/moergo/go60/go60_rh_defconfig b/app/boards/moergo/go60/go60_rh_defconfig index 652e9dd0311..c9ff8411a99 100644 --- a/app/boards/moergo/go60/go60_rh_defconfig +++ b/app/boards/moergo/go60/go60_rh_defconfig @@ -1,10 +1,6 @@ # Copyright (c) 2021 The ZMK Contributors # SPDX-License-Identifier: MIT -CONFIG_SOC_SERIES_NRF52X=y -CONFIG_SOC_NRF52840_QIAA=y -CONFIG_BOARD_GO60_RH=y - # Enable BLE for split peripheral CONFIG_ZMK_USB=n CONFIG_ZMK_BLE=y From 1e61f57b1a8fe7009df102563ef68063c756ae1d Mon Sep 17 00:00:00 2001 From: Chris Andreae Date: Sun, 11 Jan 2026 15:52:56 +0900 Subject: [PATCH 93/96] use in-tree cirque driver --- app/boards/moergo/go60/go60_lh.dts | 8 ++++---- app/boards/moergo/go60/go60_rh.dts | 8 ++++---- app/west.yml | 3 --- nix/manifest.json | 6 ------ nix/zmk.nix | 4 ++-- 5 files changed, 10 insertions(+), 19 deletions(-) diff --git a/app/boards/moergo/go60/go60_lh.dts b/app/boards/moergo/go60/go60_lh.dts index d88b2ff4308..044477bb89e 100644 --- a/app/boards/moergo/go60/go60_lh.dts +++ b/app/boards/moergo/go60/go60_lh.dts @@ -110,12 +110,12 @@ reg = <0>; spi-max-frequency = <1000000>; status = "okay"; - dr-gpios = <&go60_ext 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>; + data-ready-gpios = <&go60_ext 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>; sensitivity = "1x"; - rotate-90; - y-invert; - no-secondary-tap; + swap-xy; + invert-y; + primary-tap-enable; }; }; diff --git a/app/boards/moergo/go60/go60_rh.dts b/app/boards/moergo/go60/go60_rh.dts index caf2a680a44..8cce8eb072c 100644 --- a/app/boards/moergo/go60/go60_rh.dts +++ b/app/boards/moergo/go60/go60_rh.dts @@ -88,12 +88,12 @@ reg = <0>; spi-max-frequency = <1000000>; status = "okay"; - dr-gpios = <&go60_ext 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>; + data-ready-gpios = <&go60_ext 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>; sensitivity = "1x"; - rotate-90; - y-invert; - no-secondary-tap; + swap-xy; + invert-y; + primary-tap-enable; }; }; diff --git a/app/west.yml b/app/west.yml index 3d7f562a880..3f716317ce5 100644 --- a/app/west.yml +++ b/app/west.yml @@ -44,9 +44,6 @@ manifest: revision: 6cb4c283e76209d59c45fbcb218800cd19e9339d path: modules/msgs/zmk-studio-messages remote: zmkfirmware - - name: cirque-input-module - remote: petejohanson - revision: 0de55f36bc720b5be3d8880dc856d4d78baf5214 group-filter: [+optional] self: west-commands: scripts/west-commands.yml diff --git a/nix/manifest.json b/nix/manifest.json index 3bb691d2e28..55ef8f6dc57 100644 --- a/nix/manifest.json +++ b/nix/manifest.json @@ -29,12 +29,6 @@ "path": "modules/msgs/zmk-studio-messages", "sha256": "0yspr4ia6hxa29dy0v86qc8j3nvvnx2xx5qzsmnidpx9s233bz09" }, - { - "name": "cirque-input-module", - "url": "https://github.com/petejohanson/cirque-input-module", - "revision": "0de55f36bc720b5be3d8880dc856d4d78baf5214", - "sha256": "1a2sngqmlk266x8lsjvr3wm3kv3fxn9885sx8sk3zskbvz3g5998" - }, { "name": "canopennode", "url": "https://github.com/zephyrproject-rtos/canopennode", diff --git a/nix/zmk.nix b/nix/zmk.nix index f43c46662a9..f408f94b67a 100644 --- a/nix/zmk.nix +++ b/nix/zmk.nix @@ -47,13 +47,13 @@ let ]); requiredZephyrModules = [ - "cmsis" "hal_nordic" "tinycrypt" "lvgl" "picolibc" "segger" "cirque-input-module" + "cmsis" "hal_nordic" "tinycrypt" "lvgl" "picolibc" "segger" ]; # Some Zephyr modules seemingly need a symlink indirection (modulePath), # others don't (src). # This is not the best way to fix it, but it works around the problem. - directZephyrModules = [ "cirque-input-module" ]; + directZephyrModules = [ ]; zephyrModuleDeps = let modules = lib.attrVals requiredZephyrModules zephyr.modules; From f6e2c7e8f34b35a8180064a1407c1fab3c0ef70a Mon Sep 17 00:00:00 2001 From: Chris Andreae Date: Sun, 11 Jan 2026 16:08:17 +0900 Subject: [PATCH 94/96] fixup! fixup! update nix manifest pin from west --- nix/zmk.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nix/zmk.nix b/nix/zmk.nix index f408f94b67a..a4c464575aa 100644 --- a/nix/zmk.nix +++ b/nix/zmk.nix @@ -47,7 +47,7 @@ let ]); requiredZephyrModules = [ - "cmsis" "hal_nordic" "tinycrypt" "lvgl" "picolibc" "segger" + "cmsis" "hal_nordic" "tinycrypt" "lvgl" "picolibc" "segger" "mbedtls" ]; # Some Zephyr modules seemingly need a symlink indirection (modulePath), From 65acc5a9781067aadc67cfb4514836b6dbdd8f89 Mon Sep 17 00:00:00 2001 From: Chris Andreae Date: Sun, 11 Jan 2026 16:18:03 +0900 Subject: [PATCH 95/96] Delete board definition for Glove80 v0 --- app/boards/arm/glove80_v0/Kconfig | 7 - app/boards/arm/glove80_v0/Kconfig.board | 12 -- app/boards/arm/glove80_v0/Kconfig.defconfig | 66 --------- app/boards/arm/glove80_v0/board.cmake | 5 - app/boards/arm/glove80_v0/glove80_v0.dtsi | 100 ------------- app/boards/arm/glove80_v0/glove80_v0.keymap | 56 -------- .../arm/glove80_v0/glove80_v0_lh-pinctrl.dtsi | 47 ------ app/boards/arm/glove80_v0/glove80_v0_lh.dts | 135 ------------------ .../arm/glove80_v0/glove80_v0_lh.keymap | 1 - app/boards/arm/glove80_v0/glove80_v0_lh.yaml | 15 -- app/boards/arm/glove80_v0/glove80_v0_lh.yml | 10 -- .../arm/glove80_v0/glove80_v0_lh_defconfig | 50 ------- .../arm/glove80_v0/glove80_v0_rh-pinctrl.dtsi | 47 ------ app/boards/arm/glove80_v0/glove80_v0_rh.dts | 118 --------------- .../arm/glove80_v0/glove80_v0_rh.keymap | 1 - app/boards/arm/glove80_v0/glove80_v0_rh.yaml | 15 -- app/boards/arm/glove80_v0/glove80_v0_rh.yml | 10 -- .../arm/glove80_v0/glove80_v0_rh_defconfig | 50 ------- 18 files changed, 745 deletions(-) delete mode 100644 app/boards/arm/glove80_v0/Kconfig delete mode 100644 app/boards/arm/glove80_v0/Kconfig.board delete mode 100644 app/boards/arm/glove80_v0/Kconfig.defconfig delete mode 100644 app/boards/arm/glove80_v0/board.cmake delete mode 100644 app/boards/arm/glove80_v0/glove80_v0.dtsi delete mode 100644 app/boards/arm/glove80_v0/glove80_v0.keymap delete mode 100644 app/boards/arm/glove80_v0/glove80_v0_lh-pinctrl.dtsi delete mode 100644 app/boards/arm/glove80_v0/glove80_v0_lh.dts delete mode 100644 app/boards/arm/glove80_v0/glove80_v0_lh.keymap delete mode 100644 app/boards/arm/glove80_v0/glove80_v0_lh.yaml delete mode 100644 app/boards/arm/glove80_v0/glove80_v0_lh.yml delete mode 100644 app/boards/arm/glove80_v0/glove80_v0_lh_defconfig delete mode 100644 app/boards/arm/glove80_v0/glove80_v0_rh-pinctrl.dtsi delete mode 100644 app/boards/arm/glove80_v0/glove80_v0_rh.dts delete mode 100644 app/boards/arm/glove80_v0/glove80_v0_rh.keymap delete mode 100644 app/boards/arm/glove80_v0/glove80_v0_rh.yaml delete mode 100644 app/boards/arm/glove80_v0/glove80_v0_rh.yml delete mode 100644 app/boards/arm/glove80_v0/glove80_v0_rh_defconfig diff --git a/app/boards/arm/glove80_v0/Kconfig b/app/boards/arm/glove80_v0/Kconfig deleted file mode 100644 index f971e6c81da..00000000000 --- a/app/boards/arm/glove80_v0/Kconfig +++ /dev/null @@ -1,7 +0,0 @@ -# SPDX-License-Identifier: MIT - -config BOARD_ENABLE_DCDC - bool "Enable DCDC mode" - select SOC_DCDC_NRF52X - default y - depends on (BOARD_GLOVE80_V0_LH || BOARD_GLOVE80_V0_RH) diff --git a/app/boards/arm/glove80_v0/Kconfig.board b/app/boards/arm/glove80_v0/Kconfig.board deleted file mode 100644 index ce97e890fbc..00000000000 --- a/app/boards/arm/glove80_v0/Kconfig.board +++ /dev/null @@ -1,12 +0,0 @@ -# nice!nano board configuration - -# Copyright (c) 2020 Pete Johanson -# SPDX-License-Identifier: MIT - -config BOARD_GLOVE80_V0_LH - bool "Glove80 v0 LH" - depends on SOC_NRF52840_QIAA - -config BOARD_GLOVE80_V0_RH - bool "Glove80 v0 RH" - depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/glove80_v0/Kconfig.defconfig b/app/boards/arm/glove80_v0/Kconfig.defconfig deleted file mode 100644 index 9e68b18dc89..00000000000 --- a/app/boards/arm/glove80_v0/Kconfig.defconfig +++ /dev/null @@ -1,66 +0,0 @@ -# Copyright (c) 2021 The ZMK Contributors -# SPDX-License-Identifier: MIT - -if BOARD_GLOVE80_V0_LH -config BOARD - default "glove80 v0 lh" - -config ZMK_SPLIT_BLE_ROLE_CENTRAL - default y - -config ZMK_KEYBOARD_NAME - default "Glove80 V0 Left" -endif # BOARD_GLOVE80_V0_LH - -if BOARD_GLOVE80_V0_RH -config BOARD - default "glove80 v0 rh" - -config ZMK_KEYBOARD_NAME - default "Glove80 V0 Right" -endif # BOARD_GLOVE80_V0_RH - -if BOARD_GLOVE80_V0_LH || BOARD_GLOVE80_V0_RH - -config ZMK_SPLIT - default y - -config BT_CTLR - default BT - -config ZMK_BLE - default y - -config ZMK_USB - default y - -config ZMK_BATTERY_VOLTAGE_DIVIDER - default y - -config ZMK_BATTERY_NRF_VDDH - default y - -config PINCTRL - default y - -if USB - -config USB_NRFX - default y - -config USB_DEVICE_STACK - default y - -endif # USB - -if ZMK_BACKLIGHT - -config PWM - default y - -config LED_PWM - default y - -endif # ZMK_BACKLIGHT - -endif # BOARD_GLOVE80_V0_LH || BOARD_GLOVE80_V0_RH diff --git a/app/boards/arm/glove80_v0/board.cmake b/app/boards/arm/glove80_v0/board.cmake deleted file mode 100644 index fa847d50595..00000000000 --- a/app/boards/arm/glove80_v0/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/blackmagicprobe.board.cmake) -include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/boards/arm/glove80_v0/glove80_v0.dtsi b/app/boards/arm/glove80_v0/glove80_v0.dtsi deleted file mode 100644 index dafa089dbd8..00000000000 --- a/app/boards/arm/glove80_v0/glove80_v0.dtsi +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2020 Pete Johanson - * - * SPDX-License-Identifier: MIT - */ - -#include - -/ { - chosen { - zmk,kscan = &kscan0; - zmk,matrix-transform = &default_transform; - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - }; - - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <6>; - map = < -RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) -RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) -RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) -RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) -RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(0,6) RC(1,6) RC(2,6) RC(2,7) RC(1,7) RC(0,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,13) -RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(3,6) RC(4,6) RC(5,6) RC(5,7) RC(4,7) RC(3,7) RC(5,9) RC(5,10) RC(5,11) RC(5,12) RC(5,13) - >; - }; - - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - - diode-direction = "row2col"; - debounce-press-ms = <1>; - debounce-release-ms = <25>; - }; - -}; - -&adc { - status = "okay"; -}; - -&gpiote { - status = "okay"; -}; - -&gpio0 { - status = "okay"; -}; - -&gpio1 { - status = "okay"; -}; - -&usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - }; -}; - -&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/arm/glove80_v0/glove80_v0.keymap b/app/boards/arm/glove80_v0/glove80_v0.keymap deleted file mode 100644 index 52a88125275..00000000000 --- a/app/boards/arm/glove80_v0/glove80_v0.keymap +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include -#include -#include -#include -#include -#include - -#define HYPER LC(LS(LG(LALT))) - -// layers -#define DEFAULT 0 -#define LOWER 1 - -/ { - keymap { - compatible = "zmk,keymap"; - - default_layer { - // --------------------------------------------------------------------------------------------------------------------------------- - // | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | - // | = | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - | - // | TAB | Q | W | E | R | T | | Y | U | I | O | P | \ | - // | ESC | A | S | D | F | G | | H | J | K | L | ; | ' | - // | ` | Z | X | C | V | B | LSHFT | LCTRL | LOWER | | LGUI | RCTRL | RSHFT | N | M | , | . | / | PGUP | - // | MAGIC | HOME| END | LEFT | RIGHT| | BSPC | DEL | LALT | | RALT | RET | SPACE | | UP | DOWN | [ | ] | PGDN | - - - // MAGIC is currently bound to the same as LAYER - these will be fixed later - bindings = < - &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 - &kp EQUAL &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH - &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT - &kp GRAVE &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LCTRL &mo LOWER &kp LGUI &kp RCTRL &kp RSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp PG_UP - &mo LOWER &kp HOME &kp END &kp LEFT &kp RIGHT &kp BSPC &kp DEL &kp LALT &kp RALT &kp RET &kp SPACE &kp UP &kp DOWN &kp LBKT &kp RBKT &kp PG_DN - >; - }; - - lower_layer { - bindings = < - &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &none &none &none &kp F11 &kp F12 - &bt BT_CLR &bt BT_CLR &out OUT_USB &out OUT_BLE &out OUT_TOG &none &none &none &none &none &none &none - &bootloader &rgb_ug RGB_TOG &rgb_ug RGB_EFF &rgb_ug RGB_BRI &rgb_ug RGB_BRD &kp K_VOL_UP &none &none &none &none &none &bootloader - &sys_reset &none &none &none &none &kp K_VOL_DN &none &none &none &none &none &sys_reset - &ext_power EP_ON &ext_power EP_OFF &none &none &none &kp K_MUTE &none &kp HYPER &none &none &none &none &none &none &none &none &none &none - &none &kp CAPS &kp INS &none &none &none &none &none &none &none &none &none &none &none &none &none - >; - }; - }; -}; diff --git a/app/boards/arm/glove80_v0/glove80_v0_lh-pinctrl.dtsi b/app/boards/arm/glove80_v0/glove80_v0_lh-pinctrl.dtsi deleted file mode 100644 index f4437b601d2..00000000000 --- a/app/boards/arm/glove80_v0/glove80_v0_lh-pinctrl.dtsi +++ /dev/null @@ -1,47 +0,0 @@ -&pinctrl { - spi1_default: spi1_default { - group1 { - psels = , - , - ; - }; - }; - - spi1_sleep: spi1_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; - - pwm0_default: pwm0_default { - group1 { - psels = ; - }; - }; - - pwm0_sleep: pwm0_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; - - uart0_default: uart0_default { - group1 { - psels = , - ; - }; - }; - - uart0_sleep: uart0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; - -}; diff --git a/app/boards/arm/glove80_v0/glove80_v0_lh.dts b/app/boards/arm/glove80_v0/glove80_v0_lh.dts deleted file mode 100644 index db8ae5a3334..00000000000 --- a/app/boards/arm/glove80_v0/glove80_v0_lh.dts +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (c) 2021 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -/dts-v1/; -#include -#include -#include "glove80_v0.dtsi" -#include "glove80_v0_lh-pinctrl.dtsi" - -/ { - model = "glove80_v0_lh"; - compatible = "glove80_v0_lh"; - - chosen { - zmk,underglow = &led_strip; - zmk,backlight = &power_led_backlight; - zmk,battery = &vbatt; - zmk,underglow-indicators = &underglow_indicators; - }; - - power_led_backlight: pwmleds { - compatible = "pwm-leds"; - pwm_led_0 { - pwms = <&pwm0 0 PWM_USEC(20) PWM_POLARITY_NORMAL>; - }; - }; - - // Node name must match original "EXT_POWER" label to preserve user settings. - EXT_POWER { - compatible = "zmk,ext-power-generic"; - control-gpios = <&gpio0 30 GPIO_ACTIVE_HIGH>; /**[SC] WS2812_CE */ - init-delay-ms = <10>; - }; - - vbatt: vbatt-divider { - compatible = "zmk,battery-voltage-divider"; - io-channels = <&adc 5>; - output-ohms = <820000>; /** Double check that this is right */ - full-ohms = <(1500000 + 820000)>; - }; - - vbatt-vddh { - compatible = "zmk,battery-nrf-vddh"; - }; - -/* - MoErgo 40 LEDs - - 34 28 22 16 10 - 35 29 23 17 11 6 - 36 30 24 18 12 7 - 37 31 25 19 13 8 - 38 32 26 20 14 9 - 39 33 27 21 15 - 0 1 2 - 3 4 5 -*/ - - underglow_indicators: underglow-indicators { - compatible = "zmk,underglow-indicators"; - layer-state = <35 29 23 17 11 6>; - bat-lhs = <36 30 24 18 12 7>; - bat-rhs = <37 31 25 19 13 8>; - capslock = <22>; - numlock = <16>; - scrolllock = <10>; - ble-state = <3 4 0 1>; - usb-state = <5>; - output-fallback = <15>; - }; -}; - -&spi1 { - compatible = "nordic,nrf-spim"; - /* Cannot be used together with i2c0. */ - status = "okay"; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_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 = <2000000>; - - /* WS2812 */ - chain-length = <40>; /* 18 keys have underglow at the moment */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -&pwm0 { - status = "okay"; - pinctrl-0 = <&pwm0_default>; - pinctrl-1 = <&pwm0_sleep>; - pinctrl-names = "default", "sleep"; -}; - - -// [SC] Not sure if this section is necessary -&uart0 { - compatible = "nordic,nrf-uarte"; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; -}; - -&kscan0 { - row-gpios - = <&gpio0 26 GPIO_ACTIVE_HIGH> // LH ROW1 - , <&gpio0 5 GPIO_ACTIVE_HIGH> // LH ROW2 - , <&gpio0 7 GPIO_ACTIVE_HIGH> // LH ROW3 - , <&gpio1 8 GPIO_ACTIVE_HIGH> // LH ROW4 - , <&gpio0 11 GPIO_ACTIVE_HIGH> // LH ROW5 - , <&gpio0 12 GPIO_ACTIVE_HIGH> // LH ROW6 - ; - col-gpios - = <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH COL6 - , <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH COL5 - , <&gpio1 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH COL4 - , <&gpio1 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH COL3 - , <&gpio1 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH COL2 - , <&gpio1 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH COL1 - , <&gpio0 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH Thumb - ; -}; diff --git a/app/boards/arm/glove80_v0/glove80_v0_lh.keymap b/app/boards/arm/glove80_v0/glove80_v0_lh.keymap deleted file mode 100644 index 1a5a04b3937..00000000000 --- a/app/boards/arm/glove80_v0/glove80_v0_lh.keymap +++ /dev/null @@ -1 +0,0 @@ -#include "glove80_v0.keymap" \ No newline at end of file diff --git a/app/boards/arm/glove80_v0/glove80_v0_lh.yaml b/app/boards/arm/glove80_v0/glove80_v0_lh.yaml deleted file mode 100644 index 56b575ac27e..00000000000 --- a/app/boards/arm/glove80_v0/glove80_v0_lh.yaml +++ /dev/null @@ -1,15 +0,0 @@ -identifier: glove80_v0_lh -name: Glove80_V0_LH -type: mcu -arch: arm -toolchain: - - zephyr - - gnuarmemb - - xtools -supported: - - adc - - usb_device - - ble - - ieee802154 - - pwm - - watchdog diff --git a/app/boards/arm/glove80_v0/glove80_v0_lh.yml b/app/boards/arm/glove80_v0/glove80_v0_lh.yml deleted file mode 100644 index 407021c51df..00000000000 --- a/app/boards/arm/glove80_v0/glove80_v0_lh.yml +++ /dev/null @@ -1,10 +0,0 @@ -file_format: "1" -id: glove80_v0_lh -name: Glove80_V0_LH -type: board -arch: arm -outputs: - - usb - - ble -url: https://www.moergo.com -exposes: diff --git a/app/boards/arm/glove80_v0/glove80_v0_lh_defconfig b/app/boards/arm/glove80_v0/glove80_v0_lh_defconfig deleted file mode 100644 index 4d5676a1231..00000000000 --- a/app/boards/arm/glove80_v0/glove80_v0_lh_defconfig +++ /dev/null @@ -1,50 +0,0 @@ -# SPDX-License-Identifier: MIT - -CONFIG_SOC_SERIES_NRF52X=y -CONFIG_SOC_NRF52840_QIAA=y -CONFIG_BOARD_GLOVE80_V0_LH=y - -# Enable MPU -CONFIG_ARM_MPU=y - -# enable GPIO -CONFIG_GPIO=y - -CONFIG_BUILD_OUTPUT_UF2=y - -CONFIG_USE_DT_CODE_PARTITION=y - -CONFIG_MPU_ALLOW_FLASH_WRITE=y -CONFIG_NVS=y -CONFIG_SETTINGS_NVS=y -CONFIG_FLASH=y -CONFIG_FLASH_PAGE_LAYOUT=y -CONFIG_FLASH_MAP=y - -# Enable RGB underglow -CONFIG_ZMK_RGB_UNDERGLOW=y -CONFIG_WS2812_STRIP=y -CONFIG_SPI=y - -CONFIG_ZMK_RGB_UNDERGLOW_ON_START=n -CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y -CONFIG_ZMK_RGB_UNDERGLOW_BRT_STEP=4 - -CONFIG_ZMK_RGB_UNDERGLOW_EFF_START=3 -CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=285 -CONFIG_ZMK_RGB_UNDERGLOW_SAT_START=75 -CONFIG_ZMK_RGB_UNDERGLOW_BRT_START=20 - -# The power LED is implemented as a backlight -CONFIG_ZMK_BACKLIGHT=y -CONFIG_ZMK_BACKLIGHT_ON_START=y -CONFIG_ZMK_BACKLIGHT_BRT_START=5 -CONFIG_ZMK_BACKLIGHT_AUTO_OFF_IDLE=y -CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB=y - -# Turn on logging, and set ZMK logging to debug output -# Only for debugging -CONFIG_ZMK_USB_LOGGING=n - -# Turn on debugging to disable optimization -CONFIG_DEBUG=n diff --git a/app/boards/arm/glove80_v0/glove80_v0_rh-pinctrl.dtsi b/app/boards/arm/glove80_v0/glove80_v0_rh-pinctrl.dtsi deleted file mode 100644 index 08f649f759f..00000000000 --- a/app/boards/arm/glove80_v0/glove80_v0_rh-pinctrl.dtsi +++ /dev/null @@ -1,47 +0,0 @@ -&pinctrl { - spi1_default: spi1_default { - group1 { - psels = , - , - ; - }; - }; - - spi1_sleep: spi1_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; - - pwm0_default: pwm0_default { - group1 { - psels = ; - }; - }; - - pwm0_sleep: pwm0_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; - - uart0_default: uart0_default { - group1 { - psels = , - ; - }; - }; - - uart0_sleep: uart0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; - -}; diff --git a/app/boards/arm/glove80_v0/glove80_v0_rh.dts b/app/boards/arm/glove80_v0/glove80_v0_rh.dts deleted file mode 100644 index c2185da7817..00000000000 --- a/app/boards/arm/glove80_v0/glove80_v0_rh.dts +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (c) 2021 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -/dts-v1/; -#include -#include -#include "glove80_v0.dtsi" -#include "glove80_v0_rh-pinctrl.dtsi" - -/ { - model = "glove80_v0_rh"; - compatible = "glove80_v0_rh"; - - chosen { - zmk,underglow = &led_strip; - zmk,backlight = &power_led_backlight; - zmk,battery = &vbatt; - }; - - leds { - compatible = "gpio-leds"; - red_led: led_0 { - gpios = <&gpio0 20 GPIO_ACTIVE_HIGH>; - }; - }; - - power_led_backlight: pwmleds { - compatible = "pwm-leds"; - pwm_led_0 { - pwms = <&pwm0 0 PWM_USEC(20) PWM_POLARITY_NORMAL>; - }; - }; - - // Node name must match original "EXT_POWER" label to preserve user settings. - EXT_POWER { - compatible = "zmk,ext-power-generic"; - control-gpios = <&gpio0 21 GPIO_ACTIVE_HIGH>; /**[SC] WS2812_CE */ - init-delay-ms = <10>; - }; - - vbatt: vbatt-divider { - compatible = "zmk,battery-voltage-divider"; - io-channels = <&adc 5>; - output-ohms = <820000>; /** Double check that this is right */ - full-ohms = <(1500000 + 820000)>; - }; - - vbatt-vddh { - compatible = "zmk,battery-nrf-vddh"; - }; -}; - -&spi1 { - compatible = "nordic,nrf-spim"; - /* Cannot be used together with i2c0. */ - status = "okay"; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_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 = <2000000>; - - /* WS2812 */ - chain-length = <40>; - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; -}; - -&pwm0 { - status = "okay"; - pinctrl-0 = <&pwm0_default>; - pinctrl-1 = <&pwm0_sleep>; - pinctrl-names = "default", "sleep"; -}; - -// [SC] Not sure if this section is necessary -&uart0 { - compatible = "nordic,nrf-uarte"; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; -}; - -&default_transform { - col-offset = <7>; -}; - -&kscan0 { - row-gpios - = <&gpio0 26 GPIO_ACTIVE_HIGH> // RH ROW1 - , <&gpio0 5 GPIO_ACTIVE_HIGH> // RH ROW2 - , <&gpio0 7 GPIO_ACTIVE_HIGH> // RH ROW3 - , <&gpio1 8 GPIO_ACTIVE_HIGH> // RH ROW4 - , <&gpio0 11 GPIO_ACTIVE_HIGH> // RH ROW5 - , <&gpio0 12 GPIO_ACTIVE_HIGH> // RH ROW6 - ; - col-gpios - = <&gpio0 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH Thumb - , <&gpio1 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH COL1 - , <&gpio1 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH COL2 - , <&gpio1 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH COL3 - , <&gpio1 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH COL4 - , <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH COL5 - , <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH COL6 - ; -}; diff --git a/app/boards/arm/glove80_v0/glove80_v0_rh.keymap b/app/boards/arm/glove80_v0/glove80_v0_rh.keymap deleted file mode 100644 index 1a5a04b3937..00000000000 --- a/app/boards/arm/glove80_v0/glove80_v0_rh.keymap +++ /dev/null @@ -1 +0,0 @@ -#include "glove80_v0.keymap" \ No newline at end of file diff --git a/app/boards/arm/glove80_v0/glove80_v0_rh.yaml b/app/boards/arm/glove80_v0/glove80_v0_rh.yaml deleted file mode 100644 index 222ae1770e2..00000000000 --- a/app/boards/arm/glove80_v0/glove80_v0_rh.yaml +++ /dev/null @@ -1,15 +0,0 @@ -identifier: glove80_v0_rh -name: Glove80_V0_RH -type: mcu -arch: arm -toolchain: - - zephyr - - gnuarmemb - - xtools -supported: - - adc - - usb_device - - ble - - ieee802154 - - pwm - - watchdog diff --git a/app/boards/arm/glove80_v0/glove80_v0_rh.yml b/app/boards/arm/glove80_v0/glove80_v0_rh.yml deleted file mode 100644 index 41333f08662..00000000000 --- a/app/boards/arm/glove80_v0/glove80_v0_rh.yml +++ /dev/null @@ -1,10 +0,0 @@ -file_format: "1" -id: glove80_v0_rh -name: Glove80_V0_RH -type: board -arch: arm -outputs: - - usb - - ble -url: https://www.moergo.com -exposes: diff --git a/app/boards/arm/glove80_v0/glove80_v0_rh_defconfig b/app/boards/arm/glove80_v0/glove80_v0_rh_defconfig deleted file mode 100644 index 71b5f2f6215..00000000000 --- a/app/boards/arm/glove80_v0/glove80_v0_rh_defconfig +++ /dev/null @@ -1,50 +0,0 @@ -# SPDX-License-Identifier: MIT - -CONFIG_SOC_SERIES_NRF52X=y -CONFIG_SOC_NRF52840_QIAA=y -CONFIG_BOARD_GLOVE80_V0_RH=y - -# Enable MPU -CONFIG_ARM_MPU=y - -# enable GPIO -CONFIG_GPIO=y - -CONFIG_BUILD_OUTPUT_UF2=y - -CONFIG_USE_DT_CODE_PARTITION=y - -CONFIG_MPU_ALLOW_FLASH_WRITE=y -CONFIG_NVS=y -CONFIG_SETTINGS_NVS=y -CONFIG_FLASH=y -CONFIG_FLASH_PAGE_LAYOUT=y -CONFIG_FLASH_MAP=y - -# Disable RGB underglow for now in RH -CONFIG_ZMK_RGB_UNDERGLOW=y -CONFIG_WS2812_STRIP=y -CONFIG_SPI=y - -CONFIG_ZMK_RGB_UNDERGLOW_ON_START=y -CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y -CONFIG_ZMK_RGB_UNDERGLOW_BRT_STEP=4 - -CONFIG_ZMK_RGB_UNDERGLOW_EFF_START=3 -CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=285 -CONFIG_ZMK_RGB_UNDERGLOW_SAT_START=75 -CONFIG_ZMK_RGB_UNDERGLOW_BRT_START=20 - -# The power LED is implemented as a backlight -CONFIG_ZMK_BACKLIGHT=y -CONFIG_ZMK_BACKLIGHT_ON_START=y -CONFIG_ZMK_BACKLIGHT_BRT_START=5 -CONFIG_ZMK_BACKLIGHT_AUTO_OFF_IDLE=y -CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB=y - -# Turn on logging, and set ZMK logging to debug output -# Only for debugging -CONFIG_ZMK_USB_LOGGING=n - -# Turn on debugging to disable optimization -CONFIG_DEBUG=n From 0f473e1861bdc9fe938c5ad89f4a2bdb847e0118 Mon Sep 17 00:00:00 2001 From: Chris Andreae Date: Sun, 11 Jan 2026 16:21:26 +0900 Subject: [PATCH 96/96] provide correct keymap path in release.nix --- release.nix | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/release.nix b/release.nix index 8af9b5a6dfb..60277eddcbb 100644 --- a/release.nix +++ b/release.nix @@ -192,25 +192,25 @@ let mkdir /tmp/build cd /tmp/build - compileZmk -b glove80_lh -k ${zmk.src}/app/boards/arm/glove80/glove80.keymap + compileZmk -b glove80_lh -k ${zmk.src}/app/boards/moergo/glove80/glove80.keymap rm -fr /tmp/build mkdir /tmp/build cd /tmp/build - compileZmk -b glove80_rh -k ${zmk.src}/app/boards/arm/glove80/glove80.keymap + compileZmk -b glove80_rh -k ${zmk.src}/app/boards/moergo/glove80/glove80.keymap rm -fr /tmp/build mkdir /tmp/build cd /tmp/build - compileZmk -b go60_lh -k ${zmk.src}/app/boards/arm/go60/go60.keymap + compileZmk -b go60_lh -k ${zmk.src}/app/boards/moergo/go60/go60.keymap rm -fr /tmp/build mkdir /tmp/build cd /tmp/build - compileZmk -b go60_rh -k ${zmk.src}/app/boards/arm/go60/go60.keymap + compileZmk -b go60_rh -k ${zmk.src}/app/boards/moergo/go60/go60.keymap ''; entrypoint = pkgs.writeShellScriptBin "entrypoint" ''