558 Commits
Author SHA1 Message Date
hermes 9481b6614a fix(connections): allow toggling HTTPS off in Add Connection dialog
Push to Main CI / build-and-package (push) Canceled after 0s
The 'Use HTTPS' switch was disabled whenever the web client itself was
served over HTTPS, making it impossible to add a plain-HTTP node.
Keep the switch always interactive and instead show a mixed-content
warning when HTTP is selected on an HTTPS-served page.

Adds unit tests for the protocol toggle.
2026-08-30 20:46:39 +00:00
Dan DitomasoandGitHub cffd35fe05 Merge pull request #1400 from meshtastic/dependabot/npm_and_yarn/oxfmt-0.63.0
Push to Main CI / build-and-package (push) Canceled after 0s
chore(deps-dev): bump oxfmt from 0.61.0 to 0.63.0
2026-08-23 01:48:53 +00:00
Dan DitomasoandGitHub a2036802cf Merge pull request #1398 from meshtastic/dependabot/npm_and_yarn/testing-library/user-event-14.6.4
chore(deps-dev): bump @testing-library/user-event from 14.6.1 to 14.6.4
2026-08-23 01:48:50 +00:00
Dan DitomasoandGitHub 3d88827331 Merge pull request #1399 from meshtastic/dependabot/npm_and_yarn/maplibre-gl-6.3.0
chore(deps): bump maplibre-gl from 6.0.0 to 6.3.0
2026-08-23 01:48:49 +00:00
Dan DitomasoandGitHub 2c4abbf128 Merge branch 'main' into dependabot/npm_and_yarn/testing-library/user-event-14.6.4 2026-08-22 21:46:39 -04:00
Dan DitomasoandGitHub 8cb2f16b19 Merge branch 'main' into dependabot/npm_and_yarn/maplibre-gl-6.3.0 2026-08-22 21:46:13 -04:00
Dan DitomasoandGitHub 1c254b707f Merge branch 'main' into dependabot/npm_and_yarn/oxfmt-0.63.0 2026-08-22 21:46:02 -04:00
Dan DitomasoandGitHub 77bf54be2a Merge pull request #1370 from meshtastic/dependabot/github_actions/docker/login-action-4.5.2
chore(deps): bump docker/login-action from 4 to 4.5.2
2026-08-23 01:33:48 +00:00
Dan DitomasoandGitHub 58d09a1d47 Merge branch 'main' into dependabot/github_actions/docker/login-action-4.5.2 2026-08-22 21:33:39 -04:00
dependabot[bot]andGitHub 1fdfd76f42 chore(deps-dev): bump oxfmt from 0.61.0 to 0.63.0
Bumps [oxfmt](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt) from 0.61.0 to 0.63.0.
- [Release notes](https://github.com/oxc-project/oxc/releases)
- [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxfmt/CHANGELOG.md)
- [Commits](https://github.com/oxc-project/oxc/commits/oxfmt_v0.63.0/npm/oxfmt)

---
updated-dependencies:
- dependency-name: oxfmt
  dependency-version: 0.63.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-16 08:51:45 +00:00
dependabot[bot]andGitHub 722766b0a4 chore(deps): bump maplibre-gl from 6.0.0 to 6.3.0
Bumps [maplibre-gl](https://github.com/maplibre/maplibre-gl-js) from 6.0.0 to 6.3.0.
- [Release notes](https://github.com/maplibre/maplibre-gl-js/releases)
- [Changelog](https://github.com/maplibre/maplibre-gl-js/blob/main/CHANGELOG.md)
- [Commits](https://github.com/maplibre/maplibre-gl-js/compare/v6.0.0...v6.3.0)

---
updated-dependencies:
- dependency-name: maplibre-gl
  dependency-version: 6.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-16 08:51:16 +00:00
dependabot[bot]andGitHub 369b852080 chore(deps-dev): bump @testing-library/user-event from 14.6.1 to 14.6.4
Bumps [@testing-library/user-event](https://github.com/testing-library/user-event) from 14.6.1 to 14.6.4.
- [Release notes](https://github.com/testing-library/user-event/releases)
- [Changelog](https://github.com/testing-library/user-event/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/user-event/compare/v14.6.1...v14.6.4)

---
updated-dependencies:
- dependency-name: "@testing-library/user-event"
  dependency-version: 14.6.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-16 08:49:13 +00:00
Dan DitomasoandGitHub 1db40fe80b Merge pull request #1375 from nikolya-prodigy/fix/react-map-gl-maplibre-6
fix(deps): update react-map-gl for MapLibre GL 6
2026-08-10 12:33:16 +00:00
Dan DitomasoandGitHub 6c691c7ecb Merge branch 'main' into fix/react-map-gl-maplibre-6 2026-08-10 08:32:33 -04:00
Hunter ThornsberryandGitHub 0142a28d89 Merge pull request #1383 from meshtastic/dependabot/npm_and_yarn/fast-uri-3.1.5
chore(deps): bump fast-uri from 3.1.4 to 3.1.5
2026-08-09 02:40:20 +00:00
d9e928d682 fix: update pnpm-lock.yaml with only fast-uri 3.1.4→3.1.5 bump
Dependabot's lockfile update also pulled in 8 packages published
within the minimumReleaseAge window (2 days), causing pnpm's
supply-chain policy check to fail in CI. Restore lockfile to the
parent state and apply only the minimal 4-line fast-uri change.

Co-authored-by: Hunter275 <3261295+Hunter275@users.noreply.github.com>
2026-08-08 19:52:04 +00:00
dependabot[bot]andGitHub d452d99ef0 chore(deps): bump fast-uri from 3.1.4 to 3.1.5
Bumps [fast-uri](https://github.com/fastify/fast-uri) from 3.1.4 to 3.1.5.
- [Release notes](https://github.com/fastify/fast-uri/releases)
- [Commits](https://github.com/fastify/fast-uri/compare/v3.1.4...v3.1.5)

---
updated-dependencies:
- dependency-name: fast-uri
  dependency-version: 3.1.5
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-08 19:40:13 +00:00
Hunter ThornsberryandGitHub ee5243a205 Merge pull request #1377 from meshtastic/dependabot/npm_and_yarn/i18next-http-backend-4.0.1
chore(deps): bump i18next-http-backend from 4.0.0 to 4.0.1
2026-08-08 19:37:23 +00:00
Hunter ThornsberryandGitHub 37c0fedeec Merge pull request #1378 from meshtastic/dependabot/npm_and_yarn/jsdom-30.0.1
chore(deps-dev): bump jsdom from 30.0.0 to 30.0.1
2026-08-08 19:37:09 +00:00
Hunter ThornsberryandGitHub d10b71c6f5 Merge pull request #1379 from meshtastic/dependabot/npm_and_yarn/react-map-gl-8.1.2
chore(deps): bump react-map-gl from 8.1.1 to 8.1.2
2026-08-08 19:37:00 +00:00
Hunter ThornsberryandGitHub 7de9b1c943 Merge pull request #1380 from meshtastic/dependabot/npm_and_yarn/lucide-react-1.28.0
chore(deps): bump lucide-react from 1.27.0 to 1.28.0
2026-08-08 19:36:49 +00:00
dependabot[bot]andGitHub 3f5086eb82 chore(deps): bump lucide-react from 1.27.0 to 1.28.0
Bumps [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) from 1.27.0 to 1.28.0.
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/1.28.0/packages/lucide-react)

---
updated-dependencies:
- dependency-name: lucide-react
  dependency-version: 1.28.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-02 08:36:13 +00:00
dependabot[bot]andGitHub 6d3acd85ca chore(deps): bump react-map-gl from 8.1.1 to 8.1.2
Bumps [react-map-gl](https://github.com/visgl/react-map-gl) from 8.1.1 to 8.1.2.
- [Release notes](https://github.com/visgl/react-map-gl/releases)
- [Changelog](https://github.com/visgl/react-map-gl/blob/v8.1.2/CHANGELOG.md)
- [Commits](https://github.com/visgl/react-map-gl/compare/v8.1.1...v8.1.2)

---
updated-dependencies:
- dependency-name: react-map-gl
  dependency-version: 8.1.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-02 08:35:32 +00:00
dependabot[bot]andGitHub 944de7d560 chore(deps-dev): bump jsdom from 30.0.0 to 30.0.1
Bumps [jsdom](https://github.com/jsdom/jsdom) from 30.0.0 to 30.0.1.
- [Release notes](https://github.com/jsdom/jsdom/releases)
- [Commits](https://github.com/jsdom/jsdom/compare/v30.0.0...v30.0.1)

---
updated-dependencies:
- dependency-name: jsdom
  dependency-version: 30.0.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-02 08:34:51 +00:00
dependabot[bot]andGitHub a1088b733a chore(deps): bump i18next-http-backend from 4.0.0 to 4.0.1
Bumps [i18next-http-backend](https://github.com/i18next/i18next-http-backend) from 4.0.0 to 4.0.1.
- [Changelog](https://github.com/i18next/i18next-http-backend/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next-http-backend/compare/v4.0.0...v4.0.1)

---
updated-dependencies:
- dependency-name: i18next-http-backend
  dependency-version: 4.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-02 08:34:16 +00:00
NIKOLYA PRODIGY d2cf940df1 fix(deps): support MapLibre GL 6 2026-08-01 15:03:04 +03:00
Hunter ThornsberryandGitHub d920c7e044 Merge branch 'main' into dependabot/github_actions/docker/login-action-4.5.2 2026-07-31 23:15:47 -04:00
Hunter ThornsberryandGitHub 9a474420f2 Merge pull request #1372 from meshtastic/dependabot/npm_and_yarn/types/node-26.1.2
chore(deps): bump @types/node from 26.1.1 to 26.1.2
2026-08-01 03:15:40 +00:00
dependabot[bot]andGitHub 65aefbfb51 chore(deps): bump @types/node from 26.1.1 to 26.1.2
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 26.1.1 to 26.1.2.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 26.1.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-01 01:58:47 +00:00
Hunter ThornsberryandGitHub cc117b93aa Merge pull request #1363 from meshtastic/dependabot/npm_and_yarn/publint-0.3.22
chore(deps-dev): bump publint from 0.3.21 to 0.3.22
2026-08-01 01:45:00 +00:00
dependabot[bot]andGitHub e3b84abaae chore(deps-dev): bump publint from 0.3.21 to 0.3.22
Bumps [publint](https://github.com/publint/publint/tree/HEAD/packages/publint) from 0.3.21 to 0.3.22.
- [Release notes](https://github.com/publint/publint/releases)
- [Changelog](https://github.com/publint/publint/blob/master/packages/publint/CHANGELOG.md)
- [Commits](https://github.com/publint/publint/commits/HEAD/packages/publint)

---
updated-dependencies:
- dependency-name: publint
  dependency-version: 0.3.22
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-01 01:44:55 +00:00
Hunter ThornsberryandGitHub 38119f2e2b Merge pull request #1365 from meshtastic/dependabot/npm_and_yarn/lucide-react-1.27.0
chore(deps): bump lucide-react from 1.26.0 to 1.27.0
2026-08-01 01:40:54 +00:00
Hunter ThornsberryandGitHub 5a98701f51 Merge pull request #1367 from meshtastic/dependabot/npm_and_yarn/hookform/resolvers-5.5.7
chore(deps): bump @hookform/resolvers from 5.4.2 to 5.5.7
2026-08-01 01:40:42 +00:00
Hunter ThornsberryandGitHub c50036ceea Merge pull request #1373 from meshtastic/dependabot/npm_and_yarn/oxfmt-0.61.0
chore(deps-dev): bump oxfmt from 0.60.0 to 0.61.0
2026-08-01 01:39:28 +00:00
Hunter ThornsberryandGitHub 7b0d334626 Merge pull request #1362 from meshtastic/dependabot/npm_and_yarn/vitejs/plugin-react-6.0.4
chore(deps-dev): bump @vitejs/plugin-react from 6.0.3 to 6.0.4
2026-08-01 01:39:13 +00:00
Hunter ThornsberryandGitHub 0374317968 Merge branch 'main' into dependabot/github_actions/docker/login-action-4.5.2 2026-07-31 21:12:11 -04:00
dependabot[bot]andGitHub bddf99aef2 chore(deps-dev): bump oxfmt from 0.60.0 to 0.61.0
Bumps [oxfmt](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt) from 0.60.0 to 0.61.0.
- [Release notes](https://github.com/oxc-project/oxc/releases)
- [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxfmt/CHANGELOG.md)
- [Commits](https://github.com/oxc-project/oxc/commits/oxfmt_v0.61.0/npm/oxfmt)

---
updated-dependencies:
- dependency-name: oxfmt
  dependency-version: 0.61.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-31 06:14:02 +00:00
dependabot[bot]andGitHub c6bb3cb65f chore(deps): bump @hookform/resolvers from 5.4.2 to 5.5.7
Bumps [@hookform/resolvers](https://github.com/react-hook-form/resolvers) from 5.4.2 to 5.5.7.
- [Release notes](https://github.com/react-hook-form/resolvers/releases)
- [Commits](https://github.com/react-hook-form/resolvers/compare/v5.4.2...v5.5.7)

---
updated-dependencies:
- dependency-name: "@hookform/resolvers"
  dependency-version: 5.5.7
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-31 06:13:15 +00:00
dependabot[bot]andGitHub 87a4226c21 chore(deps): bump lucide-react from 1.26.0 to 1.27.0
Bumps [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) from 1.26.0 to 1.27.0.
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/1.27.0/packages/lucide-react)

---
updated-dependencies:
- dependency-name: lucide-react
  dependency-version: 1.27.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-31 06:13:07 +00:00
dependabot[bot]andGitHub 6ba9488f19 chore(deps-dev): bump @vitejs/plugin-react from 6.0.3 to 6.0.4
Bumps [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) from 6.0.3 to 6.0.4.
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@6.0.4/packages/plugin-react)

---
updated-dependencies:
- dependency-name: "@vitejs/plugin-react"
  dependency-version: 6.0.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-31 06:12:14 +00:00
Hunter ThornsberryandGitHub a574db005c Merge pull request #1368 from meshtastic/dependabot/npm_and_yarn/jsdom-30.0.0
chore(deps-dev): bump jsdom from 29.1.1 to 30.0.0
2026-07-31 05:43:16 +00:00
Hunter ThornsberryandGitHub ea5c033c04 Merge branch 'main' into dependabot/npm_and_yarn/jsdom-30.0.0 2026-07-30 20:15:08 -04:00
dependabot[bot]andGitHub 68adbe4cac chore(deps): bump docker/login-action from 4 to 4.5.2
Bumps [docker/login-action](https://github.com/docker/login-action) from 4 to 4.5.2.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/v4...v4.5.2)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: 4.5.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-31 00:10:52 +00:00
Hunter ThornsberryandGitHub b968bf9908 Merge pull request #1366 from Hunter275/dependabot-weekly
Set dependabot to be weekly instead of daily
2026-07-30 23:55:38 +00:00
copilot-swe-agent[bot]andGitHub 185933e779 fix: remove invalid tsconfig project references that break Playwright e2e
The root tsconfig.json referenced apps/web and packages/transport-http as
TypeScript project references, but those tsconfigs lacked the required
`composite: true` setting. Playwright 1.62.0 strictly validates tsconfig
project references when loading playwright.config.ts, causing the e2e CI
job to fail with:

  Error: Failed to load tsconfig file at .../tsconfig.json:
  Failed to resolve "references" path "apps/web" referenced from .../tsconfig.json

Remove the invalid references. Individual package tsconfigs already extend
tsconfig.base.json directly and remain unaffected.
2026-07-30 14:52:42 +00:00
dependabot[bot]andGitHub 2e352810c3 chore(deps-dev): bump jsdom from 29.1.1 to 30.0.0
Bumps [jsdom](https://github.com/jsdom/jsdom) from 29.1.1 to 30.0.0.
- [Release notes](https://github.com/jsdom/jsdom/releases)
- [Commits](https://github.com/jsdom/jsdom/compare/v29.1.1...v30.0.0)

---
updated-dependencies:
- dependency-name: jsdom
  dependency-version: 30.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-30 08:35:16 +00:00
Hunter275 fce9f034f5 fix for missed daily 2026-07-29 21:19:51 -04:00
Hunter275 afd8db01d2 set dependabot to be weekly instead of daily 2026-07-29 21:14:19 -04:00
Hunter ThornsberryandGitHub 6894b5fe9c Merge pull request #1351 from meshtastic/dependabot/npm_and_yarn/radix-ui-cecebef696
chore(deps): bump the radix-ui group with 20 updates
2026-07-29 01:56:08 +00:00
Hunter ThornsberryandGitHub e89814818c Merge branch 'main' into dependabot/npm_and_yarn/radix-ui-cecebef696 2026-07-28 21:55:08 -04:00
Hunter ThornsberryandGitHub 904c7107f3 Merge pull request #1350 from meshtastic/dependabot/github_actions/actions/stale-11
chore(deps): bump actions/stale from 10 to 11
2026-07-29 01:55:06 +00:00
Hunter ThornsberryandGitHub 4f0b07c403 Merge branch 'main' into dependabot/github_actions/actions/stale-11 2026-07-28 21:54:37 -04:00
Hunter ThornsberryandGitHub 542172f119 Merge branch 'main' into dependabot/github_actions/actions/stale-11 2026-07-28 21:54:26 -04:00
Hunter ThornsberryandGitHub b1344af667 Merge branch 'main' into dependabot/npm_and_yarn/radix-ui-cecebef696 2026-07-28 21:54:20 -04:00
Hunter ThornsberryandGitHub 695d6cd9a8 Merge pull request #1352 from meshtastic/dependabot/npm_and_yarn/hookform/resolvers-5.4.2
chore(deps): bump @hookform/resolvers from 5.4.0 to 5.4.2
2026-07-29 01:54:13 +00:00
Hunter ThornsberryandGitHub 5f4f1094ff Merge pull request #1353 from meshtastic/dependabot/npm_and_yarn/maplibre-gl-6.0.0
chore(deps): bump maplibre-gl from 5.24.0 to 6.0.0
2026-07-29 01:54:11 +00:00
Hunter ThornsberryandGitHub 2b752eb807 Merge pull request #1354 from meshtastic/dependabot/npm_and_yarn/tar-7.5.22
chore(deps-dev): bump tar from 7.5.21 to 7.5.22
2026-07-29 01:54:08 +00:00
Hunter ThornsberryandGitHub 17ebb0f5bd Merge pull request #1356 from meshtastic/dependabot/npm_and_yarn/happy-dom-20.11.1
chore(deps-dev): bump happy-dom from 20.11.0 to 20.11.1
2026-07-29 01:54:02 +00:00
Hunter ThornsberryandGitHub 9ef76f6d6b Merge pull request #1357 from meshtastic/dependabot/npm_and_yarn/react-i18next-17.0.11
chore(deps): bump react-i18next from 17.0.10 to 17.0.11
2026-07-29 01:54:00 +00:00
Hunter ThornsberryandGitHub e1ef436de5 Merge pull request #1358 from meshtastic/dependabot/npm_and_yarn/playwright/test-1.62.0
chore(deps-dev): bump @playwright/test from 1.61.1 to 1.62.0
2026-07-29 01:53:57 +00:00
Hunter ThornsberryandGitHub f32ef36223 Merge pull request #1359 from meshtastic/dependabot/npm_and_yarn/oxlint-1.75.0
chore(deps-dev): bump oxlint from 1.74.0 to 1.75.0
2026-07-29 01:53:54 +00:00
Hunter ThornsberryandGitHub 7cd8b8eb9a Merge pull request #1360 from meshtastic/dependabot/npm_and_yarn/testing-library/jest-dom-7.0.0
chore(deps-dev): bump @testing-library/jest-dom from 6.9.1 to 7.0.0
2026-07-29 01:53:52 +00:00
dependabot[bot]andGitHub 4b3ccf92f9 chore(deps-dev): bump @testing-library/jest-dom from 6.9.1 to 7.0.0
Bumps [@testing-library/jest-dom](https://github.com/testing-library/jest-dom) from 6.9.1 to 7.0.0.
- [Release notes](https://github.com/testing-library/jest-dom/releases)
- [Changelog](https://github.com/testing-library/jest-dom/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/jest-dom/compare/v6.9.1...v7.0.0)

---
updated-dependencies:
- dependency-name: "@testing-library/jest-dom"
  dependency-version: 7.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-28 08:47:44 +00:00
dependabot[bot]andGitHub 9d6f89105a chore(deps-dev): bump oxlint from 1.74.0 to 1.75.0
Bumps [oxlint](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint) from 1.74.0 to 1.75.0.
- [Release notes](https://github.com/oxc-project/oxc/releases)
- [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxlint/CHANGELOG.md)
- [Commits](https://github.com/oxc-project/oxc/commits/oxlint_v1.75.0/npm/oxlint)

---
updated-dependencies:
- dependency-name: oxlint
  dependency-version: 1.75.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-28 08:47:12 +00:00
dependabot[bot]andGitHub 851f6324d8 chore(deps-dev): bump @playwright/test from 1.61.1 to 1.62.0
Bumps [@playwright/test](https://github.com/microsoft/playwright) from 1.61.1 to 1.62.0.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.61.1...v1.62.0)

---
updated-dependencies:
- dependency-name: "@playwright/test"
  dependency-version: 1.62.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-28 08:46:39 +00:00
dependabot[bot]andGitHub 88f61b7588 chore(deps): bump react-i18next from 17.0.10 to 17.0.11
Bumps [react-i18next](https://github.com/i18next/react-i18next) from 17.0.10 to 17.0.11.
- [Changelog](https://github.com/i18next/react-i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/react-i18next/compare/v17.0.10...v17.0.11)

---
updated-dependencies:
- dependency-name: react-i18next
  dependency-version: 17.0.11
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-28 08:46:06 +00:00
dependabot[bot]andGitHub 696bb0b839 chore(deps-dev): bump happy-dom from 20.11.0 to 20.11.1
Bumps [happy-dom](https://github.com/capricorn86/happy-dom) from 20.11.0 to 20.11.1.
- [Release notes](https://github.com/capricorn86/happy-dom/releases)
- [Commits](https://github.com/capricorn86/happy-dom/compare/v20.11.0...v20.11.1)

---
updated-dependencies:
- dependency-name: happy-dom
  dependency-version: 20.11.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-28 08:45:27 +00:00
dependabot[bot]andGitHub 82e6103fc1 chore(deps-dev): bump tar from 7.5.21 to 7.5.22
Bumps [tar](https://github.com/isaacs/node-tar) from 7.5.21 to 7.5.22.
- [Release notes](https://github.com/isaacs/node-tar/releases)
- [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/isaacs/node-tar/compare/v7.5.21...v7.5.22)

---
updated-dependencies:
- dependency-name: tar
  dependency-version: 7.5.22
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-28 08:44:24 +00:00
dependabot[bot]andGitHub b30974355a chore(deps): bump maplibre-gl from 5.24.0 to 6.0.0
Bumps [maplibre-gl](https://github.com/maplibre/maplibre-gl-js) from 5.24.0 to 6.0.0.
- [Release notes](https://github.com/maplibre/maplibre-gl-js/releases)
- [Changelog](https://github.com/maplibre/maplibre-gl-js/blob/main/CHANGELOG.md)
- [Commits](https://github.com/maplibre/maplibre-gl-js/compare/v5.24.0...v6.0.0)

---
updated-dependencies:
- dependency-name: maplibre-gl
  dependency-version: 6.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-28 08:43:49 +00:00
dependabot[bot]andGitHub 523784f9c7 chore(deps): bump @hookform/resolvers from 5.4.0 to 5.4.2
Bumps [@hookform/resolvers](https://github.com/react-hook-form/resolvers) from 5.4.0 to 5.4.2.
- [Release notes](https://github.com/react-hook-form/resolvers/releases)
- [Commits](https://github.com/react-hook-form/resolvers/compare/v5.4.0...v5.4.2)

---
updated-dependencies:
- dependency-name: "@hookform/resolvers"
  dependency-version: 5.4.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-28 08:43:17 +00:00
dependabot[bot]andGitHub f15f7f5be0 chore(deps): bump the radix-ui group with 20 updates
Bumps the radix-ui group with 20 updates:

| Package | From | To |
| --- | --- | --- |
| [@radix-ui/react-collapsible](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/collapsible) | `1.1.18` | `1.1.20` |
| [@radix-ui/react-dialog](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dialog) | `1.1.21` | `1.1.23` |
| [@radix-ui/react-dropdown-menu](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dropdown-menu) | `2.1.22` | `2.1.24` |
| [@radix-ui/react-separator](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/separator) | `1.1.13` | `1.1.15` |
| [@radix-ui/react-slot](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/slot) | `1.3.1` | `1.3.3` |
| [@radix-ui/react-tooltip](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tooltip) | `1.2.14` | `1.2.16` |
| [@radix-ui/react-accordion](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/accordion) | `1.2.18` | `1.2.20` |
| [@radix-ui/react-alert-dialog](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/alert-dialog) | `1.1.21` | `1.1.23` |
| [@radix-ui/react-checkbox](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/checkbox) | `1.3.9` | `1.3.11` |
| [@radix-ui/react-label](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/label) | `2.1.13` | `2.1.15` |
| [@radix-ui/react-menubar](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/menubar) | `1.1.22` | `1.1.24` |
| [@radix-ui/react-popover](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/popover) | `1.1.21` | `1.1.23` |
| [@radix-ui/react-scroll-area](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/scroll-area) | `1.2.16` | `1.2.18` |
| [@radix-ui/react-select](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/select) | `2.3.5` | `2.3.7` |
| [@radix-ui/react-slider](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/slider) | `1.4.5` | `1.4.7` |
| [@radix-ui/react-switch](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/switch) | `1.3.5` | `1.3.7` |
| [@radix-ui/react-tabs](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tabs) | `1.1.19` | `1.1.21` |
| [@radix-ui/react-toast](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/toast) | `1.2.21` | `1.2.23` |
| [@radix-ui/react-toggle-group](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/toggle-group) | `1.1.17` | `1.1.19` |
| [@radix-ui/react-visually-hidden](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/visually-hidden) | `1.2.9` | `1.2.11` |


Updates `@radix-ui/react-collapsible` from 1.1.18 to 1.1.20
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/collapsible/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/collapsible)

Updates `@radix-ui/react-dialog` from 1.1.21 to 1.1.23
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/dialog/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/dialog)

Updates `@radix-ui/react-dropdown-menu` from 2.1.22 to 2.1.24
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/dropdown-menu/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/dropdown-menu)

Updates `@radix-ui/react-separator` from 1.1.13 to 1.1.15
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/separator/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/separator)

Updates `@radix-ui/react-slot` from 1.3.1 to 1.3.3
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/slot/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/slot)

Updates `@radix-ui/react-tooltip` from 1.2.14 to 1.2.16
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/tooltip/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/tooltip)

Updates `@radix-ui/react-accordion` from 1.2.18 to 1.2.20
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/accordion/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/accordion)

Updates `@radix-ui/react-alert-dialog` from 1.1.21 to 1.1.23
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/alert-dialog/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/alert-dialog)

Updates `@radix-ui/react-checkbox` from 1.3.9 to 1.3.11
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/checkbox/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/checkbox)

Updates `@radix-ui/react-label` from 2.1.13 to 2.1.15
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/label/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/label)

Updates `@radix-ui/react-menubar` from 1.1.22 to 1.1.24
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/menubar/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/menubar)

Updates `@radix-ui/react-popover` from 1.1.21 to 1.1.23
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/popover/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/popover)

Updates `@radix-ui/react-scroll-area` from 1.2.16 to 1.2.18
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/scroll-area/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/scroll-area)

Updates `@radix-ui/react-select` from 2.3.5 to 2.3.7
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/select/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/select)

Updates `@radix-ui/react-slider` from 1.4.5 to 1.4.7
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/slider/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/slider)

Updates `@radix-ui/react-switch` from 1.3.5 to 1.3.7
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/switch/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/switch)

Updates `@radix-ui/react-tabs` from 1.1.19 to 1.1.21
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/tabs/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/tabs)

Updates `@radix-ui/react-toast` from 1.2.21 to 1.2.23
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/toast/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/toast)

Updates `@radix-ui/react-toggle-group` from 1.1.17 to 1.1.19
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/toggle-group/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/toggle-group)

Updates `@radix-ui/react-visually-hidden` from 1.2.9 to 1.2.11
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/visually-hidden/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/visually-hidden)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-collapsible"
  dependency-version: 1.1.20
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-dialog"
  dependency-version: 1.1.23
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-dropdown-menu"
  dependency-version: 2.1.24
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-separator"
  dependency-version: 1.1.15
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-slot"
  dependency-version: 1.3.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-tooltip"
  dependency-version: 1.2.16
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-accordion"
  dependency-version: 1.2.20
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-alert-dialog"
  dependency-version: 1.1.23
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-checkbox"
  dependency-version: 1.3.11
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-label"
  dependency-version: 2.1.15
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-menubar"
  dependency-version: 1.1.24
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-popover"
  dependency-version: 1.1.23
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-scroll-area"
  dependency-version: 1.2.18
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-select"
  dependency-version: 2.3.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-slider"
  dependency-version: 1.4.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-switch"
  dependency-version: 1.3.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-tabs"
  dependency-version: 1.1.21
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-toast"
  dependency-version: 1.2.23
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-toggle-group"
  dependency-version: 1.1.19
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-visually-hidden"
  dependency-version: 1.2.11
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-28 08:42:40 +00:00
dependabot[bot]andGitHub 02e02a72df chore(deps): bump actions/stale from 10 to 11
Bumps [actions/stale](https://github.com/actions/stale) from 10 to 11.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v10...v11)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-version: '11'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-28 08:34:03 +00:00
Dan DitomasoandGitHub 5b10d3919d Merge pull request #1305 from meshtastic/dependabot/npm_and_yarn/tanstack-4e0cd3caa5
chore(deps): bump the tanstack group across 1 directory with 3 updates
2026-07-28 01:13:56 +00:00
Dan Ditomaso 1066d1ff6a Merge main into tanstack bump 2026-07-27 21:10:27 -04:00
Hunter ThornsberryandGitHub 8e611a6a03 Merge pull request #1342 from meshtastic/dependabot/npm_and_yarn/react-ecosystem-479fbeca4e
chore(deps): bump the react-ecosystem group across 1 directory with 2 updates
2026-07-27 19:09:20 +00:00
dependabot[bot]andGitHub 12a998242a chore(deps): bump the react-ecosystem group across 1 directory with 2 updates
Bumps the react-ecosystem group with 2 updates in the / directory: [react](https://github.com/react/react/tree/HEAD/packages/react) and [react-dom](https://github.com/react/react/tree/HEAD/packages/react-dom).


Updates `react` from 19.2.7 to 19.2.8
- [Release notes](https://github.com/react/react/releases)
- [Changelog](https://github.com/react/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/react/react/commits/v19.2.8/packages/react)

Updates `react-dom` from 19.2.7 to 19.2.8
- [Release notes](https://github.com/react/react/releases)
- [Changelog](https://github.com/react/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/react/react/commits/v19.2.8/packages/react-dom)

---
updated-dependencies:
- dependency-name: react
  dependency-version: 19.2.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: react-ecosystem
- dependency-name: react-dom
  dependency-version: 19.2.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: react-ecosystem
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-27 18:29:30 +00:00
Hunter ThornsberryandGitHub 0c2bdd33c7 Merge pull request #1343 from meshtastic/dependabot/npm_and_yarn/oxfmt-0.60.0
chore(deps-dev): bump oxfmt from 0.59.0 to 0.60.0
2026-07-27 18:27:12 +00:00
Hunter ThornsberryandGitHub daa71c5516 Merge branch 'main' into dependabot/npm_and_yarn/oxfmt-0.60.0 2026-07-27 14:27:02 -04:00
Hunter ThornsberryandGitHub c3e2df6672 Merge pull request #1341 from meshtastic/dependabot/npm_and_yarn/radix-ui-48a6414ad5
chore(deps): bump the radix-ui group with 20 updates
2026-07-27 18:26:12 +00:00
Hunter ThornsberryandGitHub 86cb621f10 Merge pull request #1345 from meshtastic/dependabot/npm_and_yarn/bufbuild/protoc-gen-es-2.13.0
chore(deps-dev): bump @bufbuild/protoc-gen-es from 2.12.1 to 2.13.0
2026-07-27 18:26:05 +00:00
Hunter ThornsberryandGitHub 192944f48c Merge branch 'main' into dependabot/npm_and_yarn/bufbuild/protoc-gen-es-2.13.0 2026-07-27 14:17:07 -04:00
Hunter ThornsberryandGitHub 479d9d333c Merge branch 'main' into dependabot/npm_and_yarn/radix-ui-48a6414ad5 2026-07-27 14:15:54 -04:00
Hunter ThornsberryandGitHub b5a96dcc2e Merge pull request #1344 from meshtastic/dependabot/npm_and_yarn/lint-staged-17.2.0
chore(deps-dev): bump lint-staged from 17.1.0 to 17.2.0
2026-07-27 18:15:37 +00:00
Hunter ThornsberryandGitHub 1699097683 Merge pull request #1346 from meshtastic/dependabot/npm_and_yarn/lucide-react-1.26.0
chore(deps): bump lucide-react from 1.25.0 to 1.26.0
2026-07-27 18:15:31 +00:00
Hunter ThornsberryandGitHub 1577f59272 Merge pull request #1347 from meshtastic/dependabot/npm_and_yarn/crypto-random-string-6.0.0
chore(deps): bump crypto-random-string from 5.0.0 to 6.0.0
2026-07-27 18:15:29 +00:00
Hunter ThornsberryandGitHub 1954715077 Merge pull request #1348 from meshtastic/dependabot/npm_and_yarn/bufbuild/protobuf-2.13.0
chore(deps): bump @bufbuild/protobuf from 2.12.1 to 2.13.0
2026-07-27 18:15:26 +00:00
Hunter ThornsberryandGitHub c81a481e00 Merge pull request #1349 from meshtastic/dependabot/npm_and_yarn/tsdown-0.22.14
chore(deps-dev): bump tsdown from 0.22.13 to 0.22.14
2026-07-27 18:15:22 +00:00
dependabot[bot]andGitHub 50d4923ad3 chore(deps-dev): bump tsdown from 0.22.13 to 0.22.14
Bumps [tsdown](https://github.com/rolldown/tsdown) from 0.22.13 to 0.22.14.
- [Release notes](https://github.com/rolldown/tsdown/releases)
- [Commits](https://github.com/rolldown/tsdown/compare/v0.22.13...v0.22.14)

---
updated-dependencies:
- dependency-name: tsdown
  dependency-version: 0.22.14
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-27 08:44:11 +00:00
dependabot[bot]andGitHub 0c272cdc1e chore(deps): bump @bufbuild/protobuf from 2.12.1 to 2.13.0
Bumps [@bufbuild/protobuf](https://github.com/bufbuild/protobuf-es/tree/HEAD/packages/protobuf) from 2.12.1 to 2.13.0.
- [Release notes](https://github.com/bufbuild/protobuf-es/releases)
- [Commits](https://github.com/bufbuild/protobuf-es/commits/v2.13.0/packages/protobuf)

---
updated-dependencies:
- dependency-name: "@bufbuild/protobuf"
  dependency-version: 2.13.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-27 08:43:47 +00:00
dependabot[bot]andGitHub 9996c59535 chore(deps): bump crypto-random-string from 5.0.0 to 6.0.0
Bumps [crypto-random-string](https://github.com/sindresorhus/crypto-random-string) from 5.0.0 to 6.0.0.
- [Release notes](https://github.com/sindresorhus/crypto-random-string/releases)
- [Commits](https://github.com/sindresorhus/crypto-random-string/compare/v5.0.0...v6.0.0)

---
updated-dependencies:
- dependency-name: crypto-random-string
  dependency-version: 6.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-27 08:43:26 +00:00
dependabot[bot]andGitHub 2e121c4c3b chore(deps): bump lucide-react from 1.25.0 to 1.26.0
Bumps [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) from 1.25.0 to 1.26.0.
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/1.26.0/packages/lucide-react)

---
updated-dependencies:
- dependency-name: lucide-react
  dependency-version: 1.26.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-27 08:43:04 +00:00
dependabot[bot]andGitHub 726075b0ab chore(deps-dev): bump @bufbuild/protoc-gen-es from 2.12.1 to 2.13.0
Bumps [@bufbuild/protoc-gen-es](https://github.com/bufbuild/protobuf-es/tree/HEAD/packages/protoc-gen-es) from 2.12.1 to 2.13.0.
- [Release notes](https://github.com/bufbuild/protobuf-es/releases)
- [Commits](https://github.com/bufbuild/protobuf-es/commits/v2.13.0/packages/protoc-gen-es)

---
updated-dependencies:
- dependency-name: "@bufbuild/protoc-gen-es"
  dependency-version: 2.13.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-27 08:42:38 +00:00
dependabot[bot]andGitHub 46c2b5f262 chore(deps-dev): bump lint-staged from 17.1.0 to 17.2.0
Bumps [lint-staged](https://github.com/lint-staged/lint-staged) from 17.1.0 to 17.2.0.
- [Release notes](https://github.com/lint-staged/lint-staged/releases)
- [Changelog](https://github.com/lint-staged/lint-staged/blob/main/CHANGELOG.md)
- [Commits](https://github.com/lint-staged/lint-staged/compare/v17.1.0...v17.2.0)

---
updated-dependencies:
- dependency-name: lint-staged
  dependency-version: 17.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-27 08:42:04 +00:00
dependabot[bot]andGitHub 5d97a27bc3 chore(deps-dev): bump oxfmt from 0.59.0 to 0.60.0
Bumps [oxfmt](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt) from 0.59.0 to 0.60.0.
- [Release notes](https://github.com/oxc-project/oxc/releases)
- [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxfmt/CHANGELOG.md)
- [Commits](https://github.com/oxc-project/oxc/commits/oxfmt_v0.60.0/npm/oxfmt)

---
updated-dependencies:
- dependency-name: oxfmt
  dependency-version: 0.60.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-27 08:41:39 +00:00
dependabot[bot]andGitHub bcee361006 chore(deps): bump the radix-ui group with 20 updates
Bumps the radix-ui group with 20 updates:

| Package | From | To |
| --- | --- | --- |
| [@radix-ui/react-collapsible](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/collapsible) | `1.1.17` | `1.1.18` |
| [@radix-ui/react-dialog](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dialog) | `1.1.20` | `1.1.21` |
| [@radix-ui/react-dropdown-menu](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dropdown-menu) | `2.1.21` | `2.1.22` |
| [@radix-ui/react-separator](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/separator) | `1.1.12` | `1.1.13` |
| [@radix-ui/react-slot](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/slot) | `1.3.0` | `1.3.1` |
| [@radix-ui/react-tooltip](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tooltip) | `1.2.13` | `1.2.14` |
| [@radix-ui/react-accordion](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/accordion) | `1.2.17` | `1.2.18` |
| [@radix-ui/react-alert-dialog](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/alert-dialog) | `1.1.20` | `1.1.21` |
| [@radix-ui/react-checkbox](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/checkbox) | `1.3.8` | `1.3.9` |
| [@radix-ui/react-label](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/label) | `2.1.12` | `2.1.13` |
| [@radix-ui/react-menubar](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/menubar) | `1.1.21` | `1.1.22` |
| [@radix-ui/react-popover](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/popover) | `1.1.20` | `1.1.21` |
| [@radix-ui/react-scroll-area](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/scroll-area) | `1.2.15` | `1.2.16` |
| [@radix-ui/react-select](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/select) | `2.3.4` | `2.3.5` |
| [@radix-ui/react-slider](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/slider) | `1.4.4` | `1.4.5` |
| [@radix-ui/react-switch](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/switch) | `1.3.4` | `1.3.5` |
| [@radix-ui/react-tabs](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tabs) | `1.1.18` | `1.1.19` |
| [@radix-ui/react-toast](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/toast) | `1.2.20` | `1.2.21` |
| [@radix-ui/react-toggle-group](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/toggle-group) | `1.1.16` | `1.1.17` |
| [@radix-ui/react-visually-hidden](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/visually-hidden) | `1.2.8` | `1.2.9` |


Updates `@radix-ui/react-collapsible` from 1.1.17 to 1.1.18
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/collapsible/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/collapsible)

Updates `@radix-ui/react-dialog` from 1.1.20 to 1.1.21
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/dialog/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/dialog)

Updates `@radix-ui/react-dropdown-menu` from 2.1.21 to 2.1.22
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/dropdown-menu/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/dropdown-menu)

Updates `@radix-ui/react-separator` from 1.1.12 to 1.1.13
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/separator/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/separator)

Updates `@radix-ui/react-slot` from 1.3.0 to 1.3.1
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/slot/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/slot)

Updates `@radix-ui/react-tooltip` from 1.2.13 to 1.2.14
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/tooltip/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/tooltip)

Updates `@radix-ui/react-accordion` from 1.2.17 to 1.2.18
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/accordion/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/accordion)

Updates `@radix-ui/react-alert-dialog` from 1.1.20 to 1.1.21
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/alert-dialog/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/alert-dialog)

Updates `@radix-ui/react-checkbox` from 1.3.8 to 1.3.9
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/checkbox/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/checkbox)

Updates `@radix-ui/react-label` from 2.1.12 to 2.1.13
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/label/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/label)

Updates `@radix-ui/react-menubar` from 1.1.21 to 1.1.22
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/menubar/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/menubar)

Updates `@radix-ui/react-popover` from 1.1.20 to 1.1.21
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/popover/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/popover)

Updates `@radix-ui/react-scroll-area` from 1.2.15 to 1.2.16
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/scroll-area/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/scroll-area)

Updates `@radix-ui/react-select` from 2.3.4 to 2.3.5
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/select/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/select)

Updates `@radix-ui/react-slider` from 1.4.4 to 1.4.5
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/slider/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/slider)

Updates `@radix-ui/react-switch` from 1.3.4 to 1.3.5
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/switch/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/switch)

Updates `@radix-ui/react-tabs` from 1.1.18 to 1.1.19
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/tabs/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/tabs)

Updates `@radix-ui/react-toast` from 1.2.20 to 1.2.21
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/toast/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/toast)

Updates `@radix-ui/react-toggle-group` from 1.1.16 to 1.1.17
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/toggle-group/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/toggle-group)

Updates `@radix-ui/react-visually-hidden` from 1.2.8 to 1.2.9
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/visually-hidden/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/visually-hidden)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-collapsible"
  dependency-version: 1.1.18
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-dialog"
  dependency-version: 1.1.21
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-dropdown-menu"
  dependency-version: 2.1.22
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-separator"
  dependency-version: 1.1.13
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-slot"
  dependency-version: 1.3.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-tooltip"
  dependency-version: 1.2.14
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-accordion"
  dependency-version: 1.2.18
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-alert-dialog"
  dependency-version: 1.1.21
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-checkbox"
  dependency-version: 1.3.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-label"
  dependency-version: 2.1.13
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-menubar"
  dependency-version: 1.1.22
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-popover"
  dependency-version: 1.1.21
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-scroll-area"
  dependency-version: 1.2.16
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-select"
  dependency-version: 2.3.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-slider"
  dependency-version: 1.4.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-switch"
  dependency-version: 1.3.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-tabs"
  dependency-version: 1.1.19
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-toast"
  dependency-version: 1.2.21
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-toggle-group"
  dependency-version: 1.1.17
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-visually-hidden"
  dependency-version: 1.2.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-27 08:40:21 +00:00
copilot-swe-agent[bot]andGitHub 9ee62f0866 Merge remote-tracking branch 'origin/main' into dependabot/npm_and_yarn/tanstack-4e0cd3caa5
# Conflicts:
#	apps/web/package.json
#	packages/ui/package.json
#	pnpm-lock.yaml
2026-07-25 21:32:31 +00:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Dan Ditomaso
8ffa89a503 chore(deps-dev): bump tar from 7.5.20 to 7.5.21 (#1339)
Bumps [tar](https://github.com/isaacs/node-tar) from 7.5.20 to 7.5.21.
- [Release notes](https://github.com/isaacs/node-tar/releases)
- [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/isaacs/node-tar/compare/v7.5.20...v7.5.21)

---
updated-dependencies:
- dependency-name: tar
  dependency-version: 7.5.21
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Dan Ditomaso <dan.ditomaso@gmail.com>
2026-07-25 14:45:08 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
35fe0a261b chore(deps): bump the radix-ui group across 1 directory with 19 updates (#1327)
Bumps the radix-ui group with 19 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@radix-ui/react-collapsible](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/collapsible) | `1.1.16` | `1.1.17` |
| [@radix-ui/react-dialog](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dialog) | `1.1.19` | `1.1.20` |
| [@radix-ui/react-dropdown-menu](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dropdown-menu) | `2.1.20` | `2.1.21` |
| [@radix-ui/react-separator](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/separator) | `1.1.11` | `1.1.12` |
| [@radix-ui/react-tooltip](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tooltip) | `1.2.12` | `1.2.13` |
| [@radix-ui/react-accordion](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/accordion) | `1.2.16` | `1.2.17` |
| [@radix-ui/react-alert-dialog](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/alert-dialog) | `1.1.19` | `1.1.20` |
| [@radix-ui/react-checkbox](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/checkbox) | `1.3.7` | `1.3.8` |
| [@radix-ui/react-label](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/label) | `2.1.11` | `2.1.12` |
| [@radix-ui/react-menubar](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/menubar) | `1.1.20` | `1.1.21` |
| [@radix-ui/react-popover](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/popover) | `1.1.19` | `1.1.20` |
| [@radix-ui/react-scroll-area](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/scroll-area) | `1.2.14` | `1.2.15` |
| [@radix-ui/react-select](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/select) | `2.3.3` | `2.3.4` |
| [@radix-ui/react-slider](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/slider) | `1.4.3` | `1.4.4` |
| [@radix-ui/react-switch](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/switch) | `1.3.3` | `1.3.4` |
| [@radix-ui/react-tabs](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tabs) | `1.1.17` | `1.1.18` |
| [@radix-ui/react-toast](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/toast) | `1.2.19` | `1.2.20` |
| [@radix-ui/react-toggle-group](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/toggle-group) | `1.1.15` | `1.1.16` |
| [@radix-ui/react-visually-hidden](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/visually-hidden) | `1.2.7` | `1.2.8` |



Updates `@radix-ui/react-collapsible` from 1.1.16 to 1.1.17
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/collapsible/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/collapsible)

Updates `@radix-ui/react-dialog` from 1.1.19 to 1.1.20
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/dialog/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/dialog)

Updates `@radix-ui/react-dropdown-menu` from 2.1.20 to 2.1.21
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/dropdown-menu/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/dropdown-menu)

Updates `@radix-ui/react-separator` from 1.1.11 to 1.1.12
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/separator/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/separator)

Updates `@radix-ui/react-tooltip` from 1.2.12 to 1.2.13
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/tooltip/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/tooltip)

Updates `@radix-ui/react-accordion` from 1.2.16 to 1.2.17
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/accordion/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/accordion)

Updates `@radix-ui/react-alert-dialog` from 1.1.19 to 1.1.20
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/alert-dialog/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/alert-dialog)

Updates `@radix-ui/react-checkbox` from 1.3.7 to 1.3.8
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/checkbox/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/checkbox)

Updates `@radix-ui/react-label` from 2.1.11 to 2.1.12
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/label/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/label)

Updates `@radix-ui/react-menubar` from 1.1.20 to 1.1.21
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/menubar/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/menubar)

Updates `@radix-ui/react-popover` from 1.1.19 to 1.1.20
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/popover/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/popover)

Updates `@radix-ui/react-scroll-area` from 1.2.14 to 1.2.15
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/scroll-area/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/scroll-area)

Updates `@radix-ui/react-select` from 2.3.3 to 2.3.4
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/select/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/select)

Updates `@radix-ui/react-slider` from 1.4.3 to 1.4.4
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/slider/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/slider)

Updates `@radix-ui/react-switch` from 1.3.3 to 1.3.4
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/switch/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/switch)

Updates `@radix-ui/react-tabs` from 1.1.17 to 1.1.18
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/tabs/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/tabs)

Updates `@radix-ui/react-toast` from 1.2.19 to 1.2.20
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/toast/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/toast)

Updates `@radix-ui/react-toggle-group` from 1.1.15 to 1.1.16
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/toggle-group/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/toggle-group)

Updates `@radix-ui/react-visually-hidden` from 1.2.7 to 1.2.8
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/visually-hidden/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/visually-hidden)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-accordion"
  dependency-version: 1.2.17
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-alert-dialog"
  dependency-version: 1.1.20
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-checkbox"
  dependency-version: 1.3.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-collapsible"
  dependency-version: 1.1.17
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-dialog"
  dependency-version: 1.1.20
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-dropdown-menu"
  dependency-version: 2.1.21
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-label"
  dependency-version: 2.1.12
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-menubar"
  dependency-version: 1.1.21
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-popover"
  dependency-version: 1.1.20
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-scroll-area"
  dependency-version: 1.2.15
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-select"
  dependency-version: 2.3.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-separator"
  dependency-version: 1.1.12
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-slider"
  dependency-version: 1.4.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-switch"
  dependency-version: 1.3.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-tabs"
  dependency-version: 1.1.18
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-toast"
  dependency-version: 1.2.20
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-toggle-group"
  dependency-version: 1.1.16
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-tooltip"
  dependency-version: 1.2.13
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-visually-hidden"
  dependency-version: 1.2.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-25 14:44:17 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
8670760390 chore(deps): bump tslog from 4.11.0 to 5.1.0 (#1328)
Bumps [tslog](https://github.com/fullstack-build/tslog) from 4.11.0 to 5.1.0.
- [Release notes](https://github.com/fullstack-build/tslog/releases)
- [Changelog](https://github.com/fullstack-build/tslog/blob/master/CHANGELOG.md)
- [Commits](https://github.com/fullstack-build/tslog/compare/v4.11.0...v5.1.0)

---
updated-dependencies:
- dependency-name: tslog
  dependency-version: 5.1.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-25 14:44:04 -04:00
Dan DitomasoandGitHub 54cffcf702 fix: use crypto.getRandomValues for randId to eliminate collision risk (#1282)
* fix(randId): use crypto.getRandomValues for connection IDs

Math.random() gives ~30 bits of entropy and no cryptographic guarantees.
Switch to crypto.getRandomValues over a Uint32 buffer so device / saved-
connection IDs get full 32-bit range and don't collide across concurrent
transports.

Closes #1273

* fix: assert Uint32Array index for strict TS7 compat

Under strict + noUncheckedIndexedAccess (TS7 default), buf[0] is
number | undefined. Uint32Array(1) guarantees length 1, so assert
non-null to satisfy the number return type.
2026-07-24 22:31:34 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
51b5e5c583 chore(deps): bump redhat-actions/push-to-registry from 2 to 3 (#1336)
Bumps [redhat-actions/push-to-registry](https://github.com/redhat-actions/push-to-registry) from 2 to 3.
- [Release notes](https://github.com/redhat-actions/push-to-registry/releases)
- [Changelog](https://github.com/redhat-actions/push-to-registry/blob/main/CHANGELOG.md)
- [Commits](https://github.com/redhat-actions/push-to-registry/compare/v2...v3)

---
updated-dependencies:
- dependency-name: redhat-actions/push-to-registry
  dependency-version: '3'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-24 22:31:17 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
01325180d3 chore(deps-dev): bump tsdown from 0.22.11 to 0.22.13 (#1333)
Bumps [tsdown](https://github.com/rolldown/tsdown) from 0.22.11 to 0.22.13.
- [Release notes](https://github.com/rolldown/tsdown/releases)
- [Commits](https://github.com/rolldown/tsdown/compare/v0.22.11...v0.22.13)

---
updated-dependencies:
- dependency-name: tsdown
  dependency-version: 0.22.12
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-24 22:18:17 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
40cc2f6296 chore(deps-dev): bump happy-dom from 20.10.6 to 20.11.0 (#1330)
Bumps [happy-dom](https://github.com/capricorn86/happy-dom) from 20.10.6 to 20.11.0.
- [Release notes](https://github.com/capricorn86/happy-dom/releases)
- [Commits](https://github.com/capricorn86/happy-dom/compare/v20.10.6...v20.11.0)

---
updated-dependencies:
- dependency-name: happy-dom
  dependency-version: 20.11.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-24 21:52:14 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
862c948472 chore(deps-dev): bump lint-staged from 17.0.8 to 17.1.0 (#1329)
Bumps [lint-staged](https://github.com/lint-staged/lint-staged) from 17.0.8 to 17.1.0.
- [Release notes](https://github.com/lint-staged/lint-staged/releases)
- [Changelog](https://github.com/lint-staged/lint-staged/blob/main/CHANGELOG.md)
- [Commits](https://github.com/lint-staged/lint-staged/compare/v17.0.8...v17.1.0)

---
updated-dependencies:
- dependency-name: lint-staged
  dependency-version: 17.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-24 21:37:25 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
6046c0e47e chore(deps): bump react-hook-form from 7.81.0 to 7.82.0 (#1331)
Bumps [react-hook-form](https://github.com/react-hook-form/react-hook-form) from 7.81.0 to 7.82.0.
- [Release notes](https://github.com/react-hook-form/react-hook-form/releases)
- [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md)
- [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.81.0...v7.82.0)

---
updated-dependencies:
- dependency-name: react-hook-form
  dependency-version: 7.82.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-24 21:37:05 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
6a0cfafd94 chore(deps): bump lucide-react from 1.24.0 to 1.25.0 (#1332)
Bumps [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) from 1.24.0 to 1.25.0.
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/1.25.0/packages/lucide-react)

---
updated-dependencies:
- dependency-name: lucide-react
  dependency-version: 1.25.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-24 21:36:58 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
d2e465cfa0 chore(deps-dev): bump @types/serviceworker from 0.0.199 to 0.0.200 (#1334)
Bumps [@types/serviceworker](https://github.com/microsoft/TypeScript-DOM-Lib-Generator) from 0.0.199 to 0.0.200.
- [Release notes](https://github.com/microsoft/TypeScript-DOM-Lib-Generator/releases)
- [Commits](https://github.com/microsoft/TypeScript-DOM-Lib-Generator/compare/@types/serviceworker@0.0.199...@types/serviceworker@0.0.200)

---
updated-dependencies:
- dependency-name: "@types/serviceworker"
  dependency-version: 0.0.200
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-24 21:36:43 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
f7f382ce29 chore(deps): bump vite from 8.1.4 to 8.1.5 (#1335)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.1.4 to 8.1.5.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.1.5/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.1.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-24 21:36:36 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
77cfbf257d chore(deps): bump redhat-actions/buildah-build from 2 to 3 (#1337)
Bumps [redhat-actions/buildah-build](https://github.com/redhat-actions/buildah-build) from 2 to 3.
- [Release notes](https://github.com/redhat-actions/buildah-build/releases)
- [Changelog](https://github.com/redhat-actions/buildah-build/blob/main/CHANGELOG.md)
- [Commits](https://github.com/redhat-actions/buildah-build/compare/v2...v3)

---
updated-dependencies:
- dependency-name: redhat-actions/buildah-build
  dependency-version: '3'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-24 21:30:50 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Hunter Thornsberry
01785fc024 chore(deps): bump @tailwindcss/vite from 4.3.2 to 4.3.3 (#1316)
Bumps [@tailwindcss/vite](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite) from 4.3.2 to 4.3.3.
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.3/packages/@tailwindcss-vite)

---
updated-dependencies:
- dependency-name: "@tailwindcss/vite"
  dependency-version: 4.3.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Hunter Thornsberry <hunter@hunterthornsberry.com>
2026-07-22 13:46:44 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Hunter Thornsberry
bfecd2a3f3 chore(deps-dev): bump autoprefixer from 10.5.2 to 10.5.4 (#1318)
Bumps [autoprefixer](https://github.com/postcss/autoprefixer) from 10.5.2 to 10.5.4.
- [Release notes](https://github.com/postcss/autoprefixer/releases)
- [Changelog](https://github.com/postcss/autoprefixer/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/autoprefixer/compare/10.5.2...10.5.4)

---
updated-dependencies:
- dependency-name: autoprefixer
  dependency-version: 10.5.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Hunter Thornsberry <hunter@hunterthornsberry.com>
2026-07-22 13:17:20 -04:00
Hunter ThornsberryandGitHub d49c80b829 Merge branch 'main' into dependabot/npm_and_yarn/tanstack-4e0cd3caa5 2026-07-22 12:51:32 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
d707bb1674 chore(deps-dev): bump tsdown from 0.22.7 to 0.22.11 (#1315)
Bumps [tsdown](https://github.com/rolldown/tsdown) from 0.22.7 to 0.22.11.
- [Release notes](https://github.com/rolldown/tsdown/releases)
- [Commits](https://github.com/rolldown/tsdown/compare/v0.22.7...v0.22.11)

---
updated-dependencies:
- dependency-name: tsdown
  dependency-version: 0.22.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-22 12:49:01 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
20f81b2554 chore(deps): bump immer from 11.1.11 to 11.1.15 (#1317)
Bumps [immer](https://github.com/immerjs/immer) from 11.1.11 to 11.1.15.
- [Release notes](https://github.com/immerjs/immer/releases)
- [Commits](https://github.com/immerjs/immer/compare/v11.1.11...v11.1.15)

---
updated-dependencies:
- dependency-name: immer
  dependency-version: 11.1.15
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-22 12:48:29 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
03aa01e6e7 chore(deps-dev): bump @tailwindcss/postcss from 4.3.2 to 4.3.3 (#1319)
Bumps [@tailwindcss/postcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-postcss) from 4.3.2 to 4.3.3.
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.3/packages/@tailwindcss-postcss)

---
updated-dependencies:
- dependency-name: "@tailwindcss/postcss"
  dependency-version: 4.3.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-22 12:45:28 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
214bb413bc chore(deps-dev): bump tailwindcss from 4.3.2 to 4.3.3 (#1320)
Bumps [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss) from 4.3.2 to 4.3.3.
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.3/packages/tailwindcss)

---
updated-dependencies:
- dependency-name: tailwindcss
  dependency-version: 4.3.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-22 12:44:51 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
3a1a29326d chore(deps): bump better-result from 2.9.2 to 2.10.0 (#1321)
Bumps [better-result](https://github.com/dmmulroy/better-result) from 2.9.2 to 2.10.0.
- [Release notes](https://github.com/dmmulroy/better-result/releases)
- [Commits](https://github.com/dmmulroy/better-result/compare/v2.9.2...v2.10.0)

---
updated-dependencies:
- dependency-name: better-result
  dependency-version: 2.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-22 12:44:22 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
ebe2b32554 chore(deps): bump react-i18next from 17.0.9 to 17.0.10 (#1322)
Bumps [react-i18next](https://github.com/i18next/react-i18next) from 17.0.9 to 17.0.10.
- [Changelog](https://github.com/i18next/react-i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/react-i18next/compare/v17.0.9...v17.0.10)

---
updated-dependencies:
- dependency-name: react-i18next
  dependency-version: 17.0.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-22 12:43:57 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>Dan DitomasoHunter Thornsberry
aec3ad9ed3 chore(deps-dev): bump oxfmt from 0.58.0 to 0.59.0 (#1306)
* chore(deps-dev): bump oxfmt from 0.58.0 to 0.59.0

Bumps [oxfmt](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt) from 0.58.0 to 0.59.0.
- [Release notes](https://github.com/oxc-project/oxc/releases)
- [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxfmt/CHANGELOG.md)
- [Commits](https://github.com/oxc-project/oxc/commits/oxfmt_v0.59.0/npm/oxfmt)

---
updated-dependencies:
- dependency-name: oxfmt
  dependency-version: 0.59.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* chore: fix formatting issues for oxfmt 0.59.0

* fix: add vitest.config.ts for packages/ui to avoid unplugin-dts TypeScript 7 crash

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Dan Ditomaso <dan.ditomaso@gmail.com>
Co-authored-by: Hunter Thornsberry <hunter@hunterthornsberry.com>
2026-07-22 12:43:26 -04:00
dependabot[bot]andGitHub d71be596ab chore(deps): bump the tanstack group across 1 directory with 3 updates
Bumps the tanstack group with 3 updates in the / directory: [@tanstack/react-router](https://github.com/TanStack/router/tree/HEAD/packages/react-router), [@tanstack/router-cli](https://github.com/TanStack/router/tree/HEAD/packages/router-cli) and [@tanstack/router-plugin](https://github.com/TanStack/router/tree/HEAD/packages/router-plugin).


Updates `@tanstack/react-router` from 1.170.17 to 1.170.18
- [Release notes](https://github.com/TanStack/router/releases)
- [Changelog](https://github.com/TanStack/router/blob/main/packages/react-router/CHANGELOG.md)
- [Commits](https://github.com/TanStack/router/commits/@tanstack/react-router@1.170.18/packages/react-router)

Updates `@tanstack/router-cli` from 1.167.18 to 1.167.21
- [Release notes](https://github.com/TanStack/router/releases)
- [Changelog](https://github.com/TanStack/router/blob/main/packages/router-cli/CHANGELOG.md)
- [Commits](https://github.com/TanStack/router/commits/@tanstack/router-cli@1.167.21/packages/router-cli)

Updates `@tanstack/router-plugin` from 1.168.19 to 1.168.22
- [Release notes](https://github.com/TanStack/router/releases)
- [Changelog](https://github.com/TanStack/router/blob/main/packages/router-plugin/CHANGELOG.md)
- [Commits](https://github.com/TanStack/router/commits/@tanstack/router-plugin@1.168.22/packages/router-plugin)

---
updated-dependencies:
- dependency-name: "@tanstack/react-router"
  dependency-version: 1.170.18
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: tanstack
- dependency-name: "@tanstack/router-cli"
  dependency-version: 1.167.19
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: tanstack
- dependency-name: "@tanstack/router-plugin"
  dependency-version: 1.168.20
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: tanstack
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-21 08:43:31 +00:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
1eeabeaa91 chore(deps): bump actions/setup-python from 6 to 7 (#1323)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 6 to 7.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v6...v7)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-20 21:33:40 -04:00
Dan DitomasoandGitHub 948474a18e fix(i18n): translate ErrorPage report intro (#1284)
The 'Please include the following information in your report:' string
was hardcoded in the component. The matching key 'errorPage.reportInstructions'
already exists in en/ui.json — wire it up so translators actually see it.

Closes #1274
2026-07-17 22:56:41 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Hunter275
abe54e3b31 chore(deps-dev): bump oxlint from 1.73.0 to 1.74.0 (#1307)
* chore(deps-dev): bump oxlint from 1.73.0 to 1.74.0

Bumps [oxlint](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint) from 1.73.0 to 1.74.0.
- [Release notes](https://github.com/oxc-project/oxc/releases)
- [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxlint/CHANGELOG.md)
- [Commits](https://github.com/oxc-project/oxc/commits/oxlint_v1.74.0/npm/oxlint)

---
updated-dependencies:
- dependency-name: oxlint
  dependency-version: 1.74.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* installed missing typescript packages

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Hunter275 <hunterthor275@gmail.com>
2026-07-17 22:11:22 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
56cfc31e0f chore(deps-dev): bump tsdown from 0.22.5 to 0.22.7 (#1302)
Bumps [tsdown](https://github.com/rolldown/tsdown) from 0.22.5 to 0.22.7.
- [Release notes](https://github.com/rolldown/tsdown/releases)
- [Commits](https://github.com/rolldown/tsdown/compare/v0.22.5...v0.22.7)

---
updated-dependencies:
- dependency-name: tsdown
  dependency-version: 0.22.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-16 21:31:44 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2f9effb04c chore(deps-dev): bump tar from 7.5.19 to 7.5.20 (#1300)
Bumps [tar](https://github.com/isaacs/node-tar) from 7.5.19 to 7.5.20.
- [Release notes](https://github.com/isaacs/node-tar/releases)
- [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/isaacs/node-tar/compare/v7.5.19...v7.5.20)

---
updated-dependencies:
- dependency-name: tar
  dependency-version: 7.5.20
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-15 08:13:07 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
d6fcc211dc chore(deps-dev): bump tsdown from 0.22.4 to 0.22.5 (#1301)
Bumps [tsdown](https://github.com/rolldown/tsdown) from 0.22.4 to 0.22.5.
- [Release notes](https://github.com/rolldown/tsdown/releases)
- [Commits](https://github.com/rolldown/tsdown/compare/v0.22.4...v0.22.5)

---
updated-dependencies:
- dependency-name: tsdown
  dependency-version: 0.22.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-15 08:12:53 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
84948adfa9 chore(deps): bump actions/setup-node from 6 to 7 (#1299)
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 6 to 7.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v6...v7)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-14 22:16:38 -04:00
Dan DitomasoandGitHub 8ffdcce1fa chore: remove production console noise (#1281)
Drop the debug log inside ChannelChat's MessageSkeleton (fired on every
Suspense fallback) and gate the dev-overrides log on isDev so it stops
running at module load in prod.

Closes #1275
Closes #1276
2026-07-13 21:42:26 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Dan Ditomaso
3297518ff4 chore(deps-dev): bump typescript from 6.0.3 to 7.0.2 (#1293)
Bumps [typescript](https://github.com/microsoft/TypeScript) from 6.0.3 to 7.0.2.
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Commits](https://github.com/microsoft/TypeScript/commits)

---
updated-dependencies:
- dependency-name: typescript
  dependency-version: 7.0.2
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Dan Ditomaso <dan.ditomaso@gmail.com>
2026-07-13 21:14:58 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2233ab3383 chore(deps): bump tslog from 4.10.2 to 4.11.0 (#1285)
Bumps [tslog](https://github.com/fullstack-build/tslog) from 4.10.2 to 4.11.0.
- [Release notes](https://github.com/fullstack-build/tslog/releases)
- [Changelog](https://github.com/fullstack-build/tslog/blob/master/CHANGELOG.md)
- [Commits](https://github.com/fullstack-build/tslog/compare/v4.10.2...v4.11.0)

---
updated-dependencies:
- dependency-name: tslog
  dependency-version: 4.11.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-13 13:59:21 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
d7dbc7e7d3 chore(deps): bump vite from 8.1.3 to 8.1.4 (#1291)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.1.3 to 8.1.4.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.1.4/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.1.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-13 13:51:16 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
1c746f0a83 chore(deps): bump @preact/signals-core from 1.14.3 to 1.14.4 (#1295)
Bumps [@preact/signals-core](https://github.com/preactjs/signals) from 1.14.3 to 1.14.4.
- [Release notes](https://github.com/preactjs/signals/releases)
- [Commits](https://github.com/preactjs/signals/compare/@preact/signals-core@1.14.3...@preact/signals-core@1.14.4)

---
updated-dependencies:
- dependency-name: "@preact/signals-core"
  dependency-version: 1.14.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-13 13:33:37 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
b14cbb2ea4 chore(deps-dev): bump tsdown from 0.22.3 to 0.22.4 (#1292)
Bumps [tsdown](https://github.com/rolldown/tsdown) from 0.22.3 to 0.22.4.
- [Release notes](https://github.com/rolldown/tsdown/releases)
- [Commits](https://github.com/rolldown/tsdown/compare/v0.22.3...v0.22.4)

---
updated-dependencies:
- dependency-name: tsdown
  dependency-version: 0.22.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-13 13:28:10 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
ea77054d1b chore(deps): bump i18next from 26.3.4 to 26.3.6 (#1290)
Bumps [i18next](https://github.com/i18next/i18next) from 26.3.4 to 26.3.6.
- [Release notes](https://github.com/i18next/i18next/releases)
- [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next/compare/v26.3.4...v26.3.6)

---
updated-dependencies:
- dependency-name: i18next
  dependency-version: 26.3.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-13 13:19:07 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
1818383efd chore(deps-dev): bump oxfmt from 0.57.0 to 0.58.0 (#1296)
Bumps [oxfmt](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt) from 0.57.0 to 0.58.0.
- [Release notes](https://github.com/oxc-project/oxc/releases)
- [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxfmt/CHANGELOG.md)
- [Commits](https://github.com/oxc-project/oxc/commits/oxfmt_v0.58.0/npm/oxfmt)

---
updated-dependencies:
- dependency-name: oxfmt
  dependency-version: 0.58.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-13 13:10:42 -04:00
AustinandGitHub 1248111621 Increase dependabot PR limit to 10 (#1294)
Defaults to 5. This big monorepo needs a bit more.
2026-07-13 13:04:55 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
c4fd4e33ff chore(deps): bump idb-keyval from 6.2.6 to 6.3.0 (#1288)
Bumps [idb-keyval](https://github.com/jakearchibald/idb-keyval) from 6.2.6 to 6.3.0.
- [Changelog](https://github.com/jakearchibald/idb-keyval/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jakearchibald/idb-keyval/compare/v6.2.6...v6.3.0)

---
updated-dependencies:
- dependency-name: idb-keyval
  dependency-version: 6.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-13 12:54:27 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
8189d6cf76 chore(deps): bump react-i18next from 17.0.8 to 17.0.9 (#1289)
Bumps [react-i18next](https://github.com/i18next/react-i18next) from 17.0.8 to 17.0.9.
- [Changelog](https://github.com/i18next/react-i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/react-i18next/compare/v17.0.8...v17.0.9)

---
updated-dependencies:
- dependency-name: react-i18next
  dependency-version: 17.0.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-13 12:46:24 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
a7d5ea7e94 chore(deps): bump lucide-react from 1.23.0 to 1.24.0 (#1286)
Bumps [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) from 1.23.0 to 1.24.0.
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/1.24.0/packages/lucide-react)

---
updated-dependencies:
- dependency-name: lucide-react
  dependency-version: 1.24.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-13 12:41:02 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
b900352920 chore(deps): bump immer from 11.1.8 to 11.1.11 (#1287)
Bumps [immer](https://github.com/immerjs/immer) from 11.1.8 to 11.1.11.
- [Release notes](https://github.com/immerjs/immer/releases)
- [Commits](https://github.com/immerjs/immer/compare/v11.1.8...v11.1.11)

---
updated-dependencies:
- dependency-name: immer
  dependency-version: 11.1.11
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-13 12:34:46 -04:00
b0bde79fc9 reoder the NavLinks (#1268)
Co-authored-by: Hunter275 <hunterthor275@gmail.com>
2026-07-11 22:29:32 -04:00
38c7569d0f Fix blank error message when using Serial on Firefox (#1254)
* add checks for both bluetooth and serial in the FeatureErrorMessage logic

* move the check further down and only show if neither needsSecureContext and needsFeature are empty

---------

Co-authored-by: Hunter275 <hunterthor275@gmail.com>
2026-07-10 21:10:39 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Hunter ThornsberryHunter275
2578415b83 chore(deps): bump @tailwindcss/vite from 4.3.1 to 4.3.2 (#1262)
* chore(deps): bump @tailwindcss/vite from 4.3.1 to 4.3.2

Bumps [@tailwindcss/vite](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite) from 4.3.1 to 4.3.2.
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.2/packages/@tailwindcss-vite)

---
updated-dependencies:
- dependency-name: "@tailwindcss/vite"
  dependency-version: 4.3.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* bump vite version fix

* fix merge issue

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Hunter Thornsberry <hunter@hunterthornsberry.com>
Co-authored-by: Hunter275 <hunterthor275@gmail.com>
2026-07-10 19:00:57 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
625ee71e48 chore(deps): bump lucide-react from 1.22.0 to 1.23.0 (#1265)
Bumps [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) from 1.22.0 to 1.23.0.
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/1.23.0/packages/lucide-react)

---
updated-dependencies:
- dependency-name: lucide-react
  dependency-version: 1.23.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-10 16:55:47 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
173ad48424 chore(deps): bump @types/node from 26.0.1 to 26.1.0 (#1264)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 26.0.1 to 26.1.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 26.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-10 15:21:00 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
c6bdd3c8b2 chore(deps-dev): bump oxlint from 1.71.0 to 1.73.0 (#1263)
Bumps [oxlint](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint) from 1.71.0 to 1.73.0.
- [Release notes](https://github.com/oxc-project/oxc/releases)
- [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxlint/CHANGELOG.md)
- [Commits](https://github.com/oxc-project/oxc/commits/oxlint_v1.73.0/npm/oxlint)

---
updated-dependencies:
- dependency-name: oxlint
  dependency-version: 1.73.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-10 15:18:11 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
671aefd11c chore(deps): bump the radix-ui group across 1 directory with 19 updates (#1247)
---
updated-dependencies:
- dependency-name: "@radix-ui/react-accordion"
  dependency-version: 1.2.15
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-alert-dialog"
  dependency-version: 1.1.18
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-checkbox"
  dependency-version: 1.3.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-collapsible"
  dependency-version: 1.1.15
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-dialog"
  dependency-version: 1.1.18
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-dropdown-menu"
  dependency-version: 2.1.19
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-label"
  dependency-version: 2.1.11
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-menubar"
  dependency-version: 1.1.19
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-popover"
  dependency-version: 1.1.18
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-scroll-area"
  dependency-version: 1.2.13
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-select"
  dependency-version: 2.3.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-separator"
  dependency-version: 1.1.11
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-slider"
  dependency-version: 1.4.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-switch"
  dependency-version: 1.3.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-tabs"
  dependency-version: 1.1.16
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-toast"
  dependency-version: 1.2.18
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-toggle-group"
  dependency-version: 1.1.14
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-tooltip"
  dependency-version: 1.2.11
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-visually-hidden"
  dependency-version: 1.2.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-10 15:14:34 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
ce61f38254 chore(deps): bump react-hook-form from 7.80.0 to 7.81.0 (#1258)
Bumps [react-hook-form](https://github.com/react-hook-form/react-hook-form) from 7.80.0 to 7.81.0.
- [Release notes](https://github.com/react-hook-form/react-hook-form/releases)
- [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md)
- [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.80.0...v7.81.0)

---
updated-dependencies:
- dependency-name: react-hook-form
  dependency-version: 7.81.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-09 21:43:17 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
4b4eb3265d chore(deps): bump the tanstack group across 1 directory with 3 updates (#1246)
Bumps the tanstack group with 3 updates in the / directory: [@tanstack/react-router](https://github.com/TanStack/router/tree/HEAD/packages/react-router), [@tanstack/router-cli](https://github.com/TanStack/router/tree/HEAD/packages/router-cli) and [@tanstack/router-plugin](https://github.com/TanStack/router/tree/HEAD/packages/router-plugin).


Updates `@tanstack/react-router` from 1.170.16 to 1.170.17
- [Release notes](https://github.com/TanStack/router/releases)
- [Changelog](https://github.com/TanStack/router/blob/main/packages/react-router/CHANGELOG.md)
- [Commits](https://github.com/TanStack/router/commits/@tanstack/react-router@1.170.17/packages/react-router)

Updates `@tanstack/router-cli` from 1.167.17 to 1.167.18
- [Release notes](https://github.com/TanStack/router/releases)
- [Changelog](https://github.com/TanStack/router/blob/main/packages/router-cli/CHANGELOG.md)
- [Commits](https://github.com/TanStack/router/commits/@tanstack/router-cli@1.167.18/packages/router-cli)

Updates `@tanstack/router-plugin` from 1.168.18 to 1.168.19
- [Release notes](https://github.com/TanStack/router/releases)
- [Changelog](https://github.com/TanStack/router/blob/main/packages/router-plugin/CHANGELOG.md)
- [Commits](https://github.com/TanStack/router/commits/@tanstack/router-plugin@1.168.19/packages/router-plugin)

---
updated-dependencies:
- dependency-name: "@tanstack/react-router"
  dependency-version: 1.170.17
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: tanstack
- dependency-name: "@tanstack/router-cli"
  dependency-version: 1.167.18
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: tanstack
- dependency-name: "@tanstack/router-plugin"
  dependency-version: 1.168.19
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: tanstack
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-09 21:31:27 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
4452eae48f chore(deps): bump vite from 8.1.0 to 8.1.3 (#1259)
---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.1.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-09 20:03:49 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
a7f7e8f93b chore(deps-dev): bump vitest from 4.1.9 to 4.1.10 (#1257)
Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 4.1.9 to 4.1.10.
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.10/packages/vitest)

---
updated-dependencies:
- dependency-name: vitest
  dependency-version: 4.1.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-09 16:39:42 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
69f9ad8bc3 chore(deps-dev): bump tailwindcss from 4.3.1 to 4.3.2 (#1249)
Bumps [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss) from 4.3.1 to 4.3.2.
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.2/packages/tailwindcss)

---
updated-dependencies:
- dependency-name: tailwindcss
  dependency-version: 4.3.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-09 15:36:06 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
501388eace chore(deps-dev): bump @types/chrome from 0.2.0 to 0.2.2 (#1248)
Bumps [@types/chrome](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/chrome) from 0.2.0 to 0.2.2.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/chrome)

---
updated-dependencies:
- dependency-name: "@types/chrome"
  dependency-version: 0.2.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-09 15:11:19 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
ee174e7e5f chore(deps-dev): bump oxfmt from 0.56.0 to 0.57.0 (#1250)
Bumps [oxfmt](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt) from 0.56.0 to 0.57.0.
- [Release notes](https://github.com/oxc-project/oxc/releases)
- [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxfmt/CHANGELOG.md)
- [Commits](https://github.com/oxc-project/oxc/commits/oxfmt_v0.57.0/npm/oxfmt)

---
updated-dependencies:
- dependency-name: oxfmt
  dependency-version: 0.57.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-09 15:05:27 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Dan Ditomaso
ec0c91a334 chore(deps-dev): bump @tailwindcss/postcss from 4.3.1 to 4.3.2 (#1236)
Bumps [@tailwindcss/postcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-postcss) from 4.3.1 to 4.3.2.
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.2/packages/@tailwindcss-postcss)

---
updated-dependencies:
- dependency-name: "@tailwindcss/postcss"
  dependency-version: 4.3.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Dan Ditomaso <dan.ditomaso@gmail.com>
2026-07-04 09:09:27 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
78066d545f chore(deps): bump idb-keyval from 6.2.5 to 6.2.6 (#1233)
Bumps [idb-keyval](https://github.com/jakearchibald/idb-keyval) from 6.2.5 to 6.2.6.
- [Changelog](https://github.com/jakearchibald/idb-keyval/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jakearchibald/idb-keyval/compare/v6.2.5...v6.2.6)

---
updated-dependencies:
- dependency-name: idb-keyval
  dependency-version: 6.2.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-04 09:01:08 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
dba3b9b10a chore(deps): bump @types/node from 25.9.3 to 26.0.1 (#1195)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 25.9.3 to 26.0.1.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 26.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-04 09:00:30 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
103082fb58 chore(deps-dev): bump @types/serviceworker from 0.0.197 to 0.0.199 (#1238)
Bumps [@types/serviceworker](https://github.com/microsoft/TypeScript-DOM-Lib-Generator) from 0.0.197 to 0.0.199.
- [Release notes](https://github.com/microsoft/TypeScript-DOM-Lib-Generator/releases)
- [Commits](https://github.com/microsoft/TypeScript-DOM-Lib-Generator/compare/@types/serviceworker@0.0.197...@types/serviceworker@0.0.199)

---
updated-dependencies:
- dependency-name: "@types/serviceworker"
  dependency-version: 0.0.199
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-04 08:59:36 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
858de11b3b chore(deps): bump i18next from 26.3.3 to 26.3.4 (#1237)
Bumps [i18next](https://github.com/i18next/i18next) from 26.3.3 to 26.3.4.
- [Release notes](https://github.com/i18next/i18next/releases)
- [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next/compare/v26.3.3...v26.3.4)

---
updated-dependencies:
- dependency-name: i18next
  dependency-version: 26.3.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-04 08:59:11 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
3ec58d8827 chore(deps): bump lucide-react from 1.21.0 to 1.22.0 (#1234)
Bumps [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) from 1.21.0 to 1.22.0.
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/1.22.0/packages/lucide-react)

---
updated-dependencies:
- dependency-name: lucide-react
  dependency-version: 1.22.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-02 09:20:18 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
14ab1409e0 chore(deps): bump i18next from 26.3.2 to 26.3.3 (#1228)
Bumps [i18next](https://github.com/i18next/i18next) from 26.3.2 to 26.3.3.
- [Release notes](https://github.com/i18next/i18next/releases)
- [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next/compare/v26.3.2...v26.3.3)

---
updated-dependencies:
- dependency-name: i18next
  dependency-version: 26.3.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-01 10:38:06 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
57158e4d63 chore(deps): bump vite from 8.0.16 to 8.1.0 (#1201)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.0.16 to 8.1.0.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/create-vite@8.1.0/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-01 10:37:44 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
f07e04e512 chore(deps-dev): bump tar from 7.5.17 to 7.5.19 (#1230)
Bumps [tar](https://github.com/isaacs/node-tar) from 7.5.17 to 7.5.19.
- [Release notes](https://github.com/isaacs/node-tar/releases)
- [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/isaacs/node-tar/compare/v7.5.17...v7.5.19)

---
updated-dependencies:
- dependency-name: tar
  dependency-version: 7.5.19
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-01 09:47:57 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
fd0fcb12ab chore(deps): bump react-hook-form from 7.79.0 to 7.80.0 (#1226)
Bumps [react-hook-form](https://github.com/react-hook-form/react-hook-form) from 7.79.0 to 7.80.0.
- [Release notes](https://github.com/react-hook-form/react-hook-form/releases)
- [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md)
- [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.79.0...v7.80.0)

---
updated-dependencies:
- dependency-name: react-hook-form
  dependency-version: 7.80.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 14:05:40 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
bb09381ed7 chore(deps): bump @bufbuild/protobuf from 2.12.0 to 2.12.1 (#1221)
Bumps [@bufbuild/protobuf](https://github.com/bufbuild/protobuf-es/tree/HEAD/packages/protobuf) from 2.12.0 to 2.12.1.
- [Release notes](https://github.com/bufbuild/protobuf-es/releases)
- [Commits](https://github.com/bufbuild/protobuf-es/commits/v2.12.1/packages/protobuf)

---
updated-dependencies:
- dependency-name: "@bufbuild/protobuf"
  dependency-version: 2.12.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 13:12:31 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
e884514637 chore(deps-dev): bump @playwright/test from 1.60.0 to 1.61.1 (#1225)
Bumps [@playwright/test](https://github.com/microsoft/playwright) from 1.60.0 to 1.61.1.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.60.0...v1.61.1)

---
updated-dependencies:
- dependency-name: "@playwright/test"
  dependency-version: 1.61.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 13:04:10 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
da51652ac1 chore(deps-dev): bump gzipper from 8.2.1 to 8.3.0 (#1219)
Bumps [gzipper](https://github.com/gios/gzipper) from 8.2.1 to 8.3.0.
- [Release notes](https://github.com/gios/gzipper/releases)
- [Changelog](https://github.com/gios/gzipper/blob/main/CHANGELOG.md)
- [Commits](https://github.com/gios/gzipper/compare/v8.2.1...v8.3.0)

---
updated-dependencies:
- dependency-name: gzipper
  dependency-version: 8.3.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 12:24:49 -04:00
AustinandGitHub c4f48a5ce6 chore(deps): update packageManager to pnpm@11.9.0 (#1224) 2026-06-28 12:08:02 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
16e6ac6ef9 chore(deps): bump the radix-ui group with 3 updates (#1223)
Bumps the radix-ui group with 3 updates: [@radix-ui/react-label](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/label), [@radix-ui/react-switch](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/switch) and [@radix-ui/react-toast](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/toast).


Updates `@radix-ui/react-label` from 2.1.9 to 2.1.10
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/label/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/label)

Updates `@radix-ui/react-switch` from 1.3.0 to 1.3.1
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/switch/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/switch)

Updates `@radix-ui/react-toast` from 1.2.16 to 1.2.17
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/toast/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/toast)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-label"
  dependency-version: 2.1.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-switch"
  dependency-version: 1.3.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
- dependency-name: "@radix-ui/react-toast"
  dependency-version: 1.2.17
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: radix-ui
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 12:00:53 -04:00
AustinandGitHub 0ef3b1cbe6 dependabot: Group radix-ui (#1222)
These projects all depend on each other and make a real mess. Group them.
2026-06-28 11:50:50 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
822e8e06c9 chore(deps-dev): bump @types/chrome from 0.1.43 to 0.2.0 (#1209)
Bumps [@types/chrome](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/chrome) from 0.1.43 to 0.2.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/chrome)

---
updated-dependencies:
- dependency-name: "@types/chrome"
  dependency-version: 0.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 11:43:01 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
1ee012b012 chore(deps): bump @radix-ui/react-select from 2.3.0 to 2.3.1 (#1218)
Bumps [@radix-ui/react-select](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/select) from 2.3.0 to 2.3.1.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/select/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/select)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-select"
  dependency-version: 2.3.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 11:37:12 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
80e876ab9c chore(deps): bump i18next from 26.3.1 to 26.3.2 (#1217)
Bumps [i18next](https://github.com/i18next/i18next) from 26.3.1 to 26.3.2.
- [Release notes](https://github.com/i18next/i18next/releases)
- [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next/compare/v26.3.1...v26.3.2)

---
updated-dependencies:
- dependency-name: i18next
  dependency-version: 26.3.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 11:31:51 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
c4f274c8ce chore(deps): bump @radix-ui/react-checkbox from 1.3.4 to 1.3.5 (#1216)
Bumps [@radix-ui/react-checkbox](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/checkbox) from 1.3.4 to 1.3.5.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/checkbox/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/checkbox)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-checkbox"
  dependency-version: 1.3.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 11:25:19 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
f8ae859614 chore(deps): bump @preact/signals-core from 1.14.2 to 1.14.3 (#1214)
Bumps [@preact/signals-core](https://github.com/preactjs/signals) from 1.14.2 to 1.14.3.
- [Release notes](https://github.com/preactjs/signals/releases)
- [Commits](https://github.com/preactjs/signals/compare/@preact/signals-core@1.14.2...@preact/signals-core@1.14.3)

---
updated-dependencies:
- dependency-name: "@preact/signals-core"
  dependency-version: 1.14.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 11:19:03 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
02b011351c chore(deps-dev): bump oxlint from 1.70.0 to 1.71.0 (#1215)
Bumps [oxlint](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint) from 1.70.0 to 1.71.0.
- [Release notes](https://github.com/oxc-project/oxc/releases)
- [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxlint/CHANGELOG.md)
- [Commits](https://github.com/oxc-project/oxc/commits/oxlint_v1.71.0/npm/oxlint)

---
updated-dependencies:
- dependency-name: oxlint
  dependency-version: 1.71.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 11:13:43 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
d9750a2f65 chore(deps-dev): bump oxfmt from 0.55.0 to 0.56.0 (#1213)
Bumps [oxfmt](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt) from 0.55.0 to 0.56.0.
- [Release notes](https://github.com/oxc-project/oxc/releases)
- [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxfmt/CHANGELOG.md)
- [Commits](https://github.com/oxc-project/oxc/commits/oxfmt_v0.56.0/npm/oxfmt)

---
updated-dependencies:
- dependency-name: oxfmt
  dependency-version: 0.56.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 11:07:23 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
cc912172d9 chore(deps-dev): bump tar from 7.5.16 to 7.5.17 (#1212)
Bumps [tar](https://github.com/isaacs/node-tar) from 7.5.16 to 7.5.17.
- [Release notes](https://github.com/isaacs/node-tar/releases)
- [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/isaacs/node-tar/compare/v7.5.16...v7.5.17)

---
updated-dependencies:
- dependency-name: tar
  dependency-version: 7.5.17
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 11:01:53 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
c94a53dde9 chore(deps): bump @radix-ui/react-slider from 1.4.0 to 1.4.1 (#1211)
Bumps [@radix-ui/react-slider](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/slider) from 1.4.0 to 1.4.1.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/slider/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/slider)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-slider"
  dependency-version: 1.4.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 11:00:48 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
848c840008 chore(deps): bump @radix-ui/react-scroll-area from 1.2.11 to 1.2.12 (#1210)
Bumps [@radix-ui/react-scroll-area](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/scroll-area) from 1.2.11 to 1.2.12.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/scroll-area/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/scroll-area)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-scroll-area"
  dependency-version: 1.2.12
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 10:55:23 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
d2475f99e8 chore(deps-dev): bump autoprefixer from 10.5.0 to 10.5.2 (#1207)
Bumps [autoprefixer](https://github.com/postcss/autoprefixer) from 10.5.0 to 10.5.2.
- [Release notes](https://github.com/postcss/autoprefixer/releases)
- [Changelog](https://github.com/postcss/autoprefixer/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/autoprefixer/compare/10.5.0...10.5.2)

---
updated-dependencies:
- dependency-name: autoprefixer
  dependency-version: 10.5.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 10:48:37 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
c57b3dc1c1 chore(deps): bump @radix-ui/react-tooltip from 1.2.9 to 1.2.10 (#1208)
Bumps [@radix-ui/react-tooltip](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tooltip) from 1.2.9 to 1.2.10.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/tooltip/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/tooltip)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-tooltip"
  dependency-version: 1.2.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 10:41:22 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
454adaa5d6 chore(deps-dev): bump @bufbuild/protoc-gen-es from 2.12.0 to 2.12.1 (#1204)
Bumps [@bufbuild/protoc-gen-es](https://github.com/bufbuild/protobuf-es/tree/HEAD/packages/protoc-gen-es) from 2.12.0 to 2.12.1.
- [Release notes](https://github.com/bufbuild/protobuf-es/releases)
- [Commits](https://github.com/bufbuild/protobuf-es/commits/v2.12.1/packages/protoc-gen-es)

---
updated-dependencies:
- dependency-name: "@bufbuild/protoc-gen-es"
  dependency-version: 2.12.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 10:36:10 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
86652bd45f chore(deps-dev): bump @vitejs/plugin-react from 6.0.2 to 6.0.3 (#1206)
Bumps [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) from 6.0.2 to 6.0.3.
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@6.0.3/packages/plugin-react)

---
updated-dependencies:
- dependency-name: "@vitejs/plugin-react"
  dependency-version: 6.0.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 10:04:01 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
6bbc46a3af chore(deps): bump @radix-ui/react-menubar from 1.1.17 to 1.1.18 (#1205)
Bumps [@radix-ui/react-menubar](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/menubar) from 1.1.17 to 1.1.18.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/menubar/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/menubar)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-menubar"
  dependency-version: 1.1.18
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 10:02:20 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2042299fa8 chore(deps-dev): bump vite-plugin-dts from 5.0.2 to 5.0.3 (#1200)
Bumps [vite-plugin-dts](https://github.com/qmhc/unplugin-dts/tree/HEAD/packages/vite-plugin-dts) from 5.0.2 to 5.0.3.
- [Release notes](https://github.com/qmhc/unplugin-dts/releases)
- [Changelog](https://github.com/qmhc/unplugin-dts/blob/main/packages/vite-plugin-dts/CHANGELOG.md)
- [Commits](https://github.com/qmhc/unplugin-dts/commits/vite-plugin-dts@5.0.3/packages/vite-plugin-dts)

---
updated-dependencies:
- dependency-name: vite-plugin-dts
  dependency-version: 5.0.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 09:48:09 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
264eb48756 chore(deps): bump @radix-ui/react-dropdown-menu from 2.1.17 to 2.1.18 (#1203)
Bumps [@radix-ui/react-dropdown-menu](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dropdown-menu) from 2.1.17 to 2.1.18.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/dropdown-menu/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/dropdown-menu)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-dropdown-menu"
  dependency-version: 2.1.18
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 09:47:22 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
ccd9d552f1 chore(deps): bump @radix-ui/react-accordion from 1.2.13 to 1.2.14 (#1202)
Bumps [@radix-ui/react-accordion](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/accordion) from 1.2.13 to 1.2.14.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/accordion/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/accordion)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-accordion"
  dependency-version: 1.2.14
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 09:40:51 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
16cb8b396c chore(deps): bump lucide-react from 1.18.0 to 1.21.0 (#1196)
Bumps [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) from 1.18.0 to 1.21.0.
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/1.21.0/packages/lucide-react)

---
updated-dependencies:
- dependency-name: lucide-react
  dependency-version: 1.21.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 09:30:58 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
13171616be chore(deps): bump @radix-ui/react-slot from 1.2.5 to 1.3.0 (#1199)
Bumps [@radix-ui/react-slot](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/slot) from 1.2.5 to 1.3.0.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/slot/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/slot)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-slot"
  dependency-version: 1.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 09:26:33 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
98b8cfafe7 chore(deps): bump @radix-ui/react-popover from 1.1.16 to 1.1.17 (#1198)
Bumps [@radix-ui/react-popover](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/popover) from 1.1.16 to 1.1.17.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/popover/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/popover)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-popover"
  dependency-version: 1.1.17
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 09:14:09 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
af0b50c070 chore(deps): bump @tanstack/react-router in the tanstack group (#1194)
Bumps the tanstack group with 1 update: [@tanstack/react-router](https://github.com/TanStack/router/tree/HEAD/packages/react-router).


Updates `@tanstack/react-router` from 1.170.15 to 1.170.16
- [Release notes](https://github.com/TanStack/router/releases)
- [Changelog](https://github.com/TanStack/router/blob/main/packages/react-router/CHANGELOG.md)
- [Commits](https://github.com/TanStack/router/commits/@tanstack/react-router@1.170.16/packages/react-router)

---
updated-dependencies:
- dependency-name: "@tanstack/react-router"
  dependency-version: 1.170.16
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: tanstack
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 09:11:19 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
91267d99e2 chore(deps-dev): bump lint-staged from 17.0.7 to 17.0.8 (#1197)
Bumps [lint-staged](https://github.com/lint-staged/lint-staged) from 17.0.7 to 17.0.8.
- [Release notes](https://github.com/lint-staged/lint-staged/releases)
- [Changelog](https://github.com/lint-staged/lint-staged/blob/main/CHANGELOG.md)
- [Commits](https://github.com/lint-staged/lint-staged/compare/v17.0.7...v17.0.8)

---
updated-dependencies:
- dependency-name: lint-staged
  dependency-version: 17.0.8
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 09:03:59 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
361323c490 chore(deps-dev): bump happy-dom from 20.10.3 to 20.10.6 (#1176)
Bumps [happy-dom](https://github.com/capricorn86/happy-dom) from 20.10.3 to 20.10.6.
- [Release notes](https://github.com/capricorn86/happy-dom/releases)
- [Commits](https://github.com/capricorn86/happy-dom/compare/v20.10.3...v20.10.6)

---
updated-dependencies:
- dependency-name: happy-dom
  dependency-version: 20.10.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 10:16:17 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
78476b4d47 chore(deps-dev): bump tsdown from 0.22.2 to 0.22.3 (#1185)
Bumps [tsdown](https://github.com/rolldown/tsdown) from 0.22.2 to 0.22.3.
- [Release notes](https://github.com/rolldown/tsdown/releases)
- [Commits](https://github.com/rolldown/tsdown/compare/v0.22.2...v0.22.3)

---
updated-dependencies:
- dependency-name: tsdown
  dependency-version: 0.22.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 07:59:10 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2fd53e3fd1 chore(deps): bump @radix-ui/react-separator from 1.1.9 to 1.1.10 (#1186)
Bumps [@radix-ui/react-separator](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/separator) from 1.1.9 to 1.1.10.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/separator/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/separator)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-separator"
  dependency-version: 1.1.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-22 19:52:55 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
5416282788 chore(deps): bump @radix-ui/react-dialog from 1.1.16 to 1.1.17 (#1178)
Bumps [@radix-ui/react-dialog](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dialog) from 1.1.16 to 1.1.17.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/dialog/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/dialog)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-dialog"
  dependency-version: 1.1.17
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-22 17:39:29 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
a472d8762b chore(deps): bump @radix-ui/react-visually-hidden from 1.2.5 to 1.2.6 (#1177)
Bumps [@radix-ui/react-visually-hidden](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/visually-hidden) from 1.2.5 to 1.2.6.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/visually-hidden/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/visually-hidden)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-visually-hidden"
  dependency-version: 1.2.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-22 17:16:03 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
5d128140cb chore(deps): bump @radix-ui/react-tabs from 1.1.14 to 1.1.15 (#1184)
Bumps [@radix-ui/react-tabs](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tabs) from 1.1.14 to 1.1.15.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/tabs/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/tabs)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-tabs"
  dependency-version: 1.1.15
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-22 17:08:15 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
4acdd127f5 chore(deps): bump actions/upload-artifact from 4 to 7 (#1181)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4...v7)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-22 17:07:53 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
9d1a408123 chore(deps): bump actions/checkout from 4 to 7 (#1182)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 7.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v7)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-22 17:07:01 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Austin
139ca7125f chore(deps): bump actions/setup-node from 4 to 6 (#1180)
* chore(deps): bump actions/setup-node from 4 to 6

Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 6.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v4...v6)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Use Node 24

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Austin <vidplace7@gmail.com>
2026-06-22 17:06:30 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Austin
38755cd861 chore(deps): bump pnpm/action-setup from 4 to 6 (#1183)
* chore(deps): bump pnpm/action-setup from 4 to 6

Bumps [pnpm/action-setup](https://github.com/pnpm/action-setup) from 4 to 6.
- [Release notes](https://github.com/pnpm/action-setup/releases)
- [Commits](https://github.com/pnpm/action-setup/compare/v4...v6)

---
updated-dependencies:
- dependency-name: pnpm/action-setup
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Remove pnpm version specifier (redundant)

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Austin <vidplace7@gmail.com>
2026-06-22 17:01:40 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
25a0632f77 chore(deps): bump actions/setup-python from 5 to 6 (#1179)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 6.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-22 16:59:37 -04:00
ad692eef74 test(e2e): real-device Playwright messaging suite (#1121)
* fix(connections): connect to the just-added connection via the live store

addConnectionAndConnect() adds a connection and then connects to it in the
same tick, but connect() resolved the id against the memoized `connections`
closure, which is stale until the hook re-renders. The just-added id was
therefore reported as an unknown connection id and Save silently never
connected any HTTP/Serial/Bluetooth device. Read savedConnections from
useDeviceStore.getState() so the lookup always sees the live store.

* test(e2e): real-device Playwright messaging suite

Drives the actual web app in Chromium against real meshtasticd firmware over
the HTTP phone API and verifies text messaging in both directions across a
two-node mesh. Nodes mesh over the firmware's built-in UDP multicast
(224.0.0.69) with no MQTT/relay; distinct node numbers, real encryption.

- Default backend: two Docker meshtasticd sim nodes (daily-debian). The same
  specs run against physical hardware via E2E_DEVICE_MODE=hardware.
- An off-browser Python meshtastic peer (e2e/peer/peer.py) drives/asserts the
  non-browser node over the TCP phone API, mirroring firmware mcp-server tests.
- Coverage: connect over HTTPS, mesh->web receive, web->mesh send. Direct
  messages are fixme'd (see below). CI workflow runs it on Linux.

Bugs surfaced by the suite:
- Fixed (prior commit): connect-on-save never connected (stale-closure id
  lookup in useConnections).
- Not fixed: apps/web/src/core/subscriptions.ts throws 'ReferenceError:
  nodeDB is not defined' on every device-metrics telemetry packet (the #1050
  migration removed that store); caught per-packet, so messaging still works.
- Not fixed: direct messages are blocked by a PKI 'Keys Mismatch' (the SDK's
  stored peer public key != the key presented during NodeInfo exchange), seen
  even with fresh sim nodes.

* test(e2e): address Copilot review feedback

- waitForTcp(): destroy the probe socket on the error path so repeated
  connection failures don't accumulate sockets/FDs across the retry loop.
- Don't remove the mesh containers in Playwright globalTeardown in CI — it
  raced the workflow's failure log capture. Teardown is now gated on
  E2E_DOCKER_DOWN only; CI dumps device logs on failure and tears the mesh
  down in a final always() workflow step.

* fix(sdk): fold device-metrics telemetry into nodes

apps/web/src/core/subscriptions.ts called nodeDB.addDeviceMetrics() on every
device-metrics telemetry packet, but the #1050 migration removed that store —
so it threw 'ReferenceError: nodeDB is not defined' on each telemetry packet
(caught per-packet by the SDK's HandleFromRadio, so messaging still worked but
the error spammed the console).

Route device metrics into the SDK NodesClient via onTelemetryPacket instead —
mirroring the existing position handler; the Node domain already carries a
deviceMetrics field — and drop the dead app-side handler. Adds a NodesClient
test covering the fold.

* docs(e2e): accurate DM root cause + bug status

The direct-message fixme is a simulator limitation, not a web-app bug: the
keyless meshtasticd sim nodes NAK a DM with NO_CHANNEL (routing error 6) — no
Curve25519 keypair is provisioned/shared, and current firmware can't deliver a
direct message without a per-node key / decryptable channel. The app surfaces
this correctly (key-refresh dialog). Re-enable against hardware or once the sim
provisions keys.

Also: mark the nodeDB telemetry bug fixed and note the CI teardown change.

* docs(e2e): precise DM root cause (firmware/sim PKI)

Followed up on the suggestion to provision keys in config.security: the keys
ARE settable and persist (verified via admin), but on the native meshtasticd
sim they don't sync to the node's owner / NodeInfo key — owner.public_key stays
empty and the node keeps its MAC-derived num — so the two nodes never exchange
keys. Combined with the firmware refusing non-PKI DMs ('Unknown public key for
destination ... refusing to send legacy DM'), the DM is NAK'd with NO_CHANNEL.
A firmware/sim limitation; DMs work on real hardware. Spec stays fixme.

* docs(e2e): definitive DM root cause (SimRadio PKC payload limit)

Per the steer to research the firmware: PKI keygen is gated on a set LoRa
region (NodeDB.cpp:3051) and the sim boots region-UNSET — setting lora.region
via admin DOES make the nodes generate and exchange keys (verified both ways).
But a PKI-encrypted DM still can't traverse the SimRadio: the PKC overhead
exceeds its payload limit ('Payload size larger than compressed message allows!
Send empty payload'), so the packet is truncated and the receiver NAKs
NO_CHANNEL ('No suitable channel found for decoding, hash 0x0'). The firmware
skips PKC under --sim (Router.cpp:730) for exactly this reason, but --sim also
disables the config-file loading the web app needs, so they're mutually
exclusive. DMs work on real hardware; spec stays fixme with this detail.

---------

Co-authored-by: Dan Ditomaso <dan.ditomaso@gmail.com>
2026-06-20 11:19:50 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
a7aa25aa30 chore(deps-dev): bump oxfmt from 0.54.0 to 0.55.0 (#1170)
Bumps [oxfmt](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt) from 0.54.0 to 0.55.0.
- [Release notes](https://github.com/oxc-project/oxc/releases)
- [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxfmt/CHANGELOG.md)
- [Commits](https://github.com/oxc-project/oxc/commits/oxfmt_v0.55.0/npm/oxfmt)

---
updated-dependencies:
- dependency-name: oxfmt
  dependency-version: 0.55.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-19 22:58:12 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
77cc20635b chore(deps): bump actions/checkout from 6 to 7 (#1169)
Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v6...v7)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-19 22:57:52 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
90b2cd1fc5 chore(deps): bump @radix-ui/react-toggle-group from 1.1.12 to 1.1.13 (#1168)
Bumps [@radix-ui/react-toggle-group](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/toggle-group) from 1.1.12 to 1.1.13.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/toggle-group/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/toggle-group)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-toggle-group"
  dependency-version: 1.1.13
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-19 22:57:23 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
a5e690e277 chore(deps-dev): bump oxlint from 1.69.0 to 1.70.0 (#1171)
Bumps [oxlint](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint) from 1.69.0 to 1.70.0.
- [Release notes](https://github.com/oxc-project/oxc/releases)
- [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxlint/CHANGELOG.md)
- [Commits](https://github.com/oxc-project/oxc/commits/oxlint_v1.70.0/npm/oxlint)

---
updated-dependencies:
- dependency-name: oxlint
  dependency-version: 1.70.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-19 22:21:22 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
5ab71fcd4c chore(deps): bump @radix-ui/react-collapsible from 1.1.13 to 1.1.14 (#1172)
Bumps [@radix-ui/react-collapsible](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/collapsible) from 1.1.13 to 1.1.14.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/collapsible/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/collapsible)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-collapsible"
  dependency-version: 1.1.14
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-19 22:20:49 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
bd27ed93e9 chore(deps): bump @radix-ui/react-alert-dialog from 1.1.16 to 1.1.17 (#1173)
Bumps [@radix-ui/react-alert-dialog](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/alert-dialog) from 1.1.16 to 1.1.17.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/alert-dialog/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/alert-dialog)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-alert-dialog"
  dependency-version: 1.1.17
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-19 22:20:26 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
16ec124fc3 chore(deps-dev): bump vitest from 4.1.8 to 4.1.9 (#1167)
Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 4.1.8 to 4.1.9.
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.9/packages/vitest)

---
updated-dependencies:
- dependency-name: vitest
  dependency-version: 4.1.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-18 18:18:09 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
c2839d04e3 chore(deps-dev): bump @bufbuild/protoc-gen-es from 1.10.1 to 2.12.0 (#1109)
Bumps [@bufbuild/protoc-gen-es](https://github.com/bufbuild/protobuf-es/tree/HEAD/packages/protoc-gen-es) from 1.10.1 to 2.12.0.
- [Release notes](https://github.com/bufbuild/protobuf-es/releases)
- [Commits](https://github.com/bufbuild/protobuf-es/commits/v2.12.0/packages/protoc-gen-es)

---
updated-dependencies:
- dependency-name: "@bufbuild/protoc-gen-es"
  dependency-version: 2.12.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-18 18:17:55 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Dan Ditomaso
251c073a42 chore(deps): bump @noble/curves from 1.9.7 to 2.2.0 (#1152)
* chore(deps): bump @noble/curves from 1.9.7 to 2.2.0

Bumps [@noble/curves](https://github.com/paulmillr/noble-curves) from 1.9.7 to 2.2.0.
- [Release notes](https://github.com/paulmillr/noble-curves/releases)
- [Commits](https://github.com/paulmillr/noble-curves/compare/1.9.7...2.2.0)

---
updated-dependencies:
- dependency-name: "@noble/curves"
  dependency-version: 2.2.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* refactor(web): migrate @noble/curves imports to v2 paths

- Move numberToHexUnpadded import from @noble/curves/abstract/utils to
  @noble/curves/utils.js (abstract/utils subpath removed in v2).
- Update @noble/curves/ed25519 to @noble/curves/ed25519.js to match
  required sub-import file extensions.
- Rename x25519.utils.randomPrivateKey() to randomSecretKey() (v2 API).

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Dan Ditomaso <dan.ditomaso@gmail.com>
2026-06-16 22:12:32 -04:00
AustinandGitHub d2cb51d489 Execute oxfmt (#1166)
Ran
pnpm oxfmt .

This should get the web repo aligned so that we can better enforce oxfmt going forward.
2026-06-16 20:30:08 -04:00
AustinandGitHub c5690d1edb Update oxfmt and do not fail Actions (#1145)
* Update oxfmt to 0.54.0

* Add global oxfmtrc rules

* CI: Do not fail for formatting
2026-06-16 15:33:57 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
e1ea1c4f02 chore(deps-dev): bump happy-dom from 20.8.9 to 20.10.3 (#1165)
Bumps [happy-dom](https://github.com/capricorn86/happy-dom) from 20.8.9 to 20.10.3.
- [Release notes](https://github.com/capricorn86/happy-dom/releases)
- [Commits](https://github.com/capricorn86/happy-dom/compare/v20.8.9...v20.10.3)

---
updated-dependencies:
- dependency-name: happy-dom
  dependency-version: 20.10.3
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 15:05:10 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
12c27092be chore(deps): bump @types/node from 24.12.0 to 25.9.3 (#1163)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 24.12.0 to 25.9.3.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 25.9.3
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 15:00:06 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
c3b9443701 chore(deps): bump @radix-ui/react-slot from 1.2.4 to 1.2.5 (#1164)
Bumps [@radix-ui/react-slot](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/slot) from 1.2.4 to 1.2.5.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/slot/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/slot)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-slot"
  dependency-version: 1.2.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 14:56:10 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
0d89b09b1f chore(deps): bump react-map-gl from 8.1.0 to 8.1.1 (#1162)
Bumps [react-map-gl](https://github.com/visgl/react-map-gl) from 8.1.0 to 8.1.1.
- [Release notes](https://github.com/visgl/react-map-gl/releases)
- [Changelog](https://github.com/visgl/react-map-gl/blob/v8.1.1/CHANGELOG.md)
- [Commits](https://github.com/visgl/react-map-gl/compare/v8.1.0...v8.1.1)

---
updated-dependencies:
- dependency-name: react-map-gl
  dependency-version: 8.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 14:54:08 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
77206a19ac chore(deps): bump react-error-boundary from 6.1.1 to 6.1.2 (#1161)
Bumps [react-error-boundary](https://github.com/bvaughn/react-error-boundary) from 6.1.1 to 6.1.2.
- [Release notes](https://github.com/bvaughn/react-error-boundary/releases)
- [Commits](https://github.com/bvaughn/react-error-boundary/compare/6.1.1...6.1.2)

---
updated-dependencies:
- dependency-name: react-error-boundary
  dependency-version: 6.1.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 14:50:03 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
89bfb14c77 chore(deps): bump @hookform/resolvers from 5.2.2 to 5.4.0 (#1158)
Bumps [@hookform/resolvers](https://github.com/react-hook-form/resolvers) from 5.2.2 to 5.4.0.
- [Release notes](https://github.com/react-hook-form/resolvers/releases)
- [Commits](https://github.com/react-hook-form/resolvers/compare/v5.2.2...v5.4.0)

---
updated-dependencies:
- dependency-name: "@hookform/resolvers"
  dependency-version: 5.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 14:48:53 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
4754504191 chore(deps): bump react-hook-form from 7.78.0 to 7.79.0 (#1160)
Bumps [react-hook-form](https://github.com/react-hook-form/react-hook-form) from 7.78.0 to 7.79.0.
- [Release notes](https://github.com/react-hook-form/react-hook-form/releases)
- [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md)
- [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.78.0...v7.79.0)

---
updated-dependencies:
- dependency-name: react-hook-form
  dependency-version: 7.79.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 14:45:09 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
69acc29a95 chore(deps): bump @radix-ui/react-tabs from 1.1.13 to 1.1.14 (#1159)
Bumps [@radix-ui/react-tabs](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tabs) from 1.1.13 to 1.1.14.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/tabs/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/tabs)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-tabs"
  dependency-version: 1.1.14
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 14:42:45 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2dc5dcde5c chore(deps-dev): bump @vitejs/plugin-basic-ssl from 2.1.4 to 2.3.0 (#1156)
Bumps [@vitejs/plugin-basic-ssl](https://github.com/vitejs/vite-plugin-basic-ssl) from 2.1.4 to 2.3.0.
- [Release notes](https://github.com/vitejs/vite-plugin-basic-ssl/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-basic-ssl/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-basic-ssl/compare/v2.1.4...v2.3.0)

---
updated-dependencies:
- dependency-name: "@vitejs/plugin-basic-ssl"
  dependency-version: 2.3.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 14:38:17 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
7809758537 chore(deps): bump @radix-ui/react-separator from 1.1.8 to 1.1.9 (#1157)
Bumps [@radix-ui/react-separator](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/separator) from 1.1.8 to 1.1.9.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/separator/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/separator)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-separator"
  dependency-version: 1.1.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 14:37:25 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
f32b857705 chore(deps): bump idb-keyval from 6.2.2 to 6.2.5 (#1155)
Bumps [idb-keyval](https://github.com/jakearchibald/idb-keyval) from 6.2.2 to 6.2.5.
- [Changelog](https://github.com/jakearchibald/idb-keyval/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jakearchibald/idb-keyval/compare/v6.2.2...v6.2.5)

---
updated-dependencies:
- dependency-name: idb-keyval
  dependency-version: 6.2.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 14:30:11 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
21040e8876 chore(deps-dev): bump @types/serviceworker from 0.0.158 to 0.0.197 (#1154)
Bumps [@types/serviceworker](https://github.com/microsoft/TypeScript-DOM-Lib-Generator) from 0.0.158 to 0.0.197.
- [Release notes](https://github.com/microsoft/TypeScript-DOM-Lib-Generator/releases)
- [Commits](https://github.com/microsoft/TypeScript-DOM-Lib-Generator/compare/@types/serviceworker@0.0.158...@types/serviceworker@0.0.197)

---
updated-dependencies:
- dependency-name: "@types/serviceworker"
  dependency-version: 0.0.197
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 14:29:08 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
193f45d568 chore(deps): bump @radix-ui/react-popover from 1.1.15 to 1.1.16 (#1153)
Bumps [@radix-ui/react-popover](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/popover) from 1.1.15 to 1.1.16.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/popover/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/popover)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-popover"
  dependency-version: 1.1.16
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 14:28:15 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
e6d25f2fd1 chore(deps): bump better-result from 1.0.1 to 2.9.2 (#1150)
Bumps [better-result](https://github.com/dmmulroy/better-result) from 1.0.1 to 2.9.2.
- [Release notes](https://github.com/dmmulroy/better-result/releases)
- [Commits](https://github.com/dmmulroy/better-result/compare/v1.0.1...v2.9.2)

---
updated-dependencies:
- dependency-name: better-result
  dependency-version: 2.9.2
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 14:21:43 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
a8fcd81c2b chore(deps-dev): bump jsdom from 25.0.1 to 29.1.1 (#1149)
Bumps [jsdom](https://github.com/jsdom/jsdom) from 25.0.1 to 29.1.1.
- [Release notes](https://github.com/jsdom/jsdom/releases)
- [Commits](https://github.com/jsdom/jsdom/compare/v25.0.1...v29.1.1)

---
updated-dependencies:
- dependency-name: jsdom
  dependency-version: 29.1.1
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 14:20:39 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
039df71307 chore(deps-dev): bump tsdown from 0.15.12 to 0.22.2 (#1151)
Bumps [tsdown](https://github.com/rolldown/tsdown) from 0.15.12 to 0.22.2.
- [Release notes](https://github.com/rolldown/tsdown/releases)
- [Commits](https://github.com/rolldown/tsdown/compare/v0.15.12...v0.22.2)

---
updated-dependencies:
- dependency-name: tsdown
  dependency-version: 0.22.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 14:15:39 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
3df59aa3a1 chore(deps): bump @radix-ui/react-alert-dialog from 1.1.15 to 1.1.16 (#1148)
Bumps [@radix-ui/react-alert-dialog](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/alert-dialog) from 1.1.15 to 1.1.16.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/alert-dialog/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/alert-dialog)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-alert-dialog"
  dependency-version: 1.1.16
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 12:01:12 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
3212026a89 chore(deps): bump js-cookie from 3.0.7 to 3.0.8 (#1147)
Bumps [js-cookie](https://github.com/js-cookie/js-cookie) from 3.0.7 to 3.0.8.
- [Release notes](https://github.com/js-cookie/js-cookie/releases)
- [Commits](https://github.com/js-cookie/js-cookie/compare/v3.0.7...v3.0.8)

---
updated-dependencies:
- dependency-name: js-cookie
  dependency-version: 3.0.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 11:57:29 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
3fcba32b38 chore(deps): bump @turf/turf from 7.3.4 to 7.3.5 (#1146)
Bumps [@turf/turf](https://github.com/Turfjs/turf) from 7.3.4 to 7.3.5.
- [Release notes](https://github.com/Turfjs/turf/releases)
- [Changelog](https://github.com/Turfjs/turf/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Turfjs/turf/compare/v7.3.4...v7.3.5)

---
updated-dependencies:
- dependency-name: "@turf/turf"
  dependency-version: 7.3.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 11:53:18 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
1095e1c5c4 chore(deps-dev): bump vite-plugin-dts from 4.5.4 to 5.0.2 (#1137)
Bumps [vite-plugin-dts](https://github.com/qmhc/unplugin-dts/tree/HEAD/packages/vite-plugin-dts) from 4.5.4 to 5.0.2.
- [Release notes](https://github.com/qmhc/unplugin-dts/releases)
- [Changelog](https://github.com/qmhc/unplugin-dts/blob/main/packages/vite-plugin-dts/CHANGELOG.md)
- [Commits](https://github.com/qmhc/unplugin-dts/commits/vite-plugin-dts@5.0.2/packages/vite-plugin-dts)

---
updated-dependencies:
- dependency-name: vite-plugin-dts
  dependency-version: 5.0.2
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 11:48:58 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
6f4ad809ca chore(deps): bump sqlocal from 0.14.2 to 0.18.0 (#1144)
Bumps [sqlocal](https://github.com/DallasHoff/sqlocal) from 0.14.2 to 0.18.0.
- [Release notes](https://github.com/DallasHoff/sqlocal/releases)
- [Commits](https://github.com/DallasHoff/sqlocal/compare/v0.14.2...v0.18.0)

---
updated-dependencies:
- dependency-name: sqlocal
  dependency-version: 0.18.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 11:46:56 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
effacf7b91 chore(deps-dev): bump tailwindcss from 4.2.1 to 4.3.1 (#1142)
Bumps [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss) from 4.2.1 to 4.3.1.
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.1/packages/tailwindcss)

---
updated-dependencies:
- dependency-name: tailwindcss
  dependency-version: 4.3.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-16 11:46:24 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
5af1d042cf chore(deps): bump @radix-ui/react-toast from 1.2.15 to 1.2.16 (#1143)
Bumps [@radix-ui/react-toast](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/toast) from 1.2.15 to 1.2.16.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/toast/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/toast)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-toast"
  dependency-version: 1.2.16
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 23:01:14 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
f848bea33f chore(deps): bump @radix-ui/react-slider from 1.3.6 to 1.4.0 (#1141)
Bumps [@radix-ui/react-slider](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/slider) from 1.3.6 to 1.4.0.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/slider/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/slider)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-slider"
  dependency-version: 1.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 22:59:51 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
94282b634e chore(deps): bump @radix-ui/react-tooltip from 1.2.8 to 1.2.9 (#1139)
Bumps [@radix-ui/react-tooltip](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tooltip) from 1.2.8 to 1.2.9.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/tooltip/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/tooltip)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-tooltip"
  dependency-version: 1.2.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 22:55:48 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
7b8298e292 chore(deps-dev): bump @types/chrome from 0.1.37 to 0.1.43 (#1138)
Bumps [@types/chrome](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/chrome) from 0.1.37 to 0.1.43.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/chrome)

---
updated-dependencies:
- dependency-name: "@types/chrome"
  dependency-version: 0.1.43
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 22:55:20 -04:00
AustinandGitHub 0e04d37ad1 fix silly pnpm yaml keyerror (#1140)
* fix silly pnpm yaml keyerror

* Another one
2026-06-15 22:49:12 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
a5e86f8823 chore(deps): bump @radix-ui/react-visually-hidden from 1.2.4 to 1.2.5 (#1136)
Bumps [@radix-ui/react-visually-hidden](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/visually-hidden) from 1.2.4 to 1.2.5.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/visually-hidden/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/visually-hidden)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-visually-hidden"
  dependency-version: 1.2.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 22:16:55 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
5946833e4d chore(deps): bump maplibre-gl from 5.8.0 to 5.24.0 (#1132)
Bumps [maplibre-gl](https://github.com/maplibre/maplibre-gl-js) from 5.8.0 to 5.24.0.
- [Release notes](https://github.com/maplibre/maplibre-gl-js/releases)
- [Changelog](https://github.com/maplibre/maplibre-gl-js/blob/main/CHANGELOG.md)
- [Commits](https://github.com/maplibre/maplibre-gl-js/compare/v5.8.0...v5.24.0)

---
updated-dependencies:
- dependency-name: maplibre-gl
  dependency-version: 5.24.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 22:16:16 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
598ff8d08e chore(deps): bump zustand from 5.0.8 to 5.0.14 (#1131)
Bumps [zustand](https://github.com/pmndrs/zustand) from 5.0.8 to 5.0.14.
- [Release notes](https://github.com/pmndrs/zustand/releases)
- [Commits](https://github.com/pmndrs/zustand/compare/v5.0.8...v5.0.14)

---
updated-dependencies:
- dependency-name: zustand
  dependency-version: 5.0.14
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 22:15:54 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
c710fea5fd chore(deps-dev): bump lint-staged from 16.3.3 to 17.0.7 (#1135)
Bumps [lint-staged](https://github.com/lint-staged/lint-staged) from 16.3.3 to 17.0.7.
- [Release notes](https://github.com/lint-staged/lint-staged/releases)
- [Changelog](https://github.com/lint-staged/lint-staged/blob/main/CHANGELOG.md)
- [Commits](https://github.com/lint-staged/lint-staged/compare/v16.3.3...v17.0.7)

---
updated-dependencies:
- dependency-name: lint-staged
  dependency-version: 17.0.7
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 22:06:27 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
770acaa5e0 chore(deps): bump @radix-ui/react-toggle-group from 1.1.11 to 1.1.12 (#1134)
Bumps [@radix-ui/react-toggle-group](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/toggle-group) from 1.1.11 to 1.1.12.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/toggle-group/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/toggle-group)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-toggle-group"
  dependency-version: 1.1.12
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 22:03:37 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
293a963e0e chore(deps): bump @radix-ui/react-select from 2.2.6 to 2.3.0 (#1128)
Bumps [@radix-ui/react-select](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/select) from 2.2.6 to 2.3.0.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/select/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/select)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-select"
  dependency-version: 2.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 22:02:05 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
72ed413cf1 chore(deps): bump @radix-ui/react-checkbox from 1.3.3 to 1.3.4 (#1130)
Bumps [@radix-ui/react-checkbox](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/checkbox) from 1.3.3 to 1.3.4.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/checkbox/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/checkbox)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-checkbox"
  dependency-version: 1.3.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 21:58:29 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
a290b3cd3d chore(deps-dev): bump autoprefixer from 10.4.27 to 10.5.0 (#1129)
Bumps [autoprefixer](https://github.com/postcss/autoprefixer) from 10.4.27 to 10.5.0.
- [Release notes](https://github.com/postcss/autoprefixer/releases)
- [Changelog](https://github.com/postcss/autoprefixer/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/autoprefixer/compare/10.4.27...10.5.0)

---
updated-dependencies:
- dependency-name: autoprefixer
  dependency-version: 10.5.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 21:57:23 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
dbe8953942 chore(deps-dev): bump @vitejs/plugin-react from 4.7.0 to 6.0.2 (#1127)
Bumps [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) from 4.7.0 to 6.0.2.
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@6.0.2/packages/plugin-react)

---
updated-dependencies:
- dependency-name: "@vitejs/plugin-react"
  dependency-version: 6.0.2
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 21:37:33 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Dan Ditomaso
3dec67f623 chore(deps-dev): bump typescript from 5.9.3 to 6.0.3 (#1113)
* chore(deps-dev): bump typescript from 5.9.3 to 6.0.3

Bumps [typescript](https://github.com/microsoft/TypeScript) from 5.9.3 to 6.0.3.
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Commits](https://github.com/microsoft/TypeScript/compare/v5.9.3...v6.0.3)

---
updated-dependencies:
- dependency-name: typescript
  dependency-version: 6.0.3
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* chore(tsconfig): align configs for typescript 6.0

Consolidate package tsconfigs to extend tsconfig.base.json and drop
options now redundant or invalid under TS 6 (strict, baseUrl,
allowImportingTsExtensions, strictNullChecks). Switch base module to
"preserve" and lib to ESNext. Fix apps/web typecheck script to invoke
tsc directly instead of recursive pnpm run tsc.

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Dan Ditomaso <dan.ditomaso@gmail.com>
2026-06-15 21:36:54 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
42de8e7403 chore(deps): bump vite from 7.3.5 to 8.0.16 (#1107)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.3.5 to 8.0.16.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.16/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.0.16
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 20:57:47 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
8f0db66131 chore(deps): bump tailwind-merge from 2.6.1 to 3.6.0 (#1124)
Bumps [tailwind-merge](https://github.com/dcastil/tailwind-merge) from 2.6.1 to 3.6.0.
- [Release notes](https://github.com/dcastil/tailwind-merge/releases)
- [Commits](https://github.com/dcastil/tailwind-merge/compare/v2.6.1...v3.6.0)

---
updated-dependencies:
- dependency-name: tailwind-merge
  dependency-version: 3.6.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 20:56:04 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
bcfa1bd8cc chore(deps-dev): bump @tailwindcss/postcss from 4.2.1 to 4.3.1 (#1126)
Bumps [@tailwindcss/postcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-postcss) from 4.2.1 to 4.3.1.
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.1/packages/@tailwindcss-postcss)

---
updated-dependencies:
- dependency-name: "@tailwindcss/postcss"
  dependency-version: 4.3.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 20:25:33 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
cd3bfc3c51 chore(deps): bump @tailwindcss/vite from 4.2.1 to 4.3.1 (#1125)
Bumps [@tailwindcss/vite](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite) from 4.2.1 to 4.3.1.
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.1/packages/@tailwindcss-vite)

---
updated-dependencies:
- dependency-name: "@tailwindcss/vite"
  dependency-version: 4.3.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 20:01:06 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
c4aa168af2 chore(deps): bump drizzle-orm from 0.36.4 to 0.45.2 (#1117)
Bumps [drizzle-orm](https://github.com/drizzle-team/drizzle-orm) from 0.36.4 to 0.45.2.
- [Release notes](https://github.com/drizzle-team/drizzle-orm/releases)
- [Commits](https://github.com/drizzle-team/drizzle-orm/compare/0.36.4...0.45.2)

---
updated-dependencies:
- dependency-name: drizzle-orm
  dependency-version: 0.45.2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 19:56:49 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
afc28b6e16 chore(deps): bump @radix-ui/react-dropdown-menu from 2.1.16 to 2.1.17 (#1123)
Bumps [@radix-ui/react-dropdown-menu](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dropdown-menu) from 2.1.16 to 2.1.17.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/dropdown-menu/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/dropdown-menu)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-dropdown-menu"
  dependency-version: 2.1.17
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 19:46:46 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
1590f17689 chore(deps): bump @radix-ui/react-scroll-area from 1.2.10 to 1.2.11 (#1122)
Bumps [@radix-ui/react-scroll-area](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/scroll-area) from 1.2.10 to 1.2.11.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/scroll-area/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/scroll-area)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-scroll-area"
  dependency-version: 1.2.11
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 19:44:00 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
e6cbd88a88 chore(deps): bump @radix-ui/react-switch from 1.2.6 to 1.3.0 (#1119)
Bumps [@radix-ui/react-switch](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/switch) from 1.2.6 to 1.3.0.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/switch/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/switch)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-switch"
  dependency-version: 1.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 19:39:03 -04:00
Ben MeadorsandGitHub cffa7f28ed fix(core): remove orphaned packages/core left by the #1050 squash-merge (#1120)
#1050 (Phase C) deleted packages/core in favor of @meshtastic/sdk, but the
squash-merge hit a delete/modify conflict with #1097 (which had modified
packages/core/package.json and src/meshDevice.ts), leaving those two files
behind as a broken stub. Its package.json still declared a tsdown build
(entry: "mod.ts") while mod.ts and the rest of the source were gone, so the
'Push to Main CI' build-and-package loop failed with:
  Error: Cannot find entry: "mod.ts"

Nothing depends on the workspace @meshtastic/core — the app resolves
@meshtastic/core to the JSR-published @jsr/meshtastic__core@2.6.6 — so finish
the deletion and drop the now-unused pnpm-lock importer.

Verified locally: frozen-lockfile install passes and the full build-and-package
loop builds every package green (sdk, sdk-react, sdk-storage-sqlocal, all
transports).
2026-06-15 17:44:58 -05:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
bb326798f9 chore(deps): bump @radix-ui/react-label from 2.1.8 to 2.1.9 (#1118)
Bumps [@radix-ui/react-label](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/label) from 2.1.8 to 2.1.9.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/label/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/label)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-label"
  dependency-version: 2.1.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 18:23:38 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
6719211cdb chore(deps): bump react-qrcode-logo from 4.0.0 to 4.1.0 (#1116)
Bumps [react-qrcode-logo](https://github.com/gcoro/react-qrcode-logo) from 4.0.0 to 4.1.0.
- [Changelog](https://github.com/gcoro/react-qrcode-logo/blob/master/CHANGELOG.md)
- [Commits](https://github.com/gcoro/react-qrcode-logo/compare/v4.0.0...v4.1.0)

---
updated-dependencies:
- dependency-name: react-qrcode-logo
  dependency-version: 4.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 18:19:03 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
00251a5003 chore(deps): bump the react-ecosystem group across 1 directory with 4 updates (#1108)
Bumps the react-ecosystem group with 4 updates in the / directory: [react](https://github.com/facebook/react/tree/HEAD/packages/react), [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react), [react-dom](https://github.com/facebook/react/tree/HEAD/packages/react-dom) and [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom).


Updates `react` from 19.2.4 to 19.2.7
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/react/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.2.7/packages/react)

Updates `@types/react` from 18.3.28 to 19.2.17
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

Updates `react-dom` from 19.2.4 to 19.2.7
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/react/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.2.7/packages/react-dom)

Updates `@types/react-dom` from 18.3.7 to 19.2.3
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom)

Updates `@types/react-dom` from 18.3.7 to 19.2.3
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom)

---
updated-dependencies:
- dependency-name: "@types/react"
  dependency-version: 19.2.17
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: react-ecosystem
- dependency-name: "@types/react-dom"
  dependency-version: 19.2.3
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: react-ecosystem
- dependency-name: react
  dependency-version: 19.2.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: react-ecosystem
- dependency-name: react-dom
  dependency-version: 19.2.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: react-ecosystem
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 18:14:07 -04:00
dc9749c042 feat: scaffold @meshtastic/sdk + signals/sqlocal persistence migration (#1050)
* feat(sdk): scaffold @meshtastic/sdk + @meshtastic/sdk-react

Adds two new packages laying the foundation for a domain-driven migration
away from @meshtastic/core.

packages/sdk
- DDD feature slices: device, chat, nodes, channels, config, telemetry,
  position, traceroute, files. Each with domain/application/infrastructure/state.
- Shared kernel under core/: MeshClient orchestrator, Transport interface
  (byte-compat with existing transport-* packages), EventBus (typed pub/sub),
  packet codec, Queue, Xmodem, signals helpers, tslog factory.
- Signals via @preact/signals-core. Application use-cases return
  Result<T,E> via better-result; legacy ports keep throwing.
- shim/ re-exports the legacy MeshDevice/Types/Utils API so
  packages/web continues to build unchanged.
- createFakeTransport() under @meshtastic/sdk/testing.
- 16 vitest tests incl. end-to-end fake-transport integration.

packages/sdk-react
- MeshProvider + useSignal/useSignalValue/useClient adapters.
- Hooks: useDevice, useConnection, useChat, useNodes, useNode,
  useChannels, useChannel, useConfig, useModuleConfig, useTelemetry,
  usePosition, useTraceroute, useFileTransfer, useFavoriteNode, useIgnoreNode.
- jsdom-backed hook tests.

Root README rewritten with packages table, architecture, and workflow.

* refactor(web): import @meshtastic/sdk instead of @meshtastic/core

Mechanical swap across all 74 @meshtastic/core imports in packages/web/src.
The SDK's shim layer re-exports the legacy MeshDevice/Types/Utils/Protobuf
surface, so no source edits are required beyond the import path. All 294
web vitest tests still pass.

This is Phase B step 1: web now runs on @meshtastic/sdk's MeshDevice shim.
Per-slice store migrations (messageStore/nodeDBStore/deviceStore →
useChat/useNodes/useDevice etc.) land in follow-up commits.

* feat(sdk): add MeshRegistry + multi-client React providers

Phase B prep for web migration. Web holds multiple simultaneous device
connections keyed by ConnectionId, so per-slice hook migrations need a
registry-aware provider.

packages/sdk
- MeshRegistry: Map<ConnectionId, MeshClient> with signals for list/active/activeId.
  create()/get()/has()/remove()/setActive().
- First-created client auto-activates.
- remove() disconnects the client and rotates active to another entry.
- 4 vitest cases covering create, auto-activate, duplicate rejection, and remove.

packages/sdk-react
- MeshRegistryProvider + MeshRegistryContext.
- useMeshRegistry, useOptionalMeshRegistry, useActiveClient, useClientById(id).
- useClient now falls back to the registry's active client when no direct
  <MeshProvider> is present, so existing hooks work unchanged under a
  registry-backed app.

No web-facing changes in this commit; used by follow-up slice migrations.

* refactor(sdk-react): rename useDevice → useMeshDevice

Prevents collision with packages/web's own useDevice() Zustand hook. All
internal exports + tests updated; no behavior change.

Callers migrating off @meshtastic/core should use useMeshDevice() from
@meshtastic/sdk-react going forward.

* feat(web): mount MeshRegistryProvider at app root

Introduces a single app-wide MeshRegistry in packages/web/src/core/meshRegistry.ts
and wraps the RouterProvider in <MeshRegistryProvider>. Registry starts empty;
useConnections continues to instantiate the legacy MeshDevice shim. Subsequent
slice migrations will swap useConnections over to registry.create() and move
consumers onto useMeshDevice()/useChat()/etc from @meshtastic/sdk-react.

Adds @meshtastic/sdk-react as a web dependency. No behavior change; web tests
(294) and production build still pass.

* feat(web,sdk): register per-connection MeshClient in registry

packages/sdk
- MeshRegistry.register(id, client): adopts an externally-constructed
  MeshClient. Complements create() for migration paths where a legacy shim
  already owns the client.
- MeshRegistry.unregister(id): drops the mapping without disconnecting, for
  cases where the caller has torn down the transport itself.
- Legacy MeshDevice shim exposes its inner MeshClient as `meshClient` so
  consumers can adopt it into the registry.

packages/web
- useConnections.setupMeshDevice now registers the shim's MeshClient with the
  app-wide meshRegistry and marks it active on connect.
- removeConnection unregisters from the registry.
- Legacy Zustand deviceStore wiring is unchanged; follow-up commits will move
  read paths to useMeshDevice/useChat etc. and remove the duplicated fields.

No behavior change visible to users. Web tests (294) + SDK tests (20) still pass.

* feat(sdk): add MessageRepository port + InMemoryMessageRepository

Lays the persistence groundwork for the chat slice migration.

- MessageRepository port defines paginated reads (loadRecent, loadBefore),
  atomic writes (append, appendBatch), state updates, and retention pruning.
  Conversation keyed by ConversationKey tagged union (channel | direct peer).
- RetentionPolicy: maxPerBucket + olderThanMs knobs. Consumer decides.
- InMemoryMessageRepository ships with SDK as default + test fixture.
- ChatClient accepts { repository?, retention?, initialLoadLimit? }.
  Lazy-hydrates per conversation on first subscribe; writes through on every
  inbound message; prunes after append when retention policy is set.
- ChatClient.loadOlder(conv, before, limit) for pagination UI.
- ChatStore.prepend() for older-first inserts.

Tests: 5 new cases for InMemoryMessageRepository (paginate, update state,
retention). 25 SDK tests total, all green. Web build unchanged.

Paves the way for @meshtastic/sdk-storage-sqlocal to implement this port
against SQLite/OPFS in a follow-up.

* feat(sdk-storage-sqlocal): SQLite WASM persistence adapters

New workspace package implementing @meshtastic/sdk repository ports against
sqlocal (SQLite WASM + OPFS) with Drizzle-typed queries.

Schema (single DB, multi-device aware via device_id column)
- messages: chat history. Indexes on (device_id, conversation_key, rx_time)
  for fast pagination and on (device_id, state) for pending lookups.
- nodes: NodeDB snapshot per device (stub schema, repo lands with PR #7).
- telemetry: per-node ring buffer of readings (stub).
- _schema: migration version table.
- Hand-written DDL migrations in src/schema/migrations.ts; applied at boot.

createSqlocalDb({ databasePath })
- Opens OPFS DB, applies migrations, returns Drizzle client typed against the
  schema.
- Single instance per origin; sqlocal serializes writes via OPFS file locks.

SqlocalMessageRepository
- Implements MessageRepository: paginated loadRecent / loadBefore, append /
  appendBatch with onConflictDoNothing, updateState, prune (maxPerBucket via
  windowed DELETE + olderThanMs).
- Optional MultiTabCoordinator broadcasts messages-changed events on append.

MultiTabCoordinator
- BroadcastChannel pub/sub for cross-tab change notifications (no-ops if API
  unavailable, e.g. Node).
- acquireLock() wraps navigator.locks.request with fall-through for non-browser
  contexts.

Testing
- src/testing/createMemoryDb.ts: in-memory sql.js + Drizzle, same surface as
  the sqlocal connection. Lets repository tests run on Node CI.
- 6 SqlocalMessageRepository tests (pagination, retention, multi-device
  isolation) + 2 MultiTabCoordinator tests pass on sql.js.

Notes
- @meshtastic/sdk pkg.json now points types at ./mod.ts so workspace consumers
  resolve types directly from source. Production publish path needs a separate
  follow-up to emit a stable mod.d.ts.
- Storage pkg ships ESM only; dts disabled until tsdown's hashed-name emit
  is reconciled with mod.d.ts resolution. Workspace consumption already gets
  full types from source.

* feat(web): persist chat history via @meshtastic/sdk-storage-sqlocal

Plumbs the SDK chat slice through the OPFS-backed SQLite repository so
inbound and outbound text messages survive page reloads, with retention
capped at 1000 messages per conversation or 90 days, whichever hits first.

- packages/sdk legacy MeshDevice shim now accepts MeshClientOptions
  (chat, configId, logger). Backwards-compatible with the old
  `new MeshDevice(transport, configIdNumber)` form.
- packages/web/src/core/sdkStorage.ts: lazy singletons for the shared
  SqlocalDb and the cross-tab MultiTabCoordinator. The DB opens on first
  call so test runs that never connect stay headless-safe.
- useConnections.setupMeshDevice is now async, awaits getStorageDb, and
  passes a SqlocalMessageRepository scoped to the connection id. Falls
  back to the SDK's InMemoryMessageRepository if sqlocal init fails (no
  OPFS support, etc.).
- Vite worker format set to "es" because sqlocal's worker is ES-module
  and rolldown rejects iife with code-splitting.
- COOP/COEP dev headers were already in vite.config.ts; no further
  changes required for OPFS.

Web tests (294) and production build still green.

This is the runtime payoff of PR #5: a fresh page load populates chat from
SQLite via lazy pagination instead of rehydrating 1000 messages into memory.
The legacy Zustand messageStore is still in place for now; PR #6 (chat
slice migration) will retire it and switch UI components to useChat.

* test: testing strategy + 19 new SDK / storage / hook tests

Adds TESTING.md documenting six tiers (unit / slice / client / storage /
hook / E2E), per-package coverage gates, and the audit of where we
currently sit.

Slice tests in @meshtastic/sdk
- NodeMapper proto round-trip; NodesClient list signal updates.
- ChannelsClient indexes by channel number.
- ConfigClient merges Config + ModuleConfig variants.
- TelemetryClient latest + history per node.
- PositionClient byNode + list.
- ChatClient persistence: hydrate on first subscribe, paginate via
  loadOlder, persist inbound messages through the repository. Fixes a
  reverse-iteration bug in loadOlder discovered by the new test.

Hook tests in @meshtastic/sdk-react
- New tests/hooks.registry.test.tsx covers useMeshDevice, useNodes,
  useNode, useChannels under <MeshRegistryProvider>, plus an active-
  client switch round-trip.

Storage tests in @meshtastic/sdk-storage-sqlocal
- migrations.test.ts validates v1 DDL creates messages/nodes/telemetry/
  _schema and indexes; CREATE IF NOT EXISTS is idempotent.
- MultiTabCoordinator.broadcast.test.ts proves cross-tab BroadcastChannel
  delivery between two coordinators in the same process.
- New vitest.browser.config.ts + tests/sqlocal-opfs.browser.test.ts run
  under @vitest/browser (Playwright provider) for real OPFS round-trip
  verification. Wired as `pnpm test:browser`. Browser test files end in
  `.browser.test.ts` and are excluded from the Node runner.

E2E / firmware-simulator tier (TESTING.md §"E2E / simulator") is scoped
for a follow-up — needs CI Docker for meshtasticd.

Totals after this change:
- @meshtastic/sdk: 36 tests (was 25)
- @meshtastic/sdk-react: 8 tests (was 2)
- @meshtastic/sdk-storage-sqlocal: 12 tests (was 8)
- meshtastic-web: 294 tests (unchanged)

* feat(web): MessagesPage reads chat history from SDK / SQLite

Adds an adapter hook that bridges sdk-react's `useChat` and `useDirectChat`
to the legacy `Message` shape MessagesPage / ChannelChat / MessageItem
expect. The page now renders messages directly from the OPFS-backed
SqlocalMessageRepository — page reload hydrates lazily (last 50 per
conversation) instead of pulling 1000+ rows from IndexedDB into memory.

packages/sdk-react
- useChat() gains loadOlder(before, limit) for paginated backfill.
- New useDirectChat(peer) hook covering DM conversations.

packages/web
- src/core/hooks/useChatLegacy.ts: maps SDK `Message` → legacy
  `messageStore/types.ts` Message shape, including state translation
  (SDK Pending → legacy Waiting).
- MessagesPage flips broadcast and direct chat reads to useChatLegacy.
  getMessages call sites removed; setMessageState retained on the legacy
  store for outbound bookkeeping until the next migration step.

Drafts, unread counts, activeChat / chatType continue to live in the
Zustand messageStore — they are UI-only state and stay where they are
per the locked architecture decision. The legacy store's saveMessage,
getMessages, setMessageState, and persistence path remain in place for
now; PR cleanup follow-up will retire them once outbound state and
"delete all messages" flows are switched to the SDK.

Web test suite: 294 still green. Production Vite build clean.

* feat(web): MessagesPage outbound send through SDK ChatClient

Switches the send-text path from `connection?.sendText(...)` (legacy
MeshDevice) to `client.chat.send({ text, destination, channel })` on the
active MeshClient pulled from MeshRegistry via useActiveClient().

Side effects:
- Outbound message state (Ack / Failed) is now driven entirely by the
  SDK chat slice via routing-packet subscriptions; the manual
  setMessageState calls are removed.
- The legacy Zustand `useMessages().setMessageState` and `MessageState`
  imports are no longer used by MessagesPage. Drafts and unread counts
  still live in the Zustand store.
- `getMyNode` is no longer needed in this page (was only used to label
  the now-removed direct-message state updates).

Web tests (294) still green; production Vite build clean.

* feat(sdk,web): drafts persisted in SDK chat slice (SQLite-backed)

Moves per-conversation draft text out of the legacy Zustand messageStore
into the SDK chat slice so drafts share the same persistence + signal
machinery as messages. MessageInput now binds directly to the SDK; the
legacy `useMessages().getDraft/setDraft/clearDraft` API is no longer
called from the input.

packages/sdk
- New DraftRepository port + InMemoryDraftRepository default.
- ChatClient.drafts namespace: get(key) returns a ReadonlySignal<string>;
  set/clear keyed by ConversationKey.
- ChatClient.send auto-clears the draft for the resolved conversation on
  success (parity with prior Zustand clearDraft-on-send behavior).
- Lazy hydrate from the DraftRepository on first read of a conversation.
- 3 new tests in ChatClient.drafts.test.ts.

packages/sdk-react
- New useDraft(conversation) hook returning { text, setText, clear }.

packages/sdk-storage-sqlocal
- New `drafts` table (device_id + conversation_key composite PK, text,
  updated_at). Drizzle schema in src/schema/drafts.ts.
- Migration v2 in src/schema/migrations.ts creates the table on first
  open of an existing v1 DB.
- SqlocalDraftRepository implementing DraftRepository: load/save/clear/
  loadAll, scoped by device_id, upsert on conflict, delete on empty save.
- 6 new tests covering save/load round-trip, empty-string deletion,
  upsert, multi-device isolation, loadAll.

packages/web
- useConnections wires the SqlocalDraftRepository alongside the existing
  SqlocalMessageRepository per registered MeshClient.
- MessageInput accepts `conversation: ConversationKey` instead of the
  prior `to: Types.Destination` — fixes the legacy bug where every
  broadcast channel shared a single draft slot.
- MessagesPage passes the appropriate ConversationKey for direct/
  broadcast chats.
- MessageInput.test.tsx rewritten to mock useDraft from sdk-react.

Test counts: sdk 39 (+3), sdk-storage-sqlocal 18 (+6), web 294 unchanged.
Production Vite build clean.

* chore(web): drop saveMessage path from subscriptions, delete dead DTO

The SDK chat slice now persists every inbound/outbound text packet via the
SqlocalMessageRepository wired in useConnections, so the legacy Zustand
saveMessage path in subscriptions.ts was writing to a store no UI code
reads from.

- subscriptions.ts: removed saveMessage call + PacketToMessageDTO usage.
  Unread-count increments retained as-is (cross-cutting concern, migrates
  in a separate commit).
- subscribeAll's messageStore parameter retained as `_messageStore` for
  callsite stability while the rest of the legacy store is being retired.
- Deleted packages/web/src/core/dto/PacketToMessageDTO.ts (no remaining
  consumers; SDK has its own MessageMapper at
  packages/sdk/src/features/chat/infrastructure/MessageMapper.ts).

Web tests (294) still green; production build clean.

Out of scope, queued:
- useConnections refactor (the hook is overdue for cleanup)
- Strip dead methods from the Zustand messageStore (saveMessage,
  getMessages, setMessageState, getDraft, setDraft, clearDraft +
  Zustand-persist + IDB wrapper). Requires a follow-up sweep of the
  remaining test files that mock those methods.
- Migrate unread counts to the SDK (cross-cutting between chat + nodes).

* feat(sdk,web): ChatClient.clearConversation + clearAll; wire DeleteMessagesDialog

Rounds out the chat slice with destructive operations so the UI dialog no
longer needs the legacy Zustand deleteAllMessages.

packages/sdk
- MessageRepository port gains clearConversation(key); InMemory and
  Sqlocal adapters implement it (SQL: scoped DELETE by conversation).
- ChatStore gains clearBucket(key) + clearAll().
- ChatClient.clearConversation(conv) and ChatClient.clearAll(): empty the
  in-memory store, drop the hydrated-marker so a future subscribe
  re-fetches fresh, then delete from the repository. Repository failures
  are swallowed — UI must not get stuck behind a write error.

packages/sdk-storage-sqlocal
- SqlocalMessageRepository.clearConversation: DELETE FROM messages WHERE
  (device_id, conversation_key) match.

packages/web
- DeleteMessagesDialog swaps useMessages().deleteAllMessages for
  useActiveClient()?.chat.clearAll(). No-active-client path is a no-op
  but still closes the dialog.
- Test file updated: mocks useActiveClient; new case covers
  no-active-client safety.

Totals: sdk 39 tests unchanged (clearConversation tested transitively via
DeleteMessagesDialog; adapter-specific test queued for follow-up),
sdk-storage-sqlocal 18 unchanged, web 295 (+1).

* feat(sdk,sdk-storage-sqlocal,web): NodesRepository port + SQLite persistence

Adds SDK-side node persistence so a fresh page load rehydrates the mesh
NodeDB from disk before any device packets arrive. Web's existing Zustand
nodeDBStore continues to work unchanged in parallel — UI consumer
migration to useNodes/useNode lands in follow-up commits.

packages/sdk
- New NodesRepository port: loadAll / get / upsert / upsertBatch / remove /
  clear. InMemoryNodesRepository ships as the default.
- NodesClient takes optional { repository }, hydrates on construction,
  writes through on every onNodeInfoPacket, and keeps live signal +
  persistence in lockstep. remove/reset clear the repository alongside the
  store + drive the legacy admin message.
- MeshClientOptions exposes a `nodes` slot mirroring the existing `chat`
  slot.

packages/sdk-storage-sqlocal
- New SqlocalNodesRepository implementing the port. user / position /
  deviceMetrics serialized as base64-encoded protobuf bytes (stable
  across schema additions). Subpath export at "@meshtastic/sdk-storage-
  sqlocal/nodes".
- 6 vitest cases covering upsert + loadAll round-trip, overwrite, proto
  round-trip preserves user fields, remove, clear, multi-device isolation.

packages/web
- useConnections opens a SqlocalNodesRepository alongside the chat /
  draft repos and passes it to the new MeshDevice constructor.

Test counts: sdk 39 (unchanged — repo round-trip exercised in storage
adapter tests), sdk-storage-sqlocal 24 (+6), web 295 unchanged. Build
clean.

* feat(sdk,web): SDK Node carries hops/mqtt/key-verified; legacy adapter hook

Lays the groundwork for migrating web's 31 nodeDB consumers off the
Zustand `useNodeDB().getNodes/getNode` API onto SDK signals, without a
big-bang rewrite.

packages/sdk
- Node domain entity gains channel, viaMqtt, hopsAway, isKeyManuallyVerified
  fields. NodeMapper.fromProto now copies these from the inbound
  Protobuf.Mesh.NodeInfo. Required so downstream UIs that show "X hops
  away" / "via MQTT" / "encryption verified" can read SDK nodes without
  losing fidelity.

packages/web
- New core/hooks/useNodesLegacy.ts: useNodesLegacy() returns
  Protobuf.Mesh.NodeInfo[] derived from SDK signals; useNodeLegacy(num)
  returns a single NodeInfo. Components migrate one at a time by swapping
  useNodeDB().getNodes / getNode call sites for these hooks; templates
  stay unchanged because the result shape matches.

No consumer rewrites in this commit — that is per-component follow-up
work to keep diffs reviewable. Web tests (295) still green; production
build clean. SDK 39 / sdk-storage-sqlocal 24 unchanged.

* refactor(web): NodesPage reads node list from SDK signals

First consumer migration off the legacy Zustand nodeDBStore onto
SDK-managed nodes. Pages/Nodes/index.tsx now pulls the full node array
through useNodesLegacy() — which subscribes to the SDK NodesClient
signal underneath — and applies the existing nodeFilter predicate
client-side via useMemo.

Behavior parity:
- Same Protobuf.Mesh.NodeInfo shape rendered in the table (the legacy
  adapter ensures channel / viaMqtt / hopsAway / publicKey survive).
- Same debounce semantics — only the underlying source changed.
- hasNodeError + nodeErrors continue to come from the Zustand
  nodeDBStore until PKI-error tracking is migrated to the SDK in a
  follow-up commit (validation logic still in
  packages/web/src/core/stores/nodeDBStore/nodeValidation.ts).

The legacy nodeDBStore still populates from subscriptions.ts, so this
rewrite is reversible and runs alongside the SDK source. Web tests
(295) still green; production Vite build clean.

* refactor(web): migrate 9 nodeDB consumers onto SDK adapter

Sweeps the most-touched UI paths off useNodeDB().getNode/getMyNode/getNodes
and onto the useNodesLegacy / useNodeLegacy / useMyNodeLegacy adapters
introduced earlier. Behaviour parity preserved — the adapter returns the
same Protobuf.Mesh.NodeInfo shape components already render.

Migrated:
- components/Sidebar.tsx — myNode + node count from SDK signals.
- components/CommandPalette/index.tsx — node lookup for connection labels.
- components/UI/Avatar.tsx — single-node lookup.
- components/Dialog/RemoveNodeDialog.tsx — selected node display.
- components/Dialog/PKIBackupDialog.tsx — myNode for download/print headers.
- components/Dialog/LocationResponseDialog.tsx — sender lookup.
- components/Dialog/TracerouteResponseDialog.tsx — endpoint lookups.
- components/Dialog/NodeDetailsDialog.tsx — selected node detail.
- components/PageComponents/Settings/User.tsx — myNode for owner edit.
- components/PageComponents/Settings/Position.tsx — myNode for current position.
- components/PageComponents/Messages/TraceRoute.tsx — hop name lookup.
- components/PageComponents/Messages/MessageItem.tsx — myNode (suspending) +
  message author. The polling Suspense fallback now retriggers on the SDK
  signal instead of polling the Zustand store directly.
- components/PageComponents/Map/Popups/WaypointDetail.tsx — locked-to node.
- pages/Messages.tsx — sidebar node list + selected peer lookup.
- pages/Map/index.tsx — full filtered list + myNode for fitting. Drops the
  now-dead NODEDB_DEBOUNCE_MS constant since the SDK signal layer handles
  re-render coalescing internally.
- TraceRoute.test.tsx mocks updated to mock useNodesLegacy instead of
  useNodeDB.

NodesLayer.tsx, RemoveNodeDialog (removeNode), ResetNodeDbDialog, and
RefreshKeysDialog still depend on hasNodeError / removeNode /
removeAllNodes on the legacy nodeDB store — those move when PKI-error
tracking and the admin-message paths are migrated to the SDK in the
unread/cleanup follow-up.

Web tests: 295 still green; production Vite build clean. No SDK changes
in this commit.

* refactor(web): rename node legacy adapters to *AsProto

The "Legacy" suffix on the node-adapter hooks reads as if the hook
itself is deprecated, when in fact the hook is the bridge: it converts
SDK Node domain entities into Protobuf.Mesh.NodeInfo so consumer
templates that destructure proto fields keep working during the
migration.

- useNodesLegacy → useNodesAsProto
- useNodeLegacy → useNodeAsProto
- useMyNodeLegacy → useMyNodeAsProto
- File renamed to packages/web/src/core/hooks/useNodesAsProto.ts.

All 16 call sites updated. Test mock in
packages/web/src/components/PageComponents/Messages/TraceRoute.test.tsx
updated to the new module path.

Behaviour unchanged. 295 tests still green; production Vite build clean.

(useChatLegacy follows the same pattern but maps to a hand-written web
type, not a proto — it stays as-is for now and is queued for renaming
once the broader chat-store cleanup lands.)

* refactor(web): useFavoriteNode + useIgnoreNode drive SDK NodesClient

The favorite/ignore admin-message paths now go through the SDK NodesClient
instead of the legacy Zustand sendAdminMessage + manual proto build.

- useFavoriteNode: meshClient.nodes.favorite(nodeNum) /
  meshClient.nodes.unfavorite(nodeNum). The SDK already has
  FavoriteNodeUseCase + AdminMessageSender behind these APIs.
- useIgnoreNode: meshClient.nodes.ignore / .unignore.
- Both still mirror the optimistic flag flip into the legacy nodeDB store
  via updateFavorite / updateIgnore until that store is fully retired —
  same TODO as before, "wait for ack before flipping".

Tests rewritten to mock @meshtastic/sdk-react via vi.hoisted (so the
factory captures the spy without hitting the vi.mock hoist trap):
- assert SDK favorite/unfavorite/ignore/unignore calls
- assert legacy store mirror still fires
- assert toast + longName fallback behaviour preserved
- assert no-op when the node isn't in the SDK store yet (parity with
  the prior "getNode returned undefined" guard)

Web tests: 295 still green; production Vite build clean.

* refactor(web): ResetNodeDb + RefreshKeys dialogs read SDK; safer adapter

- ResetNodeDbDialog: connection.resetNodes() → meshClient.nodes.reset();
  on success it now also calls meshClient.chat.clearAll() instead of the
  legacy useMessages().deleteAllMessages(). PKI-error tracking and the
  in-memory nodeDB still get cleared via removeAllNodeErrors /
  removeAllNodes since those subsystems have not yet migrated. Test
  rewritten to mock useActiveClient via vi.hoisted.
- RefreshKeysDialog: drops useNodeDB().getNode in favour of
  useNodeAsProto for the missing-key node display. Test wraps render in
  a MeshRegistryProvider with an empty registry so the adapter resolves
  cleanly with no active client.

Adapter hardening (useNodesAsProto.ts)
- Switched off useNodes() / useMeshDevice() (which both throw outside a
  MeshProvider/MeshRegistryProvider with an active client) onto
  useActiveClient() + a no-op signal fallback. The hooks now return [] /
  undefined when there is no active client instead of throwing, which
  fixes RefreshKeysDialog's "no error → render null" path under tests
  that don't connect a device.

Web tests: 295 still green; production Vite build clean.

* feat(sdk,sdk-react,web): node PKI / routing-error tracking on the SDK

Moves PKI mismatch / duplicate-key validation and routing-error tracking
out of the legacy Zustand nodeDBStore and into the SDK NodesClient so
every consumer reads the same source of truth. Validates Android's gap
analysis: Meshtastic-Android does not track per-node PKI errors at all,
so the SDK must own this concern client-side.

packages/sdk
- New NodeError + NodeErrorType (Routing_Error | "MISMATCH_PKI" |
  "DUPLICATE_PKI"). Mirrors the previous web-only types.
- New nodeValidation infrastructure mapper (pure): byte-equal compare on
  publicKey, returns ValidatedNodeInfo { accepted?, error? }. Ports the
  detection rules verbatim from
  packages/web/src/core/stores/nodeDBStore/nodeValidation.ts.
- NodesClient gains an errors signal + errorFor / hasError / setError /
  clearError / clearAllErrors API. handleIncoming runs validation before
  upserting; conflicts skip the store write and record an error. A clean
  refresh of a previously-flagged node clears the error.
- handleRoutingPacket records PKI_UNKNOWN_PUBKEY / PKI_FAILED /
  PKI_SEND_FAIL_PUBLIC_KEY / NO_CHANNEL against packet.from.
- 5 new vitest cases covering MISMATCH_PKI, DUPLICATE_PKI, error-clear-on-
  refresh, routing-error capture, clearError / clearAllErrors. SDK total:
  44 tests, all green.

packages/sdk-react
- New useNodeErrors / useNodeError(num) / useHasNodeError(num) hooks.
  All resolve through useActiveClient() and fall back to empty when no
  client is present.

packages/web
- pages/Nodes/index.tsx, pages/Messages.tsx, components/PageComponents/
  Map/Layers/NodesLayer.tsx swap useNodeDB().hasNodeError for the SDK
  useNodeErrors hook + a memoised Set lookup.
- components/Dialog/RefreshKeysDialog/RefreshKeysDialog.tsx reads the
  current error from useNodeError(activeChat); useRefreshKeysDialog.ts
  drives meshClient.nodes.clearError + meshClient.nodes.remove instead
  of the legacy store. The companion test still passes through the
  empty-MeshRegistry render path because useNodeError tolerates a
  missing active client.
- core/subscriptions.ts no longer calls nodeDB.setNodeError on PKI /
  no-channel routing packets — the SDK records those itself. The dialog
  open trigger stays here.
- pages/Nodes/index.tsx drops the now-dead NODEDB_DEBOUNCE_MS constant.

Web tests: 295 still green; production Vite build clean. The legacy
nodeDB still runs its internal validation but its error map is now a
dead end — removal queued in the plan-file follow-up alongside the rest
of the nodeDB cleanup.

* chore(web): remove dead PKI / nodeError paths from legacy nodeDB

Now that the SDK NodesClient owns public-key validation and per-node
error tracking, the legacy Zustand mirrors are dead code.

packages/web/src/core/stores/nodeDBStore/index.ts
- Drops the nodeErrors map + setNodeError / getNodeError / hasNodeError /
  clearNodeError / removeAllNodeErrors methods from the NodeDB interface
  and factory.
- Drops the validateIncomingNode call inside addNode and inside
  setNodeNum's merge path; legacy mirror is now a straight last-write-
  wins shallow merge. The SDK runs validation independently against its
  own snapshot.
- Drops the nodeErrors entries from the persisted partialize shape.

packages/web/src/core/stores/nodeDBStore/types.ts
- Removes NodeError + NodeErrorType. ProcessPacketParams stays.

packages/web/src/core/stores/nodeDBStore/nodeValidation.ts — deleted
(SDK ports it at packages/sdk/src/features/nodes/infrastructure/
nodeValidation.ts and exposes the verdict via NodesClient).

packages/web/src/core/stores/index.ts — drop the dead NodeErrorType
re-export.

packages/web/src/core/stores/nodeDBStore/nodeDBStore.test.tsx
- Removes tests covering the migrated PKI behaviour (errors map,
  MISMATCH, DUPLICATE, "unions nodeErrors") — equivalent coverage now
  lives in packages/sdk/src/features/nodes/NodesClient.errors.test.ts.
- Trims the surviving merge-semantics tests to the simpler last-write-
  wins shape.
- The "selector re-renders" test swaps the deleted setNodeError mutation
  for an updateFavorite call to keep the slice-stability assertion alive.
- The "addNodeDB instance identity" assertion relaxes from .toBe to
  content equality — immer's pruneStaleNodes path can reseat the entry,
  but the registered DB's id stays stable.

components/Dialog/ResetNodeDbDialog/ResetNodeDbDialog.tsx — calls
meshClient.nodes.clearAllErrors() instead of the legacy
removeAllNodeErrors. Test mocks updated.

components/Dialog/RefreshKeysDialog/* — already migrated to SDK errors
in the previous commit; no further changes here.

Test counts: web 290 (was 295 — 5 PKI-tracking tests retired in
favour of 5 equivalent SDK tests). Production Vite build clean.

* feat(sdk,web): SDK NodesClient owns user/position/lastHeard/snr +
                 favourite-flag flips; legacy mirror retired

The SDK NodesClient now subscribes to onUserPacket / onPositionPacket /
onMeshPacket so user-record updates, GPS updates, and lastHeard / snr
refreshes flow into the signal-backed store + repository directly. The
favourite / ignored toggles also flip the local flag once the admin
message resolves successfully, so the UI no longer needs to mirror the
state into a parallel Zustand store.

packages/sdk
- NodesClient: new private patch(num, partial) helper that shallow-
  merges into the existing entry (or seeds a placeholder Node) and
  upserts to the repository in one shot. Used by:
  - onUserPacket → patch user
  - onPositionPacket → patch position
  - onMeshPacket → patch lastHeard / snr (replaces the legacy nodeDB
    processPacket flow)
  - favorite / unfavorite / ignore / unignore — flag flip on Result.ok
- NodesClient.reset({ keepMyNode? }) — preserves the local node entry
  when requested. Mirrors the previous removeAllNodes(true) semantics
  the ResetNodeDb dialog relied on.

packages/web
- core/subscriptions.ts: drops the onUserPacket / onPositionPacket /
  onNodeInfoPacket / onMeshPacket → legacy nodeDB write paths. The
  unused nodeDB parameter is renamed `_nodeDB` for callsite stability;
  it will disappear when the store itself is deleted in a follow-up.
- core/hooks/useFavoriteNode + useIgnoreNode: drop the legacy
  updateFavorite / updateIgnore mirror — the SDK flips the flag on
  success.
- components/Dialog/RemoveNodeDialog: now calls meshClient.nodes.remove
  exclusively; no legacy fall-through.
- components/Dialog/ResetNodeDbDialog: calls
  meshClient.nodes.reset({ keepMyNode: true }) and meshClient.chat.clearAll().
  No legacy nodeDB calls.
- Test mocks for useFavoriteNode / useIgnoreNode / ResetNodeDbDialog
  pruned to match.

Test counts: sdk 44 (unchanged), sdk-react 8, sdk-storage-sqlocal 24,
web 290. Production Vite build clean.

Remaining surface on the legacy nodeDB: addNode / addUser / addPosition /
processPacket / setNodeError-equivalent are now unused; the store retains
only updateFavorite / updateIgnore (no callers) and the per-device
plumbing required by the deviceContext hooks. Full deletion of
nodeDBStore queued in the plan-file follow-up.

* chore(web): drop leftover useNodeDB from Position settings page

useMyNodeAsProto already replaces getMyNode here; the import was left
behind during the nodeDB mirror retirement.

* chore(web): delete legacy nodeDBStore — SDK NodesClient is the only source of truth

The Zustand nodeDBStore had no remaining writers (the mirror in
subscriptions.ts was retired in 005d0000) and no remaining readers
outside of bookkeeping (addNodeDB / setNodeNum / removeNodeDB calls
that fed nothing). Drop the whole store along with its persistence
shim and the persistNodeDB feature flag.

- Delete packages/web/src/core/stores/nodeDBStore/.
- Drop the _nodeDB parameter from subscribeAll; it was unused.
- Drop addNodeDB / useNodeDBStore wiring from useConnections; the
  meshDeviceId reuse check now keys off the device store instead.
- useNewNodeNum no longer pokes the nodeDB.
- FactoryResetDeviceDialog drops its removeNodeDB call (and the test
  drops the matching expectation).
- Strip persistNodeDB / VITE_PERSIST_NODE_DB from featureFlags +
  dev-overrides.
- Remove the useNodeDB / useNodeDBStore re-exports + the
  bindStoreToDevice wiring from core/stores/index.ts.

* chore(web): retire Zustand messageStore — keep only Message types/enums

The persisted message Zustand store had no remaining consumers — chat
history, drafts, and message state all live on the SDK ChatClient
(SqlocalMessageRepository). The messageStore Zustand surface
(saveMessage, getMessages, setMessageState, getDraft, setDraft,
clearDraft, deleteAllMessages, clearMessageByMessageId, plus the
addMessageStore / removeMessageStore / getMessageStore / setNodeNum
plumbing) is now fully unused.

Collapse messageStore/index.ts to just the MessageState / MessageType
enums + the legacy `Message` shape that the useChatLegacy adapter and a
couple of message components still consume. Delete the Zustand
implementation and its 32-test suite.

Other knock-on cleanups in this commit:
- Drop the _messageStore param from subscribeAll (unused after the
  saveMessage-from-subscriptions retirement).
- Drop addMessageStore wiring from useConnections, removeMessageStore
  from FactoryResetDeviceDialog, setNodeNum from useNewNodeNum.
- Drop the message branch from the router context (no readers).
- RefreshKeysDialog stops keying off `useMessages().activeChat` (which
  was permanently 0 — a dead handle that quietly broke key-refresh
  UX). Use the SDK NodesClient's first error directly via
  `useNodeErrors()[0]`. The dialog manager already opens the dialog on
  PKI_UNKNOWN_PUBKEY, so picking the first error matches the intended
  flow.

* chore(web): rename useChatLegacy → useChatAsLegacyMessages

The "legacy" suffix on its own read like the hook itself was deprecated;
the actual purpose is "use SDK chat history but project it into the
legacy Message shape." Rename for clarity. Companion type names follow
suit (UseChatAsLegacyMessages{Broadcast,Direct,Params}).

* feat(sdk-react,web): migrate read-only channel consumers to SDK ChannelsClient

Phase one of the channels-slice migration (PR #8 in plan). Moves the
non-changeRegistry-coupled consumers off the legacy deviceStore.channels
Map onto the SDK signal-backed ChannelsClient.

- sdk-react useChannels: switch from useClient to useActiveClient and
  fall back to an empty signal when no client is active. Matches the
  no-throw pattern already used by useNodes / useNodeErrors so isolated
  component tests and pre-connect renders don't throw.
- Messages.tsx reads channels via useChannels(); filteredChannels is
  derived with useMemo, currentChannel via .find(). The SDK Channel
  shape (index/role/settings) matches everything this page touches.
- QRDialog reads channels directly via useChannels(); the channels Map
  prop is dropped from QRDialogProps + DialogManager.
- getChannelName loosens its parameter type to the SDK-compatible
  subset { index, settings?: { name? } } so it accepts both proto
  Channel and SDK Channel without conversion.

Channels.tsx, ImportDialog and Settings/index.tsx still read from the
deviceStore — they are coupled to changeRegistry / setChange and will
move with PR #9 (ConfigEditor).

* feat(sdk,sdk-react): scaffold ConfigEditor for the radio/module/channels edit flow

Replaces the (broken) web changeRegistry with a section-grain editor that
lives on the SDK. Per-connection state, signal-backed, exposed via
client.config.editor.

ConfigEditor (domain):
- baseline   = what the device most recently sent. Updated automatically
  from onConfigPacket / onModuleConfigPacket / onChannelPacket.
- working    = UI edits. setRadioSection / setModuleSection / setChannel.
- dirtyRadioSections / dirtyModuleSections / dirtyChannels signals plus
  an aggregate isDirty signal.
- Inbound baseline updates do NOT discard pending working changes — if a
  section is already dirty, the new baseline is recorded but working stays
  put; dirty bookkeeping recomputes against the updated baseline.
- reset() restores working = baseline.
- commit() wraps beginEditSettings → setConfig per dirty radio variant +
  setModuleConfig per dirty module variant + setChannel per dirty channel
  → commitEditSettings, then optimistically promotes working to baseline.
- Disconnect clears both baseline and working so a stale working copy can
  never leak across reconnects.

Domain types:
- RadioConfig and ModuleConfig are now derived directly from the proto
  Config / ModuleConfig payloadVariant union (Extract<{case: V}> shape) so
  new variants stay typed without manual list maintenance. This adds
  deviceUi (radio) and statusmessage (module) automatically.

sdk-react:
- New useConfigEditor() hook returns the editor for the active client, or
  undefined when no client is active. Components subscribe to the editor's
  signals via the existing useSignal helper.

Tests:
- 5 new ConfigEditor tests covering: clean start, dirty tracking, multi-
  section dirty, reset, mid-edit baseline update preservation, and
  disconnect-clears-state. SDK suite 49 passing.

This commit is scaffolding only — no web settings page rewires yet. The
~25 settings pages move to editor.set* / editor.commit() in follow-up
commits, replacing setChange / commitEditSettings call sites and unblocking
deletion of changeRegistry from the device store.

* feat(web): pilot Position / LoRa / MQTT pages on ConfigEditor; Android-aligned layout + labels

First three settings pages migrated off the legacy changeRegistry to the
SDK ConfigEditor. Section structure, field order, and visible strings
are taken from the Meshtastic-Android source of truth so the web and
mobile UIs converge.

Position (radio config):
- Four cards in Android order: Position Packet → Device GPS → Position
  Flags → Advanced Device GPS.
- Card 1 fields: positionBroadcastSecs, positionBroadcastSmartEnabled,
  broadcastSmartMinimumIntervalSecs (renamed "Smart Interval"),
  broadcastSmartMinimumDistance ("Smart Distance").
- Card 2 fields: fixedPosition, lat/lng/altitude (when fixed), gpsMode
  ("GPS Mode (Physical Hardware)"), gpsUpdateInterval ("GPS Polling
  Interval"). gpsMode + gpsUpdateInterval disable when fixedPosition is
  on; lat/lng/altitude disable when it's off.
- Card 3 fields: positionFlags multiselect (description from Android).
- Card 4 fields: rxGpio ("GPS Receive GPIO"), txGpio ("GPS Transmit
  GPIO"), gpsEnGpio ("GPS EN GPIO").
- onSubmit now calls editor.setRadioSection("position", payload). The
  setFixedPosition admin message path is unchanged.

LoRa (radio config):
- Two cards: Options + Advanced (was three: Mesh / Waveform / Radio).
- Options: region, usePreset, modemPreset (when usePreset),
  bandwidth/spreadFactor/codingRate (when !usePreset).
- Advanced: ignoreMqtt, configOkToMqtt, txEnabled, overrideDutyCycle,
  hopLimit (now "Number of Hops", select 0..7), channelNum,
  sx126xRxBoostedGain ("RX Boosted Gain"), overrideFrequency
  ("Frequency Override"), txPower.
- Drop frequencyOffset (Android does not surface it).
- onSubmit calls editor.setRadioSection("lora", payload).

MQTT (module config):
- Two cards: MQTT Config + Map reporting (new card).
- Card 1: enabled ("MQTT enabled"), address, username, password,
  encryptionEnabled, jsonEnabled, tlsEnabled, root ("Root topic"),
  proxyToClientEnabled.
- Card 2: mapReportingEnabled, mapReportSettings.shouldReportLocation
  (consent gate, "I agree."), positionPrecision (12-15 buckets),
  publishIntervalSecs ("Map reporting interval (seconds)").
- positionPrecision + publishIntervalSecs disable until both
  mapReportingEnabled and shouldReportLocation are true.
- onSubmit calls editor.setModuleSection("mqtt", payload).
- Validation schema gains shouldReportLocation; address/username/
  password limits widened to 63 to match proto, root capped at 31.

Settings/index.tsx handleSave:
- After the legacy changeRegistry flow, runs editor.commit() when the
  editor is dirty. Two beginEdit/commitEdit windows are fine — the
  device handles them sequentially. Once the rest of the settings pages
  migrate, the legacy flow goes away and only editor.commit() remains.
- Save button gating includes editor.isDirty so users can save
  ConfigEditor-only changes (e.g. just a LoRa region tweak).

i18n:
- New section labels (config.json position.{positionPacket,deviceGps,
  advancedDeviceGps}; lora.{optionsCard,advancedCard}; moduleConfig.json
  mqtt.{mqttConfigCard,mapReportingCard}).
- Field labels reworded to match Android strings.xml.
- mqtt.mapReportSettings.shouldReportLocation gains label, description,
  consentHeader, consentText (consent text quoted verbatim from
  Android).

* feat(web): migrate Bluetooth/Device/Display/Power/Network/Security pages to ConfigEditor

Phase 3a of PR #9. Six more radio-config pages off changeRegistry onto
the SDK ConfigEditor. Section structure + field order + labels taken
from Meshtastic-Android source of truth.

Bluetooth: single "Bluetooth Config" card. Drops the legacy disable-
mode-when-disabled rule; mode and PIN remain editable while bluetooth
is off (matches Android).

Device: four cards (Options / Hardware / Time Zone / GPIO).
- Options: role, rebroadcastMode, nodeInfoBroadcastSecs.
- Hardware: doubleTapAsButtonPress, disableTripleClick,
  ledHeartbeatDisabled. Web keeps the proto-aligned (un-inverted) field
  names; Android renders them inverted as "Triple Click Ad Hoc Ping" /
  "LED Heartbeat" — equivalent semantics, simpler binding.
- Time Zone: tzdef.
- GPIO: buttonGpio, buzzerGpio.
- Drops debug-only "Device Storage & UI" card (debug-only on Android).
- Drops the inline "Use phone time zone" action button (queued for a
  follow-up; needs a browser-tz implementation).

Display: two cards (Device Display / Advanced).
- Device Display: compassNorthTop ("Always point north"),
  use12hClock, headingBold, units.
- Advanced: screenOnSecs, autoScreenCarouselSecs, wakeOnTapOrMotion,
  flipScreen, displaymode, oled, compassOrientation (new — was missing
  from web).
- Drops gpsFormat (deprecated in proto; moved to DeviceUIConfig).

Power: single "Power Config" card. Order: isPowerSaving,
onBatteryShutdownAfterSecs, adcMultiplierOverride (web keeps the single
number input; Android splits into a switch + conditional float input —
deferred), waitBluetoothSecs, sdsSecs, minWakeSecs,
deviceBatteryInaAddress. Drops lsSecs (Android does not surface it).

Network: three cards (WiFi Options / Ethernet Options / Advanced).
- WiFi Options: wifiEnabled, wifiSsid, wifiPsk.
- Ethernet Options: ethEnabled.
- Advanced: ntpServer, rsyslogServer, enabledProtocols ("Enabled" /
  forward mesh over UDP), addressMode ("IPv4 mode"), then ipv4 ip /
  gateway / subnet / dns when STATIC.
- Drops the read-only "current connections" card (no analog state on
  web today). IPv4 int↔string conversion is unchanged.

Security: four cards (Direct Message Key / Admin Keys / Logs /
Administration).
- Direct Message Key: privateKey + publicKey (read-only) + Generate +
  Backup buttons.
- Admin Keys: three slots, gated on Legacy Admin channel toggle.
- Logs: serialEnabled, debugLogApiEnabled (Android order: serial
  first).
- Administration: isManaged, adminChannelEnabled.
- Byte-array conversions and the Pki regenerate / managed-mode dialogs
  are unchanged.

i18n: config.json gains card-level keys (bluetoothConfig, options,
hardware, timeZone, gpio, deviceDisplay, advanced, powerConfig,
wifiOptions, ethernetOptionsCard, advancedCard, directMessageKey,
adminKeysCard, logsCard, administration, compassOrientation,
useBrowserTimeZone) and updates field labels to Android strings.xml
values where they differ (e.g. "Bluetooth enabled", "Always point
north", "Use 12h clock format", "Shutdown on power loss", "Wait for
Bluetooth duration", "Battery INA_2XX I2C address", "WiFi enabled",
"Ethernet enabled", "Legacy Admin channel", "Serial console").

* feat(web): migrate 11 module-config pages to ConfigEditor; Android-aligned labels

Phase 3b of PR #9. All remaining module pages off changeRegistry onto
the SDK ConfigEditor. Section structure + field order + labels taken
from Meshtastic-Android source of truth.

Pages migrated (single "<X> Config" card unless noted):

Serial: enabled, echo, rxd ("RX"), txd ("TX"), baud, timeout, mode,
overrideConsoleSerialPort. Drops the per-field disable-when-!enabled
gating (Android keeps fields editable while the module is off).

ExternalNotification: four cards (External Notification Config /
Notifications on message receipt / Notifications on alert/bell receipt
/ Advanced). New card layout matches Android. Schema + page now
include useI2sAsBuzzer. Per-field disable-when-!enabled gating dropped.
Card 1: enabled. Card 2: alertMessage*. Card 3: alertBell*. Card 4:
output, active, outputBuzzer, usePwm, outputVibra, outputMs,
nagTimeout, useI2sAsBuzzer.

StoreForward: adds isServer ("Server"). Removes per-field disable-on-
!enabled. Schema gains isServer.

RangeTest: relabel to Android strings ("Range test enabled", "Sender
message interval (seconds)", "Save .CSV in storage (ESP32 only)").
Removes per-field disable-on-!enabled.

Telemetry: adds deviceTelemetryEnabled ("Send Device Telemetry" — gated
on firmware ≥ v2.7.12 capability flag on Android; web shows
unconditionally for now) and powerScreenEnabled ("Power metrics on-
screen enabled"). Schema gains both. Field labels updated.

CannedMessage: relabels per Android ("Canned message enabled", "GPIO
pin for rotary encoder A/B/Press port", "Generate input event on
Press/CW/CCW", "Up/Down/Select input enabled", "Allow input source",
"Send bell"). The free-form `messages` text field is a separate admin
RPC (setCannedMessages on Android) — queued as a follow-up.

Audio: relabel ("CODEC 2 enabled", "PTT pin", "CODEC2 sample rate",
"I2S word select / data in / data out / clock").

NeighborInfo: adds transmitOverLora toggle. Schema gains it.

AmbientLighting: relabel ("Ambient Lighting Config" card). Same fields.

DetectionSensor: relabel + reorder per Android (enabled,
minimumBroadcastSecs, stateBroadcastSecs, sendBell, name, monitorPin,
detectionTriggerType, usePullup).

Paxcounter: relabel ("Paxcounter enabled", "Update interval", "WiFi
RSSI threshold (defaults to -80)", "BLE RSSI threshold").

i18n: moduleConfig.json gains card-level keys (serialConfig,
externalNotificationConfig, notificationsOnMessage, notificationsOnAlert,
advanced, storeForwardConfig, rangeTestConfig, telemetryConfig,
cannedMessageConfig, audioConfig, neighborInfoConfig,
ambientLightingConfig, detectionSensorConfig, paxcounterConfig) and
new field keys (deviceTelemetryEnabled, powerScreenEnabled,
transmitOverLora, isServer, useI2sAsBuzzer, minimumBroadcastSecs,
stateBroadcastSecs, sendBell, name, monitorPin, detectionTriggerType,
usePullup), with field labels reworked to match Android strings.xml
values.

The User module page is the last consumer of changeRegistry. After it
moves, the deviceStore changeRegistry plumbing + getEffectiveConfig +
setChange / removeChange / getAllConfigChanges / etc. can be deleted.

* feat(sdk,web): migrate User + Channel + ImportDialog off changeRegistry; ConfigEditor gains owner support

Phase 3c-1 of PR #9. The last writers/readers of changeRegistry are
moved to the SDK ConfigEditor. (One sweep commit drops the
changeRegistry plumbing from the deviceStore.)

ConfigEditor (sdk/features/config/domain/ConfigEditor.ts):
- New owner state: baselineOwner / workingOwner signals, isOwnerDirty,
  setBaselineOwner(user), setOwner(user). The editor doesn't subscribe
  to a SDK signal for the user (owner arrives via NodeInfo, not its own
  packet), so the web seeds baseline from useMyNodeAsProto via setter.
- commit() now also runs setOwner (admin message) when isOwnerDirty,
  inside the same beginEdit/commitEdit window as radio/module/channels.
- isDirty aggregates owner dirty too. reset() reverts working owner.
- Disconnect clears baseline + working owner.

User page (Settings/User.tsx):
- Aligned to Android: single "User Config" card, fields in order:
  Node ID (read-only), Long Name, Short Name, Hardware model
  (read-only enum name), Unmessageable, Licensed amateur radio (Ham).
- onSubmit calls editor.setOwner instead of connection.setOwner —
  edits queue with the rest of the editor's pending changes and ship
  on the global Save.
- Preserves non-edited User fields (id, hwModel, role, publicKey,
  macaddr) by spreading the baseline before applying form deltas.
- isUnmessageable now reads from the proto's isUnmessagable instead of
  defaulting to false (longstanding bug — the existing value was
  ignored).
- shortName min loosened to 1 (was 2) per Android rule.

Channel page (PageComponents/Channels/Channel.tsx):
- Reads working channel from editor.channels via useSignal projection;
  drops getChange / setChange / removeChange / deepCompareConfig.
- onSubmit -> editor.setChannel(payload).

Channels page (PageComponents/Channels/Channels.tsx):
- Reads channel list from useChannels() (SDK), maps each into a real
  proto Channel via create(ChannelSchema, ...) for the per-tab Channel
  component which still expects the proto shape.
- Per-channel dirty indicator now reads editor.dirtyChannels instead
  of hasChannelChange.

ImportDialog (Dialog/ImportDialog.tsx):
- Apply path -> editor.setChannel + editor.setRadioSection("lora",...)
  instead of setChange. Channel reads via SDK.

i18n: config.json user.* gains userConfig (card label), nodeId,
hardwareModel keys; field labels reworded to match Android (e.g.
"Licensed amateur radio (Ham)", "Unmessageable" with "Unmonitored or
Infrastructure" description). UserValidationSchema gains optional
nodeId / hardwareModel display fields.

* feat(sdk,web): delete changeRegistry; ConfigEditor owns all settings dirty state

Phase 3c-2 of PR #9. With every web settings page already migrated, the
deviceStore changeRegistry plumbing has no remaining writers or readers
and is deleted.

ConfigEditor (sdk):
- New queueAdminMessage(message) for one-off side flows. Queue drains
  inside commit() between beginEdit and commitEdit. Used by
  Position.tsx for setFixedPosition; future side flows (e.g. SetTime)
  reuse the same queue.
- Disconnect / commit success now also reset the admin-message queue.
- isDirty includes a queued admin-message check.

Web Settings/index.tsx:
- handleSave is now a one-liner: editor.commit(). All the legacy
  get*Changes / get*ChangeCount / clearAllChanges / connection.setConfig
  loops + the post-commit deviceStore mirror writes are gone.
- handleReset calls editor.reset() instead of clearAllChanges().
- Save-button gating reads editor.isDirty + RHF dirty.
- Section change-count badges read directly from editor.dirtyRadioSections /
  editor.dirtyModuleSections / editor.dirtyChannels lengths.

Tab dirty-dot indicators (RadioConfig.tsx / DeviceConfig.tsx /
ModuleConfig.tsx): rewired from hasConfigChange/hasModuleConfigChange/
hasChannelChange/hasUserChange to editor signals (dirtyRadioSections,
dirtyModuleSections, dirtyChannels, isOwnerDirty).

Position.tsx: queueAdminMessage call now goes through editor — pending
fixed-position coordinates ride along with the rest of the editor's
dirty state and ship under the same beginEdit/commitEdit window.

deviceStore.ts:
- Drops the entire changeRegistry surface from the Device interface and
  factory: setChange / removeChange / hasChange / getChange /
  clearAllChanges / hasConfigChange / hasModuleConfigChange /
  hasChannelChange / hasUserChange / getConfigChangeCount /
  getModuleConfigChangeCount / getChannelChangeCount /
  getAdminMessageChangeCount / getAllConfigChanges /
  getAllModuleConfigChanges / getAllChannelChanges / queueAdminMessage /
  getAllQueuedAdminMessages, plus the changeRegistry field.
- getEffectiveConfig / getEffectiveModuleConfig collapse to plain
  device.config[variant] / device.moduleConfig[variant] passthroughs
  (kept as a thin compatibility shim for residual callers; the
  changeRegistry merge is gone).
- types.ts: ValidConfigType / ValidModuleConfigType derive directly
  from LocalConfig / LocalModuleConfig keys (was imported from the
  deleted changeRegistry.ts).
- The 252-line changeRegistry.ts file is deleted; ~250 lines also drop
  out of the deviceStore factory.
- deviceStore.test.ts loses the change-registry describe block (3
  tests). 237 web tests still passing (was 240; -3 dead tests).

Net: -1066 / +136 lines.

* feat(sdk,sdk-storage-sqlocal,web): TelemetryRepository port + SqlocalTelemetryRepository (PR #10)

Telemetry slice gains the same persistence shape as chat / nodes: a
repository port on the SDK side, an in-memory default, an OPFS-backed
SQLite adapter on the storage package side, and lazy hydration into the
in-memory store.

SDK (@meshtastic/sdk):
- New TelemetryRepository port (loadRecent, loadBefore, append,
  appendBatch, prune, clearNode, clear) + TelemetryRetentionPolicy
  (maxPerNode, olderThanMs).
- New InMemoryTelemetryRepository — default when no adapter is wired.
- TelemetryClient grows TelemetryClientOptions { repository?, retention? }.
  Each incoming onTelemetryPacket appends to both the in-memory store
  and the repository, then the configured retention policy prunes the
  repository.
- latest(nodeNum) and history(nodeNum) lazy-hydrate the in-memory store
  from the repository on first subscribe (HYDRATE_LIMIT = 256). loadBefore
  passes through to the repository for paged reads.
- clearNode / clear methods exposed on the client.
- MeshClient gains options.telemetry which is passed through to
  TelemetryClient.

@meshtastic/sdk-storage-sqlocal:
- New SqlocalTelemetryRepository under ./telemetry subpath. Drizzle-typed
  insert/select/delete against the existing telemetry table; payload is
  stored as base64 of the proto bytes (per-kind schema lookup) so the
  wire shape is the source of truth across schema additions.
- prune({ maxPerNode }) trims with a per-node offset query. prune({
  olderThanMs }) deletes by ts cutoff.
- Six new tests cover round-trip, ascending order, deviceId scoping,
  per-node retention, age-based prune, and proto payload preservation.
- Re-exports added to mod.ts + ./telemetry subpath in package.json.

web:
- useConnections wires SqlocalTelemetryRepository per connection with
  retention { maxPerNode: 500, olderThanMs: 30 days }.

Tests: SDK 57 (was 49 — +8 new), storage 30 (was 24 — +6), web 237.
Build clean.

* feat(sdk,sdk-react,web): unread counts on the SDK ChatClient

ChatClient gains a `chat.unread` namespace mirroring `chat.drafts`:
- byKey: ReadonlySignal<Map<conversation-key-string, number>>
- total: ReadonlySignal<number>
- count(key): ReadonlySignal<number>
- markRead(key): void

Increments happen in the existing onMessagePacket subscriber when
packet.from !== client.myNodeNum (so the outbound echo of our own send
doesn't bump anything). Uses the same ConversationKey shape the rest
of the chat slice already keys by, so direct messages keyed by peer
and broadcasts by channel can never collide.

Counts are in-memory only — persistence will come later if needed
(would require tracking a lastReadAt timestamp per conversation in the
message repository and computing unread on hydrate).

sdk-react: new useTotalUnread / useUnreadCount(key) / useUnreadByKey
hooks. All fall back to safe empty values when no client is active.

Web migration:
- Sidebar reads useTotalUnread instead of summing
  deviceStore.unreadCounts.
- MessagesPage: per-channel SidebarButton counts read from
  useUnreadByKey()'s `channel:N` keys; per-direct-message counts from
  `direct:N` keys. Click handlers call meshClient.chat.unread.markRead
  with the typed ConversationKey instead of resetUnread.
- subscriptions.ts: drops onMessagePacket -> incrementUnread mirror
  (SDK now owns it). myNodeNum local goes away too — nothing else
  consumed it.
- deviceStore: removes unreadCounts field + incrementUnread /
  resetUnread / getUnreadCount / getAllUnreadCount methods. The mock
  + test block in deviceStore.test.ts also drop their unread coverage.
- deviceStore.mock.ts: also strips the dead changeRegistry / setChange
  / hasConfigChange / etc. methods that survived from the earlier
  changeRegistry deletion.

Tests: SDK 61 -> 65 (+4 ChatClient.unread.test), sdk-react 8, web 236.
Build clean.

* refactor(web): split useConnections into focused modules

useConnections went from 661 lines down to 264 by extracting three
single-responsibility helpers under packages/web/src/core/connections/.
The hook is now pure orchestration; transport / heartbeat / SDK-client
/ status-probe concerns live in their own files.

New modules:
- core/connections/heartbeat.ts (45 LOC): startConfigHeartbeat (5s),
  startMaintenanceHeartbeat (5min), stopHeartbeat. Owns the heartbeats
  Map; replaces the inline interval bookkeeping. Both helpers stop the
  prior heartbeat first so callers don't have to.
- core/connections/sdkClient.ts (61 LOC): buildMeshDevice(connId,
  deviceId, transport) opens the OPFS DB, builds the four sqlocal
  repositories (chat / draft / nodes / telemetry), and constructs the
  MeshDevice with the canonical retention defaults (chat 90d / 1k per
  bucket; telemetry 30d / 500 per node). Falls back to in-memory when
  sqlocal is unavailable.
- core/connections/transports.ts (236 LOC): per-transport openTransport
  factory (HTTP reachability check, BT permission re-acquisition with
  optional prompt, Serial port lookup with close-then-reopen),
  probeConnection for refreshStatuses, closeTransport for cleanup.
  Discriminates over conn.type so useConnections doesn't carry the
  switch logic.

useConnections (now 264 LOC):
- Owns the cachedTransports + configSubscriptions maps and the
  Zustand selectors.
- teardown(id, conn) consolidates the heartbeat + config-sub +
  meshDevice.disconnect + transport-close cleanup that used to be
  duplicated across removeConnection / disconnect.
- connect calls openTransport and forwards the resulting transport +
  cached BT/Serial handle into setupMeshDevice. The BT
  gattserverdisconnected listener is wired here (it needs the connId).
- refreshStatuses simplifies to a filter + Promise.all over
  probeConnection.
- syncConnectionStatuses unchanged.

Behavior is unchanged. No new tests — the existing web suite (236)
still passes; build clean.

* chore: move packages/web → apps/web

Web is a deployable SPA, not a library — no @meshtastic scope, no
exports map, no npm/JSR publish target, no other workspace member
depends on it. Conventional pnpm/Turbo/Nx layout puts deployables
under apps/ and libraries under packages/. Doing the move now (after
PR #9 / #10 / unread / useConnections refactor land but before Phase
C ships) so the lib-only packages/* directory remains stable as we
delete packages/core.

Mechanics:
- pnpm-workspace.yaml: add `apps/*` to packages.
- git mv packages/web apps/web (entire directory tree).
- vite.config.ts uses process.cwd(), so no internal path edits needed.
- pnpm filter commands still resolve by package name (`pnpm --filter
  meshtastic-web run build`) — no script changes.

External-path consumers updated:
- README.md table row.
- tsconfig.json reference.
- 7 GH workflows (pr.yml, nightly.yml, release-web.yml, the three
  crowdin-*.yml, release-packages.yml). The
  packages/release-packages.yml `packages/* | grep -v packages/web`
  filter is now redundant since web isn't in packages/* anymore — it
  collapses to plain `ls -d packages/*`.

Verified: web build clean, web 236 / sdk 65 / sdk-react 8 / storage
30 tests all pass.

* feat: PR #12 Phase C — delete packages/core, retarget transports to @meshtastic/sdk, bump majors

The legacy `@meshtastic/core` package is gone. The six transport-*
packages and the web app no longer depend on it; everything routes
through `@meshtastic/sdk`.

Transport packages (transport-deno, transport-http, transport-node,
transport-node-serial, transport-web-bluetooth, transport-web-serial):
- package.json deps swap `@meshtastic/core: workspace:*` for
  `@meshtastic/sdk: workspace:*`.
- src/transport.ts + src/transport.test.ts imports point at
  `@meshtastic/sdk` (the `Types` and `Utils` namespaces are still
  exported from the SDK so source code is otherwise unchanged).
- README.md examples updated to import from `@meshtastic/sdk`.

apps/web:
- Drops the leftover `@meshtastic/core` workspace dep; nothing in
  apps/web/src imports from it.

@meshtastic/sdk:
- README description loses the "Replaces @meshtastic/core" suffix —
  there's nothing left to replace.
- Three legacy shim files keep their re-exports but their docstrings
  drop the "Phase-A shim, removed in Phase C" framing. The MeshDevice
  facade survives because the web app's `connection.factoryResetDevice()`
  / `connection.reboot()` / etc. callsites still go through it; new
  consumers should reach into `client.config` / `client.chat` / etc.
- New scripts/rename-dts.mjs is a postbuild step that renames tsdown's
  hashed entry-point dts outputs (`mod-<hash>.d.ts` etc.) back to their
  canonical names so package.json `types` and downstream dts-bundlers
  can find them. Internal chunk dts files (e.g. `Transport-<hash>.d.ts`)
  are intentionally NOT renamed because mod.d.ts imports them by path.
- build:npm runs tsdown then the rename script.

Version bumps (signal: now require @meshtastic/sdk):
- @meshtastic/sdk             0.1.0 -> 1.0.0
- @meshtastic/sdk-react       0.1.0 -> 1.0.0
- @meshtastic/sdk-storage-sqlocal 0.1.0 -> 1.0.0
- @meshtastic/transport-http       0.2.5 -> 1.0.0
- @meshtastic/transport-web-serial 0.2.5 -> 1.0.0
- @meshtastic/transport-web-bluetooth 0.1.5 -> 1.0.0
- @meshtastic/transport-deno       0.1.1 -> 1.0.0
- @meshtastic/transport-node       0.0.2 -> 1.0.0
- @meshtastic/transport-node-serial 0.0.2 -> 1.0.0

Workflows: nothing referenced packages/core directly (only the
release-packages.yml glob which already collapsed in the apps/web
move). README packages table loses the legacy `packages/core` row.

Verified: web build clean, all four package suites green
(web 236, sdk 65, sdk-react 8, storage 30).

The transport packages' dist build is currently blocked by a tsdown
cross-chunk dts resolution glitch where the `Types` namespace import
can't follow `mod.d.ts`'s reference to the internal `Transport-<hash>`
chunk. Runtime is fine — only the published-types path is affected,
and transport packages publish via their own release flow. Logged as
follow-up.

* fix(web/connections): probe = "online" not "configured"; flip status to "configuring" before DB open; await transport disconnect

Three reconnect-flow bugs:

1. probeConnection returned "configured" for serial / bluetooth when
   the browser had stored permission for the device — but permission
   ≠ a configured Meshtastic device. The card showed "connected"
   and a Disconnect button before the user had ever clicked Connect.
   Probe now returns "online" (= "available, click to connect"),
   matching the HTTP path. "configured" is reserved for the
   onConfigComplete callback.

2. setupMeshDevice flipped status from "connecting" → "configuring"
   AFTER awaiting buildMeshDevice, which opens the OPFS DB. If the
   DB open stalled (multi-tab contention, slow first-time init), the
   card sat at "connecting" indefinitely. Move the status flip ahead
   of the persistence await — UI shows "configuring" while
   persistence is spinning up.

3. teardown's `device?.connection?.disconnect()` returned a Promise
   that was never awaited, so the underlying transport's port.close()
   could race the next port.open() on a fast disconnect → reconnect.
   Make teardown async, await disconnect, propagate via async
   removeConnection / disconnect callers.

Plus: connect() catch block logs the underlying error before turning
it into a status update, so the actual failure shows up in console
even when the toast text is generic.

* feat(web): Position "Use browser location" button + Telemetry firmware capability gate

Two backlog UX nits.

DynamicForm:
- FormGroup gains an optional `footer?: ReactNode` slot that renders
  after the field list. Lets pages drop arbitrary JSX (action buttons,
  notes, etc.) into a card without subclassing the form.

Position:
- New `UseBrowserLocationButton` component lives inside the Device GPS
  card via the new `footer` slot. Calls navigator.geolocation, writes
  lat/lng/altitude into the form via `useFormContext` (the
  PositionValidation form is wrapped in FormProvider by DynamicForm).
- Truncates lat/lng to 7 decimals to match the proto's max precision.
- Gracefully no-ops when navigator.geolocation is unavailable
  (insecure context).
- Failed reads surface as a toast carrying the GeolocationPositionError
  message; busy state disables the button + flips the label.
- New i18n keys: position.useBrowserLocation.{label,busy,failed}.

Telemetry:
- `device_telemetry_enabled` is only writable on firmware ≥ v2.7.12
  (mirrors Android's `Capabilities.canToggleTelemetryEnabled`). Adds a
  small `firmwareAtLeast` semver helper and reads
  `device.metadata.get(0)?.firmwareVersion`. The toggle is hidden on
  older firmware so we don't push a value the device will silently
  drop.
- Unparseable / unknown firmware versions default to "show the toggle"
  (rather than hide), so we don't accidentally hide the control on
  devices we can't classify.

Build clean, 236 web tests still pass.

* fix(sdk): build clean dts for npm consumers; transports drop Types/Utils namespace

Previously transport-* package dts builds failed with "Missing export" because
rolldown's dts bundler couldn't follow tsdown's cross-chunk re-exports out of
@meshtastic/sdk. Three things land here:

1. mod.ts now re-exports `fromDeviceStream`, `toDeviceStream`, `Queue`, and
   `Xmodem` directly. Transport packages were importing these via the legacy
   `Utils` namespace; namespace re-exports are exactly what rolldown chokes
   on. Transport packages (http, deno, node, node-serial, web-bluetooth,
   web-serial) and shared transportContract.ts now use direct imports —
   `import { Transport, DeviceOutput, ... } from "@meshtastic/sdk"`.

2. package.json `exports` split: `types` points at `./dist/<entry>.d.ts`
   (built dts) so tsdown's downstream rolldown reads a self-contained file;
   `default` keeps source paths so vitest + workspace-internal imports still
   resolve to .ts source.

3. Postbuild `rename-dts.mjs` now (a) inlines internal chunk dts files
   (Transport-<hash>.d.ts) into each entry's dts, rewriting the letter
   aliases tsdown produces; (b) strips `type` modifiers from re-exports
   so rolldown accepts the bindings as both value- and type-shape;
   (c) declares the synthetic `Types`/`Utils` namespaces explicitly,
   replacing the broken `<wrapper>_d_exports as Types` aliases tsdown
   emits for `export * as` patterns.

vitest.config.ts gains `apps/*` so the workspace move keeps test discovery
working for the apps/web project.

* chore(build): tighten tsdown perf flags across SDK + transport packages

- Drop bogus `dts.isolatedDeclarations` field from SDK (not a real tsdown
  option; tsdown was silently ignoring it).
- Make every package explicit about the perf-relevant flags rather than
  relying on defaults that drift between tsdown versions: target=esnext
  (no syntax downleveling), sourcemap=false, minify=false, treeshake=true,
  report=false, splitting=false.
- Modest wall-clock wins: SDK 1020→752ms, transports ~720→~600ms.

`isolatedDeclarations: true` in tsconfig would unlock the bigger oxc-dts
fast path but the codebase isn't ID-clean yet — left as future work.

* fix(web): clear pre-existing typecheck errors (36 → 0)

Sweep covering several unrelated cohorts:

- Delete dead `NewDeviceDialog.tsx` (commented-out in App.tsx, imports point at
  non-existent `@components/PageComponents/Connect/*`).
- Add `better-result` to sdk-react deps so `useChat`/`useDirectChat`/
  `useFavoriteNode`/`useIgnoreNode` resolve.
- Fix `test-utils.tsx`: route at `routeTree.gen.ts` was never generated;
  re-export the existing `routeTree` constant from `routes.tsx` and pass
  the missing router context + DeviceWrapper deviceId.
- Pre-existing `noUncheckedIndexedAccess` violations in `pskSchema.test.ts`,
  `x25519.ts`, `Table/index.tsx` + test, `useCopyToClipboard` (Timeout vs
  number) — non-null asserts where the index is guaranteed by the
  surrounding code, plus a defensive `if (!cell) return 0` in the table sort.
- Immer `WritableDraft<T>` mismatches against SDK's `MeshDevice`/`Device`
  classes — cast through `Draft<X>` where the inferred recursive draft type
  can't represent SDK class internals.
- `deviceStore.mock` updated for the `connectionPhase`/`connectionId` +
  setters added when the connection lifecycle was extracted.
- `HeatmapLayer` accepts the `isVisible` prop everyone else's layer accepts.
- `SNRTooltipProps.to` widened to `string | undefined` (single-node hover
  has no `to`).
- Zod resolver returns `Record<string, never>` for the error-path values
  shape that react-hook-form expects.
- Mock `NodeInfo` in `useFilterNode.test.ts` gains the `isMuted` proto
  field that landed upstream.

* fix(web/connections): retry-once + clearer error on Bluetooth GATT connect failure

`NetworkError: Connection attempt failed` from `device.gatt.connect()` is the
most common transient when reconnecting BT — OS stack hiccup, device just
woke from sleep, etc. Adding one retry with a 750ms delay clears most of
those. Persistent failures get a wrapped error message naming the actual
likely causes (out of range, powered off, paired with phone or another
tab) instead of leaving the raw DOMException for the user to interpret.

* refactor(transport-web-bluetooth): own GATT connect-retry semantics + typed error

Per the DDD layering — transport-level concerns belong in the transport
package, not the web app's connection orchestrator. Moved the GATT
`NetworkError: Connection attempt failed` retry-once + the user-facing
error wrapping out of `apps/web/src/core/connections/transports.ts` and
into `TransportWebBluetooth.prepareConnection`.

New `BluetoothConnectError` carries:
- `kind: "transient" | "unavailable" | "missing-service"` so callers can
  decide whether to suggest retry vs re-pair vs firmware upgrade.
- `userMessage` — human-readable, actionable string ready for UI.

The web app's `transports.ts` is back to a thin wrapper that just calls
`TransportWebBluetooth.createFromDevice` and surfaces whatever error it
throws. `BluetoothConnectError` is re-exported through the connections
module so the Connections page can `instanceof`-check without depending
on the transport package directly.

* feat(sdk,web): detect newly-flashed device + prompt region setup

Mirrors Meshtastic-Android's `regionUnset` flow. A freshly-flashed device
boots with `Config.LoRa.region == UNSET` and won't transmit at all until
the user picks one. Web now surfaces this:

- `ConfigClient.isRegionUnset: ReadonlySignal<boolean>` — computed from
  the radio config signal, false until the first LoRa packet arrives so
  consumers don't flash the prompt during the connect handshake.
- `useIsRegionUnset()` hook in sdk-react, re-exported from the package's
  public surface.
- `RegionSetupReminder` mounts inside the connected-device branch of
  App.tsx. While the SDK reports `isRegionUnset == true`, a persistent
  toast offers a "Set region" CTA that deep-links into the LoRa tab
  (`/settings/radio`). Toast auto-dismisses the moment a real region is
  committed.

Predicate matches Android exactly (single check, no owner/name/setupComplete
heuristics). Lives in the SDK config slice — UI is a thin consumer.

3 new SDK tests; SDK 64 / sdk-react 8 / web 236.

* refactor(transport-web-serial): own port-state hygiene + Result-typed connect errors

Pre-flight close + open-with-backoff lived in apps/web's transport
orchestrator — wrong layer per DDD. Lifted into TransportWebSerial
itself.

Changes:
- `TransportWebSerial.createFromPort` (and `create`) now return
  `Result<TransportWebSerial, SerialConnectError>`. No throwing on
  expected failures; callers branch on the Result.
- New `preparePort` private static that:
  * force-closes the port if `readable` / `writable` are non-null
  * opens with up to 4 attempts (250 / 500 / 750 ms backoff) on
    `InvalidStateError` — common during USB re-enumeration
  * tags persistent failures `kind: "in-use"` (other tab / app
    holding the port) vs `"busy"` (transient / unknown) vs
    `"unavailable"` (no streams after open)
- `SerialConnectError` carries `kind` + `userMessage` ready for UI.
- `apps/web/src/core/connections/transports.ts` drops its old
  conditional `port.close()` + 100ms sleep; just calls
  `createFromPort` and unwraps the Result. `SerialConnectError` is
  re-exported alongside `BluetoothConnectError` so the Connections
  page can pattern-match.
- `AnyTransport` definition simplified — was deriving via
  `Awaited<ReturnType<...>>` which broke once `createFromPort`
  returned a Result.
- Test FakeSerialPort updated to mirror the real spec: `readable`
  /`writable` go null on `close()` and re-create on `open()`.
- 3 new port-hygiene tests cover the close-on-prior-open path,
  the backoff-retry success path, and the persistent-`in-use`
  Err path. Suite: 5 → 8.

Matches the better-result preference for new application/use-case
code. BT transport stays on the throwing `BluetoothConnectError`
shape for now — separate refactor if we want to converge.

* chore(logging): tslog-gated debug logs across the serial connect path

createLogger now reads `localStorage["mesh-debug"]==="1"` (browser) or
`MESH_DEBUG=1` (node) on each invocation. When set, default minLevel
drops to debug; otherwise stays at info. Existing callers
(MeshClient + co.) are unaffected.

Logs added (all `[name]`-prefixed via tslog) covering the connect
lifecycle the user just hit:

- TransportWebSerial.preparePort: enter, close-needed branch,
  close result, each open() attempt, retry decisions, final error.
- TransportWebSerial constructor: pipe wiring, toDevice pipe abort
  vs reject path.
- TransportWebSerial read loop: start, done, throw (with
  closingByUser flag), reader-lock release.
- TransportWebSerial.disconnect: each cleanup step (abort, pipe
  settled, fromDevice cancel, connection.close).
- transports.ts openSerial: cached-port flag, getPorts count,
  picker invocation, resolved-port stream state, createFromPort
  Result outcome (kind + userMessage on Err).
- useConnections.connect / setupMeshDevice / teardown: phase
  transitions, configure() resolve / reject, onConfigComplete fire,
  BT gattserverdisconnected, transport.disconnect rejection.

Flip on:
  localStorage.setItem("mesh-debug", "1"); location.reload();

* chore(web/storage): logs + 5s timeout around sqlocal DB open

The connect path silently hung at `buildMeshDevice` when sqlocal failed
to open. Adding visibility:

- `getStorageDb` logs creation start, success (with elapsed ms), and
  failure (with name + message).
- `buildMeshDevice` races the DB open against a 5s timeout. If sqlocal
  hangs (stale Web Lock from a crashed prior tab, OPFS contention,
  worker hang), the connect path falls through to the SDK's in-memory
  repositories instead of blocking forever — the user gets a working
  session and the warn-level log surfaces the underlying cause.
- `buildMeshDevice` logs entry, DB-ready elapsed, repos-opened, and
  fall-through decisions.

* feat(sdk,web): live connect-progress overlay (terminal-style log)

Surfaces what the connection handshake is doing in real time. Per DDD,
the predicate + counters live in the SDK; the web overlay is a thin
consumer of the signal.

SDK
- New `MeshClient.progress: ReadonlySignal<ConnectionProgress>` with the
  state machine `idle → configuring → configured`. Counters
  (config / modules / channels / nodes + boolean myInfo / metadata)
  tally inbound packets each `configure()` cycle.
- `configure()` resets to `configuring` with empty counters.
  `onConfigComplete` flips to `configured`.
- `ConnectionProgress` + `ConnectionProgressCounters` exported from the
  package surface.
- 6 new tests in `MeshClient.progress.test.ts`.

sdk-react
- `useConnectionProgress()` hook reads the active client's signal,
  returns `{ phase: "idle" }` when there is no active client so the
  caller can render unconditionally.

apps/web
- `ConnectingOverlay` redesigned as a terminal-style streaming log:
  - macOS-window-style header (red/yellow/green dots) with a live
    `phase` indicator pulse.
  - Monospace event lines with `→` (active) / `✓` (done) / `•` (info)
    glyphs and a relative-seconds timestamp column.
  - Auto-scrolls to the latest entry; blinking caret on the trailing
    active line.
  - Lines derive from `device.connectionPhase` transitions and per-
    counter bumps on `MeshClient.progress`. Resets on each fresh
    connect cycle.
- Mounted at the top of the device tree (outside the device-conditional
  branch) so it shows during a first-time connect from the Connections
  screen as well as reconnects from inside the app.
- i18n strings under `connections.overlay.log.*`.

* refactor(web): redesign ConnectingOverlay as hero card + fix early visibility

Two changes:

Visibility fix — overlay now reads `savedConnections` for any entry
whose status is "connecting" or "configuring". The previous code keyed
off `device.connectionPhase` from the active deviceStore entry, but
that entry doesn't exist until partway through `setupMeshDevice` —
the overlay was hidden during transport-open + storage-open (often
the slowest part of the connect flow).

Visual redo (option C — hero card with radial pings):
- Center: transport-type icon (Globe / Bluetooth / Cable) on a
  gradient disc with two concentric ping rings.
- Below: device name + phase label with small spinner.
- 2x2 grid of stat chips (Identity / Metadata / Channels / Nodes)
  that flip from gray (dashed circle) to emerald (check or count)
  as the SDK reports each piece arriving.
- Slate-to-black gradient panel; non-dismissable while active.
- i18n strings under `connections.overlay.*` updated to match.

* fix(web/connecting-overlay): clear stale in-flight statuses + Cancel escape

Two reasons the overlay could "never disappear":

1. Persisted state from a prior session.
   `savedConnections` is Zustand-persisted, so a prior tab that died
   mid-connect (page reload, hot reload, force-quit) leaves a saved
   connection at status "connecting" / "configuring" forever. On cold
   boot the overlay reads that and stays visible. `onRehydrateStorage`
   now sweeps any persisted "connecting" / "configuring" /
   "disconnecting" entries back to "disconnected" — no live JS code
   could complete those, so they're stale by definition.

2. Live attempt that genuinely hangs (firmware in CLI / bootloader,
   framing out of sync, `onConfigComplete` never arrives).
   After STUCK_THRESHOLD_MS (15s) the overlay surfaces a Cancel button
   + a hint. Cancel calls `useConnections().disconnect(id)` which tears
   down the transport and flips status off "configuring". Resets if a
   new attempt starts.

i18n adds `connections.overlay.stuckHint` + `cancel`.

* fix(web/connections): close configured-transition race when configCompleteId is buffered

Reproed on serial reconnect: the device kept emitting from a prior
session, so the new MeshClient's `transport.fromDevice → decodePacket`
pump processed the buffered `configCompleteId` synchronously inside
the `buildMeshDevice` await — before `setupMeshDevice` had a chance to
subscribe to `onConfigComplete`. SimpleEventDispatcher doesn't replay
to late subscribers, so the event was lost. The connect overlay (which
keys off the saved-connection status) stayed visible forever even
though the rest of the app saw nodes / messages flowing.

Fix: wire two parallel paths to a shared idempotent `markConfigured`
handler:

- `events.onConfigComplete` (fast path, fires on the next live event).
- `MeshClient.device.status` signal — `decodePacket` also flips the
  signal to `DeviceConfigured` on the same packet, and signal
  subscribers don't drop the current value if it's already there.

Plus an initial synchronous check in case the status signal had
already settled before either subscribe ran. `configSubscriptions`
unsubscribes both on teardown.

* style(connecting-overlay): drop hardcoded slate/sky for the app's theme tokens

Reuses the same `--color-text-primary`, `--color-text-secondary`,
`--color-background-primary`, and `--color-link` tokens the rest of
the web UI already binds to (light + dark variants resolve via
`[data-theme=...]`), so the overlay now picks up the active theme
instead of fighting it with a hardcoded slate/sky/indigo palette.

- Hero ring + disc → `bg-link` + `bg-link/{20,30}` ping ripples.
  Icon uses `text-background-primary` so it stays legible on both
  themes (white-on-blue light, dark-on-blue dark).
- Title / phase / hint copy → `text-text-primary` / `text-text-secondary`.
- Stat chips use `green-500` (matches `Button.success`) for the done
  state and `text-secondary`-derived neutrals for idle.
- Cancel button reverts to the default `Button` outline variant — was
  carrying its own slate overrides, no need.

* fix(sdk/chat): optimistic-append outbound text so it shows up after send

Reproed in MessagesPage on /messages/broadcast/0: typing a message and
pressing Enter cleared the input, but the message never rendered.

Root cause:
- `ChatClient.send` calls `sendText` → `MeshClient.sendPacket(...,
  echoResponse=true)`. The echo branch dispatches `onMeshPacket` only.
- `ChatClient` subscribes to the per-portnum `onMessagePacket`, not the
  raw `onMeshPacket`. So the outbound message is never appended to its
  conversation bucket.
- The Meshtastic firmware does not loop the user's own outbound text
  back via `fromradio`, so there's no inbound echo to fall back on.

Fix:
- `ChatClient.send` now optimistically appends the outbound message
  (state=Pending) to the matching channel/direct bucket and persists
  it via the configured repository as soon as `sendText` resolves Ok.
- The existing `onRoutingPacket` subscriber flips state Pending→Ack /
  Failed when the routing ack arrives keyed by packet id — unchanged.
- `ChatStore.hasMessage(key, id)` added; the inbound `onMessagePacket`
  subscriber and the `send()` path both consult it so a
  belt-and-suspenders firmware echo doesn't double-append.

Tests: ChatClient.send.test.ts — 4 cases (broadcast append, direct
append, echo dedup, routing-ack flips state). Suite 70 → 74 / web
suite untouched at 236.

* fix(sdk/chat): append outbound message before awaiting send (instant render)

Previously the optimistic append happened after `await sendText(...)`,
which itself awaited `queue.wait(id)` — i.e. the firmware ack. On LoRa
that's 1–3 seconds, so the user saw a noticeable delay between hitting
Enter and the bubble appearing.

Move the append before the await. To do that the chat slice needs to
know the packet id synchronously, so:

- `MeshClient.sendPacket` gains an optional `packetId` parameter
  (defaults to `generatePacketId()`, behaviour unchanged for callers
  that don't pass one).
- `SendTextInput.packetId` plumbs through `SendTextUseCase` to
  `sendPacket`.
- `ChatClient.send` generates the id up-front, appends the message
  with `state=Pending` immediately, persists it, then awaits
  `sendText(..., { packetId })`. On Err the optimistic message stays
  visible but flips to `Failed` so the user sees what happened.
  Routing-ack subscriber still flips `Pending → Ack` keyed by id —
  unchanged.

Tests added (suite 74 → 76):
- "appends the optimistic message before the send promise resolves"
  — asserts the bucket contains the message synchronously after the
  send call returns its pending promise.
- "flips outbound state to Failed when sendText returns Err"
  — exercises the empty-text validation path.

* adding a claude to repo

* handle device reboots

* chore(web): post-rebase fixups — lockfile, dedupe dep, formatting

- Regenerate pnpm-lock.yaml to match the merged package.json set (adds the
  @meshtastic/sdk + transport workspace packages from this PR); the rebase
  had held the lockfile at main's version via a merge driver.
- Drop a duplicate better-result entry in apps/web/package.json.
- Reformat LoRa.tsx / Display.tsx (oxfmt) after merging main's config fields
  into Dan's ConfigEditor field groups.

* test: retire main's nodeDBStore + messageStore tests superseded by SDK migration

Dan's SDK migration removed the Zustand nodeDBStore (node state now lives in
the SDK; useNodesLegacy notes the migration) and the useNodeDB hook. main had
since added nodeDBStore.test.tsx / messageStore.test.ts and kept evolving the
store; the rebase carried those over, so they tested an API this PR removes
(useNodeDB is not a function). Dan's branch contains none of these files.

Remove the dead nodeDBStore store dir and the two orphaned main tests to match
the migrated architecture. The live messageStore (barrel-exported) is kept; only
main's standalone test for it is dropped.

---------

Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2026-06-15 16:55:49 -05:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
ccc02ad438 chore(deps): bump @radix-ui/react-dialog from 1.1.15 to 1.1.16 (#1115)
Bumps [@radix-ui/react-dialog](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dialog) from 1.1.15 to 1.1.16.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/dialog/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/dialog)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-dialog"
  dependency-version: 1.1.16
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 17:50:07 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
d901ec40ae chore(deps): bump lucide-react from 1.17.0 to 1.18.0 (#1114)
Bumps [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) from 1.17.0 to 1.18.0.
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/1.18.0/packages/lucide-react)

---
updated-dependencies:
- dependency-name: lucide-react
  dependency-version: 1.18.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 17:47:35 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
1fce10a1df chore(deps-dev): bump oxlint from 1.52.0 to 1.69.0 (#1096)
Bumps [oxlint](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint) from 1.52.0 to 1.69.0.
- [Release notes](https://github.com/oxc-project/oxc/releases)
- [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxlint/CHANGELOG.md)
- [Commits](https://github.com/oxc-project/oxc/commits/oxlint_v1.69.0/npm/oxlint)

---
updated-dependencies:
- dependency-name: oxlint
  dependency-version: 1.69.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 17:40:43 -04:00
AustinandGitHub 341f3be6d6 fix(lint): remove rule for import/no-unused-modules from .oxlintrc.json (#1111)
import/no-unused-modules seems to have been removed in more recent oxlint versions. Remove it here to unblock oxlint upgrades.
2026-06-15 17:33:06 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
011ede9966 chore(deps-dev): bump publint from 0.3.18 to 0.3.21 (#1112)
Bumps [publint](https://github.com/publint/publint/tree/HEAD/packages/publint) from 0.3.18 to 0.3.21.
- [Release notes](https://github.com/publint/publint/releases)
- [Changelog](https://github.com/publint/publint/blob/master/packages/publint/CHANGELOG.md)
- [Commits](https://github.com/publint/publint/commits/publint@0.3.21/packages/publint)

---
updated-dependencies:
- dependency-name: publint
  dependency-version: 0.3.21
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 16:54:11 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
eaf6f3d593 chore(deps-dev): bump tar from 7.5.11 to 7.5.16 (#1104)
Bumps [tar](https://github.com/isaacs/node-tar) from 7.5.11 to 7.5.16.
- [Release notes](https://github.com/isaacs/node-tar/releases)
- [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/isaacs/node-tar/compare/v7.5.11...v7.5.16)

---
updated-dependencies:
- dependency-name: tar
  dependency-version: 7.5.16
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 16:38:08 -04:00
Ben MeadorsandGitHub 6b298d1648 fix(infra): use apps/web paths in Containerfile after monorepo move (#1110)
The Release Web workflow builds the Docker image with the repo root as
context (file: ./apps/web/infra/Containerfile), but the Containerfile's
ADD/COPY still referenced ./packages/web/dist and
./packages/web/infra/default.conf. After #1097 moved the web app to
apps/web, those paths no longer exist, so buildx failed with
'"/packages/web/infra/default.conf": not found'.

Point both at ./apps/web/. Verified with a local multi-stage docker
build against the apps/web build output.
2026-06-15 15:26:26 -05:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
f9e6d69ae6 chore(deps): bump @radix-ui/react-menubar from 1.1.16 to 1.1.17 (#1101)
Bumps [@radix-ui/react-menubar](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/menubar) from 1.1.16 to 1.1.17.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/menubar/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/menubar)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-menubar"
  dependency-version: 1.1.17
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 15:58:05 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
7f48db7ddb chore(deps): bump @radix-ui/react-accordion from 1.2.12 to 1.2.13 (#1103)
Bumps [@radix-ui/react-accordion](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/accordion) from 1.2.12 to 1.2.13.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/accordion/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/accordion)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-accordion"
  dependency-version: 1.2.13
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 15:57:19 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
b0ff5f50bf chore(deps): bump vite from 7.3.2 to 7.3.5 (#1105)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.3.2 to 7.3.5.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v7.3.5/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.3.5/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.3.5
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 15:25:17 -04:00
AustinandGitHub a0cda099e7 Dependabot: Group react packages together (#1106)
Same as we do in meshtastic/meshtastic
2026-06-15 13:55:43 -05:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
a9c52b8667 chore(deps): bump i18next from 25.8.17 to 26.3.1 (#1094)
Bumps [i18next](https://github.com/i18next/i18next) from 25.8.17 to 26.3.1.
- [Release notes](https://github.com/i18next/i18next/releases)
- [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next/compare/v25.8.17...v26.3.1)

---
updated-dependencies:
- dependency-name: i18next
  dependency-version: 26.3.1
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-15 14:44:40 -04:00
Ben MeadorsandGitHub bbe9a0d5cd feat(protobufs): sync to firmware-current and consume workspace package (#1097)
* feat(protobufs): sync to firmware-current and consume workspace package

Sync the vendored .proto sources to firmware-current (v2.7.25+48), regenerate the v2 TS bindings, and consume the workspace @meshtastic/protobufs (workspace:*) in place of the stale JSR 2.7.20 — finishing the monorepo migration (core was already workspace:*).

Includes the one required breaking-change fix: admin nodedb_reset changed int32 to bool, so resetNodes() now sends value: true.

* build(protobufs): vendor generated bindings for workspace consumers

The package is consumed via workspace:* — its exports point at the TS source, which imports ./dist/meshtastic/*_pb.ts — so the generated output must exist at build time. CI builds web/core with no codegen step and the runners have no buf CLI, so the bindings are vendored here (kept gitignored; lint/format skip them). Regenerate with: pnpm --filter @meshtastic/protobufs gen

* fix(protobufs): clean script removes the actual generated output dir

buf writes bindings to packages/ts/dist, but clean was removing a non-existent root dist — so it never cleaned stale output. Addresses Copilot review feedback.

* refactor: move web app packages/web -> apps/web

Aligns the web app with the apps/web layout (matching the Vercel web-test Root Directory and the SDK-migration direction). Pure directory move plus root config: pnpm-workspace (adds apps/*), vitest projects, root tsconfig reference, and the pr/release-web/nightly workflows. vercel.json moved with the app. Build + 36 validation tests green.

* feat: config fields, module pages, key verification, telemetry capture

Incorporates the firmware-current feature work onto the protobuf foundation: new config fields (Display message bubbles; LoRa fem_lna_mode + serial_hal_only; Telemetry air_quality_screen_enabled); 4 new ModuleConfig pages (TrafficManagement, StatusMessage, TAK, RemoteHardware); the manual Key Verification flow (sendKeyVerification + ClientNotificationDialog stages + Verify Key button); live telemetry capture (nodeDB addDeviceMetrics) and admin hardening (toggleMutedNode, graceful PortNum default); plus the sdk-preview ConfigEditor demo and store/config tests. Build + lint + format + 131 tests green.

* chore: drop #1062 (unsaved-change-detection) to match upstream revert

#1062 was merged to main by accident (per @danditomaso) and is being reverted. Reverse-applied its diff here via 3-way so #1097 stays consistent with where main is headed, while keeping the feature changes layered on the same files (deviceStore/changeRegistry). Build + 131 tests + lint + format green.

* fix(nodes): clean up SNR display in node table and map popup

SNR is a ratio measured in dB, not dBm (which is absolute power); the
node table and map popup both mislabeled it and crammed three values
together: '0dBm/50%/50raw'. The trailing '%/raw' pair was the same
heuristic ((snr+10)*5) shown twice — once clamped, once not.

Render SNR in dB rounded to one decimal, color-coded by a 0-100%
signal-quality heuristic (green/yellow/red), with the quality percentage
as a muted secondary. Drop the redundant raw value. Adds unit.db; this
matches the existing SNRTooltip, which already renders dB.
2026-06-15 13:23:28 -05:00
Dan DitomasoandGitHub 7a8529b841 Revert "fix(settings): fix unsaved change detection for non-admin-message con…" (#1100)
This reverts commit 87043f35cb.
2026-06-14 20:03:50 -04:00
fullburnenandGitHub 87043f35cb fix(settings): fix unsaved change detection for non-admin-message config items (#1062)
Add getRadioConfigChangeCount() and getDeviceConfigChangeCount() for individual setting sections. This resolves displaying the count of unsaved changes on the wrong sidebar item.

Add normalizeBytes and call it from the Security page so that unset Admin Keys do not trigger unsaved changes when updating the page.

The Position page uses useMemo which does not clear rhfState.isDirty. Remove the rhfState.isDirty from hasPending to address it.
2026-06-13 21:34:45 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
90f8219f8d chore(deps): bump react-hook-form from 7.71.2 to 7.78.0 (#1093)
Bumps [react-hook-form](https://github.com/react-hook-form/react-hook-form) from 7.71.2 to 7.78.0.
- [Release notes](https://github.com/react-hook-form/react-hook-form/releases)
- [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md)
- [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.71.2...v7.78.0)

---
updated-dependencies:
- dependency-name: react-hook-form
  dependency-version: 7.78.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-13 21:33:30 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
0d08f872b9 chore(deps): bump @radix-ui/react-collapsible from 1.1.12 to 1.1.13 (#1092)
Bumps [@radix-ui/react-collapsible](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/collapsible) from 1.1.12 to 1.1.13.
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/collapsible/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/collapsible)

---
updated-dependencies:
- dependency-name: "@radix-ui/react-collapsible"
  dependency-version: 1.1.13
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-13 21:32:54 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
a364c91f25 chore(deps): bump @bufbuild/protobuf from 2.11.0 to 2.12.0 (#1095)
Bumps [@bufbuild/protobuf](https://github.com/bufbuild/protobuf-es/tree/HEAD/packages/protobuf) from 2.11.0 to 2.12.0.
- [Release notes](https://github.com/bufbuild/protobuf-es/releases)
- [Commits](https://github.com/bufbuild/protobuf-es/commits/v2.12.0/packages/protobuf)

---
updated-dependencies:
- dependency-name: "@bufbuild/protobuf"
  dependency-version: 2.12.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-13 21:32:40 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
ca0355c700 chore(deps): bump the tanstack group across 1 directory with 5 updates (#1084)
Bumps the tanstack group with 5 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@tanstack/react-router](https://github.com/TanStack/router/tree/HEAD/packages/react-router) | `1.166.7` | `1.170.15` |
| [@tanstack/react-router-devtools](https://github.com/TanStack/router/tree/HEAD/packages/react-router-devtools) | `1.166.7` | `1.167.0` |
| [@tanstack/router-cli](https://github.com/TanStack/router/tree/HEAD/packages/router-cli) | `1.166.7` | `1.167.17` |
| [@tanstack/router-devtools](https://github.com/TanStack/router/tree/HEAD/packages/router-devtools) | `1.166.7` | `1.167.0` |
| [@tanstack/router-plugin](https://github.com/TanStack/router/tree/HEAD/packages/router-plugin) | `1.166.7` | `1.168.18` |



Updates `@tanstack/react-router` from 1.166.7 to 1.170.15
- [Release notes](https://github.com/TanStack/router/releases)
- [Changelog](https://github.com/TanStack/router/blob/main/packages/react-router/CHANGELOG.md)
- [Commits](https://github.com/TanStack/router/commits/@tanstack/react-router@1.170.15/packages/react-router)

Updates `@tanstack/react-router-devtools` from 1.166.7 to 1.167.0
- [Release notes](https://github.com/TanStack/router/releases)
- [Changelog](https://github.com/TanStack/router/blob/main/packages/react-router-devtools/CHANGELOG.md)
- [Commits](https://github.com/TanStack/router/commits/@tanstack/react-router-devtools@1.167.0/packages/react-router-devtools)

Updates `@tanstack/router-cli` from 1.166.7 to 1.167.17
- [Release notes](https://github.com/TanStack/router/releases)
- [Changelog](https://github.com/TanStack/router/blob/main/packages/router-cli/CHANGELOG.md)
- [Commits](https://github.com/TanStack/router/commits/@tanstack/router-cli@1.167.17/packages/router-cli)

Updates `@tanstack/router-devtools` from 1.166.7 to 1.167.0
- [Release notes](https://github.com/TanStack/router/releases)
- [Changelog](https://github.com/TanStack/router/blob/main/packages/router-devtools/CHANGELOG.md)
- [Commits](https://github.com/TanStack/router/commits/@tanstack/router-devtools@1.167.0/packages/router-devtools)

Updates `@tanstack/router-plugin` from 1.166.7 to 1.168.18
- [Release notes](https://github.com/TanStack/router/releases)
- [Changelog](https://github.com/TanStack/router/blob/main/packages/router-plugin/CHANGELOG.md)
- [Commits](https://github.com/TanStack/router/commits/@tanstack/router-plugin@1.168.18/packages/router-plugin)

---
updated-dependencies:
- dependency-name: "@tanstack/react-router"
  dependency-version: 1.170.11
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: tanstack
- dependency-name: "@tanstack/react-router-devtools"
  dependency-version: 1.167.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: tanstack
- dependency-name: "@tanstack/router-cli"
  dependency-version: 1.167.13
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: tanstack
- dependency-name: "@tanstack/router-devtools"
  dependency-version: 1.167.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: tanstack
- dependency-name: "@tanstack/router-plugin"
  dependency-version: 1.168.14
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: tanstack
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-12 21:22:32 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
4118887cda chore(deps): bump react-i18next from 16.5.6 to 17.0.8 (#1085)
Bumps [react-i18next](https://github.com/i18next/react-i18next) from 16.5.6 to 17.0.8.
- [Changelog](https://github.com/i18next/react-i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/react-i18next/compare/v16.5.6...v17.0.8)

---
updated-dependencies:
- dependency-name: react-i18next
  dependency-version: 17.0.8
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-12 21:22:03 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
3be19bb7a4 chore(deps): bump lucide-react from 0.545.0 to 1.17.0 (#1086)
Bumps [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) from 0.545.0 to 1.17.0.
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/1.17.0/packages/lucide-react)

---
updated-dependencies:
- dependency-name: lucide-react
  dependency-version: 1.17.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-12 21:16:12 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
fbbfac6e5c chore(deps): bump vite-plugin-pwa from 1.2.0 to 1.3.0 (#1087)
Bumps [vite-plugin-pwa](https://github.com/vite-pwa/vite-plugin-pwa) from 1.2.0 to 1.3.0.
- [Release notes](https://github.com/vite-pwa/vite-plugin-pwa/releases)
- [Commits](https://github.com/vite-pwa/vite-plugin-pwa/compare/v1.2.0...v1.3.0)

---
updated-dependencies:
- dependency-name: vite-plugin-pwa
  dependency-version: 1.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-12 21:15:37 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
bdee96fe97 chore(deps-dev): bump vite-plugin-static-copy from 3.2.0 to 4.1.1 (#1088)
Bumps [vite-plugin-static-copy](https://github.com/sapphi-red/vite-plugin-static-copy) from 3.2.0 to 4.1.1.
- [Release notes](https://github.com/sapphi-red/vite-plugin-static-copy/releases)
- [Changelog](https://github.com/sapphi-red/vite-plugin-static-copy/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sapphi-red/vite-plugin-static-copy/compare/vite-plugin-static-copy@3.2.0...vite-plugin-static-copy@4.1.1)

---
updated-dependencies:
- dependency-name: vite-plugin-static-copy
  dependency-version: 4.1.1
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-12 21:09:49 -04:00
AustinandGitHub 70edffeeae JSR migrations for pnpm 11 (#1090)
JSR is now integrated into pnpm since version 10.9
Should fix issues resolving JSR dependencies during "pnpm test"
2026-06-12 12:51:48 -04:00
AustinandGitHub 569c990575 Correct typo in excluded directories list in CI workflow (#1089)
Should fix CI errors when merging to `main`
2026-06-12 12:27:51 -04:00
AustinandGitHub 20dbcf06c1 Update pnpm to v11 (#1080)
Also remove version references in Actions so that the packageManager version can be used
2026-06-12 11:22:15 -04:00
AustinandGitHub e0d4504bca Add group for @tanstack packages in dependabot configuration (#1083)
Force all @tanstack dependencies to update together.
2026-06-07 20:29:34 -04:00
AustinandGitHub 0060a01824 Revert "chore(deps): bump @tanstack/react-router-devtools (#1072)" (#1082)
This reverts commit af499556bb.
2026-06-07 20:29:09 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
dbf7f5b18d chore(deps): bump i18next-http-backend from 3.0.5 to 4.0.0 (#1069)
Bumps [i18next-http-backend](https://github.com/i18next/i18next-http-backend) from 3.0.5 to 4.0.0.
- [Changelog](https://github.com/i18next/i18next-http-backend/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next-http-backend/compare/v3.0.5...v4.0.0)

---
updated-dependencies:
- dependency-name: i18next-http-backend
  dependency-version: 4.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-07 18:11:13 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
25e70512ce chore(deps): bump immer from 10.2.0 to 11.1.8 (#1070)
Bumps [immer](https://github.com/immerjs/immer) from 10.2.0 to 11.1.8.
- [Release notes](https://github.com/immerjs/immer/releases)
- [Commits](https://github.com/immerjs/immer/compare/v10.2.0...v11.1.8)

---
updated-dependencies:
- dependency-name: immer
  dependency-version: 11.1.8
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-07 18:09:38 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
af499556bb chore(deps): bump @tanstack/react-router-devtools (#1072)
Bumps [@tanstack/react-router-devtools](https://github.com/TanStack/router/tree/HEAD/packages/react-router-devtools) from 1.166.7 to 1.167.0.
- [Release notes](https://github.com/TanStack/router/releases)
- [Changelog](https://github.com/TanStack/router/blob/main/packages/react-router-devtools/CHANGELOG.md)
- [Commits](https://github.com/TanStack/router/commits/@tanstack/react-router-devtools@1.167.0/packages/react-router-devtools)

---
updated-dependencies:
- dependency-name: "@tanstack/react-router-devtools"
  dependency-version: 1.167.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-07 18:09:06 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
dc3da4c9d8 chore(deps-dev): bump vitest from 3.2.4 to 4.1.8 (#1073)
Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 3.2.4 to 4.1.8.
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.8/packages/vitest)

---
updated-dependencies:
- dependency-name: vitest
  dependency-version: 4.1.8
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-07 18:08:40 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
d492e1d4f2 chore(deps): bump docker/setup-buildx-action from 3 to 4 (#1079)
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 3 to 4.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v3...v4)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-07 17:58:31 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
fa902e6fb8 chore(deps): bump pnpm/action-setup from 4 to 6 (#1075)
Bumps [pnpm/action-setup](https://github.com/pnpm/action-setup) from 4 to 6.
- [Release notes](https://github.com/pnpm/action-setup/releases)
- [Commits](https://github.com/pnpm/action-setup/compare/v4...v6)

---
updated-dependencies:
- dependency-name: pnpm/action-setup
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-07 17:56:41 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
d35ccdf7a6 chore(deps): bump docker/login-action from 3 to 4 (#1077)
Bumps [docker/login-action](https://github.com/docker/login-action) from 3 to 4.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/v3...v4)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-07 17:55:23 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
801e70f201 chore(deps): bump docker/metadata-action from 5 to 6 (#1078)
Bumps [docker/metadata-action](https://github.com/docker/metadata-action) from 5 to 6.
- [Release notes](https://github.com/docker/metadata-action/releases)
- [Commits](https://github.com/docker/metadata-action/compare/v5...v6)

---
updated-dependencies:
- dependency-name: docker/metadata-action
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-07 17:54:51 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
24ec09dd43 chore(deps): bump docker/setup-qemu-action from 3 to 4 (#1076)
Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 3 to 4.
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](https://github.com/docker/setup-qemu-action/compare/v3...v4)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-07 17:54:18 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
22d125a750 chore(deps): bump actions/checkout from 4 to 6 (#1074)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-07 17:53:20 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
28029ba17f chore(deps): bump softprops/action-gh-release from 2 to 3 (#1067)
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2 to 3.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/softprops/action-gh-release/compare/v2...v3)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-version: '3'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-07 17:46:37 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
79f936c310 chore(deps): bump actions/setup-node from 4 to 6 (#1065)
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 6.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v4...v6)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-07 17:46:00 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
8cd8b0bf01 chore(deps): bump actions/download-artifact from 4 to 8 (#1066)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4 to 8.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v4...v8)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: '8'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-07 17:45:31 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
d6172fd6dd chore(deps): bump docker/build-push-action from 6 to 7 (#1064)
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6 to 7.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v6...v7)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-07 17:44:56 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
cd5cb28132 chore(deps): bump actions/upload-artifact from 4 to 7 (#1068)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4...v7)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-07 17:42:44 -04:00
AustinandGitHub 78f11dd0ee Initial dependabot config (#1063) 2026-06-07 17:39:24 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
379c8773dc chore(deps): bump js-cookie from 3.0.5 to 3.0.7 (#1058)
Bumps [js-cookie](https://github.com/js-cookie/js-cookie) from 3.0.5 to 3.0.7.
- [Release notes](https://github.com/js-cookie/js-cookie/releases)
- [Commits](https://github.com/js-cookie/js-cookie/compare/v3.0.5...v3.0.7)

---
updated-dependencies:
- dependency-name: js-cookie
  dependency-version: 3.0.7
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-26 21:27:19 -04:00
NIKOLYA PRODIGYandGitHub 2f78b64dfd fix(nodes): correct singular hop label in connection status (#1055) 2026-05-26 21:26:20 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
9a4820523f chore(deps): bump @babel/plugin-transform-modules-systemjs (#1056)
Bumps [@babel/plugin-transform-modules-systemjs](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-modules-systemjs) from 7.29.0 to 7.29.4.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.29.4/packages/babel-plugin-transform-modules-systemjs)

---
updated-dependencies:
- dependency-name: "@babel/plugin-transform-modules-systemjs"
  dependency-version: 7.29.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-26 21:24:31 -04:00
CopilotGitHubcopilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>garthvh
356b8a2331 Add .github/copilot-instructions.md with Meshtastic design standards (#1053)
Agent-Logs-Url: https://github.com/meshtastic/web/sessions/cf1d1394-bc72-4314-b0d5-03120457d4dc

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
2026-05-04 21:02:41 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
cf1ab96c93 chore(deps): bump i18next-http-backend from 3.0.2 to 3.0.5 (#1048)
Bumps [i18next-http-backend](https://github.com/i18next/i18next-http-backend) from 3.0.2 to 3.0.5.
- [Changelog](https://github.com/i18next/i18next-http-backend/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next-http-backend/compare/v3.0.2...v3.0.5)

---
updated-dependencies:
- dependency-name: i18next-http-backend
  dependency-version: 3.0.5
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-25 20:52:53 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
28d36dde31 chore(deps): bump vite from 7.3.1 to 7.3.2 (#1049)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.3.1 to 7.3.2.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v7.3.2/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.3.2/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.3.2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-25 20:51:50 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
9998c82ba0 chore(deps-dev): bump happy-dom from 20.8.3 to 20.8.9 (#1036)
Bumps [happy-dom](https://github.com/capricorn86/happy-dom) from 20.8.3 to 20.8.9.
- [Release notes](https://github.com/capricorn86/happy-dom/releases)
- [Commits](https://github.com/capricorn86/happy-dom/compare/v20.8.3...v20.8.9)

---
updated-dependencies:
- dependency-name: happy-dom
  dependency-version: 20.8.9
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-24 18:51:31 +02:00
6535c96e81 chore(i18n): improve ru-RU translation consistency (#1026)
Co-authored-by: Dan Ditomaso <dan.ditomaso@gmail.com>
2026-03-16 21:35:36 -04:00
mammuthusandGitHub 080cce1bf0 fix(i18n): correct HTTPS typo (#1014) 2026-03-16 21:26:57 -04:00
Dan DitomasoandGitHub 3c1c23c1b9 fix: use correct JSR specifier for @meshtastic/protobufs (#1028)
* fix: use correct JSR specifier for @meshtastic/protobufs

Pin pnpm version in CI workflows, remove unused .npmrc, and fix the
protobufs dependency specifier to use the full JSR format.

* updating lock file

* debug fix

* tried removing and re-adding protobuf package

* updating pnpm version

* moar fixes

* add npmrc back

* update lock file
2026-03-16 21:25:38 -04:00
Dan DitomasoandGitHub c729d3b25e fix: resolve lint warnings/errors and apply formatting (#1024)
* fix: resolve lint warnings/errors and apply formatting

Fix 10 oxlint issues (2 errors, 8 warnings):
- Remove unused catch parameters in Security.tsx and ImportDialog.tsx
- Remove stray expression in Generator.tsx
- Add eslint-disable for debounced useCallback in FilterControl.tsx
- Remove unnecessary deps (resolveDB, store) in bindStoreToDevice.ts
- Prefix unused variant param in AppSidebar.tsx
- Memoize tabs arrays in DeviceConfig, RadioConfig, ModuleConfig
- Fix channels type in RadioConfig TabItem

Also applies oxfmt formatting across all files.

* updating lock file

* update protobuf package

* fix: regenerate pnpm-lock.yaml and exclude jsr protobufs from minimumReleaseAge

* prevented http card from always being polled

* updated pnpm config fiile

* updated actions

* removed biome config and lint system leftovers

* updating protobuf package
2026-03-11 21:54:25 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
a90df07ebe chore(deps-dev): bump tar from 7.5.7 to 7.5.11 (#1027)
Bumps [tar](https://github.com/isaacs/node-tar) from 7.5.7 to 7.5.11.
- [Release notes](https://github.com/isaacs/node-tar/releases)
- [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/isaacs/node-tar/compare/v7.5.7...v7.5.11)

---
updated-dependencies:
- dependency-name: tar
  dependency-version: 7.5.11
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-11 21:14:29 -04:00
Dan DitomasoandGitHub 0579ec523e chore: remove protobufs git submodule (#1025) 2026-03-10 21:18:30 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
9ebee7a8f4 chore(deps): bump rollup from 2.79.2 to 2.80.0 (#1017)
Bumps [rollup](https://github.com/rollup/rollup) from 2.79.2 to 2.80.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/v2.80.0/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v2.79.2...v2.80.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-version: 2.80.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-04 21:32:21 -05:00
Dan DitomasoandGitHub 2b03bce0d5 restored logo (#1018) 2026-03-04 21:31:51 -05:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
948146ddc8 chore(deps-dev): bump tar from 7.5.1 to 7.5.7 (#1008)
Bumps [tar](https://github.com/isaacs/node-tar) from 7.5.1 to 7.5.7.
- [Release notes](https://github.com/isaacs/node-tar/releases)
- [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/isaacs/node-tar/compare/v7.5.1...v7.5.7)

---
updated-dependencies:
- dependency-name: tar
  dependency-version: 7.5.7
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-11 15:59:14 -05:00
ce06bc4128 fix: include long turbo modem preset (#1003)
Co-authored-by: Warp <agent@warp.dev>
2026-02-11 15:09:45 -05:00
Dan DitomasoandGitHub 765e4afe4d fix channel importing bug (#1005) 2026-02-11 12:27:17 -05:00
WesselandGitHub 0108494bd8 Channel bandwidth is kHz, not MHz (#983) 2025-12-08 23:03:41 -05:00
rj-xyandGitHub 3ecea59da8 Update README with Buf CLI installation instructions (#981)
Added instructions for installing the Buf CLI.
2025-12-04 22:59:37 -05:00
Dan DitomasoandGitHub 0b2fdb6439 Revert "feat(ui): add SNR, RSSI, hops info for messages (#963)" (#974)
This reverts commit 020e9d6b63.
2025-12-02 10:10:19 -05:00
94220e729b feat(map): add heatmap layer (#969)
* feat: add heatmap layer

* Update packages/web/src/components/PageComponents/Map/Layers/HeatmapLayer.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/components/PageComponents/Map/Tools/MapLayerTool.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/pages/Map/index.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/pages/Map/index.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/components/PageComponents/Map/Layers/HeatmapLayer.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* lint/formatting fixes

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-28 19:58:05 -05:00
020e9d6b63 feat(ui): add SNR, RSSI, hops info for messages (#963)
* feat(ui): add SNR, RSSI, hops, MQTT info for messages

* review fixes

* zeros for new fields

* Move label under the message

---------

Co-authored-by: Pmmlabs <meshtastic@pmmlabs.ru>
2025-11-27 15:42:11 -05:00
Kamil DzieniszewskiandGitHub 6a7be99a6a feat: add fixed position coordinate picker (#909)
* chore: remove unused logo SVG files

* feat: add interactive fixed position picker with map interface

- Created new FixedPositionPicker component with clickable map for setting device coordinates
- Added form field type for fixed position picker that appears when fixedPosition toggle is enabled
- Implemented position request functionality to retrieve current device location

* feat: display altitude unit based on user's display settings

- Added dynamic altitude unit (Meters/Feet) that respects the user's imperial/metric display preference
- Updated altitude field description to show the appropriate unit instead of hardcoded "Meters"

* refactor: replace any type with MapLayerMouseEvent in map click handler

* refactor: improve accessibility and code quality in FixedPositionPicker

- Replace hardcoded IDs with useId() hook for proper accessibility
- Use Number.isNaN() instead of isNaN() for more reliable type checking
- Add radix parameter to parseInt() and remove unnecessary fragment wrapper

* refactor: simplify fixed position picker integration

- Removed dedicated FixedPositionPicker form field type in favor of toggle's additionalContent prop
- Moved FixedPositionPicker to render conditionally within toggle field instead of as separate dynamic field
- Streamlined form field types by eliminating FixedPositionPickerFieldProps

* style: format code with consistent line breaks and import ordering

* refactor: simplify fixed position picker container styling

* feat: disable fixed position toggle when GPS is enabled

* refactor: use ComponentRef instead of ElementRef in Switch component

* refactor: replace interactive map picker with inline coordinate fields for fixed position

- Removed FixedPositionPicker component with map interface
- Added latitude, longitude, and altitude fields directly to position form
- Moved coordinate validation into PositionValidationSchema with proper min/max bounds
- Updated translation strings to include coordinate ranges and improved altitude description
- Coordinates now sent via setFixedPosition admin message on form submit when fixedPosition is enabled

* refactor: simplify toggle field by removing additionalContent prop and unused field spreading

- Removed additionalContent prop and its JSDoc documentation from ToggleFieldProps
- Removed rendering of additionalContent below toggle switch
- Cleaned up Controller render function by removing unused rest spread operator
- Renamed field destructuring to controllerField for clarity

* refactor: improve fixed position handling and add position broadcast request

- Restructure onSubmit to save config before sending admin message
- Add position broadcast request after setting fixed position to immediately update display
- Add comprehensive debug logging throughout submission flow
- Extract coordinate exclusion logic earlier in submission process for clarity
- Add 1 second delay before requesting position broadcast to allow fixed position processing

* feat: add max length constraint to latitude and longitude fields

- Set fieldLength.max to 10 for both latitude and longitude inputs
- Prevents excessive decimal precision while maintaining 7 decimal places (±1.1cm accuracy)
2025-11-27 15:40:57 -05:00
5debdb4689 fix(ui): add "never" i18n string, fix "Favorite" tooltip (#965)
* fix(ui): add "never" i18n string, fix "Favorite" tooltip

* format

* format

---------

Co-authored-by: Pmmlabs <meshtastic@pmmlabs.ru>
2025-11-27 15:40:41 -05:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
057043864f chore(deps-dev): bump happy-dom from 20.0.0 to 20.0.2 (#968)
Bumps [happy-dom](https://github.com/capricorn86/happy-dom) from 20.0.0 to 20.0.2.
- [Release notes](https://github.com/capricorn86/happy-dom/releases)
- [Commits](https://github.com/capricorn86/happy-dom/compare/v20.0.0...v20.0.2)

---
updated-dependencies:
- dependency-name: happy-dom
  dependency-version: 20.0.2
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-27 14:59:28 -05:00
Kamil DzieniszewskiandGitHub 8918603f96 fix(ui): correct typo in languagePicker key and adjust description width (#961)
Fixed typo 'languagePickeer' to 'languagePicker' in DeviceInfoPanel and corrected responsive width class from 'md:w-6' to 'md:w-5/6' in Connections page description.
2025-11-24 21:02:28 -05:00
68cea2e858 chore(i18n): New Crowdin Translations by GitHub Action (#962)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2025-11-22 20:54:06 -05:00
06cc266acd fix(ui): removed internet hosted fonts from app (#955)
* fix(ui): removed internet hosted fonts from app

* Update packages/web/src/components/generic/Mono.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/components/UI/Typography/Code.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* removed unsupported font extention

* formatter fix

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-19 17:52:26 -05:00
zeoandGitHub 295755ec4c fix: interpolate longName and shortName in PKI backup download (#959)
This caused {{shortName}} and {{longName}} to appear unformatted in the
exported key files:

``` === MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===

Private Key: <censored>

Public Key: <censored>

=== END OF KEYS === ```

The fix simply replicates the behaviour used elsewhere in
PKIIBackupDialog.
2025-11-18 18:04:40 -05:00
b99057df69 chore(i18n): New Crowdin Translations by GitHub Action (#958)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2025-11-17 21:28:28 -05:00
390b46f026 fix(ui): add language switcher to connections page (#954)
* fix(ui): add language switcher to connections page

* desciption length fix

* Update packages/web/src/pages/Connections/index.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* add new language picker key

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-13 13:06:20 -05:00
jsacristandGitHub 94d51912e6 feat: add devcontainer (#953) 2025-11-13 12:37:11 -05:00
Dan DitomasoandGitHub ac28fbc53d fix: removed duplicate images (#951) 2025-11-12 11:20:53 -05:00
648a9c3640 refactor: device connection logic, added nonce to get config only (#946)
* refactor: device connection logic, added nonce to get config only on connect.

* Update packages/web/src/core/services/MeshService.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/pages/Connections/useConnections.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* code review fixes

* fixes from code review

* ui fixes

* refactored meshService, moved code into deviceStore. Fixed some connnection issues

* formatting fixes

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-11 20:56:22 -05:00
Dan DitomasoandGitHub 7f21b3b531 Add 'packages/web' to excluded directories (#947) 2025-11-09 20:45:24 -05:00
d1597ce00f chore(i18n): New Crowdin Translations by GitHub Action (#941)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2025-11-09 20:38:31 -05:00
0c8fcec23d fix(i18n): Correct 'disconnected' typo in connections.json (#943)
* fix(i18n): Correct 'disconnected' typo in connections.json

* fix(i18n): Correct typo 'checkConnetion' to 'checkConnection'

* Fix(i18n): Correct typo in connection test description

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-11-09 20:38:18 -05:00
Dan DitomasoandGitHub 2e03b4a413 fix(ui): fix add connection dialog typo (#938) 2025-11-06 12:41:04 -05:00
a00cb2098b feat(ui): match avatar color other platforms (#933)
* feat(ui): match avatar color other platforms

* Update packages/web/src/components/UI/Avatar.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/components/DeviceInfoPanel.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-05 21:53:55 -05:00
Dan DitomasoandGitHub 6aeaed988e feat(docker): add arm v7 support (#934) 2025-11-05 21:53:41 -05:00
Dan DitomasoandGitHub 7c9013a217 fix(connection): support port on HTTP connection (#935) 2025-11-05 21:53:26 -05:00
Dan DitomasoandGitHub ab0308701c fix(connections): ensure connections reflect actual status. (#930) 2025-11-04 16:09:30 -05:00
e13d543e73 chore(i18n): New Crowdin Translations by GitHub Action (#924)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2025-11-04 15:23:20 -05:00
Dan DitomasoandGitHub d8ad0efcdf fix(config): update change registry channel value (#929)
* fix(config): update change registry channel value

* format/linting
2025-11-04 15:12:35 -05:00
Dan DitomasoandGitHub 2e60af1e29 fix(ci): add ui library to excluded list (#928) 2025-11-03 21:59:40 -05:00
Dan DitomasoGitHubCopilotgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>Crowdin BotKamil DzieniszewskiAzarattumBen Allfree
1af1295b8f feat(connections): Add connections page (replaces new device dialog) (#919)
* feat(conn): add connection screen and logic

* fixes from code review

* force https

* code review fixes

* add http for self testing

* enable deviceStore persistance

* added translations

* disabled feature flag

* i18n updates

* chore: add new folders to biome config (#910)

* chore(i18n): New Crowdin Translations by GitHub Action (#908)

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>

* fix: use correct deprecated GPS coordinate format enum (#917)

The Config_DisplayConfig_GpsCoordinateFormat export doesn't exist in the protobufs package. The correct export is Config_DisplayConfig_DeprecatedGpsCoordinateFormat, which matches what's used in the validation schema.

Added TODO comment explaining that this field is deprecated since protobufs 2.7.4 and should be migrated to DeviceUIConfig.gps_format when DeviceUI settings are implemented.

* style: fix line wrapping for GPS coordinate format enum (#918)

- Split long enum reference across multiple lines to improve code readability
- Maintains consistent code formatting standards without changing functionality

* fix(core): ensure core package works in browser (#923)

* fix(core): ensure core package works in browser

* style(core): revert new line removal

* fix: add @serialport/bindings-cpp to onlyBuiltDependencies (#914)

* feat(ui): Add UI library (#900)

* feat: scaffold UI library

* Update packages/ui/src/components/theme-provider.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* add lock file

* lint/formatting fixes

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* formatting/linting fixes

* fixed some paring logic

* fixed connection issue with serial

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
Co-authored-by: Kamil Dzieniszewski <kamil.dzieniszewski@gmail.com>
Co-authored-by: Azarattum <43073346+Azarattum@users.noreply.github.com>
Co-authored-by: Ben Allfree <ben@benallfree.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-03 20:24:24 -05:00
Dan DitomasoandGitHub a1a646983e fix: added skelton loader for message items (#927) 2025-11-03 19:08:53 -05:00
4386854e9d feat(ui): Add UI library (#900)
* feat: scaffold UI library

* Update packages/ui/src/components/theme-provider.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* add lock file

* lint/formatting fixes

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-31 14:37:34 -04:00
Ben AllfreeandGitHub e821a65dd4 fix: add @serialport/bindings-cpp to onlyBuiltDependencies (#914) 2025-10-31 14:37:11 -04:00
AzarattumandGitHub 3392c9db08 fix(core): ensure core package works in browser (#923)
* fix(core): ensure core package works in browser

* style(core): revert new line removal
2025-10-31 11:58:42 -04:00
Dan DitomasoandGitHub e53edfb00f feat(state): enable deviceStore persistance (#922) 2025-10-31 08:26:21 -04:00
Kamil DzieniszewskiandGitHub 1df63bb84b style: fix line wrapping for GPS coordinate format enum (#918)
- Split long enum reference across multiple lines to improve code readability
- Maintains consistent code formatting standards without changing functionality
2025-10-29 10:17:38 -04:00
Kamil DzieniszewskiandGitHub 679f7986cc fix: use correct deprecated GPS coordinate format enum (#917)
The Config_DisplayConfig_GpsCoordinateFormat export doesn't exist in the protobufs package. The correct export is Config_DisplayConfig_DeprecatedGpsCoordinateFormat, which matches what's used in the validation schema.

Added TODO comment explaining that this field is deprecated since protobufs 2.7.4 and should be migrated to DeviceUIConfig.gps_format when DeviceUI settings are implemented.
2025-10-29 10:12:04 -04:00
f375911c4a chore(i18n): New Crowdin Translations by GitHub Action (#908)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2025-10-28 11:19:36 -04:00
Dan DitomasoandGitHub 68ad535259 chore: add new folders to biome config (#910) 2025-10-28 01:54:06 -04:00
0cf677c8d5 Feat(config): Align settings menu to match android/ios (#906)
* feat: aligned settings menu to match android/ios

* updated sidebar text size.

* Update packages/web/public/i18n/locales/en/config.json

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/public/i18n/locales/en/config.json

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/components/PageComponents/Settings/User.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/components/PageComponents/ModuleConfig/Telemetry.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* linting/formatting fixes

* fixed formatting issue

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-24 13:31:22 -04:00
WesselandGitHub ff02b1455d Fix description for historyReturnWindow (#907)
It's not number of records but the time window...
2025-10-24 13:31:07 -04:00
cdad811295 Persists device and app stores across sessions (#860)
* Persistence for device and app data

* esphemeral -> ephemeral

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* devices -> app

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Additional waypoint methods, update mock, update tests

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-23 17:27:41 -04:00
fc1e327b74 Update inactive issue workflow schedule and settings (#905)
* Update inactive issue workflow schedule and settings

* Update .github/workflows/inactive-issue.yml

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-23 15:52:36 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
af2fac1465 chore(deps): bump vite from 7.1.9 to 7.1.11 (#903)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.1.9 to 7.1.11.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.1.11/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.1.11
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-23 12:29:39 -04:00
Dan DitomasoandGitHub 15daa0270c feat(ci): add CI workflow to automatically close issue after 60 days (#897)
* feat(ci): add CI workflow to automatically close issue after 60 days

* run once pe github issue to run once per day
2025-10-22 19:39:10 -04:00
Dan DitomasoandGitHub 80c9306db3 feat(i18n): add fr localization support (#902)
* feat: add fr support

* fix(i18n): ensure langs are sorted before being displayed.
2025-10-21 19:42:56 -04:00
c3f073a380 Update readme with new widgets (#901)
* chore: add new widgets to readme

* add docs url

* Update README.md

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-21 14:31:28 -04:00
fe35376450 chore(i18n): New Crowdin Translations by GitHub Action (#899)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2025-10-21 08:39:30 -04:00
64d1f0f7aa fix(ui): logic on waypoint layer component caused 0 to be shown in UI (#896)
* fix(ui): logic on waypoint layer component caused 0 to be shown in UI

* Update packages/web/src/components/PageComponents/Map/Popups/WaypointDetail.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-17 21:28:17 -04:00
a61bb2dfb6 fix(actions): improve main to stable release workflow (#895)
* fix(actions): improve main to stable release workflow

* Update .github/workflows/update-stable-from-master.yml

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update .github/workflows/update-stable-from-master.yml

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-17 10:06:17 -04:00
acfa7d2269 Add badge indicator on layers icon. (#894)
* feat: indicate number of layers enabled.

* Update packages/web/src/components/PageComponents/Map/Tools/MapLayerTool.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix: reduced code duplication in layers component

* fixed unread message bubble

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-16 09:56:32 -04:00
Dan DitomasoGitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Copilotdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
8f62fb7877 Show nodes on right sidebar on app load (#892)
* fix: show nodes on right sidebar on app load

* chore: update protobuf version to latest (#890)

* chore(deps-dev): bump happy-dom from 19.0.2 to 20.0.0 (#891)

Bumps [happy-dom](https://github.com/capricorn86/happy-dom) from 19.0.2 to 20.0.0.
- [Release notes](https://github.com/capricorn86/happy-dom/releases)
- [Commits](https://github.com/capricorn86/happy-dom/compare/v19.0.2...v20.0.0)

---
updated-dependencies:
- dependency-name: happy-dom
  dependency-version: 20.0.0
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Update packages/web/src/core/stores/nodeDBStore/index.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-15 22:02:45 -04:00
Dan DitomasoandGitHub 94409dd8e1 Refactor CI workflow to remove Deno and add exclusions (#893)
* Refactor CI workflow to remove Deno and add exclusions

Removed Deno setup and caching from CI workflow. Added exclusion logic for specific package directories during the build process.

* Update excluded directories in CI workflow

Added 'packages/transport-deno' to the excluded directories.

* Refactor CI workflow for pnpm and build process
2025-10-15 21:57:44 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
ac25326d24 chore(deps-dev): bump happy-dom from 19.0.2 to 20.0.0 (#891)
Bumps [happy-dom](https://github.com/capricorn86/happy-dom) from 19.0.2 to 20.0.0.
- [Release notes](https://github.com/capricorn86/happy-dom/releases)
- [Commits](https://github.com/capricorn86/happy-dom/compare/v19.0.2...v20.0.0)

---
updated-dependencies:
- dependency-name: happy-dom
  dependency-version: 20.0.0
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-15 16:14:02 -04:00
Dan DitomasoandGitHub 34bdbe4709 chore: update protobuf version to latest (#890) 2025-10-15 10:23:08 -04:00
Dan DitomasoandGitHub 8d98aca496 fix: updated module paths (#889) 2025-10-14 17:14:49 -04:00
Dan DitomasoandGitHub ec9ad1d309 fix: remove buf schema registry from workflow (#888) 2025-10-14 15:24:41 -04:00
Dan DitomasoandGitHub a97195c57e moar fixes (#887) 2025-10-14 14:29:43 -04:00
Dan DitomasoandGitHub 22a1d92191 Fix/more protobuf fixes (#886)
* fix: add pnpm to protobuf workflow

* fix: fixing pnpm issue
2025-10-14 13:43:34 -04:00
Dan DitomasoandGitHub 35596249b4 fix: add pnpm to protobuf workflow (#885) 2025-10-14 13:00:54 -04:00
Dan DitomasoandGitHub 566c588377 Fix protobuf github workflow (#884)
* fix: protobuf workflow

* update workflow name

* fixes
2025-10-14 10:44:33 -04:00
Dan DitomasoandGitHub 9ab49d1431 Add protobufs repo as git submodule (#882)
* feat: add protobufs git submodule

* fixes

* fixed publishing issue

* fixed lockfile
2025-10-14 08:54:55 -04:00
Kamil DzieniszewskiandGitHub f5a7132421 Update README.md (#881)
* Update README.md

* chore: rename CONTRIBUTIONS.md to CONTRIBUTING.md

- Rename packages/web/CONTRIBUTIONS.md to CONTRIBUTING.md to follow standard open source naming convention
- Update reference in packages/web/README.md to point to the renamed file
2025-10-14 07:12:03 -04:00
c66b315623 Restored user's node to ui (messages/node list) (#878)
* fix: restored own node to ui

* Update packages/web/src/pages/Messages.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/core/stores/nodeDBStore/index.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-11 10:07:56 -04:00
Dan DitomasoandGitHub 76ba4e917e fix: removed en-GB from fallback (#879) 2025-10-11 10:07:40 -04:00
d0da79bf56 chore(i18n): New Crowdin Translations by GitHub Action (#873)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2025-10-06 22:45:04 -04:00
Dan DitomasoandGitHub 66bf3f1578 Update web dependencies (#876)
* chore: update web depdencies

* update lock file

* chore: add lock file
2025-10-06 22:44:46 -04:00
6a358883f9 chore(i18n): New Crowdin Translations by GitHub Action (#868)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2025-09-29 22:19:38 -04:00
Dan DitomasoandGitHub 86622f83d0 Add minimumReleaseAge to pnpm-workspace.yaml (#865)
* Add minimumReleaseAge to pnpm-workspace.yaml

This is an important addition to protect our software from any sort of supply chain attack. This feature was recently released in pnpm 10.17.x

* Add minimumReleaseAgeExclude to pnpm-workspace.yaml

Allow our own packages to be installed without any freshness check.
2025-09-26 18:34:20 -04:00
66c3945bc4 chore(i18n): New Crowdin Translations by GitHub Action (#863)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2025-09-22 08:59:35 -04:00
Nullvoid3771andGitHub 38cb002ce8 Update nightly.yml (#864)
+echo "all_tags=nightly ${IMMUTABLE}" >> "$GITHUB_OUTPUT"
2025-09-21 19:18:22 -04:00
36443fd838 Map improvements - node and neighbor display (#850)
* Improves map node and neighbor display

Updates the map page to enhance the visualization of nodes, waypoints, and neighbor connections.

Adds a map layer tool for toggling the visibility of direct/remote neighbors and position precision indicators.

Introduces clustering to improve map readability when multiple nodes share the exact same location.

Adds SNR lines to visually represent network connections between nodes

Co-Authored-By: jamon <jamon@users.noreply.github.com>

* Clean up

* Update packages/web/src/components/generic/TimeAgo.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/components/PageComponents/Map/Layers/SNRLayer.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Improve dark mode and expires field

* Review fixes

Co-Authored-By: Dan Ditomaso <dan.ditomaso@gmail.com>

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
Co-authored-by: jamon <jamon@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Dan Ditomaso <dan.ditomaso@gmail.com>
2025-09-18 08:13:34 -04:00
8cc451546d Command Menu improvements (#857)
* Add dialogs for reset and clear actions + clear stores

* Catch failures

* Improve tests, don't reset store on failure

* Remove unnecessary i18n string

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-09-18 08:13:19 -04:00
1bdd923365 Do not unregister form (#856)
Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-09-17 18:34:19 +02:00
d5610de826 Update @bufbuild/protobuf to version 2.8.0 for web as well (#852)
Bumped @bufbuild/protobuf dependency from 2.6.0 to 2.8.0 in packages/web. Updated pnpm-lock.yaml accordingly to use the new version.

Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-09-14 21:32:00 -04:00
aaf85943a8 Address new linting rules (#851)
Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-09-14 21:31:47 -04:00
Dan DitomasoandGitHub 37ad0ac9eb removed all_tags from workflow (#854) 2025-09-14 21:27:05 -04:00
Dan DitomasoandGitHub eb2791e206 Fix for nightly release (#853)
* fix: removed commas in tag name

* removed `all_tags` from workflow
2025-09-14 15:10:56 -04:00
119cde65c7 chore(i18n): New Crowdin Translations by GitHub Action (#849)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2025-09-14 14:51:12 -04:00
cb66c22974 Fixes to github actions for latest tag (#848)
* fix: ensure latest tag works

* update release workflow as well

* Update .github/workflows/nightly.yml

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-13 16:07:13 -04:00
Henri BergiusandGitHub 96c5d0d86f Create PR instead of trying to push to protected branch (#842) 2025-09-13 15:56:01 -04:00
Dan DitomasoandGitHub 2d98f57b65 fix: update-lock-file (#847) 2025-09-13 11:54:21 -04:00
3e2fe721d3 Improvements to node filtering and storage (#839)
* Improves node filtering and voltage display

Ensures voltage values are always displayed as positive.

Enhances node filtering logic to handle unknown or undefined values, preventing nodes from being unexpectedly hidden.

Updates UI labels for clarity.

Improves Nodes page responsiveness by debouncing node updates and optimizing selector usage, preventing unnecessary re-renders.

Adds validation warnings for key conflicts between nodes.

* Update packages/web/src/core/stores/nodeDBStore/nodeDBStore.test.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/core/stores/nodeDBStore/nodeValidation.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Revert copilot suggestion

* Review changes

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-12 17:21:13 +02:00
Dan DitomasoandGitHub 52fd2f712c chore: update web deps (#845)
* chore: update web deps

* Bumped library package version (#843)

* chore: bumped package versions

* removed jsr file
2025-09-11 22:41:56 -04:00
Dan DitomasoandGitHub ad6b9f470f Bumped library package version (#843)
* chore: bumped package versions

* removed jsr file
2025-09-11 22:14:32 -04:00
765f672bf5 Improve the nightly and release workflow (#836)
* fix: improve the nightly and release workflow

* Update .github/workflows/nightly.yml

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix from code review

* add type module to node-serial

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-11 15:34:04 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
67a5d75283 chore(deps): bump vite from 7.1.1 to 7.1.5 (#841)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.1.1 to 7.1.5.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.1.5/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.1.5
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-11 14:05:55 -04:00
Henri BergiusandGitHub 4ff010e14b Get protobufs directly from NPM (#840)
* Get protobufs directly from NPM

* Bump dep

* Update lockfile too
2025-09-11 11:13:45 -04:00
1214b6ecf6 Allow default overrideFrequency (#838)
* Allow overrideFrequency == 0
* Fix typo

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-09-10 20:33:32 +02:00
Dan DitomasoandGitHub aababb8075 Dialog abstraction using DialogWrapper (#830)
* feat: add dialog abstraction system

* removed unneeded file

* fix formatting

* linting fixes
2025-09-10 13:56:45 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
3b0406c5af chore(deps): bump vite from 7.1.1 to 7.1.5 (#837)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.1.1 to 7.1.5.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.1.5/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.1.5
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-10 13:56:12 -04:00
6772f066ee chore(i18n): New Crowdin Translations by GitHub Action (#835)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2025-09-07 21:10:35 -04:00
Dan DitomasoandGitHub d8df40816f fix: added directive to remove service worker (#834) 2025-09-07 13:14:24 -04:00
f9bd61af49 Fixed overrideFrequency Input Constraints (#801)
* Fixed overrideFrequency to properly allow for floats with a minimum of 410 MHz and maximum of 930 MHz. Added 3 decimal point check.

* Removed duplicate error message in FormInput.tsx

* Added error message for overrideFrequency in several locales

* Simplified check and reverted translated languages to English besides German. Also fixed a typo in src/components/UI/Input.tsx.

* Let i18n handle fallback + linting

---------

Co-authored-by: philon- <jeremy@gallant.se>
2025-09-04 18:22:06 -04:00
Henri BergiusandGitHub bcdda8b751 Connection robustness improvements (#813)
* Clear heartbeat and queue when disconnected

* Give clearer error in case configure fails due to a lost connection. Used to throw 'Packet does not exist'

* If the queue processing error is due to a lost connection, throw it instead of looping endlessly

* In case we send a disconnection event we don't need to also throw

* Catch heartbeat errors

* Also handle invalid state errors

* Handle socket timeouts

* Log heartbeat failures

* Make linter happy

* Transform stream being a singleton prevented reconnection attempts

* Adapt tests to not using singleton

* Aborting already ends the connection
2025-09-04 13:08:05 -04:00
dcb44d27fe Persistent message store (#814)
* Fix default filter behaviour

* Persist message store

* messageStore tests, node PKI validation

Implement node validation and improve merging logic

- Added `validateIncomingNode` function to validate new nodes against existing nodes, checking for public key conflicts and ensuring proper handling of node updates.
- Updated `nodeDBFactory` to utilize the new validation function when adding nodes.
- Enhanced `getNodes` method to optionally include the current node in the results.
- Removed the `mergeNodeInfo` utility as its functionality is now integrated into the validation and merging process.
- Updated tests to cover new validation logic and ensure correct behavior during node addition and merging.
- Cleaned up unused utility functions related to key comparison.

* refactor: reuse eviction logic for message and node stores

* Update format, move hooks

* Improve test performance

* Update imports

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
Co-authored-by: Dan Ditomaso <dan.ditomaso@gmail.com>
2025-09-03 21:00:48 -04:00
Dan DitomasoandGitHub 799283fd46 fix: added latest tag, added conditionals if prerelease (#832) 2025-09-03 17:09:54 -04:00
Dan DitomasoandGitHub d0f4939a4d Added lint rule to enforce importing with extensions (#831)
* fix: added lint rule to enforce importing with extentions

* fix test import path

* added import file extentions
2025-09-03 17:07:00 -04:00
d66f10e715 Fix rename seperator again (#828)
* Reapply "Seperator -> Separator (#823)" (#827)

This reverts commit e421eb4244.

* Rename new seperator

* Update packages/web/src/components/Dialog/NodeDetailsDialog/NodeDetailsDialog.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/components/Dialog/RebootDialog.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/components/PageComponents/Map/NodeDetail.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/src/pages/Dashboard/index.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
Co-authored-by: Dan Ditomaso <dan.ditomaso@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-02 22:02:36 -04:00
Dan DitomasoandGitHub e421eb4244 Revert "Seperator -> Separator (#823)" (#827)
This reverts commit 3582499a3c.
2025-09-02 09:41:48 -04:00
ce16bf5aa4 Chat message date display (#824)
* Date handling

* Apply suggestion from @Copilot

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-01 23:00:05 -04:00
3582499a3c Seperator -> Separator (#823)
Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-09-01 21:57:51 -04:00
1946000d14 New channel config (#807)
* Channel config rework

Add staged channel config with tabbed UI, import/export workflow, and global form state refactor

* Improve import dialog config comparison and UI labels

* Review fixes

* Improve state handling

* Fix default filter behaviour

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-09-01 09:07:34 -04:00
01fa030ef9 Fix default filter behaviour (#820)
Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-08-31 21:44:22 -04:00
90cf136b8c Update test format (#821)
* Lint tests, format JSON

* Update test formatting

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-08-31 21:30:11 -04:00
Dan DitomasoandGitHub ee131c3681 fix: added working directory to build step (#819) 2025-08-31 16:22:43 -04:00
85accf7c25 chore(i18n): New Crowdin Translations by GitHub Action (#815)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2025-08-31 16:05:23 -04:00
Jeremy GallantandGitHub 91426a89e5 Lint tests, format JSON (#818) 2025-08-31 16:04:34 -04:00
Dan DitomasoandGitHub d7e492cdc9 fix: removed comma from tag name (#817) 2025-08-31 13:09:50 -04:00
Dan DitomasoandGitHub c5cad1dca6 fix incorrect usage of tags (#811) 2025-08-28 20:56:54 -04:00
Henri BergiusandGitHub 85aa7a37b9 Methods for setting/removing fixed position (#802)
* Method for setting fixed position

* Implement removeFixedPosition

* Fix formatting
2025-08-27 18:46:14 -04:00
Henri BergiusandGitHub b87fad23d8 Catch packet decoding errors (#809)
* Catch decoding errors, refs #808

* Catch packet handling errors

* Add missing type
2025-08-25 16:59:35 -04:00
68ec7ee5d8 Persistent nodedb (#780)
* Refactor  and consolitdate store imports

- Created a new index file in the core stores directory to export all stores from a single module.
- Updated imports to use consolidated store exports.

* Remove unnecessary import

* Update imports

* First steps to persist nodeDB

* Use named exports

* Change store import after merge

* Persistent nodeDB initial work

* Key mishmatch warning, new serialization handler

* Minor copilot changes

* Add NODEDB_RETENTION_NUM

* Updated tests

* Refactor PKI mismatch logic

* Clear persisted db on reset

* Only persist on featureFlag

* Mock featureFlag in tests

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-08-24 09:23:20 -04:00
e33463b371 chore(i18n): New Crowdin Translations by GitHub Action (#806)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2025-08-23 20:45:31 -04:00
Jeremy GallantandGitHub d4b80cf90b Re-add toaster component (#804) 2025-08-23 20:45:22 -04:00
d7e32e9b03 Add transport status events (#790)
* Transport status events

Add symbol docs
Emit transport status events
Transport test suite

* Review fixes

* Remove core dependency

* HTTP transport use AbortSignal, error handling in TransportNode

* Improve stream handling

* Update packages/transport-web-serial/src/transport.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Fix linting

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-23 20:44:03 -04:00
449fb3ac36 Added feature flags system (#803)
* added feature flag system

* Update packages/web/src/core/services/featureFlags.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* remove process.env

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-22 13:47:24 -04:00
Dan DitomasoandGitHub 1de92cd2e9 Replace workspace formatter/linting tool (#799)
* replaced workspace formatter/linting tool

* format / linting fixes
2025-08-22 12:30:05 -04:00
Dan DitomasoandGitHub fdd3e7f971 re-order package steps (#798) 2025-08-20 12:19:26 -04:00
Dan DitomasoandGitHub 6eece7172a bumped web-serial version (#797) 2025-08-20 11:53:12 -04:00
Ben MeadorsandGitHub 5b2c25d8ee Try-fix webserial disconnect not actually disconnecting (#796)
* Try-fix webserial disconnects

* Instantiate abort controller on new connection
2025-08-20 11:01:17 -04:00
Dan DitomasoandGitHub 40c2bfa535 Add pnpm install to release step (#795)
* more github changes

* moar changes
2025-08-19 14:50:54 -04:00
Dan DitomasoandGitHub a10023fad6 more github changes (#794) 2025-08-19 13:19:28 -04:00
Dan DitomasoandGitHub 0a1afa988e update order of steps in nightly github action (#793) 2025-08-19 11:33:00 -04:00
Dan DitomasoandGitHub 97b884f119 add lock file (#792) 2025-08-18 09:19:34 -04:00
eb9b7159d4 Refactor github actions with monorepo support (#783)
* refactor github actions with monorepo support

* Update .github/workflows/release-packages.yml

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update .github/workflows/release-packages.yml

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* updates

* changed order of ci/pr steps

* Update .github/workflows/release-web.yml

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* adding lock file

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-18 09:07:13 -04:00
65a53388bb Fix docker nginx config (#786)
* Fix docker-nginx-config sub directory issue

* Fix docker-nginx-config sub directory issue

* Update packages/web/infra/default.conf

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/web/infra/default.conf

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* adding lock file

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-18 09:06:48 -04:00
2ca3eb5685 Missing validation strings (#791)
Partially revert 43143bf

Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-08-18 09:03:15 -04:00
a4c817cd30 Added contribution guidelines doc (#788)
* added contribution guidelines doc

* Update packages/web/CONTRIBUTIONS.md

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-17 14:32:10 -04:00
d5b03c09db chore(i18n): New Crowdin Translations by GitHub Action (#784)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2025-08-17 11:43:18 -04:00
Henri BergiusandGitHub 0b9ebade38 Initial Node.js serial transport (#779)
* Initial Node.js serial transport

* Minor doc fixes

* Add serialport to lockfile

* Typo fix

* Fix link:
2025-08-14 21:56:34 -04:00
ee1758a548 Add DFU mode to command menu (#781)
* feat: add dfu mode to command menu

* Update packages/web/src/components/CommandPalette/index.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-13 21:24:45 -04:00
Dan DitomasoandGitHub a2a45ac898 Update release-web.yml (#777) 2025-08-11 13:55:24 -04:00
Dan DitomasoandGitHub 59d172765d Update release-web.yml (#776) 2025-08-11 13:48:35 -04:00
d453ff809a Refactor and consolidate store imports (#774)
* Refactor  and consolitdate store imports

- Created a new index file in the core stores directory to export all stores from a single module.
- Updated imports to use consolidated store exports.

* Remove unnecessary import

* Update imports

* Use named exports

* Change store import after merge

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-08-11 12:36:33 -04:00
Dan DitomasoandGitHub ed0a99dbd9 Update release-web.yml (#775)
added adhoc runs.
2025-08-11 11:20:48 -04:00
32f31cb502 Add client notification (#771)
* ClientNotification WIP

* Test

* ClientNotification WIP

* Add client notification dialog and related functionality

* Update ClientNotificationDialog.tsx

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-08-10 21:59:03 -04:00
Jeremy GallantandGitHub 176d554ef9 Improve NodeDetailsDialog UI and add security info (#770)
* Improve NodeDetailsDialog UI and add security info

Refactored NodeDetailsDialog to use tables for better layout and readability, added a security section displaying public key and verification status, and included messageable status. Updated i18n files with new keys and improved battery level formatting. Fixed logic in Nodes page for handling location packets and improved hardware model sorting.

* Update NodeDetailsDialog.tsx
2025-08-10 21:58:26 -04:00
2735c37fad Fix Docker and CI builds (#773)
* Fix Docker and CI builds

* Fix indentation

* Fix release

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-08-10 21:58:09 -04:00
f04ec36faf Update VSCode settings (#769)
Update extensions

Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-08-10 07:50:51 -04:00
28f0ca4337 chore(i18n): New Crowdin Translations by GitHub Action (#772)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2025-08-10 07:50:30 -04:00
1dbf0b07b6 refactor-ota-dialog (#768)
Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-08-10 07:49:42 -04:00
27ed4e58bd Fix admin PKI validation (#766)
Admin PKI fields were falsely flagged as unchanged.

Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-08-09 22:38:59 -04:00
a7f56c0bd5 Fix checkbox tests (#767)
Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-08-09 22:37:31 -04:00
284ccd43f8 refactor: update ci/cd scripts, switch to pnpm (#763)
* refactor: update ci/cd scripts, switch to pnpm

* updated workflow

* add new packages github action. Bump package.json version (#762)

* Update packages/transport-deno/scripts/build_npm.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/core/package.json

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/transport-deno/scripts/build_npm.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/transport-deno/scripts/build_npm.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/transport-deno/scripts/build_npm.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update .github/workflows/release-packages.yml

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* revert copilot suggestion

* adding lock file

* regenerate lock file

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-08 14:54:20 -04:00
Dan DitomasoandGitHub 5a66153dfc add new packages github action. Bump package.json version (#762) 2025-08-07 11:31:14 -04:00
Dan DitomasoandGitHub 363981a2f7 Conditional app title based on environment. (#760)
* conditionally set title based on environment.

* wip
2025-08-06 11:44:55 -04:00
Dan DitomasoandGitHub 7848aa2f0c Add CookieYes for GDPR/CCPA compliance (#759)
* feat: add CookieYes for GDPR/CCPA compliance

* refactor how cookieYes script is loaded
2025-08-06 10:54:40 -04:00
Henri BergiusandGitHub 0a7b653ec8 Transport disconnect method (#753)
* Prevent reads from piling up

* Implement disconnect() method for all transports
2025-08-05 22:46:23 -04:00
Dan DitomasoandGitHub 313c4dbb71 Update README.md (#758) 2025-08-05 21:50:53 -04:00
1927323fb7 chore(i18n): New Crowdin Translations by GitHub Action (#756)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2025-08-04 22:55:32 -04:00
Dan DitomasoandGitHub 41f11f3040 revert: package json changes (#750) 2025-07-28 22:39:15 -04:00
9833628867 chore(i18n): New Crowdin Translations by GitHub Action (#748)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2025-07-28 20:38:35 -04:00
Dan DitomasoandGitHub 4dd911e73d Use workspace meshtastic packages (#749)
* refactor: updated web package.json to use workspace

* formatting fixes
2025-07-28 18:18:46 -04:00
Dan DitomasoandGitHub 56487d3832 fix: typo in position flags (#747) 2025-07-28 16:45:14 -04:00
Vasilj MiloševićandGitHub a9f6afffc2 Add visually hidden DialogTitle to the CommandDialog (#742)
* Add visually hidden DialogTitle to the CommandDialog

Added a visually hidden DialogTitle to the CommandDialog component in Command.tsx  to maintain accessibility while keeping the clean UI of the command palette.

* add visually hidden component as explicit dependency
2025-07-28 16:44:25 -04:00
Dan DitomasoandGitHub 09f7f64099 fix: crowdin uploading (#746) 2025-07-28 13:28:20 -04:00
Dan DitomasoandGitHub 4ab06abefe fix: update directory paths for source files (#745) 2025-07-28 12:55:54 -04:00
ce15fd21ad add tsconfig to monorepo (#737)
* add tsconfigs to root

* Update tsconfig.base.json

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update tsconfig.base.json

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-26 14:51:34 -04:00
Dan DitomasoandGitHub 3c1399b44a Changed position of theme button, hiding tooltip after set time. (#735)
* fix: changed position of theme button, hiding tooltip after set time.

* feat: added usevisibility hook

* updating paths
2025-07-25 12:48:57 -04:00
50ca75da0e Send heartbeat package to keep serial alive (#732)
* Send heartbeat package to keep the serial connection alive

* Update meshDevice.ts

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-07-24 10:15:27 -04:00
Jeremy GallantandGitHub 5b417a321a Fix node mapping and unknown node display in traceroute dialogs (#728)
Corrects the mapping of 'from' and 'to' nodes in TracerouteResponseDialog to reflect the actual origin and destination of traceroute packets. Also updates TraceRoute to display a localized unknown name for node ID 4294967295 (0xffffff), improving clarity for unknown nodes.
2025-07-23 21:31:05 -04:00
Hunter ThornsberryandGitHub bbb43de87b Fix readme and remove broken git link attempting to be a hyperlink (#733) 2025-07-23 21:30:44 -04:00
2e4d306d79 Change HTTP transport intial connect attempt target (#729)
Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-07-22 12:56:30 -04:00
afb7f4bd2e Change chatId validation schema (#731)
Fixes #715

Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-07-22 10:01:31 -04:00
67db8b5be8 Update Switch color scheme (#730)
Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-07-22 09:58:25 -04:00
Dan DitomasoandGitHub 09d6556abd readd device num to serial page (#727) 2025-07-20 14:54:43 -04:00
Dan DitomasoandGitHub bfe4e01c85 add tag version to footer (#725) 2025-07-20 14:53:44 -04:00
Hunter ThornsberryandGitHub d8304a3f00 Check config.display.use12hclock setting for displaying timestamps on messages, default to true (#723) 2025-07-20 02:13:04 -04:00
8a443e9cad Fix/add npm jsr building (#722)
* fixed github workflows to improve handling of mutl runtimes

* updating readme

* Update packages/core/src/meshDevice.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/core/package.json

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/transport-http/package.json

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-17 20:47:25 -04:00
Henri BergiusandGitHub 0e29639222 Use the actual toDeviceStream (#721) 2025-07-17 18:38:55 -04:00
Dan DitomasoandGitHub 7b0725029f CI updates to support monorepo (#719) 2025-07-17 10:17:44 -04:00
Dan DitomasoandGitHub 704d06cfe7 refactor: switch to using Bun (#718) 2025-07-16 22:30:10 -04:00
Dan DitomasoandGitHub acfd7ebd2d Update README.md (#716) 2025-07-15 22:25:01 -04:00
Dan DitomasoandGitHub 5fb5693792 feat: added disconnect method to core lib (#712) 2025-07-15 09:08:32 -04:00
dd3f3f0499 fix: include additional info in nightly container tag name (#709)
* fix: added latest build version into container tag

* updated tag format

* Update .github/workflows/nightly.yml

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-14 11:29:58 -04:00
Dan DitomasoandGitHub ff73ed2521 Update README.md (#707) 2025-07-11 10:32:13 -04:00
5efa1d1795 Prevented i18n package from escaping text (#704)
* fix: prevented i18n package from escaping text

* Update packages/web/vite.config.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix: stupid copilot

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-11 08:23:47 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
f010365151 chore(deps): bump tj-actions/changed-files in /.github/workflows (#705)
Bumps [tj-actions/changed-files](https://github.com/tj-actions/changed-files) from 44 to 46.
- [Release notes](https://github.com/tj-actions/changed-files/releases)
- [Changelog](https://github.com/tj-actions/changed-files/blob/main/HISTORY.md)
- [Commits](https://github.com/tj-actions/changed-files/compare/v44...v46)

---
updated-dependencies:
- dependency-name: tj-actions/changed-files
  dependency-version: '46'
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-10 15:29:08 -04:00
Dan DitomasoandGitHub 7f177f6b83 Add npm publishing of JS libs (#702)
* feat: publish js libs to npm

* changed license type

* updated readme

* added id

* added exclusion for web and deno packages

* update comment

* updating env var
2025-07-10 12:28:23 -04:00
66b839742a Add node-transport lib (#703)
* feat: add node transport

* updated readme

* Update packages/transport-node/README.md

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-09 22:02:10 -04:00
Dan DitomasoandGitHub 2e2b0074b1 Assorted Monorepo fixes (#698)
* add npmrc to root

* fix: associated updates related to monorepo updates

* removed deno plugin

* removed deno plugin

* updating ci
2025-07-07 14:14:41 -04:00
Dan DitomasoandGitHub 49283daa4f fix: updated nginx config to pass sub directories (#692) 2025-07-07 11:53:42 -04:00
Dan DitomasoandGitHub 3bcda37e66 update pr workflow (#697) 2025-07-07 11:52:48 -04:00
Dan DitomasoandGitHub 684cf30d2f add npmrc to root (#696) 2025-07-07 11:49:18 -04:00
Dan DitomasoandGitHub 8989478af4 update caching for ci/cd (#695) 2025-07-07 11:43:17 -04:00
Dan DitomasoandGitHub d3446b64a3 removed tests from ci pipeline (#694) 2025-07-07 10:43:58 -04:00
Dan DitomasoandGitHub 87cd91b0f8 refactor: add svgs to sub folder (#687) 2025-07-03 07:10:12 -04:00
Dan DitomasoandGitHub e01946a1e4 Update README.md (#685) 2025-06-27 12:09:58 -04:00
72edb1897f Feat/add js repo to monorepo (#683)
* feat: move js repo into web monorepo

* added readme

* Update packages/core/README.md

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/transport-http/README.md

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/transport-web-bluetooth/README.md

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-06-26 11:52:57 -04:00
Dan DitomasoandGitHub 1c13343e8a Add monorepo support to project (#682)
* feat: add monorepo support

* fix: correct relatedProjects structure in vercel.json

* update github actions with monorepo support

* removed legacy dep

* moved jsr config into web package
2025-06-25 21:56:55 -04:00
Dan DitomasoandGitHub 85ee0747d1 fix: move i18n languages to public folder (#681)
* fix: move i18n languages for best practices

* updating test setup

* removed static copy
2025-06-25 16:21:36 -04:00
Dan DitomasoandGitHub e2f03aaf81 feat: add dependency injection using tanstack context (#680)
* feat: add dep injection using tanstack context

* fixed small typo
2025-06-24 18:19:26 -04:00
Dan DitomasoandGitHub 6c676fa8da add git sub module (#678) 2025-06-23 22:26:01 -04:00
183b3ae8cc chore(i18n): New Crowdin Translations by GitHub Action (#677)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2025-06-22 13:57:29 -04:00
43143bfdf6 Device Name dialog validation (#676)
* fix: style on config page

* feat: added device name validation

* Update src/i18n/locales/en/dialog.json

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/components/Dialog/DeviceNameDialog.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/components/Dialog/DeviceNameDialog.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fixed typo

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-06-21 23:08:25 -04:00
Dan DitomasoandGitHub c6a564f7e4 fix: style on config page (#674) 2025-06-20 12:39:11 -04:00
762aed50b7 Updated button styling on config header (#673)
* fix: updated button in config

* Update src/pages/Config/index.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-06-18 21:08:56 -04:00
bb91350ef5 fix: Crash when navigator.serial is undefined (#670)
* Fix crash when navigator.serial is undefined

* Change value

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-06-18 16:39:14 -04:00
Dan DitomasoandGitHub ec9b299b37 fix: add missing i18n strings (#671)
* fix: added required i18n labels to UI

* added node i18n

* updated tests

* updated path to match github action
2025-06-18 16:25:14 -04:00
0e6a4818ea fix: Crowdin upload sources action (#672)
* Fix Crowdin upload sources action

* Replace biome with deno in vscode extension recommendations

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-06-18 15:48:41 -04:00
181c984b27 Config form improvements (#652)
* Config reset work WIP

* Config reset WIP

* Fix tests, tsc, linting

* Form reset adjustments

* Add ManagedModeDialog

* Remove debug logging

* Add Suspense

* Review fixes

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-06-18 10:04:17 -04:00
7adbe01723 Add advanced filters (#655)
* Add advanced filters

* Review edits

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-06-18 10:02:42 -04:00
a5339af0dd Fix language default in picker. Misc i18n fixes (#664)
* fix: fix language default in picker. Misc i18n fixes

* Update src/i18n/config.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* PR fixes

* duplicate key

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-06-17 16:23:57 -04:00
Dan DitomasoandGitHub c91e5e6b7b fix: add rewrites to vercel.json (#662) 2025-06-17 11:09:43 -04:00
Jeremy GallantandGitHub ccc4202aa4 Minor i18n fixes (#663)
* i18n fixes

Add PKI Backup Reminder dialog + ensure en-US is UI default

* Revert edits to i18n components
2025-06-17 10:24:58 -04:00
Dan DitomasoandGitHub 118f848308 feat: add support for 3 languages (#661) 2025-06-16 16:22:45 -04:00
c36ff60778 chore(i18n): New Crowdin Translations by GitHub Action (#660)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2025-06-16 15:59:08 -04:00
Dan DitomasoandGitHub 474e610c3d fix: revert crowdin config (#659) 2025-06-16 15:55:29 -04:00
Dan DitomasoandGitHub 0b6ae0ce32 fix: update crowdin config (#658) 2025-06-16 15:14:59 -04:00
fad1b984bf chore(i18n): New Crowdin Translations by GitHub Action (#653)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2025-06-16 09:41:50 -04:00
Dan DitomasoandGitHub 6cc6986904 fix: remove service worker (#654) 2025-06-16 09:39:13 -04:00
Dan DitomasoandGitHub 26d5c0a08a feat: added i18n translator & developer guides (#646) 2025-06-12 20:15:43 -04:00
Dan DitomasoandGitHub 78e1d1f81a fix: updated mqtt description (#647) 2025-06-12 20:14:59 -04:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
48862141dc chore(deps): bump tj-actions/changed-files in /.github/workflows (#650)
Bumps [tj-actions/changed-files](https://github.com/tj-actions/changed-files) from 44 to 46.
- [Release notes](https://github.com/tj-actions/changed-files/releases)
- [Changelog](https://github.com/tj-actions/changed-files/blob/main/HISTORY.md)
- [Commits](https://github.com/tj-actions/changed-files/compare/v44...v46)

---
updated-dependencies:
- dependency-name: tj-actions/changed-files
  dependency-version: '46'
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-12 20:10:08 -04:00
Dan DitomasoandGitHub 47f8264c31 Fix tsc errors (#649)
* fixed tsc errors

* fixed tsc errors

* fixed tsc errors

* fixing tsc errors

* fixing more tsc errors

* fixing more tsc errors

* fixed tsc errors

* fixing tsc errors

* fixing PR issues

* commented out tsc check

* completing tsc fixes

* updating lockfile

* removed react-hooks
2025-06-12 19:00:30 -04:00
Dan DitomasoandGitHub 851da0707c Fix broken tests (#648) 2025-06-12 16:08:08 -04:00
4275bdd0c0 Remove deprecated meshtastic/js dependency (#638)
* Remove deprecated meshtastic/js dependency

* Bump dependency version

* Fix linting

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-06-11 10:09:29 -04:00
828e5d0903 Replace zustand state management with URL-based routing (#640)
* feat: added router

* feat: added params to messages page

* fixing tests, added translation labels

* Update src/i18n/locales/en/ui.json

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/components/Dialog/NodeDetailsDialog/NodeDetailsDialog.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/components/PageComponents/Map/NodeDetail.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/pages/Messages.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* updated dev tools

* fixing tests

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-06-06 18:23:49 -04:00
1cbd98ec53 Zod config validation (#635)
* Zod WIP

* Zod form validation

* DynamicForm testing

* Fix linting

* Delete rasterSource.ts

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-06-04 08:10:59 -04:00
Dan DitomasoandGitHub df036d3904 Add commit sha to footer. (#636)
* feat: added commit sha to footer.

* added translation

* added padding

* updated styling
2025-06-01 20:41:25 -04:00
Kimberly GrahamandGitHub 08dbe94679 fix i18n files missing and Toast messages (#634)
* fix Toast messages

* Copy i18n files to dist using
vite-plugin-static-copy
2025-05-28 13:55:45 -04:00
Dan DitomasoandGitHub 24e9764fcb fix: updated namespace module (#632)
N33d this merged.
2025-05-27 11:13:51 -04:00
Dan DitomasoandGitHub eb2a2717b1 Internationalization (i18n) (#627)
* `feat: added internationalization lib, added english labels`
* `fixes from code review`
* `feat: add crowdin github actions`
* `fix: added support for i18n in testing. Fixed broken tests`
* `fix: missing translations`
* `removed unneded import`
* `more components updated with missing translations`
* `fixed lint issue`
* `Refactor: updated how translations are scoped, updated all references`
* `fixing broken tests`
* `feat: added language switcher, updated some translations`
* `fixed linting issues`
* `reverting vite config`
* `add english group id's to command palette`
* `updated PR template for i18n`
2025-05-27 08:33:43 -04:00
9d74fe2d6e Remove autocomplete from message box (#630)
* Remove autocomplete from message box

The message box has autocomplete turned on, which causes some browsers to suggest previously written messages in a really annoying way.   This fixes that issue.

* Update src/components/PageComponents/Messages/MessageInput.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-05-27 07:36:16 -04:00
philon-andGitHub 8413f6345c Fix #624 (#631) 2025-05-27 07:35:47 -04:00
philon-andGitHub 37a53b747c Fix NodeInfoDialog initiation (#626) 2025-05-27 07:14:57 -04:00
a642080b90 Filter rework (#623)
* Rework filtering

Created common FilterComponents
Created common FilterControl
Abstracted common map logic into Map component
Reworked Node filtering for map page
Added Node filtering for nodes list
Added test for node filtering
Added toggle group UI package

* Debounce filterState change

* UI adjustments

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-05-22 15:11:32 -04:00
Dan DitomasoandGitHub 9cb5cffdb1 Update README.md
Remove references to `master` replace with `main`
2025-05-21 11:58:03 -04:00
57b9942cce Add RSSI fields for Paxcounter module (#620)
Co-authored-by: philon- <philon-@users.noreply.github.com>
2025-05-19 12:36:39 -04:00
philon-andGitHub 1274584497 Feature: Admin PKI fields (#619)
* Add admin PKI fields

* Renaming state ref

* WIP: Refactoring

* Refactoring Security Config

* Ensure admin keys have been set before allowing managed mode
2025-05-16 10:24:41 -04:00
1206 changed files with 194598 additions and 30328 deletions
+12
View File
@@ -0,0 +1,12 @@
{
"name": "meshtastic-web",
"image": "mcr.microsoft.com/devcontainers/typescript-node:1-22-bookworm",
"features": {
"ghcr.io/r3dpoint/devcontainer-features/tailwindcss-standalone-cli:1": {
"version": "latest"
},
"ghcr.io/devcontainers-extra/features/pnpm:2": {
"version": "latest"
}
}
}
+3
View File
@@ -0,0 +1,3 @@
## Design Standards
All UI must comply with the [Meshtastic Client Design Standards](https://raw.githubusercontent.com/meshtastic/design/refs/heads/master/standards/meshtastic_design_standards_latest.md). Fetch and review this document before making any UI changes.
+25
View File
@@ -0,0 +1,25 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
cooldown:
default-days: 3 # 1 day after pnpm's cutoff, prevent a race
open-pull-requests-limit: 10 # Increase PR limit
groups:
tanstack:
patterns:
- "@tanstack/*"
radix-ui:
patterns:
- "@radix-ui/*"
react-ecosystem:
patterns:
- react
- react-dom
- "@types/react*"
+12 -10
View File
@@ -1,48 +1,50 @@
<!-- <!--
Thank you for your contribution to our project! Please fill out the following template to help reviewers understand your changes. Thank you for your contribution to our project!
--> -->
## Description ## Description
<!-- <!--
Provide a clear and concise description of what this PR does. Explain the problem it solves or the feature it adds. Provide a clear and concise description of what this PR does. Explain the problem it solves or the feature it adds.
--> -->
## Related Issues ## Related Issues
<!-- <!--
Link any related issues here using the GitHub syntax: "Fixes #123" or "Relates to #456". Link any related issues here using the GitHub syntax: "Fixes #123" or "Relates to #456".
If there are no related issues, you can remove this section. If there are no related issues, you can remove this section.
--> -->
## Changes Made ## Changes Made
<!-- <!--
List the key changes you've made. Focus on the most important aspects that reviewers should understand. List the key changes you've made. Focus on the most important aspects that reviewers should understand.
--> -->
-
- -
- -
- -
## Testing Done ## Testing Done
<!-- <!--
Describe how you tested these changes. Describe how you tested these changes (added new tests, etc).
--> -->
## Screenshots (if applicable) ## Screenshots (if applicable)
<!-- <!--
If your changes affect the UI, include screenshots or screencasts showing the before and after. If your changes affect the UI, include screenshots or screencasts showing the before and after.
--> -->
## Checklist ## Checklist
<!-- <!--
Check all that apply. If an item doesn't apply to your PR, you can leave it unchecked or remove it. Check all that apply. If an item doesn't apply to your PR, you can leave it unchecked or remove it.
--> -->
- [ ] Code follows project style guidelines - [ ] Code follows project style guidelines
- [ ] Documentation has been updated or added - [ ] Documentation has been updated or added
- [ ] Tests have been added or updated - [ ] Tests have been added or updated
- [ ] All CI checks pass - [ ] All i18n translation labels have been added (read
- [ ] Dependent changes have been merged CONTRIBUTING_I18N_DEVELOPER_GUIDE.md for more details)
## Additional Notes
<!--
Add any other context about the PR here.
-->
+53 -27
View File
@@ -1,10 +1,9 @@
name: Push to Master/Main CI name: Push to Main CI
on: on:
push: push:
branches: branches:
- main - main
- master
permissions: permissions:
contents: write contents: write
@@ -15,37 +14,64 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v7
- name: Setup Deno - name: Setup pnpm
uses: denoland/setup-deno@v2 uses: pnpm/action-setup@v6
- name: Setup Node.js
uses: actions/setup-node@v7
with: with:
deno-version: v2.x node-version: 24
cache: pnpm
cache-dependency-path: "**/pnpm-lock.yaml"
- name: Install Dependencies - name: Prewarm & Install (workspace)
run: deno install run: |
set -euo pipefail
pnpm fetch
pnpm install --frozen-lockfile --offline
- name: Cache Deno dependencies - name: Build All Packages (with exclusions)
uses: actions/cache@v4 shell: bash
with: run: |
path: | set -euo pipefail
~/.cache/deno
./deno.lock
key: ${{ runner.os }}-deno-${{ hashFiles('**/deno.lock') }}
restore-keys: |
${{ runner.os }}-deno-
- name: Cache Dependencies # List packages to exclude (full paths under repo root)
run: deno cache src/index.tsx EXCLUDED_DIRS=("packages/protobufs" "packages/transport-deno" "packages/ui" "packages/web")
- name: Run linter is_excluded() {
run: deno task lint local dir="$1"
for ex in "${EXCLUDED_DIRS[@]}"; do
if [[ "$dir" == "$ex" ]]; then
return 0
fi
done
return 1
}
- name: Check formatter for pkg_dir in packages/*/; do
run: deno task format --check pkg_dir="${pkg_dir%/}" # trim trailing slash
- name: Run tests # Must be a directory with a package.json
run: deno task test if [[ ! -f "$pkg_dir/package.json" ]]; then
echo "⚠️ Skipping $pkg_dir (no package.json)"
continue
fi
- name: Build Package # Allow for exclusions
run: deno task build if is_excluded "$pkg_dir"; then
echo "🚫 Skipping $pkg_dir (excluded)"
continue
fi
# Optionally skip Deno-first packages automatically
if [[ -f "$pkg_dir/deno.json" || -f "$pkg_dir/deno.jsonc" ]]; then
echo "🦕 Skipping $pkg_dir (deno project)"
continue
fi
echo "🔧 Building: $pkg_dir"
# No per-package install needed; workspace install already done
pnpm -C "$pkg_dir" run build:npm
done
+35
View File
@@ -0,0 +1,35 @@
name: Crowdin Download Translations Action
on:
schedule: # Every Sunday at midnight
- cron: "0 0 * * 0"
workflow_dispatch: # Allow manual triggering
jobs:
synchronize-with-crowdin:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v7
- name: Download translations with Crowdin
uses: crowdin/github-action@v2
with:
base_url: "https://meshtastic.crowdin.com/api/v2"
config: "./apps/web/crowdin.yml"
upload_sources: false
upload_translations: false
download_translations: true
localization_branch_name: i18n_crowdin_translations
commit_message: "chore(i18n): New Crowdin Translations by GitHub Action"
create_pull_request: true
pull_request_title: "chore(i18n): New Crowdin Translations"
pull_request_body: "New Crowdin translations by [Crowdin GH Action](https://github.com/crowdin/github-action)"
pull_request_base_branch_name: "main"
pull_request_labels: "i18n"
crowdin_branch_name: "main"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}
CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}
@@ -0,0 +1,32 @@
name: Crowdin Upload Sources Action
on:
push:
# Monitor all .json files within the /i18n/locales/en/ directory.
# This ensures the workflow triggers if any the English namespace files are modified on the main branch.
paths:
- "/apps/web/public/i18n/locales/en/*.json"
branches: [main]
workflow_dispatch: # Allow manual triggering
jobs:
synchronize-with-crowdin:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v7
- name: Upload sources with Crowdin
uses: crowdin/github-action@v2
with:
base_url: "https://meshtastic.crowdin.com/api/v2"
config: "./apps/web/crowdin.yml"
upload_sources: true
upload_translations: false
download_translations: false
crowdin_branch_name: "main"
env:
CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}
CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}
@@ -0,0 +1,25 @@
name: Crowdin Upload Translations Action
on:
workflow_dispatch: # Allow manual triggering
jobs:
synchronize-with-crowdin:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v7
- name: Upload translations with Crowdin
uses: crowdin/github-action@v2
with:
base_url: "https://meshtastic.crowdin.com/api/v2"
config: "./apps/web/crowdin.yml"
upload_sources: false
upload_translations: true
download_translations: false
crowdin_branch_name: "main"
env:
CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}
CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}
+64
View File
@@ -0,0 +1,64 @@
# Real-device end-to-end suite: drives the web app in Chromium against two
# simulated `meshtasticd` firmware nodes (UDP-multicast mesh, no MQTT) and
# exercises text messaging in both directions. See e2e/README.md.
name: E2E (real device)
on:
workflow_dispatch:
pull_request:
paths:
- "e2e/**"
- "apps/web/**"
- "packages/**"
- "playwright.config.ts"
- ".github/workflows/e2e.yml"
jobs:
e2e:
runs-on: ubuntu-latest
timeout-minutes: 30
env:
CI: "true"
steps:
- uses: actions/checkout@v7
- uses: pnpm/action-setup@v6
- uses: actions/setup-node@v7
with:
node-version: 24
cache: pnpm
- name: Install workspace deps
run: pnpm install --frozen-lockfile
- name: Install Chromium
run: pnpm exec playwright install --with-deps chromium
- uses: actions/setup-python@v7
with:
python-version: "3.11"
- name: Install Python mesh peer
run: |
python -m venv e2e/peer/.venv
e2e/peer/.venv/bin/pip install -r e2e/peer/requirements.txt
- name: Run E2E suite
run: pnpm test:e2e
- name: Upload Playwright report
if: ${{ !cancelled() }}
uses: actions/upload-artifact@v7
with:
name: playwright-report
path: e2e/.report
retention-days: 7
- name: Dump device logs on failure
if: failure()
run: docker compose -f e2e/device/docker-compose.yml logs --no-color || true
- name: Tear down mesh
if: always()
run: docker compose -f e2e/device/docker-compose.yml down -v || true
+24
View File
@@ -0,0 +1,24 @@
name: Close inactive issues
on:
schedule:
- cron: "0 */4 * * *" # every 4 hours
workflow_dispatch: # allow manual runs
jobs:
close-issues:
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
steps:
- uses: actions/stale@v11
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
days-before-issue-stale: 60
days-before-issue-close: 14
stale-issue-label: "stale"
stale-issue-message: "This issue is stale because it has been open for 60 days with no activity."
close-issue-message: "This issue was closed because it has been inactive for 14 days since being marked as stale."
days-before-pr-stale: -1
days-before-pr-close: -1
only-issue-labels: "Bug"
remove-stale-when-updated: true
+84 -32
View File
@@ -1,66 +1,118 @@
name: 'Nightly Release' name: Nightly Release
on: on:
schedule: schedule:
- cron: "0 5 * * *" # Run every day at 5am UTC - cron: "0 5 * * *" # 05:00 UTC daily
workflow_dispatch: {} # allow manual runs too
permissions: permissions:
contents: write contents: read
packages: write packages: write
env:
REGISTRY_IMAGE: ghcr.io/${{ github.repository }}
jobs: jobs:
build-and-package: nightly-build-and-push:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v7
- name: Setup Deno - name: Setup pnpm
uses: denoland/setup-deno@v2 uses: pnpm/action-setup@v6
- name: Setup Node.js
uses: actions/setup-node@v7
with: with:
deno-version: v2.x node-version: 24
cache: pnpm
cache-dependency-path: "**/pnpm-lock.yaml"
- name: Install Dependencies - name: Install dependencies (root)
run: deno install run: pnpm install --frozen-lockfile
- name: Run tests - name: Run tests
run: deno task test run: pnpm run test
- name: Build Package - name: Build web package
run: deno task build working-directory: apps/web
run: pnpm run build
- name: Package Output - name: Package output
run: deno task package working-directory: apps/web
run: pnpm run package
- name: Archive compressed build - name: Upload compressed build (artifact)
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v7
with: with:
name: build name: web-build-nightly
path: dist/build.tar path: apps/web/dist/build.tar
if-no-files-found: error
- name: Compute tags and labels
id: meta
shell: bash
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -euo pipefail
DATE="$(date -u +%Y%m%d)"
ISO_CREATED="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
SHORTSHA="$(git rev-parse --short=12 HEAD)"
# Try to use latest release tag if it exists; fallback to package version; else date
LATEST_TAG="$(gh release view --json tagName --jq .tagName 2>/dev/null || true)"
if [ -z "$LATEST_TAG" ] && [ -f apps/web/package.json ]; then
LATEST_TAG="v$(jq -r .version apps/web/package.json)"
fi
if [ -n "${LATEST_TAG:-}" ] && [ "$LATEST_TAG" != "vnull" ]; then
IMMUTABLE="nightly-${LATEST_TAG}-${SHORTSHA}"
else
IMMUTABLE="nightly-${DATE}-${SHORTSHA}"
fi
# Outputs
echo "moving_tag=nightly" >> "$GITHUB_OUTPUT"
echo "immutable_tag=${IMMUTABLE}" >> "$GITHUB_OUTPUT"
echo "all_tags=nightly ${IMMUTABLE}" >> "$GITHUB_OUTPUT"
echo "created=${ISO_CREATED}" >> "$GITHUB_OUTPUT"
echo "Resolved tags: nightly and ${IMMUTABLE}"
- name: Set up QEMU - name: Set up QEMU
uses: docker/setup-qemu-action@v3 uses: docker/setup-qemu-action@v4
- name: Buildah Build - name: Build Container Image (multi-arch)
id: build-container id: build-container
uses: redhat-actions/buildah-build@v2 uses: redhat-actions/buildah-build@v3
with: with:
containerfiles: | containerfiles: |
./infra/Containerfile ./apps/web/infra/Containerfile
image: ${{github.event.repository.full_name}} image: ${{ env.REGISTRY_IMAGE }}
tags: nightly ${{ github.sha }} tags: |
${{ steps.meta.outputs.moving_tag }}
${{ steps.meta.outputs.immutable_tag }}
oci: true oci: true
platforms: linux/amd64, linux/arm64 platforms: linux/amd64,linux/arm64,linux/arm/v7
labels: |
org.opencontainers.image.source=${{ github.repository }}
org.opencontainers.image.revision=${{ github.sha }}
org.opencontainers.image.created=${{ steps.meta.outputs.created }}
- name: Push To Registry - name: Push To GHCR
id: push-to-registry id: push-to-registry
uses: redhat-actions/push-to-registry@v2 uses: redhat-actions/push-to-registry@v3
with: with:
image: ${{ steps.build-container.outputs.image }} image: ${{ steps.build-container.outputs.image }}
tags: ${{ steps.build-container.outputs.tags }} # Push the same tags used at build time:
tags: ${{ steps.meta.outputs.all_tags }}
registry: ghcr.io registry: ghcr.io
username: ${{ github.actor }} username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }} password: ${{ secrets.GITHUB_TOKEN }}
- name: Print image url - name: Print image URLs
run: echo "Image pushed to ${{ steps.push-to-registry.outputs.registry-paths }}" run: |
echo "Moving tag: ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.moving_tag }}"
echo "Immutable tag: ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.immutable_tag }}"
+41 -33
View File
@@ -2,52 +2,60 @@ name: Pull Request CI
on: on:
pull_request: pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
contents: read
concurrency:
group: pr-${{ github.event.pull_request.number }}-ci
cancel-in-progress: true
env:
CI: true
jobs: jobs:
build: build-and-package:
runs-on: ubuntu-latest runs-on: ubuntu-latest
if: ${{ github.event.pull_request.draft == false }}
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v7
- name: Setup Deno - name: Setup pnpm
uses: denoland/setup-deno@v2 uses: pnpm/action-setup@v6
- name: Setup Node.js
uses: actions/setup-node@v7
with: with:
deno-version: v2.x node-version: 24
cache: pnpm
cache-dependency-path: pnpm-lock.yaml
- name: Cache Deno dependencies - name: Debug dependency state
uses: actions/cache@v4 run: |
with: set -euo pipefail
path: | echo "GITHUB_SHA=${GITHUB_SHA}"
~/.cache/deno git log --oneline -1
./deno.lock pnpm --version
key: ${{ runner.os }}-deno-${{ hashFiles('**/deno.lock') }} node --version
restore-keys: | grep -n "meshtastic__protobufs" pnpm-lock.yaml || true
${{ runner.os }}-deno- grep -n "2.7.18" pnpm-lock.yaml || true
grep -n "2.7.20" pnpm-lock.yaml || true
- name: Install Dependencies - name: Install dependencies
run: deno install run: pnpm install --frozen-lockfile
- name: Cache Dependencies
run: deno cache src/index.tsx
- name: Run linter - name: Run linter
run: deno task lint run: pnpm run lint
- name: Check formatter - name: Check formatter
run: deno task format --check run: pnpm run check
continue-on-error: true
- name: Run tests - name: Run tests
run: deno task test run: pnpm run test
- name: Build Package - name: Build web package
run: deno task build run: pnpm --filter "./apps/web" run build
- name: Compress build
run: deno task package
- name: Archive compressed build
uses: actions/upload-artifact@v4
with:
name: build
path: dist/build.tar
+145
View File
@@ -0,0 +1,145 @@
name: Release Packages
on:
workflow_dispatch:
inputs:
packages:
description: 'Packages to release (comma-separated, or "all")'
required: false
default: "all"
bump:
description: "Semver bump (patch | minor | major)"
required: false
default: "patch"
jobs:
release:
runs-on: ubuntu-latest
permissions:
contents: write # we commit the bumped versions back
id-token: write # required for JSR OIDC
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
steps:
- name: Checkout code
uses: actions/checkout@v7
- name: Setup pnpm
uses: pnpm/action-setup@v6
- name: Setup Node.js
uses: actions/setup-node@v7
with:
node-version: 24
cache: pnpm
cache-dependency-path: "**/pnpm-lock.yaml"
registry-url: "https://registry.npmjs.org"
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Resolve package list
id: pkgs
shell: bash
run: |
set -euo pipefail
if [ "${{ github.event.inputs.packages }}" = "all" ] || [ -z "${{ github.event.inputs.packages }}" ]; then
mapfile -t TARGETS < <(ls -d packages/*)
else
IFS=',' read -ra TARGETS <<< "${{ github.event.inputs.packages }}"
TARGETS=("${TARGETS[@]/#/packages/}")
fi
printf '%s\n' "${TARGETS[@]}" | paste -sd, - > targets.txt
echo "list=$(cat targets.txt)" >> "$GITHUB_OUTPUT"
echo "Targets: $(cat targets.txt)"
- name: Bump package.json versions (no git tag)
shell: bash
run: |
set -euo pipefail
BUMP="${{ github.event.inputs.bump }}"
IFS=',' read -ra TARGETS <<< "${{ steps.pkgs.outputs.list }}"
for dir in "${TARGETS[@]}"; do
if [ -f "$dir/package.json" ]; then
echo "Bumping $dir -> $BUMP"
(cd "$dir" && npm version "$BUMP" --no-git-tag-version --allow-same-version)
fi
done
- name: Generate jsr.json from package.json (pkg-to-jsr)
shell: bash
run: |
set -euo pipefail
IFS=',' read -ra TARGETS <<< "${{ steps.pkgs.outputs.list }}"
for dir in "${TARGETS[@]}"; do
if [ -f "$dir/package.json" ]; then
echo "Generating jsr.json for $dir"
pnpm dlx pkg-to-jsr --root "$dir"
# # Optional: show result
# jq -C . "$dir/jsr.json" || cat "$dir/jsr.json"
fi
done
- name: Commit version bumps
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
shell: bash
run: |
set -euo pipefail
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add packages/*/package.json packages/*/jsr.json 2>/dev/null || true
if ! git diff --cached --quiet; then
git checkout -b version_bump
git commit -m "chore(release): bump package versions (${{ github.event.inputs.bump }})"
git push -u origin version_bump
gh pr create --title "Bump package versions" --body "Bump versions of NPM and JSR packages" --base main --head version_bump
echo "Pushed to branch version_bump"
else
echo "No changes to commit."
fi
- name: Build selected packages
shell: bash
run: |
set -euo pipefail
IFS=',' read -ra TARGETS <<< "${{ steps.pkgs.outputs.list }}"
for dir in "${TARGETS[@]}"; do
echo "Building $dir"
pnpm --filter "./$dir" run build
done
- name: Publish to JSR (OIDC)
shell: bash
run: |
set -euo pipefail
IFS=',' read -ra TARGETS <<< "${{ steps.pkgs.outputs.list }}"
for dir in "${TARGETS[@]}"; do
if [ -f "$dir/jsr.json" ]; then
echo "Publishing $dir to JSR via OIDC…"
( cd "$dir"
[ -d dist ] || pnpm run build
npx --yes jsr publish
)
fi
done
- name: Configure npm auth
run: |
pnpm config set //registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN}
pnpm config set registry https://registry.npmjs.org/
- name: Publish to npm
shell: bash
run: |
set -euo pipefail
IFS=',' read -ra TARGETS <<< "${{ steps.pkgs.outputs.list }}"
for dir in "${TARGETS[@]}"; do
if [ -f "$dir/package.json" ]; then
echo "Publishing $dir to npm…"
( cd "$dir"
[ -d dist ] || pnpm run build
npm publish --access public
)
fi
done
+141
View File
@@ -0,0 +1,141 @@
name: Create Protobuf Release for JSR
on:
workflow_dispatch:
inputs:
version:
description: "Version to publish (e.g. v1.2.3). Used when manually dispatching."
required: true
type: string
dry_run:
description: "Don't actually publish to JSR (passes --dry-run)."
required: false
type: boolean
default: false
permissions: write-all
env:
PROTOBUF_DIR: ./packages/protobufs
jobs:
codegen:
runs-on: ubuntu-24.04
steps:
- name: Checkout code
uses: actions/checkout@v7
with:
fetch-depth: 0
- name: Show files exist
run: |
set -euxo pipefail
ls -la $PROTOBUF_DIR/packages/ts || true
cat $PROTOBUF_DIR/packages/ts/deno.json
- name: Determine VERSION
run: |
set -euo pipefail
if [ -n "${{ inputs.version }}" ]; then
VERSION="${{ inputs.version }}"
else
echo "No 'version' input. Provide inputs.version." >&2
exit 1
fi
STRIPPED="${VERSION#v}"
echo "VERSION=$STRIPPED" >> "$GITHUB_ENV"
echo "Resolved VERSION=$STRIPPED"
- name: Set Package Versions to current tag
working-directory: ${{ env.PROTOBUF_DIR }}/packages/ts
run: |
set -euxo pipefail
for f in deno.json; do
test -f "$f"
jq --arg version "${VERSION//\//-}" '
walk(
if type == "string" and test("__PACKAGE_VERSION__")
then sub("__PACKAGE_VERSION__"; $version)
else .
end
)
' "$f" > "$f.tmp"
mv "$f.tmp" "$f"
done
- name: Setup Buf
uses: bufbuild/buf-setup-action@main
with:
github_token: ${{ github.token }}
- name: Setup pnpm
uses: pnpm/action-setup@v6
- name: Install workspace dependencies
run: pnpm install --frozen-lockfile
- name: Generate code
run: pnpm --filter @meshtastic/protobufs-ws build
- name: Move generated .ts files and clean up
run: |
set -euxo pipefail
SRC_DIR="$PROTOBUF_DIR/packages/ts/dist/meshtastic"
DEST_DIR="$PROTOBUF_DIR/packages/ts/dist"
if [ -d "$SRC_DIR" ]; then
shopt -s nullglob
ts_files=("$SRC_DIR"/*.ts)
if [ ${#ts_files[@]} -gt 0 ]; then
mv "$SRC_DIR"/*.ts "$DEST_DIR"/
fi
rm -rf "$SRC_DIR"
else
echo "Source directory not found: $SRC_DIR" >&2
exit 1
fi
# Remove nanopb_pb.ts if present
if [ -f "$DEST_DIR/nanopb_pb.ts" ]; then
rm "$DEST_DIR/nanopb_pb.ts"
fi
- name: Copy license & README
run: |
cp LICENSE $PROTOBUF_DIR/packages/ts
cp README.md $PROTOBUF_DIR/packages/ts
- name: Upload TypeScript code
uses: actions/upload-artifact@v7
with:
name: ts_code
path: ${{ env.PROTOBUF_DIR }}/packages/ts
publish-jsr:
runs-on: ubuntu-24.04
needs: codegen
permissions:
contents: read
id-token: write
env:
DRY_RUN: ${{ inputs.dry_run }}
steps:
- name: Download TypeScript code
uses: actions/download-artifact@v8
with:
name: ts_code
- name: Set up Deno
uses: denoland/setup-deno@main
with:
deno-version: rc
- name: Publish to JSR
run: |
set -euxo pipefail
FLAGS="--unstable-sloppy-imports"
if [ "${DRY_RUN}" = "true" ]; then
FLAGS="$FLAGS --dry-run"
echo "Running publish in dry-run mode..."
fi
deno publish $FLAGS
+158
View File
@@ -0,0 +1,158 @@
name: Release Web
on:
release:
types: [released, prereleased]
workflow_dispatch:
inputs:
ref:
description: "Git ref (branch, tag, or SHA) to build"
required: false
default: ""
tag_name:
description: "Tag to use for artifacts/images (defaults to <sha>)"
required: false
default: ""
attach_to_release:
description: "Upload build.tar to an existing GitHub Release (requires tag_name)"
required: false
type: boolean
default: false
permissions:
contents: write
packages: write
env:
REGISTRY_IMAGE: ghcr.io/${{ github.repository }}
jobs:
release-web:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v7
with:
ref: ${{ inputs.ref != '' && inputs.ref || github.ref }}
- name: Setup pnpm
uses: pnpm/action-setup@v6
- name: Setup Node.js
uses: actions/setup-node@v7
with:
node-version: 24
cache: pnpm
cache-dependency-path: "**/pnpm-lock.yaml"
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build web package
working-directory: apps/web
run: pnpm run build
- name: Create release archive
working-directory: apps/web
run: pnpm run package
- name: Upload archive (artifact)
uses: actions/upload-artifact@v7
with:
name: web-build
path: apps/web/dist/build.tar
if-no-files-found: error
- name: Attach archive to GitHub Release
if: ${{ github.event_name == 'release' || inputs.attach_to_release == true }}
uses: softprops/action-gh-release@v3
with:
files: apps/web/dist/build.tar
tag_name: ${{ github.event_name == 'release' && github.event.release.tag_name || inputs.tag_name }}
fail_on_unmatched_files: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# Compute created timestamp & short SHA for labels/tags
- name: Compute meta
id: gen
shell: bash
run: |
echo "created=$(date -u +%Y-%m-%dT%H:%M:%SZ)" >> "$GITHUB_OUTPUT"
echo "shortsha=$(git rev-parse --short=12 HEAD)" >> "$GITHUB_OUTPUT"
# Build/tag matrix:
# - For release events: vX.Y.Z, semver helpers, and latest (only if NOT prerelease)
# - For prerelease events: vX.Y.Z and semver helpers (NO latest)
# - For manual runs:
# * if tag_name set: that raw tag
# * else: adhoc-<shortsha>
- name: Docker metadata (tags & labels)
id: meta
uses: docker/metadata-action@v6
with:
images: ${{ env.REGISTRY_IMAGE }}
labels: |
org.opencontainers.image.source=${{ github.repository }}
org.opencontainers.image.revision=${{ github.sha }}
org.opencontainers.image.created=${{ steps.gen.outputs.created }}
tags: |
# Full release (semantic tag)
type=raw,value=${{ github.event.release.tag_name }},enable=${{ github.event_name == 'release' }}
# Semver helpers (major, major.minor) for releases/prereleases
type=semver,pattern={{version}},value=${{ github.event.release.tag_name }},enable=${{ github.event_name == 'release' }}
type=semver,pattern={{major}}.{{minor}},value=${{ github.event.release.tag_name }},enable=${{ github.event_name == 'release' && github.event.release.prerelease == false }}
type=semver,pattern={{major}},value=${{ github.event.release.tag_name }},enable=${{ github.event_name == 'release' && github.event.release.prerelease == false }}
# Latest only for full releases (not prereleases)
type=raw,value=latest,enable=${{ github.event_name == 'release' && github.event.release.prerelease == false }}
# Manual: provided tag_name
type=raw,value=${{ inputs.tag_name }},enable=${{ github.event_name == 'workflow_dispatch' && inputs.tag_name != '' }}
# Manual: fallback to adhoc-<shortsha>
type=raw,value=adhoc-${{ steps.gen.outputs.shortsha }},enable=${{ github.event_name == 'workflow_dispatch' && inputs.tag_name == '' }}
# Always add immutable sha tag for traceability
type=raw,value=sha-${{ steps.gen.outputs.shortsha }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v4
- name: Set up Buildx
uses: docker/setup-buildx-action@v4
- name: Login to GHCR
uses: docker/login-action@v4.5.2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
# Push images for:
# - release (released or prereleased)
# - manual with a tag_name (adhoc builds can still be pushed by name)
- name: Build and push image
uses: docker/build-push-action@v7
with:
context: .
file: ./apps/web/infra/Containerfile
platforms: linux/amd64,linux/arm64,linux/arm/v7
push: ${{ github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && inputs.tag_name != '') }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
provenance: false
- name: Output image refs
if: ${{ github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && inputs.tag_name != '') }}
run: |
echo "🖼️ Pushed tags:"
echo "${{ steps.meta.outputs.tags }}"
echo
echo "Pull examples:"
if [[ "${{ github.event_name }}" == "release" && "${{ github.event.release.prerelease }}" == "false" ]]; then
echo " docker pull ${{ env.REGISTRY_IMAGE }}:latest"
fi
# Always available:
echo " docker pull ${{ env.REGISTRY_IMAGE }}:${{ github.event.release.tag_name || inputs.tag_name || format('adhoc-{0}', steps.gen.outputs.shortsha) }}"
echo " docker pull ${{ env.REGISTRY_IMAGE }}:sha-${{ steps.gen.outputs.shortsha }}"
- name: Explain no image push
if: ${{ !(github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && inputs.tag_name != '')) }}
run: echo "ℹ️ No image pushed (manual run without tag_name)."
-72
View File
@@ -1,72 +0,0 @@
name: Release
on:
release:
types: [released, prereleased]
permissions:
contents: write
packages: write
jobs:
build-and-package:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Deno
uses: denoland/setup-deno@v2
with:
deno-version: v2.x
- name: Install Dependencies
run: deno install
- name: Run tests
run: deno task test
- name: Build Package
run: deno task build
- name: Package Output
run: deno task package
- name: Archive compressed build
uses: actions/upload-artifact@v4
with:
name: build
path: dist/build.tar
- name: Attach build.tar to release
run: |
gh release upload ${{ github.event.release.tag_name }} dist/build.tar
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Buildah Build
id: build-container
uses: redhat-actions/buildah-build@v2
with:
containerfiles: |
./infra/Containerfile
image: ${{github.event.repository.full_name}}
tags: latest ${{ github.sha }}
oci: true
platforms: linux/amd64, linux/arm64
- name: Push To Registry
id: push-to-registry
uses: redhat-actions/push-to-registry@v2
with:
image: ${{ steps.build-container.outputs.image }}
tags: ${{ steps.build-container.outputs.tags }}
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Print image url
run: echo "Image pushed to ${{ steps.push-to-registry.outputs.registry-paths }}"
+71 -26
View File
@@ -1,50 +1,95 @@
name: Update Stable Branch from Master on Latest Release name: Update Stable Branch from Main on Latest Release
on: on:
release: release:
types: [released] types: [released]
permissions: permissions:
contents: write contents: write
concurrency:
group: update-stable-${{ github.run_id }}
cancel-in-progress: true
jobs: jobs:
update-stable-branch: update-stable-branch:
name: Update Stable Branch from Master name: Update stable from latest release source
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v7
with: with:
fetch-depth: 0 fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }} fetch-tags: true # IMPORTANT: we need tags to resolve the release commit
- name: Configure Git - name: Configure Git author
run: | run: |
git config user.name "GitHub Actions Bot" git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com" git config user.email "github-actions[bot]@users.noreply.github.com"
- name: Fetch latest master and stable branches - name: Determine source SHA (prefer tag)
id: meta
shell: bash
run: | run: |
git fetch origin master:master set -euo pipefail
git fetch origin stable:stable || echo "Stable branch not found remotely, will create."
- name: Get latest master commit SHA TAG="${{ github.event.release.tag_name }}"
id: get_master_sha TARGET="${{ github.event.release.target_commitish || '' }}"
run: echo "MASTER_SHA=$(git rev-parse master)" >> $GITHUB_ENV
- name: Check out stable branch # Always ensure we have latest remote heads/tags
run: | git fetch --tags --prune origin
if git show-ref --verify --quiet refs/heads/stable; then
git checkout stable SHA=""
git pull origin stable # Sync with remote stable if it exists SRC_DESC=""
else
echo "Creating local stable branch based on master HEAD." # 1) Prefer the release tag commit
git checkout -b stable ${{ env.MASTER_SHA }} if [ -n "${TAG}" ] && git rev-parse -q --verify "refs/tags/${TAG}" >/dev/null; then
SHA="$(git rev-list -n1 "${TAG}")"
SRC_DESC="tag:${TAG}"
fi fi
- name: Reset stable branch to latest master # 2) Fall back to target_commitish if it points to a branch on origin
run: git reset --hard ${{ env.MASTER_SHA }} if [ -z "${SHA}" ] && [ -n "${TARGET}" ] && git ls-remote --exit-code --heads origin "${TARGET}" >/dev/null 2>&1; then
git fetch origin "${TARGET}:${TARGET}" --prune
SHA="$(git rev-parse "${TARGET}^{commit}")"
SRC_DESC="branch:${TARGET}"
fi
- name: Force push stable branch # 3) Fall back to main if present
run: git push origin stable --force if [ -z "${SHA}" ] && git ls-remote --exit-code --heads origin "main" >/dev/null 2>&1; then
git fetch origin "main:main" --prune
SHA="$(git rev-parse "main^{commit}")"
SRC_DESC="branch:main"
fi
if [ -z "${SHA}" ]; then
echo "::error::Unable to resolve source commit from tag (${TAG}), target_commitish (${TARGET}), or main."
exit 1
fi
echo "Using source: ${SRC_DESC}"
echo "sha=${SHA}" >> "$GITHUB_OUTPUT"
echo "source=${SRC_DESC}" >> "$GITHUB_OUTPUT"
- name: Create/reset local stable to SHA
shell: bash
run: |
set -euo pipefail
# Make sure we know if remote stable exists (non-fatal if not)
git fetch origin stable:refs/remotes/origin/stable || true
# Create or reset local stable in one command
git checkout -B stable "${{ steps.meta.outputs.sha }}"
git status --short --branch
- name: Push stable (force-with-lease)
run: |
# Safer than --force; refuses if remote moved unexpectedly (protects against races)
REMOTE_STABLE_SHA="$(git rev-parse refs/remotes/origin/stable || echo '')"
if [ -z "$REMOTE_STABLE_SHA" ]; then
# If remote stable doesn't exist, just use --force-with-lease=stable (no SHA)
git push origin stable:stable --force-with-lease=stable
else
# Use the specific SHA for maximum safety
git push origin stable:stable --force-with-lease=stable:$REMOTE_STABLE_SHA
fi
+17 -1
View File
@@ -1,7 +1,23 @@
dist
node_modules node_modules
dist
stats.html stats.html
.vercel .vercel
.vite .vite
dev-dist dev-dist
__screenshots__* __screenshots__*
*.diff
npm/
.idea
**/LICENSE
.DS_Store
packages/protobufs/packages/ts/dist
.pnpm-store/
# Local dev certs
*.pem
*.crt
*.key
# Claude Code session locks
.claude/
View File
+1
View File
@@ -0,0 +1 @@
pnpm lint-staged
+7
View File
@@ -0,0 +1,7 @@
{
"$schema": "https://raw.githubusercontent.com/oxc-project/oxc/main/npm/oxfmt/configuration_schema.json",
"useTabs": false,
"tabWidth": 2,
"printWidth": 80,
"ignorePatterns": ["*.md"]
}
+1 -1
View File
@@ -1,3 +1,3 @@
{ {
"recommendations": ["bradlc.vscode-tailwindcss", "biomejs.biome"] "recommendations": ["bradlc.vscode-tailwindcss", "oxc.oxc-vscode"]
} }
+3 -3
View File
@@ -1,6 +1,6 @@
{ {
"deno.enable": true,
"deno.suggest.imports.autoDiscover": true,
"editor.formatOnSave": true, "editor.formatOnSave": true,
"editor.defaultFormatter": "denoland.vscode-deno" "search.exclude": {
"**/i18n/locales/*-*/**": true
}
} }
+9
View File
@@ -0,0 +1,9 @@
# Meshtastic Web Client - Claude Code Guide
@AGENTS.md
## Claude-Specific Instructions
- **Think First:** Always outline your step-by-step reasoning inside `<thinking>` tags before writing code or shell commands. Claude models perform significantly better on complex TypeScript tasks when they "think out loud" first.
- **Skills:** The `.skills/` directory contains task-specific instruction modules. Load them as needed — only the skill relevant to your current task.
- **Plan Mode:** Use plan mode for architectural changes spanning multiple modules. Write plans to `.agent_plans/` (git-ignored). The Copilot-CLI-specific `/plan`, `/delegate`, `/research`, and `/share` guidance in `AGENTS.md` does not apply to Claude Code — skip the `<copilot_cli_workflow>` section.
+65
View File
@@ -0,0 +1,65 @@
# Protobuf catch-up to firmware-current
> Draft PR description + the one decision for maintainers. This file is **untracked** —
> use it as the PR body, then delete it (or leave it, it won't be committed).
## What this does
- Syncs the vendored `.proto` sources in `packages/protobufs/meshtastic/` from ~v2.7.20 to
**firmware-current (v2.7.25 + 48 commits)** — +2 new files (`deviceonly_legacy`, `serial_hal`)
and additions across `config` / `module_config` / `mesh` / `admin` / `portnums` / `telemetry`.
- Regenerates the v2 TS bindings (`buf generate`).
- Makes the app consume the **workspace** protobufs (`workspace:*`) instead of the stale JSR
`@meshtastic/protobufs@2.7.20`, finishing the monorepo migration that was half-done
(`@meshtastic/core` was already `workspace:*`; protobufs was still on JSR).
- One breaking-change fix: `admin.proto` `nodedb_reset` changed `int32 → bool`, so
`MeshDevice.resetNodes()` now sends `value: true` (the oneof-case presence triggers the
reset; `true` preserves favorites through it).
## Free wins (dynamic enum dropdowns — no UI code)
New LoRa regions (ITU/EU amateur bands), modem presets (LONG_TURBO, LITE/NARROW/TINY_*),
~25 hardware names, `OLED_SH1107_ROTATED`, serial `LOG`/`LOGTEXT` — they flow into the
existing enum-bound `<select>`s automatically once the bindings regenerate.
## Breaking proto changes that DON'T break us (verified)
- `deviceonly.proto` `NodeInfoLite` restructure — core never imports `NodeInfoLite`.
- `channel.proto` `is_client_muted → is_muted` + `mute` removed — neither web nor core
references those fields yet.
## The one decision for maintainers — how to consume the protobufs
This changeset takes **Option A (workspace consumption):** rename the workspace package
`@meshtastic/protobufs-ws → @meshtastic/protobufs` (still `private`), point its `exports` at the
TS source, and depend on it via `workspace:*` from root + core.
- ✅ Monorepo is self-consuming and always firmware-current; no publish round-trip; matches
the already-migrated `@meshtastic/core`.
- ⚠️ Diverges from the JSR publish flow; the published JSR `@meshtastic/protobufs`
(latest 2.7.23) is no longer what the app builds against.
**Option B (canonical publish flow):** keep the package JSR-published — sync the `.proto`
sources here, publish a new `@meshtastic/protobufs` to JSR, then bump the root range.
- ✅ Stays on the established pipeline; one source of truth on JSR.
- ⚠️ Needs a JSR publish, and can't reach firmware-current until that release lands
(JSR tops out at 2.7.23, still behind firmware).
If you prefer **B**, everything except the 3 dependency-wiring edits still applies — the
`.proto` sync, the regen, and the `nodedbReset` fix are identical; only the root dep, the core
dep, and the protobufs `package.json` name/exports get swapped for a JSR publish + range bump.
## Regenerating bindings
```
pnpm --filter @meshtastic/protobufs gen
```
Output lands in `packages/protobufs/packages/ts/dist/` (gitignored).
## Verified in isolation (this branch only — no feature/demo code)
- `packages/core` typecheck: clean except 2 **pre-existing** `queue.ts` strict-catch errors.
- `packages/web` `vite build`: green.
- 36 config/module validation tests: pass.
+154 -141
View File
@@ -1,175 +1,188 @@
# Meshtastic Web # Meshtastic Web Monorepo
<!--Project specific badges here--> [![CI](https://img.shields.io/github/actions/workflow/status/meshtastic/web/ci.yml?branch=main&label=Web%20CI&logo=github&color=yellow)](https://github.com/meshtastic/web/actions/workflows/ci.yml)
[![CI](https://img.shields.io/github/actions/workflow/status/meshtastic/js/ci.yml?branch=master&label=JS%20CI&logo=github&color=yellow)](https://github.com/meshtastic/js/actions/workflows/ci.yml)
[![CI](https://img.shields.io/github/actions/workflow/status/meshtastic/web/ci.yml?branch=master&label=actions&logo=github&color=yellow)](https://github.com/meshtastic/web/actions/workflows/ci.yml)
[![CLA assistant](https://cla-assistant.io/readme/badge/meshtastic/web)](https://cla-assistant.io/meshtastic/web) [![CLA assistant](https://cla-assistant.io/readme/badge/meshtastic/web)](https://cla-assistant.io/meshtastic/web)
[![Fiscal Contributors](https://opencollective.com/meshtastic/tiers/badge.svg?label=Fiscal%20Contributors&color=deeppink)](https://opencollective.com/meshtastic/) [![Fiscal Contributors](https://opencollective.com/meshtastic/tiers/badge.svg?label=Fiscal%20Contributors&color=deeppink)](https://opencollective.com/meshtastic/)
[![Vercel](https://img.shields.io/static/v1?label=Powered%20by&message=Vercel&style=flat&logo=vercel&color=000000)](https://vercel.com?utm_source=meshtastic&utm_campaign=oss) [![Vercel](https://img.shields.io/static/v1?label=Powered%20by&message=Vercel&style=flat&logo=vercel&color=000000)](https://vercel.com?utm_source=meshtastic&utm_campaign=oss)
## Overview ## Overview
Official [Meshtastic](https://meshtastic.org) web interface, that can be hosted This monorepo consolidates the official [Meshtastic](https://meshtastic.org) web
or served from a node interface, the domain-driven JavaScript SDK that drives it, and a set of
runtime-specific transport packages. Everything you need to read state from or
send commands to a Meshtastic device lives here.
**[Hosted version](https://client.meshtastic.org)** > [!NOTE]
> You can find the main Meshtastic documentation at https://meshtastic.org/docs/introduction/.
## Stats ## Packages
![Alt](https://repobeats.axiom.co/api/embed/e5b062db986cb005d83e81724c00cb2b9cce8e4c.svg "Repobeats analytics image") All projects live under `packages/`.
## Progress Web App Support (PWA) | Package | Purpose |
| --- | --- |
| `packages/sdk` | Framework-agnostic TypeScript SDK. Domain-driven feature slices (device, chat, nodes, channels, config, telemetry, position, traceroute, files) built around a `MeshClient` orchestrator with `@preact/signals-core` reactive state. |
| `packages/sdk-react` | React hooks + `MeshProvider` on top of `@meshtastic/sdk`. Wraps signals in `useSyncExternalStore` for concurrent-safe renders. |
| `apps/web` | Reference React web client. Hosted at [client.meshtastic.org](https://client.meshtastic.org). |
| `packages/ui` | Shared Radix + Tailwind component library. |
| `packages/protobufs` | Generated TypeScript stubs from [`meshtastic/protobufs`](https://github.com/meshtastic/protobufs), produced via `buf generate`. Source of truth for every wire-level type. |
| `packages/transport-http` | HTTP transport for devices exposing a network interface. |
| `packages/transport-web-bluetooth` | Web Bluetooth transport for BLE-capable devices (browsers). |
| `packages/transport-web-serial` | Web Serial transport for USB-serial devices (browsers). |
| `packages/transport-node` | TCP transport for Node.js. |
| `packages/transport-node-serial` | Serial transport for Node.js. |
| `packages/transport-deno` | TCP transport for Deno. |
| `packages/transport-mock` | In-memory transport for tests. |
Meshtastic Web Client now includes Progressive Web App (PWA) functionality, All publishable packages ship to both [JSR](https://jsr.io/@meshtastic) and [NPM](https://www.npmjs.com/org/meshtastic).
allowing users to:
- Install the app on desktop and mobile devices ## Architecture
- Access the interface offline
- Receive updates automatically
- Experience faster load times with caching
To install as a PWA: `@meshtastic/sdk` organises its source by feature slice. Each slice follows the
same DDD layout:
- On desktop: Look for the install icon in your browser's address bar ```
- On mobile: Use "Add to Home Screen" option in your browser menu features/<slice>/
domain/ # entities & value objects — pure TypeScript types
PWA functionality works with both the hosted version and self-hosted instances. application/ # use-cases (SendTextUseCase, FavoriteNodeUseCase, …)
infrastructure/ # protobuf ↔ domain mappers, admin-message adapters
## Self-host state/ # signals-backed reactive stores
<Slice>Client.ts # public facade exposing readable signals + command methods
The client can be self hosted using the precompiled container images with an OCI index.ts
compatible runtime such as [Docker](https://www.docker.com/) or
[Podman](https://podman.io/). The base image used is
[Nginx 1.27](https://hub.docker.com/_/nginx)
```bash
# With Docker
docker run -d -p 8080:8080 --restart always --name Meshtastic-Web ghcr.io/meshtastic/web
#With Podman
podman run -d -p 8080:8080 --restart always --name Meshtastic-Web ghcr.io/meshtastic/web
``` ```
## Release Schedule The shared kernel under `packages/sdk/src/core/` owns:
Our release process follows these guidelines: - **`client/`** — `MeshClient`, the thin orchestrator that owns the transport, queue, event bus, and one instance of every slice client.
- **`transport/`** — the `Transport` interface every `transport-*` package implements.
- **`event-bus/`** — typed pub/sub channels populated by the packet codec.
- **`packet-codec/`** — frame parser (0x94 0xC3), `FromRadio` decoder, portnum router.
- **`queue/`**, **`xmodem/`** — packet ack/timeout pipeline and file-transfer protocol.
- **`signals/`** — signal and keyed-collection helpers consumed by every slice.
- **`logging/`** — `tslog` factory used consistently by every class.
- **`identifiers/`**, **`errors/`** — small primitives shared across slices.
- **Versioning:** We use Semantic Versioning (`Major.Minor.Patch`). The protobuf boundary is strict: wire messages enter through the packet codec,
- **Stable Releases:** Published around the beginning of each month (e.g., get mapped into domain entities inside `features/*/infrastructure/*Mapper.ts`,
`v2.3.4`). and signals only ever expose the domain shape.
- **Pre-releases:** A pre-release is typically issued mid-month for testing and
early adoption.
- **Nightly Builds:** An experimental Docker image containing the latest
cutting-edge features and fixes is automatically built nightly from the
`master` branch.
### Nightly Builds ```
Transport ─▶ Packet codec ─▶ EventBus ─▶ Slice infrastructure
```bash │
# With Docker ▼
docker run -d -p 8080:8080 --restart always --name Meshtastic-Web ghcr.io/meshtastic/web:nightly Signals (state) ─▶ sdk-react hooks ─▶ UI
#With Podman ▲
podman run -d -p 8080:8080 --restart always --name Meshtastic-Web ghcr.io/meshtastic/web:nightly │
Slice application (use-cases) ─▶ MeshClient.sendPacket ─▶ Queue ─▶ Transport
``` ```
> [!WARNING] Expected domain errors are returned as `Result<T, E>` via [`better-result`](https://www.npmjs.com/package/better-result); exceptions are reserved for programmer errors and truly exceptional conditions.
>
> - Nightly builds represent the latest development state and may contain
> breaking changes
> - These builds undergo automated testing but may be less stable than tagged
> release versions
> - Not recommended for production environments unless you are actively testing
> new features
> - No guarantee of backward compatibility between nightly builds
#### Version Information ## Getting Started
Each nightly build is tagged with: ### Prerequisites
- The nightly tag for the latest build You need [pnpm](https://pnpm.io/) installed. If you plan to regenerate
- A specific SHA for build reproducibility protobufs, also install the [Buf CLI](https://buf.build/docs/cli/installation/).
### Feedback ### Setup
If you encounter any issues with nightly builds, please report them in our ```bash
git clone https://github.com/meshtastic/web.git
cd web
pnpm install
```
### Run the web client
```bash
pnpm --filter @meshtastic/web dev
```
### Build everything
```bash
pnpm -r build
```
### Run tests
```bash
pnpm -r test
```
### Lint + format
```bash
pnpm check
pnpm check:fix
```
## Developing
### Adding a new feature slice to `@meshtastic/sdk`
1. Create `packages/sdk/src/features/<slice>/` with `domain/`, `application/`, `infrastructure/`, `state/` subdirectories plus an `index.ts` barrel.
2. Implement a signals-backed store in `state/`.
3. Subscribe to the relevant `EventBus` channel(s) inside a `<Slice>Client.ts` class and write mapped domain entities to the store.
4. Wire the new client into `MeshClient` and re-export types from `packages/sdk/mod.ts`.
5. Add vitest coverage: domain invariants, use-cases against `createFakeTransport()`, and round-trip mapper fixtures.
6. If the slice has React callers, add a matching hook under `packages/sdk-react/src/hooks/`.
### Adding a new transport
Implement the `Transport` interface exported from `@meshtastic/sdk/transport`:
```ts
interface Transport {
toDevice: WritableStream<Uint8Array>;
fromDevice: ReadableStream<DeviceOutput>;
disconnect(): Promise<void>;
}
```
The SDK does the framing and decoding — transports only supply raw bytes.
### Testing
Vitest is wired at the repo root and picks up `packages/*` projects. The SDK
ships `@meshtastic/sdk/testing` with `createFakeTransport()` for wiring tests
without real hardware.
## Publishing
Each publishable package has `build:npm` / `publish:npm` / `prepare:jsr` /
`publish:jsr` scripts. See each package's `package.json` for details.
## Repository activity
| Project | Repobeats |
| :------------- | :-------------------------------------------------------------------------------------------------------------------- |
| Meshtastic Web | ![Alt](https://repobeats.axiom.co/api/embed/e5b062db986cb005d83e81724c00cb2b9cce8e4c.svg "Repobeats analytics image") |
## Feedback
If you encounter any issues, please report them in our
[issues tracker](https://github.com/meshtastic/web/issues). Your feedback helps [issues tracker](https://github.com/meshtastic/web/issues). Your feedback helps
improve the stability of future releases improve the stability of future releases.
## Development & Building ## Star history
You'll need to download the package manager used with this repo. You can install <a href="https://star-history.com/#meshtastic/web&Date">
it by visiting [deno.com](https://deno.com/) and following the installation <picture>
instructions listed on the home page. <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=meshtastic/web&type=Date&theme=dark" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=meshtastic/web&type=Date" />
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=meshtastic/web&type=Date" width="100%" />
</picture>
</a>
### Development ## Contributors
Install the dependencies. <a href="https://github.com/meshtastic/web/graphs/contributors">
<img src="https://contrib.rocks/image?repo=meshtastic/web" width="100%"/>
</a>
```bash ## License
deno i
```
Start the development server: GPL-3.0-only. See [LICENSE](LICENSE).
```bash
deno task dev
```
### Building and Packaging
Build the project:
```bash
deno task build
```
GZip the output:
```bash
deno task package
```
### Why Deno?
Meshtastic Web uses Deno as its development platform for several compelling
reasons:
- **Built-in Security**: Deno's security-first approach requires explicit
permissions for file, network, and environment access, reducing vulnerability
risks.
- **TypeScript Support**: Native TypeScript support without additional
configuration, enhancing code quality and developer experience.
- **Modern JavaScript**: First-class support for ESM imports, top-level await,
and other modern JavaScript features.
- **Simplified Tooling**: Built-in formatter, linter, test runner, and bundler
eliminate the need for multiple third-party tools.
- **Reproducible Builds**: Lockfile ensures consistent builds across all
environments.
- **Web Standard APIs**: Uses browser-compatible APIs, making code more portable
between server and client environments.
### Contributing
We welcome contributions! Here’s how the deployment flow works for pull
requests:
- **Preview Deployments:**\
Every pull request automatically generates a preview deployment on Vercel.
This allows you and reviewers to easily preview changes before merging.
- **Staging Environment (`client-test`):**\
Once your PR is merged, your changes will be available on our staging site:
[client-test.meshtastic.org](https://client-test.meshtastic.org/).\
This environment supports rapid feature iteration and testing without
impacting the production site.
- **Production Releases:**\
At regular intervals, stable and fully tested releases are promoted to our
production site: [client.meshtastic.org](https://client.meshtastic.org/).\
This is the primary interface used by the public to connect with their
Meshtastic nodes.
Please review our
[Contribution Guidelines](https://github.com/meshtastic/web/blob/master/CONTRIBUTING.md)
before submitting a pull request. We appreciate your help in making the project
better!
+83
View File
@@ -0,0 +1,83 @@
# Testing strategy
How this monorepo proves correctness, and where coverage currently sits.
## Levels
Tests live in five tiers. Each PR should add coverage at the **lowest level that catches the regression**, and only climb tiers when that's not possible.
| Tier | Scope | Tooling | Where |
| --- | --- | --- | --- |
| 1. **Unit** | Pure functions, value objects, mappers, single classes with mocked deps | `vitest run` (Node env) | `*.test.ts` colocated with source |
| 2. **Slice integration** | Use-case + store + mapper exercised against in-memory deps; assert outbound bytes and signal state | `vitest` + `createFakeTransport()` | `*.test.ts` in slice dirs |
| 3. **Client integration** | `MeshClient` end-to-end with a fake transport feeding canned `FromRadio` packets | `vitest` + `@meshtastic/sdk/testing` | `packages/sdk/tests/integration/` |
| 4. **Storage integration** | Real Drizzle queries against sql.js in-memory; or against `@vitest/browser` for OPFS | `vitest` (Node + browser) | `packages/sdk-storage-sqlocal/{src,tests}` |
| 5. **Hook / DOM** | React hooks render under `<MeshProvider>` / `<MeshRegistryProvider>`, react to signals | `vitest` + `@testing-library/react` + `jsdom` | `packages/sdk-react/tests/` |
| 6. **E2E / simulator** | Whole stack: SDK → transport → simulator/firmware. Catches protocol drift | `@vitest/browser` for OPFS; `meshtasticd` simulator over TCP for protocol | future `tests/e2e/` |
## Per-package coverage gates
| Package | Required floor | Notes |
| --- | --- | --- |
| `packages/sdk/core` | every primitive (signals, EventBus, Queue, packet-codec, identifiers) has a unit test; lifecycle covered by `MeshClient.test.ts` | adopt `c8` thresholds once stable |
| `packages/sdk/features/*` | each slice ships: 1 domain invariant test, 1 use-case test against fake transport, 1 mapper round-trip (where mappers exist) | Integration covered by `tests/integration/fake-transport.test.ts` |
| `packages/sdk-react` | each public hook has a `renderHook` test that asserts initial render + re-render on signal change | uses jsdom; provider wrapper required |
| `packages/sdk-storage-sqlocal` | every repository method tested against sql.js in-memory; **at least one OPFS-real test per repo** runs in browser mode | sql.js validates SQL correctness; OPFS validates VFS / Worker plumbing |
| `packages/transport-*` | minimum: framing round-trip, disconnect cleans up streams, error path emits status | low-level; ship as is |
| `packages/web` | component tests at `34` baseline; new SDK-driven UI components must add a hook-mock test | currently all green |
## Current state (audit)
| Package | Test files | Tests pass | Gaps |
| --- | --- | --- | --- |
| `packages/sdk` | 7 | 25 ✅ | nodes/channels/config/telemetry/position/traceroute/files slices have **no tests**; no `MeshClient` lifecycle test (only fake-transport integration); no schema migration test |
| `packages/sdk-react` | 1 | 2 ✅ | only `useMeshDevice` + a stubbed `useChat` test; missing `useNodes`, `useChannels`, `useConfig`, `useConnection`, `useTraceroute`, `useTelemetry`, `usePosition`, `useFileTransfer`, `useFavoriteNode`, `useIgnoreNode`, `useMeshRegistry`, `useClientById`, `useActiveClient`. No registry-aware re-render coverage. |
| `packages/sdk-storage-sqlocal` | 2 | 8 ✅ | sql.js only — **no real OPFS test**, no Worker boot test, no cross-tab BroadcastChannel test (mocked away), no migration v1→v2 test |
| `packages/web` | 34 | 294 ✅ | no `useConnections` test; new `meshRegistry` + `sdkStorage` modules untested; chat persistence end-to-end not exercised |
| `packages/transport-*` | 1 each (5 of 7) | varies | `transport-deno` + `transport-mock` have no tests; transports likely lack disconnect/error coverage |
| `packages/core` | 0 | n/a | legacy, slated for deletion in Phase C; tolerable |
| `packages/ui` | 0 | n/a | pure presentational; visual regression only |
| `packages/protobufs` | 0 | n/a | generated code; upstream's responsibility |
## Concrete additions queued (priority order)
1. **`packages/sdk` slice tests** — one Use-case + one Mapper test per slice (`nodes`, `channels`, `config`, `telemetry`, `position`, `traceroute`). Pattern: build a stub `MeshClient`, dispatch a synthetic event, assert signal value or outbound bytes.
2. **`packages/sdk-react` hook tests** — for every hook listed above, mount under `<MeshProvider>`, drive a signal change, assert `result.current`. One file, ~15 cases.
3. **`packages/sdk` `ChatClient` persistence test** — wire `InMemoryMessageRepository`, append messages, re-construct `ChatClient`, assert hydration. Validates the lazy-load contract.
4. **`packages/sdk-storage-sqlocal` migration test** — bootstrap empty DB, run `MIGRATIONS[]`, assert `_schema.version`. Then add a fake `version: 2` migration and prove it's applied idempotently.
5. **`packages/sdk-storage-sqlocal` browser mode** — add a second `vitest.browser.config.ts` using `@vitest/browser` (Playwright provider) so we exercise real OPFS + Worker. CI runs both modes.
6. **`packages/sdk-storage-sqlocal` BroadcastChannel test** — instantiate two `MultiTabCoordinator` instances in same process; one broadcasts, the other observes. (Node has no `BroadcastChannel` global; use `worker_threads`'s `BroadcastChannel` polyfill or jsdom env.)
7. **`packages/web` `meshRegistry` + `sdkStorage` lazy-init test** — assert `getStorageDb()` returns the same promise on repeated calls and only opens the DB once.
8. **`packages/sdk-react` registry test** — mount `<MeshRegistryProvider>` with two clients, switch active, confirm a hook re-renders against the new client.
## E2E / simulator (Tier 6) — scope only
Out of immediate scope; documenting for a follow-up PR.
- Run `meshtasticd` (firmware simulator) in CI Docker via `services:` block.
- Spin up `MeshClient` with `TransportHTTP` pointed at the simulator's HTTP endpoint.
- Drive scripted scenarios: configure → send text → expect ack; channel update; node info exchange; traceroute.
- Use `@vitest/browser` so we also exercise the real OPFS persistence path during E2E.
- Run on `main` only (cost). Smoke subset on PR.
Until that lands, `createFakeTransport()` covers the protocol layer at unit/integration speed.
## Conventions
- Test file colocated with source: `Foo.ts` → `Foo.test.ts`.
- Integration tests under `tests/integration/`.
- Browser-mode tests use the suffix `.browser.test.ts` so they can be filtered.
- Protobuf fixtures live in `__fixtures__/*.fixtures.ts` next to mappers; binary data committed as base64, not raw bytes.
- Each test imports concrete classes from the source path (`./Foo.ts`), not the package barrel — fast type-check, zero re-export drift.
- No mocked SDK from inside SDK tests. Use `createFakeTransport()` and real `MeshClient` instances.
## Running
```sh
pnpm -r test # all packages, Node env
pnpm --filter @meshtastic/sdk test
pnpm --filter @meshtastic/sdk-storage-sqlocal test
pnpm --filter meshtastic-web test
# future:
pnpm --filter @meshtastic/sdk-storage-sqlocal test:browser
```
View File
+14
View File
@@ -0,0 +1,14 @@
{
"$schema": "https://raw.githubusercontent.com/oxc-project/oxc/main/npm/oxfmt/configuration_schema.json",
"useTabs": false,
"tabWidth": 2,
"printWidth": 80,
"ignorePatterns": [
"node_modules",
"dist",
"protobufs",
"**/locales/*-*/*.json",
"**/packages/ui/",
"*.md"
]
}
+25
View File
@@ -0,0 +1,25 @@
{
"$schema": "https://raw.githubusercontent.com/oxc-project/oxc/main/npm/oxlint/configuration_schema.json",
"plugins": ["react", "react-perf", "jsx-a11y", "typescript", "import"],
"rules": {
"no-debugger": "error",
"@typescript-eslint/no-explicit-any": "error",
"@typescript-eslint/no-unused-vars": "error"
},
"ignorePatterns": [
"node_modules",
"dist",
"protobufs",
"**/locales/*-*/*.json",
"**/packages/ui/"
],
"overrides": [
{
"files": ["**/*.test.ts", "**/*.test.tsx", "**/__tests__/**/*.{ts,tsx}"],
"rules": {
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/no-non-null-assertion": "off"
}
}
]
}
+150
View File
@@ -0,0 +1,150 @@
# Contributing to Meshtastic Web
Thank you for your interest in contributing to **Meshtastic Web**! 🎉
We welcome all contributions—whether it’s fixing a typo, improving documentation, adding new features, or reporting bugs. This document outlines how to get started and the conventions we follow.
---
## 📋 Code of Conduct
We follow the [Meshtastic Code of Conduct](https://meshtastic.org/docs/legal/conduct/).
Please make sure you are familiar with it before contributing.
---
## 🚀 Getting Started
Before making changes, please take some time to explore the repository and its monorepo structure.
Understanding how the packages are organized will make it much easier to contribute effectively.
[Meshtastic Web](https://github.com/meshtastic/web/)
### Prerequisites
- [Node.js](https://nodejs.org/) (v22 or later)
- [pnpm](https://pnpm.io/) (v10.14.x or later)
- Git
### Installation
Clone the repo and install dependencies:
```bash
git clone https://github.com/meshtastic/web.git meshtastic-web
cd meshtastic-web
pnpm install
```
### Development
Start the development server:
```bash
pnpm --filter @meshtastic/web dev
```
Once running, the site will be available at:
👉 **http://localhost:3000**
---
## 🗂 Repository Structure
Meshtastic Web uses a **monorepo** setup managed with **pnpm workspaces**:
```
/packages
├─ web # React frontend
├─ core # Shared types & logic
├─ transport-* # Transport layer packages
└─ ...other packages
```
---
## ✅ Contribution Workflow
1. **Fork the repo** and create your branch from `main`.
### Branch Naming
- Use [Conventional Commit](https://www.conventionalcommits.org/) style for your branch names:
```
feat/add-project-filter
fix/storage-service
chore/update-ci-cache
```
2. **Make your changes locally** and verify that the app runs as expected at `http://localhost:3000`.
3. **Commit your changes** with a descriptive commit message that follows the [Conventional Commits](https://www.conventionalcommits.org/) style.
4. **Open a Pull Request (PR)** from your fork's branch to the main repository's `main` branch on GitHub:
- Clearly describe the problem and solution.
- Reference related issues (e.g., `Fixes #123`).
- Keep PRs focused on a single feature or fix.
- Complete all fields in the PR template.
- Tag a **Meshtastic Web developer** in the PR for review.
5. **CI/CD**:
- Our GitHub Actions workflows handle builds, linting, and packaging automatically.
- All checks must pass before merge.
---
## 🌍 Internationalization (i18n)
Meshtastic Web supports multiple languages. If your changes introduce **new user-facing strings**:
- Add them to the **`en.json`** file.
- Do **not** hardcode English strings directly in components.
- This ensures they can be translated into other languages.
🔗 See these guides for more details:
- [i18n Developer Guide](https://github.com/meshtastic/web/blob/main/packages/web/CONTRIBUTING_I18N_DEVELOPER_GUIDE.md)
- [Translation Contribution Guide](https://github.com/meshtastic/web/blob/main/packages/web/CONTRIBUTING_TRANSLATIONS.md)
---
## 🧪 Testing
Tests are written with [Vitest](https://vitest.dev/).
Run all tests locally with:
```bash
pnpm --filter @meshtastic/web test
```
Please include tests for new features and bug fixes whenever possible.
---
## 📝 Commit Messages
We use **Conventional Commits**:
- `feat:` – a new feature
- `fix:` – a bug fix
- `docs:` – documentation changes
- `chore:` – maintenance, dependencies, build scripts
- `refactor:` – code restructuring without feature changes
- `test:` – adding or updating tests
- `ci:` – CI/CD changes
Example:
```
feat: add toast notification system
fix: correct caching issue in storage service
```
---
## 💡 Tips for Contributors
- Keep PRs **small, focused, and atomic**.
- Discuss larger changes with the team on [Discord](https://discord.gg/meshtastic) before starting work.
- If unsure, open a draft PR for early feedback.
---
## 🙌 Community
Contributors are the heart of Meshtastic ❤️.
Join the conversation:
- [Discord](https://discord.gg/meshtastic)
- [GitHub Discussions](https://github.com/meshtastic/web/discussions)
---
## 📜 License
By contributing, you agree that your contributions will be licensed under the [GPL-3.0-only License](../../LICENSE).
@@ -0,0 +1,111 @@
# i18n Developer Guide
When developing new components, all user-facing text must be added as an i18n
key and rendered using our translation functions. This ensures your UI can be
translated into multiple languages.
## Adding New i18n Keys
### Search Before Creating
Before adding a new key, please perform a quick search to see if one that fits
your needs already exists. Many common labels like "Save," "Cancel," "Name,"
"Description," "Loading...," or "Error" are likely already present, especially
in the common.json namespace. Reusing existing keys prevents duplication and
ensures consistency across the application. Using your code editor's search
function across the /i18n/locales/en/ directory is an effective way to do this.
### Key Naming and Structure Rules
To maintain consistency and ease of use, please adhere to the following rules
when creating new keys in the JSON files.
- **Keys are camelCase:** `exampleKey`, `anotherExampleKey`.
- **Avoid Deep Nesting:** One or two levels of nesting are acceptable for
grouping related keys (e.g., all labels for a specific menu). However, nesting
deeper than two levels should be avoided to maintain readability and ease of
use.
- **Good (1 level):**
```json
"buttons": {
"save": "Save",
"cancel": "Cancel"
}
```
- **Acceptable (2 levels):**
```json
"userMenu": {
"items": {
"profile": "Profile",
"settings": "Settings"
}
}
```
- **Avoid (3+ levels):**
```json
"userMenu": {
"items": {
"actions": {
"viewProfile": "View Profile"
}
}
}
```
- **Organize for Retrieval, Not UI Layout:** Keys should be named logically for
easy retrieval, not to mirror the layout of your component.
### Namespace Rules
We use namespaces to organize keys. All source keys are added to the English
(`en`) files located at `/packages/web/public/i18n/locales/en/`. Place your new keys in the
appropriate file based on these rules:
- `common.json`:
- All button labels (`save`, `cancel`, `submit`, etc.).
- Any text that is repeated and used throughout the application (e.g.,
"Loading...", "Error").
- `ui.json`:
- Labels and text specific to a distinct UI element or view that isn't a
dialog or a config page.
- `dialog.json`:
- All text specific to modal dialogs (titles, body text, prompts).
- `messages.json`:
- Text specifically related to the messaging interface.
- `deviceConfig.json` & `moduleConfig.json`:
- Labels and descriptions for the settings on the Device and Module
configuration pages.
## Using i18n Keys in Components
We use the `useTranslation` hook from `react-i18next` to access the translation
function, `t`.
### Default Namespaces
Our i18next configuration has fallback namespaces configured which includes
`common`, `ui`, and `dialog`. This means you **do not** need to explicitly
specify these namespaces when calling the hook. The system will automatically
check these files for your key.
For any keys in `common.json`, `ui.json`, or `dialog.json`, you can instantiate
the hook simply:
```typescript
import { useTranslation } from "react-i18next";
// In your component
const { t } = useTranslation(["messages"]);
// Usage
return <p>{t("someMessageLabel")}</p>;
```
You can also specify the namespace on a per-call basis using the options object.
This is useful if a component primarily uses a default namespace but needs a
single key from another.
```typescript
const { t } = useTranslation();
return <p>{t("someMessageLabel", { ns: "messages" })}</p>;
```
+31
View File
@@ -0,0 +1,31 @@
# Contributing Translations
Thank you for your interest in making the Meshtastic Web Client accessible to a
global audience! Your translation efforts are greatly appreciated.
## Our Translation Platform: Crowdin
We manage all our translations through a platform called
[Crowdin](https://crowdin.com/). This allows for a collaborative and streamlined
translation process. All translation work should be done on our Crowdin project,
not directly in the code repository via Pull Requests.
### How to Get Started
1. **Create a Crowdin Account:** If you don't already have one, sign up for a
free account on Crowdin.
2. **Join Our Project:** Please ask for a link to our specific Crowdin project
on the Meshtastic Discord.
3. **Request Translator Role:** Once you have an account, join the Meshtastic
Discord and notify an admin in the `#web` channel. They will grant you the
necessary permissions to start translating.
4. **Start Translating:** Once you have your role, you can begin translating the
source labels into your native language directly on the Crowdin platform.
### Language Activation
A new language will only be added to the web client and appear in the language
picker once its translation is 100% complete on Crowdin. The repository
maintainers will handle this process once the milestone is reached.
Thank you for helping us bring Meshtastic to more users around the world!
+156
View File
@@ -0,0 +1,156 @@
# Meshtastic Web
<!--Project specific badges here-->
[![CI](https://img.shields.io/github/actions/workflow/status/meshtastic/web/ci.yml?branch=main&label=actions&logo=github&color=yellow)](https://github.com/meshtastic/web/actions/workflows/ci.yml)
[![CLA assistant](https://cla-assistant.io/readme/badge/meshtastic/web)](https://cla-assistant.io/meshtastic/web)
[![Fiscal Contributors](https://opencollective.com/meshtastic/tiers/badge.svg?label=Fiscal%20Contributors&color=deeppink)](https://opencollective.com/meshtastic/)
[![Vercel](https://img.shields.io/static/v1?label=Powered%20by&message=Vercel&style=flat&logo=vercel&color=000000)](https://vercel.com?utm_source=meshtastic&utm_campaign=oss)
## Overview
Official [Meshtastic](https://meshtastic.org) web interface, that can be hosted
or served from a node
**[Hosted version](https://client.meshtastic.org)**
## Stats
![Alt](https://repobeats.axiom.co/api/embed/e5b062db986cb005d83e81724c00cb2b9cce8e4c.svg "Repobeats analytics image")
## Self-host
The client can be self hosted using the precompiled container images with an OCI
compatible runtime such as [Docker](https://www.docker.com/) or
[Podman](https://podman.io/). The base image used is
[Nginx 1.27](https://hub.docker.com/_/nginx)
```bash
# With Docker
docker run -d -p 8080:8080 --restart always --name Meshtastic-Web ghcr.io/meshtastic/web
#With Podman
podman run -d -p 8080:8080 --restart always --name Meshtastic-Web ghcr.io/meshtastic/web
```
## Release Schedule
Our release process follows these guidelines:
- **Versioning:** We use Semantic Versioning (`Major.Minor.Patch`).
- **Stable Releases:** Published around the beginning of each month (e.g.,
`v2.6.1`).
- **Pre-releases:** A pre-release is typically issued mid-month for testing and
early adoption.
- **Nightly Builds:** An experimental Docker image containing the latest
cutting-edge features and fixes is automatically built nightly from the `main`
branch.
### Nightly Builds
```bash
# With Docker
docker run -d -p 8080:8080 --restart always --name Meshtastic-Web ghcr.io/meshtastic/web:nightly
#With Podman
podman run -d -p 8080:8080 --restart always --name Meshtastic-Web ghcr.io/meshtastic/web:nightly
```
> [!WARNING]
>
> - Nightly builds represent the latest development state and may contain
> breaking changes
> - These builds undergo automated testing but may be less stable than tagged
> release versions
> - Not recommended for production environments unless you are actively testing
> new features
> - No guarantee of backward compatibility between nightly builds
#### Version Information
Each nightly build is tagged with:
- The nightly tag for the latest build
- A specific SHA for build reproducibility
### Feedback
If you encounter any issues with nightly builds, please report them in our
[issues tracker](https://github.com/meshtastic/web/issues). Your feedback helps
improve the stability of future releases
## Development & Building
You'll need to download the package manager used with this repo. You can install
it by visiting [pnpm.io](https://pnpm.io/) and following the installation
instructions listed on the home page.
### Development
Install the dependencies.
```bash
cd packages/web &&
pnpm install
```
Start the development server:
```bash
pnpm run dev
```
### Building and Packaging
Build the project:
```bash
pnpm run build
```
GZip the output:
```bash
pnpm run package
```
### Why pnpm?
Meshtastic Web uses pnpm as its package manager for several compelling
reasons:
- **Efficient Storage**: pnpm uses content-addressable storage, avoiding duplication
of packages across projects and saving significant disk space.
- **Fast Performance**: Faster package installation compared to other package
managers through symlinks and efficient dependency resolution.
- **Strict Dependency Management**: Prevents access to unlisted dependencies,
ensuring better project reliability and security.
- **Workspace Support**: Excellent monorepo support with workspaces for managing
multiple packages efficiently.
- **Reproducible Builds**: Lockfile ensures consistent builds across all
environments.
### Contributing
We welcome contributions! Here’s how the deployment flow works for pull
requests:
- **Preview Deployments:**\
Every pull request automatically generates a preview deployment on Vercel.
This allows you and reviewers to easily preview changes before merging.
- **Staging Environment (`client-test`):**\
Once your PR is merged, your changes will be available on our staging site:
[client-test.meshtastic.org](https://client-test.meshtastic.org/).\
This environment supports rapid feature iteration and testing without
impacting the production site.
- **Production Releases:**\
At regular intervals, stable and fully tested releases are promoted to our
production site: [client.meshtastic.org](https://client.meshtastic.org/).\
This is the primary interface used by the public to connect with their
Meshtastic nodes.
Please review our
[Contribution Guidelines](https://github.com/meshtastic/web/blob/main/packages/web/CONTRIBUTING.md)
before submitting a pull request. We appreciate your help in making the project
better!
+10
View File
@@ -0,0 +1,10 @@
project_id_env: CROWDIN_PROJECT_ID
api_token_env: CROWDIN_PERSONAL_TOKEN
base_path: "."
base_url: "https://meshtastic.crowdin.com/api/v2"
preserve_hierarchy: true
files:
- source: "/public/i18n/locales/en/*.json"
translation: "/public/i18n/locales/%locale%/%original_file_name%"
+8 -12
View File
@@ -1,25 +1,21 @@
<!DOCTYPE html> <!doctype html>
<html lang="en" data-theme="system"> <html lang="en" data-theme="system">
<head> <head>
<!-- CookieYes banner -->
<%- cookieYesScript %>
<!-- End of CookieYes banner -->
<meta charset="utf-8" /> <meta charset="utf-8" />
<link rel="icon" type="image/svg+xml" href="/icon.svg" /> <link rel="icon" type="image/svg+xml" href="/icon.svg" />
<link rel="icon" href="/favicon.ico" /> <link rel="icon" href="/favicon.ico" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180" /> <link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180" />
<link rel="manifest" href="site.webmanifest" /> <link rel="manifest" href="site.webmanifest" />
<link rel="mask-icon" href="Logo_Black.svg" color="#67ea94" /> <link rel="mask-icon" href="logo_black.svg" color="#67ea94" />
<link rel="stylesheet" href="https://rsms.me/inter/inter.css" /> <link rel="stylesheet" href="src/index.css" crossorigin="anonymous" />
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@xz/fonts@1/serve/cascadia-code.min.css"
/>
<meta name="theme-color" content="#67ea94" /> <meta name="theme-color" content="#67ea94" />
<meta <meta name="viewport" content="width=device-width, initial-scale=1" />
name="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=0"
/>
<meta name="description" content="Meshtastic Web Client" /> <meta name="description" content="Meshtastic Web Client" />
<title>Meshtastic Web</title> <title><%- title %></title>
</head> </head>
<body> <body>
<div id="root"></div> <div id="root"></div>
+15
View File
@@ -0,0 +1,15 @@
FROM nginx:1.29.1-alpine-slim
RUN rm -r /usr/share/nginx/html \
&& mkdir -p /usr/share/nginx/html \
&& mkdir -p /etc/nginx/conf.d
WORKDIR /usr/share/nginx/html
ADD ./apps/web/dist .
COPY ./apps/web/infra/default.conf /etc/nginx/conf.d/default.conf
EXPOSE 8080
CMD ["nginx", "-g", "daemon off;"]
+51
View File
@@ -0,0 +1,51 @@
server {
listen 8080;
server_name localhost;
root /usr/share/nginx/html;
index index.html;
location ~* \.(?:js|jsx|mjs|ts|tsx|css|png|jpg|jpeg|gif|ico|webp|avif|svg|ttf|otf|woff|woff2|map)$ {
access_log off;
etag on;
expires 3M;
add_header Cache-Control "public, immutable";
try_files $uri =404;
}
location = /index.html {
etag on;
add_header Cache-Control "no-cache";
}
location / {
try_files $uri $uri/ /index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html { internal; }
location ~ /\.ht { deny all; }
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types
text/plain
text/css
text/xml
text/javascript
application/javascript
application/x-javascript
application/json
application/xml
application/xml+rss
font/ttf
font/otf
image/svg+xml;
}
+125
View File
@@ -0,0 +1,125 @@
{
"name": "meshtastic-web",
"version": "2.6.6-0",
"description": "Meshtastic web client",
"homepage": "https://meshtastic.org",
"bugs": {
"url": "https://github.com/meshtastic/web/issues"
},
"license": "GPL-3.0-only",
"repository": {
"type": "git",
"url": "git+https://github.com/meshtastic/web.git"
},
"type": "module",
"scripts": {
"preinstall": "npx only-allow pnpm",
"setup:certs": "mkcert localhost 127.0.0.1 ::1",
"build": "vite build",
"build:analyze": "BUNDLE_ANALYZE=true pnpm run build",
"lint": "oxlint",
"lint:fix": "oxlint --fix",
"format": "oxfmt --check .",
"format:fix": "oxfmt .",
"check": "pnpm lint && pnpm format",
"check:fix": "pnpm lint:fix && pnpm format:fix",
"dev": "vite",
"dev:https": "USE_HTTPS=true vite",
"test": "vitest",
"typecheck": "tsc -p tsconfig.json --noEmit",
"preview": "vite preview",
"docker:build": "docker build -t meshtastic-web:latest -f ./infra/Containerfile .",
"package": "gzipper c -i html,js,css,png,ico,svg,json,webmanifest,txt dist dist/output && tar -cvf dist/build.tar -C ./dist/output/ ."
},
"dependencies": {
"@hookform/resolvers": "^5.5.7",
"@meshtastic/sdk": "workspace:*",
"@meshtastic/sdk-react": "workspace:*",
"@meshtastic/sdk-storage-sqlocal": "workspace:*",
"@meshtastic/transport-http": "workspace:*",
"@meshtastic/transport-web-bluetooth": "workspace:*",
"@meshtastic/transport-web-serial": "workspace:*",
"@noble/curves": "^2.2.0",
"@preact/signals-core": "^1.14.4",
"@radix-ui/react-accordion": "^1.2.20",
"@radix-ui/react-alert-dialog": "^1.1.23",
"@radix-ui/react-checkbox": "^1.3.11",
"@radix-ui/react-dialog": "^1.1.23",
"@radix-ui/react-dropdown-menu": "^2.1.24",
"@radix-ui/react-label": "^2.1.15",
"@radix-ui/react-menubar": "^1.1.24",
"@radix-ui/react-popover": "^1.1.23",
"@radix-ui/react-scroll-area": "^1.2.18",
"@radix-ui/react-select": "^2.3.7",
"@radix-ui/react-separator": "^1.1.15",
"@radix-ui/react-slider": "^1.4.7",
"@radix-ui/react-switch": "^1.3.7",
"@radix-ui/react-tabs": "^1.1.21",
"@radix-ui/react-toast": "^1.2.23",
"@radix-ui/react-toggle-group": "^1.1.19",
"@radix-ui/react-tooltip": "^1.2.16",
"@radix-ui/react-visually-hidden": "^1.2.11",
"@tailwindcss/vite": "^4.3.3",
"@tanstack/react-router": "^1.170.18",
"@tanstack/react-router-devtools": "^1.167.0",
"@tanstack/router-cli": "^1.167.21",
"@tanstack/router-devtools": "^1.167.0",
"@turf/turf": "^7.3.5",
"@types/node": "^26.1.2",
"@types/web-bluetooth": "^0.0.21",
"base64-js": "^1.5.1",
"better-result": "^2.10.0",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"cmdk": "^1.1.1",
"crypto-random-string": "^6.0.0",
"i18next": "^26.3.6",
"i18next-browser-languagedetector": "^8.2.0",
"i18next-http-backend": "^4.0.1",
"idb-keyval": "^6.3.0",
"immer": "^11.1.15",
"js-cookie": "^3.0.8",
"lucide-react": "^1.28.0",
"maplibre-gl": "6.3.0",
"react": "^19.2.8",
"react-dom": "^19.2.8",
"react-error-boundary": "^6.1.2",
"react-hook-form": "^7.82.0",
"react-i18next": "^17.0.11",
"react-map-gl": "8.1.2",
"react-qrcode-logo": "^4.1.0",
"rfc4648": "^1.5.4",
"vite": "^8.1.5",
"vite-plugin-html": "^3.2.2",
"vite-plugin-pwa": "^1.3.0",
"zod": "^4.1.12",
"zustand": "5.0.14"
},
"devDependencies": {
"@tanstack/router-plugin": "^1.168.22",
"@testing-library/jest-dom": "^7.0.0",
"@testing-library/react": "^16.3.0",
"@testing-library/user-event": "^14.6.4",
"@types/chrome": "^0.2.2",
"@types/geojson": "^7946.0.16",
"@types/js-cookie": "^3.0.6",
"@types/react": "^19.2.17",
"@types/react-dom": "^19.2.3",
"@types/serviceworker": "^0.0.200",
"@types/w3c-web-serial": "^1.0.8",
"@vitejs/plugin-basic-ssl": "^2.3.0",
"@vitejs/plugin-react": "^6.0.4",
"autoprefixer": "^10.5.4",
"gzipper": "^8.3.0",
"happy-dom": "^20.11.1",
"oxfmt": "^0.63.0",
"oxlint": "^1.75.0",
"tailwind-merge": "^3.6.0",
"tailwindcss": "^4.3.3",
"tailwindcss-animate": "^1.0.7",
"tar": "^7.5.22",
"testing-library": "^0.0.2",
"typescript": "^7.0.2",
"vitest": "^4.1.10"
}
}

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

+64
View File
@@ -0,0 +1,64 @@
<svg
xmlns="http://www.w3.org/2000/svg"
id="Layer_1"
data-name="Layer 1"
viewBox="0 0 1871.69 2607.94"
>
<defs><style>
.cls-1, .cls-4 {
fill: #2c2d3c;
stroke-width: 0;
}
.cls-4 {
fill: #fff;
}
</style></defs><path
id="Body_background"
fill="#67ea94"
stroke-width="0"
d="M1349.07 573.19h-855.5c-11.05 0-20.01 8.96-20.01 20.01v1219.19c0 10.12 8.21 18.33 18.33 18.33h854.27c8.7 0 15.75-7.05 15.75-15.75V586.04c0-7.1-5.75-12.85-12.85-12.85Zm-220.55 569.8h-411V787h411v355.99Z"
data-name="Body background"
/><path
id="Body"
d="M1166.62 5.54c-21.2 13.2-31.7 24.3-34.1 36-2.2 10.6-1.8 11.4 13.6 26.9 7.7 7.6 15.3 15.7 17.1 18l3.2 4.1-13.7 5.8c-26.6 11.4-109.5 54-125.2 64.4-4.6 3-5.5 4.1-5.5 6.5 0 3.5 2.7 5.6 5.1 4.1 1.3-.8 2.9-.5 6.4 1.2 9.4 4.5 34.3 10.5 59 14.3 6.9 1.1 27.6 3.3 46 5 49.1 4.5 71 8 71 11.5 0 2.2-21.1 23.5-37.5 38-8.2 7.2-24.4 20.9-36 30.5-29 24-42.2 35.9-62 56.1-27.2 27.7-54.4 60.8-60.9 74.1-2.5 5-2.7 6.1-1.7 9.1.7 1.9 8.9 12.6 18.4 23.9 9.5 11.2 24.2 29.2 32.8 39.9 30.8 38.2 48.3 56.9 75.2 80.4l13.7 12-118.2.6c-65.1.3-203.8.7-308.4.8-182.2.3-221.1.8-237.2 3.1-11.6 1.6-16.2 4.8-18.1 12.7-.9 3.3-1.3 130.7-1.6 479.6-.3 261.4-.7 530.3-.9 597.7-.5 142.7-.1 152.6 6.6 163.8 2.6 4.2 6.9 6.4 13.7 6.8 3.1.2 55 .6 115.4 1 99.7.6 109.7.8 109.7 2.3.2 11.7-9.3 741.7-9.6 742-.2.3-75.5-1.9-167.2-4.8-158.1-4.9-167.1-5.1-171-3.5-11.6 4.6-12.2 20.8-1 26.3 4.1 1.9 10.2 2.2 165.3 7.1 88.6 2.8 168.2 5.1 177 5.1h16l4.7-5.3c2.6-2.9 5.2-6.2 5.7-7.3.7-1.5 10.4-722.4 10.1-757.4v-4.4l159.2.7c87.6.4 159.3.8 159.4.9 0 .1 2.7 169.2 5.9 375.7l5.7 375.5 3 6c1.6 3.3 4.2 7.6 5.8 9.5l2.9 3.5 167.8-.3c158.5-.4 168-.5 171.9-2.2 11.2-4.9 12.1-19.9 1.5-25.8l-3.9-2.2h-318.7l-.3-7.7c-.3-10.8-11.2-710.5-11.2-722.6v-9.7h121.8c85.3.1 123.8-.2 128.7-1 12.4-2 18.1-6.1 21.9-15.8 1.5-4 1.6-46.7 1.6-608.5 0-332.3-.3-610.5-.6-618.2-.7-15.7-1.6-20-4.7-21.8-1.7-.9-24.6-1.3-101.2-1.5l-99-.2-3-3.4c-1.6-1.9-9.1-8.8-16.5-15.4-24.3-21.5-43.4-42.2-71.5-77.2-8.2-10.2-21.9-26.8-30.5-37-8.5-10.2-16.8-20-18.3-21.9-3.4-4.1-3.2-5.1 3.8-15.6 11.1-16.9 35.8-45.8 59-69 16.8-16.9 30.6-29.2 57-51 36-29.7 54.9-46.8 67.7-60.9 8.5-9.4 8.9-10.1 8.6-14-.3-3.8-.7-4.3-5-6.4-8-4-29.7-7.2-76.3-11.2-36.5-3.1-62.7-7.4-84.3-13.6-8.9-2.6-17.8-6.1-17.1-6.8 1.4-1.3 31.8-17.6 56.9-30.4 31.9-16.3 56.3-27.9 73.3-34.8l10.7-4.5 6.3 5.2c11.6 9.7 23.7 13.6 38.1 12.1 8.3-.8 10-2.6 11.7-11.7 2.1-11.2-.9-22.9-12-47.4-9.8-21.7-19.8-36.9-31.4-47.9-7.3-6.8-8.8-6.8-20.6.5Zm190.1 570.1c1.1 1.1 1.3 114 1.6 619.5l.2 618.3-2.2 4.4c-3.2 6.3-8.1 8.7-19.8 10-9.2.9-48.7.8-618.5-.9-254.3-.8-236.4-.3-239.4-6.6-3.2-6.6-4.2-16-4.7-44-.2-15.4 0-283.4.4-595.5.5-312.1.5-569.2 0-571.3-.9-4.2.5-18.4 2.5-24.5 1-3.2 1.9-3.9 6.3-5.4 10.9-3.6 32.3-3.9 396.9-4.7 448.7-1 475-1 476.7.7Z"
class="cls-1"
/><path d="M717.52 787h411v355.99h-411z" class="cls-4" /><path
id="Dot"
fill="#454656"
stroke="#2c2d3c"
stroke-miterlimit="10"
stroke-width="7"
d="M1246.61 622.56c-10.79 3.78-18.53 10.79-23.69 21.39-2.77 5.62-2.95 6.45-2.95 16.59s.18 10.97 2.95 16.87c7.56 15.86 22.03 24.34 40.29 23.51 7.38-.28 9.31-.74 15.58-3.69 8.67-4.15 15.4-10.6 18.99-18.25 9.96-21.02 1.94-43.79-19.18-54.21-6.55-3.23-7.47-3.41-17.06-3.69-8.02-.18-11.25.18-14.94 1.48Z"
/><path
id="Eyes"
d="M651.62 705.94c-8 1.6-10.3 5.2-12 19.4-1.4 12-1.8 452.5-.4 459.2 1.4 6.4 2.7 8.9 5.7 10.8 2.1 1.4 31.7 1.6 275.1 1.5 150 0 275.3-.3 278.4-.6 6.8-.7 9.6-1.9 10.7-4.8.5-1.1.7-106.1.4-235.6-.6-263.8.3-239.2-8.5-243.1-5.2-2.3-17.1-5-23-5.1-8-.3-489.4-2.8-505.5-2.7-9.1.1-18.5.5-20.9 1Zm186.5 82c6.5 1.2 8.4 2.3 8.4 4.9s-2.3 3.1-11.3 1.8c-12.3-1.6-35.6-.4-50.4 2.7-14.5 3-33.7 9.1-43.7 13.9-7.3 3.5-16.6 10-16.6 11.6 0 .5 1.7 1 3.8 1.2 3.2.3 3.7.6 3.7 2.8s-.4 2.5-5.8 2.8c-7 .4-8.7-.8-8.7-5.6 0-10.9 30.8-26.7 65.5-33.7 6.6-1.3 13.6-2.6 15.5-2.8 7.9-.9 34-.6 39.6.4Zm224.9 3.3c35.7 7.5 65.5 22.9 65.5 33.8 0 4.8-1.7 6-8.7 5.6-5.4-.3-5.8-.5-5.8-2.8s.5-2.5 3.8-2.8c2-.2 3.7-.7 3.7-1.2 0-1.6-9.3-8.1-16.6-11.6-10-4.8-29.2-10.9-43.7-13.9-14.8-3.1-38.1-4.3-50.4-2.7-9 1.3-11.3.9-11.3-1.8 0-4.7 7.5-6 32-5.5 16.1.3 21.6.8 31.5 2.9Zm-238.5 58.4c4.6 2.3 5.9 3.6 8.4 8.4 3.2 6.3 3.7 10.2 5.6 42.3.6 9.9 1.5 26.3 2.1 36.5 1.2 20.5.5 96.3-1.1 122.6-3.3 53.9-5 74.5-6.1 76.6-.5 1-1.6 1.8-2.5 1.8-.8 0-4.1.9-7.3 2-17.1 5.7-43.2-.5-50.3-12-6-9.7-7.6-27-8.8-97-.5-27.2-1.4-56.5-2.2-65-.7-8.5-1.3-29-1.3-45.5 0-40.5 1.5-46.7 14.4-59.6 5.3-5.2 8.2-7.2 14.6-9.9 10.4-4.3 13.6-5 22-4.4 4.9.3 8.6 1.3 12.5 3.2Zm230.7 1.9c7.3 3 10 4.8 15.4 10.2 12.9 12.9 14.4 19.1 14.4 59.6 0 16.5-.6 37-1.3 45.5-.8 8.5-1.7 37.8-2.2 65-1.2 70-2.8 87.3-8.8 97-7.1 11.5-33.2 17.7-50.3 12-3.2-1.1-6.5-2-7.3-2-.9 0-2-.8-2.5-1.8-1.1-2.1-2.8-22.7-6.1-76.6-1.6-26.3-2.3-102.1-1.1-122.6 4.3-73.4 4.1-71.4 7.5-78.5 6.2-12.6 23.2-15.8 42.3-7.8Z"
class="cls-1"
/><path
id="Meshtastic_M"
fill="#2c2d3c"
fill-rule="evenodd"
stroke-width="0"
d="m1034.49 1359.63-215.84 316.53-45.53-31.04 238.56-349.85c5.12-7.52 13.64-12.02 22.74-12.03 9.1 0 17.62 4.48 22.76 11.99l239.11 349.3-45.47 31.13-216.33-316.02Zm-452.9 316.2 252.13-369.74-45.53-31.05-252.13 369.73 45.53 31.05Z"
data-name="Meshtastic M"
/><path
id="Left_hand_background"
d="M407.1 1220.22v-6.7h-23.16v-8.98c0-11.12-1.6-21.87-4.56-32.04-3.4-45.86-33.88-84.17-75.5-99.01v-2.21c0-10.27-5.04-19.37-12.77-24.96v-2.05c0-10.55-5.65-19.77-14.08-24.82v-5.24c0-6.87-2.64-13.12-6.95-17.81l-39.54-206.2c-1.2-6.26-4.31-11.66-8.6-15.74-.62-15.68-13.52-28.2-29.35-28.2-15.68 0-28.49 12.29-29.33 27.76-5.01 5.27-8.1 12.39-8.1 20.24v3.47c-5.03 6.13-8.05 13.97-8.05 22.52v146.27c0 8.02 2.66 15.43 7.15 21.38h-10.15c-6.08-10.25-17.26-17.12-30.04-17.12h-10.13c-13.97 0-25.55 10.26-27.61 23.65-16.09 8.06-28.16 22.94-32.44 40.85-9.36 8.59-16.53 19.51-20.63 31.83-11.66 13.48-18.74 31.05-18.74 50.28v32.99c0 18.66 10.95 34.76 26.77 42.23 6.87 11.27 18.91 19.02 32.83 19.97 8.64 8.63 20.58 13.97 33.76 13.97h.65c.06 18.39 10.27 34.39 25.32 42.7v2.98l-31.54 15.79c-3.23 1.62-4.54 5.54-2.92 8.77l27.13 54.21c2.71 5.41 8.24 8.47 13.91 8.31 7.05 12.52 19.2 21.77 33.64 24.94 4.35 8.18 12.87 13.82 22.79 14.02l45.97.91c12.54.25 23.88-5.09 31.68-13.72h2.9c19.87 0 38.76-4.16 55.88-11.64 57.39-6.54 101.98-55.26 101.98-114.4v-12.05c0-12.25-7.5-22.75-18.16-27.16Z"
class="cls-4"
data-name="Left hand background"
/><path
id="Left_Hand"
d="M180.02 744.24c-2.7 1.3-7.1 4.6-9.7 7.3-9.1 9.9-19.7 35.8-25.5 63l-2.8 12.8.1 49.5c0 52.1 1.1 75.2 4.5 94.8 1 6.3 1.9 11.9 1.9 12.4 0 .6-3.7-2.5-8.3-6.9-11.1-10.6-15.7-12.8-26.7-12.7-9.8.1-14.6 1.8-24.4 8.8-13 9.3-34.8 35.8-54.7 66.6-19 29.4-26.9 47.1-32 71.5-3.4 16.1-3.2 36.1.5 50 3.2 12.1 8.1 22.9 13.1 28.3 2 2.3 7.1 6.3 11.3 9 10.8 6.9 43 22.9 53.6 26.6l8.8 3.1 7.2 12.8c9 16.1 14.1 22.7 21.1 27.4l5.6 3.7-4.3 1.6c-26.9 10.4-28.9 11.3-30.8 14-1.1 1.6-2 3.7-2 4.7 0 2.4 13.9 34.6 18.7 43.3 7.2 13.2 15.8 23.2 29.7 34.7 16.4 13.7 26.1 20.2 39 26.4 13.9 6.6 25.5 9.3 36.6 8.4 12.4-1 22.4-3.1 38.5-8.1 7.9-2.4 19.1-5.5 24.9-6.9 5.8-1.4 14.7-3.8 19.9-5.5 5.1-1.6 18-5.2 28.5-8 30.2-7.9 59.5-19.7 70.7-28.7 6.4-5.1 16.6-19.3 22.2-31 2.7-5.6 6-15.4 8.6-25 4.1-15.4 4.2-16.2 4.2-31.8 0-17.1-1.1-23.6-5.1-31.6-5.5-11-13.1-16.3-23.4-16.4-3.6 0-8 .3-9.8.7-3.1.7-3.2.7-2.5-2 .5-1.5.8-7.7.7-13.7 0-9.7-.4-12.4-3.8-23.5-11.8-39.3-19.9-57.4-34.4-76.7-5.3-7.1-7.6-8.8-10.3-7.8-.8.3-2.6-.3-4-1.2-17.5-11.7-23-17.7-35.4-38.4-22.6-38.2-34.7-77-44.4-143.4-1.7-11.6-4.2-28.7-5.6-38-1.4-9.4-3.2-21.6-4-27.2-1.5-10.9-3-17.4-10.1-43.3-4.9-17.7-6.8-22.3-14.2-33.4-12.9-19.5-16.9-22.6-29.3-22.6-5.7 0-8.6.6-12.4 2.4Zm20.1 5.5c4.4 2 8.2 6.5 16.6 19.7 6.8 10.5 7.4 12.1 11.7 27.1 7 24.4 10.2 38.5 12.1 52.8 1 7.7 2.5 18 3.4 23 .8 4.9 1.8 11.7 2.1 15 1.1 10.6 7.4 49 10.1 61.7 6.9 33.1 15.3 59.9 24.9 79.7 6.6 13.4 16.5 31.1 19.3 34.3 1.9 2.2 1.8 2.2-4.6-.2-7.7-3-21-2.8-27.7.4-9.8 4.6-18.9 16.8-23.6 31.6-3.8 12.3-4.7 20.2-3.7 32.3 1 12.7 3 21.2 7.2 30.2 7.3 15.7 16.1 25.9 30.2 35.2 22.4 14.5 47.8 22.4 82.1 25.5l13.7 1.2-4.3 1.8c-2.3 1-9.9 2.9-16.9 4.4-7 1.5-20.3 5.3-29.5 8.5-29.2 10.1-50.1 14.5-99.7 20.9-28.9 3.7-62.9 9.1-78.5 12.4-8.3 1.7-11.4 1.2-19.9-3.3-8.1-4.3-16.2-14.3-23.5-28.9l-3.1-6.2h8.2c4.6 0 12.8-.7 18.2-1.5 5.5-.8 11.6-1.5 13.7-1.5 6.1 0 18.1-4.3 26.1-9.4 4.2-2.7 13.4-10.5 21.5-18.4 15.9-15.4 18.4-19.4 23.9-38.2 3.9-13.5 3.8-22.5-.3-35-1.7-5.2-4.8-15.1-6.8-22-11.3-38.1-20.2-61.5-30.5-80.3-3.7-6.8-7-13.5-7.3-14.9-.4-1.4-2.2-5.1-4.1-8.2-8.9-14.9-12.5-50.6-12.9-128.4-.1-34.8.1-38.6 2-49.2 5.5-28.9 16.4-57.2 26-66.7 6.7-6.7 16.2-8.9 23.9-5.4Zm-75.9 223.2c2.5 1.2 9.2 6.6 15.1 12 9 8.4 11.4 11.3 15.2 18.4 2.5 4.6 6.1 11.2 8.1 14.7 7.3 12.8 9.2 16.5 13.5 26.9 8.3 20.2 30.1 88.8 29 91.4-.7 1.9-3.2 1.9-13.9 0-19.4-3.4-34.8-11.1-53.2-26.5-22.6-19.1-38.4-35.1-53.4-54.5-8.7-11.1-23.7-33.2-25-36.7-1.6-4.3 23.2-33.2 35.5-41.3 10.2-6.8 20.9-8.4 29.1-4.4Zm-59.7 65.4c18.6 28 33.5 45.1 59.5 68.3 17.3 15.5 25.2 21.1 38 27.3 12.8 6.1 22.5 8.8 34.8 9.6 8.2.5 9.7.9 9.7 2.3 0 2.5-5.9 21.7-8.5 27.5-2.4 5.6-10.9 15.2-19.9 22.7l-5.8 4.9-8.2-.6c-14.7-1.2-43.1-12.1-64-24.5-33.2-19.8-62.4-49.6-77.6-79.3-2.7-5.4-5-10.5-5-11.3 0-5.6 35-63.9 37.1-61.7.3.5 4.8 7.1 9.9 14.8Zm231.1 31.7c5.3 2.4 22.2 13.2 33.5 21.3 3.1 2.2 6.6 3.8 8.5 4 3.1.2 4.1 1.2 10.2 10.1 11.9 17.3 19 34.1 29.6 69.9 4 13.7 5.2 21.9 4.2 28.2-1.3 8.5-1.6 8.7-16.1 8-40.6-1.9-82-17.7-99.4-37.8-5-5.9-11.1-16.4-14.2-24.6-3.3-8.8-5.7-24.9-5-33.8.6-8.7 5.8-25.5 9.7-31.6 3.9-6.2 13-14.7 16.5-15.4 1.6-.4 3.4-.8 3.9-1.1 3-1.1 13.5.4 18.6 2.8Zm-268.6 46.6c16.2 24.3 40.8 47.5 67.1 63.5 22.1 13.5 49.9 24.7 65.5 26.5l6.4.8-4.5 2.9c-6.7 4.3-15.9 7.8-21.5 8.1-2.7.2-9.2 1.1-14.2 2-6.8 1.2-12.9 1.5-23 1.2-16.4-.6-20.1-1.7-44.8-14-29.6-14.8-38-21-42.9-31.8-10-22-11.1-45.9-3.4-74.3l2.1-7.9 4.3 8.2c2.4 4.5 6.4 11.1 8.9 14.8Zm378.2 103.3c1.5.5 4.3 2.5 6.1 4.2 7.3 6.9 10.2 17.1 10.2 35.8 0 10.9-.4 14.3-3.4 26.5-1.9 7.7-4.7 17.2-6.1 21-5.1 13.4-16.7 30.6-24.8 36.5-11.8 8.6-40.4 19.8-69 26.9-6.7 1.7-17.8 4.9-24.7 7-6.9 2.2-17.4 5.1-23.5 6.5-6 1.4-15.7 4.1-21.5 6-14.3 4.8-26.7 7.4-38 8.1-8 .6-10.8.3-17.5-1.5-15.3-4.2-33.7-14.7-51.3-29.3-16.7-14-22.8-21.2-31.4-36.8-5.1-9.3-17.1-37.9-16.5-39.4s30.2-12.6 39.7-15c17-4.1 61-11.4 95.5-15.6 43.6-5.4 62.3-9.3 93.5-19.6 12.4-4 27.7-8.4 34-9.8 6.3-1.3 14.4-3.6 18-5.1 18.2-7.7 24.1-8.9 30.7-6.4Z"
class="cls-1"
data-name="Left Hand"
/><path
id="Right_hand_background"
d="M1819.8 966.37c-25.94-6.6-55.37 12.34-80.21 47.23-7.22 2.11-13.85 6.48-18.71 12.96l-62.66 83.5c-3.95 5.27-6.58 11.11-7.97 17.13l-5.41 1.59c-13.38 3.92-23.69 13.25-29.27 24.9-5.72 2.53-10.71 6.15-14.76 10.55-3.12-3.5-6.87-6.34-11.02-8.41l-8.6-29.33c-2.43-8.29-7.39-15.15-13.8-19.98-1.3-3.05-2.95-5.86-4.89-8.42l-1.83-6.25c-5.53-18.87-25.32-29.69-44.19-24.16l-1.17.34c-17.05 5-27.52 21.63-25.3 38.71-2.25 3.8-4 7.88-5.2 12.14-6.93 11-9.29 24.81-5.34 38.27l4.28 14.6c-2.84 8.7-3.18 18.32-.41 27.76l43.82 149.44-4.59-1.51c-5.42-1.79-11.01-1.75-16.1-.23l-5.24-1.73c-6.73-2.22-14 1.43-16.22 8.17-1.95 5.9-1.07 12.05 1.87 17.01-2.25 10.55-.41 21.21 4.6 30.14 1.2 12.02 7.42 23.12 17.2 30.4 5.03 12.25 15.17 22.32 28.74 26.8l6.25 2.06c4.14 7.04 10.75 12.68 19.12 15.44l20.53 6.78 1.08 3.7 5.36-1.57 15.54 5.13 1.09 3.73 5.4-1.58 78.79 26.01c6.91 2.28 14.02 2.19 20.48.2l18.24 6.02c18.8 6.21 39.08-4 45.29-22.81 6.21-18.8-4-39.08-22.81-45.29l-4.43-1.46c-1.72-4.44-4.32-8.51-7.65-11.96l13.47-3.95-.5-1.72c10.19-4.24 17.61-12.72 20.8-22.72l4.6 3.75 41.26-50.64c3.18-3.9 5.25-8.34 6.27-12.94 25.27-12.22 42.7-38.1 42.7-68.05v-186.05c5.89-69.09-12.51-124.56-48.47-133.71Z"
class="cls-4"
data-name="Right hand background"
/><path
id="Right_Hand"
d="M1797.02 960.24c-13.1 3.3-25.8 12.9-52.1 39.1-30.1 30-54.1 58.2-80.5 94.5-15.4 21.1-16.2 22.5-15.6 25.7.5 2.7.2 2.9-5.5 4.7-3.3 1-7.2 2.9-8.7 4-1.4 1.2-3.9 3-5.6 4-7.2 4.5-16.8 13.3-22.5 20.7-5.2 6.7-6.5 7.8-7.6 6.7-2.9-3-12.7-23.3-17.8-37.1-3-8.1-7.4-18.3-9.7-22.7-7.7-14.4-23.3-30.5-34.8-35.8-7.3-3.4-18-2.9-26.1 1.3-7.9 4-17.1 13.8-21.3 22.7-8.5 17.7-11.2 34-11.1 66.8 0 24.7 1.1 36.1 6 62.9 5.7 31.1 21.6 85.9 33.3 114.6 2.2 5.4 3.8 10.1 3.6 10.3s-5.8-.1-12.4-.7c-14.8-1.5-18.2-.9-22 3.5-6.6 7.5-6.7 17.7-.6 51.3 1.2 6.6 2.8 10.9 7.1 19 3.1 5.8 6.4 11.7 7.3 13.1s2.3 3.8 3.1 5.4 4.9 6.3 9 10.5c6.7 6.8 10.1 9.1 32.5 21.8 32.7 18.6 41.4 22.6 69.5 32.1 41.9 14.1 68.2 21 94.5 24.6 6.1.8 16.3 2.4 22.8 3.6 20.4 3.5 26.1 2.6 34.3-5.1 2.8-2.8 6.3-6.7 7.7-8.7 3.8-5.5 6.8-15.6 7-23.3.2-5.7-.2-7.2-2.1-9.6-1.2-1.5-4.4-5.7-7-9.3-8.5-11.8-35.6-37.2-44.4-41.6-7.5-3.8-22.4-9-33.6-11.8-10.4-2.6-27.5-9.1-46.7-17.9-43.6-19.9-57.9-26.8-76.7-36.6-11.6-6.2-23.4-11.9-26.2-12.8s-5.5-2-6-2.4c-.6-.5-1.8-.9-2.8-.9s-1.8-.5-1.8-1.1-1.6-2.5-3.5-4.4c-4-3.7-8-13.2-16.3-38.5-25.9-79.2-34.5-139.3-26.7-185 4-23.4 13.7-40 27.2-46.7 11.6-5.6 20.3-3.1 33.6 9.6s18.2 20.7 26.2 42.6c5.2 14.3 17.1 38.5 21.8 44.3 4 5 16.6 30.8 21.1 43.4 9.7 26.8 16.6 65.4 16.6 92.4v13.4h2.4c1.9 0 2.7-.8 3.7-3.7 2.5-7.8-.7-41.8-6.8-70.8-4.5-21.7-12.8-44.4-23.8-65l-5.4-10 2.7-3.1c1.5-1.7 3.9-4.7 5.4-6.6 1.5-1.9 6-6.1 10.2-9.2 4.1-3.1 7.7-6.4 8-7.4.9-2.6 10.3-8 19.3-11 12.9-4.2 20.3-3.7 39.3 2.8 8.5 2.9 18.3 6.6 21.8 8.2 6.9 3.3 9.6 3.3 10 .2.4-2.6-5-6.9-11.3-9.1-2.5-.8-4.7-1.9-5.1-2.4-.3-.5-1.6-.9-2.9-.9s-4.8-.9-7.7-2c-11.8-4.3-21.7-6.2-30.8-5.8l-8.8.3 1-2.4c1.1-3.1 26.2-37 39.2-53 16.1-19.8 40.9-47.2 59.2-65.2 34.3-33.6 47-39.6 65.4-30.8 10.3 4.9 16.8 11.2 25.6 24.6 13.3 20.1 15.3 26.3 19.9 61.4l.5 3.5-14.3 3.9c-26.3 7-48.8 16-84.2 33.6-24.9 12.4-33 17.4-33 20.4 0 3.5 4.1 2.9 12.3-1.8 20.3-11.7 60.9-30.7 81.9-38.3 13.4-4.9 36.3-11.5 37.4-10.8 1 .6 1.2 89.5.3 93.1-.4 1.6-1.7 2.3-4.7 2.8-14.3 2.5-43.6 18.3-57.9 31.4-6.7 6.1-8.6 9.4-6.8 11.6.7.8 1.6 1.5 2.1 1.5s3.7-2.7 7-6c11.7-11.3 37.2-26.7 51.7-31 4-1.2 7.5-2.1 7.6-1.9.4.4 1 78.5.8 89.4l-.2 7-5.2 1.9c-7.2 2.5-19.6 9.4-20.7 11.4-2 4 2.3 5.7 6.8 2.6 1.2-.9 5.7-3.4 9.9-5.5l7.7-3.9.3 12.3c.1 6.7-.1 17.2-.7 23.3-.7 9.4-1.3 12-3.7 16-6 10.6-16.7 21.8-24.9 26.1-2 1.1-2 .7-2.3-13.5-.3-15.1-1.1-18-4.4-16.7-1.4.5-1.7 3.1-2 15.3-.4 13.5-.6 15.3-3.3 21.7-3.7 8.8-18.4 28.6-28.4 38-4 3.8-9.4 9.2-11.9 12-9.2 10-16 16.1-25 22.5-6.8 4.7-9.2 7-9.2 8.6 0 2.9 2.5 3.7 5.9 1.9 6.1-3.1 23.6-17.7 29.6-24.6 3.5-4.1 9.4-10.1 13.1-13.4 8.2-7.2 24.8-27.9 28.9-35.8 2.8-5.4 3.6-6.1 10.5-9.6 4.1-2 8.7-4.5 10.2-5.5 4.3-2.9 16.4-18 19.7-24.8 2.9-5.9 3.2-7.6 4.3-22.8.6-9.1 1.2-44.9 1.3-79.5.1-34.7.4-84.4.6-110.5.3-50.6-.2-59.6-5.2-84.4-2.9-14.5-11.3-31-23.8-46.9-11.9-15.3-31.5-24-45.6-20.3Zm-287 388.6c6.1.6 13.3 1.7 16 2.5 2.8.8 7.5 2.1 10.5 3 3 .8 16.3 7.1 29.5 14 13.2 7 30.1 15.3 37.5 18.7 7.4 3.3 20.9 9.5 30 13.8 22.9 10.8 46.9 20.5 57 22.8 9.6 2.3 27.5 8.4 33.1 11.3 7.5 3.8 36.6 30.4 39.5 36.2.8 1.5 3.7 5.2 6.4 8.3 6 6.5 6.4 9.6 2.5 21.3-2.1 6.3-3.6 8.6-8.2 13.5-6.5 6.7-8.4 7.6-15.6 7.6-12.4 0-68.1-10.2-90.2-16.6-28.9-8.3-65.5-21.3-79-27.9-13.3-6.5-40.2-21.3-51-28-7.7-4.8-16.5-15.2-24.2-28.5-10.7-18.5-10.8-18.9-14.9-47.9-1.7-11.8-.8-18.9 2.8-22.8 2.4-2.6 3.3-2.7 18.3-1.3Z"
class="cls-1"
data-name="Right Hand"
/>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 102 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 77 KiB

@@ -0,0 +1,271 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="795.27 277.13 409.46 1319.35">
<defs><style>
.cls-1 {
fill: #353535;
}
.cls-2 {
fill: #1e1e1d;
}
.cls-3 {
fill: #b1a368;
}
.cls-10, .cls-11, .cls-4, .cls-6, .cls-8, .cls-9 {
fill: none;
}
.cls-4, .cls-6 {
stroke: #050606;
}
.cls-10, .cls-11, .cls-4, .cls-6, .cls-8 {
stroke-miterlimit: 10;
}
.cls-4 {
stroke-width: 2.41px;
}
.cls-5 {
fill: #30c2db;
}
.cls-6 {
stroke-width: 3.91px;
}
.cls-7 {
fill: #dcf0f2;
}
.cls-10, .cls-11, .cls-8 {
stroke: #dcf0f2;
}
.cls-8 {
stroke-width: 1.81px;
}
.cls-9 {
stroke: #17afbf;
stroke-linecap: round;
stroke-linejoin: round;
stroke-width: 7.23px;
}
.cls-10 {
stroke-width: 1.78px;
}
.cls-11 {
stroke-width: 1.81px;
}
</style></defs><g id="Layer_7" data-name="Layer 7"><path
class="cls-1"
d="M915.62,278.34h22.61a35,35,0,0,1,35,35V715.74a0,0,0,0,1,0,0H880.6a0,0,0,0,1,0,0V313.36A35,35,0,0,1,915.62,278.34Z"
></path><rect
class="cls-2"
x="880.6"
y="340.15"
width="92.65"
height="7.54"
></rect><rect
class="cls-2"
x="880.6"
y="356.68"
width="92.65"
height="7.54"
></rect><rect
class="cls-3"
x="885.8"
y="844.3"
width="84.14"
height="19.02"
></rect><rect
class="cls-3"
x="880.6"
y="819.07"
width="92.65"
height="25.23"
></rect><rect
class="cls-3"
x="885.8"
y="790.65"
width="84.14"
height="28.41"
></rect><rect
class="cls-3"
x="880.6"
y="723.02"
width="92.65"
height="67.63"
></rect><rect
class="cls-3"
x="885.8"
y="715.74"
width="84.14"
height="7.28"
></rect><rect
class="cls-4"
x="885.8"
y="844.3"
width="84.14"
height="19.02"
></rect><rect
class="cls-4"
x="880.6"
y="819.07"
width="92.65"
height="25.23"
></rect><rect
class="cls-4"
x="885.8"
y="790.65"
width="84.14"
height="28.41"
></rect><rect
class="cls-4"
x="880.6"
y="723.02"
width="92.65"
height="67.63"
></rect><rect
class="cls-4"
x="885.8"
y="715.74"
width="84.14"
height="7.28"
></rect><path
class="cls-4"
d="M915.62,278.34h22.61a35,35,0,0,1,35,35V715.74a0,0,0,0,1,0,0H880.6a0,0,0,0,1,0,0V313.36A35,35,0,0,1,915.62,278.34Z"
></path><rect
class="cls-4"
x="880.6"
y="340.15"
width="92.65"
height="7.54"
></rect><rect
class="cls-4"
x="880.6"
y="356.68"
width="92.65"
height="7.54"
></rect><rect
class="cls-5"
x="796.48"
y="856.3"
width="407.05"
height="738.98"
rx="47.74"
></rect><rect
class="cls-1"
x="900.05"
y="973.19"
width="202.03"
height="354.65"
rx="16.4"
></rect><rect
class="cls-6"
x="900.05"
y="973.19"
width="202.03"
height="354.65"
rx="16.4"
></rect><rect
class="cls-7"
x="871.51"
y="890.41"
width="55.42"
height="31.12"
rx="15.56"
></rect><rect
class="cls-7"
x="1070.16"
y="890.41"
width="55.42"
height="31.12"
rx="15.56"
></rect><rect
class="cls-4"
x="871.51"
y="890.41"
width="55.42"
height="31.12"
rx="15.56"
></rect><rect
class="cls-4"
x="1070.16"
y="890.41"
width="55.42"
height="31.12"
rx="15.56"
></rect><circle
class="cls-8"
cx="841.7"
cy="1537.01"
r="16.25"
></circle><circle
class="cls-8"
cx="841.7"
cy="913.26"
r="16.25"
></circle><circle
class="cls-8"
cx="1157.32"
cy="913.26"
r="16.25"
></circle><circle
class="cls-8"
cx="1157.32"
cy="1504.51"
r="16.25"
></circle><line
class="cls-9"
x1="942.51"
y1="1592.42"
x2="942.51"
y2="1381.55"
></line><line
class="cls-9"
x1="966.52"
y1="1592.42"
x2="966.52"
y2="1381.55"
></line><line
class="cls-9"
x1="990.57"
y1="1592.42"
x2="990.57"
y2="1381.55"
></line><line
class="cls-9"
x1="1014.59"
y1="1592.42"
x2="1014.59"
y2="1381.55"
></line><line
class="cls-9"
x1="1038.63"
y1="1592.42"
x2="1038.63"
y2="1381.55"
></line><line
class="cls-9"
x1="1062.65"
y1="1592.42"
x2="1062.65"
y2="1381.55"
></line><rect
class="cls-4"
x="796.48"
y="856.3"
width="407.05"
height="738.98"
rx="47.74"
></rect><path
class="cls-10"
d="M1040.1,947.74H960.65A13.93,13.93,0,0,1,947,936.64l-10.23-49.2a13.93,13.93,0,0,1,13.64-16.77h97.72a13.93,13.93,0,0,1,13.75,16.18l-8,49.2A13.94,13.94,0,0,1,1040.1,947.74Z"
></path><rect
class="cls-11"
x="816.35"
y="870.67"
width="365.51"
height="703.12"
rx="32.37"
></rect><rect
class="cls-11"
x="888.77"
y="963.84"
width="223.2"
height="374.66"
rx="25.21"
></rect></g>
</svg>

After

Width:  |  Height:  |  Size: 5.3 KiB

@@ -0,0 +1,398 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="502.65 765.65 1000.06 433.43">
<defs><style>
.cls-1 {
fill: #8e8d8e;
}
.cls-2 {
fill: #cccccb;
}
.cls-3 {
fill: #ddd;
}
.cls-4 {
fill: #2b2b2b;
}
.cls-5 {
fill: #383839;
}
.cls-6 {
fill: #599cbd;
}
.cls-10, .cls-11, .cls-14, .cls-7, .cls-9 {
fill: none;
stroke-miterlimit: 10;
}
.cls-7 {
stroke: #fff;
}
.cls-10, .cls-14, .cls-7 {
stroke-width: 1.65px;
}
.cls-8 {
fill: #cbcccb;
}
.cls-10, .cls-11, .cls-9 {
stroke: #050606;
}
.cls-9 {
stroke-width: 2px;
}
.cls-11 {
stroke-width: 1.67px;
}
.cls-12 {
fill: #fff;
}
.cls-13 {
fill: #eecc42;
}
.cls-14 {
stroke: #eecc42;
}
</style></defs><g id="Layer_4" data-name="Layer 4"><path
class="cls-1"
d="M554.23,774h907.26a0,0,0,0,1,0,0v415.1a0,0,0,0,1,0,0H554.23a32.53,32.53,0,0,1-32.53-32.53v-350A32.53,32.53,0,0,1,554.23,774Z"
></path><path
class="cls-2"
d="M1363,985.65v82.44a8.42,8.42,0,0,0,8.42,8.42h75.41a18.61,18.61,0,0,1,18.61,18.62v82.15a20.79,20.79,0,0,1-20.79,20.79h-37.14a15,15,0,0,1-15-15v-40.46a23.46,23.46,0,0,0-23.46-23.47h-22.26a4.57,4.57,0,0,0-4.57,4.58h0a4.57,4.57,0,0,0,4.57,4.57h22.31a15.19,15.19,0,0,1,15.19,15.19V1181a17.08,17.08,0,0,1-17.08,17.08H549a45.49,45.49,0,0,1-45.35-42h37.39a57.24,57.24,0,0,0,57.24-57.23V864.62a57.24,57.24,0,0,0-57.24-57.23H503.79A45.49,45.49,0,0,1,549,766.65h818.24a17.08,17.08,0,0,1,17.08,17.08v37.46a15.19,15.19,0,0,1-15.19,15.18h-22.31a4.57,4.57,0,0,0-4.57,4.58h0a4.57,4.57,0,0,0,4.57,4.57h22.26a23.46,23.46,0,0,0,23.46-23.46V781.6a15,15,0,0,1,15-15h37.14a20.79,20.79,0,0,1,20.79,20.79v82.15a18.62,18.62,0,0,1-18.61,18.62h-75.41a8.41,8.41,0,0,0-8.42,8.41v89Z"
></path><path
class="cls-3"
d="M1363,897.36h130.87a8,8,0,0,1,8,8v155.38a8,8,0,0,1-8,8H1363a0,0,0,0,1,0,0V897.36A0,0,0,0,1,1363,897.36Z"
></path><rect
class="cls-4"
x="1404.64"
y="937.34"
width="10.03"
height="22.38"
></rect><rect
class="cls-4"
x="1404.64"
y="1003.72"
width="10.03"
height="22.38"
></rect><rect
class="cls-4"
x="1363.01"
y="1001.56"
width="23.63"
height="34.15"
></rect><rect
class="cls-4"
x="1363.01"
y="930.05"
width="23.63"
height="34.15"
></rect><path
class="cls-5"
d="M598.31,864.62v234.21a57.24,57.24,0,0,1-57.24,57.23H521.7V807.39h19.37A57.24,57.24,0,0,1,598.31,864.62Z"
></path><rect
class="cls-5"
x="728.25"
y="817.13"
width="158.2"
height="330.36"
></rect><path
class="cls-6"
d="M572.27,1146.81v-26.49a1.33,1.33,0,0,0-1.33-1.33H540.27a1.33,1.33,0,0,0-1.33,1.33v35.74a43.86,43.86,0,0,0,15.13-1.49C561.47,1152.31,572.27,1146.81,572.27,1146.81Z"
></path><path
class="cls-7"
d="M538.94,1156.06v-35.74a1.33,1.33,0,0,1,1.33-1.33h30.67a1.33,1.33,0,0,1,1.33,1.33v26.49"
></path><path
class="cls-8"
d="M528.57,837.41h3.59a0,0,0,0,1,0,0v38.22a0,0,0,0,1,0,0h-3.59a3,3,0,0,1-3-3V840.39A3,3,0,0,1,528.57,837.41Z"
></path><path
class="cls-9"
d="M503.68,1156.06h37.39a57.24,57.24,0,0,0,57.24-57.23V864.62a57.24,57.24,0,0,0-57.24-57.23H503.79"
></path><line
class="cls-10"
x1="521.7"
y1="807.39"
x2="521.7"
y2="1156.06"
></line><path
class="cls-9"
d="M1363,979.06V896.62a8.41,8.41,0,0,1,8.42-8.41h75.41a18.62,18.62,0,0,0,18.61-18.62V787.44a20.79,20.79,0,0,0-20.79-20.79h-37.14a15,15,0,0,0-15,15v40.46a23.46,23.46,0,0,1-23.46,23.46h-22.26a4.57,4.57,0,0,1-4.57-4.57h0a4.57,4.57,0,0,1,4.57-4.58h22.31a15.19,15.19,0,0,0,15.19-15.18V783.73a17.08,17.08,0,0,0-17.08-17.08H549a45.49,45.49,0,0,0-45.24,40.74"
></path><path
class="cls-9"
d="M1363,985.65v82.44a8.42,8.42,0,0,0,8.42,8.42h75.41a18.61,18.61,0,0,1,18.61,18.62v82.15a20.79,20.79,0,0,1-20.79,20.79h-37.14a15,15,0,0,1-15-15v-40.46a23.46,23.46,0,0,0-23.46-23.47h-22.26a4.57,4.57,0,0,0-4.57,4.58h0a4.57,4.57,0,0,0,4.57,4.57h22.31a15.19,15.19,0,0,1,15.19,15.19V1181a17.08,17.08,0,0,1-17.08,17.08H549a45.49,45.49,0,0,1-45.35-42"
></path><path
class="cls-7"
d="M618.9,981.73V862.12a6.16,6.16,0,0,1,6.16-6.17h87.49A10.48,10.48,0,0,0,723,845.48v-28a7.08,7.08,0,0,1,7.08-7.08H833.83A14.5,14.5,0,0,0,844,806.25l23.23-22.52a15.93,15.93,0,0,1,11.11-4.5h273.84a16,16,0,0,1,11.73,5.13l19.69,21.32a14.55,14.55,0,0,0,10.69,4.68h122.44a5.85,5.85,0,0,1,5.86,5.85v331.55a5.86,5.86,0,0,1-5.86,5.86H730.11a7.08,7.08,0,0,1-7.08-7.08v-74A10.48,10.48,0,0,0,712.55,1062H625.06a6.16,6.16,0,0,1-6.16-6.16V982.25"
></path><circle
class="cls-7"
cx="1012.63"
cy="1176.42"
r="15.95"
></circle><circle
class="cls-7"
cx="1347.86"
cy="1165.18"
r="15.95"
></circle><circle
class="cls-7"
cx="1347.86"
cy="801.82"
r="15.95"
></circle><rect
class="cls-7"
x="1406.28"
y="1109.79"
width="43.15"
height="63.43"
rx="21.58"
></rect><rect
class="cls-7"
x="1406.28"
y="796.41"
width="43.15"
height="63.43"
rx="21.58"
></rect><path
class="cls-11"
d="M1363,897.36h130.87a8,8,0,0,1,8,8v155.38a8,8,0,0,1-8,8H1363a0,0,0,0,1,0,0V897.36A0,0,0,0,1,1363,897.36Z"
></path><rect
class="cls-11"
x="1404.64"
y="937.34"
width="10.03"
height="22.38"
></rect><rect
class="cls-11"
x="1404.64"
y="1003.72"
width="10.03"
height="22.38"
></rect><rect
class="cls-11"
x="1363.01"
y="1001.56"
width="23.63"
height="34.15"
></rect><rect
class="cls-11"
x="1363.01"
y="930.05"
width="23.63"
height="34.15"
></rect><line
class="cls-11"
x1="1461.49"
y1="881.06"
x2="1461.49"
y2="897.36"
></line><line
class="cls-11"
x1="1461.49"
y1="1068.83"
x2="1461.49"
y2="1083.65"
></line><line
class="cls-11"
x1="1381.33"
y1="774.04"
x2="1394.21"
y2="774.04"
></line><line
class="cls-11"
x1="1382.28"
y1="1189.14"
x2="1394.21"
y2="1189.14"
></line><rect
class="cls-12"
x="532.16"
y="831.98"
width="49.07"
height="49.07"
rx="2.75"
></rect><rect
class="cls-10"
x="532.16"
y="831.98"
width="49.07"
height="49.07"
rx="2.75"
></rect><circle
class="cls-13"
cx="556.69"
cy="856.52"
r="9.63"
></circle><circle
class="cls-14"
cx="556.69"
cy="856.52"
r="19.11"
></circle><path
class="cls-10"
d="M528.57,837.41h3.59a0,0,0,0,1,0,0v38.22a0,0,0,0,1,0,0h-3.59a3,3,0,0,1-3-3V840.39A3,3,0,0,1,528.57,837.41Z"
></path><path
class="cls-8"
d="M584.21,837.41h3.59a0,0,0,0,1,0,0v38.22a0,0,0,0,1,0,0h-3.59a3,3,0,0,1-3-3V840.39A3,3,0,0,1,584.21,837.41Z"
transform="translate(1169.02 1713.04) rotate(-180)"
></path><path
class="cls-10"
d="M584.21,837.41h3.59a0,0,0,0,1,0,0v38.22a0,0,0,0,1,0,0h-3.59a3,3,0,0,1-3-3V840.39A3,3,0,0,1,584.21,837.41Z"
transform="translate(1169.02 1713.04) rotate(-180)"
></path><rect
class="cls-7"
x="525.59"
y="961.1"
width="31.1"
height="17.96"
rx="0.79"
></rect><rect
class="cls-7"
x="525.59"
y="985.65"
width="31.1"
height="17.96"
rx="0.79"
></rect><path
class="cls-12"
d="M576.68,978.9h-2V962h2Zm8.64-7.59H575.6v-1.93h9.72Zm1.3,7.59h-2V962h2Z"
></path><path
class="cls-12"
d="M569.32,978.9h-9.47V977h9.47Zm0-7.7h-8.19v-1.9h8.19Zm1.16,7.7h-2V962h2Z"
></path><path
class="cls-12"
d="M585.44,988.92h-9.67V987h9.67Zm1.18,15h-2V987h2Z"
></path><path
class="cls-12"
d="M571.82,1003.9h-9.46V1002h9.46Zm0-7.7h-8.19v-1.9h8.19Zm1.17,7.7h-2V987h2Z"
></path><rect
class="cls-8"
x="530.71"
y="989.79"
width="5.58"
height="9.68"
rx="1.05"
></rect><rect
class="cls-8"
x="546"
y="989.79"
width="5.58"
height="9.68"
rx="1.05"
></rect><rect
class="cls-8"
x="530.71"
y="965.24"
width="5.58"
height="9.68"
rx="1.05"
></rect><rect
class="cls-8"
x="556.69"
y="913.16"
width="5.58"
height="9.68"
rx="1.05"
></rect><rect
class="cls-8"
x="583.14"
y="913.16"
width="5.58"
height="9.68"
rx="1.05"
></rect><rect
class="cls-8"
x="546"
y="965.24"
width="5.58"
height="9.68"
rx="1.05"
></rect><path
class="cls-7"
d="M552.28,913.61v-5.5a1.36,1.36,0,0,1,1.36-1.36H590.7a1.36,1.36,0,0,1,1.36,1.36v5.5"
></path><path
class="cls-7"
d="M565.9,922.84v5.63a1.36,1.36,0,0,1-1.37,1.36H553.64a1.36,1.36,0,0,1-1.36-1.36v-5.63"
></path><rect
class="cls-8"
x="541.49"
y="1082.41"
width="5.58"
height="9.68"
rx="1.05"
transform="translate(1697.94 1471.19) rotate(135)"
></rect><path
class="cls-7"
d="M536.32,1088.36l-4-4a1.36,1.36,0,0,1,0-1.92l7.7-7.7a1.35,1.35,0,0,1,1.93,0l4,4"
></path><rect
class="cls-8"
x="571.96"
y="1050.39"
width="5.58"
height="9.68"
rx="1.05"
transform="translate(1727.32 1394.99) rotate(135)"
></rect><rect
class="cls-8"
x="583.85"
y="1059.62"
width="5.58"
height="9.68"
rx="1.05"
transform="translate(1754.13 1402.34) rotate(135)"
></rect><rect
class="cls-8"
x="574.63"
y="1068.83"
width="5.58"
height="9.68"
rx="1.05"
transform="translate(1744.92 1424.58) rotate(135)"
></rect><rect
class="cls-8"
x="561.03"
y="1083.6"
width="5.58"
height="9.68"
rx="1.05"
transform="translate(1732.15 1459.41) rotate(135)"
></rect><rect
class="cls-8"
x="551.82"
y="1092.82"
width="5.58"
height="9.68"
rx="1.05"
transform="translate(1722.93 1481.65) rotate(135)"
></rect><path
class="cls-7"
d="M566.79,1056.35l-4-4a1.36,1.36,0,0,1,0-1.92l7.71-7.71a1.36,1.36,0,0,1,1.92,0l4,4"
></path><path
class="cls-7"
d="M592.06,922.84v5.63a1.36,1.36,0,0,1-1.36,1.36H581a1.36,1.36,0,0,1-1.36-1.36v-5.63"
></path><line
class="cls-7"
x1="565.9"
y1="918.69"
x2="579.63"
y2="918.69"
></line><path
class="cls-7"
d="M551,1103.25l3.72,3.21a3.16,3.16,0,0,0,4.33-.19l35.69-36.8a3.15,3.15,0,0,0,0-4.44l-3.79-3.76"
></path><line
class="cls-7"
x1="573.31"
y1="1065.02"
x2="553.89"
y2="1084.25"
></line><path
class="cls-7"
d="M569.42,1116.78V1115a1.89,1.89,0,0,0-1.89-1.89h-23.2a1.88,1.88,0,0,0-1.89,1.89v1.8"
></path><rect
class="cls-12"
x="542.44"
y="1121.36"
width="26.13"
height="7.79"
></rect><rect
class="cls-4"
x="790.91"
y="817.13"
width="522.47"
height="330.36"
></rect></g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

@@ -0,0 +1,74 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="404.68 390.65 1217.15 959.26">
<defs><style>
.cls-1 {
fill: #dfeaf7;
}
.cls-2 {
fill: #17907f;
}
.cls-3 {
fill: #2b2b2b;
}
.cls-4, .cls-5 {
fill: none;
stroke: #050606;
stroke-miterlimit: 10;
}
.cls-4 {
stroke-width: 2.25px;
}
.cls-5 {
stroke-width: 4px;
}
.cls-6 {
fill: #050606;
}
</style></defs><g id="Layer_5" data-name="Layer 5"><path
class="cls-1"
d="M1517.73,392.65h0a102.1,102.1,0,0,0-102.1,102.1V770.37A40.62,40.62,0,0,1,1375,811H455.16a48.49,48.49,0,0,0-48.48,48.48v126a11.85,11.85,0,0,0,3.46,8.37l15.34,15.34a11.81,11.81,0,0,1,3.47,8.37v137.16a11.81,11.81,0,0,1-3.47,8.37l-15.34,15.34a11.85,11.85,0,0,0-3.46,8.37v112.67a48.49,48.49,0,0,0,48.48,48.49H1571.34a48.51,48.51,0,0,0,48.49-48.5V494.75A102.1,102.1,0,0,0,1517.73,392.65Zm-110.61,815V954a33.14,33.14,0,0,1,66.27,0v253.65a33.14,33.14,0,0,1-66.27,0Z"
></path><path
class="cls-2"
d="M1516,439.16c-30.23.91-53.92,26.54-53.92,56.79V770.37A87.11,87.11,0,0,1,1375,857.48H732.31A27.51,27.51,0,0,0,704.8,885v388.93a27.51,27.51,0,0,0,27.51,27.51h828.38a12.7,12.7,0,0,0,12.65-12.65v-794A55.69,55.69,0,0,0,1516,439.16Zm-108.9,768.47V954a33.14,33.14,0,0,1,66.27,0v253.65a33.14,33.14,0,0,1-66.27,0Z"
></path><rect
class="cls-3"
x="787.14"
y="943.38"
width="429.45"
height="224.42"
></rect><path
class="cls-1"
d="M1478.6,915.35A54.23,54.23,0,0,0,1386,953.69v254.23a54.23,54.23,0,1,0,108.45,0V953.69A54,54,0,0,0,1478.6,915.35Zm-5.21,292.28a33.14,33.14,0,0,1-66.27,0V954a33.14,33.14,0,0,1,66.27,0Z"
></path></g><g id="Layer_2" data-name="Layer 2"><path
class="cls-4"
d="M1573.34,494.75v794a12.68,12.68,0,0,1-12.65,12.65H732.31a27.51,27.51,0,0,1-27.51-27.51V885a27.51,27.51,0,0,1,27.51-27.51H1375a87.11,87.11,0,0,0,87.11-87.11V496c0-30.25,23.69-55.88,53.92-56.79A55.69,55.69,0,0,1,1573.34,494.75Z"
></path><path
class="cls-5"
d="M410.14,1178.39,425.49,1163a11.78,11.78,0,0,0,3.46-8.35V1017.5a11.8,11.8,0,0,0-3.46-8.35l-15.35-15.36a11.77,11.77,0,0,1-3.46-8.35v-126A48.47,48.47,0,0,1,455.16,811H1375a40.63,40.63,0,0,0,40.63-40.63V494.75a102.1,102.1,0,0,1,102.1-102.1h0a102.1,102.1,0,0,1,102.1,102.1v804.66a48.51,48.51,0,0,1-48.49,48.5H455.16a48.48,48.48,0,0,1-48.48-48.49V1186.74A11.78,11.78,0,0,1,410.14,1178.39Z"
></path><rect
class="cls-4"
x="1407.12"
y="920.85"
width="66.26"
height="319.9"
rx="33.13"
></rect><rect
class="cls-4"
x="1386.03"
y="899.46"
width="108.46"
height="362.69"
rx="54.23"
></rect><path
class="cls-6"
d="M639.76,1070.55a2.91,2.91,0,0,1-2.91-2.91v-30.53a5.42,5.42,0,0,0-1.6-3.86l-32.44-32.44a11.86,11.86,0,0,1-3.5-8.44V901a12.52,12.52,0,0,0-12.51-12.51H483.92a12.7,12.7,0,0,0-12.68,12.69v76.78a24.13,24.13,0,0,0,7.11,17.18l14.33,14.33a24.13,24.13,0,0,0,17.18,7.11h50.75a11.86,11.86,0,0,1,8.44,3.5l24.26,24.26a12.47,12.47,0,0,1,3.68,8.88v14.46a2.91,2.91,0,1,1-5.81,0v-14.46a6.72,6.72,0,0,0-2-4.77l-24.26-24.26a6.09,6.09,0,0,0-4.33-1.8H509.86a29.91,29.91,0,0,1-21.29-8.81l-14.33-14.33a29.87,29.87,0,0,1-8.81-21.29V901.14a18.51,18.51,0,0,1,18.49-18.5H586.8A18.34,18.34,0,0,1,605.12,901v91.41a6.09,6.09,0,0,0,1.8,4.33l32.44,32.44a11.19,11.19,0,0,1,3.3,8v30.53A2.9,2.9,0,0,1,639.76,1070.55Z"
></path><path
class="cls-6"
d="M586.8,1289.46H483.92a18.51,18.51,0,0,1-18.49-18.5v-76.78a29.87,29.87,0,0,1,8.81-21.29l14.33-14.34a29.91,29.91,0,0,1,21.29-8.81h50.75a6.09,6.09,0,0,0,4.33-1.8l24.26-24.25a6.74,6.74,0,0,0,2-4.78v-14.46a2.91,2.91,0,0,1,5.81,0v14.46a12.51,12.51,0,0,1-3.68,8.89l-24.26,24.25a11.86,11.86,0,0,1-8.44,3.5H509.86a24.17,24.17,0,0,0-17.18,7.11L478.35,1177a24.09,24.09,0,0,0-7.11,17.18V1271a12.71,12.71,0,0,0,12.68,12.69H586.8a12.53,12.53,0,0,0,12.51-12.52v-91.4a11.83,11.83,0,0,1,3.5-8.44l32.44-32.44a5.46,5.46,0,0,0,1.6-3.87v-30.53a2.91,2.91,0,0,1,5.81,0V1135a11.19,11.19,0,0,1-3.3,8l-32.44,32.45a6.06,6.06,0,0,0-1.8,4.33v91.4A18.35,18.35,0,0,1,586.8,1289.46Z"
></path><rect
class="cls-4"
x="787.14"
y="943.38"
width="429.45"
height="224.42"
></rect></g>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 40 KiB

@@ -0,0 +1,149 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="528.89 806.04 942.22 446.84">
<defs><style>
.cls-1 {
fill: #e8eae8;
}
.cls-2 {
fill: #dbdddb;
}
.cls-3 {
fill: #c6842a;
}
.cls-4, .cls-5, .cls-7, .cls-9 {
fill: none;
stroke-miterlimit: 10;
}
.cls-4, .cls-5 {
stroke: #050606;
}
.cls-4, .cls-9 {
stroke-width: 2.44px;
}
.cls-5, .cls-7 {
stroke-width: 1.22px;
}
.cls-6 {
fill: #b7b7b7;
}
.cls-7, .cls-9 {
stroke: #b7b7b7;
}
.cls-8 {
fill: #cbcccb;
}
.cls-10 {
fill: #434543;
}
</style></defs><g id="Layer_4" data-name="Layer 4"><path
class="cls-1"
d="M1469.9,826.68v390.94a19.43,19.43,0,0,1-19.43,19.43H549.53a19.43,19.43,0,0,1-19.43-19.43V826.68a19.42,19.42,0,0,1,19.43-19.42h900.94A19.42,19.42,0,0,1,1469.9,826.68Z"
></path><path
class="cls-2"
d="M574.23,807.26v429.79h-24.7a19.43,19.43,0,0,1-19.43-19.43V826.68a19.42,19.42,0,0,1,19.43-19.42Z"
></path><path
class="cls-2"
d="M1469.9,826.68v390.94a19.43,19.43,0,0,1-19.43,19.43h-37.56V807.26h37.56A19.42,19.42,0,0,1,1469.9,826.68Z"
></path><path
class="cls-3"
d="M574.23,1129.8h-7.47a4.55,4.55,0,0,1-4.55-4.54V919.05a4.55,4.55,0,0,1,4.55-4.55h7.47"
></path><rect
class="cls-4"
x="530.11"
y="807.26"
width="939.78"
height="429.79"
rx="19.42"
></rect><line
class="cls-5"
x1="574.23"
y1="807.26"
x2="574.23"
y2="1237.05"
></line><path
class="cls-5"
d="M574.23,1129.8h-7.47a4.55,4.55,0,0,1-4.55-4.54V919.05a4.55,4.55,0,0,1,4.55-4.55h7.47"
></path><rect
class="cls-6"
x="599.01"
y="970.1"
width="11.52"
height="104.11"
></rect><rect
class="cls-5"
x="599.01"
y="970.1"
width="11.52"
height="104.11"
></rect><path
class="cls-2"
d="M610.53,816.78V935.32l38.37,11.55a7.85,7.85,0,0,1,5.6,7.53V1107a7.87,7.87,0,0,1-7.87,7.87h-36.1v110.58H1406V816.78Zm775.41,384.75H631.43a3.66,3.66,0,0,1-3.66-3.66V1138a3.65,3.65,0,0,1,3.66-3.65h28.3a14.7,14.7,0,0,0,14.71-14.71V931a14.7,14.7,0,0,0-14.71-14.71h-28.3a3.65,3.65,0,0,1-3.66-3.66V844.11a3.66,3.66,0,0,1,3.66-3.66h754.51Z"
></path><path
class="cls-1"
d="M1385.94,840.45v361.08H631.43a3.66,3.66,0,0,1-3.66-3.66V1138a3.65,3.65,0,0,1,3.66-3.65h28.3a14.7,14.7,0,0,0,14.71-14.71V931a14.7,14.7,0,0,0-14.71-14.71h-28.3a3.65,3.65,0,0,1-3.66-3.66V844.11a3.66,3.66,0,0,1,3.66-3.66Z"
></path><path
class="cls-7"
d="M610.53,816.78V935.32l38.37,11.55a7.85,7.85,0,0,1,5.6,7.53V1107a7.87,7.87,0,0,1-7.87,7.87h-36.1v110.58H1406V816.78Zm775.41,384.75H631.43a3.66,3.66,0,0,1-3.66-3.66V1138a3.65,3.65,0,0,1,3.66-3.65h28.3a14.7,14.7,0,0,0,14.71-14.71V931a14.7,14.7,0,0,0-14.71-14.71h-28.3a3.65,3.65,0,0,1-3.66-3.66V844.11a3.66,3.66,0,0,1,3.66-3.66h754.51Z"
></path><path
class="cls-7"
d="M1385.94,840.45v361.08H631.43a3.66,3.66,0,0,1-3.66-3.66V1138a3.65,3.65,0,0,1,3.66-3.65h28.3a14.7,14.7,0,0,0,14.71-14.71V931a14.7,14.7,0,0,0-14.71-14.71h-28.3a3.65,3.65,0,0,1-3.66-3.66V844.11a3.66,3.66,0,0,1,3.66-3.66Z"
></path><path
class="cls-7"
d="M1385.94,840.45v361.08H631.43a3.66,3.66,0,0,1-3.66-3.66V1138a3.65,3.65,0,0,1,3.66-3.65h28.3a14.7,14.7,0,0,0,14.71-14.71V931a14.7,14.7,0,0,0-14.71-14.71h-28.3a3.65,3.65,0,0,1-3.66-3.66V844.11a3.66,3.66,0,0,1,3.66-3.66Z"
></path><line
class="cls-7"
x1="666.4"
y1="1132.79"
x2="666.4"
y2="1201.53"
></line><line
class="cls-7"
x1="663.66"
y1="916.86"
x2="663.66"
y2="840.45"
></line><circle
class="cls-8"
cx="644.99"
cy="878.66"
r="10.7"
></circle><circle
class="cls-8"
cx="644.99"
cy="1171.55"
r="10.7"
></circle><circle
class="cls-9"
cx="644.99"
cy="878.66"
r="10.7"
></circle><circle
class="cls-9"
cx="644.99"
cy="1171.55"
r="10.7"
></circle><path
class="cls-10"
d="M1225,1237.05l2.23,11.19a4.25,4.25,0,0,0,4.17,3.42H1249a4.26,4.26,0,0,0,4.18-3.42l2.22-11.19"
></path><path
class="cls-10"
d="M1306.87,1237.05l2.22,11.19a4.26,4.26,0,0,0,4.18,3.42h17.62a4.25,4.25,0,0,0,4.17-3.42l2.22-11.19"
></path><path
class="cls-10"
d="M1388.77,1237.05l2.23,11.19a4.24,4.24,0,0,0,4.17,3.42h17.62a4.25,4.25,0,0,0,4.17-3.42l2.23-11.19"
></path><path
class="cls-4"
d="M1225,1237.05l2.23,11.19a4.25,4.25,0,0,0,4.17,3.42H1249a4.26,4.26,0,0,0,4.18-3.42l2.22-11.19"
></path><path
class="cls-4"
d="M1306.87,1237.05l2.22,11.19a4.26,4.26,0,0,0,4.18,3.42h17.62a4.25,4.25,0,0,0,4.17-3.42l2.22-11.19"
></path><path
class="cls-4"
d="M1388.77,1237.05l2.23,11.19a4.24,4.24,0,0,0,4.17,3.42h17.62a4.25,4.25,0,0,0,4.17-3.42l2.23-11.19"
></path><line
class="cls-4"
x1="1412.9"
y1="807.26"
x2="1412.9"
y2="1237.05"
></line></g>
</svg>

After

Width:  |  Height:  |  Size: 5.0 KiB

@@ -0,0 +1,221 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="479.87 739.66 1073.46 452.36">
<defs><style>
.cls-1 {
fill: #e8eae8;
}
.cls-2 {
fill: #2b2b2b;
}
.cls-3, .cls-5, .cls-7, .cls-8 {
fill: none;
stroke-miterlimit: 10;
}
.cls-3, .cls-5 {
stroke: #050606;
}
.cls-3, .cls-7 {
stroke-width: 2.44px;
}
.cls-4 {
fill: #cbcccb;
}
.cls-5 {
stroke-width: 1.73px;
}
.cls-6 {
fill: #434543;
}
.cls-7, .cls-8 {
stroke: #b7b7b7;
}
.cls-8 {
stroke-width: 1.22px;
}
.cls-9 {
fill: #dbdddb;
}
.cls-10 {
fill: #b7b7b7;
}
</style></defs><g id="Layer_4" data-name="Layer 4"><rect
class="cls-1"
x="541.37"
y="740.89"
width="950.47"
height="441.77"
></rect><path
class="cls-2"
d="M1511.86,740.89h-20V907.47h13.88a4.83,4.83,0,1,1,0,9.65h-13.88v87h13.88a4.82,4.82,0,0,1,4.82,4.83,4.81,4.81,0,0,1-4.82,4.82h-13.88v168.83h20a40.25,40.25,0,0,0,40.25-40.25V781.15A40.25,40.25,0,0,0,1511.86,740.89Zm22.9,400.64a10.68,10.68,0,0,1-21.36,0v-17.4a10.68,10.68,0,1,1,21.36,0Zm0-343.24a10.68,10.68,0,1,1-21.36,0v-17.4a10.68,10.68,0,0,1,21.36,0Z"
></path><path
class="cls-3"
d="M1532.09,740.89h20a0,0,0,0,1,0,0v441.77a0,0,0,0,1,0,0h-20a40.25,40.25,0,0,1-40.25-40.25V781.14a40.25,40.25,0,0,1,40.25-40.25Z"
transform="translate(3043.95 1923.54) rotate(-180)"
></path><path
class="cls-4"
d="M1508.36,780.88V798.3a15.89,15.89,0,0,0,31.78,0V780.88a15.89,15.89,0,1,0-31.78,0Zm5,0a10.68,10.68,0,0,1,21.36,0v17.4a10.68,10.68,0,1,1-21.36,0Z"
></path><path
class="cls-4"
d="M1508.36,1124.11v17.42a15.89,15.89,0,1,0,31.78,0v-17.42a15.89,15.89,0,0,0-31.78,0Zm5,0a10.68,10.68,0,1,1,21.36,0v17.4a10.68,10.68,0,0,1-21.36,0Z"
></path><rect
class="cls-5"
x="1513.41"
y="770.21"
width="21.36"
height="38.76"
rx="10.68"
transform="translate(3048.18 1579.19) rotate(-180)"
></rect><rect
class="cls-5"
x="1508.36"
y="764.99"
width="31.78"
height="49.2"
rx="15.89"
transform="translate(3048.5 1579.18) rotate(-180)"
></rect><rect
class="cls-5"
x="1513.41"
y="1113.44"
width="21.36"
height="38.76"
rx="10.68"
transform="translate(3048.18 2265.65) rotate(-180)"
></rect><rect
class="cls-5"
x="1508.36"
y="1108.22"
width="31.78"
height="49.2"
rx="15.89"
transform="translate(3048.5 2265.65) rotate(-180)"
></rect><path
class="cls-4"
d="M1513.13,912.3a6.95,6.95,0,0,1-7,7h-14.33v-2.15h13.88a4.83,4.83,0,0,0,0-9.65h-13.88v-2.14h14.33A7,7,0,0,1,1513.13,912.3Z"
></path><path
class="cls-4"
d="M1513.13,1009a6.95,6.95,0,0,1-7,7h-14.33v-2.15h13.88a4.83,4.83,0,0,0,0-9.65h-13.88V1002h14.33A7,7,0,0,1,1513.13,1009Z"
></path><path
class="cls-2"
d="M521.33,740.89a40.26,40.26,0,0,0-40.25,40.26V1142.4a40.26,40.26,0,0,0,40.25,40.25h20V740.89Zm-1.53,400.64a10.68,10.68,0,0,1-21.36,0v-17.4a10.68,10.68,0,1,1,21.36,0ZM498.44,780.89a10.68,10.68,0,0,1,21.36,0v17.4a10.68,10.68,0,1,1-21.36,0Z"
></path><rect
class="cls-3"
x="541.37"
y="740.89"
width="950.47"
height="441.77"
></rect><path
class="cls-3"
d="M521.34,740.89h20a0,0,0,0,1,0,0v441.77a0,0,0,0,1,0,0h-20a40.25,40.25,0,0,1-40.25-40.25V781.14A40.25,40.25,0,0,1,521.34,740.89Z"
></path><path
class="cls-4"
d="M520.19,769.64a15.9,15.9,0,0,0-27.13,11.24V798.3a15.89,15.89,0,0,0,31.78,0V780.88A15.87,15.87,0,0,0,520.19,769.64Zm-.39,28.65a10.68,10.68,0,1,1-21.36,0v-17.4a10.68,10.68,0,0,1,21.36,0Z"
></path><path
class="cls-4"
d="M520.19,1112.88a15.89,15.89,0,0,0-27.13,11.23v17.42a15.89,15.89,0,1,0,31.78,0v-17.42A15.85,15.85,0,0,0,520.19,1112.88Zm-.39,28.65a10.68,10.68,0,0,1-21.36,0v-17.4a10.68,10.68,0,1,1,21.36,0Z"
></path><rect
class="cls-5"
x="498.43"
y="770.21"
width="21.36"
height="38.76"
rx="10.68"
></rect><rect
class="cls-5"
x="493.06"
y="764.99"
width="31.78"
height="49.2"
rx="15.89"
></rect><rect
class="cls-5"
x="498.43"
y="1113.44"
width="21.36"
height="38.76"
rx="10.68"
></rect><rect
class="cls-5"
x="493.06"
y="1108.22"
width="31.78"
height="49.2"
rx="15.89"
></rect><rect
class="cls-4"
x="501.66"
y="859.82"
width="14.3"
height="198.79"
rx="7.15"
></rect><rect
class="cls-5"
x="501.66"
y="859.82"
width="14.3"
height="198.79"
rx="7.15"
></rect><path
class="cls-6"
d="M528.29,869.68h13.07a0,0,0,0,1,0,0v179.06a0,0,0,0,1,0,0H528.29a3.45,3.45,0,0,1-3.45-3.45V873.13A3.45,3.45,0,0,1,528.29,869.68Z"
></path><path
class="cls-5"
d="M528.29,869.68h13.07a0,0,0,0,1,0,0v179.06a0,0,0,0,1,0,0H528.29a3.45,3.45,0,0,1-3.45-3.45V873.13A3.45,3.45,0,0,1,528.29,869.68Z"
></path><path
class="cls-6"
d="M1213.75,1182.65h22.83a0,0,0,0,1,0,0v6.15a2,2,0,0,1-2,2h-18.8a2,2,0,0,1-2-2v-6.15A0,0,0,0,1,1213.75,1182.65Z"
></path><path
class="cls-6"
d="M1297.35,1182.65h22.83a0,0,0,0,1,0,0v6.15a2,2,0,0,1-2,2h-18.8a2,2,0,0,1-2-2v-6.15A0,0,0,0,1,1297.35,1182.65Z"
></path><path
class="cls-6"
d="M1381,1182.65h22.83a0,0,0,0,1,0,0v6.15a2,2,0,0,1-2,2H1383a2,2,0,0,1-2-2v-6.15A0,0,0,0,1,1381,1182.65Z"
></path><path
class="cls-3"
d="M1213.75,1182.65h22.83a0,0,0,0,1,0,0v6.15a2,2,0,0,1-2,2h-18.8a2,2,0,0,1-2-2v-6.15A0,0,0,0,1,1213.75,1182.65Z"
></path><path
class="cls-3"
d="M1297.35,1182.65h22.83a0,0,0,0,1,0,0v6.15a2,2,0,0,1-2,2h-18.8a2,2,0,0,1-2-2v-6.15A0,0,0,0,1,1297.35,1182.65Z"
></path><path
class="cls-3"
d="M1381,1182.65h22.83a0,0,0,0,1,0,0v6.15a2,2,0,0,1-2,2H1383a2,2,0,0,1-2-2v-6.15A0,0,0,0,1,1381,1182.65Z"
></path><path
class="cls-7"
d="M1465.76,777.61v370.21H637.27V831.44a9.18,9.18,0,0,0-9.18-9.18H605.76a4.34,4.34,0,0,1-4.34-4.33V782a4.34,4.34,0,0,1,4.34-4.34Z"
></path><line
class="cls-8"
x1="637.28"
y1="831.44"
x2="637.28"
y2="777.61"
></line><path
class="cls-9"
d="M1472.8,766.19H588.58a2.34,2.34,0,0,0-2.34,2.34v63.55a2.34,2.34,0,0,0,2.34,2.34h29.94a4.74,4.74,0,0,1,4.74,4.74v312.71a5.55,5.55,0,0,0,5.57,5.55h844a4.87,4.87,0,0,0,4.88-4.87V771.07A4.87,4.87,0,0,0,1472.8,766.19Zm-7,381.63H637.27V831.44a9.18,9.18,0,0,0-9.18-9.18H605.76a4.34,4.34,0,0,1-4.34-4.33V782a4.34,4.34,0,0,1,4.34-4.34h860Z"
></path><circle
class="cls-4"
cx="620.54"
cy="798.13"
r="8.42"
></circle><circle
class="cls-7"
cx="620.54"
cy="798.13"
r="8.42"
></circle><rect
class="cls-10"
x="564.75"
y="905.43"
width="11.84"
height="114.57"
rx="2.32"
></rect><rect
class="cls-5"
x="564.75"
y="905.43"
width="11.84"
height="114.57"
rx="2.32"
></rect><path
class="cls-8"
d="M1472.8,766.19H588.58a2.34,2.34,0,0,0-2.34,2.34v63.55a2.34,2.34,0,0,0,2.34,2.34h29.94a4.74,4.74,0,0,1,4.74,4.74v312.71a5.55,5.55,0,0,0,5.57,5.55h844a4.87,4.87,0,0,0,4.88-4.87V771.07A4.87,4.87,0,0,0,1472.8,766.19Zm-7,381.63H637.27V831.44a9.18,9.18,0,0,0-9.18-9.18H605.76a4.34,4.34,0,0,1-4.34-4.33V782a4.34,4.34,0,0,1,4.34-4.34h860Z"
></path></g>
</svg>

After

Width:  |  Height:  |  Size: 7.4 KiB

@@ -0,0 +1,213 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="479.57 786.58 1040.84 433.17">
<defs><style>
.cls-1 {
fill: #cccccb;
}
.cls-2 {
fill: #2b2b2b;
}
.cls-3, .cls-6, .cls-7, .cls-8 {
fill: none;
stroke-miterlimit: 10;
}
.cls-3, .cls-6, .cls-7 {
stroke: #050606;
}
.cls-3, .cls-8 {
stroke-width: 1.65px;
}
.cls-4 {
fill: #40403f;
}
.cls-5 {
fill: #ddd;
}
.cls-6 {
stroke-width: 1.62px;
}
.cls-7 {
stroke-width: 1.64px;
}
.cls-8 {
stroke: #fff;
}
.cls-9 {
fill: #353535;
}
.cls-10 {
fill: #c08c2d;
}
</style></defs><g id="Layer_4" data-name="Layer 4"><path
class="cls-1"
d="M595,923.44H519.6A10.46,10.46,0,0,1,509.14,913V802.7a15.28,15.28,0,0,1,15.28-15.28h979.89a15.29,15.29,0,0,1,15.29,15.29v400.93a15.3,15.3,0,0,1-15.29,15.29H524.42a15.28,15.28,0,0,1-15.28-15.28V1102.1a10.46,10.46,0,0,1,10.46-10.46H595"
></path><rect
class="cls-2"
x="611.37"
y="796.48"
width="819.83"
height="411.47"
></rect><line
class="cls-3"
x1="1441.99"
y1="787.41"
x2="1441.99"
y2="1218.92"
></line><path
class="cls-4"
d="M620.91,851.7v302.78a1.87,1.87,0,0,1-1.87,1.87h-13.8a8.7,8.7,0,0,1-.89,0,10.23,10.23,0,0,1-9.35-10.2v-286a10.24,10.24,0,0,1,9.35-10.2,8.7,8.7,0,0,1,.89,0H619A1.87,1.87,0,0,1,620.91,851.7Z"
></path><rect
class="cls-5"
x="480.4"
y="942.42"
width="114.6"
height="127.58"
></rect><rect
class="cls-3"
x="480.4"
y="942.42"
width="114.6"
height="127.58"
></rect><path
class="cls-6"
d="M595,923.44H519.6A10.46,10.46,0,0,1,509.14,913V802.7a15.28,15.28,0,0,1,15.28-15.28h979.89a15.29,15.29,0,0,1,15.29,15.29v400.93a15.3,15.3,0,0,1-15.29,15.29H524.42a15.28,15.28,0,0,1-15.28-15.28V1102.1a10.46,10.46,0,0,1,10.46-10.46H595"
></path><path
class="cls-2"
d="M584.65,970.14H595a0,0,0,0,1,0,0v24.44a0,0,0,0,1,0,0H584.65a3,3,0,0,1-3-3V973.11A3,3,0,0,1,584.65,970.14Z"
></path><rect
class="cls-2"
x="560.58"
y="976.5"
width="9.04"
height="16.58"
rx="2.72"
></rect><path
class="cls-2"
d="M584.65,1026.63H595a0,0,0,0,1,0,0v24.44a0,0,0,0,1,0,0H584.65a3,3,0,0,1-3-3v-18.49A3,3,0,0,1,584.65,1026.63Z"
></path><rect
class="cls-2"
x="560.58"
y="1028.91"
width="9.04"
height="16.58"
rx="2.72"
></rect><path
class="cls-3"
d="M584.65,970.14H595a0,0,0,0,1,0,0v24.44a0,0,0,0,1,0,0H584.65a3,3,0,0,1-3-3V973.11A3,3,0,0,1,584.65,970.14Z"
></path><rect
class="cls-3"
x="560.58"
y="976.5"
width="9.04"
height="16.58"
rx="2.72"
></rect><path
class="cls-3"
d="M584.65,1026.63H595a0,0,0,0,1,0,0v24.44a0,0,0,0,1,0,0H584.65a3,3,0,0,1-3-3v-18.49A3,3,0,0,1,584.65,1026.63Z"
></path><rect
class="cls-3"
x="560.58"
y="1028.91"
width="9.04"
height="16.58"
rx="2.72"
></rect><polyline
class="cls-7"
points="611.37 1156.35 611.37 1207.95 1431.2 1207.95 1431.2 796.48 611.37 796.48 611.37 849.83"
></polyline><line
class="cls-3"
x1="611.37"
y1="1207.95"
x2="611.37"
y2="1218.93"
></line><line
class="cls-3"
x1="611.37"
y1="796.48"
x2="611.37"
y2="787.42"
></line><rect
class="cls-8"
x="560.58"
y="1107.17"
width="18.37"
height="41.67"
rx="4.91"
></rect><rect
class="cls-8"
x="528.51"
y="1107.17"
width="18.37"
height="41.67"
rx="4.91"
></rect><rect
class="cls-8"
x="560.58"
y="1166.28"
width="18.37"
height="41.67"
rx="4.91"
></rect><rect
class="cls-8"
x="528.51"
y="1166.28"
width="18.37"
height="41.67"
rx="4.91"
></rect><rect
class="cls-8"
x="560.58"
y="804.46"
width="18.37"
height="41.67"
rx="4.91"
></rect><rect
class="cls-8"
x="528.51"
y="804.46"
width="18.37"
height="41.67"
rx="4.91"
></rect><rect
class="cls-8"
x="560.58"
y="863.57"
width="18.37"
height="41.67"
rx="4.91"
></rect><rect
class="cls-8"
x="528.51"
y="863.57"
width="18.37"
height="41.67"
rx="4.91"
></rect><circle
class="cls-8"
cx="1476.63"
cy="831.74"
r="27.15"
></circle><circle
class="cls-8"
cx="1476.63"
cy="1173.49"
r="27.15"
></circle><rect
class="cls-9"
x="676.15"
y="804.6"
width="742.79"
height="396.03"
></rect><path
class="cls-10"
d="M604.35,849.87v306.44a10.23,10.23,0,0,1-9.35-10.2v-286A10.24,10.24,0,0,1,604.35,849.87Z"
></path><path
class="cls-3"
d="M605.24,849.83H619a1.87,1.87,0,0,1,1.87,1.87v302.78a1.87,1.87,0,0,1-1.87,1.87h-13.8A10.24,10.24,0,0,1,595,1146.11v-286A10.24,10.24,0,0,1,605.24,849.83Z"
></path><rect
class="cls-6"
x="676.15"
y="804.6"
width="742.79"
height="396.03"
></rect></g>
</svg>

After

Width:  |  Height:  |  Size: 5.2 KiB

@@ -0,0 +1,510 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="505.33 784.55 1040.95 426.95">
<defs><style>
.cls-1 {
fill: #e8eae8;
}
.cls-2 {
fill: #c5c9c9;
}
.cls-3 {
fill: #d3d3d3;
}
.cls-4 {
fill: #c6842a;
}
.cls-5 {
fill: #353535;
}
.cls-6 {
fill: #dbdddb;
}
.cls-11, .cls-12, .cls-13, .cls-15, .cls-7, .cls-8 {
fill: none;
stroke-miterlimit: 10;
}
.cls-12, .cls-13, .cls-7, .cls-8 {
stroke: #050606;
}
.cls-7 {
stroke-width: 2.44px;
}
.cls-11, .cls-15, .cls-8 {
stroke-width: 1.22px;
}
.cls-9 {
fill: #ffe091;
}
.cls-10 {
fill: #cbcccb;
}
.cls-11 {
stroke: #b7b7b7;
}
.cls-12 {
stroke-width: 2.36px;
}
.cls-13 {
stroke-width: 1.25px;
}
.cls-14 {
fill: #050606;
}
.cls-15 {
stroke: #ffe091;
stroke-linecap: round;
}
</style></defs><g id="Layer_4" data-name="Layer 4"><path
class="cls-1"
d="M1421.48,785.78h91.06A22.44,22.44,0,0,1,1535,808.22v379.61a22.45,22.45,0,0,1-22.44,22.45h-91.06"
></path><rect
class="cls-2"
x="1435.08"
y="1005.05"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-2"
x="1494.51"
y="1005.05"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-2"
x="1435.08"
y="1128.44"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-2"
x="1494.51"
y="1128.44"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-3"
x="506.55"
y="858.91"
width="88.59"
height="276.51"
></rect><rect
class="cls-1"
x="579.58"
y="785.78"
width="191.61"
height="424.5"
></rect><path
class="cls-1"
d="M595.13,1210.27H528.66a22.1,22.1,0,0,1-22.11-22.11v-65.81l52.68-22.79-1.8-192.37L506.55,884V807.9a22.11,22.11,0,0,1,22.11-22.12h66.47Z"
></path><path
class="cls-4"
d="M595.13,901.4H571.68a20,20,0,0,0-13.93,5.48,58.89,58.89,0,0,1-20,12.61,7,7,0,0,0-4.53,6.57v153a7,7,0,0,0,4.53,6.57,58.89,58.89,0,0,1,20,12.61,20,20,0,0,0,13.93,5.49h23.45"
></path><path
class="cls-5"
d="M1535,1014.12h5.26a4.8,4.8,0,0,1,4.8,4.8v104.72a4.8,4.8,0,0,1-4.8,4.8H1535a0,0,0,0,1,0,0V1014.12A0,0,0,0,1,1535,1014.12Z"
></path><path
class="cls-6"
d="M1429.58,785.78v424.49H632.82V1097.4a4.66,4.66,0,0,1,4.67-4.65h28.16a11.68,11.68,0,0,0,11.67-11.68V916.93a12.75,12.75,0,0,0-12.24-12.74l-27.79-7.41a4.66,4.66,0,0,1-4.47-4.64V785.78Z"
></path><path
class="cls-7"
d="M557.43,907.19,506.55,884V807.9a22.11,22.11,0,0,1,22.11-22.12h66.47"
></path><path
class="cls-7"
d="M559.23,1099.56l-52.68,22.79v65.81a22.1,22.1,0,0,0,22.11,22.11h66.47"
></path><path
class="cls-2"
d="M529.59,841.87h22.9a5.13,5.13,0,0,0,4.43-2.56l11.45-19.83a5.12,5.12,0,0,0,0-5.11l-11.45-19.83a5.13,5.13,0,0,0-4.43-2.56h-22.9a5.11,5.11,0,0,0-4.42,2.56l-11.45,19.83a5.08,5.08,0,0,0,0,5.11l11.45,19.83A5.11,5.11,0,0,0,529.59,841.87Z"
></path><path
class="cls-8"
d="M529.59,841.87h22.9a5.13,5.13,0,0,0,4.43-2.56l11.45-19.83a5.12,5.12,0,0,0,0-5.11l-11.45-19.83a5.13,5.13,0,0,0-4.43-2.56h-22.9a5.11,5.11,0,0,0-4.42,2.56l-11.45,19.83a5.08,5.08,0,0,0,0,5.11l11.45,19.83A5.11,5.11,0,0,0,529.59,841.87Z"
></path><circle
class="cls-9"
cx="541.04"
cy="816.93"
r="14.1"
></circle><circle
class="cls-8"
cx="541.04"
cy="816.93"
r="14.1"
></circle><path
class="cls-2"
d="M529.59,1202h22.9a5.12,5.12,0,0,0,4.43-2.55l11.45-19.83a5.12,5.12,0,0,0,0-5.11l-11.45-19.84a5.12,5.12,0,0,0-4.43-2.55h-22.9a5.1,5.1,0,0,0-4.42,2.55l-11.45,19.84a5.08,5.08,0,0,0,0,5.11l11.45,19.83A5.1,5.1,0,0,0,529.59,1202Z"
></path><path
class="cls-8"
d="M529.59,1202h22.9a5.12,5.12,0,0,0,4.43-2.55l11.45-19.83a5.12,5.12,0,0,0,0-5.11l-11.45-19.84a5.12,5.12,0,0,0-4.43-2.55h-22.9a5.1,5.1,0,0,0-4.42,2.55l-11.45,19.84a5.08,5.08,0,0,0,0,5.11l11.45,19.83A5.1,5.1,0,0,0,529.59,1202Z"
></path><circle
class="cls-9"
cx="541.04"
cy="1177.09"
r="14.1"
></circle><circle
class="cls-8"
cx="541.04"
cy="1177.09"
r="14.1"
></circle><path
class="cls-2"
d="M1494.14,841.87H1517a5.11,5.11,0,0,0,4.42-2.56l11.45-19.83a5.08,5.08,0,0,0,0-5.11l-11.45-19.83A5.11,5.11,0,0,0,1517,792h-22.9a5.13,5.13,0,0,0-4.43,2.56l-11.45,19.83a5.12,5.12,0,0,0,0,5.11l11.45,19.83A5.13,5.13,0,0,0,1494.14,841.87Z"
></path><path
class="cls-8"
d="M1494.14,841.87H1517a5.11,5.11,0,0,0,4.42-2.56l11.45-19.83a5.08,5.08,0,0,0,0-5.11l-11.45-19.83A5.11,5.11,0,0,0,1517,792h-22.9a5.13,5.13,0,0,0-4.43,2.56l-11.45,19.83a5.12,5.12,0,0,0,0,5.11l11.45,19.83A5.13,5.13,0,0,0,1494.14,841.87Z"
></path><circle
class="cls-9"
cx="1505.59"
cy="816.93"
r="14.1"
></circle><circle
class="cls-8"
cx="1505.59"
cy="816.93"
r="14.1"
></circle><path
class="cls-2"
d="M1494.14,1202H1517a5.1,5.1,0,0,0,4.42-2.55l11.45-19.83a5.08,5.08,0,0,0,0-5.11l-11.45-19.84a5.1,5.1,0,0,0-4.42-2.55h-22.9a5.12,5.12,0,0,0-4.43,2.55l-11.45,19.84a5.12,5.12,0,0,0,0,5.11l11.45,19.83A5.12,5.12,0,0,0,1494.14,1202Z"
></path><path
class="cls-8"
d="M1494.14,1202H1517a5.1,5.1,0,0,0,4.42-2.55l11.45-19.83a5.08,5.08,0,0,0,0-5.11l-11.45-19.84a5.1,5.1,0,0,0-4.42-2.55h-22.9a5.12,5.12,0,0,0-4.43,2.55l-11.45,19.84a5.12,5.12,0,0,0,0,5.11l11.45,19.83A5.12,5.12,0,0,0,1494.14,1202Z"
></path><circle
class="cls-9"
cx="1505.59"
cy="1177.09"
r="14.1"
></circle><circle
class="cls-8"
cx="1505.59"
cy="1177.09"
r="14.1"
></circle><path
class="cls-1"
d="M1412.61,816.13v360.16h-755a2.5,2.5,0,0,1-2.51-2.5v-64.32a2.5,2.5,0,0,1,2.51-2.5h30.47a12.81,12.81,0,0,0,12.81-12.82V894.25a12.81,12.81,0,0,0-12.81-12.82H657.58a2.5,2.5,0,0,1-2.51-2.5V818.64a2.51,2.51,0,0,1,2.51-2.51Z"
></path><circle
class="cls-10"
cx="672.06"
cy="1154.92"
r="8.89"
></circle><circle
class="cls-11"
cx="672.06"
cy="1154.92"
r="8.89"
></circle><circle
class="cls-10"
cx="672.06"
cy="838.98"
r="8.89"
></circle><circle
class="cls-11"
cx="672.06"
cy="838.98"
r="8.89"
></circle><line
class="cls-7"
x1="506.55"
y1="884.01"
x2="506.55"
y2="1122.35"
></line><path
class="cls-12"
d="M595.13,901.4H571.68a20,20,0,0,0-13.93,5.48,58.89,58.89,0,0,1-20,12.61,7,7,0,0,0-4.53,6.57v153a7,7,0,0,0,4.53,6.57,58.89,58.89,0,0,1,20,12.61,20,20,0,0,0,13.93,5.49h23.45"
></path><rect
class="cls-2"
x="621.34"
y="935.2"
width="11.49"
height="113.49"
></rect><rect
class="cls-13"
x="621.34"
y="935.2"
width="11.49"
height="113.49"
></rect><rect
class="cls-1"
x="712.79"
y="826.99"
width="685.79"
height="336.38"
></rect><path
class="cls-7"
d="M1421.48,785.78h91.06A22.44,22.44,0,0,1,1535,808.22v379.61a22.45,22.45,0,0,1-22.44,22.45h-91.06"
></path><rect
class="cls-8"
x="1435.08"
y="1005.05"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-8"
x="1494.51"
y="1005.05"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-8"
x="1435.08"
y="1128.44"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-8"
x="1494.51"
y="1128.44"
width="26.44"
height="11.33"
rx="5.67"
></rect><path
class="cls-7"
d="M1535,1014.12h5.26a4.8,4.8,0,0,1,4.8,4.8v104.72a4.8,4.8,0,0,1-4.8,4.8H1535a0,0,0,0,1,0,0V1014.12A0,0,0,0,1,1535,1014.12Z"
></path><circle
class="cls-14"
cx="1453.85"
cy="1032.4"
r="5.56"
></circle><circle
class="cls-14"
cx="1453.85"
cy="1114.38"
r="5.56"
></circle><line
class="cls-11"
x1="688.05"
y1="1106.97"
x2="688.05"
y2="1176.29"
></line><line
class="cls-11"
x1="688.05"
y1="881.43"
x2="688.05"
y2="816.13"
></line><rect
class="cls-11"
x="712.79"
y="826.99"
width="685.79"
height="336.38"
></rect><line
class="cls-15"
x1="538.46"
y1="928.91"
x2="568.22"
y2="928.91"
></line><line
class="cls-15"
x1="538.46"
y1="933.4"
x2="568.22"
y2="933.4"
></line><line
class="cls-15"
x1="538.46"
y1="937.89"
x2="568.22"
y2="937.89"
></line><line
class="cls-15"
x1="538.46"
y1="942.37"
x2="568.22"
y2="942.37"
></line><line
class="cls-15"
x1="538.46"
y1="946.86"
x2="568.22"
y2="946.86"
></line><line
class="cls-15"
x1="538.46"
y1="951.35"
x2="568.22"
y2="951.35"
></line><line
class="cls-15"
x1="538.46"
y1="955.83"
x2="568.22"
y2="955.83"
></line><line
class="cls-15"
x1="538.46"
y1="960.32"
x2="568.22"
y2="960.32"
></line><line
class="cls-15"
x1="538.46"
y1="964.81"
x2="568.22"
y2="964.81"
></line><line
class="cls-15"
x1="538.46"
y1="969.29"
x2="568.22"
y2="969.29"
></line><line
class="cls-15"
x1="538.46"
y1="973.78"
x2="568.22"
y2="973.78"
></line><line
class="cls-15"
x1="538.46"
y1="978.26"
x2="568.22"
y2="978.26"
></line><line
class="cls-15"
x1="538.46"
y1="982.75"
x2="568.22"
y2="982.75"
></line><line
class="cls-15"
x1="538.46"
y1="987.24"
x2="568.22"
y2="987.24"
></line><line
class="cls-15"
x1="538.46"
y1="991.72"
x2="568.22"
y2="991.72"
></line><line
class="cls-15"
x1="538.46"
y1="996.21"
x2="568.22"
y2="996.21"
></line><line
class="cls-15"
x1="538.46"
y1="1000.7"
x2="568.22"
y2="1000.7"
></line><line
class="cls-15"
x1="538.46"
y1="1005.18"
x2="568.22"
y2="1005.18"
></line><line
class="cls-15"
x1="538.46"
y1="1009.67"
x2="568.22"
y2="1009.67"
></line><line
class="cls-15"
x1="538.46"
y1="1014.16"
x2="568.22"
y2="1014.16"
></line><line
class="cls-15"
x1="538.46"
y1="1018.64"
x2="568.22"
y2="1018.64"
></line><line
class="cls-15"
x1="538.46"
y1="1023.13"
x2="568.22"
y2="1023.13"
></line><line
class="cls-15"
x1="538.46"
y1="1027.62"
x2="568.22"
y2="1027.62"
></line><line
class="cls-15"
x1="538.46"
y1="1032.1"
x2="568.22"
y2="1032.1"
></line><line
class="cls-15"
x1="538.46"
y1="1036.59"
x2="568.22"
y2="1036.59"
></line><line
class="cls-15"
x1="538.46"
y1="1041.08"
x2="568.22"
y2="1041.08"
></line><line
class="cls-15"
x1="538.46"
y1="1045.56"
x2="568.22"
y2="1045.56"
></line><line
class="cls-15"
x1="538.46"
y1="1050.05"
x2="568.22"
y2="1050.05"
></line><line
class="cls-15"
x1="538.46"
y1="1054.53"
x2="568.22"
y2="1054.53"
></line><line
class="cls-15"
x1="538.46"
y1="1059.02"
x2="568.22"
y2="1059.02"
></line><line
class="cls-15"
x1="538.46"
y1="1063.51"
x2="568.22"
y2="1063.51"
></line><line
class="cls-15"
x1="538.46"
y1="1067.99"
x2="568.22"
y2="1067.99"
></line><line
class="cls-15"
x1="538.46"
y1="1072.48"
x2="568.22"
y2="1072.48"
></line><line
class="cls-15"
x1="538.46"
y1="1076.97"
x2="568.22"
y2="1076.97"
></line><path
class="cls-11"
d="M632.82,1210.27V1097.4a4.66,4.66,0,0,1,4.67-4.65h28.16a11.68,11.68,0,0,0,11.67-11.68V916.93c0-6.85-5.05-10.17-12.24-12.74l-27.79-7.41a4.66,4.66,0,0,1-4.47-4.64V785.78"
></path><path
class="cls-11"
d="M1412.61,816.13v360.16h-755a2.5,2.5,0,0,1-2.51-2.5v-64.32a2.5,2.5,0,0,1,2.51-2.5h30.47a12.81,12.81,0,0,0,12.81-12.82V894.25a12.81,12.81,0,0,0-12.81-12.82H657.58a2.5,2.5,0,0,1-2.51-2.5V818.64a2.51,2.51,0,0,1,2.51-2.51Z"
></path><polyline
class="cls-7"
points="632.82 785.77 1429.58 785.77 1429.58 1210.27 632.82 1210.27"
></polyline><polyline
class="cls-7"
points="632.82 1210.27 595.13 1210.27 595.13 785.77 632.82 785.77"
></polyline></g>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

@@ -0,0 +1,510 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="505.33 784.55 1040.95 426.95">
<defs><style>
.cls-1 {
fill: #e8eae8;
}
.cls-2 {
fill: #c5c9c9;
}
.cls-3 {
fill: #d3d3d3;
}
.cls-4 {
fill: #c6842a;
}
.cls-5 {
fill: #353535;
}
.cls-6 {
fill: #dbdddb;
}
.cls-11, .cls-12, .cls-13, .cls-15, .cls-7, .cls-8 {
fill: none;
stroke-miterlimit: 10;
}
.cls-12, .cls-13, .cls-7, .cls-8 {
stroke: #050606;
}
.cls-7 {
stroke-width: 2.44px;
}
.cls-11, .cls-15, .cls-8 {
stroke-width: 1.22px;
}
.cls-9 {
fill: #ffe091;
}
.cls-10 {
fill: #cbcccb;
}
.cls-11 {
stroke: #b7b7b7;
}
.cls-12 {
stroke-width: 2.36px;
}
.cls-13 {
stroke-width: 1.25px;
}
.cls-14 {
fill: #050606;
}
.cls-15 {
stroke: #ffe091;
stroke-linecap: round;
}
</style></defs><g id="Layer_4" data-name="Layer 4"><path
class="cls-1"
d="M1421.48,785.78h91.06A22.44,22.44,0,0,1,1535,808.22v379.61a22.45,22.45,0,0,1-22.44,22.45h-91.06"
></path><rect
class="cls-2"
x="1435.08"
y="1005.05"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-2"
x="1494.51"
y="1005.05"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-2"
x="1435.08"
y="1128.44"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-2"
x="1494.51"
y="1128.44"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-3"
x="506.55"
y="858.91"
width="88.59"
height="276.51"
></rect><rect
class="cls-1"
x="579.58"
y="785.78"
width="191.61"
height="424.5"
></rect><path
class="cls-1"
d="M595.13,1210.27H528.66a22.1,22.1,0,0,1-22.11-22.11v-65.81l52.68-22.79-1.8-192.37L506.55,884V807.9a22.11,22.11,0,0,1,22.11-22.12h66.47Z"
></path><path
class="cls-4"
d="M595.13,901.4H571.68a20,20,0,0,0-13.93,5.48,58.89,58.89,0,0,1-20,12.61,7,7,0,0,0-4.53,6.57v153a7,7,0,0,0,4.53,6.57,58.89,58.89,0,0,1,20,12.61,20,20,0,0,0,13.93,5.49h23.45"
></path><path
class="cls-5"
d="M1535,1014.12h5.26a4.8,4.8,0,0,1,4.8,4.8v104.72a4.8,4.8,0,0,1-4.8,4.8H1535a0,0,0,0,1,0,0V1014.12A0,0,0,0,1,1535,1014.12Z"
></path><path
class="cls-6"
d="M1429.58,785.78v424.49H632.82V1097.4a4.66,4.66,0,0,1,4.67-4.65h28.16a11.68,11.68,0,0,0,11.67-11.68V916.93a12.75,12.75,0,0,0-12.24-12.74l-27.79-7.41a4.66,4.66,0,0,1-4.47-4.64V785.78Z"
></path><path
class="cls-7"
d="M557.43,907.19,506.55,884V807.9a22.11,22.11,0,0,1,22.11-22.12h66.47"
></path><path
class="cls-7"
d="M559.23,1099.56l-52.68,22.79v65.81a22.1,22.1,0,0,0,22.11,22.11h66.47"
></path><path
class="cls-2"
d="M529.59,841.87h22.9a5.13,5.13,0,0,0,4.43-2.56l11.45-19.83a5.12,5.12,0,0,0,0-5.11l-11.45-19.83a5.13,5.13,0,0,0-4.43-2.56h-22.9a5.11,5.11,0,0,0-4.42,2.56l-11.45,19.83a5.08,5.08,0,0,0,0,5.11l11.45,19.83A5.11,5.11,0,0,0,529.59,841.87Z"
></path><path
class="cls-8"
d="M529.59,841.87h22.9a5.13,5.13,0,0,0,4.43-2.56l11.45-19.83a5.12,5.12,0,0,0,0-5.11l-11.45-19.83a5.13,5.13,0,0,0-4.43-2.56h-22.9a5.11,5.11,0,0,0-4.42,2.56l-11.45,19.83a5.08,5.08,0,0,0,0,5.11l11.45,19.83A5.11,5.11,0,0,0,529.59,841.87Z"
></path><circle
class="cls-9"
cx="541.04"
cy="816.93"
r="14.1"
></circle><circle
class="cls-8"
cx="541.04"
cy="816.93"
r="14.1"
></circle><path
class="cls-2"
d="M529.59,1202h22.9a5.12,5.12,0,0,0,4.43-2.55l11.45-19.83a5.12,5.12,0,0,0,0-5.11l-11.45-19.84a5.12,5.12,0,0,0-4.43-2.55h-22.9a5.1,5.1,0,0,0-4.42,2.55l-11.45,19.84a5.08,5.08,0,0,0,0,5.11l11.45,19.83A5.1,5.1,0,0,0,529.59,1202Z"
></path><path
class="cls-8"
d="M529.59,1202h22.9a5.12,5.12,0,0,0,4.43-2.55l11.45-19.83a5.12,5.12,0,0,0,0-5.11l-11.45-19.84a5.12,5.12,0,0,0-4.43-2.55h-22.9a5.1,5.1,0,0,0-4.42,2.55l-11.45,19.84a5.08,5.08,0,0,0,0,5.11l11.45,19.83A5.1,5.1,0,0,0,529.59,1202Z"
></path><circle
class="cls-9"
cx="541.04"
cy="1177.09"
r="14.1"
></circle><circle
class="cls-8"
cx="541.04"
cy="1177.09"
r="14.1"
></circle><path
class="cls-2"
d="M1494.14,841.87H1517a5.11,5.11,0,0,0,4.42-2.56l11.45-19.83a5.08,5.08,0,0,0,0-5.11l-11.45-19.83A5.11,5.11,0,0,0,1517,792h-22.9a5.13,5.13,0,0,0-4.43,2.56l-11.45,19.83a5.12,5.12,0,0,0,0,5.11l11.45,19.83A5.13,5.13,0,0,0,1494.14,841.87Z"
></path><path
class="cls-8"
d="M1494.14,841.87H1517a5.11,5.11,0,0,0,4.42-2.56l11.45-19.83a5.08,5.08,0,0,0,0-5.11l-11.45-19.83A5.11,5.11,0,0,0,1517,792h-22.9a5.13,5.13,0,0,0-4.43,2.56l-11.45,19.83a5.12,5.12,0,0,0,0,5.11l11.45,19.83A5.13,5.13,0,0,0,1494.14,841.87Z"
></path><circle
class="cls-9"
cx="1505.59"
cy="816.93"
r="14.1"
></circle><circle
class="cls-8"
cx="1505.59"
cy="816.93"
r="14.1"
></circle><path
class="cls-2"
d="M1494.14,1202H1517a5.1,5.1,0,0,0,4.42-2.55l11.45-19.83a5.08,5.08,0,0,0,0-5.11l-11.45-19.84a5.1,5.1,0,0,0-4.42-2.55h-22.9a5.12,5.12,0,0,0-4.43,2.55l-11.45,19.84a5.12,5.12,0,0,0,0,5.11l11.45,19.83A5.12,5.12,0,0,0,1494.14,1202Z"
></path><path
class="cls-8"
d="M1494.14,1202H1517a5.1,5.1,0,0,0,4.42-2.55l11.45-19.83a5.08,5.08,0,0,0,0-5.11l-11.45-19.84a5.1,5.1,0,0,0-4.42-2.55h-22.9a5.12,5.12,0,0,0-4.43,2.55l-11.45,19.84a5.12,5.12,0,0,0,0,5.11l11.45,19.83A5.12,5.12,0,0,0,1494.14,1202Z"
></path><circle
class="cls-9"
cx="1505.59"
cy="1177.09"
r="14.1"
></circle><circle
class="cls-8"
cx="1505.59"
cy="1177.09"
r="14.1"
></circle><path
class="cls-1"
d="M1412.61,816.13v360.16h-755a2.5,2.5,0,0,1-2.51-2.5v-64.32a2.5,2.5,0,0,1,2.51-2.5h30.47a12.81,12.81,0,0,0,12.81-12.82V894.25a12.81,12.81,0,0,0-12.81-12.82H657.58a2.5,2.5,0,0,1-2.51-2.5V818.64a2.51,2.51,0,0,1,2.51-2.51Z"
></path><circle
class="cls-10"
cx="672.06"
cy="1154.92"
r="8.89"
></circle><circle
class="cls-11"
cx="672.06"
cy="1154.92"
r="8.89"
></circle><circle
class="cls-10"
cx="672.06"
cy="838.98"
r="8.89"
></circle><circle
class="cls-11"
cx="672.06"
cy="838.98"
r="8.89"
></circle><line
class="cls-7"
x1="506.55"
y1="884.01"
x2="506.55"
y2="1122.35"
></line><path
class="cls-12"
d="M595.13,901.4H571.68a20,20,0,0,0-13.93,5.48,58.89,58.89,0,0,1-20,12.61,7,7,0,0,0-4.53,6.57v153a7,7,0,0,0,4.53,6.57,58.89,58.89,0,0,1,20,12.61,20,20,0,0,0,13.93,5.49h23.45"
></path><rect
class="cls-2"
x="621.34"
y="935.2"
width="11.49"
height="113.49"
></rect><rect
class="cls-13"
x="621.34"
y="935.2"
width="11.49"
height="113.49"
></rect><rect
class="cls-1"
x="712.79"
y="826.99"
width="685.79"
height="336.38"
></rect><path
class="cls-7"
d="M1421.48,785.78h91.06A22.44,22.44,0,0,1,1535,808.22v379.61a22.45,22.45,0,0,1-22.44,22.45h-91.06"
></path><rect
class="cls-8"
x="1435.08"
y="1005.05"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-8"
x="1494.51"
y="1005.05"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-8"
x="1435.08"
y="1128.44"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-8"
x="1494.51"
y="1128.44"
width="26.44"
height="11.33"
rx="5.67"
></rect><path
class="cls-7"
d="M1535,1014.12h5.26a4.8,4.8,0,0,1,4.8,4.8v104.72a4.8,4.8,0,0,1-4.8,4.8H1535a0,0,0,0,1,0,0V1014.12A0,0,0,0,1,1535,1014.12Z"
></path><circle
class="cls-14"
cx="1453.85"
cy="1032.4"
r="5.56"
></circle><circle
class="cls-14"
cx="1453.85"
cy="1114.38"
r="5.56"
></circle><line
class="cls-11"
x1="688.05"
y1="1106.97"
x2="688.05"
y2="1176.29"
></line><line
class="cls-11"
x1="688.05"
y1="881.43"
x2="688.05"
y2="816.13"
></line><rect
class="cls-11"
x="712.79"
y="826.99"
width="685.79"
height="336.38"
></rect><line
class="cls-15"
x1="538.46"
y1="928.91"
x2="568.22"
y2="928.91"
></line><line
class="cls-15"
x1="538.46"
y1="933.4"
x2="568.22"
y2="933.4"
></line><line
class="cls-15"
x1="538.46"
y1="937.89"
x2="568.22"
y2="937.89"
></line><line
class="cls-15"
x1="538.46"
y1="942.37"
x2="568.22"
y2="942.37"
></line><line
class="cls-15"
x1="538.46"
y1="946.86"
x2="568.22"
y2="946.86"
></line><line
class="cls-15"
x1="538.46"
y1="951.35"
x2="568.22"
y2="951.35"
></line><line
class="cls-15"
x1="538.46"
y1="955.83"
x2="568.22"
y2="955.83"
></line><line
class="cls-15"
x1="538.46"
y1="960.32"
x2="568.22"
y2="960.32"
></line><line
class="cls-15"
x1="538.46"
y1="964.81"
x2="568.22"
y2="964.81"
></line><line
class="cls-15"
x1="538.46"
y1="969.29"
x2="568.22"
y2="969.29"
></line><line
class="cls-15"
x1="538.46"
y1="973.78"
x2="568.22"
y2="973.78"
></line><line
class="cls-15"
x1="538.46"
y1="978.26"
x2="568.22"
y2="978.26"
></line><line
class="cls-15"
x1="538.46"
y1="982.75"
x2="568.22"
y2="982.75"
></line><line
class="cls-15"
x1="538.46"
y1="987.24"
x2="568.22"
y2="987.24"
></line><line
class="cls-15"
x1="538.46"
y1="991.72"
x2="568.22"
y2="991.72"
></line><line
class="cls-15"
x1="538.46"
y1="996.21"
x2="568.22"
y2="996.21"
></line><line
class="cls-15"
x1="538.46"
y1="1000.7"
x2="568.22"
y2="1000.7"
></line><line
class="cls-15"
x1="538.46"
y1="1005.18"
x2="568.22"
y2="1005.18"
></line><line
class="cls-15"
x1="538.46"
y1="1009.67"
x2="568.22"
y2="1009.67"
></line><line
class="cls-15"
x1="538.46"
y1="1014.16"
x2="568.22"
y2="1014.16"
></line><line
class="cls-15"
x1="538.46"
y1="1018.64"
x2="568.22"
y2="1018.64"
></line><line
class="cls-15"
x1="538.46"
y1="1023.13"
x2="568.22"
y2="1023.13"
></line><line
class="cls-15"
x1="538.46"
y1="1027.62"
x2="568.22"
y2="1027.62"
></line><line
class="cls-15"
x1="538.46"
y1="1032.1"
x2="568.22"
y2="1032.1"
></line><line
class="cls-15"
x1="538.46"
y1="1036.59"
x2="568.22"
y2="1036.59"
></line><line
class="cls-15"
x1="538.46"
y1="1041.08"
x2="568.22"
y2="1041.08"
></line><line
class="cls-15"
x1="538.46"
y1="1045.56"
x2="568.22"
y2="1045.56"
></line><line
class="cls-15"
x1="538.46"
y1="1050.05"
x2="568.22"
y2="1050.05"
></line><line
class="cls-15"
x1="538.46"
y1="1054.53"
x2="568.22"
y2="1054.53"
></line><line
class="cls-15"
x1="538.46"
y1="1059.02"
x2="568.22"
y2="1059.02"
></line><line
class="cls-15"
x1="538.46"
y1="1063.51"
x2="568.22"
y2="1063.51"
></line><line
class="cls-15"
x1="538.46"
y1="1067.99"
x2="568.22"
y2="1067.99"
></line><line
class="cls-15"
x1="538.46"
y1="1072.48"
x2="568.22"
y2="1072.48"
></line><line
class="cls-15"
x1="538.46"
y1="1076.97"
x2="568.22"
y2="1076.97"
></line><path
class="cls-11"
d="M632.82,1210.27V1097.4a4.66,4.66,0,0,1,4.67-4.65h28.16a11.68,11.68,0,0,0,11.67-11.68V916.93c0-6.85-5.05-10.17-12.24-12.74l-27.79-7.41a4.66,4.66,0,0,1-4.47-4.64V785.78"
></path><path
class="cls-11"
d="M1412.61,816.13v360.16h-755a2.5,2.5,0,0,1-2.51-2.5v-64.32a2.5,2.5,0,0,1,2.51-2.5h30.47a12.81,12.81,0,0,0,12.81-12.82V894.25a12.81,12.81,0,0,0-12.81-12.82H657.58a2.5,2.5,0,0,1-2.51-2.5V818.64a2.51,2.51,0,0,1,2.51-2.51Z"
></path><polyline
class="cls-7"
points="632.82 785.77 1429.58 785.77 1429.58 1210.27 632.82 1210.27"
></polyline><polyline
class="cls-7"
points="632.82 1210.27 595.13 1210.27 595.13 785.77 632.82 785.77"
></polyline></g>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 95 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 95 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 47 KiB

+216
View File
@@ -0,0 +1,216 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="340.47 241 263.8 451.32">
<defs><style>
.cls-1 {
fill: #434143;
}
.cls-2, .cls-6, .cls-7 {
fill: none;
}
.cls-2 {
stroke: #050606;
stroke-miterlimit: 10;
}
.cls-3 {
fill: #2b2b2b;
}
.cls-4 {
fill: #181818;
}
.cls-5 {
fill: #e8eae8;
}
.cls-6, .cls-7 {
stroke: #e8eae8;
stroke-linecap: round;
stroke-linejoin: round;
}
.cls-7 {
stroke-width: 2px;
}
</style></defs><g id="Layer_2" data-name="Layer 2"><rect
class="cls-1"
x="340.97"
y="241.5"
width="262.8"
height="450.32"
rx="27.43"
></rect><rect
class="cls-2"
x="340.97"
y="241.5"
width="262.8"
height="450.32"
rx="27.43"
></rect><circle
class="cls-3"
cx="364.66"
cy="264.01"
r="10.92"
></circle><circle
class="cls-2"
cx="364.66"
cy="264.01"
r="10.92"
></circle><path
class="cls-4"
d="M372.05,264a2.39,2.39,0,0,1-2.39,2.38h-2.61V269a2.38,2.38,0,1,1-4.76,0v-2.62h-2.63a2.39,2.39,0,1,1,0-4.77h2.63V259a2.38,2.38,0,0,1,2.37-2.38,2.39,2.39,0,0,1,2.39,2.38v2.62h2.61A2.4,2.4,0,0,1,372.05,264Z"
></path><circle
class="cls-3"
cx="579.41"
cy="264.01"
r="10.92"
></circle><circle
class="cls-2"
cx="579.41"
cy="264.01"
r="10.92"
></circle><path
class="cls-4"
d="M586.79,264a2.39,2.39,0,0,1-2.38,2.38h-2.62V269a2.38,2.38,0,1,1-4.76,0v-2.62h-2.62a2.39,2.39,0,1,1,0-4.77H577V259a2.38,2.38,0,0,1,4.76,0v2.62h2.62A2.39,2.39,0,0,1,586.79,264Z"
></path><circle
class="cls-3"
cx="364.66"
cy="666.6"
r="10.92"
></circle><circle
class="cls-2"
cx="364.66"
cy="666.6"
r="10.92"
></circle><path
class="cls-4"
d="M372.05,666.61a2.39,2.39,0,0,1-2.39,2.38h-2.61v2.62a2.38,2.38,0,1,1-4.76,0V669h-2.63a2.39,2.39,0,1,1,0-4.77h2.63V661.6a2.38,2.38,0,0,1,2.37-2.38,2.39,2.39,0,0,1,2.39,2.38v2.62h2.61A2.4,2.4,0,0,1,372.05,666.61Z"
></path><circle
class="cls-3"
cx="579.41"
cy="666.6"
r="10.92"
></circle><circle
class="cls-2"
cx="579.41"
cy="666.6"
r="10.92"
></circle><path
class="cls-4"
d="M586.79,666.61a2.39,2.39,0,0,1-2.38,2.38h-2.62v2.62a2.38,2.38,0,0,1-4.76,0V669h-2.62a2.39,2.39,0,1,1,0-4.77H577V661.6a2.38,2.38,0,0,1,4.76,0v2.62h2.62A2.39,2.39,0,0,1,586.79,666.61Z"
></path><circle
class="cls-3"
cx="579.41"
cy="440.79"
r="10.92"
></circle><circle
class="cls-2"
cx="579.41"
cy="440.79"
r="10.92"
></circle><path
class="cls-4"
d="M586.79,440.79a2.39,2.39,0,0,1-2.38,2.38h-2.62v2.62a2.38,2.38,0,1,1-4.76,0v-2.62h-2.62a2.39,2.39,0,1,1,0-4.77H577v-2.62a2.38,2.38,0,0,1,4.76,0v2.62h2.62A2.39,2.39,0,0,1,586.79,440.79Z"
></path><circle
class="cls-3"
cx="361.13"
cy="442.81"
r="10.92"
></circle><circle
class="cls-2"
cx="361.13"
cy="442.81"
r="10.92"
></circle><path
class="cls-4"
d="M368.51,442.81a2.39,2.39,0,0,1-2.38,2.38h-2.62v2.62a2.38,2.38,0,1,1-4.76,0v-2.62h-2.62a2.39,2.39,0,1,1,0-4.77h2.62V437.8a2.38,2.38,0,0,1,4.76,0v2.62h2.62A2.39,2.39,0,0,1,368.51,442.81Z"
></path><rect
class="cls-5"
x="442.52"
y="591.7"
width="6.5"
height="54.62"
transform="translate(432.79 -143.7) rotate(34.78)"
></rect><path
class="cls-5"
d="M521.39,639.18l-5.34,3.71L489,604.34l-26.94,39-5.34-3.71,28.32-41,1.06-1.53a3.53,3.53,0,0,1,5.8,0l1.06,1.53Z"
></path><rect
class="cls-3"
x="407.64"
y="511.78"
width="135.85"
height="67.27"
rx="3.52"
></rect><rect
class="cls-2"
x="407.64"
y="511.78"
width="135.85"
height="67.27"
rx="3.52"
></rect><circle class="cls-6" cx="586.93" cy="479.19" r="9.9"></circle><rect
class="cls-5"
x="581.12"
y="478.38"
width="9.09"
height="1.63"
rx="0.82"
></rect><circle
class="cls-5"
cx="591.91"
cy="479.19"
r="0.83"
></circle><path
class="cls-7"
d="M592.84,629.48a7.9,7.9,0,1,1-.29-6.3"
></path><line
class="cls-7"
x1="586.78"
y1="626.67"
x2="594.43"
y2="626.67"
></line><path
class="cls-5"
d="M408.88,655.16h3.51l4.58,7.29v-7.29h3.55v13.18H417l-4.56-7.24v7.24h-3.53Z"
></path><path
class="cls-5"
d="M425.87,661.88l-3.23-.37a4.06,4.06,0,0,1,.53-1.44,3,3,0,0,1,1-.91,3.82,3.82,0,0,1,1.28-.43,8.86,8.86,0,0,1,1.76-.16,13.09,13.09,0,0,1,2.44.19,3,3,0,0,1,1.54.77,2.86,2.86,0,0,1,.68,1.14,4.67,4.67,0,0,1,.25,1.42v4.22a5.74,5.74,0,0,0,.07,1.05,5.4,5.4,0,0,0,.35,1h-3.17a3.65,3.65,0,0,1-.25-.56,4.32,4.32,0,0,1-.12-.61,4.38,4.38,0,0,1-1.32,1,5.18,5.18,0,0,1-2.08.39,3.32,3.32,0,0,1-2.4-.79,2.61,2.61,0,0,1-.81-2A2.71,2.71,0,0,1,423,664a3.89,3.89,0,0,1,2.18-1c1.27-.28,2.09-.47,2.47-.58a11.09,11.09,0,0,0,1.19-.44,1.35,1.35,0,0,0-.26-.94,1.21,1.21,0,0,0-.9-.27,2.22,2.22,0,0,0-1.25.29A1.6,1.6,0,0,0,425.87,661.88Zm2.93,1.93a12.94,12.94,0,0,1-1.45.47,3.35,3.35,0,0,0-1.31.59,1,1,0,0,0,0,1.38,1.14,1.14,0,0,0,.82.27,2,2,0,0,0,1.05-.3,1.7,1.7,0,0,0,.69-.72,2.66,2.66,0,0,0,.2-1.11Z"
></path><path
class="cls-5"
d="M434.13,658.79h3.15v1.55A5,5,0,0,1,438.7,659a3.58,3.58,0,0,1,1.76-.41,2.75,2.75,0,0,1,2.2.91,4.13,4.13,0,0,1,.79,2.79v6.07h-3.39v-5.25a2,2,0,0,0-.31-1.27,1,1,0,0,0-.86-.38,1.2,1.2,0,0,0-1,.51,3.12,3.12,0,0,0-.38,1.8v4.59h-3.38Z"
></path><path
class="cls-5"
d="M445.06,663.59a5,5,0,0,1,1.36-3.6,5.55,5.55,0,0,1,7.68.25,5.08,5.08,0,0,1,1.08,3.3,5,5,0,0,1-1.35,3.61,5.64,5.64,0,0,1-7.16.23A4.81,4.81,0,0,1,445.06,663.59Zm3.38,0a3.06,3.06,0,0,0,.48,1.89,1.49,1.49,0,0,0,2.4,0,3.18,3.18,0,0,0,.47-1.93,3,3,0,0,0-.47-1.85,1.43,1.43,0,0,0-1.17-.61,1.51,1.51,0,0,0-1.23.62A3,3,0,0,0,448.44,663.58Z"
></path><path
class="cls-5"
d="M468.82,663.56v-2.74h5.81v5.62a11.64,11.64,0,0,1-2.95,1.68,9.47,9.47,0,0,1-3,.44,6.86,6.86,0,0,1-3.53-.8,5.31,5.31,0,0,1-2.12-2.38,8.38,8.38,0,0,1-.75-3.63,8.11,8.11,0,0,1,.82-3.76,5.53,5.53,0,0,1,2.41-2.42,7.36,7.36,0,0,1,3.33-.64,8.56,8.56,0,0,1,3,.4,3.89,3.89,0,0,1,1.66,1.23,5.54,5.54,0,0,1,1,2.1l-3.63.71a2.15,2.15,0,0,0-.76-1.15,2.26,2.26,0,0,0-1.36-.39,2.39,2.39,0,0,0-2,.93,4.74,4.74,0,0,0-.73,2.94,4.94,4.94,0,0,0,.74,3.06,2.53,2.53,0,0,0,2.07.92,3.74,3.74,0,0,0,1.21-.2,6.12,6.12,0,0,0,1.31-.68v-1.24Z"
></path><path
class="cls-5"
d="M486.22,668.34H476.07a7.23,7.23,0,0,1,1.06-3.06,14.61,14.61,0,0,1,3.32-3.39,10.56,10.56,0,0,0,1.9-1.81,2.21,2.21,0,0,0,.41-1.18,1.4,1.4,0,0,0-.41-1,1.35,1.35,0,0,0-1-.43,1.39,1.39,0,0,0-1.06.44,2.84,2.84,0,0,0-.55,1.56l-3.39-.3a6.13,6.13,0,0,1,.73-2.41,3.41,3.41,0,0,1,1.5-1.33,6.28,6.28,0,0,1,2.68-.47,7.05,7.05,0,0,1,2.77.44,3.44,3.44,0,0,1,1.56,1.36,3.76,3.76,0,0,1,.57,2,4.36,4.36,0,0,1-.65,2.3,9.09,9.09,0,0,1-2.37,2.41c-.68.51-1.13.87-1.36,1.07s-.5.47-.81.8h5.28Z"
></path><path
class="cls-5"
d="M501.8,655.16h3.75V663a7,7,0,0,1-.34,2.21,4.76,4.76,0,0,1-1,1.81,4.16,4.16,0,0,1-1.51,1.09,6.89,6.89,0,0,1-2.63.44,15.27,15.27,0,0,1-1.94-.13,4.69,4.69,0,0,1-1.75-.54,4.38,4.38,0,0,1-1.29-1.13,4.22,4.22,0,0,1-.8-1.52,8.17,8.17,0,0,1-.35-2.23v-7.85h3.75v8a2.38,2.38,0,0,0,.55,1.68,2,2,0,0,0,1.53.61,2,2,0,0,0,1.53-.6,2.44,2.44,0,0,0,.55-1.69Z"
></path><path
class="cls-5"
d="M507.93,655.16h3.39v13.18h-3.39Z"
></path><path
class="cls-5"
d="M517.56,655.16v3.63h1.86v2.68h-1.86v3.38a2,2,0,0,0,.1.81.61.61,0,0,0,.58.3,3.33,3.33,0,0,0,1-.23l.25,2.53a10.1,10.1,0,0,1-2.34.29,3.74,3.74,0,0,1-1.86-.35,2,2,0,0,1-.88-1.06,6.52,6.52,0,0,1-.29-2.31v-3.36h-1.25v-2.68h1.25V657Z"
></path><path
class="cls-5"
d="M521.06,658.79h3.16v1.56a3.81,3.81,0,0,1,.94-1.39,1.88,1.88,0,0,1,1.2-.39,3.33,3.33,0,0,1,1.64.51l-1,2.6a2.43,2.43,0,0,0-.94-.26,1.12,1.12,0,0,0-1,.59,6.43,6.43,0,0,0-.53,3.13v3.2h-3.39Z"
></path><path
class="cls-5"
d="M531.94,661.88l-3.23-.37a4.06,4.06,0,0,1,.53-1.44,3,3,0,0,1,1-.91,3.82,3.82,0,0,1,1.28-.43,8.86,8.86,0,0,1,1.76-.16,13.09,13.09,0,0,1,2.44.19,3,3,0,0,1,1.54.77,2.86,2.86,0,0,1,.68,1.14,4.67,4.67,0,0,1,.25,1.42v4.22a4.85,4.85,0,0,0,.08,1.05,4.6,4.6,0,0,0,.34,1h-3.17a3.65,3.65,0,0,1-.25-.56,4.32,4.32,0,0,1-.12-.61,4.38,4.38,0,0,1-1.32,1,5.15,5.15,0,0,1-2.08.39,3.28,3.28,0,0,1-2.39-.79,2.58,2.58,0,0,1-.82-2A2.67,2.67,0,0,1,529,664a3.86,3.86,0,0,1,2.17-1c1.27-.28,2.09-.47,2.47-.58a11.09,11.09,0,0,0,1.19-.44,1.36,1.36,0,0,0-.25-.94,1.25,1.25,0,0,0-.91-.27,2.18,2.18,0,0,0-1.24.29A1.6,1.6,0,0,0,531.94,661.88Zm2.93,1.93a12.94,12.94,0,0,1-1.45.47,3.21,3.21,0,0,0-1.3.59,1,1,0,0,0-.29.67,1,1,0,0,0,.28.71,1.14,1.14,0,0,0,.82.27,1.94,1.94,0,0,0,1.05-.3,1.7,1.7,0,0,0,.69-.72,2.51,2.51,0,0,0,.2-1.11Z"
></path><path
class="cls-6"
d="M579.88,583.57v16l.41-.47a7.4,7.4,0,0,1,5.54-2.48h.24a8.27,8.27,0,0,0,6.37-3l.18-.21a3.11,3.11,0,0,0,.14-3.78l-.24-.34a8.29,8.29,0,0,0-6.76-3.49h-.57a7.4,7.4,0,0,1-4.87-1.83Z"
></path><path
class="cls-6"
d="M579.87,594.24a2.68,2.68,0,1,1,0-5.35"
></path><path
class="cls-5"
d="M588.69,547.89a6.85,6.85,0,0,0-3.84,1.17l-.15.11-8,5.63,8,5.63.15.11a6.91,6.91,0,1,0,3.84-12.65Zm0,9.72a2.81,2.81,0,1,1,2.81-2.81A2.81,2.81,0,0,1,588.69,557.61Z"
></path><polygon
class="cls-6"
points="582.55 520.31 588.06 528.85 577.03 528.85 577.03 511.78 588.06 511.78 582.55 520.31"
></polygon><polygon
class="cls-6"
points="594.05 520.03 588.06 528.85 582.55 520.31 588.06 511.78 594.05 520.03"
></polygon></g>
</svg>

After

Width:  |  Height:  |  Size: 9.5 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 102 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 86 KiB

+264
View File
@@ -0,0 +1,264 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="663.59 325.94 640.35 1015.71">
<defs><style>
.cls-1 {
fill: #353535;
}
.cls-2 {
fill: #1d1e1e;
}
.cls-3 {
fill: #9f9f9e;
}
.cls-4 {
fill: #434343;
}
.cls-5, .cls-7 {
fill: none;
stroke: #050606;
stroke-miterlimit: 10;
}
.cls-5 {
stroke-width: 2px;
}
.cls-6 {
fill: #b1a368;
}
</style></defs><g id="Layer_7" data-name="Layer 7"><rect
class="cls-1"
x="1079.47"
y="834.15"
width="56.53"
height="9.97"
></rect><rect
class="cls-1"
x="1075.53"
y="800.89"
width="63.83"
height="33.26"
></rect><path
class="cls-1"
d="M1079.93,800.89v-5.28a2.81,2.81,0,0,1,2.81-2.81h50.45a2.81,2.81,0,0,1,2.82,2.81v5.28"
></path><rect
class="cls-1"
x="1076.7"
y="718.27"
width="62.66"
height="70.68"
rx="3.45"
></rect><rect
class="cls-1"
x="1082.84"
y="788.94"
width="50.73"
height="3.86"
></rect><path
class="cls-2"
d="M1085.24,695.85s-2.75-3.82-4.5-3.27-3.94.3-1.53,2.72l12.9,13s.75.76.61,3.43.07,5.63.65,5.91,30.43,1.59,30.64-.79.67-6.25-.74-5.68-11.35,4.43-19.55.05S1085.24,695.85,1085.24,695.85Z"
></path><path
class="cls-1"
d="M1282,938.23v321.64a59.85,59.85,0,0,1-59.78,59.78H745.37a59.84,59.84,0,0,1-59.78-59.78V938.23a59.84,59.84,0,0,1,59.78-59.78h476.8A59.84,59.84,0,0,1,1282,938.23Z"
></path><path
class="cls-3"
d="M1222.17,857.45H745.37a80.77,80.77,0,0,0-80.78,80.78v321.64a80.77,80.77,0,0,0,80.78,80.78h476.8a80.78,80.78,0,0,0,80.78-80.78V938.23A80.78,80.78,0,0,0,1222.17,857.45ZM1282,1259.87a59.85,59.85,0,0,1-59.78,59.78H745.37a59.84,59.84,0,0,1-59.78-59.78V938.23a59.84,59.84,0,0,1,59.78-59.78h476.8A59.84,59.84,0,0,1,1282,938.23Z"
></path><rect
class="cls-4"
x="819.33"
y="971.15"
width="328.86"
height="250.93"
></rect><path
class="cls-5"
d="M1222.17,878.45a59.83,59.83,0,0,1,59.77,59.77v321.65a59.84,59.84,0,0,1-59.77,59.78H745.36a59.84,59.84,0,0,1-59.77-59.78V938.22a59.83,59.83,0,0,1,59.77-59.77h476.81m0-21H745.36a80.77,80.77,0,0,0-80.77,80.77v321.65a80.78,80.78,0,0,0,80.77,80.78h476.81a80.78,80.78,0,0,0,80.77-80.78V938.22a80.77,80.77,0,0,0-80.77-80.77Z"
></path><rect
class="cls-5"
x="819.33"
y="971.15"
width="328.86"
height="250.93"
></rect><rect
class="cls-6"
x="1080.45"
y="847.88"
width="55.55"
height="9.57"
></rect><rect
class="cls-5"
x="1080.45"
y="847.88"
width="55.55"
height="9.57"
></rect><rect
class="cls-5"
x="1079.47"
y="834.15"
width="56.53"
height="9.97"
></rect><rect
class="cls-5"
x="1075.53"
y="800.89"
width="63.83"
height="33.26"
></rect><path
class="cls-5"
d="M1079.93,800.89v-5.28a2.81,2.81,0,0,1,2.81-2.81h50.45a2.81,2.81,0,0,1,2.82,2.81v5.28"
></path><rect
class="cls-5"
x="1076.7"
y="718.27"
width="62.66"
height="70.68"
rx="3.45"
></rect><rect
class="cls-5"
x="1082.84"
y="788.94"
width="50.73"
height="3.86"
></rect><line
class="cls-5"
x1="1093.01"
y1="718.27"
x2="1093.01"
y2="703.17"
></line><line
class="cls-5"
x1="1124.56"
y1="718.27"
x2="1124.56"
y2="710.55"
></line><path
class="cls-1"
d="M784.41,333.86l363.94,355.78-18.09,16.92a24.62,24.62,0,0,1-33.69,0l-14.9-14a.44.44,0,0,0-.5-.09h0a13.35,13.35,0,0,1-14.85-2.89L750.32,368a24.13,24.13,0,0,1,1.18-35h0A24.13,24.13,0,0,1,784.41,333.86Z"
></path><path
class="cls-2"
d="M818.35,367.13c-2.26-2.12-11.86,3.59-21.07,13.42s-15.34,19.55-13.08,21.67l-2.53-2.8c-2.26-2.12,3.87-11.84,13.08-21.67s18.8-15.54,21.07-13.42l-4.24-3.58c-2.27-2.12-11.86,3.6-21.07,13.42s-15.34,19.56-13.08,21.68l-2.53-2.8c-2.26-2.12,3.87-11.85,13.08-21.68s18.8-15.54,21.07-13.42"
></path><path
class="cls-5"
d="M784.41,333.86l363.94,355.78-18.09,16.92a24.62,24.62,0,0,1-33.69,0l-14.9-14a.44.44,0,0,0-.5-.09h0a13.35,13.35,0,0,1-14.85-2.89L750.32,368a24.13,24.13,0,0,1,1.18-35h0A24.13,24.13,0,0,1,784.41,333.86Z"
></path><line
class="cls-5"
x1="1077.35"
y1="693.43"
x2="1093.01"
y2="709.21"
></line><circle
class="cls-2"
cx="1111.17"
cy="687.29"
r="6"
></circle><circle
class="cls-5"
cx="1111.17"
cy="687.29"
r="6"
></circle><path
class="cls-7"
d="M774.9,393.05c-2.26-2.12,3.87-11.85,13.08-21.68s18.8-15.54,21.07-13.42"
></path><path
class="cls-7"
d="M777.43,395.85c-2.26-2.12,3.87-11.85,13.08-21.68s18.8-15.54,21.07-13.42"
></path><path
class="cls-7"
d="M781.67,399.42c-2.26-2.12,3.87-11.84,13.08-21.67s18.8-15.54,21.07-13.42"
></path><path
class="cls-7"
d="M784.2,402.22c-2.26-2.12,3.87-11.84,13.08-21.67s18.81-15.54,21.07-13.42"
></path><rect
class="cls-6"
x="1086.52"
y="844.12"
width="41.63"
height="3.76"
></rect><rect
class="cls-5"
x="1086.52"
y="844.12"
width="41.63"
height="3.76"
></rect><rect
class="cls-2"
x="1079.47"
y="805.49"
width="1.59"
height="25.02"
></rect><rect
class="cls-2"
x="1083.7"
y="805.49"
width="1.59"
height="25.02"
></rect><rect
class="cls-2"
x="1087.92"
y="805.49"
width="1.59"
height="25.02"
></rect><rect
class="cls-2"
x="1092.15"
y="805.49"
width="1.59"
height="25.02"
></rect><rect
class="cls-2"
x="1096.38"
y="805.49"
width="1.59"
height="25.02"
></rect><rect
class="cls-2"
x="1100.6"
y="805.49"
width="1.59"
height="25.02"
></rect><rect
class="cls-2"
x="1104.83"
y="805.49"
width="1.59"
height="25.02"
></rect><rect
class="cls-2"
x="1109.05"
y="805.49"
width="1.59"
height="25.02"
></rect><rect
class="cls-2"
x="1113.28"
y="805.49"
width="1.59"
height="25.02"
></rect><rect
class="cls-2"
x="1117.51"
y="805.49"
width="1.59"
height="25.02"
></rect><rect
class="cls-2"
x="1121.73"
y="805.49"
width="1.59"
height="25.02"
></rect><rect
class="cls-2"
x="1125.96"
y="805.49"
width="1.59"
height="25.02"
></rect><rect
class="cls-2"
x="1130.18"
y="805.49"
width="1.59"
height="25.02"
></rect><rect
class="cls-2"
x="1134.41"
y="805.49"
width="1.59"
height="25.02"
></rect></g>
</svg>

After

Width:  |  Height:  |  Size: 6.8 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 164 KiB

+379
View File
@@ -0,0 +1,379 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="281.97 168.43 271.78 510.19">
<defs><style>
.cls-1 {
fill: #1c60ac;
}
.cls-2 {
fill: #33353d;
}
.cls-3 {
fill: #0e5796;
}
.cls-4 {
fill: #fff;
}
.cls-5 {
fill: none;
stroke: #050606;
stroke-miterlimit: 10;
}
.cls-6 {
fill: #9e9d9e;
}
</style></defs><g id="Layer_3" data-name="Layer 3"><rect
class="cls-1"
x="355.63"
y="645.72"
width="37.63"
height="25.23"
rx="3.38"
></rect><rect
class="cls-1"
x="352.62"
y="581.71"
width="44.76"
height="25.23"
rx="3.69"
></rect><path
class="cls-1"
d="M389.88,671h0a7.12,7.12,0,0,1-7.12,7.12H366.14A7.12,7.12,0,0,1,359,671h0"
></path><rect
class="cls-2"
x="356.31"
y="576.3"
width="37.38"
height="5.41"
></rect><path
class="cls-2"
d="M392.3,606.94s-4.84,14.19-4.84,38.78H361.15c0-24.59-4.84-38.78-4.84-38.78Z"
></path><rect
class="cls-3"
x="355.63"
y="584.04"
width="4.39"
height="20.14"
rx="0.9"
></rect><rect
class="cls-3"
x="364.31"
y="584.04"
width="4.39"
height="20.14"
rx="0.9"
></rect><rect
class="cls-3"
x="372.98"
y="584.04"
width="4.39"
height="20.14"
rx="0.9"
></rect><rect
class="cls-3"
x="381.65"
y="584.04"
width="4.39"
height="20.14"
rx="0.9"
></rect><rect
class="cls-3"
x="390.32"
y="584.04"
width="4.39"
height="20.14"
rx="0.9"
></rect><rect
class="cls-3"
x="357.21"
y="648.27"
width="3.9"
height="20.14"
rx="0.85"
></rect><rect
class="cls-3"
x="364.91"
y="648.27"
width="3.9"
height="20.14"
rx="0.85"
></rect><rect
class="cls-3"
x="372.6"
y="648.27"
width="3.9"
height="20.14"
rx="0.85"
></rect><rect
class="cls-3"
x="380.3"
y="648.27"
width="3.9"
height="20.14"
rx="0.85"
></rect><rect
class="cls-3"
x="388"
y="648.27"
width="3.9"
height="20.14"
rx="0.85"
></rect><rect
class="cls-1"
x="432.13"
y="645.72"
width="37.63"
height="25.23"
rx="3.38"
></rect><rect
class="cls-1"
x="429.12"
y="581.71"
width="44.76"
height="25.23"
rx="3.69"
></rect><path
class="cls-1"
d="M466.38,671h0a7.12,7.12,0,0,1-7.12,7.12H442.63a7.11,7.11,0,0,1-7.11-7.12h0"
></path><rect
class="cls-2"
x="432.81"
y="576.3"
width="37.38"
height="5.41"
></rect><path
class="cls-2"
d="M468.79,606.94S464,621.13,464,645.72H437.64c0-24.59-4.83-38.78-4.83-38.78Z"
></path><rect
class="cls-3"
x="432.13"
y="584.04"
width="4.39"
height="20.14"
rx="0.9"
></rect><rect
class="cls-3"
x="440.8"
y="584.04"
width="4.39"
height="20.14"
rx="0.9"
></rect><rect
class="cls-3"
x="449.48"
y="584.04"
width="4.39"
height="20.14"
rx="0.9"
></rect><rect
class="cls-3"
x="458.15"
y="584.04"
width="4.39"
height="20.14"
rx="0.9"
></rect><rect
class="cls-3"
x="466.82"
y="584.04"
width="4.39"
height="20.14"
rx="0.9"
></rect><rect
class="cls-3"
x="433.71"
y="648.27"
width="3.9"
height="20.14"
rx="0.85"
></rect><rect
class="cls-3"
x="441.4"
y="648.27"
width="3.9"
height="20.14"
rx="0.85"
></rect><rect
class="cls-3"
x="449.1"
y="648.27"
width="3.9"
height="20.14"
rx="0.85"
></rect><rect
class="cls-3"
x="456.8"
y="648.27"
width="3.9"
height="20.14"
rx="0.85"
></rect><rect
class="cls-3"
x="464.5"
y="648.27"
width="3.9"
height="20.14"
rx="0.85"
></rect></g><g id="Layer_2" data-name="Layer 2"><path
class="cls-4"
d="M553.25,218.93V526.3a50,50,0,0,1-50,50H332.47a50,50,0,0,1-50-50V218.93a50,50,0,0,1,50-50H503.24A50,50,0,0,1,553.25,218.93Z"
></path><path
class="cls-1"
d="M553.25,218.93V328.61H282.47V218.93a50,50,0,0,1,50-50H503.24A50,50,0,0,1,553.25,218.93Z"
></path><path
class="cls-5"
d="M553.25,218.93V526.3a50,50,0,0,1-50,50H332.47a50,50,0,0,1-50-50V218.93a50,50,0,0,1,50-50H503.24A50,50,0,0,1,553.25,218.93Z"
></path><path
class="cls-4"
d="M356.47,248.86a8.83,8.83,0,0,0-5.13.45s-1.27-2.38-.86-7.18c.16-1.81.47-4.26,2.63-4.63l.1,0a2.54,2.54,0,0,1,3.26,3.1C355.85,246.23,356.69,248.83,356.47,248.86Z"
></path><path
class="cls-4"
d="M346.81,236.93a2.33,2.33,0,0,1,2.16,2.94,13,13,0,0,0-.33,4.26c.27,4.34,1.76,5.88,1.76,5.88a4.28,4.28,0,0,0-1.49,2.75,16.14,16.14,0,0,1-4.74-13,3.29,3.29,0,0,1,.94-2.14,2.34,2.34,0,0,1,1.41-.69A1.42,1.42,0,0,1,346.81,236.93Z"
></path><path
class="cls-4"
d="M348.3,260.57A18.32,18.32,0,0,1,338,249.31a20.24,20.24,0,0,1-1-7.95,4.84,4.84,0,0,1,1-3.08,2.87,2.87,0,0,1,4.25,1,5.05,5.05,0,0,1,.08,2.19,14.84,14.84,0,0,0,.62,5.95c1.39,4.89,6.95,9.07,6.95,9.07A5.94,5.94,0,0,0,348.3,260.57Z"
></path><path
class="cls-4"
d="M358,242.89a8.93,8.93,0,0,0-.45-5.13s2.38-1.26,7.18-.86c1.81.16,4.26.48,4.63,2.64a.29.29,0,0,0,0,.09,2.55,2.55,0,0,1-3.1,3.27C360.62,242.28,358,243.12,358,242.89Z"
></path><path
class="cls-4"
d="M369.93,233.24a2.33,2.33,0,0,1-2.94,2.15,13.43,13.43,0,0,0-4.26-.32c-4.34.27-5.88,1.75-5.88,1.75a4.24,4.24,0,0,0-2.75-1.48,16.14,16.14,0,0,1,13-4.74,3.28,3.28,0,0,1,2.14.93,2.36,2.36,0,0,1,.69,1.41A1.51,1.51,0,0,1,369.93,233.24Z"
></path><path
class="cls-4"
d="M346.29,234.73a18.29,18.29,0,0,1,11.26-10.34,20.05,20.05,0,0,1,7.95-1,4.77,4.77,0,0,1,3.08,1,2.87,2.87,0,0,1-1,4.25,4.77,4.77,0,0,1-2.19.08,15.07,15.07,0,0,0-5.95.63c-4.89,1.39-9.07,7-9.07,7A5.94,5.94,0,0,0,346.29,234.73Z"
></path><path
class="cls-4"
d="M363.86,244.84a8.93,8.93,0,0,0,5.13-.45s1.26,2.38.86,7.17c-.16,1.82-.48,4.27-2.64,4.63l-.09,0a2.53,2.53,0,0,1-3.26-3.09C364.48,247.46,363.64,244.87,363.86,244.84Z"
></path><path
class="cls-4"
d="M373.51,256.77a2.33,2.33,0,0,1-2.15-2.94,13.37,13.37,0,0,0,.33-4.26c-.27-4.34-1.76-5.88-1.76-5.88a4.28,4.28,0,0,0,1.49-2.75,16.14,16.14,0,0,1,4.74,13,3.29,3.29,0,0,1-.94,2.14,2.36,2.36,0,0,1-1.41.69Z"
></path><path
class="cls-4"
d="M372,233.13a18.29,18.29,0,0,1,10.34,11.26,19.87,19.87,0,0,1,1,8,4.77,4.77,0,0,1-1,3.08,2.87,2.87,0,0,1-4.25-1,4.91,4.91,0,0,1-.08-2.19,15.21,15.21,0,0,0-.62-5.95c-1.39-4.89-7-9.07-7-9.07A5.89,5.89,0,0,0,372,233.13Z"
></path><path
class="cls-4"
d="M362.33,250.81a8.79,8.79,0,0,0,.45,5.12s-2.38,1.27-7.18.87c-1.81-.16-4.26-.48-4.63-2.64a.29.29,0,0,0,0-.09,3,3,0,0,1,.8-2.79,3,3,0,0,1,2.3-.48C359.7,251.42,362.3,250.58,362.33,250.81Z"
></path><path
class="cls-4"
d="M350.4,260.46a2.32,2.32,0,0,1,2.93-2.15,13.5,13.5,0,0,0,4.27.32c4.34-.27,5.87-1.75,5.87-1.75a4.24,4.24,0,0,0,2.76,1.48,16.14,16.14,0,0,1-13,4.74,3.23,3.23,0,0,1-2.14-.93,2.43,2.43,0,0,1-.7-1.41C350.4,260.66,350.4,260.56,350.4,260.46Z"
></path><path
class="cls-4"
d="M374,259a18.29,18.29,0,0,1-11.26,10.34,20.26,20.26,0,0,1-7.95,1,4.76,4.76,0,0,1-3.08-1,2.87,2.87,0,0,1,1-4.25,4.86,4.86,0,0,1,2.18-.07,15.11,15.11,0,0,0,6-.63c4.89-1.39,9.06-7,9.06-7A6,6,0,0,0,374,259Z"
></path><path
class="cls-4"
d="M400.1,250.29v13h-7.47V230.88h15.53c7.7,0,11.84,3.89,11.84,8.88a7.75,7.75,0,0,1-5.13,7.66c1.75.59,4.39,2.26,4.39,8.05v1.6a23.55,23.55,0,0,0,.51,6.17h-7.24c-.62-1.41-.74-3.83-.74-7.27v-.47c0-3.54-1-5.21-6.67-5.21Zm0-5.57h6.4c4.18,0,5.8-1.46,5.8-4.17s-1.88-4.1-5.62-4.1H400.1Z"
></path><path
class="cls-4"
d="M430.81,255.76l-2.43,7.48h-6.65l10.62-32.36h8.48l11.07,32.36h-7.1l-2.57-7.48Zm10-5.73c-2.22-6.83-3.64-11.19-4.39-14.1h-.05c-.77,3.19-2.33,8.26-4.11,14.1Z"
></path><path
class="cls-4"
d="M454.41,230.88h6.68v14.44c2.06-2.49,8.49-9.79,12.44-14.44h8.09l-12.56,13.45,13,18.91H474l-9.59-14.38-3.29,3.27v11.11h-6.68Z"
></path><path
class="cls-4"
d="M487.73,235.1V237h-.79v-4.39h2.15c1.12,0,1.72.5,1.72,1.18a1.06,1.06,0,0,1-.89,1,1,1,0,0,1,.79,1.11v.2a2.79,2.79,0,0,0,.07.86H490a2.67,2.67,0,0,1-.09-.95V236c0-.6-.21-.86-1.15-.86Zm0-.54h1.13c.79,0,1.13-.24,1.13-.71s-.36-.7-1.06-.7h-1.2Z"
></path><path
class="cls-4"
d="M488.62,239.49a4.7,4.7,0,1,1,4.71-4.7A4.71,4.71,0,0,1,488.62,239.49Zm0-8.74a4,4,0,1,0,4,4A4,4,0,0,0,488.62,230.75Z"
></path><path class="cls-4" d="M396.73,277.19v-7.92h1v7.92Z"></path><path
class="cls-4"
d="M403.93,274.43c0,1.6-.9,2.89-2.54,2.89s-2.48-1.22-2.48-2.87.92-2.89,2.54-2.89S403.93,272.71,403.93,274.43Zm-4,0c0,1.18.56,2,1.47,2s1.44-.79,1.44-2-.52-2-1.46-2S400,273.2,400,274.44Z"
></path><path
class="cls-4"
d="M405.89,270.63h-2.32v-.94h5.72v.94H407v6.56h-1.08Z"
></path><path
class="cls-4"
d="M419.12,274.07c0-1.38,0-2.8.05-3.6h0c-.32,1.28-1.41,4.36-2.21,6.72h-1c-.61-1.94-1.74-5.41-2.06-6.73h0c.06.87.09,2.51.09,3.8v2.93h-1v-7.5h1.61c.77,2.26,1.71,5.16,1.95,6.14h0c.17-.77,1.29-3.94,2.09-6.14h1.56v7.5h-1.05Z"
></path><path
class="cls-4"
d="M425.77,276a9.39,9.39,0,0,0,.08,1.24h-1a2.46,2.46,0,0,1-.09-.68,1.88,1.88,0,0,1-3.41-.88c0-1.23.94-1.8,2.52-1.8h.88v-.44c0-.47-.15-1-1.09-1s-1,.42-1.07.85h-1c.07-.8.55-1.66,2.1-1.66,1.32,0,2,.56,2,1.82Zm-1-1.41H424c-1,0-1.55.3-1.55,1a.9.9,0,0,0,1,.94c1.21,0,1.37-.85,1.37-1.8Z"
></path><path
class="cls-4"
d="M431.82,269.27v6.38c0,.51,0,1,0,1.54h-1c0-.15,0-.54,0-.74a1.63,1.63,0,0,1-1.64.87c-1.36,0-2.21-1.14-2.21-2.82s.91-2.94,2.39-2.94c.91,0,1.33.37,1.46.67v-3Zm-3.81,5.2c0,1.27.57,2,1.38,2,1.2,0,1.44-.94,1.44-2.06s-.22-1.93-1.37-1.93C428.55,272.45,428,273.19,428,274.47Z"
></path><path
class="cls-4"
d="M433.73,274.64c0,1,.51,1.81,1.38,1.81a1.15,1.15,0,0,0,1.21-.8h1a2.19,2.19,0,0,1-2.27,1.67c-1.69,0-2.39-1.39-2.39-2.82,0-1.65.81-2.94,2.44-2.94a2.33,2.33,0,0,1,2.32,2.63,3.24,3.24,0,0,1,0,.45Zm2.68-.72c0-.85-.42-1.54-1.29-1.54s-1.28.64-1.36,1.54Z"
></path><path
class="cls-4"
d="M446,273.74h-3.59v2.51h3.94l-.13.94h-4.86v-7.5h4.81v.94h-3.76v2.16H446Z"
></path><path
class="cls-4"
d="M451.59,276a9.9,9.9,0,0,0,.07,1.24h-1a2.93,2.93,0,0,1-.09-.68,1.88,1.88,0,0,1-3.41-.88c0-1.23.94-1.8,2.52-1.8h.88v-.44c0-.47-.15-1-1.08-1s-1,.42-1.08.85h-1c.07-.8.55-1.66,2.1-1.66,1.33,0,2.06.56,2.06,1.82Zm-1-1.41h-.81c-1,0-1.55.3-1.55,1a.91.91,0,0,0,1,.94c1.21,0,1.37-.85,1.37-1.8Z"
></path><path
class="cls-4"
d="M453.63,275.6a1.16,1.16,0,0,0,1.25.9c.74,0,1-.32,1-.78s-.24-.7-1.2-1c-1.57-.39-1.88-.89-1.88-1.64s.56-1.57,2-1.57a1.8,1.8,0,0,1,2,1.6h-1a1,1,0,0,0-1.1-.8c-.69,0-.9.35-.9.68s.21.58,1.16.81c1.65.4,2,1,2,1.79s-.73,1.68-2.11,1.68a2,2,0,0,1-2.23-1.72Z"
></path><path
class="cls-4"
d="M458.65,271.69c.8,2.49,1.28,4,1.41,4.55h0c.16-.61.52-1.87,1.35-4.55h1l-1.89,5.74c-.53,1.6-.94,2-2.07,2a4.38,4.38,0,0,1-.59,0v-.9a2.9,2.9,0,0,0,.43,0c.65,0,.91-.29,1.2-1.15l-2-5.7Z"
></path><path
class="cls-6"
d="M437,480.69v22.45a6.83,6.83,0,0,1-6.83,6.83h-11.1a8,8,0,0,1-5.42-2.38,9.05,9.05,0,0,1-2.56-6.44V482.62l11.73,11.74v-3.69l-11.73-11.74-3-3v25.17c0,3.22,1.82,8.05,4,8.9h-5.75a6.83,6.83,0,0,1-6.83-6.83V480.69a6.83,6.83,0,0,1,6.83-6.83H418a8,8,0,0,1,5.42,2.38,9.05,9.05,0,0,1,2.56,6.44v18.53l-11.73-11.74v3.69L426,504.9l3,3V482.76c0-3.22-1.82-8.05-4-8.9h5.22A6.83,6.83,0,0,1,437,480.69Z"
></path><rect
class="cls-5"
x="355.63"
y="645.72"
width="37.63"
height="25.23"
rx="3.38"
></rect><rect
class="cls-5"
x="352.62"
y="581.71"
width="44.76"
height="25.23"
rx="3.69"
></rect><path
class="cls-5"
d="M389.88,671h0a7.12,7.12,0,0,1-7.12,7.12H366.14A7.12,7.12,0,0,1,359,671h0"
></path><line
class="cls-5"
x1="356.31"
y1="581.71"
x2="356.31"
y2="576.3"
></line><line
class="cls-5"
x1="393.69"
y1="581.71"
x2="393.69"
y2="576.3"
></line><path
class="cls-5"
d="M356.31,606.94s4.84,14.19,4.84,38.78"
></path><path
class="cls-5"
d="M392.3,606.94s-4.84,14.19-4.84,38.78"
></path><rect
class="cls-5"
x="432.13"
y="645.72"
width="37.63"
height="25.23"
rx="3.38"
></rect><rect
class="cls-5"
x="429.12"
y="581.71"
width="44.76"
height="25.23"
rx="3.69"
></rect><path
class="cls-5"
d="M466.38,671h0a7.12,7.12,0,0,1-7.12,7.12H442.63a7.11,7.11,0,0,1-7.11-7.12h0"
></path><line
class="cls-5"
x1="432.81"
y1="581.71"
x2="432.81"
y2="576.3"
></line><line
class="cls-5"
x1="470.19"
y1="581.71"
x2="470.19"
y2="576.3"
></line><path
class="cls-5"
d="M432.81,606.94s4.83,14.19,4.83,38.78"
></path><path
class="cls-5"
d="M468.79,606.94S464,621.13,464,645.72"
></path></g>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 128 KiB

+322
View File
@@ -0,0 +1,322 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="754.63 172.39 553.95 1466.51">
<defs><style>
.cls-1 {
fill: #e2d299;
}
.cls-2 {
fill: #2d2d2d;
}
.cls-3 {
fill: #e6e8e8;
}
.cls-4 {
fill: #999;
}
.cls-5 {
fill: #c8cccb;
}
.cls-10, .cls-11, .cls-12, .cls-6, .cls-7, .cls-8, .cls-9 {
fill: none;
stroke-miterlimit: 10;
}
.cls-6 {
stroke: #999;
}
.cls-6, .cls-8 {
stroke-width: 1.35px;
}
.cls-10, .cls-11, .cls-12, .cls-7, .cls-8, .cls-9 {
stroke: #050606;
}
.cls-7 {
stroke-width: 4.05px;
}
.cls-9 {
stroke-width: 1.33px;
}
.cls-10 {
stroke-width: 2.66px;
}
.cls-11 {
stroke-width: 1.19px;
}
.cls-12 {
stroke-width: 1.31px;
}
</style></defs><g id="Layer_3" data-name="Layer 3"><rect
class="cls-1"
x="880.79"
y="713.97"
width="84.29"
height="27.63"
></rect><rect
class="cls-1"
x="887.38"
y="684.75"
width="71.66"
height="29.22"
></rect><rect
class="cls-1"
x="876.01"
y="620.75"
width="93.9"
height="64"
rx="15.57"
></rect><rect
class="cls-2"
x="891.84"
y="608.7"
width="62.51"
height="12.05"
></rect><path
class="cls-2"
d="M922.93,174.42h0a42.15,42.15,0,0,1,42.15,42.15V605.22a3.48,3.48,0,0,1-3.48,3.48H884.26a3.48,3.48,0,0,1-3.48-3.48V216.56a42.15,42.15,0,0,1,42.15-42.15Z"
></path><rect
class="cls-3"
x="756.66"
y="741.6"
width="549.89"
height="895.27"
rx="39.55"
></rect><path
class="cls-3"
d="M1274.64,647.59h-62.29a31.92,31.92,0,0,0-31.91,31.93v62.09l126.12,51.15V679.52A31.93,31.93,0,0,0,1274.64,647.59Zm3.87,59.81a13.86,13.86,0,0,1-13.87,13.86h-43.72a13.85,13.85,0,0,1-13.86-13.86V686.45a13.87,13.87,0,0,1,13.86-13.87h43.72a13.88,13.88,0,0,1,13.87,13.87Z"
></path><polygon
class="cls-4"
points="810.18 770.29 795.58 770.29 788.28 782.93 795.58 795.58 810.18 795.58 817.48 782.93 810.18 770.29"
></polygon><polygon
class="cls-4"
points="1253.04 770.29 1267.64 770.29 1274.94 782.93 1267.64 795.58 1253.04 795.58 1245.74 782.93 1253.04 770.29"
></polygon><polygon
class="cls-4"
points="810.18 1608.19 795.58 1608.19 788.28 1595.55 795.58 1582.9 810.18 1582.9 817.48 1595.55 810.18 1608.19"
></polygon><polygon
class="cls-4"
points="1253.04 1608.19 1267.64 1608.19 1274.94 1595.55 1267.64 1582.9 1253.04 1582.9 1245.74 1595.55 1253.04 1608.19"
></polygon><rect
class="cls-2"
x="872.9"
y="1131.27"
width="321.03"
height="160.93"
rx="17.15"
></rect><rect
class="cls-5"
x="811.61"
y="854.23"
width="37.22"
height="674.13"
rx="18.61"
></rect><path
class="cls-5"
d="M930.19,840.33v169.11a18.61,18.61,0,0,1-18.6,18.61h0A18.61,18.61,0,0,1,893,1009.44V840.91c0-10.24,8.37-19.19,18.6-19.19a18.62,18.62,0,0,1,18.61,18.61Z"
></path><path
class="cls-5"
d="M911.59,1323.24h0a18.61,18.61,0,0,1,18.6,18.61v198.51c0,10.05-7.72,18.72-17.76,19.16A18.59,18.59,0,0,1,893,1540.93V1341.85A18.61,18.61,0,0,1,911.59,1323.24Z"
></path><path
class="cls-5"
d="M1012,808.86V957.94a18.61,18.61,0,0,1-18.61,18.6h0a18.6,18.6,0,0,1-18.6-18.6V809.44c0-10.24,8.36-19.2,18.6-19.19A18.62,18.62,0,0,1,1012,808.86Z"
></path><path
class="cls-5"
d="M993.38,1323.24h0a18.61,18.61,0,0,1,18.61,18.61v231.46c0,10-7.73,18.72-17.77,19.16a18.59,18.59,0,0,1-19.44-18.59v-232A18.61,18.61,0,0,1,993.38,1323.24Z"
></path><rect
class="cls-5"
x="1218.69"
y="854.23"
width="37.22"
height="674.13"
rx="18.61"
transform="translate(2474.6 2382.59) rotate(180)"
></rect><path
class="cls-5"
d="M1137.33,840.33v169.11a18.61,18.61,0,0,0,18.61,18.61h0a18.61,18.61,0,0,0,18.6-18.61V840.91c0-10.24-8.36-19.19-18.6-19.19a18.64,18.64,0,0,0-18.61,18.61Z"
></path><path
class="cls-5"
d="M1155.94,1323.24h0a18.61,18.61,0,0,0-18.61,18.61v198.51c0,10.05,7.72,18.72,17.77,19.16a18.59,18.59,0,0,0,19.44-18.59V1341.85A18.61,18.61,0,0,0,1155.94,1323.24Z"
></path><path
class="cls-5"
d="M1055.53,808.86V957.94a18.61,18.61,0,0,0,18.61,18.6h0a18.61,18.61,0,0,0,18.61-18.6V809.44c0-10.24-8.37-19.2-18.61-19.19a18.62,18.62,0,0,0-18.61,18.61Z"
></path><path
class="cls-5"
d="M1074.14,1323.24h0a18.61,18.61,0,0,0-18.61,18.61v231.46c0,10,7.73,18.72,17.77,19.16a18.6,18.6,0,0,0,19.45-18.59v-232A18.61,18.61,0,0,0,1074.14,1323.24Z"
></path><path
class="cls-6"
d="M1294.4,841.87v694.74a14.87,14.87,0,0,1-14.87,14.87h-27.46a35.75,35.75,0,0,0-35.75,35.75v22.61a14.87,14.87,0,0,1-14.87,14.88H861.76a14.88,14.88,0,0,1-14.87-14.88v-22.61a35.74,35.74,0,0,0-35.75-35.75H783.69a14.87,14.87,0,0,1-14.87-14.87V841.87A14.87,14.87,0,0,1,783.69,827h27.45a35.75,35.75,0,0,0,35.75-35.75V768.63a14.87,14.87,0,0,1,14.87-14.87h339.69a14.87,14.87,0,0,1,14.87,14.87v22.62A35.76,35.76,0,0,0,1252.07,827h27.46A14.87,14.87,0,0,1,1294.4,841.87Z"
></path><rect
class="cls-5"
x="963.72"
y="986.16"
width="13.22"
height="126.83"
rx="1.27"
transform="translate(787.46 -368.06) rotate(35.4)"
></rect><path
class="cls-5"
d="M1144.31,1098.17l-8.71,6.19a1.28,1.28,0,0,1-1.77-.3l-64.47-90.7-64.46,90.7a1.28,1.28,0,0,1-1.77.3l-8.71-6.19a1.27,1.27,0,0,1-.3-1.77l67.12-94.45,4-5.67a5,5,0,0,1,8.17,0l4,5.67,67.13,94.45A1.28,1.28,0,0,1,1144.31,1098.17Z"
></path></g><g id="Layer_2" data-name="Layer 2"><rect
class="cls-7"
x="756.66"
y="741.6"
width="549.89"
height="895.27"
rx="39.55"
></rect><path
class="cls-7"
d="M1180.43,741.6V679.52a31.92,31.92,0,0,1,31.92-31.92h62.29a31.92,31.92,0,0,1,31.92,31.92V792.76"
></path><path
class="cls-7"
d="M834.74,741.61v47.3a25.93,25.93,0,0,1-25.94,25.93H756.66"
></path><circle
class="cls-8"
cx="802.88"
cy="782.93"
r="27.34"
></circle><polygon
class="cls-8"
points="810.18 770.29 795.58 770.29 788.28 782.93 795.58 795.58 810.18 795.58 817.48 782.93 810.18 770.29"
></polygon><path
class="cls-7"
d="M1306.56,814.84h-52.14a25.93,25.93,0,0,1-25.94-25.93v-47.3"
></path><circle
class="cls-8"
cx="1260.34"
cy="782.93"
r="27.34"
></circle><polygon
class="cls-8"
points="1253.04 770.29 1267.64 770.29 1274.94 782.93 1267.64 795.58 1253.04 795.58 1245.74 782.93 1253.04 770.29"
></polygon><path
class="cls-7"
d="M756.66,1563.63H808.8a25.94,25.94,0,0,1,25.94,25.94v47.3"
></path><circle
class="cls-8"
cx="802.88"
cy="1595.55"
r="27.34"
></circle><polygon
class="cls-8"
points="810.18 1608.19 795.58 1608.19 788.28 1595.55 795.58 1582.9 810.18 1582.9 817.48 1595.55 810.18 1608.19"
></polygon><path
class="cls-7"
d="M1228.48,1636.87v-47.3a25.94,25.94,0,0,1,25.94-25.94h52.14"
></path><circle
class="cls-8"
cx="1260.34"
cy="1595.55"
r="27.34"
></circle><polygon
class="cls-8"
points="1253.04 1608.19 1267.64 1608.19 1274.94 1595.55 1267.64 1582.9 1253.04 1582.9 1245.74 1595.55 1253.04 1608.19"
></polygon><rect
class="cls-8"
x="872.9"
y="1131.27"
width="321.03"
height="160.93"
rx="17.15"
></rect><rect
class="cls-8"
x="811.61"
y="854.23"
width="37.22"
height="674.13"
rx="18.61"
></rect><path
class="cls-8"
d="M930.19,840.33v169.11a18.61,18.61,0,0,1-18.6,18.61h0A18.61,18.61,0,0,1,893,1009.44V840.91c0-10.24,8.37-19.19,18.6-19.19a18.62,18.62,0,0,1,18.61,18.61Z"
></path><path
class="cls-8"
d="M911.59,1323.24h0a18.61,18.61,0,0,1,18.6,18.61v198.51c0,10.05-7.72,18.72-17.76,19.16A18.59,18.59,0,0,1,893,1540.93V1341.85A18.61,18.61,0,0,1,911.59,1323.24Z"
></path><path
class="cls-8"
d="M1012,808.86V957.94a18.61,18.61,0,0,1-18.61,18.6h0a18.6,18.6,0,0,1-18.6-18.6V809.44c0-10.24,8.36-19.2,18.6-19.19A18.62,18.62,0,0,1,1012,808.86Z"
></path><path
class="cls-8"
d="M993.38,1323.24h0a18.61,18.61,0,0,1,18.61,18.61v231.46c0,10-7.73,18.72-17.77,19.16a18.59,18.59,0,0,1-19.44-18.59v-232A18.61,18.61,0,0,1,993.38,1323.24Z"
></path><rect
class="cls-8"
x="1218.69"
y="854.23"
width="37.22"
height="674.13"
rx="18.61"
transform="translate(2474.6 2382.59) rotate(180)"
></rect><path
class="cls-8"
d="M1137.33,840.33v169.11a18.61,18.61,0,0,0,18.61,18.61h0a18.61,18.61,0,0,0,18.6-18.61V840.91c0-10.24-8.36-19.19-18.6-19.19a18.64,18.64,0,0,0-18.61,18.61Z"
></path><path
class="cls-8"
d="M1155.94,1323.24h0a18.61,18.61,0,0,0-18.61,18.61v198.51c0,10.05,7.72,18.72,17.77,19.16a18.59,18.59,0,0,0,19.44-18.59V1341.85A18.61,18.61,0,0,0,1155.94,1323.24Z"
></path><path
class="cls-8"
d="M1055.53,808.86V957.94a18.61,18.61,0,0,0,18.61,18.6h0a18.61,18.61,0,0,0,18.61-18.6V809.44c0-10.24-8.37-19.2-18.61-19.19a18.62,18.62,0,0,0-18.61,18.61Z"
></path><path
class="cls-8"
d="M1074.14,1323.24h0a18.61,18.61,0,0,0-18.61,18.61v231.46c0,10,7.73,18.72,17.77,19.16a18.6,18.6,0,0,0,19.45-18.59v-232A18.61,18.61,0,0,0,1074.14,1323.24Z"
></path><rect
class="cls-7"
x="1207.05"
y="672.58"
width="71.46"
height="48.69"
rx="13.87"
></rect><rect
class="cls-9"
x="1200.59"
y="665.84"
width="84.39"
height="61.92"
rx="20.35"
></rect><rect
class="cls-7"
x="880.79"
y="713.97"
width="84.29"
height="27.63"
></rect><rect
class="cls-7"
x="887.38"
y="684.75"
width="71.66"
height="29.22"
></rect><rect
class="cls-7"
x="876.01"
y="620.75"
width="93.9"
height="64"
rx="15.57"
></rect><rect
class="cls-7"
x="891.84"
y="608.7"
width="62.51"
height="12.05"
></rect><path
class="cls-7"
d="M922.93,174.42h0a42.15,42.15,0,0,1,42.15,42.15V605.22a3.48,3.48,0,0,1-3.48,3.48H884.26a3.48,3.48,0,0,1-3.48-3.48V216.56a42.15,42.15,0,0,1,42.15-42.15Z"
></path><line
class="cls-10"
x1="880.79"
y1="251.39"
x2="965.08"
y2="251.39"
></line><line
class="cls-10"
x1="880.79"
y1="260.37"
x2="965.08"
y2="260.37"
></line><rect
class="cls-11"
x="963.72"
y="986.16"
width="13.22"
height="126.83"
rx="1.27"
transform="translate(787.46 -368.06) rotate(35.4)"
></rect><path
class="cls-12"
d="M1144.31,1098.17l-8.71,6.19a1.28,1.28,0,0,1-1.77-.3l-64.47-90.7-64.46,90.7a1.28,1.28,0,0,1-1.77.3l-8.71-6.19a1.27,1.27,0,0,1-.3-1.77l67.12-94.45,4-5.67a5,5,0,0,1,8.17,0l4,5.67,67.13,94.45A1.28,1.28,0,0,1,1144.31,1098.17Z"
></path></g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 89 KiB

@@ -0,0 +1,546 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="713.62 574.61 677 692.34">
<defs><style>
.cls-1 {
fill: #d3d3d3;
}
.cls-2 {
fill: #bfbfbe;
}
.cls-3 {
fill: #b0b0af;
}
.cls-4 {
fill: #e5e5e3;
}
.cls-5 {
fill: #353535;
}
.cls-6, .cls-7 {
fill: none;
stroke: #050606;
stroke-miterlimit: 10;
}
.cls-6 {
stroke-width: 1.65px;
}
.cls-7 {
stroke-width: 3px;
}
.cls-8 {
fill: #cccccb;
}
</style></defs><g id="Layer_4" data-name="Layer 4"><path
class="cls-1"
d="M742.78,1220.62c-19.75-8.13-31.52-23.69-26.5-40.61l69.29-233.38a11,11,0,0,1,2.09,4.35l4.07,19.26"
></path><path
class="cls-2"
d="M790,962.24l-65.73,221.37a30.26,30.26,0,0,0,33.33,38.56L842.4,1210"
></path><path
class="cls-3"
d="M807.29,1043.86l-30.5,104.26-18.71,2.1,30-98.73a3,3,0,0,0-2.87-3.87,6.45,6.45,0,0,1-6.16-8.36l16.23-52.36Z"
></path><polygon
class="cls-3"
points="828.12 1142.37 783.87 1147.34 809.96 1056.49 828.12 1142.37"
></polygon><path
class="cls-3"
d="M775.27,1153.34,761.91,1199a3.68,3.68,0,0,1,0-2.11,5.17,5.17,0,0,0-5-6.53h-2.43a6.34,6.34,0,0,1-6.07-8.19l8.14-26.82Z"
></path><polygon
class="cls-3"
points="839.03 1193.99 768.37 1201.28 782.36 1152.58 829.2 1147.52 839.03 1193.99"
></polygon><path
class="cls-4"
d="M1375,1178.08c-9.54,7.22-39,20.08-59.5,23.23l-414.72,63.57A48.48,48.48,0,0,1,846,1227l-7-33L795.25,986.9,787.66,951a10,10,0,0,0-2.09-4.35l-9.8-11.87a10,10,0,0,1-2.09-4.35L718.39,668.87c-.1-.45-.18-.91-.26-1.36a26.13,26.13,0,0,1,14.41-27.36l36.79-18.33c11.15-5.55,21.79-6.71,34.35-7.73Z"
></path><path
class="cls-1"
d="M1235.26,576.22a28.15,28.15,0,0,1,29.92,21.84l123.06,543.61a35.82,35.82,0,0,1-29.51,43.32L944,1248.56a48.48,48.48,0,0,1-54.77-37.89L770.75,650.17A29.51,29.51,0,0,1,797,614.67Z"
></path><path
class="cls-5"
d="M802.91,657.25,916.05,1194.5a17,17,0,0,0,19.22,13.33l426-64.41a14.6,14.6,0,0,0,12-17.67L1257.48,615.46a14.27,14.27,0,0,0-15.18-11.05L813.65,642.73A12.07,12.07,0,0,0,802.91,657.25Z"
></path><path
class="cls-6"
d="M802.91,657.25,916.05,1194.5a17,17,0,0,0,19.22,13.33l426-64.41a14.6,14.6,0,0,0,12-17.67L1257.48,615.46a14.27,14.27,0,0,0-15.18-11.05L813.65,642.73A12.07,12.07,0,0,0,802.91,657.25Z"
></path><path
class="cls-7"
d="M1235.26,576.22a28.15,28.15,0,0,1,29.92,21.84l123.06,543.61a35.82,35.82,0,0,1-29.51,43.32L944,1248.56a48.48,48.48,0,0,1-54.77-37.89L770.75,650.17A29.51,29.51,0,0,1,797,614.67Z"
></path><path
class="cls-7"
d="M803.68,614.09c-12.56,1-23.2,2.18-34.35,7.73l-36.79,18.33a26.12,26.12,0,0,0-14.41,27.36c.08.46.16.91.26,1.36l55.29,261.54a10,10,0,0,0,2.09,4.35l9.8,11.87a10,10,0,0,1,2.09,4.35L846,1227a48.48,48.48,0,0,0,54.77,37.89l414.72-63.57c20.54-3.15,50-16,59.5-23.22"
></path><path
class="cls-7"
d="M742.78,1220.62c-19.75-8.13-31.52-23.69-26.5-40.61l69.29-233.38"
></path><path
class="cls-7"
d="M790,962.24l-65.73,221.37a30.26,30.26,0,0,0,33.33,38.56L842.4,1210"
></path><ellipse
class="cls-8"
cx="837.63"
cy="1070.6"
rx="2.7"
ry="3.34"
transform="translate(-119.45 105.29) rotate(-6.72)"
></ellipse><ellipse
class="cls-8"
cx="776.45"
cy="893.91"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="783.68"
cy="890.78"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="790.92"
cy="887.66"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="798.15"
cy="884.53"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="805.38"
cy="881.4"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="774.39"
cy="883.96"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="781.62"
cy="880.84"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="788.85"
cy="877.71"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="796.08"
cy="874.58"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="803.31"
cy="871.46"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="772.32"
cy="874.01"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="779.56"
cy="870.89"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="786.79"
cy="867.76"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="794.02"
cy="864.64"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="801.25"
cy="861.51"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="770.26"
cy="864.07"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="777.49"
cy="860.94"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="784.72"
cy="857.81"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="791.95"
cy="854.69"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="799.18"
cy="851.56"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="768.2"
cy="854.12"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="775.43"
cy="850.99"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="782.66"
cy="847.87"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="789.89"
cy="844.74"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="797.12"
cy="841.61"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="766.13"
cy="844.17"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="773.36"
cy="841.05"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="780.59"
cy="837.92"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="787.82"
cy="834.79"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="795.05"
cy="831.67"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="764.07"
cy="834.23"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="771.3"
cy="831.1"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="778.53"
cy="827.97"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="785.76"
cy="824.85"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="792.99"
cy="821.72"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="762"
cy="824.28"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="769.23"
cy="821.15"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="776.46"
cy="818.03"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="783.69"
cy="814.9"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="790.92"
cy="811.77"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="759.94"
cy="814.33"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="767.17"
cy="811.21"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="774.4"
cy="808.08"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="781.63"
cy="804.95"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="788.86"
cy="801.83"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="757.87"
cy="804.38"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="765.1"
cy="801.26"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="772.33"
cy="798.13"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="779.57"
cy="795.01"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="786.8"
cy="791.88"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="755.81"
cy="794.44"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="763.04"
cy="791.31"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="770.27"
cy="788.18"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="777.5"
cy="785.06"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="784.73"
cy="781.93"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="753.74"
cy="784.49"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="760.97"
cy="781.36"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="768.21"
cy="778.24"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="775.44"
cy="775.11"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="782.67"
cy="771.98"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="751.68"
cy="774.54"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="758.91"
cy="771.42"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="766.14"
cy="768.29"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="773.37"
cy="765.16"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="780.6"
cy="762.04"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="749.62"
cy="764.6"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="756.85"
cy="761.47"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="764.08"
cy="758.34"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="771.31"
cy="755.22"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="778.54"
cy="752.09"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="747.55"
cy="754.65"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="754.78"
cy="751.52"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="762.01"
cy="748.4"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="769.24"
cy="745.27"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="776.47"
cy="742.14"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="841.13"
cy="1084.42"
rx="2.7"
ry="3.34"
transform="translate(-121.04 105.8) rotate(-6.72)"
></ellipse><ellipse
class="cls-8"
cx="844.62"
cy="1098.25"
rx="2.7"
ry="3.34"
transform="translate(-122.63 106.3) rotate(-6.72)"
></ellipse></g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 34 KiB

+512
View File
@@ -0,0 +1,512 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="340.47 223.69 263.8 485.94">
<defs><style>
.cls-1 {
fill: #434143;
}
.cls-2, .cls-6, .cls-7 {
fill: none;
}
.cls-2 {
stroke: #050606;
stroke-miterlimit: 10;
}
.cls-3 {
fill: #2b2b2b;
}
.cls-4 {
fill: #181818;
}
.cls-5 {
fill: #e8eae8;
}
.cls-6, .cls-7 {
stroke: #e8eae8;
stroke-linecap: round;
stroke-linejoin: round;
}
.cls-7 {
stroke-width: 2px;
}
.cls-8 {
fill: #b1a368;
}
</style></defs><g id="Layer_2" data-name="Layer 2"><rect
class="cls-1"
x="340.97"
y="258.81"
width="262.8"
height="450.32"
rx="27.43"
></rect><rect
class="cls-2"
x="340.97"
y="258.81"
width="262.8"
height="450.32"
rx="27.43"
></rect><circle
class="cls-3"
cx="364.66"
cy="281.32"
r="10.92"
></circle><circle
class="cls-2"
cx="364.66"
cy="281.32"
r="10.92"
></circle><path
class="cls-4"
d="M372.05,281.32a2.39,2.39,0,0,1-2.39,2.38h-2.61v2.62a2.38,2.38,0,1,1-4.76,0V283.7h-2.63a2.39,2.39,0,1,1,0-4.77h2.63v-2.62a2.38,2.38,0,0,1,2.37-2.38,2.39,2.39,0,0,1,2.39,2.38v2.62h2.61A2.4,2.4,0,0,1,372.05,281.32Z"
></path><circle
class="cls-3"
cx="579.41"
cy="281.32"
r="10.92"
></circle><circle
class="cls-2"
cx="579.41"
cy="281.32"
r="10.92"
></circle><path
class="cls-4"
d="M586.79,281.32a2.39,2.39,0,0,1-2.38,2.38h-2.62v2.62a2.38,2.38,0,1,1-4.76,0V283.7h-2.62a2.39,2.39,0,1,1,0-4.77H577v-2.62a2.38,2.38,0,0,1,4.76,0v2.62h2.62A2.39,2.39,0,0,1,586.79,281.32Z"
></path><circle
class="cls-3"
cx="364.66"
cy="683.91"
r="10.92"
></circle><circle
class="cls-2"
cx="364.66"
cy="683.91"
r="10.92"
></circle><path
class="cls-4"
d="M372.05,683.92a2.39,2.39,0,0,1-2.39,2.38h-2.61v2.62a2.38,2.38,0,1,1-4.76,0V686.3h-2.63a2.39,2.39,0,1,1,0-4.77h2.63v-2.62a2.38,2.38,0,0,1,2.37-2.38,2.39,2.39,0,0,1,2.39,2.38v2.62h2.61A2.4,2.4,0,0,1,372.05,683.92Z"
></path><circle
class="cls-3"
cx="579.41"
cy="683.91"
r="10.92"
></circle><circle
class="cls-2"
cx="579.41"
cy="683.91"
r="10.92"
></circle><path
class="cls-4"
d="M586.79,683.92a2.39,2.39,0,0,1-2.38,2.38h-2.62v2.62a2.38,2.38,0,0,1-4.76,0V686.3h-2.62a2.39,2.39,0,1,1,0-4.77H577v-2.62a2.38,2.38,0,0,1,4.76,0v2.62h2.62A2.39,2.39,0,0,1,586.79,683.92Z"
></path><circle
class="cls-3"
cx="561.1"
cy="512.26"
r="10.92"
></circle><circle
class="cls-2"
cx="561.1"
cy="512.26"
r="10.92"
></circle><path
class="cls-4"
d="M568.49,512.26a2.39,2.39,0,0,1-2.38,2.38h-2.62v2.62a2.38,2.38,0,1,1-4.76,0v-2.62h-2.62a2.39,2.39,0,1,1,0-4.77h2.62v-2.62a2.38,2.38,0,0,1,4.76,0v2.62h2.62A2.39,2.39,0,0,1,568.49,512.26Z"
></path><circle
class="cls-3"
cx="478.84"
cy="406.37"
r="10.92"
></circle><circle
class="cls-2"
cx="478.84"
cy="406.37"
r="10.92"
></circle><path
class="cls-4"
d="M486.22,406.37a2.39,2.39,0,0,1-2.38,2.38h-2.62v2.62a2.38,2.38,0,1,1-4.76,0v-2.62h-2.62a2.39,2.39,0,1,1,0-4.77h2.62v-2.62a2.38,2.38,0,0,1,4.76,0V404h2.62A2.39,2.39,0,0,1,486.22,406.37Z"
></path><rect
class="cls-3"
x="380.01"
y="302.06"
width="5.45"
height="72.48"
rx="1.75"
></rect><rect
class="cls-3"
x="399.24"
y="302.06"
width="5.45"
height="72.48"
rx="1.75"
></rect><rect
class="cls-3"
x="418.47"
y="302.06"
width="5.45"
height="72.48"
rx="1.75"
></rect><rect
class="cls-5"
x="442.52"
y="443.28"
width="6.5"
height="54.62"
transform="translate(348.12 -170.22) rotate(34.78)"
></rect><path
class="cls-5"
d="M521.39,490.76l-5.34,3.71L489,455.92,462,494.9l-5.34-3.71,28.32-41,1.06-1.53a3.53,3.53,0,0,1,5.8,0l1.06,1.53Z"
></path><rect
class="cls-3"
x="437.7"
y="302.06"
width="5.45"
height="72.48"
rx="1.75"
></rect><rect
class="cls-3"
x="492.51"
y="302.06"
width="5.45"
height="72.48"
rx="1.75"
></rect><rect
class="cls-3"
x="511.74"
y="302.06"
width="5.45"
height="72.48"
rx="1.75"
></rect><rect
class="cls-3"
x="530.97"
y="302.06"
width="5.45"
height="72.48"
rx="1.75"
></rect><rect
class="cls-3"
x="550.2"
y="302.06"
width="5.45"
height="72.48"
rx="1.75"
></rect><rect
class="cls-3"
x="465.19"
y="302.06"
width="5.45"
height="72.48"
rx="1.75"
></rect><path
class="cls-5"
d="M420.79,519.77l4-.25a3.13,3.13,0,0,0,.53,1.48,2.21,2.21,0,0,0,1.85.82,2,2,0,0,0,1.38-.42,1.24,1.24,0,0,0,.49-1,1.29,1.29,0,0,0-.46-.95,5.44,5.44,0,0,0-2.15-.78,9.1,9.1,0,0,1-3.93-1.65,3.31,3.31,0,0,1-1.19-2.62,3.59,3.59,0,0,1,.61-2,4,4,0,0,1,1.82-1.46,8.43,8.43,0,0,1,3.34-.54,6.85,6.85,0,0,1,4,1,4.17,4.17,0,0,1,1.62,3.08l-3.95.23a2.06,2.06,0,0,0-.66-1.33,2.1,2.1,0,0,0-1.39-.42,1.66,1.66,0,0,0-1.1.31,1,1,0,0,0-.37.75.76.76,0,0,0,.31.59,3.42,3.42,0,0,0,1.4.5,17.67,17.67,0,0,1,3.94,1.19,4.19,4.19,0,0,1,1.73,1.51,3.8,3.8,0,0,1,.54,2,4.31,4.31,0,0,1-.72,2.41,4.57,4.57,0,0,1-2,1.67,8.13,8.13,0,0,1-3.27.57c-2.3,0-3.9-.45-4.79-1.33A5.26,5.26,0,0,1,420.79,519.77Z"
></path><path
class="cls-5"
d="M439.49,510.7v3.73h2.07v2.76h-2.07v3.48a1.85,1.85,0,0,0,.12.83.69.69,0,0,0,.65.32,4.09,4.09,0,0,0,1.16-.24l.28,2.59a11.86,11.86,0,0,1-2.61.31,4.54,4.54,0,0,1-2.07-.36,2.2,2.2,0,0,1-1-1.1,6.25,6.25,0,0,1-.32-2.37v-3.46h-1.39v-2.76h1.39v-1.8Z"
></path><path
class="cls-5"
d="M446.79,517.62l-3.6-.38a4.06,4.06,0,0,1,.59-1.49,3.23,3.23,0,0,1,1.1-.94,4.57,4.57,0,0,1,1.43-.44,11,11,0,0,1,2-.16,15.27,15.27,0,0,1,2.72.19,3.56,3.56,0,0,1,1.71.79,2.84,2.84,0,0,1,.76,1.18,4.43,4.43,0,0,1,.28,1.46v4.34a5.16,5.16,0,0,0,.08,1.08,4.81,4.81,0,0,0,.39,1h-3.54a3.68,3.68,0,0,1-.27-.58,3.18,3.18,0,0,1-.13-.63,4.9,4.9,0,0,1-1.47,1,6.18,6.18,0,0,1-2.33.41,3.86,3.86,0,0,1-2.66-.81,2.76,2.76,0,0,1-.26-3.85,4.52,4.52,0,0,1,2.42-1.08c1.42-.28,2.33-.48,2.75-.59s.86-.27,1.33-.45a1.32,1.32,0,0,0-.28-1,1.42,1.42,0,0,0-1-.28,2.59,2.59,0,0,0-1.39.3A1.6,1.6,0,0,0,446.79,517.62Zm3.26,2c-.51.18-1.05.34-1.62.49a3.72,3.72,0,0,0-1.45.6,1,1,0,0,0,0,1.42,1.34,1.34,0,0,0,.91.28,2.28,2.28,0,0,0,1.17-.31,1.84,1.84,0,0,0,.77-.74,2.49,2.49,0,0,0,.22-1.14Z"
></path><path
class="cls-5"
d="M460.21,510.7v3.73h2.07v2.76h-2.07v3.48a1.85,1.85,0,0,0,.12.83.69.69,0,0,0,.65.32,4.09,4.09,0,0,0,1.16-.24l.28,2.59a11.86,11.86,0,0,1-2.61.31,4.57,4.57,0,0,1-2.07-.36,2.2,2.2,0,0,1-1-1.1,6.25,6.25,0,0,1-.32-2.37v-3.46h-1.39v-2.76h1.39v-1.8Z"
></path><path
class="cls-5"
d="M464.22,510.7H468v2.56h-3.76Zm0,3.73H468v9.83h-3.76Z"
></path><path
class="cls-5"
d="M469.92,519.37a4.91,4.91,0,0,1,1.52-3.7,6.58,6.58,0,0,1,8.56.25,5.36,5.36,0,0,1-.29,7.11,5.74,5.74,0,0,1-4.16,1.45,5.83,5.83,0,0,1-3.83-1.2A4.84,4.84,0,0,1,469.92,519.37Zm3.78,0a3,3,0,0,0,.53,1.95,1.74,1.74,0,0,0,2.67,0,3.08,3.08,0,0,0,.53-2,2.89,2.89,0,0,0-.53-1.9,1.64,1.64,0,0,0-1.31-.63,1.67,1.67,0,0,0-1.35.64A2.89,2.89,0,0,0,473.7,519.36Z"
></path><path
class="cls-5"
d="M483,514.43h3.51V516a5.16,5.16,0,0,1,1.59-1.4,4.2,4.2,0,0,1,2-.42,3.23,3.23,0,0,1,2.45.93,4,4,0,0,1,.88,2.87v6.25h-3.78v-5.41a2,2,0,0,0-.34-1.3,1.22,1.22,0,0,0-1-.39,1.37,1.37,0,0,0-1.11.52,3.07,3.07,0,0,0-.42,1.86v4.72H483Z"
></path><path
class="cls-5"
d="M509,519.35v-2.83h6.48v5.79a13.27,13.27,0,0,1-3.29,1.72,11,11,0,0,1-3.39.46,8.38,8.38,0,0,1-3.94-.82,5.6,5.6,0,0,1-2.35-2.46,8,8,0,0,1-.84-3.73,7.85,7.85,0,0,1,.91-3.87,6,6,0,0,1,2.69-2.49,8.68,8.68,0,0,1,3.71-.66,10.45,10.45,0,0,1,3.36.41,4.37,4.37,0,0,1,1.85,1.26,5.63,5.63,0,0,1,1.1,2.17l-4,.73a2.16,2.16,0,0,0-.84-1.18,2.68,2.68,0,0,0-1.53-.41,2.72,2.72,0,0,0-2.19,1,4.59,4.59,0,0,0-.82,3,4.72,4.72,0,0,0,.83,3.15,2.93,2.93,0,0,0,2.3.94,4.64,4.64,0,0,0,1.35-.2,7.55,7.55,0,0,0,1.46-.7v-1.27Z"
></path><path
class="cls-5"
d="M528.42,524.26h-11.3a7,7,0,0,1,1.18-3.15,16,16,0,0,1,3.69-3.49,11.11,11.11,0,0,0,2.12-1.86,2.11,2.11,0,0,0,.47-1.22,1.42,1.42,0,0,0-.46-1,1.58,1.58,0,0,0-1.15-.44,1.61,1.61,0,0,0-1.18.45,2.75,2.75,0,0,0-.62,1.6l-3.77-.31a6,6,0,0,1,.81-2.48,3.85,3.85,0,0,1,1.67-1.37,7.49,7.49,0,0,1,3-.48,8.47,8.47,0,0,1,3.1.46,3.71,3.71,0,0,1,2.37,3.5,4.32,4.32,0,0,1-.72,2.36,9.93,9.93,0,0,1-2.65,2.48c-.75.53-1.26.89-1.52,1.1s-.55.49-.9.83h5.88Z"
></path><rect
class="cls-3"
x="407.64"
y="558.27"
width="135.85"
height="67.27"
rx="3.52"
></rect><rect
class="cls-2"
x="407.64"
y="558.27"
width="135.85"
height="67.27"
rx="3.52"
></rect><circle class="cls-6" cx="586.93" cy="513.44" r="9.9"></circle><rect
class="cls-5"
x="581.12"
y="512.62"
width="9.09"
height="1.63"
rx="0.82"
></rect><circle
class="cls-5"
cx="591.91"
cy="513.44"
r="0.83"
></circle><path
class="cls-5"
d="M595.54,604.4v-2a3.26,3.26,0,0,0-3.27-3.27H579.86a3.26,3.26,0,0,0-3.27,3.27v14.63a3.26,3.26,0,0,0,3.27,3.27h12.41a3.26,3.26,0,0,0,3.27-3.27v-1.57h-6.38V604.4ZM584,615.49h-5.05V604.4H584Z"
></path><rect
class="cls-5"
x="592.44"
y="610.44"
width="4.83"
height="3.64"
rx="0.91"
></rect><path
class="cls-7"
d="M579,655.86a9.88,9.88,0,0,0,15.29-1"
></path><path
class="cls-7"
d="M595.57,652.31a9.9,9.9,0,1,0-19.26-3.19"
></path><polygon
class="cls-5"
points="571.82 649.11 580.81 649.11 576.5 653.13 571.82 649.11"
></polygon><path
class="cls-6"
d="M513.83,395.84l-10,18.22a1.21,1.21,0,0,0,1.06,1.79H525a1.21,1.21,0,0,0,1.06-1.8L516,395.83A1.21,1.21,0,0,0,513.83,395.84Z"
></path><line
class="cls-6"
x1="508.31"
y1="412.99"
x2="521.75"
y2="412.99"
></line><path
class="cls-6"
d="M511.9,411.29s1.88-2,.68-3.24-2.34-2.69-.68-4.1"
></path><path
class="cls-6"
d="M514.9,411.29s1.88-2,.69-3.24-2.35-2.69-.69-4.1"
></path><path
class="cls-6"
d="M517.91,411.29s1.87-2,.68-3.24-2.35-2.69-.68-4.1"
></path><rect
class="cls-8"
x="497.97"
y="253.53"
width="25.55"
height="5.28"
></rect><path
class="cls-8"
d="M502.42,224.19h17a1.73,1.73,0,0,1,1.73,1.73v27.61a0,0,0,0,1,0,0H500.69a0,0,0,0,1,0,0V225.92A1.73,1.73,0,0,1,502.42,224.19Z"
></path><rect
class="cls-8"
x="497.97"
y="230.25"
width="25.55"
height="19.98"
rx="1.55"
></rect><rect
class="cls-2"
x="497.97"
y="253.53"
width="25.55"
height="5.28"
></rect><path
class="cls-2"
d="M521.11,225.92v4.33H500.68v-4.33a1.73,1.73,0,0,1,1.74-1.73h16.95A1.73,1.73,0,0,1,521.11,225.92Z"
></path><rect
class="cls-2"
x="500.68"
y="250.22"
width="20.43"
height="3.31"
></rect><path
class="cls-2"
d="M523.51,231.8v16.87a1.54,1.54,0,0,1-1.55,1.55H499.52a1.55,1.55,0,0,1-1.56-1.55V231.8a1.55,1.55,0,0,1,1.56-1.55H522A1.54,1.54,0,0,1,523.51,231.8Z"
></path><path
class="cls-5"
d="M382.68,266.74H383c.17,0,.27.07.28.19l.31,3.68c0,.35.11.53.18.53s.2-.17.31-.5l.34-1a.2.2,0,0,1,.2-.11.23.23,0,0,1,.2.11l.33,1c.11.33.21.5.29.5s.15-.18.18-.53l.32-3.68c0-.12.1-.19.28-.19h.38c.18,0,.28.08.28.21l-.55,6.79c0,.12-.12.19-.29.19h-.45c-.14,0-.26-.06-.28-.16l-.42-1.45c-.09-.28-.19-.43-.28-.43s-.19.15-.27.43l-.41,1.45c0,.1-.14.16-.29.16h-.46c-.17,0-.27-.07-.28-.19l-.55-6.79C382.39,266.82,382.5,266.74,382.68,266.74Z"
></path><path
class="cls-5"
d="M390.76,273.76l-.28-1.33c0-.11-.14-.17-.28-.17h-1.29a.27.27,0,0,0-.28.17l-.26,1.33a.29.29,0,0,1-.29.17h-.34c-.19,0-.29-.07-.29-.19a1.58,1.58,0,0,1,0-.21l1.42-6.62c0-.11.14-.17.28-.17h.75c.14,0,.26.06.28.17l1.41,6.62a1.58,1.58,0,0,1,0,.21c0,.12-.11.19-.29.19h-.33A.28.28,0,0,1,390.76,273.76Zm-1.21-5c-.1,0-.19.2-.28.6l-.36,1.78a1,1,0,0,0,0,.24c0,.11.1.18.27.18H390c.16,0,.28-.06.28-.18a1,1,0,0,0,0-.24l-.37-1.78C389.75,269,389.66,268.78,389.55,268.78Z"
></path><path
class="cls-5"
d="M393.2,273.93h-.4c-.16,0-.28-.08-.28-.2v-6.79c0-.12.12-.2.28-.2h1.68c1,0,1.91.52,1.91,1.54v.78a1.42,1.42,0,0,1-.85,1.32.19.19,0,0,0-.13.19.49.49,0,0,0,0,.15l.87,2.69a1.13,1.13,0,0,1,.09.33c0,.12-.09.19-.28.19h-.41c-.15,0-.26-.06-.29-.16l-.93-3c0-.09-.14-.15-.28-.15h-.44c-.17,0-.28.08-.28.2v2.92C393.49,273.85,393.37,273.93,393.2,273.93Zm.57-6.51c-.17,0-.28.08-.28.2v2.1c0,.12.11.21.28.21h.71c.53,0,1-.28,1-.8v-.91c0-.53-.43-.8-1-.8Z"
></path><path
class="cls-5"
d="M401,273.93h-.46a.3.3,0,0,1-.29-.15L399,270.5c-.16-.41-.29-.61-.4-.61s-.15.22-.15.67v3.17c0,.12-.12.2-.28.2h-.38c-.17,0-.28-.08-.28-.2v-6.79c0-.12.11-.2.28-.2h.54c.13,0,.25.05.27.15l1.24,3.19c.17.42.3.64.4.64s.16-.23.16-.69v-3.09c0-.12.11-.2.28-.2H401c.17,0,.28.08.28.2v6.79C401.3,273.85,401.19,273.93,401,273.93Z"
></path><path
class="cls-5"
d="M406.34,273.45v.28c0,.12-.12.2-.29.2h-3.47c-.16,0-.28-.08-.28-.2v-.28c0-.12.12-.2.28-.2h.95c.16,0,.28-.08.28-.2v-5.43c0-.12-.12-.2-.28-.2h-.95c-.16,0-.28-.08-.28-.2v-.28c0-.12.12-.2.28-.2h3.47c.17,0,.29.08.29.2v.28c0,.12-.12.2-.29.2h-1c-.17,0-.28.08-.28.2v5.43c0,.12.11.2.28.2h1C406.22,273.25,406.34,273.33,406.34,273.45Z"
></path><path
class="cls-5"
d="M410.85,273.93h-.46a.3.3,0,0,1-.29-.15l-1.29-3.28c-.16-.41-.29-.61-.39-.61s-.16.22-.16.67v3.17c0,.12-.12.2-.28.2h-.38c-.17,0-.28-.08-.28-.2v-6.79c0-.12.11-.2.28-.2h.54a.27.27,0,0,1,.28.15l1.23,3.19c.17.42.3.64.4.64s.16-.23.16-.69v-3.09c0-.12.11-.2.28-.2h.36c.17,0,.29.08.29.2v6.79C411.14,273.85,411,273.93,410.85,273.93Z"
></path><path
class="cls-5"
d="M415.1,271.54c0-.12-.12-.2-.29-.2h-.33c-.17,0-.29-.08-.29-.2v-.28c0-.12.12-.2.29-.2h1.29c.16,0,.28.08.28.2v1.59a2,2,0,0,1-3.82,0v-4.23a2,2,0,0,1,3.82,0v.19c0,.12-.12.2-.27.2h-.37c-.17,0-.29-.08-.29-.2v-.25c0-.53-.44-.81-1-.81s-1,.28-1,.81v4.36c0,.52.41.8.94.8s1-.28,1-.8Z"
></path><path
class="cls-5"
d="M418,269.21h-.4c-.17,0-.28-.08-.28-.2v-.38c0-.12.11-.2.28-.2h.4c.17,0,.28.08.28.2V269C418.32,269.13,418.21,269.21,418,269.21Zm0,3.08h-.4c-.17,0-.28-.09-.28-.21v-.37c0-.12.11-.2.28-.2h.4c.17,0,.28.08.28.2v.37C418.32,272.2,418.21,272.29,418,272.29Z"
></path><path
class="cls-5"
d="M424.5,267.91c0-.78.5-1.17,1.51-1.17h.81c1,0,1.5.39,1.5,1.17v4.85c0,.78-.49,1.17-1.5,1.17H426c-1,0-1.51-.39-1.51-1.17Zm1,4.91c0,.29.18.43.54.43h.81c.36,0,.55-.14.55-.43v-5c0-.29-.19-.43-.55-.43H426c-.36,0-.54.14-.54.43Z"
></path><path
class="cls-5"
d="M430.1,273.93h-.4c-.17,0-.28-.08-.28-.2v-6.79c0-.12.11-.2.28-.2h1.57c1,0,1.93.52,1.93,1.54v.82c0,1-1,1.54-1.93,1.54h-.6c-.17,0-.29.08-.29.2v2.89C430.38,273.85,430.27,273.93,430.1,273.93Zm.57-6.51c-.17,0-.29.08-.29.2v2.14c0,.12.12.2.29.2h.6c.53,0,1-.27,1-.8v-.94c0-.53-.42-.8-1-.8Z"
></path><path
class="cls-5"
d="M437.53,270.16v.28c0,.12-.12.2-.28.2h-1.67c-.16,0-.28.08-.28.2v2.21c0,.12.12.2.28.2H438c.17,0,.28.08.28.2v.28c0,.12-.11.2-.28.2h-3.36c-.17,0-.29-.08-.29-.2v-6.79c0-.12.12-.2.29-.2H438c.17,0,.28.08.28.2v.28c0,.12-.11.2-.28.2h-2.4c-.16,0-.28.08-.28.2v2.14c0,.12.12.2.28.2h1.67C437.41,270,437.53,270,437.53,270.16Z"
></path><path
class="cls-5"
d="M439.88,273.93h-.4c-.17,0-.28-.08-.28-.2v-6.79c0-.12.11-.2.28-.2h1.68c.95,0,1.9.52,1.9,1.54v.78a1.42,1.42,0,0,1-.85,1.32.19.19,0,0,0-.13.19,1.31,1.31,0,0,0,0,.15l.88,2.69a1.65,1.65,0,0,1,.09.33c0,.12-.09.19-.29.19h-.41c-.14,0-.26-.06-.28-.16l-.93-3a.28.28,0,0,0-.29-.15h-.43c-.17,0-.29.08-.29.2v2.92C440.16,273.85,440.05,273.93,439.88,273.93Zm.57-6.51c-.17,0-.29.08-.29.2v2.1c0,.12.12.21.29.21h.71c.52,0,.95-.28.95-.8v-.91c0-.53-.43-.8-.95-.8Z"
></path><path
class="cls-5"
d="M447.27,273.76l-.28-1.33a.28.28,0,0,0-.29-.17h-1.29a.28.28,0,0,0-.28.17l-.26,1.33a.27.27,0,0,1-.28.17h-.35c-.18,0-.28-.07-.28-.19a1.58,1.58,0,0,1,0-.21l1.41-6.62c0-.11.14-.17.29-.17h.74c.15,0,.26.06.29.17l1.4,6.62a1.58,1.58,0,0,1,0,.21c0,.12-.1.19-.28.19h-.34A.26.26,0,0,1,447.27,273.76Zm-1.21-5c-.1,0-.2.2-.29.6l-.36,1.78a1.66,1.66,0,0,0,0,.24c0,.11.1.18.27.18h.82c.17,0,.28-.06.28-.18a1.66,1.66,0,0,0,0-.24l-.38-1.78C446.25,269,446.16,268.78,446.06,268.78Z"
></path><path
class="cls-5"
d="M452.56,266.94v.28c0,.12-.12.2-.28.2h-1c-.16,0-.28.08-.28.2v6.11c0,.12-.12.2-.29.2h-.39c-.17,0-.29-.08-.29-.2v-6.11c0-.12-.11-.2-.28-.2h-.94c-.17,0-.29-.08-.29-.2v-.28c0-.12.12-.2.29-.2h3.47C452.44,266.74,452.56,266.82,452.56,266.94Z"
></path><path
class="cls-5"
d="M457.47,273.45v.28c0,.12-.11.2-.28.2h-3.47c-.17,0-.28-.08-.28-.2v-.28c0-.12.11-.2.28-.2h.94c.17,0,.29-.08.29-.2v-5.43c0-.12-.12-.2-.29-.2h-.94c-.17,0-.28-.08-.28-.2v-.28c0-.12.11-.2.28-.2h3.47c.17,0,.28.08.28.2v.28c0,.12-.11.2-.28.2h-1c-.17,0-.29.08-.29.2v5.43c0,.12.12.2.29.2h1C457.36,273.25,457.47,273.33,457.47,273.45Z"
></path><path
class="cls-5"
d="M458.35,267.91c0-.78.51-1.17,1.51-1.17h.81c1,0,1.5.39,1.5,1.17v4.85c0,.78-.49,1.17-1.5,1.17h-.81c-1,0-1.51-.39-1.51-1.17Zm1,4.91c0,.29.18.43.54.43h.81c.37,0,.55-.14.55-.43v-5c0-.29-.18-.43-.55-.43h-.81c-.36,0-.54.14-.54.43Z"
></path><path
class="cls-5"
d="M466.8,273.93h-.46a.3.3,0,0,1-.29-.15l-1.29-3.28c-.16-.41-.29-.61-.39-.61s-.16.22-.16.67v3.17c0,.12-.12.2-.28.2h-.38c-.17,0-.28-.08-.28-.2v-6.79c0-.12.11-.2.28-.2h.54a.27.27,0,0,1,.28.15l1.23,3.19c.17.42.3.64.4.64s.16-.23.16-.69v-3.09c0-.12.11-.2.28-.2h.36c.17,0,.29.08.29.2v6.79C467.09,273.85,467,273.93,466.8,273.93Z"
></path><path
class="cls-5"
d="M470.57,266.74h.36c.17,0,.27.07.29.19l.31,3.68c0,.35.1.53.18.53s.19-.17.3-.5l.34-1a.22.22,0,0,1,.21-.11.21.21,0,0,1,.19.11l.33,1c.11.33.21.5.29.5s.15-.18.18-.53l.32-3.68c0-.12.1-.19.29-.19h.37c.18,0,.28.08.28.21l-.55,6.79c0,.12-.12.19-.29.19h-.45a.27.27,0,0,1-.28-.16l-.41-1.45c-.09-.28-.2-.43-.29-.43s-.19.15-.27.43l-.41,1.45a.27.27,0,0,1-.28.16h-.47c-.17,0-.27-.07-.28-.19l-.54-6.79C470.29,266.82,470.39,266.74,470.57,266.74Z"
></path><path
class="cls-5"
d="M479.48,273.45v.28c0,.12-.11.2-.28.2h-3.47c-.17,0-.28-.08-.28-.2v-.28c0-.12.11-.2.28-.2h.94c.17,0,.29-.08.29-.2v-5.43c0-.12-.12-.2-.29-.2h-.94c-.17,0-.28-.08-.28-.2v-.28c0-.12.11-.2.28-.2h3.47c.17,0,.28.08.28.2v.28c0,.12-.11.2-.28.2h-1c-.17,0-.29.08-.29.2v5.43c0,.12.12.2.29.2h1C479.37,273.25,479.48,273.33,479.48,273.45Z"
></path><path
class="cls-5"
d="M484.4,266.94v.28c0,.12-.12.2-.29.2h-1c-.17,0-.28.08-.28.2v6.11c0,.12-.12.2-.29.2h-.4c-.16,0-.28-.08-.28-.2v-6.11c0-.12-.12-.2-.28-.2h-.94c-.17,0-.29-.08-.29-.2v-.28c0-.12.12-.2.29-.2h3.46C484.28,266.74,484.4,266.82,484.4,266.94Z"
></path><path
class="cls-5"
d="M486.35,266.94v2.82c0,.12.11.2.28.2H488c.17,0,.28-.08.28-.2v-2.82c0-.12.12-.2.29-.2h.38c.17,0,.29.08.29.2v6.79c0,.12-.12.2-.29.2h-.38c-.17,0-.29-.08-.29-.2v-2.89c0-.12-.11-.2-.28-.2h-1.33c-.17,0-.28.08-.28.2v2.89c0,.12-.12.2-.29.2h-.4c-.16,0-.28-.08-.28-.2v-6.79c0-.12.12-.2.28-.2h.4C486.23,266.74,486.35,266.82,486.35,266.94Z"
></path><path
class="cls-5"
d="M490.3,267.91q0-1.17,1.5-1.17h.82c1,0,1.49.39,1.49,1.17v4.85c0,.78-.49,1.17-1.49,1.17h-.82q-1.5,0-1.5-1.17Zm1,4.91c0,.29.18.43.54.43h.82c.36,0,.54-.14.54-.43v-5c0-.29-.18-.43-.54-.43h-.82c-.36,0-.54.14-.54.43Z"
></path><path
class="cls-5"
d="M495.21,266.94c0-.12.12-.2.29-.2h.39c.17,0,.29.08.29.2v5.58c0,.52.41.8.94.8s.95-.28.95-.8v-5.58c0-.12.12-.2.29-.2h.38c.17,0,.29.08.29.2v5.51a2,2,0,0,1-3.82,0Z"
></path><path
class="cls-5"
d="M504.06,266.94v.28c0,.12-.12.2-.28.2h-1c-.16,0-.28.08-.28.2v6.11c0,.12-.12.2-.29.2h-.39c-.17,0-.29-.08-.29-.2v-6.11c0-.12-.11-.2-.28-.2h-.94c-.17,0-.29-.08-.29-.2v-.28c0-.12.12-.2.29-.2h3.47C503.94,266.74,504.06,266.82,504.06,266.94Z"
></path><path
class="cls-5"
d="M510.6,273.76l-.28-1.33a.28.28,0,0,0-.29-.17h-1.29a.28.28,0,0,0-.28.17l-.26,1.33a.27.27,0,0,1-.28.17h-.35c-.18,0-.28-.07-.28-.19a1.58,1.58,0,0,1,0-.21l1.41-6.62c0-.11.14-.17.29-.17h.74c.15,0,.26.06.29.17l1.4,6.62a1.58,1.58,0,0,1,0,.21c0,.12-.1.19-.28.19h-.34A.26.26,0,0,1,510.6,273.76Zm-1.21-5c-.1,0-.2.2-.29.6l-.36,1.78a1.66,1.66,0,0,0,0,.24c0,.11.1.18.27.18h.82c.17,0,.28-.06.28-.18a1.66,1.66,0,0,0,0-.24l-.38-1.78C509.58,269,509.49,268.78,509.39,268.78Z"
></path><path
class="cls-5"
d="M515.94,273.93h-.46a.3.3,0,0,1-.29-.15l-1.29-3.28c-.16-.41-.29-.61-.4-.61s-.15.22-.15.67v3.17c0,.12-.12.2-.28.2h-.38c-.17,0-.28-.08-.28-.2v-6.79c0-.12.11-.2.28-.2h.54c.13,0,.25.05.27.15l1.24,3.19c.17.42.3.64.4.64s.16-.23.16-.69v-3.09c0-.12.11-.2.28-.2h.36c.17,0,.28.08.28.2v6.79C516.22,273.85,516.11,273.93,515.94,273.93Z"
></path><path
class="cls-5"
d="M522.88,273.76l-.28-1.33c0-.11-.14-.17-.29-.17H521a.28.28,0,0,0-.28.17l-.26,1.33a.27.27,0,0,1-.28.17h-.35c-.18,0-.28-.07-.28-.19a1.58,1.58,0,0,1,0-.21l1.41-6.62a.28.28,0,0,1,.29-.17h.75a.26.26,0,0,1,.28.17l1.41,6.62a2.07,2.07,0,0,1,0,.21c0,.12-.1.19-.28.19h-.33C523,273.93,522.91,273.87,522.88,273.76Zm-1.21-5c-.1,0-.19.2-.28.6l-.37,1.78a1.66,1.66,0,0,0,0,.24c0,.11.1.18.27.18h.82c.17,0,.29-.06.29-.18a2.28,2.28,0,0,0,0-.24l-.38-1.78C521.86,269,521.77,268.78,521.67,268.78Z"
></path><path
class="cls-5"
d="M528.22,273.93h-.46a.3.3,0,0,1-.29-.15l-1.29-3.28c-.16-.41-.29-.61-.39-.61s-.16.22-.16.67v3.17c0,.12-.12.2-.28.2H525c-.17,0-.28-.08-.28-.2v-6.79c0-.12.11-.2.28-.2h.54a.27.27,0,0,1,.28.15l1.23,3.19c.17.42.3.64.4.64s.16-.23.16-.69v-3.09c0-.12.11-.2.28-.2h.36c.17,0,.29.08.29.2v6.79C528.51,273.85,528.39,273.93,528.22,273.93Z"
></path><path
class="cls-5"
d="M533.54,266.94v.28c0,.12-.12.2-.29.2h-1c-.17,0-.28.08-.28.2v6.11c0,.12-.12.2-.29.2h-.4c-.16,0-.28-.08-.28-.2v-6.11c0-.12-.12-.2-.28-.2h-1c-.16,0-.28-.08-.28-.2v-.28c0-.12.12-.2.28-.2h3.47C533.42,266.74,533.54,266.82,533.54,266.94Z"
></path><path
class="cls-5"
d="M537.72,270.16v.28c0,.12-.12.2-.29.2h-1.66c-.17,0-.28.08-.28.2v2.21c0,.12.11.2.28.2h2.4c.17,0,.28.08.28.2v.28c0,.12-.11.2-.28.2H534.8c-.17,0-.28-.08-.28-.2v-6.79c0-.12.11-.2.28-.2h3.37c.17,0,.28.08.28.2v.28c0,.12-.11.2-.28.2h-2.4c-.17,0-.28.08-.28.2v2.14c0,.12.11.2.28.2h1.66C537.6,270,537.72,270,537.72,270.16Z"
></path><path
class="cls-5"
d="M543,273.93h-.47a.29.29,0,0,1-.28-.15l-1.29-3.28c-.17-.41-.3-.61-.4-.61s-.15.22-.15.67v3.17c0,.12-.12.2-.29.2h-.37c-.17,0-.28-.08-.28-.2v-6.79c0-.12.11-.2.28-.2h.54a.26.26,0,0,1,.27.15l1.24,3.19c.17.42.3.64.4.64s.15-.23.15-.69v-3.09c0-.12.12-.2.29-.2H543c.17,0,.28.08.28.2v6.79C543.25,273.85,543.14,273.93,543,273.93Z"
></path><path
class="cls-5"
d="M547.88,273.93h-.46a.3.3,0,0,1-.29-.15l-1.28-3.28c-.17-.41-.3-.61-.4-.61s-.16.22-.16.67v3.17c0,.12-.11.2-.28.2h-.38c-.16,0-.28-.08-.28-.2v-6.79c0-.12.12-.2.28-.2h.55a.27.27,0,0,1,.27.15l1.23,3.19c.17.42.3.64.4.64s.16-.23.16-.69v-3.09c0-.12.11-.2.28-.2h.36c.17,0,.29.08.29.2v6.79C548.17,273.85,548.05,273.93,547.88,273.93Z"
></path><path
class="cls-5"
d="M552.37,273.76l-.28-1.33a.26.26,0,0,0-.28-.17h-1.29a.28.28,0,0,0-.29.17l-.26,1.33a.27.27,0,0,1-.28.17h-.35c-.18,0-.28-.07-.28-.19a1.58,1.58,0,0,1,0-.21l1.42-6.62c0-.11.14-.17.28-.17h.75c.14,0,.26.06.28.17l1.41,6.62a1.58,1.58,0,0,1,0,.21c0,.12-.11.19-.29.19h-.33C552.51,273.93,552.4,273.87,552.37,273.76Zm-1.21-5c-.1,0-.19.2-.28.6l-.36,1.78a1,1,0,0,0,0,.24c0,.11.1.18.27.18h.82c.17,0,.29-.06.29-.18a2.28,2.28,0,0,0,0-.24l-.38-1.78C551.35,269,551.26,268.78,551.16,268.78Z"
></path><path
class="cls-5"
d="M395.77,285h-.36c-.17,0-.28-.08-.28-.2v-3.55c0-.36-.06-.54-.13-.54s-.17.16-.3.5l-.37,1a.25.25,0,0,1-.25.13.26.26,0,0,1-.26-.13l-.37-1c-.13-.34-.23-.5-.31-.5s-.12.18-.12.54v3.55c0,.12-.11.2-.28.2h-.36c-.17,0-.28-.08-.28-.2V278c0-.12.11-.2.28-.2h.49a.27.27,0,0,1,.27.15l.66,1.8c.08.23.18.34.27.34s.18-.11.27-.34l.67-1.81a.28.28,0,0,1,.27-.14h.49c.17,0,.28.08.28.2v6.79C396.05,284.88,395.94,285,395.77,285Z"
></path><path
class="cls-5"
d="M400.18,284.78l-.28-1.32a.26.26,0,0,0-.28-.17h-1.29a.28.28,0,0,0-.29.17l-.26,1.32a.26.26,0,0,1-.28.18h-.35c-.18,0-.28-.07-.28-.19a1.79,1.79,0,0,1,0-.22l1.42-6.61c0-.11.14-.17.28-.17h.75c.14,0,.26.06.28.17l1.41,6.61c0,.2,0,.21,0,.22s-.1.19-.28.19h-.33A.28.28,0,0,1,400.18,284.78Zm-1.21-5c-.1,0-.19.2-.28.6l-.36,1.78a1,1,0,0,0,0,.24c0,.11.1.18.27.18h.82c.17,0,.29-.06.29-.18a1.93,1.93,0,0,0,0-.24l-.38-1.78C399.16,280,399.07,279.81,399,279.81Z"
></path><path
class="cls-5"
d="M402.69,281.21l-1.33-3.07a.6.6,0,0,1-.08-.22c0-.11.1-.15.3-.15h.4c.14,0,.23,0,.27.14l.72,1.74c.08.2.17.29.27.29s.18-.09.27-.29l.75-1.74c0-.1.13-.14.27-.14h.39c.19,0,.29.05.29.15a.7.7,0,0,1-.07.22l-1.33,3.07a1,1,0,0,0-.08.39v3.16c0,.13-.09.2-.28.2h-.4c-.2,0-.29-.07-.29-.2V281.6A1,1,0,0,0,402.69,281.21Z"
></path><path
class="cls-5"
d="M409.39,285H409c-.17,0-.29-.08-.29-.2V278c0-.12.12-.2.29-.2h1.57a1.72,1.72,0,0,1,1.92,1.54v.82a1.72,1.72,0,0,1-1.92,1.54H410c-.17,0-.28.08-.28.2v2.89C409.68,284.88,409.56,285,409.39,285Zm.57-6.51c-.17,0-.28.08-.28.2v2.14c0,.12.11.2.28.2h.61c.53,0,.94-.27.94-.8v-.94c0-.53-.41-.8-.94-.8Z"
></path><path
class="cls-5"
d="M416.82,281.19v.28c0,.12-.11.2-.28.2h-1.66c-.17,0-.29.08-.29.2v2.21c0,.12.12.2.29.2h2.4c.16,0,.28.08.28.2v.28c0,.12-.12.2-.28.2h-3.37c-.17,0-.28-.08-.28-.2V278c0-.12.11-.2.28-.2h3.37c.16,0,.28.08.28.2v.27c0,.12-.12.21-.28.21h-2.4c-.17,0-.29.08-.29.2v2.14c0,.12.12.2.29.2h1.66C416.71,281,416.82,281.07,416.82,281.19Z"
></path><path
class="cls-5"
d="M419.17,285h-.4c-.16,0-.28-.08-.28-.2V278c0-.12.12-.2.28-.2h1.68c.95,0,1.91.52,1.91,1.54v.78a1.41,1.41,0,0,1-.85,1.31.19.19,0,0,0-.13.2,1,1,0,0,0,0,.15l.88,2.69a1.65,1.65,0,0,1,.09.33c0,.12-.09.19-.28.19h-.42a.28.28,0,0,1-.28-.16l-.93-3a.27.27,0,0,0-.28-.16h-.44c-.17,0-.28.09-.28.21v2.92C419.46,284.88,419.34,285,419.17,285Zm.57-6.51c-.17,0-.28.08-.28.2v2.1c0,.12.11.2.28.2h.71c.53,0,.95-.27.95-.8v-.9c0-.53-.42-.8-.95-.8Z"
></path><path
class="cls-5"
d="M427.07,285h-.36c-.17,0-.29-.08-.29-.2v-3.55c0-.36-.05-.54-.13-.54s-.16.16-.29.5l-.38,1c0,.08-.13.13-.24.13a.26.26,0,0,1-.26-.13l-.37-1c-.13-.34-.24-.5-.31-.5s-.12.18-.12.54v3.55c0,.12-.12.2-.28.2h-.36c-.17,0-.29-.08-.29-.2V278c0-.12.12-.2.29-.2h.49a.28.28,0,0,1,.27.15l.65,1.8c.08.23.18.34.28.34s.17-.11.27-.34l.67-1.81c0-.08.14-.14.27-.14h.49c.16,0,.28.08.28.2v6.79C427.35,284.88,427.23,285,427.07,285Z"
></path><path
class="cls-5"
d="M431.48,284.78l-.28-1.32a.28.28,0,0,0-.29-.17h-1.29a.28.28,0,0,0-.28.17l-.26,1.32a.26.26,0,0,1-.28.18h-.35c-.18,0-.28-.07-.28-.19a1.79,1.79,0,0,1,0-.22l1.41-6.61c0-.11.14-.17.29-.17h.74c.15,0,.26.06.29.17l1.4,6.61a1.79,1.79,0,0,1,0,.22c0,.12-.1.19-.28.19h-.34A.27.27,0,0,1,431.48,284.78Zm-1.21-5c-.1,0-.2.2-.29.6l-.36,1.78a1.93,1.93,0,0,0,0,.24c0,.11.11.18.28.18h.82c.17,0,.28-.06.28-.18a1.52,1.52,0,0,0,0-.24l-.38-1.78C430.46,280,430.37,279.81,430.27,279.81Z"
></path><path
class="cls-5"
d="M436.82,285h-.46a.31.31,0,0,1-.29-.15l-1.29-3.28c-.16-.41-.29-.61-.4-.61s-.15.22-.15.67v3.17c0,.12-.12.2-.28.2h-.38c-.17,0-.28-.08-.28-.2V278c0-.12.11-.2.28-.2h.54c.13,0,.25.05.27.14l1.24,3.2c.17.42.3.63.4.63s.16-.23.16-.68V278c0-.12.11-.2.28-.2h.36c.17,0,.28.08.28.2v6.79C437.1,284.88,437,285,436.82,285Z"
></path><path
class="cls-5"
d="M441.4,281.19v.28c0,.12-.12.2-.28.2h-1.67c-.16,0-.28.08-.28.2v2.21c0,.12.12.2.28.2h2.4c.17,0,.28.08.28.2v.28c0,.12-.11.2-.28.2h-3.36c-.17,0-.29-.08-.29-.2V278c0-.12.12-.2.29-.2h3.36c.17,0,.28.08.28.2v.27c0,.12-.11.21-.28.21h-2.4c-.16,0-.28.08-.28.2v2.14c0,.12.12.2.28.2h1.67C441.28,281,441.4,281.07,441.4,281.19Z"
></path><path
class="cls-5"
d="M446.65,285h-.46a.31.31,0,0,1-.29-.15l-1.29-3.28c-.16-.41-.29-.61-.4-.61s-.15.22-.15.67v3.17c0,.12-.12.2-.28.2h-.38c-.17,0-.28-.08-.28-.2V278c0-.12.11-.2.28-.2h.54c.13,0,.25.05.27.14l1.24,3.2c.17.42.3.63.4.63s.16-.23.16-.68V278c0-.12.11-.2.28-.2h.36c.17,0,.28.08.28.2v6.79C446.93,284.88,446.82,285,446.65,285Z"
></path><path
class="cls-5"
d="M452,278v.27c0,.12-.11.21-.28.21h-1c-.17,0-.28.08-.28.2v6.11c0,.12-.12.2-.29.2h-.4c-.17,0-.28-.08-.28-.2v-6.11c0-.12-.12-.2-.29-.2h-.94c-.16,0-.28-.09-.28-.21V278c0-.12.12-.2.28-.2h3.47C451.85,277.77,452,277.85,452,278Z"
></path><path
class="cls-5"
d="M456.88,284.48v.28c0,.12-.12.2-.28.2h-3.37c-.17,0-.28-.08-.28-.2V278c0-.12.11-.2.28-.2h.4c.17,0,.29.08.29.2v6.11c0,.12.11.2.28.2h2.4C456.76,284.28,456.88,284.36,456.88,284.48Z"
></path><path
class="cls-5"
d="M458.3,281.21,457,278.14a.7.7,0,0,1-.07-.22c0-.11.1-.15.29-.15h.4c.14,0,.23,0,.27.14l.72,1.74c.08.2.17.29.28.29s.18-.09.27-.29l.74-1.74c0-.1.13-.14.28-.14h.38q.3,0,.3.15a.6.6,0,0,1-.08.22l-1.33,3.07a1,1,0,0,0-.07.39v3.16c0,.13-.09.2-.29.2h-.4c-.19,0-.28-.07-.28-.2V281.6A1,1,0,0,0,458.3,281.21Z"
></path><path
class="cls-5"
d="M464.42,285c-.17,0-.29-.08-.29-.2v-.32c0-.24.47-.08.47-.33v-5.5c0-.25-.47-.08-.47-.33V278c0-.12.12-.2.29-.2h2a1.7,1.7,0,0,1,1.9,1.54v4.11a1.7,1.7,0,0,1-1.9,1.54Zm1.41-6.51c-.16,0-.28.08-.28.2v5.43c0,.12.12.2.28.2h.59c.52,0,.94-.28.94-.8v-4.23c0-.53-.42-.8-.94-.8Z"
></path><path
class="cls-5"
d="M472.09,284.78l-.28-1.32c0-.11-.14-.17-.29-.17h-1.29a.28.28,0,0,0-.28.17l-.26,1.32a.26.26,0,0,1-.28.18h-.35c-.18,0-.28-.07-.28-.19a1.79,1.79,0,0,1,0-.22l1.41-6.61a.28.28,0,0,1,.29-.17h.75a.26.26,0,0,1,.28.17l1.41,6.61c0,.2,0,.21,0,.22s-.1.19-.28.19h-.33A.28.28,0,0,1,472.09,284.78Zm-1.21-5c-.1,0-.19.2-.28.6l-.37,1.78a1.52,1.52,0,0,0,0,.24c0,.11.1.18.27.18h.82c.17,0,.29-.06.29-.18a1.93,1.93,0,0,0,0-.24l-.38-1.78C471.07,280,471,279.81,470.88,279.81Z"
></path><path
class="cls-5"
d="M477.51,285h-.36c-.17,0-.29-.08-.29-.2v-3.55c0-.36-.05-.54-.12-.54s-.17.16-.3.5l-.37,1a.25.25,0,0,1-.25.13.26.26,0,0,1-.26-.13l-.37-1c-.13-.34-.23-.5-.31-.5s-.12.18-.12.54v3.55c0,.12-.11.2-.28.2h-.36c-.17,0-.29-.08-.29-.2V278c0-.12.12-.2.29-.2h.49a.27.27,0,0,1,.27.15l.66,1.8c.07.23.18.34.27.34s.18-.11.27-.34l.67-1.81c0-.08.14-.14.27-.14h.49c.17,0,.28.08.28.2v6.79C477.79,284.88,477.68,285,477.51,285Z"
></path><path
class="cls-5"
d="M481.92,284.78l-.28-1.32c0-.11-.14-.17-.29-.17h-1.29a.28.28,0,0,0-.28.17l-.26,1.32a.26.26,0,0,1-.28.18h-.35c-.18,0-.28-.07-.28-.19a1.79,1.79,0,0,1,0-.22l1.41-6.61a.28.28,0,0,1,.29-.17h.75a.26.26,0,0,1,.28.17l1.41,6.61c0,.2,0,.21,0,.22s-.1.19-.28.19h-.33A.28.28,0,0,1,481.92,284.78Zm-1.21-5c-.1,0-.19.2-.28.6l-.37,1.78a1.52,1.52,0,0,0,0,.24c0,.11.1.18.27.18h.82c.17,0,.29-.06.29-.18a1.93,1.93,0,0,0,0-.24l-.38-1.78C480.9,280,480.81,279.81,480.71,279.81Z"
></path><path
class="cls-5"
d="M486.33,282.57c0-.12-.11-.2-.28-.2h-.34c-.16,0-.28-.08-.28-.2v-.28c0-.12.12-.2.28-.2H487c.17,0,.29.08.29.2v1.59c0,1-1,1.54-1.91,1.54a1.71,1.71,0,0,1-1.91-1.54v-4.23a2,2,0,0,1,3.82,0v.19c0,.12-.12.2-.27.2h-.38c-.16,0-.28-.08-.28-.2v-.25c0-.53-.44-.81-1-.81s-.95.28-.95.81v4.35c0,.53.41.8.94.8s.95-.27.95-.8Z"
></path><path
class="cls-5"
d="M491.58,281.19v.28c0,.12-.11.2-.28.2h-1.66c-.17,0-.29.08-.29.2v2.21c0,.12.12.2.29.2H492c.16,0,.28.08.28.2v.28c0,.12-.12.2-.28.2h-3.37c-.17,0-.28-.08-.28-.2V278c0-.12.11-.2.28-.2H492c.16,0,.28.08.28.2v.27c0,.12-.12.21-.28.21h-2.4c-.17,0-.29.08-.29.2v2.14c0,.12.12.2.29.2h1.66C491.47,281,491.58,281.07,491.58,281.19Z"
></path><path
class="cls-5"
d="M499.68,278v.27c0,.12-.11.21-.28.21h-1c-.17,0-.28.08-.28.2v6.11c0,.12-.12.2-.29.2h-.4c-.17,0-.28-.08-.28-.2v-6.11c0-.12-.12-.2-.29-.2h-.94c-.16,0-.28-.09-.28-.21V278c0-.12.12-.2.28-.2h3.47C499.57,277.77,499.68,277.85,499.68,278Z"
></path><path
class="cls-5"
d="M501.64,278v2.82c0,.12.11.2.28.2h1.33c.17,0,.28-.08.28-.2V278c0-.12.12-.2.28-.2h.39c.17,0,.29.08.29.2v6.79c0,.12-.12.2-.29.2h-.39c-.16,0-.28-.08-.28-.2v-2.89c0-.12-.11-.2-.28-.2h-1.33c-.17,0-.28.08-.28.2v2.89c0,.12-.12.2-.29.2H501c-.17,0-.28-.08-.28-.2V278c0-.12.11-.2.28-.2h.4C501.52,277.77,501.64,277.85,501.64,278Z"
></path><path
class="cls-5"
d="M508.78,281.19v.28c0,.12-.11.2-.28.2h-1.67c-.16,0-.28.08-.28.2v2.21c0,.12.12.2.28.2h2.4c.17,0,.29.08.29.2v.28c0,.12-.12.2-.29.2h-3.36c-.17,0-.29-.08-.29-.2V278c0-.12.12-.2.29-.2h3.36c.17,0,.29.08.29.2v.27c0,.12-.12.21-.29.21h-2.4c-.16,0-.28.08-.28.2v2.14c0,.12.12.2.28.2h1.67C508.67,281,508.78,281.07,508.78,281.19Z"
></path><path
class="cls-5"
d="M513,285c-.17,0-.28-.08-.28-.2v-.32c0-.24.46-.08.46-.33v-5.5c0-.25-.46-.08-.46-.33V278c0-.12.11-.2.28-.2h2a1.71,1.71,0,0,1,1.91,1.54v4.11A1.71,1.71,0,0,1,515,285Zm1.42-6.51c-.17,0-.29.08-.29.2v5.43c0,.12.12.2.29.2H515c.53,0,.94-.28.94-.8v-4.23c0-.53-.41-.8-.94-.8Z"
></path><path
class="cls-5"
d="M521.06,281.19v.28c0,.12-.11.2-.28.2h-1.66c-.17,0-.29.08-.29.2v2.21c0,.12.12.2.29.2h2.39c.17,0,.29.08.29.2v.28c0,.12-.12.2-.29.2h-3.36c-.17,0-.28-.08-.28-.2V278c0-.12.11-.2.28-.2h3.36c.17,0,.29.08.29.2v.27c0,.12-.12.21-.29.21h-2.39c-.17,0-.29.08-.29.2v2.14c0,.12.12.2.29.2h1.66C521,281,521.06,281.07,521.06,281.19Z"
></path><path
class="cls-5"
d="M523.51,277.94l.89,4.33c.08.4.17.6.29.6s.19-.2.28-.6l.89-4.33c0-.12.12-.17.29-.17h.36c.19,0,.28.06.28.19a.75.75,0,0,1,0,.17l-1.41,6.65c0,.12-.12.18-.29.18h-.75c-.16,0-.25-.06-.28-.18l-1.43-6.65a1.55,1.55,0,0,1,0-.17c0-.13.09-.19.29-.19h.37C523.4,277.77,523.49,277.82,523.51,277.94Z"
></path><path
class="cls-5"
d="M531.63,284.48v.28c0,.12-.12.2-.29.2h-3.46c-.17,0-.29-.08-.29-.2v-.28c0-.12.12-.2.29-.2h.94c.16,0,.28-.08.28-.2v-5.43c0-.12-.12-.2-.28-.2h-.94c-.17,0-.29-.09-.29-.21V278c0-.12.12-.2.29-.2h3.46c.17,0,.29.08.29.2v.27c0,.12-.12.21-.29.21h-1c-.17,0-.28.08-.28.2v5.43c0,.12.11.2.28.2h1C531.51,284.28,531.63,284.36,531.63,284.48Z"
></path><path
class="cls-5"
d="M532.48,279.25a2,2,0,0,1,3.82,0v.19c0,.12-.12.2-.27.2h-.38c-.16,0-.28-.08-.28-.2v-.25a.84.84,0,0,0-1-.81c-.55,0-1,.28-1,.81v4.35c0,.53.42.8,1,.8s1-.27,1-.8v-.35c0-.12.12-.21.28-.21H536c.17,0,.29.09.29.21v.29c0,1-1,1.54-1.91,1.54a1.71,1.71,0,0,1-1.91-1.54Z"
></path><path
class="cls-5"
d="M540.59,281.19v.28c0,.12-.11.2-.28.2h-1.66c-.17,0-.29.08-.29.2v2.21c0,.12.12.2.29.2h2.4c.16,0,.28.08.28.2v.28c0,.12-.12.2-.28.2h-3.37c-.17,0-.28-.08-.28-.2V278c0-.12.11-.2.28-.2h3.37c.16,0,.28.08.28.2v.27c0,.12-.12.21-.28.21h-2.4c-.17,0-.29.08-.29.2v2.14c0,.12.12.2.29.2h1.66C540.48,281,540.59,281.07,540.59,281.19Z"
></path><path
class="cls-5"
d="M543.2,285h-.4c-.17,0-.28-.08-.28-.2v-.38c0-.12.11-.2.28-.2h.4c.17,0,.29.08.29.2v.38C543.49,284.88,543.37,285,543.2,285Z"
></path></g>
</svg>

After

Width:  |  Height:  |  Size: 34 KiB

+697
View File
@@ -0,0 +1,697 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="696.3 500.37 622.29 968.69">
<defs><style>
.cls-1 {
fill: #2d2d2d;
}
.cls-2 {
fill: #383838;
}
.cls-3 {
fill: #474649;
}
.cls-4 {
fill: #939696;
}
.cls-5, .cls-7 {
fill: #e6e8e8;
}
.cls-11,
.cls-12,
.cls-13,
.cls-14,
.cls-15,
.cls-16,
.cls-17,
.cls-18,
.cls-6 {
fill: none;
}
.cls-16, .cls-6 {
stroke: #939696;
stroke-width: 2px;
}
.cls-18, .cls-6 {
stroke-linecap: round;
stroke-linejoin: round;
}
.cls-7 {
font-size: 22.85px;
font-family: ArialMT, Arial;
}
.cls-8 {
fill: #515153;
}
.cls-9 {
fill: #e2d299;
}
.cls-10 {
fill: #fff;
}
.cls-11, .cls-13, .cls-14, .cls-15 {
stroke: #050606;
}
.cls-11, .cls-12, .cls-13, .cls-14, .cls-15, .cls-16, .cls-17 {
stroke-miterlimit: 10;
}
.cls-11 {
stroke-width: 1.35px;
}
.cls-12, .cls-17, .cls-18 {
stroke: #fff;
}
.cls-12, .cls-15 {
stroke-width: 1.79px;
}
.cls-13 {
stroke-width: 1.8px;
}
.cls-14 {
stroke-width: 4.05px;
}
.cls-17 {
stroke-width: 1.37px;
}
.cls-18 {
stroke-width: 1.37px;
}
</style></defs><g id="Layer_3" data-name="Layer 3"><path
class="cls-1"
d="M1292.56,1030.81v287.34c0,51.3-17,98.13-78.62,120.23-33.78,12.13-72.45,17.21-107.88,19.81-23.07,1.7-66.69,2.55-98.62,2.85-31.93-.3-75.55-1.15-98.62-2.85-35.43-2.6-74.1-7.68-107.88-19.81-61.6-22.1-78.62-68.93-78.62-120.23V1030.81Z"
/><path
class="cls-2"
d="M1306.83,1210.35c-3,2.5-2.35,7.42-6.33,11.56-2,2.07-5.21,2.65-7.94,2.72v93.52c0,51.3-17,98.13-78.62,120.23-33.78,12.13-72.45,17.21-107.88,19.81-23.07,1.7-66.69,2.55-98.62,2.85-31.93-.3-75.55-1.15-98.62-2.85-35.43-2.6-74.1-7.68-107.88-19.81-61.6-22.1-78.62-68.93-78.62-120.23v-94.29a17.44,17.44,0,0,1-7.13-1.4c-5.08-2.35-3.9-7.73-7.43-11.92a8.73,8.73,0,0,0-3.92-2.65v110.83c0,52.75,17,100.9,78.62,123.63,33.79,12.47,72.21,18,107.6,21.08,21,1.85,69.3,3.79,117.26,3.59h.24c48,.2,96.28-1.74,117.26-3.59,35.39-3.12,73.81-8.61,107.6-21.08,61.59-22.73,78.62-70.88,78.62-123.63V1208.18A13.09,13.09,0,0,0,1306.83,1210.35Z"
/><path
class="cls-3"
d="M722.79,1332.36h0a25.91,25.91,0,0,0,25.92-25.92V1137.88h530.2v186.39a12.8,12.8,0,0,0,12.81,12.8h0v-29l.84-277.22H722.32Z"
/><path
class="cls-1"
d="M1292.56,590.3v440.51H722.32V590.3a74.74,74.74,0,0,1,74.75-74.75h420.74A74.74,74.74,0,0,1,1292.56,590.3Z"
/><rect
class="cls-4"
x="942.13"
y="547.62"
width="132.22"
height="13.89"
rx="6.95"
/><rect
class="cls-5"
x="743.88"
y="1199.81"
width="540.06"
height="13.65"
rx="6.82"
/><rect
class="cls-5"
x="743.88"
y="1133.54"
width="540.06"
height="13.65"
rx="6.82"
/><rect
class="cls-5"
x="743.88"
y="1266.09"
width="540.06"
height="13.65"
rx="6.82"
/><rect
class="cls-5"
x="743.88"
y="1332.36"
width="540.06"
height="13.65"
rx="6.82"
/><path
class="cls-6"
d="M1021.42,1034.73v9.87a34.52,34.52,0,0,1,27,27.08h9.86"
/><path
class="cls-6"
d="M1007.54,1034.76v9.88a34.5,34.5,0,0,0-26.79,27h-9.86"
/><path
class="cls-6"
d="M971,1085.57h9.89a34.53,34.53,0,0,0,26.69,26.57V1122"
/><path
class="cls-6"
d="M1021.42,1122.05v-9.87a34.53,34.53,0,0,0,26.86-26.61h9.89"
/><circle class="cls-5" cx="1014.57" cy="1078.39" r="26.4" /><rect
class="cls-2"
x="755.65"
y="633.64"
width="500.52"
height="377.46"
/><text class="cls-7" transform="translate(762.22 1184.58)">Q</text><text
class="cls-7"
transform="translate(813.86 1184.58)"
>W</text><text class="cls-7" transform="translate(867.23 1184.58)"
>E</text><text class="cls-7" transform="translate(920.6 1184.58)"
>R</text><text class="cls-7" transform="translate(973.98 1184.58)"
>T</text><text class="cls-7" transform="translate(1034.95 1184.58)"
>Y</text><text class="cls-7" transform="translate(1142 1184.58)"
>I</text><text class="cls-7" transform="translate(1088.49 1184.58)"
>U</text><text class="cls-7" transform="translate(1246.93 1184.58)"
>P</text><text class="cls-7" transform="translate(1194.11 1184.58)"
>O</text><text class="cls-7" transform="translate(762.22 1249.77)"
>A</text><text class="cls-7" transform="translate(813.86 1249.77)"
>S</text><text class="cls-7" transform="translate(867.23 1249.77)"
>D</text><text class="cls-7" transform="translate(920.6 1249.77)"
>F</text><text class="cls-7" transform="translate(973.98 1249.77)"
>G</text><text class="cls-7" transform="translate(1034.95 1249.77)"
>H</text><text class="cls-7" transform="translate(1142 1249.77)"
>K</text><text class="cls-7" transform="translate(1088.49 1249.77)"
>J</text><text class="cls-7" transform="translate(1194.11 1249.77)"
>L</text><text class="cls-7" transform="translate(758.45 1316)"
>alt</text><text class="cls-7" transform="translate(813.86 1316)"
>Z</text><text class="cls-7" transform="translate(867.23 1316)"
>X</text><text class="cls-7" transform="translate(920.6 1316)">C</text><text
class="cls-7"
transform="translate(973.98 1316)"
>V</text><text class="cls-7" transform="translate(1034.95 1316)"
>B</text><text class="cls-7" transform="translate(1142 1316)">M</text><text
class="cls-7"
transform="translate(1088.49 1316)"
>N</text><path
class="cls-8"
d="M1316.56,617.77v408.74a6.22,6.22,0,0,1-1.81,4.39l-3.71,3.71v173.57a13.09,13.09,0,0,0-4.21,2.17c-3,2.5-2.35,7.42-6.33,11.56-2,2.07-5.21,2.65-7.94,2.72V590.3a74.74,74.74,0,0,0-74.75-74.75H797.07a74.74,74.74,0,0,0-74.75,74.75v633.56a17.44,17.44,0,0,1-7.13-1.4c-5.08-2.35-3.9-7.73-7.43-11.92a8.73,8.73,0,0,0-3.92-2.65V1034.61l-3.71-3.71-.08-.09a6.2,6.2,0,0,1-1.73-4.3V617.77a6.23,6.23,0,0,1,1.59-4.15l3.93-4.38V594.81a92.42,92.42,0,0,1,92.42-92.42h422.36A92.38,92.38,0,0,1,1311,594.81v14.43l3.93,4.38A6.23,6.23,0,0,1,1316.56,617.77Z"
/></g><g id="Layer_2" data-name="Layer 2"><path
class="cls-9"
d="M743.88,1061.4a14.6,14.6,0,1,1,14.6-14.6A14.62,14.62,0,0,1,743.88,1061.4Zm0-26a11.36,11.36,0,1,0,11.36,11.36A11.38,11.38,0,0,0,743.88,1035.44Z"
/><path class="cls-10" d="M892.79,1438.55v-19.42h4v16.13h9.83v3.29Z" /><path
class="cls-10"
d="M909.28,1438.55V1419h4v19.58Z"
/><path class="cls-10" d="M917.1,1438.55v-19.42h4v16.13h9.83v3.29Z" /><path
class="cls-10"
d="M936.34,1438.55v-8.24L929.17,1419h4.63l4.61,7.75,4.51-7.75h4.56l-7.2,11.37v8.21Z"
/><path
class="cls-10"
d="M958.55,1431.36v-3.3h8.53v7.8a10.79,10.79,0,0,1-3.6,2.11,13.17,13.17,0,0,1-4.78.92,10.74,10.74,0,0,1-5.36-1.29,8.23,8.23,0,0,1-3.43-3.69,11.83,11.83,0,0,1-1.15-5.21,11.35,11.35,0,0,1,1.28-5.44,8.72,8.72,0,0,1,3.76-3.65,10.12,10.12,0,0,1,4.69-1,9.32,9.32,0,0,1,5.69,1.53,6.89,6.89,0,0,1,2.64,4.23l-3.93.73a4.14,4.14,0,0,0-1.55-2.28,4.74,4.74,0,0,0-2.85-.83,5.37,5.37,0,0,0-4.12,1.64,6.93,6.93,0,0,0-1.53,4.88,7.65,7.65,0,0,0,1.55,5.23,5.16,5.16,0,0,0,4.06,1.74,6.77,6.77,0,0,0,2.49-.49,8.55,8.55,0,0,0,2.14-1.18v-2.48Z"
/><path
class="cls-10"
d="M969.92,1428.88a12.38,12.38,0,0,1,.9-5,9,9,0,0,1,1.82-2.68,7.61,7.61,0,0,1,2.53-1.77,10.88,10.88,0,0,1,4.22-.77,9.2,9.2,0,0,1,6.93,2.68q2.59,2.68,2.59,7.47a10.24,10.24,0,0,1-2.57,7.42,10.29,10.29,0,0,1-13.84,0A10.09,10.09,0,0,1,969.92,1428.88Zm4.07-.13a7.34,7.34,0,0,0,1.54,5,5.28,5.28,0,0,0,7.78,0,7.5,7.5,0,0,0,1.52-5.11,7.35,7.35,0,0,0-1.48-5,5,5,0,0,0-3.92-1.65,5,5,0,0,0-3.94,1.67A7.41,7.41,0,0,0,974,1428.75Z"
/><path
class="cls-10"
d="M1004,1438.55v-16.26H998.2V1419h15.56v3.32H1008v16.26Z"
/><path class="cls-10" d="M1014.35,1433.33v-3.75h7.37v3.75Z" /><path
class="cls-10"
d="M1024,1438.55V1419h4v8.7l8-8.7h5.31l-7.37,7.63,7.77,12h-5.11l-5.38-9.19-3.21,3.28v5.91Z"
/><path
class="cls-10"
d="M1051.86,1434l3.74.63a6.13,6.13,0,0,1-2.28,3.13,6.68,6.68,0,0,1-3.89,1.08,6.35,6.35,0,0,1-5.48-2.42,8.08,8.08,0,0,1-1.4-4.89,7.82,7.82,0,0,1,1.84-5.52,6,6,0,0,1,4.66-2,6.32,6.32,0,0,1,5,2.09c1.22,1.39,1.8,3.53,1.75,6.4h-9.41a3.8,3.8,0,0,0,.91,2.6,2.84,2.84,0,0,0,2.17.93,2.31,2.31,0,0,0,1.48-.48A3,3,0,0,0,1051.86,1434Zm.21-3.79a3.64,3.64,0,0,0-.84-2.48,2.7,2.7,0,0,0-4,0,3.41,3.41,0,0,0-.79,2.43Z"
/><path
class="cls-10"
d="M1057.08,1424.37h4l3.4,10.07,3.31-10.07h3.89l-5,13.65-.9,2.47a10.12,10.12,0,0,1-.94,1.9,4.17,4.17,0,0,1-1,1.06,4.48,4.48,0,0,1-1.43.63,7,7,0,0,1-1.91.23,9.46,9.46,0,0,1-2.13-.23l-.33-2.93a8.72,8.72,0,0,0,1.59.17,2.34,2.34,0,0,0,1.93-.77,5.37,5.37,0,0,0,1-2Z"
/><path
class="cls-10"
d="M1073.91,1438.55V1419h3.75V1426a5.32,5.32,0,0,1,4.12-2,5.52,5.52,0,0,1,4.29,1.88,7.75,7.75,0,0,1,1.69,5.38,8.21,8.21,0,0,1-1.73,5.6,5.39,5.39,0,0,1-4.2,2,5.28,5.28,0,0,1-2.4-.61,5.87,5.87,0,0,1-2-1.8v2.08Zm3.73-7.4a6.06,6.06,0,0,0,.69,3.26,3,3,0,0,0,2.59,1.5,2.65,2.65,0,0,0,2.12-1.06,5.27,5.27,0,0,0,.87-3.35,5.49,5.49,0,0,0-.88-3.5,2.77,2.77,0,0,0-2.25-1.08,2.84,2.84,0,0,0-2.25,1A4.79,4.79,0,0,0,1077.64,1431.15Z"
/><path
class="cls-10"
d="M1089.91,1431.26a7.75,7.75,0,0,1,.92-3.62,6.31,6.31,0,0,1,2.62-2.67,7.76,7.76,0,0,1,3.77-.92,7.09,7.09,0,0,1,5.27,2.09,7.18,7.18,0,0,1,2.06,5.28,7.29,7.29,0,0,1-2.08,5.34,7,7,0,0,1-5.22,2.12,8.22,8.22,0,0,1-3.72-.89,6.07,6.07,0,0,1-2.7-2.58A8.69,8.69,0,0,1,1089.91,1431.26Zm3.85.2a4.66,4.66,0,0,0,1,3.23,3.26,3.26,0,0,0,4.94,0,5.76,5.76,0,0,0,0-6.46,3.28,3.28,0,0,0-4.94,0A4.68,4.68,0,0,0,1093.76,1431.46Z"
/><path
class="cls-10"
d="M1110.3,1428.7l-3.41-.62a5.26,5.26,0,0,1,2-3,7.19,7.19,0,0,1,4.16-1,9.08,9.08,0,0,1,3.74.59,3.73,3.73,0,0,1,1.73,1.51,7.65,7.65,0,0,1,.5,3.36l0,4.38a14.16,14.16,0,0,0,.19,2.76,7.9,7.9,0,0,0,.67,1.9h-3.71a11,11,0,0,1-.36-1.1c-.07-.23-.11-.37-.14-.44a6.79,6.79,0,0,1-2.06,1.4,5.88,5.88,0,0,1-2.33.47,4.88,4.88,0,0,1-3.46-1.19,4.23,4.23,0,0,1-.68-5.15,3.78,3.78,0,0,1,1.61-1.45,12.77,12.77,0,0,1,3-.87,21,21,0,0,0,3.65-.92v-.38a1.93,1.93,0,0,0-.54-1.54,3.15,3.15,0,0,0-2-.46,2.74,2.74,0,0,0-1.57.39A2.8,2.8,0,0,0,1110.3,1428.7Zm5,3c-.48.16-1.24.35-2.29.58a6.93,6.93,0,0,0-2,.65,1.56,1.56,0,0,0-.73,1.32,1.86,1.86,0,0,0,.58,1.37,2.08,2.08,0,0,0,1.5.57,3.24,3.24,0,0,0,1.94-.67,2.35,2.35,0,0,0,.89-1.24,7.26,7.26,0,0,0,.15-1.83Z"
/><path
class="cls-10"
d="M1126.3,1438.55h-3.76v-14.18H1126v2a6.1,6.1,0,0,1,1.61-1.89,3,3,0,0,1,1.62-.45,4.67,4.67,0,0,1,2.47.71l-1.16,3.27a3.3,3.3,0,0,0-1.76-.62,2.1,2.1,0,0,0-1.34.44,3,3,0,0,0-.86,1.57,22.25,22.25,0,0,0-.31,4.75Z"
/><path
class="cls-10"
d="M1146.36,1438.55h-3.48v-2.08a5.69,5.69,0,0,1-2.06,1.81,5.18,5.18,0,0,1-2.38.6,5.39,5.39,0,0,1-4.19-2,8,8,0,0,1-1.74-5.49,7.86,7.86,0,0,1,1.7-5.48,5.5,5.5,0,0,1,4.28-1.88,5.32,5.32,0,0,1,4.12,2V1419h3.75Zm-10-7.4a6.49,6.49,0,0,0,.63,3.29,2.84,2.84,0,0,0,2.54,1.47,2.76,2.76,0,0,0,2.2-1.1,5.06,5.06,0,0,0,.91-3.29,5.54,5.54,0,0,0-.88-3.52,2.79,2.79,0,0,0-2.26-1.08,2.83,2.83,0,0,0-2.24,1.06A4.81,4.81,0,0,0,1136.34,1431.15Z"
/><rect
class="cls-11"
x="755.65"
y="633.64"
width="500.52"
height="377.46"
/><path
class="cls-12"
d="M1084.05,1030.81a84.23,84.23,0,0,1-5.85,102.73"
/><path
class="cls-12"
d="M945.08,1030.81a84.23,84.23,0,0,0,5.85,102.73"
/><path
class="cls-12"
d="M1056.1,1030.81a63.17,63.17,0,0,1-10.75,102.73"
/><path
class="cls-12"
d="M973,1030.81a63.15,63.15,0,0,0,10.75,102.73"
/><circle class="cls-12" cx="1014.57" cy="1078.39" r="26.4" /><path
class="cls-13"
d="M703.84,1208.34a10.08,10.08,0,0,1,7.37,8.09c1.15,6.75,7.53,8.15,11.11,7.13"
/><path
class="cls-14"
d="M1315,613.62l-3.93-4.38V594.81a92.42,92.42,0,0,0-92.42-92.42H796.26a92.42,92.42,0,0,0-92.42,92.42v14.43l-3.93,4.38a6.23,6.23,0,0,0-1.59,4.15v408.74a6.22,6.22,0,0,0,1.81,4.39l3.71,3.71v284.11c0,52.75,17,100.9,78.62,123.63,33.79,12.47,72.21,18,107.6,21.08,21,1.85,69.3,3.79,117.26,3.59h.24c48,.2,96.28-1.74,117.26-3.59,35.39-3.12,73.81-8.61,107.6-21.08,61.59-22.73,78.62-70.88,78.62-123.63V1034.61l3.71-3.71a6.22,6.22,0,0,0,1.81-4.39V617.77A6.23,6.23,0,0,0,1315,613.62Zm-22.41,704.53c0,51.3-17,98.13-78.62,120.23-33.78,12.13-72.45,17.21-107.88,19.81-23.07,1.7-66.69,2.55-98.62,2.85-31.93-.3-75.55-1.15-98.62-2.85-35.43-2.6-74.1-7.68-107.88-19.81-61.6-22.1-78.62-68.93-78.62-120.23V590.3a74.74,74.74,0,0,1,74.75-74.75h420.74a74.74,74.74,0,0,1,74.75,74.75Z"
/><path
class="cls-13"
d="M1311.05,1208.34a10.08,10.08,0,0,0-7.37,8.09c-1.15,6.75-7.53,8.15-11.11,7.13"
/><rect
class="cls-11"
x="942.13"
y="547.62"
width="132.22"
height="13.89"
rx="6.95"
/><line
class="cls-11"
x1="722.32"
y1="1030.81"
x2="1292.57"
y2="1030.81"
/><rect
class="cls-13"
x="748.71"
y="1147.19"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M748.71,1199.81h45.08V1175a27.9,27.9,0,0,0-28-27.8H748.71"
/><rect
class="cls-13"
x="801.73"
y="1147.19"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M801.73,1199.81h45.08V1175a27.9,27.9,0,0,0-28-27.8H801.73"
/><rect
class="cls-13"
x="854.75"
y="1147.19"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M854.75,1199.81h45.08V1175a27.9,27.9,0,0,0-28-27.8H854.75"
/><rect
class="cls-13"
x="907.77"
y="1147.19"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M907.77,1199.81h45.08V1175a27.9,27.9,0,0,0-28-27.8H907.77"
/><rect
class="cls-13"
x="960.79"
y="1147.19"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M960.79,1199.81h45.08V1175a27.9,27.9,0,0,0-28-27.8H960.79"
/><rect
class="cls-13"
x="1225.89"
y="1147.19"
width="53.02"
height="52.62"
transform="translate(2504.8 2347) rotate(-180)"
/><path
class="cls-13"
d="M1278.91,1147.19h-17.07a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="1172.87"
y="1147.19"
width="53.02"
height="52.62"
transform="translate(2398.76 2347) rotate(-180)"
/><path
class="cls-13"
d="M1225.89,1147.19h-17.07a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="1119.85"
y="1147.19"
width="53.02"
height="52.62"
transform="translate(2292.72 2347) rotate(-180)"
/><path
class="cls-13"
d="M1172.87,1147.19H1155.8a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="1066.83"
y="1147.19"
width="53.02"
height="52.62"
transform="translate(2186.68 2347) rotate(-180)"
/><path
class="cls-13"
d="M1119.85,1147.19h-17.07a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="1013.81"
y="1147.19"
width="53.02"
height="52.62"
transform="translate(2080.64 2347) rotate(-180)"
/><path
class="cls-13"
d="M1066.83,1147.19h-17.07a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="748.71"
y="1213.46"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M748.71,1266.08h45.08v-24.82a27.9,27.9,0,0,0-28-27.8H748.71"
/><rect
class="cls-13"
x="801.73"
y="1213.46"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M801.73,1266.08h45.08v-24.82a27.9,27.9,0,0,0-28-27.8H801.73"
/><rect
class="cls-13"
x="854.75"
y="1213.46"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M854.75,1266.08h45.08v-24.82a27.9,27.9,0,0,0-28-27.8H854.75"
/><rect
class="cls-13"
x="907.77"
y="1213.46"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M907.77,1266.08h45.08v-24.82a27.9,27.9,0,0,0-28-27.8H907.77"
/><rect
class="cls-13"
x="960.79"
y="1213.46"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M960.79,1266.08h45.08v-24.82a27.9,27.9,0,0,0-28-27.8H960.79"
/><rect
class="cls-13"
x="1225.89"
y="1213.46"
width="53.02"
height="52.62"
transform="translate(2504.8 2479.54) rotate(-180)"
/><path
class="cls-13"
d="M1278.91,1213.46h-17.07a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="1172.87"
y="1213.46"
width="53.02"
height="52.62"
transform="translate(2398.76 2479.54) rotate(-180)"
/><path
class="cls-13"
d="M1225.89,1213.46h-17.07a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="1119.85"
y="1213.46"
width="53.02"
height="52.62"
transform="translate(2292.72 2479.54) rotate(-180)"
/><path
class="cls-13"
d="M1172.87,1213.46H1155.8a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="1066.83"
y="1213.46"
width="53.02"
height="52.62"
transform="translate(2186.68 2479.54) rotate(-180)"
/><path
class="cls-13"
d="M1119.85,1213.46h-17.07a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="1013.81"
y="1213.46"
width="53.02"
height="52.62"
transform="translate(2080.64 2479.54) rotate(-180)"
/><path
class="cls-13"
d="M1066.83,1213.46h-17.07a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="748.71"
y="1279.73"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M748.71,1332.35h45.08v-24.82a27.9,27.9,0,0,0-28-27.8H748.71"
/><rect
class="cls-13"
x="801.73"
y="1279.73"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M801.73,1332.35h45.08v-24.82a27.9,27.9,0,0,0-28-27.8H801.73"
/><path
class="cls-13"
d="M812.55,1346h17.07a27.9,27.9,0,0,1,28,27.8V1394"
/><path
class="cls-13"
d="M872.15,1346h17.07a27.9,27.9,0,0,1,28,27.8v24.6"
/><rect
class="cls-13"
x="854.75"
y="1279.73"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M854.75,1332.35h45.08v-24.82a27.9,27.9,0,0,0-28-27.8H854.75"
/><rect
class="cls-13"
x="907.77"
y="1279.73"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M907.77,1332.35h45.08v-24.82a27.9,27.9,0,0,0-28-27.8H907.77"
/><rect
class="cls-13"
x="960.79"
y="1279.73"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M960.79,1332.35h45.08v-24.82a27.9,27.9,0,0,0-28-27.8H960.79"
/><rect
class="cls-13"
x="1225.89"
y="1279.73"
width="53.02"
height="52.62"
transform="translate(2504.8 2612.09) rotate(-180)"
/><path
class="cls-13"
d="M1278.91,1279.73h-17.07a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="1172.87"
y="1279.73"
width="53.02"
height="52.62"
transform="translate(2398.76 2612.09) rotate(-180)"
/><path
class="cls-13"
d="M1225.89,1279.73h-17.07a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="1119.85"
y="1279.73"
width="53.02"
height="52.62"
transform="translate(2292.72 2612.09) rotate(-180)"
/><path
class="cls-13"
d="M1172.87,1279.73H1155.8a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="1066.83"
y="1279.73"
width="53.02"
height="52.62"
transform="translate(2186.68 2612.09) rotate(-180)"
/><path
class="cls-13"
d="M1119.85,1279.73h-17.07a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="1013.81"
y="1279.73"
width="53.02"
height="52.62"
transform="translate(2080.64 2612.09) rotate(-180)"
/><path
class="cls-13"
d="M1066.83,1279.73h-17.07a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-15"
x="743.88"
y="1199.81"
width="540.06"
height="13.65"
rx="6.82"
/><rect
class="cls-15"
x="743.88"
y="1133.54"
width="540.06"
height="13.65"
rx="6.82"
/><rect
class="cls-15"
x="743.88"
y="1266.09"
width="540.06"
height="13.65"
rx="6.82"
/><rect
class="cls-15"
x="743.88"
y="1332.36"
width="540.06"
height="13.65"
rx="6.82"
/><path
class="cls-15"
d="M802.07,1346c0,26.61,14.41,41.86,40.7,46,40.67,6.37,101.92,8.23,181.39,8"
/><line
class="cls-15"
x1="924.85"
y1="1398.7"
x2="924.85"
y2="1346.01"
/><line
class="cls-15"
x1="864.53"
y1="1394.78"
x2="864.53"
y2="1346.01"
/><path
class="cls-13"
d="M1170.33,1394V1373.8a27.9,27.9,0,0,1,28-27.8h17.07"
/><path
class="cls-13"
d="M1110.73,1398.4v-24.6a27.9,27.9,0,0,1,28-27.8h17.07"
/><path
class="cls-15"
d="M1225.89,1346c0,26.61-14.41,41.86-40.7,46-40.67,6.37-101.92,8.23-181.39,8"
/><line
class="cls-15"
x1="1103.11"
y1="1346.01"
x2="1103.11"
y2="1398.7"
/><line
class="cls-15"
x1="1163.43"
y1="1346.01"
x2="1163.43"
y2="1394.78"
/><circle class="cls-1" cx="743.88" cy="1046.8" r="7.19" /><path
class="cls-9"
d="M736.69,1104a5.93,5.93,0,1,1,5.93-5.93A5.94,5.94,0,0,1,736.69,1104Zm0-10.07a4.14,4.14,0,1,0,4.14,4.14A4.15,4.15,0,0,0,736.69,1094Z"
/><path
class="cls-9"
d="M736.69,1120.19a5.94,5.94,0,1,1,5.93-5.93A5.94,5.94,0,0,1,736.69,1120.19Zm0-10.07a4.14,4.14,0,1,0,4.14,4.14A4.14,4.14,0,0,0,736.69,1110.12Z"
/><path
class="cls-9"
d="M736.69,1136.35a5.93,5.93,0,1,1,5.93-5.93A5.94,5.94,0,0,1,736.69,1136.35Zm0-10.07a4.14,4.14,0,1,0,4.14,4.14A4.15,4.15,0,0,0,736.69,1126.28Z"
/><path
class="cls-9"
d="M736.69,1168.68a5.93,5.93,0,1,1,5.93-5.93A5.94,5.94,0,0,1,736.69,1168.68Zm0-10.07a4.14,4.14,0,1,0,4.14,4.14A4.15,4.15,0,0,0,736.69,1158.61Z"
/><path
class="cls-9"
d="M736.69,1184.85a5.94,5.94,0,1,1,5.93-5.93A5.94,5.94,0,0,1,736.69,1184.85Zm0-10.07a4.14,4.14,0,1,0,4.14,4.14A4.14,4.14,0,0,0,736.69,1174.78Z"
/><path
class="cls-16"
d="M918.05,1077.65a.77.77,0,0,1,0,.95l-8.88,11.19L903,1097.6a.76.76,0,0,1-.6.29H885.84a.76.76,0,0,1-.6-1.24l14.31-18.05a.77.77,0,0,0,0-.95l-14.32-18.05a.76.76,0,0,1,.6-1.24h16.55a.76.76,0,0,1,.6.29l6.19,7.81Z"
/><path
class="cls-16"
d="M885,1077.65a.77.77,0,0,1,0,.95l-8.88,11.19L870,1097.6a.76.76,0,0,1-.6.29H852.81a.76.76,0,0,1-.6-1.24l14.31-18.05a.77.77,0,0,0,0-.95L852.2,1059.6a.76.76,0,0,1,.6-1.24h16.55a.76.76,0,0,1,.6.29l6.19,7.81Z"
/><path
class="cls-16"
d="M852,1077.65a.77.77,0,0,1,0,.95l-8.88,11.19-6.19,7.81a.76.76,0,0,1-.6.29H819.78a.76.76,0,0,1-.6-1.24l14.31-18.05a.77.77,0,0,0,0-.95l-14.32-18.05a.76.76,0,0,1,.6-1.24h16.55a.76.76,0,0,1,.6.29l6.19,7.81Z"
/><path
class="cls-16"
d="M1111.88,1077.65a.77.77,0,0,0,0,.95l8.87,11.19,6.19,7.81a.79.79,0,0,0,.6.29h16.55a.77.77,0,0,0,.6-1.24l-14.31-18.05a.77.77,0,0,1,0-.95l14.32-18.05a.77.77,0,0,0-.6-1.24h-16.56a.79.79,0,0,0-.6.29l-6.19,7.81Z"
/><path
class="cls-16"
d="M1144.91,1077.65a.77.77,0,0,0,0,.95l8.87,11.19,6.19,7.81a.79.79,0,0,0,.6.29h16.55a.77.77,0,0,0,.6-1.24l-14.31-18.05a.77.77,0,0,1,0-.95l14.32-18.05a.77.77,0,0,0-.6-1.24h-16.56a.79.79,0,0,0-.6.29l-6.19,7.81Z"
/><path
class="cls-16"
d="M1177.94,1077.65a.77.77,0,0,0,0,.95l8.87,11.19,6.19,7.81a.79.79,0,0,0,.6.29h16.55a.77.77,0,0,0,.6-1.24l-14.31-18.05a.77.77,0,0,1,0-.95l14.32-18.05a.77.77,0,0,0-.6-1.24H1193.6a.79.79,0,0,0-.6.29l-6.19,7.81Z"
/><path
class="cls-10"
d="M944.82,608.91V582.67h3.47v23.14h12.92v3.1Z"
/><path class="cls-10" d="M965.94,608.91V582.67h3.47v26.24Z" /><path
class="cls-10"
d="M975.39,608.91V582.67h3.47v23.14h12.93v3.1Z"
/><path
class="cls-10"
d="M1000.6,608.91V597.79l-10.12-15.12h4.23l5.17,7.91q1.43,2.22,2.67,4.44c.78-1.37,1.74-2.92,2.86-4.64l5.08-7.71h4l-10.47,15.12v11.12Z"
/><path
class="cls-10"
d="M1029.93,598.62v-3.08l11.12,0v9.74a19.85,19.85,0,0,1-5.28,3.07,15.79,15.79,0,0,1-5.58,1,14.85,14.85,0,0,1-7-1.66,10.88,10.88,0,0,1-4.77-4.79,15,15,0,0,1-1.61-7,16.24,16.24,0,0,1,1.6-7.15,10.63,10.63,0,0,1,4.61-4.93,14.47,14.47,0,0,1,6.93-1.61,13.8,13.8,0,0,1,5.14.92,8.53,8.53,0,0,1,3.61,2.57,11.52,11.52,0,0,1,2,4.3l-3.14.86a9.81,9.81,0,0,0-1.46-3.16,6.07,6.07,0,0,0-2.51-1.83,9.2,9.2,0,0,0-3.62-.69,10.48,10.48,0,0,0-4.11.73,7.58,7.58,0,0,0-2.8,1.9,9.12,9.12,0,0,0-1.66,2.6,13.68,13.68,0,0,0-1,5.28,12.86,12.86,0,0,0,1.2,5.87,7.72,7.72,0,0,0,3.52,3.51,11,11,0,0,0,4.91,1.14,11.61,11.61,0,0,0,4.4-.86,11.35,11.35,0,0,0,3.26-1.86v-4.88Z"
/><path
class="cls-10"
d="M1045.11,596.13q0-6.54,3.51-10.23a11.92,11.92,0,0,1,9.06-3.7,12.53,12.53,0,0,1,6.55,1.74,11.32,11.32,0,0,1,4.45,4.84,15.73,15.73,0,0,1,1.53,7,15.52,15.52,0,0,1-1.61,7.15,11,11,0,0,1-4.56,4.77,13.07,13.07,0,0,1-6.38,1.62,12.42,12.42,0,0,1-6.62-1.79,11.48,11.48,0,0,1-4.42-4.89A14.84,14.84,0,0,1,1045.11,596.13Zm3.58,0a10.54,10.54,0,0,0,2.56,7.48,8.89,8.89,0,0,0,12.85,0q2.54-2.76,2.53-7.82a13.51,13.51,0,0,0-1.08-5.6,8.28,8.28,0,0,0-3.17-3.7,8.57,8.57,0,0,0-4.68-1.32,8.93,8.93,0,0,0-6.35,2.53Q1048.7,590.25,1048.69,596.18Z"
/><path
class="cls-10"
d="M990.05,1421.1v-4.57h2a2.75,2.75,0,0,1,.93.12,1,1,0,0,1,.51.44,1.23,1.23,0,0,1,.19.69,1.16,1.16,0,0,1-.31.82,1.62,1.62,0,0,1-1,.42,1.32,1.32,0,0,1,.37.23,2.86,2.86,0,0,1,.5.61l.8,1.24h-.76l-.61-.95c-.18-.27-.32-.48-.44-.63a1.27,1.27,0,0,0-.3-.31,1.13,1.13,0,0,0-.28-.12l-.34,0h-.7v2Zm.6-2.55H992a1.84,1.84,0,0,0,.65-.09.72.72,0,0,0,.36-.27.78.78,0,0,0,.12-.41.68.68,0,0,0-.24-.54,1.07,1.07,0,0,0-.74-.21h-1.45Z"
/><path
class="cls-10"
d="M991.8,1422.71a3.74,3.74,0,1,1,3.74-3.74A3.74,3.74,0,0,1,991.8,1422.71Zm0-6.94A3.21,3.21,0,1,0,995,1419,3.21,3.21,0,0,0,991.8,1415.77Z"
/><polyline
class="cls-12"
points="1101.56 1065.39 1111.5 1065.39 1123.2 1051.99 1217.31 1051.99 1245.51 1093.92 1286.27 1093.92"
/><polyline
class="cls-12"
points="927.7 1065.39 917.75 1065.39 906.06 1051.99 811.95 1051.99 783.75 1093.92 764.44 1093.92"
/><polyline
class="cls-12"
points="985.94 1365.91 985.94 1373.8 1042.55 1373.8 1042.55 1365.91"
/><path
class="cls-17"
d="M1266.42,1247.22H1252.5a1.86,1.86,0,0,1-1.19-.44l-5.61-4.67a3,3,0,0,1,0-4.67l5.61-4.68a1.85,1.85,0,0,1,1.19-.43h13.92a1.72,1.72,0,0,1,1.71,1.72v11.45A1.72,1.72,0,0,1,1266.42,1247.22Z"
/><line
class="cls-17"
x1="1254.51"
y1="1235.71"
x2="1262.65"
y2="1243.84"
/><line
class="cls-17"
x1="1262.65"
y1="1235.71"
x2="1254.51"
y2="1243.84"
/><path
class="cls-18"
d="M1261.8,1296.61v6.25a7.19,7.19,0,0,1-7.19,7.19h-7.39l2.9-3.14v6.23l-2.9-3.09"
/><path
class="cls-10"
d="M1249.84,1308s.34,3.83,0,3.83a9.67,9.67,0,0,1-2-1.42v-.91Z"
/></g>
</svg>

After

Width:  |  Height:  |  Size: 27 KiB

+195
View File
@@ -0,0 +1,195 @@
<?xml version="1.0" encoding="UTF-8"?><svg
id="Layer_1"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 206.97 481.72"
>
<defs><style>
.cls-1,
.cls-2,
.cls-3,
.cls-4,
.cls-5,
.cls-6,
.cls-7,
.cls-8,
.cls-9,
.cls-10,
.cls-11 {
stroke-linecap: round;
stroke-linejoin: round;
}
.cls-1, .cls-2, .cls-3, .cls-6, .cls-8, .cls-10, .cls-11 {
fill: #ccc;
}
.cls-1, .cls-11 {
stroke: #999;
stroke-width: 2px;
}
.cls-2, .cls-3, .cls-4, .cls-5, .cls-6, .cls-7, .cls-8, .cls-9, .cls-10 {
stroke: #000;
}
.cls-2, .cls-4, .cls-5 {
stroke-width: 1.5px;
}
.cls-2, .cls-4, .cls-8, .cls-9, .cls-12, .cls-13, .cls-11 {
fill-rule: evenodd;
}
.cls-3, .cls-8 {
stroke-width: 1px;
}
.cls-4 {
fill: #242424;
}
.cls-6, .cls-7 {
stroke-width: 0.5px;
}
.cls-7 {
fill: #999;
}
.cls-9 {
fill: #fff;
stroke-width: 0.75px;
}
.cls-10 {
stroke-width: 0.22px;
}
.cls-12, .cls-13, .cls-14, .cls-15 {
stroke-width: 0px;
}
.cls-12, .cls-15 {
fill: #00afef;
}
.cls-13, .cls-14 {
fill: #b7b7b7;
}
</style></defs><path
class="cls-2"
d="M97.84,232.81h91.76c9.14,0,16.62,7.48,16.62,16.62v214.92c0,9.14-7.48,16.62-16.62,16.62H17.37c-9.14,0-16.62-7.48-16.62-16.62v-154.84c0-9.14,7.48-16.62,16.62-16.62h51.48c8.68,0,12.45-2.57,12.45-14.56v-28.98c0-9.14,7.4-16.54,16.54-16.54Z"
/><path
class="cls-4"
d="M135.52,201.13h66.32v21.47c0,.38-.31.69-.69.69h-64.94c-.38,0-.69-.31-.69-.69v-21.47Z"
/><polygon
class="cls-4"
points="201.84 201.13 194.29 182.05 143.47 182.05 135.52 201.13 201.84 201.13"
/><polygon
class="cls-4"
points="168.68 182.05 194.33 182.05 194.33 .75 143.03 .75 143.03 182.05 168.68 182.05"
/><path
class="cls-4"
d="M168.68,19.05c-8.57.07-22.61.49-25.65,2.54,0,0-1.61,6.89,0,11.41,0,0,13.59-1.34,25.65-1.34s25.65,1.34,25.65,1.34c1.61-4.52,0-11.41,0-11.41-3.05-2.04-17.08-2.47-25.65-2.54Z"
/><rect
class="cls-3"
x="7.06"
y="305.93"
width="193.13"
height="171.26"
rx="22.77"
ry="22.77"
/><rect
class="cls-6"
x="50.31"
y="330.36"
width="122.74"
height="121.76"
rx="10.5"
ry="10.5"
/><path
class="cls-7"
d="M66.49,335.98h90.38c5.2,0,9.41,4.22,9.41,9.41v91.69c0,5.2-4.22,9.41-9.41,9.41h-90.38c-5.2,0-9.41-4.22-9.41-9.41v-91.69c0-5.2,4.22-9.41,9.41-9.41Z"
/><path
class="cls-2"
d="M96.65,232.86h19.83v-2.85c0-.4-.32-.72-.72-.72h-18.38c-.4,0-.72.32-.72.72v2.85Z"
/><rect
class="cls-10"
x="92.66"
y="239.37"
width="102.73"
height="58.83"
rx="2.83"
ry="2.83"
/><rect
class="cls-5"
x="99.69"
y="245.56"
width="88.66"
height="46.46"
/><path
class="cls-2"
d="M138.06,232.81h51.53c3.1,0,6,.86,8.49,2.35v-7.04c0-2-1.02-3.78-2.56-4.83h-54.9c-1.54,1.06-2.56,2.83-2.56,4.83v4.69Z"
/><path
class="cls-2"
d="M67.74,292.89H29.51v-2.73c0-1.5,1.23-2.73,2.73-2.73h32.76c1.5,0,2.73,1.23,2.73,2.73v2.73Z"
/><path
class="cls-11"
d="M44.05,329.75c3.68,0,6.68-3,6.68-6.68s-3-6.68-6.68-6.68-6.68,3-6.68,6.68,3,6.68,6.68,6.68Z"
/><path
class="cls-11"
d="M181.27,329.75c3.68,0,6.68-3,6.68-6.68s-3-6.68-6.68-6.68-6.68,3-6.68,6.68,3,6.68,6.68,6.68Z"
/><path
class="cls-11"
d="M44.05,466.27c3.68,0,6.68-3,6.68-6.68s-3-6.68-6.68-6.68-6.68,3-6.68,6.68,3,6.68,6.68,6.68Z"
/><circle class="cls-1" cx="181.27" cy="459.59" r="6.68" /><polygon
class="cls-12"
points="108.38 262.94 108.38 274.8 114.94 274.8 114.94 276.94 105.81 276.94 105.81 262.94 108.38 262.94"
/><rect
class="cls-15"
x="117.34"
y="262.94"
width="2.57"
height="14"
/><polygon
class="cls-12"
points="125.83 262.94 125.83 274.8 132.38 274.8 132.38 276.94 123.25 276.94 123.25 262.94 125.83 262.94"
/><polygon
class="cls-12"
points="137.09 268.97 140.83 262.94 143.67 262.94 138.36 271.3 138.36 276.94 135.79 276.94 135.79 271.3 130.48 262.94 133.33 262.94 137.06 268.97 137.09 268.97"
/><path
class="cls-12"
d="M153.84,271.58h-3.14v-2.14h5.71v7.07c-.21.08-.47.16-.8.24-.33.08-.69.16-1.09.23-.4.07-.81.12-1.24.16-.43.04-.85.06-1.26.06-1.26,0-2.35-.17-3.29-.51-.94-.34-1.72-.82-2.34-1.43-.63-.61-1.09-1.35-1.4-2.19-.31-.85-.46-1.79-.46-2.81,0-.73.08-1.42.25-2.08.16-.66.41-1.27.73-1.83.32-.56.71-1.07,1.16-1.52.45-.45.98-.84,1.56-1.16.58-.32,1.22-.56,1.92-.74.69-.17,1.44-.26,2.23-.26.7,0,1.38.05,2.01.15.63.1,1.15.23,1.56.37v2.16c-.54-.17-1.09-.3-1.65-.38-.55-.09-1.11-.13-1.68-.13-.76,0-1.47.11-2.14.34-.66.23-1.24.56-1.72,1.01-.49.44-.87.99-1.15,1.64-.28.65-.42,1.4-.42,2.25,0,1.65.44,2.9,1.29,3.73.86.83,2.07,1.24,3.64,1.24.29,0,.6-.01.91-.05.31-.03.59-.07.83-.12v-3.28Z"
/><path
class="cls-12"
d="M169.93,269.93c0-.85-.1-1.6-.31-2.24-.21-.64-.5-1.17-.87-1.6-.37-.43-.81-.74-1.31-.95s-1.06-.31-1.67-.31-1.16.1-1.67.31-.95.53-1.31.95c-.37.43-.66.96-.87,1.6-.21.64-.31,1.38-.31,2.24s.1,1.6.31,2.24c.21.64.5,1.17.87,1.59.37.42.81.74,1.31.95.51.21,1.06.32,1.67.32s1.17-.11,1.67-.32c.51-.21.95-.53,1.31-.95.37-.43.66-.95.87-1.59.21-.64.31-1.39.31-2.24h0ZM172.58,269.93c0,1.07-.15,2.05-.45,2.94-.3.89-.75,1.66-1.33,2.3-.58.64-1.3,1.14-2.15,1.5-.85.35-1.81.53-2.89.53s-2.05-.18-2.89-.53c-.85-.36-1.57-.86-2.15-1.5-.58-.64-1.03-1.41-1.33-2.3-.3-.89-.46-1.87-.46-2.94s.15-2.05.46-2.94c.3-.89.75-1.66,1.33-2.3.58-.64,1.3-1.14,2.15-1.5.85-.35,1.81-.53,2.89-.53s2.05.18,2.89.53c.85.36,1.57.86,2.15,1.5.58.64,1.03,1.41,1.33,2.3.3.89.45,1.87.45,2.94Z"
/><path
class="cls-12"
d="M180.07,263.91c0,.22-.06.4-.18.55-.12.15-.3.26-.56.33h0s.93,1.28.93,1.28h-.68l-.84-1.2h-.39v1.2h-.57v-3.1h.94c.16,0,.3,0,.44.03.13.02.25.04.34.08.18.07.32.17.42.31.1.14.15.31.15.52h0ZM179.02,261.32c-.89,0-1.69.36-2.27.94-.58.58-.94,1.39-.94,2.27s.35,1.67.92,2.25l.02.02c.58.58,1.39.94,2.27.94s1.69-.36,2.27-.94c.58-.58.94-1.39.94-2.27s-.36-1.69-.94-2.27c-.58-.58-1.39-.94-2.27-.94h0ZM180.75,262.81c-.44-.44-1.05-.71-1.73-.71s-1.29.27-1.73.71c-.44.44-.71,1.05-.71,1.73s.27,1.27.7,1.71l.02.02c.44.44,1.05.71,1.73.71s1.28-.27,1.73-.71c.44-.44.71-1.05.71-1.73s-.27-1.28-.71-1.73h0ZM178.63,264.41c.13,0,.24,0,.33-.02.09-.01.17-.03.23-.05.11-.04.19-.1.24-.18.04-.07.07-.16.07-.26,0-.08-.02-.16-.05-.22-.03-.06-.09-.11-.18-.15-.05-.03-.12-.04-.2-.05-.08-.01-.18-.02-.3-.02h-.4v.95h.28Z"
/><polygon
class="cls-13"
points="22.89 342.21 42.82 342.21 42.82 344.85 25.23 344.85 25.23 354.65 22.89 354.65 22.89 342.21"
/><rect
class="cls-14"
x="22.89"
y="359.51"
width="19.94"
height="2.65"
/><polygon
class="cls-13"
points="22.89 367.95 42.82 367.95 42.82 370.6 25.23 370.6 25.23 380.4 22.89 380.4 22.89 367.95"
/><path
class="cls-13"
d="M22.89,388.37h8.45l11.49-7.69v3.17l-6.03,3.94c-1.12.73-2.24,1.42-3.36,2.04,1.04.61,2.21,1.35,3.51,2.2l5.88,3.86v3.08l-11.49-7.96h-8.45v-2.65Z"
/><path
class="cls-13"
d="M30.71,411.91h2.34v8.44h-7.39c-1.03-1.29-1.81-2.63-2.33-4.01-.52-1.38-.78-2.79-.78-4.24,0-1.96.42-3.74,1.26-5.34.84-1.6,2.05-2.81,3.63-3.62,1.59-.82,3.36-1.23,5.31-1.23s3.75.4,5.43,1.22c1.68.81,2.93,1.98,3.74,3.5.82,1.52,1.23,3.28,1.23,5.26,0,1.44-.23,2.74-.7,3.91-.47,1.16-1.12,2.08-1.95,2.74-.83.66-1.93,1.16-3.27,1.51l-.65-2.38c1.01-.3,1.81-.67,2.39-1.11.58-.45,1.04-1.08,1.39-1.9.35-.82.52-1.74.52-2.74,0-1.2-.19-2.24-.55-3.12-.37-.88-.85-1.58-1.45-2.13-.6-.54-1.26-.96-1.97-1.25-1.24-.51-2.58-.76-4.02-.76-1.78,0-3.27.31-4.47.91-1.2.61-2.09,1.5-2.67,2.67-.58,1.17-.87,2.41-.87,3.72,0,1.14.22,2.26.66,3.34.45,1.09.91,1.91,1.42,2.47h3.74v-5.85Z"
/><path
class="cls-13"
d="M32.59,424.69c3.3,0,5.89.89,7.76,2.67,1.87,1.78,2.8,4.07,2.8,6.88,0,1.84-.44,3.5-1.32,4.98-.88,1.48-2.1,2.6-3.68,3.38-1.57.77-3.35,1.16-5.34,1.16s-3.83-.41-5.42-1.23c-1.6-.82-2.8-1.97-3.62-3.47-.82-1.5-1.23-3.11-1.23-4.84,0-1.88.45-3.55,1.36-5.04.91-1.48,2.14-2.6,3.71-3.36,1.56-.76,3.22-1.14,4.97-1.14h0ZM32.55,427.42c-2.4,0-4.29.65-5.67,1.94-1.38,1.29-2.07,2.91-2.07,4.86s.7,3.62,2.09,4.9c1.39,1.28,3.37,1.92,5.93,1.92,1.62,0,3.03-.27,4.24-.82,1.21-.55,2.14-1.35,2.81-2.4.66-1.06,1-2.24,1-3.56,0-1.87-.64-3.47-1.92-4.82-1.28-1.35-3.42-2.02-6.41-2.02Z"
/><path
class="cls-8"
d="M7.06,338.45h-1.67c-.92,0-1.67.75-1.67,1.67v11.46c0,.92.75,1.67,1.67,1.67h1.67v-14.79Z"
/><path
class="cls-8"
d="M7.06,438.01h-1.67c-.92,0-1.67.75-1.67,1.67v11.46c0,.92.75,1.67,1.67,1.67h1.67v-14.79Z"
/><path
class="cls-8"
d="M200.2,338.45h1.67c.92,0,1.67.75,1.67,1.67v11.46c0,.92-.75,1.67-1.67,1.67h-1.67v-14.79Z"
/><path
class="cls-8"
d="M200.2,438.01h1.67c.92,0,1.67.75,1.67,1.67v11.46c0,.92-.75,1.67-1.67,1.67h-1.67v-14.79Z"
/><path
class="cls-9"
d="M181.07,394.74c1.93,0,3.51-1.57,3.51-3.51s-1.57-3.51-3.51-3.51-3.51,1.57-3.51,3.51,1.57,3.51,3.51,3.51Z"
/><path
class="cls-9"
d="M190.07,394.74c1.93,0,3.51-1.57,3.51-3.51s-1.57-3.51-3.51-3.51-3.51,1.57-3.51,3.51,1.57,3.51,3.51,3.51Z"
/>
</svg>

After

Width:  |  Height:  |  Size: 8.8 KiB

+126
View File
@@ -0,0 +1,126 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="733.42 451.82 573.87 931.48">
<defs><style>
.cls-1 {
fill: #8e8d8e;
}
.cls-2 {
fill: #383839;
}
.cls-3 {
fill: #cccccb;
}
.cls-4 {
fill: #222226;
}
.cls-5, .cls-6 {
fill: none;
stroke: #050606;
stroke-miterlimit: 10;
}
.cls-5 {
stroke-width: 1.87px;
}
.cls-6 {
stroke-width: 3.77px;
}
.cls-7 {
fill: #4c4c4d;
}
</style></defs><g id="Layer_4" data-name="Layer 4"><path
class="cls-1"
d="M1277.27,847.59h4.35a8.09,8.09,0,0,1,8.09,8.08v138a8.09,8.09,0,0,1-8.09,8.09h-4.35"
></path><path
class="cls-1"
d="M1277.27,732.73h18a10.14,10.14,0,0,1,10.14,10.14v43A10.14,10.14,0,0,1,1295.26,796h-18a0,0,0,0,1,0,0V732.73A0,0,0,0,1,1277.27,732.73Z"
></path><path
class="cls-2"
d="M1256.49,1200.6h0a14.19,14.19,0,0,1-2.83,12.5c-8.13,9.86-19.94,18.58-46,30.75-19.15,9-28.65,16-38.35,29.6a93.15,93.15,0,0,0-8.7,14.61c-6.95,15.17-11.77,44.44-11.77,65.66v3.61a24.09,24.09,0,0,1-24.1,24.09H887.83a24.09,24.09,0,0,1-24.1-24.09v-3.61c0-21.22-4.82-50.49-11.77-65.66a93.15,93.15,0,0,0-8.7-14.61c-9.7-13.63-19.2-20.65-38.35-29.6-26.06-12.17-37.87-20.89-46-30.75a14.22,14.22,0,0,1-2.82-12.5h0"
></path><path
class="cls-2"
d="M756.09,634.53h0a14.19,14.19,0,0,1,2.83-12.5c8.12-9.86,19.93-18.58,46-30.75,19.15-8.95,28.65-16,38.35-29.6a93.15,93.15,0,0,0,8.7-14.61c6.95-15.17,11.77-44.44,11.77-65.66V477.8a24.09,24.09,0,0,1,24.1-24.09h236.92a24.09,24.09,0,0,1,24.1,24.09v3.61c0,21.22,4.82,50.49,11.77,65.66a93.15,93.15,0,0,0,8.7,14.61c9.7,13.63,19.2,20.65,38.35,29.6,26,12.17,37.86,20.89,46,30.75a14.19,14.19,0,0,1,2.83,12.5h0"
></path><rect
class="cls-3"
x="735.31"
y="598.25"
width="541.96"
height="638.99"
rx="96.44"
></rect><path
class="cls-2"
d="M1247.38,694.68v446.11a66.63,66.63,0,0,1-66.54,66.56H831.75a66.62,66.62,0,0,1-66.56-66.56V694.68a66.63,66.63,0,0,1,66.56-66.55h349.09A66.64,66.64,0,0,1,1247.38,694.68Z"
></path><rect
class="cls-4"
x="817.71"
y="721.76"
width="379.03"
height="388.6"
></rect><path
class="cls-5"
d="M1247.38,694.68v446.11a66.63,66.63,0,0,1-66.54,66.56H831.75a66.62,66.62,0,0,1-66.56-66.56V694.68a66.63,66.63,0,0,1,66.56-66.55h349.09A66.64,66.64,0,0,1,1247.38,694.68Z"
></path><rect
class="cls-6"
x="735.31"
y="598.25"
width="541.96"
height="638.99"
rx="96.44"
></rect><path
class="cls-6"
d="M1256.49,1200.6h0a14.19,14.19,0,0,1-2.83,12.5c-8.13,9.86-19.94,18.58-46,30.75-19.15,9-28.65,16-38.35,29.6a93.15,93.15,0,0,0-8.7,14.61c-6.95,15.17-11.77,44.44-11.77,65.66v3.61a24.09,24.09,0,0,1-24.1,24.09H887.83a24.09,24.09,0,0,1-24.1-24.09v-3.61c0-21.22-4.82-50.49-11.77-65.66a93.15,93.15,0,0,0-8.7-14.61c-9.7-13.63-19.2-20.65-38.35-29.6-26.06-12.17-37.87-20.89-46-30.75a14.22,14.22,0,0,1-2.82-12.5h0"
></path><path
class="cls-6"
d="M756.09,634.53h0a14.19,14.19,0,0,1,2.83-12.5c8.12-9.86,19.93-18.58,46-30.75,19.15-8.95,28.65-16,38.35-29.6a93.15,93.15,0,0,0,8.7-14.61c6.95-15.17,11.77-44.44,11.77-65.66V477.8a24.09,24.09,0,0,1,24.1-24.09h236.92a24.09,24.09,0,0,1,24.1,24.09v3.61c0,21.22,4.82,50.49,11.77,65.66a93.15,93.15,0,0,0,8.7,14.61c9.7,13.63,19.2,20.65,38.35,29.6,26,12.17,37.86,20.89,46,30.75a14.19,14.19,0,0,1,2.83,12.5h0"
></path><rect
class="cls-5"
x="817.71"
y="721.76"
width="379.03"
height="388.6"
></rect><path
class="cls-6"
d="M1277.27,847.59h4.35a8.09,8.09,0,0,1,8.09,8.08v138a8.09,8.09,0,0,1-8.09,8.09h-4.35"
></path><path
class="cls-6"
d="M1277.27,732.73h18a10.14,10.14,0,0,1,10.14,10.14v43A10.14,10.14,0,0,1,1295.26,796h-18a0,0,0,0,1,0,0V732.73A0,0,0,0,1,1277.27,732.73Z"
></path><circle
class="cls-7"
cx="1083.08"
cy="1177.35"
r="16.6"
></circle><rect
class="cls-2"
x="1280.24"
y="739.77"
width="16.77"
height="4.59"
rx="2.29"
></rect><rect
class="cls-2"
x="1280.24"
y="750.91"
width="16.77"
height="4.59"
rx="2.29"
></rect><rect
class="cls-2"
x="1280.24"
y="762.06"
width="16.77"
height="4.59"
rx="2.29"
></rect><rect
class="cls-2"
x="1280.24"
y="773.2"
width="16.77"
height="4.59"
rx="2.29"
></rect><rect
class="cls-2"
x="1280.24"
y="784.34"
width="16.77"
height="4.59"
rx="2.29"
></rect></g>
</svg>

After

Width:  |  Height:  |  Size: 4.5 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 85 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 131 KiB

+493
View File
@@ -0,0 +1,493 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="270.22 240.95 404.28 462.85">
<defs><style>
.cls-1 {
fill: #1b1b1b;
}
.cls-2 {
fill: #434143;
}
.cls-3 {
fill: #353535;
}
.cls-4 {
fill: #2b2b2b;
}
.cls-5 {
fill: #f9d498;
}
.cls-6 {
fill: #fff;
}
.cls-7 {
fill: none;
stroke: #050606;
stroke-miterlimit: 10;
}
.cls-8 {
fill: #181818;
}
.cls-9 {
fill: #cccccb;
}
</style></defs><g id="Layer_2" data-name="Layer 2"><rect
class="cls-1"
x="312.24"
y="260.33"
width="312.56"
height="442.97"
></rect><path
class="cls-2"
d="M674,267.08V696.56a6.75,6.75,0,0,1-6.75,6.74H277.51a6.62,6.62,0,0,1-1.95-.29,3.57,3.57,0,0,1-.46-.16,5.87,5.87,0,0,1-1.46-.78,3,3,0,0,1-.42-.31,4.17,4.17,0,0,1-.38-.34,5.77,5.77,0,0,1-.42-.44l0,0a3.25,3.25,0,0,1-.23-.29,3.43,3.43,0,0,1-.24-.33h0a3.15,3.15,0,0,1-.3-.48,1.71,1.71,0,0,1-.12-.23,2.7,2.7,0,0,1-.17-.34,2.44,2.44,0,0,1-.1-.24c-.05-.13-.1-.26-.14-.39a2,2,0,0,1-.07-.23c0-.13-.07-.27-.1-.41a1.55,1.55,0,0,1,0-.21,3.11,3.11,0,0,1-.07-.44,2.64,2.64,0,0,1,0-.28,1.64,1.64,0,0,1,0-.22,2.81,2.81,0,0,1,0-.29V267.08a6.75,6.75,0,0,1,6.75-6.75h44.73v28a8.34,8.34,0,0,0,2.44,5.9l21,21,5,5a7.1,7.1,0,0,0,.71.63,5.09,5.09,0,0,0,.47.34l.19.13c.14.09.28.18.43.26a8.16,8.16,0,0,0,2.06.83l.61.13h0l.56.08H356q.33,0,.66,0h59.05a3.44,3.44,0,0,0,3.44-3.44V317a3.44,3.44,0,0,0-3.44-3.44H362.22a4.62,4.62,0,0,1-.65-.07h0q-.31,0-.63-.12a6.29,6.29,0,0,1-.62-.17l-.34-.11-.1,0-.36-.14-.51-.24-.18-.1a5.45,5.45,0,0,1-.66-.39,6.26,6.26,0,0,1-.66-.49,8,8,0,0,1-.61-.55l-22.07-22.07a6.89,6.89,0,0,1-.62-.7,6.55,6.55,0,0,1-.39-.53l-.06-.09c-.11-.16-.21-.34-.31-.51s-.1-.17-.14-.26a5.59,5.59,0,0,1-.38-.87,6.69,6.69,0,0,1-.31-1,5.35,5.35,0,0,1-.11-.55v-.06c0-.22-.06-.44-.08-.66s0-.45,0-.68V260.33H614.66v22.86a8.31,8.31,0,0,1-2.45,5.9l-22.06,22.07a5.22,5.22,0,0,1-.43.39l-.05,0-.32.26a4.29,4.29,0,0,1-.55.4h0c-.16.1-.31.2-.47.28s-.22.13-.34.18l0,0-.12.06-.11.05-.07,0-.35.15-.08,0-.12,0-.38.13-.64.17-.56.1h0a4.6,4.6,0,0,1-.52.06c-.23,0-.45,0-.68,0H531.38a3.44,3.44,0,0,0-3.44,3.44v2.19c0,.12,0,.24,0,.35a3.55,3.55,0,0,0,.08.47,1.7,1.7,0,0,0,.1.32.09.09,0,0,0,0,.05,1.42,1.42,0,0,0,.08.18s0,.11.08.17a.91.91,0,0,0,.09.17,2.05,2.05,0,0,0,.24.36h0a.94.94,0,0,0,.09.12.52.52,0,0,0,.1.11,2.72,2.72,0,0,0,.39.37l.23.17a4.08,4.08,0,0,0,.58.32h0l.19.07a1.58,1.58,0,0,0,.31.09l.23.05.23,0,.35,0h59a8.36,8.36,0,0,0,5.9-2.44l26-26a8.31,8.31,0,0,0,2.45-5.9v-28h42.44a4.58,4.58,0,0,1,.53,0l.35,0a1.19,1.19,0,0,1,.32.05,3,3,0,0,1,.52.11l.57.18a.17.17,0,0,1,.1,0l.37.16a2.6,2.6,0,0,1,.34.16.72.72,0,0,1,.19.11,4.09,4.09,0,0,1,.48.29,5.2,5.2,0,0,1,.47.35l.09.06.44.41c.15.15.3.31.44.48a5,5,0,0,1,.39.52q.15.22.3.48a.27.27,0,0,0,.06.1c.06.12.12.25.17.38a3.79,3.79,0,0,1,.18.42,3.57,3.57,0,0,1,.16.46A6.82,6.82,0,0,1,674,267.08Z"
></path><path
class="cls-3"
d="M270.76,658.06h33.53a8.5,8.5,0,0,0,8.5-8.5V320.42a8.5,8.5,0,0,0-8.5-8.5H270.76"
></path><path
class="cls-3"
d="M674,658.06H640.46a8.51,8.51,0,0,1-8.5-8.5V320.42a8.5,8.5,0,0,1,8.5-8.5H674"
></path><path
class="cls-4"
d="M632,380.26v19.3l-26.29,33a5.89,5.89,0,0,1-8.39.89,6.16,6.16,0,0,1-.87-8.56Z"
></path><path
class="cls-4"
d="M558.84,424.91,632,333.07v19.31l-63.85,80.2a5.89,5.89,0,0,1-8.39.89A6.17,6.17,0,0,1,558.84,424.91Z"
></path><polygon
class="cls-4"
points="671.03 303.31 664.17 311.92 648.8 311.92 655.65 303.31 671.03 303.31"
></polygon><path
class="cls-4"
d="M633.46,303.31,530.54,432.58a5.89,5.89,0,0,1-8.39.89,6.16,6.16,0,0,1-.87-8.56L627.91,291v12.32Z"
></path><path
class="cls-4"
d="M565.12,322.67h15.36L493,432.58a5.89,5.89,0,0,1-8.39.89,6.16,6.16,0,0,1-.87-8.56Z"
></path><path
class="cls-4"
d="M614.66,260.44v19.3l-25.88,32.52h0c-.16.1-.31.2-.47.28s-.22.13-.34.18l0,0-.12.06-.11.05-.07,0-.35.15-.08,0-.12,0-.38.13-.64.17-.56.1h0a4.6,4.6,0,0,1-.52.06c-.23,0-.45,0-.68,0H572.34Z"
></path><polygon
class="cls-4"
points="627.91 260.33 627.91 263.09 624.8 267 624.8 260.33 627.91 260.33"
></polygon><path
class="cls-4"
d="M531.38,322.67h11.54L455.41,432.58a5.89,5.89,0,0,1-8.39.89,6.16,6.16,0,0,1-.87-8.56L528.64,321.3h0a.94.94,0,0,0,.09.12.52.52,0,0,0,.1.11,2.72,2.72,0,0,0,.39.37l.23.17a4.08,4.08,0,0,0,.58.32h0l.19.07a1.58,1.58,0,0,0,.31.09l.23.05.23,0Z"
></path><polygon
class="cls-4"
points="592.55 260.33 550.14 313.6 534.77 313.6 577.19 260.33 592.55 260.33"
></polygon><path
class="cls-4"
d="M555,260.33,417.85,432.58a5.89,5.89,0,0,1-8.39.89,6.16,6.16,0,0,1-.87-8.56l131-164.58Z"
></path><path
class="cls-4"
d="M517.42,260.33,380.28,432.58a5.89,5.89,0,0,1-8.39.89,6.18,6.18,0,0,1-.87-8.56l131-164.58Z"
></path><path
class="cls-4"
d="M479.86,260.33,342.72,432.58a5.89,5.89,0,0,1-8.39.89,6.16,6.16,0,0,1-.87-8.56l81.4-102.24,4.24-5.33,45.39-57Z"
></path><polygon
class="cls-4"
points="377.29 322.67 392.66 322.67 312.79 423 312.79 403.68 377.29 322.67"
></polygon><polygon
class="cls-4"
points="442.29 260.33 399.88 313.6 384.51 313.6 426.93 260.33 442.29 260.33"
></polygon><path
class="cls-4"
d="M355.18,322.55h0l-42.41,53.26v-19.3l32.89-41.31,5,5a7.1,7.1,0,0,0,.71.63,5.09,5.09,0,0,0,.47.34l.19.13a3.78,3.78,0,0,0,.43.26,8.16,8.16,0,0,0,2.06.83Z"
></path><path
class="cls-4"
d="M404.73,260.33l-42.4,53.26h-.11a4.62,4.62,0,0,1-.65-.07h0q-.31,0-.63-.12a6.29,6.29,0,0,1-.62-.17l-.34-.11-.1,0-.36-.14-.51-.24-.18-.1a5.45,5.45,0,0,1-.66-.39,6.26,6.26,0,0,1-.66-.49,8,8,0,0,1-.61-.55l-4.45-4.45,36.92-46.38Z"
></path><path
class="cls-4"
d="M324.75,294.27l8.56,8.56-20.52,25.78v-8.19a8.45,8.45,0,0,0-3.43-6.82Z"
></path><path
class="cls-4"
d="M367.14,260.33l-27.07,34-5.25-5.25a6.89,6.89,0,0,1-.62-.7,6.55,6.55,0,0,1-.39-.53l-.06-.09c-.11-.16-.21-.34-.31-.51s-.1-.17-.14-.26a5.59,5.59,0,0,1-.38-.87,6.69,6.69,0,0,1-.31-1,5.35,5.35,0,0,1-.11-.55v0l19.29-24.22Z"
></path><polygon
class="cls-4"
points="279.98 303.31 295.35 303.31 288.49 311.92 273.12 311.92 279.98 303.31"
></polygon><polygon
class="cls-4"
points="322.24 260.33 322.24 269.53 316.84 276.31 316.84 260.33 322.24 260.33"
></polygon><path
class="cls-4"
d="M632,573.46v19.31L544,703.3h-11.5a6.14,6.14,0,0,1,.93-6Z"
></path><path
class="cls-4"
d="M632,617.6v19.3l-52.87,66.4h-11.5a6.14,6.14,0,0,1,.93-6Z"
></path><path
class="cls-4"
d="M603.66,697.28l24.25-30.46v19.31L614.24,703.3h-11.5A6.16,6.16,0,0,1,603.66,697.28Z"
></path><path
class="cls-4"
d="M650.26,658.06l-1.9,2.39H633l2.95-3.7a8.45,8.45,0,0,0,4.53,1.31Z"
></path><path
class="cls-4"
d="M632,526.28v19.3L506.38,703.3h-11.5a6.18,6.18,0,0,1,.93-6Z"
></path><path
class="cls-4"
d="M607.21,527.33a6.17,6.17,0,0,1-1.33,3.83L468.82,703.3h-11.5a6.14,6.14,0,0,1,.93-6L596.61,523.49a5.9,5.9,0,0,1,8.4-.88A6.1,6.1,0,0,1,607.21,527.33Z"
></path><path
class="cls-4"
d="M569.65,527.33a6.14,6.14,0,0,1-1.34,3.83l-137,172.14H419.75a6.18,6.18,0,0,1,.93-6L559.05,523.49a5.89,5.89,0,0,1,8.39-.88A6.11,6.11,0,0,1,569.65,527.33Z"
></path><path
class="cls-4"
d="M532.08,527.33a6.17,6.17,0,0,1-1.33,3.83L393.69,703.3h-11.5a6.14,6.14,0,0,1,.93-6L521.49,523.49a5.89,5.89,0,0,1,8.39-.88A6.1,6.1,0,0,1,532.08,527.33Z"
></path><path
class="cls-4"
d="M494.52,527.33a6.14,6.14,0,0,1-1.34,3.83l-137,172.14h-11.5a6.16,6.16,0,0,1,.92-6L483.92,523.49a5.89,5.89,0,0,1,8.39-.88A6.11,6.11,0,0,1,494.52,527.33Z"
></path><path
class="cls-4"
d="M457,527.33a6.17,6.17,0,0,1-1.33,3.83L318.56,703.3h-1.72V686.16L446.36,523.49a5.89,5.89,0,0,1,8.39-.88A6.1,6.1,0,0,1,457,527.33Z"
></path><path
class="cls-4"
d="M419.39,527.33a6.14,6.14,0,0,1-1.34,3.83L315.12,660.45H299.75l109-137a5.89,5.89,0,0,1,8.39-.88A6.11,6.11,0,0,1,419.39,527.33Z"
></path><polygon
class="cls-4"
points="279.45 658.06 277.55 660.45 270.76 660.45 270.76 658.06 279.45 658.06"
></polygon><path
class="cls-4"
d="M381.83,527.33a6.14,6.14,0,0,1-1.34,3.83l-67.7,85v-19.3l58.44-73.4a5.89,5.89,0,0,1,8.39-.88A6.11,6.11,0,0,1,381.83,527.33Z"
></path><path
class="cls-4"
d="M344.26,527.33a6.14,6.14,0,0,1-1.34,3.83L312.79,569v-19.3l20.87-26.22a5.89,5.89,0,0,1,8.39-.88A6.11,6.11,0,0,1,344.26,527.33Z"
></path><path
class="cls-2"
d="M422.78,253.73,430.69,243a3.83,3.83,0,0,1,3.07-1.55h75.52a3.8,3.8,0,0,1,3.22,1.78l6.64,10.51"
></path><path
class="cls-5"
d="M312.71,327.38a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><circle class="cls-6" cx="301.4" cy="326.03" r="8.36"></circle><path
class="cls-7"
d="M312.71,327.38a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><path
class="cls-6"
d="M279.92,326a8.36,8.36,0,0,1-8.36,8.36,7,7,0,0,1-.8,0V317.71a7,7,0,0,1,.8,0A8.36,8.36,0,0,1,279.92,326Z"
></path><path
class="cls-5"
d="M312.71,362.54a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><circle class="cls-6" cx="301.4" cy="361.19" r="8.36"></circle><path
class="cls-7"
d="M312.71,362.54a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><path
class="cls-6"
d="M279.92,361.19a8.36,8.36,0,0,1-8.36,8.36,7,7,0,0,1-.8,0V352.87a7,7,0,0,1,.8,0A8.36,8.36,0,0,1,279.92,361.19Z"
></path><path
class="cls-5"
d="M312.71,397.7a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84V385c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><circle class="cls-6" cx="301.4" cy="396.35" r="8.36"></circle><path
class="cls-7"
d="M312.71,397.7a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84V385c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><path
class="cls-6"
d="M279.92,396.35a8.36,8.36,0,0,1-8.36,8.36,7,7,0,0,1-.8,0V388a7,7,0,0,1,.8,0A8.36,8.36,0,0,1,279.92,396.35Z"
></path><path
class="cls-5"
d="M312.71,432.85A11.38,11.38,0,0,1,293.85,440a3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><circle class="cls-6" cx="301.4" cy="431.5" r="8.36"></circle><path
class="cls-7"
d="M312.71,432.85A11.38,11.38,0,0,1,293.85,440a3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><path
class="cls-6"
d="M279.92,431.5a8.36,8.36,0,0,1-8.36,8.36,7,7,0,0,1-.8,0V423.18a7,7,0,0,1,.8,0A8.36,8.36,0,0,1,279.92,431.5Z"
></path><path
class="cls-5"
d="M312.71,468a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62A11.39,11.39,0,0,1,312.71,468Z"
></path><circle class="cls-6" cx="301.4" cy="466.66" r="8.36"></circle><path
class="cls-7"
d="M312.71,468a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62A11.39,11.39,0,0,1,312.71,468Z"
></path><path
class="cls-6"
d="M279.92,466.66a8.36,8.36,0,0,1-8.36,8.36,7,7,0,0,1-.8,0V458.34a7,7,0,0,1,.8,0A8.36,8.36,0,0,1,279.92,466.66Z"
></path><path
class="cls-5"
d="M312.71,503.17a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><circle class="cls-6" cx="301.4" cy="501.82" r="8.36"></circle><path
class="cls-7"
d="M312.71,503.17a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><path
class="cls-6"
d="M279.92,501.82a8.36,8.36,0,0,1-8.36,8.36,7,7,0,0,1-.8,0V493.5a7,7,0,0,1,.8,0A8.36,8.36,0,0,1,279.92,501.82Z"
></path><path
class="cls-5"
d="M312.71,538.32a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><circle class="cls-6" cx="301.4" cy="536.97" r="8.36"></circle><path
class="cls-7"
d="M312.71,538.32a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><path
class="cls-6"
d="M279.92,537a8.36,8.36,0,0,1-8.36,8.36,7,7,0,0,1-.8,0V528.65a7,7,0,0,1,.8,0A8.36,8.36,0,0,1,279.92,537Z"
></path><path
class="cls-5"
d="M312.71,573.48a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><circle class="cls-6" cx="301.4" cy="572.13" r="8.36"></circle><path
class="cls-7"
d="M312.71,573.48a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><path
class="cls-6"
d="M279.92,572.13a8.36,8.36,0,0,1-8.36,8.36,7,7,0,0,1-.8,0V563.81a7,7,0,0,1,.8,0A8.36,8.36,0,0,1,279.92,572.13Z"
></path><path
class="cls-5"
d="M312.71,608.63a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><circle class="cls-6" cx="301.4" cy="607.28" r="8.36"></circle><path
class="cls-7"
d="M312.71,608.63a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><path
class="cls-6"
d="M279.92,607.28a8.36,8.36,0,0,1-8.36,8.36,7,7,0,0,1-.8,0V599a7,7,0,0,1,.8,0A8.36,8.36,0,0,1,279.92,607.28Z"
></path><path
class="cls-5"
d="M312.24,632.92v19a1.86,1.86,0,0,1-1.86,1.86H293a1.86,1.86,0,0,1-1.86-1.86v-1.9h-9.73a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62h10.16v-1.9a1.86,1.86,0,0,1,1.86-1.86h17.34A1.86,1.86,0,0,1,312.24,632.92Z"
></path><circle class="cls-6" cx="301.4" cy="642.44" r="8.36"></circle><path
class="cls-6"
d="M279.92,642.44a8.36,8.36,0,0,1-8.36,8.36,7,7,0,0,1-.8,0V634.12a7,7,0,0,1,.8,0A8.36,8.36,0,0,1,279.92,642.44Z"
></path><circle
class="cls-4"
cx="292.92"
cy="279.53"
r="10.92"
></circle><circle
class="cls-7"
cx="292.92"
cy="279.53"
r="10.92"
></circle><path
class="cls-8"
d="M300.31,279.53a2.39,2.39,0,0,1-2.38,2.38h-2.62v2.62a2.38,2.38,0,0,1-4.76,0v-2.62h-2.62a2.39,2.39,0,1,1,0-4.77h2.62v-2.62a2.38,2.38,0,0,1,4.76,0v2.62h2.62A2.39,2.39,0,0,1,300.31,279.53Z"
></path><circle
class="cls-4"
cx="653.25"
cy="279.53"
r="10.92"
></circle><circle
class="cls-7"
cx="653.25"
cy="279.53"
r="10.92"
></circle><path
class="cls-8"
d="M660.64,279.53a2.39,2.39,0,0,1-2.38,2.38h-2.62v2.62a2.38,2.38,0,0,1-4.76,0v-2.62h-2.62a2.39,2.39,0,1,1,0-4.77h2.62v-2.62a2.38,2.38,0,0,1,4.76,0v2.62h2.62A2.39,2.39,0,0,1,660.64,279.53Z"
></path><circle
class="cls-4"
cx="292.92"
cy="680.59"
r="10.92"
></circle><circle
class="cls-7"
cx="292.92"
cy="680.59"
r="10.92"
></circle><path
class="cls-8"
d="M300.31,680.59a2.39,2.39,0,0,1-2.38,2.38h-2.62v2.62a2.38,2.38,0,0,1-4.76,0V683h-2.62a2.39,2.39,0,1,1,0-4.77h2.62v-2.62a2.38,2.38,0,0,1,4.76,0v2.62h2.62A2.39,2.39,0,0,1,300.31,680.59Z"
></path><circle
class="cls-4"
cx="653.25"
cy="680.59"
r="10.92"
></circle><circle
class="cls-7"
cx="653.25"
cy="680.59"
r="10.92"
></circle><path
class="cls-8"
d="M660.64,680.59a2.39,2.39,0,0,1-2.38,2.38h-2.62v2.62a2.38,2.38,0,0,1-4.76,0V683h-2.62a2.39,2.39,0,1,1,0-4.77h2.62v-2.62a2.38,2.38,0,0,1,4.76,0v2.62h2.62A2.39,2.39,0,0,1,660.64,680.59Z"
></path><path
class="cls-7"
d="M270.76,658.06h33.53a8.5,8.5,0,0,0,8.5-8.5V320.42a8.5,8.5,0,0,0-8.5-8.5H270.76"
></path><path
class="cls-7"
d="M332.38,260.33v22.86a8.34,8.34,0,0,0,2.44,5.9l22.07,22.07a8.34,8.34,0,0,0,5.9,2.44h52.87A3.44,3.44,0,0,1,419.1,317v2.19a3.44,3.44,0,0,1-3.44,3.44H356.61a8.34,8.34,0,0,1-5.9-2.44l-26-26a8.34,8.34,0,0,1-2.44-5.9v-28"
></path><path
class="cls-7"
d="M614.66,260.33v22.86a8.31,8.31,0,0,1-2.45,5.9l-22.06,22.07a5.22,5.22,0,0,1-.43.39l-.05,0a1.92,1.92,0,0,1-.32.26,4.29,4.29,0,0,1-.55.4h0c-.16.1-.31.2-.47.28a2.21,2.21,0,0,1-.34.18l0,0-.12.06-.11.05-.07,0-.35.15-.08,0-.12,0-.38.13-.64.17-.56.1h0a4.35,4.35,0,0,1-.52.06c-.23,0-.45,0-.68,0H531.38a3.44,3.44,0,0,0-3.44,3.44v2.19c0,.12,0,.24,0,.35a3.55,3.55,0,0,0,.08.47,1.7,1.7,0,0,0,.1.32.09.09,0,0,0,0,.05,1.42,1.42,0,0,0,.08.18s0,.11.08.17a.56.56,0,0,0,.09.17,2.05,2.05,0,0,0,.24.36h0a.94.94,0,0,0,.09.12.52.52,0,0,0,.1.11,2.72,2.72,0,0,0,.39.37l.23.17a3.28,3.28,0,0,0,.58.32h0l.19.07a1.58,1.58,0,0,0,.31.09l.23.05.23,0,.35,0h59a8.36,8.36,0,0,0,5.9-2.44l26-26a8.31,8.31,0,0,0,2.45-5.9v-28"
></path><path
class="cls-7"
d="M312.24,632.92v19a1.86,1.86,0,0,1-1.86,1.86H293a1.86,1.86,0,0,1-1.86-1.86v-1.9h-9.73a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62h10.16v-1.9a1.86,1.86,0,0,1,1.86-1.86h17.34A1.86,1.86,0,0,1,312.24,632.92Z"
></path><path
class="cls-5"
d="M632,327.38a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,327.38Z"
></path><circle
class="cls-6"
cx="643.34"
cy="326.03"
r="8.36"
></circle><path
class="cls-7"
d="M632,327.38a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,327.38Z"
></path><path
class="cls-6"
d="M664.83,326a8.36,8.36,0,0,0,8.36,8.36,7,7,0,0,0,.8,0V317.71a7,7,0,0,0-.8,0A8.36,8.36,0,0,0,664.83,326Z"
></path><path
class="cls-5"
d="M632,362.54a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,362.54Z"
></path><circle
class="cls-6"
cx="643.34"
cy="361.19"
r="8.36"
></circle><path
class="cls-7"
d="M632,362.54a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,362.54Z"
></path><path
class="cls-6"
d="M664.83,361.19a8.36,8.36,0,0,0,8.36,8.36,7,7,0,0,0,.8,0V352.87a7,7,0,0,0-.8,0A8.36,8.36,0,0,0,664.83,361.19Z"
></path><path
class="cls-5"
d="M632,397.7a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89A11.36,11.36,0,0,0,674,407.7V385c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,397.7Z"
></path><circle
class="cls-6"
cx="643.34"
cy="396.35"
r="8.36"
></circle><path
class="cls-7"
d="M632,397.7a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89A11.36,11.36,0,0,0,674,407.7V385c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,397.7Z"
></path><path
class="cls-6"
d="M664.83,396.35a8.36,8.36,0,0,0,8.36,8.36,7,7,0,0,0,.8,0V388a7,7,0,0,0-.8,0A8.36,8.36,0,0,0,664.83,396.35Z"
></path><path
class="cls-5"
d="M632,432.85A11.38,11.38,0,0,0,650.9,440a3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,432.85Z"
></path><circle class="cls-6" cx="643.34" cy="431.5" r="8.36"></circle><path
class="cls-7"
d="M632,432.85A11.38,11.38,0,0,0,650.9,440a3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,432.85Z"
></path><path
class="cls-6"
d="M664.83,431.5a8.36,8.36,0,0,0,8.36,8.36,7,7,0,0,0,.8,0V423.18a7,7,0,0,0-.8,0A8.36,8.36,0,0,0,664.83,431.5Z"
></path><path
class="cls-5"
d="M632,468a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89A11.36,11.36,0,0,0,674,478v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,468Z"
></path><circle
class="cls-6"
cx="643.34"
cy="466.66"
r="8.36"
></circle><path
class="cls-7"
d="M632,468a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89A11.36,11.36,0,0,0,674,478v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,468Z"
></path><path
class="cls-6"
d="M664.83,466.66a8.36,8.36,0,0,0,8.36,8.36,7,7,0,0,0,.8,0V458.34a7,7,0,0,0-.8,0A8.36,8.36,0,0,0,664.83,466.66Z"
></path><path
class="cls-5"
d="M632,503.17a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,503.17Z"
></path><circle
class="cls-6"
cx="643.34"
cy="501.82"
r="8.36"
></circle><path
class="cls-7"
d="M632,503.17a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,503.17Z"
></path><path
class="cls-6"
d="M664.83,501.82a8.36,8.36,0,0,0,8.36,8.36,7,7,0,0,0,.8,0V493.5a7,7,0,0,0-.8,0A8.36,8.36,0,0,0,664.83,501.82Z"
></path><path
class="cls-5"
d="M632,538.32a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,538.32Z"
></path><circle
class="cls-6"
cx="643.34"
cy="536.97"
r="8.36"
></circle><path
class="cls-7"
d="M632,538.32a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,538.32Z"
></path><path
class="cls-6"
d="M664.83,537a8.36,8.36,0,0,0,8.36,8.36,7,7,0,0,0,.8,0V528.65a7,7,0,0,0-.8,0A8.36,8.36,0,0,0,664.83,537Z"
></path><path
class="cls-5"
d="M632,573.48a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,573.48Z"
></path><circle
class="cls-6"
cx="643.34"
cy="572.13"
r="8.36"
></circle><path
class="cls-7"
d="M632,573.48a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,573.48Z"
></path><path
class="cls-6"
d="M664.83,572.13a8.36,8.36,0,0,0,8.36,8.36,7,7,0,0,0,.8,0V563.81a7,7,0,0,0-.8,0A8.36,8.36,0,0,0,664.83,572.13Z"
></path><path
class="cls-5"
d="M632,608.63a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,608.63Z"
></path><circle
class="cls-6"
cx="643.34"
cy="607.28"
r="8.36"
></circle><path
class="cls-7"
d="M632,608.63a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,608.63Z"
></path><path
class="cls-6"
d="M664.83,607.28a8.36,8.36,0,0,0,8.36,8.36,7,7,0,0,0,.8,0V599a7,7,0,0,0-.8,0A8.36,8.36,0,0,0,664.83,607.28Z"
></path><path
class="cls-5"
d="M632.51,632.92v19a1.86,1.86,0,0,0,1.86,1.86h17.34a1.86,1.86,0,0,0,1.86-1.86v-1.9h9.73a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H653.57v-1.9a1.86,1.86,0,0,0-1.86-1.86H634.37A1.86,1.86,0,0,0,632.51,632.92Z"
></path><circle
class="cls-6"
cx="643.34"
cy="642.44"
r="8.36"
></circle><path
class="cls-6"
d="M664.83,642.44a8.36,8.36,0,0,0,8.36,8.36,7,7,0,0,0,.8,0V634.12a7,7,0,0,0-.8,0A8.36,8.36,0,0,0,664.83,642.44Z"
></path><path
class="cls-7"
d="M674,658.06H640.46a8.51,8.51,0,0,1-8.5-8.5V320.42a8.5,8.5,0,0,1,8.5-8.5H674"
></path><path
class="cls-7"
d="M632.51,632.92v19a1.86,1.86,0,0,0,1.86,1.86h17.34a1.86,1.86,0,0,0,1.86-1.86v-1.9h9.73a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H653.57v-1.9a1.86,1.86,0,0,0-1.86-1.86H634.37A1.86,1.86,0,0,0,632.51,632.92Z"
></path><path
class="cls-7"
d="M674,267.08V696.56a6.75,6.75,0,0,1-6.75,6.74H277.51a6.62,6.62,0,0,1-1.95-.29,3.57,3.57,0,0,1-.46-.16,5.87,5.87,0,0,1-1.46-.78,3,3,0,0,1-.42-.31,4.17,4.17,0,0,1-.38-.34,5.77,5.77,0,0,1-.42-.44l0,0a3.25,3.25,0,0,1-.23-.29,3.43,3.43,0,0,1-.24-.33h0a3.15,3.15,0,0,1-.3-.48,1.71,1.71,0,0,1-.12-.23,2.7,2.7,0,0,1-.17-.34,2.44,2.44,0,0,1-.1-.24c-.05-.13-.1-.26-.14-.39a2,2,0,0,1-.07-.23c0-.13-.07-.27-.1-.41a1.55,1.55,0,0,1,0-.21,3.11,3.11,0,0,1-.07-.44,2.64,2.64,0,0,1,0-.28,4.36,4.36,0,0,1,0-.51V267.08a6.75,6.75,0,0,1,6.75-6.75h44.73v28a8.34,8.34,0,0,0,2.44,5.9l21,21,5,5a7.1,7.1,0,0,0,.71.63,5.09,5.09,0,0,0,.47.34l.19.13a3.78,3.78,0,0,0,.43.26,8.16,8.16,0,0,0,2.06.83l.61.13h0l.56.08H356q.33,0,.66,0h59.05a3.44,3.44,0,0,0,3.44-3.44V317a3.44,3.44,0,0,0-3.44-3.44H362.22a4.62,4.62,0,0,1-.65-.07h0q-.31,0-.63-.12a6.29,6.29,0,0,1-.62-.17l-.34-.11-.1,0-.36-.14-.51-.24-.18-.1a5.45,5.45,0,0,1-.66-.39,6.26,6.26,0,0,1-.66-.49,8,8,0,0,1-.61-.55l-22.07-22.07a6.89,6.89,0,0,1-.62-.7,6.55,6.55,0,0,1-.39-.53l-.06-.09c-.11-.16-.21-.34-.31-.51s-.1-.17-.14-.26a5.59,5.59,0,0,1-.38-.87,6.69,6.69,0,0,1-.31-1,5.35,5.35,0,0,1-.11-.55v-.06c0-.22-.06-.44-.08-.66s0-.45,0-.68V260.33H614.66v22.86a8.31,8.31,0,0,1-2.45,5.9l-22.06,22.07a5.22,5.22,0,0,1-.43.39l-.05,0-.32.26a4.29,4.29,0,0,1-.55.4h0c-.16.1-.31.2-.47.28s-.22.13-.34.18l0,0-.12.06-.11.05-.07,0-.35.15-.08,0-.12,0-.38.13-.64.17-.56.1h0a4.6,4.6,0,0,1-.52.06c-.23,0-.45,0-.68,0H531.38a3.44,3.44,0,0,0-3.44,3.44v2.19c0,.12,0,.24,0,.35a3.55,3.55,0,0,0,.08.47,1.7,1.7,0,0,0,.1.32.09.09,0,0,0,0,.05,1.42,1.42,0,0,0,.08.18s0,.11.08.17a.91.91,0,0,0,.09.17,2.05,2.05,0,0,0,.24.36h0a.94.94,0,0,0,.09.12.52.52,0,0,0,.1.11,2.72,2.72,0,0,0,.39.37,1.24,1.24,0,0,0,.23.17,4.08,4.08,0,0,0,.58.32h0l.19.07a1.58,1.58,0,0,0,.31.09l.23.05.23,0,.35,0h59a8.36,8.36,0,0,0,5.9-2.44l26-26a8.31,8.31,0,0,0,2.45-5.9v-28h42.44a4.58,4.58,0,0,1,.53,0l.35,0a1.19,1.19,0,0,1,.32.05,3,3,0,0,1,.52.11l.57.18a.17.17,0,0,1,.1,0l.37.16a2.6,2.6,0,0,1,.34.16.72.72,0,0,1,.19.11,4.09,4.09,0,0,1,.48.29,5.2,5.2,0,0,1,.47.35l.09.06.44.41c.15.15.3.31.44.48a5,5,0,0,1,.39.52q.15.22.3.48a.27.27,0,0,0,.06.1c.06.12.12.25.17.38a3.79,3.79,0,0,1,.18.42,3.57,3.57,0,0,1,.16.46A6.82,6.82,0,0,1,674,267.08Z"
></path><rect
class="cls-5"
x="434.83"
y="246.4"
width="3.3"
height="7.33"
></rect><rect
class="cls-5"
x="453.81"
y="246.4"
width="3.3"
height="7.33"
></rect><rect
class="cls-5"
x="488.83"
y="246.4"
width="3.3"
height="7.33"
></rect><rect
class="cls-5"
x="507.81"
y="246.4"
width="3.3"
height="7.33"
></rect><path
class="cls-9"
d="M413.29,253.73H530.14a1.51,1.51,0,0,1,1.51,1.51v5.09a0,0,0,0,1,0,0H411.78a0,0,0,0,1,0,0v-5.09A1.51,1.51,0,0,1,413.29,253.73Z"
></path><path
class="cls-7"
d="M413.29,253.73H530.14a1.51,1.51,0,0,1,1.51,1.51v5.09a0,0,0,0,1,0,0H411.78a0,0,0,0,1,0,0v-5.09A1.51,1.51,0,0,1,413.29,253.73Z"
></path><path
class="cls-7"
d="M422.78,253.73,430.69,243a3.83,3.83,0,0,1,3.07-1.55h75.52a3.8,3.8,0,0,1,3.22,1.78l6.64,10.51"
></path><path
class="cls-4"
d="M338.2,506.12V450h7.6V499.5h28.29v6.62Z"
></path><path class="cls-4" d="M384.43,506.12V450H392v56.13Z"></path><path
class="cls-4"
d="M405.12,506.12V450h7.6V499.5H441v6.62Z"
></path><path
class="cls-4"
d="M460.29,506.12V482.35L438.15,450h9.24l11.33,16.93q3.13,4.74,5.84,9.49,2.58-4.4,6.27-9.91L482,450h8.86l-22.92,32.36v23.77Z"
></path><path
class="cls-4"
d="M524.51,484.11v-6.59l24.33,0v20.83a43.38,43.38,0,0,1-11.56,6.57,35,35,0,0,1-12.23,2.2,33.22,33.22,0,0,1-15.37-3.54,23.71,23.71,0,0,1-10.44-10.24,31.56,31.56,0,0,1-3.53-15,34.06,34.06,0,0,1,3.51-15.3,23,23,0,0,1,10.08-10.55A32.22,32.22,0,0,1,524.47,449a30.52,30.52,0,0,1,11.26,2,18.62,18.62,0,0,1,7.9,5.49,24.34,24.34,0,0,1,4.35,9.19l-6.86,1.84a20.45,20.45,0,0,0-3.21-6.74,13.16,13.16,0,0,0-5.49-3.92,20.38,20.38,0,0,0-7.91-1.48,23.82,23.82,0,0,0-9,1.55,17,17,0,0,0-6.14,4.08,19.44,19.44,0,0,0-3.62,5.55,28.86,28.86,0,0,0-2.2,11.3,26.93,26.93,0,0,0,2.65,12.56,16.74,16.74,0,0,0,7.7,7.5,24.34,24.34,0,0,0,10.73,2.45,25.94,25.94,0,0,0,9.64-1.86,25.09,25.09,0,0,0,7.13-4V484.11Z"
></path><path
class="cls-4"
d="M557.73,478.79q0-14,7.68-21.89t19.83-7.9a28.07,28.07,0,0,1,14.34,3.71,24.45,24.45,0,0,1,9.73,10.36,32.91,32.91,0,0,1,3.35,15.06,32.44,32.44,0,0,1-3.52,15.28,23.85,23.85,0,0,1-10,10.21,29.07,29.07,0,0,1-13.95,3.46,27.68,27.68,0,0,1-14.5-3.83A24.89,24.89,0,0,1,561,492.8,31.15,31.15,0,0,1,557.73,478.79Zm7.84.11q0,10.16,5.58,16a19.81,19.81,0,0,0,28.13-.06q5.55-5.9,5.55-16.73a28.22,28.22,0,0,0-2.37-12,17.83,17.83,0,0,0-6.94-7.92,19.09,19.09,0,0,0-10.24-2.82,19.69,19.69,0,0,0-13.89,5.42Q565.57,466.23,565.57,478.9Z"
></path></g>
</svg>

After

Width:  |  Height:  |  Size: 33 KiB

@@ -0,0 +1,294 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="546.5 262.94 1017.99 1044.37">
<defs><style>
.cls-1 {
fill: #383838;
}
.cls-2 {
fill: #9f9f9e;
}
.cls-3 {
fill: #cbcccb;
}
.cls-4 {
fill: #b7b7b7;
}
.cls-5 {
fill: #353535;
}
.cls-6 {
fill: #b1a368;
}
.cls-7 {
fill: #2c2d2d;
}
.cls-10, .cls-11, .cls-8, .cls-9 {
fill: none;
stroke: #050606;
}
.cls-10, .cls-11, .cls-8 {
stroke-miterlimit: 10;
}
.cls-8, .cls-9 {
stroke-width: 2px;
}
.cls-9 {
stroke-linecap: round;
stroke-linejoin: round;
}
.cls-10 {
stroke-width: 2.04px;
}
.cls-11 {
stroke-width: 1.99px;
}
.cls-12 {
fill: #c08c2d;
}
.cls-13 {
fill: #af7a2b;
}
</style></defs><g id="Layer_7" data-name="Layer 7"><rect
class="cls-1"
x="625.5"
y="879.33"
width="29.53"
height="404.5"
></rect><polyline
class="cls-2"
points="1542.78 1109.71 1563.49 1109.71 1563.49 1242.3 1542.78 1242.3"
></polyline><path
class="cls-2"
d="M1542.78,895.89h4.69a5.67,5.67,0,0,1,5.67,5.67v84.65a5.67,5.67,0,0,1-5.67,5.67h-4.69"
></path><rect
class="cls-3"
x="645.26"
y="865.2"
width="897.52"
height="441.11"
rx="11.7"
></rect><path
class="cls-2"
d="M678.73,865.2V978.68a3.67,3.67,0,0,0,3.67,3.67h41a2.35,2.35,0,0,1,2.35,2.35v321.61h789.46V865.2Zm811.52,416.11H750.79V974.41a17.06,17.06,0,0,0-17.06-17.06h-27.5a2.5,2.5,0,0,1-2.5-2.5V892.7a2.5,2.5,0,0,1,2.5-2.5h784Z"
></path><path
class="cls-3"
d="M1490.25,890.2v391.11H750.79V974.41a17,17,0,0,0-7.2-13.92V890.2Z"
></path><path
class="cls-4"
d="M743.59,890.2v70.29a17,17,0,0,0-9.86-3.14h-27.5a2.5,2.5,0,0,1-2.5-2.5V892.7a2.5,2.5,0,0,1,2.5-2.5Z"
></path><rect
class="cls-2"
x="669.71"
y="1013.84"
width="13.53"
height="148.4"
></rect><path
class="cls-5"
d="M572,871.09a24.48,24.48,0,0,0-24.48,24.48V960.5h23.89v28.71L592,967h44.49V871.09Zm20,70.58a13.44,13.44,0,1,1,13.43-13.43A13.43,13.43,0,0,1,592,941.67Z"
></path><path
class="cls-5"
d="M576.85,1186.92h59.64v102.83H572a24.48,24.48,0,0,1-24.48-24.48v-60.92h23.89v-25.68Z"
></path><rect
class="cls-6"
x="1266.59"
y="750.8"
width="103.92"
height="64.66"
rx="3.93"
></rect><path
class="cls-6"
d="M1283.29,856.16H1355a2.55,2.55,0,0,1,2.55,2.55v6.48a0,0,0,0,1,0,0h-76.8a0,0,0,0,1,0,0v-6.48A2.55,2.55,0,0,1,1283.29,856.16Z"
></path><path
class="cls-6"
d="M1271.86,815.46h92.43a0,0,0,0,1,0,0v28.12a2.55,2.55,0,0,1-2.55,2.55h-87.32a2.55,2.55,0,0,1-2.55-2.55V815.46A0,0,0,0,1,1271.86,815.46Z"
></path><rect
class="cls-6"
x="1285.94"
y="846.13"
width="65.99"
height="10.03"
></rect><polyline
class="cls-6"
points="1359.86 750.8 1359.86 746.51 1277.14 746.51 1277.14 750.8"
></polyline><path
class="cls-1"
d="M1318.55,263.94h0a44,44,0,0,1,44,44V746.51a0,0,0,0,1,0,0h-88a0,0,0,0,1,0,0V308a44,44,0,0,1,44-44Z"
></path><rect
class="cls-7"
x="1274.53"
y="328.62"
width="88.04"
height="5.99"
></rect><rect
class="cls-7"
x="1274.53"
y="355.81"
width="88.04"
height="5.99"
></rect><path
class="cls-8"
d="M1490.25,890.2v391.11H750.79V974.41a17.06,17.06,0,0,0-17.06-17.06h-27.5a2.5,2.5,0,0,1-2.5-2.5V892.7a2.5,2.5,0,0,1,2.5-2.5h784m25-25H678.73V978.68a3.68,3.68,0,0,0,3.67,3.67h41a2.35,2.35,0,0,1,2.35,2.35v321.61h789.46V865.2Z"
></path><line
class="cls-8"
x1="743.6"
y1="960.49"
x2="743.6"
y2="890.2"
></line><rect
class="cls-8"
x="669.71"
y="1013.84"
width="13.53"
height="148.4"
></rect><path
class="cls-9"
d="M636.49,871.09V967H592l-20.61,22.25V960.5H547.5V895.57A24.48,24.48,0,0,1,572,871.09Z"
></path><path
class="cls-9"
d="M576.85,1186.92h59.64v102.83H572a24.48,24.48,0,0,1-24.48-24.48v-60.92h23.89v-25.68Z"
></path><circle
class="cls-9"
cx="592"
cy="1258.1"
r="13.44"
></circle><circle
class="cls-9"
cx="592"
cy="928.24"
r="13.44"
></circle><line
class="cls-9"
x1="571.39"
y1="960.5"
x2="636.49"
y2="960.5"
></line><line
class="cls-9"
x1="571.39"
y1="1204.35"
x2="636.49"
y2="1204.35"
></line><polyline
class="cls-8"
points="1542.78 1109.71 1563.49 1109.71 1563.49 1242.3 1542.78 1242.3"
></polyline><path
class="cls-8"
d="M1542.78,895.89h4.69a5.67,5.67,0,0,1,5.67,5.67v84.65a5.67,5.67,0,0,1-5.67,5.67h-4.69"
></path><path
class="cls-8"
d="M1318.55,263.94h0a44,44,0,0,1,44,44V746.51a0,0,0,0,1,0,0h-88a0,0,0,0,1,0,0V308a44,44,0,0,1,44-44Z"
></path><rect
class="cls-10"
x="1266.59"
y="750.8"
width="103.92"
height="64.66"
rx="3.93"
></rect><path
class="cls-10"
d="M1283.29,856.16H1355a2.55,2.55,0,0,1,2.55,2.55v6.48a0,0,0,0,1,0,0h-76.8a0,0,0,0,1,0,0v-6.48A2.55,2.55,0,0,1,1283.29,856.16Z"
></path><path
class="cls-10"
d="M1271.86,815.46h92.43a0,0,0,0,1,0,0v28.12a2.55,2.55,0,0,1-2.55,2.55h-87.32a2.55,2.55,0,0,1-2.55-2.55V815.46A0,0,0,0,1,1271.86,815.46Z"
></path><rect
class="cls-11"
x="1285.94"
y="846.13"
width="65.99"
height="10.03"
></rect><polyline
class="cls-10"
points="1359.86 750.8 1359.86 746.51 1277.14 746.51 1277.14 750.8"
></polyline><rect
class="cls-10"
x="1274.53"
y="328.62"
width="88.04"
height="5.99"
></rect><rect
class="cls-10"
x="1274.53"
y="355.81"
width="88.04"
height="5.99"
></rect><path
class="cls-2"
d="M722.88,912.78a14,14,0,1,0,14,14A13.95,13.95,0,0,0,722.88,912.78Zm0,21.5a7.55,7.55,0,1,1,7.54-7.55A7.55,7.55,0,0,1,722.88,934.28Z"
></path><circle
class="cls-8"
cx="722.88"
cy="926.73"
r="7.55"
></circle><circle
class="cls-8"
cx="722.88"
cy="926.73"
r="13.95"
></circle><polyline
class="cls-12"
points="645.26 1186.92 636.49 1186.92 576.85 1186.92 571.39 1178.67 562.49 1178.67 562.49 989.21 571.39 989.21 592 966.96 636.49 966.96 645.26 966.96"
></polyline><line
class="cls-8"
x1="636.49"
y1="1283.83"
x2="645.26"
y2="1283.83"
></line><line
class="cls-8"
x1="636.49"
y1="879.33"
x2="645.26"
y2="879.33"
></line><rect
class="cls-13"
x="562.49"
y="1120.88"
width="82.77"
height="10.25"
></rect><rect
class="cls-13"
x="562.49"
y="1095.19"
width="82.77"
height="1.15"
></rect><rect
class="cls-13"
x="562.49"
y="1038.19"
width="82.77"
height="4.3"
></rect><rect
class="cls-13"
x="562.49"
y="1013.84"
width="82.51"
height="2.29"
></rect><rect
class="cls-13"
x="562.49"
y="999.23"
width="82.77"
height="4.58"
></rect><rect
class="cls-13"
x="562.49"
y="1065.4"
width="82.77"
height="6.02"
></rect><rect
class="cls-13"
x="563.65"
y="1155.63"
width="81.61"
height="6.61"
></rect><polyline
class="cls-9"
points="645.26 1186.92 636.49 1186.92 576.85 1186.92 571.39 1178.67 562.49 1178.67 562.49 989.21 571.39 989.21 592 966.96 636.49 966.96 645.26 966.96"
></polyline><rect
class="cls-8"
x="645.26"
y="865.2"
width="897.52"
height="441.11"
rx="11.7"
></rect></g>
</svg>

After

Width:  |  Height:  |  Size: 7.7 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 38 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 33 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 33 KiB

+441
View File
@@ -0,0 +1,441 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="667.51 476.78 664.98 1035.52">
<defs><style>
.cls-1 {
fill: #333;
}
.cls-11, .cls-15, .cls-16, .cls-17, .cls-2, .cls-4 {
fill: #cbcccb;
}
.cls-2 {
opacity: 0.49;
}
.cls-3 {
fill: #dfac52;
}
.cls-4 {
opacity: 0.33;
}
.cls-5, .cls-9 {
fill: #373838;
}
.cls-10, .cls-13, .cls-6, .cls-7, .cls-8 {
fill: none;
stroke-miterlimit: 10;
}
.cls-10, .cls-6, .cls-7 {
stroke: #050606;
}
.cls-6 {
stroke-width: 2.34px;
}
.cls-7, .cls-8 {
stroke-width: 2.41px;
}
.cls-8 {
stroke: #fff;
}
.cls-9 {
opacity: 0.43;
}
.cls-10 {
stroke-width: 2.1px;
}
.cls-12 {
fill: #fff;
}
.cls-13 {
stroke: #dfac52;
stroke-width: 1.26px;
}
.cls-14 {
fill: #b7802b;
}
.cls-15 {
opacity: 0.5;
}
.cls-16 {
opacity: 0.44;
}
.cls-17 {
opacity: 0.19;
}
</style></defs><g id="Layer_7" data-name="Layer 7"><path
class="cls-1"
d="M1273.43,478H726.56a57.85,57.85,0,0,0-57.84,57.86v917.4a57.85,57.85,0,0,0,57.84,57.85h546.87a57.86,57.86,0,0,0,57.86-57.85V535.85A57.87,57.87,0,0,0,1273.43,478Zm-180.85,58.15a17.73,17.73,0,0,1-12.6,5.22H921.92a17.83,17.83,0,0,1,0-35.65H1080a17.83,17.83,0,0,1,12.6,30.43Z"
></path><path
class="cls-2"
d="M1275.46,490.32H724.6A43.64,43.64,0,0,0,681,534v921.2a43.65,43.65,0,0,0,43.64,43.63h550.86a43.63,43.63,0,0,0,43.63-43.63V534A43.63,43.63,0,0,0,1275.46,490.32Zm-182.88,45.82a17.73,17.73,0,0,1-12.6,5.22H921.92a17.83,17.83,0,0,1,0-35.65H1080a17.83,17.83,0,0,1,12.6,30.43Z"
></path><rect
class="cls-3"
x="1226.45"
y="1082.09"
width="61.6"
height="368.92"
rx="12.69"
></rect><rect
class="cls-4"
x="699.17"
y="1071.28"
width="599.02"
height="391.54"
rx="14.88"
></rect><rect
class="cls-2"
x="716.37"
y="1082.09"
width="497.34"
height="368.92"
rx="20.68"
></rect><path
class="cls-3"
d="M1112.31,1112.18A119.83,119.83,0,1,1,992.49,992.34,119.83,119.83,0,0,1,1112.31,1112.18Z"
></path><circle
class="cls-2"
cx="992.48"
cy="1112.18"
r="150.8"
></circle><path
class="cls-5"
d="M992.48,1000.79a111.39,111.39,0,1,0,111.38,111.39A111.39,111.39,0,0,0,992.48,1000.79Zm0,199.64a88.26,88.26,0,1,1,88.25-88.25A88.26,88.26,0,0,1,992.48,1200.43Z"
></path><path
class="cls-3"
d="M1080.73,1112.18a88.25,88.25,0,1,1-88.25-88.26A88.26,88.26,0,0,1,1080.73,1112.18Z"
></path><rect
class="cls-6"
x="680.97"
y="490.32"
width="638.12"
height="1008.46"
rx="43.63"
></rect><rect
class="cls-7"
x="668.71"
y="477.99"
width="662.57"
height="1033.11"
rx="57.85"
></rect><circle
class="cls-8"
cx="992.48"
cy="1112.18"
r="150.8"
></circle><circle
class="cls-9"
cx="1000"
cy="702.01"
r="103.21"
></circle><circle
class="cls-8"
cx="1000"
cy="702.01"
r="117.37"
></circle><path
class="cls-7"
d="M992.48,1000.79a111.39,111.39,0,1,0,111.38,111.39A111.39,111.39,0,0,0,992.48,1000.79Zm0,199.64a88.26,88.26,0,1,1,88.25-88.25A88.26,88.26,0,0,1,992.48,1200.43Z"
></path><rect
class="cls-10"
x="904.09"
y="505.72"
width="193.71"
height="35.64"
rx="17.82"
></rect><path
class="cls-7"
d="M1080.73,1112.18a88.25,88.25,0,1,1-88.25-88.26A88.26,88.26,0,0,1,1080.73,1112.18Z"
></path><circle
class="cls-11"
cx="1000"
cy="928.96"
r="63.38"
></circle><circle
class="cls-12"
cx="1000"
cy="928.96"
r="35.27"
></circle><circle
class="cls-3"
cx="1000"
cy="702.01"
r="25.23"
></circle><rect
class="cls-13"
x="965.08"
y="672.02"
width="68.35"
height="59.63"
rx="4.15"
></rect><circle
class="cls-11"
cx="973.01"
cy="680.85"
r="5.69"
></circle><circle
class="cls-11"
cx="973.01"
cy="723.01"
r="5.69"
></circle><circle
class="cls-11"
cx="1026.01"
cy="680.85"
r="5.69"
></circle><circle
class="cls-11"
cx="1026.01"
cy="723.01"
r="5.69"
></circle><rect
class="cls-14"
x="996.04"
y="690.54"
width="6.43"
height="22.58"
transform="translate(1701.09 -297.42) rotate(90)"
></rect><rect
class="cls-14"
x="996.04"
y="690.54"
width="6.43"
height="22.58"
></rect><circle
class="cls-3"
cx="833.1"
cy="678.6"
r="6.37"
></circle><circle
class="cls-3"
cx="833.1"
cy="747.04"
r="6.37"
></circle><circle
class="cls-3"
cx="833.1"
cy="709.01"
r="6.37"
></circle><circle
class="cls-3"
cx="1194.88"
cy="684.17"
r="6.37"
></circle><circle
class="cls-3"
cx="1248.54"
cy="781.82"
r="6.37"
></circle><circle
class="cls-3"
cx="1248.54"
cy="813.01"
r="6.37"
></circle><circle
class="cls-3"
cx="1207.62"
cy="831.46"
r="6.37"
></circle><circle
class="cls-3"
cx="1248.54"
cy="844.2"
r="6.37"
></circle><circle
class="cls-3"
cx="1248.54"
cy="875.38"
r="6.37"
></circle><circle
class="cls-3"
cx="1248.54"
cy="906.57"
r="6.37"
></circle><circle
class="cls-3"
cx="1063.37"
cy="869.03"
r="6.37"
></circle><circle
class="cls-3"
cx="820.36"
cy="856"
r="6.37"
></circle><circle
class="cls-3"
cx="910.6"
cy="915.24"
r="6.37"
></circle><circle
class="cls-3"
cx="839.47"
cy="880.73"
r="6.37"
></circle><circle
class="cls-3"
cx="870.09"
cy="928.96"
r="6.37"
></circle><circle
class="cls-3"
cx="870.09"
cy="764.54"
r="6.37"
></circle><circle
class="cls-3"
cx="894.78"
cy="791"
r="6.37"
></circle><circle
class="cls-3"
cx="826.73"
cy="915.24"
r="6.37"
></circle><circle
class="cls-3"
cx="820.36"
cy="883.42"
r="6.37"
></circle><circle
class="cls-3"
cx="872.65"
cy="684.17"
r="6.37"
></circle><circle
class="cls-3"
cx="855.71"
cy="775.45"
r="6.37"
></circle><circle
class="cls-3"
cx="1136.91"
cy="784.63"
r="6.37"
></circle><circle
class="cls-3"
cx="1182.14"
cy="902.5"
r="6.37"
></circle><circle
class="cls-3"
cx="1205.52"
cy="877.05"
r="6.37"
></circle><circle
class="cls-3"
cx="1194.88"
cy="762.71"
r="6.37"
></circle><circle
class="cls-3"
cx="1211.89"
cy="784.63"
r="6.37"
></circle><rect
class="cls-11"
x="888.41"
y="819.38"
width="9.14"
height="9.14"
></rect><rect
class="cls-11"
x="1130.54"
y="917.04"
width="9.14"
height="9.14"
></rect><rect
class="cls-11"
x="896.58"
y="874.81"
width="9.14"
height="9.14"
></rect><rect
class="cls-11"
x="1112.8"
y="839.63"
width="9.14"
height="9.14"
></rect><rect
class="cls-11"
x="1166.63"
y="814.81"
width="9.14"
height="9.14"
></rect><circle
class="cls-5"
cx="788.67"
cy="598.8"
r="12.53"
></circle><circle
class="cls-5"
cx="1188.51"
cy="558.44"
r="12.53"
></circle><circle
class="cls-5"
cx="1201.25"
cy="994.55"
r="12.53"
></circle><circle
class="cls-5"
cx="763.86"
cy="961.38"
r="12.53"
></circle><polygon
class="cls-15"
points="747.85 637.69 747.85 921.61 705.73 921.61 705.73 637.69 723.33 637.69 723.33 896.12 731.42 896.12 731.42 637.69 747.85 637.69"
></polygon><rect
class="cls-5"
x="716.37"
y="1462.82"
width="183.41"
height="10.76"
></rect><rect
class="cls-5"
x="1080.73"
y="1462.82"
width="62.55"
height="10.76"
></rect><rect
class="cls-16"
x="784.29"
y="632.6"
width="4.38"
height="391.32"
></rect><rect
class="cls-16"
x="1219.52"
y="632.6"
width="4.38"
height="391.32"
></rect><rect
class="cls-3"
x="752.71"
y="871.99"
width="11.15"
height="41.04"
></rect><rect
class="cls-3"
x="802.25"
y="935.33"
width="7.3"
height="18.13"
></rect><rect
class="cls-3"
x="799.82"
y="1010.51"
width="4.76"
height="4.76"
></rect><rect
class="cls-3"
x="831.13"
y="994.55"
width="6.25"
height="6.25"
></rect><rect
class="cls-11"
x="813.99"
y="1099.67"
width="6.37"
height="323.31"
></rect><path
class="cls-17"
d="M1275.46,490.32H724.6A43.64,43.64,0,0,0,681,534v921.2a43.65,43.65,0,0,0,43.64,43.63h550.86a43.63,43.63,0,0,0,43.63-43.63V534A43.63,43.63,0,0,0,1275.46,490.32Zm-182.88,45.82a17.73,17.73,0,0,1-12.6,5.22H921.92a17.83,17.83,0,0,1,0-35.65H1080a17.83,17.83,0,0,1,12.6,30.43Z"
></path></g>
</svg>

After

Width:  |  Height:  |  Size: 9.5 KiB

+242
View File
@@ -0,0 +1,242 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
class="svg-icon"
style="overflow: hidden; fill: currentColor"
viewBox="0 0 909.87988 546.85529"
version="1.1"
id="svg3"
xml:space="preserve"
width="909.87988"
height="546.85529"
sodipodi:docname="unknown.svg"
inkscape:version="1.4 (e7c3feb1, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
>
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="0.57169944"
inkscape:cx="291.23695"
inkscape:cy="107.57401"
inkscape:window-width="1472"
inkscape:window-height="890"
inkscape:window-x="0"
inkscape:window-y="38"
inkscape:window-maximized="1"
inkscape:current-layer="Layer_7"
/><defs
id="defs3"
><style
id="style1"
>
.cls-1 {
fill: #383838;
}
.cls-2 {
fill: #9f9f9e;
}
.cls-3 {
fill: #cbcccb;
}
.cls-4 {
fill: #b7b7b7;
}
.cls-5 {
fill: #353535;
}
.cls-6 {
fill: #b1a368;
}
.cls-7 {
fill: #2c2d2d;
}
.cls-10, .cls-11, .cls-8, .cls-9 {
fill: none;
stroke: #050606;
}
.cls-10, .cls-11, .cls-8 {
stroke-miterlimit: 10;
}
.cls-8, .cls-9 {
stroke-width: 2px;
}
.cls-9 {
stroke-linecap: round;
stroke-linejoin: round;
}
.cls-10 {
stroke-width: 2.04px;
}
.cls-11 {
stroke-width: 1.99px;
}
.cls-12 {
fill: #c08c2d;
}
.cls-13 {
fill: #af7a2b;
}
</style></defs><g
id="Layer_7"
data-name="Layer 7"
transform="translate(-646.6554,-758.05941)"
><path
class="cls-2"
d="m 1545.1753,893.49468 h 4.69 a 5.67,5.67 0 0 1 5.67,5.67 v 84.64998 a 5.67,5.67 0 0 1 -5.67,5.67 h -4.69"
id="path1-4"
/><rect
class="cls-3"
x="647.6554"
y="862.80469"
width="897.52002"
height="441.10999"
rx="11.7"
id="rect2"
/><path
class="cls-2"
d="m 681.12532,862.80468 v 113.47998 a 3.67,3.67 0 0 0 3.67,3.67 h 41 a 2.35,2.35 0 0 1 2.35,2.35 V 1303.9147 H 1517.6053 V 862.80468 Z M 1492.6453,1278.9147 H 753.18532 V 972.01466 a 17.06,17.06 0 0 0 -17.06,-17.06 h -27.5 a 2.5,2.5 0 0 1 -2.5,-2.5 v -62.14998 a 2.5,2.5 0 0 1 2.5,-2.5 h 783.99998 z"
id="path2-7"
/><path
class="cls-3"
d="M 1492.6453,887.80468 V 1278.9147 H 753.18532 V 972.01466 a 17,17 0 0 0 -7.2,-13.92 v -70.28998 z"
id="path3-7"
style="fill: #ffffff"
/><path
class="cls-4"
d="m 745.98532,887.80468 v 70.28998 a 17,17 0 0 0 -9.86,-3.14 h -27.5 a 2.5,2.5 0 0 1 -2.5,-2.5 v -62.14998 a 2.5,2.5 0 0 1 2.5,-2.5 z"
id="path4"
/><rect
class="cls-2"
x="672.10535"
y="1011.4448"
width="13.53"
height="148.39999"
id="rect4"
/><path
class="cls-6"
d="m 1077.2923,853.76468 h 71.71 a 2.55,2.55 0 0 1 2.55,2.55 v 6.48 h -76.8 v -6.48 a 2.55,2.55 0 0 1 2.54,-2.55 z"
id="path7"
/><path
class="cls-8"
d="m 1082.9205,761.22647 h 60.8838 a 6.1958134,4.8451518 0 0 1 6.1958,4.84516 v 77.32638 h -73.2754 v -77.32638 a 6.1958134,4.8451518 0 0 1 6.1958,-4.84516 z"
id="path39"
style="fill: #b1a368"
/><rect
class="cls-8"
x="1066.9833"
y="778.19855"
width="91.504646"
height="55.957298"
rx="5.5511622"
id="rect39"
style="fill: #b1a368"
/><path
class="cls-2"
d="m 1158.4522,782.53954 v 47.24724 a 5.5153484,4.3130254 0 0 1 -5.5512,4.34102 h -80.3665 a 5.5511623,4.341032 0 0 1 -5.587,-4.34102 v -47.24724 a 5.5511623,4.341032 0 0 1 5.587,-4.34103 h 80.5098 a 5.5153484,4.3130254 0 0 1 5.4079,4.34103 z"
id="path41-4"
style="fill: none; stroke: #050606; stroke-width: 3.16706; stroke-miterlimit: 10"
/><rect
class="cls-6"
x="1079.9424"
y="843.73468"
width="65.989998"
height="10.03"
id="rect8"
/><path
class="cls-8"
d="M 1492.6453,887.80468 V 1278.9147 H 753.18532 V 972.01466 a 17.06,17.06 0 0 0 -17.06,-17.06 h -27.5 a 2.5,2.5 0 0 1 -2.5,-2.5 v -62.14998 a 2.5,2.5 0 0 1 2.5,-2.5 h 783.99998 m 25,-25 H 681.12532 v 113.47998 a 3.68,3.68 0 0 0 3.67,3.67 h 41 a 2.35,2.35 0 0 1 2.35,2.35 V 1303.9147 H 1517.6053 V 862.80468 Z"
id="path10"
/><line
class="cls-8"
x1="745.99536"
y1="958.09467"
x2="745.99536"
y2="887.80469"
id="line10"
/><rect
class="cls-8"
x="672.10535"
y="1011.4448"
width="13.53"
height="148.39999"
id="rect11"
/><path
class="cls-8"
d="m 1545.1753,893.49468 h 4.69 a 5.67,5.67 0 0 1 5.67,5.67 v 84.64998 a 5.67,5.67 0 0 1 -5.67,5.67 h -4.69"
id="path14"
/><path
class="cls-10"
d="m 1077.2923,853.76468 h 71.71 a 2.55,2.55 0 0 1 2.55,2.55 v 6.48 h -76.8 v -6.48 a 2.55,2.55 0 0 1 2.54,-2.55 z"
id="path16"
/><rect
class="cls-11"
x="1079.9424"
y="843.73468"
width="65.989998"
height="10.03"
id="rect17"
/><path
class="cls-2"
d="m 725.27532,910.38466 a 14,14 0 1 0 14,14 13.95,13.95 0 0 0 -14,-14 z m 0,21.5 a 7.55,7.55 0 1 1 7.54,-7.55 7.55,7.55 0 0 1 -7.54,7.55 z"
id="path19"
/><circle
class="cls-8"
cx="725.27539"
cy="924.33466"
r="7.5500002"
id="circle19"
/><circle
class="cls-8"
cx="725.27539"
cy="924.33466"
r="13.95"
id="circle20"
/><path
d="m 445.36309,440.05365 c 0,11.52004 10.38375,20.85861 23.19309,20.85861 12.80937,0 23.19311,-9.33857 23.19311,-20.85861 0,-11.52005 -10.38374,-20.85861 -23.19311,-20.85861 -12.80934,0 -23.19309,9.33856 -23.19309,20.85861 z"
fill="#ccc"
id="path1"
style="overflow: hidden; fill: #4d4d4d; stroke-width: 0.458227"
transform="translate(646.6554,758.05941)"
/><path
d="m 469.40305,538.40107 c -119.83415,0 -217.31582,-93.40624 -217.31582,-208.23067 0,-114.82425 97.48167,-208.23058 217.31582,-208.23058 119.83417,0 217.31585,93.40633 217.31585,208.23058 0,114.82443 -97.48168,208.23067 -217.31585,208.23067 z m 0,-386.58065 c -102.63515,0 -186.13149,80.00572 -186.13149,178.34998 0,98.32948 83.49634,178.34997 186.13149,178.34997 102.61966,0 186.13151,-80.01997 186.13151,-178.34997 0,-98.34426 -83.51185,-178.34998 -186.13151,-178.34998 z"
fill="#ccc"
id="path2"
style="overflow: hidden; fill: #4d4d4d; stroke-width: 0.474832"
transform="translate(646.6554,758.05941)"
/><path
d="m 468.55618,391.96713 c -8.53552,0 -15.46205,-6.22977 -15.46205,-13.90533 v -23.51468 c 0,-22.75028 19.32709,-40.13201 36.39722,-55.47009 12.50833,-11.26363 25.45056,-22.88885 25.45056,-32.16398 0,-23.18095 -20.81195,-42.03718 -46.38573,-42.03718 -26.0067,0 -46.38619,18.0497 -46.38619,41.09158 0,7.67594 -6.92654,13.90533 -15.46208,13.90533 -8.53554,0 -15.46207,-6.22977 -15.46207,-13.9058 0,-37.99002 34.68046,-68.90262 77.31034,-68.90262 42.62989,0 77.31034,31.32967 77.31034,69.84869 0,20.81694 -17.54944,36.5856 -34.51132,51.84064 -13.452,12.07016 -27.33645,24.55758 -27.33645,35.77907 v 23.51468 c 0,7.6764 -6.92702,13.91969 -15.46257,13.91969 z"
fill="#ccc"
id="path3"
style="overflow: hidden; fill: #4d4d4d; stroke-width: 0.458227; stroke: #000000; stroke-opacity: 1"
transform="translate(646.6554,758.05941)"
/><rect
class="cls-8"
x="647.6554"
y="862.80469"
width="897.52002"
height="441.10999"
rx="11.7"
id="rect28"
/></g><path
style="fill: #ffffff; fill-opacity: 0; stroke-width: 0.92"
d="m 107.41785,363.03448 -0.23786,-156.30546 -2.99,-3.72057 -2.99,-3.72058 v -34.09394 -34.09394 l 150.64998,0.048 150.64999,0.048 -8.28,3.06943 c -19.31509,7.16019 -34.46167,14.82453 -50.21721,25.41044 -50.57644,33.98158 -84.35747,88.86991 -91.06203,147.96009 -1.43336,12.63279 -0.63536,44.7022 1.3876,55.76392 7.76201,42.44321 25.98398,77.92651 55.67763,108.41989 17.37837,17.84644 33.98994,30.29944 55.42867,41.55255 l 11.30534,5.93414 -134.54212,0.0167 -134.54213,0.0167 z"
id="path11"
/><path
style="fill: #ffffff; fill-opacity: 0; stroke-width: 0.92"
d="m 107.41785,363.03448 -0.23786,-156.30546 -2.99,-3.72057 -2.99,-3.72058 v -34.09394 -34.09394 l 150.64998,0.048 150.64999,0.048 -8.28,3.06943 c -19.31509,7.16019 -34.46167,14.82453 -50.21721,25.41044 -50.57644,33.98158 -84.35747,88.86991 -91.06203,147.96009 -1.43336,12.63279 -0.63536,44.7022 1.3876,55.76392 7.76201,42.44321 25.98398,77.92651 55.67763,108.41989 17.37837,17.84644 33.98994,30.29944 55.42867,41.55255 l 11.30534,5.93414 -134.54212,0.0167 -134.54213,0.0167 z"
id="path12"
/><path
style="fill: #ffffff; fill-opacity: 0; stroke-width: 0.92"
d="m 107.41785,363.03448 -0.23786,-156.30546 -2.99,-3.72057 -2.99,-3.72058 v -34.09394 -34.09394 l 150.64998,0.048 150.64999,0.048 -8.28,3.06943 c -19.31509,7.16019 -34.46167,14.82453 -50.21721,25.41044 -50.57644,33.98158 -84.35747,88.86991 -91.06203,147.96009 -1.43336,12.63279 -0.63536,44.7022 1.3876,55.76392 7.76201,42.44321 25.98398,77.92651 55.67763,108.41989 17.37837,17.84644 33.98994,30.29944 55.42867,41.55255 l 11.30534,5.93414 -134.54212,0.0167 -134.54213,0.0167 z"
id="path13"
/>
</svg>

After

Width:  |  Height:  |  Size: 9.4 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 110 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 148 KiB

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.
Binary file not shown.
@@ -0,0 +1,71 @@
{
"page": {
"sectionLabel": "Channels",
"channelName": "Channel: {{channelName}}",
"broadcastLabel": "Primary",
"channelIndex": "Ch {{index}}",
"import": "Import",
"export": "Export"
},
"validation": {
"pskInvalid": "Please enter a valid {{bits}} bit PSK."
},
"settings": {
"label": "Channel Settings",
"description": "Crypto, MQTT & misc settings"
},
"role": {
"label": "Role",
"description": "Device telemetry is sent over PRIMARY. Only one PRIMARY allowed",
"options": {
"primary": "PRIMARY",
"disabled": "DISABLED",
"secondary": "SECONDARY"
}
},
"psk": {
"label": "Pre-Shared Key",
"description": "Supported PSK lengths: 256-bit, 128-bit, 8-bit, Empty (0-bit)",
"generate": "Generate"
},
"name": {
"label": "Name",
"description": "A unique name for the channel <12 bytes, leave blank for default"
},
"uplinkEnabled": {
"label": "Uplink Enabled",
"description": "Send messages from the local mesh to MQTT"
},
"downlinkEnabled": {
"label": "Downlink Enabled",
"description": "Send messages from MQTT to the local mesh"
},
"positionPrecision": {
"label": "Location",
"description": "The precision of the location to share with the channel. Can be disabled.",
"options": {
"none": "Do not share location",
"precise": "Precise Location",
"metric_km23": "Within 23 kilometers",
"metric_km12": "Within 12 kilometers",
"metric_km5_8": "Within 5.8 kilometers",
"metric_km2_9": "Within 2.9 kilometers",
"metric_km1_5": "Within 1.5 kilometers",
"metric_m700": "Within 700 meters",
"metric_m350": "Within 350 meters",
"metric_m200": "Within 200 meters",
"metric_m90": "Within 90 meters",
"metric_m50": "Within 50 meters",
"imperial_mi15": "Within 15 miles",
"imperial_mi7_3": "Within 7.3 miles",
"imperial_mi3_6": "Within 3.6 miles",
"imperial_mi1_8": "Within 1.8 miles",
"imperial_mi0_9": "Within 0.9 miles",
"imperial_mi0_5": "Within 0.5 miles",
"imperial_mi0_2": "Within 0.2 miles",
"imperial_ft600": "Within 600 feet",
"imperial_ft300": "Within 300 feet",
"imperial_ft150": "Within 150 feet"
}
}
}
@@ -0,0 +1,51 @@
{
"emptyState": "No results found.",
"page": {
"title": "Command Menu"
},
"pinGroup": {
"label": "Pin command group"
},
"unpinGroup": {
"label": "Unpin command group"
},
"goto": {
"label": "Goto",
"command": {
"messages": "Messages",
"map": "Map",
"config": "Config",
"nodes": "Nodes"
}
},
"manage": {
"label": "Manage",
"command": {
"switchNode": "Switch Node",
"connectNewNode": "Connect New Node"
}
},
"contextual": {
"label": "Contextual",
"command": {
"qrCode": "QR Code",
"qrGenerator": "Generator",
"qrImport": "Import",
"scheduleShutdown": "Schedule Shutdown",
"scheduleReboot": "Reboot Device",
"resetNodeDb": "Reset Node DB",
"dfuMode": "Enter DFU Mode",
"factoryResetDevice": "Factory Reset Device",
"factoryResetConfig": "Factory Reset Config",
"disconnect": "Disconnect"
}
},
"debug": {
"label": "Debug",
"command": {
"reconfigure": "Reconfigure",
"clearAllStoredMessages": "Clear All Stored Message",
"clearAllStores": "Clear All Local Storage"
}
}
}
@@ -0,0 +1,165 @@
{
"button": {
"apply": "Apply",
"addConnection": "Add Connection",
"saveConnection": "Save connection",
"backupKey": "Backup Key",
"cancel": "Cancel",
"connect": "Connect",
"clearMessages": "Clear Messages",
"close": "Close",
"confirm": "Confirm",
"delete": "Delete",
"dismiss": "Dismiss",
"download": "Download",
"disconnect": "Disconnect",
"export": "Export",
"generate": "Generate",
"regenerate": "Regenerate",
"import": "Import",
"message": "Message",
"now": "Now",
"ok": "OK",
"print": "Print",
"remove": "Remove",
"requestNewKeys": "Request New Keys",
"requestPosition": "Request Position",
"reset": "Reset",
"retry": "Retry",
"save": "Save",
"setDefault": "Set as default",
"unsetDefault": "Unset default",
"scanQr": "Scan QR Code",
"traceRoute": "Trace Route",
"submit": "Submit"
},
"app": {
"title": "Meshtastic",
"fullTitle": "Meshtastic Web Client"
},
"loading": "Loading...",
"unit": {
"cps": "CPS",
"dbm": "dBm",
"hertz": "Hz",
"hop": {
"one": "Hop",
"plural": "Hops"
},
"hopsAway": {
"one": "{{count}} hop away",
"plural": "{{count}} hops away",
"unknown": "Unknown hops away"
},
"megahertz": "MHz",
"kilohertz": "kHz",
"raw": "raw",
"meter": {
"one": "Meter",
"plural": "Meters",
"suffix": "m"
},
"kilometer": {
"one": "Kilometer",
"plural": "Kilometers",
"suffix": "km"
},
"minute": {
"one": "Minute",
"plural": "Minutes"
},
"hour": {
"one": "Hour",
"plural": "Hours"
},
"millisecond": {
"one": "Millisecond",
"plural": "Milliseconds",
"suffix": "ms"
},
"second": {
"one": "Second",
"plural": "Seconds"
},
"day": {
"one": "Day",
"plural": "Days",
"today": "Today",
"yesterday": "Yesterday"
},
"month": {
"one": "Month",
"plural": "Months"
},
"year": {
"one": "Year",
"plural": "Years"
},
"snr": "SNR",
"volt": {
"one": "Volt",
"plural": "Volts",
"suffix": "V"
},
"record": {
"one": "Records",
"plural": "Records"
},
"degree": {
"one": "Degree",
"plural": "Degrees",
"suffix": "°"
}
},
"security": {
"0bit": "Empty",
"8bit": "8 bit",
"128bit": "128 bit",
"256bit": "256 bit"
},
"unknown": {
"longName": "Unknown",
"shortName": "UNK",
"notAvailable": "N/A",
"num": "??"
},
"nodeUnknownPrefix": "!",
"unset": "UNSET",
"fallbackName": "Meshtastic {{last4}}",
"node": "Node",
"formValidation": {
"unsavedChanges": "Unsaved changes",
"tooBig": {
"string": "Too long, expected less than or equal to {{maximum}} characters.",
"number": "Too big, expected a number smaller than or equal to {{maximum}}.",
"bytes": "Too big, expected less than or equal to {{params.maximum}} bytes."
},
"tooSmall": {
"string": "Too short, expected more than or equal to {{minimum}} characters.",
"number": "Too small, expected a number larger than or equal to {{minimum}}."
},
"invalidFormat": {
"ipv4": "Invalid format, expected an IPv4 address.",
"key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)."
},
"invalidType": {
"number": "Invalid type, expected a number."
},
"pskLength": {
"0bit": "Key is required to be empty.",
"8bit": "Key is required to be an 8 bit pre-shared key (PSK).",
"128bit": "Key is required to be a 128 bit pre-shared key (PSK).",
"256bit": "Key is required to be a 256 bit pre-shared key (PSK)."
},
"required": {
"generic": "This field is required.",
"managed": "At least one admin key is requred if the node is managed.",
"key": "Key is required."
},
"invalidOverrideFreq": {
"number": "Invalid format, expected a value in the range 410-930 MHz or 0 (use default)."
}
},
"yes": "Yes",
"no": "No"
}
@@ -0,0 +1,458 @@
{
"page": {
"title": "Settings",
"tabUser": "Карыстальнік",
"tabChannels": "Каналы",
"tabBluetooth": "Bluetooth",
"tabDevice": "Прылада",
"tabDisplay": "Экран",
"tabLora": "LoRa",
"tabNetwork": "Сетка",
"tabPosition": "Месцазнаходжанне",
"tabPower": "Power",
"tabSecurity": "Бяспека"
},
"sidebar": {
"label": "Configuration"
},
"device": {
"title": "Device Settings",
"description": "Settings for the device",
"buttonPin": {
"description": "Button pin override",
"label": "Button Pin"
},
"buzzerPin": {
"description": "Buzzer pin override",
"label": "Buzzer Pin"
},
"disableTripleClick": {
"description": "Disable triple click",
"label": "Disable Triple Click"
},
"doubleTapAsButtonPress": {
"description": "Treat double tap as button press",
"label": "Double Tap as Button Press"
},
"ledHeartbeatDisabled": {
"description": "Disable default blinking LED",
"label": "LED Heartbeat Disabled"
},
"nodeInfoBroadcastInterval": {
"description": "How often to broadcast node info",
"label": "Node Info Broadcast Interval"
},
"posixTimezone": {
"description": "The POSIX timezone string for the device",
"label": "POSIX Timezone"
},
"rebroadcastMode": {
"description": "How to handle rebroadcasting",
"label": "Rebroadcast Mode"
},
"role": {
"description": "What role the device performs on the mesh",
"label": "Role"
}
},
"bluetooth": {
"title": "Bluetooth Settings",
"description": "Settings for the Bluetooth module",
"note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.",
"enabled": {
"description": "Enable or disable Bluetooth",
"label": "Уключана"
},
"pairingMode": {
"description": "Pin selection behaviour.",
"label": "Pairing mode"
},
"pin": {
"description": "Pin to use when pairing",
"label": "Pin"
}
},
"display": {
"description": "Settings for the device display",
"title": "Display Settings",
"headingBold": {
"description": "Bolden the heading text",
"label": "Bold Heading"
},
"carouselDelay": {
"description": "How fast to cycle through windows",
"label": "Carousel Delay"
},
"compassNorthTop": {
"description": "Fix north to the top of compass",
"label": "Compass North Top"
},
"displayMode": {
"description": "Screen layout variant",
"label": "Display Mode"
},
"displayUnits": {
"description": "Display metric or imperial units",
"label": "Display Units"
},
"flipScreen": {
"description": "Flip display 180 degrees",
"label": "Flip Screen"
},
"gpsDisplayUnits": {
"description": "Coordinate display format",
"label": "GPS Display Units"
},
"oledType": {
"description": "Type of OLED screen attached to the device",
"label": "OLED Type"
},
"screenTimeout": {
"description": "Turn off the display after this long",
"label": "Screen Timeout"
},
"twelveHourClock": {
"description": "Use 12-hour clock format",
"label": "12-Hour Clock"
},
"wakeOnTapOrMotion": {
"description": "Wake the device on tap or motion",
"label": "Wake on Tap or Motion"
}
},
"lora": {
"title": "Mesh Settings",
"description": "Settings for the LoRa mesh",
"bandwidth": {
"description": "Channel bandwidth in kHz",
"label": "Bandwidth"
},
"boostedRxGain": {
"description": "Boosted RX gain",
"label": "Boosted RX Gain"
},
"codingRate": {
"description": "The denominator of the coding rate",
"label": "Coding Rate"
},
"frequencyOffset": {
"description": "Frequency offset to correct for crystal calibration errors",
"label": "Frequency Offset"
},
"frequencySlot": {
"description": "LoRa frequency channel number",
"label": "Frequency Slot"
},
"hopLimit": {
"description": "Maximum number of hops",
"label": "Hop Limit"
},
"ignoreMqtt": {
"description": "Don't forward MQTT messages over the mesh",
"label": "Ignore MQTT"
},
"modemPreset": {
"description": "Modem preset to use",
"label": "Modem Preset"
},
"okToMqtt": {
"description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT",
"label": "OK to MQTT"
},
"overrideDutyCycle": {
"description": "Override Duty Cycle",
"label": "Override Duty Cycle"
},
"overrideFrequency": {
"description": "Override frequency",
"label": "Override Frequency"
},
"region": {
"description": "Sets the region for your node",
"label": "Рэгіён"
},
"spreadingFactor": {
"description": "Indicates the number of chirps per symbol",
"label": "Spreading Factor"
},
"transmitEnabled": {
"description": "Enable/Disable transmit (TX) from the LoRa radio",
"label": "Transmit Enabled"
},
"transmitPower": {
"description": "Max transmit power",
"label": "Transmit Power"
},
"usePreset": {
"description": "Use one of the predefined modem presets",
"label": "Use Preset"
},
"meshSettings": {
"description": "Settings for the LoRa mesh",
"label": "Mesh Settings"
},
"waveformSettings": {
"description": "Settings for the LoRa waveform",
"label": "Waveform Settings"
},
"radioSettings": {
"label": "Radio Settings",
"description": "Settings for the LoRa radio"
}
},
"network": {
"title": "WiFi Config",
"description": "WiFi radio configuration",
"note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.",
"addressMode": {
"description": "Address assignment selection",
"label": "Address Mode"
},
"dns": {
"description": "DNS Server",
"label": "DNS"
},
"ethernetEnabled": {
"description": "Enable or disable the Ethernet port",
"label": "Уключана"
},
"gateway": {
"description": "Default Gateway",
"label": "Gateway"
},
"ip": {
"description": "IP Address",
"label": "IP"
},
"psk": {
"description": "Network password",
"label": "PSK"
},
"ssid": {
"description": "Network name",
"label": "SSID"
},
"subnet": {
"description": "Subnet Mask",
"label": "Subnet"
},
"wifiEnabled": {
"description": "Enable or disable the WiFi radio",
"label": "Уключана"
},
"meshViaUdp": {
"label": "Mesh via UDP"
},
"ntpServer": {
"label": "NTP Server"
},
"rsyslogServer": {
"label": "Rsyslog Server"
},
"ethernetConfigSettings": {
"description": "Ethernet port configuration",
"label": "Ethernet Config"
},
"ipConfigSettings": {
"description": "IP configuration",
"label": "IP Config"
},
"ntpConfigSettings": {
"description": "NTP configuration",
"label": "NTP Config"
},
"rsyslogConfigSettings": {
"description": "Rsyslog configuration",
"label": "Rsyslog Config"
},
"udpConfigSettings": {
"description": "UDP over Mesh configuration",
"label": "UDP Config"
}
},
"position": {
"title": "Position Settings",
"description": "Settings for the position module",
"broadcastInterval": {
"description": "How often your position is sent out over the mesh",
"label": "Broadcast Interval"
},
"enablePin": {
"description": "GPS module enable pin override",
"label": "Enable Pin"
},
"fixedPosition": {
"description": "Don't report GPS position, but a manually-specified one",
"label": "Fixed Position"
},
"gpsMode": {
"description": "Configure whether device GPS is Enabled, Disabled, or Not Present",
"label": "GPS Mode"
},
"gpsUpdateInterval": {
"description": "How often a GPS fix should be acquired",
"label": "GPS Update Interval"
},
"positionFlags": {
"description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.",
"label": "Position Flags"
},
"receivePin": {
"description": "GPS module RX pin override",
"label": "Receive Pin"
},
"smartPositionEnabled": {
"description": "Only send position when there has been a meaningful change in location",
"label": "Enable Smart Position"
},
"smartPositionMinDistance": {
"description": "Minimum distance (in meters) that must be traveled before a position update is sent",
"label": "Smart Position Minimum Distance"
},
"smartPositionMinInterval": {
"description": "Minimum interval (in seconds) that must pass before a position update is sent",
"label": "Smart Position Minimum Interval"
},
"transmitPin": {
"description": "GPS module TX pin override",
"label": "Transmit Pin"
},
"intervalsSettings": {
"description": "How often to send position updates",
"label": "Intervals"
},
"flags": {
"placeholder": "Select position flags...",
"altitude": "Altitude",
"altitudeGeoidalSeparation": "Altitude Geoidal Separation",
"altitudeMsl": "Altitude is Mean Sea Level",
"dop": "Dilution of precision (DOP) PDOP used by default",
"hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP",
"numSatellites": "Number of satellites",
"sequenceNumber": "Sequence number",
"timestamp": "Timestamp",
"unset": "Unset",
"vehicleHeading": "Vehicle heading",
"vehicleSpeed": "Vehicle speed"
}
},
"power": {
"adcMultiplierOverride": {
"description": "Used for tweaking battery voltage reading",
"label": "ADC Multiplier Override ratio"
},
"ina219Address": {
"description": "Address of the INA219 battery monitor",
"label": "INA219 Address"
},
"lightSleepDuration": {
"description": "How long the device will be in light sleep for",
"label": "Light Sleep Duration"
},
"minimumWakeTime": {
"description": "Minimum amount of time the device will stay awake for after receiving a packet",
"label": "Minimum Wake Time"
},
"noConnectionBluetoothDisabled": {
"description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long",
"label": "No Connection Bluetooth Disabled"
},
"powerSavingEnabled": {
"description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.",
"label": "Enable power saving mode"
},
"shutdownOnBatteryDelay": {
"description": "Automatically shutdown node after this long when on battery, 0 for indefinite",
"label": "Shutdown on battery delay"
},
"superDeepSleepDuration": {
"description": "How long the device will be in super deep sleep for",
"label": "Super Deep Sleep Duration"
},
"powerConfigSettings": {
"description": "Settings for the power module",
"label": "Power Config"
},
"sleepSettings": {
"description": "Sleep settings for the power module",
"label": "Sleep Settings"
}
},
"security": {
"description": "Settings for the Security configuration",
"title": "Security Settings",
"button_backupKey": "Backup Key",
"adminChannelEnabled": {
"description": "Allow incoming device control over the insecure legacy admin channel",
"label": "Allow Legacy Admin"
},
"enableDebugLogApi": {
"description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth",
"label": "Enable Debug Log API"
},
"managed": {
"description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.",
"label": "Managed"
},
"privateKey": {
"description": "Used to create a shared key with a remote device",
"label": "Private Key"
},
"publicKey": {
"description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key",
"label": "Public Key"
},
"primaryAdminKey": {
"description": "The primary public key authorized to send admin messages to this node",
"label": "Primary Admin Key"
},
"secondaryAdminKey": {
"description": "The secondary public key authorized to send admin messages to this node",
"label": "Secondary Admin Key"
},
"serialOutputEnabled": {
"description": "Serial Console over the Stream API",
"label": "Serial Output Enabled"
},
"tertiaryAdminKey": {
"description": "The tertiary public key authorized to send admin messages to this node",
"label": "Tertiary Admin Key"
},
"adminSettings": {
"description": "Settings for Admin",
"label": "Admin Settings"
},
"loggingSettings": {
"description": "Settings for Logging",
"label": "Logging Settings"
}
},
"user": {
"title": "User Settings",
"description": "Configure your device name and identity settings",
"longName": {
"label": "Long Name",
"description": "Your full display name (1-40 characters)",
"validation": {
"min": "Long name must be at least 1 character",
"max": "Long name must be at most 40 characters"
}
},
"shortName": {
"label": "Short Name",
"description": "Your abbreviated name (2-4 characters)",
"validation": {
"min": "Short name must be at least 2 characters",
"max": "Short name must be at most 4 characters"
}
},
"isUnmessageable": {
"label": "Unmessageable",
"description": "Used to identify unmonitored or infrastructure nodes so that messaging is not available to nodes that will never respond."
},
"isLicensed": {
"label": "Licensed amateur radio (HAM)",
"description": "Enable if you are a licensed amateur radio operator, enabling this option disables encryption and is not compatible with the default Meshtastic network."
}
}
}
@@ -0,0 +1,34 @@
{
"page": {
"title": "Connect to a Meshtastic device",
"description": "Add a device connection via HTTP, Bluetooth, or Serial. Your saved connections will be saved in your browser."
},
"connectionType_ble": "BLE",
"connectionType_serial": "Serial",
"connectionType_network": "Сетка",
"deleteConnection": "Delete connection",
"areYouSure": "This will remove {{name}}. You canot undo this action.",
"moreActions": "More actions",
"noConnections": {
"title": "No connections yet.",
"description": "Create your first connection. It will connect immediately and be saved for later."
},
"lastConnectedAt": "Last connected: {{date}}",
"neverConnected": "Never connected",
"toasts": {
"connected": "Злучаны",
"nowConnected": "{{name}} is now connected",
"nowDisconnected": "{{name}} are now disconnecte",
"disconnected": "Адлучана",
"failed": "Failed to connect",
"checkConnetion": "Check your device or settings and try again",
"defaultSet": "Default set",
"defaultConnection": "Default connection is now {{nameisconnected}}",
"deleted": "Deleted",
"deletedByName": "{{name}} was removed",
"pickConnectionAgain": "Could not connect. You may need to reselect the device/port.",
"added": "Connection added",
"savedByName": "{{name}} saved.",
"savedCantConnect": "The connection was saved but could not connect."
}
}
@@ -0,0 +1,428 @@
{
"page": {
"title": "Configuration",
"tabBluetooth": "Bluetooth",
"tabDevice": "Device",
"tabDisplay": "Display",
"tabLora": "LoRa",
"tabNetwork": "Network",
"tabPosition": "Position",
"tabPower": "Power",
"tabSecurity": "Security"
},
"sidebar": {
"label": "Modules"
},
"device": {
"title": "Device Settings",
"description": "Settings for the device",
"buttonPin": {
"description": "Button pin override",
"label": "Button Pin"
},
"buzzerPin": {
"description": "Buzzer pin override",
"label": "Buzzer Pin"
},
"disableTripleClick": {
"description": "Disable triple click",
"label": "Disable Triple Click"
},
"doubleTapAsButtonPress": {
"description": "Treat double tap as button press",
"label": "Double Tap as Button Press"
},
"ledHeartbeatDisabled": {
"description": "Disable default blinking LED",
"label": "LED Heartbeat Disabled"
},
"nodeInfoBroadcastInterval": {
"description": "How often to broadcast node info",
"label": "Node Info Broadcast Interval"
},
"posixTimezone": {
"description": "The POSIX timezone string for the device",
"label": "POSIX Timezone"
},
"rebroadcastMode": {
"description": "How to handle rebroadcasting",
"label": "Rebroadcast Mode"
},
"role": {
"description": "What role the device performs on the mesh",
"label": "Role"
}
},
"bluetooth": {
"title": "Bluetooth Settings",
"description": "Settings for the Bluetooth module",
"note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.",
"enabled": {
"description": "Enable or disable Bluetooth",
"label": "Enabled"
},
"pairingMode": {
"description": "Pin selection behaviour.",
"label": "Pairing mode"
},
"pin": {
"description": "Pin to use when pairing",
"label": "Pin"
}
},
"display": {
"description": "Settings for the device display",
"title": "Display Settings",
"headingBold": {
"description": "Bolden the heading text",
"label": "Bold Heading"
},
"carouselDelay": {
"description": "How fast to cycle through windows",
"label": "Carousel Delay"
},
"compassNorthTop": {
"description": "Fix north to the top of compass",
"label": "Compass North Top"
},
"displayMode": {
"description": "Screen layout variant",
"label": "Display Mode"
},
"displayUnits": {
"description": "Display metric or imperial units",
"label": "Display Units"
},
"flipScreen": {
"description": "Flip display 180 degrees",
"label": "Flip Screen"
},
"gpsDisplayUnits": {
"description": "Coordinate display format",
"label": "GPS Display Units"
},
"oledType": {
"description": "Type of OLED screen attached to the device",
"label": "OLED Type"
},
"screenTimeout": {
"description": "Turn off the display after this long",
"label": "Screen Timeout"
},
"twelveHourClock": {
"description": "Use 12-hour clock format",
"label": "12-Hour Clock"
},
"wakeOnTapOrMotion": {
"description": "Wake the device on tap or motion",
"label": "Wake on Tap or Motion"
}
},
"lora": {
"title": "Mesh Settings",
"description": "Settings for the LoRa mesh",
"bandwidth": {
"description": "Channel bandwidth in kHz",
"label": "Bandwidth"
},
"boostedRxGain": {
"description": "Boosted RX gain",
"label": "Boosted RX Gain"
},
"codingRate": {
"description": "The denominator of the coding rate",
"label": "Coding Rate"
},
"frequencyOffset": {
"description": "Frequency offset to correct for crystal calibration errors",
"label": "Frequency Offset"
},
"frequencySlot": {
"description": "LoRa frequency channel number",
"label": "Frequency Slot"
},
"hopLimit": {
"description": "Maximum number of hops",
"label": "Hop Limit"
},
"ignoreMqtt": {
"description": "Don't forward MQTT messages over the mesh",
"label": "Ignore MQTT"
},
"modemPreset": {
"description": "Modem preset to use",
"label": "Modem Preset"
},
"okToMqtt": {
"description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT",
"label": "OK to MQTT"
},
"overrideDutyCycle": {
"description": "Override Duty Cycle",
"label": "Override Duty Cycle"
},
"overrideFrequency": {
"description": "Override frequency",
"label": "Override Frequency"
},
"region": {
"description": "Sets the region for your node",
"label": "Region"
},
"spreadingFactor": {
"description": "Indicates the number of chirps per symbol",
"label": "Spreading Factor"
},
"transmitEnabled": {
"description": "Enable/Disable transmit (TX) from the LoRa radio",
"label": "Transmit Enabled"
},
"transmitPower": {
"description": "Max transmit power",
"label": "Transmit Power"
},
"usePreset": {
"description": "Use one of the predefined modem presets",
"label": "Use Preset"
},
"meshSettings": {
"description": "Settings for the LoRa mesh",
"label": "Mesh Settings"
},
"waveformSettings": {
"description": "Settings for the LoRa waveform",
"label": "Waveform Settings"
},
"radioSettings": {
"label": "Radio Settings",
"description": "Settings for the LoRa radio"
}
},
"network": {
"title": "WiFi Config",
"description": "WiFi radio configuration",
"note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.",
"addressMode": {
"description": "Address assignment selection",
"label": "Address Mode"
},
"dns": {
"description": "DNS Server",
"label": "DNS"
},
"ethernetEnabled": {
"description": "Enable or disable the Ethernet port",
"label": "Enabled"
},
"gateway": {
"description": "Default Gateway",
"label": "Gateway"
},
"ip": {
"description": "IP Address",
"label": "IP"
},
"psk": {
"description": "Network password",
"label": "PSK"
},
"ssid": {
"description": "Network name",
"label": "SSID"
},
"subnet": {
"description": "Subnet Mask",
"label": "Subnet"
},
"wifiEnabled": {
"description": "Enable or disable the WiFi radio",
"label": "Enabled"
},
"meshViaUdp": {
"label": "Mesh via UDP"
},
"ntpServer": {
"label": "NTP Server"
},
"rsyslogServer": {
"label": "Rsyslog Server"
},
"ethernetConfigSettings": {
"description": "Ethernet port configuration",
"label": "Ethernet Config"
},
"ipConfigSettings": {
"description": "IP configuration",
"label": "IP Config"
},
"ntpConfigSettings": {
"description": "NTP configuration",
"label": "NTP Config"
},
"rsyslogConfigSettings": {
"description": "Rsyslog configuration",
"label": "Rsyslog Config"
},
"udpConfigSettings": {
"description": "UDP over Mesh configuration",
"label": "UDP Config"
}
},
"position": {
"title": "Position Settings",
"description": "Settings for the position module",
"broadcastInterval": {
"description": "How often your position is sent out over the mesh",
"label": "Broadcast Interval"
},
"enablePin": {
"description": "GPS module enable pin override",
"label": "Enable Pin"
},
"fixedPosition": {
"description": "Don't report GPS position, but a manually-specified one",
"label": "Fixed Position"
},
"gpsMode": {
"description": "Configure whether device GPS is Enabled, Disabled, or Not Present",
"label": "GPS Mode"
},
"gpsUpdateInterval": {
"description": "How often a GPS fix should be acquired",
"label": "GPS Update Interval"
},
"positionFlags": {
"description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.",
"label": "Position Flags"
},
"receivePin": {
"description": "GPS module RX pin override",
"label": "Receive Pin"
},
"smartPositionEnabled": {
"description": "Only send position when there has been a meaningful change in location",
"label": "Enable Smart Position"
},
"smartPositionMinDistance": {
"description": "Minimum distance (in meters) that must be traveled before a position update is sent",
"label": "Smart Position Minimum Distance"
},
"smartPositionMinInterval": {
"description": "Minimum interval (in seconds) that must pass before a position update is sent",
"label": "Smart Position Minimum Interval"
},
"transmitPin": {
"description": "GPS module TX pin override",
"label": "Transmit Pin"
},
"intervalsSettings": {
"description": "How often to send position updates",
"label": "Intervals"
},
"flags": {
"placeholder": "Select position flags...",
"altitude": "Altitude",
"altitudeGeoidalSeparation": "Altitude Geoidal Separation",
"altitudeMsl": "Altitude is Mean Sea Level",
"dop": "Dilution of precision (DOP) PDOP used by default",
"hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP",
"numSatellites": "Number of satellites",
"sequenceNumber": "Sequence number",
"timestamp": "Timestamp",
"unset": "Unset",
"vehicleHeading": "Vehicle heading",
"vehicleSpeed": "Vehicle speed"
}
},
"power": {
"adcMultiplierOverride": {
"description": "Used for tweaking battery voltage reading",
"label": "ADC Multiplier Override ratio"
},
"ina219Address": {
"description": "Address of the INA219 battery monitor",
"label": "INA219 Address"
},
"lightSleepDuration": {
"description": "How long the device will be in light sleep for",
"label": "Light Sleep Duration"
},
"minimumWakeTime": {
"description": "Minimum amount of time the device will stay awake for after receiving a packet",
"label": "Minimum Wake Time"
},
"noConnectionBluetoothDisabled": {
"description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long",
"label": "No Connection Bluetooth Disabled"
},
"powerSavingEnabled": {
"description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.",
"label": "Enable power saving mode"
},
"shutdownOnBatteryDelay": {
"description": "Automatically shutdown node after this long when on battery, 0 for indefinite",
"label": "Shutdown on battery delay"
},
"superDeepSleepDuration": {
"description": "How long the device will be in super deep sleep for",
"label": "Super Deep Sleep Duration"
},
"powerConfigSettings": {
"description": "Settings for the power module",
"label": "Power Config"
},
"sleepSettings": {
"description": "Sleep settings for the power module",
"label": "Sleep Settings"
}
},
"security": {
"description": "Settings for the Security configuration",
"title": "Security Settings",
"button_backupKey": "Backup Key",
"adminChannelEnabled": {
"description": "Allow incoming device control over the insecure legacy admin channel",
"label": "Allow Legacy Admin"
},
"enableDebugLogApi": {
"description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth",
"label": "Enable Debug Log API"
},
"managed": {
"description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.",
"label": "Managed"
},
"privateKey": {
"description": "Used to create a shared key with a remote device",
"label": "Private Key"
},
"publicKey": {
"description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key",
"label": "Public Key"
},
"primaryAdminKey": {
"description": "The primary public key authorized to send admin messages to this node",
"label": "Primary Admin Key"
},
"secondaryAdminKey": {
"description": "The secondary public key authorized to send admin messages to this node",
"label": "Secondary Admin Key"
},
"serialOutputEnabled": {
"description": "Serial Console over the Stream API",
"label": "Serial Output Enabled"
},
"tertiaryAdminKey": {
"description": "The tertiary public key authorized to send admin messages to this node",
"label": "Tertiary Admin Key"
},
"adminSettings": {
"description": "Settings for Admin",
"label": "Admin Settings"
},
"loggingSettings": {
"description": "Settings for Logging",
"label": "Logging Settings"
}
}
}
@@ -0,0 +1,238 @@
{
"deleteMessages": {
"description": "This action will clear all message history. This cannot be undone. Are you sure you want to continue?",
"title": "Clear All Messages"
},
"import": {
"description": "The current LoRa configuration will be overridden.",
"error": {
"invalidUrl": "Invalid Meshtastic URL"
},
"channelPrefix": "Channel: ",
"primary": "Primary ",
"doNotImport": "No not import",
"channelName": "Назва",
"channelSlot": "Slot",
"channelSetUrl": "Channel Set/QR Code URL",
"useLoraConfig": "Import LoRa Config",
"presetDescription": "The current LoRa Config will be replaced.",
"title": "Import Channel Set"
},
"locationResponse": {
"title": "Location: {{identifier}}",
"altitude": "Altitude: ",
"coordinates": "Coordinates: ",
"noCoordinates": "No Coordinates"
},
"pkiRegenerateDialog": {
"title": "Regenerate Pre-Shared Key?",
"description": "Are you sure you want to regenerate the pre-shared key?",
"regenerate": "Regenerate"
},
"addConnection": {
"title": "Add connection",
"description": "Choose a connection type and fill in the details",
"validation": {
"requiresWebBluetooth": "This connection type requires <0>Web Bluetooth</0>. Please use a supported browser, like Chrome or Edge.",
"requiresWebSerial": "This connection type requires <0>Web Serial</0>. Please use a supported browser, like Chrome or Edge.",
"requiresSecureContext": "This application requires a <0>secure context</0>. Please connect using HTTPS or localhost.",
"additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context</0>. Please connect using HTTPS or localhost."
},
"bluetoothConnection": {
"namePlaceholder": "My Bluetooth Node",
"supported": {
"title": "Web Bluetooth supported"
},
"notSupported": {
"title": "Web Bluetooth not supported",
"description": "Your browser or device does not support Web Bluetooth"
},
"short": "BT: {{deviceName}}",
"long": "Bluetooth Device",
"device": "Прылада",
"selectDevice": "Select device",
"selected": "Bluetooth device selected",
"notSelected": "No device selected",
"helperText": "Uses the Meshtastic Bluetooth service for discovery."
},
"serialConnection": {
"namePlaceholder": "My Serial Node",
"helperText": "Selecting a port grants permission so the app can open it to connect.",
"supported": {
"title": "Web Serial supported"
},
"notSupported": {
"title": "Web Serial not supported",
"description": "Your browser or device does not support Web Serial"
},
"portSelected": {
"title": "Serial port selected",
"description": "Port permissions granted."
},
"port": "Port",
"selectPort": "Select port",
"deviceName": "USB {{vendorId}}:{{productId}}",
"notSelected": "No port selected"
},
"httpConnection": {
"namePlaceholder": "My HTTP Node",
"inputPlaceholder": "192.168.1.10 or meshtastic.local",
"heading": "URL or IP",
"useHttps": "Use HTTPS",
"invalidUrl": {
"title": "Invalid URL",
"description": "Please enter a valid HTTP or HTTPS URL."
},
"connectionTest": {
"description": "Test the connetion before saving to verify the device is reachable.",
"button": {
"loading": "Testing...",
"label": "Test connection"
},
"reachable": "Reachable",
"notReachable": "Not reachable",
"success": {
"title": "Connection test successful",
"description": "The device appears to be reachable."
},
"failure": {
"title": "Connection test failed",
"description": "Could not reach the device. Check the URL and try again."
}
}
}
},
"nodeDetails": {
"message": "Message",
"requestPosition": "Request Position",
"traceRoute": "Trace Route",
"airTxUtilization": "Air TX utilization",
"allRawMetrics": "All Raw Metrics:",
"batteryLevel": "Battery level",
"channelUtilization": "Channel utilization",
"details": "Details:",
"deviceMetrics": "Device Metrics:",
"hardware": "Hardware: ",
"lastHeard": "Last Heard: ",
"nodeHexPrefix": "Node Hex: ",
"nodeNumber": "Node Number: ",
"position": "Position:",
"role": "Role: ",
"uptime": "Uptime: ",
"voltage": "Voltage",
"title": "Node Details for {{identifier}}",
"ignoreNode": "Ignore node",
"removeNode": "Remove node",
"unignoreNode": "Unignore node",
"security": "Security:",
"publicKey": "Public Key: ",
"messageable": "Messageable: ",
"KeyManuallyVerifiedTrue": "Public Key has been manually verified",
"KeyManuallyVerifiedFalse": "Public Key is not manually verified"
},
"pkiBackup": {
"loseKeysWarning": "If you lose your keys, you will need to reset your device.",
"secureBackup": "Its important to backup your public and private keys and store your backup securely!",
"footer": "=== END OF KEYS ===",
"header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===",
"privateKey": "Private Key:",
"publicKey": "Public Key:",
"fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt",
"title": "Backup Keys"
},
"pkiBackupReminder": {
"description": "We recommend backing up your key data regularly. Would you like to back up now?",
"title": "Backup Reminder",
"remindLaterPrefix": "Remind me in",
"remindNever": "Never remind me",
"backupNow": "Back up now"
},
"pkiRegenerate": {
"description": "Are you sure you want to regenerate key pair?",
"title": "Regenerate Key Pair"
},
"qr": {
"addChannels": "Add Channels",
"replaceChannels": "Replace Channels",
"description": "The current LoRa configuration will also be shared.",
"sharableUrl": "Sharable URL",
"title": "Generate QR Code"
},
"reboot": {
"title": "Reboot device",
"description": "Reboot now or schedule a reboot of the connected node. Optionally, you can choose to reboot into OTA (Over-the-Air) mode.",
"ota": "Reboot into OTA mode",
"enterDelay": "Enter delay",
"scheduled": "Reboot has been scheduled",
"schedule": "Schedule reboot",
"now": "Reboot now",
"cancel": "Cancel scheduled reboot"
},
"refreshKeys": {
"description": {
"acceptNewKeys": "This will remove the node from device and request new keys.",
"keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.",
"unableToSendDmPrefix": "Your node is unable to send a direct message to node: "
},
"acceptNewKeys": "Accept New Keys",
"title": "Keys Mismatch - {{identifier}}"
},
"removeNode": {
"description": "Are you sure you want to remove this Node?",
"title": "Remove Node?"
},
"shutdown": {
"title": "Schedule Shutdown",
"description": "Turn off the connected node after x minutes."
},
"traceRoute": {
"routeToDestination": "Route to destination:",
"routeBack": "Route back:"
},
"tracerouteResponse": {
"title": "Traceroute: {{identifier}}"
},
"unsafeRoles": {
"confirmUnderstanding": "Yes, I know what I'm doing",
"conjunction": " and the blog post about ",
"postamble": " and understand the implications of changing the role.",
"preamble": "I have read the ",
"choosingRightDeviceRole": "Choosing The Right Device Role",
"deviceRoleDocumentation": "Device Role Documentation",
"title": "Are you sure?"
},
"managedMode": {
"confirmUnderstanding": "Yes, I know what I'm doing",
"title": "Are you sure?",
"description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration."
},
"clientNotification": {
"title": "Client Notification",
"TraceRoute can only be sent once every 30 seconds": "TraceRoute can only be sent once every 30 seconds",
"Compromised keys were detected and regenerated.": "Compromised keys were detected and regenerated."
},
"resetNodeDb": {
"title": "Reset Node Database",
"description": "This will clear all nodes from the connected device's node database and clear all message history in the client. This cannot be undone. Are you sure you want to continue?",
"confirm": "Reset Node Database",
"failedTitle": "There was an error resetting the Node DB. Please try again."
},
"clearAllStores": {
"title": "Clear All Local Storage",
"description": "This will clear all locally stored data, including message history and node databases for all previously connected devices. This will require you to reconnect to your node once complete and cannot be undone. Are you sure you want to continue?",
"confirm": "Clear all local storage",
"failedTitle": "There was an error clearing local storage. Please try again."
},
"factoryResetDevice": {
"title": "Factory Reset Device",
"description": "This will factory reset the connected device, erasing all configurations and data on the device as well as all nodes and messages saved in the client. This cannot be undone. Are you sure you want to continue?",
"confirm": "Factory Reset Device",
"failedTitle": "There was an error performing the factory reset. Please try again."
},
"factoryResetConfig": {
"title": "Factory Reset Config",
"description": "This will factory reset the configuration on the connected device, erasing all configurations on the device. This cannot be undone. Are you sure you want to continue?",
"confirm": "Factory Reset Config",
"failedTitle": "There was an error performing the factory reset. Please try again."
}
}
@@ -0,0 +1,38 @@
{
"maplibre": {
"GeolocateControl.FindMyLocation": "Find my location",
"NavigationControl.ZoomIn": "Zoom in",
"NavigationControl.ZoomOut": "Zoom out",
"CooperativeGesturesHandler.WindowsHelpText": "Use Ctrl + scroll to zoom the map",
"CooperativeGesturesHandler.MacHelpText": "Use ⌘ + scroll to zoom the map",
"CooperativeGesturesHandler.MobileHelpText": "Use two fingers to move the map"
},
"layerTool": {
"nodeMarkers": "Show nodes",
"directNeighbors": "Show direct connections",
"remoteNeighbors": "Show remote connections",
"positionPrecision": "Show position precision",
"traceroutes": "Show traceroutes",
"waypoints": "Show waypoints"
},
"mapMenu": {
"locateAria": "Locate my node",
"layersAria": "Change map style"
},
"waypointDetail": {
"edit": "Змяніць",
"description": "Description:",
"createdBy": "Edited by:",
"createdDate": "Created:",
"updated": "Updated:",
"expires": "Expires:",
"distance": "Distance:",
"bearing": "Absolute bearing:",
"lockedTo": "Locked by:",
"latitude": "Latitude:",
"longitude": "Longitude:"
},
"myNode": {
"tooltip": "This device"
}
}
@@ -0,0 +1,39 @@
{
"page": {
"title": "Messages: {{chatName}}",
"placeholder": "Enter Message"
},
"emptyState": {
"title": "Select a Chat",
"text": "No messages yet."
},
"selectChatPrompt": {
"text": "Select a channel or node to start messaging."
},
"sendMessage": {
"placeholder": "Enter your message here...",
"sendButton": "Send"
},
"actionsMenu": {
"addReactionLabel": "Add Reaction",
"replyLabel": "Reply"
},
"deliveryStatus": {
"delivered": {
"label": "Message delivered",
"displayText": "Message delivered"
},
"failed": {
"label": "Message delivery failed",
"displayText": "Delivery failed"
},
"unknown": {
"label": "Message status unknown",
"displayText": "Unknown state"
},
"waiting": {
"label": "Sending message",
"displayText": "Waiting for delivery"
}
}
}
@@ -0,0 +1,534 @@
{
"page": {
"tabAmbientLighting": "Ambient Lighting",
"tabAudio": "Audio",
"tabCannedMessage": "Canned",
"tabDetectionSensor": "Detection Sensor",
"tabExternalNotification": "Ext Notif",
"tabMqtt": "MQTT",
"tabNeighborInfo": "Neighbor Info",
"tabPaxcounter": "Paxcounter",
"tabRangeTest": "Range Test",
"tabSerial": "Serial",
"tabStoreAndForward": "S&F",
"tabTelemetry": "Telemetry"
},
"ambientLighting": {
"title": "Ambient Lighting",
"description": "Settings for the Ambient Lighting module",
"ledState": {
"label": "LED State",
"description": "Sets LED to on or off"
},
"current": {
"label": "Current",
"description": "Sets the current for the LED output. Default is 10"
},
"red": {
"label": "Red",
"description": "Sets the red LED level. Values are 0-255"
},
"green": {
"label": "Green",
"description": "Sets the green LED level. Values are 0-255"
},
"blue": {
"label": "Blue",
"description": "Sets the blue LED level. Values are 0-255"
},
"ambientLightingConfig": {
"label": "Ambient Lighting Config",
"description": "Ambient Lighting configuration"
}
},
"audio": {
"title": "Audio",
"description": "Settings for the Audio module",
"codec2Enabled": {
"label": "CODEC 2 enabled",
"description": "Enable Codec 2 audio encoding"
},
"pttPin": {
"label": "PTT pin",
"description": "GPIO pin to use for PTT"
},
"bitrate": {
"label": "CODEC2 sample rate",
"description": "Bitrate to use for audio encoding"
},
"i2sWs": {
"label": "I2S word select",
"description": "GPIO pin to use for i2S WS"
},
"i2sSd": {
"label": "I2S data in",
"description": "GPIO pin to use for i2S SD"
},
"i2sDin": {
"label": "I2S data out",
"description": "GPIO pin to use for i2S DIN"
},
"i2sSck": {
"label": "I2S clock",
"description": "GPIO pin to use for i2S SCK"
},
"audioConfig": {
"label": "Audio Config",
"description": "Audio configuration"
}
},
"cannedMessage": {
"title": "Canned Message",
"description": "Settings for the Canned Message module",
"moduleEnabled": {
"label": "Module Enabled",
"description": "Enable Canned Message"
},
"rotary1Enabled": {
"label": "Rotary encoder #1 enabled",
"description": "Enable the rotary encoder"
},
"inputbrokerPinA": {
"label": "GPIO pin for rotary encoder A port",
"description": "GPIO Pin Value (1-39) For encoder port A"
},
"inputbrokerPinB": {
"label": "GPIO pin for rotary encoder B port",
"description": "GPIO Pin Value (1-39) For encoder port B"
},
"inputbrokerPinPress": {
"label": "GPIO pin for rotary encoder Press port",
"description": "GPIO Pin Value (1-39) For encoder Press"
},
"inputbrokerEventCw": {
"label": "Generate input event on CW",
"description": "Select input event."
},
"inputbrokerEventCcw": {
"label": "Generate input event on CCW",
"description": "Select input event."
},
"inputbrokerEventPress": {
"label": "Generate input event on Press",
"description": "Select input event"
},
"updown1Enabled": {
"label": "Up/Down/Select input enabled",
"description": "Enable the up / down encoder"
},
"allowInputSource": {
"label": "Allow input source",
"description": "Select from: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'"
},
"sendBell": {
"label": "Send bell",
"description": "Sends a bell character with each message"
},
"cannedMessageConfig": {
"label": "Canned Message Config",
"description": "Canned Message configuration"
},
"enabled": {
"label": "Canned message enabled",
"description": "Enable Canned Message"
}
},
"detectionSensor": {
"title": "Detection Sensor",
"description": "Settings for the Detection Sensor module",
"enabled": {
"label": "Detection Sensor enabled",
"description": "Enable or disable Detection Sensor Module"
},
"minimumBroadcastSecs": {
"label": "Minimum broadcast (seconds)",
"description": "Minimum interval between detection broadcasts"
},
"stateBroadcastSecs": {
"label": "State broadcast (seconds)",
"description": "How often to broadcast detection state"
},
"sendBell": {
"label": "Send bell with alert message",
"description": "Send a bell character with the alert"
},
"name": {
"label": "Friendly name",
"description": "Friendly name for the detected event"
},
"monitorPin": {
"label": "GPIO pin to monitor",
"description": "GPIO pin to monitor for detection"
},
"detectionTriggerType": {
"label": "Detection trigger type",
"description": "Trigger type for detection"
},
"usePullup": {
"label": "Use INPUT_PULLUP mode",
"description": "Enable internal pull-up on the monitor pin"
},
"detectionSensorConfig": {
"label": "Detection Sensor Config",
"description": "Detection Sensor configuration"
}
},
"externalNotification": {
"title": "External Notification",
"description": "Configure the external notification module",
"enabled": {
"label": "External notification enabled",
"description": "Enable External Notification"
},
"outputMs": {
"label": "Output duration (milliseconds)",
"description": "Output MS"
},
"output": {
"label": "Output LED (GPIO)",
"description": "Output"
},
"outputVibra": {
"label": "Output vibra (GPIO)",
"description": "Output Vibrate"
},
"outputBuzzer": {
"label": "Output buzzer (GPIO)",
"description": "Output Buzzer"
},
"active": {
"label": "Output LED active high",
"description": "Active"
},
"alertMessage": {
"label": "Alert message LED",
"description": "Alert Message"
},
"alertMessageVibra": {
"label": "Alert message vibra",
"description": "Alert Message Vibrate"
},
"alertMessageBuzzer": {
"label": "Alert message buzzer",
"description": "Alert Message Buzzer"
},
"alertBell": {
"label": "Alert bell LED",
"description": "Should an alert be triggered when receiving an incoming bell?"
},
"alertBellVibra": {
"label": "Alert bell vibra",
"description": "Alert Bell Vibrate"
},
"alertBellBuzzer": {
"label": "Alert bell buzzer",
"description": "Alert Bell Buzzer"
},
"usePwm": {
"label": "Use PWM buzzer",
"description": "Use PWM"
},
"nagTimeout": {
"label": "Nag timeout (seconds)",
"description": "Nag Timeout"
},
"useI2sAsBuzzer": {
"label": "Use I2S as buzzer",
"description": "Use I2S output as buzzer driver"
},
"externalNotificationConfig": {
"label": "External Notification Config",
"description": "External notification configuration"
},
"notificationsOnMessage": {
"label": "Notifications on message receipt",
"description": "Alerts on incoming text messages"
},
"notificationsOnAlert": {
"label": "Notifications on alert/bell receipt",
"description": "Alerts on incoming bell/alert packets"
},
"advanced": {
"label": "Advanced",
"description": "Pin assignments and timing"
}
},
"mqtt": {
"title": "MQTT",
"description": "MQTT module configuration",
"enabled": {
"label": "MQTT enabled",
"description": "Enable or disable MQTT"
},
"address": {
"label": "Address",
"description": "MQTT server address to use for default/custom servers"
},
"username": {
"label": "Username",
"description": "MQTT username to use for default/custom servers"
},
"password": {
"label": "Password",
"description": "MQTT password to use for default/custom servers"
},
"encryptionEnabled": {
"label": "Encryption enabled",
"description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data."
},
"jsonEnabled": {
"label": "JSON output enabled",
"description": "Whether to send/consume JSON packets on MQTT"
},
"tlsEnabled": {
"label": "TLS enabled",
"description": "Enable or disable TLS"
},
"root": {
"label": "Root topic",
"description": "MQTT root topic to use for default/custom servers"
},
"proxyToClientEnabled": {
"label": "Proxy to client enabled",
"description": "Utilizes the network connection to proxy MQTT messages to the client."
},
"mapReportingEnabled": {
"label": "Map reporting",
"description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, long and short name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name."
},
"mapReportSettings": {
"publishIntervalSecs": {
"label": "Map reporting interval (seconds)",
"description": "Interval in seconds to publish map reports"
},
"positionPrecision": {
"label": "Approximate location",
"description": "Position shared will be accurate within this distance",
"options": {
"metric_km23": "Within 23 km",
"metric_km12": "Within 12 km",
"metric_km5_8": "Within 5.8 km",
"metric_km2_9": "Within 2.9 km",
"metric_km1_5": "Within 1.5 km",
"metric_m700": "Within 700 m",
"metric_m350": "Within 350 m",
"metric_m200": "Within 200 m",
"metric_m90": "Within 90 m",
"metric_m50": "Within 50 m",
"imperial_mi15": "Within 15 miles",
"imperial_mi7_3": "Within 7.3 miles",
"imperial_mi3_6": "Within 3.6 miles",
"imperial_mi1_8": "Within 1.8 miles",
"imperial_mi0_9": "Within 0.9 miles",
"imperial_mi0_5": "Within 0.5 miles",
"imperial_mi0_2": "Within 0.2 miles",
"imperial_ft600": "Within 600 feet",
"imperial_ft300": "Within 300 feet",
"imperial_ft150": "Within 150 feet"
}
},
"shouldReportLocation": {
"label": "I agree.",
"description": "I have read and understand the above. I voluntarily consent to the unencrypted transmission of my node data via MQTT.",
"consentHeader": "Consent to Share Unencrypted Node Data via MQTT",
"consentText": "By enabling this feature, you acknowledge and expressly consent to the transmission of your device's real-time geographic location over the MQTT protocol without encryption. This location data may be used for purposes such as live map reporting, device tracking, and related telemetry functions."
}
},
"mqttConfigCard": {
"label": "MQTT Config",
"description": "MQTT broker connection"
},
"mapReportingCard": {
"label": "Map reporting",
"description": "Periodic unencrypted map report"
}
},
"neighborInfo": {
"title": "Neighbor Info",
"description": "Settings for the Neighbor Info module",
"enabled": {
"label": "Neighbor Info enabled",
"description": "Enable or disable Neighbor Info Module"
},
"updateInterval": {
"label": "Update interval (seconds)",
"description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh"
},
"neighborInfoConfig": {
"label": "Neighbor Info Config",
"description": "Neighbor Info configuration"
},
"transmitOverLora": {
"label": "Transmit over LoRa",
"description": "Whether NeighborInfo should be transmitted over LoRa. Not available on a channel with default key and name."
}
},
"paxcounter": {
"title": "Paxcounter",
"description": "Settings for the Paxcounter module",
"enabled": {
"label": "Paxcounter enabled",
"description": "Enable Paxcounter"
},
"paxcounterUpdateInterval": {
"label": "Update interval (seconds)",
"description": "How long to wait between sending paxcounter packets"
},
"wifiThreshold": {
"label": "WiFi RSSI threshold (defaults to -80)",
"description": "At what WiFi RSSI level should the counter increase. Defaults to -80."
},
"bleThreshold": {
"label": "BLE RSSI threshold (defaults to -80)",
"description": "At what BLE RSSI level should the counter increase. Defaults to -80."
},
"paxcounterConfig": {
"label": "Paxcounter Config",
"description": "Paxcounter configuration"
}
},
"rangeTest": {
"title": "Range Test",
"description": "Settings for the Range Test module",
"enabled": {
"label": "Range test enabled",
"description": "Enable Range Test"
},
"sender": {
"label": "Sender message interval (seconds)",
"description": "How long to wait between sending test packets"
},
"save": {
"label": "Save .CSV in storage (ESP32 only)",
"description": "ESP32 Only"
},
"rangeTestConfig": {
"label": "Range Test Config",
"description": "Range Test configuration"
}
},
"serial": {
"title": "Serial",
"description": "Settings for the Serial module",
"enabled": {
"label": "Serial enabled",
"description": "Enable Serial output"
},
"echo": {
"label": "Echo enabled",
"description": "Any packets you send will be echoed back to your device"
},
"rxd": {
"label": "RX",
"description": "Set the GPIO pin to the RXD pin you have set up."
},
"txd": {
"label": "TX",
"description": "Set the GPIO pin to the TXD pin you have set up."
},
"baud": {
"label": "Serial baud rate",
"description": "The serial baud rate"
},
"timeout": {
"label": "Timeout",
"description": "Seconds to wait before we consider your packet as 'done'"
},
"mode": {
"label": "Serial mode",
"description": "Select Mode"
},
"overrideConsoleSerialPort": {
"label": "Override console serial port",
"description": "If you have a serial port connected to the console, this will override it."
},
"serialConfig": {
"label": "Serial Config",
"description": "Serial module configuration"
}
},
"storeForward": {
"title": "Store & Forward",
"description": "Settings for the Store & Forward module",
"enabled": {
"label": "Store & Forward enabled",
"description": "Enable Store & Forward"
},
"heartbeat": {
"label": "Heartbeat",
"description": "Enable Store & Forward heartbeat"
},
"records": {
"label": "Number of records",
"description": "Number of records to store"
},
"historyReturnMax": {
"label": "History return max",
"description": "Max number of records to return"
},
"historyReturnWindow": {
"label": "History return window",
"description": "Return records from this time window (minutes)"
},
"storeForwardConfig": {
"label": "Store & Forward Config",
"description": "Store & Forward configuration"
},
"isServer": {
"label": "Server",
"description": "Run as a Store & Forward server"
}
},
"telemetry": {
"title": "Telemetry",
"description": "Settings for the Telemetry module",
"deviceUpdateInterval": {
"label": "Device metrics update interval",
"description": "Device metrics update interval (seconds)"
},
"environmentUpdateInterval": {
"label": "Environment metrics update interval",
"description": ""
},
"environmentMeasurementEnabled": {
"label": "Environment metrics module enabled",
"description": "Enable the Environment Telemetry"
},
"environmentScreenEnabled": {
"label": "Environment metrics on-screen enabled",
"description": "Show the Telemetry Module on the OLED"
},
"environmentDisplayFahrenheit": {
"label": "Environment metrics use Fahrenheit",
"description": "Display temp in Fahrenheit"
},
"airQualityEnabled": {
"label": "Air quality metrics module enabled",
"description": "Enable the Air Quality Telemetry"
},
"airQualityInterval": {
"label": "Air quality metrics update interval",
"description": "How often to send Air Quality data over the mesh"
},
"powerMeasurementEnabled": {
"label": "Power metrics module enabled",
"description": "Enable the Power Measurement Telemetry"
},
"powerUpdateInterval": {
"label": "Power metrics update interval",
"description": "How often to send Power data over the mesh"
},
"powerScreenEnabled": {
"label": "Power metrics on-screen enabled",
"description": "Show power metrics on the device screen"
},
"telemetryConfig": {
"label": "Telemetry Config",
"description": "Telemetry configuration"
},
"deviceTelemetryEnabled": {
"label": "Send Device Telemetry",
"description": "Enable/Disable the device telemetry module to send metrics to the mesh."
}
}
}
@@ -0,0 +1,59 @@
{
"nodeDetail": {
"publicKeyEnabled": {
"label": "Public Key Enabled"
},
"noPublicKey": {
"label": "No Public Key"
},
"directMessage": {
"label": "Direct Message {{shortName}}"
},
"favorite": {
"label": "Favorite",
"tooltip": "Add or remove this node from your favorites"
},
"notFavorite": {
"label": "Not a Favorite"
},
"error": {
"label": "Error",
"text": "An error occurred while fetching node details. Please try again later."
},
"status": {
"heard": "Heard",
"mqtt": "MQTT"
},
"elevation": {
"label": "Elevation"
},
"channelUtil": {
"label": "Channel Util"
},
"airtimeUtil": {
"label": "Airtime Util"
}
},
"nodesTable": {
"headings": {
"longName": "Long Name",
"connection": "Connection",
"lastHeard": "Last Heard",
"encryption": "Encryption",
"model": "Model",
"macAddress": "MAC Address"
},
"connectionStatus": {
"direct": "Direct",
"away": "away",
"viaMqtt": ", via MQTT"
}
},
"actions": {
"added": "Added",
"removed": "Removed",
"ignoreNode": "Ignore Node",
"unignoreNode": "Unignore Node",
"requestPosition": "Request Position"
}
}
+230
View File
@@ -0,0 +1,230 @@
{
"navigation": {
"title": "Navigation",
"messages": "Messages",
"map": "Map",
"settings": "Settings",
"channels": "Channels",
"radioConfig": "Radio Config",
"deviceConfig": "Device Config",
"moduleConfig": "Module Config",
"manageConnections": "Manage Connections",
"nodes": "Nodes"
},
"app": {
"title": "Meshtastic",
"logo": "Meshtastic Logo"
},
"sidebar": {
"collapseToggle": {
"button": {
"open": "Open sidebar",
"close": "Close sidebar"
}
},
"deviceInfo": {
"volts": "{{voltage}} volts",
"firmware": {
"title": "Firmware",
"version": "v{{version}}",
"buildDate": "Build date: {{date}}"
}
}
},
"batteryStatus": {
"charging": "{{level}}% charging",
"pluggedIn": "Plugged in",
"title": "Battery"
},
"search": {
"nodes": "Search nodes...",
"channels": "Search channels...",
"commandPalette": "Search commands..."
},
"toast": {
"positionRequestSent": {
"title": "Position request sent."
},
"requestingPosition": {
"title": "Requesting position, please wait..."
},
"sendingTraceroute": {
"title": "Sending Traceroute, please wait..."
},
"tracerouteSent": {
"title": "Traceroute sent."
},
"savedChannel": {
"title": "Saved Channel: {{channelName}}"
},
"messages": {
"pkiEncryption": {
"title": "Chat is using PKI encryption."
},
"pskEncryption": {
"title": "Chat is using PSK encryption."
}
},
"configSaveError": {
"title": "Error Saving Config",
"description": "An error occurred while saving the configuration."
},
"validationError": {
"title": "Config Errors Exist",
"description": "Please fix the configuration errors before saving."
},
"saveSuccess": {
"title": "Saving Config",
"description": "The configuration change {{case}} has been saved."
},
"saveAllSuccess": {
"title": "Saved",
"description": "All configuration changes have been saved."
},
"favoriteNode": {
"title": "{{action}} {{nodeName}} {{direction}} favorites.",
"action": {
"added": "Added",
"removed": "Removed",
"to": "to",
"from": "from"
}
},
"ignoreNode": {
"title": "{{action}} {{nodeName}} {{direction}} ignore list",
"action": {
"added": "Added",
"removed": "Removed",
"to": "to",
"from": "from"
}
}
},
"notifications": {
"copied": {
"label": "Copied!"
},
"copyToClipboard": {
"label": "Copy to clipboard"
},
"hidePassword": {
"label": "Hide password"
},
"showPassword": {
"label": "Show password"
},
"deliveryStatus": {
"delivered": "Delivered",
"failed": "Delivery Failed",
"waiting": "Waiting",
"unknown": "Unknown"
}
},
"general": {
"label": "General"
},
"hardware": {
"label": "Hardware"
},
"metrics": {
"label": "Metrics"
},
"role": {
"label": "Role"
},
"filter": {
"label": "Filter"
},
"advanced": {
"label": "Advanced"
},
"clearInput": {
"label": "Clear input"
},
"resetFilters": {
"label": "Reset Filters"
},
"nodeName": {
"label": "Node name/number",
"placeholder": "Meshtastic 1234"
},
"airtimeUtilization": {
"label": "Airtime Utilization (%)",
"short": "Airtime Util. (%)"
},
"batteryLevel": {
"label": "Battery level (%)",
"labelText": "Battery level (%): {{value}}"
},
"batteryVoltage": {
"label": "Battery voltage (V)",
"title": "Voltage"
},
"channelUtilization": {
"label": "Channel Utilization (%)",
"short": "Channel Util. (%)"
},
"hops": {
"direct": "Direct",
"label": "Number of hops",
"text": "Number of hops: {{value}}"
},
"lastHeard": {
"label": "Last heard",
"labelText": "Last heard: {{value}}",
"nowLabel": "Now"
},
"snr": {
"label": "SNR (db)"
},
"favorites": {
"label": "Favorites"
},
"hide": {
"label": "Hide"
},
"showOnly": {
"label": "Show Only"
},
"viaMqtt": {
"label": "Connected via MQTT"
},
"hopsUnknown": {
"label": "Unknown number of hops"
},
"showUnheard": {
"label": "Never heard"
},
"language": {
"label": "Language",
"changeLanguage": "Change Language"
},
"theme": {
"dark": "Dark",
"light": "Light",
"system": "Automatic",
"changeTheme": "Change Color Scheme"
},
"errorPage": {
"title": "This is a little embarrassing...",
"description1": "We are really sorry but an error occurred in the web client that caused it to crash. <br /> This is not supposed to happen, and we are working hard to fix it.",
"description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.",
"reportInstructions": "Please include the following information in your report:",
"reportSteps": {
"step1": "What you were doing when the error occurred",
"step2": "What you expected to happen",
"step3": "What actually happened",
"step4": "Any other relevant information"
},
"reportLink": "You can report the issue to our <0>GitHub</0>",
"connectionsLink": "Return to the <0>connections</0>",
"detailsSummary": "Error Details",
"errorMessageLabel": "Error message:",
"stackTraceLabel": "Stack trace:",
"fallbackError": "{{error}}"
},
"footer": {
"text": "Powered by <0>▲ Vercel</0> | Meshtastic® is a registered trademark of Meshtastic LLC. | <1>Legal Information</1>",
"commitSha": "Commit SHA: {{sha}}"
}
}
@@ -0,0 +1,71 @@
{
"page": {
"sectionLabel": "Канали",
"channelName": "Канал: {{channelName}}",
"broadcastLabel": "Първичен",
"channelIndex": "К {{index}}",
"import": "Импортиране",
"export": "Експортиране"
},
"validation": {
"pskInvalid": "Моля, въведете валиден {{bits}} bit PSK."
},
"settings": {
"label": "Настройки на канала",
"description": "Крипто, MQTT и други настройки"
},
"role": {
"label": "Роля",
"description": "Телеметрията на устройството се изпраща през ПЪРВИЧЕН. Разрешен е само един ПЪРВИЧЕН.",
"options": {
"primary": "ПЪРВИЧЕН",
"disabled": "ДЕЗАКТИВИРАН",
"secondary": "ВТОРИЧЕН"
}
},
"psk": {
"label": "Предварително споделен ключ",
"description": "Поддържани дължини на PSK: 256-битова, 128-битова, 8-битова, празна (0-битова)",
"generate": "Генериране"
},
"name": {
"label": "Име",
"description": "Уникално име за канала <12 байта, оставете празно за подразбиране"
},
"uplinkEnabled": {
"label": "Uplink е активиран",
"description": "Изпращане на съобщения от локалната mesh към MQTT"
},
"downlinkEnabled": {
"label": "Downlink е активиран",
"description": "Изпращане на съобщения от MQTT към локалната mesh"
},
"positionPrecision": {
"label": "Местоположение",
"description": "Точността на местоположението, което да се споделя с канала. Може да бъде дезактивирано.",
"options": {
"none": "Да не се споделя местоположението",
"precise": "Точно местоположение",
"metric_km23": "В рамките на 23 километра",
"metric_km12": "В рамките на 12 километра",
"metric_km5_8": "В рамките на 5.8 километра",
"metric_km2_9": "В рамките на 2.9 километра",
"metric_km1_5": "В рамките на 1.5 километра",
"metric_m700": "В рамките на 700 метра",
"metric_m350": "В рамките на 350 метра",
"metric_m200": "В рамките на 200 метра",
"metric_m90": "В рамките на 90 метра",
"metric_m50": "В рамките на 50 метра",
"imperial_mi15": "В рамките на 15 мили",
"imperial_mi7_3": "В рамките на 7.3 мили",
"imperial_mi3_6": "В рамките на 3.6 мили",
"imperial_mi1_8": "В рамките на 1.8 мили",
"imperial_mi0_9": "В рамките на 0.9 мили",
"imperial_mi0_5": "В рамките на 0.5 мили",
"imperial_mi0_2": "В рамките на 0.2 мили",
"imperial_ft600": "В рамките на 600 фута",
"imperial_ft300": "В рамките на 300 фута",
"imperial_ft150": "В рамките на 150 фута"
}
}
}
@@ -0,0 +1,51 @@
{
"emptyState": "Няма намерени резултати.",
"page": {
"title": "Command Menu"
},
"pinGroup": {
"label": "Pin command group"
},
"unpinGroup": {
"label": "Unpin command group"
},
"goto": {
"label": "Goto",
"command": {
"messages": "Съобщения",
"map": "Карта",
"config": "Конфигурация",
"nodes": "Възли"
}
},
"manage": {
"label": "Управление",
"command": {
"switchNode": "Switch Node",
"connectNewNode": "Свързване на нов възел"
}
},
"contextual": {
"label": "Contextual",
"command": {
"qrCode": "QR код",
"qrGenerator": "Генератор",
"qrImport": "Импортиране",
"scheduleShutdown": "Планирано изключване",
"scheduleReboot": "Рестартиране на устройството",
"resetNodeDb": "Нулиране на базата данни с възли",
"dfuMode": "Влизане в DFU режим",
"factoryResetDevice": "Фабрично нулиране на устройството",
"factoryResetConfig": "Фабрично нулиране на конфигурацията",
"disconnect": "Прекъсване"
}
},
"debug": {
"label": "Отстраняване на грешки",
"command": {
"reconfigure": "Преконфигуриране",
"clearAllStoredMessages": "Изчистване на всички съхранени съобщения",
"clearAllStores": "Clear All Local Storage"
}
}
}
@@ -0,0 +1,165 @@
{
"button": {
"apply": "Приложи",
"addConnection": "Добавяне на връзка",
"saveConnection": "Запазване на връзката",
"backupKey": "Резервно копие на ключа",
"cancel": "Отказ",
"connect": "Свързване",
"clearMessages": "Изчистване на съобщенията",
"close": "Затвори",
"confirm": "Потвърждаване",
"delete": "Изтриване",
"dismiss": "Отхвърляне",
"download": "Изтегляне",
"disconnect": "Прекъсване на връзката",
"export": "Експортиране",
"generate": "Генериране",
"regenerate": "Регенериране",
"import": "Импортиране",
"message": "Съобщение",
"now": "Сега",
"ok": "Добре",
"print": "Отпечатване",
"remove": "Изтрий",
"requestNewKeys": "Заявка за нови ключове",
"requestPosition": "Request Position",
"reset": "Нулиране",
"retry": "Retry",
"save": "Запис",
"setDefault": "Задаване по подразбиране",
"unsetDefault": "Unset default",
"scanQr": "Сканиране на QR кода",
"traceRoute": "Trace Route",
"submit": "Изпращане"
},
"app": {
"title": "Meshtastic",
"fullTitle": "Meshtastic Web клиент"
},
"loading": "Зареждане...",
"unit": {
"cps": "CPS",
"dbm": "dBm",
"hertz": "Hz",
"hop": {
"one": "Хоп",
"plural": "Хопа"
},
"hopsAway": {
"one": "{{count}} hop away",
"plural": "{{count}} hops away",
"unknown": "Unknown hops away"
},
"megahertz": "MHz",
"kilohertz": "kHz",
"raw": "raw",
"meter": {
"one": "Метър",
"plural": "Метри",
"suffix": "m"
},
"kilometer": {
"one": "Километър",
"plural": "Километри",
"suffix": "км"
},
"minute": {
"one": "Минута",
"plural": "Минути"
},
"hour": {
"one": "Час",
"plural": "Часа"
},
"millisecond": {
"one": "Милисекунда",
"plural": "Милисекунди",
"suffix": "ms"
},
"second": {
"one": "Секунда",
"plural": "Секунди"
},
"day": {
"one": "Ден",
"plural": "Дни",
"today": "Днес",
"yesterday": "Вчера"
},
"month": {
"one": "Месец",
"plural": "Месеца"
},
"year": {
"one": "Година",
"plural": "Години"
},
"snr": "SNR",
"volt": {
"one": "Волт",
"plural": "Волта",
"suffix": "V"
},
"record": {
"one": "Записи",
"plural": "Записи"
},
"degree": {
"one": "Градус",
"plural": "Градуса",
"suffix": "°"
}
},
"security": {
"0bit": "Празен",
"8bit": "8 bit",
"128bit": "128 bit",
"256bit": "256 bit"
},
"unknown": {
"longName": "Неизвестно",
"shortName": "НЕИЗВ.",
"notAvailable": "N/A",
"num": "??"
},
"nodeUnknownPrefix": "!",
"unset": "НЕЗАДАДЕН",
"fallbackName": "Meshtastic {{last4}}",
"node": "Възел",
"formValidation": {
"unsavedChanges": "Незапазени промени",
"tooBig": {
"string": "Твърде дълъг, очаква се по-малко или равно на {{maximum}} знака.",
"number": "Твърде голям, очаква се число по-малко или равно на {{maximum}}.",
"bytes": "Твърде голям, очаква се по-малък или равен на {{params.maximum}} байта."
},
"tooSmall": {
"string": "Твърде кратък, очаква се повече или равно на {{minimum}} знака.",
"number": "Твърде малък, очаква се число, по-голямо или равно на {{minimum}}."
},
"invalidFormat": {
"ipv4": "Невалиден формат, очаква се IPv4 адрес.",
"key": "Невалиден формат, очаква се предварително споделен ключ (PSK), кодиран с Base64."
},
"invalidType": {
"number": "Невалиден тип, очаква се число."
},
"pskLength": {
"0bit": "Ключът трябва да е празен.",
"8bit": "Ключът трябва да бъде 8-битов предварително споделен ключ (PSK).",
"128bit": "Ключът трябва да бъде 128-битов предварително споделен ключ (PSK).",
"256bit": "Ключът трябва да бъде 256-битов предварително споделен ключ (PSK)."
},
"required": {
"generic": "Това поле е задължително.",
"managed": "Изисква се поне един администраторски ключ, ако възелът е управляван.",
"key": "Ключът е задължителен."
},
"invalidOverrideFreq": {
"number": "Невалиден формат, очаквана е стойност в диапазона 410-930 MHz или 0 (използвайте стойността по подразбиране)."
}
},
"yes": "Да",
"no": "Не"
}

Some files were not shown because too many files have changed in this diff Show More