Commit Graph
2666 Commits
Author SHA1 Message Date
Matthijsanddermotduffy fc7e09952f fix: vertically center icons within icon buttons (#2734)
Menu icons sit visibly high inside their round buttons in the iOS
companion app, and one pixel high everywhere else. The card's icon
wrapper (`advanced-camera-card-icon`) is slotted into `ha-icon-button`,
whose label renders slotted content inside a plain `<span>`. The wrapper
is an `inline-block`, so it rides the text baseline and leaves the
font's descender space underneath it: the span grows taller than the
icon (measured: 24.5px around a 22.5px icon under Roboto), the button's
flex layout centers the *span*, and the icon lands high by half the
descent.

That descent is a property of the active font, which is why the offset
differs per platform: about 1px under Roboto, and about 2px when the
font stack resolves to a system font, as on iOS, where it is clearly
visible inside the round menu button background. Slotted Home Assistant
icons do not show this because they are laid out block-level via
`--ha-icon-display`, which the card already sets; the card's own wrapper
element reintroduces the inline-block one level up.

**Change:** lay the wrapper out block-level wherever it is slotted into
`ha-icon-button` (`button.scss`, which also covers the submenu and
next/previous controls). Block layout has no baseline, so the label span
shrinks to exactly the icon and the icon centers.

**Verification:**

- The structure (flex button, label span, slotted icon) rebuilt
standalone in Playwright Chromium and WebKit: with an inline-block icon
the offset is 1px under Roboto and 1.75 to 2px under system fonts, in
both engines; with a block icon it is 0.0px in every engine, font, and
button size tried.
- Measured on a live HA 2026.8.3 dashboard (45px menu buttons): before,
every menu icon center sat 1px above its button center; after, 0.0px for
both a standard menu button and a conditional
`advanced-camera-card-menu-icon` element.
- `yarn run test`, `yarn run test:browser` (chromium), `yarn run lint`,
`yarn run typecheck` pass.

---------

Co-authored-by: dermotduffy <dermot.duffy@gmail.com>
2026-08-30 12:11:10 -07:00
Dermot Duffy d24771db64 fix: Stop reporting a stall when a live provider replaces its media element (#2728)
- Related: #2718
2026-08-30 11:39:56 -07:00
Dermot Duffy c9290fc6be fix: Remove bare method call for mp4 in go2rtc (#2727)
- Closes: #2721
2026-08-29 14:40:56 -07:00
Dermot Duffy 82b7effba3 docs: Clarify integration version minimum (#2725)
- Closes: #2722
2026-08-29 14:24:31 -07:00
Dermot Duffy 1135dd8ec0 fix: go2rtc live provider should work with non-proxied absolute URLs (#2724)
- Closes: #2719
2026-08-29 14:08:48 -07:00
Dermot Duffy 4b101545cc fix: Prevent premature reinitialization when stale HA reconnects (#2717)
- Closes: #2714
2026-08-29 13:47:38 -07:00
Dermot Duffy fb53681978 fix: Cache 2-way audio detection to avoid re-probing (#2716)
- Closes: #2299
2026-08-28 21:23:49 -07:00
Dermot Duffy 8ee69be58b fix: Download recordings with a video file extension (#2712)
- Closes: #2711
2026-08-27 19:17:15 -07:00
Filip Pytlounanddermotduffy 3ee6b6059e feat: Add microphone audio processing constraints (#2708)
## Summary

- add optional microphone constraints for echo cancellation, noise
suppression, automatic gain control, and channel count
- request configured values as non-mandatory `ideal` constraints
- expose privacy-safe microphone capabilities, requested constraints,
and applied settings in card diagnostics
- document the new configuration and add schema, microphone manager, and
diagnostics tests

## Motivation

The card currently calls `getUserMedia()` with `audio: true`. This
leaves echo cancellation, noise suppression, automatic gain control, and
channel count implicit.

Browser and device behavior differs. Explicit processing defaults can
regress microphone gain or amplify noise on some devices. This change
therefore keeps all processing constraints optional and configurable.

## Configuration

```yaml
live:
  microphone:
    constraints:
      echo_cancellation: true
      noise_suppression: true
      auto_gain_control: false
      channel_count: 1
```

Configured values use `ideal` constraints. A browser can ignore
unsupported values. Card diagnostics show the browser capabilities, the
requested constraints, and the reported applied settings.

## Backward compatibility

- existing configurations still use `audio: true`
- no audio-processing defaults are added
- explicit `false` values are preserved
- diagnostic output excludes device and group identifiers

## Validation

- focused microphone, schema, and diagnostics tests: 46 passed
- full test suite: 7,177 passed
- lint passed
- format check passed
- typecheck passed
- unused-code check passed
- production build passed

The optional constraints were also tested successfully with an iOS Home
Assistant Companion client and a go2rtc-based full-duplex intercom. This
is a client microphone-processing change only. It does not add backend
audio denoise.

---------

Co-authored-by: dermotduffy <dermot.duffy@gmail.com>
2026-08-24 07:38:33 -07:00
Dermot Duffy 543e5d0fcf fix: Report a go2rtc backchannel offer error as a failure rather than a missing capability (#2710) 2026-08-23 21:54:20 -07:00
Dermot Duffy e6b93d53e9 fix: Reduce visual clutter on startup (#2709)
- Closes: #2584
2026-08-23 12:25:44 -07:00
Dermot Duffy 03d9df8282 chore: Standardize code, comments and docs on US-English spelling (#2707) 2026-08-23 08:57:41 -07:00
Dermot Duffy 965f2b4c9d fix: Keep the notification popup open while its text is selected (#2706) 2026-08-22 21:29:04 -07:00
Dermot Duffy b2f3243f3e fix: Size the gallery fallback icon frame to fill the thumbnail box (#2705)
- Closes: #2701
2026-08-22 15:02:28 -07:00
Dermot Duffy 60e01cf537 chore: Migrate from @lit-labs/task to @lit/task (#2704)
- Closes: #2703
2026-08-22 14:15:07 -07:00
Dermot Duffy 0aebf3c484 fix: Keep the notification popup visible / centered (#2702)
- Closes: #2693
2026-08-22 08:36:42 -07:00
Dermot Duffy 2f74889bcb fix: Cancel the pending debounced resize when the media dimensions container disconnects (#2700)
- Closes: #2699
2026-08-21 20:45:31 -07:00
Dermot Duffy 11cc543406 fix: Hold the 2-way audio backchannel open for the shortest possible time (#2697)
The card claimed a camera's ONVIF audio backchannel in two places that
had
nothing to do with a call: the capability probe at camera init
(`&microphone`),
and a pre-armed `sendonly` audio transceiver on every live WebRTC offer.
Merely
looking at a dashboard occupied the camera's speaker line. Outbound
audio now
travels on its own audio-only WebRTC connection, opened when a call is
answered
and closed when it ends.

- The backchannel is claimed only for the duration of a call. Idle
viewing
  claims nothing.
- Two-way audio now works in `mse`, `mp4` and `mjpeg` modes (note: the
outbound
  audio still traverses WebRTC).
- No renegotiation and no video blink at call start or end.
- A call that cannot carry audio now reports it and ends, instead of
showing a
  live microphone that goes nowhere.
- `live.microphone.always_connected` is now purely about the browser
microphone
  permission prompt.
- Call setup measured at 66ms (LAN) and ~260ms (cellular) for ICE and
DTLS, plus
  ~300ms for `go2rtc` to open an RTSP backchannel.

Verified against a live Frigate + `go2rtc` instance, and by unit tests
at 100%
coverage.

 - Closes #2691
 - Closes #2039
 - Closes #2178

Ref #2299 -- the probe no longer opens a backchannel, but it still runs
per
camera on every load and reconnect, and still dials the camera on the
direct-`go2rtc` path. Caching remains to be done.

Ref AlexxIT/go2rtc#1860 -- once a call has opened a backchannel,
`go2rtc` keeps
that media set up on the camera's RTSP session for the life of the
producer.

Diagnoses #2678
2026-08-21 20:13:58 -07:00
Dermot Duffy 2d7c86c93c refactor: Convert the build scripts to TypeScript and group them (#2696)
- Closes: #2695
2026-08-21 14:18:37 -07:00
Dermot Duffy 1e03e6a3d9 fix: Stop the automatic upgrade from discarding valid configuration (#2692)
- Closes #2689
2026-08-19 17:02:46 -07:00
Dermot Duffy 84b90bcc7e fix: Remove the unnecessary item limit from folder media (#2688)
- Fixed: #2573
2026-08-17 21:49:11 -07:00
Dermot Duffy 858c5d0610 fix: Move upgrade button to top of editor (#2687) 2026-08-14 21:13:10 -07:00
Dermot Duffy c2f25861ea fix: Remove the microphone selection conditions (#2686)
- Closes: #2679

BREAKING CHANGE: `selected` and `unselected` are removed from
`live.microphone.auto_unmute` / `auto_mute`. A camera change ends any
call and the microphone only carries audio during a call, so neither
were useful.
2026-08-14 18:16:39 -07:00
Dermot Duffy 85d6811761 fix: Release the microphone to the browser when a call ends (#2685)
The microphone is connected when a call needs it and released the moment
that
call ends, so the browser stops reporting it as in use at hangup rather
than
`disconnect_seconds` later.

Existing configurations are migrated automatically by the visual editor.

 - Closes: #2681 

BREAKING CHANGE: `live.microphone.disconnect_seconds` is removed. The
microphone is released when a call ends, so there is no idle countdown
to
configure. Use `live.microphone.always_connected` to hold it open
instead.

BREAKING CHANGE: The `microphone_connect` and `microphone_disconnect`
actions
are removed. The card owns the microphone lifecycle; `microphone_mute`
and
`microphone_unmute` remain.

BREAKING CHANGE: `call` is removed from `live.microphone.auto_mute`,
whose
default is now `[]`. The microphone is muted when a call ends regardless
of
this option.

BREAKING CHANGE: `microphone_unmute` has no effect outside a call.
Nothing
carries the audio at any other time, so the request is ignored rather
than
opening the microphone.
2026-08-14 16:17:31 -07:00
dermotduffy 65bc52d18e Merge remote-tracking branch 'origin/main' into dev 2026-08-10 21:32:41 -07:00
68b10622c5 chore: Merge branch 'main' into dev (#2676)
Co-authored-by: verjager <78507418+verjager@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-08-10 21:26:54 -07:00
Dermot Duffy 70ca0a9af4 fix: Stop a released PTZ key ending another held key's movement (#2675)
- Closes: #2668
2026-08-10 20:22:39 -07:00
Dermot Duffy 3808a1b030 fix: Stop PTZ movement and browser key handling from fighting (#2674)
- Closes: #2623
2026-08-10 14:49:50 -07:00
Dermot Duffy a8aa9ec7c2 fix: Should recover from an interrupted initialization (#2673) 2026-08-10 14:27:40 -07:00
Dermot Duffy 98a0084e7a fix: Stop the live media frame collapsing while a stream loads (#2671)
- Closes: #2574
2026-08-09 21:17:06 -07:00
Dermot Duffy 45f88a86a4 fix: Restore picture element actions on Home Assistant 2026.8+ (#2670)
- Closes: #2663
2026-08-09 20:58:15 -07:00
Dermot Duffy a8ce6acb44 chore: Enable noImplicitAny across the codebase (#2667) 2026-08-09 13:22:57 -07:00
dependabot[bot] 6807fd7690 chore(deps): bump release-drafter/release-drafter from 7.6.0 to 7.7.0 (#2636)
Bumps
[release-drafter/release-drafter](https://github.com/release-drafter/release-drafter)
from 7.6.0 to 7.7.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/release-drafter/release-drafter/releases">release-drafter/release-drafter's
releases</a>.</em></p>
<blockquote>
<h2>v7.7.0</h2>
<h1>What's Changed</h1>
<h2>New</h2>
<ul>
<li>feat: no new contributor template (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1687">#1687</a>)
<a href="https://github.com/cchanche"><code>@​cchanche</code></a></li>
<li>feat: categorize PRs based on conventional title (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1556">#1556</a>)
<a href="https://github.com/cchanche"><code>@​cchanche</code></a></li>
<li>feat: log all config sources (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1674">#1674</a>)
<a href="https://github.com/jetersen"><code>@​jetersen</code></a></li>
</ul>
<h2>Dependency Updates</h2>
<!-- raw HTML omitted -->
<ul>
<li>build(deps-dev): bump postcss from 8.5.17 to 8.5.23 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1683">#1683</a>)
<a
href="https://github.com/apps/dependabot"><code>@​dependabot[bot]</code></a></li>
<li>chore(deps): update npm tool constraint to 12.0.1 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1668">#1668</a>)
<a
href="https://github.com/apps/renovate"><code>@​renovate[bot]</code></a>,
<a href="https://github.com/cchanche"><code>@​cchanche</code></a></li>
<li>chore(deps): update npm tool constraint to 11.18.0 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1665">#1665</a>)
<a
href="https://github.com/apps/renovate"><code>@​renovate[bot]</code></a>,
<a href="https://github.com/cchanche"><code>@​cchanche</code></a></li>
<li>chore(deps): update node.js to v24.18.0 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1664">#1664</a>)
<a
href="https://github.com/apps/renovate"><code>@​renovate[bot]</code></a></li>
<li>build(deps): support GraphQL 17 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1678">#1678</a>)
<a href="https://github.com/jetersen"><code>@​jetersen</code></a></li>
<li>build(deps-dev): Update js-yaml to 4.3.0 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1677">#1677</a>)
<a href="https://github.com/jetersen"><code>@​jetersen</code></a></li>
<li>build(deps-dev): bump shell-quote from 1.8.4 to 1.10.0 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1676">#1676</a>)
<a
href="https://github.com/apps/dependabot"><code>@​dependabot[bot]</code></a></li>
<li>build(deps): bump immutable from 5.1.5 to 5.1.9 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1675">#1675</a>)
<a
href="https://github.com/apps/dependabot"><code>@​dependabot[bot]</code></a></li>
<li>build(deps-dev): bump brace-expansion from 5.0.6 to 5.0.7 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1672">#1672</a>)
<a
href="https://github.com/apps/dependabot"><code>@​dependabot[bot]</code></a></li>
</ul>
<!-- raw HTML omitted -->
<h2>Bug Fixes</h2>
<ul>
<li>fix: preserve proxy-aware fetch in octokit client (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1682">#1682</a>)
<a href="https://github.com/jetersen"><code>@​jetersen</code></a></li>
</ul>
<h2>Maintenance</h2>
<ul>
<li>chore: update references to branch master to main (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1686">#1686</a>)
<a href="https://github.com/cchanche"><code>@​cchanche</code></a></li>
<li>ci: rely on conventional pr titles (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1685">#1685</a>)
<a href="https://github.com/cchanche"><code>@​cchanche</code></a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li>No new contributors</li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/release-drafter/release-drafter/compare/v7.6.0...v7.7.0">https://github.com/release-drafter/release-drafter/compare/v7.6.0...v7.7.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/34d80673e067bdc0c24568d3af899c216adcfaa9"><code>34d8067</code></a>
chore: release v7.7.0</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/cd773d2b9b75f7513ef1d92c9bfe760e0d138c59"><code>cd773d2</code></a>
style: format and lint docs</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/14d2d94a63c5f6d5c41bb4efefbefe2f8d48b56e"><code>14d2d94</code></a>
feat: no new contributor template (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1687">#1687</a>)</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/94daa9e59c22253f20710d0b481d278a7f40c444"><code>94daa9e</code></a>
chore: update references to branch master to main (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1686">#1686</a>)</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/b195e66e4241f7da6ba6eb63d44a37ce6a53794d"><code>b195e66</code></a>
ci: rely on conventional pr titles (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1685">#1685</a>)</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/246878a94cb0e795d863c2de806b0752cde1480f"><code>246878a</code></a>
build(deps-dev): bump postcss from 8.5.17 to 8.5.23 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1683">#1683</a>)</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/c3acaa78fc5d92281d94d01a7e91439fbd5f9a2d"><code>c3acaa7</code></a>
fix: preserve proxy-aware fetch in octokit client (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1682">#1682</a>)</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/22a22c894a8fa53b0dceb19263a406cff84e0787"><code>22a22c8</code></a>
chore(deps): update npm tool constraint to 12.0.1 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1668">#1668</a>)</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/133e592abf06796a6194d6a7d6e0c6c7b859b4ae"><code>133e592</code></a>
chore(deps): update npm tool constraint to 11.18.0 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1665">#1665</a>)</li>
<li><a
href="https://github.com/release-drafter/release-drafter/commit/b806fc00898d1967c32e93cd4a68f34b48ce4b6b"><code>b806fc0</code></a>
chore(deps): update node.js to v24.18.0 (<a
href="https://redirect.github.com/release-drafter/release-drafter/issues/1664">#1664</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/release-drafter/release-drafter/compare/v7.6.0...v7.7.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=release-drafter/release-drafter&package-manager=github_actions&previous-version=7.6.0&new-version=7.7.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-09 13:19:26 -07:00
dependabot[bot] fc8f95800c chore(deps): bump actions/upload-artifact from 6 to 7 (#2655)
Bumps
[actions/upload-artifact](https://github.com/actions/upload-artifact)
from 6 to 7.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/actions/upload-artifact/releases">actions/upload-artifact's
releases</a>.</em></p>
<blockquote>
<h2>v7.0.0</h2>
<h2>v7 What's new</h2>
<h3>Direct Uploads</h3>
<p>Adds support for uploading single files directly (unzipped). Callers
can set the new <code>archive</code> parameter to <code>false</code> to
skip zipping the file during upload. Right now, we only support single
files. The action will fail if the glob passed resolves to multiple
files. The <code>name</code> parameter is also ignored with this
setting. Instead, the name of the artifact will be the name of the
uploaded file.</p>
<h3>ESM</h3>
<p>To support new versions of the <code>@actions/*</code> packages,
we've upgraded the package to ESM.</p>
<h2>What's Changed</h2>
<ul>
<li>Add proxy integration test by <a
href="https://github.com/Link"><code>@​Link</code></a>- in <a
href="https://redirect.github.com/actions/upload-artifact/pull/754">actions/upload-artifact#754</a></li>
<li>Upgrade the module to ESM and bump dependencies by <a
href="https://github.com/danwkennedy"><code>@​danwkennedy</code></a> in
<a
href="https://redirect.github.com/actions/upload-artifact/pull/762">actions/upload-artifact#762</a></li>
<li>Support direct file uploads by <a
href="https://github.com/danwkennedy"><code>@​danwkennedy</code></a> in
<a
href="https://redirect.github.com/actions/upload-artifact/pull/764">actions/upload-artifact#764</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/Link"><code>@​Link</code></a>- made
their first contribution in <a
href="https://redirect.github.com/actions/upload-artifact/pull/754">actions/upload-artifact#754</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/upload-artifact/compare/v6...v7.0.0">https://github.com/actions/upload-artifact/compare/v6...v7.0.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/actions/upload-artifact/commit/043fb46d1a93c77aae656e7c1c64a875d1fc6a0a"><code>043fb46</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/upload-artifact/issues/797">#797</a>
from actions/yacaovsnc/update-dependency</li>
<li><a
href="https://github.com/actions/upload-artifact/commit/634250c1388765ea7ed0f053e636f1f399000b94"><code>634250c</code></a>
Include changes in typespec/ts-http-runtime 0.3.5</li>
<li><a
href="https://github.com/actions/upload-artifact/commit/e454baaac2be505c9450e11b8f3215c6fc023ce8"><code>e454baa</code></a>
Readme: bump all the example versions to v7 (<a
href="https://redirect.github.com/actions/upload-artifact/issues/796">#796</a>)</li>
<li><a
href="https://github.com/actions/upload-artifact/commit/74fad66b98a6d799dc004d3353ccd0e6f6b2530e"><code>74fad66</code></a>
Update the readme with direct upload details (<a
href="https://redirect.github.com/actions/upload-artifact/issues/795">#795</a>)</li>
<li><a
href="https://github.com/actions/upload-artifact/commit/bbbca2ddaa5d8feaa63e36b76fdaad77386f024f"><code>bbbca2d</code></a>
Support direct file uploads (<a
href="https://redirect.github.com/actions/upload-artifact/issues/764">#764</a>)</li>
<li><a
href="https://github.com/actions/upload-artifact/commit/589182c5a4cec8920b8c1bce3e2fab1c97a02296"><code>589182c</code></a>
Upgrade the module to ESM and bump dependencies (<a
href="https://redirect.github.com/actions/upload-artifact/issues/762">#762</a>)</li>
<li><a
href="https://github.com/actions/upload-artifact/commit/47309c993abb98030a35d55ef7ff34b7fa1074b5"><code>47309c9</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/upload-artifact/issues/754">#754</a>
from actions/Link-/add-proxy-integration-tests</li>
<li><a
href="https://github.com/actions/upload-artifact/commit/02a8460834e70dab0ce194c64360c59dc1475ef0"><code>02a8460</code></a>
Add proxy integration test</li>
<li>See full diff in <a
href="https://github.com/actions/upload-artifact/compare/v6...v7">compare
view</a></li>
</ul>
</details>
<br />

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-09 13:19:14 -07:00
Dermot Duffy 5e199b5612 fix: Report media failures once per failure (#2666) 2026-08-09 10:48:17 -07:00
Dermot Duffy 8d8d486afa test: Split browser test-utils (#2662)
- Closes: #2660
2026-08-07 16:27:28 -07:00
Dermot Duffy 673d8fe133 test: Add browser tests for the media viewing gallery and viewer (#2661) 2026-08-07 16:08:56 -07:00
Dermot Duffy 567690831c feat: Show the build date on the loading banner of unreleased builds (#2659) 2026-08-05 22:15:00 -07:00
Dermot Duffy c137f4c00c fix: Report and retry media failures for every camera in a grid (#2658)
- Closes: #2637
 - Related: #2099
2026-08-05 21:35:47 -07:00
Dermot Duffy 9f88aacefe fix: Ensure no camera outlives a failed initialization (#2657) 2026-08-04 21:33:46 -07:00
Dermot Duffy 80ec92e3b2 refactor: Replace Rollup with Vite (#2656)
This is a high risk change: every byte the card ships is emitted by a
different bundler, minified by a different minifier, and every
stylesheet is compiled by a different sass. The intent is that the
card's behaviour is unchanged.

**Significant development win**: Build time drops from 24s to 1.1s 🎉 

Also adds a test suite ('dist') that runs against the built bundle.
2026-08-04 15:00:13 -07:00
Dermot Duffy 06bcfd58ba refactor: Stamp build information in as "defines" (#2654) 2026-08-03 22:36:32 -07:00
Dermot Duffy 2d124fe3cd test: Add a test harness for the built card (#2653)
Mounts the card from `dist/` the way Home Assistant does, by URL with a
HACS tag, and asserts the entry stays a facade, that no chunk imports
it, that the browser is served the file unmodified, and that the card
starts up and fetches a language chunk lazily.

Runs in Chromium, Firefox and WebKit, so a change of bundler or minifier
is checked against every engine.
2026-08-03 21:50:21 -07:00
Dermot Duffy 18ea725564 test: Also run firefox & webkit automated tests (#2651) 2026-08-03 16:48:30 -07:00
Dermot Duffy 4a7c1b62b0 perf: Deduplicate concurrent Home Assistant registry list fetches (#2650) 2026-08-02 21:35:48 -07:00
Dermot Duffy 5d247d4074 test: Add browser based tests for keyboard focus handling (#2647) 2026-08-02 16:38:17 -07:00
Dermot Duffy 17146c8ca6 fix: Clear the initialized condition state when the card is not usable (#2646)
The `initialized` state (used in conditions/triggers) was written once
and never cleared, so it meant "has this card ever been initialized"
while everything reading it took it as "is this card usable now". Home
Assistant takes a card off the page and puts it back whenever its
dashboard tab is left and returned to, so the card initialized again
while the state claimed it was initialized throughout: `trigger:
initialized` fired once per card rather than once per startup, and
automations were dropped in between.

The card lifecycle is now an explicit state machine (`SessionManager`),
the only writer of `initialized`, which separates a card that is
starting up from one initializing part of itself again while it runs. A
new `ever` parameter (conditions/triggers) selects the old latched
behaviour.

`remote_control` uses that parameter to keep its two camera priorities
correct under repeated starts. With `camera_priority: entity` the card
now re-reads the entity every time it starts, so a camera selected while
the card was away is picked up on return. With `camera_priority: card`
the card writes the entity on its first start only, unchanged, since
repeating that write would overwrite a camera the user had selected.

Closes: #2642


BREAKING CHANGE: `condition: initialized` is now `false` whenever the
card is not usable, and `trigger: initialized` fires each time the card
starts up rather than only the first time. Set `ever: true` on either to
keep the previous behaviour.
2026-08-02 12:52:58 -07:00
Dermot Duffy e590f72783 test: Add a browser based test harness (#2641) 2026-07-31 10:16:58 -07:00
Dermot Duffy 51c0fab1ce fix: Do not activate pan & zoom on a detached element (#2640)
- Closes: #2633
2026-07-30 21:33:37 -07:00
Dermot Duffy f24064689a fix: Restore keyboard focus for key triggers (#2634) (#2639)
- Closes #2634
2026-07-30 20:52:54 -07:00