From aedb5cfbc6238858490c771d3628ba61da7e4bd4 Mon Sep 17 00:00:00 2001 From: Rene Floor Date: Thu, 10 Sep 2026 13:03:01 +0200 Subject: [PATCH 1/3] feat(video): theme the call control badge from its design tokens MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The design system gave the call control badge its own tokens, control/call-control-error-badge/bg -> {accent.warning} and /text -> {base.black}. The badge was drawing the shared error style: red with a dark border, which disappears into a red control and loses its edge over video in either mode. It now defaults to the warning style with no border, which separates from whatever sits underneath. Adds StreamCallButtonBadgeTheme, ThemeData and Style, served from StreamVideoTheme.callButtonBadgeTheme, carrying the severity, size, border and overhang. Colors are not repeated here — they resolve from core's StreamErrorBadgeTheme, so an app retheming the badge does it in one place. Having its own token makes the badge part of the design-system surface, so CallButtonBadge becomes StreamCallButtonBadge and is exported again. That reverses the de-export on this branch, whose changelog entry is rewritten accordingly. Repoints the stream_core_flutter override at the core commit adding StreamErrorBadge's warning style. stream_core stays on its existing pin: it is a separate git dependency, and moving it would pull in unrelated error-layer changes from core main. Tests are +269 -34, identical to clean v2 — those 34 pre-date this branch. Co-Authored-By: Claude Opus 5 --- packages/stream_video_flutter/CHANGELOG.md | 2 +- .../src/call_controls/call_button_badge.dart | 41 ---- .../call_controls/call_control_button.dart | 3 +- .../call_controls/call_feature_button.dart | 3 +- .../call_controls/device_split_buttons.dart | 3 +- .../stream_call_button_badge.dart | 63 +++++++ .../stream_call_button_badge_defaults.dart | 29 +++ .../components/call_button_badge_theme.dart | 148 +++++++++++++++ .../call_button_badge_theme.g.theme.dart | 175 ++++++++++++++++++ .../lib/src/theme/components/components.dart | 1 + .../lib/src/theme/stream_video_theme.dart | 19 ++ .../lib/stream_video_flutter.dart | 1 + pubspec.lock | 29 ++- pubspec.yaml | 2 +- 14 files changed, 455 insertions(+), 64 deletions(-) delete mode 100644 packages/stream_video_flutter/lib/src/call_controls/call_button_badge.dart create mode 100644 packages/stream_video_flutter/lib/src/call_controls/stream_call_button_badge.dart create mode 100644 packages/stream_video_flutter/lib/src/call_controls/stream_call_button_badge_defaults.dart create mode 100644 packages/stream_video_flutter/lib/src/theme/components/call_button_badge_theme.dart create mode 100644 packages/stream_video_flutter/lib/src/theme/components/call_button_badge_theme.g.theme.dart diff --git a/packages/stream_video_flutter/CHANGELOG.md b/packages/stream_video_flutter/CHANGELOG.md index 9c70a21c9..96d388775 100644 --- a/packages/stream_video_flutter/CHANGELOG.md +++ b/packages/stream_video_flutter/CHANGELOG.md @@ -19,7 +19,7 @@ - Added `CallControlBarThemeData` on `StreamVideoTheme`, and `CallControlBarTheme` to restyle the bar over a subtree. - Added `StreamDeviceAvailability.enumerationFailed`, which tells an enumeration the platform refused from one that found no device. - Added `CallParticipantState.trackEnabled`, null for a track nothing has reported, and `TrackOption.wantsOn` for the intent a call was joined with. -- `CallButtonBadge` is no longer exported. It exists so the badge sits in the same place on both call buttons, which is an implementation detail; exporting it committed the package to its shape and gave integrators a way to badge things inconsistently. +- Added `StreamCallButtonBadge`, the badge on the call control buttons, with `StreamCallButtonBadgeTheme`, `StreamCallButtonBadgeThemeData` and `StreamCallButtonBadgeStyle` served from `StreamVideoTheme.callButtonBadgeTheme`. - `CallControlButton` no longer overrides `StreamButtonTheme` for every tone. Only `positive` repaints the primary background — there is no success button style in the design system — and wrapping the other two overrode an app's own primary style for buttons that never use it. - `StreamMenuHandle` is an `abstract interface class`, so it cannot be accidentally extended. - Added `hasNoOptions` on an `Iterable`, and `StreamAdaptiveMenuAnchor` now drops a heading with no rows under it. Every caller had to know both — "is there anything to open" was recomputed at each of two call sites, and an empty section drew a label over nothing. diff --git a/packages/stream_video_flutter/lib/src/call_controls/call_button_badge.dart b/packages/stream_video_flutter/lib/src/call_controls/call_button_badge.dart deleted file mode 100644 index 5f514deed..000000000 --- a/packages/stream_video_flutter/lib/src/call_controls/call_button_badge.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../stream_video_flutter.dart'; - -/// Overlays an error badge on the top-end corner of a call button. -/// -/// Shared by [CallControlButton] and [CallFeatureButton] so the badge sits in -/// the same place on both. -class CallButtonBadge extends StatelessWidget { - /// Creates a new instance of [CallButtonBadge]. - const CallButtonBadge({ - super.key, - required this.showErrorBadge, - required this.child, - }); - - /// Whether to draw the badge at all. - final bool showErrorBadge; - - /// The button to badge. - final Widget child; - - @override - Widget build(BuildContext context) { - if (!showErrorBadge) return child; - - return Stack( - // The badge deliberately overhangs the button's box, so the stack must - // not clip it away. - clipBehavior: Clip.none, - children: [ - child, - PositionedDirectional( - top: -4, - end: -4, - child: StreamErrorBadge(size: .sm), - ), - ], - ); - } -} diff --git a/packages/stream_video_flutter/lib/src/call_controls/call_control_button.dart b/packages/stream_video_flutter/lib/src/call_controls/call_control_button.dart index 39b6986eb..84e9d1831 100644 --- a/packages/stream_video_flutter/lib/src/call_controls/call_control_button.dart +++ b/packages/stream_video_flutter/lib/src/call_controls/call_control_button.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import '../../stream_video_flutter.dart'; -import 'call_button_badge.dart'; /// The tone of a [CallControlButton]. /// @@ -73,7 +72,7 @@ class CallControlButton extends StatelessWidget { @override Widget build(BuildContext context) { - final button = CallButtonBadge( + final button = StreamCallButtonBadge( showErrorBadge: showErrorBadge, child: StreamButton.icon( icon: icon, diff --git a/packages/stream_video_flutter/lib/src/call_controls/call_feature_button.dart b/packages/stream_video_flutter/lib/src/call_controls/call_feature_button.dart index cb633f0e0..a328dd7e3 100644 --- a/packages/stream_video_flutter/lib/src/call_controls/call_feature_button.dart +++ b/packages/stream_video_flutter/lib/src/call_controls/call_feature_button.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import '../../stream_video_flutter.dart'; -import 'call_button_badge.dart'; /// The colour a [CallFeatureButton] takes while it is on. /// @@ -76,7 +75,7 @@ class CallFeatureButton extends StatelessWidget { @override Widget build(BuildContext context) { - return CallButtonBadge( + return StreamCallButtonBadge( showErrorBadge: showErrorBadge, child: StreamButton.icon( icon: icon, diff --git a/packages/stream_video_flutter/lib/src/call_controls/device_split_buttons.dart b/packages/stream_video_flutter/lib/src/call_controls/device_split_buttons.dart index 1957fecd9..7cde8bee6 100644 --- a/packages/stream_video_flutter/lib/src/call_controls/device_split_buttons.dart +++ b/packages/stream_video_flutter/lib/src/call_controls/device_split_buttons.dart @@ -8,7 +8,6 @@ import 'package:stream_core_flutter/video.dart'; import '../../stream_video_flutter.dart'; import '../l10n/localization_extension.dart'; -import 'call_button_badge.dart'; /// Turns the microphone on and off, with a caret that picks which microphone /// and speaker to use. @@ -408,7 +407,7 @@ class _DeviceSplitButton extends StatelessWidget { // the leading half can be pressed is the caller's to say — a failed // open is worth retrying — while the caret follows what it has to // offer, which is nothing when the platform named no device. - builder: (context, handle) => CallButtonBadge( + builder: (context, handle) => StreamCallButtonBadge( showErrorBadge: unavailable, child: StreamSplitButton.icon( leadingIcon: Icon(icon), diff --git a/packages/stream_video_flutter/lib/src/call_controls/stream_call_button_badge.dart b/packages/stream_video_flutter/lib/src/call_controls/stream_call_button_badge.dart new file mode 100644 index 000000000..d63187730 --- /dev/null +++ b/packages/stream_video_flutter/lib/src/call_controls/stream_call_button_badge.dart @@ -0,0 +1,63 @@ +import 'package:flutter/material.dart'; + +import '../../stream_video_flutter.dart'; +import 'stream_call_button_badge_defaults.dart'; + +/// Overlays an error badge on the top-end corner of a call button. +/// +/// Shared by [CallControlButton] and [CallFeatureButton] so the badge sits in +/// the same place on both. +/// +/// Styling resolves from [StreamCallButtonBadgeTheme], falling back to the +/// design system's defaults for a call control — see +/// [StreamCallButtonBadgeStyle]. +class StreamCallButtonBadge extends StatelessWidget { + /// Creates a new instance of [StreamCallButtonBadge]. + const StreamCallButtonBadge({ + super.key, + required this.showErrorBadge, + required this.child, + this.style, + }); + + /// Whether to draw the badge at all. + final bool showErrorBadge; + + /// The button to badge. + final Widget child; + + /// Overrides for the badge's styling. + /// + /// Takes precedence over [StreamCallButtonBadgeTheme] for the properties it + /// sets; the rest still resolve from the theme. + final StreamCallButtonBadgeStyle? style; + + @override + Widget build(BuildContext context) { + if (!showErrorBadge) return child; + + const defaults = StreamCallButtonBadgeStyleDefaults(); + final themeStyle = StreamCallButtonBadgeTheme.of(context).style; + final effective = themeStyle?.merge(style) ?? style; + + final offset = effective?.alignmentOffset ?? defaults.alignmentOffset; + + return Stack( + // The badge deliberately overhangs the button's box, so the stack must + // not clip it away. + clipBehavior: Clip.none, + children: [ + child, + PositionedDirectional( + top: -offset, + end: -offset, + child: StreamErrorBadge( + size: effective?.size ?? defaults.size, + style: effective?.badgeStyle ?? defaults.badgeStyle, + showBorder: effective?.showBorder ?? defaults.showBorder, + ), + ), + ], + ); + } +} diff --git a/packages/stream_video_flutter/lib/src/call_controls/stream_call_button_badge_defaults.dart b/packages/stream_video_flutter/lib/src/call_controls/stream_call_button_badge_defaults.dart new file mode 100644 index 000000000..480e4d15b --- /dev/null +++ b/packages/stream_video_flutter/lib/src/call_controls/stream_call_button_badge_defaults.dart @@ -0,0 +1,29 @@ +import 'package:flutter/foundation.dart'; + +import '../../stream_video_flutter.dart'; + +/// Default style values for [StreamCallButtonBadge]. +/// +/// The badge sits on a call control, which is itself often over video, so the +/// design system gives it the warning severity rather than the shared error +/// one: red on a red control disappears, and the error badge's dark border +/// loses its edge over moving footage in either mode. +/// +/// Deliberately not exported. +@internal +class StreamCallButtonBadgeStyleDefaults extends StreamCallButtonBadgeStyle { + /// Creates the badge's defaults. + const StreamCallButtonBadgeStyleDefaults(); + + @override + StreamErrorBadgeStyle get badgeStyle => StreamErrorBadgeStyle.warning; + + @override + StreamErrorBadgeSize get size => StreamErrorBadgeSize.sm; + + @override + bool get showBorder => false; + + @override + double get alignmentOffset => 4; +} diff --git a/packages/stream_video_flutter/lib/src/theme/components/call_button_badge_theme.dart b/packages/stream_video_flutter/lib/src/theme/components/call_button_badge_theme.dart new file mode 100644 index 000000000..320986e3b --- /dev/null +++ b/packages/stream_video_flutter/lib/src/theme/components/call_button_badge_theme.dart @@ -0,0 +1,148 @@ +import 'package:flutter/widgets.dart'; +import 'package:theme_extensions_builder_annotation/theme_extensions_builder_annotation.dart'; + +import '../../../stream_video_flutter.dart'; + +part 'call_button_badge_theme.g.theme.dart'; + +/// Applies a call button badge theme to descendant [StreamCallButtonBadge] widgets. +/// +/// Wrap a subtree with [StreamCallButtonBadgeTheme] to override how the badge +/// on a call control reads. +/// +/// {@tool snippet} +/// +/// Make the badge read as an error rather than a warning: +/// +/// ```dart +/// StreamCallButtonBadgeTheme( +/// data: StreamCallButtonBadgeThemeData( +/// style: StreamCallButtonBadgeStyle( +/// badgeStyle: StreamErrorBadgeStyle.error, +/// showBorder: true, +/// ), +/// ), +/// child: child, +/// ) +/// ``` +/// {@end-tool} +/// +/// See also: +/// +/// * [StreamCallButtonBadgeThemeData], which describes the theme. +/// * [StreamCallButtonBadgeStyle], the visual style it carries. +class StreamCallButtonBadgeTheme extends InheritedTheme { + /// Creates a call button badge theme. + const StreamCallButtonBadgeTheme({ + super.key, + required this.data, + required super.child, + }); + + /// The badge theme data for descendant widgets. + final StreamCallButtonBadgeThemeData data; + + /// Returns the [StreamCallButtonBadgeThemeData] merged from local and global + /// themes. + /// + /// Local values from the nearest [StreamCallButtonBadgeTheme] ancestor take + /// precedence over the global values from + /// [StreamVideoTheme.callButtonBadgeTheme]. This allows partial overrides: + /// setting only [StreamCallButtonBadgeStyle.size] leaves the severity coming + /// from the global theme. + static StreamCallButtonBadgeThemeData of(BuildContext context) { + final localTheme = context + .dependOnInheritedWidgetOfExactType(); + return StreamVideoTheme.of(context).callButtonBadgeTheme.merge( + localTheme?.data, + ); + } + + @override + Widget wrap(BuildContext context, Widget child) { + return StreamCallButtonBadgeTheme(data: data, child: child); + } + + @override + bool updateShouldNotify(StreamCallButtonBadgeTheme oldWidget) => + data != oldWidget.data; +} + +/// Theme data for customizing [StreamCallButtonBadge] widgets. +/// +/// Wraps a [StreamCallButtonBadgeStyle] so it can be served by +/// [StreamCallButtonBadgeTheme] and slotted into [StreamVideoTheme] alongside +/// the other component theme data classes. +/// +/// See also: +/// +/// * [StreamCallButtonBadgeStyle], the style embedded here. +/// * [StreamCallButtonBadgeTheme], for overriding it in a subtree. +@themeGen +@immutable +class StreamCallButtonBadgeThemeData with _$StreamCallButtonBadgeThemeData { + /// Creates call button badge theme data. + const StreamCallButtonBadgeThemeData({this.style}); + + /// Visual styling for the badge. + final StreamCallButtonBadgeStyle? style; + + /// Linearly interpolate between two theme data objects. + static StreamCallButtonBadgeThemeData? lerp( + StreamCallButtonBadgeThemeData? a, + StreamCallButtonBadgeThemeData? b, + double t, + ) => _$StreamCallButtonBadgeThemeData.lerp(a, b, t); +} + +/// Visual styling properties for a [StreamCallButtonBadge]. +/// +/// The badge is a `StreamErrorBadge` pinned to the top-end corner of a call +/// control. Its colors come from the core design system's +/// `StreamErrorBadgeTheme` rather than being repeated here, so this style +/// selects *which* badge is drawn and where, and an app that wants different +/// badge colors themes `StreamErrorBadge` itself. +@themeGen +@immutable +class StreamCallButtonBadgeStyle with _$StreamCallButtonBadgeStyle { + /// Creates a badge style with optional property overrides. + const StreamCallButtonBadgeStyle({ + this.badgeStyle, + this.size, + this.showBorder, + this.alignmentOffset, + }); + + /// The severity the badge conveys. + /// + /// Defaults to [StreamErrorBadgeStyle.warning], which the design system + /// specifies for call controls: the shared error badge is red with a dark + /// border, which disappears into a red control and loses its edge over + /// video, while the warning badge separates from whatever sits underneath. + final StreamErrorBadgeStyle? badgeStyle; + + /// The diameter of the badge. + /// + /// Defaults to [StreamErrorBadgeSize.sm]. + final StreamErrorBadgeSize? size; + + /// Whether a border is drawn around the badge. + /// + /// Defaults to false. The warning badge is legible against a call control + /// and over video without one, and a border on a badge this small reads as + /// a smudge rather than a separation. + final bool? showBorder; + + /// How far the badge overhangs the button's top-end corner. + /// + /// Applied as a directional offset, so it flips with the text direction. + /// Defaults to 4 logical pixels up and towards the end edge. + final double? alignmentOffset; + + /// Linearly interpolate between two styles. + static StreamCallButtonBadgeStyle? lerp( + StreamCallButtonBadgeStyle? a, + StreamCallButtonBadgeStyle? b, + double t, + ) => _$StreamCallButtonBadgeStyle.lerp(a, b, t); +} diff --git a/packages/stream_video_flutter/lib/src/theme/components/call_button_badge_theme.g.theme.dart b/packages/stream_video_flutter/lib/src/theme/components/call_button_badge_theme.g.theme.dart new file mode 100644 index 000000000..663edea21 --- /dev/null +++ b/packages/stream_video_flutter/lib/src/theme/components/call_button_badge_theme.g.theme.dart @@ -0,0 +1,175 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint, unused_element + +part of 'call_button_badge_theme.dart'; + +// ************************************************************************** +// ThemeGenGenerator +// ************************************************************************** + +mixin _$StreamCallButtonBadgeThemeData { + bool get canMerge => true; + + static StreamCallButtonBadgeThemeData? lerp( + StreamCallButtonBadgeThemeData? a, + StreamCallButtonBadgeThemeData? b, + double t, + ) { + if (identical(a, b)) { + return a; + } + + if (a == null) { + return t == 1.0 ? b : null; + } + + if (b == null) { + return t == 0.0 ? a : null; + } + + return StreamCallButtonBadgeThemeData( + style: StreamCallButtonBadgeStyle.lerp(a.style, b.style, t), + ); + } + + StreamCallButtonBadgeThemeData copyWith({StreamCallButtonBadgeStyle? style}) { + final _this = (this as StreamCallButtonBadgeThemeData); + + return StreamCallButtonBadgeThemeData(style: style ?? _this.style); + } + + StreamCallButtonBadgeThemeData merge(StreamCallButtonBadgeThemeData? other) { + final _this = (this as StreamCallButtonBadgeThemeData); + + if (other == null || identical(_this, other)) { + return _this; + } + + if (!other.canMerge) { + return other; + } + + return copyWith(style: _this.style?.merge(other.style) ?? other.style); + } + + @override + bool operator ==(Object other) { + if (identical(this, other)) { + return true; + } + + if (other.runtimeType != runtimeType) { + return false; + } + + final _this = (this as StreamCallButtonBadgeThemeData); + final _other = (other as StreamCallButtonBadgeThemeData); + + return _other.style == _this.style; + } + + @override + int get hashCode { + final _this = (this as StreamCallButtonBadgeThemeData); + + return Object.hash(runtimeType, _this.style); + } +} + +mixin _$StreamCallButtonBadgeStyle { + bool get canMerge => true; + + static StreamCallButtonBadgeStyle? lerp( + StreamCallButtonBadgeStyle? a, + StreamCallButtonBadgeStyle? b, + double t, + ) { + if (identical(a, b)) { + return a; + } + + if (a == null) { + return t == 1.0 ? b : null; + } + + if (b == null) { + return t == 0.0 ? a : null; + } + + return StreamCallButtonBadgeStyle( + badgeStyle: t < 0.5 ? a.badgeStyle : b.badgeStyle, + size: t < 0.5 ? a.size : b.size, + showBorder: t < 0.5 ? a.showBorder : b.showBorder, + alignmentOffset: lerpDouble$(a.alignmentOffset, b.alignmentOffset, t), + ); + } + + StreamCallButtonBadgeStyle copyWith({ + StreamErrorBadgeStyle? badgeStyle, + StreamErrorBadgeSize? size, + bool? showBorder, + double? alignmentOffset, + }) { + final _this = (this as StreamCallButtonBadgeStyle); + + return StreamCallButtonBadgeStyle( + badgeStyle: badgeStyle ?? _this.badgeStyle, + size: size ?? _this.size, + showBorder: showBorder ?? _this.showBorder, + alignmentOffset: alignmentOffset ?? _this.alignmentOffset, + ); + } + + StreamCallButtonBadgeStyle merge(StreamCallButtonBadgeStyle? other) { + final _this = (this as StreamCallButtonBadgeStyle); + + if (other == null || identical(_this, other)) { + return _this; + } + + if (!other.canMerge) { + return other; + } + + return copyWith( + badgeStyle: other.badgeStyle, + size: other.size, + showBorder: other.showBorder, + alignmentOffset: other.alignmentOffset, + ); + } + + @override + bool operator ==(Object other) { + if (identical(this, other)) { + return true; + } + + if (other.runtimeType != runtimeType) { + return false; + } + + final _this = (this as StreamCallButtonBadgeStyle); + final _other = (other as StreamCallButtonBadgeStyle); + + return _other.badgeStyle == _this.badgeStyle && + _other.size == _this.size && + _other.showBorder == _this.showBorder && + _other.alignmentOffset == _this.alignmentOffset; + } + + @override + int get hashCode { + final _this = (this as StreamCallButtonBadgeStyle); + + return Object.hash( + runtimeType, + _this.badgeStyle, + _this.size, + _this.showBorder, + _this.alignmentOffset, + ); + } +} diff --git a/packages/stream_video_flutter/lib/src/theme/components/components.dart b/packages/stream_video_flutter/lib/src/theme/components/components.dart index 2f1b1f398..93fd965ae 100644 --- a/packages/stream_video_flutter/lib/src/theme/components/components.dart +++ b/packages/stream_video_flutter/lib/src/theme/components/components.dart @@ -1,3 +1,4 @@ +export 'call_button_badge_theme.dart'; export 'call_control_bar_theme.dart'; export 'call_participants_grid_theme.dart'; export 'connection_quality_indicator_theme.dart'; diff --git a/packages/stream_video_flutter/lib/src/theme/stream_video_theme.dart b/packages/stream_video_flutter/lib/src/theme/stream_video_theme.dart index d14eab5d6..0873d91ef 100644 --- a/packages/stream_video_flutter/lib/src/theme/stream_video_theme.dart +++ b/packages/stream_video_flutter/lib/src/theme/stream_video_theme.dart @@ -42,6 +42,7 @@ class StreamVideoTheme extends ThemeExtension { StreamParticipantLabelThemeData? participantLabelTheme, StreamConnectionQualityIndicatorThemeData? connectionQualityIndicatorTheme, StreamCallParticipantsGridThemeData? callParticipantsGridTheme, + StreamCallButtonBadgeThemeData? callButtonBadgeTheme, StreamLivestreamThemeData? livestreamTheme, }) { final isDark = brightness == Brightness.dark; @@ -87,6 +88,8 @@ class StreamVideoTheme extends ThemeExtension { callParticipantsGridTheme: callParticipantsGridTheme ?? legacy?.toCallParticipantsGridThemeData(), + callButtonBadgeTheme: + callButtonBadgeTheme ?? const StreamCallButtonBadgeThemeData(), livestreamTheme: livestreamTheme, ); @@ -131,6 +134,7 @@ class StreamVideoTheme extends ThemeExtension { const StreamConnectionQualityIndicatorThemeData(), this.callParticipantsGridTheme = const StreamCallParticipantsGridThemeData(), + this.callButtonBadgeTheme = const StreamCallButtonBadgeThemeData(), required this.livestreamTheme, }); @@ -414,6 +418,9 @@ class StreamVideoTheme extends ThemeExtension { /// Theme for the participants grid layout. final StreamCallParticipantsGridThemeData callParticipantsGridTheme; + /// Theme for the badge overlaid on a call control button. + final StreamCallButtonBadgeThemeData callButtonBadgeTheme; + /// Theme for the outgoing call widget. final StreamLivestreamThemeData livestreamTheme; @@ -454,6 +461,7 @@ class StreamVideoTheme extends ThemeExtension { StreamParticipantLabelThemeData? participantLabelTheme, StreamConnectionQualityIndicatorThemeData? connectionQualityIndicatorTheme, StreamCallParticipantsGridThemeData? callParticipantsGridTheme, + StreamCallButtonBadgeThemeData? callButtonBadgeTheme, StreamLivestreamThemeData? livestreamTheme, }) => StreamVideoTheme.raw( textTheme: this.textTheme.merge(textTheme), @@ -482,6 +490,7 @@ class StreamVideoTheme extends ThemeExtension { callParticipantsGridTheme: this.callParticipantsGridTheme.merge( callParticipantsGridTheme, ), + callButtonBadgeTheme: this.callButtonBadgeTheme.merge(callButtonBadgeTheme), livestreamTheme: this.livestreamTheme.merge(livestreamTheme), ); @@ -517,6 +526,9 @@ class StreamVideoTheme extends ThemeExtension { callParticipantsGridTheme: callParticipantsGridTheme.merge( other.callParticipantsGridTheme, ), + callButtonBadgeTheme: callButtonBadgeTheme.merge( + other.callButtonBadgeTheme, + ), livestreamTheme: livestreamTheme.merge(other.livestreamTheme), ); } @@ -591,6 +603,13 @@ class StreamVideoTheme extends ThemeExtension { t, ) ?? callParticipantsGridTheme, + callButtonBadgeTheme: + StreamCallButtonBadgeThemeData.lerp( + callButtonBadgeTheme, + other.callButtonBadgeTheme, + t, + ) ?? + callButtonBadgeTheme, livestreamTheme: livestreamTheme.lerp(other.livestreamTheme, t), ); } diff --git a/packages/stream_video_flutter/lib/stream_video_flutter.dart b/packages/stream_video_flutter/lib/stream_video_flutter.dart index 73434db15..b2b14adba 100644 --- a/packages/stream_video_flutter/lib/stream_video_flutter.dart +++ b/packages/stream_video_flutter/lib/stream_video_flutter.dart @@ -32,6 +32,7 @@ export 'src/call_controls/controls/stream_speakerphone_button.dart'; export 'src/call_controls/device_control.dart'; export 'src/call_controls/device_split_buttons.dart'; export 'src/call_controls/participants_button.dart'; +export 'src/call_controls/stream_call_button_badge.dart'; export 'src/call_participants/call_participants.dart'; export 'src/call_participants/call_participants_sorting_mixin.dart'; export 'src/call_participants/floating_participant_tile.dart'; diff --git a/pubspec.lock b/pubspec.lock index ae4f729a2..d739e78ae 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -165,10 +165,10 @@ packages: dependency: transitive description: name: cached_network_image_ce - sha256: "9c61372fecd5f6ac6aaa66fa6808b4c303b8574875e853a0916116bf2fae6840" + sha256: "9165bb982487e899e4b35729e821e4e2d2407fb9b0c8d4e07d3ea39e148200ba" url: "https://pub.dev" source: hosted - version: "4.9.0" + version: "4.12.0" cached_network_image_platform_interface: dependency: transitive description: @@ -197,10 +197,10 @@ packages: dependency: transitive description: name: cached_network_image_web_ce - sha256: "6bcd8608d4ace7c35625f09d971ce68c7a6581a4631b0fb6ceb2909b2c2e17a8" + sha256: "22cdf044cd013ff8d6eb06ce148bfe3f1106388ca2af244e2358739debb4459c" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" characters: dependency: transitive description: @@ -719,10 +719,10 @@ packages: dependency: transitive description: name: flutter_markdown_plus - sha256: "3893b00caa52ce75cf9212f2c159ea517b9d64a641fc2226811bf5f218b5b77e" + sha256: fce641d6c2106cc495de1cd603f97a4f9d615a97a64011928ded380dbdade935 url: "https://pub.dev" source: hosted - version: "1.0.9" + version: "1.0.12" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -1955,20 +1955,19 @@ packages: source: hosted version: "10.4.0" stream_core: - dependency: "direct overridden" + dependency: transitive description: - path: "packages/stream_core" - ref: f83b5d4d706a79fc429de2d27aead4394b83c1fb - resolved-ref: f83b5d4d706a79fc429de2d27aead4394b83c1fb - url: "https://github.com/GetStream/stream-core-flutter.git" - source: git - version: "0.4.0" + name: stream_core + sha256: "25c19466b96050354e9a64fb13767956b48b9405576472005598733502ef219c" + url: "https://pub.dev" + source: hosted + version: "0.5.0" stream_core_flutter: dependency: "direct overridden" description: path: "packages/stream_core_flutter" - ref: "3ab8dbeadc0bfe28c08a732858ec970c02e67c42" - resolved-ref: "3ab8dbeadc0bfe28c08a732858ec970c02e67c42" + ref: f4d49e9db343b48d890247fc9bf142805804daf1 + resolved-ref: f4d49e9db343b48d890247fc9bf142805804daf1 url: "https://github.com/GetStream/stream-core-flutter.git" source: git version: "0.5.1" diff --git a/pubspec.yaml b/pubspec.yaml index a47445b60..7363a7252 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -29,7 +29,7 @@ dependency_overrides: git: url: https://github.com/GetStream/stream-core-flutter.git path: packages/stream_core_flutter - ref: 3ab8dbeadc0bfe28c08a732858ec970c02e67c42 + ref: f4d49e9db343b48d890247fc9bf142805804daf1 melos: ignore: From 1d0a0337e2caa6f979445ba5d4ca7c2a715c8c32 Mon Sep 17 00:00:00 2001 From: renefloor <15101411+renefloor@users.noreply.github.com> Date: Fri, 11 Sep 2026 11:23:21 +0000 Subject: [PATCH 2/3] chore: update goldens --- .../goldens/ci/call_control_button_dark.png | Bin 6857 -> 6654 bytes .../goldens/ci/call_control_button_light.png | Bin 6805 -> 6598 bytes .../goldens/ci/call_feature_button_dark.png | Bin 8159 -> 8069 bytes .../goldens/ci/call_feature_button_light.png | Bin 7586 -> 7465 bytes ...ream_connection_quality_indicator_dark.png | Bin 2661 -> 2658 bytes ...eam_connection_quality_indicator_light.png | Bin 2622 -> 2621 bytes .../ci/stream_lobby_view_unavailable_dark.png | Bin 25030 -> 24336 bytes .../stream_lobby_view_unavailable_light.png | Bin 22847 -> 22102 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/packages/stream_video_flutter/test/src/call_controls/goldens/ci/call_control_button_dark.png b/packages/stream_video_flutter/test/src/call_controls/goldens/ci/call_control_button_dark.png index 99f8434d49aa38142be0c559cddb9eab788ea04a..6ef486f865a8e48db6d6281b5197d59bb36d2788 100644 GIT binary patch delta 6349 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 diff --git a/packages/stream_video_flutter/test/src/call_controls/goldens/ci/call_control_button_light.png b/packages/stream_video_flutter/test/src/call_controls/goldens/ci/call_control_button_light.png index ce4191939e3d3906c3c025594b0e390ab4fb350c..28bb5e5af906a8030a3005722d7cd7ceaecc278c 100644 GIT binary patch literal 6598 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 literal 6805 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 diff --git a/packages/stream_video_flutter/test/src/call_controls/goldens/ci/call_feature_button_dark.png b/packages/stream_video_flutter/test/src/call_controls/goldens/ci/call_feature_button_dark.png index 21608d46523a50ab91c6d0f66aef792e04a36601..2c39bdfaac9dab69e0a2fa37ecf00662b2518f60 100644 GIT binary patch literal 8069 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 literal 8159 zcmchc2UL^Ww(kQd*nquJM5)_?C?%+X^q{D;C>=rxMSAa{SJ}Xh2#7Q(f{3B_7C@@N zj(`y9B{V4_fzVrMxhwnZbMCq0-m}km@4oREGb4k1>-*N4>sxEi-~2DMx~d}M8TK;} z2!v5t>5(P`LgNZPPfpQ;Uu4Z+4uh`~?()jor@){8DU090|1|EJit>=+9?nGwga@ts z=z+F(8fn7MBhC8R!uk|aw9iI#~9ms@d*SrVabwlW_S8eDHSy%rAp~rnM=VIrQdu=|% zT3JzU>duaoi;Aq0di~`Vw$jqS>;(jJHtmxK4`8dCdpncI+xZa4?>;-Lfn5t;(kCGA z0^=nhmtL|kKteTUAf~rfI3ed0&~(8qH(epO^<1ii4_mFBU2iDI5gJx`JFW0FT&<^u zkz|#lV@0|AqhTYG=LI!#pGlxb&|XJOEf?Lzu>b;Mj`>&UK38!YO|$7=JpB?c6NEnN zf7|GJK|rP#;fD2Vh`p$^bb<70-NWR(N`eMt*!BPX`3{3sT7@&a2dwBv7toIedV4c_ zdV1Vp_<6UKw{LYa)zyJvG+p`GQ}p09@UkM|;qZ{9!75V13&)SH2xd|KN}YQ9;XQW{+kFeb8=p2iW5*4YGeDYZGB~v=+HMXs1K=Hx>~Q>9ndaFfb?= zxsme3(BXb6)GyT+>Q`W9Se&FQAskwyvAx{zRMyWq?s@{eqLY&xawDBweOIxu#4T^y z#ckTZI=*IV6>&FNTTKoBIMR<7mf>7GP%xO^w^#`*e=wiRwfDMwtdr5k@Az9j?ao8n z3v`)Gj&+BmF%L4KN;F6Tw{j4}9xxZlvcQY9@IgC|ls=%NqqDQMEt~U(WvF#nXs&xB zTU%Q@7d8_)*}5^5G3lzML^+L8A*+t{=Z<$sfn5~!sX?zFqt29Qt9~_oH{?6rMA?xo zvOjTYslVr~w2;6W+nF%=u`2r{Uq3$~xqCw;_iw%rXj*q9HEzQbS@+JOc8oAfE545c zhU zsg9r1K{;68Vum;x=!b7CyJUZMPEKt_#RxI<&@b#!b}lZZ#RnuCCZX70ivw5HSQi@y z%I^4;96A~uM>|X18OnXLFR`x}EVH3VamqXl1+sg}UKiirL4d`bZ81=*0&#u;!&yPuX zSJ=;H)eacVgxtU1VbM1xiuyq!%^yo7K8{1=t`eokqch=CTV&RS3_9I>zZcI;Or{=p zZMHD*6z+ay^JrxhN3Jzx9N{cHJO=vKO|vJkfv)WvoWH??d~#6cvU0o=>+@%WE-sE{ z9otV9^eXD^(VE8A6}LUie8qzPb=#IW(BE&~RjKgCa(23VtaM%qYc5DwAB*|OMf3Ds zG0U!INCs;RZXz0zIx5=%h_TJn^3)!lLxwtDU^-`h=`+`Nc2Pm4$jHpQmE zW!R(mFL^kuw~Cz&lecqr_L8PYmfNlx&TslSTh6!fQa&Y$KMtv|gDo{6=mrIaDSM0UIo8mk0KZkZU>^T_P zeYAMVc&=CEU2)&9)SHHM(D)wTgUOrAaa=y&F#?@2e!JKcZ%V$i2w#j$uiurClPe*U zeX!=uym1kYIi0U}kB|G+j-omv55rF#42ZS6*x7aNUuW#Jxa*`C9LW#gO!3~Q)Nswp zK?ygYZ-m~m2^pOfylqEnfIZiLwTux z;MQAJdt2KM(j}MCEp&#B?~fcOoSx@aMAL%j3DJW>r^hU?zpWM_BV;(aHd`7ZOyP*!tiCq`d(e^A`!_@z7c@J9NvA=gn$1Sbdc zD;-{AXcB69 z9I0QO?v2sxU7y7zsOA(&&H3QKWJ$Ts{F;;08itKOlY?4|6vjF-ks>E!aD>9NSgpKe++CZ%4WeVCp4utSKuKQYcD}n0Hss zV8y~vcuZ~OtKrYWupBKpN?|9r37&H)Rp=mD2nw~cuy~ZGt%80ekA7sU}DPf6~K6CHClU?rEB8CzaZo znq2S#fZ2%VS6APws;=heWD;OMS_oheNO*B3?9;}KLAzNj>*;5ywRy8rZukl6=Y@$| z5>y` zX?a<@cEleIPB;khcZH5WL8F>TiVrz9>bXuclq)-)`A8;j$HjwjivCIUe&wJJ{P3Yy z&`7@M{Z?++Ua4w2XYW(-2K}P|@Q{#9*e+SlQ0qa8=^#rGffR+$J6ZTT<Os)*Tk{{*7sIGu6#f6E$FCi*LCsU|w@HW2Pf#+}g1nn*(C{eOdz zUw%?oRK#ugjP~}H9qQL2bzvED3-u@Je;;CDrVoA5ZbmhQtPQfiKp?iF!o79`(7^_| z-pa}u=nGy1*VF~NxE=QWVcXl=whKLPsQ?ise}zg54Gj&6 zJRD0&Q>(+#T+*VqZ=33eG^zXfeS|h_Y4Wn1?uub74C6&m)3LPIip)ahE2DePlZ8sx z-)ClCN$9d9;6iKVGhfj&Fbob2SuIHb{sAlmxPYCTyBZ}p-Ok?lCtY}aXvTwS1)Nd1 z6eykY@b;wv-Xx@%ALveod$`(>K#e%8yo~_|JCU$&Sol9d#qNQagha0T&AGi1DmvUv z_5hKrBwVFFC&$`nKY`<((|GR6iqr7#5#rmsy9Esm6IJVR9UtEJ=KcdFn$IIRfv?pv zrO%T;eJkbTzUwqv-cCAY!-A3t*w!}ML%1i z6|#zDGW5}Gfm-eR2n5n3-R(PYu+vhoA6#^k{(3P7(-QrCz!)3>ivy~VDW*bjC$QH-G$#-b~hTI7Ya|N)gSM!%x7GtCSemjy;45($@(WG5$I%tPgMS8t3Ohjb11F0uROfi!X6SE9>O<%Sb=w6`B zPu)<2J3X`Q8LWlE|0Rzn4xe#%b=9av_WbJx-Wl% zCIT`1VoA5Kk}rEu1@l@nFaDZ&%YlM|LZvl6{cK}9*g0I%!kc87CazCEqnbQTph;qP z@0vNLNS$M5E-)ynXyB0|e3EfuIT#YY5 zGVBTo3jSF8)*4+{aQDug%s4)^F&NXDSz-}i;7%vsTUA5U=gsI06^zGB+v&;R))XNj zp~cU!*Q&d(2!p7@&21%h1!+#!m6)BKl?vFe{3FtMx1QZW6zEvqy^PVk_5FDkG(qJt z;Fpv)Z`7TgOU%mjT5*C&T`6g418r?5*jQZ>{(BOB|2^O*IOg@;3%-~dRkcld z9u!?v_+%iv(`LTEWi7Yjc}|VEs7l;F8n&aL5FfctmJSYclaKSKzNP|tLget6imeZ5#D8p4I9o_(Ee(XOQKLp()@KPE9eaSJOfvWD-a1> zE=$lhD}tELLs5#2GAan%4R{@RO#~B!+FaU-QG=~0!5}UvcXr!Mg1S-ri?cDs)L?mI zrjCNfd2H$okEAd{#?2m~v3p1Rla!AoD{_>HgB6{x)@>ARNG|&4?j1Hny}`GU@H&dW zqJI{wX;lF(LKDp9-Po4Za`9-V8qNXhSzW1l!qsvSewQW~0WNr<+GKnLA#1catDL=~ zz{gjA28QzR$gQZ@OvAg^rde5A>)gDc4J_}lf1r7IXUj10TLRixHt>6;B`%cwyk%N) z!IDZ6*7I)qWdGx|O_nuwL%7VPbNm-0ZvkVE0t!IU-UN_E=FLiU3w&qLeA-32+lGc5 zO$ly8gad|c@~oPHr_7sM7tZ8?tY4=0Bv#3yef1=5$owXviGLdj%@MKgxtZDxHL-y> zm1EkD0-L~Q^!4?H8jK69ll=jtfC56ZxlS5JdXSaf-f9M5A|N0DWE%Uu9Wr2ny1Kf7 z!9k2$Z6OF$Z(-feo-RrAMb*z*=|N`8#bC-JegnJTKu_;$K(ecmlse^0JllTLET51h z)0a4<>jMNr!Mn$lS3q2F94&tggpF(0uBD`!Co|NvmUkgD@Hvf*Fw%H!#W&id4=xgd z%Dy&MpPqYA=GY45COkm@p35VdAt5wfXAZ;02!!p|N%fD=k3Rh&S#;=gojOtJzR=^& zeMXF*J&O1xS;Y6AxZ~)ZjEXhAwZ@?#T}CFR{Hm(KAy>dVRQ8#iECxG#C81S=(FA?q z4+GZ?45s&W(D1(4Jmn*s>~(=3e*LY!jS}_`?!Niu(m5&3Y2kRK>y?&W7jeJSSv*EN zPcl?nu)BM4m}%VJ7UoUGAt1wW39VHC!~!$^pAtq_ zf64Og+qZuKo-dE5O>Spn2LjRv#s^YD+MS73ph8p|kyR=;;!yZt8ao{?sxU(+ zkuWectU@j6D)(W7_ODHpQ|43N8XN?W#@jwP)jMPax=cUd(E0=)8yl;97AjVe%wA^O zpIw(dOk0(I&|*d9I=0a;atlL|K##Ehx3l}76=ClWxC7NE8k7T8EKB;{27H9>TOTi# z@on*>`zX!Z4VH7RH69-yvv#=?svY--u#J|ZdLUr?E=W)LwBSKU7h-S;9TtKd%r&p- zRAerkk(9y^>3H^n8@DjRi*p@uDZ&XJ!>yEeG2uL4F-E5wqIQP3OE@C)v<=;ZM$F!0%%eU$dmrC5|ICZ)&Ocb z6_!o+)R9q?Z~cu}CH0w79iWRuDLDFU7F`rJc3dfJjbPr~caH<;p6>r@WOOv|{x8i! ztRvaqM{kixq@C+!!KwY7)6gEcXh916a5?3M@!UL*#Yp5POShd-LQPUdi?Q+XM`wF` zcWK(8G9cSrI5Qg8Mr+(de^6Oj`FVABMK#o^{y65l#%6L*8Jqw3_Z>P!O>5UlDBVVj zLz>a;bT(@YL^ZFrtwDw@)fU;^u@tmwe4I=bQvO*k!C){!V=;qSfH(+0mqt^GE-?9b zs*qw=MObLA`BG77TB>|D5Io@~9r_EQno7&nc14#KxjM~+6z_0viOBo}pc=q8M}KcEskffn)tzf=w?#11 zZ^GG{**Q4eF-ic@uo|WBwQ^KzH9y3~#ijc-zu4}6t#d9SJe)IN^u78`8ylO?W$UKt zAP54QQe3dX_w?8S{wiCC=c{h`~BscDJm!9R|{qt00Bp<6qzwh-& zmA~T>!Lt5gthHCnpX2r@ah0pkV1}pepj8(`Be-6XA^YxOM22o?1tJ9X><^&=D@D}? zS|eh9@bDhf>l=ikW?{{o{N1}9ehu#RpwPM0ct6t3+f zoeH*g`M*3P>Ek|S7vx`2JXND#qI4bQj!$%lH94C-Vt#_z`l@Zfkjk1CELmJZLCDwAX4|?-Q|l*? z+lfNFlia6>P0Ni6Je=cRy)(wjpI3*4Qt3UqvT2TX1&lFx&VVNwQir)0`7NbqXoJfH zoA{1}#hnK;hnwI$jdPYL*1gEE!@#2)c*&4RiC>NraS?m{8l;ddF~Pfeq2C(X^dKmx zm1B@+rIc9ORjnw6nu>BB;vqGt24>(lX6b^_g16R-6LpV%usZiPO`*bABMf8J`c|9f z_$Rz(Q(5h8t5AZF+YefKxi=0__^zoBi0i&Z%9ZrM#eP}gpe$ajJ*3%!vFe>#AGSE4 zp_uUF@S@X!xYH1##J6a6mNqy^RC@+Emt*MXrI(bgusU82U!C%)wFi9@h)`g=!~u2LcXw#QNf83Ufw&Dk z*Ft==Zm>S!UO)3wu$7iOx{1HHz&p1)U6gTTjC)YWNERq~5Jk{dI1)tw*<@IK29olm zoAKsa^W(aw%BW1zjEOd2C(S=}A&=d<1X zD+5mrZSY$?`kx@@bluT-s1UV@NaS++>36jQ$Qiyf`qXDyTmc$2#6=tQ^5cu`-(+}5 zGZQL)?*pjR*Wk?7bP#FKoLMyooGOGwWNT3!q7G8cI!AP_#Sb5`DIyi0>MBhSk;pH; z6>cJn`V3s(&*1)Y0^$kgqDj(ifcir?17Pe4Ae%2lR_q_H^A)LS<*0G_Xy>rKp!$s) zY`}fTG0VR9+FJd)P(IcnubSb%k`(>&B*a*2*M66bdEBtNeo*vOD`G0(Fc2^l^;QHZ zqdR5uwD$Y6Vhq9C&hTD&7kF2aIJO6wt_E>`Kh&D}2M&5+F@{fZTM^F%u`9z zW)YE#c`7HAsZoghdF$87(6>z& z^RbGFq>mDOP^A@TSg5_l_7HD_YoNe+IovV*MP^%Z?*M}zC_7@`MHXexyRg)nqLf64hy#q(_ri44+3UtLw!+R8PKKi zTvDtmiSX)c!N-HdCUFz!QnQDFnuQ2^N;ffiyfQHHGFF5gQh2sHaqsLzknfY-3~qNj z35d-Zhxl{}@JXiD5S-9Mlpm`; JDwa2W{vYMK7lHr) diff --git a/packages/stream_video_flutter/test/src/call_controls/goldens/ci/call_feature_button_light.png b/packages/stream_video_flutter/test/src/call_controls/goldens/ci/call_feature_button_light.png index a62cc2d7a0a1c7d4fae4fc605693193c547f7470..baeff7884f3cc40706bc07cf49c4b3186d8f418e 100644 GIT binary patch literal 7465 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 PD+r=vpk1Zu`0QT*eqYh9 diff --git a/packages/stream_video_flutter/test/src/call_participants/goldens/ci/stream_connection_quality_indicator_dark.png b/packages/stream_video_flutter/test/src/call_participants/goldens/ci/stream_connection_quality_indicator_dark.png index 6ebe966a8f9b47c8933a2d4d13e89ebb9889f658..89eaf5f2135d2de175ca87636f88b89a8f813c8e 100644 GIT binary patch literal 2658 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 O0000;yC2n|SN}5{QV%RSG`fJ-_Hh5D|G5lTHC1 zR-%;K;qcbm?yQ8KGc-7XWb!f0V?*>(KIfg^{|-0ad_(jy%KGNlzk}IFccshk|NZh; zzrgpt|6S3`cuu|KC)(dW`~VXZ zDf_YX$)}6%tc0HP?Qi`6fBe%;#JamgFQqOuheG)06qC>aE-S}B{f#>-X;8oY`A=$o ztgah)``7P64FqgmlUJlOS>|T}^RuS+Orq>Qe3Rh;8I#`$6qBC;3x8$*7KAK{#Ul2$ zQ%G&DBa=RYq3bYo9X=nRs2WsFL%5|CvEDv(c6Gz&^NC(^L(vO)q&C*EliEU|kcX-3 z(DecoRfVc*&;kLpN22IC6GtfAB6_*fVSd&$YJSoeuxS`bKAFeb$}*0R%@g-IKF*<# z&mnzyfX%h1P!tt?XMfM(+|URVRds#MjpXRy0E=_8*xN~+`0u7+z%&fxvKbug?IQVP z4&jzoB!+N%Wy|Q6`)--y4(iU*3Sj1{_3CmCBU>ZhMk2OsLD@zMlUri!0G>Z7S z0r>p9+ER^tE{Da(53#ke4xm)kV>9U^%-sDHt&1HPerX)-9ecpJf^b79P!D=I%6(&68g})AJ7Z_b`3yBW!J~RsF;NtfRwy+?%?M zwUuRC*C#vXXN{NgldgcXnKY(ve~kUzZQG8yy|sbq+aDvFN!xbJMz#JliMvy`U>LeB z$14_#n49?wbAL0Rp;Ro|a!i>qKWn^}pHu~G=sNCCPdQSQ*-RSur$2$A+w+ZWMBAI| zc>LfViVpmsuB|L%;qgP;k1G@AXN?#0lcs=6r4sJnnL;j`aco8|o5q7XpP*E#{j{c0 zWsVN<@ZP^2ow2&SDD~-}70k~XujVIB0k14A;BbG>@qal7`@2|KT5x<$Jt>t+n7MZc z#p1E!vleD&kk92DpW`OxXN{NhlcInPT}N_Z-nDrvPZnV41=r@uZvANz+4PYsvx>!I zEJ}DPXa)1L#>@FhQNWAyk50YE*9oR+U~&GjYx87wY?@edIg720HCN7d+`#;-@p^v3 z3)nPGY=5q zlArJb-rYX=R}5Jyhx-2T0lc*XQb@Dg?vt$)4*CW zKWpsHFV_=-*{mSb7b?52Ecpp9;LPEnCuhqblSw;r&t;|3NA;aQ^RtHeNl?Igq4w)P zm0oUeVs<02^7U79x_lbbto_%_Wnd-0k#HV=y*h&%J-am@!^`Hq4$WM3y6A^ip z@B-GfU`6{`z1(1BcB9e)fr|D^6!Q4P!VF$NsQq-=%6wT>x_&z@H&~f3t4h~z$K?hq z^PMEVfGZ5a>g5J2vl~^VU;l7Ei`HWkqks9@PnS=eU*}JNmF8#1<%SdIdn7+QE;pPw zUxNIE7jU?(&6Bfb5Nr-XQN(>>NK2jP&-|=mei9ULXIHGE{ZgqNq*6OIZ97d@cW)Id zZ9IOzA03_L&ngyzAsjU+m<#^z70BM+KJ;9e=`s zq2NI}^ule-?_|xJStvOZ;q`3Q+fE}(e!@SJsH3wBe!su${eb`Y=w{8^PU83b5vkyt z-{>M;F>IIlZKUNu5I-Cq|J=5NgG2n~gAdDYJ56V_vL{~IRg&L)CWsqT<7Kxozmqkm za+rAceofm>BTIh5UjZwMf}VK4>wj~5;{E)bH~`&!aUrLHef_oHKP(gGXN}kMlcIqJ zhR5LdH@P;??{C83$e3&MWTq$z`iF*Ho!Qmhi?)v1?;n;4^Rve5`AJd0S|H%+Gg3S; z2vzg;9T3ktn;3HKju4;Ehk?=auFP@^^Rvdw`AJd005CXm9$^iC>` z;`jS;Ve%4uKIeZNhR%;8+|ug!95*pPYrLGFGzHwGD44u_4S`^@V>6mVVO+d?75*mo zE_c+6NVE%M6O)e4h$jYdHZkbv3{jY$HD1k6ngRxZKro2O%U2z_D6gs-Cck(Ms;1d~ z>_*WW??+5{r9kWpljEv#sE3er0Bp?WuBYG*Gqy>VA zCk7Fh>|Nw~!ThXg)cmA-6OM?;D_FopM1rt@iHHPY0TU4k!jo+QBN6dUy!C! diff --git a/packages/stream_video_flutter/test/src/call_screen/goldens/ci/stream_lobby_view_unavailable_dark.png b/packages/stream_video_flutter/test/src/call_screen/goldens/ci/stream_lobby_view_unavailable_dark.png index 5a5b0e74ab94c370d7789d5b81cfafcfbfc64115..bd331d0beeda9a11a1bc8b2fd149bde4e14eaf58 100644 GIT binary patch literal 24336 zcmeIac|4Tu+dqCucezU;6(uQ&7Fkkc8B-EjqO2t$$`m3?ma&X(DY8aLw!0)DB*s2y zLDs44>y)*zO_nhXX1>Rz&;5D6fBe3`=Xrgf=k@#iKCjo^OBXZOd7bBR9_Mi!=Xt)5 z_jv`M*VEjzVdn+}K{jcfRX0Eo&U*;*+gq-6@XcA0R37|V>#C+@#0CF+xUL1kXAV~b zO*JH^c^4Hy_8?m7r;I!kC;GfXM;KQr405AuqwmC-DHkm%{YM3_0$%Lze*0P}R=Dh> z`95Orh~2=>$jj^3MePaVSRdFYm>pGWx}o6g#*znPtp~O!-*l+WK5`~+f3^6*gD=lK z+DhJEVlGuuJJC2{PCl;B{w8(A%*-VMH^OL~^(Fb=-Tt&|ba7eZeRBnap;Afd^u|ud z`+6Y4Bym9q1FUIh8`{2%{@S9<1pq)LxDK@rZvuR*wv;J8318}|SAuElmK%R>?^ zG=^{J=UNHuVqGTN>9>=={cA`4e{X%vmj!MK5RBIzd$a8aU;kz+UY0Mm2eQJd2(`X5O6HLrr zQLY_9zDx7N-yeuHGnx3^-V?IY=MY42i;$2|S7#?0SRN@)74M^YQ6<6y5Ze4E$yUq14RJyN8QllQmKwMflC7E{>U2J~d3&Gsc8G z{9P@lfyC%f*rypjG+ir_i-!nq`ezFj{Xq6*^u>WvRc0IIjP;+ZIV!(9UdHJ6cKxtP z!82tKQnh<-BA-0+^ZN%cvUk5Bed{4Ht`c#DJ~zYgU5ZfxmOgo72NA?PRlve?uL8x# z6}~lqLZVzHc5-rZUO(ThPuj5-5#%7NE;;PR|9A$9HN^yO;8M%!X86$hi(~0>WC-T^sU7H+&bneZ{$|@NQSI$g+C$;6C`6ILJ*piYG2L}fu%x{RlFxqxt zU|?uO!##rq%cqB3zE$0oJaWVs!wEMF3kn_wtmiSo1YCh$i>~L{-8eJjvRduchK7be z-t74!^6*hCHpL>>6rCyDFBbJQEie1D$#w4k#~t^wE5Gi54Npus{B=iJdE9mmCfFZt zO229`$n79q+lu^&kSwH|Z1bU~TmB0%{l60T|1R^l2L81gc!h^$*q?`bNYitr{9XOK zb#jZ6CMPZMBu6~Sq?DBH=AEDwg}-%(-fd(@w6!DRYijK?+G^xflUv6w@5sGn>U#jW zeGaC;GgSAnn?*Hm^Gcp(x0f7dVkRf`x|7-({QO)7PQFYZk(2$RpZ!Jnn;Fu1=?`B2 zN9{C;Bon#ImnUC4C7;VJq8F0Mx_wa^zEWXK-7#Xa8tKHPTr*MDreO;zI#aM3qNevMImzi zn0?n2yY5n%hOg?ZoX0iCk?=-6k%onfgI7fCpO;|yyV$p|MSZkuw+4sJFA`+4#-(4h zkRscNrun6@p%HEQG6b=feBY~FRp(&>4^7Mt(}*?IOY@#~_}18ZL}1^~W?gxn&2uF+ zwL9ZeN)AI4!#AR`+vCkUJ>@ocC|EWv#_*TCk&mek6p~Y%9Dadt3!LJr`gFtT_}lWg zkKJ+mwceiab_(CcgszUd-}*50@tLmPuKH)bJn4N`nlj|rN{8*qLla+h;)~xz23B+4 z)GP3~#e~dEaWoxnFo|{BdzQyeQ}raOzI_yN_;dnGy)sK{ct6pn=r_}mpLgfzXme#`V1IUef``ayBvaOcjv&QmE3Avn()71)nc7j; zD9cMOqfG?oS2jPRx)-iZl@3eeoTrqd#13cWUR(6Ru2eKcu6eVBwy0fcN&ec^^x7#= zJF3_1$6(2D4WVf4lIdjo2ZEG>Fq0)#*UhYxOzP9EWKR`UA^xXe*d})Lkb)BxNspV_ zyIN}!N(O%ro&<#O7-Pnt3Y#xC_xjD%%Bl7@+KxLkCtB3IJ3Sw}glts@^+?PW*(-X_ zJAfe{6WUm^)Lt3eMYVx0I=Z$LjZR%=rNY-YJxpBYC%WdAh?zK!^IR}6yJcdBXD17k z58srZABIwPPs4nTBX&Ls9=Y3lXZlHZQjDZDG1^mqFQTl^yGCZN-NYV-DyG|0u1I7> z-Hw=%DY40%Bp=h`#LNSE(R)N=fi>%`Mt@gB?wfhri#KFR@7HoHqt+gkRl}`g7X**6 zc9l^n`caa(yY=l|7jmC&sOlHz;t(|JYc|qL@fFu{nY%C22qtT+-|d`lSTyqTG&WL9 z(RFHZPN~IMe~r~WwCbidf;e z(4t?z+7%Y{#K)Ij*N4*hKA#UfI50kZPj(`<(uBSX(SS{z)sKS9O%BA^qw*%?ynR?R zdSZPqeu2`^c@dLv8TZw(>=QQNyp zd>L>3HrM;j1HHcSi6s%KPW9N00XF9dMz9Qq^ddXa#%%>JaYq-`XZ}3+;ahmJoaCf!>VOP^R$_4u4XC72; zyE5Y}ScUF8$-Cx!NmEmsSlvY9Eo1#1c-I!Eb>BzY12fYRnKj^MG2K&P>1`Ix3!eMH zRzO8Rnk;-ozMI$|T&WNlM9f97TF5J-qNS0ZE?jz|aJhl2oKr)(u9Yd6(6=J&5a&%T*yW+N@jFpscW_*}ooO^UEHN>+b0O&Bphj5gbyq~N4Yc||tCTqk>u?@xu2<6>MK zuUes-T5tPkMwsg~LGRhI=PM4Tq_zGSJy26dQM3CUh0Nr)IJdI#;JB_eG6>p0n|-ua zl%o@A?4WlIh(waV@K2Fonw&X@BYAoxg;26|D9T8&3Hn4>L`Srk@M;(2?h(yW|0!#m z9Z^iHXcTkLbnI(a>-4l)n<3IUhz>$#Smk2sCmoGk^U-X%dp4-WMDX83jO@zW_05e& zGMDRis1+q4-$hj@)1BzI$$n1Uqa2O7ONX$x}p|wSfEnVuw@o)b1hoE!t@AFh1k7R#Y2(G%NXNfk}Jvxu`~6k=LkUszEf|DlS1OuPcoUv*=G_T-4KD znBG)nwGg}pTusltHO0-Fv}tgX#n{^-ff zQA9=!)PMT=)vJW4A!2??F24S==VT*oKh(o8#r)>a2TBz@)KsS@F0uJVn?-#|Ol?-O zVTo%4TYj>6QCDw5-}Sj6+TBnz0!m6YN@!VN8G#N?aYCm^lkV_$npoYyfOVTIB6tdn z<5|lM_oK(XWJvucdgas7P**&EF54F0a~Z;`Ed4%X^BNgXv|ND`MHj-~>(`is4ze%E zUN+U*MInzdH)e$CU%N`VhSqoiEqTmheE9RbRIR8M9m130jrzuzn;nvto`-PF*r#HO zZa+psBN&;mjBLqfN~{<a8zzo^e8f+f=-;D$pb9gr(ugw-)wI% z`9+(mDgD*mn?&;PB0n3~oiuw>e*4?v%J>(SbV+2x9xjef{+b%RqTA0J-D8aOzDsqk z5`OyyBvfS%88V)daKAUk&VeJ~Xe}cJuB;knOvJQxQmm zZR#4%HG&mEk|O&?c;&o(SHC07XSdNp7jNbNwIWCl4P(5eoy07SIO#`~yN}E|U5Rm( z_8O*B>ND~yQ^dLy2%7W4uW*f%`;pG;paINH+luJZ>!)B&EuujuO!1`e*s}KVTO*77 zl{4+W+jxYFmE~ro_Hdp&jxKQ8KepP2_j-ER4f1z&D#hb0Si^~m?BPtD@8zBq$L2)B zF^cD694xC25xcK#rg-ASU*5-Ba|m8p1>ESbj?23)eER-6Tl}zqMRP_zTL~9enJ6?* z@YpP=a-Lo;R#!4iNKlAn$@KN(qpn?@Dr{_K$jOhqoJEXuV8t^U7Dhi>6sb$@O>S$; zhGkZLT}w(+{A|Q<%?c&jca~xL*8V0vI8l}1^mQsnT+22+;+o&pqk}}f{ocqoeXx(v zP%~1r?~;9dLYeX?IYldrl*sS2?5>xzveHQIeYDtBc2wE-GOU-CXO??b^rT)_K88@> zdUYkx&09z-DtN?teo{FSEK;3&jf@JYWM6uJXX7&=+m>#X$k~SUuant0kU%n9^-*3P ze&l7ub;prr$;SR9{H>AF=kA?KRwxEr3-kJ82F-=~kLRb)%FYx{<0Ht>Jr! zXeLKD+ehs7v?Kb}*pourl(Y(yeqU>)4=%pdL3xm9VxVK^v_z|oZZuzBuqT>G@nSUYbSz!^wOR8?iM9LXfQ$ze_tZrekI1_1{U99tuJ{F4Bw7raCx`HEXI$3naoYAc=3SYqY+8W}2X-pNW86@xwNuC5k@ zl?&{)X~n+cm9y2jw-sM11}OOzUz%xt)A2sFlXA+Xw|G~@5Jtsto%m#4F&86{yT~9= z4@-}9J}SBExbwvYtSaIT3rDLLp%G!jl}lZ;x*FTjry@2s`O)lonvd9^jSXj?JXflp z4>BPIGsW4(D$@Fj$=^(J+C3^5_kF(gb8>baJNqB^y}tF2N2DcrzCN{sKFDe1QBr>Z zIepW?K{8BZ@Ro>;faO3ZjnP7N>!1HZtMrN>t*0rUc(aM8-$RDogB9ugKx%p=B7%4a zpeu^dhzOjuwJ1M7|4sRXxRuhpygUG_i+sdCk&CSgn$JV6zKYeYQ zC@pz~VH3)n=6F+tu6*T`l@kC1ZM6$fHl$B92&|jGs9)j9D)nQpikA`>y5`MzO>J%d zn>UdfHn*h-<<}zLxn<)%qbe5^ZibMaRZ~;rE*Tp&6hd%QBBvCyZs6yKhkd4aEJ7+%S#7NI%keZiwth!+6asFpaUlo~S!>9qHT#5cUosp|Xil_BS4u)t_X>qX-`{ ziRQK$Uy+sbeysE<@@d8-p*EK=WbZWOv>YHkl3^d3wklmTNLSl7PQQZjo^R4i>TA>| zj5U=Ddbd3Z%hQnSt&wwTEoJJ-c6&es^JF;6%_Y*TK1K}gieRW z5S~>{BY9nKqSNWGb9qJ_x>mc@;0@~z=jiBYWBrBg0lmji6|O$}3bFuZlif~_-Wb{u zyH7gu$gXM^CdG+YcwbLSl1$Jo)Ivk$!Ggngj^rB!aJ^g=I|0Pj+~oS0TXbY~;BJAh z2p)Z2ZUS4>F}egtNY^14Q{%nCkImO{zs%R&MV_Np)N>Ai@%DBT zm+6;1`T6?lQv|HNy;rGfeavuyZjY;3%S z$Cr*NPRK&DrzsDW_ zs}H}ct;_70+;E?-!?7s8wA75wJs){BJnEE#&}tXqHe`yf-@KUt&;DVO6$7J@iF>2T z?fTeFDQVm<^dB0$W+ktnkd<5|)!o^7``w0|Pia{jc@lI4^h+)Nq4ZBD=ayDh(+dGt z+U8kXM20xa7-*zF<>;NVE7C&44;`GG zc-peKAdR*Tzkg^|*f_a+-1p)($7Xemr&%yGf2TS6`eGow#F20mP1Tu4SGw{@B+@>C zGpqVP28m>I0UTF}!HOT&-rnAr{3&pwfcp@;XtiJBr#_v8HkLMW{me1THc6At?(OXC z{9<|xjUqDmwR_9dB-g~*OE|m!#RYhsoo(zwD0eR-9mf4!?fH>EBCqV*a90O1b6>~l z?vsmnk_G$?fBcFgaC`rTyXHRei(kJQbWhHQV@+XX0RzfmEy}IhKcE~&&nYyVmzS3& zEv_gp?@>%ljJEYnbdLD)&1@RBt&kZ6>Cw2@+S+;tYXP1JcGup~@nFEh2kpwltv@2~ zjxm`M&Ac+gnSgawbe*mLPFXbTj_xhZE9+AaCF>!!3q)hMXem0;`$DB9;S{u|#!Kf+Qi;y$r5pGk&D;8?yP zn|y291X)0Se4vZQlcb|#9H?VYTp^k@rCj*U`NEEzPu<;SJHu+OW7+AJOtH-kd$~BQ z3XbjE#5jH=XwT3?&}v$jgT?$TWyFJqZI1s@%Fzt-?mbjwrLQe23I5$|-Q4GenD>ptVi8Rr5^1=!H z$mnR&3hZ{#IVdJ(8$)@un-~xYlE9S{qqQ*Y6c>ATkr_+AS5JtFi;E`;ul46U21z$u zve!%SR#C_ZDmxFTJCf+_9_5+W^1FO$Z-nLtdRwG^@$6uSarl$cO|pi6d`bP4=6#Q* z0b?|Gdx_PC3wzh*#y@>pf0uK8|Mc*^xaRFj_Qgez$iz`9d@T+ETJWPY&&F%$ktUix zFKaY`07~HGU*OK6xn6;>(sp@X{HckT;B(9HDn9MU_6pC+pMD&q{<(Fv0tnJ@MB3SDO)yc1v32g9hEG)&tijR4qo*1S>Ct% zqyn#In>2j?@Bq!7UvqYr1rq?fnejV~_;ZZADWS2trbeT^y?v(Fl{`F0ZDH+A_7LOh zx&X7Lgnn{kU9?12@)`tLKA3Y9QuO~N!p^@oY4=}m9Zm1~ld@%9Wm=YK^>gpaoqfsEYfKkID(cb*k!1!#IKT^>mTj9=RuV4x zE$UF6818N&GUo7P^=861>5(ZB=K6T^aw2#l_oumcjG<0VwtKkmoDG(HbSDF*VEKh0Ta38Hz#uad+Y-kr>f0Qy9t`AKjR3P25H}e`s^A@a`(8t5$5;K zt5SzJ&HFnqIxcmRN4}@{8F8=KdTqKeV&r=zYq*#Bs1iV0s|UZUee1E)ooqObUF_;z z`M@@=u?qvt?@dF^IDg3~dF6x3f(VL($58j3CgGAfi3&E6TmNM1?VBSOS z-=;+B1F+LQEN5Oc$h(=HBL7{9%1ZHK;$^8B1>o2`%Py~IdgGi0p0C) z>EKyeX_Xj(dz66>9^&k3!g>0`K6=VZ^iZBarUi#n$CK_jWx_Ywa6DnLC^LBtcaYq@ zlTp{~D7Q)$Kd`lc6CvnQskyBjPranQE2(gN| zRJ?c^{#XZ@g?QzeyO|OI+&2pQz8d?z3gJ@Qlm7s+iqP1Tl6?U5u43q)S}S@olY!_W zN4#y1w$FR-at^SdiH5EM4N*2}00}^%n{!ve7!Av z=LmX)GE>0B-Om!r68H%V*b$vdH@GoD03y|!jlBI-~)&$p#bB!CCbGsb_x-b3L&Ln7_3wNqUW}lTal+|iL>4$Tlclzd1WGrn(qflWJNM3 za`GiW{Qr;FdfJ>&_^t{Yk65G%x#3}ULCV;GjQCf)%2xGiV^rGkvg)PTaVx#2Q_7d? z8>Y+HLmqHnP%-d;`m;#JRp|;^6R1W-AL8X#okd>ft01*QLtg85SR&YI71f@ z?0>s!j3JLz!L|*7PvYZ)N#2Ya0098z{0JDIQC3^)D(5}FD-_u27cX53PD@KGzWrV8 z_3PIFkm_Kt)0X(^}OJbma*s`h8!<%=j2u5I8 zp0M6T98P7mJp@!mWvXIn3e_vXL*jI?EiOI3=k#3h=-al$pfQwAA^v;afGK|B_P3Me z<5y_fn814|o>3#@6bel58dowV4&~5yP(KFqJ1_kFe!}yo)!0EXpnux}81GE+WhlyV z0f8x8Sa~~xLLi{vce2`=KO*htQG6rWXQr+dXy-qoB~pBjqEJtI@+tJL%h0Ds7yrq5 zw3_rlXx^0FYKK z02HXACL#g6e3FzDW_>|?==~#G9pDx6!=Z}|9D=<0uw6jFhSpEYz`fB~yZ7>24_g1~ zF#UrKFUBP&%GDJG@G4lvuLrs(-NAHU06fNb&!G-L859>qiT78VY~^0Qd}*)>{}o=d zv#W3V!GRq8Y)4#sRRiiakcz`x--_(vgp@*No84cG_y7AK_TLGBe?R-T2L1;%kl`}M zfkbK-8HVb4OP2PjxheJia9939El6#-sa}@9V^R+zDq5dr_E?8_ASUy|p_tT*l4mlE zLak+=8})};XCyFzJl%1IcTHrBd)BTdjlJ??hx59Mi_;=*x?lbRyTZw(+S>V#>bJy! znRFquV5xXJ;*JtiU(oS<*&4^?6%z6+DtVKdM}+#Zm&y(v8m7K_ERkyd^r7}*TanAn zqlbnwf`V=kJD&GliZJn>oXPEY-ev)R9d92`x6XH-CKgM^)Y!Z&RH&)Vy0F7u<5}cT z#3tmjC?xE)NERP!%w%Ito7IaL0r~DRGrEns{X1Kti)vawemSuH5N)BPCUc|g_Ki-9 z6^^;v?1iL10^u+3t)HmbWZT6{-Um(EMIQ#bG&b)F4bDiGS!=Zirf`ks5sm$^v1E;< znXan3?sIYbeijPmPEC$?9NKC+SvU-6l7C1QLqU6KxgVW-&{0$ozrIRIDcO- z<)@ngvJOofUpuC7IIo~wu&LceUA^&K-?sIPm6BJF(>-o|Sm>+}6zLII8W9Py_1@o{ z%vQ)NpVu|N=%ZR=g0pdV)HkYqT2{Co$Y)*n5vP~@RK)Ec zL``MJ;s$=aO9`hlsV96{4S8KB1V)>sHE;P?Ha0bBWR#Z#l7BJZWm?C^V~RbgB|$+4 z;=~8P^+(h$H+mbA@d0(+&pbOGrG!++NDK^bvz!h`)W?__l$s))KL%7NJ2wi}8$_TMyVXCu_fLOB?X)^=q*VE1`O5s(+lR56N@O z5FjQ0#eF}W)^WIYAP^6vtgxUUA%?H0W9fH_K1yO&{3$R{!tX}I@A%W*cuWPa&u%bJaJqTl$I&RT=*AK>?#tKziA0G?bh!%pf z890teK9t)0n z20)R!h7vf}ZUDJ=!1qRnXPs-$5iprCi>;|l+t;NMj+M(eyTVwTn|V9;@Z`AaIdEO;l{h1Z)RcV!kJy7xI^bK z88p8RqJUj% z^VZ#POiS4@(_PH5mtn)l=gb zjrp{Ypdj>yW9{Stq;m(P=kFF27jNlvloPjC*fi|Bu4w!xDrs={w!1riD_vY`S|h(tPdBY zhL?7hYI`ZoH~GqlipIvp8jyj73y!!>JJllG)_%Ws+H|J^`y|vgdD(Lhe7bQg?)e3V znHs_b4xh| z808Knxr&6^U6(hTq`z`nXy0^_y^yn}>Lj|%ySeC~uD+{xX&)3zLCK*u^LZew`YrLXeLS!qki8qiF}=&!G%o zpq8G^>^Z2BTC%m;djCs1O#|`{Ps2D%&0-i!3v!V&QdsM;1&OjNvh-D4GHU92m;E#u zm{i2cSRD@J4F(M41wM}U=Xs%?IG_)|GG=J1s}~ubg}V2`d55!^u8MZ3r5`*!SZ~ud zxj_vn1h!11QBhBDQ0H{dxzMP?5ynL=TK_EHa`TM3de@HkN6Ka{63ZrA4FS|g8_8LF zwQlv>$6xfy;$eMy8ffd0Mlg|mKbYDv1eKR8cXCwGVW%k8=0L(5GPS+F2Hzqg$nNLp zdjSr?(SYf0Lyh0|B0WHcKbv{+wK_=Jp^drjxz&PHdPBN215z48;Cfml_rfgFBk0bJ zqKV| z+@!sdFCY&T30@;+EJ+syD*V&sZ`{v%^!}mu`WQWRb%?%NnCmxMg``2ajEVj*!~vLD zdotAWw%N2TqSI^ti8y?7RhCo5uIzcUP*Z{D7XiEQp9KF9Q@D@-4irPj8S3xwY={#{ z?f$3>qJ%=qxLnx|!-ktGAb|t?^k}_b1jzlf!C{QEktKgZkBGE7efzSq$!5t5EJo z{7M=uC2SmeTh9FQxvD2gzVw@^xMs{_e0`Oo?^FXHpR9t%X|ylAXmAqDC0f5eDr8R= zKuPeeuIp;*nfZBnUgDWCU4lYRFVUknXux>f)fEUK)b;z}jCAf$xl#5BQPGi+?P%9O zq7JNmr+nL>jra2}=Aj`Cu&;{ltxh8dG_|J*id+sFyLk97GW<6nj;X7EY!Im2+2>fn z*GiQi91gLJ2nvF8zpbvn*zk7^GYX%}S12eYHJzZ>S88J<;ti$Qr-1D$d#P-1{kB}; zwSThFnc$|MAIuih7cG>xOIt2O#4Vee2*d`*(D^SM3a_46_WUabpF9++l;=cy20bWR zNY5)^8jWd{+1{jQoFGsi1qF2$(Qa=INotM$#ht%voO8^YmfW*Xbf7wpEh8^aevw=- z2)|$p&c3RyK0#T^IbgaoLxMx*Ju1en^1>aiatbgZ)wNg#+1e}8UkJC{fcWk2-DQ;enof8zQ#8`^W&@kGE9kR3yaRc-Rgm*-txw3vPB6c@WeK49RQu@Pku6 zyKtZlc9+yAuZ4pgi*~>QCcpU2Ty|@IPS2uF#K$^0nEQ%$L=!plJZNrPwdt+-$S24M zS-sl&FzE@!FnlrovZ&}l<6>^PyK(c?nSlm^AWnK&3)Xq$-kr1F^%rh?|BkrF!xIP2 zH5XV@l9ffJC`Gh|47RdT(mP1Yyunoyfdq9@Y^O2 z^^6nSg%Z*S;|2T<$#X#8WQvj<;iqLR9s7IR7be?~o z^09F!TUPFlx9+*#UDayWH7opzIvxTe-sbv>=j)u5Aa~q8QPG-AS6OVOM172gdeA9k z-2+hL(Bs4O&LYC0opg-zO{znI@_1hHjJjlw3SXd_;!BC}nz^A{vdVWfAL~T-FwG#u zy?!kc5knu$E1b5T!()pdSe2-Nbt=?cyd@{9g4yc-4n5U!$%d%0>(yki$!yIH2X|}V zLA8SJEOdWh(yspzy8X}~W4lcZx@b=|i;vLuI#eUY#u1N-kbbD=6Sri~+a0^C^TjUr zO#YpNu%oz95Zmu|y+!-F(o4Ig=Smi#+C)CSggO>5n~jM*Ax@)^qIf4M~q z(Ma7YL?3?TlpLa$zFQ~>ubxPn$~`Yc5#T36G#b~)>kZ{9dW2Y=fROXnKvE&qB>dGm zlYIkc-IQZ~+|m9*Rd-V&0n+}3dMvdqM>A_>%=pyd;ks9k?JpcMPBqU|hi#lehCsD} z#D+8zbvKk8e*gyOXnUA-2H%B;2T0%9mZ3p)4Nkco70c_8)OTT2cxlPe)t8q1ef|Hn z28{JE@Qw$wjEg}ci=Uq@R9*2NOzsgFNLJqdydz|xf4X|1KVM)_nQR`4WsOjOxOr!! zhfCHXRx+q_c0UR*oW?GXX%4bHXx=TrHu>;iKoje8KvZ(?Ym-CP`^_(1X0Al@w=H~Matcn@%b_h4nx9yQ1T@*BTXI^(^`jLF zM4Yv6YRPcKCCZJOxQcn*@}<~1;l9|7Ai_^ngyt^+Ez@)-j7Ogc8-59B^5`+{7&`9a z^#2Y^QNe@NYI|8rmMh;oUlrvnxjM97p5|dU2V9Wc$}Bx15Dp{*i2R|C85H8^5orsT zY}JM2m1$Pl{M_|lb)d`igN%OS3U601Iffrv^(?MGaPt1cYHOoIF#zKN&SBwwnEPGJ zEHFO-S?=fuDk<>OUV5lGBf#j_x`e1Xv=U zH1aNn1_uYfGRe9i#Y3}X18iD9Jd?oU2681(<$Aq6M96ydY1cD)wST7IxR!jl5zo}` zD~@ZcV$Fji&9ddU;!<)tVoqj+88hbu|6-KSnx|O^n8>C8k_VEROK10dvHtz27hhkWmJ1$S=^6OU~oS%S!$ z<3OJeeUf-uOmx7WqAF0Ue+zpyob+ZZ&k9wigPs?DiV3x}bE*0B0d+FzPLR5Kt5DLy z9M(@Xv!_^4i)irBlIc{rovyL;6x%L)mcWg4qH>Aa5zSC~s$Bm!cpHlT%$6dSbP<58t?KKeNIh8hE>5*)6`%alN zj0K$SwfY3q)0fFITP=LNFzA2Qut+7otsYO>ot3pxg89Sd&2eQfw5-KxE}0>h%ICxM zOp_v3X`#n}pm~blZqC(n#e&wbL(qoG3kc0jdZ*&L4zkVq$mBh11+C%4MTP`7(ND!M z{N23gGV&ERJf|BCw-u$E_p@}U!U2=iT2K!2cQyaLCX!5hA7$pW+nHJ`ZA zBln*Ob|wGE<1YvJ`rABVFLy>sUlwOGiQ zdznQ5ans7e_s2GGFn%YwB4hVl(**x3cB6i^r~F8|y3;XCV;@umhKy!+#uUrL1-o{i zdIFt3+YqrtEdzlBq%G#o`JoJZG|M!$qg*c?c8*tH(FdnpxeIFt*F&u@a=RxBtpuF` z`3GXR0r}fopjzVJpC7Ls92InksO8ynRV~O33 zMOEd8E{K>wT2B85%|7o>j?Yv#mEkER`goozcTP&}<~^8GXD#ROB;cT*g?dILmIB^6 z7pt!L^zI56A9UtCOE%V^hS>XV`V`Z%W9XY)%A&5%e13{=4};CjW#gB-b63nLs)R}` zr45Lmf+8Z7Q@Ljd@aL;GyPOg4P0W?klC|Hu7f*>+S>3)LS@F~Diwd#lmcEcMlB8G5 zUY85JPTF`(q;P)$z&Rn&!a9;RzWqxEdTsaHggA0 z>JK;HS|{5Hq}X+cxiXIH?k(s0w`HIw7q477hp{>EIwxo96TwM1AiF06>Lv2un>$m~ zLvIq^($m|!tGMHuFc!9P_Y|PxonJa+l-JQ5(oy%(;C*}eqv%99kx0BjG|Rwozp%~U z0aRIK)}37eMMamv#k2YEP3*kDRc7Pm)kW%Kh3cjA!#j-1=IOfv6nZ9q1sV641NV|T zCf#kEoxd1MOT*EDyyD{GECTz)I;Y12Xta{r1Tini{M!pKGkEM$BzyyG+ZSCWuk|31s&DO|l zg0n5#+wADKC~OlNf1uZa?JLLEAgM3RvNyaBU5MLt`E6+_^JTt&t_ShrHMf|C>#z;C z`uMnEcy*Kmt{8ZdB?wEI>CVZ^?sA*)nf`^VEX47y64W3CRaK5kV8&fK{@!xk8cB$nA-o8 z@6@MQln5>>CpTM2linU8tDwLrq*c0*58bD9c0S1ufFvY5HV}^k1SH@JFrDAR8_B94 z?bFP`8`r@reA;es<2F99NHg%Nwc$p%Qw%b;KG-b$5Dpi-05&`@@T1X}tU&@3-$pUa zYO^LMV@!ROzQ^PTHt*aV2Xp+BloW>11=y`?M(hql%R(|U9{A~rimo8Pcn&_AS?p6X z0F3)9^y3e5B{r|WoMH4363{SnYs0I(Iyu_xj>EaI!HKT?jPy4Ruu+rosbIF{)<~#M z2YW70*XA;p(8(JzqY(3883Kg;FRSs>@;DIi@epzAhh2WHT&5J@9K{rd=B4jL)v?sZ z1gwRm@oPx9!&~2WqD=c;%I*`w1OiB4kTE1Gh9I0jnw4px=qUq;tB^qcb}-dE&ULi8 zT1T3+wW!biGQcB2M{=XE6^xmfw%O zr3^W9pW(xn!4ZVzK{OFBUH%giQc1A6Mm&>XTu=pr!aaXHd+;2Mx*rkVdvn#0E%uoX zu?+q2fT#9>>fAF=YFZp@P4|Oq80d2%pSt0+49ZymQvBd$3eyDg(e=iCUSWG)IKk=; z%}(njDQ!dFCI^go4C<*x}dJ(_t2N)Ex>0ms~woSAcwsbRXIDz8fUekk={&u96c<5KD{waZN+AtVpB(L@U0-~wtoZI##R_|}EyI=l257Yly^p|xe?$k9Xb)3GR$@*t zzgPw{2V9*e*elA;Q+0%7{C1RQ@H70SQ@O$vi%Qs)4@`Ujn3Z1@-nK7i=dvs$F>Jag zlfkxqO|jdJOsCt}j-TQp6-Ndt7b6UFJFl?YuwkBa>SNn}YQ%K=^v>H5q>~p- z3Ci@Xf9eB+O;q%`Ji&Dr>nG@O9l|;FiHGfCl+FVjkh$PJaChMI1JxLKG3x1o&nrMH zS@T)q58fcPXFn$PAeY@2K2-8vIDnSDyJxL6t6e0x{$nx_Hw3o~x@y{td|nT|U;@=% z*7s*W5X}US=0CtbhC0?m9n=7tK8C}8ubl4>Rx3Y>(4W*5_H=^jhC7}bAaWMN@q_ae zm-;Q%$m)~Cu6-F2h%Yee4@8jDfIT0Xp*wZ%SD{}?clGp=SX9uL#+84y5f)Nws1N5D zS_M*ceii*#PpvgTzgp<$NIk{7CeMX=8S0g}W}-)sqp$swXYF2I9ch3;*CO{rX~Hr) z;j_Iop~LZkqcFX(2j$nP*(@*~yBPYRyahthm}xXKk}v`(>Rzol7J zXi=`a0N$FbZj)y95FW3pc}RpH|8#s5)z6DWJR);KPX*%3&x*>eZB)*T^eQ10yyyU# ztueOkrTWnWDb4=uKd>_Vnqb}Bl1(16G3(N5=E77vT3;0 z&|et(S=2UOI9NwnT3le!*amJ-?K4o~eRo)lCzHJ>J>borK;2vqPOQNDWIQ#~ce7Fk z?b+XAJ*kh_`|*8xfP_y(S`-PVv*rj7bJ-(DroX1L?Z*_Wq;89-S?QRK3k*;Riy_kk z3ar`_KUtMqmZn%4PgED~!c6odAf_dvdNG}VwO}>V&~OBe1F>mM$F-GZ#^A@(DdGG) zzDhMXp4!&Cj5F7*^^NQ{UWmUKG_zoCWaoNecS^|2g2Url+vmsRw+)ZEJ+68A+$c$V zMH3OcnKWVsddDu1YwQXX;!;T^TeF!41>k$OmXms+|a|j}O6G6UtExrz}oTMn{!>_g26Gj%|@Gn%{OU8AT9z#OT-K7Qs(AO#DN)h2yM+EIws!<)~WgeS_979$kyKU0+piCkJhO z`&|Bqw`;d*YNy@C{*vzpz9R1%O?hF_w6|=63 z$<`Inbd%e%%-GYla%9~1$g%Hm6bJYzDk_RmOi;FOsE<`bOB$+;VoO&JNY8wIFUg)8 zZL>6UmHX}{=kK>}-O~A5E!x%DS(l~D-J7r*K{#8Ilasr8dz&_>R6H!7EZgTpm`$Gj zq%Y|j5>h&Lg(LdgL+QZA1I5Dv{uC`eN;k@g#Y zI%lO4Z!&RZ9NTtUGbBwOsTP^*bdDPN(vlv+9Cxth{_u;Uc&T!6ub=UQo!aqPskof6 zy$E8LrIZ$`iV7L7TERmcR~EF@#F2w*W$~Q+ij@f;+VHRo-TXzk{IEKo zBNf320tB>;v70&r(QnvKznAc%?$rV2MQQl z;A;hpS(rXKa+dqU{6qQSBxVRZ<$}FE2?yS*995hkW`H$atrLdW6Es0pO)a*$xfzw# zD`O1}4OLCegqE|3XVwdiv8OlfJo+djBO}KhZZ^ip$NMdQ9msKiWw>@1WBBX9`wI>Z zd8@^Gg@jz#y!F@3ey2gkZR6Y=a2D0d8RM228;Bt5KaF!iO>xJoa^ft*IDN^l@2JNRfb`>e_+Rx!^Vl21}JqHRctHl);+78{SkmirHO7cN;D zc&_9~euL!QlVAIE57QJgF%j)mWK~cYHl0K;EAKZdFIc)OCnu-h#bnFUrl8YqE5s>Zm8<1wjZ@kj@(ava(ZE=t2+BmkFw!s zrj(CtUkgqBXlos(9g~<+rc@j2bv2FF&ANB3qy?v(U}frhHSDKZtfqTt>&SD2qw?G4 z@MkT39xfrSdnc%;Vq6GIT&=)ipUksqT?HG5oDEfV0~HOo%APDQPby#w<@b#{Hr&d{ zQY+F(DCOy2c~H3EC5hNY%CG%gJsyw*ChxQ-zf`e)vGcSRVb~UAQPFDOyyRsn!_V`2 zW6GZ6MY(zM?Wie^^&b|an`pEQtNyav)*|6d1#yuhpKPQf?JDLh&>?Qfe?LWi$4Smj z<*J%*shutBAs#W#O>3OprkmQ)!F!Xcm!`iV$o-N>`B(_@gURMKzD^|40}!x_A1~~; zpxzl~cH{$V%=nK7sFhmSwguMkXn!56V-(7FVd0A1-8!%mA}?w#(?yZbg*zk+{H|mt z#L?Yj6*m<4P?^PoiLjkFtlJH0v9zmtk9mn?qnMX3b(2SoZ%C~3)?Z)Ux8)`xv**Tf zjPW*`u1=j~#nO>FJhrE~-+}v*!I@9*kG6fVOj4|0su|sHf7$h5FxSutsWt@@Ewg>4 z?>sfl_LL|8ghzUFZ@@C&FIX^PNh|Y?U{@&z$qM`KKhS9Fu6#Jlj)#e0iP;eT8>rBx zo5!o-H*8aW&b)BC;7|hINBGRdEcFGhV`Fk+h1x>jyj*72W8?CI7uF>5D_d2YZ;xge(C2^5XMz^i`1&6SsMt-#i`eXBV z9aURofF5H9J){*P!vfi)ftF35Fd6Q>rSh}UgZ?>EVp0id%&6QOH#pzx zH*6cD$X3yfc5r_^W`sx_LZ5D*qGKnQ)#^vs60%8nTYBt#(*TcOaAYA~vA%Sc_Pl@g z$a*9&LVm52qm7Nt>8gHe`-iJyGg>z^$2yYx60+|MjdF{zqpdhP7TJCd^gJw!!ffi8 zKWAVtrge=|o|9^x*b^nd!!*q*4A7k@N^U}4&BEr7Po0^$rC5J@!_-NN)g=DQ4sN1M zqOeS{zG21>E$akYmTS4CS$RQ{%~c(k9WQXEBM*Szw1qv0_csM+S#H1cVA#gf*gxrs)! zPl_z{FO$AFgTzE`PZ}#^6sGUaSsuWT@NXi{FV*VD1Wa`J8Iayiue%8k< z#>;0RH+4<*!_7Al&IVG)xfmC>F=|d0$5t&iNYO|`g-Aj^8-z3*K;k@$V+Bu>@8l;3 zu9V&o4r&s9DwffEvyU9cn)|q%GQ}&k51CNB((bO-r}Km~f6KqyD81A(ZGHHOBl_aU zM!I`c2--=B6}e-3`F(L}FD52z=;p}wH6YD~LYrKpn9*$QoYdD-%_f!GZ<0ubu;@Ct z7KS5kY{8&_=|KH*S)px9u{FlMKe=*Q_Z?{>LtCN3d8(<=D| zuHpK%5l{Nmh7*YQeQ+S>RtPFafh*UxydQ30FHcW zqgttVo`EA07fBs2aO)AVC+Lkrn*&Cz6CsiVg=Kyk0se1b5&x%@JknJN`~2#^6pmN; z-}VJbA~L>cKO#HU-AQh!*i8(${mEGgDLI5*q)Ss2>scL%Xj4fO>{!LZGIz~2zRswW zc1TUQyexfa8iXNDU_sv(Y;0*+ZT7Ta?4fiJpU7$n4W~_;l#Hx2Wy!dP%3?pB=ix(I zw$PT_XovlrRdkbebH{)CO1IV2w^qT6;FVKaO9Kif`h$fnnv^MMVaX!T~_+c1qUdJLY7aS0f@gDU*K@u;7TGIvW_g8=`S zP&KuVp><`A298~E3+Eq1^5$Vae%*=AN3Fio>AET0j)E=^#}_cu+PVq5q)F`77iO+r zy(7OP90}Bh9nxGFbWL}sV$O3Pg|X*Kqjnpy*gkn6aQ$D=*?-^6U$x_LBW}FwUSQ_V~7H3~H*s2TU84rFR|WaBm=`UX(n6l|7v8>Ln)PS5d249<}I zsk7UJibkq>dXBJxy!{X?ME{k;+KJoso;djI%W_zp$YEQs+GpiV$yIULcaqJ0f~VvW zZ8IoJ<-mTE3@d3`!;*7|U{DUGB`t;W)$jr{ShcVvzv;kzYt$;CHZZ}!lOm%Ps$=Bm zJ!)1^G0)3Unn)Zeq_LMXB4QN{AM_@*v^daX|FqG$eVx<+{RKs%)G$Hu>(YQs)JI^) zP0+6~ikdqK_G6I~IZ7f2KcF4&Ui@Iia-TXG^F(Lm*&FSBmS)}RJt@XoAxrv3F}F&~ z+hqD*!lqmwChn`L)3kY2^=tbn0xQ#0LBc4v2z70+qJ(c}a4RGev%Z*YDa~jRr-g4( zzj>UsE%}OuTLH85QLWj^siK~3x!^b9*X)OEp&AJHurxN&(QCJq1-RNZs~$Q!+Tnpr zrIvH^M`%mPay!}W>Z}XBz`L`%#vJ{c$-Gd19(%}eQ~#sqw%q;5da&9@4jOonWOQ|6 zv+tyjF7!at8Q6=wHgr9}R>3@pb=Q4Fs7isGTA{(a6$-8B1<0Pi!+PtOl+=Xlz!}Vj zf}q_-)F;ADd=HJQvY_!#Fs^Q%;oPmzRnsCf+sOMp(o3@tUm%iZ{EI;)K zmzcrm5xO&Q6f5|WtAeqfu6u@8Qy*Waidg8Q%c;oIZ~Qncyt(wwMp!q6jwU)%dB#x| znDN{($uceC=s@T+Tw--}wR;R{;bxgq$(_RQHdKFIUBY|+N@{6naW*WdOnUhe6I-xN zAiphMuKx7B{>S=QpIn?n%<$k$Rr3a8Vv@Iyf|05w)-cmuOiF6{QwWj+T65&9fdMWt z(Rg>(WYgG~m4*h51+#~>oMAS?`smXD3&UT!3g0Z1J}F0yUqOSmN`l7ougzkGQGcG1IotH;&P?UT*79%B-RnR5^r%~svEGyE?$@R z-D%Vp=_I0!^z^!G2gY`5k$L@t~NRf7<<2Cm-1LxgsTMS!eY_A-S9qlTeD>r;iv2S$q{Fy|;j&g0fIE67!D3i2w#Zf_~$w+4Put7)`heS1!k7H|kZ| zEzC$F+c(LYNdAk4CI1yessFoeMnkWNQ!$sn^2UY)KmO&+IUGgNh-76OD;$Xo5{YD25j>r7rtGSlu1}KQBOe=`q^Sztuj{0S->c{(o7w3k8(PQv zd0gdXl-NLEc5yM79^q^Go)C&~HiF0fbivlPv7rGrvK1|LDt*G#RpeK0n&Vs=lb+rLz4d6^nv0h-yj`DAMX6 z`_;Uc{=ljBUd^D1scgLZLUZM!jrFCMr%;Jlytg+%ow$JkgvA}^on2gD!LVJTb=1Fd z&@iTg|0#cG&)4P%pL%_jCxp?$pjNc0VmHvG#P*##n>#zt*VNQNoYHZc5qbaq^DeJS z4nt?57i$zVrAHV_Fn5^77)~|O^p@(3C5csM(JEzhz*IEA(=Hw!W4BZ9XsW8lymfk5 z^My*0zVy0Ct$%j}2>VD$MFhG6jf`}?c5V8$+{3=h6^q+%McExG&~J?C*IMw3d2W?! zzu+mspBC|b1wQ>3H4G-Dw6t{Rw=s9_+)=DgbHH5`i>G|qVysfx5w{&rLdWpPBA8{o zx4-}44I4IShIVioo12;xjb!cZyYm^#%MBkPy0N(ExfF)BR6-KeC3T0CRDEx6?}Ieh z1DH6L1uIKB-~_iFr_#4khqLL%^&^eCe+=_`bjz0oQQ)AF?>|mYPs0>=4jVhZtbqB( z=kvw!iRR`C;WJ_^bQbQmk246faToP;k=qc`a-x}-nN5v#z3B0&!ax?}LRW8-WN2-W z{la+YRB;$yqq|26+VSpPp`JJa9sU8Z`JG$R)6-R$+g*$AM@Ei(xUmOb?|k4=V+6 zuq*FWmQN4{l?Xq{g)GKu`8DP*NBQujc`ZW=4%~(1!L}$?)$**_^R{txt;=>a|GW|8 zfA9%NwLH&(Jar{>c`-^DOc+fd>{T*LZL%s)k;5;h^Tu-^1T?`pB9 z(PDE5L?-?IgTBS$x2t2GJoN*@$;rjMqcZRvN_i$ zCMLj_SYU35UeYr(%4#e9tL|@41e)a1b8u_$m$BHkjr&S=TTd!i^xKt&v_|gua|i-I zI328GvD_fF;|zVVH2WN0;#b?f;-aLvT31D{>!Y31Ho_mvo>#qCZlW!l5a!*9^FQhd z+Voc1c=c(^^*iw^DFjL`qzt9xQo;Mv;!rApc$ z-Mro({uqv7iCw<>Pj(I4Y+QHaC7EoEQSkKiET0kftO_$0ggM6#BZ`PP&_Vba30B_T z-jicLZd}zCx#M-Io9|WsI6gierz1yZdQa6$Rs3mATxfqk@%b(c5%_ToKNLnBvZ45S z9%=!%%l`Hd^Yi-ac9l(`kS3i7#5435P&}l#=I3Z>t0h3#?dkWRV321mU#h48Zvu%| zi|>tBD;8V0EB5qUZf-8Bdtg6y@80db$X$2iIO_cK^Yc|wKWd_r7b8dUw#X!>jN7EZ%jEy!Dpy)in3k<%jJqW_eQ6KC$rj&$P8mpc`~CXc43_P0&VvuS;z@qDelRpdys<}717b( zJ+t29ezWVqd)Z^q^y;^kx%6cz%gvf`14$t6EGTWTR=AX5Huy>gfDgBg(_6mUwLv&G zuYPF>m(tKsX0@A|KF?XubuAb=*Yu~-pu{@)B9WpvNojM z^)q3XUcE{JWsZ*4tQ1=3;dZcFBv(H5kuLU^jb=!|^+406{ZEC*AcXqo?!fK?Cq@+`t{@WY*4K@#|6nWO$+ zauT*UXxV;wIq(+Rn0V{fHwkwkzH{{2;IFc{FV7&sTDx`^xjs?N9d3uvBih+B6L+Iz zwEXA`G6bz_B~^5f!u|XAyWntT5T&YCzO0c9^Oe?B0CACbvboln@EhzQIbm=gzi)w6 zkha3HBr@yjPJ)cl>P)j@1Itsuw0alg>0h_pqUSQkvl-)84)1`UR81Jf$w;42XTsD1 zfjlM!V2_!kLK{-(n0Z=5a^GC0&U~jcd1>6U5VBH9$qylyufMhyVzf%=zy@A7d8ON$(jtK%bkD;(z@zuY(};puUN2kMnk(}Q z3v;vgRe?K=Y$f7C)|CCIh)PaeY4gLBSR{1$f`I6!% z0zZJ+)SZcr8t$<5X=V^t7;JEvjbmdT9SlZp>N@1io9ygtfK;%Gdb}I6^j1cn91Uo& zXNKI7cd3JFGBs1 z1`5q?YFr!!G!2DafU6SBs0dY~bY@P{w{%6U-Bmt#YI}!Ap$rChSd-~*4hswvTyf{l zw^N#E8Q{7}R{H=xfm)uSD7{oHo63s_&O5dFbuM(&G)*@Juo@8GgARN4x&mV0UlY*u zzXD;QKqoO<=P}>i+otM=2k>h7zJ@!t+{=!nW$FgyK*3-&|fuqTUs6KV{Kbk#d)sFQ^<4#pEfWUzfdxij9uK=pQu0*WRV9AnbJEVR@qQ|$f4<*6R4@<0 z%2)ckC99N``nZzVL3`mrQbyKHXBCg^H`zk8lX zZOgr&5t81b^aa9_+03o}<@}d=!cvF;mN%Vt4Y$@%jnVE~*%I=33bTKm$a+;`ZTU=f z6egyppO*&X-0Aw;=Ea;HTQ-F7qe2faR8FP2J%@nzCIs*GMmL^cIg~ac5Pk_VmrEn# zHoY=lyX)(Z2A<6o6A?tEdqGvjU_mT6pD6wDeBxrz@{qj5-s9pGy>%!1mRE#9EN}kp zoCM^RSrbzb8PdiVMgbJ09PnQ%*ufN`ye4HDX17SSE_RNj_pqmOddeCj+IbN~YUF%r zS5R1^9tscPw=?@^)X1Y!5!C{A{+4RvNnQ~#W~tMJuJ(Cf#n9w%6<;#PA-`CVOiTDaf3%;wsDfr6zO5(qIwRaMn7jy%HPbObG5Mz`-0PGaIGv3^&1rM|`XO zZ4z=)5e{-(++}uf3pD$4_>}_~%RfuZ&C)YRYuVnf?Q{eh4&UupYo)hAoKmDy4%XaU>RoecdZjxUQ(RGU}LzKKWtPQ1?94 z5CJ6``OVV=f1__fj>uC5U1TdLbk}d2PsVtWo-`DsExLn@oYJ&;5qin7Xu%v-K;h)>+$3*3;8Jg z$ti7VxoYXy5_1AA=_IO0f_rk*HaSptcjOgKhsPIQjZa-(L2pCG+i~Dd)Ur!_YVfNu zDFBTbo9TQxcNWcbF0Q|ET#qR5>`yi}6JCQ!^rAB(Rt}aE-Tc_MPsjFFD{sD8ZB1v| zP~8bUpOGeaK?wR#U6&r89?BvTeadVhk}eW>M}DnC%hUem^r~qE-k^_QWv+YNk|yF5 zpFbt6KK^o7JALuLeKc3k5p*07-xP>D{C9I4|0{>`@9Y1U zNMKReRlXo^JXKDeN}I%*_WQJ{DKuX;P%E?1sJtk(-}!#R$IbHJ>{`3!eCPg~ca7q^ zEl%cl{b0Md?%dwG6P6z4-^O_*w%$6Ucva>@?RkLt2}Xl6-mQv~mS4xj$dK%f85Ka(TCrTGpnQnb~+ML26x zytTPD>0^fwC;1v{Sqf{2EPYdt8!PmEID1f@R`oTMFytt}(VY>Fw!T!ur!!!FtHbB` zjL^k^8(;Z)U*$IW$*dd3IxgA~1`-HGP!JMs?=^P4*lzY3`@a-mzS_^8oyC()ir}j` zd+_4Gd{__hwEy&zTeh%kZ8(L~L#T8d9Vc?+BrTVg5Z?py|E2x;f1@d@0Q*-dy7N&H zIkF;1;DLW$82^F5O1$NkKZ~_ZErfB>qfqd^rO@-6W8Xl`@IU3I{GWMd%u*7m?wfrk z8Ma4m=@WEa6e%(K*B(WVkG{TsVq#+bGyMn@;|+hJBmozf=VL7hG9PD^8wW`5{VFQ% zf5cKyLcr1rfu5d!@7oha9|4h$ouVv23}H7U4ba?9L01!Oa#L|**^n#CF@(LTwMU^1 zM2_K~>Y+o?#gvJwXzFQj@X{)=0D~_Y`>yNO+Fhan%Zt+}BLEF%V_8j!I)cR^%c!-; znVYLoiDbxkC_+X7lG*LqCMG7so%zlvU_K>6j&Q`C`Xn1?5%}Hlx??g&eB~u|z8-^6 z&rF>{)RDs?h*QFO*cC(E${~2*R&M~qK4jdsKPf^Mw+A9emQgjz^5UgeikX47lT|_i z3dDy%nPrqHQl0ySi$ihq(EPumCSKGOZENm%3zN-$=6#Dbnk?W3@Rr$tBiVx>UdPLs zRJNXwS223pr=h9Iq;e*XY=QayN57tLy*s7*7i)U`8V^vnfK+avlmH0cDEb7ym(G#B zwf@@^-gRiGAl)#Em7SHEgM&S~_a}&WtTHH|7R#s;e}l->RX;z~g??fc<_3cBtDU1T z@j;cdDG=v>f%^fN1Et>mbEo?s8OnvdL5=73hw#_oDSSUaNA|{g2;Vi{*`oBisEFn9 zJG_1pn%muNv&vf7!#Q}oE`H<2jU)Czp-3exjpi7F=&DmgSc&McSVq0wwB@E(*Uq5c z=&UqC_i45WGXD%xohSzcVt1BN?>2o8_fvxU5=TZxa%zFqkPM2$&MTkH!AS%@ly@-( zO@Qn{L1m@GsD{{%;2n@x&0Du__51SaSxzmwA1NCC z^h_TDBQJ3f<|*nL9Q+-EjZh#cUh70)E=bav#g{6*FgK~d!Vq} z_jW|AO_;*_LI-;PdZc$V;6=|Koxs^7>tFCuc6Xj_jjzn4duGuc2+g&%29j=^q|Q?GM8_J$0|xolU}N;WcDzFyM|(iiUH1Jny#COyZTGy(mgqDx62N0 zwj%Hol1zgROi;(-^iZT2isde3jRGVHw^!M-FyG{XTtjE)$sOq=iH(*sS4FGiQ7~@? zLGOa&PHO8+*W413!pJ+DR^K#ipO{*)&wPuLnofH#lf7eSBJDEEk(=*Ol|tvbzkWS$ z5zk09f#OH#?AH}Z5|VT^ZS3JK=3y7btMdSb+8LzLA$`H_XaY5kavhrMc&EBtO~dc< zQ?j~FdtK8oCNZ%>sWt{$R@blu#Db1c<%9%Nch>+NY(cS`*Si5A7AQkPz1ur_0Nl5GBK51NqwnK8*aK4>HPM_ZyvwO`J%ro4e27zUEBi0IG1~^eM@anG>4EjkMiHo0=-r zgXDzTUn9%p>0%^=Zu{s93T*XLO}vc6dOp~KDNSZDMWVl z;s*@@C;56T-@AM6LrUqwyigG?zv(tE4W7QVv|>Yd7C9phVv#-g=wl-Zu1j5!siPDN zDfbU=vcR-g-+v&}gt4y7vcm7Zw}GTc-MiL_k0!w>^bwnmB=$LJ+4_`P6f9pc7QHUd zL7J9Q9OmfpUg3f#q!nIoxGwr?1x=9Kcsi@zYcx|bnk<>%tCmI0O9)PZByE|~gYpn`VjUP0dyr09^wBF9FKSU7 z_Q5oms^?4ey&NhIH3YTE=;>)1Y0QQ7QMK+Wn!qMmp{vub?$a5JQWU|AK4iiA5G|C~ z*XJJARDMqPiDz)R+vo)AI0EWcX@TR zd8mLTY8()iw7{5-Y@+Fby!I!PK6+`S7>idsq4JDtGzM(7A*(-m;G&3yv}`kJcFHJb zzeAS>a&QmY^z>3I&;KsR8SgrS$cV zBAXT$Cq`yMvk#)9_O8Z2yVNgOkv#dSS36cQIhg|Mr$0+*W}S#}!Oc)}47&<5l_pQd zymaic0vhVihi3o60u=O)Y(?n+M&$nb#V-eX2>ovzg(Tvmo(DU7 zeqneiD*?oN>ILqRy$^2iqr8{*OAE|;gue=zWxp$~Cz=GIh&-cGxd zRZ~}G!jp$m)`p)7II5CL)m8VN`fPRDtTOoW)vO6P1EE(2p5?6}#qpPIHvd%RMAm@y@R@ z6Uvx@G0(jv2jcCSRw)iyV`q`hArNs~*^Zm)c=2M+*sgS@Y3@HRkNInUA93FyA-5+7 z@7g0$9SLM3iyS&(I&&^^$pWobWvA*dP^%GI>qbdUXda;)n)=|`HnMWJ85xo~e^h|G z;$!VjK|5jUe&E{U1Bj?RP!lXD8u5w%In9xErInPC#tK`|k&Qx`2|3_1D?P~D$mB3r zTYF|8;+u{(bcbx7l2P~kX74UK=4K(pL;mVP4&B2j#+0FT(>5T$XY8vl>3`nYShZ+1 z{IG@OS@kBu_r*W1@5tkB*%nu-Or%77x(YmlRmst%nJB}m3-n1XDVe5Z409w-)sLAsHNjF|G@yQVjSpRdj zpi}jt7w2R0OKq>YLVHZDpMQIgCURo{hz9l-U0$Lb#N1~0f|j!LFo#XCv$tNVrvW!H zvE@+2y)_57qwhNh&VPJwKuaaQ8ao@9qQ=&P@{`L8(G~+A87Z&n4AxGM?0Tt@*4)r- zZW&eJxu1+lBIjVrN%ng5t?6 z4S?4ujd|SMaYFe(SmoHYUxKbo_h-;6pX9gj?%yxUl@$vQL#YPiu%iJGf7RTbIUG<8 ziWv>F34;9q^wzXS>(WQ-$~x3aUF>}3UoNe+@(z*+rmm)X!f1cIbfQd^I`=kKOk}$b z_?bNa&($s-h57qIYHXF2D=;xju)ter^fb%V&`IhNb^eDHj=Sy2l+pFyZ{$Z9pcRzN zWT2M)-agwnKeLABVA<0Z? ziROV1M&ELEU9q4$GvCA&X3Z>)IvRr}!cCBeag6C-PCNCGg(vINvr$+;0Y0W7TdgYb z-o3PJ+)L@eftmMO0rT&{$S2C^#pp+5s#$niVYVXQpev}o`tO-CN6yo(CxTUXR|#Ft z$n~52nWih$)(V<7i%}GFn{2p#gDX)=S-YB?dZl!l`UboBnNlCepT}HV5}Fp5^B3|0 z%A0krEioL*$b$nn7To-5zHvcb+y?2=cI@lG7IDizGtRwOo-j_M$EFqE7SeSM}0ZTFVgAh(bZ z1YD)jYcs*$Vg1w+2~8Muh&7oYJxh= zN7_(QL}v?4%=(iX6I5IZ3Lm$rEIUx`mt&hu`r;C^@i6Fyw$*RBTgbU#H1W>qI&+Fv5ION=ws#ZRYDPoyU#$*sY^^t`~XtE}R!! zx_x^rG4)8|XnnbwHW<*t`eYm_&|MuSgbP|^o?bFRNS@kto@@qsc~xp>|H;9xXOKWS zP|Qm8qm_vYLt<^-%=qR=?~V=?l$0{l9ecq6uj)<}9tQ%|eGL}ynB1RVlLyCPKwiee zUn~CTiUep?xs=CH6={A1C@x)IDwTr`nUOXAnKhE`E?!3>qnj0_H(K^-9IwdX`;Dt=*JHBEI1u{A)bEpXBw4RGsedsJ0QC=;Le;~EEx0fE@#;ut3aV{Z0B!~7KSVrR zrxqNig8>1U)mC3qV*sFGHFfnkK(c_~so35=-D1b|-pjkaba{4_j2T3X>c z=~Q`5aI%u$5j&cd7FF@pOE+ZHPS)P0ZZz&=!aG+2LD$*Y*^;;cp9)o?dlWtu>H}D0 zjG}X-0f8s*p+?D+FZ`Ic5T7kt&jfDm@;$a}Bav6CS8q_Ba&Mc8o42>Jxw*NvE}w95 z`&BN=42I=lsq077=VZ` zr@Ebg4;r8?^Hj3Bvc#ioAuY0qNO%Grfw8&7~eopWf;$CK}G{l&nxPdJXqY zvkI=xP8xO~PClqLmj>KseVqOeddv7K{CnDLauq-NeuuOQ-n6J@2f{f36DRCh&qQXI z*KQ*LPg@vR!*=soEX~|RWfMz{|ViLrD_9>7Aqi}|gFB@4*Duu$PUONAPXre7dur&73sFEeaOf{5u1Id&2-wi7LHv=hCI6UVu_)&9v%A(| z{n6U9#!-Z&4C&ndm*+Y@M+8mpK)(9n7ntJV2TFJB0{kid(o|dIjvYHrRrQ-W2m89~ zo3yW+)ws~TV{YBzflVG8k>CL8uC<+6w<97@{kkCr5ui(#93xJ~9NwYQ_xtDcZM01s zE#lO2fl-VNDNx_hXQOvtbDjvo0PUN92LDV7nShTa& zXXDP_cw3UFj(p~Rdm=o{EjaiH7K>F`@pZThdaPKV-iSV|a=`vn3_$zs8H@`z#u!LA z2}YOS#Nl{Fa3MhXg3nlUeZNyRKUIkgjg! z_@=WJ?9{hRg3~@YQzsfaw4X#~M^ujEy%$3&g*{bjo}^|8h^1FwC-u89SL?I`FZ4>% zj*{d$YG7!Hof)oItoK=Ixxsr7M0B=Nxw;ZsG_sA#PVS$kF3+ch{e-ept44BdZEkF{ zEM14#>D4+S9MRa=SVl$62ppM|eZ8^|-#43jUDpxVD9kC@PHfn~2FE%jJzjn2+<@80 z*QPQ$-yj`~So8G%{+EFi-hJo{n{n{#gfbb0#*!wtMA{x-}`C&{0&Bt`Co6JCs`FJxo&`?m>jsjq0oMy9#OK{MeA$} zV8T>KV&l$+W15=Fe5mq8Y3e0fMRLaqVTff}XFevY{XIFw_D1s1?b+3J629~6tEw8G z8u?A!H|sQO2Z|8-jPkly5qF~D$qDz3-VY|k&Kw|a5anDXJg(IG?G+9!Os0hP;7ee+ zioIJ!+vsx!kmd9+phl;oeutvMKGQBkuR2&JTk$tk6l&gSn z1t@6ZlP66;QKJuiwfs=m{M}7D>{#hD$DCgCol^bP^+x$>rxiDSw&>-02r|V_o6I%eRpQ6G)DdxYXal*m1dBG~L5% z7EC(r^lp+bPF62DR3v?jYv=mtdPyJlSY99X=~}%7tX@Kzke5bmt|bCjK?8USdYD&i zxw%<;V@N-Cc6M&8+Iph}4l>i#o%E<=T>Mn^;q^KOP33!$Kry_ylz7Cw`0TdPBVPX7 zU~B}^6{gK@*r(PfiqL!)u=aqd5NC1q>eY!P{0o?C3!Ft0#`v=c z+3sk@=mNjT@2sNdtAL(Dbb8{&uP0xU9GLtxwNUW-^*Qc#{JVyRhN5M>=f)!M@{Uz* ziqzj7$n55wzZ8MKj#KM#gLjm2WCvUUP+ZKFar6ATRD|D%l<2}SYrD2ybbpzbm&x?D z#?<7sdlbGdD=V8I!<_9gC5a%mz;ikD`{ux!*47w&`N~EZe`8}~?Ri|s=eR)JMx=Ac z@wx}!-+HwI;9tn3*>Pv?x)lJX{MODDe(jD5yC0#S9VLh5t9AXkYm@*z46GQ-DDy-h zMl}51w4>rh!(RsYC6Ejte+I+^SOa|QJrd^Zyh_Cwe0AFM%nEppZphuzrxxz6f9`*_ctYa$N%;Wd-CayKe!ig44qMWOWl_* zmm$k~`}S>BaD^}{FyHN6AqX>~z%0W=2i3w{b2WoTdn<@{#ehnJpG=AnfQkKsyFi0OreFi%` zuX;dqLvq?-cG?<`5*mU#9TkvQX<$yo-~F~|^xy!rFyx~{H93%U-bI+h7>A61wJuEI zKSr7J@R=s@vo*O?n%yEPtfQWOpBI3hQCG>IY|J*#a^Oxw7vN}`iZSQkE(()UQ>iF* z6H=U_{tWw|kw!wr_?dxjd#WR~+&1K&k)eIg~**I}HmThJvgRhQAbTpjm%s8`qh`kVnKg%7hYbPlHR$qFlaNRav}8}Ix6~_IVPTLZ;`i@A3y))u8h4L8!Ip?XV7+dZhj{NbufK@&NI5lVrba0cbPH^-4 zZ^@Gf-Y|T9P!`&CQ8AfcAl~>1&ILrz^aDEqSWZ8CC?XjM5T1R{b*+`HL*Xbn&s6Lp z{lmbdRW9A{bM9eo&ebEL7>G376Sq9&Bdy z6G6ma_JCOhbWu3y?`R5D{k_=_R^(N-7%*F&w_Gmimq$3*)#C-lh+oAlqmBd2ghA@^ zVnrLu*4y^Y#IF(>_&mVo7uq!c?IfJA_Y7qrNa`*7YG`WaLc;!t%Ohz&!7}e3ga+Af zkZ@^#8fIY_R?$@6EE}G>D}KTo_zakM*ch|X(*_|b3P8%q@~KL@GXK41x;z(p`WYaQ zoaWuDTD%v^YjmVC2osFT$y;s+@}dt28hz6bf`*M9m(Eo#epG=_`H$F5yEG?&FTq=^ z)k|HVOogGCfAsi2?_yi-c?1cC$q^67A;OyMCrRB!r=(^#xun z3Y3TG6Vhm_3N8#R%6?_#OmJ>=j|`@F&kZ>3(CH6C185BpND`Bi8$o4Z!!eUUO8=X4cEcBmDk5r58KhMYgg`#=$m6|E!Rv@KfJ}~$bK76_Tz5zvn?b{=i4pj zMh(A9(2M!#F4(`~5M;|14cvBI+^Z|PSeVkwpAb6NuuRdkfvD=WFB`RZeQ6E#3j&Lz z4Q3R~5>`1HH=OY~GZy0PN#;XYD z&0M%V(CF`9HQQON3%;taUpf>f+#|WX67f;~*m2fmu#fEG9W(X^ydW1M?nQ}!%C>Y~ zKGw%`mTRQ+Pn$uQ&H_?L+Fm8PN&L!jl+iG^U@n)Oi<5Cm22RC~w>=d?YNG@WtSJH! zCf=F+8w&*dq_Cxbw()pp7H}T?^z}o=B?XO5eS%3~RyZX*#!PPvX%rLC0KZan9V%oE z;|Z$86+AqEOv3G1bv?vA#l-h|FK`l0)lfi8&EoZ5E=l+tz&4#3lY)-4@;toEn)0+B zQ$(ed-9y~PZ5hp}4Yv+vFzbb1;kcNO)TJqbyZ_f_#7tugBl z%7b$;ih;2nUMv^PLL;0Kw5KEW5~D{IETcpufV%*RzDmIj@CDVf*ElJ9R$TGwZ~*M< z>%X7hwC0s-Z9jLY9=4CpXzt>=Ov!k1+v6kWx!V!Wcg|QPK$wpMY;8NrD_Hsh;X#pb zjNAMo!y2>ZAOfTTfRn?Y2)=19KgjCOYwgj+@F#k$g-pV&bwYqN01dQQy|&1?lVgai zTctEKTcVdtoM+C^6;?ARtH{Xf{lbuqA)SFZ zMNRjK@PS1CI+Ufh`dUFK3sxqG1Z;0#FE(YZHn|2b#*u{Pj?EGW>^37sUK8&eT_=_k z{_L8f5jB)$z53)}Qr(%Km=2J!JFJ@uOY_wW=SpFsW zYgo@@2p1rQ0J<_}EL^%V8lVARw#x&1rs-DI(#cf82hjL+NO@B%ak1Zhpk5CkO{|1Im^CCj73wF85C8fTr%lIX=uQ zFHtBwhgx$E3(U}s_KgUeeT`GjoeKoQ_jpwBt z$}65--bPRuPkA4(~H$N*hCeGnsZK zSs_{ztP|bi8?KP->l#XFS%ph5sG>i9ce8q9&v~4(v@vZJ9i~~Q^)G&OC`9r9eF*OV zcM=d1@qw4uBI2UQKYiLb@ku`A+!|$8AopHpGJ^cNy5v|rRc7-lviWxi^&!Vr1I&M4 z9hb8xl2CpXZ2ccTyfsB}1pdDO6ZHQG_}_Z*|B{EtH9Of92VwoPPTsX%ev# diff --git a/packages/stream_video_flutter/test/src/call_screen/goldens/ci/stream_lobby_view_unavailable_light.png b/packages/stream_video_flutter/test/src/call_screen/goldens/ci/stream_lobby_view_unavailable_light.png index 5db4e4a4ee4fbdb87d0800f92a0ba21bb2a3bf8d..7794cf27e9a5a5a8dd0fad993fa3f4a111c6104a 100644 GIT binary patch literal 22102 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 M8*Q-!j} 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 literal 22847 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 cJ{M>#<~Y`qPjB=DgOQNR0}ZA8dnT{{2MPs@ Date: Fri, 11 Sep 2026 15:57:26 +0200 Subject: [PATCH 3/3] refactor(video): privatise the call button badge defaults, rename overhang MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Moves `StreamCallButtonBadgeStyleDefaults` into the widget file as a private `_StreamCallButtonBadgeStyleDefaults`, per the convention that defaults live in the widget. It had one consumer, unlike the three standalone defaults files that are each shared with a second widget. Private also puts the defaults out of reach of a theme, where the generated `runtimeType`-gated equality would report every rebuild as a change. Renames `StreamCallButtonBadgeStyle.alignmentOffset` to `overhang`: the badge's position is pinned by `PositionedDirectional` and the style cannot move it, and `alignmentOffset` elsewhere in this package is an `Offset` on a menu anchor. Trims the field docs to what the code does — "if null, X" rather than a constructor default the constructor does not have — and drops the claim that the error badge's border is dark in either mode, which is not so in light mode and does not apply while `showBorder` is false. Drops `showBorder: true` from the theme snippet, which contradicted the doc twelve lines below it. Adds tests for the three resolution paths the theme introduced: the `StreamVideoTheme` wiring through `copyWith`, `merge` and `lerp`, local-over- global precedence in `of`, and `style` beating the theme per property. Also pins the defaults and the RTL overhang. Drops a no-op `??` in the `StreamVideoTheme` factory, and records the badge repaint and the `accentWarning` token change in the changelog. Co-Authored-By: Claude Opus 5 --- packages/stream_video_flutter/CHANGELOG.md | 5 + .../stream_call_button_badge.dart | 29 +++- .../stream_call_button_badge_defaults.dart | 29 ---- .../components/call_button_badge_theme.dart | 42 ++--- .../call_button_badge_theme.g.theme.dart | 12 +- .../lib/src/theme/stream_video_theme.dart | 3 +- .../stream_call_button_badge_test.dart | 154 ++++++++++++++++++ .../theme/participant_tile_theme_test.dart | 40 +++++ 8 files changed, 252 insertions(+), 62 deletions(-) delete mode 100644 packages/stream_video_flutter/lib/src/call_controls/stream_call_button_badge_defaults.dart create mode 100644 packages/stream_video_flutter/test/src/call_controls/stream_call_button_badge_test.dart diff --git a/packages/stream_video_flutter/CHANGELOG.md b/packages/stream_video_flutter/CHANGELOG.md index 96d388775..817cb0197 100644 --- a/packages/stream_video_flutter/CHANGELOG.md +++ b/packages/stream_video_flutter/CHANGELOG.md @@ -152,6 +152,11 @@ Every component follows the same shape: `StreamX` resolves the registered builder and falls back to `DefaultX`, which holds the default implementation. The parameters of `StreamX` are carried in a `StreamXProps`, exposed as `StreamX.props`, so a custom builder can read them and `copyWith` them to decorate the default rather than reimplement it. - Added `StreamParticipantTile`, the participant tile as a replaceable component: register a `participantTile` builder to replace it, or use `DefaultStreamParticipantTile` for the default implementation. +### 🔄 Changed + +- The badge on the call control buttons is amber with no border, where it used to be red with one. +- `accentWarning` is a lighter amber, which also repaints the fair bars on `StreamConnectionQualityIndicator`. + ### 🐞 Fixed - Fixed the participant grid rearranging itself when a participant nobody can see starts speaking. They take the place of the tile with the least claim to one — the last one on screen — instead of the first, which used to move every tile below it down one. diff --git a/packages/stream_video_flutter/lib/src/call_controls/stream_call_button_badge.dart b/packages/stream_video_flutter/lib/src/call_controls/stream_call_button_badge.dart index d63187730..3dffdb031 100644 --- a/packages/stream_video_flutter/lib/src/call_controls/stream_call_button_badge.dart +++ b/packages/stream_video_flutter/lib/src/call_controls/stream_call_button_badge.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import '../../stream_video_flutter.dart'; -import 'stream_call_button_badge_defaults.dart'; /// Overlays an error badge on the top-end corner of a call button. /// @@ -36,11 +35,11 @@ class StreamCallButtonBadge extends StatelessWidget { Widget build(BuildContext context) { if (!showErrorBadge) return child; - const defaults = StreamCallButtonBadgeStyleDefaults(); + const defaults = _StreamCallButtonBadgeStyleDefaults(); final themeStyle = StreamCallButtonBadgeTheme.of(context).style; final effective = themeStyle?.merge(style) ?? style; - final offset = effective?.alignmentOffset ?? defaults.alignmentOffset; + final overhang = effective?.overhang ?? defaults.overhang; return Stack( // The badge deliberately overhangs the button's box, so the stack must @@ -49,8 +48,8 @@ class StreamCallButtonBadge extends StatelessWidget { children: [ child, PositionedDirectional( - top: -offset, - end: -offset, + top: -overhang, + end: -overhang, child: StreamErrorBadge( size: effective?.size ?? defaults.size, style: effective?.badgeStyle ?? defaults.badgeStyle, @@ -61,3 +60,23 @@ class StreamCallButtonBadge extends StatelessWidget { ); } } + +// Default style values for [StreamCallButtonBadge]. +// +// The badge sits on a call control, which is itself often over video, so the +// design system gives it the warning severity rather than the shared error one. +class _StreamCallButtonBadgeStyleDefaults extends StreamCallButtonBadgeStyle { + const _StreamCallButtonBadgeStyleDefaults(); + + @override + StreamErrorBadgeStyle get badgeStyle => StreamErrorBadgeStyle.warning; + + @override + StreamErrorBadgeSize get size => StreamErrorBadgeSize.sm; + + @override + bool get showBorder => false; + + @override + double get overhang => 4; +} diff --git a/packages/stream_video_flutter/lib/src/call_controls/stream_call_button_badge_defaults.dart b/packages/stream_video_flutter/lib/src/call_controls/stream_call_button_badge_defaults.dart deleted file mode 100644 index 480e4d15b..000000000 --- a/packages/stream_video_flutter/lib/src/call_controls/stream_call_button_badge_defaults.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:flutter/foundation.dart'; - -import '../../stream_video_flutter.dart'; - -/// Default style values for [StreamCallButtonBadge]. -/// -/// The badge sits on a call control, which is itself often over video, so the -/// design system gives it the warning severity rather than the shared error -/// one: red on a red control disappears, and the error badge's dark border -/// loses its edge over moving footage in either mode. -/// -/// Deliberately not exported. -@internal -class StreamCallButtonBadgeStyleDefaults extends StreamCallButtonBadgeStyle { - /// Creates the badge's defaults. - const StreamCallButtonBadgeStyleDefaults(); - - @override - StreamErrorBadgeStyle get badgeStyle => StreamErrorBadgeStyle.warning; - - @override - StreamErrorBadgeSize get size => StreamErrorBadgeSize.sm; - - @override - bool get showBorder => false; - - @override - double get alignmentOffset => 4; -} diff --git a/packages/stream_video_flutter/lib/src/theme/components/call_button_badge_theme.dart b/packages/stream_video_flutter/lib/src/theme/components/call_button_badge_theme.dart index 320986e3b..1e666eed0 100644 --- a/packages/stream_video_flutter/lib/src/theme/components/call_button_badge_theme.dart +++ b/packages/stream_video_flutter/lib/src/theme/components/call_button_badge_theme.dart @@ -5,7 +5,8 @@ import '../../../stream_video_flutter.dart'; part 'call_button_badge_theme.g.theme.dart'; -/// Applies a call button badge theme to descendant [StreamCallButtonBadge] widgets. +/// Applies a call button badge theme to descendant [StreamCallButtonBadge] +/// widgets. /// /// Wrap a subtree with [StreamCallButtonBadgeTheme] to override how the badge /// on a call control reads. @@ -19,7 +20,6 @@ part 'call_button_badge_theme.g.theme.dart'; /// data: StreamCallButtonBadgeThemeData( /// style: StreamCallButtonBadgeStyle( /// badgeStyle: StreamErrorBadgeStyle.error, -/// showBorder: true, /// ), /// ), /// child: child, @@ -97,11 +97,15 @@ class StreamCallButtonBadgeThemeData with _$StreamCallButtonBadgeThemeData { /// Visual styling properties for a [StreamCallButtonBadge]. /// -/// The badge is a `StreamErrorBadge` pinned to the top-end corner of a call -/// control. Its colors come from the core design system's -/// `StreamErrorBadgeTheme` rather than being repeated here, so this style -/// selects *which* badge is drawn and where, and an app that wants different -/// badge colors themes `StreamErrorBadge` itself. +/// The badge is a [StreamErrorBadge] pinned to the top-end corner of a call +/// control. This style selects which badge is drawn and where; its colors come +/// from [StreamErrorBadgeTheme] rather than being repeated here, so an app that +/// wants different badge colors themes [StreamErrorBadge] itself. +/// +/// Size is the exception: [StreamCallButtonBadge] always passes it, so it comes +/// from here and [StreamErrorBadgeThemeData.size] never reaches this badge. +/// [StreamErrorBadgeThemeData.border] applies only when [showBorder] is set +/// here. @themeGen @immutable class StreamCallButtonBadgeStyle with _$StreamCallButtonBadgeStyle { @@ -110,34 +114,32 @@ class StreamCallButtonBadgeStyle with _$StreamCallButtonBadgeStyle { this.badgeStyle, this.size, this.showBorder, - this.alignmentOffset, + this.overhang, }); /// The severity the badge conveys. /// - /// Defaults to [StreamErrorBadgeStyle.warning], which the design system - /// specifies for call controls: the shared error badge is red with a dark - /// border, which disappears into a red control and loses its edge over - /// video, while the warning badge separates from whatever sits underneath. + /// If null, [StreamCallButtonBadge] uses [StreamErrorBadgeStyle.warning], + /// which the design system specifies for call controls. final StreamErrorBadgeStyle? badgeStyle; /// The diameter of the badge. /// - /// Defaults to [StreamErrorBadgeSize.sm]. + /// If null, [StreamCallButtonBadge] uses [StreamErrorBadgeSize.sm]. final StreamErrorBadgeSize? size; /// Whether a border is drawn around the badge. /// - /// Defaults to false. The warning badge is legible against a call control - /// and over video without one, and a border on a badge this small reads as - /// a smudge rather than a separation. + /// If null, no border is drawn. Note that [StreamErrorBadge] draws one by + /// default, so this is a departure from the core badge. final bool? showBorder; - /// How far the badge overhangs the button's top-end corner. + /// How far the badge overhangs the button's top-end corner, in logical + /// pixels. /// - /// Applied as a directional offset, so it flips with the text direction. - /// Defaults to 4 logical pixels up and towards the end edge. - final double? alignmentOffset; + /// Applied upwards and towards the end edge, so the horizontal half follows + /// the text direction. If null, 4. + final double? overhang; /// Linearly interpolate between two styles. static StreamCallButtonBadgeStyle? lerp( diff --git a/packages/stream_video_flutter/lib/src/theme/components/call_button_badge_theme.g.theme.dart b/packages/stream_video_flutter/lib/src/theme/components/call_button_badge_theme.g.theme.dart index 663edea21..d99196caf 100644 --- a/packages/stream_video_flutter/lib/src/theme/components/call_button_badge_theme.g.theme.dart +++ b/packages/stream_video_flutter/lib/src/theme/components/call_button_badge_theme.g.theme.dart @@ -102,7 +102,7 @@ mixin _$StreamCallButtonBadgeStyle { badgeStyle: t < 0.5 ? a.badgeStyle : b.badgeStyle, size: t < 0.5 ? a.size : b.size, showBorder: t < 0.5 ? a.showBorder : b.showBorder, - alignmentOffset: lerpDouble$(a.alignmentOffset, b.alignmentOffset, t), + overhang: lerpDouble$(a.overhang, b.overhang, t), ); } @@ -110,7 +110,7 @@ mixin _$StreamCallButtonBadgeStyle { StreamErrorBadgeStyle? badgeStyle, StreamErrorBadgeSize? size, bool? showBorder, - double? alignmentOffset, + double? overhang, }) { final _this = (this as StreamCallButtonBadgeStyle); @@ -118,7 +118,7 @@ mixin _$StreamCallButtonBadgeStyle { badgeStyle: badgeStyle ?? _this.badgeStyle, size: size ?? _this.size, showBorder: showBorder ?? _this.showBorder, - alignmentOffset: alignmentOffset ?? _this.alignmentOffset, + overhang: overhang ?? _this.overhang, ); } @@ -137,7 +137,7 @@ mixin _$StreamCallButtonBadgeStyle { badgeStyle: other.badgeStyle, size: other.size, showBorder: other.showBorder, - alignmentOffset: other.alignmentOffset, + overhang: other.overhang, ); } @@ -157,7 +157,7 @@ mixin _$StreamCallButtonBadgeStyle { return _other.badgeStyle == _this.badgeStyle && _other.size == _this.size && _other.showBorder == _this.showBorder && - _other.alignmentOffset == _this.alignmentOffset; + _other.overhang == _this.overhang; } @override @@ -169,7 +169,7 @@ mixin _$StreamCallButtonBadgeStyle { _this.badgeStyle, _this.size, _this.showBorder, - _this.alignmentOffset, + _this.overhang, ); } } diff --git a/packages/stream_video_flutter/lib/src/theme/stream_video_theme.dart b/packages/stream_video_flutter/lib/src/theme/stream_video_theme.dart index 0873d91ef..3154f4c60 100644 --- a/packages/stream_video_flutter/lib/src/theme/stream_video_theme.dart +++ b/packages/stream_video_flutter/lib/src/theme/stream_video_theme.dart @@ -88,8 +88,7 @@ class StreamVideoTheme extends ThemeExtension { callParticipantsGridTheme: callParticipantsGridTheme ?? legacy?.toCallParticipantsGridThemeData(), - callButtonBadgeTheme: - callButtonBadgeTheme ?? const StreamCallButtonBadgeThemeData(), + callButtonBadgeTheme: callButtonBadgeTheme, livestreamTheme: livestreamTheme, ); diff --git a/packages/stream_video_flutter/test/src/call_controls/stream_call_button_badge_test.dart b/packages/stream_video_flutter/test/src/call_controls/stream_call_button_badge_test.dart new file mode 100644 index 000000000..752d43d3a --- /dev/null +++ b/packages/stream_video_flutter/test/src/call_controls/stream_call_button_badge_test.dart @@ -0,0 +1,154 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:stream_video_flutter/stream_video_flutter.dart'; + +import '../../test_utils/test_wrapper.dart'; + +void main() { + const child = SizedBox(key: Key('anchor'), width: 40, height: 40); + + StreamErrorBadgeProps badge(WidgetTester tester) => + tester.widget(find.byType(StreamErrorBadge)).props; + + PositionedDirectional position(WidgetTester tester) => + tester.widget(find.byType(PositionedDirectional)); + + group('StreamCallButtonBadge', () { + testWidgets('draws nothing when showErrorBadge is false', (tester) async { + await tester.pumpWidget( + const TestWrapper( + child: StreamCallButtonBadge(showErrorBadge: false, child: child), + ), + ); + + // The widget itself is always in the tree — it returns the child + // unwrapped — so the badge is what has to be absent. + expect(find.byType(StreamErrorBadge), findsNothing); + expect(find.byType(Stack), findsNothing); + }); + + testWidgets('takes the design system defaults for a call control', ( + tester, + ) async { + await tester.pumpWidget( + const TestWrapper( + child: StreamCallButtonBadge(showErrorBadge: true, child: child), + ), + ); + + expect(badge(tester).style, StreamErrorBadgeStyle.warning); + expect(badge(tester).size, StreamErrorBadgeSize.sm); + // Core's badge draws a border by default; a call control's does not. + expect(badge(tester).showBorder, isFalse); + expect(position(tester).top, -4); + expect(position(tester).end, -4); + }); + + testWidgets('resolves the global theme', (tester) async { + await tester.pumpWidget( + MaterialApp( + theme: streamTestTheme().copyWith( + extensions: [ + StreamTheme.light(), + StreamVideoTheme.light().copyWith( + callButtonBadgeTheme: const StreamCallButtonBadgeThemeData( + style: StreamCallButtonBadgeStyle( + badgeStyle: StreamErrorBadgeStyle.error, + overhang: 8, + ), + ), + ), + ], + ), + home: const StreamCallButtonBadge( + showErrorBadge: true, + child: child, + ), + ), + ); + + expect(badge(tester).style, StreamErrorBadgeStyle.error); + expect(position(tester).top, -8); + }); + + testWidgets('merges a local override over the global theme', ( + tester, + ) async { + await tester.pumpWidget( + MaterialApp( + theme: streamTestTheme().copyWith( + extensions: [ + StreamTheme.light(), + StreamVideoTheme.light().copyWith( + callButtonBadgeTheme: const StreamCallButtonBadgeThemeData( + style: StreamCallButtonBadgeStyle( + badgeStyle: StreamErrorBadgeStyle.error, + size: StreamErrorBadgeSize.md, + ), + ), + ), + ], + ), + home: const StreamCallButtonBadgeTheme( + data: StreamCallButtonBadgeThemeData( + style: StreamCallButtonBadgeStyle(size: StreamErrorBadgeSize.xs), + ), + child: StreamCallButtonBadge(showErrorBadge: true, child: child), + ), + ), + ); + + // The local value wins... + expect(badge(tester).size, StreamErrorBadgeSize.xs); + // ...and the global one it did not mention survives. + expect(badge(tester).style, StreamErrorBadgeStyle.error); + }); + + testWidgets('style beats the theme for the properties it sets', ( + tester, + ) async { + await tester.pumpWidget( + MaterialApp( + theme: streamTestTheme().copyWith( + extensions: [ + StreamTheme.light(), + StreamVideoTheme.light().copyWith( + callButtonBadgeTheme: const StreamCallButtonBadgeThemeData( + style: StreamCallButtonBadgeStyle( + badgeStyle: StreamErrorBadgeStyle.error, + size: StreamErrorBadgeSize.md, + ), + ), + ), + ], + ), + home: const StreamCallButtonBadge( + showErrorBadge: true, + style: StreamCallButtonBadgeStyle(size: StreamErrorBadgeSize.xs), + child: child, + ), + ), + ); + + expect(badge(tester).size, StreamErrorBadgeSize.xs); + expect(badge(tester).style, StreamErrorBadgeStyle.error); + }); + + testWidgets('the overhang follows the text direction', (tester) async { + await tester.pumpWidget( + const TestWrapper( + child: Directionality( + textDirection: TextDirection.rtl, + child: StreamCallButtonBadge(showErrorBadge: true, child: child), + ), + ), + ); + + // `end` is the left edge under RTL, and the vertical half does not flip. + final rendered = tester.getTopLeft(find.byType(StreamErrorBadge)); + final anchor = tester.getTopLeft(find.byKey(const Key('anchor'))); + expect(rendered.dx, lessThan(anchor.dx)); + expect(rendered.dy, lessThan(anchor.dy)); + }); + }); +} diff --git a/packages/stream_video_flutter/test/src/theme/participant_tile_theme_test.dart b/packages/stream_video_flutter/test/src/theme/participant_tile_theme_test.dart index 1ae26b233..9578adc12 100644 --- a/packages/stream_video_flutter/test/src/theme/participant_tile_theme_test.dart +++ b/packages/stream_video_flutter/test/src/theme/participant_tile_theme_test.dart @@ -96,12 +96,34 @@ void main() { const StreamFloatingParticipantTileThemeData( style: StreamFloatingParticipantTileStyle(elevation: 9), ), + callButtonBadgeTheme: const StreamCallButtonBadgeThemeData( + style: StreamCallButtonBadgeStyle(overhang: 6), + ), ); expect(theme.participantLabelTheme.style?.blurSigma, 4); expect(theme.connectionQualityIndicatorTheme.style?.size, 40); expect(theme.callParticipantsGridTheme.mainAxisSpacing, 2); expect(theme.floatingParticipantTileTheme.style?.elevation, 9); + expect(theme.callButtonBadgeTheme.style?.overhang, 6); + }); + + test('merge carries every component theme of the other theme', () { + final theme = StreamVideoTheme.light(); + final other = StreamVideoTheme.light().copyWith( + connectionQualityIndicatorTheme: + const StreamConnectionQualityIndicatorThemeData( + style: StreamConnectionQualityIndicatorStyle(size: 40), + ), + callButtonBadgeTheme: const StreamCallButtonBadgeThemeData( + style: StreamCallButtonBadgeStyle(overhang: 6), + ), + ); + + final merged = theme.merge(other); + + expect(merged.connectionQualityIndicatorTheme.style?.size, 40); + expect(merged.callButtonBadgeTheme.style?.overhang, 6); }); test('defaults every new component theme to an empty instance', () { @@ -114,6 +136,7 @@ void main() { expect(theme.connectionQualityIndicatorTheme.style, isNull); expect(theme.floatingParticipantTileTheme.style, isNull); expect(theme.callParticipantsGridTheme.padding, isNull); + expect(theme.callButtonBadgeTheme.style, isNull); }); test('lerp interpolates the new component themes', () { @@ -134,5 +157,22 @@ void main() { expect(mid.connectionQualityIndicatorTheme.style?.size, 30); }); + + test('lerp interpolates the call button badge overhang', () { + final a = StreamVideoTheme.light().copyWith( + callButtonBadgeTheme: const StreamCallButtonBadgeThemeData( + style: StreamCallButtonBadgeStyle(overhang: 4), + ), + ); + final b = StreamVideoTheme.light().copyWith( + callButtonBadgeTheme: const StreamCallButtonBadgeThemeData( + style: StreamCallButtonBadgeStyle(overhang: 8), + ), + ); + + final mid = a.lerp(b, 0.5) as StreamVideoTheme; + + expect(mid.callButtonBadgeTheme.style?.overhang, 6); + }); }); }