mirror of
https://seed.radicle.dev/rad:z4D5UCArafTzTQpDZNQRuqswh3ury.git
synced 2026-11-09 21:30:38 +08:00
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
75 lines
1.9 KiB
Svelte
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>
|