Files
radicle-desktop/src/components/ReactionSelector.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

75 lines
1.9 KiB
Svelte

<script lang="ts">
import type { Reaction } from "@bindings/cob/Reaction";
import type { Placement } from "@floating-ui/dom";
import { twemoji } from "@app/lib/utils";
import Icon from "@app/components/Icon.svelte";
import Popover from "@app/components/Popover.svelte";
interface Props {
reactions?: Reaction[];
placement?: Placement;
select: (reaction: Reaction) => Promise<void>;
}
const { reactions, placement, select }: Props = $props();
const availableReactions = ["👍", "👎", "😄", "🎉", "🙁", "🚀", "👀"];
</script>
<style>
.selector {
display: flex;
align-items: center;
gap: 1px;
}
button {
cursor: pointer;
border: 0;
background: none;
height: 1.5rem;
border-radius: var(--border-radius-sm);
margin: 0;
font: var(--txt-body-m-regular);
width: 2rem;
height: 2rem;
}
button:hover,
button.active {
background-color: var(--color-surface-subtle);
}
</style>
<Popover {placement} popoverPadding="0">
{#snippet toggle(onclick)}
<Icon name="emoji" {onclick} />
{/snippet}
{#snippet popover()}
<div
style:border="1px solid var(--color-border-subtle)"
style:border-radius="var(--border-radius-md)"
style:display="flex"
style:gap="0.5rem"
style:align-items="center"
style:background-color="var(--color-surface-canvas)">
<div class="selector">
{#each availableReactions as reaction}
{@const lookedUpReaction = reactions?.find(
({ emoji }) => emoji === reaction,
)}
<button
use:twemoji={{ exclude: ["21a9"] }}
class:active={Boolean(lookedUpReaction)}
onclick={() =>
select(lookedUpReaction || { emoji: reaction, authors: [] })}>
{reaction}
</button>
{/each}
</div>
</div>
{/snippet}
</Popover>