feat(ui): Add UI library#900
Conversation
|
@danditomaso is attempting to deploy a commit to the Meshtastic Team on Vercel. A member of the Team first needs to authorize it. |
There was a problem hiding this comment.
Pull Request Overview
This pull request introduces a new UI package (@meshtastic/ui) that provides a comprehensive set of reusable React components, theme management, and configuration for building consistent user interfaces across the Meshtastic project. The package leverages Tailwind CSS v4, Radix UI primitives, and modern React patterns to create a foundational component library.
Key Changes
- Creation of a new
@meshtastic/uipackage with essential UI components (Button, Badge, Input, Separator, Collapsible, Dropdown Menu, Sidebar, Sheet, Tooltip, Skeleton) - Implementation of theme provider with light/dark/system mode support
- Integration of Tailwind CSS v4 with custom design tokens and theming system
Reviewed Changes
Copilot reviewed 27 out of 28 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| packages/ui/package.json | Package configuration defining dependencies, scripts, and exports for the UI library |
| packages/ui/vite.config.ts | Vite build configuration for library bundling with TypeScript support |
| packages/ui/tsconfig.json | TypeScript configuration for the UI package |
| packages/ui/src/index.ts | Main entry point exporting components and types |
| packages/ui/src/components/theme-provider.tsx | Theme management provider with localStorage persistence |
| packages/ui/src/components/ui/*.tsx | Core UI component implementations (Button, Badge, Input, Sidebar, etc.) |
| packages/ui/src/lib/theme/default.css | Default theme CSS with design tokens |
| packages/web/src/index.css | Updated with scrollbar styling and commented imports |
| packages/web/src/App.tsx | Minor layout adjustment and commented ThemeProvider integration |
Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
df8ecc6 to
b726112
Compare
* 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>
…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>
* 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> * 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> * 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> * chore(i18n): New Crowdin Translations by GitHub Action (#899) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * 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> * feat(i18n): add fr localization support (#902) * feat: add fr support * fix(i18n): ensure langs are sorted before being displayed. * 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 * 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> * 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> * 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> * Fix description for historyReturnWindow (#907) It's not number of records but the time window... * 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> * 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 * feat(state): enable deviceStore persistance (#922) * 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> * fix: added skelton loader for message items (#927) * 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> * fix(ci): add ui library to excluded list (#928) * fix(config): update change registry channel value (#929) * fix(config): update change registry channel value * format/linting * chore(i18n): New Crowdin Translations by GitHub Action (#924) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * fix(connections): ensure connections reflect actual status. (#930) * fix(connection): support port on HTTP connection (#935) * feat(docker): add arm v7 support (#934) * 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> * fix(ui): fix add connection dialog typo (#938) * 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> * chore(i18n): New Crowdin Translations by GitHub Action (#941) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * Add 'packages/web' to excluded directories (#947) * 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> * fix: removed duplicate images (#951) * feat: add devcontainer (#953) * 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> * chore(i18n): New Crowdin Translations by GitHub Action (#958) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * 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. * 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> * chore(i18n): New Crowdin Translations by GitHub Action (#962) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * 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. * 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](capricorn86/happy-dom@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> * 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> * 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) * 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> * 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> * Revert "feat(ui): add SNR, RSSI, hops info for messages (#963)" (#974) This reverts commit 020e9d6. * Update README with Buf CLI installation instructions (#981) Added instructions for installing the Buf CLI. * Channel bandwidth is kHz, not MHz (#983) --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> 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: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jeremy Gallant <8975765+philon-@users.noreply.github.com> Co-authored-by: philon- <philon-@users.noreply.github.com> Co-authored-by: Wessel <wessel@weebl.me> 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: jsacrist <jsacrist@users.noreply.github.com> Co-authored-by: zeo <goonox35@proton.me> Co-authored-by: Kamil Dzieniszewski <kamil.d@playsmart.io> Co-authored-by: Alexey Stepanov <Pmmlabs@users.noreply.github.com> Co-authored-by: Pmmlabs <meshtastic@pmmlabs.ru> Co-authored-by: rj-xy <2442596+rj-xy@users.noreply.github.com>
* 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> * 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> * 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> * chore(i18n): New Crowdin Translations by GitHub Action (#899) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * 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> * feat(i18n): add fr localization support (#902) * feat: add fr support * fix(i18n): ensure langs are sorted before being displayed. * 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 * 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> * 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> * 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> * Fix description for historyReturnWindow (#907) It's not number of records but the time window... * 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> * 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 * feat(state): enable deviceStore persistance (#922) * 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> * fix: added skelton loader for message items (#927) * 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> * fix(ci): add ui library to excluded list (#928) * fix(config): update change registry channel value (#929) * fix(config): update change registry channel value * format/linting * chore(i18n): New Crowdin Translations by GitHub Action (#924) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * fix(connections): ensure connections reflect actual status. (#930) * fix(connection): support port on HTTP connection (#935) * feat(docker): add arm v7 support (#934) * 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> * fix(ui): fix add connection dialog typo (#938) * 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> * chore(i18n): New Crowdin Translations by GitHub Action (#941) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * Add 'packages/web' to excluded directories (#947) * 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> * fix: removed duplicate images (#951) * feat: add devcontainer (#953) * 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> * chore(i18n): New Crowdin Translations by GitHub Action (#958) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * 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. * 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> * chore(i18n): New Crowdin Translations by GitHub Action (#962) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * 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. * 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](capricorn86/happy-dom@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> * 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> * 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) * 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> * 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> * Revert "feat(ui): add SNR, RSSI, hops info for messages (#963)" (#974) This reverts commit 020e9d6. * Update README with Buf CLI installation instructions (#981) Added instructions for installing the Buf CLI. * Channel bandwidth is kHz, not MHz (#983) * fix channel importing bug (#1005) --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> 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: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jeremy Gallant <8975765+philon-@users.noreply.github.com> Co-authored-by: philon- <philon-@users.noreply.github.com> Co-authored-by: Wessel <wessel@weebl.me> 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: jsacrist <jsacrist@users.noreply.github.com> Co-authored-by: zeo <goonox35@proton.me> Co-authored-by: Kamil Dzieniszewski <kamil.d@playsmart.io> Co-authored-by: Alexey Stepanov <Pmmlabs@users.noreply.github.com> Co-authored-by: Pmmlabs <meshtastic@pmmlabs.ru> Co-authored-by: rj-xy <2442596+rj-xy@users.noreply.github.com>
Description
This pull request introduces a new UI package,
@meshtastic/ui, which provides a set of reusable React components, theme management, and configuration for building consistent user interfaces. The main changes include the addition of foundational UI components, theme provider logic, and configuration files for styling and component aliases.New UI Package and Configuration
package.jsonfor the new@meshtastic/uipackage, specifying dependencies, scripts, exports, and peer dependencies to support a modern React and Tailwind-based UI library.components.jsonto configure component aliases, icon library, style, and Tailwind settings for the UI package.Theming and Styling
theme-provider.tsxto manage light, dark, and system themes, including logic for persisting theme choice and updating the document root class.app.cssto support dark and light modes via thecolor-schemeproperty.Core UI Components
button.tsx,badge.tsx,input.tsx,separator.tsx,collapsible.tsx, anddropdown-menu.tsx, each with variants, accessibility attributes, and styling integrated with Tailwind and Radix UI. [1] [2] [3] [4] [5] [6]Checklist
CONTRIBUTING_I18N_DEVELOPER_GUIDE.md for more details)