mirror of
https://seed.radicle.dev/rad:z4D5UCArafTzTQpDZNQRuqswh3ury.git
synced 2026-11-12 06:40:40 +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
99 lines
3.4 KiB
Svelte
99 lines
3.4 KiB
Svelte
<script lang="ts">
|
|
import type { Review } from "@bindings/cob/patch/Review";
|
|
|
|
import capitalize from "lodash/capitalize.js";
|
|
|
|
import { verdictIcon } from "@app/lib/utils";
|
|
|
|
import Button from "@app/components/Button.svelte";
|
|
import DropdownList from "@app/components/DropdownList.svelte";
|
|
import DropdownListItem from "@app/components/DropdownListItem.svelte";
|
|
import Icon from "@app/components/Icon.svelte";
|
|
import Popover from "@app/components/Popover.svelte";
|
|
import { closeFocused } from "@app/components/Popover.svelte";
|
|
|
|
interface Props {
|
|
onSelect: (selectedVerdict: Review["verdict"]) => Promise<void>;
|
|
draft: boolean;
|
|
summaryMissing: boolean;
|
|
selectedVerdict: Review["verdict"];
|
|
}
|
|
|
|
const { onSelect, draft, summaryMissing, selectedVerdict }: Props = $props();
|
|
|
|
let popoverExpanded: boolean = $state(false);
|
|
|
|
function verdictBgColor(verdict: Review["verdict"]): string {
|
|
if (verdict === "accept") return "var(--color-feedback-success-bg)";
|
|
if (verdict === "reject") return "var(--color-feedback-error-bg)";
|
|
return "var(--color-surface-subtle)";
|
|
}
|
|
|
|
function verdictColor(verdict: Review["verdict"]): string {
|
|
if (verdict === "accept") return "var(--color-feedback-success-text)";
|
|
if (verdict === "reject") return "var(--color-feedback-error-text)";
|
|
return "var(--color-text-secondary)";
|
|
}
|
|
</script>
|
|
|
|
<Popover
|
|
popoverPadding="0"
|
|
placement="bottom-start"
|
|
bind:expanded={popoverExpanded}>
|
|
{#snippet toggle(onclick)}
|
|
<Button variant="outline" {onclick} active={popoverExpanded}>
|
|
<span
|
|
class="global-chip"
|
|
style:padding="0"
|
|
style:margin-left="-0.25rem"
|
|
style:background-color={verdictBgColor(selectedVerdict)}
|
|
style:color={verdictColor(selectedVerdict)}>
|
|
<Icon name={verdictIcon(selectedVerdict)} />
|
|
</span>
|
|
<span style:color="var(--color-text-secondary)">
|
|
{selectedVerdict ? capitalize(`${selectedVerdict}ed`) : "None"}
|
|
</span>
|
|
<Icon name={popoverExpanded ? "chevron-up" : "chevron-down"} />
|
|
</Button>
|
|
{/snippet}
|
|
{#snippet popover()}
|
|
<div
|
|
style:border="1px solid var(--color-border-subtle)"
|
|
style:border-radius="var(--border-radius-sm)"
|
|
style:display="flex"
|
|
style:gap="0.5rem"
|
|
style:align-items="center"
|
|
style:background-color="var(--color-surface-canvas)">
|
|
<DropdownList items={[undefined, "accept", "reject"] as const}>
|
|
{#snippet item(verdict)}
|
|
<DropdownListItem
|
|
title={verdict === undefined && summaryMissing
|
|
? "Set a summary to select verdict None"
|
|
: undefined}
|
|
disabled={draft === false &&
|
|
verdict === undefined &&
|
|
summaryMissing}
|
|
selected={selectedVerdict === verdict}
|
|
styleGap="0.5rem"
|
|
onclick={async () => {
|
|
await onSelect(verdict);
|
|
closeFocused();
|
|
}}>
|
|
<span
|
|
class="global-chip"
|
|
style:padding="0"
|
|
style:margin-left="-0.5rem"
|
|
style:background-color={verdictBgColor(verdict)}
|
|
style:color={verdictColor(verdict)}>
|
|
<Icon name={verdictIcon(verdict)} />
|
|
</span>
|
|
<span style:color="var(--color-text-secondary)">
|
|
{verdict ? capitalize(`${verdict}ed`) : "None"}
|
|
</span>
|
|
</DropdownListItem>
|
|
{/snippet}
|
|
</DropdownList>
|
|
</div>
|
|
{/snippet}
|
|
</Popover>
|