1058 Commits
Author SHA1 Message Date
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
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
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
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
philon-andGitHub 513a285fee Feature: Node favourites (and ignores) (#618)
* Add favourite icon to node Avatar

* Favourites WIP

* Save isFavorite and isIgnored to device

* Fix spelling

* Clean up

* Always sort favorites first

* Add unread count to "Messages" top level menu

* Renaming, UI tweaks

* Add hook tests

* Handle undefined node better
2025-05-13 08:45:24 -04:00
philon-andGitHub b2bb3baa01 Add check for undefined hopsAway (#616)
* Add check for undefined hopsAway

Better UI for already "fixed" #351

* Change conditional
2025-05-12 11:54:06 -04:00
Aria StewartandGitHub 3f933dd166 Remove case-duplicated sidebarButton.tsx (#617) 2025-05-11 20:01:43 -04:00
Dan DitomasoandGitHub 1180b9afb0 fix: moved all svgs into public / dist folder (#615) 2025-05-09 20:57:38 -04:00
philon-andGitHub b4ce6efd7b Fix node list sorting, dark mode text colors (#613)
* Fix node list sorting, dark mode text colors

* Update tests

* Remove unused import

* Fix warnings for missing DialogDescription
2025-05-08 12:54:18 -04:00
Dan DitomasoandGitHub da0ada925f fix: removed overly complex scrolling logic in channel chat (#612) 2025-05-06 12:40:07 -04:00
Dan DitomasoandGitHub f9346931f8 update readme with deployment schedule (#611) 2025-05-06 10:10:24 -04:00
Dan DitomasoandGitHub 1d18abf6c1 fix: connect new node no longer crashes. (#610) 2025-05-06 10:08:42 -04:00
Dan DitomasoandGitHub a644d30228 Add github action to release to stable (#590)
* feat: added github action workflow to release to stable

* updated trigger logic
2025-05-05 13:20:49 -04:00
Dan DitomasoandGitHub 1c453e2981 fix: couple of UI updates, fix: add pre release support to release workflow (#609) 2025-05-05 11:47:36 -04:00
philon-andGitHub 170abfcc2f fix: Adjust table odd/even colors (#606) 2025-05-05 11:23:37 -04:00
philon-andGitHub 0539b15ddc Fix #607 (#608) 2025-05-04 20:08:16 -04:00
Dan DitomasoandGitHub bbadb1a917 chore: optimize deno workflow for CI/CD (#605)
* chore: optimize deno workflow for CI/CD

* add install step
2025-05-04 16:39:19 -04:00
480ca46a95 chore: lint/format all files (#604)
* chore: lint/format all files

* Fix config sidebar button state (#602)

* chore: Update deno.lock version and add Radix UI slider component (#601)

* fix: improve how table addresses even/odd rows

---------

Co-authored-by: philon- <philon-@users.noreply.github.com>
Co-authored-by: Kamil Dzieniszewski <kamil.dzieniszewski@gmail.com>
2025-05-04 15:55:04 -04:00
Kamil DzieniszewskiandGitHub b7bdb1a502 chore: Update deno.lock version and add Radix UI slider component (#601) 2025-05-04 15:29:34 -04:00
philon-andGitHub 3be528d03a Fix config sidebar button state (#602) 2025-05-04 15:28:47 -04:00
Dan DitomasoandGitHub ebc386cfa5 Merge pull request #599 from danditomaso/fix/update-telemetry-labels
fix: updated telemetry field labels
2025-05-04 11:50:58 -04:00
Dan Ditomaso 35f3a347ba fix: updated telemtry field labels 2025-05-03 21:27:26 -04:00
Dan DitomasoandGitHub cfcc9f82d8 Merge pull request #596 from philon-/style-fixes
Minor style fixes
2025-05-03 13:28:22 -04:00
Dan DitomasoandGitHub 7ab4254cd0 Merge pull request #597 from danditomaso/fix/content-overflow-issue
fix: defined height to html/body elements
2025-05-03 13:27:54 -04:00
Dan Ditomaso e3857e61c6 fix: defined height to html/body elements 2025-05-03 13:24:00 -04:00
philon- a02579d6dd Minor style fixes 2025-05-03 00:27:12 +02:00
Dan DitomasoandGitHub 79910dfec7 fix: removed console logs in code (#592) 2025-05-02 11:48:18 -04:00
AustinandGitHub b40540b118 Fix upload build.tar (#591) 2025-05-02 10:57:17 -04:00
Dan DitomasoandGitHub 99711fc44e Remove duplicate node logic, UI Update, flatten build output (#586)
* refactor nodes to getNodes fn. ui updates

* fixed several styling issues

* fix: message specific styling/overflow

* added footer, fixed tests. styling

* fix: added theme support back to app component

* fix: hide emojis/reactions

* fix: added more padding to content element

* fix: fixed padding in content element

* updated color scheme

* fix: more dark mode styling improvements

* fix: padding and alignment fixes

* fix: prevent left sidebar collapse, added battery component

* fix: change scrollbars to "tiny" style, improved message scrolling, fixed bug with message input

* message store fixes, ui fixes

* fix: disabled message persistance until after release
2025-05-02 09:00:24 -04:00
Dan DitomasoandGitHub 3eafad7261 Merge pull request #585 from philon-/feature/map-filtering
Map filtering improvements
2025-04-29 15:29:06 -04:00
Jeremy Gallant 80905d9d29 Change colors to slate 2025-04-29 15:35:34 +02:00
Jeremy Gallant 34db0da87c Add map filter groups / more filters / update UI 2025-04-28 17:38:58 +02:00
Jeremy Gallant ff33554716 Add hover: and active: styling 2025-04-24 20:30:31 +02:00
Jeremy Gallant f399d17721 Added map filter indication
Added map filter indication
+ some more type fixes...
2025-04-24 20:12:41 +02:00
Dan DitomasoandGitHub ce71f22316 Merge pull request #580 from philon-/feature/map-filtering
Add filters to node map
2025-04-24 08:52:55 -04:00
Dan DitomasoandGitHub 1f3f76373d Merge pull request #583 from danditomaso/fix-remove-assets-output-dir
fix: keep js and css assets in same output directory
2025-04-24 07:53:39 -04:00
Dan Ditomaso c5fe2f5e68 fix: dont put js and css assets in sub-directory in output 2025-04-23 23:12:54 -04:00
Dan DitomasoandGitHub c050998f3d Merge pull request #582 from meshtastic/danditomaso-patch-1
Update ci.yml
2025-04-23 15:48:37 -04:00
Dan DitomasoandGitHub 4802a8f6e6 Update ci.yml 2025-04-23 14:14:00 -04:00
Jeremy Gallant 03e516e568 Slider - additional props 2025-04-23 16:41:20 +02:00
Jeremy Gallant ef37397969 Remove ! 2025-04-23 07:10:04 +02:00
Jeremy Gallant c6d122008b Unique id 2025-04-22 23:26:49 +02:00
Jeremy Gallant 3dce031f8e Stricter typing, adjuster colors, mandatory props 2025-04-22 23:18:26 +02:00
philon-andGitHub 91d8776637 Merge branch 'meshtastic:master' into feature/map-filtering 2025-04-22 20:28:05 +02:00
Dan DitomasoandGitHub 01f242b7c3 Merge pull request #577 from philon-/fix/495
Fix #495 - Rescale traceroute SNR
2025-04-22 14:09:45 -04:00
Jeremy Gallant d5cf71c840 Add filters to node map 2025-04-22 19:04:42 +02:00
Jeremy Gallant 5ba70d9764 Fix #495 - Rescale traceroute SNR 2025-04-19 22:14:03 +02:00
Dan DitomasoandGitHub 673476d773 Merge pull request #573 from danditomaso/feat/add-copy-text-to-input
Add Copy to Clipboard option for input fields.
2025-04-13 17:09:40 -04:00
Dan DitomasoandGitHub 5eb9fda015 Merge pull request #574 from danditomaso/issue-557-transparent-background
fix: removed transparent toast background
2025-04-13 11:39:28 -04:00
Dan Ditomaso 81586caea0 fix: removed transparent toast background 2025-04-13 08:07:17 -04:00
Dan Ditomaso a195126df1 fixed when grid collapose's to single column 2025-04-12 22:05:42 -04:00
Dan Ditomaso b3783bab40 added longer field length 2025-04-12 21:59:58 -04:00
Dan DitomasoandGitHub 33d0f93e68 Merge branch 'master' into feat/add-copy-text-to-input 2025-04-12 21:36:11 -04:00
Dan Ditomaso 2050b05d6a feat: add copy text option to input fields. 2025-04-12 21:11:52 -04:00
Dan DitomasoandGitHub 38754b9d1a Merge pull request #572 from danditomaso/fix/improve-responsiveness
Improve form responsiveness
2025-04-12 20:26:44 -04:00
Dan Ditomaso 1867484032 fix: improve-responsiveness 2025-04-12 12:46:01 -04:00
Dan DitomasoandGitHub b52ed19649 Merge pull request #571 from danditomaso/fix/improve-refresh-keys-dialog
fix: improvements to refresh dialog
2025-04-10 23:09:41 -04:00
Dan Ditomaso d53ababf7d fix: improvements to refresh dialog 2025-04-10 16:51:29 -04:00
Hunter ThornsberryandGitHub ff43763721 Merge pull request #568 from Hunter275/clock-settings 2025-04-10 13:30:52 -04:00
Hunter ThornsberryandGitHub c44d7633f2 Merge pull request #570 from danditomaso/fix/minus-node-num 2025-04-10 13:30:09 -04:00
Dan Ditomaso 08d641eb42 fix: ensured node number on loading screen cant be negitive. 2025-04-10 12:19:15 -04:00
Hunter275 a243a044b9 add use12hClock support 2025-04-10 01:48:32 -04:00
Dan DitomasoandGitHub c95a819eaf Merge pull request #566 from danditomaso/issue-564-multiple-connect-clicks-on-connect-dialog
Multiple clicks on "Connect" button, creates multiple nodes.
2025-04-08 08:20:36 -04:00
Dan Ditomaso ce5ae675ea fix: hoisted state to parent in order to coordinate connection 2025-04-07 20:27:51 -04:00
Dan DitomasoandGitHub 0828618c0d Merge pull request #563 from danditomaso/issue-550-incorrect-text-in-dialog
Incorrect text in PKI dialog
2025-04-07 20:19:33 -04:00
Dan Ditomaso 7267101021 fix: extended dialog to allow for dynamic title/description 2025-04-07 15:02:12 -04:00
Dan Ditomaso 0e868cef58 renamed dialog, added reactions menu 2025-04-07 11:42:15 -04:00
Dan DitomasoandGitHub e410ccb2f4 Merge pull request #562 from danditomaso/fix/missing-import
fix: added missing imports
2025-04-05 13:01:19 -04:00
Dan Ditomaso c5b3f2ece6 fix: added missing imports 2025-04-05 12:57:42 -04:00
Dan DitomasoandGitHub 35353c58cb Merge pull request #561 from danditomaso/fix/failing-test
fix: refactor to fix merge issues with  messageStore and unread counts
2025-04-05 11:49:11 -04:00
Dan Ditomaso e80d8e73ae fix: refactor to fix merge issues with messageStore and unread counts 2025-04-05 11:46:32 -04:00
Dan DitomasoandGitHub 494a35a0c3 Merge pull request #497 from Hunter275/unread-counts
Unread Counts
2025-04-05 08:40:54 -04:00
Dan DitomasoandGitHub 818bbb4a30 fix broken test 2025-04-05 08:39:27 -04:00
Dan DitomasoandGitHub 4755c0eeb9 refactor to integrate messageStore and unreadCounts 2025-04-04 22:22:35 -04:00
Dan DitomasoandGitHub c8c89fdc95 Merge branch 'master' into unread-counts 2025-04-04 08:58:13 -04:00
Dan DitomasoandGitHub 52e0924f1c Merge pull request #560 from danditomaso/fix/node-detail-use-message-store
fix: update node details page to use message store
2025-04-03 22:42:48 -04:00
Dan Ditomaso 645c758b42 fixed: removed unneeded prop 2025-04-03 22:41:10 -04:00
Dan Ditomaso 4dc7788981 fixed typo 2025-04-03 22:40:30 -04:00
Dan Ditomaso 9fa945a863 fix: update node details page to use message store 2025-04-03 22:37:50 -04:00
Dan DitomasoandGitHub 38b8695441 Merge pull request #536 from danditomaso/add-message-persistance
Add message persistence using IndexedDB
2025-04-03 22:28:25 -04:00
Dan Ditomaso eadadb5d1d keyed conversations against from/to, updated tests 2025-04-03 17:03:08 -04:00
Dan DitomasoandGitHub 5f424e2e0b Merge branch 'master' into add-message-persistance 2025-04-02 18:02:57 -04:00
James ThomasandDan Ditomaso d807cd2de7 Using existing Link component and standardizing colors 2025-04-02 18:00:44 -04:00
James ThomasandDan Ditomaso 0b4e3a8da9 Cleanup and add link to official docs 2025-04-02 18:00:44 -04:00
James ThomasandDan Ditomaso 31be5e9a25 Adding connection failure warning 2025-04-02 18:00:44 -04:00
vidplace7andDan Ditomaso 367538eeea GHA: Attach build.tar to release 2025-04-02 18:00:33 -04:00
Dan Ditomaso 442c1cb5f1 fix: moved meshtastic packages into package.json 2025-04-02 18:00:33 -04:00
Dan Ditomaso a333e4524f updated deps 2025-04-02 18:00:12 -04:00
Hunter275andDan Ditomaso 1e54f7d99b fix for non-Primary channels 2025-04-02 17:59:59 -04:00
Dan Ditomaso 9f2aa8282d adding tests 2025-04-02 17:59:59 -04:00
Dan Ditomaso 8d5dc440d0 feat: add udp over mesh toggle 2025-04-02 17:59:59 -04:00
Dan Ditomaso 8fffde0165 wip 2025-04-02 17:59:59 -04:00
James ThomasandDan Ditomaso 1a6e99971a Extended loading 2025-04-02 17:58:40 -04:00
Dan Ditomaso 4de88c3add fixed: import issue 2025-04-02 17:58:40 -04:00
Dan Ditomaso 76374893e3 added tests 2025-04-02 17:58:40 -04:00
Dan Ditomaso edc17b304a feat: added reboot to OTA in command menu 2025-04-02 17:58:40 -04:00
Dan Ditomaso ec7b4528f6 added reboot to command menu 2025-04-02 17:58:30 -04:00
Dan Ditomaso 8d75c4afb1 fix: docker build process 2025-04-02 17:58:30 -04:00
James ThomasandDan Ditomaso b30fbf90b9 Prevent tooltip from appearing by default 2025-04-02 17:58:30 -04:00
James ThomasandDan Ditomaso 8fb95e1b06 Lint 2025-04-02 17:58:30 -04:00
James ThomasandDan Ditomaso f5e1a0569f Lint 2025-04-02 17:58:30 -04:00
James ThomasandDan Ditomaso 929f87b411 Adding DM from Map function 2025-04-02 17:58:30 -04:00
Dan Ditomaso 59d97008f2 feat: added tzdef to device config 2025-04-02 17:58:30 -04:00
Dan DitomasoandGitHub 540b8ebb4d Merge pull request #548 from James9074/tls-warning
Adding UX Feedback For Failed Device Connections Over HTTP/s
2025-04-02 13:12:39 -04:00
Dan DitomasoandGitHub 109d4afce2 Merge pull request #556 from vidplace7/release-buildtar
GHA: Attach build.tar to release
2025-04-02 10:09:17 -04:00
vidplace7 aab8bce78e GHA: Attach build.tar to release 2025-04-02 09:18:20 -04:00
James ThomasandGitHub d2c33b4caf Merge branch 'meshtastic:master' into tls-warning 2025-04-02 08:32:23 -04:00
Dan DitomasoandGitHub 633b99d6b2 Merge pull request #554 from danditomaso/fix-pkg-import-issue
fix: moved meshtastic packages into package.json
2025-04-01 20:48:17 -04:00
Dan Ditomaso 87159b4eee fix: moved meshtastic packages into package.json 2025-04-01 20:45:36 -04:00
Dan DitomasoandGitHub 6d39ecc7b9 Merge pull request #553 from danditomaso/update-deps-to-latest
updated deps to latest
2025-04-01 16:51:29 -04:00
Dan Ditomaso 7738661b7c updated deps 2025-04-01 16:50:39 -04:00
Dan Ditomaso 6443544a6b added dialog to warn before clearing all messages 2025-04-01 14:50:41 -04:00
Dan DitomasoandGitHub 4689ebe3ce Merge pull request #551 from Hunter275/position-precision-v2
Fix Position Precision for non-Primary channels
2025-04-01 11:19:33 -04:00
Hunter275 6cd8ce5102 fix for non-Primary channels 2025-03-31 23:14:20 -04:00
Dan Ditomaso a56ac84186 add enums, improve tests, add styling 2025-03-31 21:28:58 -04:00
James ThomasandGitHub 443a9ea101 Merge branch 'meshtastic:master' into tls-warning 2025-03-31 09:29:45 -04:00
James Thomas 0faafe8bc4 Using existing Link component and standardizing colors 2025-03-30 21:43:25 -04:00
James Thomas 9948701127 Cleanup and add link to official docs 2025-03-30 21:01:25 -04:00
James Thomas ffae92d233 Adding connection failure warning 2025-03-30 20:52:04 -04:00
Dan DitomasoandGitHub fed65d9c8b Merge pull request #547 from danditomaso/issue-523-add-udp-toggle
feat: Add udp over mesh toggle
2025-03-30 20:13:03 -04:00
Dan DitomasoandGitHub 8f225f4d28 Merge pull request #544 from James9074/loading-device
Cleaner Device Loading UX
2025-03-30 17:26:10 -04:00
Dan DitomasoandGitHub 11e820d1d0 Merge pull request #543 from danditomaso/issue-542-add-reboot-to-command-menu
added reboot to command menu
2025-03-30 17:25:30 -04:00
Dan Ditomaso 95fc72173f adding tests 2025-03-29 22:59:46 -04:00
Dan Ditomaso 03b5c639fb feat: add udp over mesh toggle 2025-03-29 22:19:53 -04:00
Dan DitomasoandGitHub 4d30558aca Merge pull request #546 from danditomaso/issue-545-nightly-docker-not-starting
Fixed Docker Builds Not Serving Site on 8080
2025-03-29 17:02:06 -04:00
Dan DitomasoandGitHub 7f376186b4 Merge pull request #540 from James9074/dm-from-map
Allow users to DM nodes directly from the map
2025-03-29 16:00:56 -04:00
Dan Ditomaso 0de24c41ed fix: docker build process 2025-03-29 15:54:15 -04:00
James Thomas 88c4f84edb Extended loading 2025-03-28 22:49:21 -04:00
Dan Ditomaso 74db087d7d updated node details with new messaging features. 2025-03-28 21:22:10 -04:00
e00239562c Update src/components/PageComponents/Config/Position.tsx
Co-authored-by: James Thomas <james9074@gmail.com>
2025-03-28 21:14:42 -04:00
Dan Ditomaso bf9557040f fixed: import issue 2025-03-28 21:12:13 -04:00
Dan Ditomaso 6d9a44a0e3 added tests 2025-03-28 21:11:01 -04:00
Dan Ditomaso 35aabdc900 feat: added reboot to OTA in command menu 2025-03-28 21:06:37 -04:00
Dan DitomasoandGitHub 163502156d Merge pull request #541 from danditomaso/add-tzdef
feat: added tzdef to device config
2025-03-28 14:27:12 -04:00
Dan Ditomaso 8baa5d84b9 added reboot to command menu 2025-03-28 12:12:56 -04:00
Dan Ditomaso c55fdbd982 wip 2025-03-28 11:45:48 -04:00
James Thomas 8da38ab2e4 Prevent tooltip from appearing by default 2025-03-28 09:57:35 -04:00
Dan Ditomaso dddb781627 feat: added tzdef to device config 2025-03-27 20:50:27 -04:00
James Thomas 77b3a7ac85 Lint 2025-03-27 17:35:18 -04:00
James Thomas 626970865f Lint 2025-03-27 17:34:42 -04:00
James Thomas c0308532a1 Adding DM from Map function 2025-03-27 17:21:40 -04:00
Dan DitomasoandGitHub 8df67bf76a Merge branch 'master' into add-message-persistance 2025-03-26 16:09:12 -04:00
Dan Ditomaso 80d4670204 state store cleanup, added tests 2025-03-26 15:22:14 -04:00
Dan DitomasoandGitHub a378cce0be Merge pull request #538 from danditomaso/issue-537-position-flags-undefined
fix: ensured undefined position flags are handled
2025-03-26 13:08:55 -04:00
Dan Ditomaso 488fd61558 fix: ensured undefined position flags are handled 2025-03-25 15:49:44 -04:00
Dan Ditomaso ed2ab36ed4 feat: added message persistance 2025-03-25 15:23:24 -04:00
Dan Ditomaso 0d6c5878fc WIP 2025-03-24 15:37:51 -04:00
Dan DitomasoandGitHub dcbfb08f26 Merge pull request #528 from danditomaso/add-dismiss-to-key-reminder
Refactor useBackupReminder hook
2025-03-23 22:20:57 -04:00
Hunter275 dab76df131 reorder tests so they don't step on each other 2025-03-21 23:43:57 -04:00
Dan Ditomaso a7a448cbcd refactor: improved how reminder expiry dates are handled. 2025-03-21 23:34:20 -04:00
Dan Ditomaso 1780c6fb2a refactor: updated how expiry dates are handled. 2025-03-21 22:39:40 -04:00
Hunter ThornsberryandGitHub 2d54df7dba Merge pull request #532 from Hunter275/node-count-off-by-one
Subtract one from node count
2025-03-21 14:39:24 -04:00
Hunter Thornsberry 890674eea3 subtract one from node count 2025-03-21 14:26:19 -04:00
Hunter Thornsberry d1c19d9d3e add hasNodeError for tests 2025-03-21 14:20:27 -04:00
Hunter ThornsberryandGitHub 11b052e5bb Merge branch 'master' into unread-counts 2025-03-21 10:36:09 -04:00
Dan DitomasoandGitHub 93a70dfd47 Merge pull request #529 from danditomaso/feat/update-readme
Updated repo readme
2025-03-21 07:53:24 -04:00
Dan DitomasoandGitHub 6ac8646323 Merge pull request #500 from Hunter275/browser-feature-rework
Update style and wording of browser support for connection types
2025-03-20 21:40:12 -04:00
Dan DitomasoandGitHub a215da1ebe Merge pull request #526 from bkimmel/bkimmel/reorder-nodes-columns
reorder columns in Nodes page
2025-03-20 16:54:51 -04:00
Dan Ditomaso 22dbfbcc09 feat: added never remind me to key reminder. 2025-03-20 14:40:15 -04:00
Dan Ditomaso 6341d564d3 feat: update readme with domain changes 2025-03-20 12:06:21 -04:00
bkimmel 28cc7b9800 reorder columns in Nodes page 2025-03-19 17:50:20 -04:00
Dan DitomasoandGitHub 5a142e671d Merge pull request #525 from danditomaso/fix/remove-react-scan
Revert: Remove react scan
2025-03-19 14:55:33 -04:00
Dan Ditomaso ba3d45584d adding lock file 2025-03-19 13:52:25 -04:00
Dan Ditomaso f54c0dd836 fix: removed react-scan due to issues with bluetooth 2025-03-19 13:46:56 -04:00
Dan DitomasoandGitHub a6427a9ed1 Merge pull request #520 from bkimmel/bkimmel/labels-on-icons
add a label to theme icon
2025-03-19 13:26:40 -04:00
Dan DitomasoandGitHub 11058dbf3b Merge pull request #516 from danditomaso/feat/add-key-mismatch-error-handling
feat: add error handling for key mismatch
2025-03-19 12:42:38 -04:00
Dan DitomasoandGitHub d062c2f1ab Merge pull request #522 from danditomaso/fix-node-details-styling
fix: styling issues in NodeDialog & TraceRoute components
2025-03-19 08:11:08 -04:00
bkimmel 1f109d161f deno format 2025-03-18 23:28:44 -04:00
bkimmel f2d6daa9fc safety coalesce 2025-03-18 22:57:22 -04:00
bkimmel 9634e1ce39 PR Feedback: h/t Dan & Hunter 2025-03-18 22:52:58 -04:00
Dan Ditomaso 64055a5aeb fixed spacing and updated wording on dialog 2025-03-18 22:09:20 -04:00
Dan Ditomaso ad366e6bab added additional routing packet error handler 2025-03-18 19:44:09 -04:00
Dan Ditomaso 9399104914 fix: resolved issues with styling 2025-03-18 15:21:58 -04:00
bkimmel f82bc660b0 add a label to theme icon 2025-03-18 00:06:38 -04:00
Dan DitomasoandGitHub ed13af2382 Merge pull request #514 from bkimmel/bkimmel/nodespage-fixes-1
small-scale Nodes page fixes
2025-03-17 22:49:53 -04:00
bkimmel e4c2952e49 dark mode adjustments 2025-03-17 18:15:43 -04:00
Dan DitomasoandGitHub 0830eb9971 Merge pull request #518 from danditomaso/issue-515-add-node-count
feat: added node count to sidebar
2025-03-17 17:10:06 -04:00
Dan Ditomaso be9b61ec0c feat: added node count to sidebar 2025-03-17 13:20:21 -04:00
Hunter ThornsberryandGitHub be0fe08f2f Merge pull request #513 from Hunter275/position-precision-fix
Position Precision Rework
2025-03-16 23:06:55 -04:00
Dan Ditomaso 3f8d3389d5 feat: add error handling for key mismatch 2025-03-16 22:56:58 -04:00
Hunter Thornsberry 7e1ba42873 remove defined css class and just use tailwind 2025-03-16 19:45:27 -04:00
Hunter Thornsberry 20af1b4d34 change submit to be outlined 2025-03-16 19:35:26 -04:00
bkimmel 207061e9d8 small-scale Nodes page fixes 2025-03-16 09:41:50 -04:00
Hunter ThornsberryandGitHub 6633fc9c55 Merge branch 'master' into position-precision-fix 2025-03-16 01:34:57 -04:00
Hunter275 52b80613f8 position precision rework 2025-03-16 01:33:05 -04:00
Hunter Thornsberry 0bef82ec32 don't update unred if the channel/dm is active 2025-03-14 15:44:02 -04:00
Hunter Thornsberry f80bb6c42d DM vs Channel message detection 2025-03-14 15:28:45 -04:00
Hunter275 db2cb8cb42 update style and wording of browser support for connection types 2025-03-13 01:29:03 -04:00
Dan DitomasoandGitHub c320d7d173 Merge pull request #499 from Hunter275/position_precision_stop_gap
Stop Gap: Remove Position Precision
2025-03-12 23:42:44 -04:00
Hunter Thornsberry db50bb5c1b stop gap for channel position precision until fix is worked out 2025-03-12 22:32:01 -04:00
Hunter ThornsberryandGitHub 01a74829fc Merge branch 'master' into unread-counts 2025-03-11 16:25:58 -04:00
Hunter Thornsberry 7b77b7f5e9 remove test values 2025-03-11 16:21:44 -04:00
Hunter Thornsberry ce8fcd2269 simplify device list and tests 2025-03-11 16:20:22 -04:00
Hunter Thornsberry f6f64eca10 tests 2025-03-10 23:33:39 -04:00
Dan DitomasoandGitHub 3240ac57f7 Merge pull request #492 from bkimmel/issue459/direct_nodes
Fix: issue 459 / sort direct nodes
2025-03-10 21:57:08 -04:00
Dan DitomasoandGitHub 2008b09ca3 Merge pull request #494 from danditomaso/issue-486-are-you-sure-dialog
Issue 486 are you sure dialog
2025-03-10 21:06:30 -04:00
Dan Ditomaso 491f72b426 fix for broken test 2025-03-10 21:00:01 -04:00
Dan Ditomaso a6f46bd38a commit lock 2025-03-10 20:56:32 -04:00
Hunter275 c103d7012b tests 2025-03-10 20:54:42 -04:00
Dan Ditomaso 2cebb8eee2 refactor: added close button back to dialog 2025-03-10 20:53:09 -04:00
Dan Ditomaso 33ad9f989c fix: fixed vitest file after merge conflict 2025-03-10 20:46:46 -04:00
bkimmel c590ab2ff5 Fix: issue 459 / sort direct nodes 2025-03-10 20:31:52 -04:00
Dan DitomasoandGitHub 9da949d27a Merge branch 'master' into issue-486-are-you-sure-dialog 2025-03-10 20:31:33 -04:00
Dan Ditomaso f1a58f0434 refactor: fixed unsafe roles dialog and hook logic, added tests 2025-03-10 20:30:04 -04:00
Dan DitomasoandGitHub 0296b241e4 Merge pull request #487 from danditomaso/issue-455-cant-scroll-up-in-chat
fix: resolved issue with being unable to scroll up in the input field
2025-03-10 15:11:15 -04:00
Dan Ditomaso 344ad48858 fix: improved style of the message input field 2025-03-10 09:26:01 -04:00
Dan Ditomaso 97f2abb582 fix: added tests to branch 2025-03-09 12:57:51 -04:00
Dan Ditomaso eca5d780c1 feat: added are you sure dialog 2025-03-09 12:57:37 -04:00
Hunter275 1f1a3c5de8 spread on the map 2025-03-09 00:57:52 -05:00
Dan Ditomaso 844a6316f6 fix: remove unneeded role 2025-03-08 21:15:34 -05:00
Dan DitomasoandGitHub d39c5ed079 Merge pull request #490 from danditomaso/issue-489-bluetooth-uuid-not-set
fix: restored correct BLE service uuid to BLE devices filter
2025-03-08 21:01:22 -05:00
Dan Ditomaso 09bb0bc43a fix: added ble header to vercel config 2025-03-08 16:28:20 -05:00
Dan Ditomaso 266e27bfe9 fix: added BLE uuid back to BLE connection component 2025-03-08 16:26:26 -05:00
Dan Ditomaso 5b11131e08 fix: remove unneeded role 2025-03-08 12:19:26 -05:00
Hunter Thornsberry 3bfd96defe wip 2025-03-07 23:59:52 -05:00
Hunter275 cad590f993 wip 2025-03-07 22:01:34 -05:00
Dan Ditomaso d70b14b12b fix: failing tests 2025-03-06 16:09:22 -05:00
Dan Ditomaso c115ac0749 fix: improved hover state for message input button 2025-03-06 14:39:09 -05:00
Dan Ditomaso d54a612e0b fix: restore aliased paths to vite config 2025-03-06 14:28:07 -05:00
Dan Ditomaso d379769672 fix: resolved issue with being unable to scroll up in the input field 2025-03-06 14:09:47 -05:00
Dan DitomasoandGitHub b670ffe407 Merge pull request #484 from varanauskas/patch-1
Update HTTP.test.tsx to ensure "https://" prefix is used if needed
2025-03-05 20:28:54 -05:00
Tadas VaranauskasandGitHub 4ffbe03b22 Update HTTP.test.tsx to ensure "https://" prefix is used if needed
Small test update to prevent regression of #481 

#482 fixed the issue, this new test would have failed before, and will prevent reoccurrence of the issue
2025-03-05 20:09:11 +02:00
Dan DitomasoandGitHub 6a438470cf Merge pull request #483 from danditomaso/fix/restore-window-to-http
fix: remove GlobalThis and use window instead
2025-03-05 10:53:52 -05:00
Dan Ditomaso 4d0d1da691 fix: remove GlobalThis and use window instead 2025-03-05 08:54:26 -05:00
Dan DitomasoandGitHub 39f26f475b Merge pull request #482 from danditomaso/issue-481-node-connecting-on-https
fix: update TLS setting if URL is using HTTPS

Fixes #481
2025-03-05 08:30:18 -05:00
Dan Ditomaso 35fed173af fix: update TLS setting if URL is using HTTPS 2025-03-05 08:14:59 -05:00
Dan DitomasoandGitHub a8b0515949 Merge pull request #480 from danditomaso/issue-479-node-connecting-on-https
fix: restored https toggle functionality. added tests
2025-03-04 14:38:29 -05:00
Dan Ditomaso bd9d599934 fix: if url is already https, toggle should be checked 2025-03-04 14:10:46 -05:00
Dan Ditomaso b40079cdc9 fix: restored https toggle functionality. added tests 2025-03-04 13:43:02 -05:00
Dan DitomasoandGitHub b1cf4ef645 Merge pull request #477 from danditomaso/refactor/use-deno
Switch from Bun to Deno for dev environment
2025-03-03 20:56:00 -05:00
Dan DitomasoandGitHub 237c7bec3e Merge branch 'master' into refactor/use-deno 2025-03-03 20:55:16 -05:00
Dan Ditomaso 75596e7153 chore: fixes from deno linting/formatting 2025-03-03 20:42:46 -05:00
Hunter275andDan Ditomaso 7968994090 fix for 'never' as well 2025-03-03 20:33:23 -05:00
Hunter275andDan Ditomaso 7c84a582ba fix padding on last heard 2025-03-03 20:33:23 -05:00
Hunter275andDan Ditomaso 9ad6c049f2 fix nodes page error, more cleanup is probably required for "undefined" hops away 2025-03-03 20:33:14 -05:00
Dan Ditomaso 04ecdd55fe fix overflow issue with stack trace 2025-03-03 20:33:05 -05:00
Dan Ditomaso dbad25814c Reduced code duplication of ErrorBoundary, wrapped PageLayout with ErrorBoundary. 2025-03-03 20:33:05 -05:00
Dan Ditomaso 5af5364668 feat: add chirpy to error page 2025-03-03 20:32:56 -05:00
Dan Ditomaso d28b4ce6d9 feat: add error boundary 2025-03-03 20:32:47 -05:00
Dan Ditomaso f9066eced0 fix: added a notes fild to Dynamic form allowing for notes to inform users about using BLE and wifi at the same time. (#474) 2025-03-03 20:32:01 -05:00
Hunter ThornsberryandGitHub a60db5521d Merge pull request #478 from Hunter275/fix-nodes-page
Fix Nodes page
2025-03-03 09:39:47 -05:00
Hunter275 e1d4490d62 fix for 'never' as well 2025-03-02 22:44:59 -05:00
Hunter275 cc24605cdb fix padding on last heard 2025-03-02 22:42:55 -05:00
Hunter275 2647604798 fix nodes page error, more cleanup is probably required for "undefined" hops away 2025-03-02 22:22:02 -05:00
Hunter ThornsberryandGitHub 6e3d326abb Merge pull request #458 from danditomaso/feat/add-error-boundary
feat: add error boundary
2025-03-02 22:12:17 -05:00
Dan Ditomaso fc713f55fe fix: update package json scripts commands 2025-03-02 15:54:30 -05:00
Dan Ditomaso 81a1e0e550 fix: update process.env to import.meta 2025-03-02 15:23:57 -05:00
Dan Ditomaso 88587f358d refactor: move tsconfig into deno.json 2025-03-02 15:23:22 -05:00
Dan Ditomaso 99a66bfdc7 chore: updated readme 2025-03-02 14:52:46 -05:00
Dan Ditomaso 50eb2a827f chore: fixes from deno linting/formatting 2025-03-02 14:46:02 -05:00
Dan Ditomaso db08542b39 refactor: switch to deno 2025-03-02 14:25:29 -05:00
Dan DitomasoandGitHub cbcbafc4a3 fix: added a notes fild to Dynamic form allowing for notes to inform users about using BLE and wifi at the same time. (#474) 2025-03-02 14:43:07 +08:00
Tilen KomelandGitHub 7e66dc7cac Merge pull request #476 from meshtastic/chore/removal-of-mapbox
Chore: Removal of mapbox-gl
2025-03-01 22:52:13 +01:00
Tilen Komel 62fa8df8d2 bun remove mapbox-gl 2025-03-01 22:08:37 +01:00
Dan DitomasoandGitHub b888d8f4cf Merge branch 'master' into feat/add-error-boundary 2025-03-01 09:09:57 -05:00
Sacha Weatherstone e224a4ebdf migrate to new transport-http 2025-03-01 16:12:56 +08:00
Sacha Weatherstone 977b5647f6 format 2025-03-01 14:14:21 +08:00
Sacha Weatherstone 5a62b67e79 use new packages for imports & new webserial transport 2025-03-01 14:00:06 +08:00
Sacha Weatherstone f31ac24707 fix formatting 2025-03-01 13:34:05 +08:00
Sacha Weatherstone a5589e232b update dependencies 2025-03-01 13:33:35 +08:00
Hunter ThornsberryandGitHub f65f750b7f Merge pull request #475 from danditomaso/issue-473-label-inputs-not-connected
fix: connected labels to inputs, improving accessibility and testability
2025-02-28 21:38:46 -05:00
Dan Ditomaso fa85e83817 fix: connected labels to inputs, improving accessibility and testability 2025-02-28 14:59:17 -05:00
Dan DitomasoandGitHub d978978677 Merge branch 'master' into feat/add-error-boundary 2025-02-28 09:05:03 -05:00
Dan DitomasoandGitHub 593c08f3e0 Merge pull request #469 from danditomaso/feat/add-react-scan-debugging
feat: add react scan debugging
2025-02-26 21:15:33 -05:00
Dan DitomasoandGitHub 801f8f38d2 Merge branch 'master' into feat/add-react-scan-debugging 2025-02-26 21:10:02 -05:00
Dan DitomasoandGitHub 8be849d982 Merge pull request #468 from danditomaso/issue-182-pwa-funcionality
feat: add PWA functionality to vite
2025-02-26 20:51:30 -05:00
Dan Ditomaso 8bfa58540b updated readme to discuss react scan 2025-02-26 20:47:47 -05:00
Dan Ditomaso 4a6eb0d3f8 feat: add react scan debugging 2025-02-26 14:24:56 -05:00
Dan Ditomaso 5c6ba38655 updated readme for pwa changes 2025-02-26 09:33:10 -05:00
Dan Ditomaso 5831967603 feat: added pwa functionality to vite 2025-02-26 09:27:08 -05:00
Dan DitomasoandGitHub fe2360baf6 Merge pull request #466 from danditomaso/fix/tailwind-4-styling-updates
dark mode styling updates
2025-02-25 20:01:53 -05:00
Dan DitomasoandGitHub 3db2ede9d6 Merge pull request #462 from danditomaso/feat/add-support-for-unit-testing
feat: adding unit/ui testing support
2025-02-25 20:01:37 -05:00
Dan DitomasoandGitHub 25cd448d69 Merge pull request #460 from danditomaso/issue-389-admin-key-not-taking
fix: admin key can be saved/restored inside of web ui.
2025-02-25 20:01:22 -05:00
Tilen KomelandGitHub c6bb11ccc8 Merge pull request #467 from KomelT/fix/issue-465
Fix/issue 465
2025-02-25 21:44:41 +01:00
Dan Ditomaso d8bf2f7d8e fix: updates to overall site styling in dark mode 2025-02-25 15:42:14 -05:00
Tilen Komel 079e60677e Biome 2025-02-25 20:55:15 +01:00
Tilen Komel 379ac46ec8 Add fix 2025-02-25 20:54:53 +01:00
Dan Ditomaso f4417f984b fixed unsafe array access in component 2025-02-25 11:53:32 -05:00
Dan Ditomaso 9f8d88bb4e fix overflow issue with stack trace 2025-02-25 11:47:51 -05:00
Dan Ditomaso cf4c3c1376 fixed unsafe array access in component 2025-02-25 09:40:59 -05:00
Dan Ditomaso c39ef5916f running tests in CI/CD pipeline 2025-02-25 08:00:40 -05:00
Tilen KomelandGitHub edee3571be Merge pull request #464 from meshtastic/fix-readme-update
Update README.md
2025-02-25 13:48:08 +01:00
Tilen KomelandGitHub d039f7fd79 Fix readme warning section 2025-02-25 13:37:36 +01:00
Tilen KomelandGitHub 34abbcb467 Update README.md 2025-02-25 13:22:13 +01:00
Dan DitomasoandGitHub 1d93e358ed Merge pull request #461 from danditomaso/fix/improve-github-issue-templates
fix: improved github feature request and bug templates
2025-02-24 19:42:40 -05:00
Dan DitomasoandGitHub b4ada0449c Merge pull request #463 from meshtastic/revert-436-feat-add-formatting-github-action
Revert "feat: apply formatting as github action"
2025-02-24 15:17:16 -05:00
Dan DitomasoandGitHub 4490d178d0 Revert "feat: apply formatting as github action" 2025-02-24 15:14:57 -05:00
Dan Ditomaso c9536c9ffd added some tests to utils folder 2025-02-24 12:39:25 -05:00
Dan Ditomaso 14e9bd304a feat: adding unit/ui testing support 2025-02-24 11:46:35 -05:00
Dan Ditomaso 5df409475e feat: adding unit/ui testing support 2025-02-24 11:45:34 -05:00
Dan Ditomaso 7427623c6e feat: added PR template 2025-02-24 11:25:14 -05:00
Dan Ditomaso 16d04bb878 fix: improved github feature request and bug templates 2025-02-24 10:05:58 -05:00
Dan Ditomaso 9eda22b5db Reduced code duplication of ErrorBoundary, wrapped PageLayout with ErrorBoundary. 2025-02-24 09:38:49 -05:00
Dan Ditomaso ebf64b5bcb fix: admin key can be saved/restored inside of web ui. 2025-02-23 22:17:08 -05:00
Dan Ditomaso fb2a057c05 feat: add chirpy to error page 2025-02-22 15:14:44 -05:00
Dan Ditomaso 635d0673bf feat: add error boundary 2025-02-22 13:51:50 -05:00
Hunter ThornsberryandGitHub 864f8075d9 Merge pull request #454 from danditomaso/feat/add-nightly-gh-action 2025-02-22 11:42:49 -05:00
Dan Ditomaso 92a84af454 feat: added nightly github action. updated docs 2025-02-21 16:30:48 -05:00
Tilen KomelandGitHub 1560d1e18c Merge pull request #452 from danditomaso/fix/switch-pnpm-to-bun
fix: changed pnpm to bun
2025-02-21 18:50:11 +01:00
Dan Ditomaso bbb8384d66 fix: changed pnpm to bun 2025-02-21 12:39:46 -05:00
Dan DitomasoandGitHub b23e197178 Merge pull request #451 from meshtastic/revert-446-fix/update-lock-file-version
Revert "fix: update pnpm lock file version"
2025-02-21 12:24:16 -05:00
Dan DitomasoandGitHub ff6515269b Revert "fix: update pnpm lock file version" 2025-02-21 12:24:00 -05:00
Dan DitomasoandGitHub d6f2d3a73f Merge pull request #450 from meshtastic/revert-448-fix/try-bun-package-manager
Revert "fix: Try using bun package manager to fix lock files issues in vercel"
2025-02-21 12:23:30 -05:00
Dan DitomasoandGitHub 9b598aa3d7 Revert "fix: Try using bun package manager to fix lock files issues in vercel" 2025-02-21 12:23:00 -05:00
Dan DitomasoandGitHub 88e0c6deda Merge pull request #448 from danditomaso/fix/try-bun-package-manager
fix: Try using bun package manager to fix lock files issues in vercel
2025-02-21 08:20:44 -05:00
Dan Ditomaso 1f3ff3dc03 fix: try using bun package manager with vercel 2025-02-21 08:17:30 -05:00
Dan DitomasoandGitHub 9cb449aa31 Merge pull request #446 from danditomaso/fix/update-lock-file-version
fix: update pnpm lock file version
2025-02-20 22:07:58 -05:00
Dan Ditomaso 3afbc9a693 manually specify pnpm version in gh workflows 2025-02-20 22:06:06 -05:00
Dan Ditomaso 4ce84549c7 fix: update pnpm lock file version 2025-02-20 22:03:23 -05:00
Dan DitomasoandGitHub ac550d3b44 Merge pull request #445 from danditomaso/fix/switch-style-issue
fix: improve switch dark mode style, fixed merge conflict bug in HTTP component.
2025-02-20 21:23:13 -05:00
Dan Ditomaso c9dab8d83c fix: improved dark mode styles, fixed bug in http. 2025-02-20 21:21:33 -05:00
Dan DitomasoandGitHub 5e18c8d256 Merge pull request #417 from danditomaso/switch-rsbuild-to-vite
feat: switch to Vite 6.x
2025-02-20 21:02:30 -05:00
Dan DitomasoandGitHub 349a2bf855 Merge branch 'master' into switch-rsbuild-to-vite 2025-02-20 21:01:58 -05:00
Dan Ditomaso 3928d378f5 feat: updated app to tailwind 4.x 2025-02-20 20:54:19 -05:00
Dan Ditomaso 36d4f22007 feat: add required engines to package.json 2025-02-20 20:54:09 -05:00
Dan Ditomaso cbbe9be819 fix: validate bluetooth pin is 6 characters. 2025-02-20 20:52:08 -05:00
Dan Ditomaso ede6523678 feat: updated app to tailwind 4.x 2025-02-20 20:51:08 -05:00
Dan Ditomaso ce086ffa82 fix: fixing styling issues 2025-02-20 19:00:47 -05:00
Dan Ditomaso a1715ef686 feat: switch to vite 6.1 2025-02-20 15:59:00 -05:00
JustinandDan Ditomaso 2c8b206903 fixed tls switch for http connections 2025-02-20 15:57:54 -05:00
Dan Ditomaso 5938f91861 fix: validate bluetooth pin is 6 characters. 2025-02-20 15:57:38 -05:00
Dan Ditomaso b959a59e7b feat: updated app to tailwind 4.x 2025-02-20 15:56:51 -05:00
Dan Ditomaso 39c1176311 feat: add required engines to package.json 2025-02-20 15:40:08 -05:00
Dan DitomasoandGitHub a10230b412 Merge pull request #442 from justinforlenza/tls-switch-fix
fix: tls switch for http connections
2025-02-20 15:34:47 -05:00
Dan DitomasoandGitHub c9416a31a2 Merge pull request #444 from danditomaso/hotfix/remove-unneeded-import
fix: removed hook from device config
2025-02-20 14:12:36 -05:00
Dan Ditomaso f7fe56535d fix: removed hook from device config 2025-02-20 14:12:01 -05:00
Justin ec10b63d11 fixed tls switch for http connections 2025-02-20 18:09:48 +00:00
Dan DitomasoandGitHub a5131352c7 Merge pull request #441 from danditomaso/fix/refresh-lock-file
fix: refreshed lock file
2025-02-20 13:09:37 -05:00
Dan Ditomaso 9f0a794f22 fix: refreshed lock file 2025-02-20 13:09:03 -05:00
Dan DitomasoandGitHub 63ecb12fcf Merge pull request #432 from danditomaso/feat/update-tailwind
feat: update to tailwind 4.x
2025-02-20 13:03:53 -05:00
Dan DitomasoandGitHub 5a4774e9f3 Merge branch 'master' into feat/update-tailwind 2025-02-20 13:03:40 -05:00
Dan DitomasoandGitHub 35be1bee59 Merge pull request #439 from danditomaso/fix/validate-ble-pin
fix: Add 6-digit BLE PIN validation and error management
2025-02-19 22:45:10 -05:00
Dan Ditomaso a7a9ba0463 fix: validate bluetooth pin is 6 characters. 2025-02-19 22:29:42 -05:00
Tom FifieldandGitHub 0b7bdda4bf Merge branch 'master' into switch-rsbuild-to-vite 2025-02-20 08:40:29 +08:00
Tom FifieldandGitHub 2612997355 Merge pull request #436 from danditomaso/feat-add-formatting-github-action
feat: apply formatting as github action
2025-02-20 08:24:16 +08:00
Dan Ditomaso 84ca90ae97 fix: further action changes. 2025-02-19 11:47:07 -05:00
Dan Ditomaso 8c693f1956 fix: improve action to fix checkout issue 2025-02-19 11:44:36 -05:00
Dan Ditomaso 764328593d changed name of github action 2025-02-19 11:33:20 -05:00
Dan Ditomaso e9b6c2495c feat: apply biome formatting as github action 2025-02-19 11:28:23 -05:00
Hunter ThornsberryandGitHub f4bddefd33 Merge pull request #435 from danditomaso/fix/allow-building-without-formatting 2025-02-19 10:29:45 -05:00
Dan Ditomaso 033409351e fix: allow app to build without require formatting 2025-02-19 10:22:21 -05:00
Dan DitomasoandGitHub a6a66a7672 Merge pull request #434 from danditomaso/chore/fix-formatting-issue
chore: format http file
2025-02-19 10:13:50 -05:00
Dan DitomasoandGitHub 1f55d08adf Merge branch 'master' into chore/fix-formatting-issue 2025-02-19 10:13:12 -05:00
Dan Ditomaso 664fd1c2d0 chore: format file 2025-02-19 10:11:42 -05:00
Dan DitomasoandGitHub c9572af445 Merge branch 'master' into feat/update-tailwind 2025-02-19 09:24:08 -05:00
Dan DitomasoandGitHub 98edd30360 Merge pull request #250 from Hunter275/issue-249-cors
add ability to enable/disable HTTPS connections
2025-02-19 09:09:18 -05:00
Dan DitomasoandGitHub ab311bfa86 Merge branch 'master' into issue-249-cors 2025-02-19 09:07:08 -05:00
Dan Ditomaso f4d58a9ea9 feat: updated app to tailwind 4.x 2025-02-19 07:47:02 -05:00
Dan DitomasoandGitHub e769143e58 Merge pull request #430 from PhotoNomad0/bugfix-fixMapCrashHwModel
bugfix for Map crash
2025-02-18 13:03:14 -05:00
Dan DitomasoandGitHub 3c37899fe4 Merge pull request #307 from KomelT/feature/node-quick-options
[Feature request]: Nodes quick options
2025-02-18 13:02:08 -05:00
Tilen Komel 30d36789c1 Biome 2025-02-18 16:51:29 +01:00
Tilen Komel 971541a516 Merge branch 'master' into feature/node-quick-options 2025-02-18 16:50:56 +01:00
Dan DitomasoandGitHub ca9e7d5c73 Merge pull request #429 from skeemer/add-avatar-to-node-table
Add Avator to nodes table
2025-02-18 10:21:26 -05:00
PhotoNomad0 61529675ec fix for Map crash on unsupported hwModel in Node. 2025-02-18 07:17:29 -05:00
Leo Lutz 22887b4dd6 Add avator to nodes table 2025-02-17 23:36:21 -07:00
Dan DitomasoandGitHub c4383f4bd2 Merge pull request #423 from danditomaso/issue-407-text-style-messages
feat: added text style chat messages
2025-02-17 23:20:31 -05:00
Dan DitomasoandGitHub 0f0751e4d2 Merge pull request #409 from danditomaso/fix/map-zooms-on-click
Fixed map zooming when clicking on map marker. Fixed popup alignment to Map Marker
2025-02-17 23:20:13 -05:00
Dan DitomasoandGitHub 2a460dfdba Merge branch 'master' into issue-407-text-style-messages 2025-02-17 13:00:27 -05:00
Dan DitomasoandGitHub 2e42620d67 Merge pull request #426 from danditomaso/issue-425-toasts-in-light-mode
fix: fixed issue with toast background opacity in light mode
2025-02-16 20:05:50 -05:00
Dan Ditomaso 5cc24fd6ab fix: added border around markers 2025-02-14 11:41:06 -05:00
Dan Ditomaso 1c59d0451a fix: lighted border of outline button in dark mode 2025-02-14 11:30:28 -05:00
Dan Ditomaso 6d26996d65 fix: fixed issue with toast background opacity in light mode 2025-02-14 11:26:12 -05:00
Hunter ThornsberryandGitHub 5f2f929af8 Merge pull request #416 from danditomaso/issue-415-message-input-allows-empty-messages
fix: prevent empty/blank messages from being sent.
2025-02-13 23:25:27 -05:00
Hunter ThornsberryandGitHub e129b7b469 Merge pull request #411 from danditomaso/issue-399-wrong-measurement-unit-in-map
feat: adding pluralizer util. fix: measurement unit in marker popup
2025-02-13 23:22:56 -05:00
Dan Ditomaso c6f70a7b77 feat: added text style chat messages 2025-02-13 15:36:44 -05:00
Tom FifieldandGitHub f2a2e5ddf2 Merge pull request #285 from sgtwilko/patch-1
Use window.location.host so that websites run on non-standard ports i…
2025-02-12 08:48:17 +08:00
Dan DitomasoandGitHub b7f92388c5 fix: added dark modifer to message input (#414) 2025-02-11 21:03:20 +01:00
Dan Ditomaso 8105f89c55 feat: switch to vite 6.1 2025-02-10 13:31:33 -05:00
Dan Ditomaso 467effa62e fix: prevent empty/blank messages from being sent. fix: count chars during copy/paste action 2025-02-10 12:24:57 -05:00
Dan Ditomaso 2627b9035d feat: adding pluralizer util. fix: measurement unit in marker popup 2025-02-08 23:11:54 -05:00
Dan Ditomaso d9aff93993 fix: removed map zoom on marker click. feat: lined up popup with map marker 2025-02-08 21:49:17 -05:00
Dan Ditomaso 1fc72aa7be fix: keep existing zoom on map ndoe click 2025-02-08 08:32:29 -05:00
Hunter ThornsberryandGitHub b7067923c0 Merge pull request #394 from danditomaso/feat/add-multi-select
Feat: Add MultiSelect component
2025-02-07 23:42:35 -05:00
Hunter ThornsberryandGitHub ed3ae2622e Merge pull request #390 from danditomaso/fix/improve-styling-of-chat
fix: improve styling of messages
2025-02-07 23:34:43 -05:00
Hunter275 e3cc95cfd8 add missing maxBytes to MessageInput 2025-02-07 23:28:55 -05:00
Dan DitomasoandGitHub 9456495a3d Merge pull request #406 from danditomaso/feat--update-required-pnpm-version
fix: Updated required pnpm version to use latest 10.x version
2025-02-07 20:10:03 -05:00
Dan Ditomaso 53fe300fe9 fix: updating position flags to be more readable 2025-02-07 11:08:59 -05:00
Dan Ditomaso 76aea1a038 fix: updated required package manager to use latest vrsion 2025-02-07 10:45:40 -05:00
Dan Ditomaso 921f9b21a2 fix: added overflow scroll back to page layout 2025-02-07 10:39:23 -05:00
Dan DitomasoandGitHub d552dcd137 Merge branch 'master' into fix/improve-styling-of-chat 2025-02-07 10:25:15 -05:00
Tilen Komel 9505284e61 Merge remote-tracking branch 'origin/HEAD' into feature/node-quick-options 2025-02-06 07:33:48 +01:00
Tom FifieldandGitHub d53acf204c Merge pull request #405 from Hunter275/issue-402-message-length-limit
Limit the length of messages to 200 bytes
2025-02-06 08:23:26 +08:00
Tilen Komel 175e98a080 Add location respone dialog 2025-02-05 21:45:31 +01:00
Tilen Komel b8c1096568 Add short name row to nodes page 2025-02-05 21:06:55 +01:00
Hunter275 430e0cbd46 Limit the length of messages to 200 bytes 2025-02-04 23:30:39 -05:00
Tilen Komel c2a2e0ac19 Add direct message button 2025-02-04 22:52:14 +01:00
Tilen Komel 5a1c207ffc Remove useEffect 2025-02-04 21:50:11 +01:00
Dan Ditomaso 1c7b466e64 fix: styling fixes from code review 2025-02-04 14:46:46 -05:00
Hunter ThornsberryandGitHub 30158ca5c5 Merge pull request #401 from danditomaso/feat--add-formatting-linting-on-staging 2025-02-03 21:04:06 -05:00
Dan Ditomaso e896555694 added: added lint-staged so linting runs when a file is staged. 2025-02-03 20:35:31 -05:00
Dan Ditomaso 87ddaad966 fix: styling updates, chat conversation moved to bottom of chat window. 2025-02-03 20:28:01 -05:00
Dan Ditomaso 4736fa6b50 fix: increasing size of clickable area for navigation items 2025-02-03 16:06:24 -05:00
Tilen Komel 44b8dd308a Update tooltip 2025-02-03 21:23:08 +01:00
Dan Ditomaso a4e21ed343 feat: added hover tooltip on message status 2025-02-03 13:17:57 -05:00
Tilen Komel 48eb931c37 Add time toltip to timeAgo 2025-02-03 19:07:27 +01:00
Dan Ditomaso 794d214636 feat: removed traceroute from message screen. 2025-02-03 12:36:33 -05:00
Tilen Komel fb1b4c6cc5 Update according to change request 2025-02-03 18:27:22 +01:00
Tilen Komel 76de3e0e02 Biome 2025-02-03 17:19:27 +01:00
Thomas GöttgensandGitHub 3f49dc2595 Merge branch 'master' into feature/node-quick-options 2025-02-03 13:55:33 +01:00
Tilen Komel 28c5fd64fe Add overflow-x-scroll to Node details dialog raw metrics 2025-02-02 16:05:35 +01:00
Tilen Komel 9d9c46f732 Remove unused ariables from Nodes.tsx 2025-02-02 14:10:48 +01:00
Tilen Komel 358f8a94d0 Update timeAgo to use Intl.RelativeTimeFormat 2025-02-02 14:02:47 +01:00
Tilen Komel 0c8901b5b2 Make all raw data accordion in node details dialog 2025-02-02 12:58:35 +01:00
Tilen Komel 4abc78fff3 Add basic accordion element 2025-02-02 12:56:07 +01:00
Hunter ThornsberryandGitHub 095f1fde27 Merge pull request #349 from cmorg3/add_search_nodes
feat: Add search functionality for nodes in Messages and Nodes pages
2025-02-02 00:12:55 -05:00
Hunter ThornsberryandGitHub c2c7510dc4 Merge branch 'master' into add_search_nodes 2025-02-01 13:26:02 -05:00
Hunter ThornsberryandGitHub 1c70fb8606 Merge pull request #391 from dzienisz/map-key
fix: Map Action Buttons key
2025-02-01 13:17:10 -05:00
Dan Ditomaso 75d6817012 chore: linting fix 2025-01-31 16:17:59 -05:00
Dan Ditomaso 3d3b59686c feat: add multi select component. feat: add multi select to position flags section 2025-01-31 16:11:10 -05:00
Hunter ThornsberryandGitHub 963deeca75 Merge pull request #393 from danditomaso/fix/fix-tak-tracker-role-value
fix: update value for tak tracker device role
2025-01-30 16:02:07 -05:00
Dan Ditomaso 991405c7aa fix: update value for tak tracker device role 2025-01-30 14:21:24 -05:00
Kamil Dzieniszewski ce66e55196 fix: Map Action Buttons key 2025-01-30 19:53:04 +01:00
Tilen Komel 7142f0f8d5 Add dialog Node Details 2025-01-30 18:03:56 +01:00
Tilen Komel 8ac714a5b5 Update TimeAgo 2025-01-30 18:03:28 +01:00
Tilen Komel 97d206a9d4 Add Uptime.tsx 2025-01-30 15:25:54 +01:00
Tilen Komel fad6f72dd1 Add DeviceImage.tsx and hardware svgs 2025-01-30 15:17:05 +01:00
Tilen Komel 3f09e6de93 Remove timeago-react 2025-01-30 15:04:07 +01:00
Hunter ThornsberryandGitHub 547b86f98e Merge pull request #366 from kylewistrand/dashboard-node-links
feat: Make nodes on dashboard clickable
2025-01-29 23:51:42 -05:00
Hunter275 2bdfbedeea add dark mode classes and biome fixes 2025-01-29 23:50:38 -05:00
Hunter ThornsberryandGitHub 68da810a85 Merge pull request #387 from danditomaso/feat/add-build-analyze-script
feat: add bundle analyzer script
2025-01-29 23:23:17 -05:00
Dan Ditomaso d9ad044ecd fix: improve styling of messsges 2025-01-29 16:08:55 -05:00
Dan Ditomaso 5b7b770aee feat: add bundle analyzer script 2025-01-29 09:07:57 -05:00
Tilen Komel b3cde1bcd7 Move remove button to quick options 2025-01-29 13:56:48 +01:00
Tilen Komel 9eeed9630b Fix 2025-01-29 13:15:52 +01:00
Tilen Komel 617b452da5 Merge branch 'master' into feature/node-quick-options 2025-01-29 11:50:33 +01:00
Dan DitomasoandGitHub eb0ea4ea24 Merge branch 'master' into issue-249-cors 2025-01-28 21:32:34 -05:00
Hunter ThornsberryandGitHub c7e2baea1b Merge pull request #385 from danditomaso/fix/update-project-deps-to-latest
fix: update packages to latest version
2025-01-28 15:53:52 -05:00
Dan DitomasoandGitHub 172e0c70c8 Merge pull request #383 from danditomaso/feat/debounce-messages-input
Add debounce to message input field
2025-01-28 15:36:53 -05:00
Dan Ditomaso 9b843f6483 chore: update packages to latest version. feat: replace hashicon lib with vanilla component 2025-01-28 12:15:04 -05:00
Dan DitomasoandGitHub e405a91ba8 Merge branch 'master' into feat/debounce-messages-input 2025-01-27 13:01:34 -05:00
Dan Ditomaso cdc2554af6 fix: update lock file 2025-01-27 08:31:31 -05:00
Hunter ThornsberryandGitHub 2808b6f26a Merge pull request #384 from danditomaso/feat/force-format-lint-before-commit
Added simple-git-hooks to run linting/formatting script prior to commit
2025-01-25 22:47:58 -05:00
Hunter ThornsberryandGitHub 41ff10c653 Merge pull request #374 from tdhawk/fix-readme
update container port
2025-01-25 22:43:42 -05:00
Dan Ditomaso 4508428160 feat: add simple-git-hooks to run linting/formatting prior to commit 2025-01-25 21:49:37 -05:00
Dan Ditomaso f0dd426055 chore: linting 2025-01-25 21:24:43 -05:00
Dan Ditomaso d0ca24ae6f feat: debounce message draft state updates to reduce zustand/immer store writes on Messages page 2025-01-25 16:41:42 -05:00
Dan Ditomaso fe2b76eeb9 fix: moving tailwind libs to dev dependency, removed unused deps 2025-01-25 16:09:59 -05:00
Tilen Komel 2fbf2a1173 Fix show ?? if null 2025-01-24 12:26:28 +01:00
Tilen Komel c9377295db Merge branch 'master' into feature/node-quick-options 2025-01-24 12:18:10 +01:00
Tilen Komel 54c73a8c0d Add snr to traceroute 2025-01-24 12:15:57 +01:00
Hunter ThornsberryandGitHub 5d0f2e4403 Merge pull request #381 from KomelT/fix/biome
Fix Biome
2025-01-23 22:54:52 -05:00
Tilen Komel 47150c649f Add back pnpm check into build command 2025-01-24 01:50:41 +01:00
Tilen Komel 7930f44109 Try to fix old stuff 2025-01-24 01:42:01 +01:00
Tilen Komel ec6906a5c3 Fixes by hand 2025-01-24 01:27:33 +01:00
Tilen Komel 891a1a9503 pnpm check:fix 2025-01-24 01:26:15 +01:00
Tilen Komel 965e3247b0 Added 2way traceroute 2025-01-24 00:49:27 +01:00
Tilen Komel f24041651c Fix legacy import 2025-01-24 00:03:55 +01:00
Tilen Komel 3f88373dd8 Merge branch 'master' into feature/node-quick-options 2025-01-23 23:57:05 +01:00
Tilen Komel aa66e1f73c Biome 2025-01-23 23:45:24 +01:00
Hunter ThornsberryandGitHub cf79f3b07e Merge pull request #379 from KomelT/add-package-manager
Add packageManager in package.json
2025-01-23 16:25:58 -05:00
Tilen Komel 9493649a69 This works now 2025-01-23 14:02:21 +01:00
Tilen Komel c8cd5b0eaa Define package_json_file: package.json in CI 2025-01-23 13:49:44 +01:00
Tilen Komel c16b3a3ce0 Add version 2025-01-23 13:35:12 +01:00
Tilen Komel 2967a74480 Blank version 2025-01-23 13:33:13 +01:00
Tilen Komel ea648ca887 Just for joke without actions/checkout@v4 2025-01-23 13:30:16 +01:00
Tilen Komel 8d35b57d19 Add packageManager in package.json 2025-01-23 12:59:57 +01:00
Hunter ThornsberryandGitHub be9a07bc4b Merge pull request #360 from danditomaso/add_pki_backup_dialog
Add PKI backup dialog, add reminder toast to suggest backing up private key.
2025-01-22 22:35:41 -05:00
Tom FifieldandGitHub 7d37c6e728 Merge pull request #378 from Hunter275/ci-pnpm-version
remove version spec
2025-01-21 13:54:11 +11:00
Hunter275 42ccd953c0 remove version spec 2025-01-20 20:20:50 -05:00
Hunter ThornsberryandGitHub 578405d5d3 Merge pull request #362 from danditomaso/update_ble_serial_wording_https
fix: update connect dialog messaging to describe requirement for https
2025-01-20 14:59:51 -05:00
Dan Ditomaso ebb32f0893 fix: changed position of error message, disabled buttons when error is showing 2025-01-19 22:42:38 -05:00
Hunter ThornsberryandGitHub 9cef18b82a Merge pull request #370 from PhotoNomad0/feature-addDateToDisplayedMessages
Feature / Added date to messages displayed
2025-01-19 02:25:14 -05:00
Hunter ThornsberryandGitHub 88510a6ffe Merge pull request #367 from danielhogstrom/sidebar-close-button
feat: Add sidebar close button
2025-01-19 02:21:10 -05:00
Hunter275 be6acc5ef2 add right border 2025-01-19 00:50:23 -05:00
Anthony Hawk 4e35cf326e updated container port 2025-01-18 14:10:30 -06:00
Dan Ditomaso 225d6055d4 Improved error messaging based on feature missing from browser 2025-01-15 20:11:46 -05:00
Dan Ditomaso 7884991ac6 Refactor based on code review. Improved typing of useCookie hook. Added duration/delay to control length of toast. 2025-01-14 21:51:06 -05:00
PhotoNomad0 2d041ab6d0 Added date to messages displayed 2025-01-13 06:37:18 -05:00
Daniel c2cdc92ae9 feat: Add sidebar close button 2025-01-12 18:59:12 +01:00
Tom FifieldandGitHub 6b10d35e1a Merge pull request #365 from kylewistrand/fix-node-detail-dark-mode
fix: Node map detail dark mode
2025-01-12 13:38:45 +08:00
Kyle Wistrand 790f93322e feat: Make nodes on dashboard clickable 2025-01-11 20:56:03 -08:00
Kyle Wistrand b50edb2762 fix: Node map detail dark mode 2025-01-11 20:31:33 -08:00
Hunter ThornsberryandGitHub 88e06a1bea Merge pull request #350 from kylewistrand/add_map_node_detail
feat: Add Node detail popup in Map view
2025-01-10 14:17:48 -05:00
Dan Ditomaso 07d4204e86 Merge branch 'add_pki_backup_dialog' of https://github.com/danditomaso/meshtastic-web into add_pki_backup_dialog 2025-01-07 15:11:58 -05:00
Dan Ditomaso 0e78d0bd50 feat: added delay to toast appearing to avoid conflicting with messages/node loading. 2025-01-07 15:09:00 -05:00
Dan Ditomaso f3a3741216 feat: Add key backup reminder. Refactor Toast component to handle dark mode better 2025-01-07 15:08:01 -05:00
Dan Ditomaso 74e33d09b1 feat: Add pki backup dialog, refactor Channels pre-shared key to support regenerate dialog 2025-01-07 15:08:01 -05:00
Tom FifieldandGitHub ecd50148de Merge pull request #363 from danditomaso/add_empty_psk_size
Added empty value to pre-shared key size. Feature parity with IOS app
2025-01-07 13:58:20 +08:00
Hunter ThornsberryandGitHub 08a28eeb68 Merge branch 'master' into add_map_node_detail 2025-01-07 00:05:45 -05:00
Dan Ditomaso cbabcd4782 feat: added delay to toast appearing to avoid conflicting with messages/node loading. 2025-01-06 16:00:13 -05:00
Dan Ditomaso 63be65a487 feat: added empty value to pre-shared key size. 2025-01-06 13:45:45 -05:00
Dan Ditomaso 1c8476df53 refactor: consolidate browser feature detection into typed hook. Update connect dialog messaging to describe requirement for https when conneecting 2025-01-06 11:43:36 -05:00
Dan Ditomaso 7cd03c6a52 feat: Add key backup reminder. Refactor Toast component to handle dark mode better 2025-01-03 21:40:56 -05:00
Dan Ditomaso db09711be5 feat: Add pki backup dialog, refactor Channels pre-shared key to support regenerate dialog 2025-01-03 12:05:29 -05:00
Hunter ThornsberryandGitHub 94c6eea20b Merge pull request #317 from jangrewe/master
Update Containerfile to use plain Nginx
2024-12-30 14:46:52 -05:00
Jan Grewe 1ec3aa07d3 Merge branch 'meshtastic:master' into master 2024-12-30 16:19:16 +01:00
Tom FifieldandGitHub 1087c68541 Merge pull request #356 from danditomaso/add_attribution_control_to_map
feat: Add AttributionControl to Map to comply with OSM license requirements
2024-12-29 13:01:53 +11:00
Dan Ditomaso 856556c12b feat: Add AttributionControl to Map to comply with OSM license requirements 2024-12-28 20:21:40 -05:00
Tom FifieldandGitHub fc24a389c0 Merge pull request #353 from meshtastic/dependabot/npm_and_yarn/nanoid-3.3.8
Bump nanoid from 3.3.7 to 3.3.8
2024-12-14 22:16:31 +11:00
dependabot[bot]andGitHub 5687485154 Bump nanoid from 3.3.7 to 3.3.8
Bumps [nanoid](https://github.com/ai/nanoid) from 3.3.7 to 3.3.8.
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.3.7...3.3.8)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-14 09:37:41 +00:00
Jan Grewe 654d6c64c1 Merge remote-tracking branch 'upstream/master' 2024-12-02 11:28:43 +01:00
Kyle Wistrand fed6b2a6da feat: Add Node detail popup in Map view 2024-11-26 18:45:59 -08:00
Connor Morgan 79806cc6a2 feat: Add search functionality for nodes in Messages and Nodes pages 2024-11-24 22:17:17 -06:00
Hunter ThornsberryandGitHub e78aa2df61 Merge pull request #332 from Nestpebble/patch-1
Improve Managed Node description
2024-11-24 17:16:25 -05:00
Hunter ThornsberryandGitHub 03173f6a37 Merge pull request #347 from meshtastic/dependabot/npm_and_yarn/cross-spawn-7.0.6
Bump cross-spawn from 7.0.3 to 7.0.6
2024-11-24 17:11:10 -05:00
dependabot[bot]andGitHub 3fa73894ed Bump cross-spawn from 7.0.3 to 7.0.6
Bumps [cross-spawn](https://github.com/moxystudio/node-cross-spawn) from 7.0.3 to 7.0.6.
- [Changelog](https://github.com/moxystudio/node-cross-spawn/blob/master/CHANGELOG.md)
- [Commits](https://github.com/moxystudio/node-cross-spawn/compare/v7.0.3...v7.0.6)

---
updated-dependencies:
- dependency-name: cross-spawn
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-20 15:01:05 +00:00
Tom FifieldandGitHub a147324913 Merge pull request #344 from meshtastic/CVE-2024-45812
Update vite to 5.3.6
2024-11-12 10:42:30 +08:00
Tom Fifield 0fc4211c13 Update vite to 5.3.6
Fixes CVE-2024-45812
2024-11-12 10:40:47 +08:00
Tom Fifield 6df0b287ef Update vite to 5.3.6
Fixes CVE-2024-45812
2024-11-12 10:33:02 +08:00
Tom FifieldandGitHub 2f9af111c8 Update vite to 5.3.6
Fixes CVE-2024-45812
2024-11-12 10:29:27 +08:00
Hunter ThornsberryandGitHub 615045be9f Merge pull request #339 from hectorthemonk/patch-1
Add ledHeartbeatDisabled to Device Settings in Radio Config
2024-11-10 15:05:51 -05:00
TomandGitHub 6fc183ff15 Update Security.tsx 2024-11-10 12:58:54 +00:00
hectorthemonkandGitHub 9aafa681e8 Add ledHeartbeatDisabled to Device Settings in Radio Config
`led_heartbeat_disabled` in https://buf.build/meshtastic/protobufs/docs/main:meshtastic#meshtastic.Config.DeviceConfig
2024-11-10 21:34:33 +13:00
Tom FifieldandGitHub f48f9ccd62 Merge pull request #338 from Hunter275/bluetooth-pin-validation
Add bluetooth pin validation
2024-11-10 11:54:22 +08:00
Hunter275 2bd80bb5b4 Add pin validation 2024-11-09 22:39:57 -05:00
Tom FifieldandGitHub de597d2c28 Merge pull request #337 from Hunter275/issue-335-charging
If the batteryLevel is over 100, its charging
2024-11-10 10:14:15 +08:00
Hunter275 94cca88e2e If the batteryLevel is over 100, its charging 2024-11-09 21:10:55 -05:00
Hunter ThornsberryandGitHub 443c7fcd48 Merge pull request #331 from fmoessbauer/master
document scalar clamping of curve25519 keys
2024-11-09 20:25:38 -05:00
Hunter ThornsberryandGitHub 6138d9f8c8 Merge pull request #314 from meshtastic/dependabot/npm_and_yarn/micromatch-4.0.8
Bump micromatch from 4.0.7 to 4.0.8
2024-11-09 20:19:00 -05:00
Hunter ThornsberryandGitHub 37547b54e9 Merge pull request #330 from meshtastic/dependabot/npm_and_yarn/elliptic-6.6.0
Bump elliptic from 6.5.7 to 6.6.0
2024-11-09 20:18:45 -05:00
Hunter ThornsberryandGitHub 618e2f619b Merge pull request #313 from meshtastic/dependabot/npm_and_yarn/rollup-4.24.0
Bump rollup from 4.18.0 to 4.24.0
2024-11-09 20:18:34 -05:00
TomandGitHub 2cf7655562 Update Security.tsx 2024-11-02 01:37:28 +00:00
Felix Moessbauer 79c5638e10 document scalar clamping of curve25519 keys
The "scalars" are just random bytes. To make them secure curve25519
keys, they need to be clamped according to rfc7748 section 5.
As this is not obvious, we need to add a reference to the RFC.

No functional change.

Closes: #324
2024-11-01 12:55:54 +01:00
dependabot[bot]andGitHub f53d53ea20 Bump elliptic from 6.5.7 to 6.6.0
Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.7 to 6.6.0.
- [Commits](https://github.com/indutny/elliptic/compare/v6.5.7...v6.6.0)

---
updated-dependencies:
- dependency-name: elliptic
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-31 02:19:04 +00:00
Jan Grewe f2760a941b Update Containerfile to use plain Nginx
Only add required files to container
Fix HTML title
2024-10-14 16:38:30 +02:00
dependabot[bot]andGitHub 1e26eed861 Bump micromatch from 4.0.7 to 4.0.8
Bumps [micromatch](https://github.com/micromatch/micromatch) from 4.0.7 to 4.0.8.
- [Release notes](https://github.com/micromatch/micromatch/releases)
- [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/micromatch/compare/4.0.7...4.0.8)

---
updated-dependencies:
- dependency-name: micromatch
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-06 11:35:29 +00:00
dependabot[bot]andGitHub 2da4a44505 Bump rollup from 4.18.0 to 4.24.0
Bumps [rollup](https://github.com/rollup/rollup) from 4.18.0 to 4.24.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.18.0...v4.24.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-06 11:35:24 +00:00
Tilen Komel a2b9a33f6a Cursor pointer 2024-09-19 10:37:48 +02:00
Tilen Komel 56ac1d55f4 Implement on nodes page 2024-09-18 11:34:47 +02:00
Tilen Komel 2a5acb8771 Add node dialog 2024-09-18 11:34:27 +02:00
Tilen Komel 93e04e1b69 Add traceroute dialog 2024-09-18 11:21:15 +02:00
Tilen Komel bd48b02ef3 Updated traceroute response 2024-09-18 11:17:18 +02:00
sgtwilkoandGitHub fd9e327c85 Use window.location.host so that websites run on non-standard ports include the port 2024-08-30 01:01:44 +01:00
Hunter Thornsberry d8261a649b add disabled 2024-06-21 15:09:29 -04:00
Hunter Thornsberry c4565d97b0 add ability to enable/disable HTTPS connections 2024-06-21 15:06:19 -04:00
1151 changed files with 196275 additions and 13556 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"
}
}
}
+73 -11
View File
@@ -6,8 +6,20 @@ body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report!
# Bug Report
Thanks for taking the time to fill out this bug report! The more information you provide, the faster we can diagnose and fix the issue.
- type: checkboxes
id: prerequisites
attributes:
label: Before submitting
description: Please confirm you've completed the following steps
options:
- label: I have searched existing issues to make sure this bug hasn't already been reported
required: true
- label: I have updated to the latest version of the software to verify the issue still exists
required: true
- label: I have cleared cache/cookies/storage or tried in a private/incognito window (if applicable)
required: false
- type: dropdown
id: hardware
attributes:
@@ -41,7 +53,6 @@ body:
- Other
validations:
required: true
- type: dropdown
id: category
attributes:
@@ -54,7 +65,6 @@ body:
- Serial
validations:
required: true
- type: dropdown
id: local
attributes:
@@ -66,7 +76,6 @@ body:
- https://client.meshtastic.org
validations:
required: true
- type: input
id: version
attributes:
@@ -75,15 +84,50 @@ body:
placeholder: x.x.x.yyyyyyy
validations:
required: true
- type: textarea
id: body
- type: input
id: os
attributes:
label: Description
description: Please provide details on what steps you performed for this to happen.
label: Operating System
description: What OS are you running? Include version if possible.
placeholder: e.g., Windows 11, macOS 13.1, Android 13, iOS 16.2
validations:
required: true
- type: input
id: browser
attributes:
label: Browser
description: What browser are you using? Include version if possible.
placeholder: e.g., Chrome 108, Firefox 107, Safari 16.2
validations:
required: false
- type: textarea
id: expected
attributes:
label: Expected Behavior
description: What did you expect to happen?
placeholder: Describe what you expected to occur...
validations:
required: true
- type: textarea
id: actual
attributes:
label: Actual Behavior
description: What actually happened?
placeholder: Describe what occurred instead...
validations:
required: true
- type: textarea
id: steps
attributes:
label: Steps to Reproduce
description: Provide clear steps to reproduce the issue
placeholder: |
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
validations:
required: true
- type: textarea
id: logs
attributes:
@@ -92,3 +136,21 @@ body:
render: Shell
validations:
required: false
- type: textarea
id: screenshots
attributes:
label: Screenshots
description: If applicable, add screenshots to help explain your problem.
validations:
required: false
- type: textarea
id: additional
attributes:
label: Additional Context
description: Add any other context about the problem here.
validations:
required: false
- type: markdown
attributes:
value: |
Thank you for helping improve our project by reporting this bug!
+54 -6
View File
@@ -6,12 +6,60 @@ body:
- type: markdown
attributes:
value: |
Thanks for your request this will not gurantee that we will implement it, but it will be reviewed.
- type: textarea
id: body
Thanks for your request. While we can't guarantee implementation, all requests will be carefully reviewed.
- type: checkboxes
id: prerequisites
attributes:
label: Description
description: Please provide details about your enhancement.
label: Prerequisites
description: Please confirm the following before submitting your feature request
options:
- label: I have searched existing issues to ensure this feature hasn't already been requested
required: true
- label: I have checked the documentation to verify this feature doesn't already exist
required: true
- type: textarea
id: problem
attributes:
label: Problem Statement
description: What problem are you trying to solve? Describe the challenge or limitation you're facing.
placeholder: I'm frustrated when...
validations:
required: true
- type: textarea
id: solution
attributes:
label: Proposed Solution
description: Describe your idea for solving the problem. What would you like to see implemented?
placeholder: It would be great if...
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: Current Alternatives
description: Are there any workarounds or alternative solutions you're currently using?
placeholder: Currently, I'm working around this by...
validations:
required: false
- type: dropdown
id: importance
attributes:
label: Importance
description: How important is this feature to you?
options:
- Nice to have
- Important
- Critical
validations:
required: true
- type: textarea
id: context
attributes:
label: Additional Context
description: Add any other context, screenshots, mockups, or examples that might help us understand your request better.
validations:
required: false
- type: markdown
attributes:
value: |
Thank you for taking the time to fill out this feature request!
+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*"
+50
View File
@@ -0,0 +1,50 @@
<!--
Thank you for your contribution to our project!
-->
## Description
<!--
Provide a clear and concise description of what this PR does. Explain the problem it solves or the feature it adds.
-->
## Related Issues
<!--
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.
-->
## Changes Made
<!--
List the key changes you've made. Focus on the most important aspects that reviewers should understand.
-->
-
-
-
## Testing Done
<!--
Describe how you tested these changes (added new tests, etc).
-->
## Screenshots (if applicable)
<!--
If your changes affect the UI, include screenshots or screencasts showing the before and after.
-->
## Checklist
<!--
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
- [ ] Documentation has been updated or added
- [ ] Tests have been added or updated
- [ ] All i18n translation labels have been added (read
CONTRIBUTING_I18N_DEVELOPER_GUIDE.md for more details)
+61 -10
View File
@@ -1,9 +1,9 @@
name: CI
name: Push to Main CI
on:
push:
branches:
- master
- main
permissions:
contents: write
@@ -13,14 +13,65 @@ jobs:
build-and-package:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- 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:
version: latest
node-version: 24
cache: pnpm
cache-dependency-path: "**/pnpm-lock.yaml"
- name: Install Dependencies
run: pnpm install
- name: Prewarm & Install (workspace)
run: |
set -euo pipefail
pnpm fetch
pnpm install --frozen-lockfile --offline
- name: Build Package
run: pnpm build
- name: Build All Packages (with exclusions)
shell: bash
run: |
set -euo pipefail
# List packages to exclude (full paths under repo root)
EXCLUDED_DIRS=("packages/protobufs" "packages/transport-deno" "packages/ui" "packages/web")
is_excluded() {
local dir="$1"
for ex in "${EXCLUDED_DIRS[@]}"; do
if [[ "$dir" == "$ex" ]]; then
return 0
fi
done
return 1
}
for pkg_dir in packages/*/; do
pkg_dir="${pkg_dir%/}" # trim trailing slash
# Must be a directory with a package.json
if [[ ! -f "$pkg_dir/package.json" ]]; then
echo "⚠️ Skipping $pkg_dir (no package.json)"
continue
fi
# Allow for exclusions
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
+118
View File
@@ -0,0 +1,118 @@
name: Nightly Release
on:
schedule:
- cron: "0 5 * * *" # 05:00 UTC daily
workflow_dispatch: {} # allow manual runs too
permissions:
contents: read
packages: write
env:
REGISTRY_IMAGE: ghcr.io/${{ github.repository }}
jobs:
nightly-build-and-push:
runs-on: ubuntu-latest
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"
- name: Install dependencies (root)
run: pnpm install --frozen-lockfile
- name: Run tests
run: pnpm run test
- name: Build web package
working-directory: apps/web
run: pnpm run build
- name: Package output
working-directory: apps/web
run: pnpm run package
- name: Upload compressed build (artifact)
uses: actions/upload-artifact@v7
with:
name: web-build-nightly
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
uses: docker/setup-qemu-action@v4
- name: Build Container Image (multi-arch)
id: build-container
uses: redhat-actions/buildah-build@v3
with:
containerfiles: |
./apps/web/infra/Containerfile
image: ${{ env.REGISTRY_IMAGE }}
tags: |
${{ steps.meta.outputs.moving_tag }}
${{ steps.meta.outputs.immutable_tag }}
oci: true
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 GHCR
id: push-to-registry
uses: redhat-actions/push-to-registry@v3
with:
image: ${{ steps.build-container.outputs.image }}
# Push the same tags used at build time:
tags: ${{ steps.meta.outputs.all_tags }}
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Print image URLs
run: |
echo "Moving tag: ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.moving_tag }}"
echo "Immutable tag: ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.immutable_tag }}"
+48 -17
View File
@@ -1,30 +1,61 @@
name: Pull Request
name: Pull Request CI
on: pull_request
on:
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:
build:
build-and-package:
runs-on: ubuntu-latest
if: ${{ github.event.pull_request.draft == false }}
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v7
- name: Setup pnpm
uses: pnpm/action-setup@v4
uses: pnpm/action-setup@v6
- name: Setup Node.js
uses: actions/setup-node@v7
with:
version: latest
node-version: 24
cache: pnpm
cache-dependency-path: pnpm-lock.yaml
- name: Install Dependencies
run: pnpm install
- name: Debug dependency state
run: |
set -euo pipefail
echo "GITHUB_SHA=${GITHUB_SHA}"
git log --oneline -1
pnpm --version
node --version
grep -n "meshtastic__protobufs" pnpm-lock.yaml || true
grep -n "2.7.18" pnpm-lock.yaml || true
grep -n "2.7.20" pnpm-lock.yaml || true
- name: Build Package
run: pnpm build
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Compress build
run: pnpm package
- name: Run linter
run: pnpm run lint
- name: Archive compressed build
uses: actions/upload-artifact@v4
with:
name: build
path: dist/build.tar
- name: Check formatter
run: pnpm run check
continue-on-error: true
- name: Run tests
run: pnpm run test
- name: Build web package
run: pnpm --filter "./apps/web" run build
+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
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)."
-61
View File
@@ -1,61 +0,0 @@
name: 'Release'
on:
release:
types: [released]
permissions:
contents: write
packages: write
jobs:
build-and-package:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
with:
version: latest
- name: Install Dependencies
run: pnpm install
- name: Build Package
run: pnpm build
- name: Package Output
run: pnpm package
- name: Archive compressed build
uses: actions/upload-artifact@v4
with:
name: build
path: dist/build.tar
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Buildah Build
id: build-container
uses: redhat-actions/buildah-build@v2
with:
containerfiles: |
./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 }}"
@@ -0,0 +1,95 @@
name: Update Stable Branch from Main on Latest Release
on:
release:
types: [released]
permissions:
contents: write
concurrency:
group: update-stable-${{ github.run_id }}
cancel-in-progress: true
jobs:
update-stable-branch:
name: Update stable from latest release source
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v7
with:
fetch-depth: 0
fetch-tags: true # IMPORTANT: we need tags to resolve the release commit
- name: Configure Git author
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
- name: Determine source SHA (prefer tag)
id: meta
shell: bash
run: |
set -euo pipefail
TAG="${{ github.event.release.tag_name }}"
TARGET="${{ github.event.release.target_commitish || '' }}"
# Always ensure we have latest remote heads/tags
git fetch --tags --prune origin
SHA=""
SRC_DESC=""
# 1) Prefer the release tag commit
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
# 2) Fall back to target_commitish if it points to a branch on origin
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
# 3) Fall back to main if present
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
+20 -2
View File
@@ -1,5 +1,23 @@
dist
node_modules
dist
stats.html
.vercel
dev-dist
.vite
dev-dist
__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
-1
View File
@@ -1 +0,0 @@
@buf:registry=https://buf.build/gen/npm/v1
+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"]
}
+4 -5
View File
@@ -1,7 +1,6 @@
{
"editor.defaultFormatter": "biomejs.biome",
"editor.codeActionsOnSave": {
"quickfix.biome": "explicit"
},
"editor.formatOnSave": true
"editor.formatOnSave": true,
"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.
-5
View File
@@ -1,5 +0,0 @@
FROM registry.access.redhat.com/ubi9/nginx-122:1-45
ADD dist .
CMD nginx -g "daemon off;"
+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.
+156 -29
View File
@@ -1,61 +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=master&label=actions&logo=github&color=yellow)](https://github.com/meshtastic/web/actions/workflows/ci.yml)
[![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)
[![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
This monorepo consolidates the official [Meshtastic](https://meshtastic.org) web
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/`.
## Self-host
| 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. |
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 [UBI9 Nginx 1.22](https://catalog.redhat.com/software/containers/ubi9/nginx-122/63f7653b9b0ca19f84f7e9a1)
All publishable packages ship to both [JSR](https://jsr.io/@meshtastic) and [NPM](https://www.npmjs.com/org/meshtastic).
```bash
# With Docker
docker run -d -p 8080:8080 -p 8443:8443 --restart always --name Meshtastic-Web ghcr.io/meshtastic/web
## Architecture
#With Podman
podman run -d -p 8080:8080 -p 8443:8443 --restart always --name Meshtastic-Web ghcr.io/meshtastic/web
`@meshtastic/sdk` organises its source by feature slice. Each slice follows the
same DDD layout:
```
features/<slice>/
domain/ # entities & value objects — pure TypeScript types
application/ # use-cases (SendTextUseCase, FavoriteNodeUseCase, …)
infrastructure/ # protobuf ↔ domain mappers, admin-message adapters
state/ # signals-backed reactive stores
<Slice>Client.ts # public facade exposing readable signals + command methods
index.ts
```
## Development & Building
The shared kernel under `packages/sdk/src/core/` owns:
### Building and Packaging
- **`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.
Build the project:
The protobuf boundary is strict: wire messages enter through the packet codec,
get mapped into domain entities inside `features/*/infrastructure/*Mapper.ts`,
and signals only ever expose the domain shape.
```bash
pnpm build
```
Transport ─▶ Packet codec ─▶ EventBus ─▶ Slice infrastructure
│
▼
Signals (state) ─▶ sdk-react hooks ─▶ UI
▲
│
Slice application (use-cases) ─▶ MeshClient.sendPacket ─▶ Queue ─▶ Transport
```
GZip the output:
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.
## Getting Started
### Prerequisites
You need [pnpm](https://pnpm.io/) installed. If you plan to regenerate
protobufs, also install the [Buf CLI](https://buf.build/docs/cli/installation/).
### Setup
```bash
pnpm package
git clone https://github.com/meshtastic/web.git
cd web
pnpm install
```
### Development
Install the dependencies.
### Run the web client
```bash
pnpm i
pnpm --filter @meshtastic/web dev
```
Start the development server:
### Build everything
```bash
pnpm dev
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
improve the stability of future releases.
## Star history
<a href="https://star-history.com/#meshtastic/web&Date">
<picture>
<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>
## Contributors
<a href="https://github.com/meshtastic/web/graphs/contributors">
<img src="https://contrib.rocks/image?repo=meshtastic/web" width="100%"/>
</a>
## License
GPL-3.0-only. See [LICENSE](LICENSE).
+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
```
+1
View File
@@ -0,0 +1 @@
@jsr:registry=https://npm.jsr.io
+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%"
+10 -14
View File
@@ -1,25 +1,21 @@
<!DOCTYPE html>
<html lang="en">
<!doctype html>
<html lang="en" data-theme="system">
<head>
<!-- CookieYes banner -->
<%- cookieYesScript %>
<!-- End of CookieYes banner -->
<meta charset="utf-8" />
<link rel="icon" type="image/svg+xml" href="/icon.svg" />
<link rel="icon" href="/favicon.ico" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180" />
<link rel="manifest" href="site.webmanifest" />
<link rel="mask-icon" href="Logo_Black.svg" color="#67ea94" />
<link rel="stylesheet" href="https://rsms.me/inter/inter.css" />
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@xz/fonts@1/serve/cascadia-code.min.css"
/>
<link rel="mask-icon" href="logo_black.svg" color="#67ea94" />
<link rel="stylesheet" href="src/index.css" crossorigin="anonymous" />
<meta name="theme-color" content="#67ea94" />
<meta
name="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=0"
/>
<meta name="description" content="Meshtastic Web App" />
<title>Meshtastic Web</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="description" content="Meshtastic Web Client" />
<title><%- title %></title>
</head>
<body>
<div id="root"></div>
+2
View File
@@ -0,0 +1,2 @@
../dist/build.tar
../dist/output
+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.0.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.1",
"@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.61.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"
}
}

Some files were not shown because too many files have changed in this diff Show More