Repository navigation
Releases: Blueion76/sightline-for-frigate
Releases · Blueion76/sightline-for-frigate
Release list
v1.1.6
v1.1.5
1.1.5
Timeline and calendar reliability
- Reworked the timeline calendar control around a real
input[type="date"]positioned directly over the visible calendar button. iOS/Safari/WKWebView keeps the direct native-input gesture path instead of forwarding a tap to an offscreen input. - Added a desktop Chromium path that opens the native calendar with
showPicker()from the trusted mouse click; Enter/Space keyboard activation is supported as well. - Fixed cold-start calendar initialization so null/zero timeline placeholders are not interpreted as Unix epoch time. The picker now opens on Today instead of Dec 31, 1969 / Jan 1, 1970 before the timeline has finished starting.
- Refreshes the native date input from the current timeline focus before pointer, touch, focus, and delegated calendar activation so the picker always opens on the date currently under the playhead.
- Selecting a calendar date is now a complete navigation action: Sightline preserves the current timeline span/zoom, starts the selected day at local midnight, exits LIVE-follow mode, invalidates stale playback/data work, and immediately seeks/plays the continuous recording at the fixed playhead without requiring a second timeline click.
- Historical navigation displays the selected date beside the calendar icon and returns to the compact icon-only control on Today. The label follows scrubbing and recorded playback across day boundaries.
- Hardened desktop timeline panning so a drag can begin directly on a detection thumbnail/event marker after a 4px movement threshold while a stationary click still opens the event. The synthetic click after a real drag is suppressed.
- Preserved timeline legend filtering through the refactor so clicking a detection class filters the timeline and clicking the active class again returns to All.
- Replaced factor-based +/- timeline zoom with discrete scales:
1m,5m,10m,30m,45m,1h,3h,6h,12h, and24h. - Fixed recorded-playback synchronization on Windows/Chromium: the media decoder clock now translates the visible timeline window by the same fractional delta as playback, keeping the fixed playhead,
HH:MM:SSpill, time scale, recording rail, detections, and thumbnails on the same wall-clock timestamp instead of allowing the label to advance independently. - Fixed desktop Multiview timeline mouse dragging after opening a clip and returning to Live. Timeline pointer/mouse/touch/wheel listeners now share one abortable lifecycle, and returning from full-card playback explicitly refreshes that binding set so the track cannot be left with a
mousedownhandler but no activemousemove/mouseuptransport. - Fixed excess blank space when opening a clip from Multiview on wide/workstation dashboards. Full-card playback is now an explicit responsive visibility state: timeline/media/grid panes cannot be resurrected by a resize pass, the stale synchronized Multiview column height is removed while playback is active, and the compact one-pane layout is fully restored back to Multiview afterward.
- Unified Multiview clip playback so clips selected from the Clips browser, Reviews, or the timeline temporarily replace the entire player workspace instead of opening inside only the camera tile that produced the event. Back to Multiview restores the original grid.
- Fixed the wide-workstation Clips side-panel edge case where a visibly mounted Multiview grid could briefly disagree with
_viewMode. Full-player playback now recognizes the rendered grid as a fallback, so side-panel clip selection still replaces the entire Multiview player and returns to the grid afterward.
Live audio and two-way audio
- Fixed microphone discovery for privacy-restricted browsers that return an empty
enumerateDevices()list before permission is granted. Talk remains eligible whengetUserMedia()is supported, and the real permission request remains authoritative. - Added an explicit live-audio speaker control for go2rtc WebRTC streams so inbound camera audio can be unmuted from a direct user gesture instead of depending on browser-native video controls.
- Preserved Sightline's existing Home Assistant Frigate integration same-origin go2rtc WebSocket proxy, two-way-audio session lifecycle, disconnect timeout, and camera-bound talk behavior.
Source architecture and maintainability
- Refactored the card into focused domain modules while preserving the existing Lovelace configuration, Frigate API behavior, Home Assistant authentication/proxy behavior, DOM hooks, playback routes, and user-facing feature set.
- Split the previous catch-all implementations into dedicated
data/,live/,media/,playback/,talk/, andtimeline/modules with small composition entry points. - Renamed the internal
multi-recording-*implementation to the clearermultiview/domain and separated Multiview core state, controller logic, player synchronization, media-browser behavior, and timeline UI. - Replaced constructor-wide inline state assignments with a documented
initializeCardState()module so mutable lifecycle state is defined in one place. - Moved playback workspace/grid presentation policy into
ui/playback-layout.jsinstead of patching_enter(),_showLive(), and_renderTimeline()after class composition. - Removed the side-effect
multi-recording-init.js/ version-specific patch-layer architecture and now compose method groups declaratively inSightlineCard.js, eliminating override chains that previously allowed one click handler to bypass another. - Split the visual editor into dedicated configuration serialization, entity/registry discovery, and rendering modules instead of a single large methods file with post-class prototype patches.
- Extracted the large shell stylesheet from the DOM renderer into
styles/shell.js, keeping rendering code focused on structure while preserving CSS cascade order and visual behavior. - Added an explicit build manifest shared by the HACS build and architecture validation. Every runtime
src/**/*.jsmodule must be present in the manifest and duplicate entries are rejected. - Added architecture regression checks that prohibit post-composition prototype patching, verify intentional method ownership/order, and ensure source modules cannot accidentally work in ESM tests while being omitted from the generated HACS bundle.
Validation
- Expanded regression coverage for cold-start date initialization, direct-hit iOS date selection, trusted-click desktop picker activation, one-step calendar playback, selected-date labeling, timeline span preservation, Chromium media-clock synchronization, legend filtering, microphone pre-permission discovery, live-audio unmute, desktop event-card dragging/click suppression, Multiview behavior, responsive layouts, media browsing, discrete timeline scales, and source/build architecture.
npm run verifyremains the release gate: it rebuildsdist/sightline-for-frigate.js, validates the source/HACS bundle, and runs the complete regression suite.
v1.1.4
1.1.4
- Replaced the timeline's custom calendar popover with the browser's native system date picker behavior.
- Made Clips, Recordings, and Reviews lists responsive scroll containers on phone, tablet, and workstation layouts instead of forcing a fixed four-row height.
- Fixed Clips/Recordings/Reviews as the configured default tab on wide dashboards so the Live pane is measured and kept mounted from the first paint.
- Made workstation and medium-width layouts derive their grid columns from the panes that are actually enabled.
- Disabling the timeline now removes the timeline column completely and lets Live and the media browser expand into the freed space instead of leaving a blank gap.
- Added regression coverage for native timeline date selection, responsive media scrolling, Clips-first startup, and timeline-disabled layouts.