From 26e144d0e48e5937492882b575cddb7e34ceda76 Mon Sep 17 00:00:00 2001 From: ofava Date: Fri, 31 Oct 2025 12:46:00 +0100 Subject: [PATCH 01/93] Cleanup --- frontend/src/utils/customTheme/customTheme.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/frontend/src/utils/customTheme/customTheme.ts b/frontend/src/utils/customTheme/customTheme.ts index 5ad20e380..2a7cd0ba1 100644 --- a/frontend/src/utils/customTheme/customTheme.ts +++ b/frontend/src/utils/customTheme/customTheme.ts @@ -1,6 +1,5 @@ import { createTheme } from '@mui/material'; -// Material Design Color Palette const colors = { // Primary colors primary: '#3E007E', @@ -58,7 +57,6 @@ const colors = { darkGrey: '#202124', } as const; -// Typography const fonts = { family: ['system-ui', 'ui-sans-serif', 'Inter', 'Marker Felt', 'Trebuchet MS'].join(','), } as const; @@ -98,7 +96,6 @@ const customTheme = createTheme({ divider: colors.outline, }, components: { - // AppBar overrides MuiAppBar: { styleOverrides: { root: { @@ -107,7 +104,6 @@ const customTheme = createTheme({ }, }, }, - // Paper overrides MuiPaper: { styleOverrides: { root: { @@ -116,7 +112,6 @@ const customTheme = createTheme({ }, }, }, - // TextField overrides MuiTextField: { styleOverrides: { root: { @@ -134,7 +129,6 @@ const customTheme = createTheme({ }, }, }, - // Tooltip overrides MuiTooltip: { styleOverrides: { tooltip: { @@ -151,5 +145,4 @@ const customTheme = createTheme({ export default customTheme; -// Export colors and utilities for use in other files export { colors, fonts }; From 8d06d93c290a500798858323bf1abaaa159028ab Mon Sep 17 00:00:00 2001 From: ofava Date: Tue, 4 Nov 2025 09:26:55 +0100 Subject: [PATCH 02/93] Refactor UI components for improved layout and styling; update welcome titles in localization files --- frontend/src/components/Banner/Banner.tsx | 27 +++++++---- .../RoomJoinContainer/RoomJoinContainer.tsx | 18 ++++--- frontend/src/locales/en.json | 2 +- frontend/src/locales/es-MX.json | 2 +- frontend/src/locales/es.json | 2 +- frontend/src/locales/it.json | 2 +- .../src/pages/LandingPage/LandingPage.tsx | 47 ++++++++++++++++--- frontend/src/utils/customTheme/customTheme.ts | 12 ++++- 8 files changed, 86 insertions(+), 26 deletions(-) diff --git a/frontend/src/components/Banner/Banner.tsx b/frontend/src/components/Banner/Banner.tsx index ea74d41e4..5ff29b08d 100644 --- a/frontend/src/components/Banner/Banner.tsx +++ b/frontend/src/components/Banner/Banner.tsx @@ -1,4 +1,5 @@ import { ReactElement } from 'react'; +import { AppBar, Toolbar, Box, Stack } from '@mui/material'; import BannerDateTime from '../BannerDateTime'; import BannerLinks from '../BannerLinks'; import BannerLogo from '../BannerLogo'; @@ -12,15 +13,25 @@ import BannerLanguage from '../BannerLanguage'; */ const Banner = (): ReactElement => { return ( -
- + + + + + -
- - - -
-
+ + + + + + + ); }; diff --git a/frontend/src/components/RoomJoinContainer/RoomJoinContainer.tsx b/frontend/src/components/RoomJoinContainer/RoomJoinContainer.tsx index b17c2677d..ff82fa61b 100644 --- a/frontend/src/components/RoomJoinContainer/RoomJoinContainer.tsx +++ b/frontend/src/components/RoomJoinContainer/RoomJoinContainer.tsx @@ -1,5 +1,6 @@ import { useNavigate } from 'react-router-dom'; import { ReactElement } from 'react'; +import { Box } from '@mui/material'; import generateRoomName from '../../utils/generateRoomName'; import NewRoomButton from '../NewRoomButton'; import JoinContainerSeparator from '../JoinContainerSeparator'; @@ -15,20 +16,25 @@ const RoomJoinContainer = (): ReactElement => { const navigate = useNavigate(); const randomRoom = generateRoomName(); - // After a room is created, the user is redirected to a waiting room - // where they have an option to pick their devices, add their name, and join the meeting room const handleNewRoom = () => { navigate(`/waiting-room/${randomRoom}`); }; return ( -
+ - - -
+ ); }; diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index bba47158b..b3c7ab848 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -132,7 +132,7 @@ "goodbye.default.header": "You left the room", "goodbye.default.message": "We hope you had fun", "landing.welcome.subtitle": "Create a new room or join an existing one.", - "landing.welcome.title": "Welcome to the Vonage Video React App", + "landing.welcome.title": "Upgrade video communication", "layout.tooltip.isPinningPresent": "Cannot switch layout while a participant is pinned", "layout.tooltip.isScreenSharePresent": "Cannot switch layout while screen share is active", "layout.tooltip.switchToActiveSpeaker": "Switch to Active Speaker layout", diff --git a/frontend/src/locales/es-MX.json b/frontend/src/locales/es-MX.json index c062b8971..5b1fd8914 100644 --- a/frontend/src/locales/es-MX.json +++ b/frontend/src/locales/es-MX.json @@ -130,7 +130,7 @@ "goodbye.default.header": "Saliste de la sala", "goodbye.default.message": "Esperamos que la hayas pasado bien", "landing.welcome.subtitle": "Crea una sala nueva o únete a una ya existente.", - "landing.welcome.title": "Bienvenido a la app Vonage Video React", + "landing.welcome.title": "Mejora la comunicación por video", "layout.tooltip.isPinningPresent": "No se puede cambiar el diseño mientras alguien esté fijado", "layout.tooltip.isScreenSharePresent": "No se puede cambiar el diseño mientras se comparte pantalla", "layout.tooltip.switchToActiveSpeaker": "Cambiar a vista de orador activo", diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index aea7ba86f..1aac14151 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -130,7 +130,7 @@ "goodbye.default.header": "Saliste de la sala", "goodbye.default.message": "Esperamos que te hayas divertido", "landing.welcome.subtitle": "Crea una sala nueva o únete a una existente.", - "landing.welcome.title": "Bienvenido a la aplicación Vonage Video React", + "landing.welcome.title": "Mejora la comunicación por video", "layout.tooltip.isPinningPresent": "No se puede cambiar el diseño mientras un participante está fijado", "layout.tooltip.isScreenSharePresent": "No se puede cambiar el diseño mientras se comparte pantalla", "layout.tooltip.switchToActiveSpeaker": "Cambiar al diseño de orador activo", diff --git a/frontend/src/locales/it.json b/frontend/src/locales/it.json index 82e710f2a..f6383c614 100644 --- a/frontend/src/locales/it.json +++ b/frontend/src/locales/it.json @@ -130,7 +130,7 @@ "goodbye.default.header": "Hai lasciato la stanza", "goodbye.default.message": "Speriamo che ti sia divertito", "landing.welcome.subtitle": "Crea una nuova riunione o unisciti ad una esistente.", - "landing.welcome.title": "Benvenuto in Vonage Video React App", + "landing.welcome.title": "Migliora la comunicazione video", "layout.tooltip.isPinningPresent": "Impossibile cambiare layout mentre un partecipante è fissato", "layout.tooltip.isScreenSharePresent": "Impossibile cambiare il layout mentre è attiva la condivisione dello schermo", "layout.tooltip.switchToActiveSpeaker": "Passa al layout Oratore in evidenza", diff --git a/frontend/src/pages/LandingPage/LandingPage.tsx b/frontend/src/pages/LandingPage/LandingPage.tsx index bf0993919..ac1b9e386 100644 --- a/frontend/src/pages/LandingPage/LandingPage.tsx +++ b/frontend/src/pages/LandingPage/LandingPage.tsx @@ -1,4 +1,5 @@ import { ReactElement } from 'react'; +import { Box, Stack } from '@mui/material'; import Banner from '../../components/Banner'; import LandingPageWelcome from '../../components/LandingPageWelcome'; import RoomJoinContainer from '../../components/RoomJoinContainer'; @@ -16,15 +17,49 @@ import RoomJoinContainer from '../../components/RoomJoinContainer'; */ const LandingPage = (): ReactElement => { return ( -
+ -
- + + + + - -
-
+ + + + + ); }; diff --git a/frontend/src/utils/customTheme/customTheme.ts b/frontend/src/utils/customTheme/customTheme.ts index 2a7cd0ba1..bfd8b2f59 100644 --- a/frontend/src/utils/customTheme/customTheme.ts +++ b/frontend/src/utils/customTheme/customTheme.ts @@ -3,7 +3,7 @@ import { createTheme } from '@mui/material'; const colors = { // Primary colors primary: '#3E007E', - primaryLight: '#9575CD', + primaryLight: '#f3e9ff', primaryHover: '#3E007E2F', onPrimary: '#FFFFFF', primaryContainer: '#6300C4', @@ -68,7 +68,7 @@ const customTheme = createTheme({ main: colors.primary, contrastText: colors.onPrimary, dark: colors.primaryContainer, - light: colors.surfaceTint, + light: colors.primaryLight, }, secondary: { main: colors.secondary, @@ -96,6 +96,14 @@ const customTheme = createTheme({ divider: colors.outline, }, components: { + MuiToolbar: { + styleOverrides: { + root: { + paddingLeft: '0 !important', + paddingRight: '0 !important', + }, + }, + }, MuiAppBar: { styleOverrides: { root: { From ef8bb8d88301bc0654faf898d18d3bdcaca25f57 Mon Sep 17 00:00:00 2001 From: ofava Date: Tue, 4 Nov 2025 10:18:39 +0100 Subject: [PATCH 03/93] Update LandingPageWelcome component layout and styling; modify welcome subtitles in localization files --- .../LandingPageWelcome/LandingPageWelcome.tsx | 62 +++++++++++++++++-- frontend/src/locales/en.json | 2 +- frontend/src/locales/es-MX.json | 2 +- frontend/src/locales/es.json | 2 +- frontend/src/locales/it.json | 2 +- frontend/src/utils/customTheme/customTheme.ts | 2 +- 6 files changed, 62 insertions(+), 10 deletions(-) diff --git a/frontend/src/components/LandingPageWelcome/LandingPageWelcome.tsx b/frontend/src/components/LandingPageWelcome/LandingPageWelcome.tsx index 6eb81134e..725a2a183 100644 --- a/frontend/src/components/LandingPageWelcome/LandingPageWelcome.tsx +++ b/frontend/src/components/LandingPageWelcome/LandingPageWelcome.tsx @@ -1,5 +1,6 @@ -import { ReactElement } from 'react'; +import { ReactElement, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; +import { Box, Typography, useTheme, useMediaQuery } from '@mui/material'; /** * LandingPageWelcome Component @@ -8,12 +9,63 @@ import { useTranslation } from 'react-i18next'; */ const LandingPageWelcome = (): ReactElement => { const { t } = useTranslation(); + const theme = useTheme(); + const isSmUp = useMediaQuery(theme.breakpoints.up('sm')); + const title = t('landing.welcome.title'); + const words = useMemo(() => title.split(' '), [title]); return ( -
-

{t('landing.welcome.title')}

-

{t('landing.welcome.subtitle')}

-
+ + + {words.map((word, index) => ( + + {word} + + ))} + + + {isSmUp && ( + + {t('landing.welcome.subtitle')} + + )} + ); }; diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index b3c7ab848..a99008a75 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -131,7 +131,7 @@ "goodBye.reEnter": "Re-enter", "goodbye.default.header": "You left the room", "goodbye.default.message": "We hope you had fun", - "landing.welcome.subtitle": "Create a new room or join an existing one.", + "landing.welcome.subtitle": "Power your business with video that transforms customer satisfaction.", "landing.welcome.title": "Upgrade video communication", "layout.tooltip.isPinningPresent": "Cannot switch layout while a participant is pinned", "layout.tooltip.isScreenSharePresent": "Cannot switch layout while screen share is active", diff --git a/frontend/src/locales/es-MX.json b/frontend/src/locales/es-MX.json index 5b1fd8914..b2cf349b1 100644 --- a/frontend/src/locales/es-MX.json +++ b/frontend/src/locales/es-MX.json @@ -129,7 +129,7 @@ "goodBye.reEnter": "Volver a entrar", "goodbye.default.header": "Saliste de la sala", "goodbye.default.message": "Esperamos que la hayas pasado bien", - "landing.welcome.subtitle": "Crea una sala nueva o únete a una ya existente.", + "landing.welcome.subtitle": "Impulsa tu negocio con videos que transforman la satisfacción del cliente.", "landing.welcome.title": "Mejora la comunicación por video", "layout.tooltip.isPinningPresent": "No se puede cambiar el diseño mientras alguien esté fijado", "layout.tooltip.isScreenSharePresent": "No se puede cambiar el diseño mientras se comparte pantalla", diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index 1aac14151..7dd0628d1 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -129,7 +129,7 @@ "goodBye.reEnter": "Volver a entrar", "goodbye.default.header": "Saliste de la sala", "goodbye.default.message": "Esperamos que te hayas divertido", - "landing.welcome.subtitle": "Crea una sala nueva o únete a una existente.", + "landing.welcome.subtitle": "Impulsa tu negocio con vídeos que transforman la satisfacción del cliente.", "landing.welcome.title": "Mejora la comunicación por video", "layout.tooltip.isPinningPresent": "No se puede cambiar el diseño mientras un participante está fijado", "layout.tooltip.isScreenSharePresent": "No se puede cambiar el diseño mientras se comparte pantalla", diff --git a/frontend/src/locales/it.json b/frontend/src/locales/it.json index f6383c614..e07d1c4fa 100644 --- a/frontend/src/locales/it.json +++ b/frontend/src/locales/it.json @@ -129,7 +129,7 @@ "goodBye.reEnter": "Rientra", "goodbye.default.header": "Hai lasciato la stanza", "goodbye.default.message": "Speriamo che ti sia divertito", - "landing.welcome.subtitle": "Crea una nuova riunione o unisciti ad una esistente.", + "landing.welcome.subtitle": "Potenzia la tua attività con video che trasformano la soddisfazione del cliente.", "landing.welcome.title": "Migliora la comunicazione video", "layout.tooltip.isPinningPresent": "Impossibile cambiare layout mentre un partecipante è fissato", "layout.tooltip.isScreenSharePresent": "Impossibile cambiare il layout mentre è attiva la condivisione dello schermo", diff --git a/frontend/src/utils/customTheme/customTheme.ts b/frontend/src/utils/customTheme/customTheme.ts index bfd8b2f59..d52542d80 100644 --- a/frontend/src/utils/customTheme/customTheme.ts +++ b/frontend/src/utils/customTheme/customTheme.ts @@ -2,7 +2,7 @@ import { createTheme } from '@mui/material'; const colors = { // Primary colors - primary: '#3E007E', + primary: '#871EFF', primaryLight: '#f3e9ff', primaryHover: '#3E007E2F', onPrimary: '#FFFFFF', From e4d69d21a539b843f35e6aab0fb6cf505d30cff4 Mon Sep 17 00:00:00 2001 From: ofava Date: Tue, 4 Nov 2025 16:26:25 +0100 Subject: [PATCH 04/93] Wrap MUI components + use wrapped components + add standard layout to the main pages --- frontend/src/components/Banner/Banner.tsx | 4 +- .../src/components/JoinButton/JoinButton.tsx | 2 +- .../LandingPageWelcome/LandingPageWelcome.tsx | 4 +- .../NewRoomButton/NewRoomButton.tsx | 2 +- .../RoomJoinContainer/RoomJoinContainer.tsx | 2 +- frontend/src/pages/GeneralLayout.tsx | 54 +++++++++++++++++ frontend/src/pages/GoodBye/GoodBye.tsx | 29 +++------ .../src/pages/LandingPage/LandingPage.tsx | 49 +-------------- .../UnsupportedBrowserPage.tsx | 11 +--- .../src/pages/WaitingRoom/WaitingRoom.tsx | 59 +++++++++---------- frontend/tsconfig.json | 6 +- frontend/ui/Box/Box.spec.tsx | 12 ++++ frontend/ui/Box/Box.story.tsx | 0 frontend/ui/Box/Box.tsx | 9 +++ frontend/ui/Box/index.ts | 2 + frontend/ui/Button/Button.spec.tsx | 12 ++++ frontend/ui/Button/Button.story.tsx | 14 +++++ frontend/ui/Button/Button.tsx | 9 +++ frontend/ui/Button/index.ts | 2 + frontend/ui/Stack/Stack.spec.tsx | 12 ++++ frontend/ui/Stack/Stack.story.tsx | 0 frontend/ui/Stack/Stack.tsx | 9 +++ frontend/ui/Stack/index.ts | 2 + frontend/ui/Typography/Typography.spec.tsx | 12 ++++ frontend/ui/Typography/Typography.story.tsx | 0 frontend/ui/Typography/Typography.tsx | 9 +++ frontend/ui/Typography/index.ts | 2 + frontend/vite.config.ts | 1 + 28 files changed, 216 insertions(+), 113 deletions(-) create mode 100644 frontend/src/pages/GeneralLayout.tsx create mode 100644 frontend/ui/Box/Box.spec.tsx create mode 100644 frontend/ui/Box/Box.story.tsx create mode 100644 frontend/ui/Box/Box.tsx create mode 100644 frontend/ui/Box/index.ts create mode 100644 frontend/ui/Button/Button.spec.tsx create mode 100644 frontend/ui/Button/Button.story.tsx create mode 100644 frontend/ui/Button/Button.tsx create mode 100644 frontend/ui/Button/index.ts create mode 100644 frontend/ui/Stack/Stack.spec.tsx create mode 100644 frontend/ui/Stack/Stack.story.tsx create mode 100644 frontend/ui/Stack/Stack.tsx create mode 100644 frontend/ui/Stack/index.ts create mode 100644 frontend/ui/Typography/Typography.spec.tsx create mode 100644 frontend/ui/Typography/Typography.story.tsx create mode 100644 frontend/ui/Typography/Typography.tsx create mode 100644 frontend/ui/Typography/index.ts diff --git a/frontend/src/components/Banner/Banner.tsx b/frontend/src/components/Banner/Banner.tsx index 5ff29b08d..1d6b391b2 100644 --- a/frontend/src/components/Banner/Banner.tsx +++ b/frontend/src/components/Banner/Banner.tsx @@ -1,5 +1,7 @@ import { ReactElement } from 'react'; -import { AppBar, Toolbar, Box, Stack } from '@mui/material'; +import { AppBar, Toolbar } from '@mui/material'; +import Box from '@ui/Box'; +import Stack from '@ui/Stack'; import BannerDateTime from '../BannerDateTime'; import BannerLinks from '../BannerLinks'; import BannerLogo from '../BannerLogo'; diff --git a/frontend/src/components/JoinButton/JoinButton.tsx b/frontend/src/components/JoinButton/JoinButton.tsx index b0d525b13..cb9190428 100644 --- a/frontend/src/components/JoinButton/JoinButton.tsx +++ b/frontend/src/components/JoinButton/JoinButton.tsx @@ -1,4 +1,4 @@ -import { Button } from '@mui/material'; +import Button from '@ui/Button'; import { MouseEvent, ReactElement } from 'react'; import { useTranslation } from 'react-i18next'; import { useNavigate } from 'react-router-dom'; diff --git a/frontend/src/components/LandingPageWelcome/LandingPageWelcome.tsx b/frontend/src/components/LandingPageWelcome/LandingPageWelcome.tsx index 725a2a183..19e138eac 100644 --- a/frontend/src/components/LandingPageWelcome/LandingPageWelcome.tsx +++ b/frontend/src/components/LandingPageWelcome/LandingPageWelcome.tsx @@ -1,6 +1,8 @@ import { ReactElement, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; -import { Box, Typography, useTheme, useMediaQuery } from '@mui/material'; +import { useTheme, useMediaQuery } from '@mui/material'; +import Box from '@ui/Box'; +import Typography from '@ui/Typography'; /** * LandingPageWelcome Component diff --git a/frontend/src/components/NewRoomButton/NewRoomButton.tsx b/frontend/src/components/NewRoomButton/NewRoomButton.tsx index 0f2fe11b8..f6ea085d2 100644 --- a/frontend/src/components/NewRoomButton/NewRoomButton.tsx +++ b/frontend/src/components/NewRoomButton/NewRoomButton.tsx @@ -1,4 +1,4 @@ -import { Button } from '@mui/material'; +import Button from '@ui/Button'; import { VideoCall } from '@mui/icons-material'; import { ReactElement } from 'react'; import { useTranslation } from 'react-i18next'; diff --git a/frontend/src/components/RoomJoinContainer/RoomJoinContainer.tsx b/frontend/src/components/RoomJoinContainer/RoomJoinContainer.tsx index ff82fa61b..de9ac3a27 100644 --- a/frontend/src/components/RoomJoinContainer/RoomJoinContainer.tsx +++ b/frontend/src/components/RoomJoinContainer/RoomJoinContainer.tsx @@ -1,6 +1,6 @@ import { useNavigate } from 'react-router-dom'; import { ReactElement } from 'react'; -import { Box } from '@mui/material'; +import Box from '@ui/Box'; import generateRoomName from '../../utils/generateRoomName'; import NewRoomButton from '../NewRoomButton'; import JoinContainerSeparator from '../JoinContainerSeparator'; diff --git a/frontend/src/pages/GeneralLayout.tsx b/frontend/src/pages/GeneralLayout.tsx new file mode 100644 index 000000000..e87495d4e --- /dev/null +++ b/frontend/src/pages/GeneralLayout.tsx @@ -0,0 +1,54 @@ +import Banner from '@components/Banner'; +import Box from '@ui/Box'; +import Stack from '@ui/Stack'; +import { ReactNode } from 'react'; + +const GeneralLayout = ({ leftSide, rightSide }: { leftSide: ReactNode; rightSide: ReactNode }) => { + return ( + + + + + + {leftSide} + + + + {rightSide} + + + + ); +}; + +export default GeneralLayout; diff --git a/frontend/src/pages/GoodBye/GoodBye.tsx b/frontend/src/pages/GoodBye/GoodBye.tsx index 0669bea1f..b50555140 100644 --- a/frontend/src/pages/GoodBye/GoodBye.tsx +++ b/frontend/src/pages/GoodBye/GoodBye.tsx @@ -1,7 +1,7 @@ import { useLocation } from 'react-router-dom'; import { ReactElement } from 'react'; import { useTranslation } from 'react-i18next'; -import Banner from '../../components/Banner'; +import GeneralLayout from '@pages/GeneralLayout'; import useArchives from '../../hooks/useArchives'; import ArchiveList from '../../components/GoodBye/ArchiveList'; import GoodByeMessage from '../../components/GoodBye/GoodbyeMessage'; @@ -19,7 +19,6 @@ import useRoomName from '../../hooks/useRoomName'; */ const GoodBye = (): ReactElement => { const { t } = useTranslation(); - const width = window.innerWidth < 800 ? '100%' : '800px'; const location = useLocation(); const roomName = useRoomName({ useLocationState: true, @@ -29,25 +28,15 @@ const GoodBye = (): ReactElement => { const caption: string = location.state?.caption || t('goodbye.default.message'); return ( -
- -
-
-
- -
-
-

{t('archiveList.label')}

- -
+ } + rightSide={ +
+

{t('archiveList.label')}

+
-
-
+ } + /> ); }; diff --git a/frontend/src/pages/LandingPage/LandingPage.tsx b/frontend/src/pages/LandingPage/LandingPage.tsx index ac1b9e386..4890b35d8 100644 --- a/frontend/src/pages/LandingPage/LandingPage.tsx +++ b/frontend/src/pages/LandingPage/LandingPage.tsx @@ -1,6 +1,5 @@ import { ReactElement } from 'react'; -import { Box, Stack } from '@mui/material'; -import Banner from '../../components/Banner'; +import GeneralLayout from '@pages/GeneralLayout'; import LandingPageWelcome from '../../components/LandingPageWelcome'; import RoomJoinContainer from '../../components/RoomJoinContainer'; @@ -16,51 +15,7 @@ import RoomJoinContainer from '../../components/RoomJoinContainer'; * @returns {ReactElement} - The landing page. */ const LandingPage = (): ReactElement => { - return ( - - - - - - - - - - - - - - ); + return } rightSide={} />; }; export default LandingPage; diff --git a/frontend/src/pages/UnsupportedBrowserPage/UnsupportedBrowserPage.tsx b/frontend/src/pages/UnsupportedBrowserPage/UnsupportedBrowserPage.tsx index 361a69edc..ff6ebb141 100644 --- a/frontend/src/pages/UnsupportedBrowserPage/UnsupportedBrowserPage.tsx +++ b/frontend/src/pages/UnsupportedBrowserPage/UnsupportedBrowserPage.tsx @@ -1,5 +1,5 @@ import { ReactElement } from 'react'; -import Banner from '../../components/Banner'; +import GeneralLayout from '@pages/GeneralLayout'; import SupportedBrowsers from '../../components/UnsupportedBrowser/SupportedBrowsers'; import UnsupportedBrowserMessage from '../../components/UnsupportedBrowser/UnsupportedBrowserMessage'; @@ -14,14 +14,7 @@ import UnsupportedBrowserMessage from '../../components/UnsupportedBrowser/Unsup */ const UnsupportedBrowserPage = (): ReactElement => { return ( -
- - -
- - -
-
+ } rightSide={} /> ); }; diff --git a/frontend/src/pages/WaitingRoom/WaitingRoom.tsx b/frontend/src/pages/WaitingRoom/WaitingRoom.tsx index 284630350..7399a1db3 100644 --- a/frontend/src/pages/WaitingRoom/WaitingRoom.tsx +++ b/frontend/src/pages/WaitingRoom/WaitingRoom.tsx @@ -1,11 +1,12 @@ import { useState, useEffect, MouseEvent, ReactElement, TouchEvent } from 'react'; +import Box from '@ui/Box'; +import GeneralLayout from '@pages/GeneralLayout'; import usePreviewPublisherContext from '../../hooks/usePreviewPublisherContext'; import ControlPanel from '../../components/WaitingRoom/ControlPanel'; import VideoContainer from '../../components/WaitingRoom/VideoContainer'; import UsernameInput from '../../components/WaitingRoom/UserNameInput'; import { DEVICE_ACCESS_STATUS } from '../../utils/constants'; import DeviceAccessAlert from '../../components/DeviceAccessAlert'; -import Banner from '../../components/Banner'; import { getStorageItem, STORAGE_KEYS } from '../../utils/storage'; import useIsSmallViewport from '../../hooks/useIsSmallViewport'; import useBackgroundPublisherContext from '../../hooks/useBackgroundPublisherContext'; @@ -93,36 +94,34 @@ const WaitingRoom = (): ReactElement => { }; return ( -
- -
-
-
-
- - {accessStatus === DEVICE_ACCESS_STATUS.ACCEPTED && ( - - )} -
- + + + + {accessStatus === DEVICE_ACCESS_STATUS.ACCEPTED && ( + + )}
-
- {accessStatus !== DEVICE_ACCESS_STATUS.ACCEPTED && ( - - )} -
-
+ } + rightSide={} + /> + + {accessStatus !== DEVICE_ACCESS_STATUS.ACCEPTED && ( + + )} + ); }; diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index c3524e778..89d018b2b 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -28,17 +28,19 @@ "@tests/*": ["./src/tests/*"], "@app-types/*": ["./src/types/*"], "@utils/*": ["./src/utils/*"], - "@test/*": ["./src/test/*"] + "@test/*": ["./src/test/*"], + "@ui/*": ["./ui/*"] } }, "include": [ + "./ui", "./src", "./src/types", "src/pages", "src/helpers", "./.eslintrc.cjs", "**/*.spec.ts", - "**/*.spec.tsx" + "**/*.spec.tsx", ], "exclude": ["./node_modules", "./vite.config.ts"], "references": [{ "path": "./tsconfig.node.json" }] diff --git a/frontend/ui/Box/Box.spec.tsx b/frontend/ui/Box/Box.spec.tsx new file mode 100644 index 000000000..4bcd6976b --- /dev/null +++ b/frontend/ui/Box/Box.spec.tsx @@ -0,0 +1,12 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import Box from './Box'; + +describe('Box', () => { + it('renders correctly', () => { + render(Box content); + + const box = screen.getByRole('Box', { name: 'Box content' }); + expect(box).toBeInTheDocument(); + }); +}); diff --git a/frontend/ui/Box/Box.story.tsx b/frontend/ui/Box/Box.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/Box/Box.tsx b/frontend/ui/Box/Box.tsx new file mode 100644 index 000000000..1d7c295b6 --- /dev/null +++ b/frontend/ui/Box/Box.tsx @@ -0,0 +1,9 @@ +import { Box as MUIBox, BoxProps as MUIBoxProps } from '@mui/material'; + +type BoxProps = MUIBoxProps & {}; + +const Box = ({ ...boxProps }: BoxProps) => { + return ; +}; + +export default Box; diff --git a/frontend/ui/Box/index.ts b/frontend/ui/Box/index.ts new file mode 100644 index 000000000..15042ad93 --- /dev/null +++ b/frontend/ui/Box/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './Box'; diff --git a/frontend/ui/Button/Button.spec.tsx b/frontend/ui/Button/Button.spec.tsx new file mode 100644 index 000000000..3405c1651 --- /dev/null +++ b/frontend/ui/Button/Button.spec.tsx @@ -0,0 +1,12 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import Button from './Button'; + +describe('Button', () => { + it('renders correctly', () => { + render(); + + const button = screen.getByRole('button', { name: 'Click me' }); + expect(button).toBeInTheDocument(); + }); +}); diff --git a/frontend/ui/Button/Button.story.tsx b/frontend/ui/Button/Button.story.tsx new file mode 100644 index 000000000..8284795e7 --- /dev/null +++ b/frontend/ui/Button/Button.story.tsx @@ -0,0 +1,14 @@ +/* import type { StoryObj } from '@storybook/react'; +import Button from './Button'; + +type Story = StoryObj; +export const Primary: Story = { + args: { + label: 'Click Me', + }, +}; +export const Secondary: Story = { + args: { + label: 'Cancel', + }, +}; */ diff --git a/frontend/ui/Button/Button.tsx b/frontend/ui/Button/Button.tsx new file mode 100644 index 000000000..bb83113e1 --- /dev/null +++ b/frontend/ui/Button/Button.tsx @@ -0,0 +1,9 @@ +import { Button as MUIButton, ButtonProps as MUIButtonProps } from '@mui/material'; + +type ButtonProps = MUIButtonProps & {}; + +const Button = ({ ...buttonProps }: ButtonProps) => { + return ; +}; + +export default Button; diff --git a/frontend/ui/Button/index.ts b/frontend/ui/Button/index.ts new file mode 100644 index 000000000..c24255589 --- /dev/null +++ b/frontend/ui/Button/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './Button'; diff --git a/frontend/ui/Stack/Stack.spec.tsx b/frontend/ui/Stack/Stack.spec.tsx new file mode 100644 index 000000000..5e75c0650 --- /dev/null +++ b/frontend/ui/Stack/Stack.spec.tsx @@ -0,0 +1,12 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import Stack from './Stack'; + +describe('Stack', () => { + it('renders correctly', () => { + render(Stack content); + + const stack = screen.getByRole('Stack', { name: 'Stack content' }); + expect(stack).toBeInTheDocument(); + }); +}); diff --git a/frontend/ui/Stack/Stack.story.tsx b/frontend/ui/Stack/Stack.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/Stack/Stack.tsx b/frontend/ui/Stack/Stack.tsx new file mode 100644 index 000000000..919fb3d2b --- /dev/null +++ b/frontend/ui/Stack/Stack.tsx @@ -0,0 +1,9 @@ +import { Stack as MUIStack, StackProps as MUIStackProps } from '@mui/material'; + +type StackProps = MUIStackProps & {}; + +const Stack = ({ ...stackProps }: StackProps) => { + return ; +}; + +export default Stack; diff --git a/frontend/ui/Stack/index.ts b/frontend/ui/Stack/index.ts new file mode 100644 index 000000000..5d0d258d5 --- /dev/null +++ b/frontend/ui/Stack/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './Stack'; diff --git a/frontend/ui/Typography/Typography.spec.tsx b/frontend/ui/Typography/Typography.spec.tsx new file mode 100644 index 000000000..df3675b85 --- /dev/null +++ b/frontend/ui/Typography/Typography.spec.tsx @@ -0,0 +1,12 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import Typography from './Typography'; + +describe('Typography', () => { + it('renders correctly', () => { + render(Typography content); + + const typography = screen.getByRole('Typography', { name: 'Typography content' }); + expect(typography).toBeInTheDocument(); + }); +}); diff --git a/frontend/ui/Typography/Typography.story.tsx b/frontend/ui/Typography/Typography.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/Typography/Typography.tsx b/frontend/ui/Typography/Typography.tsx new file mode 100644 index 000000000..ebccf47a9 --- /dev/null +++ b/frontend/ui/Typography/Typography.tsx @@ -0,0 +1,9 @@ +import { Typography as MUITypography, TypographyProps as MUITypographyProps } from '@mui/material'; + +type TypographyProps = MUITypographyProps & {}; + +const Typography = ({ ...typographyProps }: TypographyProps) => { + return ; +}; + +export default Typography; diff --git a/frontend/ui/Typography/index.ts b/frontend/ui/Typography/index.ts new file mode 100644 index 000000000..d7d299c20 --- /dev/null +++ b/frontend/ui/Typography/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './Typography'; diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 65584ac91..793682162 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -61,6 +61,7 @@ export default defineConfig(({ mode }) => { '@app-types': '/src/types', '@utils': '/src/utils', '@test': '/src/test', + '@ui': '/ui', }, }, }); From 00756d16ca893c7b29f17626494bc2774ca81766 Mon Sep 17 00:00:00 2001 From: ofava Date: Wed, 5 Nov 2025 16:43:28 +0100 Subject: [PATCH 05/93] Avoid using useTheme to use theme as param in sx + add new MUI wrappers in UI + Adapt UI/UX of Join/Start meeting --- frontend/src/components/Banner/Banner.tsx | 2 +- .../src/components/BannerLogo/BannerLogo.tsx | 4 + .../src/components/JoinButton/JoinButton.tsx | 4 +- .../JoinContainerSeparator.tsx | 5 +- .../JoinExistingRoom/JoinExistingRoom.tsx | 11 +- .../LandingPageWelcome/LandingPageWelcome.tsx | 33 +- .../DeviceSettingsMenu/DeviceSettingsMenu.tsx | 11 +- .../EmojiGrid/EmojiGridDesktop.tsx | 9 +- .../NewRoomButton/NewRoomButton.tsx | 17 +- .../RoomJoinContainer/RoomJoinContainer.tsx | 21 +- .../RoomNameInput/RoomNameInput.tsx | 9 +- .../src/components/Separator/Separator.tsx | 10 +- frontend/src/locales/en.json | 4 +- frontend/src/locales/es-MX.json | 4 +- frontend/src/locales/es.json | 4 +- frontend/src/locales/it.json | 4 +- frontend/src/pages/GeneralLayout.tsx | 3 +- frontend/src/utils/customTheme/customTheme.ts | 62 +++- .../ui/InputAdornment/InputAdornment.spec.tsx | 12 + .../InputAdornment/InputAdornment.story.tsx | 0 frontend/ui/InputAdornment/InputAdornment.tsx | 12 + frontend/ui/InputAdornment/index.ts | 2 + frontend/ui/TextField/TextField.spec.tsx | 12 + frontend/ui/TextField/TextField.story.tsx | 0 frontend/ui/TextField/TextField.tsx | 9 + frontend/ui/TextField/index.ts | 2 + yarn.lock | 336 +++++++++--------- 27 files changed, 358 insertions(+), 244 deletions(-) create mode 100644 frontend/ui/InputAdornment/InputAdornment.spec.tsx create mode 100644 frontend/ui/InputAdornment/InputAdornment.story.tsx create mode 100644 frontend/ui/InputAdornment/InputAdornment.tsx create mode 100644 frontend/ui/InputAdornment/index.ts create mode 100644 frontend/ui/TextField/TextField.spec.tsx create mode 100644 frontend/ui/TextField/TextField.story.tsx create mode 100644 frontend/ui/TextField/TextField.tsx create mode 100644 frontend/ui/TextField/index.ts diff --git a/frontend/src/components/Banner/Banner.tsx b/frontend/src/components/Banner/Banner.tsx index 1d6b391b2..c41ca18b1 100644 --- a/frontend/src/components/Banner/Banner.tsx +++ b/frontend/src/components/Banner/Banner.tsx @@ -16,7 +16,7 @@ import BannerLanguage from '../BannerLanguage'; const Banner = (): ReactElement => { return ( - + diff --git a/frontend/src/components/BannerLogo/BannerLogo.tsx b/frontend/src/components/BannerLogo/BannerLogo.tsx index 2c7323ee6..2df4f85fe 100644 --- a/frontend/src/components/BannerLogo/BannerLogo.tsx +++ b/frontend/src/components/BannerLogo/BannerLogo.tsx @@ -11,6 +11,10 @@ const BannerLogo = (): ReactElement => (
Vonage-desktop-logo return ( ); }; diff --git a/frontend/src/components/RoomJoinContainer/RoomJoinContainer.tsx b/frontend/src/components/RoomJoinContainer/RoomJoinContainer.tsx index de9ac3a27..8aa315e5a 100644 --- a/frontend/src/components/RoomJoinContainer/RoomJoinContainer.tsx +++ b/frontend/src/components/RoomJoinContainer/RoomJoinContainer.tsx @@ -1,6 +1,8 @@ import { useNavigate } from 'react-router-dom'; import { ReactElement } from 'react'; import Box from '@ui/Box'; +import Typography from '@ui/Typography'; +import { useTranslation } from 'react-i18next'; import generateRoomName from '../../utils/generateRoomName'; import NewRoomButton from '../NewRoomButton'; import JoinContainerSeparator from '../JoinContainerSeparator'; @@ -13,6 +15,7 @@ import JoinExistingRoom from '../JoinExistingRoom'; * @returns {ReactElement} The room join container component. */ const RoomJoinContainer = (): ReactElement => { + const { t } = useTranslation(); const navigate = useNavigate(); const randomRoom = generateRoomName(); @@ -22,18 +25,26 @@ const RoomJoinContainer = (): ReactElement => { return ( ({ maxWidth: { xs: '100%', md: '500px' }, flex: 1, display: 'flex', flexDirection: 'column', - alignItems: 'center', + alignItems: 'start', bgcolor: { xs: 'background.paper', md: 'background.default' }, - }} + padding: { xs: '0px', md: '80px 40px' }, + borderRadius: theme.shape.borderRadius, + })} > - - + + {t('button.joinExistingMeeting')} + + + + {t('button.startNewRoom')} + + ); }; diff --git a/frontend/src/components/RoomNameInput/RoomNameInput.tsx b/frontend/src/components/RoomNameInput/RoomNameInput.tsx index 8aa4dac97..211fe2c41 100644 --- a/frontend/src/components/RoomNameInput/RoomNameInput.tsx +++ b/frontend/src/components/RoomNameInput/RoomNameInput.tsx @@ -1,7 +1,8 @@ import { SetStateAction, Dispatch, ReactElement, ChangeEvent } from 'react'; -import { InputAdornment, TextField } from '@mui/material'; -import { Keyboard } from '@mui/icons-material'; import { useTranslation } from 'react-i18next'; +import VividIcon from '@components/VividIcon'; +import TextField from '@ui/TextField'; +import InputAdornment from '@ui/InputAdornment'; import isValidRoomName from '../../utils/isValidRoomName'; export type RoomNameInputProps = { @@ -49,7 +50,7 @@ const RoomNameInput = ({ return ( - + ), }} diff --git a/frontend/src/components/Separator/Separator.tsx b/frontend/src/components/Separator/Separator.tsx index 9aaa89043..5203f4901 100644 --- a/frontend/src/components/Separator/Separator.tsx +++ b/frontend/src/components/Separator/Separator.tsx @@ -1,3 +1,4 @@ +import Box from '@ui/Box'; import { ReactElement } from 'react'; export type SeparatorProps = { @@ -14,9 +15,14 @@ export type SeparatorProps = { */ const Separator = ({ orientation = 'left' }: SeparatorProps): ReactElement => { return ( -
({ + width: '50%', + borderBottom: '2px solid', + borderColor: theme.palette.divider, + ...(orientation === 'left' ? { marginRight: 1 } : { marginLeft: 1 }), + })} /> ); }; diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index a99008a75..c9bf6f1bc 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -43,7 +43,9 @@ "button.camera": "Camera", "button.cancel": "Cancel", "button.close": "Close", - "button.createRoom": "Create room", + "button.createRoom": "Create a new room", + "button.startNewRoom": "Start a new video call", + "button.joinExistingMeeting": "Join existing meeting", "button.join": "Join", "button.mute": "Mute", "button.send": "Send", diff --git a/frontend/src/locales/es-MX.json b/frontend/src/locales/es-MX.json index b2cf349b1..569ee6f24 100644 --- a/frontend/src/locales/es-MX.json +++ b/frontend/src/locales/es-MX.json @@ -43,7 +43,9 @@ "button.camera": "Cámara", "button.cancel": "Cancelar", "button.close": "Cerrar", - "button.createRoom": "Crear sala", + "button.createRoom": "Crear una nueva sala", + "button.startNewRoom": "Iniciar una nueva videollamada", + "button.joinExistingMeeting": "Unirse a una reunión existente", "button.join": "Unirse", "button.mute": "Silenciar", "button.send": "Enviar", diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index 7dd0628d1..95a1fb711 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -43,7 +43,9 @@ "button.camera": "Cámara", "button.cancel": "Cancelar", "button.close": "Cerrar", - "button.createRoom": "Crear sala", + "button.createRoom": "Crear una nueva sala", + "button.startNewRoom": "Iniciar una nueva videollamada", + "button.joinExistingMeeting": "Unirse a una reunión existente", "button.join": "Unirse", "button.mute": "Silenciar", "button.send": "Enviar", diff --git a/frontend/src/locales/it.json b/frontend/src/locales/it.json index e07d1c4fa..58a814889 100644 --- a/frontend/src/locales/it.json +++ b/frontend/src/locales/it.json @@ -43,7 +43,9 @@ "button.camera": "Camera", "button.cancel": "Annulla", "button.close": "Chiudi", - "button.createRoom": "Crea stanza", + "button.createRoom": "Crea una nuova stanza", + "button.startNewRoom": "Inizia una nuova videoconferenza", + "button.joinExistingMeeting": "Unisciti a una riunione esistente", "button.join": "Partecipa", "button.mute": "Disattiva audio", "button.send": "Invia", diff --git a/frontend/src/pages/GeneralLayout.tsx b/frontend/src/pages/GeneralLayout.tsx index e87495d4e..9dc8d64a9 100644 --- a/frontend/src/pages/GeneralLayout.tsx +++ b/frontend/src/pages/GeneralLayout.tsx @@ -17,6 +17,7 @@ const GeneralLayout = ({ leftSide, rightSide }: { leftSide: ReactNode; rightSide { + it('renders correctly', () => { + render(InputAdornment content); + + const inputAdornment = screen.getByRole('InputAdornment', { name: 'InputAdornment content' }); + expect(inputAdornment).toBeInTheDocument(); + }); +}); diff --git a/frontend/ui/InputAdornment/InputAdornment.story.tsx b/frontend/ui/InputAdornment/InputAdornment.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/InputAdornment/InputAdornment.tsx b/frontend/ui/InputAdornment/InputAdornment.tsx new file mode 100644 index 000000000..3f2917984 --- /dev/null +++ b/frontend/ui/InputAdornment/InputAdornment.tsx @@ -0,0 +1,12 @@ +import { + InputAdornment as MUIInputAdornment, + InputAdornmentProps as MUIInputAdornmentProps, +} from '@mui/material'; + +type InputAdornmentProps = MUIInputAdornmentProps & {}; + +const InputAdornment = ({ ...inputAdornmentProps }: InputAdornmentProps) => { + return ; +}; + +export default InputAdornment; diff --git a/frontend/ui/InputAdornment/index.ts b/frontend/ui/InputAdornment/index.ts new file mode 100644 index 000000000..fd6520e5b --- /dev/null +++ b/frontend/ui/InputAdornment/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './InputAdornment'; diff --git a/frontend/ui/TextField/TextField.spec.tsx b/frontend/ui/TextField/TextField.spec.tsx new file mode 100644 index 000000000..fda97a955 --- /dev/null +++ b/frontend/ui/TextField/TextField.spec.tsx @@ -0,0 +1,12 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import TextField from './TextField'; + +describe('TextField', () => { + it('renders correctly', () => { + render(TextField content); + + const textField = screen.getByRole('TextField', { name: 'TextField content' }); + expect(textField).toBeInTheDocument(); + }); +}); diff --git a/frontend/ui/TextField/TextField.story.tsx b/frontend/ui/TextField/TextField.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/TextField/TextField.tsx b/frontend/ui/TextField/TextField.tsx new file mode 100644 index 000000000..4f3f965d9 --- /dev/null +++ b/frontend/ui/TextField/TextField.tsx @@ -0,0 +1,9 @@ +import { TextField as MUITextField, TextFieldProps as MUITextFieldProps } from '@mui/material'; + +type TextFieldProps = MUITextFieldProps & {}; + +const TextField = ({ ...textFieldProps }: TextFieldProps) => { + return ; +}; + +export default TextField; diff --git a/frontend/ui/TextField/index.ts b/frontend/ui/TextField/index.ts new file mode 100644 index 000000000..082b0dc2a --- /dev/null +++ b/frontend/ui/TextField/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './TextField'; diff --git a/yarn.lock b/yarn.lock index 05a00ff7a..d24cb2e82 100644 --- a/yarn.lock +++ b/yarn.lock @@ -259,6 +259,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== +"@babel/helper-validator-identifier@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" + integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== + "@babel/helper-validator-option@^7.24.7": version "7.24.7" resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz" @@ -269,13 +274,13 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== -"@babel/helpers@^7.24.7", "@babel/helpers@^7.26.10": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.3.tgz#b83156c0a2232c133d1b535dd5d3452119c7e441" - integrity sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw== +"@babel/helpers@^7.24.7", "@babel/helpers@^7.26.10", "@babel/helpers@^7.27.0": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.4.tgz#fe07274742e95bdf7cf1443593eeb8926ab63827" + integrity sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w== dependencies: "@babel/template" "^7.27.2" - "@babel/types" "^7.28.2" + "@babel/types" "^7.28.4" "@babel/highlight@^7.24.7": version "7.24.7" @@ -425,10 +430,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.9", "@babel/runtime@^7.24.4", "@babel/runtime@^7.24.6", "@babel/runtime@^7.27.6", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.3.tgz#75c5034b55ba868121668be5d5bb31cc64e6e61a" - integrity sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA== +"@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.9", "@babel/runtime@^7.24.4", "@babel/runtime@^7.24.6", "@babel/runtime@^7.26.10", "@babel/runtime@^7.27.6", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.4.tgz#a70226016fabe25c5783b2f22d3e1c9bc5ca3326" + integrity sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ== "@babel/template@^7.24.7", "@babel/template@^7.3.3": version "7.24.7" @@ -520,6 +525,14 @@ "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" +"@babel/types@^7.28.4": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.5.tgz#10fc405f60897c35f07e85493c932c7b5ca0592b" + integrity sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.28.5" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" @@ -1818,105 +1831,115 @@ estree-walker "^2.0.2" picomatch "^2.3.1" -"@rollup/rollup-android-arm-eabi@4.43.0": - version "4.43.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.43.0.tgz#9241b59af721beb7e3587a56c6c245d6c465753d" - integrity sha512-Krjy9awJl6rKbruhQDgivNbD1WuLb8xAclM4IR4cN5pHGAs2oIMMQJEiC3IC/9TZJ+QZkmZhlMO/6MBGxPidpw== - -"@rollup/rollup-android-arm64@4.43.0": - version "4.43.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.43.0.tgz#f70ee53ba991fdd65c277b0716c559736d490a58" - integrity sha512-ss4YJwRt5I63454Rpj+mXCXicakdFmKnUNxr1dLK+5rv5FJgAxnN7s31a5VchRYxCFWdmnDWKd0wbAdTr0J5EA== - -"@rollup/rollup-darwin-arm64@4.43.0": - version "4.43.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.43.0.tgz#9f59000e817cf5760d87515ce899f8b93fe8756a" - integrity sha512-eKoL8ykZ7zz8MjgBenEF2OoTNFAPFz1/lyJ5UmmFSz5jW+7XbH1+MAgCVHy72aG59rbuQLcJeiMrP8qP5d/N0A== - -"@rollup/rollup-darwin-x64@4.43.0": - version "4.43.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.43.0.tgz#c92aebd02725ae1b88bdce40f08f7823e8055c78" - integrity sha512-SYwXJgaBYW33Wi/q4ubN+ldWC4DzQY62S4Ll2dgfr/dbPoF50dlQwEaEHSKrQdSjC6oIe1WgzosoaNoHCdNuMg== - -"@rollup/rollup-freebsd-arm64@4.43.0": - version "4.43.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.43.0.tgz#b128dbe7b353922ddd729a4fc4e408ddcbf338b5" - integrity sha512-SV+U5sSo0yujrjzBF7/YidieK2iF6E7MdF6EbYxNz94lA+R0wKl3SiixGyG/9Klab6uNBIqsN7j4Y/Fya7wAjQ== - -"@rollup/rollup-freebsd-x64@4.43.0": - version "4.43.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.43.0.tgz#88297a0ddfadddd61d7d9b73eb42b3f227301d30" - integrity sha512-J7uCsiV13L/VOeHJBo5SjasKiGxJ0g+nQTrBkAsmQBIdil3KhPnSE9GnRon4ejX1XDdsmK/l30IYLiAaQEO0Cg== - -"@rollup/rollup-linux-arm-gnueabihf@4.43.0": - version "4.43.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.43.0.tgz#a59afc092523ebe43d3899f33da9cdd2ec01fb87" - integrity sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw== - -"@rollup/rollup-linux-arm-musleabihf@4.43.0": - version "4.43.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.43.0.tgz#3095c1327b794bd187d03e372e633717fb69b4c0" - integrity sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw== - -"@rollup/rollup-linux-arm64-gnu@4.43.0": - version "4.43.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.43.0.tgz#e43bb77df3a6de85312e991d1e3ad352d1abb00d" - integrity sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA== - -"@rollup/rollup-linux-arm64-musl@4.43.0": - version "4.43.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.43.0.tgz#34873a437bcd87618f702dc66f0cbce170aebf9f" - integrity sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA== - -"@rollup/rollup-linux-loongarch64-gnu@4.43.0": - version "4.43.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.43.0.tgz#224ff524349e365baa56f1f512822548c2d76910" - integrity sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg== - -"@rollup/rollup-linux-powerpc64le-gnu@4.43.0": - version "4.43.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.43.0.tgz#43c3c053b26ace18a1d3dab204596a466c1b0e34" - integrity sha512-gEmwbOws4U4GLAJDhhtSPWPXUzDfMRedT3hFMyRAvM9Mrnj+dJIFIeL7otsv2WF3D7GrV0GIewW0y28dOYWkmw== - -"@rollup/rollup-linux-riscv64-gnu@4.43.0": - version "4.43.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.43.0.tgz#e7df825d71daefa7037605015455aa58be43cd7a" - integrity sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g== - -"@rollup/rollup-linux-riscv64-musl@4.43.0": - version "4.43.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.43.0.tgz#d76ad93a7f4c0b2855a024d8d859196acf38acf5" - integrity sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q== - -"@rollup/rollup-linux-s390x-gnu@4.43.0": - version "4.43.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.43.0.tgz#0852608843d05852af3f447bf43bb63d80d62b6a" - integrity sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw== - -"@rollup/rollup-linux-x64-gnu@4.43.0": - version "4.43.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.43.0.tgz#d16a57f86357a4e697142bee244afed59b24e6c5" - integrity sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ== - -"@rollup/rollup-linux-x64-musl@4.43.0": - version "4.43.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.43.0.tgz#51cbc8b1eb46ebc0e284725418b6fbf48686e4e2" - integrity sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ== - -"@rollup/rollup-win32-arm64-msvc@4.43.0": - version "4.43.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.43.0.tgz#d6d84aace2b211119bf0ab1c586e29d01e32aa01" - integrity sha512-wVzXp2qDSCOpcBCT5WRWLmpJRIzv23valvcTwMHEobkjippNf+C3ys/+wf07poPkeNix0paTNemB2XrHr2TnGw== - -"@rollup/rollup-win32-ia32-msvc@4.43.0": - version "4.43.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.43.0.tgz#4af33168de2f65b97a8f36bd1d8d21cea34d3ccb" - integrity sha512-fYCTEyzf8d+7diCw8b+asvWDCLMjsCEA8alvtAutqJOJp/wL5hs1rWSqJ1vkjgW0L2NB4bsYJrpKkiIPRR9dvw== - -"@rollup/rollup-win32-x64-msvc@4.43.0": - version "4.43.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.43.0.tgz#42a88207659e404e8ffa655cae763cbad94906ab" - integrity sha512-SnGhLiE5rlK0ofq8kzuDkM0g7FN1s5VYY+YSMTibP7CqShxCQvqtNxTARS4xX4PFJfHjG0ZQYX9iGzI3FQh5Aw== +"@rollup/rollup-android-arm-eabi@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.5.tgz#0f44a2f8668ed87b040b6fe659358ac9239da4db" + integrity sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ== + +"@rollup/rollup-android-arm64@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.5.tgz#25b9a01deef6518a948431564c987bcb205274f5" + integrity sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA== + +"@rollup/rollup-darwin-arm64@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz#8a102869c88f3780c7d5e6776afd3f19084ecd7f" + integrity sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA== + +"@rollup/rollup-darwin-x64@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.5.tgz#8e526417cd6f54daf1d0c04cf361160216581956" + integrity sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA== + +"@rollup/rollup-freebsd-arm64@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.5.tgz#0e7027054493f3409b1f219a3eac5efd128ef899" + integrity sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA== + +"@rollup/rollup-freebsd-x64@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.5.tgz#72b204a920139e9ec3d331bd9cfd9a0c248ccb10" + integrity sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ== + +"@rollup/rollup-linux-arm-gnueabihf@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.5.tgz#ab1b522ebe5b7e06c99504cc38f6cd8b808ba41c" + integrity sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ== + +"@rollup/rollup-linux-arm-musleabihf@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.5.tgz#f8cc30b638f1ee7e3d18eac24af47ea29d9beb00" + integrity sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ== + +"@rollup/rollup-linux-arm64-gnu@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.5.tgz#7af37a9e85f25db59dc8214172907b7e146c12cc" + integrity sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg== + +"@rollup/rollup-linux-arm64-musl@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.5.tgz#a623eb0d3617c03b7a73716eb85c6e37b776f7e0" + integrity sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q== + +"@rollup/rollup-linux-loong64-gnu@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.5.tgz#76ea038b549c5c6c5f0d062942627c4066642ee2" + integrity sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA== + +"@rollup/rollup-linux-ppc64-gnu@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.5.tgz#d9a4c3f0a3492bc78f6fdfe8131ac61c7359ccd5" + integrity sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw== + +"@rollup/rollup-linux-riscv64-gnu@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.5.tgz#87ab033eebd1a9a1dd7b60509f6333ec1f82d994" + integrity sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw== + +"@rollup/rollup-linux-riscv64-musl@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.5.tgz#bda3eb67e1c993c1ba12bc9c2f694e7703958d9f" + integrity sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg== + +"@rollup/rollup-linux-s390x-gnu@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.5.tgz#f7bc10fbe096ab44694233dc42a2291ed5453d4b" + integrity sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ== + +"@rollup/rollup-linux-x64-gnu@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.5.tgz#a151cb1234cc9b2cf5e8cfc02aa91436b8f9e278" + integrity sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q== + +"@rollup/rollup-linux-x64-musl@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.5.tgz#7859e196501cc3b3062d45d2776cfb4d2f3a9350" + integrity sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg== + +"@rollup/rollup-openharmony-arm64@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.5.tgz#85d0df7233734df31e547c1e647d2a5300b3bf30" + integrity sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw== + +"@rollup/rollup-win32-arm64-msvc@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.5.tgz#e62357d00458db17277b88adbf690bb855cac937" + integrity sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w== + +"@rollup/rollup-win32-ia32-msvc@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.5.tgz#fc7cd40f44834a703c1f1c3fe8bcc27ce476cd50" + integrity sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg== + +"@rollup/rollup-win32-x64-gnu@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.5.tgz#1a22acfc93c64a64a48c42672e857ee51774d0d3" + integrity sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ== + +"@rollup/rollup-win32-x64-msvc@4.52.5": + version "4.52.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.5.tgz#1657f56326bbe0ac80eedc9f9c18fc1ddd24e107" + integrity sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg== "@shikijs/core@1.22.2": version "1.22.2" @@ -2117,10 +2140,10 @@ dependencies: "@types/ms" "*" -"@types/estree@1.0.7": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" - integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== +"@types/estree@1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== "@types/estree@^1.0.0": version "1.0.5" @@ -2967,11 +2990,6 @@ ansi-styles@^5.0.0: resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -ansi-styles@^6.1.0: - version "6.2.3" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" - integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== - any-promise@^1.0.0: version "1.3.0" resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" @@ -3297,15 +3315,7 @@ boolean@^3.0.1: resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw== -brace-expansion@^1.1.7: - version "1.1.12" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" - integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: +brace-expansion@2.0.2, brace-expansion@^1.1.7, brace-expansion@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== @@ -3643,11 +3653,6 @@ component-emitter@^1.3.0: resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz" integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - concurrently@^9.1.2: version "9.1.2" resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-9.1.2.tgz#22d9109296961eaee773e12bfb1ce9a66bc9836c" @@ -3745,7 +3750,7 @@ create-jest@^29.7.0: jest-util "^29.7.0" prompts "^2.0.1" -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3, cross-spawn@^7.0.5: version "7.0.6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== @@ -7267,7 +7272,7 @@ path-scurry@^1.11.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" -path-to-regexp@0.1.12: +path-to-regexp@0.1.12, path-to-regexp@^0.1.12: version "0.1.12" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== @@ -7915,33 +7920,35 @@ roarr@^2.15.3: semver-compare "^1.0.0" sprintf-js "^1.1.2" -rollup@^4.20.0: - version "4.43.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.43.0.tgz#275c09119eb7eaf0c3dea040523b81ef43c57b8c" - integrity sha512-wdN2Kd3Twh8MAEOEJZsuxuLKCsBEo4PVNLK6tQWAn10VhsVewQLzcucMgLolRlhFybGxfclbPeEYBaP6RvUFGg== +rollup@^4.20.0, rollup@^4.22.4: + version "4.52.5" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.52.5.tgz#96982cdcaedcdd51b12359981f240f94304ec235" + integrity sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw== dependencies: - "@types/estree" "1.0.7" + "@types/estree" "1.0.8" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.43.0" - "@rollup/rollup-android-arm64" "4.43.0" - "@rollup/rollup-darwin-arm64" "4.43.0" - "@rollup/rollup-darwin-x64" "4.43.0" - "@rollup/rollup-freebsd-arm64" "4.43.0" - "@rollup/rollup-freebsd-x64" "4.43.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.43.0" - "@rollup/rollup-linux-arm-musleabihf" "4.43.0" - "@rollup/rollup-linux-arm64-gnu" "4.43.0" - "@rollup/rollup-linux-arm64-musl" "4.43.0" - "@rollup/rollup-linux-loongarch64-gnu" "4.43.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.43.0" - "@rollup/rollup-linux-riscv64-gnu" "4.43.0" - "@rollup/rollup-linux-riscv64-musl" "4.43.0" - "@rollup/rollup-linux-s390x-gnu" "4.43.0" - "@rollup/rollup-linux-x64-gnu" "4.43.0" - "@rollup/rollup-linux-x64-musl" "4.43.0" - "@rollup/rollup-win32-arm64-msvc" "4.43.0" - "@rollup/rollup-win32-ia32-msvc" "4.43.0" - "@rollup/rollup-win32-x64-msvc" "4.43.0" + "@rollup/rollup-android-arm-eabi" "4.52.5" + "@rollup/rollup-android-arm64" "4.52.5" + "@rollup/rollup-darwin-arm64" "4.52.5" + "@rollup/rollup-darwin-x64" "4.52.5" + "@rollup/rollup-freebsd-arm64" "4.52.5" + "@rollup/rollup-freebsd-x64" "4.52.5" + "@rollup/rollup-linux-arm-gnueabihf" "4.52.5" + "@rollup/rollup-linux-arm-musleabihf" "4.52.5" + "@rollup/rollup-linux-arm64-gnu" "4.52.5" + "@rollup/rollup-linux-arm64-musl" "4.52.5" + "@rollup/rollup-linux-loong64-gnu" "4.52.5" + "@rollup/rollup-linux-ppc64-gnu" "4.52.5" + "@rollup/rollup-linux-riscv64-gnu" "4.52.5" + "@rollup/rollup-linux-riscv64-musl" "4.52.5" + "@rollup/rollup-linux-s390x-gnu" "4.52.5" + "@rollup/rollup-linux-x64-gnu" "4.52.5" + "@rollup/rollup-linux-x64-musl" "4.52.5" + "@rollup/rollup-openharmony-arm64" "4.52.5" + "@rollup/rollup-win32-arm64-msvc" "4.52.5" + "@rollup/rollup-win32-ia32-msvc" "4.52.5" + "@rollup/rollup-win32-x64-gnu" "4.52.5" + "@rollup/rollup-win32-x64-msvc" "4.52.5" fsevents "~2.3.2" rrweb-cssom@^0.6.0: @@ -8330,7 +8337,7 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^5.0.1, string-width@^5.1.2: +string-width@^5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== @@ -9280,7 +9287,7 @@ word-wrap@^1.2.5: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: +wrap-ansi@7.0.0, wrap-ansi@^7.0.0, wrap-ansi@^8.1.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -9289,15 +9296,6 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - wrappy@1: version "1.0.2" resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" From aca9e39a86713ed11ddfcf655d1776e0b5d0acbf Mon Sep 17 00:00:00 2001 From: ofava Date: Thu, 6 Nov 2025 11:11:22 +0100 Subject: [PATCH 06/93] Refactor layout components to use GridLayout; update styles and add FlexLayout component with tests --- frontend/index.html | 6 +- .../LandingPageWelcome/LandingPageWelcome.tsx | 3 +- frontend/src/pages/GeneralLayout.tsx | 55 --------- frontend/src/pages/GoodBye/GoodBye.tsx | 19 +-- .../src/pages/LandingPage/LandingPage.tsx | 17 ++- .../UnsupportedBrowserPage.tsx | 15 ++- .../src/pages/WaitingRoom/WaitingRoom.tsx | 19 +-- frontend/src/utils/customTheme/customTheme.ts | 14 ++- frontend/ui/FlexLayout/FlexLayout.spec.tsx | 12 ++ frontend/ui/FlexLayout/FlexLayout.story.tsx | 0 frontend/ui/FlexLayout/FlexLayout.tsx | 115 ++++++++++++++++++ frontend/ui/FlexLayout/index.tsx | 2 + 12 files changed, 198 insertions(+), 79 deletions(-) delete mode 100644 frontend/src/pages/GeneralLayout.tsx create mode 100644 frontend/ui/FlexLayout/FlexLayout.spec.tsx create mode 100644 frontend/ui/FlexLayout/FlexLayout.story.tsx create mode 100644 frontend/ui/FlexLayout/FlexLayout.tsx create mode 100644 frontend/ui/FlexLayout/index.tsx diff --git a/frontend/index.html b/frontend/index.html index f0477e454..b997be29e 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -3,11 +3,15 @@ + Vonage Video React Reference App -
+
diff --git a/frontend/src/components/LandingPageWelcome/LandingPageWelcome.tsx b/frontend/src/components/LandingPageWelcome/LandingPageWelcome.tsx index 89b8a898d..a5f44f59d 100644 --- a/frontend/src/components/LandingPageWelcome/LandingPageWelcome.tsx +++ b/frontend/src/components/LandingPageWelcome/LandingPageWelcome.tsx @@ -18,6 +18,7 @@ const LandingPageWelcome = (): ReactElement => { sx={{ maxWidth: '48rem', pl: { xs: 0, lg: 4 }, + mb: { xs: 0, md: 6 }, textAlign: 'left', }} > @@ -40,7 +41,7 @@ const LandingPageWelcome = (): ReactElement => { lineHeight: 1.2, mr: { xs: 1, md: 0 }, fontSize: theme.typography.h2.fontSize, - [theme.breakpoints.between('sm', 'md')]: { + [theme.breakpoints.between('sm', 'lg')]: { fontSize: theme.typography.h3.fontSize, }, [theme.breakpoints.down('sm')]: { diff --git a/frontend/src/pages/GeneralLayout.tsx b/frontend/src/pages/GeneralLayout.tsx deleted file mode 100644 index 9dc8d64a9..000000000 --- a/frontend/src/pages/GeneralLayout.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import Banner from '@components/Banner'; -import Box from '@ui/Box'; -import Stack from '@ui/Stack'; -import { ReactNode } from 'react'; - -const GeneralLayout = ({ leftSide, rightSide }: { leftSide: ReactNode; rightSide: ReactNode }) => { - return ( - - - - - - {leftSide} - - - - {rightSide} - - - - ); -}; - -export default GeneralLayout; diff --git a/frontend/src/pages/GoodBye/GoodBye.tsx b/frontend/src/pages/GoodBye/GoodBye.tsx index b50555140..0549c1352 100644 --- a/frontend/src/pages/GoodBye/GoodBye.tsx +++ b/frontend/src/pages/GoodBye/GoodBye.tsx @@ -1,12 +1,12 @@ import { useLocation } from 'react-router-dom'; import { ReactElement } from 'react'; import { useTranslation } from 'react-i18next'; -import GeneralLayout from '@pages/GeneralLayout'; +import GridLayout from '@ui/FlexLayout'; +import Banner from '@components/Banner'; import useArchives from '../../hooks/useArchives'; import ArchiveList from '../../components/GoodBye/ArchiveList'; import GoodByeMessage from '../../components/GoodBye/GoodbyeMessage'; import useRoomName from '../../hooks/useRoomName'; - /** * GoodBye Component * @@ -28,15 +28,20 @@ const GoodBye = (): ReactElement => { const caption: string = location.state?.caption || t('goodbye.default.message'); return ( - } - rightSide={ + + + + + + + +

{t('archiveList.label')}

- } - /> +
+
); }; diff --git a/frontend/src/pages/LandingPage/LandingPage.tsx b/frontend/src/pages/LandingPage/LandingPage.tsx index 4890b35d8..ed203c44d 100644 --- a/frontend/src/pages/LandingPage/LandingPage.tsx +++ b/frontend/src/pages/LandingPage/LandingPage.tsx @@ -1,5 +1,6 @@ import { ReactElement } from 'react'; -import GeneralLayout from '@pages/GeneralLayout'; +import GridLayout from '@ui/FlexLayout'; +import Banner from '@components/Banner'; import LandingPageWelcome from '../../components/LandingPageWelcome'; import RoomJoinContainer from '../../components/RoomJoinContainer'; @@ -15,7 +16,19 @@ import RoomJoinContainer from '../../components/RoomJoinContainer'; * @returns {ReactElement} - The landing page. */ const LandingPage = (): ReactElement => { - return } rightSide={} />; + return ( + + + + + + + + + + + + ); }; export default LandingPage; diff --git a/frontend/src/pages/UnsupportedBrowserPage/UnsupportedBrowserPage.tsx b/frontend/src/pages/UnsupportedBrowserPage/UnsupportedBrowserPage.tsx index ff6ebb141..aaab6fab2 100644 --- a/frontend/src/pages/UnsupportedBrowserPage/UnsupportedBrowserPage.tsx +++ b/frontend/src/pages/UnsupportedBrowserPage/UnsupportedBrowserPage.tsx @@ -1,5 +1,6 @@ import { ReactElement } from 'react'; -import GeneralLayout from '@pages/GeneralLayout'; +import GridLayout from '@ui/FlexLayout'; +import Banner from '@components/Banner'; import SupportedBrowsers from '../../components/UnsupportedBrowser/SupportedBrowsers'; import UnsupportedBrowserMessage from '../../components/UnsupportedBrowser/UnsupportedBrowserMessage'; @@ -14,7 +15,17 @@ import UnsupportedBrowserMessage from '../../components/UnsupportedBrowser/Unsup */ const UnsupportedBrowserPage = (): ReactElement => { return ( - } rightSide={} /> + + + + + + + + + + + ); }; diff --git a/frontend/src/pages/WaitingRoom/WaitingRoom.tsx b/frontend/src/pages/WaitingRoom/WaitingRoom.tsx index 7399a1db3..a7a2f376a 100644 --- a/frontend/src/pages/WaitingRoom/WaitingRoom.tsx +++ b/frontend/src/pages/WaitingRoom/WaitingRoom.tsx @@ -1,6 +1,7 @@ import { useState, useEffect, MouseEvent, ReactElement, TouchEvent } from 'react'; import Box from '@ui/Box'; -import GeneralLayout from '@pages/GeneralLayout'; +import GridLayout from '@ui/FlexLayout'; +import Banner from '@components/Banner'; import usePreviewPublisherContext from '../../hooks/usePreviewPublisherContext'; import ControlPanel from '../../components/WaitingRoom/ControlPanel'; import VideoContainer from '../../components/WaitingRoom/VideoContainer'; @@ -95,8 +96,11 @@ const WaitingRoom = (): ReactElement => { return ( - + + + +
@@ -114,10 +118,11 @@ const WaitingRoom = (): ReactElement => { /> )}
- } - rightSide={} - /> - +
+ + + + {accessStatus !== DEVICE_ACCESS_STATUS.ACCEPTED && ( )} diff --git a/frontend/src/utils/customTheme/customTheme.ts b/frontend/src/utils/customTheme/customTheme.ts index acf664def..076b192e2 100644 --- a/frontend/src/utils/customTheme/customTheme.ts +++ b/frontend/src/utils/customTheme/customTheme.ts @@ -9,6 +9,9 @@ declare module '@mui/material/styles' { const borderRadiusStandard = '8px'; const borderRadiusStandardNumber = 2.85; const inputHeight = 48; +const buttonFontSize = 16; +const h2FontWeight = 500; +const h5FontWeight = 500; const buttonSx = { height: inputHeight, @@ -69,9 +72,7 @@ const colors = { } as const; const fonts = { - family: ['spezia', 'system-ui', 'ui-sans-serif', 'Inter', 'Marker Felt', 'Trebuchet MS'].join( - ',' - ), + family: ['"Inter"', 'system-ui', 'ui-sans-serif', '"Marker Felt"', '"Trebuchet MS"'].join(','), } as const; const customTheme = createTheme({ @@ -115,7 +116,10 @@ const customTheme = createTheme({ components: { MuiButton: { styleOverrides: { - root: buttonSx, + root: { + ...buttonSx, + fontSize: buttonFontSize, + }, outlined: { borderColor: colors.primary, }, @@ -190,6 +194,8 @@ const customTheme = createTheme({ }, typography: { fontFamily: fonts.family, + h2: { fontWeight: h2FontWeight }, + h5: { fontWeight: h5FontWeight }, }, }); diff --git a/frontend/ui/FlexLayout/FlexLayout.spec.tsx b/frontend/ui/FlexLayout/FlexLayout.spec.tsx new file mode 100644 index 000000000..02faec923 --- /dev/null +++ b/frontend/ui/FlexLayout/FlexLayout.spec.tsx @@ -0,0 +1,12 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import FlexLayout from './FlexLayout'; + +describe('FlexLayout', () => { + it('renders correctly', () => { + render(Grid); + + const flexLayout = screen.getByRole('FlexLayout', { name: 'Grid' }); + expect(flexLayout).toBeInTheDocument(); + }); +}); diff --git a/frontend/ui/FlexLayout/FlexLayout.story.tsx b/frontend/ui/FlexLayout/FlexLayout.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/FlexLayout/FlexLayout.tsx b/frontend/ui/FlexLayout/FlexLayout.tsx new file mode 100644 index 000000000..2ee63df88 --- /dev/null +++ b/frontend/ui/FlexLayout/FlexLayout.tsx @@ -0,0 +1,115 @@ +import * as React from 'react'; +import Stack from '@ui/Stack'; +import Box from '@ui/Box'; + +type WithChildren = T & { children?: React.ReactNode }; + +export type FlexLayoutProps = WithChildren<{ + padding?: number; + leftFlex?: number; + rightFlex?: number; + leftAlign?: { alignItems: string; justifyContent: string }; + rightAlign?: { alignItems: string; justifyContent: string }; + leftBackgroundColor?: string | { [key: string]: string }; + rightBackgroundColor?: string | { [key: string]: string }; +}>; + +export const FlexLayoutBanner: React.FC = ({ children }) => { + return children; +}; +FlexLayoutBanner.displayName = 'FlexLayoutBanner'; + +export const FlexLayoutLeft: React.FC = ({ children }) => { + return children; +}; +FlexLayoutLeft.displayName = 'FlexLayoutLeft'; + +export const FlexLayoutRight: React.FC = ({ children }) => { + return children; +}; +FlexLayoutRight.displayName = 'FlexLayoutRight'; + +function pickChild(children: React.ReactNode, displayName: string): React.ReactNode | null { + const arr = React.Children.toArray(children); + + return ( + arr.find( + (child: unknown) => + React.isValidElement(child) && + typeof child.type === 'function' && + 'displayName' in child.type && + (child.type as React.ComponentType).displayName === displayName + ) ?? null + ); +} + +type FlexLayoutComponent = React.FC & { + Banner: typeof FlexLayoutBanner; + Left: typeof FlexLayoutLeft; + Right: typeof FlexLayoutRight; +}; + +const FlexLayout: FlexLayoutComponent = ({ + children, + padding = 3, + leftFlex = 1, + rightFlex = 1, + leftAlign = { alignItems: 'center', justifyContent: 'center' }, + rightAlign = { alignItems: 'center', justifyContent: 'center' }, + leftBackgroundColor = { xs: 'background.paper', md: 'primary.light' }, + rightBackgroundColor = { xs: 'background.paper', md: 'background.paper' }, +}: FlexLayoutProps) => { + const banner = pickChild(children, 'FlexLayoutBanner'); + const left = pickChild(children, 'FlexLayoutLeft'); + const right = pickChild(children, 'FlexLayoutRight'); + + return ( + + {banner && {banner}} + + {left && ( + + {left} + + )} + + {right && ( + + {right} + + )} + + + ); +}; + +FlexLayout.Banner = FlexLayoutBanner; +FlexLayout.Left = FlexLayoutLeft; +FlexLayout.Right = FlexLayoutRight; + +export default FlexLayout; diff --git a/frontend/ui/FlexLayout/index.tsx b/frontend/ui/FlexLayout/index.tsx new file mode 100644 index 000000000..cd8b81f52 --- /dev/null +++ b/frontend/ui/FlexLayout/index.tsx @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './FlexLayout'; From e2af1e37038e6ff27370d2fe420dc63088844277 Mon Sep 17 00:00:00 2001 From: ofava Date: Thu, 6 Nov 2025 12:16:16 +0100 Subject: [PATCH 07/93] Fix unit testing --- .../JoinExistingRoom.spec.tsx | 2 +- .../LandingPageWelcome.spec.tsx | 4 +- .../NewRoomButton/NewRoomButton.spec.tsx | 4 +- .../src/pages/WaitingRoom/WaitingRoom.tsx | 2 +- .../src/utils/customTheme/customTheme.spec.ts | 1 - frontend/ui/Box/Box.spec.tsx | 36 ++++++++++++++++- frontend/ui/FlexLayout/FlexLayout.spec.tsx | 35 ++++++++++++++-- .../ui/InputAdornment/InputAdornment.spec.tsx | 28 ++++++++++++- frontend/ui/Stack/Stack.spec.tsx | 35 +++++++++++++++- frontend/ui/TextField/TextField.spec.tsx | 40 ++++++++++++++++++- frontend/ui/Typography/Typography.spec.tsx | 34 +++++++++++++++- integration-tests/tests/goodbye.spec.ts | 4 +- 12 files changed, 207 insertions(+), 18 deletions(-) diff --git a/frontend/src/components/JoinExistingRoom/JoinExistingRoom.spec.tsx b/frontend/src/components/JoinExistingRoom/JoinExistingRoom.spec.tsx index 9444e21e1..33f4ed682 100644 --- a/frontend/src/components/JoinExistingRoom/JoinExistingRoom.spec.tsx +++ b/frontend/src/components/JoinExistingRoom/JoinExistingRoom.spec.tsx @@ -15,7 +15,7 @@ describe('JoinExistingRoom', () => { render(); expect(screen.getByTestId('JoinExistingRoom')).toBeInTheDocument(); - expect(screen.getByTestId('KeyboardIcon')).toBeInTheDocument(); + expect(screen.getByTestId('vivid-icon-abc-keyboard-line')).toBeInTheDocument(); expect(screen.getByText('Join')).toBeInTheDocument(); expect(screen.getByPlaceholderText(/Enter room name/i)).toBeInTheDocument(); }); diff --git a/frontend/src/components/LandingPageWelcome/LandingPageWelcome.spec.tsx b/frontend/src/components/LandingPageWelcome/LandingPageWelcome.spec.tsx index 8bd529c1b..0495fcb0b 100644 --- a/frontend/src/components/LandingPageWelcome/LandingPageWelcome.spec.tsx +++ b/frontend/src/components/LandingPageWelcome/LandingPageWelcome.spec.tsx @@ -6,7 +6,9 @@ describe('LandingPageWelcome', () => { it('renders the welcome heading and applies correct styling', () => { render(); - const textHeading = screen.getByText('Welcome to the Vonage Video React App'); + const textHeading = screen.getByText( + 'Power your business with video that transforms customer satisfaction.' + ); expect(textHeading).toBeInTheDocument(); }); }); diff --git a/frontend/src/components/NewRoomButton/NewRoomButton.spec.tsx b/frontend/src/components/NewRoomButton/NewRoomButton.spec.tsx index 140ecdc2e..b1a5b6578 100644 --- a/frontend/src/components/NewRoomButton/NewRoomButton.spec.tsx +++ b/frontend/src/components/NewRoomButton/NewRoomButton.spec.tsx @@ -13,11 +13,11 @@ describe('NewRoomButton', () => { it('renders New room button correctly', async () => { render(); - const icon = screen.getByTestId('VideoCallIcon'); + const icon = screen.getByTestId('vivid-icon-plus-line'); const button = screen.getByTestId('new-room-button'); expect(icon).toBeInTheDocument(); expect(button).toBeInTheDocument(); - expect(button).toHaveTextContent(/Create room/i); + expect(button).toHaveTextContent(/Create a new room/i); expect(button).toBeEnabled(); await userEvent.click(button); diff --git a/frontend/src/pages/WaitingRoom/WaitingRoom.tsx b/frontend/src/pages/WaitingRoom/WaitingRoom.tsx index a7a2f376a..92b50dd1f 100644 --- a/frontend/src/pages/WaitingRoom/WaitingRoom.tsx +++ b/frontend/src/pages/WaitingRoom/WaitingRoom.tsx @@ -95,7 +95,7 @@ const WaitingRoom = (): ReactElement => { }; return ( - + diff --git a/frontend/src/utils/customTheme/customTheme.spec.ts b/frontend/src/utils/customTheme/customTheme.spec.ts index f2015ffe5..319fa5992 100644 --- a/frontend/src/utils/customTheme/customTheme.spec.ts +++ b/frontend/src/utils/customTheme/customTheme.spec.ts @@ -45,7 +45,6 @@ describe('customTheme', () => { const { components } = customTheme; expect(components?.MuiAppBar).toBeDefined(); expect(components?.MuiPaper).toBeDefined(); - expect(components?.MuiTextField).toBeDefined(); expect(components?.MuiTooltip).toBeDefined(); }); }); diff --git a/frontend/ui/Box/Box.spec.tsx b/frontend/ui/Box/Box.spec.tsx index 4bcd6976b..6ac287bb8 100644 --- a/frontend/ui/Box/Box.spec.tsx +++ b/frontend/ui/Box/Box.spec.tsx @@ -6,7 +6,41 @@ describe('Box', () => { it('renders correctly', () => { render(Box content); - const box = screen.getByRole('Box', { name: 'Box content' }); + const box = screen.getByText('Box content'); + expect(box).toBeInTheDocument(); + }); + + it('applies custom sx props', () => { + render( + + Styled content + + ); + + const box = screen.getByTestId('styled-box'); + expect(box).toBeInTheDocument(); + expect(box).toHaveClass('MuiBox-root'); + }); + + it('renders with different components', () => { + render( + + Section content + + ); + + const box = screen.getByTestId('section-box'); + expect(box.tagName).toBe('SECTION'); + }); + + it('passes through other MUI props', () => { + render( + + Props content + + ); + + const box = screen.getByTestId('props-box'); expect(box).toBeInTheDocument(); }); }); diff --git a/frontend/ui/FlexLayout/FlexLayout.spec.tsx b/frontend/ui/FlexLayout/FlexLayout.spec.tsx index 02faec923..e95ffe04a 100644 --- a/frontend/ui/FlexLayout/FlexLayout.spec.tsx +++ b/frontend/ui/FlexLayout/FlexLayout.spec.tsx @@ -3,10 +3,37 @@ import { describe, it, expect } from 'vitest'; import FlexLayout from './FlexLayout'; describe('FlexLayout', () => { - it('renders correctly', () => { - render(Grid); + it('renders with compound components', () => { + render( + + Left content + Right content + + ); - const flexLayout = screen.getByRole('FlexLayout', { name: 'Grid' }); - expect(flexLayout).toBeInTheDocument(); + expect(screen.getByText('Left content')).toBeInTheDocument(); + expect(screen.getByText('Right content')).toBeInTheDocument(); + }); + + it('renders left content only', () => { + render( + + Only left content + + ); + + expect(screen.getByText('Only left content')).toBeInTheDocument(); + expect(screen.queryByText('Right content')).not.toBeInTheDocument(); + }); + + it('renders right content only', () => { + render( + + Only right content + + ); + + expect(screen.getByText('Only right content')).toBeInTheDocument(); + expect(screen.queryByText('Left content')).not.toBeInTheDocument(); }); }); diff --git a/frontend/ui/InputAdornment/InputAdornment.spec.tsx b/frontend/ui/InputAdornment/InputAdornment.spec.tsx index 19f9868b0..ec137a0cb 100644 --- a/frontend/ui/InputAdornment/InputAdornment.spec.tsx +++ b/frontend/ui/InputAdornment/InputAdornment.spec.tsx @@ -4,9 +4,33 @@ import InputAdornment from './InputAdornment'; describe('InputAdornment', () => { it('renders correctly', () => { - render(InputAdornment content); + render($ ); - const inputAdornment = screen.getByRole('InputAdornment', { name: 'InputAdornment content' }); + const inputAdornment = screen.getByText('$'); expect(inputAdornment).toBeInTheDocument(); }); + + it('renders with start position', () => { + render( + + @ + + ); + + const adornment = screen.getByTestId('start-adornment'); + expect(adornment).toBeInTheDocument(); + expect(screen.getByText('@')).toBeInTheDocument(); + }); + + it('renders with end position', () => { + render( + + .com + + ); + + const adornment = screen.getByTestId('end-adornment'); + expect(adornment).toBeInTheDocument(); + expect(screen.getByText('.com')).toBeInTheDocument(); + }); }); diff --git a/frontend/ui/Stack/Stack.spec.tsx b/frontend/ui/Stack/Stack.spec.tsx index 5e75c0650..333f7b9c5 100644 --- a/frontend/ui/Stack/Stack.spec.tsx +++ b/frontend/ui/Stack/Stack.spec.tsx @@ -6,7 +6,40 @@ describe('Stack', () => { it('renders correctly', () => { render(Stack content); - const stack = screen.getByRole('Stack', { name: 'Stack content' }); + const stack = screen.getByText('Stack content'); + expect(stack).toBeInTheDocument(); + }); + + it('applies spacing prop', () => { + render( + +
Item 1
+
Item 2
+
+ ); + + const stack = screen.getByTestId('spaced-stack'); + expect(stack).toBeInTheDocument(); + expect(screen.getByText('Item 1')).toBeInTheDocument(); + expect(screen.getByText('Item 2')).toBeInTheDocument(); + }); + + it('applies sx prop', () => { + render( + + Styled content + + ); + + const stack = screen.getByTestId('styled-stack'); + expect(stack).toBeInTheDocument(); + expect(stack).toHaveClass('MuiStack-root'); + }); + + it('handles empty content', () => { + render(); + + const stack = screen.getByTestId('empty-stack'); expect(stack).toBeInTheDocument(); }); }); diff --git a/frontend/ui/TextField/TextField.spec.tsx b/frontend/ui/TextField/TextField.spec.tsx index fda97a955..f96458904 100644 --- a/frontend/ui/TextField/TextField.spec.tsx +++ b/frontend/ui/TextField/TextField.spec.tsx @@ -4,9 +4,45 @@ import TextField from './TextField'; describe('TextField', () => { it('renders correctly', () => { - render(TextField content); + render(); - const textField = screen.getByRole('TextField', { name: 'TextField content' }); + const textField = screen.getByRole('textbox', { name: 'Test Label' }); expect(textField).toBeInTheDocument(); }); + + it('renders with placeholder', () => { + render(); + + const textField = screen.getByPlaceholderText('Enter text here'); + expect(textField).toBeInTheDocument(); + }); + + it('applies variant prop', () => { + render(); + + const textField = screen.getByRole('textbox', { name: 'Outlined Field' }); + expect(textField).toBeInTheDocument(); + }); + + it('handles disabled state', () => { + render(); + + const textField = screen.getByRole('textbox', { name: 'Disabled Field' }); + expect(textField).toBeDisabled(); + }); + + it('shows error state', () => { + render(); + + const textField = screen.getByRole('textbox', { name: 'Error Field' }); + expect(textField).toBeInTheDocument(); + expect(screen.getByText('This field has an error')).toBeInTheDocument(); + }); + + it('handles different input types', () => { + render(); + + const textField = screen.getByLabelText('Password Field'); + expect(textField).toHaveAttribute('type', 'password'); + }); }); diff --git a/frontend/ui/Typography/Typography.spec.tsx b/frontend/ui/Typography/Typography.spec.tsx index df3675b85..b0b344082 100644 --- a/frontend/ui/Typography/Typography.spec.tsx +++ b/frontend/ui/Typography/Typography.spec.tsx @@ -6,7 +6,39 @@ describe('Typography', () => { it('renders correctly', () => { render(Typography content); - const typography = screen.getByRole('Typography', { name: 'Typography content' }); + const typography = screen.getByText('Typography content'); + expect(typography).toBeInTheDocument(); + }); + + it('renders with different variants', () => { + const { rerender } = render(Heading 1); + + expect(screen.getByRole('heading', { level: 1 })).toBeInTheDocument(); + expect(screen.getByText('Heading 1')).toBeInTheDocument(); + + rerender(Heading 2); + expect(screen.getByRole('heading', { level: 2 })).toBeInTheDocument(); + + rerender(Body text); + expect(screen.getByText('Body text')).toBeInTheDocument(); + }); + + it('renders with custom component', () => { + render( + + Span content + + ); + + const typography = screen.getByTestId('span-typography'); + expect(typography.tagName).toBe('SPAN'); + expect(typography).toHaveTextContent('Span content'); + }); + + it('handles empty content', () => { + render(); + + const typography = screen.getByTestId('empty-typography'); expect(typography).toBeInTheDocument(); }); }); diff --git a/integration-tests/tests/goodbye.spec.ts b/integration-tests/tests/goodbye.spec.ts index 25f54f78a..23f31c6d6 100644 --- a/integration-tests/tests/goodbye.spec.ts +++ b/integration-tests/tests/goodbye.spec.ts @@ -41,6 +41,8 @@ test('should render `Return to landing page` and it should navigate to the landi await landingPageButton.click(); await expect( - page.getByRole('heading', { name: 'Welcome to the Vonage Video React App' }) + page.getByRole('heading', { + name: 'Power your business with video that transforms customer satisfaction.', + }) ).toBeVisible(); }); From 364ce1fd5e83d53bc4f0b2298959b320106fbd31 Mon Sep 17 00:00:00 2001 From: ofava Date: Thu, 6 Nov 2025 12:21:07 +0100 Subject: [PATCH 08/93] Fix lint --- frontend/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/index.html b/frontend/index.html index b997be29e..6ccdceac0 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -11,7 +11,7 @@ Vonage Video React Reference App -
+
From 8d9c498df730d9774a48ccc32d70e65918d2c08b Mon Sep 17 00:00:00 2001 From: ofava Date: Thu, 6 Nov 2025 12:43:25 +0100 Subject: [PATCH 09/93] Fix sonarCloud --- frontend/ui/Box/Box.tsx | 2 +- frontend/ui/Button/Button.story.tsx | 14 -------------- frontend/ui/Button/Button.tsx | 2 +- frontend/ui/InputAdornment/InputAdornment.tsx | 2 +- frontend/ui/Stack/Stack.tsx | 2 +- frontend/ui/TextField/TextField.tsx | 2 +- frontend/ui/Typography/Typography.tsx | 2 +- 7 files changed, 6 insertions(+), 20 deletions(-) diff --git a/frontend/ui/Box/Box.tsx b/frontend/ui/Box/Box.tsx index 1d7c295b6..f8fb99362 100644 --- a/frontend/ui/Box/Box.tsx +++ b/frontend/ui/Box/Box.tsx @@ -1,6 +1,6 @@ import { Box as MUIBox, BoxProps as MUIBoxProps } from '@mui/material'; -type BoxProps = MUIBoxProps & {}; +type BoxProps = MUIBoxProps; const Box = ({ ...boxProps }: BoxProps) => { return ; diff --git a/frontend/ui/Button/Button.story.tsx b/frontend/ui/Button/Button.story.tsx index 8284795e7..e69de29bb 100644 --- a/frontend/ui/Button/Button.story.tsx +++ b/frontend/ui/Button/Button.story.tsx @@ -1,14 +0,0 @@ -/* import type { StoryObj } from '@storybook/react'; -import Button from './Button'; - -type Story = StoryObj; -export const Primary: Story = { - args: { - label: 'Click Me', - }, -}; -export const Secondary: Story = { - args: { - label: 'Cancel', - }, -}; */ diff --git a/frontend/ui/Button/Button.tsx b/frontend/ui/Button/Button.tsx index bb83113e1..c5b73eee8 100644 --- a/frontend/ui/Button/Button.tsx +++ b/frontend/ui/Button/Button.tsx @@ -1,6 +1,6 @@ import { Button as MUIButton, ButtonProps as MUIButtonProps } from '@mui/material'; -type ButtonProps = MUIButtonProps & {}; +type ButtonProps = MUIButtonProps; const Button = ({ ...buttonProps }: ButtonProps) => { return ; diff --git a/frontend/ui/InputAdornment/InputAdornment.tsx b/frontend/ui/InputAdornment/InputAdornment.tsx index 3f2917984..e9adf2d3e 100644 --- a/frontend/ui/InputAdornment/InputAdornment.tsx +++ b/frontend/ui/InputAdornment/InputAdornment.tsx @@ -3,7 +3,7 @@ import { InputAdornmentProps as MUIInputAdornmentProps, } from '@mui/material'; -type InputAdornmentProps = MUIInputAdornmentProps & {}; +type InputAdornmentProps = MUIInputAdornmentProps; const InputAdornment = ({ ...inputAdornmentProps }: InputAdornmentProps) => { return ; diff --git a/frontend/ui/Stack/Stack.tsx b/frontend/ui/Stack/Stack.tsx index 919fb3d2b..6f95edd5d 100644 --- a/frontend/ui/Stack/Stack.tsx +++ b/frontend/ui/Stack/Stack.tsx @@ -1,6 +1,6 @@ import { Stack as MUIStack, StackProps as MUIStackProps } from '@mui/material'; -type StackProps = MUIStackProps & {}; +type StackProps = MUIStackProps; const Stack = ({ ...stackProps }: StackProps) => { return ; diff --git a/frontend/ui/TextField/TextField.tsx b/frontend/ui/TextField/TextField.tsx index 4f3f965d9..a7c7e2003 100644 --- a/frontend/ui/TextField/TextField.tsx +++ b/frontend/ui/TextField/TextField.tsx @@ -1,6 +1,6 @@ import { TextField as MUITextField, TextFieldProps as MUITextFieldProps } from '@mui/material'; -type TextFieldProps = MUITextFieldProps & {}; +type TextFieldProps = MUITextFieldProps; const TextField = ({ ...textFieldProps }: TextFieldProps) => { return ; diff --git a/frontend/ui/Typography/Typography.tsx b/frontend/ui/Typography/Typography.tsx index ebccf47a9..77c90ea76 100644 --- a/frontend/ui/Typography/Typography.tsx +++ b/frontend/ui/Typography/Typography.tsx @@ -1,6 +1,6 @@ import { Typography as MUITypography, TypographyProps as MUITypographyProps } from '@mui/material'; -type TypographyProps = MUITypographyProps & {}; +type TypographyProps = MUITypographyProps; const Typography = ({ ...typographyProps }: TypographyProps) => { return ; From 33de62879843f44114a256df717a802179703d50 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 6 Nov 2025 13:10:08 +0000 Subject: [PATCH 10/93] Commit screenshot file: integration-tests/tests/visualComparisons.spec.ts-snapshots/Landing-page-UI-test-1-Electron-linux.png --- .../Landing-page-UI-test-1-Electron-linux.png | Bin 46661 -> 54518 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/integration-tests/tests/visualComparisons.spec.ts-snapshots/Landing-page-UI-test-1-Electron-linux.png b/integration-tests/tests/visualComparisons.spec.ts-snapshots/Landing-page-UI-test-1-Electron-linux.png index 1462eb2f3aae26a21866ba3f6df7212c3bd31054..b689c0a47ce0f1306545fbada3e8affaaf84f8f4 100644 GIT binary patch literal 54518 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 z%0D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�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 Ie>t<8 From ca5cac8a619af89b568df2bba68098104167e8ad Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 6 Nov 2025 13:10:09 +0000 Subject: [PATCH 11/93] Commit screenshot file: integration-tests/tests/visualComparisons.spec.ts-snapshots/Landing-page-UI-test-1-Google-Chrome-Fake-Devices-linux.png --- ...est-1-Google-Chrome-Fake-Devices-linux.png | Bin 44247 -> 60382 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/integration-tests/tests/visualComparisons.spec.ts-snapshots/Landing-page-UI-test-1-Google-Chrome-Fake-Devices-linux.png b/integration-tests/tests/visualComparisons.spec.ts-snapshots/Landing-page-UI-test-1-Google-Chrome-Fake-Devices-linux.png index 33da5ce5c5b866f6387402d460ea1bca4e254228..e472e9759610e8cd28e9f25c0538dab6508dbf2e 100644 GIT binary patch literal 60382 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

uWCZ(dDCd(RvI-Z@ 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

G?nSlENk)^B}0@m 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 RTm=+i@N@-^bvPw70RVX!&ZhtX From affed4d9fe350f3ca75d2ede936bd4f81f3075e8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 6 Nov 2025 13:10:10 +0000 Subject: [PATCH 12/93] Commit screenshot file: integration-tests/tests/visualComparisons.spec.ts-snapshots/Landing-page-UI-test-1-Microsoft-Edge-linux.png --- ...ng-page-UI-test-1-Microsoft-Edge-linux.png | Bin 44247 -> 60382 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/integration-tests/tests/visualComparisons.spec.ts-snapshots/Landing-page-UI-test-1-Microsoft-Edge-linux.png b/integration-tests/tests/visualComparisons.spec.ts-snapshots/Landing-page-UI-test-1-Microsoft-Edge-linux.png index 33da5ce5c5b866f6387402d460ea1bca4e254228..e472e9759610e8cd28e9f25c0538dab6508dbf2e 100644 GIT binary patch literal 60382 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

uWCZ(dDCd(RvI-Z@ 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

G?nSlENk)^B}0@m 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 RTm=+i@N@-^bvPw70RVX!&ZhtX From 66acaf1b2618f366848ff401b1e39708d35dd069 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 6 Nov 2025 13:10:12 +0000 Subject: [PATCH 13/93] Commit screenshot file: integration-tests/tests/visualComparisons.spec.ts-snapshots/Landing-page-UI-test-1-Mobile-Chrome-linux.png --- ...ing-page-UI-test-1-Mobile-Chrome-linux.png | Bin 35014 -> 26201 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/integration-tests/tests/visualComparisons.spec.ts-snapshots/Landing-page-UI-test-1-Mobile-Chrome-linux.png b/integration-tests/tests/visualComparisons.spec.ts-snapshots/Landing-page-UI-test-1-Mobile-Chrome-linux.png index 39b7c423a01eac6ed2e7fcb3110706805833f58f..eb1fe01ca1e8cd6b5642b525319012a945352aec 100644 GIT binary patch literal 26201 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 X`PAJy8%;)1QKC%j-KYNrKpt8N From ebbb079c9b3579511e6a883a48b48836bc179899 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 6 Nov 2025 13:10:13 +0000 Subject: [PATCH 14/93] Commit screenshot file: integration-tests/tests/visualComparisons.spec.ts-snapshots/Landing-page-UI-test-1-Opera-linux.png --- .../Landing-page-UI-test-1-Opera-linux.png | Bin 46221 -> 60382 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/integration-tests/tests/visualComparisons.spec.ts-snapshots/Landing-page-UI-test-1-Opera-linux.png b/integration-tests/tests/visualComparisons.spec.ts-snapshots/Landing-page-UI-test-1-Opera-linux.png index 260cb02dfd06ffa19a15631925aa162e188d667b..e472e9759610e8cd28e9f25c0538dab6508dbf2e 100644 GIT binary patch literal 60382 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

uWCZ(dDCd(RvI-Z@ zAQU@>Tl|p|@>DA7DpNiJDPou zFd@VhahrtfLY}35w^(gfW#>nlhyDzuKGNt;Y>iyZG=8Y%cW_Mnu@KU3>_^1o-Uj=R zt^-VgTlJ4T)e*Y!0PCy7OoyFUw+hg48-Q4Nk#^jBfB3s1ZMoUWXJ~*)ots&n*4M|a z?R(JS{G^x;o{)!ev5Bg?I$`zYre37JS)Q~pi~AX{Ie0`OLtEHe(6M##d5I-WPdk{Mv17S3ukPZW;rZvgh&pk7f^WJ$f&T42%rCoo1Et zZl7#S9?PRHZ5}^x{CM>B_&89P*HqF+{D+I+?W_XXr&1tz(Mxp#4zjazsy$oq)Ui{8 zZM50_JERyq$tv9l{#BWJdj7t?OJ;-nvc=nX#P-hk`?QuD`e4#u(&=KBRY%dp-x{Io zeZ@txW-~YQY`SEi2jEMeD*pWWvwF!cIWo_)p!}(i3e-5)x)+5`ulFN=RIc>MD`q0+ z*4U4lHPv~Mv(m&|ucash&5UA}J$b!ri?3S#jRi2Yhv3-fDztcX9%F=L)YFH|b@UfH z`bWZh6NTufBz)~q5t#R5Oe6YNTmWLc4-gY)!@ur)?dm$LnwO%Y8dUK0Z4;8~cLda> z`^&AVnw6skTDc1sP8w97I5|0;IkdokVew4x);(2&n@_WE8v6)<>!(_RzI(gO?sZ5> z2CS^S(FoDwHGXDR@3rQ&u@YL7rT{&KN$2zD>n={~@@t#YA8t$)oIV)3dPKCf1oZPB z`?ECqjImOqf>QLcORW>}u34p?eTmH`?jXv!VR#MboD>VJ_CpEc{qV2%3wQCFaJ!)` zjBB$7Wgj+>F3Xi=iHrj}IwNnB{zLSfX6PcbO(Z0obafvCDCOG@dN!O$J{`*IP2|_Cf89M~-IGvVRReUM&Yk%0 z4_1$Jo!}T7Dl6TKhVHXtp>FF-8U4(N(&?{XOo&w}8%GO=a%IL1MZOoKlR|}}kG)jQ zEG#S_hnumQM3;pUv_W zgOl$OhCnY{{zjahg(hE z%?VM4@fjExJd%>K*>5>}Of3mtcd>TH&98ZEZw2~E1nn=LqP%;W60Yb8fcc(X$uOIwT#i+-70|$T~VzI=dLeR?p|>vdIEc;`!4H2W3*7k(t~So9f!yp3O|- z+SsJwf`M|A2A!Z#<9gL1pb36`+@&iiPodwTDo}9P#PzTZry_3AwM;%_jl%%u6^1fl zd^(9)ul>eP)yOpo?~ELQYl{;so<5zQyMBUj!thge1BcJF-OS?3y1L?rTf0w4GlJV$ zIujDB2cu7Blb$?zl7b+bk3~rNJmlXSDYf5=@FwmyWQmS3@TX$Fs4esxi%kRmCZFx; z?zH?4kf7_An$0viFGRzD<`aQ@Eo7l-Mb^dm4jR+CW$y|g^HtV79S=Ni6V5hwHMnz{ z#u%R^y-Qyo12qt}pU}xWn!u>^nmYoyZER5_)_0A(4`gGgz6=?+l>$CJ0f5^u7o05m zlNo4SDqURb_w>K&)Zk72_NFzfr|tO?zx~N0(Rv83BX7OHXM?ym4<9BlkHBEJP-O#! zyOlXyRt^gr8#TLVc!3a0d;`B>^W*b>p-!d29eh=9n}VA>{y}e~cz((G0yKXhEio<^ zE|A%6)W&@u%gI53FGfD=JYbQmU*2fHi5kdqwzLeKpXdfk#e}uJ?vMSB3A1;)T?vcc z84$P##0kVpI%weGLbJ&FS{?R0RIzR+@5WOXy#>g8bbh27_Qj6r@9^Qh5}g4Xmo*lIZ?gx% zV}C{+n{G(e>jK3}MEchfG? zg0W5e7merSe97-m9x8xFZ%QHBJ3Ae*haLUQc$5PG9yNF`q>{?Y%gb{oF@+ymrU)?QUhcxiwR=*^7|+S zsH}R^(cI6#lu)Z03!TTWS^y}>djre)THNDk88Di>?GM-W)Y60>a*9=($uA40XY8Kn z5FiyA5P%}Qb86b;aq^9*0-8$(Z8{oD85>sC)TBRfPtRzY20Rlwb6_JnMyNBYMs@R! zqqQ}0w5{?kp++u8?%{Z;&T*bN0aM{PUc^Jef<#4~M(c?&=G0d1>r2p&G;sTI8>7|1nU^AdSOkYv_rMlE<^= z%*a&H80K5Ni9%*icdau+LzO6J0&yL|WLnsI3-AXZ#2%a@ery|hJSGUY1pW$TuknLi zukSi`k|w%|4qSGEv|ry_4s%fpl-;yXor2}7PHKTlW0}(^6TGhzh&N{&jD;P|5nCC! z3f0`xSZtwtus7?}-&BLtlU{`hLyMuaM?~Uj;8Frf4S=s;Nt1F=aFN9=DI%EKSc;hS zcIVShVPRM2OtefB$OM7;hPC*KwNCkqJEbd$E6a5)xAFAM=`+R4{KokvX?mN=Fn-f7 zzTFH$X74|KFhRLH|D5-`9(#R_Ob;LyZF8|HK#W`wQ~>lXFH@c>&Z<#ZCq@CJV zfk<6h7ngNkt5bF#S-Bnv37mp!`@o*4>Q{iL8(hbMu)58dN53{;J2P7MV75G&fza&W~48gnf~xWRwBf2DJHeT;)3?5(!yQVW{ZJ8n2k%KREU2{=lU{ zhtUW;8RDHid9e8n8D5fD0mFbeSBA>8KOSyr=05M92V(P;!FtE_S^=4`TQL3J#9?ob zH~W`v2_~Nw`?IxggjEVt0*J2B+cIsxcd5qaun(w!)eMrNu2lS!$%*r3#hh{J+ukxLetoo(sIvKw2^8Xotq3igoK1Bzv!b!+y{hJS1VZp`QyW< z3|Y}Efg4A$Z(67b08wTphDbNCx5S?+;&afh!tj19Rm^3kGO&QPL5FK1zI)DA?709-MTzJtKJ@OmANFzSB$b{8}`-txdyk)TTE z=W2Wr^CK8*fDDKvl?kIMrrjd~2uFlQJ$HynBqPO-vr|-9nCOWiJuDdqM0MYJb=?Ek zd-{KI_m)vnc5m1>-UccvDkY5|U4n$PlG5F!bPwHO5YpWU(lHDp-Ghj9ch4Z*BSQ}P zZtnZ}e|^?^*Lpv_d}0YWb6s=oz0ZA|$MM?@@7;%Uqyjk}JT%^Nf{$DYvbZ@c2zwdp zv$jo7%SyBNWOD1SOjlZB)?n!#%TgCwE6@YB>a5|`n*rV7-sD&hgi@;_gR+5W_0*XE z=q_AruL+C!cU*cFCB#)Hj;9fAk&oFjAydP{x5Dymt3(rmuimfqByP%hy13VjTYCjr)WMIY1;zX3 zh3wV(x+U#aO1@G80qNch^-J!tu9-3E^DA_Y%Vg9hXKWKwClB*%U*`Uo4nER{tUh@4 z3NFkt8B)P5N65SQ(T}fJKtD%1HSH8Vo`C6tVpPka>o2u<>HZoB(lFOs5qA7;SVNB4 zu%s_=FFufCbwGEjSi zA=rz*^K9Ukb-pkB@{(`YXVx1tZA%lY)*WP3jI`km!S_CU#EDYAa>D$Ej3wt!N*BlF zU(Wr2skDlNt*zN@kStsYNVvE-9}Vl-ImhlZ!&xRH1$~ZuPu;#}iA4)|8F2A_z}{bx zBreu#E;;x5b8gG}J}@}Ay&(M&C)eIe;9l`Q!5}tUZRP&jfYH#DgbXt?^Tvj{v9Ylj z_V$NqXLIQYvWB${lXJMgzLjPR2pFrX28$LyLc+T#UIKpMWB`Y}JpcCn5e;ua4w&flYM}m=5JUWB(ooLW~f;%>r-Rg);;wMj18KZrg z$EtHGBnt<2mIrUUkX%>&+$o;hD~LnG}h_BzLd86GVIsaNaSg$f@UT(^o0$TkXf zTMDAtM`lmgq8fO~@X2}91n#oZ)2}Rtwt&!e!YEPrSPNI6iQDkwy+;jxBf1683Y9X9 zDs8?+BuQ@ezV=z=q=hmEkSI6#Stz6z8&t?4RJa>#G~iO-HY34y$vj_iHmSg(K>up) zva^G|hmj+olAt9`t=^!&+*nD4N=Bf3U?22X3(3D6!I_Jm|4$1b_C8Q6)o%2i-UPdk zuVdOLC*|>50Rg?F&u-Aznx6?cjPxe+qx#SRX-`Q!wto-b3;`nLSuIAan+%wQ>&z>) zV0txv)Xh|8AgAhZK?Dt$4R{alDE?}m^L!8s)rLN=_!<->wW_|~xBeC2p>viF| z??!E+&8Hh9jV!McSv2&@?IPh>=o(6W_g!RWOMujze2YNm@#;gzHiTjDWTnt+*J}p@1+DyF8fJHbqa@ zOy-0?a5z6d*RQfGaPp?aIr-_V;h6h^E`kp>(-Z#AaGn`-^LY+|KNs0OJ>A|uK0T~^ z88A~zfDUa62fO*CWYA5*y>&ZShN(jdWF~(Cl%g^69P>5|f2+JUn9~t7gkISMY!9Jm zx4NvPjRF^a;?_aKx~sQWoAVo`q4U}Rj0;}xa*^$ci>Vbp>V+>$tukL;`uqDMhKE(% zj~+RcIe-Rgd1a-#b&EGv5Wsq@PF9MzFi(l8fJ@-n)29@K6oe$?wziBYt0Sc-rF{7$ zE=5Wn;MPPEcwt(O7mlR%ljlKty!A^6rm6+h=5%7znf}$eBj$2cubXUlO58x>5bQa< zV{?LnqbWuL-cW1TvhChG+wo9Ocy1J8^9sR)!kz9xV+U@6= z_uA2maKkNslQ=;pJ9p-#^FrcuR&(G;(la|v$X zym@5ekltQdB+e*Z;Hw%t+Vw79qdW{W-vhFQ(puh#?qxk!|KZ<^+gr$%Rflsq8~5}C zvelX3vRa2le~pMRXmb5@gcr%`C32*}88-vUG#bTsj$Oau1yzvw!^>ve9uP+8fxE2s zjxhvW`g&m+!YMXStI2PkKBDAW-mgl`1IY?4HuX}hX1)#agEicb9UR?R>Uid^QQ2wzDk~+w^`kLuA1SxFV5x{}7kekz~ zc=VWz3^V?lt6z^-1Ay*^zjWCC?t1&=$&;Dwv-b7DOp$;xHOScaQ1GHSm&Sl9$vVkF z{<_W>%o`lWP0srr>@qSTf3hBmI-3N12|kn@NaQp|iq%54hl*i|`70YOgWlfWiOlLY zzw-9Z@X>Mn_kgyTvb4(Xw;NSo-I$<}{_#R+j&{ z)PFy2?p*#oeO;9ipEpc(%;>ETjE}pWj-f5DUdsIY8y~knQt?kK=LRc2+73+Tqd%-QeHcGNInTSYCQP8ChO|z zs-a;9JQ=WW-(c0iv>(}L%c5NhvaLHK`91$N&|>C)P`n1sOI4jm=SwC6jyPRj*Wcy* zAFRgzTMF&}hbFvbCQ!E^5Qy^PrvwDIKW@_jRB2LD61Z@Xy?XibUsc=Cdq3~mgJB{F3=O*To zrT_9YTiGn;fLqhdEH5`V_k2>pS3~yRdF`PoZC$s@GQpk<1bfF1Hg#<7&>E=pDYW zx^!CCs;Ht8BTT@mS(1Pga{)3Qv*7yr`xVW2Qy;dsw*#~P*KHcm^S#5brKPpF^t=vR z_lzYmyAn@RoqS^~CM!3oT3K0ndU|e*oOpcaJD#bpB2~GlJV2cF_)F#H8kqsOv9Via=Z6)S|_g`@Kfo`NxuV4 zZJZ{2a9eKi)4FB5eont)V_+Oe`DBHGF`?AUDLmD3961;;8c)C<3`tBMn>~25T2WId z3vkZ}*g1?I`(xz`$%!&;o!8B^#jyX<_di2q{%;JL9;Md)#PP*BlW~*rw>hUO+40)< zOw85yxG$@7Qk$Q7syxfnH)q9^PYoHmq4-+DKDz}T<(&V%n5XU07RG-(>>t)x<4Bmq zL2JybT3Y|3m$PDSpT-Fi{q=~5>-nPBcTZxPKD)sB+#gQbbJmw+zp{UHJ%t;6#l@9e z_j^K6QkOgRc#lO@r~aNTNxSmd=NvQJ54$wr@_?02zZYz(_a+wSo<3JIVigts?&7%Q zC&ybID_7;qUhU;^WAbQBb?0A6Csn}~9l{b$IS)cClsRer zzd5G?+?~h=uQA#r%7ZOh5l7mtr;Z%YtJb_ECCXiWVl~y`+V`k`&l^G;CJZWrp`}eT2FXJGjL#f+cm!PzJrerv+Nz zrQRrmCnh*B@C74dOL=~Fb~cbc^7He7)^6Hm;W9@EfdP&>Mg zlzBEQD%?b#de{Q#LrQiB2j_b{Pz3Df8xBF%U2sPerdJ(BDFpUhz)mGvYDYXrXw9Ug z8y>g@C!)TjxA806dD0YB9Q7hj4&=gD;LL(~d~$oSi+}lZ29g)qB}Ft{v%H9Dkm72e zUvsHHBMVpCLC(GI(FUEeb<}}7cy6-%q((_|R1Cp7^Y;m*u;|`=&88-cOygq?Yii~+z z$;fPgh~)WaNT^H*ZXeqi9 zYp>!i@&3Bm_Ioe&m$7~6=rBYIZBI)uIbo}0Z+1%^QOGo|^(?gjTJW`#k!XM6meJ&o z-uj>%^E+^0c>am|n357SR0v2&fSuG8cws^b7^S79L2Pk!e*U7DlgRKph&+=&eoV6k z^!!&AeP1IZ6UBh-myVW}Tdbl!NO%4e4imF6KU|f)EHkP<`h8|y$f3*shZaX926%c? zQkVknFMKm^Szz!G_@Mn4l^>o!Mfv2gquFbNb}%<=!%dSA!d~&aoHXp7t45b(?!0ij z!p}`--7q;nsonb~$CisLc-gF^;YGMQ9Q0DN*k5x>`yAY()?&sKDc=QqmB-YjWb$$p zdC>HuW%8^%V|Zi4umG(CZ8dY6`}`^f956zXq!Q%1o5HQR$GbCb(O}qlUazGZN<|~V zip*Oq+SS4qyK@fz-~>7<(tj+Cx%f<8Y{u&3uxFcia`%sqtU7=EWN|bRcO^;C=2s7r z6==$5ZNq(PovHAXr&|j4QjI~7brCZwTD?BPEkWjvouLOym^R z(x=?RnDsv`pgpE<7PQvIESeeH^E?vGfp#Aw#?B>OZ!!Bv&5L#!j@bK z+()xB(_np@t9KbhB9*+Vglf@P>}gPlOqX0{lUGj?tNr`GgSFpORflUG<{mwKs3<4r z?B>F5SdcKszoWv($LIdY{djjSS$pN?5tG)zB3Ay!jkmIJqZQ7S7QI83O?6&NjDpnW zvv?m5^cnWHWS~sSGB>k+jcaN}K5B6nP-^`ShFXN4D^`)NXXFA(#j>U86m{$ z0j2s%(DOCl5vpZm+1gS=Qe)gEF+A~aoilbb)U@!ygNM+`QoS1A)J`L$2YPOFBUKLU ztegC{0JmTl&;)%v37efa(rS+h4ADxWtxGaWJ@4de`m)5b3fGpFWR&kO(8XqbPv?j9 z{1~5}*1hu;la*jQS=RkR!_<^?7j&kkXJ&fLWE{FEZ-4)0H@(!+Bee`KYv8Cmc8cXz zeP%|XD>{|{OW38U_`O6x7B(JokA3`E*{q(%CUat+Ojzw>J(hXZ;SXz4%eGQ2y}xAb z;}A?@Pfp)d>y$MA=%=fC9ze+}!!jYG%!y6>doG`_$poqhQDU#0YP0UAwzgZ$>IGeS z7Sk2xU;-mxR7&87=~hZ31s&#IlaM5X)OpvCWUoIz*P!WSnO+uRq}UeMb}L|!DB45{ zk5J=4gjt2AMR?k0aR;CY8!Id0;fe6rSf`n1P%uKeIsfQa*)X&;Cu{E$bv62|AsM6n z)?TV$7QpaM)bZa38Q+m@}zo=a_spt4{_^PHZJfcrqJ9*2(;= z2S6#TP%``AcAZ;I4m9(Zp-MCxgPlD9`Xj9x%1ZU+@!K130nbg*hF1+qNI?PQ6E(gs z*2%o0>R#1y<2|zQID>fu!p^=des0>4<6`4%@!M_szF)+jgx&;I0c*$ykWV)B7c^6Wp6A_6 z?M)JK2rLM-HWDUK9x$s3FVvg*V<0|7LX6(k{diaPtmmz?{0wK-vW5cJjmV=hpH@P9 z7T36z5}S5(T(HG4FU(C-FS#$@%JkvIN3Z~ZkBB-}fg>z0ZWhcPL3kt_Moo1X27G*c zukn!)H3t%QJ&hXG%(&)Qu*6g*DUKMk^<5ce{6b!$tnY$e-txWljxQ%?*fq`=&K-k+ zo}TN8;Ps0auuor_4H=?aIp$#?GY&UGu&7n3=t&j4x)Xfo(mxC#w-d1r$h*J4lV%CQdp0izje033cCpF-8j*V3jw=oQ6VEL4gm}u@h7Y;D!RXWS;=6@CZ{4UCjo1Z+P zvNp3@-`-|hZeFiLM)^7|4}yuHcx)7({$@pzuSYk3=DD``Wp1|fXm4_uFqdB!lb8^O zE=iRl{xbfsEQ|ZR(`<5~V@iW7wXCN?F0)gr?N+ES-C&Jp|r8J(Z)<;d;88EQ7=rMTE3jSdsvxS z&on%NnqZ}Lsz+E=7Re%J()2ub1(+A<60LH{=3dY<5jPwS@mRg{6Dj`eR-M+PO-}ZO zJVacakvM9mCgS0^%6V>~r%X2|QCq);5y9a?2jcrsVu#^!>@|w?r_6CLXUnbIx2>DN zKH9!7g=l{VClC2h} zp5W#sV`LN!)qvUAq{$ok9d0HbFEOGahl^{2ne_DZ$!waxI;3N1yZ2|ix|m!jEstY9 z#5d>q0mDByk0gP}YXHzxnT$DZG*S1w^~D$#K5$qLe)la-)+;_SQS;rqci?!EM52Iz z04&HhIX``q)YH+bxa<6@?E6=5jNb76*Wd+)9__X`S^7$=j08fGY%T7`(gos-Gr0Ut z9~MPI@qO6qVg&|Rt08Zlb?+Ib>e(`N+}axI2Eq*uG%t$i^q3qY>US#abEIG@Po5rd z^)e2XQyr!lG%nJIiTM6qpNb{O z?@91YJyE0j`{zRDkbHt&r|9EQtnW`L;rpmM|5u`-ND<}Th3_#T$JDFcTMp>&Uq2;y zxH?`Lx664xBPSK{{L940P-AqHa#CV8okGWYaz0 z-q`Qx=)hvu{D?35z~uYxT@g@Dxbgp~$f&HWjE;^5mBG138(>!t4srsWr{3l26*Aju zI0u01T70n;VBcr=n2L&nAfw4^|2~bp`O<IaoNczTI9}57VX+MqCSE>g8L!=Y z#{2W7pcXamHT`;g&F(9wu@Yg~t4ELAtG6b6!^fnHfhMn|mE_@oirN85Gm_1ow}1vltPpNvlLG3A}tv%p7eVtdk=dTD9x^MhoClOP4a zoG+(!iH&X#-YsdrmNjfp5)>C&bF*i9?OhrVCe6Jdu`}#eevIQLA?;zZ;hJ+O#wY~> zv_xYNT(N&&_+6Pfr>i9+pq$NMtmf8I;JTpx|;{AFAp$0n_zNz)w_HXQ#}P-u(108Q;JENo+kx z5rC)tQgv>AX{%y=>R@I+U5>Dd5av0u@$%Sg_MvSGEaO2CHk5&z3BG;?T!WV) z6s3k4O4>UaFQ;ReB@)oK{G?>8f*WS+k$B=FB6O~cxo$qM$UiKV={-QOBXN_}N)msj zFPdizg`%X!!%S7%Il%PiL4!+Q;dGp5m(vcu7}& z4f0q1c-WqmUPG0*L^;#{A&lsC-D{21s7SPFKhDV+jl8O!46`^QJ1sH07isv81O8Mt zbTKmLqJ7>_oN<@v@|&MPe{At$;)HD#<%LqIRe{dV+0U!riM(OStXx_WuWr({vx&3h zWCF=8kS`NAR7glO+#MSz@#J5r9|y@4a*Ka+bmGKN>w&0Rw_+GS!5#D(DT#e)ioHxw z1bdW%Pg@ixZTn@ppzC|pI4`+BcS@v4alYx(R5=A)iK%aP$$&j|hW-n8KL!ri$XuP7 z(8KnY0OD2;$<@WScH}TwW?IM1|8BmUz>B(a=O?#q5L)+|o@ZvN+iMlXdn$uHzRefj zF=|R;AH-v)KWWGJo0w}J68vd^kG>dxmfet%^T2R6TmCB>c`IX=m?-;9ZPJOeF zlxjn+4cBw&?Pp24E$Iu5CbKk8%4#wb;zNq&l>hy>aqO2f^8Lc9pNhg6d24H$+{fz! ze{ixPv*fZ^K0i1l>{u&3Y5qbx(XFpp-cX~U|BH%cb?Z==_Mef+ zeNGQfJB#+}qp*7aoC~7LwK*gU6~&luQNbt(y1YpOySvHWWKKl|g7Eyzu*}& z?{MN9eXF3wk<%+zo)bDGJIs)C!u)XF2-NA?lPnwsHNQqwQ&Pga7*pNaoY?70@QG4i zmOoZ(A)4iJW4_;%y{?v*pGHTB_X*^p%mn1+L2KZdkB`p{8q3hg$m)uUr@E4)7>mwZ zFKlnJnQ;o36(yM2mE7g#HnBQ4nuu5Xqo>DnW#nYs5EmMKx~Mo~C1^+piTwk+Hyk!z z@EL8EG?OwN&VUNz?=gH^mBJjM(5??XVE&Q^2KbrDhYw(n%Zao68U%eYH#sW4a@ReX zj`5u;C_p=k25+;i-MSvLq)3hLH6}EJxC_GyRmR`fmvfrKnx!tuAOy!uyx*R0MrtZ( zpA%Eu4_BVRJNvB1n^dn;h$588aiynD?+dnxOwb39;esEN%J+}a(Hw09H_Qkyx$I&K zwBb|J(^AsXVRj%6-7_(vwIIeUbDO`um)Rn0xJW~PuXVYYRuHbyw*ieLYm>5vg^-!& z%`xUIasM%r4KXyU(lGzH-k`@NC+}01FL{i5wKbhL04rUu(n#>US{l2a!mhbhz+i@+ z^BS#4#;HiuuXO+$P6ab&8JW(7h4-hqjZ*oK1i{pFLVGqA{KxKC$s|WkPC<48RsY3-M?i8nN!)v&uccA?Q?p@T z-~DZcvt~qU7&+taHlc?{=-Q{W^zO+f9X!=C=nu{pV04J$SX!=uj#BD;0*9dRa z3bC`fnYQvNC_mpEs2CCA%dJxGG}I-&eY&rW9!y8I?k^C2I^NLy?73Q~@QNTdHZjo#2xpY z{0Bfjj?y2SPOy6A@LrVsk)v2^dbnfhzCT zqCkjh+XBFl|1tnq0Wn7=2p&}j{{9`;F8`3~WtDd|*}pS=1<{x5<4Hdn0e99AOq)>| zF0&DSar)qynEU591x;C=9$Uj)9HJb4P9UoNaFd@9$5{{@HSsCB6C5l7FkMM`w=QQ- zx%QexzPHrap-SUs-q}vTF#E>@U1Oi6T1xWxMz#gS{%!1bX@L*=!VP_C7@bV9d`l!J_shg9Q zZwjLfN3?A;paRy5|G{`Gh`i@;ykS0*R1Y_K8yq(bbUbwc2E=BvRNf}{A?UG_qRxl5 z;zes6Q13irb(%awOEgRVtwp*Vz)kR5+uWQfQ^dV7pU7mSW(39;n8@}2uiTsKPl>kB z^U2lX!k-Hd^!&a1kM7^U4=O{jsdIF5i%(Xgmj`HUg!JKzR#MX9H*i!A8d*Eqxfa?) z;$?i}#w8dnyTJHl-~#;F;8jaZ&y>Vv{s$eIu5t+X?X%WiT3mcYF%z)7{yeKt**Ei) zkVE4|z~w*fB60_t!=1y!T)AxwP48a&9gXe9%TSAYUweYch|@rx5)c|vxy>8hca8c$ zw0I!NK0pCv2>kNjUPy8pc?H9LB1;4owZ-eWwGw37}FOL_cw9ewc|#I#<(eT;;B&P>|Fj?qFz zj@iG&Z8sqitv5sb1Z*OPf_!m&@V8^pI#{Z^cOS%{bqGcc$_C2nT^f_w)yu@|!+1+3 z3DFF|?+IEP7?Fh)?2y;rzZh<0$Ky699J6L|ULv zlHM(?ta$x}UjVuXCLiy?{TONyK&mKnsCQvC5IO=H{_wIjrDGo*vlmGIwuY-Ym(<~RBO=27Q&(d1sv z^n>vpJIKpztV?40GB&*_LnuJnt6C9SBO78V_L0s~VPz{xUzb7UTvJE&FQ8c;LS!)A=o>l>;CaxL@OOV!u$0V%O zf4+nqujs!siqC!nG7_f;yNv4hvguN-?53KGkl}LAvg_hc>JGB-Ub$4RD(dwt6a%ZU zcnkfD7rSD09%p4R&~MeMmyPwkeaAq4-l%@FRy^pwht*`gO9;m%+Hr@z@SNa#Z$IoSmDyPjDY#93X16>l%H!KK`-K6Hd~j=100&2|NB_uLPNA8^ zt4JC5@H+1k3&*`-{fq9`%BU`4v3h_Ltf>Ixl76}~$x<8{=0Y;yzBT;e7-1;x0SG*5 z4tBGM{9eW#O||p`GoDeHrA(qsg(Yg2fqe^_$H%hFsUhlwO_Pz7yn9h_&fdFrB8why zA-Q~-*vcut@po8a-p5VQ<*3RtDuwlivE8mi-k@IpJ#iFMQ*vZe&drL|7I0GjD z<7WtFSqQiqfC93)9P6<&{alQs(*N{1GqdbEtMZ@>Wn)d|dH*eN2fo!Fn_@ZahYN{DHoE#n+xg%CLc*9w{ZR+YLF=39sibQAxLIo*V;hFIfi_VGb5fWekkaisMH|WMfmu6vo97ii!QL)cb7w_Z^UPw z2tUzP^k-U@k(fMwlh$~=YZG5WA?WKk+@j3KR}Y1 zy4NbKy3dD~q?_A!ySrt{FLi3K7Shk8^J{@&5ckpUe-~S2C*0Zpbuh%t*+#G2xBXWT za5@Qu1O`b4h8Q=wKIafs%I^<9Au*1ktoPfe0^>F!YU$#)PuJHQr1Lfqh;fciH;D0y z`dn@UjsZUeH8iD=IT(HFJhi)nE7>tN_#TdGU{LNG(FSMOnAn@UEhVk`cx|4!c9z)# zF%VERWQ}X9e)J`Cw$uknz5gBn>`@(l=6*}7hixIg4BY-7StgC?n=`mv^iEwgz;Ysf z8}FL$MfId??=gsvkJTuKY@nb@B3qfWz@4kCp`oFo@1;9zPe(?bh=GbwZvioA*Uit*&iLMO7G$gvuQHzG$ zb_-bKh&i>y9b_Z}aYJqy10+*(s&5}^Acfnn3wMiaI9=?(>G97tY(egA6q+q2n~5amf3po6;O|?N_#6u5q_tWP<1gsRfe}h z$9BnUIh*Plo+3vxRbCR&yUl?Ud=BSp2b!5FelwOIn>wrLlK>#0#eWoyY0@@NUSfHuc z?ClWez6O8;r8%K4I=y+%RUm2$>8!+UVy$Y%{Mh%{V?ZQm$ z{t)B5cggYhSk(I~$oZt0|5fFw5v%r9fv~xn2cU)>%rlKdPz!x%ui)KeTmw1(X2@() zV|KxzcQTuPQTeQtbb?_Z$N*KkuiWuMe7lq^16vn7e?wt3$vDZ|O#j0ECuj4uVm+1X z2jJxHg@u=^;d}BV*3aC5-88iCOJEefvIWQN)f_uP*1?wLN`Jg|CKQcwsk2G6Ve!dV z3^d3#27GFv(sNNXT%5h!_EueC#BOavxi#*&8rf7vT!9RLkkQrg?Rq#jB+HN87XcqO~3y zYUWyS9eCypQ#T5O|H=a7CzbL!=#&m)c5`(u&U%K19w+7m)we^!wR@xEc{F-M|T2tnY9a=P7wi=qD#aOpK+K>EaD zcW`7L8%k&#_vf3wLlFC){vpUl~f9gOsUtNbCiQj)rzDCDt=B8ICOOI&Q%zXGKg zK|@S7@^igBn9$->ZvqVml%&u}xM54l7Ma)et*VFx;7JPMq7Uqukb=I)de6A6>Uxsb zz%zKrxM#Y3o@YKZxry=kQn^-L_+%hPM3!r zK+-KOnzCw_sFnM!08DvW+N$@G5nz7Ak!17olkh{(og1tlvKwFwm!cGcrDPRdYoZ2Q z$z_VYHBc>1ZC#w*q3nxXnaFX>UCi!Gm0h7?FTfGmPuJ+?pKN1aUF+{OAwB-B{h7@| zy}bjDq-3s|D3%~eT#(KixB>iEj` z2;7^CfdS9^Y4e$o`)c?_3YjY60;e=R}YTsE3Ub590$+<}na!B(iKwR>1M-9nmyfrZF+=QJ-Ry;$i_ zMn)W)Yj!{F?+ymCUvJ56)A@IcF8>BD9_P%`oxe9QtP<(g&cc@p3lAqiGsq*$(X&bR z>5zFuvD(;cl|6|DzvBYuf}I0b!@3eZqK7+xALBm4q|KhAkU!@@cDmKxvVV3>6aI+o z@fUFz(NdICFI-Ju%O29y(OCy-yk^)qbmFmKiEi!$*h-CPi;I7*o|}9znT}iHYf!*& zdU;punT!l0yZ+47R0)at@)c51tJ$d7e#o*a@;yOfgHqD))q16TBiy$=Mk*ZmV5p*yy~5{02a)7zr{M{L9SP z?GT%<+T6PH%yjL-VNf<-;-|zpD~JvTYV5`JrtuBLymCQ0^I^yDjuJu`TdAZL-otUn z4s-MT{i?c&q>{!i^s+I+*ZP+iS%n68A-9#4m3q_3nv0O5JGS$UlBmGoB7`g1!UFh-!531I56=Mv1|B|mpkc8X;g8>YPe{mGXPB8qZcQjG zB0{COs}r4fD4F*$sbZ578o6#c$lxo&mpdknXxm@uU&|DVuC7*`u2|_!;?Qq!O|9zE zM1iw@JU2ANqA|tY0cNg-F{~g#-L|`kSv8-$en}daX>h`Cq1rVd5bu>#bM%7rsQBb2 zb04{sbaCb!sH&mbtUPp+=4yIGf`18P_p?P@2D~B>FFqConBCH)z;Y0bNJ-*#l;tV>`?Da=HTGi zEw4?MQ(fW&AB>rLW~LFC&*0inSzu-qyRz#8bdJPBplA>|a@P3Gmg&A)(_l8AdEd=(o@Ly{Ie*KjfX8NGiWYVV^gn)c%xPMa`GiM zw!`Q-Sx}(GnXFmmGPv#6gNXC+qGc~09KTwksLd_X*VU860ln;U`{s(h*36>$4(UM3 zA%;#;Mr>=m83j&cJ3B=0ucW9Vqy42HYf9OJ365u*8n}~*#XmT1NQV^btV|!f25tElR zg@YMt#ek;A>+m~-5=S)S=g&95DGp4zmae0id?*ML*X~YP*;=x~-M7cetaB&!{S8l+ zlu^v&VP_-{yWC#Mw79)srnAw4uN1i_A)Nc2v#S9B`V#S>KLw5`8vWrN z!eMVQaH*7;SIloaSCs1Qge}Pz7Xq0bAbqGZ_sAFlg2<=RB-Z56)5b;gC?f%ZF~SK2 ztT$gmj>5NEo4YF>Ctg)XQ0^$IR{rS!F>luxZn`dm( zI1Yeni_vBHWc(_MI!#T&;M_>YD!S2fpb{1lZjIa1fbp;7w7tGp&`-v!PA==;K3-r5 z%?-H{31w2vsl)krOm_x=ie$WY73Q<62Z?9+yF2qOg+Pgf%<&5g`yOY0v(~2e5=}@3 zw&6R6WF=K>niU$LxXo%pzI}s4|MZur3Kck}oPvtBy$fH3rKFyS035=-=)20sv81hl zGY2{xaoDJ{N4t?jelyl08Wob=z-%nywfGHDw-4wEz5hQt#3-5iX!ibsQ5jRCReca~?a`NceNM8+?X&AgT`~ zu>`T8iq$Hc3r`~^vck!olWAl(9QqyN|S+)10 zZ>H$5g>QbfIppt#1fHk`|l02-h~3Sd=`<0V>M=JDd|U46OgM<&7?c@ z%8IxTcRVm?0+vIJdG90)h9$K9`~3sGe1Zlu65(R|GX`;8cau)l2B5!ZXGs?a2?4AZ zOr`Ae&$HoDS-itVp!K)OJRGp{9KhnOoj%$or6e-9wX`(1X0B+7K$e4N9&`)brF{%r zyqYbu$~NI@EuuHU{!=5Yety450{{dBu<7^iaXyv2v&^qL>uz^}`pvbeF50a6M_fvS zg{!!EWih2F!aL znCWF?t|}$lfV$M^u?^G8EdkFjC*WI-q;PhSu&JozGYzhHC{v7jyn&BeUioidytdy- z2U9kiQOyta$r>{4uwl<%Nvk2GmE+-8M|kV)`@NSaXb!9E(FvmD5Mq;ToMhhQNCQh z38&d|iA>)(A)<+kE3C<)lwCc~vx* z^dTlxq$Ys_)+q`G3q`JvGOIQntiI;AR8{M*A%T(i<{dv40JrN+a+!Mva+9wL`nQF? z7oK{YXqOq02` zwvecEhk{@iG@y&(kqq`)ae^HfqWN?O3Ee+nJ!Ovf*aou4id6cSl(f~fizPVOS;TUW zIj!*;yzpE(9~|ASNSfYb*ptZ4Nyu!YpyH@vW%cfq4>X<*w|HV=Lx$31hE2?S6V!E& zdV6~-O(!R%DKBe06BTxUH*O%SI{}vyM8;ui$)SHa_XCJAIevvNz*DT&-qUi zK56f0&unzmGBO*>0Ug*;hQY3^mXAQgZ3YW|N{>P?lvsRI{?iQy=W*^bcqC zwlYS1z?z)LXqrapb9r#jlZo@}(N3v)ZBm7UogEwNypQV>oWK5Nz}d)Dz-xWE*0D37 zG$8H)+QTRAn;tV&358LnqSXBRjnf4M^?^}9Y?>^anJRi~`U&4;U>m!M7iew*Xes=)uqTSA?`KNx^h$;ZXB_H?9UYYd#|FPm9PpGHu5+__gz_0w@8l)_R$5J%)0| zt*5C!GJR4?>qmJF0CGuzG;!cAi&jyU^}N=h?7y4$1w*s5_;DbM+8Na5|3Bot^A=1rAOEaW&3?U$0(hM*lF?4qh&-UE+{YSi? z*B@1M;=A`+>snX1_XtdGYXCSWu4gQqM)cK6hEWnB*e>Q9$_J8lE@HNq4h^8%n(e+Y zdsw9vzKlyY+}ljifFcQ~@^kuJQd&VK>{+-`qq%!qaGd)j?0iXlaxs)=R0fe%FZ?tce z-_xObnvjt2x(|bp(8PI{SxHB#3;OMc*8n+(nnY|!zCI0)bHx1o^V6`sHaR5)_$u`v z*|^GHgYp180kjjH)qP{!ZJVQBwW?Yd{!2q5=IreBP#22=463wzXBx8!9+I-_n@Iir>7m<cZSSg{Sh$A=Gv;}>yjakeDa{8*;{rnkO-nK9)kzKrLc1->4? ztXJbX^lB|e>w+}fZxT899X7bHAMMa(W=Mq%l|eNRnL?@gw+;)&r9()<$#}n74I#K z11w*wxXx{8e`SurU$z%m&>nVFJ78vhIB4chOKY(7Xl1|dQ)g(OX}bEEd=lR`Wxkjn zXOkx3o}*kq2y#(3#?J>N&xztc08^6qM+#3%XhGLecrh`roGMi0gA>8<;`$;*3@#@n z726L$iflw!VJ>?Q(Ee2(HF@+$OXzfE;LZ=ootBTN0=Wh4Cx&WXxstsSNoXt#IMt2| zt~95A+@Z=H*qcy}DBKqFTi$TLwQ|^6fxmJ@;5_)3ugsfY%&P69H z!1T#~UJDIpSK*P>>wB;+fKv6|`IFvTYKUSjqk(N<;p=p~Wi)djtQmCKTqbokb+LMT zICgg5VR+_0?+Kg>fSK^M>z|%giN*mZ;Ds0Uu!5W=BX#THY-i77A(s;?py_tS_0zq1 z{pBtM;kh}1%`#OCVg&ocZ_M`j3&3sLNxZ_YE7(0rTke{<${J?aGP-se?I{Uei{0aS z)pC>g&ZfriSUSkg;{|m|edtV_A@`&H&$sO>>=YbO`;<#RZa8>SE(%7V^`uXdlCH8N0Mio}- z*)Jrm{yaRL0;aMIEXQ1W+*f}F#WAiHXus9&kKQ4hlJKPi45R#G^u{a*X6mMHK+CI} zVO9zu=I^eTE>AwTH>&m6^;izub2%M?Mz@{(kO?7W zkCUD(^^NIuSPQ+wBSmVR0+_2+tgoXde|>%Aztxh!gSiY$=}^TR@Bjo}RxzHD;R(B) zIX5wG<&2*gCC5XbBzJbaF_X)Z;p?*4OD$d}7^OM77RTr+?6%W6$~NBnq0AoVn9WLZ z5G;CPIVL7=Z_b&j=x&8%uPto66pHpcyl5yvqtP4TpE`~lW;oMyIVrST3b`}e*PR&+ zqDGj5?M1-UKe<}wz1mF>{fAwz!me-aaE$@JJ*lXXWW&$e1CQO@n6Jz9z$QABU~e5z zWy$I`ImCqQ&x9uMY)qC*Td>AZ33lZ@WTa3gyhd;>{y${y{m+*z*CC%-lw$w9Ur#ql ztOgf^FTl^*BU1bp+LhBJpRwz{fV4VdYa2}$d|rJbH;G`7`ZtZs#9`I>Uu}BXATi&W z10iQKwx+L7xwdwBZ)+Fp6|(t%l?r;CBOjySqmm-F*?JqCHuWk$Yph9y*PKSSqTB$; z>^_Vn)3ofFP4%x^?n4^Plj!XM&n!M$Q>`#PJM=chzHa0W@h`;geA_?cpZ4~C?P?xx zOXe9?zN>MXa~q|A-4yi2IX1smnc;j{nD!3G6{+f@U36eax3W1^Eh3z+TU%dEGpMc; zV-a?saYt{j?$8z!QSLM|Z#j_K^V8>nO<>ummjY5E?6XjN$FeUo44BtNH}Ts-fhqkX zdfTerFt`J)czMp%!e$}U+vr$@`7G*&I_c17ufE8UANme(#^uMBKy$wk?sdm>M*e7?|Zz}L!_=-cl4+mW$CQM5hvcDvnU z_WIpDpaubIGQ0fHFXBuuQGCL%Wt@5dOVZ`f_a594VF%cPSR?k+$Z6Zn+&*K`m-RMi;wL$P-LrJ?6x#x%fc$yW1_uQV5 ze>mKrIPmJmm(LF>Shs(vKAg3yKG`qQYk&jf&VsGB zE1D_pNjo0T;JCUb$$TFFZrT_P7(W_5IV!1hho6Y=ucm$s*jIE~sGI#ah_Hq_IxI$9 zR=X>Lu?ACZ*;Kf+ARDpJ5s{m;v8%nx!{p<(?LXHdEpKjKQE3}G6`Kz&+1Ts^476xD zX`c+Kkav<|`W1OcTuf)`?M8|e+4~|I`jv(emh02Xa(wXeg*ON@024U4_H-Vxjr2Fhgz-~}feL8)od0t&Eb zpEGMDmuG5n^G5<(!=_V~PZTtrBY^X_x^!gGv85bD%yKbd1xAj$6apLRpJW*|FzaQi z8Weh!ekw9=#DD<*t4)t)aQyR){m^dcbJ63pQ(K*qh&0-n_Co{nw{bQk4OGHP-(K)E zepVpbl8klgro{hgesexZKV|dlKDEFPnWB7}q!RXJ5XG|i>1Z_kAhTJDZ(DzHFvfrH zB(M;&N_EIQPG z_jqCs*ysKpE) zPZ4)j@uyD7y%2YqE~Y{sK8^yd`E(6@zXDR$sh^a&y6iWQC?Sg>ui2&46}n3Q1fEn0 za=O8kkg$O7|WQ7`n)MzrAR02%ZeW z4&*cb)&flD*%z)madnqt47OjUK|46Qpp|c^!c~=^lp+MT*_dt5tYn>>*<&?0VwaC* zh9B&x4@jP^iB_3!HF>UA+I4j&3||fEMa(>15_fiRaIAA*MP2(jSp)s+%=O{ba`EQ& zEaHdxVA&UUswp~7&8o$LKJryOs7`I6B>P(_=(wKof1h%0fNO`8Q~$-QmXq;fyg{K; z0+628HF&$8{E3?Oc2%IAPdZg7E(L=FX9`{}o?RY1*}%td@x|*(a;RG*XnduDpLChi zInFjRKt4$cukm(if6X07!zJF%6!rb;=;1Lot%J(XJP` zI$TUwr289)m3{v7<>0F5%`rGC+o!&1y?Q(;qQ3aKR@wB{&jM+Z&`KX1;0kw7juy|* z>TFSVTZNv!Ut|a6%W;lzrkGAjk%ot9lO6v9|DqYRh2X z0@W*O*Ckah&0?*IAEr#4LC+u=H)(owI6}<}bTZn`Alf;-WZ4}MgmJm|!UaK!8{)%9 zmBs{hTz+cUWT(eH5|LOUvs(|y-C7o#U`dKR?#umDzzR6NC<$7k*XH~Y%33&8UuOJi z@(wX`WF)Sw2Pqx$)VKkz2d1~pafh*KlyoqO2m(L9s%g208xXZ#)4enK(eI+Fx?)wM z1Y46~6gW255+Lff^K}CQ99B4ugiQpsi|lGO0{iVVr9*u1(*!!>pGer^lB%sdzW%xR z_TcBxM=|t5`rk1o8~NzUjEse3A-wqeZ0y8{s;`W(*Fms=svNZrv2%= zzts1U$yFs)q8R>`h+5*?=|HTgrz2a>k3aNt6p@#pC72J=?68}y#B~j`{5>K+m+#0m z_bsqQF#NhZ|GQ0@v=FwC+y}p*QlM;*4&^?lFjusv{{+)k0pbSSP6}ypaetB&>ePS<+>3jKUfwX=xq`0=axV7Kc7Kt!v!YlM_*9x7L3!%Z?fLkyi&3 z3kSDY);RCiNxYQ_B`XB~_D<&ANc-tnh+aCh+@tPl2zSrd$dk*c764&LknPzOOJ|Es zd_V$cH2b0o(fY2NsI|%i>&$@5z4~+uTjepE@7|;EgyS*yYbn@2q=t-s_EVnr@lA8B z0buGtbU#7;^>uj9MfdWSVCg&jVr=#IEoAB~_oR!-46{|%0BW%sNt@}1ACqX5^VHI9 zbV^F#cHHlN*%>y~mJ#3MByMEIW`s!zWC?(O<>%8Ua^x&3F(O8|z0vIDUW_IPA+Ws~ zs|zbYIOwq?X(s9hwZaC{s;moq)&+~WXAgIF$JG+M?)ysz6nBOOxF4h_zc47ufi-! zzz(9UcW^!sI7{)~?v^#@F!#za?AnxVbXu)9#?9ib3hM2k4d>=LXGQecu01`51iW4; zsMdCX6QTB^h-8-lRsVqgat0kUE?vgL@|}{-x|}IGLBQ7NYGt=oqIVE^F73ajbQ~|C zlGB&?{1T{3MtWvT4QvAkr?J@FfmFr6(Qlaij~IC{ zP; zwJr!x;!~K3hQ@1hnXavr2_B+Y&P#h}HeE>NxMV}vy^oEl9H;BI+z(+%)vF_7j#0fl ziR@660)gcPFUFM8|Fv}3Qw;&shSX`=^QRROHxN4DD4mFXSa$wXiU`j11v`VsT*bRE zonV?xxGjW<)0HyFJu9i{B(420DS}c=;;VAkI~eZXii8ewnJYDr=&5l;Z4V5+(9N0neHcQchH$oL+YS0Ca1%$ugYb66`{!8(sJ3g>B!pU38fWSKG~=jPJm^W%&z6 zr{?OR@xU*Q1j;)01EKhIMkb{L^OO=)|n=~b39odnFvM1`jPA{T9v3OAp zAD_1gTGpN2H}b6l_d~@NV(*~lb1v}}NF@}M-qZ5={zNldPSUh{c1hO!u~CDEG^zX0 z2sc`Q=8Rl01l#Ca;CJ}$NQauvTNd2(8!^h`Z_cw~U=%!W-9nhdi{7U+d1>EWbLku5 z0)!JrY(U7e3{i?zxa(?nn+D0f>3a88$}*2uh1HziXVoWZ{3y+AXd1nGc=Dqo&5251 zw40_yXqupzcf1nDuiS=N__{CAO3pxuYy^$`mdD&st@Xlke2M-+cV&+cr95M{t9Xs) z*1?r!6ke2@KPY0#!-2CS3l6ERw==KhD>7^_$9#P7s6|!{KJNS0Q(mwa8NDjUQZSqY z>-eW35Wcs7pU9W)S>zUsV%!4>Rx=GarzDlW-mjWDkd%5{*=F9Q0?`>amRxhL0TlX{KtDJGk7BNYA_l#BbO9=>9&~KxsJwTFhTV;;k}Qs2-OD9`jYK z|DTU~Y`*Rk-;-WNadm)T#G%Z%=lc2>)}ocP5dQMF?Ab5~Z&Iu0mH@nlGqx!&+-vbE z)}m<)dHwy9Ip(kg_tjr1m!c~7H+b1yvN~nMsq!)3KaS73Fx`%dh#(X2KAh)398#d_ zHBp9@a*r6~2g;x!lr#GEcBy6j7YUqUy9NzPP1fr^B9#zm{l*VTVD(j7e_3KQ|0|pg z7c)kc*y(9|Naj~w!3^1!w~0@Pqy9fEfMH6L^i8)SM^aT(34YJWi zCP#`ePS~s2oOz?PTX%}f&q zJ+!Pb0Hu3PEAWWJ$P=@(&)#L_y}o^v0^y&!aRuuPv+Gf{ZUK)V-81r0?6?kzMvqq3 zl*!Kas7x)DE_}lm^R912z9odl1v@7$P0vlzR*f(51~eF+GdL%tTCvH^CKW zb!lJ)Q`DrS?P1j@Mi9H1`W@^^6Bp!O>EsHic;9o-E!|&g%k4Ne8G<>=i{~iO+SGk*SpNb+) zI`_=`zd>in`RYr?!^Ett((bSF6zSHe$LpySSD=P_UShr-k-Ry>pQ5vF(7pZ~**XDR zkLqFBR(QgO#MoXLkCHSV3pAVKYDBOE~3=AICq~a<{r<#su5D6QJon&cbL<2QjDfp?zqG;PQZu-1bx6!K33K zlwEF;RC4rW=fDjx$fru$25fx4<(}ASa89_vUGVL+3pBWHHVgpc20r(lid#ziSKcOX&sC+aIDiH^!F(w=P?2y7j)6PW;^ zhs`pc@><#9K`rfE|Dv^7A5r)ALn?G-JexPD6^pb{(%72r({WOnI91^{zDMixFBmYL z(UTX`-vijAHyY2};oARGgtFTEKHWY(Y*0jLIYOMDVQ&X^vVsxKiRFyi=| zW={uDb@v7R@=)r&ZRQSPJcf1V3o(;MVRUFVD(HWrC77rds{73jJPeQ{2RtgGG6P? zzw9MS5*yZ_Yb*J0Twu=xT@p9m$#>!A+0!-7D#+qErq&zpWf734PmxpKd%?|Ba-s6Kgc zZ=1nmqecQTO=AE(I$TMAjJrxa0BIKZ$tImeKjbF!z3*4M@;_Oea|^?j^a$e!yZ66S zy{O5(P>x|uxv6xvQ0uxFr*bA6Mj-<4UhybG@FKVd;kH+@5ykMl|7-@*2s+6Hfud~8 zy(K$lyU$*Pf51p6^NA3yXjb%iZ~>^^46o|hn^1{uim>xNjyJJI=FbBj!`MO;JQ&0^ zzKt(zxVlHt>$M*wP<=^)Qum%~g29sk!IU_N3X_L3BIzT`us(l&>}Zr7Didbh`&o8( ziRyWG4FxRSH~=hRSLu2rwfvqc|9IifQ&<&x>zgkDb`%}lz~U4 z+e8b~{Xt@6;pCaoE1A2=BFRJMnu@RV6&%zvr7jnr*x-*zIm*2}R^M>2f)T6nfY0$F zEnfNK%{v)_WwCd%S2)E7Gi1gc?WfDe8aG2hcJ1Ms#7muDJC{~7tQKq%@}GBsc6rs= z)pZKwz#dfCS&Z1eu$`xr^wttIQ=it>>zz&Hv$MV`(-0mo7~q_u{}wUm*&s}r&|`m@ z{w7c$LaC%bS)2)Gw`y%zQhRyHAMJaDzf=v3@^3QnL*$%CB>&xJ379CDLLHxXJt%?K ztV`XUNttvC8LM?&8ZHfqXVUb*#&9UAxPG@&ZCLHy zWVXbBxX!pu7tbSJQmYc0yN7ju2vZI(Rh1U6g-& zw#lU4uCWX!btc0KLr1*9E3_~2w{^xbY|lOp>uo;GSM1Gdj7t&qs6ooc938=97~FYnyhxU$|e zSP#wD#YmpHY0I?Ai!$v`q7l`0f~V=Ch?&=A42zaK!Tpi;Bx8*%Tm#giZg;&4h~kDZ~o5YQG2c}+ku3RP=tU!TlnCh2F0L%e82 zHhgyXyfF&0;WR_7IP&=y78QAe_4k7~k+067=e4iyW&ZQ$+*8w1o|ffp@rJj{vKwn; z$q%WSHOhKifpfqSN-ptGq!peSD4C1Z`fe97w| zpo5uZ$?@JSsAh(|25Nji`Kdb$KWKS}w)9$2e zPNm}QtFR(d>WbU}pBda4n9K^sILm4F8_>&Dhi8tQ(X%n^e|rhqpR=qa+^>Hz2E~8_ zlBp8*1yhc{Lbd|R!fI-#u|w30CVNSr3$^2K1aB>on>YoXp(dK{@iQf|vQDB}4PsH} zHQoFt)>WANfp4Rfy%9Y+=I0(x8{+3$qU;iRI_Jx&mvwg7Quz+~p-fwn(PI3SNi7W~ z-@@yh19Klj4fiVU8$Swa^E&uh(j0ct*x=JOHtXviYf{ft9;qUEEl&-f@#a=2o<4$7 zz%wIDk%ppUI%v<#tKREQPG2&u^g)=xn0&4sKM&k~Fx|eO-(q(Lndu!z@6D=*DqmLF zo-w;AIORbWl7(PFW;$Qy@Do#!H-~MW^diykn;fqODdT?~bDVV7j)D1VzjJ!EUU{~1 zZr@+yOcy#s#X|gAI)v0nr*xMRGk)HtYFQ`gg*7o2909sY;6YJp-gf;wRHm3Zh?r5p zHQUh)+dgW9xAMhs=0&rae>q5y%q=PaU_jt~GMk+pIFH_)$JrFZ9&+DanC3%^u}#Yl z(}-TXZc80-4uUD;dI@BRkaUx5BLMfWmI&I!4s1I zT>9MSoHK*fIo3k^5Hy4Xt!2l;S4-f#{6q22o;Cy`w_-t_jdq^v0^T^Xgw&2{lX*m= z=W&~_st9QWX?_=MTM#=h{OU0+AfSb*Lq2VmS6b?2y}fgasgmN(6i(up66|*TwijP! z`-d4^b7yEcpjq_doL98DFc}vG9*1Whkdx-=6leXnUMUUo4udmQl!sWM|!>9xPzbOpsnK^Q)3VU0ZnI_Az{RNhXf|YMoOxGofwYp* zIO?AM_SOw#pGlKFwz0sH`aXq_jDKn!KLzy^!nxztIPm7_6p;xd-vnBO@+GArY+m%h zz)*ZcCRg-K{N|wwvZv6SW>^Q;^mtgztG=Ppy9fESTBvlPKebFQ-m<@f$zI>1*Sg>j zWY=v}1Xe#|X1i_R0F~ErA6RQMknmtm-24i5l7HClh^fZ8M6ybgW6i4mv7S7h6J|hZ z;+xVRQ2pL;!Ei40AnoqR9t<2x-y>_YK#GeR*@xvagOvYvjAt`M_w`vL$wq(DT=c3*T)K(%6=%+IyBnl#?vdeIHe%`{qEw7V^3H z0e@K|A<%da;uO#7a8t>}yb*B)Z(C#PKJxQPTi^I~KL4n1l`TTOk%t#TxD0*XJ8|F9}Q=2OftGKtYhPCoRW-F)6s6MdvXKqUU zX3-~6Qs9JJ!-0zjQ$2%=2r-E5RPRQj#J(S^$>)Iq^Sh%VxukdOSbl&L?fQ2u zGAsZ6fkW_94i3`~W&Ss+95JuXaH4f((sx8+cPVGJGhZnLiO@jwe|)AcUKiaEt?4+7 z+$E{i+I2Z{h1mNR17c1O*M%TD>R$%M87(8<3Q5NJP55=B$cV86MuB-2CqzAU_-pThYXbS~ji>hOsi1y@6FL+|jIN zjHZRRfXQFpJTuKVMZ&)Q*PWQ>Gy(r^o&H2sJ2w9O;-Xfb?@Z}{Ew#qBL(d2$#DCo; z=2;uc`9*oWh2;8 zuBMGA;$_M)B&Ea$=N=Zc4cbFuu`l@9hvSqo?O&nC@-4i z9sno?@ZaN12;3g46gsm8kXNLT<#U<#Y9lP(R1`lAbrRWJDfuTt{aP z=8D>R4iy-7SVXve-Kje_kdS$7&rk)y+m$G}0XEUqLM;xjuxRZ*G7?X7-Eg&@M$*fC zoj?`s7S39iGb_;l01zMKvtprIt}_W(PPp_OJ*cCX&-xmL8$SeM!?DZSZm_Tli?>px zjyp7}8`}T*TbkV@{D`}3jLEL!n?qj*oGN6J=NFi>pU+}h;)K*SunaU&SZ4s#9O7a* zpxiPC--ta9s>C6+a?SIN*4NMmxyIc!zFX?e8p3}kGesufrgve){hU)&`pJiv@ZI%< zEhxRgP3CnTpNki#g(hh&%$9m025R)`tKd`vvV-UD9ziX+THBFfwk$X>X1V3faS4;|jFhy7mZM$Q6qDtaN8pun2J{tE2d3x9usJCz{414Ke$91GKOpu$Bm;6qS-p z&C%xXPks@YM#s1S+2Z`CwQMA0m48CE(NG@r+q`73X73rflc4IpBDh-H~Vrh42 zjL!K_vy0E{$c8Kw(gZSN;maI}_JpzTHuLBn^X3d}M6|7pyY8f3_G=h#3g!j69XawB z&x+YDZLBFqzH7SpR}!qVpF!N{l^SaYLKE)F-_i64baN>*7J@7K(*c@Y zp*||-iQ!?9(pmG*G_6v@(W)lEB67$}{&sZkv+)&mBk-WCbLN;4RX>No71msUtXYwQoJM75kI9YpXWT%A??+N5b#2z0v=EZK)d<) z3&xBN2G*iJb@7P zyeT3a^W)vPDoyGo`xn9s->rjez=lK$Dapjpm1&8i4?VH&3KH|C2$Gj*<-r%@Z^ z$Rb%-gylfAra&cQeROHDVGShNep|FK7HpEG#MY79k@pm}419r?FXCOZxw56I9%Js8 z}#U`FPIv87O@7T|h948V$1hjWtM)UaVP z43=0YPA(kDNFQZu!HDjV?m|2!drrX$sDOJ!E0c!>J}1@F`DJIKg49;SWtpE9%Itz3 zGe>FG3~VDDX8+jC>Pmo$+ZatduyvBFciWFw(7_nkt2|fjMp~Tu8-Ny@CLm}rXXo0|w2Rf&wGajUY0r>ReJ0@2`xcw_;#EfT4H-7@a{WFBdOq<6|3jCO%?6|_iH4*( zOqxpAN9}mA3&-a=bp1R>7rca`qo@9r~3$#Pkt;Z4Ux6%kQrje$9?oJ0?#^RC@1s`yY3H56lhR zaniZ=@ZXzv^2_+(NhJ-wJ8Hz(o0TR0`y7KpyT|`|1z#umn6$l4aa-^R)wlV0%XTur z%a1AV`um?uJ_^Ugh=xlD*0TpVwKj6$OTnw8y*7;M17sbQA}v5mxt@J)`Kg;}3+Ot| zzNiJz+`pOvZ}=fCruvN^c64Fqz|kK`dd-j5B?#?)(cr(Ze&YN;qL*ti*F!Jv`n%|< zNx!=Fl6EOQy#E0+Qj|L3_y+xdw6T}j2=Dml-UeR3B7%pV;&qf-w*|8VB+2ou|GfxT zPfx`8(dKYLGs(4^HW4K^0ew2f@Zbsj#edeZ|3>zvrQo)wp8ogKwc>YkG$~lI7gi_M zf5k`te1qr5UVl$>O*QU}`_Z)5LSK?#k2Z$_lKBk)$Ksm6YQ?5xeGBkfSX2{v+`B98 z%(H0C{;o<%0v;pkbyBCauRa2`^!uLx-FnS^>nBmm+>mV0_U%_r3t`%uh}5PNnpI3q zx3Fh;eRsqXM)JnL&0&Io-3vwg_~W<$-*8YIrU=!Vm5=&pQV{;1Uh&#V{Pme4jihRO zt63cK9c;f{k-GL}&<0>}O_UE{)~$SvjMn&3@qG~G4aP@9Fjd1MKx~hZk?=Zs*@X5V zkN>yyBOfU5aJ?)y2k(S}x3?}`{<6YI^8rSc^w11(i7lWHnmI6HJsqgLc<#v*rLpyb}w+2K0) zc%em_GVx+6LtlA1mYM{FJm$X&zfNEcfB}|&N<7}3LT6o%ORw>#A^+-Fp^2$vpP=JR zZz3Qkykx`r_N$O>_>s2-@d4jH%6?ZRS>;$Ined&F}LXDGiZVfbrEbEFZk0a0N6 z%gXv`GkrikVN^!6k4tB`os}eD`wr}JZXZzR-}dqHx;T=Zx}%8~koCpSp91TfF-Lt~ z>$Pu2Nkr1257kej7$L;oa?I}tF@P3QcSjRkAN-jbr#5NHAG4@O*W-9UQP25UrMZ&^gs9Ja9^}o}DK5HD$*x5byr=(3oNQMCJhd!Rfp#>EXwKN?OfYtWV5*tuQmp9w%GSt z3o25Q<+;tDZX+Rb*lkcUn^bFhQ z|Az$}r8c>q2Cy3}h3esoUbUVpyvUM`8A1II$3VT};P(dvNRD>jo4|k);tei~5~?I) z;1f9${efpU7NVhuK+VGr3k$Rg=Qdl`t=C3mWT=mpzn$_TtFI~*lP8>EiDegnYe6aD zvb50!kdaOqQTLsE_99~xi)z}z%6ZcN9G+Q)m-)`+S8teN>2Ana$|2=_Twnt+47SC9 zC(EduEC%*lXIQB_F$Ze`e-;xKKAndJKVrzaAM{Y-_5besK6K{TuZvc!=3mGSi0D_W zEXV>r3nNrMj$Zky$;Z4ec>#;|lt5g7YYMO!C7jo+qNTbL14jMYLc1dw~k}p#Gn(AB5wLh|?ksp)t)H7C7aRsEgiZOInYMFJB7gU0K zlH)F2Zf=DOv~DXe_KuG>le%fj!)DI>`Hr&0Q zP0UUpVY`wjmFKl8Uv;vwo3+ePxW^ zQ%*JZBUR@Mz7((*ok2Kl|27>DK@QB;yDxO^zVSIZKi+m97)6wH&W5h?%7zh-&Xq%= zb2aeut$ePyPPXQ-1K^uFC{gpb5o`Sx#UMQ>4wf?-;CuOrjBhHBnl!`~2^>R@`=7nZ zVALMXLEYycLB*{FmxH3G`SPv<5GSGmM9(QcS!7&&vDF|N65ki2g0TrdSm&;h8XWSe z09?1~_33wA!30NS%AksXPtp%J3Bz$&Yvji0UCk6M02fY`G+_v~LhmumEB!(`@cy%+ zsl;6j81K;+gGYc5xD@&I5xs?68YbO8K{kTAdlsZx7I1Y0TFV4&km1BGcIy9n*8iEh zN7`K@-@TcjKPb~szb(8o2&=TM$$ue}&1rd4FkwB9_{L~X>RRqWdwGEeq55shd?#*b zdNHet1qpY!kCQr;!Q1;IuRp63pi#e6Sl=1CUnO$~U^7Ribn@FcNrXRezy1`r)+T=F zDUdlExH@q@!AG?sZ8R+3Hc(9b^o7H@NQ3_7v%=WG<$qTTQ1?f*dimBi72WrLOb)4v z*E$sHw2rP_$W&&bxWn1A*w^+&ZIlQHR4ZpnUVqVS9lk_}ELpL{=gI0ob0*i${;AA} zyZabQvQ<29t`Rj~Aj&ctz+p2mafM)1A&tw8;}+FRNs=9%!>mo;8mKnc*fwTcj_O8z zx=W*JG@YaEspYL-P!Xr~Ic)?RW7Frj*6dC2$KdW;)wtltqFWn~kiY1Q?QxZVF{g~B zqDKB0r2O5S3|2|$>XrCk>_Z&NHp;G_Xa3RajwYij3EPq?7!~(Cofup!dK$dLdO-d0 z5OQ=EuNlX{&I1&et2d_&%QQatPepWuKI#b^n5pq@a1POre%==LxWu~EgvX+jSXkpp zS9E`hWK8)VMEITjs zI~B|0a<_{?>mk(ti!;|~Hr3j!KPy}XT3F(9*qN8kz#66_f0v8~c|iBhF0LT^E|q-I zc1}2l7D|C4JxFP>6uwdrFELpe@%oE;k`G1eaI6mOOTMhm z2&R(N&MmI+>!U^`wju`_9aYD?8a;7I&fUm=X%wYZO+QO)jj!B(@b zb_PF5_bh=x=)RM#OgAT9%jWy11{G>StB;p32#`|A3k45Z^SMDv)4q zQEi_MM2@gv#j{BT4mJj~raGT^5JEZI-@wAYren0@(3OvBZr;i1chs;PBXhUB|4M7! zUq+73-29FLV~w!TaCumgQl*3lm9K=-uz_lEfpl1CDma@xMyxRFfj{l281)DX3xdP5 z(p?P!okkBz8pMmy!DeCJ3xv zxI_D=sxw%0On#9duZ~$DRu|%bPN#J;@n7pH7_uM5de!R$EwS5?GWI!VBCBt*EiYAKQK6k=3vrm2`I#n`CY^l>OcM#-cOy zelzJWnR@cd2#GrV7pYH6{48>_|I||-^i4tQJdH;yCvk1<;aE?{yE2om8F6~AWLhXD zLmh{3+1Q?-(Te*zc*T~;Vd%J&uqj{t0DFw%FaloUPtuzO8O#>xhy@an^5bjqW%`NE zT3_np!!i~XnI)=7DXW)s$B;&pYu?O>q7Vz38!}dxy`tywioGxvXS^= z1h1SSsKlx1f&z{?NEws^mQy_q(lyUor3VZvEn2O9yHEdNd>yQJ)uPy5Rr^HLUgv0XZG0*`|`xYOHJgj*DuB z165@5`E3wkukM1uFvF&{*^hP@z#$o^Bs&wFp4qbcmkUl97=cbzJ1V)FBoX9q`jd>KMsdjzV-t`CPQy3B^tKqQg2z0z3l5xQ%7^Q>;%NBUB0^jxV)9fY8MiMk z3)e$ta}q$i=W;x4>b%p(5|{5DSjQ@)Bk|tpt;Bv*imVWErQJ7_D4}`m+*VLqsU^|8 zwWvlwo1(IjLV{OMRF()QDLte~iyVXkwAyPA4>YUrECAr@RNKp3_2ko4L7+-!Dwii7 zF+P*%mD#)B2xOse5!uRYTfL3Xo8*7cj}L(b_m9G}pw@jBEWM6&Raui7{8v>#!2w}3 zRp=wRt{+eZ^Inun3nxfhWrKmjStw&(dub2XT-~OsrA25;#kYPaAg4Bhumb7ujYr96 z;fvTI{UXv;WJsQQ-8iUxf5Xqe!hdyBp+Ngx;_aCNJjisKYYNVl&Rl=i6`&iJ3ZUhw z4*KGHvM^(P#ff4UgS-vEd9WW2NRaESKI4aRIZZ!|+ZME{WncGAVOk=NZD%NMe(%KJ zCOe`FXOVre#f-0!k;w)Lyf(08M^}H6Wf_0r%~&b@NHjWfDyQI9nL}R;OUf;e2t7N1`Q6nC$Vie)oDzn5Sb*Bwny8bi zewcn;VwBLuVh{ncaETid6GK2%V5x1V5QP|}ZHQm#@ZO1h9sBH;mOg$sww4Gs}5wFatKk=?7<+rqS9bpmL-m&BSOkqf_9%nCV^!e3mX6fP=F2;vdFG3OB z`d}E4dY7}R@tBQhq##O|@oJz~pd}DVgO{Oweev!ChC`8atJ)IZwq;52S+z6OEOdV59_)VOa;7}#wo(-#u-Ge7 z#LN|;_^&!Vpx9-j8sANW#2Xan`>)QE%jRLCy_}nYxlfrnO#5-DK1Yt|LO$i-Oo0Xs zzGyd#o*`aBN^wnP^hMcDx>%Z6uAL<&3DcD)=SqxBY@)~NUqG*!wZ!L-*53H@S#D~B z$?_Bzu=$ko9-X#jO@tjvz*W|(6s^5znxZ+aOXiu>V&rcJk@Gr(wwTxQT zpXwMHghmlwC(2uhm=Y^;emuyyNAr0T7}Fz`B%%I&Tdi{V-{_NT~`ACFymFfvWa zT>7?{1+F)DWeVL^jAIL1ZW^Js&ZW$0WhEGAnXIOm3_H(F8j_N7aHDeYwXNj$pUkq( zWIw>lHj4B%@U_r0Ij2o3E&1D@?963!`9P9yCWy!nvZa+M7@7-YvFpn1Ose$)$2%o(SXeJ#5Pt8B6Cz^{jmf2UoCj%02NQuEt`trwK*^wrtIl6#p5F zETRNIv3Bs1%0-_~mV}d(9&|qTv5JOqP6%xRy;EKM+llr978L}r(M53YQ&i(-NwMQ8r5>3}g1TQPtvgp7S;WSrUs zJ?pjj0Gb%wL5Y^!RY}^%ANEnVt&PSFFwUbq7d2i9|I$e+5>bqeuabl?_f2Zx3w>DC zc=ve!2z59!zr6h<5}=^_lqUxn)14tR$okmR|?1(Iazlx6N@ehyZ0P_0lAF95JHe3h2e>v=E zGI6!kjU`1I!tB|2+6PxP^aRwUw@v9;ueZ6P&+GxQ1kcOImNrTcK*vNMdGWhT_!YBB zF*B|)G0Oz|G@U_9ZnsH$M6iMFbdS0sT+s6BILer?0O$u;qh@;S5KYpIaAWSXhqpIl zVZjGX_+WKB1?Ia1oUc>`r#j3<>r4(u(X^I)R`Q=6g21g~WL;0)fwS;Y9m-%(!{ZoU z1;@T{4ly9cV;U?#ffuh6N2(X=R{U9k=oA3*b$M(uWr5xjuhqusYwfbp9wWZ1^Nm17 zL%cf{d6nr>eHsmt;AHWLnFFv#_}~FPvn+xa%Y0L~(eit*SO4M8wQ%-Ru#hC#zb5ex zfF8`Cjq19Ip?rOAw4S_FZ}YgvLt*FjCKZ;T$hMg2>xM|En#i6lo$chbMm0rPqPV@5 z&l-bo4?FwpMj8+?(RNz~+AYE-_C&E@bUEp&k63Q6z98wL8?%2rTp`a~m=2*orAX+F zh5b@%sh1fR-j_1lF1&`nr#fU`V2-}H`R#RS>Mac+K85PV}n1_nzjQ1vxCL#Pf*TJ`#OYy^XxJ}1dVQ{zE?I(8Io^NUhh}(CkHiYDgsB=R^>UZvCMD?|Z?hcBDsrG@N4AclBAVY=oB!n3P zgL$465Eanf{R-C)G?oVe);ZVi=mQV@KV^6NQ($a3kXOn-ALzvbazRPN-0Q5w{#9Y42?8M*U;TDbl2cGRkjR@zLV1& z>!!8Ej}dyL(TfMuw2{=%y5Ms@O)qJk`5@MaegC$L=zGzRVYnW8WMx#7qVIWDuIp1S z7T%clZf&KV%y=c9g??4aB>;~ER~V((2ZjG$VoW@l`tMZ-K_kw;S6^iRe|alX@fz3l zYGb4*TXw_>?X=c^?Q?I%eis9ZrpKoNy`%r-C2+yY+?R znNFg{@?zn12pMn2wZXl6U-eUsyP`ZM2jYiq?GD;-;Nr^4L;VtX*4EYsT+07_f1EoV zqmA$5MOt%u#R3%ubrz3JG49pg!~t1r-^V@yxK!}})&s4-W6>J?I8FD6gbHDs&lw*d zFZeyMyu7^o?AjLgg^d5y8M z*ys585gVMA^&_UZ|DM0}XKflsU@wT3U;O7sOIax?O@s+5vZ&$j{EJj7DlO#%8v&1% zm+&8+`%7iF?qqH{CvdM*&QC-!&dOdX-PboUsqh-zdG_p?lEPCBpcp2aA0>Y251&z|a5Gx=)N=zIAE62j$8 z_AW6uk%i2PrAv50&$wJ2hd5B}^YaHLeS#k6-RS{%WeC@eiK76qhm2}@k#&1#2dh`^ zUInIaseHBb)rL%Z`)9HK&8ha`j$Nyqg@pxXyHdQEUl0+i_o{tmxMB!@XPz;1ODnw@ao$PpMxS6*F|2*svi(XC5!Q@?M2 zxI3>4sg@qa#l^j)pSrTLqD5!7RMa4d5}F&ySJ&E!kBu$RsBzg1>r-J?R8%A+lUYA| z?E6^216tcNqzt9}H=A9S+I$jj;qStJ*uf;5spAy*_y-rZe2(nGDk_o4WarJ1E{FxS z?{hAP45t$3#jMr7l+6v7ooxs`{E6^S5W7Pje2_!_(8F zw5aaxZharDoyjtZ%~(xMO%W{Iza1T)Cwb6sOba)785pEDJJ*Eor#vJQ+(tsAt*xxA z?meP-3%)^0x!!EHBt17bxBSwydw0GDI(t-s|DQ!;E|3>iJ`om`kWgoU&~k7n!|Ifl z|8jrxnK?b3+Nsyxz2fgV26lvZ>14N^6&W6`2>0}(d-6p1J8_vQRNzV*HccB$ikQz% z$qW__P)L3(?Ca-`gsDN!D+NipoO&AKA{1hBi{$4xUc^|om5c$9u>YPLf1Fxtw(VxyYVl5-L)pgVMs zdsLa7ot=coOz$FMBDSrqZLoFW?BS*DOt-fT^Ebt^%XZ4lAbLIM2z2+w`cTBT zq{=w!~-hb+Rr8EzB+f^C;ujv)6&*vGh6S4 zEYKw7w&8bJl6-%2{h4nL;I`Ev z^@D?hS1)(nz4}vqureR2zFySG8~)PhlYyfwa_>=hy}oo`T6S@Nzd+6PV__A07Z=MB zi^%p(m}%EDR>e&>JGA%uLe0+V#<^#G@-?g+kuTc$wEF+dNAlONUoNN#_~$(XC=?3Q zn~9QM?n&S#V%946IN8p~$Z%x~aII05PRqk8SaI)%{Z-8~^Lhn>l$KxMd?-aOJRv@Q z#*K`{`k?dSi2UmwYYE`OqPpI-wzS-*LKf(u$BR>izt^~K59ci~`Q|8=tt^v{I^!fn zMH$;dM9)xoa2OsQPFwNwdko^hL6r;K2EH+fR0eu9(uCFy!f@3*;nu+X(W`>- z52+vDS`NGnNWX~?f1u4re~RG^Ta*GhmRDL)j{O2fTpkq1RV0T8O?^0oJD$#%4lLBv zi`gmO*m!t-`sl$-nNVU5+5l6wG+P8rl$4zQH;Fx1UA)5U(#fqdSBj1-a0V~IKoNjnJRCnXaB6k zhhU0LDopPD7}nX-F4nwWB@5-j0X7edgN>2=d~fe~YHcF=wCKmvb&lE15-?5=5@O;y zNx1s^VgQ#rO#K;8qD#LK`d_(V> zxc6DQQZAE?_EJDmK>qZ(O=mRSK#B18S~`*-=>DU+6Af5NhDgb{o@dtL4+L%96L?#6 z@aChn+~s_=8G)bQk88XydYiwmW!sytue-Ebks$4Drqk-}y|eG3`+%v^WO5n*jr{Tb zdq2}0BO4c21p)!RJhlJ)`E+}_M(AuQ;xei2;xyQ0YcMk-JzeE14WH?1UNwbgwOKgw zxCEbesVfqku_M&10&l6s_%BM;#$csfor=#TP6EsMMJj&gDw%eNqv=nC$DT3LLRthp zR#YkqHg;f61B267L#ZO(nf*pCUdrT>Sez&11 zmi>!n%PRAu$Pf}D!Fr0R#;`gzoY{6I5w7h@9vtE}Q;?zeM?Q9@A=IKrP#x*KUg~mubUlUTxpsSz@iOKDfQT~Whul_2__~c zCj6^H%I>*az*B@s-MToKJGSN%`6eRU)6Jlst5T$kvJt3JDbPrrqh;}ZoGqVJZNKR6 zgfUQQzX)&x3vj*bgPHN1meLPt!M|_cz8%kPyS=et@#)hW5Z5x5+)xvo9v&BJFsCFc62nZo^_OGe>5Adu*W9)&di#q+ zdS1Zk0gI{Hawh&g08No#Vg5?Y=6(obc2`HosaL!0BCTBHf&d3c+0v2`e0@DI?(HNB zg$f8J$sJct?T=%;@k5`{{zscCQ^<)we?FD1>cbl4#;)3lE^k9N-i4C&Yu-;)2^`VB z=67gA*!ye%qk!Yk`#x@0WPeU0+{nkh{{Bs}FoP-WKBTPIN~fwvJKqfavvbJZ0? zuUMnyS0~Ze-ctYC=Avjv`rf@XEBcF^*j4c7GAwTJU*_(fzmcU6vAxV*%wbh~zVRmdKCZ`Sfj0#< z!O}aXxMv1uq509QkSqHX3NN9vv55(WSFa9F2b4K2M_!N3(bChexBS2#gqMdk0Vh9w za|w7LSfJ{yQS~sHAchc1p&78>iKB1a(of3$H_GOlP5NTP6B7$8h)>6}^Hg71APcoJ z;nRydcarzTdbHqET5w+1m7k9d))#2_T&`GrHLe#oo0<*VLi@abt4m2ptT&2)fLEt-eHCT-5-XCrN}PEZdY;zSj0s^u5L`xNrkJ!GF3eSGcv z7?(zRs=<|&jcpIOl-$A0Ox)$aF+vU-DMK|%%E~paTN%!;!RfBQ+U66my-6Uykc|;C zrZqH6?c@u8x3Nx;79x56oy9u-6l<1m-PyUn-8!@FdyXmVQ{5;=)C(GdCyIT-+y0|P zs+!Uuby@C;%+cyxcmFgN6jM|H!(O%1fKl*=xIZQ5D^^c%=VUwo&x zpYb7hXtfAuZ6NC-l_8a=mb?E>@MI4O^5@SGLgCkbN^89~3wpEwNbrmi0`HRD%6-7C zp&5&Jm9aQK6w|aVBrhj}w$GBNAFY&%MxWrTwf>t20;cBozCKyhid@ zgfd=IH37l-3)*9`^p}TcEzBqDk18J+>eji_sd_uIym|$&f=spd^`)DMNmeq7eQ>WQ5B4T5E-p1S6>c%| zx2Ur=yILYTI$A{h(z0Q}w=)8M{L^z^lvhG37(_%c`|erIVB!;Znyzahv?staUm6-z z1lw9#MDy+zC>3awF!c5cfA{tE#cvN;C$XDN7Rr=U#UbGWDc|r2EVJffcOX53SzhEG zt`gi-?|#|m#wPAwbmP@U04`Zr;j|X~@}ln2aoBaf$xpl7D)&6p&+i;p73?bpnl1H& zVp2of1l^=pQSK9Gp1MV-i<@+)S#cc-Hgqr)gv6)9D*2a1BuOI-e8$G~BHMneo*J-P z*0Y4?q?~!$J%dfP{*Gr4>u+h{b(qg<@i7Z54j#Q&Z_mG`qR%yFCaIgxw>42i_D$l- zCS4r-Y)v34IAi9ak%OYcYUV%amxlWUZsp^?Lf zTZ>qJ0+ACDzmyyFO0Lv8uEdY>gGt6RrF=+6Z#Q{sz^NHG^-@|(aiA>?vRlYP&AyNx z!{i2yN*B|qpq9i2_sgKWRK8lzBl$>2ZOvz^E#cD6+FX`3pBvd#eeE}vh_io1)%7M* zvYQ#9HgHHe&GxRgFvs!aytUaBQjCp^#`wleZQs6mQ(W9%6@e@sEoN5SYykfp~2Q5IE53Z+uulTWQ?0Od5sgjYW3mb zu3e^5mBrb8Fh@%ZLT$tWJe1Bzqp6tqvZA z&2Ol}hiQeNdkcmEp}s=yP9uE^s!|e1ZAIs2kQxWE`-&No;Up7EyqQY$BOcf0NAWDv zH4mvkhF0r5WJ1*fvT>)a!781zeTz^dBctwk!9`{vsv85KjBQcx%#@kP<2ADhj}DxgQSk4@0_`yDeQ3_Mb{ z2l*ve4AIWRXa`#Ye9{K1tA=MUCH)-uPg3M1WzV+{`m73=Gj8)9S*j-2T#l9ra!(~( zJ8Bfef{${(79nPa3$(n?o8+Jr$0SHr3C8DxgB&5rM;t1zbv8GcXcI&n>o4>-SFC*m zQRuVC2dSz0LNMKw#6*6_m%r7;c#YNlf>x1q&$j)CB8{@ z(-W$jy7jWp-&Ll-tV5#ZlHS=1!$YOy61c1<$~(Odvz|VCmQ`&NUX~sW(b4hr^vu}o zZ{Y4<3OXU0ie%KQR~{`K#12=aFf2d*5gIyM>+NIW5&lx_p7*hNy+UVy|1Ln!LMd-P z+%GY179Xk30*M-I+-5F zCOpR@$vLjnA~CkHsW-l;Kr&C2#ynFyTi%&hjdwznfJm+N~Rvn?yick)tZBc&p|SRuc>hkyQgijQB{Yr(3nGu11P zURS>{4i`e&J!4u2O$pJzW0b$l61`rKSE2yOQsW$E6gv>-3$5 z6>}HfnsYLB3U*7S^&AzuzOdL~)$yul;CvE)- zAOl1h{K2ED6oE?fp|tvq34jXW((>NiwyUoyrTRKF%8YGgtuDVL!-6L3^*NHf5k4YZ z)??>K<@8F=hAO-^e}&LAB=4iXD~iZOdP49rTxXM~-JPPhk5Qu+eF7Jb=dR<&vkN9cCIO50Uyfe7~@lm8(r_@tCHf#EL-PH0z zp*J=xEG#@cTyOPT!>D6Zn_QyZ+Minh#1#s-o1u!`&-Nn;m;)3%WKY#w<2>JfUJK*l zFl}pZ&+iT1m`D#mj=V=Ak$l%i(-+3{`L%)1x--=Du zlBEYVS88Z1GwpjxA>?9m2f?;C zblUr`9Bgb{DzD$VKBCFac*ZrV$uN>u99N!1=V7QMowuR3?N2DIv-|K3H%CuLw~94M z-ki#y(CK!520;%NWK(UjYUeO6Xf*ieBOF3(*s4Nq?&%IME8(n@uW}T2Cj1#)1=6c_ zSeuR6h>3Z=lV!s^Q7O0f^D?rP5ix9&dvyo;z(X5O>C;5f)>c;zFBv>YBaVw>!PF5bJE&^NGF_>Cx??P{TrXbV_lq6;HMvV!Pw- zU!~Usta{fG3!0kiOcZHZT1R>93TWr~+P*mDRZmvEI6lkkG)$S%%ko;en$Sc3%(&?# zbqngG;*4rFhA5t?tMtv{-CB>LM!BG9=KObjC+nlE7ummm0aO=fAbEydvtOJUhy=76 zm-Pi)J!Uj&5F}C!rw)0Ay*4ndq<5|r==Qqw^mM<+h}(BYcvW&V1`hfJc=S@(ZReW+ z{pK&^4w%iD9_L40-RwW%tQ@Vo9z?M>AiHvXak#7{`3v>T*;xXdwTvawP4 zd)OpG)&AGxG)MrhC3iv5$Gq|tDBsONKJ6=}H#n0vyco>Sh&14u=&K_XCMYTGsArUZ ziApIgspvi`W-DO@sO=%uunXP;s@@CCaz{r+OD2_$N?q7raQKKxiIIi6jZ<4a0sF&w zYN-H7$-C=G$#j`*Yvmh9RNH!rGNyB@zUh1@;`jA&nm+kz7Fv*A=e}acY0r__A=Im@ z`|tUB%oUYu^JI0Elg+e-LLZs?(jw&&;%T%rPp+kZ0zi^3gD7qHPY&U z>mFoej6wswXUpmo7yVaOOoYFeLwDE#xKkz{c?HsAoAErcE;VM~$9RmA4Y2?a!ECDBeAfF4kR-AwS3@Hsz>Yqm5)FT;75Eh}NZV6o7rTu6W&Jh9tAQN`B#$EaS}%L zN#JD^P5r?OVR*I_FM6{7qhgh3t`6QNYLnG>_q1F)70T*xcJ(LjAO?OHaLZXNoSsEk z06QG^*HgWZ@EEEdcO~r%^GSjU>xV@q=2bnHkTY_!I=(YNoom!7mMVG8}l=p#JDJoez5*ou+s00suoc2@MoJ!P5 z#p&4QNodM_s>H;U#>I3biHx=rH23(miZIRgk)q>Ig07rf)2}n zqqag<7ma3I?S^C}6jJ~OR_%&5uK;Bo&%NcC9e1^)8t2U^m^Ln7LR_5O<-)-aJ3VYk!EIQ?~G21shR`KkGbEzRY~~i=ZBg7 zuL0#;Fd@#MNlklRLaJght*%pT+Ob&updakXy8W1>ji)wzT9*o#A|NFH`2( zP0D(@v;wPPaZb#{&BdZo+(Ee$yk!#f$Y91QZqX!SEfXi!EyC5m zQ4H$*?n|P5p*8s=p=5$K026Fbb5n_0NauYO*8hciRq*rY&#=kVUezSW)3h^+aY+XC z!ppUt9yW;(vRswiU)M}4Gj$$-dRD#C$dr!qOzghEwQ(BX+vLhEEsF2+$8l!RR-61s z|L;Oq)z*CaYvzT&@6xdef5+EV&oE$vOmKxCU#Ps+E|v1xAS#*)^auy2@%lQw!z1)1 zUuBI+QG~-c{KC@Swi9;oMc%`?BA>T>fm_g8eyCPa1@GhHni z&w?#1XY$m`_P;I?)v;b!-s1**K+TL{Dt3RhHP+LJUr^n!bZC?Mf&FSUz_04I)00i` z3ddIVm6fddCknRrrgN22Wf3lNs?!F^?M0K`{h1X92d6Os3VLeKpBteGbH=N7Q~;%D zAO;J5MCcLvIe&s&hQL;XE;~0MOFD`{Hg;)mnP^sbf6sa*EiTDxFM<2EJQ-irZo3;H zqlFNu7M`Clo7>;Jq2c&|JQ{3*#kuJp$OzU?LdSU~41HC+-?6h>d~8TX@l{w4XQWnD zflP9RRl6d<-;6E76h0J+23)BtAdYkej$)N^Rm4R_@7}xT z?&g+@D+lb?$=SK5y|d$GW#`|&T7dOKYNs?@EOXsBiQUv2W@D=$Wux6O#zvZmd{4Ts-ej)RvRi`?EUb%gL;o|K+RL++qJ_l;zsIeC*9v6(_IvJgNpTTaM2Digx?n;6BF)JmG)YA zUiF~bQSH2`BJ_+wrK7nyUG%|`z!x`_-Nv3Tf?g-6@$_*)gYLEEe08FhpEtIGfgx&U zwzkrf(9_eC56*s6)bh%TTIrHdO%|$uw1zl-MZ*P z9nHraH-ZQZjK_m}N)dDlf}W?vPG&02{y1=#e88Jr90RftHQP#tZPhBLq%^p2c0hFX zMh`aK(P6fIc?QTumDdEA>}+S1_E+xW?(TQUp-lh2@6W~F+5ok!?M`nJpSHGkKFQ+Z zA|5&K5*SyWO0Mh4ASV74eam5lbW> zoa+1F`2dsPSRgHC27AzLJyAk1a&8MJNjtk5wQcPRTSidW5vZ{k-`5< z3EToDaHtMeqItqOkdQTbci-64^U_U74+|^cZhCxG6r0QG`;U z91g$I@0|)3Li1a%bjQYKJ8vLSAS=sD5KcX{o;-dyvzlqGS#z=z;UejFq06FGZq~Bc zu7nupFnL5QSRj%u?;XQRDdb)tb7BL^gi7aS4!~b2xqX_g#}s181zMHS?PaQRy@VsXr@K2IZg-JkTGV)TK8;-)m7Gkq%oH5|c7U@3FixXw z!5|&<%4|J+QCL_hGjuzCw``q<}mVja;IJyUh8@0a6MI(&60A2|3F7*lPOxh?$w$?}jSZ(9p7(F0bMBx}RgM0)!Q4rz@Opxot?N~k4z&h(S5 zOANrb5U}W+F8#nK>P^|{&mGEFFN){1-Co%iv^`FwhF%#PSzS(6SVPTK(zvULC&s;fSrmC?}Bvhb<^ zuoozt&nZv#_Xm##Yg~7FM_vEv_WxMk3L@}ykySv;BY2SD59_26hqYX{K4Am_!E~cZ$f!=)O zyfAq$DJd!F8FL<5^WWGV0>GV5{e%Z<-5g;E`4mAITJx$i_E$QUGwgZ zXb$5&#gnPIJL!zCe}shKK72TIFc$~(+EYhh;EpGNm;qX0En80WLD4>+f8V@>*@z?f z#{Jt<0b?_p>FP{Iw{U*X(_J9kt=`_y3>C5a2faVL-nZHPY7UeOKYsi`YP&B)aYq*q zq+G1IPtDBCjE|oMQ~$d!j87a>;MN=}Ha@<(y4u~t!*b@Y*#57i&`<^R^%Z=E*Lfon zdHjr7tJYov1LK+!Gk-v^@B7%fmTGBPvE(OMiUF$6;2q`Kt^xaETf58`LVoRjFHBB(P#GY6>ZyDfEu zgYs?OvglK4>U5KycxUh);Nrvr2?m6;>OV3>(J3TP)wmYL#EinU5l+q=+}ySUX<{jY zUgyUsOB&HO-Pih4LqbAqIb1Q&n9`X_=gGO%9p3qK zE0~_2hHsPHxpSwK6eIr8DW$rnU9u3=29%DDkV~BrF)WZgWToY3VZGOdiET-7F<=Pm zS0)lg0&tzT#uQ=p!#RqZqeY{h%nu(1f%+dcHEP||z+ho(yo}ps>NzE4iqFZb?w%fr zpU>Gmj;*d9+5yV}^(bnvJa_JZT)uF19IzxbGSOCJ#q*#(!V~w)s5g;^!=$@^NFONa z9anqnTu@rLSfE;Uc{rr7+8t+TXqcWoN$QiZ*dBVaGb_Z!r8at>S-WDY&I7R#`WJMx zVBwPGWZ#89UPuoWoM?bTfqKhvUtB)%-QLy7?50pCQw=bWz69G@9b z5wvnnnOxr9-goXj>WA`I#RD-taJgi>PG;>P(Ti)~M+#n*NmkGIBwgTunad_Z-5x)=(K zsMdZA%oK<0o!!n%-FZ!BW~SHChR>Hw$`l-EOH9;`V2TwXTmWSJ4R5rT1l`4 z+JA>@Ni{X(*E?A9$^2EH8o%u=wl{Q*-wN~Fa_ebr5auV+^CTckc%Guve{fsy^D{Bo zE*1EdkwpY;QoiH^+)Wz{$#<&Ql&>HGc6xR0oK#dFV2T`-;S{4&YfHe(Blj=Q93dA! zoKO+GuG>1m&(AQx6{{Rq<@42Gbb0@I4-v zr+Yg5o9pXmZNuVE$;kLkdlP^E{tf)~s@<;F#j!c;cgC-{xbbv}P=uVdN;C^3J|>EN zXBaW-&1b*Rf{?aW0rR7kjr|R^fA$6aWy{jK_V`}U)|o_@!rfe)FxIDw%HKR+njBv? zTiSj+ZmdrfUsM+3|}A0-mKy?>5c`nUiEw{2ff^D2itVO-c(ZzK2Pa=N)_tkiM~3yiN)E( zx58L6m4GT>z3Q}wj_Y;@W?w52D0}~~!pM0%HRm&2pveJ247+fdo3Mc)DaAeS`2eKp z!w!^?i;Rr4rg#*1%qU^FO0H7t(9pp#YLcFw9(ZOj7Msz+BxEukrQqd45UW#d17c-< z-X4AJB|r{z8ag^U_Z~fe12kR=LRZ6}=F!;r0UZk*;^on(-jS1?iwnh@Pk)AUl|i8f zmTjQ`s8QU}-ZcYT+u3q+WkyCu0k4c{B?eFx9c&=(>FU~?YxL2wy%CR%zN7~AKbI{H zJ-u1L(*ccee}8{4Dfb3LGr!mQ;oRIO0msjMX=!PPtkMjcrADKLkcRV(e4zE;WEJBF zEjKXd%3GJFk{21kf+zz7S=XvC&~l+7DcRZC`Ph=TFhC%Y1PufB4i1CvGS-HXD}uS= z!6Z^x5I!CrbKEqfp5sAeOKYpxLHU*s7TyMfDxcllpD$m&0Dq{KtCR^kb#B;yQZ4`% zia|#c@*3D?joU#MQrmVJ#8BXg`kmENKYE@m$AI`&Utd3ouuTD>0149uah#Nx*bRgO zuxct3IwaO(oQ*fwSfJXuEhQ%Q6z3)}Qv;j*Vp_@f`==24h zl@Vi}H|M`~?`FY20jD)Q;SGwgTQXK}BVx9+6W?NW&Ir-ah^a$j+k#0gxeB!r@|LDV zL@{7^&q+!1;fw@<#$C~%cB`BIV`Iv9~~YJkDP&H7#}PsC+ndabpTR zoNM^$rG!zs_|DEV$BBI774w7eZ-n3o16?+}21qCJEPHr40R#v9Jdk-0Dgz}^s$0kr zm;j);&j zb3BK!Bo9(kkvv=UI8CR@;mMOH@hD)@l|ld)#;APpa>TDWID(^ng%B52onsWt(^ z1R(5;jSqvpX;kv}``1y@xR_YieIVTsQLS@#1`UrlIwOi-USctl zcYJ(o(ZvXk;A>3o_)wWV)qJ&bGex+#0FC*f%I5*r(8l0odK?P=cdmvTxj9M=-dDe9 zWH#I?fO@vtB?9yA-6j4?#mT_TUsv1-%@SKE6uiPRdQ_Dm3OK!?2{+(QJdU>p1oV;s zvU1#0sUL#x$=x3)F_aL%+sG?qPC?w8gM=-R3X{zxEwGY&*&1W;!;3A14yrRl`L}S{3f7J`~6KC z{|V^PevN&s@l+1x}>dUTHw$%gET(|4~yjt{khF)0^yHQdci4 zIrSb(oOfkqy2kZV>@LD)+T!U`eie;k{Og{Nz#o5`EO_2#9gH^*i>VwK8p4Mu_~R{2 zS34Wpbbb7g({~0|G=mu!Oi;00UjDf558;}Md_QR!nbw)?`;xPC;9E^?I_B*piP`*j z1pYnpF?NOY2P|>vsa^FRNlD53-eb@BhsBFQp98pp$`t~gYUM4r1Zc_Qn|}ewH|Aj@ zmGY>|%TMb8Q>8+1=sfca=3{;6*^~9-&FGxGyr&*1FXtTA(Jwz8$O*eI7MGLWJmtMk z@xndcVqooEot*>z+p`Uq z#@U$@1z*Dfy}D8-w-9LVf4|W1JN-SFE!Ut;E{IS7o4%!gW$bph3*;F=~ zU+31=CeCZ^skJtc2C04e^t&TL6CjfJ+Q~r1keuAx|AwDGk-(yJSu@2SG=l(%n)UZH zmfhnb5MDDrYG^zc5%GU5l5#Uoj28s2Y)d2y>EavJ)@?QtAXhb{p#p z3qzdVvU>oeL^q91fR8Uy9ap27(NznU43F&HdyA+fpki7On+OA126J-dnuV<`S#9r~ z8G$D=Ol--rvegqmmd}tGHG}klAPXU)Z&};}KuaRROpNy$z-ZgKj5;0<-ixLM zzDzP70{|vTo*3GtrKR(e9R=+1iHSjfTyoyX=;*dA==JJ62y};=qpU0}A;$Q>fZq#u z2~Z@sN#gH=uz0 zlZCu5pFeq00_Ya+t8+Iux6F);;y8t}XDm9B*n|WGkI3Hj_w^N(mMXmgdw2~}w}jYO z&@Wyo)zR4awY&_NgB3_?L0WIFqoJzG31B@y`@c-sK`!wubnqB>NKlA27XhdVQfl+B$5RdSjr zHwT%AnNp?oWCfs*e#Lhu3)BGUU6A#UHpA#?be`*`)fgYEp z+K^9MVVm=o; zyZiO!8BiO6K1z@kfo_Hbfm%%?@Y2M@q+F(arUAOMdUK6t@KaNZNJwPQhk~qM$m5s^ zHL0Sf*8o@z;0v`iH9=D+$Sy&9cdge&^jl&vu~v`?BeuT&vyVAFVA%oOMjc^Ee6C#D zu<;h0gpydk)Ylt8r3HqO5ef(N(KDStgA;%|xra;EVVACKY-|jy-^z;VLQo=@gwqnq zJ0JHta* z&EJ5W-+$AC1aPi1HLiVAQ?=vqDL;YM+sWw=FlsGh*^!aMfIbx!OwIx(1TYKv0(&m) zJF;GYQ@O1tTK3;>Dv0Rm-2heQttHT_K2hV!x=zb(0(cF85%x|_Z0A9QtbYq>*x+{! z8mh11D2gt`W!80LvTq#p*-lz+L972vt~y85K;9ljw#;x~V3c#cvYB)2-xAL@QU6<< zYiMoV;~#~DsPdtbTEhf1t7cI*UfNcYCto2$ut)viA1LT+>MUbs6(*l613oqtu zyJiQ389%uko_FuSPhxzZ*%CSABXr1@MG`LR*j>+;1sDpTUm5^>Ltlyz=#T2Q zBP#`|JfN!qSkKO;b3`O3Cj&YU&=NcjOC5l!GT+Hr7y>LO0-;yskoooNhc1dt2w*#_ zp=fU-qa~2C8X6ev9~{JOYHMlXf~*V(8^^~r%T<}X!Ont(%>ufxc1ozIxHw4i5as16 zzTRN1UjkP`O%0}SG}m~?Kfe?N3~*Wi$I5Tudn)t^g^*Y&dD2&zCXn7 zGrz8O->ta=b!FuPkl1d4A5uz71Ha%?TFQPMn*8(UBlNwO5C{Y};DA0`MP2;_Xh4D8 z12;|pvbgBz{m=X?G5Mh5Cp#NZ)gvI}=wB27Ck!H`nwlEm!GID;Ow11$D7e5`0(Xw} zjhm~3(+qHJ8Xx;$qg@c2GwSa_TEnrOm(|ySe2tpNIU0qP0kduRf z#8klj&}?)3)*rgo#XT^1FgEauL7JN5cbzLtOZvv<-gwn{HB&m4Njq@JJc5-Q8D)}S zd;L5y&V1%w<}B*0irT|LXz8D$LQeAZ9l80g_|eiGMTgm4p|KVf$A^`a*_gq}rkREX zT3QV1HX*sxfV{uTqrdb10Y77VFjaAmr z*{aLPwAV4~S8C+w6zGq*X>@^QKT+R`EdoRj=N;GNutVo)U z2~JV=>9>~a*-2|u=*vOZo(83(`3C46=`On%GCR_>f}-CH+OZIqqtnG9p&9E-vmo-2 z$q-HouC`r6W7PCqw#29yt_w=wxaNcSoto7K7J=QXqp{+c1@95QpE7O_Yg|x&mmO$m zXn4qa>8_cdU`&t}RNguz0O1J`xRWD|+#nwK|GNyfl!5B+&!4#ijgQn!&NtUlMY7+i zGoTki#%3+>5aYB!M=0FRvl$klP(Q+^X022IIc0Oq7R!rDlQb~RUE3-B^~OfY=M{^G zP?rZ&PnLz|zg46%h$%9Lh7zw2?W|N~NIY4ulN}Zy!i@}%n&4f;^EURm6;G^y-PHSv z-Zg@BE(5VXn3376z#r26nJmtJU&z&SbevqroBATfATZ5gaF%m2;YFX{9ZDUql0Pfo zO;|I3eZz}Te-wx4IWzgRpGcC31FPAWs#Q#i|)w4^@s+1voyu1giLsN2#2Crjma zOs7_t-akEu&d#dR@h{pMlW7w1{81eBST2??Rl>zT*M0EWX?0)ugy#-2CFPBj>q)?1 zsDXRkEezf_ul`jVe+M(4jvMdh%v=ViSPR4`h?d1D>C0u`8dB1&%v|E-wH5O;3nxYq__Iia>1oUEJ^4qJ-6^ zuLoFI{6Sr*uNi30kM>$HMI=aP-bIZqsFPs)Zf>4$xd~^x^h_@A>c{3!;rM$5V%BjK zwcz!SV8j`fH}c-yX*@6FE1!sxCI2B?LH`QU+ke?r#D)BQ3I_mzzVbmCLeYxd9R=F8EYd_k4a z3!AX$diGq?l^L_TE_DAc++D$smZsKS*ZhN@maAJ}no4=KTBItsclpAULtxr4oRCyn z8k>=%zVJ*#{R|zj_>n+WU0Y9EnRRG+RyhnrU?a(Yzc=?MyLc7(C@@Xls@4mf8CAMA zF2Ti>#*tMY$VK`3mf(%C@W`%hE=;m6y}6oi@eJO1(%Hq3o1d>IG;a_wDR$b99CIg; zk(RQG{aiu?VYeChkyR2@&d8QjdWR~U+cnQ=CE z;R=eEJJ7FaWd>lpaHAUi&5oKGV#Q3~2Sy=fF?aCHg?DeHtjXNciu35&)KA8g$6SIH ze}WdTsA10T-NppAA~b{ZT2EYBP)w2RfjmUcO9Uw{A~Eo}zahKpK;aBEtQlx*+v6S= zseV<0L=NSo8u=pPGBR3%+HL6r-6_z~&GSDG&rY=NX)B~xSD&wjI{3PUgC9?53jCMv zo@VG|oot#GHS0kK#*%jm)l`Q)c>?g22?&eNS2mOl@!CBdml2f(!{3VDE}f6B$KsCE zySxIo>*@wmQ%g16BjLzsbszajuKL^4P7)T`2GyJyT1cJ)4<_ zs05-Z>|(+$Pg=V@x_`@%FRLyD3 zcv;9ND`30SuN7r3NNwf|88C*&3jh$V9?uJX(LNXVg8S0*U7Z;=?Sm1#MtSmttVkM z*En!&!ZK{e-{0+{k+x0q)Le$#hE>LoFO(n#p3UG)ZkB+rkZEasRPcgktgOs?aqWUy z)tw~!m6#_6GE_f z_pZNJyT-<3_l1eMYBqI%Pm_s+I=i=Zb2s8rHh+Rsr~EjmmX>NL*}!ehwg4L7T%|nW zOVEhfyH!|RP{Ij!V!_3t>J+E`_~ApAS=Y9eL}=(>IrJq^k^|91RsQ$c>${Ke5ws4O zj|JRqVv;O9ux0aoxW^Zn*bRdG@#Dv;nhK7chJH|4*Nk@Y8sq&PVl3vyJUFfJW^5_XEAXRzo$C z5)#pXd>9VMHW8omwOGLQfK92r z8?@gD3jA;)z5(73-S5O8Q;38pANTt`%Xh*5Qor+GDezBFcl?6isgB@qh zveaRz!0+L6zY2F{UJYbV-J6N(71GMXsCalKP$;KQ%3cGJNJ=V?y&@|sD=i(LknkY! zOG1J%Iy0~bZEbCL?%c^sT629hu&3JQPzB&Lo$)ED_YhboPS?_iE zJ20R%Ki+P5|GpJm9RWpH1#p3&xf9g0rg4i>i3ksr0o{ocqfmLHqf;CgOj=?&*^13v z%u=MtH~FIhafLeUO_}|wK$Vw$Xxm}SupVgux9CwPVQf5x{kOKZhGJC!F#hlnW7+#U zI=CO{tFo(ofm%@1&C$LAZ;?(4FS#T*0*!npdsrm!BL!>o)GK=@+Okr>nLuznTHbP< z{7pbWx<%g=At9lfH=3hQJv=~W&5gC%!nYCg`G8pCJao4MbfURh1uoFbRQB)QVzdr} z(b8gfPf&!`0?%mQ=G^C} znAzCYpuaQ9hnM#^XBahqgp=%~}exW;?}NE-}K za$W55zzD2AKew*`53awu4#W-=S{ysohR!7I?Uqk5!msKr_j_Uq`MWLGz7}$AYWlw< zwqhvP&ar-$mY4VO^o%-ifRd}Yy83#OQ$;Wj6hI3!tXu=H?dX=z4bb@D&9IbL&?6ii7KM zdkWl{eGp7ED223$h|VC+dqF;@!g&mpwYBLbp6aCa${L+KdsfJ4(F|4(?6Y0F zcS}i0>FVextEf;MI|j<+ys)s-cekA+3o>I($&blzC*R#UGfin|I0CT{JRub|HMhLq zMLRpY3l|8+(&FNGVR->Fv#OQ>H;+s2ufsJi*+^61YdnPy5C$_RDUZC9{VPRE;1{O- zk}yCxnfm0(j+&=!&_vMJVkD?PZ~7gvd1-ms1x}IG3KlU~N&ZAj$-L>zb7WeKbY7b7 z6S5tTNpOV+1&$j&7FHG(b4$w{*n{pkQ7f2ZZ3mvhs>cLBX=+Ma^OW5(! zlanJ8#Pn&#^Qx%0!uWy`&LRPE?nF4kW@rCiGWo2dW=a8Vcm3J?`qj2hgdm{H5uC;=n=>6fjH5R)%$2?`03l9c4hN@#;s5m2R~GUhpS>y|%D zUlQ&#xJPg=!>^$qqMmE_YK{InVKS>`P;w^YC?WNPOD5snUevUDAE3HEeJONOnB7mc9?^@y6V&t4Bi;brIDf?vR}E$(pf6UD2FOcm$BK%2>fp$k&%gsCjP9nT2QHqqSy$FF94IU-@yG}OmwJs6kVS)w9r<5 zVEvR|zIyi}mrU7}cs*O25M9AvH;H^c5biB%!e5E*UGG=`%4^PSM+jFu``u?8IW3iE zV`+d6UXa6#0RV;}A*~5&e1}_VU_B*%C9K#E3HS+(LNm1iM?-XFzUG%&jYCdJkQMhOqNM@&zue6o9<6x99Zk9v~ug#{tH?`!Zwd71_R<334G+P#q~%XU_nNLn1@! zf{=urFHB3SqDgobr@cE01Ti$Lfy%Hfb@uct|6JG(O1+E$Bk&yQU%{sQ;rZY2le@$j zs8mnUoH)$|rKpCX6NzrMxB_l%gdhEp#pUIi0RJO=MCCc0)T0O}97B;9Rz&rmkI43N zcqXT%9lc5=caF2zcm4X!n-9jlox9!pdPDHzUe!8E-%+>#ry0aF^xhBSaCu0d@mo-LFM&+@pyi8 za7B8O)=UkRVS>Jj_gK-Cn^%+C z?S9eNm~EvL_Y;d#ST*AB$1ZGxrw433BjEMxP_7512xmJbnwy&ebW@X(0GHnz3mMcg z*L*y5^e9GjU;91{j=F#54Fb77^}e)kmtL%|&QvuusVZ8b#~7TdRbm@SCnRwZWqmbqG^nZuCnl=C(h(m140bBKw7lybgYSob z2)p<{op_fP6ckh)faIK^Va(0R$2So1;4}`_APRs~dfWkgGymn$)(j37@?*z-o}(nn z-3cC6CzGS2PqP?8@2yxrcL$IZDmzL9Bu8H=_oq)$`6Zu_1lL&k#nW#lj%Coa@ABc;48XrtYswSr48RoN>y=CBEPAud^x+$2@)j9 zL?KZ`j|8lEB`!=0CC)h}p7`l?4i=V{`el?~rDJYTu(1aU-7VhJa$Q@yi=$vw+<@p; zn~%Ou-uFLb^qSwbBxYQk#0vHs)8pa;R?;MVg8oMiM1+Th(dcvjfUoBGF{Se;)RH0D zBG^B(w%I6ZZB;`B+{8$tfEqy21F;XsF#154ptYyf`D^%h4-(2#btFIBQr|qcIwXJb z;&)iupHST;s)p4*KtD58Vtmcc*OipGF~u91cQ4OAmN&|XdB`dAYmm`7RFl5Jt`+}h zvu3{lX77SW42s!oYCTMEfbCCSTKdrZU+v_Px(~H573)j*(27jY&N|JHQcBEVOToSh z_wd|!yCZQ@k8S6(3t%iND!iSYVRh&~e+7A6rz%|5Qw~Nlc!Xv5W#ANA_Fq%3=IL))*HWQZQyI+ zeJ!l5MQlccu1j1ee}H|cuP;L_=rB8o6cA)uNvxht3)V1KnHyNFtTi4k51w9bR zssKx z#A$?$je+Fep2XKOH*~u@%fzSmU|5IU2B0NYAfc{Q)3}5VprU z`9Wd}3ThfXx;f{MP<;hO%*)b-h5%mk+Cb9M!QJ`7|5cMVFh-37#1JR4D>F6Ks`)Fdk8FlZ%y1y$9gQ?S zf6mU$HEXf{(6Z_o7$9zg7CmG%__Pn6;6GWnWqx{>rVUN|1};0$caYHe4dwmH!i4F_ zt@H9%t{8L|KQ}VK`WWczCw~wy@4lp6Redzoyyr40sn0Q+Q(tLC9N?jpi)Vz9@Dzz3l|=~dUbe30nWysX4}sH#zrzjF@e{GlA3=+7q(T`G&T|qy=ql%Z%p%-82R~O z%ScOLszKa!f12=fp;lfDg?*rvG&eVdIM|UES5~~Lm0tv~-nwgGQ2KTH;Xm8K0baVo z!YiPYiJpCwEQ#<>KdxYgHy)HnGH%O! z6~&Bv2yo@DfMNw?67*5D*GL8tP04wvV!vJ_**rB(L_5>DgB~f`MeaZZNac=pc8Jxf zb1#B0PAgQ{o{Npm7+(*CT}4Af3Y##060d~}tKI@Bz zwP0Kg<``vWWpPF*N5{lqrVBXHW0aIK*?)#=@w^R~G3Jo~5S{hUqQ;>Gm4yJrw#s-z zS-B(K7)-4)7T3#bznBjyL>Pk#_L4DTEE0em`ZnCO1lZWT)5)+LI=hMLEClOIm!9P0 z2!$-8SOnZzgEt4U24M=bu2@!!HY4CeW`2^Z3;(>EgVmiLrN}0i7Z1utyVVP~1`#+p znUh6olG1LbzXCTJs2CbA%ypm(ad_+N>KqovD=fZTSA)z^2F4I$=$57*ARD5RM!AiG zE-tR0DO^TRk9lY?0%?T}e%AO7;A<$x%Ga-72kCL+#tkKtWSiq0x;*qA2G=-Jt!w| zY`a6Y9$u6xV)SMkVQ><&S5BWg1q4U@w8d2bVnTH?jt3h(eI(+mvB(y`d`OI_OSXhV zxd#dH#Fz(x5DXyT3d@-@>6N*g*ZR)8>jgF8;e0nrH2BX!dcE}VaV2_w8@~XAF3|(` zf^owOf;!e5_5)N9J9j=!58rx@P%8VD`bm7Z78YEfp1X&~ZjVavAwT#_k*xHky3F{o zes@o7(e(tuL;ve9FuVD7@La?$0JnmJ z4bdOm(=wdcTKP`R4gWpL>EsUL+f2^SGd_g{)?eB6jdl(4j(oLM}mVv zbeg~`^Y_~$5>t_+RND#7miv_B8Jkh%5C`#1VA8<4MIYF5Htnfzg^3t-8b^yS?jvG| zWbkP#0+IxHHX93zGwkdpBUzhwl5l=If|B&{V}*Ni+`Hk30Ck)iiAEjJu6x9U2Bo0_ zz(@hkqO*Z)bLj|o3XMnh683y=Z6z9(k$~JHkvicclYlkrfy(HD%v%7xI6DLm)t5WR zl&)MUbzPr{z+**H=Pqr1=rdwIx^(qw*^eK6AfMeL-Q3(@(ZLwBuS19)d|1=C14F~Z zEv>D5?8q%%@iR~7O#p%52~}29G#Gil^*+_883m6MVQKLJNd?p)tYmyZ$ETixT<1R_ zx1Vv3@z1(CD?q!|FC)XlICr2xk!FL`Gzwgt5iuj~yKTLbIPsl=5W;}q175%0<4){L z!jHoOry~SU`FWP!k&)JJ0r6JQZ>s1-^e;q3E@0V@ljnC^1UA9vTgr=G2EN-tL^~bi zFA%*Ucj9w%g_)V-o6E1l^>X_*mGQ5R4o&D!*SOc{5Mq$W%RsqL*#UMV-w@lY3`s62 z+`#5VbU;dkkb%_%n}74h4LC@49iaLbu_}NbkksGLZ!0F@sxeFluQdDs$?=nk^u@98 zwjdS5iGu7Mo8TJ~a#lP8s|E8jq9;3kgOwHaC*+DTbo^lBU=4nyB>X>U8$AVu2m|oi z-OV)>0t8}Uhy@r#sDz&u8yp`5Gz&?huyC7{)utYnx*PDaqz4*RNM;wEK$}rFFQbBbLUGWNuKb#)af1pQy!XU=%e zpMQYj1n3L7#?IdUd4MMFo&XvK5b6K+oF~!N)g3_L-qTa01A!+pKAsn&k=QLN0>gj@gu!76tL)nm;87R` zy(zhWqA&Q#zlVKFh*aD}!G;UK9Y_b?kLa~S_C?#CIZ!wf&uSrlfJW3QC~KppMzKbx z=;?k6Xkl7SdpGZi(~up3=8(R|iziPmX=>6+6v5pIS*9f&4+_G1yUDh-x9g9feTGwh z8k8mSLAlsNd;p+x*OVQMTJ-fS%*=Oa2T^P*#a-*NXzter|nJr{9kfvnp#>_W-d67=<-1oxfxBKo4=B_B93XQK*WCg3Evfe)1GNA(fbIzBTT0o z;7WLM6r(T7$yI{Y62o(ec)et?N&73qh%I!BQ}^am&YV5lTHspn^yv?@7ByuUh+tJ? zd|$qlOQ}G|C7@#g8uMC;-ss_^pwX=aDV34&a?sm-k*TS(A*T6nh3zd+K&HIGgf5+X z_fpXDfJ3YtOu88ZQgNfhDUU+$tX}|kl zl!XVMcTCijlzN7TsX!l#Z>*-iMrW|9YLH&V58^t-Tu*sV1<|OapVV_%tZ|~`C|k^aBYLfDB;;NS4Yk<+cbn=XXm^- zWZ)lbNW~2d&gh@iCS?K;)Lwj!G;Rt3ra%WvXl8b9D5-Z>ss|ZnhrYP6fd)jkIot#( zL6%!;YB>l#GHcn{f(TzVhj1>iHI39a0Po}yq-O~W2c1YWI*x6#-MLHM^FE~u~9`_JZh?|*n6xw#UouF&`XC7Qx9&} zXK_X8CYoZCbC_ zLvUChxn@1(yt??xYOMj!oV&fg2x>2eX&KIpog+RpLIF3lAoZi6!9EjR59s=+cHhLo z5ogYxVXH9aUEZj>Zn4tPj^Xnq!q1GQ+g{k5?kEDB96Qvy^7x+?dLnz87>@wJcPr%3 z@#CsWN)l>#pae^I@R1@aZzK{x?!5t@;^UE_+`G1?zk^i#>flir^#wk>fe9b@SkG1r zvWhjry7yJMk}nVIV##2Dbn82DP!|UU^%({RYmPH52EGgh z#oC#9zh=HyQ8>vxSzFqscNQRFH#pmv4EQwBk9EbhxNGc{BxxbUt#%hBgBE-ptppdOKsz9=Q#pMjL1?ZEJ=il}+ zoSbk!ze3;L$i4sf8cAo~J?rI%f7x{Kz`azN^PW+F%Etqw{sG-EH*XB{qn2}Q-SxsQ zvux|yUzO_%3k(=t!AtB`dbW+o1pvr7J2{~n^UQG!x5Pnv%Wr;a!v|l7lveoNSaDI2 z1dx!r(y6d*kg?&+kumtuWfmG1*34uAHC?}KDNsITG$uI|OhH>4x>Tk%e)UXA^Qn>^ zKliZfBC{tI=iME~-R=?f1~bJKz#`bF;6~y;x0O$Pj-hxP#oS-(blmp{@wh;^7qOc> zIm1#|zJpXj$8HDuGhXf9rnfQ45kJY$v!U!Cp>^l}YG+?E?xlc$DS!dh@cHFHs>rT^ z{e-`@MG1=4$xvhc#JvNX0Epafcz4;HIgHI#6Tr7_ER(v=JMCwErT2m+XPZX*sIvsg zQD{w)VPX6?B&{vqJQe^jelbp zNwvw)$N~n|=DG0XM*b_z`ZYbhp}0I#b^u@`iiqQRB_t$(-CC}LtB{e|yD@_8SknMk z%-rPUp~m}QS#kJfwsU42HK><293VfwY^wU^wD?mSzf5#`AZN3)vjZdR#Me$%oWAV# zJOugx?Cz{=Yzci~`&}kD|1}A!T7X&q<<*M{+I_(fD5|tXou}1j*F0Vw&Twr@`qA;- z=Jm+0^l)VIXM3>HlhRjpU?+kCP*Py*VKrJtG?u8yK7S~oX|E3G))r9GlT0TKwJ69w zSy4lyBF?oYnd885+Dq}eUKgrhNtO&@b&c2qV0AyBf49s2RauQS#{d>j}?&~381Dox5oZ$?`p8?fS-=OBh zEM@IqmFT=e3$t%j!rCb%@;M|LlpKCh@NvPe-2&DGshFyBC#0FuudeP=cU<2cArP!C z^)S86JGMShOEG0T{`5;{=H=VV1sm7up)Y<89Z-sMNSoV%W3-1zQNM@m)iORygoSY1 z01l)oU{WclL{D3;nA4^q6}EfcWYT+g_x2W(-Rud8f%N(Bzk?e+)uY0c^K{N`H>AmM zW5FR~Y74{7#VS;zT}8WF4h=~{QT+7zGx?aLW}3mxomG7R*nIrON%*ugK7wQO7ssaC^cp-n z--=olC-V7&yD`zmCunG7I%}{lF%!BMQG>-?$BZ1q3H2@CVKT@%(cS3EiutiKrm6{r zOm{oe5A-k{YMF-JP0E)T7$n`J*na;0G^5n~Zd<1>NxDPc3m|5R! z0K9y=sZ++%I3uZ_O4SlkNs!27Yq>1N=H{v=5yuTdHB6Po6GYiYPYe$a?~tNzzt{kl zTu}^%L`RHBGy&b~OMvo@QER<*YD}IL58H$jOr~lJ)k2Dz6hLG@!n>avC?Dlda@Bnz z8C?yJg#N<&*MWf(EooQd6%b3M>3*ps+?H%vIUOGrb(h#X#k43WAn@uoT8*pOk0LH3 z%9}dXqFWVO%Q#bq6ir5$B`y}iqC4*7Cd}Ee*ECs zOPm_Pi^oR9uyHUmH+_Auzs#J)6YebkygU(>;s3oYk)!20_)+~bcr3`s$eQJ`fAI=} z*E3?THW^<+avPisFzVGXMuUb?Q)?X@9Q^qd%LP%zaDK*;3=&STkS)70I@+X=Q_7{P zKr!stxf9PQjR*Aw=n&KH(DV22g_g6RJ9+V_Z5UV1vw!~hF__=H8^0v;*pG2le|GRs z5m6Fohd*g7Dg*^$Z3D-dGZwbC1?D}wik`v$_u|0F?(L@@h7 zM%%<>9Ke4E2f1!KiZ{jhckk|iQ-TX|6C*0hA4lf(T)0V>8~G@#VvZAut@cTomu9z_*I&|zxn6Q~6f#{4I@x>L^KC)F1~epnrM>vRI66dJK*bnT%_!NyNKcD~F+&oc-mJU)qoYz5>!CEkei9tpAYA{K*$YI&^MpTrQzZN9D z^>%aH*78VPLP93PXTR6%Xo^mSf&BomJ@CP(mYEJoU=BcCc-B~`fTgrCYF_-+ju5Dw zR+uo+$FWUPf!Ix6vqX&C)GsgL*}kkT?{UR!MZ-Zved+nE0|qW9PrSz-9PQBFys$+& zu)q* zDZJ3>G$Tv=)0%G@o?ILfpdI>I9K+bl2R|LkMD6vik5800STd6W9QzzS}!YG24{57dA%hGfNh z@EH*YZq(J?PmGI=JxWU}3T61!ZfK_0u3VX(n$pf{iRawAm*1=rEoxg{fW1iFP$)U; zUcGsPV`+wq9_v&3SDoD!i3EjnjMv+iQcz%&$J$rnM@*%M{s`q96J<)v%Dm3SZ?!P$ z`J4*C*F>xiQPKaO(vS8wa!II~VCjuJa&O@uskA$QhC$UKig#5PumWjb6G5)UXT-@@k_E@*84OC?D?_U#53T@V6^ zFwmk;GA8Eu=FNEaq9`ewmQc)qA#dRQ5w(SB<>A$a?txV@j!nkn4T$jpj&dk9U}O~( zzH{JT&m+O{@-i~)QT_P;+9RlM7#dr15MWstB(jiD$i}G|Qr`Xnp%-{2_KO#In8#C% zCXjc5xbC-aVOcCgqyxZ)1cOMY(`fuW4wW8wBiKcWMkF9pHnzSgJ9Tz+IV#D^SCy82 zgf^1E$-en*_U!zRhKBlMvrjE{^AGWVEiC`Ldh!3~pZ`r!ym^x-pKIe8@P8U=K?4w9 zcW|kTpI6scCctKwTVo`^+=sX=L_?@P1zU|SaadJFgMj_?zdj`^|JH7)4+Oo#2SvXZ z>PEkNcLB?U4)Nw-6m033F#oUrW`@FpDQJ}2z76yMV;g$8nhX9C|H*UyJVY>>6DNv= zc1S89OKsT#Dypgw@W&AsLFo`1jzzZwIYKI%iJCm&0ts9|@-3f1s3KdWq^Gm9upA}< z-(~Z|^Qh7C!sH~ny^peD-sL_Ll3v$5Y+QUIo;b(%A^P)YVQ@L zw>WUX8@Ft_ARho7$rO_9&QFLhCOAcigLh{BQ)#N{(Q@u|P84#5FlEWs+B&uZws!cn@9XPl0e2mH`QP%4 zp@XEl3*QveY@YI-$4~_K4T@PTHjo0Zgc<({MSB;Q{Jgw1TvL$aud*^~j5mO5Uy?c& zMnl9Mpd%xjkMNjKp>jlloWirUe(%24g*`#16+yV1-Ge;B3Z%UBjWu;q7TOAI7M?=f9)IB)Zl;>#c8HH+{ z7z)*x&~*|QceytbXR_3yLhdmJ2q0eVtN#}q-pP{};u!%Kg{%gBum4AqzN0}mj$k_6 zW;L-2WQ^C|tz{=8x7YBVJ&Z(YjM}%{8pcy_?CpLEh*a1{Agtbgg0IwdaWax&`_|XH z5JLQV=~&&G0F3$Pk!v8KK(yNpCtaQBF?GtAqn)1*|Z>F0g1!DfVHvpflxv`*|Oh<`LKcqU(qkwL6}~TbKF7 z>e3W(7V5rzx4FCvHr87^I}5PQ4lqD>g{TN95W|Sd?6A%22$yAq+pDNi4lqFa{Qmtr zNux9j6)H^%TOaUFqszBaVyE5){92b^o`8u5zX(uD6^QjxRaLE4MgcT|0dpnid_6p* zh%oC{W8(tc&Z&_An?RH;zHV;fIGO&17%TxI_fG@(ar>$6oq=UXNf1dv(Vj(|P1iOu z`Wzd}V2s0i;RRGOj-5L-fRi6MIH*%Z7aOe4;dh z%zNsA6Y>R-3VhfQ5D`((>p^GqIl&gWNpz&3ozS#0&{sCXXTrMF<)P)WPMJkbSgaw= zcDR8xkD>lr@`4g_^=Z{{C}(OLAgf2e%$i)2lJe+cMbnBqDV^LtX#QX6el<70r62C? zy|fSYRx%wh(}nYaZf^Lf0*xfXEowc6We0~&cGYvmKl{7;%8W%Q2oL3nezA{w#HY$HN=Q7;+E!Gs=O_h*m*GhyAjLr>;!&_!ghLf`)O_lDLIVFO z){9A*@lHxg58p}n_8vV6RySf=-(ijdie)_s%>TehfK;L$jE;)ELc85x?2S-8!Uqx^ z=7$II?>>HPnI`UpOY>YJG=|21$*LP`i|DTqCU+7~NDM$Ztk*5qWn`Y?uy~vl6bw$k z33)MSa^oS=U6J~uu1VAR0k_7+MsAe=0C(Sa8@GNA^=$1e8Y*mF`Y=35Yt-2mo+)73-@nWL`2nfdeoyx8&9LRe(Qn|;E?ZLy z8H!^b{`4jPuGk@oZPMyP^jklz=RuUN2M{#@v+ho$fBZO%=poKyPb@4P7mlAnvx+}C z7Z1+^vFmnrnR?M+DwBwdLwvPRLt*MUtSzrJGUtRY5JhHs`YyaxY9z6L!twOYd&CK? z2??`H*Z=`b^lNvUWHSvFtKkh2??-7?12Q0oPat5 zAYO5AVv7@`pjvmt_cwuoQq&L!YA}1r;N<3I5cE_sjYa+;bp4lnQ|bBmGA=&el|1yX zh)9^#l}gNmgTscS?lp)9P#zQg{SDU@H8n*|+W6fKKSGf^TX%?D5?+>BY!KuPBlS#3 zY0%^_dM23X>i<0JMB+XOo55Ec_QZRrN}H?{m6dIf6hVf3uLfX52bI8ygDWh!%$%GY zJm+tAqEqYYRa6O5h%6)nCxiqALDr>A6nqC!>#{c22;&JgC8Y>Z0VAXPQu+tHiPyRR zafj$|hot;4-U!C`7GJn`%7}Rrdv6U2mwtviMn|>fJL74Z7n`!cY$NCBRw(yaWDy&6 z(r0#o$D!YRRW!hT^d807um2Hy9UpR=ygMy`!95tRYpe&kSKOM1ctaFaZMvbBpa`kU zL`u4w74hkjyZcYnWKRqrM^B?cWKaEnn5Tsv8{jmI>O62NMrKb>P7b!Doi!c=?31-o zcx598b@z$8I~65m@(C+6Sire|N>V1;jGs8omh*maa8hb&F3ObuJx5)JuKKA?v6!%o@u(pp5??Ja>zDxbY=#<=~fL;X}@O zH!d8FlzTH6^~@mH+qli_y9j%-W%s{Ie&zpi_sDSh_x6Wp$&80``-f5vs5AM`-?!kF zV<-#Gywf>>G6wq$0D`z+H(2>&yNfjtlL!Xpfov%@k2y zS-JjD9t&{cB&%GxWKS1bCeeac)qQXxdn7TDF)Q@ZZaSyQ@4M;ngij@yHQ{>19)p@J zhA}|gssowSAUsjgkAqVRK)s2~2cH7?0;Djc3p|Q3><1H|&B+~w2SR00bKy0xd<&Ql z4#R%SHR8j~)Xn5zf+7(1yrzUBD^vyfmm_yl9EJ&fk&h@yGTJQ4Am>yzXA(|cDuiQk zpk7H{#2QUNwa#_WLx_1*$vtHH0CgbSE%QR}Jcos4Q_?ou()avzW_rL7(VmxM7iB?8jN#oa!(a1*M3F<5*g|DV%c+03|a#%nxn%;Ih?^Z%lJ+9FhFfm_MHuzG`;c zvGRAt@A6T{%3YOGbr?>?K6~h)&#A4?1AG$~nJYc|DZ{wkX6a4J73D9@1sfMIqkU@8 z99Mf;;YL>UaN5okSAxp`BWhllq7HK$R_?A7ibd5fKXNOUDGYax`}@5jWjUca`DqZn&a$VxF#F_s+R{wB-GqCR-@B z`=jsC%F4U&tKG&YCf>6BUB_~(`4)88joxAKi1EV+9}mypYba}B`}fZLLumR1oYkZ{kVEZ}p{dHcdQDjMdC)scze=0Co^ z39Jl$`{qq^O`FB%u_mt>O|-rg7K3>Gee|fBro&WU7GGyjU<9?Kg0se&*G&JyNT+E- zUm!0ZUtpkV@Iu>FTc^>6m)uqch6^imZ$XK&miTO=7GO`eu z$bs7GEUj4jr$Frdp+U}Q)BL%(xSw&7UIDC{saBP9jm6`FcJJspIn4`;r+|AQcByV6FJ~`be7u|Z)xLfmPLRBsl9FO!VR^T{ zKT9`UUKY=c*B8eLLqgID<=dDSGL@B=7jks{Z5fLWbf8rDNa2ja)3ngA4Fe*RhPpl? z$mz>3P`-Dh=o0&P&{_bRlcU)85vjoDfq^HFop-3eE$qzPtbdiwdfJ^|e+|Fn2+ms? zUTuZ>^PaPIcg&Pf`b1Oq12q>HO&HmfZFI;bn+2K$1e%k*7aAuzuitk0o%)-M@ug2x zyqWYxbQAggxaw8nBYV~H{Y4U*+s8xn;S9H|`JS4dsv+Pw{P3T(Xyz+&a_nc@tDBmv z8bxe>D%VhQrA|Jz=XjHw*S}2t#Vblr_IGyq=klhiWXA}n?x6z@`pB4MpS2^8{K?8_ zJ08O59~?Ygy4q+lWAP<-c)Dp4ot_z{tsSzNzbh(mr<}+oLALw9zowq~*Bjnl)hN&Q z^-3=)UVsf_iCgvqX8v_K3u%_?i@fRSiCSucBc509eaU-gW>(P=Y^;`1($SQmLaYwT z^ZMct3V&$+sFfE{$xgKDf50s_GGTXdv?EUl584Fufwv8IN%*he4_kV6_;g1>b_F^o zVM~rCwsFOywMkF!kjX>Ki%#8h-!d{Z zVodW_%Gd7&K96FKHvJjt?qBu#d6ZsN_;BW8W>l2zms98O>veTYUNx9+AfaBbv|xI? zZJt+In>u`a;Qsw z{J`)WjMFBU#2s_B{$5zD`5gHoE+&qVVXi|h&$gm<1dWHdZ59^q-^2GC#hhHL#8k|b znwBo9P}kO0(^7LgJwMmT*?!>tOL_j^r9xd^Bg=mG+uL@U9ovgMW@Z5beQNKNr3wGk znLo)N*hQ=g16O)qzeYEPRetP;4=kQuib{$-WZh&(y5(~-l35sdcmzx4C&aF6Wo)=- zSqk<~)HT*eG$;D`IWRFW9X-f$oY!ga7EKSa_d*c@(3Iim@Z5)ib$LSd(ao64n(kY% z5;oxf?4FVedWRd#%N{=34q<|tln)83+eqZ9jZH%~&j|iIZp}QlgQoQ?V$P8xWKqne zzsnNZ6s!@ZlXHTDUye2_iP*HsDE|~GYiX4a%1ycF*he{GH2L@9%6$E1Fix+OyboCi zya@avY|PC3II8HmMdQWd`c4xLsM(&MP1c{#J1~GDBvu>oFGQX3f$2Al zywgH*bKA^fA-ie7$J~ ze`0=av;X_;JGDtDS&l98q-HRmYqMY9Q;Gf2%(vCPvcsJ}^Y#0HG}wXL4!4K0zn;~p zG7xRajk`a#zP7v4&NT2^$nCGOT-NFXgxo(9w$_){2dc1DD&&i+(mYO|PFv$fSE zU5xSb^H0ng|Cnajz+tzPcF(v()CMD~C@B%2u1)x-n-|5E(%c09vbH=xL4I)kWMCTV zv&J?x6ZLefA5nbAGB5@4fo}Wxh2>S3rDVsMX$#ZrzMpvZqVcUHHt>09YYR{_6(nsu zb4B`E=5p}aPR+djsS+1k6m;|w`|*s)`G%-i-SmvQy4S7anGfncZ-(%ih&p9*!T^hy z_e)m}#s^y$e+tiEaRtjl#J!tOr#Zxo(*UG={r}r9K8s>@ zSRGOkTd4O4etAMfs#S~pC2xk)_$N}4<=(Tpu=n+~0##F7?|w>42z`#eFjb}7$%dxw z9WBc*X6tf8%MEp8-}36u3OLvJ)p#1eaWu)%R=z7wHf#xy^oo4cbvR{W! z11m53eu5HQJlRFzKu#D?Q+IS+c}lxI)IEFcz{XSv1+U46;fM$g{&Qj}rV;KE-YdhT z%0`{mYoq#f1!KdO3v~r9ch{-QFkgSe>72lag)GNonX1GOahdgxNX^LDn4>7Li`-r4 z5qkQ-q8?X|yH|OE*m7F{O^%pN?NQ4wVU!dUjpmMhiNQ7At#Zr0r=>!a{QN6>j*G3b z4`<9q(F$J(8qZr9=U8j+gofR2S9GAi-HiQ)QS)@o>XKKd!${YJ^Mtt1&c9CFc=O-H zOId!t#Leil)W&2wrjugoG|79gxzbM&&D^5mI{B(IKU3FK zqxMyQ=;s$@?|mX1$I4$yjkRZNc*h#@87H*lWw3M7M`~#{gr0q086?bTGhw?v_9x+u zqo7#X`|&L8`SRxqN-cm)O1FlVCKR(Ycy& ztM;dBe+P9A<+q?$Prq>7O0jRPG{^Oi6-u=dqw_(gwT1JMdiDRHALqmz5 zxuEA!yJ>YY9zpKGs+#LC(-5|1k&+lHF!iyFaZJo^aiOXpUw@=Bx}t*Y=gY<3lKz-D ztH9gJiOu{I^|9C#w5Fz2Rlh?WE6RslSBtDIg+u>Nz1Px6(wke@nEIlmtzyy8MUNeT7n-e+qMNB=nh@#tT*ZhSuenU0>gB+wL1!%QqkHy5i__e^zFtKTxbT zr%|YDy`;b?JH~1zP}FfEGm2g+L~XsF&c$r*fxno2V`x*}rv~HOi^{(%+tb+4Ei+?z z`5?8`+USSox0D*rrz-y%>zn$}t`(Ir#2$qKD%zbw-LTC!_FdPb zoJ1dy`}HldIrDXzTrPD9mh7!LrW+yH=_}DyX&D(+p%*~6wQ2LT^pcV9q4rJ%6}!X`v z>47Nb7FC70(vVM#FKIaMl{WFj9^F{#EqnfaZ&lvcf7ux9rx#!0E(R9lMXoJQRf(CY zsca9~SoZ7`Sy--iTVH5*F?Mol`{dQR-W*+3PseZ7Q(v1SKr5$T_Og9rxu>L7(cd&% z=dzsg&*8L?aIGXOwfb-l*YOS$+Btc##ktACM;V%~&H2lZi6^mI-esm>eMKuKmNCMr zXPh*PyH%H5Qp|BStKN`LL)3Y-NkQV^`4cYIQ>_~l8!o-At_w_A&Ca-w>xe_Hv%i#x zVKc(DyPw%pQ*Cv=bp+2c7%Oi|Hg}t&&RCmOsUjyS&lxYhx@)egJtf0r?WgeyDQ#tC z`QR{_`7YD4FX49jf2OTdIKs}m%vR^6t+-Bq(zW=Sy}~*>S-pIc?(KL44gUu;k`%0W zQ-l?5Bj|>i75#`Y*@y&O?zLT7ODc*ilGWPyByZ*9WeA~3*GH5u-nB!ez|3`2t(k%B z@==msj-wxTs%Y`rPd?0L_DsxkDy;}({HxAwI4!pBTHvt$CN|mh55i7WxwKD|-t05C z$`k^v>vFw>M@atM8?oQRA+(ZzUQb2G$+0fekx0FDB@oE>%Urs6gLK27%g@h{Bf_F4 zd2NZwWW1>;#{9I7EcHf(hYP3a_piIh^YcSg>YA)(g*q42jkt)GA_xe z9`|?!Cn#Uegu7>H)6WMXHZlJ)d7ltW%8laU9f&uoooDv+^m4c1et25y_WBZa#2EkY z_?XnY?d}PIvTW-qD+B9OX)jhiT$h%j<@2W#zBt7(Q5WAB`>@oYB1*Or(&0Sw#&yF- z%(*v%qr zkB;$`d#(w8ez#Gu-phAY`Aub(#jp(D_-4GzPy1>mDYJwaCOF*__i6t>Kee;5j+vxg6Tc>D_SzXda+YYNAG7IVVZ{E6MF=4t|!Q{xm z`19qbmqso1Ox;$U0Z3rS*tGZtN`?dLRkWPfWYFJWpu$O#b-2SLJP;PX!sp)3?6+RQ6HHX5$D)c7#|9lyr zm@uN_cG*y^wWj_7S;+w(=LIiH;gcLDmqYkx){Yhi#cGhxO;AuN`Wi6EPl zEhACP%RhQJR=cMtFuhb{q0?pTS>)qzyY)Fw>-7 zES9hSKmel?b7(rs%@p%K&T8gh=nX!O$n^0GckdSN^#D*C4Rg%C_EtnVRrIeEQ2aLf zHZ#s40AdX_EhXD`D;vH(&OBqQhG@Mcm$dB^&Y5&JB-pM7u2j)E<|FEi#?uGN(}`J` zZM=RR!*KR$U?RJa&F3;ozP(fC3gi_*!u`{fWOA8jKQ#WXt$7t)LAo}}=W&ov7Q1-3 zII8f`((}9{t_!1um7T5fi6i=#MJRth;Vc4lO|q8~cUqn58SC+MpD!!BA|rREH8rp6 z`aMht<}f3ZR1hz8WE`~Sk&5m~R5CdH9Heh2!lC73y84PS|0U;P#?#d-0T*4)QVwHkGb{m#hC^xyN1QH-zLdZp+21*n` zF5wcwMG&QgKm7qm0`8^4{IGv}N+-+9jaKF{;L@AomFq5k*h__IOiNdH*4 z!_OY0@d28ete}c}E;-VKeDEmc=(x^;Daq^mTNiD zWHLjPU>CqR&_0Cu5FZW!1OkrWRiJa?N}9gf^^xm&9(wz){^A(wT5rq*0s7YioSa&X zgEjTerVRu`B8b> zZh6*ze2V)|!hIfIrzhC&Lolgtiv=; zYUxPa5D-c*{r~XFOPgNdAH(5dUKBLKq&ktVw@ZvPFW6F%+L%Yri{%MF#1!Q?|S>C-QAmgMTU-E|?!8d|m z7`iU+KY-{Ybzf(A9U@C%&8O?PK+R>C3^oXbGWJhSZOz6lmREIk4Sj{#mJaGjLq!Aa z-*0~8Kv_H)@xJut4GnltME}VkiP!`@C+JB8uvFW&C}k_V_;po(U&RQM@p!i8D6v(| znVhB+p`gs69}WDv*YGM0vtu%yQd^=<_%{jaC|{-fgq49Gt@0iL`6Yi^IyzDbHR8M6 zUu`mIr;W;^ahxB{gis_f^FScdIQ|`Lj#}jd|J2z>HB;B?fIxOUC>KE|*9hoyte)#Rj(+$Zzn(s8}$$oB(^zui6yHU3C4^}6T z5V;3pk5$gytpMJvX5*9GoqqfQ;yg#L4`b?G3Yg}SH&c?T|_GWPR& zX8K2-w1yP7SWaPT2m@BsUl!yeC5hR7r$&-?+G=i@s)*)*YiAURfqS^w=K6Nq` zwD{#T0SczQ`#+k!b^AhMm=p*rbnAvj%37D}lx;zTWZ1j4A=4~yYu%Q0;Ux$6u9d~k zrZ4XGk3!60?j@}u^B5$K?)~N@Tr|Chip^MiFlk!tDvs>?i%7bY862rPJsFxMP z@f5}VKWY^zBhS1;B}sG=ak9~CDz1C^`-8h~!lK+{$X*OYO$vk8`Zl7Ydm#PU_&UXh zS-nQ1;ru3#hTql@QIdA_QJ0p8q)xm+^`;~x$XHsLfS3|zK_ts(r}d0>WY=34lonF? zYrS_Ii+<3s$^<*#>u&pU#`#xOHIOsRbmQ9T*vp*{g{5SQ&*OILRiA0xQ`99*aX86E zsVpsH>Z~jkhdV;X%s*}}H{t28E}AxmGhrOl=Of}g!=#`&Ct?Xd^X3Y&AOUVmgzD;> zGL~30o4rWFQ=736*ZFrVeEaXb=X@w~L_mOFjc;m>tonhe2lo!-(2H3}P%FQ6-0}F40V8}4)JVdF;39B($#@1Np`MhbJ zbP@ciH^7bONiF{NuIu3STip+k?zK;Jw1!!i$g|O7!e9_@OlcmU0*eS=ySA0{JNmG< ze3WaC39CA#qC4^7fUnisVN^HuF?XEHRh;)=epnWJ<3Cf{#%2lp=ge|WBYqq;Y$zs;@RL(U#@_K@@IC&7%CPEW`4t5SL!;17Dk-PQ9m J&bhBL{|npYBuW4P From dc0c10abfd27dd5914da42cfeb7e00b753418561 Mon Sep 17 00:00:00 2001 From: ofava Date: Thu, 6 Nov 2025 15:51:45 +0100 Subject: [PATCH 15/93] Adapat UI banner Logo + layout --- frontend/src/components/Banner/Banner.tsx | 36 ++++++------ .../src/components/BannerLogo/BannerLogo.tsx | 56 ++++++++++++------- .../LanguageSelector/LanguageSelector.tsx | 3 +- frontend/src/utils/customTheme/customTheme.ts | 6 ++ frontend/ui/Box/Box.tsx | 8 ++- frontend/ui/Header/Header.spec.tsx | 36 ++++++++++++ frontend/ui/Header/Header.story.tsx | 0 frontend/ui/Header/Header.tsx | 23 ++++++++ frontend/ui/Header/index.ts | 2 + 9 files changed, 126 insertions(+), 44 deletions(-) create mode 100644 frontend/ui/Header/Header.spec.tsx create mode 100644 frontend/ui/Header/Header.story.tsx create mode 100644 frontend/ui/Header/Header.tsx create mode 100644 frontend/ui/Header/index.ts diff --git a/frontend/src/components/Banner/Banner.tsx b/frontend/src/components/Banner/Banner.tsx index c41ca18b1..c7fb85fe1 100644 --- a/frontend/src/components/Banner/Banner.tsx +++ b/frontend/src/components/Banner/Banner.tsx @@ -1,7 +1,7 @@ import { ReactElement } from 'react'; -import { AppBar, Toolbar } from '@mui/material'; import Box from '@ui/Box'; import Stack from '@ui/Stack'; +import Header from '@ui/Header'; import BannerDateTime from '../BannerDateTime'; import BannerLinks from '../BannerLinks'; import BannerLogo from '../BannerLogo'; @@ -15,25 +15,23 @@ import BannerLanguage from '../BannerLanguage'; */ const Banner = (): ReactElement => { return ( - - - - - +

+ + + - - - - - - - + + + + + +
); }; diff --git a/frontend/src/components/BannerLogo/BannerLogo.tsx b/frontend/src/components/BannerLogo/BannerLogo.tsx index 2df4f85fe..9a77cee06 100644 --- a/frontend/src/components/BannerLogo/BannerLogo.tsx +++ b/frontend/src/components/BannerLogo/BannerLogo.tsx @@ -1,31 +1,45 @@ import { ReactElement } from 'react'; -import { Link } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; +import { useMediaQuery, useTheme } from '@mui/material'; +import Box from '@ui/Box'; /** * BannerLogo Component * - * This component returns the logo that redirects to the landing page when clicked. - * @returns {ReactElement} - the banner logo component + * This component returns a logo for the banner that navigates to the parent route when clicked. + * @returns {ReactElement} - the banner logo component. */ -const BannerLogo = (): ReactElement => ( - -
- { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('md')); + const navigate = useNavigate(); + const handleClick = () => { + navigate('..'); + }; + + return ( + + - Vonage-mobile-logo -
- -); +
+ ); +}; export default BannerLogo; diff --git a/frontend/src/components/LanguageSelector/LanguageSelector.tsx b/frontend/src/components/LanguageSelector/LanguageSelector.tsx index d93b7874a..e531b44e6 100644 --- a/frontend/src/components/LanguageSelector/LanguageSelector.tsx +++ b/frontend/src/components/LanguageSelector/LanguageSelector.tsx @@ -1,6 +1,7 @@ import { ReactElement } from 'react'; -import { Select, MenuItem, FormControl, SelectChangeEvent, Box } from '@mui/material'; +import { Select, MenuItem, FormControl, SelectChangeEvent } from '@mui/material'; import { useTranslation } from 'react-i18next'; +import Box from '@ui/Box'; import useIsSmallViewport from '../../hooks/useIsSmallViewport'; import VividIcon from '../VividIcon/VividIcon'; import env, { type Lang } from '../../env'; diff --git a/frontend/src/utils/customTheme/customTheme.ts b/frontend/src/utils/customTheme/customTheme.ts index 076b192e2..2f9903d97 100644 --- a/frontend/src/utils/customTheme/customTheme.ts +++ b/frontend/src/utils/customTheme/customTheme.ts @@ -4,6 +4,9 @@ declare module '@mui/material/styles' { interface TypeBackground { darkGrey: string; } + interface TypeText { + light: string; + } } const borderRadiusStandard = '8px'; @@ -29,6 +32,8 @@ const colors = { onPrimaryContainer: '#FFFFFF', surfaceTint: '#7F02F7', + textLight: '#64748B', + // Secondary colors secondary: '#2F293B', onSecondary: '#FFFFFF', @@ -107,6 +112,7 @@ const customTheme = createTheme({ text: { primary: colors.onBackground, secondary: colors.onSurface, + light: colors.textLight, }, divider: colors.outline, }, diff --git a/frontend/ui/Box/Box.tsx b/frontend/ui/Box/Box.tsx index f8fb99362..e2143c547 100644 --- a/frontend/ui/Box/Box.tsx +++ b/frontend/ui/Box/Box.tsx @@ -1,9 +1,11 @@ import { Box as MUIBox, BoxProps as MUIBoxProps } from '@mui/material'; +import React from 'react'; -type BoxProps = MUIBoxProps; +// Support "component" with intrinsic attributes +type BoxProps = MUIBoxProps; -const Box = ({ ...boxProps }: BoxProps) => { - return ; +const Box = (props: BoxProps) => { + return ; }; export default Box; diff --git a/frontend/ui/Header/Header.spec.tsx b/frontend/ui/Header/Header.spec.tsx new file mode 100644 index 000000000..73062dc80 --- /dev/null +++ b/frontend/ui/Header/Header.spec.tsx @@ -0,0 +1,36 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import Header from './Header'; + +describe('Header', () => { + it('renders correctly', () => { + render(
Header content
); + + const header = screen.getByRole('banner'); + expect(header).toBeInTheDocument(); + expect(screen.getByText('Header content')).toBeInTheDocument(); + }); + + it('renders children in toolbar', () => { + render( +
+
Navigation Item
+
User Menu
+
+ ); + + expect(screen.getByText('Navigation Item')).toBeInTheDocument(); + expect(screen.getByText('User Menu')).toBeInTheDocument(); + }); + + it('renders with different AppBar positions', () => { + const { rerender } = render(
Fixed header
); + + const banner = screen.getByRole('banner'); + expect(banner).toHaveClass('MuiAppBar-positionFixed'); + + rerender(
Sticky header
); + + expect(banner).toHaveClass('MuiAppBar-positionSticky'); + }); +}); diff --git a/frontend/ui/Header/Header.story.tsx b/frontend/ui/Header/Header.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/Header/Header.tsx b/frontend/ui/Header/Header.tsx new file mode 100644 index 000000000..42e8d9ef9 --- /dev/null +++ b/frontend/ui/Header/Header.tsx @@ -0,0 +1,23 @@ +import { + AppBar, + AppBarProps as MUIAppBarProps, + ToolbarProps as MUIToolbarProps, + Toolbar, +} from '@mui/material'; +import { ReactNode } from 'react'; + +type HeaderProps = { + children: ReactNode; + appBarProps?: MUIAppBarProps; + toolbarProps?: MUIToolbarProps; +}; + +const Header = ({ children, appBarProps, toolbarProps }: HeaderProps) => { + return ( + + {children} + + ); +}; + +export default Header; diff --git a/frontend/ui/Header/index.ts b/frontend/ui/Header/index.ts new file mode 100644 index 000000000..de520e89d --- /dev/null +++ b/frontend/ui/Header/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './Header'; From b28577b91e997011398963a6974e5dafac2de9ee Mon Sep 17 00:00:00 2001 From: ofava Date: Fri, 7 Nov 2025 11:52:28 +0100 Subject: [PATCH 16/93] Refactor UI components to use Box and update styles; add new FormControl, IconButton, Link, MenuItem, Select, and Tooltip components with tests --- .../BannerDateTime/BannerDateTime.tsx | 34 ++++--- .../BannerLanguage/BannerLanguage.tsx | 5 +- .../components/BannerLinks/BannerLinks.tsx | 5 +- .../components/BannerLogo/BannerLogo.spec.tsx | 19 +--- .../src/components/BannerLogo/BannerLogo.tsx | 10 +-- .../GHRepoButton/GHRepoButton.spec.tsx | 2 +- .../components/GHRepoButton/GHRepoButton.tsx | 10 ++- .../LanguageSelector.spec.tsx | 9 -- .../LanguageSelector/LanguageSelector.tsx | 28 +++--- .../LanguageSelector.types.tsx | 12 +++ frontend/src/utils/customTheme/customTheme.ts | 7 ++ frontend/ui/FormControl/FormControl.spec.tsx | 32 +++++++ frontend/ui/FormControl/FormControl.story.tsx | 0 frontend/ui/FormControl/FormControl.tsx | 12 +++ frontend/ui/FormControl/index.ts | 2 + frontend/ui/IconButton/IconButton.spec.tsx | 61 +++++++++++++ frontend/ui/IconButton/IconButton.story.tsx | 0 frontend/ui/IconButton/IconButton.tsx | 9 ++ frontend/ui/IconButton/index.ts | 2 + frontend/ui/Link/Link.spec.tsx | 56 ++++++++++++ frontend/ui/Link/Link.story.tsx | 0 frontend/ui/Link/Link.tsx | 9 ++ frontend/ui/Link/index.ts | 2 + frontend/ui/MenuItem/MenuItem.spec.tsx | 32 +++++++ frontend/ui/MenuItem/MenuItem.story.tsx | 0 frontend/ui/MenuItem/MenuItem.tsx | 9 ++ frontend/ui/MenuItem/index.ts | 2 + frontend/ui/Select/Select.spec.tsx | 90 +++++++++++++++++++ frontend/ui/Select/Select.story.tsx | 0 frontend/ui/Select/Select.tsx | 9 ++ frontend/ui/Select/index.ts | 2 + frontend/ui/SelectChangeEvent.tsx | 3 + frontend/ui/Tooltip/Tooltip.spec.tsx | 83 +++++++++++++++++ frontend/ui/Tooltip/Tooltip.story.tsx | 0 frontend/ui/Tooltip/Tooltip.tsx | 9 ++ frontend/ui/Tooltip/index.ts | 2 + 36 files changed, 500 insertions(+), 67 deletions(-) create mode 100644 frontend/src/components/LanguageSelector/LanguageSelector.types.tsx create mode 100644 frontend/ui/FormControl/FormControl.spec.tsx create mode 100644 frontend/ui/FormControl/FormControl.story.tsx create mode 100644 frontend/ui/FormControl/FormControl.tsx create mode 100644 frontend/ui/FormControl/index.ts create mode 100644 frontend/ui/IconButton/IconButton.spec.tsx create mode 100644 frontend/ui/IconButton/IconButton.story.tsx create mode 100644 frontend/ui/IconButton/IconButton.tsx create mode 100644 frontend/ui/IconButton/index.ts create mode 100644 frontend/ui/Link/Link.spec.tsx create mode 100644 frontend/ui/Link/Link.story.tsx create mode 100644 frontend/ui/Link/Link.tsx create mode 100644 frontend/ui/Link/index.ts create mode 100644 frontend/ui/MenuItem/MenuItem.spec.tsx create mode 100644 frontend/ui/MenuItem/MenuItem.story.tsx create mode 100644 frontend/ui/MenuItem/MenuItem.tsx create mode 100644 frontend/ui/MenuItem/index.ts create mode 100644 frontend/ui/Select/Select.spec.tsx create mode 100644 frontend/ui/Select/Select.story.tsx create mode 100644 frontend/ui/Select/Select.tsx create mode 100644 frontend/ui/Select/index.ts create mode 100644 frontend/ui/SelectChangeEvent.tsx create mode 100644 frontend/ui/Tooltip/Tooltip.spec.tsx create mode 100644 frontend/ui/Tooltip/Tooltip.story.tsx create mode 100644 frontend/ui/Tooltip/Tooltip.tsx create mode 100644 frontend/ui/Tooltip/index.ts diff --git a/frontend/src/components/BannerDateTime/BannerDateTime.tsx b/frontend/src/components/BannerDateTime/BannerDateTime.tsx index 7896c1b41..e5bc96e71 100644 --- a/frontend/src/components/BannerDateTime/BannerDateTime.tsx +++ b/frontend/src/components/BannerDateTime/BannerDateTime.tsx @@ -1,28 +1,40 @@ import { ReactElement } from 'react'; +import useIsTabletViewport from '@hooks/useIsTabletViewport'; +import Box from '@ui/Box'; +import Typography from '@ui/Typography'; import useDateTime from '../../hooks/useDateTime'; /** - * BannerDateTime Component - * * This component returns a UI that includes current time and date. * @returns {ReactElement} - the banner with a date and time component */ -const BannerDateTime = (): ReactElement => { +const BannerDateTime = (): ReactElement | null => { const { date, time } = useDateTime(); + const isTablet = useIsTabletViewport(); + + if (isTablet) { + return null; + } // hide on tablet or less return ( -
({ color: theme.palette.text.light })} > - + {time} - - - + + + + • + + + {date} - -
+ +
); }; diff --git a/frontend/src/components/BannerLanguage/BannerLanguage.tsx b/frontend/src/components/BannerLanguage/BannerLanguage.tsx index b77dedd6a..300d6f17a 100644 --- a/frontend/src/components/BannerLanguage/BannerLanguage.tsx +++ b/frontend/src/components/BannerLanguage/BannerLanguage.tsx @@ -1,4 +1,5 @@ import { ReactElement } from 'react'; +import Box from '@ui/Box'; import LanguageSelector from '../LanguageSelector'; /** @@ -9,9 +10,9 @@ import LanguageSelector from '../LanguageSelector'; */ const BannerLanguage = (): ReactElement => { return ( -
+ -
+
); }; diff --git a/frontend/src/components/BannerLinks/BannerLinks.tsx b/frontend/src/components/BannerLinks/BannerLinks.tsx index 20a04aa4a..fed2c95f8 100644 --- a/frontend/src/components/BannerLinks/BannerLinks.tsx +++ b/frontend/src/components/BannerLinks/BannerLinks.tsx @@ -1,4 +1,5 @@ import { ReactElement } from 'react'; +import Box from '@ui/Box'; import GHRepoButton from '../GHRepoButton'; /** @@ -9,9 +10,9 @@ import GHRepoButton from '../GHRepoButton'; */ const BannerLinks = (): ReactElement => { return ( -
+ -
+ ); }; diff --git a/frontend/src/components/BannerLogo/BannerLogo.spec.tsx b/frontend/src/components/BannerLogo/BannerLogo.spec.tsx index 67c0cf4c2..d07a860c0 100644 --- a/frontend/src/components/BannerLogo/BannerLogo.spec.tsx +++ b/frontend/src/components/BannerLogo/BannerLogo.spec.tsx @@ -16,26 +16,15 @@ describe('BannerLogo', () => { expect(vonageLogo.src).toContain('/images/vonage-logo-desktop.svg'); }); - it('renders the vonage mobile logo', () => { + it('renders clickable logo with cursor pointer', () => { render( ); - const vonageLogo = screen.getByAltText('Vonage-mobile-logo') as HTMLImageElement; - expect(vonageLogo).toBeInTheDocument(); - expect(vonageLogo.src).toContain('/images/vonage-logo-mobile.svg'); - }); - - it('wraps logos in a Link pointing to the landing page', () => { - render( - - - - ); - - const link = screen.getByRole('link'); - expect(link).toHaveAttribute('href', '/'); + const logo = screen.getByTestId('banner-logo-image'); + expect(logo).toBeInTheDocument(); + expect(logo).toHaveStyle({ cursor: 'pointer' }); }); }); diff --git a/frontend/src/components/BannerLogo/BannerLogo.tsx b/frontend/src/components/BannerLogo/BannerLogo.tsx index 9a77cee06..176c2bd7c 100644 --- a/frontend/src/components/BannerLogo/BannerLogo.tsx +++ b/frontend/src/components/BannerLogo/BannerLogo.tsx @@ -1,7 +1,7 @@ import { ReactElement } from 'react'; import { useNavigate } from 'react-router-dom'; -import { useMediaQuery, useTheme } from '@mui/material'; import Box from '@ui/Box'; +import useIsTabletViewport from '@hooks/useIsTabletViewport'; /** * BannerLogo Component @@ -10,8 +10,7 @@ import Box from '@ui/Box'; * @returns {ReactElement} - the banner logo component. */ const BannerLogo = (): ReactElement => { - const theme = useTheme(); - const isMobile = useMediaQuery(theme.breakpoints.down('md')); + const isTablet = useIsTabletViewport(); const navigate = useNavigate(); const handleClick = () => { navigate('..'); @@ -28,9 +27,10 @@ const BannerLogo = (): ReactElement => { }} > { it('renders the GitHub icon', () => { render(); - const icon = screen.getByTestId('GitHubIcon'); + const icon = screen.getByTestId('vivid-icon-github-mono'); expect(icon).toBeInTheDocument(); }); }); diff --git a/frontend/src/components/GHRepoButton/GHRepoButton.tsx b/frontend/src/components/GHRepoButton/GHRepoButton.tsx index 489af7ed0..65d92bd61 100644 --- a/frontend/src/components/GHRepoButton/GHRepoButton.tsx +++ b/frontend/src/components/GHRepoButton/GHRepoButton.tsx @@ -1,7 +1,9 @@ -import { IconButton, Link, Tooltip } from '@mui/material'; -import { GitHub as GitHubIcon } from '@mui/icons-material'; import { ReactElement } from 'react'; import { useTranslation } from 'react-i18next'; +import Tooltip from '@ui/Tooltip'; +import Link from '@ui/Link'; +import IconButton from '@ui/IconButton'; +import VividIcon from '@components/VividIcon'; /** * GHRepoButton Component @@ -15,8 +17,8 @@ const GHRepoButton = (): ReactElement => { return ( - - + + diff --git a/frontend/src/components/LanguageSelector/LanguageSelector.spec.tsx b/frontend/src/components/LanguageSelector/LanguageSelector.spec.tsx index 4d424ad36..a7491b5de 100644 --- a/frontend/src/components/LanguageSelector/LanguageSelector.spec.tsx +++ b/frontend/src/components/LanguageSelector/LanguageSelector.spec.tsx @@ -83,15 +83,6 @@ describe('LanguageSelector', () => { expect(screen.queryByTestId('vivid-icon-flag-united-kingdom')).not.toBeInTheDocument(); }); - it('applies custom className', () => { - env.setSupportedLanguages('en'); - - render(); - - const formControl = screen.getByTestId('language-selector').closest('.MuiFormControl-root'); - expect(formControl).toHaveClass('bg-red-500'); - }); - it('renders VividIcon with correct size in main display', () => { env.setSupportedLanguages('en'); diff --git a/frontend/src/components/LanguageSelector/LanguageSelector.tsx b/frontend/src/components/LanguageSelector/LanguageSelector.tsx index e531b44e6..3e9da3e2c 100644 --- a/frontend/src/components/LanguageSelector/LanguageSelector.tsx +++ b/frontend/src/components/LanguageSelector/LanguageSelector.tsx @@ -1,21 +1,14 @@ import { ReactElement } from 'react'; -import { Select, MenuItem, FormControl, SelectChangeEvent } from '@mui/material'; import { useTranslation } from 'react-i18next'; import Box from '@ui/Box'; +import MenuItem from '@ui/MenuItem'; +import FormControl from '@ui/FormControl'; +import Select from '@ui/Select'; +import { SelectChangeEvent } from '@ui/SelectChangeEvent'; +import { LanguageOption, LanguageSelectorProps } from './LanguageSelector.types'; import useIsSmallViewport from '../../hooks/useIsSmallViewport'; import VividIcon from '../VividIcon/VividIcon'; -import env, { type Lang } from '../../env'; - -type LanguageOption = { - code: Lang; - name: string; - flag: string; -}; - -type LanguageSelectorProps = { - showFlag?: boolean; - className?: string; -}; +import env from '../../env'; const languageOptions: LanguageOption[] = [ { code: 'en', name: 'English', flag: 'flag-united-kingdom' }, @@ -31,10 +24,9 @@ const languageOptions: LanguageOption[] = [ * The available languages are determined by the VITE_I18N_SUPPORTED_LANGUAGES environment variable. * @param {LanguageSelectorProps} props - The props for the component. * @property {boolean} showFlag - Whether to display the country flag alongside the language name. - * @property {string} className - Additional CSS classes to apply to the component. * @returns {ReactElement} The rendered LanguageSelector component. */ -const LanguageSelector = ({ showFlag = true, className }: LanguageSelectorProps): ReactElement => { +const LanguageSelector = ({ showFlag = true }: LanguageSelectorProps): ReactElement => { const { i18n } = useTranslation(); const isSmallViewport = useIsSmallViewport(); @@ -50,7 +42,7 @@ const LanguageSelector = ({ showFlag = true, className }: LanguageSelectorProps) const currentLanguage = i18n.language || 'en'; return ( - + + Select an option + Option 1 + Option 2 + + ); + + const select = screen.getByRole('combobox'); + expect(select).toBeInTheDocument(); + }); + + it('handles value changes', () => { + const handleChange = vi.fn(); + + render( + + ); + + const select = screen.getByRole('combobox'); + fireEvent.mouseDown(select); + + const option1 = screen.getByRole('option', { name: 'Option 1' }); + fireEvent.click(option1); + + expect(handleChange).toHaveBeenCalledTimes(1); + }); + + it('handles disabled state', () => { + render( + + ); + + const select = screen.getByRole('combobox'); + expect(select).toHaveAttribute('aria-disabled', 'true'); + }); + + it('renders with error state', () => { + render( + + ); + + const select = screen.getByRole('combobox'); + expect(select).toBeInTheDocument(); + // Error styling would be applied via CSS classes + }); + + it('renders with multiple selection', () => { + render( + + ); + + const select = screen.getByRole('combobox'); + expect(select).toBeInTheDocument(); + }); + + it('shows placeholder when displayEmpty is true', () => { + render( + + ); + + expect(screen.getByText('Choose an option')).toBeInTheDocument(); + }); +}); diff --git a/frontend/ui/Select/Select.story.tsx b/frontend/ui/Select/Select.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/Select/Select.tsx b/frontend/ui/Select/Select.tsx new file mode 100644 index 000000000..976a55f2e --- /dev/null +++ b/frontend/ui/Select/Select.tsx @@ -0,0 +1,9 @@ +import { Select as MUISelect, SelectProps as MUISelectProps } from '@mui/material'; + +export type SelectProps = MUISelectProps; + +const Select = (props: SelectProps) => { + return ; +}; + +export default Select; diff --git a/frontend/ui/Select/index.ts b/frontend/ui/Select/index.ts new file mode 100644 index 000000000..7baece89a --- /dev/null +++ b/frontend/ui/Select/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './Select'; diff --git a/frontend/ui/SelectChangeEvent.tsx b/frontend/ui/SelectChangeEvent.tsx new file mode 100644 index 000000000..c8cfa0745 --- /dev/null +++ b/frontend/ui/SelectChangeEvent.tsx @@ -0,0 +1,3 @@ +import { SelectChangeEvent as MUISelectChangeEvent } from '@mui/material'; + +export type SelectChangeEvent = MUISelectChangeEvent; diff --git a/frontend/ui/Tooltip/Tooltip.spec.tsx b/frontend/ui/Tooltip/Tooltip.spec.tsx new file mode 100644 index 000000000..b0cdd1e15 --- /dev/null +++ b/frontend/ui/Tooltip/Tooltip.spec.tsx @@ -0,0 +1,83 @@ +import { render, screen, fireEvent, waitFor } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import Tooltip from './Tooltip'; + +describe('Tooltip', () => { + it('renders correctly', () => { + render( + + + + ); + + const button = screen.getByRole('button', { name: 'Helpful tooltip' }); + expect(button).toBeInTheDocument(); + expect(button).toHaveTextContent('Hover me'); + }); + + it('shows tooltip on hover', async () => { + render( + + + + ); + + const button = screen.getByRole('button', { name: 'This is a tooltip' }); + + fireEvent.mouseEnter(button); + + await waitFor(() => { + expect(screen.getByRole('tooltip')).toBeInTheDocument(); + }); + + expect(screen.getByText('This is a tooltip')).toBeInTheDocument(); + }); + + it('hides tooltip on mouse leave', async () => { + render( + + + + ); + + const button = screen.getByRole('button', { name: 'Disappearing tooltip' }); + + fireEvent.mouseEnter(button); + await waitFor(() => { + expect(screen.getByRole('tooltip')).toBeInTheDocument(); + }); + + fireEvent.mouseLeave(button); + await waitFor(() => { + expect(screen.queryByRole('tooltip')).not.toBeInTheDocument(); + }); + }); + + it('renders with different placements', async () => { + const { rerender } = render( + + + + ); + + const button = screen.getByRole('button', { name: 'Top placement' }); + fireEvent.mouseEnter(button); + + await waitFor(() => { + expect(screen.getByRole('tooltip')).toBeInTheDocument(); + }); + + rerender( + + + + ); + + const bottomButton = screen.getByRole('button', { name: 'Bottom placement' }); + fireEvent.mouseEnter(bottomButton); + + await waitFor(() => { + expect(screen.getByText('Bottom placement')).toBeInTheDocument(); + }); + }); +}); diff --git a/frontend/ui/Tooltip/Tooltip.story.tsx b/frontend/ui/Tooltip/Tooltip.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/Tooltip/Tooltip.tsx b/frontend/ui/Tooltip/Tooltip.tsx new file mode 100644 index 000000000..e7cab74c9 --- /dev/null +++ b/frontend/ui/Tooltip/Tooltip.tsx @@ -0,0 +1,9 @@ +import { Tooltip as MUITooltip, TooltipProps as MUITooltipProps } from '@mui/material'; + +type TooltipProps = MUITooltipProps; + +const Tooltip = ({ ...tooltipProps }: TooltipProps) => { + return ; +}; + +export default Tooltip; diff --git a/frontend/ui/Tooltip/index.ts b/frontend/ui/Tooltip/index.ts new file mode 100644 index 000000000..207204202 --- /dev/null +++ b/frontend/ui/Tooltip/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './Tooltip'; From 5dc287c6073b8c7a1a81f961fe46238d66435320 Mon Sep 17 00:00:00 2001 From: ofava Date: Fri, 7 Nov 2025 13:06:23 +0100 Subject: [PATCH 17/93] Refactor root element in index.html and wrap App component in Box for consistent styling --- frontend/index.html | 2 +- frontend/src/main.tsx | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index 6ccdceac0..327d099ab 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -11,7 +11,7 @@ Vonage Video React Reference App -
+
diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index 7c188d4a0..929c380fb 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -1,5 +1,6 @@ import ReactDOM from 'react-dom/client'; import { registerIcon } from '@vonage/vivid'; +import Box from '@ui/Box'; import App from './App.jsx'; import './i18n.js'; @@ -12,7 +13,8 @@ registerIcon(); */ const rootElement = document.getElementById('root')!; -/** - * Initializes and renders the React application into the root element. - */ -ReactDOM.createRoot(rootElement).render(); +ReactDOM.createRoot(rootElement).render( + ({ backgroundColor: theme.palette.background.paper, position: 'absolute' })}> + + +); From 90d432c2ea8381002d2fa464e34135123c89ee00 Mon Sep 17 00:00:00 2001 From: OscarFava Date: Fri, 7 Nov 2025 13:08:13 +0100 Subject: [PATCH 18/93] Update frontend/src/components/BannerDateTime/BannerDateTime.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- frontend/src/components/BannerDateTime/BannerDateTime.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/BannerDateTime/BannerDateTime.tsx b/frontend/src/components/BannerDateTime/BannerDateTime.tsx index e5bc96e71..3ad1293c4 100644 --- a/frontend/src/components/BannerDateTime/BannerDateTime.tsx +++ b/frontend/src/components/BannerDateTime/BannerDateTime.tsx @@ -6,7 +6,8 @@ import useDateTime from '../../hooks/useDateTime'; /** * This component returns a UI that includes current time and date. - * @returns {ReactElement} - the banner with a date and time component + * Returns a banner with a date and time component, or null on tablet viewports. + * @returns {ReactElement | null} - the banner with a date and time component, or null on tablet viewports */ const BannerDateTime = (): ReactElement | null => { const { date, time } = useDateTime(); From 6fe87c7a3b44d0274f9a8e31e89e21f7d6d246a6 Mon Sep 17 00:00:00 2001 From: ofava Date: Fri, 7 Nov 2025 13:31:14 +0100 Subject: [PATCH 19/93] Copilot suggestions --- frontend/src/main.tsx | 3 ++- frontend/src/utils/customTheme/customTheme.ts | 10 +++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index 929c380fb..c0238ba65 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -1,6 +1,7 @@ import ReactDOM from 'react-dom/client'; import { registerIcon } from '@vonage/vivid'; import Box from '@ui/Box'; +import { colors } from '@utils/customTheme/customTheme'; import App from './App.jsx'; import './i18n.js'; @@ -14,7 +15,7 @@ registerIcon(); const rootElement = document.getElementById('root')!; ReactDOM.createRoot(rootElement).render( - ({ backgroundColor: theme.palette.background.paper, position: 'absolute' })}> + ); diff --git a/frontend/src/utils/customTheme/customTheme.ts b/frontend/src/utils/customTheme/customTheme.ts index 076b192e2..0070e5b2c 100644 --- a/frontend/src/utils/customTheme/customTheme.ts +++ b/frontend/src/utils/customTheme/customTheme.ts @@ -128,8 +128,12 @@ const customTheme = createTheme({ MuiToolbar: { styleOverrides: { root: { - paddingLeft: '0 !important', - paddingRight: '0 !important', + paddingLeft: '0', + paddingRight: '0', + '@media (min-width: 600px)': { + paddingLeft: 0, + paddingRight: 0, + }, }, }, }, @@ -157,7 +161,7 @@ const customTheme = createTheme({ borderRadius: borderRadiusStandard, backgroundClip: 'padding-box', '&.Mui-error': { - backgroundColor: `${colors.errorContainer} !important`, + backgroundColor: colors.errorContainer, }, '& .MuiOutlinedInput-root': { '& fieldset': { From 0c64adf0f189c9670648d69f4221b4ff804b3354 Mon Sep 17 00:00:00 2001 From: ofava Date: Fri, 7 Nov 2025 13:34:20 +0100 Subject: [PATCH 20/93] github suggestions --- .../src/components/LanguageSelector/LanguageSelector.types.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/src/components/LanguageSelector/LanguageSelector.types.tsx b/frontend/src/components/LanguageSelector/LanguageSelector.types.tsx index 6199ee929..054694253 100644 --- a/frontend/src/components/LanguageSelector/LanguageSelector.types.tsx +++ b/frontend/src/components/LanguageSelector/LanguageSelector.types.tsx @@ -8,5 +8,4 @@ export type LanguageOption = { export type LanguageSelectorProps = { showFlag?: boolean; - className?: string; }; From 128649e6567c165e30ca25613f0dd76063b837b2 Mon Sep 17 00:00:00 2001 From: OscarFava Date: Fri, 7 Nov 2025 13:40:12 +0100 Subject: [PATCH 21/93] Update frontend/src/components/JoinButton/JoinButton.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- frontend/src/components/JoinButton/JoinButton.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/JoinButton/JoinButton.tsx b/frontend/src/components/JoinButton/JoinButton.tsx index 7e5f2215b..19aa51f27 100644 --- a/frontend/src/components/JoinButton/JoinButton.tsx +++ b/frontend/src/components/JoinButton/JoinButton.tsx @@ -29,7 +29,7 @@ const JoinButton = ({ roomName, isDisabled }: JoinButtonProps): ReactElement => }> + Error with action + + ); + + expect(screen.getByRole('button', { name: 'Undo' })).toBeInTheDocument(); + expect(screen.getByText('Error with action')).toBeInTheDocument(); + }); +}); diff --git a/frontend/ui/Alert/Alert.story.tsx b/frontend/ui/Alert/Alert.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/Alert/Alert.tsx b/frontend/ui/Alert/Alert.tsx new file mode 100644 index 000000000..feec8d256 --- /dev/null +++ b/frontend/ui/Alert/Alert.tsx @@ -0,0 +1,9 @@ +import { Alert as MUIAlert, AlertProps as MUIAlertProps } from '@mui/material'; + +type AlertProps = MUIAlertProps; + +const Alert = (alertProps: AlertProps) => { + return ; +}; + +export default Alert; diff --git a/frontend/ui/Alert/index.ts b/frontend/ui/Alert/index.ts new file mode 100644 index 000000000..d6bd23bba --- /dev/null +++ b/frontend/ui/Alert/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './Alert'; diff --git a/frontend/ui/AlertTitle/AlertTitle.spec.tsx b/frontend/ui/AlertTitle/AlertTitle.spec.tsx new file mode 100644 index 000000000..fb21fed33 --- /dev/null +++ b/frontend/ui/AlertTitle/AlertTitle.spec.tsx @@ -0,0 +1,51 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import AlertTitle from './index'; + +describe('AlertTitle', () => { + it('renders correctly', () => { + render(Alert Title Text); + + const alertTitle = screen.getByText('Alert Title Text'); + expect(alertTitle).toBeInTheDocument(); + expect(alertTitle).toHaveClass('MuiAlertTitle-root'); + }); + + it('renders with different typography variants', () => { + render(Important Alert); + + const alertTitle = screen.getByTestId('alert-title'); + expect(alertTitle).toBeInTheDocument(); + expect(alertTitle).toHaveClass('MuiAlertTitle-root'); + }); + + it('renders within Alert context', () => { + render( +
+ Warning +
This is the alert message content.
+
+ ); + + expect(screen.getByText('Warning')).toBeInTheDocument(); + expect(screen.getByText('This is the alert message content.')).toBeInTheDocument(); + }); + + it('handles empty content', () => { + render(); + + const alertTitle = screen.getByTestId('empty-alert-title'); + expect(alertTitle).toBeInTheDocument(); + expect(alertTitle).toHaveClass('MuiAlertTitle-root'); + }); + + it('renders with long text content', () => { + const longTitle = + 'This is a very long alert title that might wrap to multiple lines in the user interface'; + + render({longTitle}); + + const alertTitle = screen.getByText(longTitle); + expect(alertTitle).toBeInTheDocument(); + }); +}); diff --git a/frontend/ui/AlertTitle/AlertTitle.story.tsx b/frontend/ui/AlertTitle/AlertTitle.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/AlertTitle/AlertTitle.tsx b/frontend/ui/AlertTitle/AlertTitle.tsx new file mode 100644 index 000000000..c55093bf1 --- /dev/null +++ b/frontend/ui/AlertTitle/AlertTitle.tsx @@ -0,0 +1,9 @@ +import { AlertTitle as MUIAlertTitle, AlertTitleProps as MUIAlertTitleProps } from '@mui/material'; + +type AlertTitleProps = MUIAlertTitleProps; + +const AlertTitle = (alertTitleProps: AlertTitleProps) => { + return ; +}; + +export default AlertTitle; diff --git a/frontend/ui/AlertTitle/index.ts b/frontend/ui/AlertTitle/index.ts new file mode 100644 index 000000000..1184cbe9b --- /dev/null +++ b/frontend/ui/AlertTitle/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './AlertTitle'; diff --git a/frontend/ui/Avatar/Avatar.spec.tsx b/frontend/ui/Avatar/Avatar.spec.tsx new file mode 100644 index 000000000..288851c01 --- /dev/null +++ b/frontend/ui/Avatar/Avatar.spec.tsx @@ -0,0 +1,52 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import Avatar from './index'; + +describe('Avatar', () => { + it('renders correctly with children', () => { + render(AB); + + const avatar = screen.getByText('AB'); + expect(avatar).toBeInTheDocument(); + expect(avatar).toHaveClass('MuiAvatar-root'); + }); + + it('renders with image src', () => { + render(); + + const avatar = screen.getByRole('img', { name: 'Test User' }); + expect(avatar).toBeInTheDocument(); + expect(avatar).toHaveAttribute('src', '/test-avatar.jpg'); + }); + + it('renders with different variants', () => { + const { rerender } = render( + + C + + ); + + const avatar = screen.getByTestId('circular-avatar'); + expect(avatar).toHaveClass('MuiAvatar-circular'); + + rerender( + + S + + ); + const squareAvatar = screen.getByTestId('square-avatar'); + expect(squareAvatar).toHaveClass('MuiAvatar-square'); + }); + + it('renders with icon content', () => { + const TestIcon = () => 👤; + + render( + + + + ); + + expect(screen.getByText('👤')).toBeInTheDocument(); + }); +}); diff --git a/frontend/ui/Avatar/Avatar.story.tsx b/frontend/ui/Avatar/Avatar.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/Avatar/Avatar.tsx b/frontend/ui/Avatar/Avatar.tsx new file mode 100644 index 000000000..c73b7b2c0 --- /dev/null +++ b/frontend/ui/Avatar/Avatar.tsx @@ -0,0 +1,9 @@ +import { Avatar as MUIAvatar, AvatarProps as MUIAvatarProps } from '@mui/material'; + +type AvatarProps = MUIAvatarProps; + +const Avatar = (avatarProps: AvatarProps) => { + return ; +}; + +export default Avatar; diff --git a/frontend/ui/Avatar/index.ts b/frontend/ui/Avatar/index.ts new file mode 100644 index 000000000..6d75da384 --- /dev/null +++ b/frontend/ui/Avatar/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './Avatar'; diff --git a/frontend/ui/Box/Box.spec.tsx b/frontend/ui/Box/Box.spec.tsx index 6ac287bb8..753053103 100644 --- a/frontend/ui/Box/Box.spec.tsx +++ b/frontend/ui/Box/Box.spec.tsx @@ -1,6 +1,6 @@ import { render, screen } from '@testing-library/react'; import { describe, it, expect } from 'vitest'; -import Box from './Box'; +import Box from './index'; describe('Box', () => { it('renders correctly', () => { diff --git a/frontend/ui/Button/Button.spec.tsx b/frontend/ui/Button/Button.spec.tsx index 3405c1651..542525e00 100644 --- a/frontend/ui/Button/Button.spec.tsx +++ b/frontend/ui/Button/Button.spec.tsx @@ -1,6 +1,6 @@ import { render, screen } from '@testing-library/react'; import { describe, it, expect } from 'vitest'; -import Button from './Button'; +import Button from './index'; describe('Button', () => { it('renders correctly', () => { diff --git a/frontend/ui/CircularProgress/CircularProgress.spec.tsx b/frontend/ui/CircularProgress/CircularProgress.spec.tsx new file mode 100644 index 000000000..d61a45ed3 --- /dev/null +++ b/frontend/ui/CircularProgress/CircularProgress.spec.tsx @@ -0,0 +1,36 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import CircularProgress from './index'; + +describe('CircularProgress', () => { + it('renders correctly', () => { + render(); + + const progress = screen.getByRole('progressbar'); + expect(progress).toBeInTheDocument(); + }); + + it('renders with custom size', () => { + render(); + + const progress = screen.getByTestId('large-progress'); + expect(progress).toBeInTheDocument(); + expect(progress).toHaveClass('MuiCircularProgress-root'); + }); + + it('applies custom sx props', () => { + render(); + + const progress = screen.getByTestId('styled-progress'); + expect(progress).toBeInTheDocument(); + expect(progress).toHaveClass('MuiCircularProgress-root'); + }); + + it('has proper accessibility attributes', () => { + render(); + + const progress = screen.getByRole('progressbar'); + expect(progress).toHaveAttribute('aria-valuenow', '50'); + expect(progress).toHaveAccessibleName('Loading progress'); + }); +}); diff --git a/frontend/ui/CircularProgress/CircularProgress.story.tsx b/frontend/ui/CircularProgress/CircularProgress.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/CircularProgress/CircularProgress.tsx b/frontend/ui/CircularProgress/CircularProgress.tsx new file mode 100644 index 000000000..f65440251 --- /dev/null +++ b/frontend/ui/CircularProgress/CircularProgress.tsx @@ -0,0 +1,12 @@ +import { + CircularProgress as MUICircularProgress, + CircularProgressProps as MUICircularProgressProps, +} from '@mui/material'; + +type CircularProgressProps = MUICircularProgressProps; + +const CircularProgress = (circularProgressProps: CircularProgressProps) => { + return ; +}; + +export default CircularProgress; diff --git a/frontend/ui/CircularProgress/index.ts b/frontend/ui/CircularProgress/index.ts new file mode 100644 index 000000000..08b11c48a --- /dev/null +++ b/frontend/ui/CircularProgress/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './CircularProgress'; diff --git a/frontend/ui/Dialog/Dialog.spec.tsx b/frontend/ui/Dialog/Dialog.spec.tsx new file mode 100644 index 000000000..3e77e9ee6 --- /dev/null +++ b/frontend/ui/Dialog/Dialog.spec.tsx @@ -0,0 +1,85 @@ +import { render, screen, fireEvent } from '@testing-library/react'; +import { describe, it, expect, vi } from 'vitest'; +import { DialogTitle, DialogContent, DialogActions, Button } from '@mui/material'; +import Dialog from './index'; + +describe('Dialog', () => { + it('renders correctly when open', () => { + render( + + Test Dialog + This is the dialog content. + + ); + + const dialog = screen.getByRole('dialog'); + expect(dialog).toBeInTheDocument(); + expect(screen.getByText('Test Dialog')).toBeInTheDocument(); + expect(screen.getByText('This is the dialog content.')).toBeInTheDocument(); + }); + + it('does not render when closed', () => { + render( + + Hidden Dialog + + ); + + expect(screen.queryByRole('dialog')).not.toBeInTheDocument(); + expect(screen.queryByText('Hidden Dialog')).not.toBeInTheDocument(); + }); + + it('handles close events', () => { + const handleClose = vi.fn(); + + render( + + Closable Dialog + Content here + + ); + + const backdrop = document.querySelector('.MuiBackdrop-root'); + if (backdrop) { + fireEvent.click(backdrop); + expect(handleClose).toHaveBeenCalledTimes(1); + } + }); + + it('renders with action buttons', () => { + const handleCancel = vi.fn(); + const handleConfirm = vi.fn(); + + render( + + Confirm Action + Are you sure you want to continue? + + + + + + ); + + const cancelButton = screen.getByRole('button', { name: 'Cancel' }); + const confirmButton = screen.getByRole('button', { name: 'Confirm' }); + + expect(cancelButton).toBeInTheDocument(); + expect(confirmButton).toBeInTheDocument(); + + fireEvent.click(cancelButton); + expect(handleCancel).toHaveBeenCalledTimes(1); + }); + + it('renders fullscreen dialog', () => { + render( + + Fullscreen Dialog + This dialog takes up the full screen. + + ); + + const dialog = screen.getByTestId('fullscreen-dialog'); + expect(dialog).toBeInTheDocument(); + }); +}); diff --git a/frontend/ui/Dialog/Dialog.story.tsx b/frontend/ui/Dialog/Dialog.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/Dialog/Dialog.tsx b/frontend/ui/Dialog/Dialog.tsx new file mode 100644 index 000000000..23134e658 --- /dev/null +++ b/frontend/ui/Dialog/Dialog.tsx @@ -0,0 +1,9 @@ +import { Dialog as MUIDialog, DialogProps as MUIDialogProps } from '@mui/material'; + +type DialogProps = MUIDialogProps; + +const Dialog = (dialogProps: DialogProps) => { + return ; +}; + +export default Dialog; diff --git a/frontend/ui/Dialog/index.ts b/frontend/ui/Dialog/index.ts new file mode 100644 index 000000000..4f2939171 --- /dev/null +++ b/frontend/ui/Dialog/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './Dialog'; diff --git a/frontend/ui/FlexLayout/FlexLayout.spec.tsx b/frontend/ui/FlexLayout/FlexLayout.spec.tsx index e95ffe04a..757780190 100644 --- a/frontend/ui/FlexLayout/FlexLayout.spec.tsx +++ b/frontend/ui/FlexLayout/FlexLayout.spec.tsx @@ -1,6 +1,6 @@ import { render, screen } from '@testing-library/react'; import { describe, it, expect } from 'vitest'; -import FlexLayout from './FlexLayout'; +import FlexLayout from './index'; describe('FlexLayout', () => { it('renders with compound components', () => { diff --git a/frontend/ui/FormControl/FormControl.spec.tsx b/frontend/ui/FormControl/FormControl.spec.tsx index 9f3cc972d..3ce395700 100644 --- a/frontend/ui/FormControl/FormControl.spec.tsx +++ b/frontend/ui/FormControl/FormControl.spec.tsx @@ -1,7 +1,7 @@ import { render, screen } from '@testing-library/react'; import { describe, it, expect } from 'vitest'; import { FormLabel, TextField, FormHelperText } from '@mui/material'; -import FormControl from './FormControl'; +import FormControl from './index'; describe('FormControl', () => { it('renders correctly', () => { diff --git a/frontend/ui/Header/Header.spec.tsx b/frontend/ui/Header/Header.spec.tsx index 73062dc80..628e404e9 100644 --- a/frontend/ui/Header/Header.spec.tsx +++ b/frontend/ui/Header/Header.spec.tsx @@ -1,6 +1,6 @@ import { render, screen } from '@testing-library/react'; import { describe, it, expect } from 'vitest'; -import Header from './Header'; +import Header from './index'; describe('Header', () => { it('renders correctly', () => { diff --git a/frontend/ui/IconButton/IconButton.spec.tsx b/frontend/ui/IconButton/IconButton.spec.tsx index 14a123025..6ba19d0c9 100644 --- a/frontend/ui/IconButton/IconButton.spec.tsx +++ b/frontend/ui/IconButton/IconButton.spec.tsx @@ -1,6 +1,6 @@ import { render, screen, fireEvent } from '@testing-library/react'; import { describe, it, expect, vi } from 'vitest'; -import IconButton from './IconButton'; +import IconButton from './index'; describe('IconButton', () => { it('renders correctly', () => { diff --git a/frontend/ui/InputAdornment/InputAdornment.spec.tsx b/frontend/ui/InputAdornment/InputAdornment.spec.tsx index ec137a0cb..da981ac7d 100644 --- a/frontend/ui/InputAdornment/InputAdornment.spec.tsx +++ b/frontend/ui/InputAdornment/InputAdornment.spec.tsx @@ -1,6 +1,6 @@ import { render, screen } from '@testing-library/react'; import { describe, it, expect } from 'vitest'; -import InputAdornment from './InputAdornment'; +import InputAdornment from './index'; describe('InputAdornment', () => { it('renders correctly', () => { diff --git a/frontend/ui/Link/Link.spec.tsx b/frontend/ui/Link/Link.spec.tsx index 20d1e43dd..9889fbe7f 100644 --- a/frontend/ui/Link/Link.spec.tsx +++ b/frontend/ui/Link/Link.spec.tsx @@ -1,6 +1,6 @@ import { render, screen, fireEvent } from '@testing-library/react'; import { describe, it, expect, vi } from 'vitest'; -import Link from './Link'; +import Link from './index'; describe('Link', () => { it('renders correctly', () => { diff --git a/frontend/ui/MenuItem/MenuItem.spec.tsx b/frontend/ui/MenuItem/MenuItem.spec.tsx index e58ddae64..e8ee1d0e6 100644 --- a/frontend/ui/MenuItem/MenuItem.spec.tsx +++ b/frontend/ui/MenuItem/MenuItem.spec.tsx @@ -1,6 +1,6 @@ import { render, screen, fireEvent } from '@testing-library/react'; import { describe, it, expect, vi } from 'vitest'; -import MenuItem from './MenuItem'; +import MenuItem from './index'; describe('MenuItem', () => { it('renders correctly', () => { diff --git a/frontend/ui/Paper/Paper.spec.tsx b/frontend/ui/Paper/Paper.spec.tsx new file mode 100644 index 000000000..388cf1836 --- /dev/null +++ b/frontend/ui/Paper/Paper.spec.tsx @@ -0,0 +1,102 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import Paper from './index'; + +describe('Paper', () => { + it('renders correctly', () => { + render(Paper content); + + const paper = screen.getByText('Paper content'); + expect(paper).toBeInTheDocument(); + expect(paper).toHaveClass('MuiPaper-root'); + }); + + it('renders with different elevations', () => { + const { rerender } = render( + + No elevation + + ); + + const paper = screen.getByTestId('paper'); + expect(paper).toHaveClass('MuiPaper-elevation0'); + + rerender( + + Medium elevation + + ); + expect(paper).toHaveClass('MuiPaper-elevation3'); + + rerender( + + High elevation + + ); + expect(paper).toHaveClass('MuiPaper-elevation8'); + }); + + it('renders with different variants', () => { + const { rerender } = render( + + Elevation variant + + ); + + const paper = screen.getByTestId('paper'); + expect(paper).toHaveClass('MuiPaper-root'); + + rerender( + + Outlined variant + + ); + expect(paper).toHaveClass('MuiPaper-outlined'); + }); + + it('renders as different components', () => { + render( + + Section Paper + + ); + + const paper = screen.getByTestId('section-paper'); + expect(paper.tagName).toBe('SECTION'); + expect(paper).toHaveTextContent('Section Paper'); + }); + + it('renders with square corners', () => { + render( + + Square Paper + + ); + + const paper = screen.getByTestId('square-paper'); + expect(paper).toBeInTheDocument(); + // Square removes border radius styling + }); + + it('handles empty content', () => { + render(); + + const paper = screen.getByTestId('empty-paper'); + expect(paper).toBeInTheDocument(); + expect(paper).toHaveClass('MuiPaper-root'); + }); + + it('renders with nested content', () => { + render( + +
Header content
+
Body content
+
Footer content
+
+ ); + + expect(screen.getByText('Header content')).toBeInTheDocument(); + expect(screen.getByText('Body content')).toBeInTheDocument(); + expect(screen.getByText('Footer content')).toBeInTheDocument(); + }); +}); diff --git a/frontend/ui/Paper/Paper.story.tsx b/frontend/ui/Paper/Paper.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/Paper/Paper.tsx b/frontend/ui/Paper/Paper.tsx new file mode 100644 index 000000000..3e8cdfef5 --- /dev/null +++ b/frontend/ui/Paper/Paper.tsx @@ -0,0 +1,9 @@ +import { Paper as MUIPaper, PaperProps as MUIPaperProps } from '@mui/material'; + +type PaperProps = MUIPaperProps; + +const Paper = (paperProps: PaperProps) => { + return ; +}; + +export default Paper; diff --git a/frontend/ui/Paper/index.ts b/frontend/ui/Paper/index.ts new file mode 100644 index 000000000..7b5bbf361 --- /dev/null +++ b/frontend/ui/Paper/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './Paper'; diff --git a/frontend/ui/Select/Select.spec.tsx b/frontend/ui/Select/Select.spec.tsx index 674695606..302a00800 100644 --- a/frontend/ui/Select/Select.spec.tsx +++ b/frontend/ui/Select/Select.spec.tsx @@ -1,7 +1,7 @@ import { render, screen, fireEvent } from '@testing-library/react'; import { describe, it, expect, vi } from 'vitest'; import { MenuItem } from '@mui/material'; -import Select from './Select'; +import Select from './index'; describe('Select', () => { it('renders correctly', () => { diff --git a/frontend/ui/Stack/Stack.spec.tsx b/frontend/ui/Stack/Stack.spec.tsx index 333f7b9c5..06f6c516a 100644 --- a/frontend/ui/Stack/Stack.spec.tsx +++ b/frontend/ui/Stack/Stack.spec.tsx @@ -1,6 +1,6 @@ import { render, screen } from '@testing-library/react'; import { describe, it, expect } from 'vitest'; -import Stack from './Stack'; +import Stack from './index'; describe('Stack', () => { it('renders correctly', () => { diff --git a/frontend/ui/SxProps.tsx b/frontend/ui/SxProps.tsx new file mode 100644 index 000000000..87fdc6d3e --- /dev/null +++ b/frontend/ui/SxProps.tsx @@ -0,0 +1,3 @@ +import { SxProps as MUISxProps, Theme } from '@mui/material/styles'; + +export type SxProps = MUISxProps; diff --git a/frontend/ui/Tab/Tab.spec.tsx b/frontend/ui/Tab/Tab.spec.tsx new file mode 100644 index 000000000..f2967e8d4 --- /dev/null +++ b/frontend/ui/Tab/Tab.spec.tsx @@ -0,0 +1,30 @@ +import { render, screen, fireEvent } from '@testing-library/react'; +import { describe, it, expect, vi } from 'vitest'; +import Tab from './index'; + +describe('Tab', () => { + it('renders correctly', () => { + render(); + + const tab = screen.getByRole('tab', { name: 'Test Tab' }); + expect(tab).toBeInTheDocument(); + }); + + it('handles click events', () => { + const handleClick = vi.fn(); + + render(); + + const tab = screen.getByRole('tab', { name: 'Clickable Tab' }); + fireEvent.click(tab); + + expect(handleClick).toHaveBeenCalledTimes(1); + }); + + it('renders with value prop', () => { + render(); + + const tab = screen.getByRole('tab', { name: 'Tab with Value' }); + expect(tab).toBeInTheDocument(); + }); +}); diff --git a/frontend/ui/Tab/Tab.story.tsx b/frontend/ui/Tab/Tab.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/Tab/Tab.tsx b/frontend/ui/Tab/Tab.tsx new file mode 100644 index 000000000..3b0623223 --- /dev/null +++ b/frontend/ui/Tab/Tab.tsx @@ -0,0 +1,9 @@ +import { Tab as MUITab, TabProps as MUITabProps } from '@mui/material'; + +type TabProps = MUITabProps; + +const Tab = (tabProps: TabProps) => { + return ; +}; + +export default Tab; diff --git a/frontend/ui/Tab/index.ts b/frontend/ui/Tab/index.ts new file mode 100644 index 000000000..e13b82051 --- /dev/null +++ b/frontend/ui/Tab/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './Tab'; diff --git a/frontend/ui/Tabs/Tabs.spec.tsx b/frontend/ui/Tabs/Tabs.spec.tsx new file mode 100644 index 000000000..e2baafdef --- /dev/null +++ b/frontend/ui/Tabs/Tabs.spec.tsx @@ -0,0 +1,80 @@ +import { render, screen, fireEvent } from '@testing-library/react'; +import { describe, it, expect, vi } from 'vitest'; +import { Tab } from '@mui/material'; +import Tabs from './index'; + +describe('Tabs', () => { + it('renders correctly', () => { + render( + + + + + + ); + + const tablist = screen.getByRole('tablist'); + expect(tablist).toBeInTheDocument(); + + const tabs = screen.getAllByRole('tab'); + expect(tabs).toHaveLength(3); + expect(screen.getByText('Tab 1')).toBeInTheDocument(); + expect(screen.getByText('Tab 2')).toBeInTheDocument(); + expect(screen.getByText('Tab 3')).toBeInTheDocument(); + }); + + it('handles tab changes', () => { + const handleChange = vi.fn(); + + render( + + + + + ); + + const secondTab = screen.getByRole('tab', { name: 'Second' }); + fireEvent.click(secondTab); + + expect(handleChange).toHaveBeenCalledTimes(1); + }); + + it('shows active tab', () => { + render( + + + + + + ); + + const activeTab = screen.getByRole('tab', { name: 'Tab 2' }); + expect(activeTab).toHaveAttribute('aria-selected', 'true'); + + const inactiveTabs = screen + .getAllByRole('tab') + .filter((tab) => tab.getAttribute('aria-selected') === 'false'); + expect(inactiveTabs).toHaveLength(2); + }); + + it('renders with different orientations', () => { + const { rerender } = render( + + + + + ); + + const tablist = screen.getByRole('tablist'); + expect(tablist).toBeInTheDocument(); + + rerender( + + + + + ); + + expect(screen.getByRole('tablist')).toHaveAttribute('aria-orientation', 'vertical'); + }); +}); diff --git a/frontend/ui/Tabs/Tabs.story.tsx b/frontend/ui/Tabs/Tabs.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/Tabs/Tabs.tsx b/frontend/ui/Tabs/Tabs.tsx new file mode 100644 index 000000000..6698e0b3d --- /dev/null +++ b/frontend/ui/Tabs/Tabs.tsx @@ -0,0 +1,9 @@ +import { Tabs as MUITabs, TabsProps as MUITabsProps } from '@mui/material'; + +type TabsProps = MUITabsProps; + +const Tabs = (tabsProps: TabsProps) => { + return ; +}; + +export default Tabs; diff --git a/frontend/ui/Tabs/index.ts b/frontend/ui/Tabs/index.ts new file mode 100644 index 000000000..2e64b9d50 --- /dev/null +++ b/frontend/ui/Tabs/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './Tabs'; diff --git a/frontend/ui/TextField/TextField.spec.tsx b/frontend/ui/TextField/TextField.spec.tsx index f96458904..dc79a2b4e 100644 --- a/frontend/ui/TextField/TextField.spec.tsx +++ b/frontend/ui/TextField/TextField.spec.tsx @@ -1,6 +1,6 @@ import { render, screen } from '@testing-library/react'; import { describe, it, expect } from 'vitest'; -import TextField from './TextField'; +import TextField from './index'; describe('TextField', () => { it('renders correctly', () => { diff --git a/frontend/ui/Tooltip/Tooltip.spec.tsx b/frontend/ui/Tooltip/Tooltip.spec.tsx index b0cdd1e15..17087ced6 100644 --- a/frontend/ui/Tooltip/Tooltip.spec.tsx +++ b/frontend/ui/Tooltip/Tooltip.spec.tsx @@ -1,6 +1,6 @@ import { render, screen, fireEvent, waitFor } from '@testing-library/react'; import { describe, it, expect } from 'vitest'; -import Tooltip from './Tooltip'; +import Tooltip from './index'; describe('Tooltip', () => { it('renders correctly', () => { diff --git a/frontend/ui/Typography/Typography.spec.tsx b/frontend/ui/Typography/Typography.spec.tsx index b0b344082..b2ae29a9f 100644 --- a/frontend/ui/Typography/Typography.spec.tsx +++ b/frontend/ui/Typography/Typography.spec.tsx @@ -1,6 +1,6 @@ import { render, screen } from '@testing-library/react'; import { describe, it, expect } from 'vitest'; -import Typography from './Typography'; +import Typography from './index'; describe('Typography', () => { it('renders correctly', () => { From 48d0bfd610d47c20de32103feeeb7d97caeea2a2 Mon Sep 17 00:00:00 2001 From: ofava Date: Mon, 10 Nov 2025 13:10:03 +0100 Subject: [PATCH 29/93] Add more MUI wrappers --- frontend/ui/AvatarGroup/AvatarGroup.spec.tsx | 91 +++++++++++++++ frontend/ui/AvatarGroup/AvatarGroup.story.tsx | 0 frontend/ui/AvatarGroup/AvatarGroup.tsx | 12 ++ frontend/ui/AvatarGroup/index.ts | 2 + .../ui/DialogActions/DialogActions.spec.tsx | 82 ++++++++++++++ .../ui/DialogActions/DialogActions.story.tsx | 0 frontend/ui/DialogActions/DialogActions.tsx | 12 ++ frontend/ui/DialogActions/index.ts | 2 + .../ui/DialogContent/DialogContent.spec.tsx | 90 +++++++++++++++ .../ui/DialogContent/DialogContent.story.tsx | 0 frontend/ui/DialogContent/DialogContent.tsx | 12 ++ frontend/ui/DialogContent/index.ts | 2 + .../DialogContentText.spec.tsx | 71 ++++++++++++ .../DialogContentText.story.tsx | 0 .../DialogContentText/DialogContentText.tsx | 12 ++ frontend/ui/DialogContentText/index.ts | 2 + frontend/ui/DialogTitle/DialogTitle.spec.tsx | 63 +++++++++++ frontend/ui/DialogTitle/DialogTitle.story.tsx | 0 frontend/ui/DialogTitle/DialogTitle.tsx | 12 ++ frontend/ui/DialogTitle/index.ts | 2 + frontend/ui/FormControl/FormControl.spec.tsx | 8 +- frontend/ui/List/List.spec.tsx | 104 +++++++++++++++++ frontend/ui/List/List.story.tsx | 0 frontend/ui/List/List.tsx | 9 ++ frontend/ui/List/index.ts | 2 + frontend/ui/ListItem/ListItem.spec.tsx | 84 ++++++++++++++ frontend/ui/ListItem/ListItem.story.tsx | 0 frontend/ui/ListItem/ListItem.tsx | 9 ++ frontend/ui/ListItem/index.ts | 2 + .../ui/ListItemIcon/ListItemIcon.spec.tsx | 62 ++++++++++ .../ui/ListItemIcon/ListItemIcon.story.tsx | 0 frontend/ui/ListItemIcon/ListItemIcon.tsx | 12 ++ frontend/ui/ListItemIcon/index.ts | 2 + .../ui/ListItemText/ListItemText.spec.tsx | 83 ++++++++++++++ .../ui/ListItemText/ListItemText.story.tsx | 0 frontend/ui/ListItemText/ListItemText.tsx | 12 ++ frontend/ui/ListItemText/index.ts | 2 + frontend/ui/Select/Select.spec.tsx | 2 +- frontend/ui/Snackbar/Snackbar.spec.tsx | 106 ++++++++++++++++++ frontend/ui/Snackbar/Snackbar.story.tsx | 0 frontend/ui/Snackbar/Snackbar.tsx | 9 ++ frontend/ui/Snackbar/index.ts | 2 + frontend/ui/SvgIcon/SvgIcon.spec.tsx | 76 +++++++++++++ frontend/ui/SvgIcon/SvgIcon.story.tsx | 0 frontend/ui/SvgIcon/SvgIcon.tsx | 9 ++ frontend/ui/SvgIcon/index.ts | 2 + frontend/ui/SvgIconProps.tsx | 3 + frontend/ui/Tabs/Tabs.spec.tsx | 2 +- 48 files changed, 1062 insertions(+), 7 deletions(-) create mode 100644 frontend/ui/AvatarGroup/AvatarGroup.spec.tsx create mode 100644 frontend/ui/AvatarGroup/AvatarGroup.story.tsx create mode 100644 frontend/ui/AvatarGroup/AvatarGroup.tsx create mode 100644 frontend/ui/AvatarGroup/index.ts create mode 100644 frontend/ui/DialogActions/DialogActions.spec.tsx create mode 100644 frontend/ui/DialogActions/DialogActions.story.tsx create mode 100644 frontend/ui/DialogActions/DialogActions.tsx create mode 100644 frontend/ui/DialogActions/index.ts create mode 100644 frontend/ui/DialogContent/DialogContent.spec.tsx create mode 100644 frontend/ui/DialogContent/DialogContent.story.tsx create mode 100644 frontend/ui/DialogContent/DialogContent.tsx create mode 100644 frontend/ui/DialogContent/index.ts create mode 100644 frontend/ui/DialogContentText/DialogContentText.spec.tsx create mode 100644 frontend/ui/DialogContentText/DialogContentText.story.tsx create mode 100644 frontend/ui/DialogContentText/DialogContentText.tsx create mode 100644 frontend/ui/DialogContentText/index.ts create mode 100644 frontend/ui/DialogTitle/DialogTitle.spec.tsx create mode 100644 frontend/ui/DialogTitle/DialogTitle.story.tsx create mode 100644 frontend/ui/DialogTitle/DialogTitle.tsx create mode 100644 frontend/ui/DialogTitle/index.ts create mode 100644 frontend/ui/List/List.spec.tsx create mode 100644 frontend/ui/List/List.story.tsx create mode 100644 frontend/ui/List/List.tsx create mode 100644 frontend/ui/List/index.ts create mode 100644 frontend/ui/ListItem/ListItem.spec.tsx create mode 100644 frontend/ui/ListItem/ListItem.story.tsx create mode 100644 frontend/ui/ListItem/ListItem.tsx create mode 100644 frontend/ui/ListItem/index.ts create mode 100644 frontend/ui/ListItemIcon/ListItemIcon.spec.tsx create mode 100644 frontend/ui/ListItemIcon/ListItemIcon.story.tsx create mode 100644 frontend/ui/ListItemIcon/ListItemIcon.tsx create mode 100644 frontend/ui/ListItemIcon/index.ts create mode 100644 frontend/ui/ListItemText/ListItemText.spec.tsx create mode 100644 frontend/ui/ListItemText/ListItemText.story.tsx create mode 100644 frontend/ui/ListItemText/ListItemText.tsx create mode 100644 frontend/ui/ListItemText/index.ts create mode 100644 frontend/ui/Snackbar/Snackbar.spec.tsx create mode 100644 frontend/ui/Snackbar/Snackbar.story.tsx create mode 100644 frontend/ui/Snackbar/Snackbar.tsx create mode 100644 frontend/ui/Snackbar/index.ts create mode 100644 frontend/ui/SvgIcon/SvgIcon.spec.tsx create mode 100644 frontend/ui/SvgIcon/SvgIcon.story.tsx create mode 100644 frontend/ui/SvgIcon/SvgIcon.tsx create mode 100644 frontend/ui/SvgIcon/index.ts create mode 100644 frontend/ui/SvgIconProps.tsx diff --git a/frontend/ui/AvatarGroup/AvatarGroup.spec.tsx b/frontend/ui/AvatarGroup/AvatarGroup.spec.tsx new file mode 100644 index 000000000..b340c38b0 --- /dev/null +++ b/frontend/ui/AvatarGroup/AvatarGroup.spec.tsx @@ -0,0 +1,91 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import AvatarGroup from './index'; +import Avatar from '../Avatar'; + +describe('AvatarGroup', () => { + it('renders correctly', () => { + render( + + AB + CD + EF + + ); + + const avatarGroup = screen.getByTestId('avatar-group'); + expect(avatarGroup).toBeInTheDocument(); + expect(avatarGroup).toHaveClass('MuiAvatarGroup-root'); + + expect(screen.getByText('AB')).toBeInTheDocument(); + expect(screen.getByText('CD')).toBeInTheDocument(); + expect(screen.getByText('EF')).toBeInTheDocument(); + }); + + it('renders with max prop', () => { + render( + + A1 + A2 + A3 + A4 + A5 + + ); + + const avatarGroup = screen.getByTestId('limited-avatar-group'); + expect(avatarGroup).toBeInTheDocument(); + + expect(screen.getByText('A1')).toBeInTheDocument(); + expect(screen.getByText('A2')).toBeInTheDocument(); + expect(screen.getByText('+3')).toBeInTheDocument(); + }); + + it('renders with different spacing', () => { + render( + + S1 + S2 + + ); + + const avatarGroup = screen.getByTestId('small-spacing-group'); + expect(avatarGroup).toBeInTheDocument(); + }); + + it('renders with different variants', () => { + render( + + SQ + AR + + ); + + const avatarGroup = screen.getByTestId('square-avatar-group'); + expect(avatarGroup).toBeInTheDocument(); + }); + + it('renders with image avatars', () => { + render( + + + + FB + + ); + + expect(screen.getByRole('img', { name: 'User 1' })).toBeInTheDocument(); + expect(screen.getByRole('img', { name: 'User 2' })).toBeInTheDocument(); + expect(screen.getByText('FB')).toBeInTheDocument(); + }); + + it('renders with single avatar', () => { + render( + + SA + + ); + + expect(screen.getByText('SA')).toBeInTheDocument(); + }); +}); diff --git a/frontend/ui/AvatarGroup/AvatarGroup.story.tsx b/frontend/ui/AvatarGroup/AvatarGroup.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/AvatarGroup/AvatarGroup.tsx b/frontend/ui/AvatarGroup/AvatarGroup.tsx new file mode 100644 index 000000000..d99701e57 --- /dev/null +++ b/frontend/ui/AvatarGroup/AvatarGroup.tsx @@ -0,0 +1,12 @@ +import { + AvatarGroup as MUIAvatarGroup, + AvatarGroupProps as MUIAvatarGroupProps, +} from '@mui/material'; + +type AvatarGroupProps = MUIAvatarGroupProps; + +const AvatarGroup = (avatarGroupProps: AvatarGroupProps) => { + return ; +}; + +export default AvatarGroup; diff --git a/frontend/ui/AvatarGroup/index.ts b/frontend/ui/AvatarGroup/index.ts new file mode 100644 index 000000000..635331695 --- /dev/null +++ b/frontend/ui/AvatarGroup/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './AvatarGroup'; diff --git a/frontend/ui/DialogActions/DialogActions.spec.tsx b/frontend/ui/DialogActions/DialogActions.spec.tsx new file mode 100644 index 000000000..62593a4ca --- /dev/null +++ b/frontend/ui/DialogActions/DialogActions.spec.tsx @@ -0,0 +1,82 @@ +import { render, screen, fireEvent } from '@testing-library/react'; +import { describe, it, expect, vi } from 'vitest'; +import DialogActions from './index'; +import Button from '../Button'; + +describe('DialogActions', () => { + it('handles button interactions', () => { + const handleCancel = vi.fn(); + const handleSave = vi.fn(); + + render( + + + + + ); + + const cancelButton = screen.getByRole('button', { name: 'Cancel' }); + const saveButton = screen.getByRole('button', { name: 'Save' }); + + fireEvent.click(cancelButton); + expect(handleCancel).toHaveBeenCalledTimes(1); + + fireEvent.click(saveButton); + expect(handleSave).toHaveBeenCalledTimes(1); + }); + + it('applies custom sx props', () => { + render( + + + + ); + + const dialogActions = screen.getByTestId('styled-dialog-actions'); + expect(dialogActions).toBeInTheDocument(); + expect(dialogActions).toHaveClass('MuiDialogActions-root'); + }); + + it('renders within Dialog context', () => { + render( +
+
Dialog content here
+ + + + +
+ ); + + expect(screen.getByText('Dialog content here')).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Close' })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Confirm' })).toBeInTheDocument(); + }); + + it('handles empty content', () => { + render(); + + const dialogActions = screen.getByTestId('empty-dialog-actions'); + expect(dialogActions).toBeInTheDocument(); + expect(dialogActions).toHaveClass('MuiDialogActions-root'); + }); + + it('renders with multiple action types', () => { + render( + + + + + + ); + + expect(screen.getByRole('button', { name: 'Cancel' })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Delete' })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Save' })).toBeInTheDocument(); + }); +}); diff --git a/frontend/ui/DialogActions/DialogActions.story.tsx b/frontend/ui/DialogActions/DialogActions.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/DialogActions/DialogActions.tsx b/frontend/ui/DialogActions/DialogActions.tsx new file mode 100644 index 000000000..f41b7ed50 --- /dev/null +++ b/frontend/ui/DialogActions/DialogActions.tsx @@ -0,0 +1,12 @@ +import { + DialogActions as MUIDialogActions, + DialogActionsProps as MUIDialogActionsProps, +} from '@mui/material'; + +type DialogActionsProps = MUIDialogActionsProps; + +const DialogActions = ({ ...dialogActionsProps }: DialogActionsProps) => { + return ; +}; + +export default DialogActions; diff --git a/frontend/ui/DialogActions/index.ts b/frontend/ui/DialogActions/index.ts new file mode 100644 index 000000000..f25df7fdd --- /dev/null +++ b/frontend/ui/DialogActions/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './DialogActions'; diff --git a/frontend/ui/DialogContent/DialogContent.spec.tsx b/frontend/ui/DialogContent/DialogContent.spec.tsx new file mode 100644 index 000000000..bbfd64859 --- /dev/null +++ b/frontend/ui/DialogContent/DialogContent.spec.tsx @@ -0,0 +1,90 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import DialogContent from './index'; + +describe('DialogContent', () => { + it('renders correctly', () => { + render( + +
This is dialog content
+
+ ); + + const dialogContent = screen.getByText('This is dialog content'); + expect(dialogContent).toBeInTheDocument(); + + const container = dialogContent.closest('.MuiDialogContent-root'); + expect(container).toBeInTheDocument(); + }); + + it('renders with scrollable content', () => { + render( + +
Line 1
+
Line 2
+
Line 3
+
Long content that might need scrolling...
+
+ ); + + const dialogContent = screen.getByTestId('scrollable-content'); + expect(dialogContent).toBeInTheDocument(); + expect(dialogContent).toHaveClass('MuiDialogContent-root'); + + expect(screen.getByText('Line 1')).toBeInTheDocument(); + expect(screen.getByText('Long content that might need scrolling...')).toBeInTheDocument(); + }); + + it('applies custom sx props', () => { + render( + +

Styled content

+
+ ); + + const dialogContent = screen.getByTestId('styled-dialog-content'); + expect(dialogContent).toBeInTheDocument(); + expect(dialogContent).toHaveClass('MuiDialogContent-root'); + }); + + it('renders with dividers', () => { + render( + +

Content with dividers

+
+ ); + + const dialogContent = screen.getByTestId('divided-content'); + expect(dialogContent).toBeInTheDocument(); + expect(dialogContent).toHaveClass('MuiDialogContent-dividers'); + }); + + it('renders within Dialog context', () => { + render( +
+
Dialog Title
+ +

Main dialog content goes here

+

Additional content paragraph

+
+
Dialog Actions
+
+ ); + + expect(screen.getByText('Dialog Title')).toBeInTheDocument(); + expect(screen.getByText('Main dialog content goes here')).toBeInTheDocument(); + expect(screen.getByText('Additional content paragraph')).toBeInTheDocument(); + expect(screen.getByText('Dialog Actions')).toBeInTheDocument(); + }); + + it('handles empty content', () => { + render(); + + const dialogContent = screen.getByTestId('empty-dialog-content'); + expect(dialogContent).toBeInTheDocument(); + expect(dialogContent).toHaveClass('MuiDialogContent-root'); + }); +}); diff --git a/frontend/ui/DialogContent/DialogContent.story.tsx b/frontend/ui/DialogContent/DialogContent.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/DialogContent/DialogContent.tsx b/frontend/ui/DialogContent/DialogContent.tsx new file mode 100644 index 000000000..ba22b79b1 --- /dev/null +++ b/frontend/ui/DialogContent/DialogContent.tsx @@ -0,0 +1,12 @@ +import { + DialogContent as MUIDialogContent, + DialogContentProps as MUIDialogContentProps, +} from '@mui/material'; + +type DialogContentProps = MUIDialogContentProps; + +const DialogContent = ({ ...dialogContentProps }: DialogContentProps) => { + return ; +}; + +export default DialogContent; diff --git a/frontend/ui/DialogContent/index.ts b/frontend/ui/DialogContent/index.ts new file mode 100644 index 000000000..eab5b19dc --- /dev/null +++ b/frontend/ui/DialogContent/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './DialogContent'; diff --git a/frontend/ui/DialogContentText/DialogContentText.spec.tsx b/frontend/ui/DialogContentText/DialogContentText.spec.tsx new file mode 100644 index 000000000..438f856bc --- /dev/null +++ b/frontend/ui/DialogContentText/DialogContentText.spec.tsx @@ -0,0 +1,71 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import DialogContentText from './index'; + +describe('DialogContentText', () => { + it('renders correctly', () => { + render(This is the dialog content text); + + const dialogContentText = screen.getByText('This is the dialog content text'); + expect(dialogContentText).toBeInTheDocument(); + expect(dialogContentText).toHaveClass('MuiDialogContentText-root'); + }); + + it('renders with different typography variants', () => { + render( + + Small body text + + ); + + const dialogContentText = screen.getByTestId('body2-text'); + expect(dialogContentText).toBeInTheDocument(); + expect(dialogContentText).toHaveClass('MuiDialogContentText-root'); + }); + + it('handles long text content', () => { + const longText = + 'This is a very long dialog content text that might wrap to multiple lines and should be properly displayed within the dialog content area. It can contain detailed information, explanations, or instructions for the user.'; + + render({longText}); + + const dialogContentText = screen.getByText(longText); + expect(dialogContentText).toBeInTheDocument(); + }); + + it('renders with different colors', () => { + render( + + Error message text + + ); + + const dialogContentText = screen.getByTestId('error-text'); + expect(dialogContentText).toBeInTheDocument(); + expect(dialogContentText).toHaveClass('MuiDialogContentText-root'); + }); + + it('renders as different HTML elements', () => { + render( + + Div content text + + ); + + const dialogContentText = screen.getByTestId('div-content-text'); + expect(dialogContentText.tagName).toBe('DIV'); + expect(dialogContentText).toHaveTextContent('Div content text'); + }); + + it('renders with text alignment', () => { + render( + + Centered dialog text + + ); + + const dialogContentText = screen.getByTestId('centered-text'); + expect(dialogContentText).toBeInTheDocument(); + expect(dialogContentText).toHaveTextContent('Centered dialog text'); + }); +}); diff --git a/frontend/ui/DialogContentText/DialogContentText.story.tsx b/frontend/ui/DialogContentText/DialogContentText.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/DialogContentText/DialogContentText.tsx b/frontend/ui/DialogContentText/DialogContentText.tsx new file mode 100644 index 000000000..f3e7ad297 --- /dev/null +++ b/frontend/ui/DialogContentText/DialogContentText.tsx @@ -0,0 +1,12 @@ +import { + DialogContentText as MUIDialogContentText, + DialogContentTextProps as MUIDialogContentTextProps, +} from '@mui/material'; + +type DialogContentTextProps = MUIDialogContentTextProps; + +const DialogContentText = (dialogContentTextProps: DialogContentTextProps) => { + return ; +}; + +export default DialogContentText; diff --git a/frontend/ui/DialogContentText/index.ts b/frontend/ui/DialogContentText/index.ts new file mode 100644 index 000000000..5d2282625 --- /dev/null +++ b/frontend/ui/DialogContentText/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './DialogContentText'; diff --git a/frontend/ui/DialogTitle/DialogTitle.spec.tsx b/frontend/ui/DialogTitle/DialogTitle.spec.tsx new file mode 100644 index 000000000..e5eab5ef2 --- /dev/null +++ b/frontend/ui/DialogTitle/DialogTitle.spec.tsx @@ -0,0 +1,63 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import DialogTitle from './index'; + +describe('DialogTitle', () => { + it('renders correctly', () => { + render(Dialog Title Text); + + const dialogTitle = screen.getByText('Dialog Title Text'); + expect(dialogTitle).toBeInTheDocument(); + expect(dialogTitle).toHaveClass('MuiDialogTitle-root'); + }); + + it('renders with different typography variants', () => { + render(Important Dialog); + + const dialogTitle = screen.getByTestId('dialog-title'); + expect(dialogTitle).toBeInTheDocument(); + expect(dialogTitle).toHaveClass('MuiDialogTitle-root'); + }); + + it('renders within Dialog context', () => { + render( +
+ Confirmation +
Are you sure you want to proceed?
+
+ ); + + expect(screen.getByText('Confirmation')).toBeInTheDocument(); + expect(screen.getByText('Are you sure you want to proceed?')).toBeInTheDocument(); + }); + + it('handles empty content', () => { + render(); + + const dialogTitle = screen.getByTestId('empty-dialog-title'); + expect(dialogTitle).toBeInTheDocument(); + expect(dialogTitle).toHaveClass('MuiDialogTitle-root'); + }); + + it('renders with long text content', () => { + const longTitle = + 'This is a very long dialog title that might wrap to multiple lines in the user interface when displayed'; + + render({longTitle}); + + const dialogTitle = screen.getByText(longTitle); + expect(dialogTitle).toBeInTheDocument(); + }); + + it('renders as different HTML elements', () => { + render( + + H2 Dialog Title + + ); + + const dialogTitle = screen.getByTestId('h2-dialog-title'); + expect(dialogTitle.tagName).toBe('H2'); + expect(dialogTitle).toHaveTextContent('H2 Dialog Title'); + }); +}); diff --git a/frontend/ui/DialogTitle/DialogTitle.story.tsx b/frontend/ui/DialogTitle/DialogTitle.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/DialogTitle/DialogTitle.tsx b/frontend/ui/DialogTitle/DialogTitle.tsx new file mode 100644 index 000000000..dcaa1a515 --- /dev/null +++ b/frontend/ui/DialogTitle/DialogTitle.tsx @@ -0,0 +1,12 @@ +import { + DialogTitle as MUIDialogTitle, + DialogTitleProps as MUIDialogTitleProps, +} from '@mui/material'; + +type DialogTitleProps = MUIDialogTitleProps; + +const DialogTitle = ({ ...dialogTitleProps }: DialogTitleProps) => { + return ; +}; + +export default DialogTitle; diff --git a/frontend/ui/DialogTitle/index.ts b/frontend/ui/DialogTitle/index.ts new file mode 100644 index 000000000..e99dcae8d --- /dev/null +++ b/frontend/ui/DialogTitle/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './DialogTitle'; diff --git a/frontend/ui/FormControl/FormControl.spec.tsx b/frontend/ui/FormControl/FormControl.spec.tsx index 3ce395700..24274f9b5 100644 --- a/frontend/ui/FormControl/FormControl.spec.tsx +++ b/frontend/ui/FormControl/FormControl.spec.tsx @@ -1,13 +1,13 @@ import { render, screen } from '@testing-library/react'; import { describe, it, expect } from 'vitest'; -import { FormLabel, TextField, FormHelperText } from '@mui/material'; +import TextField from '@ui/TextField'; import FormControl from './index'; describe('FormControl', () => { it('renders correctly', () => { render( - Test Label + Test Label ); @@ -19,14 +19,12 @@ describe('FormControl', () => { it('renders with children components', () => { render( - Name + Name - This field is required ); expect(screen.getByText('Name')).toBeInTheDocument(); expect(screen.getByPlaceholderText('Enter your name')).toBeInTheDocument(); - expect(screen.getByText('This field is required')).toBeInTheDocument(); }); }); diff --git a/frontend/ui/List/List.spec.tsx b/frontend/ui/List/List.spec.tsx new file mode 100644 index 000000000..341718d93 --- /dev/null +++ b/frontend/ui/List/List.spec.tsx @@ -0,0 +1,104 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import ListItem from '@ui/ListItem'; +import ListItemText from '@ui/ListItemText'; +import List from './index'; + +describe('List', () => { + it('renders correctly', () => { + render( + + + + + + + + + ); + + const list = screen.getByRole('list'); + expect(list).toBeInTheDocument(); + expect(list).toHaveClass('MuiList-root'); + + expect(screen.getByText('Item 1')).toBeInTheDocument(); + expect(screen.getByText('Item 2')).toBeInTheDocument(); + }); + + it('renders with dense spacing', () => { + render( + + + + + + + + + ); + + const list = screen.getByTestId('dense-list'); + expect(list).toBeInTheDocument(); + expect(list).toHaveClass('MuiList-dense'); + }); + + it('renders with subheader', () => { + render( + List Subheader
}> + + + + + ); + + expect(screen.getByText('List Subheader')).toBeInTheDocument(); + expect(screen.getByText('Item under subheader')).toBeInTheDocument(); + }); + + it('renders with multiple list items', () => { + const items = ['Apple', 'Banana', 'Cherry', 'Date', 'Elderberry']; + + render( + + {items.map((item) => ( + + + + ))} + + ); + + items.forEach((item) => { + expect(screen.getByText(item)).toBeInTheDocument(); + }); + + const listItems = screen.getAllByRole('listitem'); + expect(listItems).toHaveLength(5); + }); + + it('renders with nested lists', () => { + render( + + + + + + + + + + + + + + + + + ); + + expect(screen.getByText('Parent item 1')).toBeInTheDocument(); + expect(screen.getByText('Nested item 1')).toBeInTheDocument(); + expect(screen.getByText('Nested item 2')).toBeInTheDocument(); + expect(screen.getByText('Parent item 2')).toBeInTheDocument(); + }); +}); diff --git a/frontend/ui/List/List.story.tsx b/frontend/ui/List/List.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/List/List.tsx b/frontend/ui/List/List.tsx new file mode 100644 index 000000000..2cc44d8ce --- /dev/null +++ b/frontend/ui/List/List.tsx @@ -0,0 +1,9 @@ +import { List as MUIList, ListProps as MUIListProps } from '@mui/material'; + +type ListProps = MUIListProps; + +const List = (listProps: ListProps) => { + return ; +}; + +export default List; diff --git a/frontend/ui/List/index.ts b/frontend/ui/List/index.ts new file mode 100644 index 000000000..2f2e5578d --- /dev/null +++ b/frontend/ui/List/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './List'; diff --git a/frontend/ui/ListItem/ListItem.spec.tsx b/frontend/ui/ListItem/ListItem.spec.tsx new file mode 100644 index 000000000..9d745d5c4 --- /dev/null +++ b/frontend/ui/ListItem/ListItem.spec.tsx @@ -0,0 +1,84 @@ +import { render, screen, fireEvent } from '@testing-library/react'; +import { describe, it, expect, vi } from 'vitest'; +import ListItemText from '@ui/ListItemText'; +import ListItemIcon from '@ui/ListItemIcon'; +import ListItem from './index'; + +describe('ListItem', () => { + it('renders correctly', () => { + render( + + + + ); + + const listItem = screen.getByRole('listitem'); + expect(listItem).toBeInTheDocument(); + expect(listItem).toHaveClass('MuiListItem-root'); + expect(screen.getByText('Test Item')).toBeInTheDocument(); + }); + + it('handles click events', () => { + const handleClick = vi.fn(); + + render( + + + + ); + + const listItem = screen.getByRole('listitem'); + fireEvent.click(listItem); + + expect(handleClick).toHaveBeenCalledTimes(1); + }); + + it('renders with icon', () => { + const TestIcon = () => 📋; + + render( + + + + + + + ); + + expect(screen.getByText('📋')).toBeInTheDocument(); + expect(screen.getByText('Item with Icon')).toBeInTheDocument(); + }); + + it('renders with dense spacing', () => { + render( + + + + ); + + const listItem = screen.getByTestId('dense-item'); + expect(listItem).toHaveClass('MuiListItem-dense'); + }); + + it('renders with divider', () => { + render( + + + + ); + + const listItem = screen.getByTestId('divider-item'); + expect(listItem).toHaveClass('MuiListItem-divider'); + }); + + it('renders with secondary action', () => { + render( + Delete}> + + + ); + + expect(screen.getByText('Item with action')).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Delete' })).toBeInTheDocument(); + }); +}); diff --git a/frontend/ui/ListItem/ListItem.story.tsx b/frontend/ui/ListItem/ListItem.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/ListItem/ListItem.tsx b/frontend/ui/ListItem/ListItem.tsx new file mode 100644 index 000000000..d61abdc22 --- /dev/null +++ b/frontend/ui/ListItem/ListItem.tsx @@ -0,0 +1,9 @@ +import { ListItem as MUIListItem, ListItemProps as MUIListItemProps } from '@mui/material'; + +type ListItemProps = MUIListItemProps; + +const ListItem = (listItemProps: ListItemProps) => { + return ; +}; + +export default ListItem; diff --git a/frontend/ui/ListItem/index.ts b/frontend/ui/ListItem/index.ts new file mode 100644 index 000000000..7f7bcd170 --- /dev/null +++ b/frontend/ui/ListItem/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './ListItem'; diff --git a/frontend/ui/ListItemIcon/ListItemIcon.spec.tsx b/frontend/ui/ListItemIcon/ListItemIcon.spec.tsx new file mode 100644 index 000000000..9b46d6809 --- /dev/null +++ b/frontend/ui/ListItemIcon/ListItemIcon.spec.tsx @@ -0,0 +1,62 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import ListItemIcon from './index'; + +describe('ListItemIcon', () => { + it('renders correctly', () => { + render( + + 📋 + + ); + + const listItemIcon = screen.getByText('📋'); + expect(listItemIcon).toBeInTheDocument(); + + const container = listItemIcon.closest('.MuiListItemIcon-root'); + expect(container).toBeInTheDocument(); + }); + + it('renders with different icon types', () => { + const { rerender } = render( + + ⚙️ + + ); + + expect(screen.getByText('⚙️')).toBeInTheDocument(); + + rerender( + +
Custom Icon
+
+ ); + + expect(screen.getByTestId('custom-icon')).toBeInTheDocument(); + }); + + it('renders within ListItem context', () => { + render( +
+ + 📄 + +
Document Item
+
+ ); + + expect(screen.getByText('📄')).toBeInTheDocument(); + expect(screen.getByText('Document Item')).toBeInTheDocument(); + }); + + it('maintains proper alignment', () => { + render( + + 🏠 + + ); + + const listItemIcon = screen.getByTestId('aligned-icon'); + expect(listItemIcon).toHaveClass('MuiListItemIcon-root'); + }); +}); diff --git a/frontend/ui/ListItemIcon/ListItemIcon.story.tsx b/frontend/ui/ListItemIcon/ListItemIcon.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/ListItemIcon/ListItemIcon.tsx b/frontend/ui/ListItemIcon/ListItemIcon.tsx new file mode 100644 index 000000000..9ae7d3942 --- /dev/null +++ b/frontend/ui/ListItemIcon/ListItemIcon.tsx @@ -0,0 +1,12 @@ +import { + ListItemIcon as MUIListItemIcon, + ListItemIconProps as MUIListItemIconProps, +} from '@mui/material'; + +type ListItemIconProps = MUIListItemIconProps; + +const ListItemIcon = (listItemIconProps: ListItemIconProps) => { + return ; +}; + +export default ListItemIcon; diff --git a/frontend/ui/ListItemIcon/index.ts b/frontend/ui/ListItemIcon/index.ts new file mode 100644 index 000000000..c596e1075 --- /dev/null +++ b/frontend/ui/ListItemIcon/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './ListItemIcon'; diff --git a/frontend/ui/ListItemText/ListItemText.spec.tsx b/frontend/ui/ListItemText/ListItemText.spec.tsx new file mode 100644 index 000000000..cb2862314 --- /dev/null +++ b/frontend/ui/ListItemText/ListItemText.spec.tsx @@ -0,0 +1,83 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import ListItemText from './index'; + +describe('ListItemText', () => { + it('renders correctly with primary text', () => { + render(); + + const primaryText = screen.getByText('Primary text'); + expect(primaryText).toBeInTheDocument(); + + const container = primaryText.closest('.MuiListItemText-root'); + expect(container).toBeInTheDocument(); + }); + + it('renders with primary and secondary text', () => { + render(); + + expect(screen.getByText('Main title')).toBeInTheDocument(); + expect(screen.getByText('Subtitle description')).toBeInTheDocument(); + }); + + it('renders with custom components', () => { + render( + Custom Primary} + secondary={Custom Secondary} + /> + ); + + expect(screen.getByTestId('custom-primary')).toBeInTheDocument(); + expect(screen.getByTestId('custom-secondary')).toBeInTheDocument(); + }); + + it('renders with inset prop', () => { + render(); + + const listItemText = screen.getByTestId('inset-text'); + expect(listItemText).toHaveClass('MuiListItemText-inset'); + }); + + it('renders within ListItem context', () => { + render( +
+ +
+ ); + + expect(screen.getByText('List item title')).toBeInTheDocument(); + expect(screen.getByText('List item description')).toBeInTheDocument(); + }); + + it('handles only secondary text', () => { + render(); + + expect(screen.getByText('Only secondary text')).toBeInTheDocument(); + }); + + it('renders with different typography variants', () => { + render( + + ); + + expect(screen.getByText('Primary text')).toBeInTheDocument(); + expect(screen.getByText('Secondary text')).toBeInTheDocument(); + }); + + it('renders with long text content', () => { + const longPrimary = 'This is a very long primary text that might wrap to multiple lines'; + const longSecondary = + 'This is a very long secondary text that provides additional details and context'; + + render(); + + expect(screen.getByText(longPrimary)).toBeInTheDocument(); + expect(screen.getByText(longSecondary)).toBeInTheDocument(); + }); +}); diff --git a/frontend/ui/ListItemText/ListItemText.story.tsx b/frontend/ui/ListItemText/ListItemText.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/ListItemText/ListItemText.tsx b/frontend/ui/ListItemText/ListItemText.tsx new file mode 100644 index 000000000..8814fe242 --- /dev/null +++ b/frontend/ui/ListItemText/ListItemText.tsx @@ -0,0 +1,12 @@ +import { + ListItemText as MUIListItemText, + ListItemTextProps as MUIListItemTextProps, +} from '@mui/material'; + +type ListItemTextProps = MUIListItemTextProps; + +const ListItemText = (listItemTextProps: ListItemTextProps) => { + return ; +}; + +export default ListItemText; diff --git a/frontend/ui/ListItemText/index.ts b/frontend/ui/ListItemText/index.ts new file mode 100644 index 000000000..5f26de206 --- /dev/null +++ b/frontend/ui/ListItemText/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './ListItemText'; diff --git a/frontend/ui/Select/Select.spec.tsx b/frontend/ui/Select/Select.spec.tsx index 302a00800..62f144b49 100644 --- a/frontend/ui/Select/Select.spec.tsx +++ b/frontend/ui/Select/Select.spec.tsx @@ -1,6 +1,6 @@ import { render, screen, fireEvent } from '@testing-library/react'; import { describe, it, expect, vi } from 'vitest'; -import { MenuItem } from '@mui/material'; +import MenuItem from '@ui/MenuItem'; import Select from './index'; describe('Select', () => { diff --git a/frontend/ui/Snackbar/Snackbar.spec.tsx b/frontend/ui/Snackbar/Snackbar.spec.tsx new file mode 100644 index 000000000..08ba31ea1 --- /dev/null +++ b/frontend/ui/Snackbar/Snackbar.spec.tsx @@ -0,0 +1,106 @@ +import { render, screen, fireEvent, waitFor } from '@testing-library/react'; +import { describe, it, expect, vi } from 'vitest'; +import Alert from '@ui/Alert'; +import Snackbar from './index'; + +describe('Snackbar', () => { + it('renders correctly when open', () => { + render(); + + expect(screen.getByText('Test notification')).toBeInTheDocument(); + }); + + it('does not render when closed', () => { + render(); + + expect(screen.queryByText('Hidden notification')).not.toBeInTheDocument(); + }); + + it('handles close events', async () => { + const handleClose = vi.fn(); + + render( + + ); + + // Wait for auto close + await waitFor( + () => { + expect(handleClose).toHaveBeenCalled(); + }, + { timeout: 1500 } + ); + }); + + it('renders with different anchors', () => { + const { rerender } = render( + + ); + + const snackbar = screen.getByTestId('snackbar'); + expect(snackbar).toBeInTheDocument(); + + rerender( + + ); + + expect(screen.getByText('Bottom right')).toBeInTheDocument(); + }); + + it('renders with Alert component', () => { + render( + + Success message + + ); + + expect(screen.getByRole('alert')).toBeInTheDocument(); + expect(screen.getByText('Success message')).toBeInTheDocument(); + }); + + it('handles resume and pause on hover', () => { + const handleClose = vi.fn(); + + render( + + ); + + const snackbar = screen.getByTestId('hoverable-snackbar'); + + fireEvent.mouseEnter(snackbar); + fireEvent.mouseLeave(snackbar); + + expect(snackbar).toBeInTheDocument(); + }); + + it('handles key prop for multiple snackbars', () => { + const { rerender } = render(); + + expect(screen.getByText('First notification')).toBeInTheDocument(); + + rerender(); + + expect(screen.getByText('Second notification')).toBeInTheDocument(); + }); +}); diff --git a/frontend/ui/Snackbar/Snackbar.story.tsx b/frontend/ui/Snackbar/Snackbar.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/Snackbar/Snackbar.tsx b/frontend/ui/Snackbar/Snackbar.tsx new file mode 100644 index 000000000..4b25dbcc1 --- /dev/null +++ b/frontend/ui/Snackbar/Snackbar.tsx @@ -0,0 +1,9 @@ +import { Snackbar as MUISnackbar, SnackbarProps as MUISnackbarProps } from '@mui/material'; + +type SnackbarProps = MUISnackbarProps; + +const Snackbar = (snackbarProps: SnackbarProps) => { + return ; +}; + +export default Snackbar; diff --git a/frontend/ui/Snackbar/index.ts b/frontend/ui/Snackbar/index.ts new file mode 100644 index 000000000..150bb5244 --- /dev/null +++ b/frontend/ui/Snackbar/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './Snackbar'; diff --git a/frontend/ui/SvgIcon/SvgIcon.spec.tsx b/frontend/ui/SvgIcon/SvgIcon.spec.tsx new file mode 100644 index 000000000..7240db6c4 --- /dev/null +++ b/frontend/ui/SvgIcon/SvgIcon.spec.tsx @@ -0,0 +1,76 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import SvgIcon from './index'; + +describe('SvgIcon', () => { + it('renders correctly', () => { + render( + + + + ); + + const svgIcon = screen.getByTestId('svg-icon'); + expect(svgIcon).toBeInTheDocument(); + expect(svgIcon).toHaveClass('MuiSvgIcon-root'); + expect(svgIcon.tagName).toBe('svg'); + }); + + it('renders with different colors', () => { + const { rerender } = render( + + + + ); + + const svgIcon = screen.getByTestId('colored-icon'); + expect(svgIcon).toHaveClass('MuiSvgIcon-colorPrimary'); + + rerender( + + + + ); + expect(svgIcon).toHaveClass('MuiSvgIcon-colorSecondary'); + }); + + it('renders with different font sizes', () => { + const { rerender } = render( + + + + ); + + const svgIcon = screen.getByTestId('sized-icon'); + expect(svgIcon).toHaveClass('MuiSvgIcon-fontSizeSmall'); + + rerender( + + + + ); + expect(svgIcon).toHaveClass('MuiSvgIcon-fontSizeLarge'); + }); + + it('renders with viewBox prop', () => { + render( + + + + ); + + const svgIcon = screen.getByTestId('custom-viewbox'); + expect(svgIcon).toHaveAttribute('viewBox', '0 0 32 32'); + }); + + it('renders with custom component', () => { + render( + + + + ); + + const svgIcon = screen.getByTestId('span-icon'); + expect(svgIcon.tagName).toBe('SPAN'); + }); +}); diff --git a/frontend/ui/SvgIcon/SvgIcon.story.tsx b/frontend/ui/SvgIcon/SvgIcon.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/SvgIcon/SvgIcon.tsx b/frontend/ui/SvgIcon/SvgIcon.tsx new file mode 100644 index 000000000..3cdd3f326 --- /dev/null +++ b/frontend/ui/SvgIcon/SvgIcon.tsx @@ -0,0 +1,9 @@ +import { SvgIcon as MUISvgIcon, SvgIconProps as MUISvgIconProps } from '@mui/material'; + +type SvgIconProps = MUISvgIconProps; + +const SvgIcon = (svgIconProps: SvgIconProps) => { + return ; +}; + +export default SvgIcon; diff --git a/frontend/ui/SvgIcon/index.ts b/frontend/ui/SvgIcon/index.ts new file mode 100644 index 000000000..48272106c --- /dev/null +++ b/frontend/ui/SvgIcon/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './SvgIcon'; diff --git a/frontend/ui/SvgIconProps.tsx b/frontend/ui/SvgIconProps.tsx new file mode 100644 index 000000000..90a7462b3 --- /dev/null +++ b/frontend/ui/SvgIconProps.tsx @@ -0,0 +1,3 @@ +import { SvgIconProps as MUISvgIconProps } from '@mui/material'; + +export type SvgIconProps = MUISvgIconProps; diff --git a/frontend/ui/Tabs/Tabs.spec.tsx b/frontend/ui/Tabs/Tabs.spec.tsx index e2baafdef..fd7c42556 100644 --- a/frontend/ui/Tabs/Tabs.spec.tsx +++ b/frontend/ui/Tabs/Tabs.spec.tsx @@ -1,6 +1,6 @@ import { render, screen, fireEvent } from '@testing-library/react'; import { describe, it, expect, vi } from 'vitest'; -import { Tab } from '@mui/material'; +import Tab from '@ui/Tab'; import Tabs from './index'; describe('Tabs', () => { From 791d6a2cca4094640f6ccce1359822d02322d203 Mon Sep 17 00:00:00 2001 From: ofava Date: Mon, 10 Nov 2025 16:28:39 +0100 Subject: [PATCH 30/93] Add last MUI wrappers --- frontend/ui/Badge/Badge.spec.tsx | 130 ++++++++++++++++++ .../Badge.story.tsx} | 0 frontend/ui/Badge/Badge.tsx | 9 ++ frontend/ui/Badge/index.ts | 2 + frontend/ui/ButtonGroup/ButtonGroup.spec.tsx | 114 +++++++++++++++ frontend/ui/ButtonGroup/ButtonGroup.story.tsx | 0 frontend/ui/ButtonGroup/ButtonGroup.tsx | 12 ++ frontend/ui/ButtonGroup/index.ts | 2 + frontend/ui/Chip/Chip.spec.tsx | 77 +++++++++++ frontend/ui/Chip/Chip.story.tsx | 0 frontend/ui/Chip/Chip.tsx | 9 ++ frontend/ui/Chip/index.ts | 2 + .../ClickAwayListener.spec.tsx | 18 +++ .../ClickAwayListener.story.tsx | 0 .../ClickAwayListener/ClickAwayListener.tsx | 12 ++ frontend/ui/ClickAwayListener/index.ts | 2 + frontend/ui/Fade/Fade.spec.tsx | 97 +++++++++++++ frontend/ui/Fade/Fade.story.tsx | 0 frontend/ui/Fade/Fade.tsx | 9 ++ frontend/ui/Fade/index.ts | 2 + frontend/ui/Grid/Grid.spec.tsx | 115 ++++++++++++++++ frontend/ui/Grid/Grid.story.tsx | 0 frontend/ui/Grid/Grid.tsx | 9 ++ frontend/ui/Grid/index.ts | 2 + frontend/ui/GridSize.tsx | 3 + frontend/ui/Grow/Grow.spec.tsx | 85 ++++++++++++ frontend/ui/Grow/Grow.story.tsx | 0 frontend/ui/Grow/Grow.tsx | 9 ++ frontend/ui/Grow/index.ts | 2 + frontend/ui/Menu/Menu.spec.tsx | 94 +++++++++++++ frontend/ui/Menu/Menu.story.tsx | 0 frontend/ui/Menu/Menu.tsx | 9 ++ frontend/ui/Menu/index.ts | 2 + frontend/ui/Popper/Popper.spec.tsx | 113 +++++++++++++++ frontend/ui/Popper/Popper.story.tsx | 0 frontend/ui/Popper/Popper.tsx | 9 ++ frontend/ui/Popper/index.ts | 2 + frontend/ui/Portal/Portal.spec.tsx | 99 +++++++++++++ frontend/ui/Portal/Portal.story.tsx | 0 frontend/ui/Portal/Portal.tsx | 9 ++ frontend/ui/Portal/index.ts | 2 + frontend/ui/Snackbar/Button.story.tsx | 0 42 files changed, 1061 insertions(+) create mode 100644 frontend/ui/Badge/Badge.spec.tsx rename frontend/ui/{Snackbar/Snackbar.story.tsx => Badge/Badge.story.tsx} (100%) create mode 100644 frontend/ui/Badge/Badge.tsx create mode 100644 frontend/ui/Badge/index.ts create mode 100644 frontend/ui/ButtonGroup/ButtonGroup.spec.tsx create mode 100644 frontend/ui/ButtonGroup/ButtonGroup.story.tsx create mode 100644 frontend/ui/ButtonGroup/ButtonGroup.tsx create mode 100644 frontend/ui/ButtonGroup/index.ts create mode 100644 frontend/ui/Chip/Chip.spec.tsx create mode 100644 frontend/ui/Chip/Chip.story.tsx create mode 100644 frontend/ui/Chip/Chip.tsx create mode 100644 frontend/ui/Chip/index.ts create mode 100644 frontend/ui/ClickAwayListener/ClickAwayListener.spec.tsx create mode 100644 frontend/ui/ClickAwayListener/ClickAwayListener.story.tsx create mode 100644 frontend/ui/ClickAwayListener/ClickAwayListener.tsx create mode 100644 frontend/ui/ClickAwayListener/index.ts create mode 100644 frontend/ui/Fade/Fade.spec.tsx create mode 100644 frontend/ui/Fade/Fade.story.tsx create mode 100644 frontend/ui/Fade/Fade.tsx create mode 100644 frontend/ui/Fade/index.ts create mode 100644 frontend/ui/Grid/Grid.spec.tsx create mode 100644 frontend/ui/Grid/Grid.story.tsx create mode 100644 frontend/ui/Grid/Grid.tsx create mode 100644 frontend/ui/Grid/index.ts create mode 100644 frontend/ui/GridSize.tsx create mode 100644 frontend/ui/Grow/Grow.spec.tsx create mode 100644 frontend/ui/Grow/Grow.story.tsx create mode 100644 frontend/ui/Grow/Grow.tsx create mode 100644 frontend/ui/Grow/index.ts create mode 100644 frontend/ui/Menu/Menu.spec.tsx create mode 100644 frontend/ui/Menu/Menu.story.tsx create mode 100644 frontend/ui/Menu/Menu.tsx create mode 100644 frontend/ui/Menu/index.ts create mode 100644 frontend/ui/Popper/Popper.spec.tsx create mode 100644 frontend/ui/Popper/Popper.story.tsx create mode 100644 frontend/ui/Popper/Popper.tsx create mode 100644 frontend/ui/Popper/index.ts create mode 100644 frontend/ui/Portal/Portal.spec.tsx create mode 100644 frontend/ui/Portal/Portal.story.tsx create mode 100644 frontend/ui/Portal/Portal.tsx create mode 100644 frontend/ui/Portal/index.ts create mode 100644 frontend/ui/Snackbar/Button.story.tsx diff --git a/frontend/ui/Badge/Badge.spec.tsx b/frontend/ui/Badge/Badge.spec.tsx new file mode 100644 index 000000000..a8b5ae9ba --- /dev/null +++ b/frontend/ui/Badge/Badge.spec.tsx @@ -0,0 +1,130 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import Badge from './index'; + +describe('Badge', () => { + it('renders correctly', () => { + render( + +
Notifications
+
+ ); + + expect(screen.getByTestId('badge-child')).toBeInTheDocument(); + expect(screen.getByText('4')).toBeInTheDocument(); + }); + + it('renders with different colors', () => { + const { rerender } = render( + +
Primary badge
+
+ ); + + const badge = document.querySelector('.MuiBadge-badge'); + expect(badge).toHaveClass('MuiBadge-colorPrimary'); + + rerender( + +
Secondary badge
+
+ ); + + expect(badge).toHaveClass('MuiBadge-colorSecondary'); + }); + + it('renders with different variants', () => { + const { rerender } = render( + +
Standard badge
+
+ ); + + const badge = document.querySelector('.MuiBadge-badge'); + expect(badge).toHaveClass('MuiBadge-standard'); + + rerender( + +
Dot badge
+
+ ); + + expect(badge).toHaveClass('MuiBadge-dot'); + }); + + it('renders with different anchor origins', () => { + render( + +
Anchored badge
+
+ ); + + const badge = document.querySelector('.MuiBadge-badge'); + expect(badge).toHaveClass('MuiBadge-anchorOriginTopRight'); + }); + + it('renders dot variant without content', () => { + render( + +
Status indicator
+
+ ); + + expect(screen.getByTestId('dot-badge-child')).toBeInTheDocument(); + + const badge = document.querySelector('.MuiBadge-badge'); + expect(badge).toHaveClass('MuiBadge-dot'); + }); + + it('handles invisible prop', () => { + render( + +
Hidden badge
+
+ ); + + const badge = document.querySelector('.MuiBadge-badge'); + expect(badge).toHaveClass('MuiBadge-invisible'); + }); + + it('handles showZero prop', () => { + render( + +
Zero badge
+
+ ); + + expect(screen.getByText('0')).toBeInTheDocument(); + }); + + it('handles max prop', () => { + render( + +
Max badge
+
+ ); + + expect(screen.getByText('99+')).toBeInTheDocument(); + }); + + it('renders with custom badge content', () => { + render( + NEW} color="error"> +
Custom content badge
+
+ ); + + expect(screen.getByText('NEW')).toBeInTheDocument(); + }); + + it('renders with overlap', () => { + render( + +
Circular overlap
+
+ ); + + const badge = document.querySelector('.MuiBadge-badge'); + expect(badge).toHaveClass('MuiBadge-overlapCircular'); + }); +}); diff --git a/frontend/ui/Snackbar/Snackbar.story.tsx b/frontend/ui/Badge/Badge.story.tsx similarity index 100% rename from frontend/ui/Snackbar/Snackbar.story.tsx rename to frontend/ui/Badge/Badge.story.tsx diff --git a/frontend/ui/Badge/Badge.tsx b/frontend/ui/Badge/Badge.tsx new file mode 100644 index 000000000..5496a3dea --- /dev/null +++ b/frontend/ui/Badge/Badge.tsx @@ -0,0 +1,9 @@ +import { Badge as MUIBadge, BadgeProps as MUIBadgeProps } from '@mui/material'; + +type BadgeProps = MUIBadgeProps; + +const Badge = (badgeProps: BadgeProps) => { + return ; +}; + +export default Badge; diff --git a/frontend/ui/Badge/index.ts b/frontend/ui/Badge/index.ts new file mode 100644 index 000000000..e3a678446 --- /dev/null +++ b/frontend/ui/Badge/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './Badge'; diff --git a/frontend/ui/ButtonGroup/ButtonGroup.spec.tsx b/frontend/ui/ButtonGroup/ButtonGroup.spec.tsx new file mode 100644 index 000000000..34d16994d --- /dev/null +++ b/frontend/ui/ButtonGroup/ButtonGroup.spec.tsx @@ -0,0 +1,114 @@ +import { render, screen, fireEvent } from '@testing-library/react'; +import { describe, it, expect, vi } from 'vitest'; +import ButtonGroup from './index'; +import Button from '../Button'; + +describe('ButtonGroup', () => { + it('renders correctly', () => { + render( + + + + + + ); + + const buttonGroup = screen.getByTestId('button-group'); + expect(buttonGroup).toBeInTheDocument(); + expect(buttonGroup).toHaveClass('MuiButtonGroup-root'); + + expect(screen.getByRole('button', { name: 'First' })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Second' })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Third' })).toBeInTheDocument(); + }); + + it('handles button interactions', () => { + const handleFirst = vi.fn(); + const handleSecond = vi.fn(); + + render( + + + + + ); + + const firstButton = screen.getByRole('button', { name: 'First' }); + const secondButton = screen.getByRole('button', { name: 'Second' }); + + fireEvent.click(firstButton); + expect(handleFirst).toHaveBeenCalledTimes(1); + + fireEvent.click(secondButton); + expect(handleSecond).toHaveBeenCalledTimes(1); + }); + + it('renders with different variants', () => { + const { rerender } = render( + + + + + ); + + const buttonGroup = screen.getByTestId('contained-group'); + expect(buttonGroup).toHaveClass('MuiButtonGroup-contained'); + + rerender( + + + + + ); + + const outlinedGroup = screen.getByTestId('outlined-group'); + expect(outlinedGroup).toHaveClass('MuiButtonGroup-outlined'); + }); + + it('renders with different colors', () => { + render( + + + + + ); + + const buttonGroup = screen.getByTestId('primary-group'); + expect(buttonGroup).toBeInTheDocument(); + }); + + it('renders with different orientations', () => { + render( + + + + + + ); + + const buttonGroup = screen.getByTestId('vertical-group'); + expect(buttonGroup).toHaveClass('MuiButtonGroup-vertical'); + }); + + it('renders with single button', () => { + render( + + + + ); + + expect(screen.getByRole('button', { name: 'Single Button' })).toBeInTheDocument(); + }); + + it('renders as different HTML elements', () => { + render( + + + + + ); + + const buttonGroup = screen.getByTestId('nav-group'); + expect(buttonGroup.tagName).toBe('NAV'); + }); +}); diff --git a/frontend/ui/ButtonGroup/ButtonGroup.story.tsx b/frontend/ui/ButtonGroup/ButtonGroup.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/ButtonGroup/ButtonGroup.tsx b/frontend/ui/ButtonGroup/ButtonGroup.tsx new file mode 100644 index 000000000..34f9c2cba --- /dev/null +++ b/frontend/ui/ButtonGroup/ButtonGroup.tsx @@ -0,0 +1,12 @@ +import { + ButtonGroup as MUIButtonGroup, + ButtonGroupProps as MUIButtonGroupProps, +} from '@mui/material'; + +type ButtonGroupProps = MUIButtonGroupProps; + +const ButtonGroup = (buttonGroupProps: ButtonGroupProps) => { + return ; +}; + +export default ButtonGroup; diff --git a/frontend/ui/ButtonGroup/index.ts b/frontend/ui/ButtonGroup/index.ts new file mode 100644 index 000000000..9ef6ff3e5 --- /dev/null +++ b/frontend/ui/ButtonGroup/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './ButtonGroup'; diff --git a/frontend/ui/Chip/Chip.spec.tsx b/frontend/ui/Chip/Chip.spec.tsx new file mode 100644 index 000000000..3b320a0f1 --- /dev/null +++ b/frontend/ui/Chip/Chip.spec.tsx @@ -0,0 +1,77 @@ +import { render, screen, fireEvent } from '@testing-library/react'; +import { describe, it, expect, vi } from 'vitest'; +import Chip from './index'; + +describe('Chip', () => { + it('renders correctly', () => { + render(); + + expect(screen.getByText('Test chip')).toBeInTheDocument(); + }); + + it('renders with different variants', () => { + const { rerender } = render(); + + const chip = screen.getByTestId('chip'); + expect(chip).toHaveClass('MuiChip-filled'); + + rerender(); + expect(chip).toHaveClass('MuiChip-outlined'); + }); + + it('renders with different colors', () => { + const { rerender } = render(); + + const chip = screen.getByTestId('chip'); + expect(chip).toHaveClass('MuiChip-colorPrimary'); + + rerender(); + expect(chip).toHaveClass('MuiChip-colorSecondary'); + }); + + it('renders with different sizes', () => { + const { rerender } = render(); + + const chip = screen.getByTestId('chip'); + expect(chip).toHaveClass('MuiChip-sizeSmall'); + + rerender(); + expect(chip).toHaveClass('MuiChip-sizeMedium'); + }); + + it('handles click events', () => { + const handleClick = vi.fn(); + + render(); + + const chip = screen.getByRole('button', { name: 'Clickable chip' }); + fireEvent.click(chip); + + expect(handleClick).toHaveBeenCalledTimes(1); + }); + + it('renders with icon', () => { + const TestIcon = () => 🏷️; + + render(} />); + + expect(screen.getByText('🏷️')).toBeInTheDocument(); + expect(screen.getByText('Chip with icon')).toBeInTheDocument(); + }); + + it('renders with avatar', () => { + const TestAvatar = () => AV; + + render(} />); + + expect(screen.getByTestId('chip-avatar')).toBeInTheDocument(); + expect(screen.getByText('Chip with avatar')).toBeInTheDocument(); + }); + + it('renders in disabled state', () => { + render(); + + const chip = screen.getByText('Disabled chip').closest('.MuiChip-root'); + expect(chip).toHaveClass('Mui-disabled'); + }); +}); diff --git a/frontend/ui/Chip/Chip.story.tsx b/frontend/ui/Chip/Chip.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/Chip/Chip.tsx b/frontend/ui/Chip/Chip.tsx new file mode 100644 index 000000000..f19f58a27 --- /dev/null +++ b/frontend/ui/Chip/Chip.tsx @@ -0,0 +1,9 @@ +import { Chip as MUIChip, ChipProps as MUIChipProps } from '@mui/material'; + +type ChipProps = MUIChipProps; + +const Chip = (chipProps: ChipProps) => { + return ; +}; + +export default Chip; diff --git a/frontend/ui/Chip/index.ts b/frontend/ui/Chip/index.ts new file mode 100644 index 000000000..0cbadb01b --- /dev/null +++ b/frontend/ui/Chip/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './Chip'; diff --git a/frontend/ui/ClickAwayListener/ClickAwayListener.spec.tsx b/frontend/ui/ClickAwayListener/ClickAwayListener.spec.tsx new file mode 100644 index 000000000..ce27556c7 --- /dev/null +++ b/frontend/ui/ClickAwayListener/ClickAwayListener.spec.tsx @@ -0,0 +1,18 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect, vi } from 'vitest'; +import ClickAwayListener from './index'; + +describe('ClickAwayListener', () => { + it('renders correctly', () => { + const handleClickAway = vi.fn(); + + render( + +
Click target
+
+ ); + + expect(screen.getByTestId('target-element')).toBeInTheDocument(); + expect(screen.getByText('Click target')).toBeInTheDocument(); + }); +}); diff --git a/frontend/ui/ClickAwayListener/ClickAwayListener.story.tsx b/frontend/ui/ClickAwayListener/ClickAwayListener.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/ClickAwayListener/ClickAwayListener.tsx b/frontend/ui/ClickAwayListener/ClickAwayListener.tsx new file mode 100644 index 000000000..13e07ef26 --- /dev/null +++ b/frontend/ui/ClickAwayListener/ClickAwayListener.tsx @@ -0,0 +1,12 @@ +import { + ClickAwayListener as MUIClickAwayListener, + ClickAwayListenerProps as MUIClickAwayListenerProps, +} from '@mui/material'; + +type ClickAwayListenerProps = MUIClickAwayListenerProps; + +const ClickAwayListener = (clickAwayListenerProps: ClickAwayListenerProps) => { + return ; +}; + +export default ClickAwayListener; diff --git a/frontend/ui/ClickAwayListener/index.ts b/frontend/ui/ClickAwayListener/index.ts new file mode 100644 index 000000000..2753c386d --- /dev/null +++ b/frontend/ui/ClickAwayListener/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './ClickAwayListener'; diff --git a/frontend/ui/Fade/Fade.spec.tsx b/frontend/ui/Fade/Fade.spec.tsx new file mode 100644 index 000000000..433a0149b --- /dev/null +++ b/frontend/ui/Fade/Fade.spec.tsx @@ -0,0 +1,97 @@ +import { render, screen, waitFor } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import Fade from './index'; + +describe('Fade', () => { + it('renders correctly', () => { + render( + +
Fade content
+
+ ); + + expect(screen.getByText('Fade content')).toBeInTheDocument(); + }); + + it('shows content when in prop is true', async () => { + render( + +
Visible content
+
+ ); + + await waitFor(() => { + expect(screen.getByTestId('fade-content')).toBeInTheDocument(); + }); + }); + + it('renders with custom timeout', async () => { + render( + +
Slow fade content
+
+ ); + + await waitFor(() => { + expect(screen.getByTestId('slow-fade')).toBeInTheDocument(); + }); + }); + + it('renders with different timeout object', async () => { + render( + +
Custom timeout content
+
+ ); + + await waitFor(() => { + expect(screen.getByTestId('custom-timeout')).toBeInTheDocument(); + }); + }); + + it('renders with unmountOnExit', () => { + render( + +
Should be unmounted
+
+ ); + + expect(screen.queryByTestId('unmount-content')).not.toBeInTheDocument(); + }); + + it('renders with mountOnEnter', async () => { + render( + +
Mount on enter content
+
+ ); + + await waitFor(() => { + expect(screen.getByTestId('mount-content')).toBeInTheDocument(); + }); + }); + + it('handles easing prop', async () => { + render( + +
Easing content
+
+ ); + + await waitFor(() => { + expect(screen.getByTestId('easing-content')).toBeInTheDocument(); + }); + }); + + it('handles appear prop for initial mount', async () => { + render( + +
Appear content
+
+ ); + + await waitFor(() => { + expect(screen.getByTestId('appear-content')).toBeInTheDocument(); + }); + }); +}); diff --git a/frontend/ui/Fade/Fade.story.tsx b/frontend/ui/Fade/Fade.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/Fade/Fade.tsx b/frontend/ui/Fade/Fade.tsx new file mode 100644 index 000000000..e6fc29c33 --- /dev/null +++ b/frontend/ui/Fade/Fade.tsx @@ -0,0 +1,9 @@ +import { Fade as MUIFade, FadeProps as MUIFadeProps } from '@mui/material'; + +type FadeProps = MUIFadeProps; + +const Fade = (fadeProps: FadeProps) => { + return ; +}; + +export default Fade; diff --git a/frontend/ui/Fade/index.ts b/frontend/ui/Fade/index.ts new file mode 100644 index 000000000..49772cd80 --- /dev/null +++ b/frontend/ui/Fade/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './Fade'; diff --git a/frontend/ui/Grid/Grid.spec.tsx b/frontend/ui/Grid/Grid.spec.tsx new file mode 100644 index 000000000..2c95dbb5b --- /dev/null +++ b/frontend/ui/Grid/Grid.spec.tsx @@ -0,0 +1,115 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import Grid from './index'; + +describe('Grid', () => { + it('renders correctly', () => { + render( + + +
Item 1
+
+ +
Item 2
+
+
+ ); + + const gridContainer = screen.getByTestId('grid-container'); + expect(gridContainer).toBeInTheDocument(); + expect(gridContainer).toHaveClass('MuiGrid-container'); + + expect(screen.getByText('Item 1')).toBeInTheDocument(); + expect(screen.getByText('Item 2')).toBeInTheDocument(); + }); + + it('renders container with different spacing', () => { + render( + + +
Spaced Item 1
+
+ +
Spaced Item 2
+
+ +
Spaced Item 3
+
+
+ ); + + const spacedGrid = screen.getByTestId('spaced-grid'); + expect(spacedGrid).toHaveClass('MuiGrid-spacing-xs-2'); + }); + + it('renders items with different breakpoints', () => { + render( + + +
Responsive item
+
+
+ ); + + const responsiveItem = screen.getByTestId('responsive-item'); + expect(responsiveItem).toHaveClass('MuiGrid-grid-xs-12'); + expect(responsiveItem).toHaveClass('MuiGrid-grid-sm-6'); + expect(responsiveItem).toHaveClass('MuiGrid-grid-md-4'); + }); + + it('renders with wrap properties', () => { + render( + + +
No wrap item 1
+
+ +
No wrap item 2
+
+ +
No wrap item 3
+
+
+ ); + + const nowrapGrid = screen.getByTestId('nowrap-grid'); + expect(nowrapGrid).toHaveClass('MuiGrid-wrap-xs-nowrap'); + }); + + it('renders as different HTML elements', () => { + render( + + +
Article content
+
+
+ ); + + const sectionGrid = screen.getByTestId('section-grid'); + expect(sectionGrid.tagName).toBe('SECTION'); + }); + + it('renders nested grids', () => { + render( + + + + +
Nested 1
+
+ +
Nested 2
+
+
+
+ +
Main item
+
+
+ ); + + expect(screen.getByTestId('nested-item-1')).toBeInTheDocument(); + expect(screen.getByTestId('nested-item-2')).toBeInTheDocument(); + expect(screen.getByText('Main item')).toBeInTheDocument(); + }); +}); diff --git a/frontend/ui/Grid/Grid.story.tsx b/frontend/ui/Grid/Grid.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/Grid/Grid.tsx b/frontend/ui/Grid/Grid.tsx new file mode 100644 index 000000000..1d9b6f7a5 --- /dev/null +++ b/frontend/ui/Grid/Grid.tsx @@ -0,0 +1,9 @@ +import { Grid as MUIGrid, GridProps as MUIGridProps } from '@mui/material'; + +type GridProps = MUIGridProps; + +const Grid = (gridProps: GridProps) => { + return ; +}; + +export default Grid; diff --git a/frontend/ui/Grid/index.ts b/frontend/ui/Grid/index.ts new file mode 100644 index 000000000..0139e192a --- /dev/null +++ b/frontend/ui/Grid/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './Grid'; diff --git a/frontend/ui/GridSize.tsx b/frontend/ui/GridSize.tsx new file mode 100644 index 000000000..30f868e06 --- /dev/null +++ b/frontend/ui/GridSize.tsx @@ -0,0 +1,3 @@ +import { GridSize as MUIGridSize } from '@mui/material'; + +export type GridSize = MUIGridSize; diff --git a/frontend/ui/Grow/Grow.spec.tsx b/frontend/ui/Grow/Grow.spec.tsx new file mode 100644 index 000000000..67fed4773 --- /dev/null +++ b/frontend/ui/Grow/Grow.spec.tsx @@ -0,0 +1,85 @@ +import { render, screen, waitFor } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import Grow from './index'; + +describe('Grow', () => { + it('renders correctly', () => { + render( + +
Grow content
+
+ ); + + expect(screen.getByText('Grow content')).toBeInTheDocument(); + }); + + it('shows content when in prop is true', async () => { + render( + +
Visible content
+
+ ); + + await waitFor(() => { + expect(screen.getByTestId('grow-content')).toBeInTheDocument(); + }); + }); + + it('renders with custom timeout', async () => { + render( + +
Slow grow content
+
+ ); + + await waitFor(() => { + expect(screen.getByTestId('slow-grow')).toBeInTheDocument(); + }); + }); + + it('renders with different timeout object', async () => { + render( + +
Custom timeout content
+
+ ); + + await waitFor(() => { + expect(screen.getByTestId('custom-timeout')).toBeInTheDocument(); + }); + }); + + it('renders with unmountOnExit', () => { + render( + +
Should be unmounted
+
+ ); + + expect(screen.queryByTestId('unmount-content')).not.toBeInTheDocument(); + }); + + it('renders with mountOnEnter', async () => { + render( + +
Mount on enter content
+
+ ); + + await waitFor(() => { + expect(screen.getByTestId('mount-content')).toBeInTheDocument(); + }); + }); + + it('handles easing prop', async () => { + render( + +
Easing content
+
+ ); + + await waitFor(() => { + expect(screen.getByTestId('easing-content')).toBeInTheDocument(); + }); + }); +}); diff --git a/frontend/ui/Grow/Grow.story.tsx b/frontend/ui/Grow/Grow.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/Grow/Grow.tsx b/frontend/ui/Grow/Grow.tsx new file mode 100644 index 000000000..508cb5cc2 --- /dev/null +++ b/frontend/ui/Grow/Grow.tsx @@ -0,0 +1,9 @@ +import { Grow as MUIGrow, GrowProps as MUIGrowProps } from '@mui/material'; + +type GrowProps = MUIGrowProps; + +const Grow = (growProps: GrowProps) => { + return ; +}; + +export default Grow; diff --git a/frontend/ui/Grow/index.ts b/frontend/ui/Grow/index.ts new file mode 100644 index 000000000..258e45a6f --- /dev/null +++ b/frontend/ui/Grow/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './Grow'; diff --git a/frontend/ui/Menu/Menu.spec.tsx b/frontend/ui/Menu/Menu.spec.tsx new file mode 100644 index 000000000..246c6b1a7 --- /dev/null +++ b/frontend/ui/Menu/Menu.spec.tsx @@ -0,0 +1,94 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import MenuItem from '@ui/MenuItem'; +import Menu from './index'; + +describe('Menu', () => { + it('renders correctly when open', () => { + const anchorElement = document.createElement('div'); + document.body.appendChild(anchorElement); + + render( + + Menu Item 1 + Menu Item 2 + + ); + + expect(screen.getByRole('menu')).toBeInTheDocument(); + expect(screen.getByText('Menu Item 1')).toBeInTheDocument(); + expect(screen.getByText('Menu Item 2')).toBeInTheDocument(); + + document.body.removeChild(anchorElement); + }); + + it('does not render when closed', () => { + const anchorElement = document.createElement('div'); + document.body.appendChild(anchorElement); + + render( + + Hidden Item + + ); + + expect(screen.queryByRole('menu')).not.toBeInTheDocument(); + expect(screen.queryByText('Hidden Item')).not.toBeInTheDocument(); + + document.body.removeChild(anchorElement); + }); + + it('renders with different anchor origins', () => { + const anchorElement = document.createElement('div'); + document.body.appendChild(anchorElement); + + render( + + Anchored Item + + ); + + expect(screen.getByRole('menu')).toBeInTheDocument(); + + document.body.removeChild(anchorElement); + }); + + it('renders with different transform origins', () => { + const anchorElement = document.createElement('div'); + document.body.appendChild(anchorElement); + + render( + + Transform Item + + ); + + expect(screen.getByRole('menu')).toBeInTheDocument(); + + document.body.removeChild(anchorElement); + }); + + it('handles keepMounted prop', () => { + const anchorElement = document.createElement('div'); + document.body.appendChild(anchorElement); + + render( + + Kept mounted item + + ); + + expect(screen.getByText('Kept mounted item')).toBeInTheDocument(); + + document.body.removeChild(anchorElement); + }); +}); diff --git a/frontend/ui/Menu/Menu.story.tsx b/frontend/ui/Menu/Menu.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/Menu/Menu.tsx b/frontend/ui/Menu/Menu.tsx new file mode 100644 index 000000000..f3fc2e13a --- /dev/null +++ b/frontend/ui/Menu/Menu.tsx @@ -0,0 +1,9 @@ +import { Menu as MUIMenu, MenuProps as MUIMenuProps } from '@mui/material'; + +type MenuProps = MUIMenuProps; + +const Menu = (menuProps: MenuProps) => { + return ; +}; + +export default Menu; diff --git a/frontend/ui/Menu/index.ts b/frontend/ui/Menu/index.ts new file mode 100644 index 000000000..4ddaa428b --- /dev/null +++ b/frontend/ui/Menu/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './Menu'; diff --git a/frontend/ui/Popper/Popper.spec.tsx b/frontend/ui/Popper/Popper.spec.tsx new file mode 100644 index 000000000..c2fcbe41e --- /dev/null +++ b/frontend/ui/Popper/Popper.spec.tsx @@ -0,0 +1,113 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import Popper from './index'; + +describe('Popper', () => { + it('renders correctly when open', () => { + const anchorElement = document.createElement('div'); + document.body.appendChild(anchorElement); + + render( + +
Test content
+
+ ); + + expect(screen.getByTestId('popper-content')).toBeInTheDocument(); + expect(screen.getByText('Test content')).toBeInTheDocument(); + + document.body.removeChild(anchorElement); + }); + + it('does not render when closed', () => { + const anchorElement = document.createElement('div'); + document.body.appendChild(anchorElement); + + render( + +
Hidden content
+
+ ); + + expect(screen.queryByTestId('hidden-content')).not.toBeInTheDocument(); + + document.body.removeChild(anchorElement); + }); + + it('renders with different placements', () => { + const anchorElement = document.createElement('div'); + document.body.appendChild(anchorElement); + + const { rerender } = render( + +
Top placement
+
+ ); + + expect(screen.getByTestId('top-popper')).toBeInTheDocument(); + + rerender( + +
Bottom placement
+
+ ); + + expect(screen.getByTestId('bottom-popper')).toBeInTheDocument(); + + document.body.removeChild(anchorElement); + }); + + it('applies custom sx props', () => { + const anchorElement = document.createElement('div'); + document.body.appendChild(anchorElement); + + render( + +
Styled popper content
+
+ ); + + const popper = screen.getByTestId('styled-popper'); + expect(popper).toBeInTheDocument(); + + document.body.removeChild(anchorElement); + }); + + it('handles modifiers', () => { + const anchorElement = document.createElement('div'); + document.body.appendChild(anchorElement); + + const modifiers = [ + { + name: 'offset', + options: { + offset: [0, 10], + }, + }, + ]; + + render( + +
Modified popper
+
+ ); + + expect(screen.getByTestId('modified-popper')).toBeInTheDocument(); + + document.body.removeChild(anchorElement); + }); + + it('handles keepMounted prop', () => { + const anchorElement = document.createElement('div'); + document.body.appendChild(anchorElement); + + render( + +
Kept mounted content
+
+ ); + + expect(screen.getByTestId('kept-mounted')).toBeInTheDocument(); + document.body.removeChild(anchorElement); + }); +}); diff --git a/frontend/ui/Popper/Popper.story.tsx b/frontend/ui/Popper/Popper.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/Popper/Popper.tsx b/frontend/ui/Popper/Popper.tsx new file mode 100644 index 000000000..c8d27c7c1 --- /dev/null +++ b/frontend/ui/Popper/Popper.tsx @@ -0,0 +1,9 @@ +import { Popper as MUIPopper, PopperProps as MUIPopperProps } from '@mui/material'; + +type PopperProps = MUIPopperProps; + +const Popper = (popperProps: PopperProps) => { + return ; +}; + +export default Popper; diff --git a/frontend/ui/Popper/index.ts b/frontend/ui/Popper/index.ts new file mode 100644 index 000000000..35df95e5a --- /dev/null +++ b/frontend/ui/Popper/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './Popper'; diff --git a/frontend/ui/Portal/Portal.spec.tsx b/frontend/ui/Portal/Portal.spec.tsx new file mode 100644 index 000000000..736dd0e58 --- /dev/null +++ b/frontend/ui/Portal/Portal.spec.tsx @@ -0,0 +1,99 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import Portal from './index'; + +describe('Portal', () => { + it('renders correctly', () => { + render( + +
Portal content
+
+ ); + + expect(screen.getByTestId('portal-content')).toBeInTheDocument(); + expect(screen.getByText('Portal content')).toBeInTheDocument(); + }); + + it('renders content in document body by default', () => { + render( + +
Body portal content
+
+ ); + + const portalContent = screen.getByTestId('body-portal'); + expect(portalContent).toBeInTheDocument(); + + expect(document.body.contains(portalContent)).toBe(true); + }); + + it('renders content in custom container', () => { + const customContainer = document.createElement('div'); + customContainer.setAttribute('data-testid', 'custom-container'); + document.body.appendChild(customContainer); + + render( + +
Custom container content
+
+ ); + + const portalContent = screen.getByTestId('custom-portal'); + expect(portalContent).toBeInTheDocument(); + + expect(customContainer.contains(portalContent)).toBe(true); + + document.body.removeChild(customContainer); + }); + + it('can be disabled', () => { + render( +
+ +
Disabled portal content
+
+
+ ); + + const portalContent = screen.getByTestId('disabled-portal'); + const parentContainer = screen.getByTestId('parent-container'); + + expect(portalContent).toBeInTheDocument(); + expect(parentContainer.contains(portalContent)).toBe(true); + }); + + it('handles multiple children', () => { + render( + +
Child 1
+
Child 2
+
+ ); + + expect(screen.getByTestId('portal-child1')).toBeInTheDocument(); + expect(screen.getByTestId('portal-child2')).toBeInTheDocument(); + }); + + it('handles container function', () => { + const getContainer = () => { + const container = document.createElement('div'); + container.setAttribute('data-testid', 'function-container'); + document.body.appendChild(container); + return container; + }; + + render( + +
Function container content
+
+ ); + + const portalContent = screen.getByTestId('function-portal'); + expect(portalContent).toBeInTheDocument(); + + const functionContainer = document.querySelector('[data-testid="function-container"]'); + if (functionContainer) { + document.body.removeChild(functionContainer); + } + }); +}); diff --git a/frontend/ui/Portal/Portal.story.tsx b/frontend/ui/Portal/Portal.story.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/ui/Portal/Portal.tsx b/frontend/ui/Portal/Portal.tsx new file mode 100644 index 000000000..2133084fd --- /dev/null +++ b/frontend/ui/Portal/Portal.tsx @@ -0,0 +1,9 @@ +import { Portal as MUIPortal, PortalProps as MUIPortalProps } from '@mui/material'; + +type PortalProps = MUIPortalProps; + +const Portal = (portalProps: PortalProps) => { + return ; +}; + +export default Portal; diff --git a/frontend/ui/Portal/index.ts b/frontend/ui/Portal/index.ts new file mode 100644 index 000000000..232d5798d --- /dev/null +++ b/frontend/ui/Portal/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export { default } from './Portal'; diff --git a/frontend/ui/Snackbar/Button.story.tsx b/frontend/ui/Snackbar/Button.story.tsx new file mode 100644 index 000000000..e69de29bb From 19414ee4a1784271a3ef394a29e0ffed079aa749 Mon Sep 17 00:00:00 2001 From: ofava Date: Mon, 10 Nov 2025 16:31:33 +0100 Subject: [PATCH 31/93] Fix unit testing of dialog --- frontend/ui/Dialog/Dialog.spec.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/ui/Dialog/Dialog.spec.tsx b/frontend/ui/Dialog/Dialog.spec.tsx index 3e77e9ee6..8a6a39c4a 100644 --- a/frontend/ui/Dialog/Dialog.spec.tsx +++ b/frontend/ui/Dialog/Dialog.spec.tsx @@ -1,6 +1,9 @@ import { render, screen, fireEvent } from '@testing-library/react'; import { describe, it, expect, vi } from 'vitest'; -import { DialogTitle, DialogContent, DialogActions, Button } from '@mui/material'; +import DialogTitle from '@ui/DialogTitle'; +import DialogContent from '@ui/DialogContent'; +import DialogActions from '@ui/DialogActions'; +import Button from '@ui/Button'; import Dialog from './index'; describe('Dialog', () => { From 95091881dfba8c8ceeba10771efa62341ac7e509 Mon Sep 17 00:00:00 2001 From: ofava Date: Wed, 12 Nov 2025 14:50:08 +0100 Subject: [PATCH 32/93] Refactor room name input --- frontend/src/components/RoomNameInput/RoomNameInput.tsx | 9 +-------- frontend/src/locales/en.json | 2 +- frontend/src/locales/es-MX.json | 2 +- frontend/src/locales/es.json | 2 +- frontend/src/locales/it.json | 2 +- frontend/src/utils/customTheme/customTheme.ts | 2 +- 6 files changed, 6 insertions(+), 13 deletions(-) diff --git a/frontend/src/components/RoomNameInput/RoomNameInput.tsx b/frontend/src/components/RoomNameInput/RoomNameInput.tsx index 211fe2c41..a7ef383d3 100644 --- a/frontend/src/components/RoomNameInput/RoomNameInput.tsx +++ b/frontend/src/components/RoomNameInput/RoomNameInput.tsx @@ -1,8 +1,6 @@ import { SetStateAction, Dispatch, ReactElement, ChangeEvent } from 'react'; import { useTranslation } from 'react-i18next'; -import VividIcon from '@components/VividIcon'; import TextField from '@ui/TextField'; -import InputAdornment from '@ui/InputAdornment'; import isValidRoomName from '../../utils/isValidRoomName'; export type RoomNameInputProps = { @@ -51,18 +49,13 @@ const RoomNameInput = ({ - - - ), }} /> ); diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index c9bf6f1bc..6a61a392e 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -169,7 +169,7 @@ "room.exit.ariaLabel": "exit", "room.exit.tooltip": "Exit meeting", "room.input.helper": "No spaces or special characters allowed", - "room.input.placeholder": "Enter room name", + "room.input.label": "Enter room name", "screenSharing.dialog.action": "Start sharing your screen", "screenSharing.dialog.content": "Looks like there is someone else sharing their screen. If you continue, their screen is no longer going to be shared.", "screenSharing.dialog.title": "Do you want to share your screen?", diff --git a/frontend/src/locales/es-MX.json b/frontend/src/locales/es-MX.json index 569ee6f24..f6e88827f 100644 --- a/frontend/src/locales/es-MX.json +++ b/frontend/src/locales/es-MX.json @@ -167,7 +167,7 @@ "room.exit.ariaLabel": "salir", "room.exit.tooltip": "Salir de la reunión", "room.input.helper": "No se permiten espacios ni caracteres especiales", - "room.input.placeholder": "Nombre de sala", + "room.input.label": "Nombre de sala", "screenSharing.dialog.action": "Comenzar a compartir pantalla", "screenSharing.dialog.content": "Alguien más está compartiendo pantalla. Si continúas, su pantalla dejará de mostrarse.", "screenSharing.dialog.title": "¿Quieres compartir tu pantalla?", diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index 95a1fb711..7d71f6448 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -167,7 +167,7 @@ "room.exit.ariaLabel": "salir", "room.exit.tooltip": "Salir de la reunión", "room.input.helper": "No se permiten espacios ni caracteres especiales", - "room.input.placeholder": "Nombre de sala", + "room.input.label": "Nombre de sala", "screenSharing.dialog.action": "Comenzar a compartir tu pantalla", "screenSharing.dialog.content": "Parece que alguien más está compartiendo su pantalla. Si continúas, su pantalla dejará de compartirse.", "screenSharing.dialog.title": "¿Deseas compartir tu pantalla?", diff --git a/frontend/src/locales/it.json b/frontend/src/locales/it.json index 58a814889..6d89227da 100644 --- a/frontend/src/locales/it.json +++ b/frontend/src/locales/it.json @@ -167,7 +167,7 @@ "room.exit.ariaLabel": "esci", "room.exit.tooltip": "Esci dalla riunione", "room.input.helper": "Non sono ammessi spazi o caratteri speciali", - "room.input.placeholder": "Nome della stanza", + "room.input.label": "Nome della stanza", "screenSharing.dialog.action": "Inizia condivisione schermo", "screenSharing.dialog.content": "Sembra che qualcun altro stia condividendo lo schermo. Se continui, il loro schermo non sarà più condiviso.", "screenSharing.dialog.title": "Vuoi condividere il tuo schermo?", diff --git a/frontend/src/utils/customTheme/customTheme.ts b/frontend/src/utils/customTheme/customTheme.ts index 0070e5b2c..8609e49b5 100644 --- a/frontend/src/utils/customTheme/customTheme.ts +++ b/frontend/src/utils/customTheme/customTheme.ts @@ -8,7 +8,7 @@ declare module '@mui/material/styles' { const borderRadiusStandard = '8px'; const borderRadiusStandardNumber = 2.85; -const inputHeight = 48; +const inputHeight = 56; const buttonFontSize = 16; const h2FontWeight = 500; const h5FontWeight = 500; From 82e221e76946e88f8c5e5f34f3f4a19f5cfaef0b Mon Sep 17 00:00:00 2001 From: ofava Date: Thu, 13 Nov 2025 09:39:44 +0100 Subject: [PATCH 33/93] UI/UX improvements --- frontend/src/components/Banner/Banner.tsx | 31 ++++++++++------- .../src/components/BannerLogo/BannerLogo.tsx | 4 +-- .../JoinContainerSeparator.tsx | 7 ++-- .../JoinExistingRoom/JoinExistingRoom.tsx | 2 +- .../LandingPageWelcome/LandingPageWelcome.tsx | 3 +- .../RoomJoinContainer/RoomJoinContainer.tsx | 14 +++----- .../RoomNameInput/RoomNameInput.tsx | 1 + .../src/components/Separator/Separator.tsx | 2 +- frontend/src/locales/en.json | 4 +-- frontend/src/locales/es-MX.json | 2 +- frontend/src/locales/es.json | 2 +- frontend/src/utils/customTheme/customTheme.ts | 34 +++++++++++++++---- frontend/ui/FlexLayout/FlexLayout.tsx | 4 +-- 13 files changed, 68 insertions(+), 42 deletions(-) diff --git a/frontend/src/components/Banner/Banner.tsx b/frontend/src/components/Banner/Banner.tsx index c41ca18b1..7036cc70b 100644 --- a/frontend/src/components/Banner/Banner.tsx +++ b/frontend/src/components/Banner/Banner.tsx @@ -16,22 +16,27 @@ import BannerLanguage from '../BannerLanguage'; const Banner = (): ReactElement => { return ( - - + + - - - - - + + + + + + + ); diff --git a/frontend/src/components/BannerLogo/BannerLogo.tsx b/frontend/src/components/BannerLogo/BannerLogo.tsx index 2df4f85fe..51bc69c7f 100644 --- a/frontend/src/components/BannerLogo/BannerLogo.tsx +++ b/frontend/src/components/BannerLogo/BannerLogo.tsx @@ -12,8 +12,8 @@ const BannerLogo = (): ReactElement => (
{ const { t } = useTranslation(); return ( - + - {t('common.or')} + ({ color: theme.palette.tertiary.main })}> + {t('common.or')} + ); diff --git a/frontend/src/components/JoinExistingRoom/JoinExistingRoom.tsx b/frontend/src/components/JoinExistingRoom/JoinExistingRoom.tsx index 1f184fd01..70ec00e7e 100644 --- a/frontend/src/components/JoinExistingRoom/JoinExistingRoom.tsx +++ b/frontend/src/components/JoinExistingRoom/JoinExistingRoom.tsx @@ -15,7 +15,7 @@ const JoinExistingRoom = (): ReactElement => { return ( { maxWidth: '48rem', pl: { xs: 0, lg: 4 }, mb: { xs: 0, md: 6 }, + ml: { xs: 0, md: 2 }, textAlign: 'left', }} > @@ -57,7 +58,7 @@ const LandingPageWelcome = (): ReactElement => { { flexDirection: 'column', alignItems: 'start', bgcolor: { xs: 'background.paper', md: 'background.default' }, - padding: { xs: '0px', md: '80px 40px' }, + padding: { xs: '0px 0px 0px 0px', md: '40px 40px 0px 40px' }, borderRadius: theme.shape.borderRadius, })} > - - {t('button.joinExistingMeeting')} - - - - - {t('button.startNewRoom')} - + {t('button.startNewRoom')} + + {t('button.joinExistingMeeting')} + ); }; diff --git a/frontend/src/components/RoomNameInput/RoomNameInput.tsx b/frontend/src/components/RoomNameInput/RoomNameInput.tsx index a7ef383d3..c8a900db4 100644 --- a/frontend/src/components/RoomNameInput/RoomNameInput.tsx +++ b/frontend/src/components/RoomNameInput/RoomNameInput.tsx @@ -47,6 +47,7 @@ const RoomNameInput = ({ }; return ( { data-testid="separator" sx={(theme) => ({ width: '50%', - borderBottom: '2px solid', + borderBottom: '1px solid', borderColor: theme.palette.divider, ...(orientation === 'left' ? { marginRight: 1 } : { marginLeft: 1 }), })} diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 6a61a392e..6726ab3a0 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -44,7 +44,7 @@ "button.cancel": "Cancel", "button.close": "Close", "button.createRoom": "Create a new room", - "button.startNewRoom": "Start a new video call", + "button.startNewRoom": "Start a new video meeting", "button.joinExistingMeeting": "Join existing meeting", "button.join": "Join", "button.mute": "Mute", @@ -169,7 +169,7 @@ "room.exit.ariaLabel": "exit", "room.exit.tooltip": "Exit meeting", "room.input.helper": "No spaces or special characters allowed", - "room.input.label": "Enter room name", + "room.input.label": "Room name", "screenSharing.dialog.action": "Start sharing your screen", "screenSharing.dialog.content": "Looks like there is someone else sharing their screen. If you continue, their screen is no longer going to be shared.", "screenSharing.dialog.title": "Do you want to share your screen?", diff --git a/frontend/src/locales/es-MX.json b/frontend/src/locales/es-MX.json index f6e88827f..474664cc4 100644 --- a/frontend/src/locales/es-MX.json +++ b/frontend/src/locales/es-MX.json @@ -44,7 +44,7 @@ "button.cancel": "Cancelar", "button.close": "Cerrar", "button.createRoom": "Crear una nueva sala", - "button.startNewRoom": "Iniciar una nueva videollamada", + "button.startNewRoom": "Iniciar una nueva videoconferencia", "button.joinExistingMeeting": "Unirse a una reunión existente", "button.join": "Unirse", "button.mute": "Silenciar", diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index 7d71f6448..8b1e99374 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -44,7 +44,7 @@ "button.cancel": "Cancelar", "button.close": "Cerrar", "button.createRoom": "Crear una nueva sala", - "button.startNewRoom": "Iniciar una nueva videollamada", + "button.startNewRoom": "Iniciar una nueva videoconferencia", "button.joinExistingMeeting": "Unirse a una reunión existente", "button.join": "Unirse", "button.mute": "Silenciar", diff --git a/frontend/src/utils/customTheme/customTheme.ts b/frontend/src/utils/customTheme/customTheme.ts index 8609e49b5..4d7b2ec50 100644 --- a/frontend/src/utils/customTheme/customTheme.ts +++ b/frontend/src/utils/customTheme/customTheme.ts @@ -1,20 +1,32 @@ -import { createTheme } from '@mui/material'; +import { createTheme, PaletteColor, PaletteColorOptions } from '@mui/material'; declare module '@mui/material/styles' { interface TypeBackground { darkGrey: string; } + + interface TypeText { + tertiary: string; + } + + interface Palette { + tertiary: PaletteColor; + } + + interface PaletteOptions { + tertiary?: PaletteColorOptions; + } } const borderRadiusStandard = '8px'; const borderRadiusStandardNumber = 2.85; -const inputHeight = 56; +const buttonHeight = 40; const buttonFontSize = 16; const h2FontWeight = 500; const h5FontWeight = 500; const buttonSx = { - height: inputHeight, + height: buttonHeight, textTransform: 'none', borderRadius: borderRadiusStandard, } as const; @@ -22,6 +34,7 @@ const buttonSx = { const colors = { // Primary colors primary: '#871EFF', + textPrimary: '#9941ff', primaryLight: '#f3e9ff', primaryHover: '#3E007E2F', onPrimary: '#FFFFFF', @@ -31,12 +44,14 @@ const colors = { // Secondary colors secondary: '#2F293B', + textSecondary: '#000000', onSecondary: '#FFFFFF', secondaryContainer: '#4C4659', onSecondaryContainer: '#FFFFFF', // Tertiary colors (mapped to warning) tertiary: '#2A005E', + textTertiary: '#757575', onTertiary: '#FFFFFF', tertiaryContainer: '#440291', onTertiaryContainer: '#F7EDFF', @@ -51,7 +66,7 @@ const colors = { background: '#FFFFFF', backgroundDisabled: '#f5f5f5', onBackground: '#1E1925', - surface: '#FCF8F8', + surface: '#FFFFFF', onSurface: '#000000', // Outline colors @@ -89,6 +104,11 @@ const customTheme = createTheme({ contrastText: colors.onSecondary, dark: colors.secondaryContainer, }, + tertiary: { + main: colors.tertiary, + contrastText: colors.onTertiary, + dark: colors.tertiaryContainer, + }, warning: { main: colors.tertiary, contrastText: colors.onTertiary, @@ -105,8 +125,9 @@ const customTheme = createTheme({ darkGrey: colors.darkGrey, }, text: { - primary: colors.onBackground, - secondary: colors.onSurface, + primary: colors.textSecondary, // This is the default text color + secondary: colors.textSecondary, + tertiary: colors.textTertiary, }, divider: colors.outline, }, @@ -156,7 +177,6 @@ const customTheme = createTheme({ MuiOutlinedInput: { styleOverrides: { root: { - height: inputHeight, backgroundColor: colors.background, borderRadius: borderRadiusStandard, backgroundClip: 'padding-box', diff --git a/frontend/ui/FlexLayout/FlexLayout.tsx b/frontend/ui/FlexLayout/FlexLayout.tsx index 2ee63df88..ad1d91ee7 100644 --- a/frontend/ui/FlexLayout/FlexLayout.tsx +++ b/frontend/ui/FlexLayout/FlexLayout.tsx @@ -56,8 +56,8 @@ const FlexLayout: FlexLayoutComponent = ({ rightFlex = 1, leftAlign = { alignItems: 'center', justifyContent: 'center' }, rightAlign = { alignItems: 'center', justifyContent: 'center' }, - leftBackgroundColor = { xs: 'background.paper', md: 'primary.light' }, - rightBackgroundColor = { xs: 'background.paper', md: 'background.paper' }, + leftBackgroundColor = { xs: 'background.paper', md: 'background.paper' }, + rightBackgroundColor = { xs: 'background.paper', md: 'primary.light' }, }: FlexLayoutProps) => { const banner = pickChild(children, 'FlexLayoutBanner'); const left = pickChild(children, 'FlexLayoutLeft'); From b3460b4766e610fe830b582d434cf0c1d27c87d6 Mon Sep 17 00:00:00 2001 From: ofava Date: Thu, 13 Nov 2025 09:41:02 +0100 Subject: [PATCH 34/93] Change color tokens --- frontend/src/utils/customTheme/customTheme.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/frontend/src/utils/customTheme/customTheme.ts b/frontend/src/utils/customTheme/customTheme.ts index 4d7b2ec50..4af09b465 100644 --- a/frontend/src/utils/customTheme/customTheme.ts +++ b/frontend/src/utils/customTheme/customTheme.ts @@ -64,7 +64,7 @@ const colors = { // Surface colors background: '#FFFFFF', - backgroundDisabled: '#f5f5f5', + backgroundDisabled: '#f5f5f5', // colors/disabled onBackground: '#1E1925', surface: '#FFFFFF', onSurface: '#000000', @@ -81,9 +81,6 @@ const colors = { // Shadow and scrim shadow: '#000000', scrim: '#000000', - - // Neutral colors - darkGrey: '#202124', } as const; const fonts = { @@ -122,7 +119,7 @@ const customTheme = createTheme({ background: { default: colors.background, paper: colors.surface, - darkGrey: colors.darkGrey, + darkGrey: colors.secondary, }, text: { primary: colors.textSecondary, // This is the default text color From c07e7e711ef22b485829237c0cc0fa3957671fe1 Mon Sep 17 00:00:00 2001 From: ofava Date: Thu, 13 Nov 2025 12:37:06 +0100 Subject: [PATCH 35/93] Apply UI/UX layout for header/footer + apply some tokens --- .../src/components/Banner/Banner.spec.tsx | 15 +------ frontend/src/components/Banner/Banner.tsx | 7 +--- .../BannerDateTime/BannerDateTime.spec.tsx | 17 -------- .../BannerDateTime/BannerDateTime.tsx | 42 ------------------- .../src/components/BannerDateTime/index.tsx | 3 -- .../BannerLinks/BannerLinks.spec.tsx | 17 -------- .../components/BannerLinks/BannerLinks.tsx | 19 --------- frontend/src/components/BannerLinks/index.tsx | 3 -- .../src/components/BannerLogo/BannerLogo.tsx | 4 +- .../src/components/Footer/Footer.spec.tsx | 17 ++++++++ frontend/src/components/Footer/Footer.tsx | 31 ++++++++++++++ frontend/src/components/Footer/index.tsx | 3 ++ .../FooterLinks/FooterLinks.spec.tsx | 17 ++++++++ .../components/FooterLinks/FooterLinks.tsx | 33 +++++++++++++++ frontend/src/components/FooterLinks/index.tsx | 3 ++ .../LandingPageWelcome/LandingPageWelcome.tsx | 2 +- .../LanguageSelector/LanguageSelector.tsx | 10 ++++- frontend/src/locales/en.json | 1 + frontend/src/locales/es-MX.json | 1 + frontend/src/locales/es.json | 1 + frontend/src/locales/it.json | 1 + frontend/src/pages/GoodBye/GoodBye.tsx | 23 ++++++---- .../src/pages/LandingPage/LandingPage.tsx | 22 ++++++---- .../UnsupportedBrowserPage.tsx | 22 ++++++---- .../src/pages/WaitingRoom/WaitingRoom.tsx | 22 ++++++---- frontend/src/utils/customTheme/customTheme.ts | 7 ---- frontend/ui/FlexLayout/FlexLayout.tsx | 10 +++++ 27 files changed, 186 insertions(+), 167 deletions(-) delete mode 100644 frontend/src/components/BannerDateTime/BannerDateTime.spec.tsx delete mode 100644 frontend/src/components/BannerDateTime/BannerDateTime.tsx delete mode 100644 frontend/src/components/BannerDateTime/index.tsx delete mode 100644 frontend/src/components/BannerLinks/BannerLinks.spec.tsx delete mode 100644 frontend/src/components/BannerLinks/BannerLinks.tsx delete mode 100644 frontend/src/components/BannerLinks/index.tsx create mode 100644 frontend/src/components/Footer/Footer.spec.tsx create mode 100644 frontend/src/components/Footer/Footer.tsx create mode 100644 frontend/src/components/Footer/index.tsx create mode 100644 frontend/src/components/FooterLinks/FooterLinks.spec.tsx create mode 100644 frontend/src/components/FooterLinks/FooterLinks.tsx create mode 100644 frontend/src/components/FooterLinks/index.tsx diff --git a/frontend/src/components/Banner/Banner.spec.tsx b/frontend/src/components/Banner/Banner.spec.tsx index f484997cc..9c8db7b8e 100644 --- a/frontend/src/components/Banner/Banner.spec.tsx +++ b/frontend/src/components/Banner/Banner.spec.tsx @@ -15,17 +15,6 @@ describe('Banner', () => { expect(bannerLogo).toBeInTheDocument(); }); - it('renders the banner date and time', () => { - render( - - - - ); - - const bannerDataTime = screen.getByTestId('dateAndTime'); - expect(bannerDataTime).toBeInTheDocument(); - }); - it('renders the banner links', () => { render( @@ -33,7 +22,7 @@ describe('Banner', () => { ); - const bannerLinks = screen.getByTestId('banner-links'); - expect(bannerLinks).toBeInTheDocument(); + const FooterLinks = screen.getByTestId('banner-links'); + expect(FooterLinks).toBeInTheDocument(); }); }); diff --git a/frontend/src/components/Banner/Banner.tsx b/frontend/src/components/Banner/Banner.tsx index b5fb94108..ce479ad89 100644 --- a/frontend/src/components/Banner/Banner.tsx +++ b/frontend/src/components/Banner/Banner.tsx @@ -2,8 +2,6 @@ import { ReactElement } from 'react'; import Box from '@ui/Box'; import Stack from '@ui/Stack'; import Header from '@ui/Header'; -import BannerDateTime from '../BannerDateTime'; -import BannerLinks from '../BannerLinks'; import BannerLogo from '../BannerLogo'; import BannerLanguage from '../BannerLanguage'; @@ -15,7 +13,7 @@ import BannerLanguage from '../BannerLanguage'; */ const Banner = (): ReactElement => { return ( -
+
@@ -29,11 +27,10 @@ const Banner = (): ReactElement => { sx={{ height: '100%', bgcolor: { xs: 'background.paper', md: 'primary.light' }, + mr: 4, }} > - -
diff --git a/frontend/src/components/BannerDateTime/BannerDateTime.spec.tsx b/frontend/src/components/BannerDateTime/BannerDateTime.spec.tsx deleted file mode 100644 index ff31edbfb..000000000 --- a/frontend/src/components/BannerDateTime/BannerDateTime.spec.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { describe, expect, it, vi } from 'vitest'; -import { render, screen } from '@testing-library/react'; -import BannerDateTime from './BannerDateTime'; - -describe('BannerDateTime', () => { - it('renders the banner date and time', () => { - const rawDate = new Date('June 27, 2024 21:12:00'); - vi.setSystemTime(rawDate); - render(); - - const bannerTime = screen.getByTestId('current-time'); - expect(bannerTime.textContent).toBe('9:12 PM'); - - const bannerDate = screen.getByTestId('current-date'); - expect(bannerDate.textContent).toBe('Thu, Jun 27'); - }); -}); diff --git a/frontend/src/components/BannerDateTime/BannerDateTime.tsx b/frontend/src/components/BannerDateTime/BannerDateTime.tsx deleted file mode 100644 index e301bcfe1..000000000 --- a/frontend/src/components/BannerDateTime/BannerDateTime.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { ReactElement } from 'react'; -import useIsTabletViewport from '@hooks/useIsTabletViewport'; -import Box from '@ui/Box'; -import Typography from '@ui/Typography'; -import useDateTime from '../../hooks/useDateTime'; - -/** - * This component returns a UI that includes current time and date. - * Returns a banner with a date and time component, or null on tablet viewports. - * @returns {ReactElement | null} - the banner with a date and time component, or null on tablet viewports - */ -const BannerDateTime = (): ReactElement | null => { - const { date, time } = useDateTime(); - const isTablet = useIsTabletViewport(); - - if (isTablet) { - return null; - } - - return ( - ({ color: theme.palette.text.light })} - > - - {time} - - - - • - - - - {date} - - - ); -}; - -export default BannerDateTime; diff --git a/frontend/src/components/BannerDateTime/index.tsx b/frontend/src/components/BannerDateTime/index.tsx deleted file mode 100644 index b02695fd0..000000000 --- a/frontend/src/components/BannerDateTime/index.tsx +++ /dev/null @@ -1,3 +0,0 @@ -import BannerDateTime from './BannerDateTime'; - -export default BannerDateTime; diff --git a/frontend/src/components/BannerLinks/BannerLinks.spec.tsx b/frontend/src/components/BannerLinks/BannerLinks.spec.tsx deleted file mode 100644 index 8f0dd9279..000000000 --- a/frontend/src/components/BannerLinks/BannerLinks.spec.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import { render, screen } from '@testing-library/react'; -import { MemoryRouter } from 'react-router-dom'; -import BannerLinks from './BannerLinks'; - -describe('BannerLinks', () => { - it('renders the banner links component', () => { - render( - - - - ); - - const bannerLinks = screen.getByTestId('banner-links'); - expect(bannerLinks).toBeInTheDocument(); - }); -}); diff --git a/frontend/src/components/BannerLinks/BannerLinks.tsx b/frontend/src/components/BannerLinks/BannerLinks.tsx deleted file mode 100644 index fed2c95f8..000000000 --- a/frontend/src/components/BannerLinks/BannerLinks.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { ReactElement } from 'react'; -import Box from '@ui/Box'; -import GHRepoButton from '../GHRepoButton'; - -/** - * BannerLinks Component - * - * Component holding different icon-buttons. - * @returns {ReactElement} The BannerLinks component. - */ -const BannerLinks = (): ReactElement => { - return ( - - - - ); -}; - -export default BannerLinks; diff --git a/frontend/src/components/BannerLinks/index.tsx b/frontend/src/components/BannerLinks/index.tsx deleted file mode 100644 index 6adbefe2d..000000000 --- a/frontend/src/components/BannerLinks/index.tsx +++ /dev/null @@ -1,3 +0,0 @@ -import BannerLinks from './BannerLinks'; - -export default BannerLinks; diff --git a/frontend/src/components/BannerLogo/BannerLogo.tsx b/frontend/src/components/BannerLogo/BannerLogo.tsx index 868e31535..b081a16fa 100644 --- a/frontend/src/components/BannerLogo/BannerLogo.tsx +++ b/frontend/src/components/BannerLogo/BannerLogo.tsx @@ -21,8 +21,8 @@ const BannerLogo = (): ReactElement => { data-testid="banner-logo" sx={{ boxSizing: 'border-box', - ml: { xs: 1, md: 6 }, - mt: { xs: 2, md: 5 }, + ml: { xs: 1, md: 3 }, + mt: { xs: 2, md: 2 }, px: { xs: 2, md: 0 }, }} > diff --git a/frontend/src/components/Footer/Footer.spec.tsx b/frontend/src/components/Footer/Footer.spec.tsx new file mode 100644 index 000000000..f4f40a85f --- /dev/null +++ b/frontend/src/components/Footer/Footer.spec.tsx @@ -0,0 +1,17 @@ +import { describe, expect, it } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import { MemoryRouter } from 'react-router-dom'; +import Footer from './Footer'; + +describe('Footer', () => { + it('renders the footer content', () => { + render( + +