mirror of
https://seed.radicle.dev/rad:z4V1sjrXqjvFdnCUbxPFqd5p4DtH5.git
synced 2026-10-31 01:00:47 +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
85 lines
2.1 KiB
Svelte
85 lines
2.1 KiB
Svelte
<script lang="ts">
|
|
import type { Tree } from "@bindings/source/Tree";
|
|
|
|
import FileTreeFile from "@app/components/FileTreeFile.svelte";
|
|
import FileTreeFolder from "@app/components/FileTreeFolder.svelte";
|
|
import Icon from "@app/components/Icon.svelte";
|
|
|
|
interface Props {
|
|
fetchTree: (path: string) => Promise<Tree>;
|
|
fetchBlob: (path: string) => Promise<void>;
|
|
currentPath: string;
|
|
name: string;
|
|
prefix: string;
|
|
indent?: number;
|
|
}
|
|
|
|
const {
|
|
name,
|
|
fetchBlob,
|
|
currentPath,
|
|
prefix,
|
|
fetchTree,
|
|
indent = 0.5,
|
|
}: Props = $props();
|
|
let expanded = $derived(currentPath.indexOf(prefix) === 0);
|
|
|
|
const treePromise = $derived(
|
|
expanded ? fetchTree(prefix) : Promise.resolve(undefined),
|
|
);
|
|
</script>
|
|
|
|
<style>
|
|
.folder {
|
|
cursor: pointer;
|
|
width: 100%;
|
|
border-radius: var(--border-radius-sm);
|
|
}
|
|
.folder:hover {
|
|
background-color: var(--color-surface-subtle);
|
|
}
|
|
</style>
|
|
|
|
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
<div
|
|
class="folder"
|
|
style:padding-left="{indent}rem"
|
|
style:padding-right="0.5rem"
|
|
onclick={() => (expanded = !expanded)}>
|
|
<div class="global-flex txt-body-m-regular" style:padding="0.25rem 0">
|
|
<div class:txt-missing={!expanded}>
|
|
<Icon name={expanded ? "folder-open" : "folder"} />
|
|
</div>
|
|
{name}
|
|
</div>
|
|
</div>
|
|
{#if expanded}
|
|
{#await treePromise then tree}
|
|
{#if tree}
|
|
<div
|
|
style:display="flex"
|
|
style:flex-direction="column"
|
|
style:gap="0.25rem">
|
|
{#each tree.entries as entry (entry.path)}
|
|
{#if entry.kind === "tree"}
|
|
<FileTreeFolder
|
|
{fetchTree}
|
|
{fetchBlob}
|
|
name={entry.name}
|
|
{currentPath}
|
|
prefix={`${entry.path}/`}
|
|
indent={indent + 1.5} />
|
|
{:else if entry.kind === "blob"}
|
|
<FileTreeFile
|
|
name={entry.name}
|
|
fetchBlob={() => fetchBlob(entry.path)}
|
|
active={entry.path === currentPath}
|
|
indent={indent + 1.5} />
|
|
{/if}
|
|
{/each}
|
|
</div>
|
|
{/if}
|
|
{/await}
|
|
{/if}
|