feat(fend): sticky right-split for form output

This commit is contained in:
Lewis Wynne 2026-03-23 19:12:56 +00:00
parent 63e8178fb0
commit bb429d8195
4 changed files with 97 additions and 17 deletions

View file

@ -10,7 +10,7 @@
}
</script>
<header class="flex items-center gap-3 px-4 py-3 border-b" style="border-color: var(--border); background: var(--bg-card);">
<header class="sticky top-0 z-20 flex items-center gap-3 px-4 py-3 border-b" style="border-color: var(--border); background: var(--bg-card);">
<h1 class="font-bold whitespace-nowrap">Aurora Records</h1>
{#if roster.characters.length > 0}

View file

@ -0,0 +1,42 @@
<script lang="ts">
import type { Character } from '$lib/types';
import { generateRecord } from '$lib/output';
import { species } from '$lib/data';
import OutputTab from './OutputTab.svelte';
let { character }: { character: Character } = $props();
let tabs = $derived(
character.template.records.filter((r) => r.type !== 'public')
);
let activeTab = $state('');
$effect(() => {
if (tabs.length && !tabs.some((t) => t.type === activeTab)) {
activeTab = tabs[0].type;
}
});
let output = $derived(
activeTab ? generateRecord(character.template, character.data, activeTab, species) : ''
);
</script>
<div class="flex flex-col h-full rounded border" style="border-color: var(--border); background: var(--bg-card);">
<div class="flex border-b" style="border-color: var(--border);">
{#each tabs as tab}
<button
onclick={() => { activeTab = tab.type; }}
class="px-4 py-2 text-sm capitalize"
style={activeTab === tab.type
? `color: var(--accent); border-bottom: 2px solid var(--accent);`
: `color: var(--text-muted); border-bottom: 2px solid transparent;`}
>
{tab.type}
</button>
{/each}
</div>
<OutputTab {output} />
</div>

View file

@ -0,0 +1,31 @@
<script lang="ts">
import { Copy, Check } from 'lucide-svelte';
let { output }: { output: string } = $props();
let copied = $state(false);
let wordCount = $derived(
output.trim() ? output.trim().split(/\s+/).length : 0
);
async function copy() {
await navigator.clipboard.writeText(output);
copied = true;
setTimeout(() => { copied = false; }, 2000);
}
</script>
<div class="flex flex-col h-full">
<div class="flex items-center justify-between px-3 py-2 text-sm" style="color: var(--text-muted);">
<span>{wordCount} words</span>
<button onclick={copy} class="flex items-center gap-1 px-2 py-1 rounded border hover:opacity-80" style="border-color: var(--border);">
{#if copied}
<Check size={14} /> Copied
{:else}
<Copy size={14} /> Copy
{/if}
</button>
</div>
<pre class="flex-1 overflow-auto px-4 py-3 text-sm whitespace-pre-wrap font-mono" style="background: var(--bg); color: var(--text);">{output}</pre>
</div>