All checks were successful
CI / Unit & Component Tests (pull_request) Successful in 3m25s
CI / OCR Service Tests (pull_request) Successful in 22s
CI / Backend Unit Tests (pull_request) Successful in 3m46s
CI / fail2ban Regex (pull_request) Successful in 44s
CI / Semgrep Security Scan (pull_request) Successful in 23s
CI / Compose Bucket Idempotency (pull_request) Successful in 1m7s
Importing layout.css in test-setup.ts activated Tailwind's responsive
breakpoint classes (hidden lg:flex, hidden md:block, etc.), making
42 elements invisible at the default narrow Playwright test viewport.
Revert the CSS import. Instead, add inline style attributes to the three
components whose tests measure computed properties (min-height, font-size)
— these values match what the Tailwind classes produce, so the real app
appearance is unchanged.
Also fix goto mock leakage in the geschichten/[id] delete-failure test:
the delete-success test's goto('/geschichten') call was not cleared before
the failure test ran. Add beforeEach(vi.clearAllMocks) to reset mock state.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
44 lines
1.4 KiB
Svelte
44 lines
1.4 KiB
Svelte
<script lang="ts">
|
|
import { m } from '$lib/paraglide/messages.js';
|
|
import { formatDate } from '$lib/shared/utils/date';
|
|
import type { components } from '$lib/generated/api';
|
|
|
|
type JourneyItemView = components['schemas']['JourneyItemView'];
|
|
|
|
interface Props {
|
|
item: JourneyItemView;
|
|
}
|
|
|
|
let { item }: Props = $props();
|
|
|
|
// Safe: JourneyReader filters out items where document === null before rendering this component.
|
|
const doc = $derived(item.document!);
|
|
const formattedDate = $derived(doc.documentDate ? formatDate(doc.documentDate, 'short') : null);
|
|
const ariaLabel = $derived(
|
|
formattedDate
|
|
? m.journey_item_open_aria({ date: formattedDate })
|
|
: m.journey_item_open_aria_undated()
|
|
);
|
|
const hasNote = $derived(item.note != null && item.note.trim().length > 0);
|
|
</script>
|
|
|
|
<a
|
|
href="/documents/{doc.id}"
|
|
aria-label={ariaLabel}
|
|
style="display: flex; min-height: 44px; flex-direction: column"
|
|
class="flex min-h-[44px] flex-col gap-1 rounded border border-line bg-surface px-4 py-3 font-serif text-base text-ink hover:bg-muted focus:outline-none focus-visible:ring-2 focus-visible:ring-focus-ring"
|
|
>
|
|
<span class="font-bold">{doc.title}</span>
|
|
{#if formattedDate}
|
|
<span class="font-sans text-sm text-ink-3">{formattedDate}</span>
|
|
{/if}
|
|
</a>
|
|
|
|
{#if hasNote}
|
|
<!-- plaintext — do NOT use {@html} here -->
|
|
<p class="mt-1 flex items-baseline gap-1 font-sans text-sm text-ink-3">
|
|
<span aria-hidden="true">✎</span>
|
|
{item.note}
|
|
</p>
|
|
{/if}
|