Files
radicle-desktop/src/components/ThemeSwitch.svelte
T
Rūdolfs Ošiņš 010cac0377 Redesign app with new UI kit
Redesign the entire app with a new UI kit. Typography, colors, icons,
avatars, and border radii have all been updated for a more polished,
consistent appearance that matches our other products like
radicle-explorer.

- Replace blockies-based avatars with a new DID-based avatar system
- Move Settings and Create Issue into fullscreen modals
- Change the default theme to follow the system theme
- Remove window decorations on macOS for a cleaner, more native feel
- Update the app icon
- Fix popovers and tooltips

Navigation:

- Rewrite app navigation and layouts
- Add a sidebar that gives you access to all your repos
- Change the startup screen to open directly to the notification inbox
- Add a getting started guide shown to new users on first launch

Settings:

- Add a setting to disable the notification badge
- Add a code font setting

Bug fixes:

- Fix reactions and edits incorrectly targeting the root comment
  instead of the intended reply
- Restrict issue/patch state, labels and assignees to delegates only
2026-03-20 17:48:38 -06:00

79 lines
1.7 KiB
Svelte

<script lang="ts" module>
import { writable } from "svelte/store";
type Theme = "dark" | "light";
export function loadTheme(): Theme {
const { matches } = window.matchMedia("(prefers-color-scheme: dark)");
return matches ? "dark" : "light";
}
function initTheme(): Theme {
const storedTheme = localStorage ? localStorage.getItem("theme") : null;
if (storedTheme === "dark" || storedTheme === "light") {
return storedTheme;
}
return loadTheme();
}
export const followSystemTheme = writable<boolean>(
typeof localStorage !== "undefined"
? !localStorage.getItem("theme")
: false,
);
export const theme = writable<Theme>(initTheme());
export function storeTheme(newTheme: Theme): void {
followSystemTheme.set(false);
theme.set(newTheme);
if (localStorage) {
localStorage.setItem("theme", newTheme);
}
}
export function setSystemTheme(): void {
followSystemTheme.set(true);
theme.set(loadTheme());
if (localStorage) {
localStorage.removeItem("theme");
}
}
</script>
<script lang="ts">
import Button from "@app/components/Button.svelte";
</script>
<style>
.container {
display: flex;
align-items: center;
}
</style>
<div class="container">
<Button
variant="ghost"
flatRight
active={$followSystemTheme}
onclick={setSystemTheme}>
System
</Button>
<Button
variant="ghost"
flatLeft
flatRight
active={!$followSystemTheme && $theme === "light"}
onclick={() => storeTheme("light")}>
Light
</Button>
<Button
variant="ghost"
flatLeft
active={!$followSystemTheme && $theme === "dark"}
onclick={() => storeTheme("dark")}>
Dark
</Button>
</div>