Skip to content

Conversation

@PeetMcK
Copy link
Contributor

@PeetMcK PeetMcK commented Dec 17, 2025

Overview

This PR implements light mode support for Termix, adding a comprehensive theme system that enables automatic switching between light and dark modes based on user preference or system settings.

Rebased onto dev-1.10.0 - This branch is now a single squashed commit cleanly rebased onto the latest upstream development branch.

What's Changed

Theme Infrastructure

  • CSS Variable System: Added semantic CSS variables in index.css with separate definitions for light (:root) and dark (.dark) modes
  • Terminal Themes: Introduced termixDark and termixLight variants with optimized ANSI color palettes for each mode
  • Auto-Switching: Terminal theme automatically adapts when "Termix Default" is selected, switching between light/dark variants based on app theme

Scrollbar Theming

  • Theme-Aware Scrollbars: Updated thin-scrollbar class to use CSS variables that adapt to light/dark mode
  • Consistent Application: Applied thin-scrollbar to all overflow elements across ~84 files for unified appearance
  • CodeMirror Support: Added inline scrollbar styling to CodeMirror editors using scrollbarWidth and scrollbarColor CSS properties
Element CSS Variable Light Value Dark Value
Scrollbar thumb --scrollbar-thumb #c1c1c3 #434345
Scrollbar thumb hover --scrollbar-thumb-hover #a1a1a3 #5a5a5d
Scrollbar track --scrollbar-track #f3f4f6 #18181b

Component Updates

Updated components across desktop and mobile to use semantic CSS classes instead of hard-coded dark mode values:

Desktop

  • Terminal, File Manager, Server Stats widgets, Dashboard, Host Manager, Credentials Manager
  • Navigation: TopNavbar, LeftSidebar, Tab system with theme-aware borders
  • Authentication forms and dialogs
  • User Profile with redesigned tabbed interface

Mobile

  • Terminal with theme auto-switching
  • New kb-light-theme.css for mobile keyboard
  • Navigation components and host cards
  • Authentication screens

UI Components

  • Alert, Badge, Button, Input, Resizable

Technical Approach

  • Replaced hard-coded classes (bg-dark-*, border-dark-*) with semantic alternatives (bg-canvas, bg-elevated, border-edge)
  • Integrated useTheme hook for runtime theme detection
  • Added system theme detection via window.matchMedia("(prefers-color-scheme: dark)")
  • Theme-aware scrollbars using CSS custom properties

Class Migration Reference

Background Classes

Old Class New Class Light Value Dark Value Usage
bg-dark-bg bg-canvas #fcfcfc #18181b Main canvas/container backgrounds
bg-dark-bg-darker bg-canvas #fcfcfc #18181b Also maps to canvas
bg-dark-bg-darkest bg-deepest #e5e7eb #09090b Deepest background layer
bg-dark-bg-panel bg-surface #f3f4f6 #1b1b1e Panel and surface backgrounds
bg-dark-bg-input bg-field #ffffff #222225 Input field backgrounds
bg-dark-bg-button bg-button #f3f4f6 #23232a Button backgrounds
bg-dark-bg-active bg-active #e5e7eb #1d1d1f Active state backgrounds
bg-dark-bg-header bg-header #eeeeef #131316 Header backgrounds
bg-dark-hover bg-hover #f3f4f6 #2d2d30 Hover state backgrounds
bg-dark-bg-panel-hover bg-surface-hover #e5e7eb #232327 Panel hover states
bg-dark-bg-light bg-light #fafafa #141416 Light background variant
bg-dark-bg-very-light bg-subtle #f5f5f5 #101014 Very subtle backgrounds
bg-dark-active bg-interact #d1d5db #2a2a2c Interactive/active states
bg-dark-hover-alt bg-hover-alt #e5e7eb #2a2a2d Alternative hover state
bg-dark-pressed bg-pressed #d1d5db #1a1a1c Pressed/clicked state
bg-elevated #ffffff #0e0e10 Elevated surfaces (new semantic)

Border Classes

Old Class New Class Light Value Dark Value Usage
border-dark-border border-edge #e5e7eb #303032 Standard borders
border-dark-border-panel border-edge-panel #d1d5db #222224 Panel borders
border-dark-border-light border-edge-subtle #f3f4f6 #5a5a5d Subtle borders
border-dark-border-medium border-edge-medium #d1d5db #373739 Medium emphasis borders
border-dark-border-hover border-edge-hover #d1d5db #434345 Hover state borders
border-dark-border-active border-edge-active #9ca3af #2d2d30 Active state borders

Text Classes

Old Class New Class Light Value Dark Value Usage
text-white text-foreground #18181b #fafafa Primary text
text-gray-300 text-foreground-secondary #334155 #d1d5db Secondary descriptive text
text-gray-400 text-muted-foreground #71717a #9ca3af Muted/secondary text
text-gray-500 text-foreground-subtle #94a3b8 #6b7280 Subtle/placeholder text
text-dark-text-secondary text-muted-foreground #71717a #9ca3af Secondary text (legacy)

Core shadcn/ui Variables (Also Updated)

Variable Light Value Dark Value Usage
--background #ffffff #09090b App background
--foreground #18181b #fafafa App foreground text
--card #ffffff #18181b Card backgrounds
--muted #f4f4f5 #27272a Muted backgrounds
--sidebar #f9f9f9 #18181b Sidebar background
--input #e4e4e7 #ffffff26 Input borders

Usage Examples

Before:

<div className="bg-dark-bg border border-dark-border text-white hover:bg-dark-hover">
  <p className="text-gray-400">Description</p>
</div>

After:

<div className="bg-canvas border border-edge text-foreground hover:bg-hover">
  <p className="text-muted-foreground">Description</p>
</div>

Tabs Example:

<TabsList className="bg-button border border-edge-medium">
  <TabsTrigger className="bg-button data-[state=active]:bg-elevated data-[state=active]:border data-[state=active]:border-edge-medium">
    General
  </TabsTrigger>
</TabsList>

Notes

  • Rebased onto upstream/dev-1.10.0 as a single squashed commit
  • Chart widgets (CPU, Memory, Disk) retain their current styling for data visualization
  • Light mode color palette designed for accessibility and readability
  • Dark mode maintains its existing visual appearance
  • Scrollbars now use consistent 6px thin styling with theme-aware colors

Testing Suggestions

  • Verify theme switching in Settings works correctly
  • Test with system theme preference (light/dark/auto)
  • Check terminal rendering in both themes
  • Review mobile keyboard appearance in light mode
  • Test navigation and dialogs in both themes
  • Verify scrollbars appear correctly in both light and dark modes

Co-Authored-By: Claude noreply@anthropic.com

@PeetMcK
Copy link
Contributor Author

PeetMcK commented Dec 17, 2025

I have a problem staying focued on dark mode ... probably because I can't see worth a crap after 40. Please let me know if i missed anything or you'd like anything tweeked.

@LukeGus
Copy link
Member

LukeGus commented Dec 17, 2025

Looks decent in light mode, however, the regular dark mode color scheme was mostly messed up.
image
As you can see in the image, some background colors were changed, borders were messed up, etc. This exists across many of the components

Another thing is that a light mode terminal theme option should be added. Right now, it defaults to this:
image
However, when in light mode, there should be a new terminal option for Termix Light Default that uses the new light mode background color. Then the Termix Default should be renamed to Termix Dark Default.

@ZacharyZcR ZacharyZcR added the enhancement New feature or request label Dec 18, 2025
@PeetMcK
Copy link
Contributor Author

PeetMcK commented Dec 18, 2025

Boy did I ever come at that wrong. I could have walked into an unlocked front door, but decided it would be easier to dig a tunel from the street into the basement ¯\_(ツ)_/¯ ...

All that said, this is probably feature complete. Its possible I missed something or didn't dig deep enoug into a sub menu to find something that did't quite work. (60f6243 turns out to be just such a miss).

let me know if you have any questions or need a change.

@LukeGus
Copy link
Member

LukeGus commented Dec 20, 2025

Lighmode is good, dark mode still needs much improvement.

Here is what Termix currently looks like in Dark mode:
Screenshot 2025-12-19 at 20-16-12 Termix

The color scheme is consistent, visible, and looks nice. Heres the new dark mode:
Screenshot 2025-12-19 at 20-17-42 Termix

The colors don't match, the app bg color was changed, the sidebars are oddly light, and many other stuff was changed too like this:
image
Which now uses a completely different background color that's never used anywhere else in the app.

@LukeGus LukeGus changed the base branch from main to dev-1.10.0 December 20, 2025 03:18
@LukeGus
Copy link
Member

LukeGus commented Dec 20, 2025

Also, i've changed your PR to use the latest dev-x.x.x version. This includes several new features like RBAC/Docker, which all added new components. Would you mind updating the new files, and resolving some of the merge conflicts that came with it?

@PeetMcK PeetMcK force-pushed the _100-LightMode branch 2 times, most recently from bd96aeb to 3112ebf Compare December 20, 2025 09:17
@PeetMcK
Copy link
Contributor Author

PeetMcK commented Dec 20, 2025

@LukeGus I've addressed the visual inconsistancies. If you find any more feel free to apply your prefered colors to the variables/classes. Virtually all of the inconsistencies were from poor conversions of oklch() conversions to hex.

The PR's been rebased onto Termix-SSH:dev-1.10.0, and while i didn't find anything that stood out as an immediat issue all other added features need testing and it absolutely should have another set of eyes or two to ensure there are no visual regressions.

- Add comprehensive light/dark mode CSS variables with semantic naming
- Implement theme-aware scrollbars using CSS variables
- Add light mode backgrounds: --bg-base, --bg-elevated, --bg-surface, etc.
- Add theme-aware borders: --border-base, --border-panel, --border-subtle
- Add semantic text colors: --foreground-secondary, --foreground-subtle
- Convert oklch colors to hex for better compatibility
- Add theme awareness to CodeMirror editors
- Update dark mode colors for consistency (background, sidebar, card, muted, input)
- Add Tailwind color mappings for semantic classes
@LukeGus
Copy link
Member

LukeGus commented Dec 23, 2025

Thanks for fixing the merge issues. I'll check it out later today. I just finished updating thousands of hardcoded text into translations, which may cause some merge issues, but I can sort that out easily. I should also be able to take care of any visual issues. Thanks for the help!

@PeetMcK
Copy link
Contributor Author

PeetMcK commented Dec 23, 2025

@LukeGus No worries. I guess I spent a bunch of time rebasing to the wrong commit, then to the right one. In the future, were would you like PR's to be based to have the best chance to avoid the extra lift and possible conflicts?

@LukeGus LukeGus merged commit e6a70e3 into Termix-SSH:dev-1.10.0 Dec 23, 2025
LukeGus added a commit that referenced this pull request Jan 1, 2026
* fix select edit host but not update view (#438)

* fix: Checksum issue with chocolatey

* fix: Remove homebrew old stuff

* Add Korean translation (#439)

Co-authored-by: 송준우 <2484@coreit.co.kr>

* feat: Automate flatpak

* fix: Add imagemagik to electron builder to resolve build error

* fix: Build error with runtime repo flag

* fix: Flatpak runtime error and install freedesktop ver warning

* fix: Flatpak runtime error and install freedesktop ver warning

* feat: Re-add homebrew cask and move scripts to backend

* fix: No sandbox flag issue

* fix: Change name for electron macos cask output

* fix: Sandbox error with Linux

* fix: Remove comming soon for app stores in readme

* Adding Comment at the end of the public_key on the host on deploy (#440)

* Add termix.rb Cask file

* Update Termix to version 1.9.0 with new checksum

* Update README to remove 'coming soon' notes

* -Add New Interface for Credential DB
-Add Credential Name as a comment into the server authorized_key file

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* Sudo auto fill password (#441)

* Add termix.rb Cask file

* Update Termix to version 1.9.0 with new checksum

* Update README to remove 'coming soon' notes

* Feature Sudo password auto-fill;

* Fix locale json shema;

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* Added Italian Language; (#445)

* Add termix.rb Cask file

* Update Termix to version 1.9.0 with new checksum

* Update README to remove 'coming soon' notes

* Added Italian Language;

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* Auto collapse snippet folders (#448)

* Add termix.rb Cask file

* Update Termix to version 1.9.0 with new checksum

* Update README to remove 'coming soon' notes

* feat: Add collapsable snippets (customizable in user profile)

* Translations (#447)

* Add termix.rb Cask file

* Update Termix to version 1.9.0 with new checksum

* Update README to remove 'coming soon' notes

* Added Italian Language;

* Fix translations;

Removed duplicate keys, synchronised other languages using English as the source, translated added keys, fixed inaccurate translations.

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* Remove PTY-level keepalive (#449)

* Add termix.rb Cask file

* Update Termix to version 1.9.0 with new checksum

* Update README to remove 'coming soon' notes

* Remove PTY-level keepalive to prevent unwanted terminal output; use SSH-level keepalive instead

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: Seperate server stats and tunnel management (improved both UI's) then started initial docker implementation

* fix: finalize adding docker to db

* feat: Add docker management support (local squash)

* Fix RBAC role system bugs and improve UX (#446)

* Fix RBAC role system bugs and improve UX

- Fix user list dropdown selection in host sharing
- Fix role sharing permissions to include role-based access
- Fix translation template interpolation for success messages
- Standardize system roles to admin and user only
- Auto-assign user role to new registrations
- Remove blocking confirmation dialogs in modal contexts
- Add missing i18n keys for common actions
- Fix button type to prevent unintended form submissions

* Enhance RBAC system with UI improvements and security fixes

- Move role assignment to Users tab with per-user role management
- Protect system roles (admin/user) from editing and manual assignment
- Simplify permission system: remove Use level, keep View and Manage
- Hide Update button and Sharing tab for view-only/shared hosts
- Prevent users from sharing hosts with themselves
- Unify table and modal styling across admin panels
- Auto-assign system roles on user registration
- Add permission metadata to host interface

* Add empty state message for role assignment

- Display helpful message when no custom roles available
- Clarify that system roles are auto-assigned
- Add noCustomRolesToAssign translation in English and Chinese

* fix: Prevent credential sharing errors for shared hosts

- Skip credential resolution for shared hosts with credential authentication
  to prevent decryption errors (credentials are encrypted per-user)
- Add warning alert in sharing tab when host uses credential authentication
- Inform users that shared users cannot connect to credential-based hosts
- Add translations for credential sharing warning (EN/ZH)

This prevents authentication failures when sharing hosts configured
with credential authentication while maintaining security by keeping
credentials isolated per user.

* feat: Improve rbac UI and fixes some bugs

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* SOCKS5 support (#452)

* Add termix.rb Cask file

* Update Termix to version 1.9.0 with new checksum

* Update README to remove 'coming soon' notes

* SOCKS5 support

Adding single and chain socks5 proxy support

* fix: cleanup files

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* Notes and Expiry fields add (#453)

* Add termix.rb Cask file

* Update Termix to version 1.9.0 with new checksum

* Update README to remove 'coming soon' notes

* Notes and Expiry add

* fix: cleanup files

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* fix: ssh host types

* fix: sudo incorrect styling and remove expiration date

* feat: add sudo password and add diagonal bg's

* fix: snippet running on enter key

* fix: base64 decoding

* fix: improve server stats / rbac

* fix: wrap ssh host json export in hosts array

* feat: auto trim host inputs, fix file manager jump hosts, dashboard prevent duplicates, file manager terminal not size updating, improve left sidebar sorting, hide/show tags, add apperance user profile tab, add new host manager tabs.

* feat: improve terminal connection speed

* fix: sqlite constriant errors and support non-root user (nginx perm issue)

* feat: add beta syntax highlighing to terminal

* feat: update imports and improve admin settings user management

* chore: update translations

* chore: update translations

* feat: Complete light mode implementation with semantic theme system (#450)

- Add comprehensive light/dark mode CSS variables with semantic naming
- Implement theme-aware scrollbars using CSS variables
- Add light mode backgrounds: --bg-base, --bg-elevated, --bg-surface, etc.
- Add theme-aware borders: --border-base, --border-panel, --border-subtle
- Add semantic text colors: --foreground-secondary, --foreground-subtle
- Convert oklch colors to hex for better compatibility
- Add theme awareness to CodeMirror editors
- Update dark mode colors for consistency (background, sidebar, card, muted, input)
- Add Tailwind color mappings for semantic classes

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* fix: syntax errors

* chore: updating/match themes and split admin settings

* feat: add translation workflow and remove old translation.json

* fix: translation workflow error

* fix: translation workflow error

* feat: improve translation system and update workflow

* fix: wrong path for translations

* fix: change translation to flat files

* fix: gh rule error

* chore: auto-translate to multiple languages (#458)

* chore: improve organization and made a few styling changes in host manager

* feat: improve terminal stability and split out the host manager

* fix: add unnversiioned files

* chore: migrate all to use the new theme system

* fix: wrong animation line colors

* fix: rbac implementation general issues (local squash)

* fix: remove unneeded files

* feat: add 10 new langs

* chore: update gitnore

* chore: auto-translate to multiple languages (#459)

* fix: improve tunnel system

* fix: properly split tabs, still need to fix up the host manager

* chore: cleanup files (possible RC)

* feat: add norwegian

* chore: auto-translate to multiple languages (#461)

* fix: small qol fixes and began readme update

* fix: run cleanup script

* feat: add docker docs button

* feat: general bug fixes and readme updates

* fix: translations

* chore: auto-translate to multiple languages (#462)

* fix: cleanup files

* fix: test new translation issue and add better server-stats support

* fix: fix translate error

* chore: auto-translate to multiple languages (#463)

* fix: fix translate mismatching text

* chore: auto-translate to multiple languages (#465)

* fix: fix translate mismatching text

* fix: fix translate mismatching text

* chore: auto-translate to multiple languages (#466)

* fix: fix translate mismatching text

* fix: fix translate mismatching text

* fix: fix translate mismatching text

* chore: auto-translate to multiple languages (#467)

* fix: fix translate mismatching text

* chore: auto-translate to multiple languages (#468)

* feat: add to readme, a few qol changes, and improve server stats in general

* chore: auto-translate to multiple languages (#469)

* feat: turned disk uage into graph and fixed issue with termina console

* fix: electron build error and hide icons when shared

* chore: run clean

* fix: general server stats issues, file manager decoding, ui qol

* fix: add dashboard line breaks

* fix: docker console error

* fix: docker console not loading and mismatched stripped background for electron

* fix: docker console not loading

* chore: docker console not loading in docker

* chore: translate readme to chinese

* chore: match package lock to package json

* chore: nginx config issue for dokcer console

* chore: auto-translate to multiple languages (#470)

---------

Co-authored-by: Tran Trung Kien <kientt13.7@gmail.com>
Co-authored-by: junu <bigdwarf_@naver.com>
Co-authored-by: 송준우 <2484@coreit.co.kr>
Co-authored-by: SlimGary <trash.slim@gmail.com>
Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com>
Co-authored-by: Wesley Reid <starhound@lostsouls.org>
Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>
Co-authored-by: Denis <38875137+Medvedinca@users.noreply.github.com>
Co-authored-by: Peet McKinney <68706879+PeetMcK@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants