* Add optional dark mode feature
This PR adds an optional dark mode to TeslaMate with three appearance options:
- Light (default): Always use light theme
- Follow System: Automatically match OS/browser dark mode preference
- Dark: Always use dark theme
Key features:
- Database-persisted theme preference in GlobalSettings
- Comprehensive dark mode styling for all UI components
- Monochrome map tiles in dark mode (Tesla-inspired aesthetic)
- Instant theme switching without page reload
- No flash of wrong theme on page load
- Defaults to light mode for existing users
Technical implementation:
- New theme_mode field in settings table (migration included)
- CSS custom properties for theme colors
- JavaScript theme detection and system preference monitoring
- LiveView hook for instant theme changes
- Inverted OSM map tiles with grayscale filter for dark mode
Maintains backward compatibility - existing installations will
default to light mode and users can opt-in to dark mode.
* Run treefmt to fix code formatting
* Extract translation strings for theme settings
* Add Dutch, French, and German translations for theme settings
- Dutch: Thema, Weergave, Licht, Donker, Volg systeem
- French: Thème, Apparence, Clair, Sombre, Suivre le système
- German: Design, Darstellung, Hell, Dunkel, Systemeinstellung folgen
* Address review feedback: default to system theme, add tests and documentation
* Fix white background showing at bottom in dark mode
* Make footer sticky at bottom of viewport
* Remove WARP.md from .gitignore
* Fix visibility of inverted light buttons in dark mode
Improved contrast for edit/delete buttons in Geo-Fences table
by adding proper dark mode styling for is-inverted is-light buttons.
Co-Authored-By: Warp <agent@warp.dev>
* Add icon color inheritance for inverted light buttons
Ensure edit (blue) and delete (red) button icons are colored properly.
Co-Authored-By: Warp <agent@warp.dev>
* CI: use master as default branch in reusable workflows
Fix paths-filter and PR triggers by replacing hardcoded 'main' with 'master'.
Co-Authored-By: Warp <agent@warp.dev>
* Revert CI branch changes per maintainer request
Restore 'main' references in reusable workflows. No CI changes in this PR.
Co-Authored-By: Warp <agent@warp.dev>
* Dark mode: hide empty table header background in car summary
Add .thead-transparent class to the summary table and override thead bg to match
card surface, avoiding the apparent 'divider' under the title in dark mode.
Co-Authored-By: Warp <agent@warp.dev>
* Dark mode: fix tabs hover/active styles for boxed tabs in Settings
Ensure hover doesn’t turn tabs white; use surface/surface-light colors and proper borders for .tabs.is-boxed.
Co-Authored-By: Warp <agent@warp.dev>
* Dark mode: override Bulma active navbar dropdown item background
Ensure .navbar-dropdown .navbar-item.is-active uses dark surface color instead of light-mode whitesmoke.
Co-Authored-By: Warp <agent@warp.dev>
---------
Co-authored-by: Warp <agent@warp.dev>
* ux: change Google Maps Button Link to icon to ensure a consistent UX
* test: correct test for car location on Google Maps link
* docs: update changelog
* chore(i18n): update POT files
* docs: update changelog
* docs: update changelog
* slope-adjusted efficiency
* docs: update changelog
* docs: include migration time in changelog
* docs: update changelog
* build: bump minor version
---------
Co-authored-by: Jakob Lichterfeld <jakob-lichterfeld@gmx.de>
* Add Google Maps link for car's current location
- Add Google Maps link in car summary view
- Link opens car's current location in new tab
- Follows existing external link patterns
- Uses consistent Bulma styling
Co-Authored-By: Calvin Huang <c@lvin.me>
* Fix HTML div structure in summary template
- Remove extra closing div that caused compilation error
- Properly nest card-content div structure
Co-Authored-By: Calvin Huang <c@lvin.me>
* Add test for Google Maps link in car summary view
- Test verifies link presence with correct coordinates
- Test validates href URL format and security attributes
- Test ensures proper CSS styling and link text
- Follows existing TeslaMate testing patterns with online_event() helper
- Uses Floki for HTML parsing and attribute verification
Co-Authored-By: Calvin Huang <c@lvin.me>
* style: linter findings
* Update POT files for translation
- Run mix gettext.extract --merge to update translation files
- Addresses PR comment feedback about updating pot files
- No new translatable strings added from Google Maps feature
Co-Authored-By: Calvin Huang <c@lvin.me>
* docs: update changelog
---------
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Jakob Lichterfeld <jakob-lichterfeld@gmx.de>
* feat: update to Phenix HTML 4.1
* fix: updating to the new Gettext.Backend approach
* chore: update pot files ro locale version 45.0.0
* fix: downgrade cloack back to 1.1.2
* revert: merge of mix.lock
* fix: new syntax for field name generation for phx-feedback-for
* Revert "fix: new syntax for field name generation for phx-feedback-for"
This reverts commit 4d95e4f1c9.
* fix: downgrade floki back to 0.35.2
* Revert "fix: downgrade floki back to 0.35.2"
This reverts commit a4f0b6bf4b.
* fix: ensure floki nil is handled
* style: linter findings
* Revert "fix: ensure floki nil is handled"
* fix: new syntax for field name generation for phx-feedback-for
* debug: floki paramter error
* Revert "debug: floki paramter error"
This reverts commit 61920267ed.
* fix: Remove unnecessary code in settings_test.exs which breaks floki 0.36+
* Add ability to enable and disable cars
* Add default value for enabled in car_settings.
* Fix unit tests.
* Fix formatting.
* Update text to be more descriptive
* Update lables.
This refactors the existing code to make it more maintainable.
Nil values are published as "nil" string. This ensures that they will
get published, and ensures that MQTT doesn't drop the retained data.
Fixes#3748
* Upgrade to phoenix 1.7.0
The minimal changes necessary to compile the application
* Import Phoenix.Component instead of LiveView
* Fix compilation warnings
* mix format
* Update tests to trim newline characters
* mix gettext.extract --merge
* style: correct linting
* rebuild gettext
* fix: correct spacing before unit for energy added
* fix: use unicode character for whitespace
* fix: spacing with witespace
* fix: use numeric value for charge_energy_added in charging test
* fix: avoid warning about unsued function, which is actually used in plug
* fix: use whitespace in test before charge_energy_added
---------
Co-authored-by: JakobLichterfeld <jakob-lichterfeld@gmx.de>
* Fix an issue when car is could enter sleep mode while dog mode is enabled.
* Update pot files
* revert change
* Fix tests
* Fix tests and issue when try to sleep was not showing
* Fix lint issue
some tools, e.g. Garmin Basecamp, expect a proper namespace
definition in the xml root element and are more sensitive to
xml schema violations.
Track point elevation is specified to be an element of type
xsd:decimal in the gpx schema. But Teslamate renders an
empty element <ele></ele> when no elevation data is present.
This fix does not render an <ele> element when no elevation
is present
Also the gpx schema requires a "creator" attribute on the
gpx root element.
Store API tokens encrypted in the database.
During the database migration a randomly generated key will be used encrypt the tokens if no ENCRYPTION_KEY environment variable was provided.
If the application is started without the presence of an ENCRYPTION_KEY (or if the key failed to decrypt the existing tokens), the UI will display a warning with further instructions.
* Update summary.html.heex
Create a link on the summary page to link to Not a Tesla App release notes page per discussion request #2367
Full disclosure - not proficient in Elixir, but understand HTML and capable of digging through other code and comparing. Just not sure how the `@summary.version` is going to be treated in the link text.
* Fix string interpolation
* Update tests
Co-authored-by: Adrian Kumpf <8999358+adriankumpf@users.noreply.github.com>