feat(documents): zoom-in tool for the timeline (#385)
Adds a zoom action that narrows the visible timeline range to the current selection so the user can drill from year-level back into month-level density. Zoom state lives in the URL (zoomFrom / zoomTo) so it survives reload and is shareable. - New `clipBucketsToRange(buckets, from, to)` helper applied before the >240-month year-aggregate decision, so a zoomed window flips back to month bars automatically when the clip narrows the range enough. - `TimelineDensityFilter` gains `zoomFrom`, `zoomTo`, and `onzoomchange` props. Zoom button shown only when a selection exists and we aren't already zoomed; reset-zoom shown only when zoomed. Both placed in a shared right-edge action cluster alongside the × clear button. - `+page.ts` reads zoomFrom/zoomTo from the URL and forwards them as props. `+page.svelte` extends FilterSnapshot + buildSearchParams, and triggerSearch accepts an optional zoom override so the onzoomchange callback can write the new pair (or clear them) atomically. - 7 new component tests + 2 new page-integration tests cover the visibility rules and URL writes. - 4 new unit tests for `clipBucketsToRange`. - 3 new i18n keys (zoom in / zoom reset / drag aria-live) across de/en/es. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1051,5 +1051,8 @@
|
||||
"timeline_clear_selection": "Clear selection",
|
||||
"timeline_count_label": "docs",
|
||||
"timeline_loading": "Loading timeline…",
|
||||
"timeline_filtered_count": "{count} documents in range"
|
||||
"timeline_filtered_count": "{count} documents in range",
|
||||
"timeline_zoom_in": "Zoom in",
|
||||
"timeline_zoom_reset": "Reset zoom",
|
||||
"timeline_dragging_aria_live": "Range {from} to {to} selected"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user