feat(frontend): add annotation visibility toggle to PDF toolbar
Some checks failed
CI / Unit & Component Tests (push) Has been cancelled
CI / Backend Unit Tests (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
CI / Unit & Component Tests (pull_request) Successful in 2m27s
CI / Backend Unit Tests (pull_request) Successful in 2m6s
CI / E2E Tests (pull_request) Failing after 26m28s
Some checks failed
CI / Unit & Component Tests (push) Has been cancelled
CI / Backend Unit Tests (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
CI / Unit & Component Tests (pull_request) Successful in 2m27s
CI / Backend Unit Tests (pull_request) Successful in 2m6s
CI / E2E Tests (pull_request) Failing after 26m28s
Eye/eye-slash button in the PDF controls bar lets the user hide all annotation highlights to read the document unobstructed and show them again with one click. - Button only renders when at least one annotation exists - Active state (hidden) highlighted with brand-mint/bg-white/10 so the current state is always clear - i18n keys added for de/en/es Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -258,5 +258,7 @@
|
|||||||
"doc_panel_annotate": "Annotieren",
|
"doc_panel_annotate": "Annotieren",
|
||||||
"doc_panel_annotate_stop": "Fertig",
|
"doc_panel_annotate_stop": "Fertig",
|
||||||
"doc_panel_annotation_thread_title": "Annotation",
|
"doc_panel_annotation_thread_title": "Annotation",
|
||||||
"doc_panel_discussion_annotation_tab": "Annotation · Seite {page}"
|
"doc_panel_discussion_annotation_tab": "Annotation · Seite {page}",
|
||||||
|
"pdf_annotations_show": "Annotierungen anzeigen",
|
||||||
|
"pdf_annotations_hide": "Annotierungen verbergen"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -258,5 +258,7 @@
|
|||||||
"doc_panel_annotate": "Annotate",
|
"doc_panel_annotate": "Annotate",
|
||||||
"doc_panel_annotate_stop": "Done",
|
"doc_panel_annotate_stop": "Done",
|
||||||
"doc_panel_annotation_thread_title": "Annotation",
|
"doc_panel_annotation_thread_title": "Annotation",
|
||||||
"doc_panel_discussion_annotation_tab": "Annotation · Page {page}"
|
"doc_panel_discussion_annotation_tab": "Annotation · Page {page}",
|
||||||
|
"pdf_annotations_show": "Show annotations",
|
||||||
|
"pdf_annotations_hide": "Hide annotations"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -258,5 +258,7 @@
|
|||||||
"doc_panel_annotate": "Anotar",
|
"doc_panel_annotate": "Anotar",
|
||||||
"doc_panel_annotate_stop": "Listo",
|
"doc_panel_annotate_stop": "Listo",
|
||||||
"doc_panel_annotation_thread_title": "Anotación",
|
"doc_panel_annotation_thread_title": "Anotación",
|
||||||
"doc_panel_discussion_annotation_tab": "Anotación · Página {page}"
|
"doc_panel_discussion_annotation_tab": "Anotación · Página {page}",
|
||||||
|
"pdf_annotations_show": "Mostrar anotaciones",
|
||||||
|
"pdf_annotations_hide": "Ocultar anotaciones"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import { onMount } from 'svelte';
|
|||||||
import { SvelteMap } from 'svelte/reactivity';
|
import { SvelteMap } from 'svelte/reactivity';
|
||||||
import type { PDFDocumentProxy, PDFPageProxy, RenderTask } from 'pdfjs-dist';
|
import type { PDFDocumentProxy, PDFPageProxy, RenderTask } from 'pdfjs-dist';
|
||||||
import AnnotationLayer from './AnnotationLayer.svelte';
|
import AnnotationLayer from './AnnotationLayer.svelte';
|
||||||
|
import { m } from '$lib/paraglide/messages.js';
|
||||||
|
|
||||||
let {
|
let {
|
||||||
url,
|
url,
|
||||||
@@ -55,6 +56,7 @@ type Annotation = {
|
|||||||
let annotations = $state<Annotation[]>([]);
|
let annotations = $state<Annotation[]>([]);
|
||||||
let annotateColor = $state('#ffff00');
|
let annotateColor = $state('#ffff00');
|
||||||
let commentCounts = new SvelteMap<string, number>();
|
let commentCounts = new SvelteMap<string, number>();
|
||||||
|
let showAnnotations = $state(true);
|
||||||
|
|
||||||
onMount(async () => {
|
onMount(async () => {
|
||||||
// Dynamic import keeps pdfjs out of the SSR bundle entirely
|
// Dynamic import keeps pdfjs out of the SSR bundle entirely
|
||||||
@@ -403,6 +405,53 @@ function zoomOut() {
|
|||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Annotation visibility toggle (shown when annotations exist) -->
|
||||||
|
{#if annotations.length > 0}
|
||||||
|
<button
|
||||||
|
onclick={() => (showAnnotations = !showAnnotations)}
|
||||||
|
aria-label={showAnnotations ? m.pdf_annotations_hide() : m.pdf_annotations_show()}
|
||||||
|
title={showAnnotations ? m.pdf_annotations_hide() : m.pdf_annotations_show()}
|
||||||
|
class="rounded p-1 transition {showAnnotations
|
||||||
|
? 'text-gray-300 hover:bg-white/10'
|
||||||
|
: 'bg-white/10 text-brand-mint'}"
|
||||||
|
>
|
||||||
|
{#if showAnnotations}
|
||||||
|
<svg
|
||||||
|
class="h-4 w-4"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
{:else}
|
||||||
|
<svg
|
||||||
|
class="h-4 w-4"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
d="M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
{/if}
|
||||||
|
</button>
|
||||||
|
{/if}
|
||||||
|
|
||||||
<!-- PDF canvas area -->
|
<!-- PDF canvas area -->
|
||||||
<div class="relative flex-1 overflow-auto">
|
<div class="relative flex-1 overflow-auto">
|
||||||
{#if loading}
|
{#if loading}
|
||||||
@@ -424,15 +473,17 @@ function zoomOut() {
|
|||||||
class="textLayer"
|
class="textLayer"
|
||||||
style="position: absolute; top: 0; left: 0; overflow: hidden; pointer-events: none; line-height: 1;"
|
style="position: absolute; top: 0; left: 0; overflow: hidden; pointer-events: none; line-height: 1;"
|
||||||
></div>
|
></div>
|
||||||
<AnnotationLayer
|
{#if showAnnotations}
|
||||||
annotations={annotations.filter((a) => a.pageNumber === currentPage)}
|
<AnnotationLayer
|
||||||
canAnnotate={annotateMode}
|
annotations={annotations.filter((a) => a.pageNumber === currentPage)}
|
||||||
color={annotateColor}
|
canAnnotate={annotateMode}
|
||||||
onDraw={handleAnnotationDraw}
|
color={annotateColor}
|
||||||
onDelete={handleAnnotationDelete}
|
onDraw={handleAnnotationDraw}
|
||||||
commentCounts={Object.fromEntries(commentCounts)}
|
onDelete={handleAnnotationDelete}
|
||||||
onAnnotationClick={handleAnnotationClick}
|
commentCounts={Object.fromEntries(commentCounts)}
|
||||||
/>
|
onAnnotationClick={handleAnnotationClick}
|
||||||
|
/>
|
||||||
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
|||||||
Reference in New Issue
Block a user