+
+ setRating({ current: 0, maxAmount: 5, success: false })
+ }
+ />
+
+ setRating({ current: 0, maxAmount: 5, success: false })
+ }
+ />
+
+ )}
+ {showRecordings && (
+
+
setShowRecordings(false)}
+ />
+
+ setShowRecordings(false)} />
+
+
+ )}
+
+ );
+}
diff --git a/sample-apps/react/react-dogfood/components/EndCallSummary/Feedback.tsx b/sample-apps/react/react-dogfood/components/EndCallSummary/Feedback.tsx
new file mode 100644
index 0000000000..a79b5161f4
--- /dev/null
+++ b/sample-apps/react/react-dogfood/components/EndCallSummary/Feedback.tsx
@@ -0,0 +1,213 @@
+import { HTMLInputTypeAttribute, useMemo, useState } from 'react';
+import clsx from 'clsx';
+import { useField, useForm } from 'react-form';
+import { useCall, Icon } from '@stream-io/video-react-sdk';
+import { getCookie } from '../../helpers/getCookie';
+import { FeedbackType } from './FeedbackType';
+
+export type Props = {
+ className?: string;
+ callId?: string;
+ rating?: number;
+ submitSuccess: () => void;
+ callData?: any;
+ onClose: () => void;
+};
+
+function required(value: string | number, name: string) {
+ if (!value) {
+ return `Please enter a ${name}`;
+ }
+ return false;
+}
+
+const Input = (props: {
+ className?: string;
+ type: HTMLInputTypeAttribute;
+ placeholder: string;
+ name: string;
+ required?: boolean;
+}) => {
+ const { name, className, ...rest } = props;
+ const {
+ meta: { error, isTouched },
+ getInputProps,
+ } = useField(name, {
+ validate: props.required ? (value) => required(value, name) : undefined,
+ });
+
+ return (
+
+ );
+};
+
+const TextArea = (props: {
+ className?: string;
+ placeholder: string;
+ name: string;
+ required?: boolean;
+}) => {
+ const { name, className, ...rest } = props;
+ const {
+ meta: { error, isTouched },
+ getInputProps,
+ } = useField(name, {
+ validate: props.required ? (value) => required(value, name) : undefined,
+ });
+
+ return (
+
+ );
+};
+
+type FeedbackFormType = {
+ email?: string;
+ message?: string;
+};
+
+const basePath = process.env.NEXT_PUBLIC_BASE_PATH || '';
+
+export const Feedback = ({
+ className,
+ callId,
+ rating,
+ submitSuccess,
+ callData,
+ onClose,
+}: Props) => {
+ const [errorMessage, setError] = useState
(null);
+ const [selectedFeedbackTypes, setSelectedFeedbackTypes] = useState<
+ string[] | undefined
+ >(undefined);
+ const call = useCall();
+ const defaultValues = useMemo(
+ () => ({
+ email: '',
+ message: '',
+ rating: 0,
+ selectedFeedbackTypes: undefined,
+ callData: undefined,
+ }),
+ [],
+ );
+ const {
+ Form,
+ meta: { isSubmitting },
+ } = useForm({
+ defaultValues,
+ onSubmit: async (values: FeedbackFormType) => {
+ await call
+ ?.submitFeedback(Math.min(Math.max(1, rating || 1), 5), {
+ reason: values.message,
+ custom: {
+ ...values,
+ callData: callData,
+ selectedFeedbackTypes: selectedFeedbackTypes,
+ },
+ })
+ .catch((err) => console.warn(`Failed to submit call feedback`, err));
+
+ const pageUrl = new URL(window.location.href);
+ pageUrl.searchParams.set('id', callId || call?.id || '');
+
+ const response = await fetch(
+ `https://getstream.io/api/crm/video_feedback/`,
+ {
+ method: 'POST',
+ headers: {
+ Accept: 'application/json',
+ 'Content-Type': 'application/json',
+ 'X-CSRFToken': getCookie('csrftoken') || '',
+ },
+ body: JSON.stringify({
+ email: values.email || 'anonymous-feedback@getstream.io',
+ message: values.message || '',
+ rating: rating,
+ page_url: pageUrl.toString(),
+ selected_feedback_types: selectedFeedbackTypes,
+ call_data: callData,
+ }),
+ },
+ );
+ if (response.status >= 400) {
+ setError('Something went wrong, please try again.');
+ } else {
+ submitSuccess();
+ }
+ },
+ debugForm: false,
+ });
+
+ return (
+
+
+
+
+
+

+
+ Let us know what went wrong?
+
+
+ {errorMessage && errorMessage}
+ {!errorMessage && 'We value your feedback'}
+
+
+
setSelectedFeedbackTypes(types)}
+ />
+
+
+
+ );
+};
diff --git a/sample-apps/react/react-dogfood/components/EndCallSummary/FeedbackType.tsx b/sample-apps/react/react-dogfood/components/EndCallSummary/FeedbackType.tsx
new file mode 100644
index 0000000000..a2f38ac344
--- /dev/null
+++ b/sample-apps/react/react-dogfood/components/EndCallSummary/FeedbackType.tsx
@@ -0,0 +1,61 @@
+import { Icon } from '@stream-io/video-react-sdk';
+import { useState, useEffect } from 'react';
+import clsx from 'clsx';
+
+type Props = {
+ handelSelectFeedback: (types: string[] | undefined) => void;
+ className?: string;
+};
+
+export const FeedbackType = ({ handelSelectFeedback, className }: Props) => {
+ const [selectedTypes, setSelectedTypes] = useState(
+ undefined,
+ );
+
+ const types = ['Video', 'Audio', 'Other'];
+
+ const handleSelectType = (type: string) => {
+ setSelectedTypes((prevTypes) => [...(prevTypes || []), type]);
+ };
+
+ const handleRemoveType = (type: string) => {
+ setSelectedTypes((prevTypes) =>
+ (prevTypes || []).filter((t) => t !== type),
+ );
+ };
+
+ useEffect(() => {
+ handelSelectFeedback(selectedTypes);
+ }, [selectedTypes]);
+
+ return (
+
+ {types.map((type) => (
+
+ selectedTypes?.includes(type)
+ ? handleRemoveType(type)
+ : handleSelectType(type)
+ }
+ className={clsx(
+ 'rd__summary-feedback-type-item',
+ selectedTypes?.includes(type) &&
+ 'rd__summary-feedback-type-item--selected',
+ )}
+ >
+ {!selectedTypes?.includes(type) && (
+
+ )}
+ {type}
+ {selectedTypes?.includes(type) && (
+
+ )}
+
+ ))}
+
+ );
+};
diff --git a/sample-apps/react/react-dogfood/components/EndCallSummary/Header.tsx b/sample-apps/react/react-dogfood/components/EndCallSummary/Header.tsx
new file mode 100644
index 0000000000..6f5db4ce96
--- /dev/null
+++ b/sample-apps/react/react-dogfood/components/EndCallSummary/Header.tsx
@@ -0,0 +1,59 @@
+import Image from 'next/image';
+import Link from 'next/link';
+import { Icon } from '@stream-io/video-react-sdk';
+
+export interface HeaderProps {
+ rejoin: () => void;
+ startNewCall: () => void;
+ setShowRecordings: () => void;
+}
+
+export function Header({
+ rejoin,
+ startNewCall,
+ setShowRecordings,
+}: HeaderProps) {
+ return (
+
+
+
+
+
+
+
Your Call Has Ended.
+
+ Rejoin or start a new call to continue testing.
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/sample-apps/react/react-dogfood/components/EndCallSummary/NetworkStatus.tsx b/sample-apps/react/react-dogfood/components/EndCallSummary/NetworkStatus.tsx
new file mode 100644
index 0000000000..b6b9d7e14e
--- /dev/null
+++ b/sample-apps/react/react-dogfood/components/EndCallSummary/NetworkStatus.tsx
@@ -0,0 +1,36 @@
+import clsx from 'clsx';
+
+type NetworkStatusProps = {
+ status: 'red' | 'yellow' | 'green' | 'neutral';
+ children: React.ReactNode;
+ className?: string;
+};
+
+export function NetworkStatus({
+ status,
+ children,
+ className,
+}: NetworkStatusProps) {
+ let bars = undefined;
+
+ bars = Array.from({ length: 12 }, (_, index) => {
+ return (
+
+ );
+ });
+
+ return (
+
+ );
+}
diff --git a/sample-apps/react/react-dogfood/components/EndCallSummary/Notification.tsx b/sample-apps/react/react-dogfood/components/EndCallSummary/Notification.tsx
new file mode 100644
index 0000000000..b5f30ec6d2
--- /dev/null
+++ b/sample-apps/react/react-dogfood/components/EndCallSummary/Notification.tsx
@@ -0,0 +1,30 @@
+import clsx from 'clsx';
+import { Icon } from '@stream-io/video-react-sdk';
+
+type NotificationProps = {
+ message: string;
+ variant: 'success' | 'error' | 'info' | 'caution';
+};
+
+export const Notification = ({ message, variant }: NotificationProps) => {
+ const icon = {
+ success: 'success',
+ error: 'error',
+ info: 'info',
+ caution: 'caution',
+ };
+
+ return (
+
+
+ {message}
+
+ );
+};
diff --git a/sample-apps/react/react-dogfood/components/EndCallSummary/Rating.tsx b/sample-apps/react/react-dogfood/components/EndCallSummary/Rating.tsx
new file mode 100644
index 0000000000..78f4dc73c3
--- /dev/null
+++ b/sample-apps/react/react-dogfood/components/EndCallSummary/Rating.tsx
@@ -0,0 +1,61 @@
+import { Icon } from '@stream-io/video-react-sdk';
+import clsx from 'clsx';
+import { useCallback, useState } from 'react';
+
+type RatingProps = {
+ rating: { current: number; maxAmount: number };
+ handleSetRating: (value: { current: number; maxAmount: number }) => void;
+};
+
+export function Rating({ rating, handleSetRating }: RatingProps) {
+ const [hoveredGrade, setHoveredGrade] = useState(null);
+
+ const getColor = (v: number) =>
+ v <= 2 ? 'bad' : v > 2 && v <= 4 ? 'good' : 'great';
+
+ const handleRating = useCallback(
+ (grade: number) => {
+ handleSetRating({
+ ...rating,
+ maxAmount: rating.maxAmount,
+ current: grade,
+ });
+ },
+ [handleSetRating, rating],
+ );
+
+ return (
+
+ {[...new Array(rating.maxAmount)].map((_, index) => {
+ const grade = index + 1;
+ const active = grade <= rating.current;
+ const isHovered = hoveredGrade !== null && grade <= hoveredGrade;
+
+ const modifier = isHovered
+ ? getColor(hoveredGrade!)
+ : active
+ ? getColor(rating.current)
+ : getColor(grade);
+
+ return (
+
handleRating(grade)}
+ onMouseEnter={() => setHoveredGrade(grade)}
+ onMouseLeave={() => setHoveredGrade(null)}
+ >
+
+
+ );
+ })}
+
+ );
+}
diff --git a/sample-apps/react/react-dogfood/components/EndCallSummary/Recordings.tsx b/sample-apps/react/react-dogfood/components/EndCallSummary/Recordings.tsx
new file mode 100644
index 0000000000..2c3e5eece1
--- /dev/null
+++ b/sample-apps/react/react-dogfood/components/EndCallSummary/Recordings.tsx
@@ -0,0 +1,19 @@
+import { CallRecordings } from '../CallRecordings';
+import { Icon } from '@stream-io/video-react-sdk';
+
+export function Recordings({
+ className,
+ onClose,
+}: {
+ className?: string;
+ onClose: () => void;
+}) {
+ return (
+
+ );
+}
diff --git a/sample-apps/react/react-dogfood/components/EndCallSummary/edges.ts b/sample-apps/react/react-dogfood/components/EndCallSummary/edges.ts
new file mode 100644
index 0000000000..849e0e6ac7
--- /dev/null
+++ b/sample-apps/react/react-dogfood/components/EndCallSummary/edges.ts
@@ -0,0 +1,26 @@
+export const edges = {
+ 'aws-cap1.sfu-93774aa259f5': 'Cape Town',
+ 'aws-jak1.sfu-165e19e75f19': 'Jakarta',
+ 'aws-sin1.sfu-1f22fbe52d75': 'Singapore',
+ 'aws-hyd1.sfu-47983ecf3d2a': 'Hyderabad',
+ 'aws-mum1.sfu-615b2388f3ce': 'Mumbai',
+ 'aws-mum1.sfu-63b101084fd8': 'Mumbai',
+ 'aws-mum1.sfu-81f0b5a91d07': 'Mumbai',
+ 'aws-tel1.sfu-8a5b3af98a3a': 'Tel Aviv',
+ 'aws-tok1.sfu-cdd6cec09da4': 'Tokyo',
+ 'aws-uae1.sfu-ec81f73f238c': 'Dubai',
+ 'aws-ire1.sfu-34b3d1decec4': 'Dublin',
+ 'aws-fra1.sfu-4fb57bd52b53': 'Frankfurt',
+ 'aws-mil1.sfu-8d6cac798fcf': 'Milan',
+ 'aws-par1.sfu-93ba78cd9a6e': 'Paris',
+ 'aws-lon1.sfu-a7f8e5b12ebc': 'London',
+ 'aws-spa1.sfu-aa9fcf2b7b47': 'Madrid',
+ 'aws-stk1.sfu-bf56b6f0a809': 'Stockholm',
+ 'aws-ohi1.sfu-0be3135dedde': 'Columbus',
+ 'aws-cal1.sfu-39f6c064a25b': 'Fresno',
+ 'aws-ore1.sfu-5ed2e3c83420': 'Bend',
+ 'aws-vir1.sfu-8d90b67cbccc': 'Richmond',
+ 'aws-can1.sfu-fe14e570ea0d': 'Quebec City',
+ 'aws-syd1.sfu-b79b7b557f02': 'Sydney',
+ 'aws-sao1.sfu-6c2a276ec712': 'São Paulo',
+};
diff --git a/sample-apps/react/react-dogfood/components/MeetingUI.tsx b/sample-apps/react/react-dogfood/components/MeetingUI.tsx
index 280fc22fd5..6c21a66050 100644
--- a/sample-apps/react/react-dogfood/components/MeetingUI.tsx
+++ b/sample-apps/react/react-dogfood/components/MeetingUI.tsx
@@ -20,8 +20,7 @@ import {
useWakeLock,
} from '../hooks';
import { ActiveCall } from './ActiveCall';
-import { Feedback } from './Feedback/Feedback';
-import { DefaultAppHeader } from './DefaultAppHeader';
+import { EndCallSummaryView } from './EndCallSummary/EndCallSummaryView';
const contents = {
'error-join': {
@@ -40,6 +39,7 @@ export const MeetingUI = ({ chatClient, mode }: MeetingUIProps) => {
const [show, setShow] = useState<
'lobby' | 'error-join' | 'error-leave' | 'loading' | 'active-call' | 'left'
>('lobby');
+ const [joinTime, setJoinTime] = useState(undefined);
const [lastError, setLastError] = useState();
const router = useRouter();
const call = useCall();
@@ -62,6 +62,7 @@ export const MeetingUI = ({ chatClient, mode }: MeetingUIProps) => {
const onJoin = useCallback(
async ({ fastJoin = false } = {}) => {
+ setJoinTime(new Date());
if (!fastJoin) setShow('loading');
if (!call) throw new Error('No active call found');
try {
@@ -173,14 +174,13 @@ export const MeetingUI = ({ chatClient, mode }: MeetingUIProps) => {
ComponentToRender = ;
} else if (show === 'left') {
ComponentToRender = (
- <>
-
-
- >
+
+ setShow('active-call')}
+ startNewCall={() => setShow('lobby')}
+ joinTime={joinTime}
+ />
+
);
} else if (!call) {
ComponentToRender = (
diff --git a/sample-apps/react/react-dogfood/public/stream-logo-blue.png b/sample-apps/react/react-dogfood/public/stream-logo-blue.png
new file mode 100644
index 0000000000..d972662808
Binary files /dev/null and b/sample-apps/react/react-dogfood/public/stream-logo-blue.png differ
diff --git a/sample-apps/react/react-dogfood/public/stream-logo-blue.svg b/sample-apps/react/react-dogfood/public/stream-logo-blue.svg
new file mode 100644
index 0000000000..4a52f3edd5
--- /dev/null
+++ b/sample-apps/react/react-dogfood/public/stream-logo-blue.svg
@@ -0,0 +1,9 @@
+
diff --git a/sample-apps/react/react-dogfood/public/video-demo-clients.png b/sample-apps/react/react-dogfood/public/video-demo-clients.png
new file mode 100644
index 0000000000..012a82021d
Binary files /dev/null and b/sample-apps/react/react-dogfood/public/video-demo-clients.png differ
diff --git a/sample-apps/react/react-dogfood/style/EndCallSummary/badge.scss b/sample-apps/react/react-dogfood/style/EndCallSummary/badge.scss
new file mode 100644
index 0000000000..1488e8e489
--- /dev/null
+++ b/sample-apps/react/react-dogfood/style/EndCallSummary/badge.scss
@@ -0,0 +1,86 @@
+.rd__leave{
+ .rd__badge{
+ background-color: var(--str-video__bage-default);
+ color: var(--str-video__badge-default-text);
+ border-radius: var(--str-video__border-radius-sm);
+ padding: var(--str-video__spacing-xxs) var(--str-video__spacing-md);
+ font-weight: 500;
+ display: flex;
+ align-items: center;
+ width: 100%;
+ gap: var(--str-video__spacing-xs);
+ text-decoration: none;
+
+ .str-video__icon{
+ background-color: var(--str-video__badge-default-icon);
+ }
+
+ box-shadow: 0px 0px 24px 8px rgba(0, 0, 0, 0.05);
+
+
+
+ @include respond-above(md) {
+ &--fill{
+ width: 100%;
+ }
+
+ &--contain{
+ width: fit-content;
+ }
+ }
+
+ &--small{
+ font-size: var(--str-video__font-size-sm);
+ min-height: 40px;
+
+ @include respond-above(md) {
+ font-size: var(--str-video__font-size-md);
+ }
+ }
+
+ &--large{
+ font-size: var(--str-video__font-size-md);
+ min-height: 32px;
+
+ @include respond-above(md) {
+ font-size: var(--str-video__font-size-xxl);
+ }
+ }
+
+ &--link{
+ cursor: pointer;
+ color: var(--str-video__icon-default);
+ text-decoration: none;
+ &:hover{
+ background-color: var(--str-video__bage-hover);
+ color: var(--str-video__badge-hover-text);
+
+ .str-video__icon{
+ background-color: var(--str-video__badge-hover-icon);
+ }
+ }
+ }
+
+ &-status{
+ width: 14px;
+ height: 14px;
+ border-radius: var(--str-video__border-radius-sm);
+
+ box-shadow: 0px 1px 4px 0px rgba(255, 255, 255, 0.53) inset;
+ box-shadow: 0px -1px 4px 0px rgba(0, 0, 0, 0.25) inset;
+
+
+ &--good{
+ background-color: var(--str-video__alert-success);
+ }
+
+ &--average{
+ background-color: var(--str-video__alert-caution);
+ }
+
+ &--bad{
+ background-color: var(--str-video__alert-warning);
+ }
+ }
+ }
+}
diff --git a/sample-apps/react/react-dogfood/style/EndCallSummary/build-and-ship.scss b/sample-apps/react/react-dogfood/style/EndCallSummary/build-and-ship.scss
new file mode 100644
index 0000000000..eaf593e97b
--- /dev/null
+++ b/sample-apps/react/react-dogfood/style/EndCallSummary/build-and-ship.scss
@@ -0,0 +1,75 @@
+.rd__leave{
+ .rd__build-and-ship{
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: var(--str-video__spacing-sm);
+ height: 100%;
+ width: 100%;
+ min-height: 350px;
+
+ background-size: cover;
+ background-position: left;
+ background-repeat: no-repeat;
+ // background-image: url("/video-demo-clients.png");
+ background-position-y: 40px;
+
+ @include respond-above(md) {
+ min-height: auto;
+ }
+
+ &--title{
+ font-size: var(--str-video__font-size-xxl);
+ font-weight: 500;
+ color: var(--str-video__icon-default);
+ text-transform: capitalize;
+ margin: 0;
+ color: var(--str-video__header-color);
+ }
+
+ &--description{
+ font-size: var(--str-video__font-size-lg);
+ font-weight: 400;
+ color: #B0B4B7;
+ margin: 0;
+ }
+
+ &--content{
+ max-width: 80%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+
+ &-text{
+ display: flex;
+ flex-direction: column;
+ gap: var(--str-video__spacing-md);
+ }
+ }
+
+ &--button-container{
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: flex-end;
+ width: 100%;
+ }
+
+ &--button{
+ background-color: var(--str-video__button-primary-active);
+ border-radius: var(--str-video__border-radius-sm);
+ font-weight: 600;
+ color: var( --str-video__text-color);
+ font-size: var(--str-video__font-size-md);
+ border: none;
+ display: flex;
+ align-items: center;
+ width: 100%;
+ width: fit-content;
+ border-radius: var(--str-video__border-radius-lg);
+ padding: var(--str-video__spacing-md) var(--str-video__spacing-lg);
+ text-decoration: none;
+ }
+ }
+}
diff --git a/sample-apps/react/react-dogfood/style/EndCallSummary/card.scss b/sample-apps/react/react-dogfood/style/EndCallSummary/card.scss
new file mode 100644
index 0000000000..be0000d265
--- /dev/null
+++ b/sample-apps/react/react-dogfood/style/EndCallSummary/card.scss
@@ -0,0 +1,60 @@
+.rd__leave{
+ .rd__card{
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ background-color: var(--str-video__base-color6);
+ border-radius: var(--str-video__border-radius-card);
+ gap: var(--str-video__spacing-sm);
+ padding: var(--str-video__spacing-lg);
+
+ &--parent{
+ display: flex;
+ flex-direction: column;
+ padding: 0;
+ }
+
+ &--title{
+ font-size: var(--str-video__font-size-md);
+ font-weight: 400;
+ color: #B0B4B7;
+ text-transform: capitalize;
+ margin: 0;
+ }
+ &--link,
+ &--tooltip{
+ .str-video__icon{
+ width: 24px;
+ height: 24px;
+ background-color: var(--str-video__icon-pressed);
+ &:hover{
+ background-color: var(--str-video__icon-hover);
+ cursor: pointer;
+ }
+ }
+ }
+
+ &--header{
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ align-items: center;
+ }
+
+ &--content{
+ display: flex;
+ gap: var(--str-video__spacing-sm);
+
+
+ &-row{
+ flex-direction: row;
+
+ }
+ &-column{
+ flex-direction: column;
+ height: 100%;
+ width: 100%;;
+ }
+ }
+ }
+}
diff --git a/sample-apps/react/react-dogfood/style/EndCallSummary/edge-server.scss b/sample-apps/react/react-dogfood/style/EndCallSummary/edge-server.scss
new file mode 100644
index 0000000000..1ab4e6a7f5
--- /dev/null
+++ b/sample-apps/react/react-dogfood/style/EndCallSummary/edge-server.scss
@@ -0,0 +1,21 @@
+.rd__leave{
+ .rd__edge-server{
+ display: flex;
+ flex-direction: column;
+ max-height: 100px;
+ overflow-y: scroll;
+ overflow-x: hidden;
+ gap: var(--str-video__spacing-sm);
+ }
+
+ .rd__edge-server--country{
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+ max-width: 80px;
+
+ @include respond-above(md) {
+ max-width: 100%;
+ }
+ }
+}
diff --git a/sample-apps/react/react-dogfood/style/EndCallSummary/feedback-type.scss b/sample-apps/react/react-dogfood/style/EndCallSummary/feedback-type.scss
new file mode 100644
index 0000000000..0a673d5989
--- /dev/null
+++ b/sample-apps/react/react-dogfood/style/EndCallSummary/feedback-type.scss
@@ -0,0 +1,43 @@
+.rd__summary-feedback-type {
+ display: flex;
+ flex-direction: row;
+ gap: var(--str-video__spacing-md);
+ flex-wrap: wrap;
+}
+
+.rd__summary-feedback-type-item {
+ display: flex;
+ align-items: center;
+ flex-direction: row;
+ gap: var(--str-video__spacing-lg);
+ border: 1px dashed #656B72;
+
+ border-radius: var(--str-video__border-radius-xs);
+ padding: var(--str-video__spacing-sm) var(--str-video__spacing-md);
+ color:#656B72;
+ font-size: var(--str-video__font-size-md);
+ font-weight: 600;
+
+ &:hover{
+ cursor: pointer;
+ }
+
+ &--selected {
+ color: var(--str-video__text-color1);
+ border: 1px solid transparent;
+
+
+ }
+
+ &--close {
+ background-color: #656B72;
+ width: 16px;
+ height: 16px;
+ }
+ &--add {
+ background-color: #656B72;
+ width: 16px;
+ height: 16px;
+ }
+}
+
diff --git a/sample-apps/react/react-dogfood/style/EndCallSummary/feedback.scss b/sample-apps/react/react-dogfood/style/EndCallSummary/feedback.scss
new file mode 100644
index 0000000000..30b59b20ee
--- /dev/null
+++ b/sample-apps/react/react-dogfood/style/EndCallSummary/feedback.scss
@@ -0,0 +1,138 @@
+.rd__summary-feedback {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ text-align: center;
+
+ background-color: #19232D !important;
+ border-radius: var(--str-video__border-radius-lg);
+ padding: 32px;
+
+ width: 100%;
+ border: 1px solid #323B44;
+ box-shadow: 0 14px 34px rgba(0, 0, 0, 0.75);
+
+ height: 100%;
+
+ @include respond-above(md) {
+ height: auto;
+ }
+}
+
+.rd__summary-feedback-close {
+ position: absolute;
+ top: 16px;
+ right: 16px;
+
+ .str-video__icon{
+ height: 28px;
+ width: 28px;
+ background-color: #656B72;
+ }
+
+
+ &:hover{
+ cursor: pointer;
+
+
+ .str-video__icon{
+ background-color: var(--str-video__text-color1);
+ }
+ }
+}
+
+.rd__summary-feedback-header {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: var(--str-video__spacing-md);
+}
+
+.rd__summary-feedback-image {
+ width: 140px;
+}
+
+.rd__summary-feedback-heading {
+ font-weight: 500;
+ font-size: 24px;
+ margin: 0;
+}
+
+.rd__summary-feedback-description {
+ color: var(--str-video__description-default);
+ font-size: var(--str-video__font-size-md);
+ margin: 0;
+}
+
+.rd__summary-feedback-type {
+
+ margin-top: var(--str-video__spacing-lg);
+}
+
+.rd__summary-feedback-form {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ margin-top: var(--str-video__spacing-lg);
+ width: 100%;
+}
+
+.rd__summary-feedback-input,
+.rd__summary-feedback-textarea {
+ background-color: #323B44;
+ border-radius: var(--str-video__border-radius-md);
+ padding: var(--str-video__spacing-xs) var(--str-video__spacing-md);
+ margin-bottom: var(--str-video__spacing-md);
+ border: 1px solid var(--str-video__base-color3);
+ width: 100%;
+ color:#EFF0F1;
+ border: 1px solid transparent;
+
+ &:placeholder {
+ color: #EFF0F1;
+ }
+
+ &:focus,
+ &:focus-visible {
+ border: 1px solid var(--str-video__base-color1);
+ }
+}
+
+.rd__summary-feedback-textarea {
+ height: 100px;
+}
+
+.rd__summary-feedback-footer {
+ width: 100%;
+ padding-top: var(--str-video__spacing-lg);
+ padding-bottom: var(--str-video__spacing-lg);
+ display: flex;
+ flex-direction: column;
+ gap: var(--str-video__spacing-sm);
+}
+.rd__summary-feedback-actions {
+ display: flex;
+ justify-content: space-between;
+ gap: var(--str-video__spacing-md);
+}
+
+.rd__summary-feedback-consent {
+ color: var(--str-video__icon-pressed);
+ font-size: 10px;
+}
+
+.rd__summary-feedback-submit { background-color: var(--str-video__button-primary-active);
+ border-radius: var(--str-video__border-radius-sm);
+ font-weight: 600;
+ color: var( --str-video__text-color);
+ font-size: var(--str-video__font-size-md);
+ border: none;
+ display: flex;
+ align-items: center;
+ width: 100%;
+ border-radius: var(--str-video__border-radius-lg);
+ padding: var(--str-video__spacing-md) var(--str-video__spacing-lg);
+ justify-content: center;
+}
diff --git a/sample-apps/react/react-dogfood/style/EndCallSummary/header.scss b/sample-apps/react/react-dogfood/style/EndCallSummary/header.scss
new file mode 100644
index 0000000000..bffa94bb09
--- /dev/null
+++ b/sample-apps/react/react-dogfood/style/EndCallSummary/header.scss
@@ -0,0 +1,152 @@
+
+.rd__leave{
+ &--header{
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: center;
+ gap: var(--str-video__spacing-xl);
+ width: 100%;
+
+ @include respond-above(md) {
+ flex-direction: row;
+ justify-content: space-between;
+ align-items: center;
+ gap: var(--str-video__spacing-sm);
+
+ }
+
+ &-logo{
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: var(--str-video__spacing-md);
+ width: 100%;
+
+ @include respond-above(md) {
+ flex-direction: row;
+ justify-content: flex-start;
+ align-items: flex-start;
+
+ }
+ }
+
+ &-text{
+ display: flex;
+ flex-direction: column;
+ gap: var(--str-video__spacing-xs);
+ align-items: center;
+
+ @include respond-above(md) {
+ align-items: flex-start;
+ }
+ }
+
+ &-title{
+ margin: 0;
+ font-size: var(--str-video__font-size-xxl);
+ font-weight: 600;
+ color: #EFF0F1;
+ text-transform: capitalize;
+ }
+
+ &-description{
+ margin: 0;
+ font-size: var(--str-video__font-size-sm);
+ font-weight: 600;
+ color: #656B72;
+ text-align: center;
+
+
+ @include respond-above(md) {
+ text-align: left;
+ font-size: var(--str-video__font-size-md);
+ font-weight: 600;
+ color: #656B72;
+ text-align: left;
+ text-transform: capitalize;
+ }
+ }
+
+ &-links{
+ display: flex;
+ flex-direction: row;
+ gap: var(--str-video__spacing-lg);
+ justify-content: space-between;
+ width: 100%;
+
+ flex-direction: row-reverse;
+
+ @include respond-above(md) {
+ flex-direction: row;
+ justify-content: flex-end;
+ }
+
+ &-buttons{
+ display: flex;
+ flex-direction: row;
+ gap: var(--str-video__spacing-md);
+ }
+ }
+
+ &-link{
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap: var(--str-video__spacing-sm);
+ font-size: var(--str-video__font-size-md);
+ font-weight: 600;
+ color: var(--str-video__text-color1);
+ text-transform: capitalize;
+ margin: 0;
+ text-decoration: none;
+ padding: var(--str-video__spacing-md) var(--str-video__spacing-lg);
+ background-color: var(--str-video__base-color4);
+ border: none;
+
+ &:hover{
+ cursor: pointer;
+ text-decoration: underline;
+ text-underline-offset: 4px;
+ }
+
+ &--recordings{
+
+ .rd__leave--header-link-text{
+ display: none;
+
+ @include respond-above(md) {
+ display: block;
+ }
+ }
+ }
+
+ &--rejoin{
+ border-radius: var(--str-video__border-radius-lg);
+ border: 1px solid var(--str-video__button-default-hover);
+
+ &:hover{
+ background-color: var(--str-video__bage-hover);
+ color: var(--str-video__badge-hover-text);
+ cursor: pointer;
+ text-decoration: none;
+ }
+ }
+
+ &--new-call{
+ border-radius: var(--str-video__border-radius-lg);
+ border: 1px solid var(--str-video__base-color6);
+ background-color: var(--str-video__base-color6);
+
+ &:hover{
+ background-color: var(--str-video__bage-hover);
+ color: var(--str-video__badge-hover-text);
+ cursor: pointer;
+ text-decoration: none;
+ }
+
+ }
+ }
+ }
+}
diff --git a/sample-apps/react/react-dogfood/style/EndCallSummary/index.scss b/sample-apps/react/react-dogfood/style/EndCallSummary/index.scss
new file mode 100644
index 0000000000..bb566bf072
--- /dev/null
+++ b/sample-apps/react/react-dogfood/style/EndCallSummary/index.scss
@@ -0,0 +1,257 @@
+@import './badge.scss';
+@import './build-and-ship.scss';
+@import './card.scss';
+@import './edge-server.scss';
+@import './feedback.scss';
+@import './feedback-type.scss';
+@import './header.scss';
+@import './modal.scss';
+@import './network-status.scss';
+@import './notifications.scss';
+@import './review.scss';
+@import './recordings.scss';
+@import './rooms.scss';
+@import './sdks.scss';
+@import './shared.scss';
+
+.rd__leave-container{
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 100%;
+ height: 100%;
+}
+
+.rd__leave{
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ width: 100%;
+ height: 100%;
+ overflow-y: scroll;
+
+ color: var(--str-video__icon-default);
+ padding: var(--str-video__spacing-lg);
+ gap: var(--str-video__spacing-sm);
+ max-width: 1092px;
+
+ @include respond-above(md) {
+ justify-content: center;
+
+ }
+
+ &--row{
+ display: grid;
+ width: 100%;
+
+ gap: var(--str-video__spacing-sm);
+
+
+ &-first{
+ grid-template-columns: 1fr 1fr;
+ grid-template-areas: 'quality time-to-connect'
+ 'latency-average video-codex';
+
+ .rd__leave--row-quality{
+ grid-area: quality;
+ }
+
+ .rd__leave--row-time-to-connect{
+ grid-area: time-to-connect;
+ }
+
+ .rd__leave--row-latency-average{
+ grid-area: latency-average;
+ }
+
+ .rd__leave--row-video-codex{
+ grid-area: video-codex;
+ }
+ }
+
+ &-second{
+ grid-template-columns: 1fr;
+ grid-template-areas: 'edge-networks' 'third' 'fourth' ;
+
+ .rd__leave--row-edge-networks{
+ grid-area: edge-networks;
+ }
+
+ .rd__leave--row-rooms{
+ grid-area: rooms;
+ }
+
+ .rd__leave--row-review{
+ grid-area: review;
+ }
+
+ .rd__leave--row-build-and-ship{
+ grid-area: build-and-ship;
+ }
+
+ .rd__leave--row-sdks{
+ grid-area: sdks;
+ }
+
+ .rd__leave--row-third{
+ grid-area: third;
+ display: grid;
+ }
+
+ .rd__leave--row-fourth{
+ grid-area: fourth;
+ display: grid;
+
+ }
+ }
+
+ &-third{
+ grid-template-columns: 1fr;
+ grid-template-areas: 'rooms' 'review';
+ }
+
+ &-fourth{
+ grid-template-columns: 1fr;
+ grid-template-areas: 'sdks' 'build-and-ship';
+ }
+ }
+
+ @include respond-above(sm) {
+ &-first{
+ grid-template-columns: 1fr 1fr;
+ }
+ }
+
+
+
+ @include respond-above(md) {
+ &--row{
+
+ &-first{
+ grid-template-columns: 1fr 1fr 1fr 1fr;
+ grid-template-areas: 'quality time-to-connect latency-average video-codex';
+
+ }
+
+ &-second{
+ grid-template-columns: minmax(347.5px, 0.25fr) 1fr;
+ grid-template-areas: 'edge-networks third'
+ 'edge-networks fourth';
+ }
+
+ &-third{
+ grid-template-columns: 1.1fr 0.9fr;
+ grid-template-areas: 'rooms review';
+ }
+
+ &-fourth{
+ grid-template-columns: 0.5fr 1.5fr;
+ grid-template-areas: 'sdks build-and-ship';
+ }
+ }
+ }
+}
+
+
+:root {
+ --str-video__network-bar-good: #00E2A1;
+ --str-video__network-bar-average: #FFD646;
+ --str-video__network-bar-bad: #DC433B;
+
+ --str-video__network-bar-neutral: #005FFF;
+
+ --str-video__good: #00E2A1;
+ --str-video__average: #FFD646;
+ --str-video__bad: #DC433B;
+
+ --str-video__notification-background-good: #1D2F34;
+ --str-video__notification-background-average: #353830;
+ --str-video__notification-background-bad: #31292F;
+
+ --str-video__border-radius-card: 16px;
+
+ --str-video__header-color: #EFF0F1;
+ --str-video__description-default: #b0b4b7;
+
+ --str-video__sdkIcon-default: #b0b4b7;
+ --str-video__sdkIcon-hover: #eff0f1;
+
+ --str-video__bage-default: #323B44;
+ --str-video__bage-hover:#4C535B;
+ --str-video__badge-default-text: #EFF0F1;
+ --str-video__badge-hover-text: #EFF0F1;
+ --str-video__badge-default-icon: #B0B4B7;
+ --str-video__badge-hover-icon: #EFF0F1;
+
+
+ --str-video__icon-new-tab: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTE5IDE5SDVWNUgxMlYzSDVDMy44OSAzIDMgMy45IDMgNVYxOUMzIDIwLjEgMy44OSAyMSA1IDIxSDE5QzIwLjEgMjEgMjEgMjAuMSAyMSAxOVYxMkgxOVYxOVpNMTQgM1Y1SDE3LjU5TDcuNzYgMTQuODNMOS4xNyAxNi4yNEwxOSA2LjQxVjEwSDIxVjNIMTRaIiBmaWxsPSIjNjU2QjcyIi8+Cjwvc3ZnPgo=');
+ --str-video__icon-unity: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjciIHZpZXdCb3g9IjAgMCAyNCAyNyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTEwLjk1MTYgMC4xNjY2NTZMMCA2LjM4NjQ1VjE4LjgyNUw0LjE5ODczIDE2LjQzOTZWMTEuNTY1NEM0LjIwMDYzIDExLjQ4MTcgNC4yNDYzOCAxMS40MDQ4IDQuMzIwMDggMTEuMzYzOUM0LjM1NjI5IDExLjM0MzEgNC4zOTc0NCAxMS4zMzE5IDQuNDM5NDEgMTEuMzMxNkM0LjQ4MTM4IDExLjMzMTMgNC41MjI2OSAxMS4zNDE5IDQuNTU5MiAxMS4zNjIzTDkuNjYwNTcgMTQuMjU4MUM5LjczMzYzIDE0LjI5OTggOS43OTQyNiAxNC4zNTk3IDkuODM2MzggMTQuNDMxN0M5Ljg3ODUgMTQuNTAzOCA5LjkwMDYyIDE0LjU4NTQgOS45MDA1MyAxNC42Njg1VjIwLjQ2MDJDOS45MDAwNCAyMC41MDE1IDkuODg4NzcgMjAuNTQxOSA5Ljg2NzgyIDIwLjU3NzdDOS44NDY4NyAyMC42MTM0IDkuODE2OTMgMjAuNjQzMyA5Ljc4MDg3IDIwLjY2NDRDOS43NDQ4NSAyMC42ODUyIDkuNzAzOTQgMjAuNjk2MyA5LjY2MjE4IDIwLjY5NjhDOS42MjA0MiAyMC42OTcyIDkuNTc5MjcgMjAuNjg2OSA5LjU0MjgyIDIwLjY2NjlMNS4yNDk4NCAxOC4yMjU2TDEuMDQ5NjMgMjAuNjEzMUwxMS45OTgzIDI2LjgzMzNMMjIuOTQ4MyAyMC42MTMzTDE4Ljc1MTIgMTguMjI1OEwxNC40NjAxIDIwLjY2MzlDMTQuNDIzNiAyMC42ODM3IDE0LjM4MjYgMjAuNjkzOSAxNC4zNDA5IDIwLjY5MzZDMTQuMjk5MiAyMC42OTM0IDE0LjI1ODMgMjAuNjgyNiAxNC4yMjIxIDIwLjY2MjNDMTQuMTg1OSAyMC42NDE1IDE0LjE1NTggMjAuNjExOSAxNC4xMzQ3IDIwLjU3NjJDMTQuMTEzNiAyMC41NDA2IDE0LjEwMjMgMjAuNTAwMiAxNC4xMDE4IDIwLjQ1OVYxNC42NjgzQzE0LjEwMTggMTQuNDk3NSAxNC4xOTE2IDE0LjM0MzMgMTQuMzQxOCAxNC4yNTgzTDE5LjQ0MDQgMTEuMzYxOUMxOS40NzY3IDExLjM0MTUgMTkuNTE3OCAxMS4zMzA5IDE5LjU1OTYgMTEuMzMxMkMxOS42MDE0IDExLjMzMTUgMTkuNjQyNCAxMS4zNDI2IDE5LjY3ODQgMTEuMzYzNUMxOS43NTMgMTEuNDA0NCAxOS43OTk2IDExLjQ4MTIgMTkuODAwMiAxMS41NjVWMTYuNDM5MkwyNCAxOC44MjU0VjYuMzg2NDVIMjMuOTk4MUwxMy4wNTA3IDAuMTY2NjU2VjQuOTM3NDlMMTcuMzQxNSA3LjM3NDE2QzE3LjQxNSA3LjQxNjY2IDE3LjQ1OTEgNy40OTQzNyAxNy40NTkxIDcuNTc5MTZDMTcuNDU5MSA3LjY2MzEyIDE3LjQxNDIgNy43NDAyIDE3LjM0MTUgNy43ODI0OUwxMi4yNDEgMTAuNjgwOEMxMi4xNjc3IDEwLjcyMTcgMTIuMDg0OSAxMC43NDMyIDEyLjAwMDYgMTAuNzQzMkMxMS45MTY0IDEwLjc0MzIgMTEuODMzNiAxMC43MjE3IDExLjc2MDMgMTAuNjgwOEw2LjY2MTIxIDcuNzgyNDlDNi42MjQ5OSA3Ljc2MTg3IDYuNTk0OTUgNy43MzIyMSA2LjU3NDEyIDcuNjk2NTFDNi41NTMyOSA3LjY2MDggNi41NDI0MiA3LjYyMDMyIDYuNTQyNiA3LjU3OTE2QzYuNTQyMjMgNy41Mzc3MyA2LjU1MzAxIDcuNDk2OTUgNi41NzM4NCA3LjQ2MDk0QzYuNTk0NjcgNy40MjQ5NCA2LjYyNDgxIDcuMzk1IDYuNjYxMjEgNy4zNzQxNkwxMC45NTE0IDQuOTM3NDlMMTAuOTUxNiAwLjE2NjY1NloiIGZpbGw9IiNCMEI0QjciLz4KPC9zdmc+Cg==');
+ --str-video__icon-swift: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjgiIGhlaWdodD0iMjUiIHZpZXdCb3g9IjAgMCAyOCAyNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTIwLjkyMTcgMjIuODAxOUMxNy43NTg2IDI0LjYyMTMgMTMuNDA5NCAyNC44MDgyIDkuMDMzNzYgMjIuOTQwOUM1LjQ5MDg3IDIxLjQ0MDEgMi41NTEyMSAxOC44MTI4IDAuNjY2NzQ4IDE1LjgxMUMxLjU3MTI5IDE2LjU2MTUgMi42MjY1NyAxNy4xNjIxIDMuNzU3MjIgMTcuNjg3MUM4LjI3NjAxIDE5Ljc5NiAxMi43OTM5IDE5LjY1MTYgMTUuOTczMiAxNy42OTI1QzExLjQ1MDUgMTQuMjQgNy42MDE1IDkuNzMxMjQgNC43MzcyNyA2LjA1Mzk5QzQuMTMzOTkgNS40NTM1IDMuNjgxNzEgNC43MDI5MyAzLjIyOTQ1IDQuMDI3NDdDNi42OTY4MiA3LjE3OTcyIDEyLjE5OTYgMTEuMTU3MyAxNC4xNTkgMTIuMjgzN0MxMC4wMTM5IDcuOTMwMTYgNi4zMjAwNSAyLjUyNjU5IDYuNDcwNTEgMi42NzY0QzEzLjAyODYgOS4yODEyMSAxOS4xMzQ1IDEzLjAzNCAxOS4xMzQ1IDEzLjAzNEMxOS4zMzY1IDEzLjE0NzUgMTkuNDkyNCAxMy4yNDE5IDE5LjYxNzggMTMuMzI2M0MxOS43NDk5IDEyLjk5MTYgMTkuODY1OCAxMi42NDQgMTkuOTYzNSAxMi4yODM3QzIxLjAxODcgOC40NTU4OSAxOS44MTMgNC4xMDIzOCAxNy4xNzQ0IDAuNUMyMy4yNzk4IDQuMTc3NjIgMjYuODk4MyAxMS4wODI0IDI1LjM5MDMgMTYuODYxOEMyNS4zNTEgMTcuMDE3NyAyNS4zMDgzIDE3LjE3MTYgMjUuMjYyMiAxNy4zMjI4QzI4LjI3NjkgMjEuMDc1NyAyNy41MDA5IDI1LjExODEgMjcuMTI0IDI0LjM2NzZDMjUuNDg4NSAyMS4xODA5IDIyLjQ2MSAyMi4xNTU0IDIwLjkyMTcgMjIuODAxOVoiIGZpbGw9IiNCMEI0QjciLz4KPC9zdmc+Cg==');
+ --str-video__icon-react: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTE5LjI2NDEgMjEuNjUyNUMxOC41MDc5IDIyLjcyMTYgMTcuNzI0NSAyMy42OTUyIDE2LjkzNTQgMjQuNTUyOEMxOS4xNjUxIDI2LjcxNjcgMjEuMjM4OSAyNy43MyAyMi4zODk0IDI3LjA2NTdDMjMuNTM5OSAyNi40MDE1IDIzLjY5OTMgMjQuMDk4OSAyMi45NDAyIDIxLjA4NkMyMS44MDI5IDIxLjM0MDUgMjAuNTY4MSAyMS41MzIzIDE5LjI2NDEgMjEuNjUyNVpNMTcuNTE3NCAyMS43Njg3QzE3LjAxODkgMjEuNzg5MyAxNi41MTI4IDIxLjc5OTkgMTYuMDAwNSAyMS43OTk5QzE1LjQ4ODIgMjEuNzk5OSAxNC45ODIxIDIxLjc4OTMgMTQuNDgzNyAyMS43Njg3QzE0Ljk4NiAyMi40MjUxIDE1LjQ5NDUgMjMuMDMzMiAxNi4wMDA1IDIzLjU4NzNDMTYuNTA2NSAyMy4wMzMyIDE3LjAxNSAyMi40MjUxIDE3LjUxNzQgMjEuNzY4N1pNMjQuMjM4MyAxMS4yNDM3QzI3Ljc5MTMgMTIuMjYyOSAzMC4xMTE3IDEzLjk1NjMgMzAuMTExNyAxNS45OTk5QzMwLjExMTcgMTguMDQzMyAyNy43OTEzIDE5LjczNjggMjQuMjM4MyAyMC43NTZDMjUuMTMyMiAyNC4zNDI1IDI0LjgyNTggMjcuMTk4NyAyMy4wNTYxIDI4LjIyMDRDMjEuMjg2MyAyOS4yNDIxIDE4LjY1OTcgMjguMDc5MyAxNi4wMDA1IDI1LjUxMkMxMy4zNDE0IDI4LjA3OTMgMTAuNzE0NyAyOS4yNDIxIDguOTQ0OTYgMjguMjIwNEM3LjE3NTIzIDI3LjE5ODcgNi44Njg4NiAyNC4zNDI1IDcuNzYyNjggMjAuNzU2QzQuMjA5NzQgMTkuNzM2OCAxLjg4OTQgMTguMDQzMyAxLjg4OTQgMTUuOTk5OUMxLjg4OTQgMTMuOTU2MyA0LjIwOTc0IDEyLjI2MjkgNy43NjI2OCAxMS4yNDM3QzYuODY4ODYgNy42NTcxOCA3LjE3NTIzIDQuODAxIDguOTQ0OTYgMy43NzkyNEMxMC43MTQ3IDIuNzU3NDggMTMuMzQxNCAzLjkyMDI2IDE2LjAwMDUgNi40ODc1OUMxOC42NTk3IDMuOTIwMjYgMjEuMjg2MyAyLjc1NzQ4IDIzLjA1NjEgMy43NzkyNEMyNC44MjU4IDQuODAxIDI1LjEzMjIgNy42NTcxOCAyNC4yMzgzIDExLjI0MzdaTTIyLjk0MDIgMTAuOTEzN0MyMy42OTkzIDcuOTAwNzggMjMuNTM5OSA1LjU5ODIgMjIuMzg5NCA0LjkzMzk1QzIxLjIzODkgNC4yNjk2OCAxOS4xNjUxIDUuMjgyOTUgMTYuOTM1NCA3LjQ0Njc5QzE3LjcyNDUgOC4zMDQ0IDE4LjUwNzkgOS4yNzc5OSAxOS4yNjQxIDEwLjM0NzFDMjAuNTY4MSAxMC40Njc0IDIxLjgwMjkgMTAuNjU5MSAyMi45NDAyIDEwLjkxMzdaTTkuMDYwOCAyMS4wODZDOC4zMDE3NCAyNC4wOTg5IDguNDYxMTEgMjYuNDAxNSA5LjYxMTYzIDI3LjA2NTdDMTAuNzYyMSAyNy43MyAxMi44MzU5IDI2LjcxNjcgMTUuMDY1NyAyNC41NTI4QzE0LjI3NjUgMjMuNjk1MiAxMy40OTMgMjIuNzIxNiAxMi43MzY5IDIxLjY1MjVDMTEuNDMzIDIxLjUzMjMgMTAuMTk4MSAyMS4zNDA1IDkuMDYwOCAyMS4wODZaTTE0LjQ4MzcgMTAuMjMxQzE0Ljk4MjEgMTAuMjEwMyAxNS40ODgyIDEwLjE5OTggMTYuMDAwNSAxMC4xOTk4QzE2LjUxMjggMTAuMTk5OCAxNy4wMTg5IDEwLjIxMDMgMTcuNTE3NCAxMC4yMzFDMTcuMDE1IDkuNTc0NjIgMTYuNTA2NSA4Ljk2NjQgMTYuMDAwNSA4LjQxMjI5QzE1LjQ5NDUgOC45NjY0IDE0Ljk4NiA5LjU3NDYyIDE0LjQ4MzcgMTAuMjMxWk0xMi43MzY5IDEwLjM0NzFDMTMuNDkzIDkuMjc3OTkgMTQuMjc2NSA4LjMwNDQgMTUuMDY1NyA3LjQ0Njc5QzEyLjgzNTkgNS4yODI5NSAxMC43NjIxIDQuMjY5NjggOS42MTE2MyA0LjkzMzk1QzguNDYxMTEgNS41OTgyIDguMzAxNzQgNy45MDA3OCA5LjA2MDggMTAuOTEzN0MxMC4xOTgxIDEwLjY1OTEgMTEuNDMzIDEwLjQ2NzQgMTIuNzM2OSAxMC4zNDcxWk0xOC41MjUzIDIwLjM3MjlDMTguOTg2MSAxOS42OTcxIDE5LjQzNjMgMTguOTgyMSAxOS44Njg3IDE4LjIzMzJDMjAuMzAxMSAxNy40ODQxIDIwLjY5NTIgMTYuNzM2OCAyMS4wNTAxIDE1Ljk5OTlDMjAuNjk1MiAxNS4yNjI4IDIwLjMwMTEgMTQuNTE1NSAxOS44Njg3IDEzLjc2NjVDMTkuNDM2MyAxMy4wMTc1IDE4Ljk4NjEgMTIuMzAyNiAxOC41MjUzIDExLjYyNjdDMTcuNzA5NSAxMS41NjU2IDE2Ljg2NTQgMTEuNTMzMiAxNi4wMDA1IDExLjUzMzJDMTUuMTM1NyAxMS41MzMyIDE0LjI5MTQgMTEuNTY1NiAxMy40NzU3IDExLjYyNjdDMTMuMDE0OSAxMi4zMDI2IDEyLjU2NDcgMTMuMDE3NSAxMi4xMzIzIDEzLjc2NjVDMTEuNjk5OCAxNC41MTU1IDExLjMwNTggMTUuMjYyOCAxMC45NTA5IDE1Ljk5OTlDMTEuMzA1OCAxNi43MzY4IDExLjY5OTggMTcuNDg0MSAxMi4xMzIzIDE4LjIzMzJDMTIuNTY0NyAxOC45ODIxIDEzLjAxNDkgMTkuNjk3MSAxMy40NzU3IDIwLjM3MjlDMTQuMjkxNCAyMC40MzQgMTUuMTM1NyAyMC40NjY1IDE2LjAwMDUgMjAuNDY2NUMxNi44NjU0IDIwLjQ2NjUgMTcuNzA5NSAyMC40MzQgMTguNTI1MyAyMC4zNzI5Wk0yMC4yMzgxIDIwLjE5NzlDMjEuMDU3NyAyMC4wOTExIDIxLjgzODYgMTkuOTU0OCAyMi41NzE2IDE5Ljc5MzZDMjIuMzQ0NiAxOS4wNzgzIDIyLjA3MjIgMTguMzMzOSAyMS43NTQ5IDE3LjU3MDdDMjEuNTIzNSAxOC4wMTI3IDIxLjI3OTUgMTguNDU2MSAyMS4wMjM0IDE4Ljg5OTlDMjAuNzY3MyAxOS4zNDM1IDIwLjUwNTEgMTkuNzc2NSAyMC4yMzgxIDIwLjE5NzlaTTExLjc2MyAxMS44MDE4QzEwLjk0MzQgMTEuOTA4NiAxMC4xNjI0IDEyLjA0NDkgOS40Mjk1MiAxMi4yMDYxQzkuNjU2MzkgMTIuOTIxMyA5LjkyODg3IDEzLjY2NTkgMTAuMjQ2MSAxNC40MjkxQzEwLjQ3NzUgMTMuOTg3MSAxMC43MjE0IDEzLjU0MzUgMTAuOTc3NiAxMy4wOTk4QzExLjIzMzcgMTIuNjU2MiAxMS40OTU5IDEyLjIyMzEgMTEuNzYzIDExLjgwMThaTTkuNDI5NTIgMTkuNzkzNkMxMC4xNjI0IDE5Ljk1NDggMTAuOTQzNCAyMC4wOTExIDExLjc2MyAyMC4xOTc5QzExLjQ5NTkgMTkuNzc2NSAxMS4yMzM3IDE5LjM0MzUgMTAuOTc3NiAxOC44OTk5QzEwLjcyMTQgMTguNDU2MSAxMC40Nzc1IDE4LjAxMjcgMTAuMjQ2MSAxNy41NzA3QzkuOTI4ODcgMTguMzMzOSA5LjY1NjM5IDE5LjA3ODMgOS40Mjk1MiAxOS43OTM2Wk04LjEyNTk0IDE5LjQ2NjdDOC40NzQxIDE4LjM1NDUgOC45MjU1MSAxNy4xODkyIDkuNDczMyAxNS45OTk5QzguOTI1NTEgMTQuODEwNCA4LjQ3NDEgMTMuNjQ1MiA4LjEyNTk0IDEyLjUzMjlDNS4xMzcxNCAxMy4zODIgMy4yMjI3NCAxNC42NzEzIDMuMjIyNzQgMTUuOTk5OUMzLjIyMjc0IDE3LjMyODMgNS4xMzcxNCAxOC42MTc2IDguMTI1OTQgMTkuNDY2N1pNMjIuNTcxNiAxMi4yMDYxQzIxLjgzODYgMTIuMDQ0OSAyMS4wNTc3IDExLjkwODYgMjAuMjM4MSAxMS44MDE4QzIwLjUwNTEgMTIuMjIzMSAyMC43NjczIDEyLjY1NjIgMjEuMDIzNCAxMy4wOTk4QzIxLjI3OTUgMTMuNTQzNSAyMS41MjM1IDEzLjk4NzEgMjEuNzU0OSAxNC40MjkxQzIyLjA3MjIgMTMuNjY1OSAyMi4zNDQ2IDEyLjkyMTMgMjIuNTcxNiAxMi4yMDYxWk0yMy44NzUxIDEyLjUzMjlDMjMuNTI2OSAxMy42NDUyIDIzLjA3NTYgMTQuODEwNCAyMi41Mjc3IDE1Ljk5OTlDMjMuMDc1NiAxNy4xODkyIDIzLjUyNjkgMTguMzU0NSAyMy44NzUxIDE5LjQ2NjdDMjYuODYzOSAxOC42MTc2IDI4Ljc3ODMgMTcuMzI4MyAyOC43NzgzIDE1Ljk5OTlDMjguNzc4MyAxNC42NzEzIDI2Ljg2MzkgMTMuMzgyIDIzLjg3NTEgMTIuNTMyOVpNMTYuMDAwNSAxOC41MDUzQzE0LjYxNjggMTguNTA1MyAxMy40OTUgMTcuMzgzNiAxMy40OTUgMTUuOTk5OUMxMy40OTUgMTQuNjE2IDE0LjYxNjggMTMuNDk0MyAxNi4wMDA1IDEzLjQ5NDNDMTcuMzg0MyAxMy40OTQzIDE4LjUwNjEgMTQuNjE2IDE4LjUwNjEgMTUuOTk5OUMxOC41MDYxIDE3LjM4MzYgMTcuMzg0MyAxOC41MDUzIDE2LjAwMDUgMTguNTA1M1oiIGZpbGw9IiNCMEI0QjciLz4KPC9zdmc+Cg==');
+ --str-video__icon--flutter: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzMiIHZpZXdCb3g9IjAgMCAzMiAzMyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTE4LjAwNTIgMy4xNjc5N0w0LjY3MTg4IDE2LjUwMTNMOC43ODI5OCAyMC42MTI0TDI2LjIyMzEgMy4xNjc5N0gxOC4wMDUyWk0xNy45OTggMTUuNDMxOUwxMC44MzEgMjIuNjU5OUwxNy45OTQxIDI5LjgzMzFIMjYuMjQ1NkwxOS4wNjMzIDIyLjYzMzJMMjYuMjQ3NSAxNS40MzMxTDE3Ljk5OCAxNS40MzE5WiIgZmlsbD0iI0IwQjRCNyIvPgo8L3N2Zz4K');
+ --str-video__icon--javascript: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yLjY2Njc1IDIuNjY2NjZIMjkuMzMzNFYyOC4yNjY3SDIuNjY2NzVWMi42NjY2NlpNMjMuMDUyIDI0LjEyNzdDMjEuODE2MSAyNC4xMjc3IDIxLjExNzIgMjMuNTA4OCAyMC41ODAxIDIyLjY2NjhMMTguNTQzNyAyMy44MDI2QzE5LjI3OTMgMjUuMTk4IDIwLjc4MjggMjYuMjYyNiAyMy4xMSAyNi4yNjI2QzI1LjQ5MDEgMjYuMjYyNiAyNy4yNjI0IDI1LjA3NjEgMjcuMjYyNCAyMi45MTAyQzI3LjI2MjQgMjAuOTAxMiAyNi4wNjAzIDIwLjAwNzcgMjMuOTMxMiAxOS4xMzEyTDIzLjMwNDcgMTguODczNkMyMi4yMjk2IDE4LjQyNjYgMjEuNzY0IDE4LjEzNDQgMjEuNzY0IDE3LjQxMjdDMjEuNzY0IDE2LjgyODggMjIuMjI5MiAxNi4zODE4IDIyLjk2MzIgMTYuMzgxOEMyMy42ODI3IDE2LjM4MTggMjQuMTQ2MiAxNi42NzMyIDI0LjU3NTggMTcuNDEyN0wyNi41MjcyIDE2LjIwOTlDMjUuNzAxOCAxNC44MTYyIDI0LjU1NjQgMTQuMjgzOCAyMi45NjMyIDE0LjI4MzhDMjAuNzI1MyAxNC4yODM4IDE5LjI5MzMgMTUuNjU3MyAxOS4yOTMzIDE3LjQ2MTVDMTkuMjkzMyAxOS40MjAxIDIwLjQ5NDYgMjAuMzQ2NiAyMi4zMDI4IDIxLjA4NjFMMjIuOTI5MyAyMS4zNDQyQzI0LjA3MjEgMjEuODI0MSAyNC43NTM2IDIyLjExNjIgMjQuNzUzNiAyMi45NDExQzI0Ljc1MzYgMjMuNjI5NSAyNC4wOTAzIDI0LjEyNzcgMjMuMDUyIDI0LjEyNzdaTTEzLjM0MDcgMjQuMTEyNkMxMi40Nzk4IDI0LjExMjYgMTIuMTIxNyAyMy41NDU4IDExLjcyOCAyMi44NzUzTDkuNjg4MjMgMjQuMDYwOEMxMC4yNzkxIDI1LjI2MTQgMTEuNDQxIDI2LjI1ODEgMTMuNDQ3NCAyNi4yNTgxQzE1LjY2NzkgMjYuMjU4MSAxNy4xODkyIDI1LjEyNDQgMTcuMTg5MiAyMi42MzM1VjE0LjQyMTJIMTQuNjgzNFYyMi42MDFDMTQuNjgzNCAyMy44MDM0IDE0LjE2NCAyNC4xMTI2IDEzLjM0MDcgMjQuMTEyNloiIGZpbGw9IiNFRkYwRjEiLz4KPC9zdmc+Cg==');
+ --str-video__icon--android: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzMiIHZpZXdCb3g9IjAgMCAzMiAzMyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0zMC43Mjg4IDI0Ljk0MTlDMzAuNzM4NyAyNS4wMDE2IDMwLjc0ODMgMjUuMDYxOCAzMC43NTc1IDI1LjEyMjVMMzAuNzU1NCAyNS4xMjQxQzMwLjc4ODMgMjUuMzQxMiAzMC44MTY2IDI1LjU1ODkgMzAuODQwMiAyNS43NzcySDEuMzMzMjVDMS4zNjMyOSAyNS40OTgzIDEuNDAxMTUgMjUuMjIwMyAxLjQ0Njc5IDI0Ljk0MzVDMS43MDIxNiAyMy4zOTU5IDIuMTk5ODUgMjEuODk4NiAyLjkyMTM1IDIwLjUwNzRDMy4yMzg3OCAxOS44OTQyIDMuNTk4NTYgMTkuMzA0MiAzLjk5ODA2IDE4Ljc0MTVDNC40ODUzNiAxOC4wNTUgNS4wMjkzNSAxNy40MTA5IDUuNjI0MjYgMTYuODE2MUM2LjQyMzM5IDE2LjAxNyA3LjMxMDE2IDE1LjMxMTYgOC4yNjc1NyAxNC43MTM0TDguMjY0NCAxNC43MDc2QzguMjYzMDEgMTQuNzA1MiA4LjI2MDU0IDE0LjcwMDQgOC4yNjA1NCAxNC43MDA0QzguMTExNyAxNC40NDE4IDcuOTYyNjYgMTQuMTgzNCA3LjgxMzYzIDEzLjkyNTFDNy42NjQ2NiAxMy42NjY4IDcuNTE1NyAxMy40MDg2IDcuMzY2OTMgMTMuMTUwMUw1Ljg2NjU3IDEwLjU0ODRDNS42ODYzMSAxMC4yMzU0IDUuNjM2OTEgOS44NjMzMiA1LjcyOTIgOS41MTM3OEM1LjgxOTYzIDkuMTY5MjUgNi4wNDExOCA4Ljg3NDE5IDYuMzQ2MTEgOC42OTIyMUM2LjUyMTkzIDguNTg2ODIgNi43MTkzMyA4LjUyMzA0IDYuOTIzMzUgOC41MDU3MUM3LjE3OTcxIDguNDgzMzggNy40MzcwOSA4LjUzNDkgNy42NjUzNyA4LjY1NDIyQzcuODkzNjQgOC43NzM1NCA4LjA4MzM1IDguOTU1NzQgOC4yMTIyNyA5LjE3OTQ2QzguNDIwOTcgOS41NDIxNCA4LjYyOTkyIDkuOTA0NjcgOC44MzkxNSAxMC4yNjdMOS43MTI2MyAxMS43ODEyQzEwLjAxMDYgMTIuMjk3OCAxMC4zMDg0IDEyLjgxNDUgMTAuNjA2MiAxMy4zMzE1TDEwLjY5NzUgMTMuNDg5N0MxMC44NjU3IDEzLjQyMzIgMTEuMDM1NiAxMy4zNTk5IDExLjIwNzEgMTMuMjk5N0MxMi43MjggMTIuNzY4IDE0LjMyNSAxMi40ODkzIDE1LjkzNTMgMTIuNDc0NkMxNS45ODYxIDEyLjQ3MzkgMTYuMDM2OSAxMi40NzM3IDE2LjA4NzcgMTIuNDczOEMxNy45NDkgMTIuNDczOCAxOS43Mjk3IDEyLjgxNzkgMjEuMzcwOCAxMy40NDcxQzIxLjQwNjEgMTMuNDYwNiAyMS40NDA5IDEzLjQ3NDUgMjEuNDc2IDEzLjQ4ODVDMjEuNDg1OSAxMy40OTI1IDIxLjQ5NiAxMy40OTY1IDIxLjUwNiAxMy41MDA1QzIxLjUzODYgMTMuNDQzNiAyMS41NzEyIDEzLjM4NyAyMS42MDM3IDEzLjMzMDdDMjEuNzUyNCAxMy4wNzIzIDIxLjkwMTQgMTIuODE0MiAyMi4wNTAzIDEyLjU1NkMyMi4xOTk0IDEyLjI5NzYgMjIuMzQ4NCAxMi4wMzkxIDIyLjQ5NzMgMTEuNzgwNEwyMy4zNzA4IDEwLjI2NjVDMjMuNTc5NSA5LjkwMzkzIDIzLjc4ODUgOS41NDE0IDIzLjk5NzcgOS4xNzg4N0MyNC4wODY5IDkuMDIzOTggMjQuMjA1NyA4Ljg4ODI5IDI0LjM0NzIgOC43Nzk1OEMyNC40ODg3IDguNjcwODggMjQuNjUwMSA4LjU5MTI4IDI0LjgyMjMgOC41NDUzN0MyNC45NzM2IDguNTA1MzEgMjUuMTMwNyA4LjQ5MTYzIDI1LjI4NjYgOC41MDQ5M0MyNS40OTA1IDguNTIyOTMgMjUuNjg3OCA4LjU4NjY2IDI1Ljg2MzkgOC42OTE0MkMyNi4wNTcyIDguODA2NTMgMjYuMjE4OCA4Ljk2ODM2IDI2LjMzNCA5LjE2MjE5QzI2LjQzMzEgOS4zMjg5OSAyNi40OTU3IDkuNTE1MDkgMjYuNTE3NyA5LjcwODA5QzI2LjUzOTcgOS45MDExIDI2LjUyMDUgMTAuMDk2NiAyNi40NjE0IDEwLjI4MTZDMjYuNDMyMiAxMC4zNzI4IDI2LjM5MjkgMTAuNDYxNSAyNi4zNDM0IDEwLjU0NzZDMjYuMTM0NyAxMC45MTAzIDI1LjkyNTggMTEuMjcyOCAyNS43MTY1IDExLjYzNTJMMjMuOTQ5NiAxNC42OTk0TDIzLjkzMyAxNC43Mjg1QzI0Ljg4MSAxNS4zMjI3IDI1Ljc1OTMgMTYuMDIyNSAyNi41NTExIDE2LjgxNDVDMjcuMTQ2NCAxNy40MDkgMjcuNjkwNCAxOC4wNTMxIDI4LjE3NzMgMTguNzRDMjguNTc2MyAxOS4zMDMgMjguOTM2MSAxOS44OTMgMjkuMjU0MiAyMC41MDU4QzI5Ljk3NTggMjEuODk3IDMwLjQ3MzUgMjMuMzk0MyAzMC43Mjg4IDI0Ljk0MTlaTTIzLjk1MzYgMTkuNjMzM0MyNC40MzgzIDIwLjM2NTkgMjQuMzUyNSAyMS4yOCAyMy43NjIgMjEuNjc1QzIzLjE3MTYgMjIuMDcwMSAyMi4zMDAzIDIxLjc5NjcgMjEuODE1OSAyMS4wNjQ0QzIxLjMzMTIgMjAuMzMxOCAyMS40MTcgMTkuNDE3NyAyMi4wMDc0IDE5LjAyMjhDMjIuNTk3NyAxOC42Mjc2IDIzLjQ2OSAxOC45MDEgMjMuOTUzNiAxOS42MzMzWk0xMC4xOTIxIDE5LjAyNDlDMTAuNzgyMiAxOS40MjAxIDEwLjg2ODIgMjAuMzM0MyAxMC4zODM2IDIxLjA2NjZDOS44OTg5OCAyMS43OTkyIDkuMDI3NjUgMjIuMDcyNyA4LjQzNzMxIDIxLjY3NzVDNy44NDY5OCAyMS4yODIzIDcuNzYxMzkgMjAuMzY4MyA4LjI0NTgxIDE5LjYzNTlDOC43MzAyMyAxOC45MDM0IDkuNjAxNTcgMTguNjI5OSAxMC4xOTIxIDE5LjAyNDlaIiBmaWxsPSIjQjBCNEI3Ii8+Cjwvc3ZnPgo=');
+
+ --str-video__icon--add: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTUiIHZpZXdCb3g9IjAgMCAxNCAxNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTEzIDguNUg4VjEzLjVDOCAxNC4wNSA3LjU1IDE0LjUgNyAxNC41QzYuNDUgMTQuNSA2IDE0LjA1IDYgMTMuNVY4LjVIMUMwLjQ1IDguNSAwIDguMDUgMCA3LjVDMCA2Ljk1IDAuNDUgNi41IDEgNi41SDZWMS41QzYgMC45NSA2LjQ1IDAuNSA3IDAuNUM3LjU1IDAuNSA4IDAuOTUgOCAxLjVWNi41SDEzQzEzLjU1IDYuNSAxNCA2Ljk1IDE0IDcuNUMxNCA4LjA1IDEzLjU1IDguNSAxMyA4LjVaIiBmaWxsPSIjNjU2QjcyIi8+Cjwvc3ZnPgo=');
+ --str-video__icon--success: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTcuMDAwMTYgMC4zMzMzNzRDMy4zMjAxNiAwLjMzMzM3NCAwLjMzMzQ5NiAzLjMyMDA0IDAuMzMzNDk2IDcuMDAwMDRDMC4zMzM0OTYgMTAuNjggMy4zMjAxNiAxMy42NjY3IDcuMDAwMTYgMTMuNjY2N0MxMC42ODAyIDEzLjY2NjcgMTMuNjY2OCAxMC42OCAxMy42NjY4IDcuMDAwMDRDMTMuNjY2OCAzLjMyMDA0IDEwLjY4MDIgMC4zMzMzNzQgNy4wMDAxNiAwLjMzMzM3NFpNNy4wMDAxNiAxMi4zMzM0QzQuMDYwMTYgMTIuMzMzNCAxLjY2NjgzIDkuOTQwMDQgMS42NjY4MyA3LjAwMDA0QzEuNjY2ODMgNC4wNjAwNCA0LjA2MDE2IDEuNjY2NzEgNy4wMDAxNiAxLjY2NjcxQzkuOTQwMTYgMS42NjY3MSAxMi4zMzM1IDQuMDYwMDQgMTIuMzMzNSA3LjAwMDA0QzEyLjMzMzUgOS45NDAwNCA5Ljk0MDE2IDEyLjMzMzQgNy4wMDAxNiAxMi4zMzM0Wk05LjU4NjgzIDQuNTI2NzFMNS42NjY4MyA4LjQ0NjcxTDQuNDEzNSA3LjE5MzM3QzQuMTUzNSA2LjkzMzM3IDMuNzMzNSA2LjkzMzM3IDMuNDczNSA3LjE5MzM3QzMuMjEzNSA3LjQ1MzM3IDMuMjEzNSA3Ljg3MzM3IDMuNDczNSA4LjEzMzM3TDUuMjAwMTYgOS44NjAwNEM1LjQ2MDE2IDEwLjEyIDUuODgwMTYgMTAuMTIgNi4xNDAxNiA5Ljg2MDA0TDEwLjUzMzUgNS40NjY3MUMxMC43OTM1IDUuMjA2NzEgMTAuNzkzNSA0Ljc4NjcxIDEwLjUzMzUgNC41MjY3MUMxMC4yNzM1IDQuMjY2NzEgOS44NDY4MyA0LjI2NjcxIDkuNTg2ODMgNC41MjY3MVoiIGZpbGw9IiMwMEUyQTEiLz4KPC9zdmc+Cg==');
+ --str-video__icon--caution: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTcuOTk5NzYgMy42NjI0OEwxMy4wMTk4IDEyLjMzNThIMi45Nzk3Nkw3Ljk5OTc2IDMuNjYyNDhaTTEuODI2NDIgMTEuNjY5MUMxLjMxMzA5IDEyLjU1NTggMS45NTMwOSAxMy42NjkxIDIuOTc5NzYgMTMuNjY5MUgxMy4wMTk4QzE0LjA0NjQgMTMuNjY5MSAxNC42ODY0IDEyLjU1NTggMTQuMTczMSAxMS42NjkxTDkuMTUzMDkgMi45OTU4MUM4LjYzOTc2IDIuMTA5MTQgNy4zNTk3NiAyLjEwOTE0IDYuODQ2NDIgMi45OTU4MUwxLjgyNjQyIDExLjY2OTFaTTcuMzMzMDkgNy4wMDI0OFY4LjMzNTgxQzcuMzMzMDkgOC43MDI0OCA3LjYzMzA5IDkuMDAyNDggNy45OTk3NiA5LjAwMjQ4QzguMzY2NDIgOS4wMDI0OCA4LjY2NjQyIDguNzAyNDggOC42NjY0MiA4LjMzNTgxVjcuMDAyNDhDOC42NjY0MiA2LjYzNTgxIDguMzY2NDIgNi4zMzU4MSA3Ljk5OTc2IDYuMzM1ODFDNy42MzMwOSA2LjMzNTgxIDcuMzMzMDkgNi42MzU4MSA3LjMzMzA5IDcuMDAyNDhaTTcuMzMzMDkgMTAuMzM1OEg4LjY2NjQyVjExLjY2OTFINy4zMzMwOVYxMC4zMzU4WiIgZmlsbD0iI0ZGRDY0NiIvPgo8L3N2Zz4K');
+ --str-video__icon--error: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTExLjgwOTYgMy4zMkw4LjY4OTYgMC4yQzguNTYyOTMgMC4wNzMzMzMzIDguMzg5NiAwIDguMjE2MjYgMEgzLjc4OTZDMy42MTYyNiAwIDMuNDQyOTMgMC4wNzMzMzMzIDMuMzIyOTMgMC4xOTMzMzNMMC4xOTYyNjMgMy4zMkMwLjA3NjI2MyAzLjQ0IDAuMDAyOTI5NjkgMy42MTMzMyAwLjAwMjkyOTY5IDMuNzg2NjdWOC4yMDY2N0MwLjAwMjkyOTY5IDguMzg2NjcgMC4wNzYyNjMgOC41NTMzMyAwLjE5NjI2MyA4LjY4TDMuMzE2MjYgMTEuOEMzLjQ0MjkzIDExLjkyNjcgMy42MTYyNiAxMiAzLjc4OTYgMTJIOC4yMDk2QzguMzg5NiAxMiA4LjU1NjI2IDExLjkyNjcgOC42ODI5MyAxMS44MDY3TDExLjgwMjkgOC42ODY2N0MxMS45Mjk2IDguNTYgMTEuOTk2MyA4LjM5MzMzIDExLjk5NjMgOC4yMTMzM1YzLjc4NjY3QzEyLjAwMjkgMy42MTMzMyAxMS45Mjk2IDMuNDQgMTEuODA5NiAzLjMyWk0xMC42Njk2IDcuOTMzMzNMNy45MzYyNiAxMC42NjY3SDQuMDY5NkwxLjMzNjI2IDcuOTMzMzNWNC4wNjY2N0w0LjA2OTYgMS4zMzMzM0g3LjkzNjI2TDEwLjY2OTYgNC4wNjY2N1Y3LjkzMzMzWiIgZmlsbD0iI0RDNDMzQiIvPgo8cGF0aCBkPSJNNi4wMDI5MyA5LjMzMzMzQzYuMzcxMTIgOS4zMzMzMyA2LjY2OTYgOS4wMzQ4NiA2LjY2OTYgOC42NjY2N0M2LjY2OTYgOC4yOTg0OCA2LjM3MTEyIDggNi4wMDI5MyA4QzUuNjM0NzQgOCA1LjMzNjI2IDguMjk4NDggNS4zMzYyNiA4LjY2NjY3QzUuMzM2MjYgOS4wMzQ4NiA1LjYzNDc0IDkuMzMzMzMgNi4wMDI5MyA5LjMzMzMzWiIgZmlsbD0iI0RDNDMzQiIvPgo8cGF0aCBkPSJNNi4wMDI5MyAyLjY2NjY3QzUuNjM2MjYgMi42NjY2NyA1LjMzNjI2IDIuOTY2NjcgNS4zMzYyNiAzLjMzMzMzVjYuNjY2NjdDNS4zMzYyNiA3LjAzMzMzIDUuNjM2MjYgNy4zMzMzMyA2LjAwMjkzIDcuMzMzMzNDNi4zNjk2IDcuMzMzMzMgNi42Njk2IDcuMDMzMzMgNi42Njk2IDYuNjY2NjdWMy4zMzMzM0M2LjY2OTYgMi45NjY2NyA2LjM2OTYgMi42NjY2NyA2LjAwMjkzIDIuNjY2NjdaIiBmaWxsPSIjREM0MzNCIi8+Cjwvc3ZnPgo=');
+
+
+
+
+}
+
+.str-video__icon--new-tab{
+ mask-image: var(--str-video__icon-new-tab)
+}
+
+.str-video__icon--unity{
+ mask-image: var(--str-video__icon-unity);
+}
+
+.str-video__icon--swift{
+ mask-image: var(--str-video__icon-swift);
+}
+
+.str-video__icon--react{
+ mask-image: var(--str-video__icon-react);
+}
+
+.str-video__icon--flutter{
+ mask-image: var(--str-video__icon-flutter);
+}
+
+.str-video__icon--android{
+ mask-image: var(--str-video__icon--android);
+}
+
+.str-video__icon--javascript{
+ mask-image: var(--str-video__icon--javascript);
+}
+
+.str-video__icon--flutter {
+ mask-image: var(--str-video__icon--flutter);
+}
+
+.str-video__icon--add {
+ mask-image: var(--str-video__icon--add);
+}
+
+.str-video__icon--success {
+ mask-image: var(--str-video__icon--success);
+}
+
+.str-video__icon--caution {
+ mask-image: var(--str-video__icon--caution);
+}
+
+.str-video__icon--error {
+ mask-image: var(--str-video__icon--error);
+}
+
+
+
+
+
+
diff --git a/sample-apps/react/react-dogfood/style/EndCallSummary/modal.scss b/sample-apps/react/react-dogfood/style/EndCallSummary/modal.scss
new file mode 100644
index 0000000000..d049ebba47
--- /dev/null
+++ b/sample-apps/react/react-dogfood/style/EndCallSummary/modal.scss
@@ -0,0 +1,41 @@
+.rd__leave{
+ .rd__modal{
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: 10;
+ gap: var(--str-video__spacing-md);
+
+ &--background{
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-color: rgba(0, 0, 0, 0.3);
+ }
+
+ &--content{
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ position: relative;
+ z-index: 11;
+
+ gap: var(--str-video__spacing-md);
+
+ @include respond-above(md) {
+ width: 420px;
+
+ }
+ }
+ }
+
+}
diff --git a/sample-apps/react/react-dogfood/style/EndCallSummary/network-status.scss b/sample-apps/react/react-dogfood/style/EndCallSummary/network-status.scss
new file mode 100644
index 0000000000..1ad523b981
--- /dev/null
+++ b/sample-apps/react/react-dogfood/style/EndCallSummary/network-status.scss
@@ -0,0 +1,47 @@
+.rd__leave{
+ .rd__network-status{
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: space-between;
+ gap: var(--str-video__spacing-md);
+
+ font-size: var(--str-video__font-size-md);
+ font-weight: 600;
+
+ .rd__network-bars{
+ display: flex;
+ flex-direction: row;
+ gap: var(--str-video__spacing-xxs);
+
+ .rd__network-bar {
+ width: 8px;
+ height: 24px;
+ background-color: #e0e0e0;
+ border-radius: var(--str-video__border-radius-sm);
+
+ &--good {
+ background-color: var(--str-video__network-bar-good);
+ }
+
+ &--average {
+ background-color: var(--str-video__network-bar-average);
+ }
+
+ &--bad {
+ background-color: var(--str-video__network-bar-bad);
+ }
+
+ &--neutral {
+ background-color: var(--str-video__network-bar-neutral);
+ }
+ }
+ }
+ }
+
+ .rd__leave--row-edge-networks-used{
+ .str-video__icon{
+ background-color: var(--str-video__network-bar-neutral);
+ }
+ }
+}
diff --git a/sample-apps/react/react-dogfood/style/EndCallSummary/notifications.scss b/sample-apps/react/react-dogfood/style/EndCallSummary/notifications.scss
new file mode 100644
index 0000000000..60053684e2
--- /dev/null
+++ b/sample-apps/react/react-dogfood/style/EndCallSummary/notifications.scss
@@ -0,0 +1,50 @@
+.rd__leave{
+
+ .rd__notification{
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap: var(--str-video__spacing-xs);
+ padding: var(--str-video__spacing-sm);
+ border-radius: var(--str-video__border-radius-xs);
+ font-size: var(--str-video__font-size-md);
+ font-weight: 400;
+
+ .str-video__icon{
+ height: 16px;
+ width: 16px;
+ }
+
+ &--success{
+ color: var(--str-video__good);
+ background-color: var( --str-video__notification-background-good);
+ .str-video__icon{
+ background-color: var(--str-video__good);
+ }
+ }
+
+ &--error{
+ color: var(--str-video__bad);
+ background-color: var(--str-video__alert-warning-background);
+ .str-video__icon{
+ background-color: var(--str-video__bad);
+ }
+ }
+
+ &--info{
+ color: var(--str-video__alert-info);
+ background-color: var(--str-video__alert-caution);
+ .str-video__icon{
+ background-color: var(--str-video__alert-info);
+ }
+ }
+
+ &--caution{
+ color: var(--str-video__average);
+ background-color: var(--str-video__alert-caution-background);
+ .str-video__icon{
+ background-color: var(--str-video__average);
+ }
+ }
+ }
+}
diff --git a/sample-apps/react/react-dogfood/style/EndCallSummary/recordings.scss b/sample-apps/react/react-dogfood/style/EndCallSummary/recordings.scss
new file mode 100644
index 0000000000..01dec5072c
--- /dev/null
+++ b/sample-apps/react/react-dogfood/style/EndCallSummary/recordings.scss
@@ -0,0 +1,42 @@
+.rd__summary-recordings {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ text-align: center;
+
+ background-color: #19232D !important;
+ border-radius: var(--str-video__border-radius-lg);
+ padding: 32px;
+
+ width: 100%;
+ border: 1px solid #323B44;
+ box-shadow: 0 14px 34px rgba(0, 0, 0, 0.75);
+
+ height: 100%;
+
+ @include respond-above(md) {
+ height: auto;
+ }
+}
+
+.rd__summary-recordings-close {
+ position: absolute;
+ top: 16px;
+ right: 16px;
+
+ .str-video__icon{
+ height: 28px;
+ width: 28px;
+ background-color: #656B72;
+ }
+
+
+ &:hover{
+ cursor: pointer;
+
+
+ .str-video__icon{
+ background-color: var(--str-video__text-color1);
+ }
+ }
+}
diff --git a/sample-apps/react/react-dogfood/style/EndCallSummary/review.scss b/sample-apps/react/react-dogfood/style/EndCallSummary/review.scss
new file mode 100644
index 0000000000..d6a8c2cc0e
--- /dev/null
+++ b/sample-apps/react/react-dogfood/style/EndCallSummary/review.scss
@@ -0,0 +1,77 @@
+.rd__leave{
+ .rd__leave--review{
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: var(--str-video__spacing-sm);
+
+ &-container{
+ &-success{
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ height: 100%;
+ }
+ }
+
+ &-success{
+ align-items: center;
+ justify-content: center;
+ height: 100%;
+ }
+
+ &-title{
+ font-size: var(--str-video__font-size-xxl);
+ font-weight: 500;
+ color: var(--str-video__icon-default);
+ text-transform: capitalize;
+ margin: 0;
+ max-width: 80%;
+
+ &-success{
+ text-align: center;
+ width: 100%;
+ }
+ }
+ }
+
+ .rd__feedback-rating-stars {
+ width: 100%;
+ display: flex;
+ align-items: center;
+
+ gap: var(--str-video__spacing-xs);
+
+
+ @include respond-above(sm) {
+ gap: var(--str-video__spacing-md);
+ }
+
+ @include respond-above(md) {
+ // justify-content: space-between;
+ }
+ }
+
+ .rd__feedback-star {
+ cursor: pointer;
+ width: 44px;
+ height: 44px;
+ background-color: var(--str-video__icon-pressed);
+ }
+
+ .rd__feedback-star--active-bad,
+ .rd__feedback-star--bad:hover {
+ background-color: var(--str-video__bad);
+ }
+
+ .rd__feedback-star--active-good,
+ .rd__feedback-star--good:hover {
+ background-color: var(--str-video__average);
+ }
+
+ .rd__feedback-star--active-great,
+ .rd__feedback-star--great:hover {
+ background-color: var(--str-video__good);
+ }
+}
diff --git a/sample-apps/react/react-dogfood/style/EndCallSummary/rooms.scss b/sample-apps/react/react-dogfood/style/EndCallSummary/rooms.scss
new file mode 100644
index 0000000000..19b94fca56
--- /dev/null
+++ b/sample-apps/react/react-dogfood/style/EndCallSummary/rooms.scss
@@ -0,0 +1,13 @@
+.rd__leave{
+ .rd__leave--rooms{
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ flex-direction: row;
+ flex-wrap: wrap;
+ gap: var(--str-video__spacing-sm);
+ }
+
+ .rd__leave--rooms-link{
+ text-decoration: none;
+ }
+}
diff --git a/sample-apps/react/react-dogfood/style/EndCallSummary/sdks.scss b/sample-apps/react/react-dogfood/style/EndCallSummary/sdks.scss
new file mode 100644
index 0000000000..4a3d1266fb
--- /dev/null
+++ b/sample-apps/react/react-dogfood/style/EndCallSummary/sdks.scss
@@ -0,0 +1,49 @@
+.rd__leave{
+ .rd__sdks{
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-start;
+ gap: var(--str-video__spacing-xs);
+
+
+
+
+ @include respond-above(sm) {
+ gap: var(--str-video__spacing-sm);
+ }
+
+ @include respond-above(md) {
+ flex-direction: row;
+ flex-wrap: wrap;
+ }
+
+
+
+ &--link{
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: fit-content;
+ min-height: 65px;
+ width: 57px;
+
+ @include respond-above(sm) {
+ width: auto;
+ }
+
+ @include respond-above(md) {
+ justify-content: center;
+ width: 65px;
+ }
+
+ &-icon{
+ padding: var(--str-video__spacing-lg) var(--str-video__spacing-sm);
+
+ .str-video__icon{
+ height: 32px;
+ width: 32px;
+ }
+ }
+ }
+ }
+}
diff --git a/sample-apps/react/react-dogfood/style/EndCallSummary/shared.scss b/sample-apps/react/react-dogfood/style/EndCallSummary/shared.scss
new file mode 100644
index 0000000000..2b4f0c65ae
--- /dev/null
+++ b/sample-apps/react/react-dogfood/style/EndCallSummary/shared.scss
@@ -0,0 +1,40 @@
+.rd__leave{
+ .rd__leave--button{
+ border-radius: var(--str-video__border-radius-sm);
+ font-weight: 600;
+ font-size: var(--str-video__font-size-md);
+ border: none;
+ display: flex;
+ align-items: center;
+ width: 100%;
+ width: fit-content;
+ text-transform: capitalize;
+ border-radius: var(--str-video__border-radius-lg);
+ padding: var(--str-video__spacing-sm) var(--str-video__spacing-md);
+ border: 1px solid transparent;
+
+ &-primary{
+ background-color: var(--str-video__button-primary-active);
+ border: 1px solid var(--str-video__button-primary-active);
+ color: var( --str-video__text-color);
+ }
+
+ &-secondary{
+ border: 1px solid var(--str-video__base-color6);
+ background-color: var(--str-video__base-color6);
+ color: var(--str-video__text-color1);
+
+ }
+
+ &-border{
+ color: var(--str-video__text-color1);
+ border: 1px solid var(--str-video__button-default-hover);
+ }
+ }
+
+ .rd__leave--hover{
+ &:hover{
+ cursor: pointer;
+ }
+ }
+}
diff --git a/sample-apps/react/react-dogfood/style/Feedback/Feedback.scss b/sample-apps/react/react-dogfood/style/Feedback/Feedback.scss
index e95bffff91..5c7e78d9f8 100644
--- a/sample-apps/react/react-dogfood/style/Feedback/Feedback.scss
+++ b/sample-apps/react/react-dogfood/style/Feedback/Feedback.scss
@@ -12,8 +12,17 @@
box-shadow: 0 14px 34px rgba(0, 0, 0, 0.75);
}
+
+
+.rd__feedback-header {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+}
+
.rd__feedback-image {
- width: 300px;
+ width: 140px;
}
.rd__feedback-heading {
@@ -25,7 +34,7 @@
.rd__feedback-description {
color: var(--str-video__base-color2);
font-size: var(--str-video__font-size-sm);
- margin: var(--str-video__spacing-lg) 0 var(--str-video__spacing-md) 0;
+ margin: 0;
}
.rd__feedback-form {
@@ -62,36 +71,6 @@
padding-top: var(--str-video__spacing-lg);
padding-bottom: var(--str-video__spacing-lg);
}
-
-.rd__feedback-rating-stars {
- width: 100%;
- display: flex;
- align-items: center;
- justify-content: center;
- margin-bottom: var(--str-video__spacing-lg);
-}
-
-.rd__feedback-star {
- cursor: pointer;
- width: 56px;
- height: 56px;
-}
-
-.rd__feedback-star--active-bad,
-.rd__feedback-star--bad:hover {
- background-color: var(--str-video__alert-warning);
-}
-
-.rd__feedback-star--active-good,
-.rd__feedback-star--good:hover {
- background-color: var(--str-video__alert-caution);
-}
-
-.rd__feedback-star--active-great,
-.rd__feedback-star--great:hover {
- background-color: var(--str-video__alert-success);
-}
-
.rd__feedback-actions {
display: flex;
justify-content: space-between;
diff --git a/sample-apps/react/react-dogfood/style/index.scss b/sample-apps/react/react-dogfood/style/index.scss
index b744e90266..206da39777 100644
--- a/sample-apps/react/react-dogfood/style/index.scss
+++ b/sample-apps/react/react-dogfood/style/index.scss
@@ -41,3 +41,5 @@
@import 'DevMenu';
@import 'delete-account';
+
+@import 'EndCallSummary';
diff --git a/sample-apps/react/react-dogfood/style/leave.scss b/sample-apps/react/react-dogfood/style/leave.scss
index 3c059e831f..e69de29bb2 100644
--- a/sample-apps/react/react-dogfood/style/leave.scss
+++ b/sample-apps/react/react-dogfood/style/leave.scss
@@ -1,28 +0,0 @@
-.rd__leave {
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
- width: 100%;
- height: 100%;
- padding: var(--str-video__spacing-lg);
-
- &-content {
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
- text-align: center;
- width: 100%;
-
- .rd__feedback {
- box-shadow: 0px 14px 34px rgba(0, 0, 0, 0.75);
- }
- }
-}
-
-@include respond-above(sm) {
- .rd__leave-content {
- max-width: 35vw;
- }
-}