Something went wrong. Try again.
Monorepo for Tangled
Something went wrong. Try again.
Svelte
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112<script lang="ts"> import ArrowRight from "$icon/arrow-right"; import Eye from "$icon/eye"; import type { DiffFile, DiffStat } from "$lib/api/diff"; import type { FileDiffMetadata } from "@pierre/diffs"; import Button from "$lib/components/ui/Button.svelte"; import EmptyState from "$lib/components/ui/EmptyState.svelte"; import type { Snippet } from "svelte"; import DiffCardChrome from "$lib/components/repo/DiffCardChrome.svelte"; import DiffStatPill from "$lib/components/repo/DiffStatPill.svelte"; import PierreDiff from "$lib/components/repo/PierreDiff.svelte"; import { createBlame, type BlameSource } from "$lib/components/repo/blame/request.svelte"; import type { DiffStyle } from "$lib/components/repo/pierre";
interface Props { file: DiffFile; // resolved display path (new name, falling back to old) name: string; stat: DiffStat; // pierre's structured diff, absent for binaries fileDiff?: FileDiffMetadata; // server-prerendered shadow dom for fileDiff prerenderedHTML?: string; // side-by-side or stacked diffStyle?: DiffStyle; blame?: boolean; blameSource?: BlameSource & { ref: string }; blamePath?: string; // blob route for the "view file" link, hidden when absent blobUrl?: string; open?: boolean; // review-button slot on the file header (pull pages) headerActions?: Snippet<[DiffFile]>; }
let { file, name, stat, fileDiff, prerenderedHTML, diffStyle = "unified", blame = false, blameSource, blamePath, blobUrl, open = $bindable(true), headerActions }: Props = $props();
const blameRequest = createBlame({ enabled: () => blame && open && !file.is_binary, source: () => blameSource, ref: () => blameSource?.ref, path: () => blamePath });</script>
<DiffCardChrome id="file-{name}" bind:open stickyTop="commit"> {#snippet header()} <DiffStatPill {stat} size="small" /> <div class="flex items-center gap-2 overflow-x-auto"> {#if file.name.old && file.name.new && file.name.old !== file.name.new} {file.name.old} <ArrowRight class="size-4" /> {file.name.new} {:else} {name} {/if} </div> {/snippet}
{#snippet actions()} {#if blameRequest.loading} <span class="me-2 text-foreground-muted">Loading blame…</span> {/if} {#if blobUrl} <Button href={blobUrl as "/"} variant="ghost" size="small" icon={Eye} class="hidden md:inline-flex" onclick={(event) => event.stopPropagation()} > View file </Button> {/if} {@render headerActions?.(file)} {/snippet}
{#snippet body()} {#if file.is_binary} <EmptyState size="inline" message="This is a binary file and will not be displayed." class="justify-center p-4" /> {:else} {#if blameRequest.error} <p role="alert" class="px-4 py-2 text-foreground-danger">{blameRequest.error}</p> {/if} <PierreDiff files={fileDiff ? [fileDiff] : []} {diffStyle} prerenderedHTML={[prerenderedHTML]} blame={blame && open ? blameRequest.runs : undefined} /> {/if} {/snippet}</DiffCardChrome>