Commit Graph

5700 Commits

Author SHA1 Message Date
Claude
8fc7f6bdb7
Fix fit-to-screen drag: use noCompactor for free horizontal movement
In fit-to-screen mode, pass noCompactor to <Responsive> so elements
follow the mouse freely without vertical compaction pushing them down.
The swap-on-drop logic (mouse coordinates in onDragStop) stays unchanged.

https://claude.ai/code/session_01Cu7YDRKZrYX3sBs6g9w2dy
2026-03-22 00:31:56 +00:00
Claude
29e2003a84
Fix fit-to-screen drag types to match EventCallback signature
All LayoutItem args are nullable (LayoutItem | null) and event is Event
not MouseEvent — matching the actual react-grid-layout EventCallback type.
fitDragRef simplified to string | null. Cast event to MouseEvent inside
the handler to access clientX/Y for pixel-accurate slot detection.

https://claude.ai/code/session_01Cu7YDRKZrYX3sBs6g9w2dy
2026-03-22 00:04:21 +00:00
ibs0d
b393f20857
Merge pull request #99 from ibs0d/revert-98-claude/add-fit-to-screen-mode-XvHoV
Revert "Fix fit-to-screen horizontal swap using real mouse coordinates"
2026-03-22 10:48:50 +11:00
ibs0d
b277b0bd98
Revert "Fix fit-to-screen horizontal swap using real mouse coordinates" 2026-03-22 10:48:32 +11:00
ibs0d
83dbc9fc30
Merge pull request #98 from ibs0d/claude/add-fit-to-screen-mode-XvHoV
Fix fit-to-screen horizontal swap using real mouse coordinates
2026-03-22 00:14:15 +11:00
Claude
051f680b04
Fix fit-to-screen horizontal swap using real mouse coordinates
rgl with compactType=vertical doesn't move items horizontally, so
layoutItem.x in onDragStop stays near its origin, making horizontal
slot detection wrong.

Switch to tracking event.clientX/Y from onDrag (fitDragRef), then in
onDragStop translate the final mouse position against the .grid-layout
element's bounding rect to get pixel-accurate targetCol/targetRow.
This makes horizontal, vertical, and long-distance swaps all reliable.

https://claude.ai/code/session_01Cu7YDRKZrYX3sBs6g9w2dy
2026-03-21 13:12:41 +00:00
ibs0d
cd03cc0ccd
Merge pull request #97 from ibs0d/claude/add-fit-to-screen-mode-XvHoV
Fix fit-to-screen drag: support non-adjacent and horizontal swaps
2026-03-21 23:51:47 +11:00
Claude
3d1de5bf69
Fix fit-to-screen drag: support non-adjacent and horizontal swaps
Previous approach sorted react-grid-layout's post-drag positions to infer
order, which broke for non-adjacent and horizontal moves because rgl pushes
items down instead of swapping them.

New approach:
- onDrag records which item is being dragged (draggedItemRef)
- onDragStop uses the dragged item's final x/y to compute the target slot
  in our own grid, then performs a clean swap in the ordered name array
- Layout is always fully regenerated from our order array, ignoring rgl's
  position arithmetic entirely

https://claude.ai/code/session_01Cu7YDRKZrYX3sBs6g9w2dy
2026-03-21 12:49:02 +00:00
ibs0d
3a550ebc2f
Merge pull request #96 from ibs0d/claude/add-fit-to-screen-mode-XvHoV
Fix fit-to-screen drag card disappearing and swap icon
2026-03-21 23:31:52 +11:00
Claude
46334ec8be
Fix fit-to-screen drag card disappearing and swap icon
handleFitDragStop now sorts dragged items by position to determine new
order, then recalculates all x/y coords into a strict dense grid instead
of spreading react-grid-layout's arbitrary y values — prevents cards from
being pushed off-screen after a drag.

Also replaces LuMaximize with LuScanBarcode for the fit-to-screen button.

https://claude.ai/code/session_01Cu7YDRKZrYX3sBs6g9w2dy
2026-03-21 12:26:03 +00:00
ibs0d
f2b6f08124
Merge pull request #95 from ibs0d/claude/add-fit-to-screen-mode-XvHoV
Allow drag reordering in Fit to Screen mode
2026-03-21 22:59:03 +11:00
Claude
853978ed4d
Allow drag reordering in Fit to Screen mode
In fitToScreen mode, drag is now enabled so users can reorder cameras
while in edit mode. A fitLayoutOverride state captures the new order
after each drag, normalizing w/h back to gridUnitsPerCam to prevent
size changes. The override resets automatically when the camera list or
grid parameters change.

https://claude.ai/code/session_01Cu7YDRKZrYX3sBs6g9w2dy
2026-03-21 11:53:49 +00:00
ibs0d
fc5e59ec54
Merge pull request #94 from ibs0d/claude/add-camera-rotation-support-Lg2l9
Add ui.rotate support to PreviewPlayer (scrubbing preview in recordings)
2026-03-21 21:50:12 +11:00
Claude
e03f626aeb
Add ui.rotate support to PreviewPlayer (scrubbing preview in recordings)
- PreviewPlayer: add rotate prop, pass through to PreviewVideoPlayer and
  PreviewFramesPlayer
- PreviewVideoPlayer: add rotate prop + ResizeObserver; wrap <img> and
  <video> in width/height-swap container with rotate(90deg) transform;
  add h-full when rotate to fix height chain
- PreviewFramesPlayer: same pattern for <img> frame previews
- DynamicVideoPlayer: pass rotate={rotate} to PreviewPlayer

https://claude.ai/code/session_01CDLHQPGpf8w44jpsG8g8nM
2026-03-21 10:31:22 +00:00
ibs0d
8a83bb2e04
Merge pull request #93 from ibs0d/claude/add-fit-to-screen-mode-XvHoV
Add Fit to Screen mode to Live view grid
2026-03-21 21:22:52 +11:00
Claude
be1a19bccd
Add Fit to Screen mode to Live view grid
Adds a toggle button to the Live view toolbar that automatically arranges
all cameras to fit within the viewport without scrolling. Uses a brute-force
algorithm to find the optimal number of columns that maximizes camera size
while keeping all cameras visible. State persists via IndexedDB.

https://claude.ai/code/session_01Cu7YDRKZrYX3sBs6g9w2dy
2026-03-21 10:17:13 +00:00
ibs0d
81f3619542
Merge pull request #92 from ibs0d/claude/add-camera-rotation-support-Lg2l9
Fix ui.rotate in HlsVideoPlayer: broken CSS height chain on desktop
2026-03-21 20:03:40 +11:00
Claude
6f70c1511d
Fix ui.rotate in HlsVideoPlayer: broken CSS height chain on desktop
TransformComponent's contentStyle had height: undefined on desktop,
so the rotate container's ResizeObserver measured height=0, causing
the inner div to get width=0 and the video to be invisible.

Adding || rotate to the height condition ensures the height chain is
intact when rotation is active, matching the isMobile path that already
set height: "100%".

https://claude.ai/code/session_01CDLHQPGpf8w44jpsG8g8nM
2026-03-21 09:02:48 +00:00
ibs0d
e0ee08ac15
Merge pull request #91 from ibs0d/claude/add-camera-rotation-support-Lg2l9
Add ui.rotate support to RecordingView / HlsVideoPlayer
2026-03-21 19:45:49 +11:00
Claude
4a35ce1f70
Add ui.rotate support to RecordingView / HlsVideoPlayer
- HlsVideoPlayer: add rotate prop; when true, wraps <video> in a
  ResizeObserver-tracked container that swaps width/height and applies
  rotate(90deg) transform, mirroring the MsePlayer grid-rotation logic
- DynamicVideoPlayer: thread rotate prop through to HlsVideoPlayer
- RecordingView: invert getCameraAspect ratio (1/ratio) for cameras
  with ui.rotate so the outer container gets portrait proportions;
  pass rotate={camera.ui?.rotate} to DynamicVideoPlayer

https://claude.ai/code/session_01CDLHQPGpf8w44jpsG8g8nM
2026-03-21 08:41:56 +00:00
ibs0d
cdb58a43a5
Merge pull request #90 from ibs0d/claude/add-camera-rotation-support-Lg2l9
Fix ui.rotate: broken CSS height chain causing blank video
2026-03-21 19:23:11 +11:00
Claude
25a869eb43
Fix ui.rotate: broken CSS height chain causing blank video
Root cause: LivePlayer's outer div has no explicit height (only w-full),
so when MsePlayer reads containerSize.height via ResizeObserver it gets 0.
With isRotatedGrid=true, MsePlayer sets the inner div width:
containerSize.height → width: 0 → video invisible.

Fix:
- Add size-full to LivePlayer className when camera.ui?.rotate, ensuring
  height: 100% propagates through the chain so MsePlayer gets real dims
- Re-add cameraAspectRatio inversion (1/ratio) for portrait container
  layout; now that the height chain is intact this works correctly:
  portrait container → LivePlayer size-full → MsePlayer real dims → swap+rotate

https://claude.ai/code/session_01CDLHQPGpf8w44jpsG8g8nM
2026-03-21 08:17:40 +00:00
ibs0d
3c111b2f3b
Merge pull request #89 from ibs0d/claude/add-camera-rotation-support-Lg2l9
Fix: revert cameraAspectRatio inversion for ui.rotate cameras
2026-03-21 18:58:51 +11:00
Claude
54b3717a60
Fix: revert cameraAspectRatio inversion for ui.rotate cameras
The previous commit caused a double dimension swap for rotated cameras:
- LiveCameraView was inverting the aspect ratio (1/ratio) → portrait container
- MsePlayer was then swapping width/height again internally when
  isRotatedGrid=true → video got zero/invalid dimensions, nothing visible

The MsePlayer already handles the full rotation internally via CSS variables
(transform + width/height swap). The container in LiveCameraView should
keep the original (landscape) aspect ratio, matching the grid cell behavior
in DraggableGridLayout where this works correctly.

https://claude.ai/code/session_01CDLHQPGpf8w44jpsG8g8nM
2026-03-21 07:55:26 +00:00
ibs0d
a8ee19397c
Merge pull request #88 from ibs0d/claude/add-camera-rotation-support-Lg2l9
Add ui.rotate support to LiveCameraView single-camera view
2026-03-21 18:34:35 +11:00
Claude
ea9ca2f8d1
Add ui.rotate support to LiveCameraView single-camera view
- Invert cameraAspectRatio when camera.ui?.rotate is true so the
  container dimensions match the rotated video (width↔height swap)
- Pass CSS variables --frigate-mse-grid-rotated and
  --frigate-mse-grid-rotation to LivePlayer, enabling the existing
  MsePlayer rotation/swap logic for single-camera view
- Fullscreen orientation lock works automatically: an inverted ratio
  < 1 causes portrait lock for a normally-landscape camera

https://claude.ai/code/session_01CDLHQPGpf8w44jpsG8g8nM
2026-03-21 07:32:14 +00:00
ibs0d
28b5b17b58
Merge pull request #87 from ibs0d/claude/fix-camera-filter-history-q8W9C
fix: pass camera name to Review page when navigating from Live Camera…
2026-03-21 17:45:52 +11:00
Claude
ee7f0c6717
fix: pass camera name to Review page when navigating from Live Camera View
When clicking the History button on a specific camera's Live view,
append `?cameras=<camera_name>` to the review URL so the camera
filter is pre-set to that camera instead of showing "All Cameras".

The Events (Review) page already supports reading the `cameras` URL
parameter via useSearchEffect - no changes needed there.

Fixes: #12776, #16987

https://claude.ai/code/session_01PnMA1HcuKsEXcvVLaXRgF1
2026-03-21 06:42:43 +00:00
ibs0d
c01fd3f38c
Merge pull request #86 from ibs0d/claude/remove-object-contain-7JCSW
Remove redundant object-contain from video elements
2026-03-21 14:03:28 +11:00
Claude
a183efbffc
Remove redundant object-contain from video elements
Commit f481d6d (PR #81) added object-contain to <video> elements in
PreviewPlayer.tsx and HlsVideoPlayer.tsx, but browsers already default
to contain behavior for <video>. Remove the redundant class.

https://claude.ai/code/session_01Ra1xpVwumBhyd6gqUgfGUa
2026-03-21 02:59:12 +00:00
ibs0d
27329b4991
Merge pull request #85 from ibs0d/revert-84-claude/fix-preview-player-layout-s65yN
Revert "Fix PreviewPlayer layout: replace size-full with w-full to allow aspe…"
2026-03-21 13:47:51 +11:00
ibs0d
c9971081b7
Revert "Fix PreviewPlayer layout: replace size-full with w-full to allow aspe…" 2026-03-21 13:46:37 +11:00
ibs0d
c089a21def
Merge pull request #84 from ibs0d/claude/fix-preview-player-layout-s65yN
Fix PreviewPlayer layout: replace size-full with w-full to allow aspe…
2026-03-21 13:07:32 +11:00
Claude
93138cbfb3
Fix PreviewPlayer layout: replace size-full with w-full to allow aspect-ratio CSS to work
When scrubbing in RecordingView, tall cameras passed size-full (width:100% + height:100%)
to PreviewPlayer, causing the browser to ignore aspect-ratio. Replacing size-full with
w-full lets height be computed from width + aspect-ratio, preserving correct proportions.

https://claude.ai/code/session_019sUH2h6HoVswdtD7EbhAJa
2026-03-21 02:00:50 +00:00
ibs0d
08b1c43c16
Merge pull request #83 from ibs0d/revert-82-claude/fix-preview-aspect-ratio-GZq8u
Revert "fix: preserve aspect ratio in preview players during timeline scrubbing"
2026-03-21 12:58:41 +11:00
ibs0d
a5bb293162
Revert "fix: preserve aspect ratio in preview players during timeline scrubbing" 2026-03-21 12:58:30 +11:00
ibs0d
1e10a2f746
Merge branch 'blakeblackshear:dev' into dev 2026-03-21 12:42:30 +11:00
ibs0d
bd1971301d
Merge pull request #82 from ibs0d/claude/fix-preview-aspect-ratio-GZq8u
fix: preserve aspect ratio in preview players during timeline scrubbing
2026-03-21 12:37:06 +11:00
Claude
6d6b800674
fix: preserve aspect ratio in preview players during timeline scrubbing
Replace size-full (100%×100%) on img/video elements with max-h-full max-w-full
so portrait (9:16) and 4:3 cameras maintain their natural proportions during
scrubbing in RecordingView. Add items-center to flex containers so content
stays vertically centered within the available space.

https://claude.ai/code/session_01H1uowWMpsNm1U8HdcSP8AA
2026-03-21 01:34:18 +00:00
Josh Hawkins
6d2b84e202
Improve process watchdog (#22557)
Some checks failed
CI / AMD64 Build (push) Has been cancelled
CI / ARM Build (push) Has been cancelled
CI / Jetson Jetpack 6 (push) Has been cancelled
CI / AMD64 Extra Build (push) Has been cancelled
CI / ARM Extra Build (push) Has been cancelled
CI / Synaptics Build (push) Has been cancelled
CI / Assemble and push default build (push) Has been cancelled
* monitor subprocesses and auto-restart with watchdog

* fix typing

* formatting
2026-03-20 19:02:47 -05:00
Nicolas Mowen
a8da4c4521
Add support a looping GenAI process to monitor a camera (#22556)
* Add support for VLM monitoring a camera

* Cleanup

* Cleanup
2026-03-20 17:44:02 -06:00
Nicolas Mowen
acd10d0e08
Various Tweaks (#22554)
Some checks are pending
CI / AMD64 Build (push) Waiting to run
CI / ARM Build (push) Waiting to run
CI / Jetson Jetpack 6 (push) Waiting to run
CI / AMD64 Extra Build (push) Blocked by required conditions
CI / ARM Extra Build (push) Blocked by required conditions
CI / Synaptics Build (push) Blocked by required conditions
CI / Assemble and push default build (push) Blocked by required conditions
* Change review GenAI metric to seconds

* Update API docs
2026-03-20 11:38:22 -06:00
Nicolas Mowen
373bcadef8
Dynamic vision chat (#22551)
* Improve live context image handling

* Improve chat handling

* Cleanup
2026-03-20 11:01:46 -06:00
Josh Hawkins
34a06ac77b
Tweaks (#22552)
* add weblate to contributing docs

* show vertex points in dialog only in motion search
2026-03-20 11:00:28 -06:00
Nicolas Mowen
23820718ee
Fix splintered language keys (#22550) 2026-03-20 10:02:34 -05:00
Nicolas Mowen
411798004a
Update ffmpeg (#22548)
* Update ffmpeg builds to 7.1

* Remove unused

* Cleanup
2026-03-20 08:50:58 -05:00
Josh Hawkins
68de18f10d
Settings UI tweaks (#22547)
* fix genai settings ui

- add roles widget to select roles for genai providers
- add dropdown in semantic search to allow selection of embeddings genai provider

* tweak grouping to prioritize fieldOrder before groups

previously, groups were always rendered first. now fieldOrder is respected, and any fields in a group will cause the group and all the fields in that group to be rendered in order. this allows moving the enabled switches to the top of the section

* mobile tweaks

stack buttons, add more space on profiles pane, and move the overridden badge beneath the description

* language consistency

* prevent camera config sections from being regenerated for profiles

* conditionally import axengine module

to match other detectors

* i18n

* update vscode launch.json for new integrated browser

* formatting
2026-03-20 07:24:34 -06:00
ibs0d
f481d6de5a
Merge pull request #81 from ibs0d/claude/fix-video-player-styling-hjVCd
fix: add object-contain to HlsVideoPlayer and PreviewPlayer video ele…
2026-03-20 21:14:23 +11:00
Claude
b61719e226
fix: add object-contain to HlsVideoPlayer and PreviewPlayer video elements
Ensures recorded video playback preserves aspect ratio instead of
stretching to fill the container. MsePlayer (live grid) is unchanged.

https://claude.ai/code/session_01SxrckSRTA8Hrd3d7M4qw4i
2026-03-20 10:13:23 +00:00
ibs0d
d8b68b53b5
Merge pull request #80 from ibs0d/revert-79-claude/fix-video-stretching-preview-8xXtb
Revert "fix: prevent video stretching in timeline scrubbing preview"
2026-03-20 21:11:32 +11:00