From 243c42e2af346719af36a49be9035ba8cbcf91f2 Mon Sep 17 00:00:00 2001 From: "mend-for-github-com[bot]" <50673670+mend-for-github-com[bot]@users.noreply.github.com> Date: Tue, 4 Aug 2026 14:15:20 +0000 Subject: [PATCH 1/2] Update dependency @astrojs/starlight to v0.37.7 --- tutorials/voice-javascript-workshop/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tutorials/voice-javascript-workshop/package-lock.json b/tutorials/voice-javascript-workshop/package-lock.json index 17c9f0c4..ce2b6dd1 100644 --- a/tutorials/voice-javascript-workshop/package-lock.json +++ b/tutorials/voice-javascript-workshop/package-lock.json @@ -134,9 +134,9 @@ } }, "node_modules/@astrojs/starlight": { - "version": "0.37.6", - "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.6.tgz", - "integrity": "sha512-wQrKwH431q+8FsLBnNQeG+R36TMtEGxTQ2AuiVpcx9APcazvL3n7wVW8mMmYyxX0POjTnxlcWPkdMGR3Yj1L+w==", + "version": "0.37.7", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.7.tgz", + "integrity": "sha512-KyBnou8aKIlPJUSNx6a1SN7XyH22oj/VAvTGC+Edld4Bnei1A//pmCRTBvSrSeoGrdUjK0ErFUfaEhhO1bPfDg==", "license": "MIT", "dependencies": { "@astrojs/markdown-remark": "^6.3.1", From 9ef30c05b8fbcd98827ed0b47f5ed1302d72788b Mon Sep 17 00:00:00 2001 From: "mend-for-github-com[bot]" <50673670+mend-for-github-com[bot]@users.noreply.github.com> Date: Tue, 4 Aug 2026 14:17:44 +0000 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=A4=96=20Auto-generate=20tutorial=20e?= =?UTF-8?q?nvironment=20[skip=20ci]:=20Update=20dependency=20@astrojs/star?= =?UTF-8?q?light=20to=20v0.37.7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../devcontainer.json | 61 + .../.astro/collections/docs.schema.json | 650 + .../.astro/content-assets.mjs | 1 + .../.astro/content-modules.mjs | 5 + .../.astro/content.d.ts | 227 + .../.astro/data-store.json | 1 + .../.astro/settings.json | 5 + .../.astro/types.d.ts | 2 + .../.vscode/extensions.json | 6 + .../.vscode/tasks.json | 21 + .../README.md | 9 + .../astro.config.mjs | 20 + .../download-toolbar.js | 40 + .../markdoc.config.mjs | 6 + .../package-lock.json | 7900 +++++++++ .../package.json | 22 + .../public/favicon.svg | 1 + .../setup-project.js | 1 + .../src/assets/houston.webp | Bin 0 -> 98506 bytes .../src/content.config.ts | 7 + .../src/content/docs/01_First_Step.md | 17 + .../src/content/docs/index.mdx | 7 + .../src/content/docs/reference.mdoc | 144 + .../src/env.d.ts | 2 + .../tsconfig.json | 3 + .../tutorial-config.json | 13 + .../vonage-toolbar/README.md | 6 + .../vonage-toolbar/app.ts | 470 + .../vonage-toolbar/integration.ts | 87 + .../vonage-toolbar/toolbar.png | Bin 0 -> 426515 bytes .../.astro/collections/docs.schema.json | 650 + .../.astro/content-assets.mjs | 1 + .../.astro/content-modules.mjs | 5 + .../.astro/content.d.ts | 227 + .../.astro/data-store.json | 1 + .../.astro/settings.json | 5 + .../.astro/types.d.ts | 2 + .../README.md | 21 + .../astro.config.mjs | 20 + .../download-toolbar.js | 40 + .../markdoc.config.mjs | 6 + .../package-lock.json | 8488 +++++++++ .../package.json | 27 + .../project/.clinerules | 1 + .../project/.cursorrules | 1 + .../project/.eslintignore | 15 + .../project/.eslintrc-filenames | 14 + .../.github/ISSUE_TEMPLATE/1-bug-report.yml | 72 + .../ISSUE_TEMPLATE/2-feature-request.yml | 31 + .../project/.github/ISSUE_TEMPLATE/config.yml | 5 + .../.github/actions/deploy-vcr/action.yml | 57 + .../actions/install-vcr-cli/action.yml | 13 + .../.github/actions/slack-notify/action.yml | 33 + .../project/.github/copilot-instructions.md | 1660 ++ .../instructions/test-files.instructions.md | 149 + .../project/.github/pull_request_template.md | 17 + .../.github/workflows/auto-set-base.yml | 32 + .../workflows/auto-update-dependencies.yml | 43 + .../workflows/check-pull-request-title.yml | 34 + .../.github/workflows/deploy-to-vcr.yml | 66 + .../project/.github/workflows/lint.yml | 84 + .../workflows/release-notification.yml | 35 + .../project/.github/workflows/run-tests.yml | 186 + .../workflows/vcr-deploy-on-comment.yml | 148 + .../workflows/vcr-remove-non-use-instance.yml | 91 + .../workflows/vcr-remove-on-comment.yml | 129 + .../project/.gitignore | 66 + .../project/.husky/pre-commit | 8 + .../project/.husky/pre-push | 8 + .../project/.nvmrc | 1 + .../project/.prettierignore | 20 + .../project/.prettierrc | 5 + .../project/.vcrignore | 2 + .../project/.vonage/catalog-info.yaml | 36 + .../project/.vonage/deploy/.gitkeep | 0 .../project/.vscode/extensions.json | 12 + .../project/.vscode/launch.json | 13 + .../.vscode/vera.contextStore.code-snippets | 53 + .../.vscode/vera.reactComponent.code-snippets | 20 + .../project/.windsurfrules | 1 + .../project/AGENTS.md | 1 + .../project/CLAUDE.md | 1 + .../project/CODEX.md | 1 + .../project/CODE_OF_CONDUCT.md | 85 + .../project/GEMINI.md | 1 + .../project/LICENSE | 201 + .../project/MAINTAINERS.md | 44 + .../project/README.md | 619 + .../project/backend/.env.example | 44 + .../project/backend/eslint.config.mjs | 12 + .../backend/helpers/__mocks__/config.ts | 18 + .../backend/helpers/blockCallsForArgs.ts | 26 + .../project/backend/helpers/config.ts | 80 + .../project/backend/helpers/delay.ts | 12 + .../getOrCreateSessionKeyFromRoomName.ts | 37 + .../helpers/getSessionKeyFromRoomName.ts | 16 + .../project/backend/helpers/index.ts | 4 + .../project/backend/index.ts | 3 + .../project/backend/jest.config.js | 41 + .../project/backend/jest/documentPolyfill.js | 15 + .../backend/jest/documentPolyfill.test.ts | 25 + .../project/backend/jest/setEnvVars.js | 14 + .../project/backend/jest/setEnvVars.test.ts | 68 + .../backend/middleware/errorHandler.ts | 84 + .../helmetMiddleware/helmetMiddleware.test.ts | 70 + .../helmetMiddleware/helmetMiddleware.ts | 82 + .../middleware/helmetMiddleware/index.ts | 1 + .../project/backend/middleware/index.ts | 3 + .../project/backend/middleware/isVcr.ts | 2 + .../backend/middleware/rateLimitMiddleware.ts | 37 + .../project/backend/package.json | 10 + .../project/backend/project.json | 97 + .../project/backend/routes/feedback.ts | 38 + .../project/backend/routes/health.ts | 9 + .../project/backend/routes/index.ts | 18 + .../project/backend/routes/logger.ts | 68 + .../project/backend/routes/session.ts | 153 + .../routes/video/VONAGE_HOOKS_CONCLUSIONS.md | 106 + .../routes/video/constants/createSession.ts | 14 + .../routes/video/constants/enableCaptions.ts | 20 + .../backend/routes/video/constants/index.ts | 4 + .../routes/video/constants/joinSession.ts | 17 + .../routes/video/constants/startArchive.ts | 21 + .../project/backend/routes/video/index.ts | 3 + .../schemas/ArchiveHookPayload.schema.ts | 52 + .../schemas/CaptionsHookPayload.schema.ts | 33 + .../video/schemas/CaptionsStatus.schema.ts | 7 + .../schemas/SessionHookPayload.schema.ts | 27 + .../backend/routes/video/schemas/index.ts | 4 + .../project/backend/routes/video/setup.ts | 85 + .../backend/routes/video/types/index.ts | 6 + .../project/backend/routes/video/video.ts | 182 + .../project/backend/routes/wellKnown.ts | 66 + .../project/backend/server.ts | 69 + .../backend/services/feedbackService.ts | 5 + .../backend/services/getFeedbackService.ts | 8 + .../backend/services/jiraFeedbackService.ts | 129 + .../project/backend/services/loggerService.ts | 111 + .../services/tests/feedbackService.test.ts | 22 + .../tests/jiraFeedbackService.test.ts | 219 + .../services/tests/loggerService.test.ts | 164 + .../tests/loggerServiceWarnOnce.test.ts | 72 + .../project/backend/sessionStorageService.ts | 19 + .../inMemorySessionStorage.test.ts | 107 + .../inMemorySessionStorage.ts | 113 + .../storage/inMemorySessionStorage/index.ts | 1 + .../project/backend/storage/sessionStorage.ts | 13 + .../backend/storage/vcrSessionStorage.ts | 121 + .../tests/apple-app-site-association.test.ts | 60 + .../project/backend/tests/assetlinks.test.ts | 63 + .../backend/tests/blockCallsForArgs.test.ts | 99 + .../backend/tests/errorHandler.test.ts | 128 + .../project/backend/tests/feedback.test.ts | 108 + .../project/backend/tests/health.test.ts | 25 + .../backend/tests/helpers/config.test.ts | 58 + .../project/backend/tests/logger.test.ts | 271 + .../project/backend/tests/session.test.ts | 398 + .../tests/sessionStorageService.test.ts | 31 + .../project/backend/tsconfig.app.json | 5 + .../project/backend/tsconfig.json | 25 + .../project/backend/tsconfig.spec.json | 16 + .../project/backend/types/config.ts | 32 + .../project/backend/types/feedback.ts | 15 + .../project/backend/types/opentok-jwt-d.ts | 3 + .../videoService/opentokVideoService.ts | 168 + .../tests/opentokVideoService.test.ts | 120 + .../tests/vonageVideoService.test.ts | 119 + .../videoService/videoServiceFactory.ts | 28 + .../videoService/videoServiceInterface.ts | 12 + .../videoService/vonageVideoService.ts | 107 + .../project/backend/webpack.config.cjs | 93 + .../project/customWordList.mjs | 32 + .../project/designTokens.example.json | 195 + .../project/designTokens.json | 195 + .../project/docs/CONTRIBUTING.md | 101 + .../project/docs/DEPENDENCIES.md | 67 + .../project/docs/KNOWN_ISSUES.md | 5 + .../project/docs/assets/Archiving.png | Bin 0 -> 907492 bytes .../project/docs/assets/BGEffects.png | Bin 0 -> 4857304 bytes .../project/docs/assets/DeviceSelector.png | Bin 0 -> 1003474 bytes .../project/docs/assets/Emojis.png | Bin 0 -> 1134902 bytes .../project/docs/assets/Goodbye.png | Bin 0 -> 762128 bytes .../project/docs/assets/MutingParticipant.png | Bin 0 -> 93202 bytes .../project/docs/assets/NoiseSupression.png | Bin 0 -> 287023 bytes .../project/docs/assets/ParticipantList.png | Bin 0 -> 984112 bytes .../project/docs/assets/ReportIssue.png | Bin 0 -> 948243 bytes .../project/docs/assets/WaitingRoom.png | Bin 0 -> 817095 bytes .../project/docs/assets/Welcome.png | Bin 0 -> 778801 bytes .../project/docs/assets/chrome.svg | 1 + .../project/docs/assets/edge.svg | 1 + .../project/docs/assets/electron.svg | 1 + .../project/docs/assets/ff.svg | 1 + .../project/docs/assets/opera.svg | 1 + .../docs/assets/project-architecture.svg | 1 + .../readme/1-dashboard-applications.png | Bin 0 -> 239938 bytes .../docs/assets/readme/2-create-app.png | Bin 0 -> 178523 bytes .../docs/assets/readme/3-create-app-form.png | Bin 0 -> 163160 bytes .../docs/assets/readme/4-forwarding.png | Bin 0 -> 160408 bytes .../project/docs/assets/safari.svg | 1 + .../project/eslint.config.mjs | 297 + .../project/frontend/.gitignore | 25 + .../project/frontend/.storybook/main.ts | 40 + .../project/frontend/.storybook/preview.tsx | 26 + .../project/frontend/eslint.config.mjs | 39 + .../project/frontend/index.html | 17 + .../project/frontend/package.json | 7 + .../project/frontend/project.json | 134 + .../project/frontend/public/assets/sound.mp3 | Bin 0 -> 733645 bytes .../public/background/bookshelf-room.jpg | Bin 0 -> 331555 bytes .../frontend/public/background/busy-room.jpg | Bin 0 -> 127590 bytes .../frontend/public/background/dune-view.jpg | Bin 0 -> 120435 bytes .../frontend/public/background/hogwarts.jpg | Bin 0 -> 204172 bytes .../frontend/public/background/library.jpg | Bin 0 -> 234973 bytes .../frontend/public/background/new-york.jpg | Bin 0 -> 215616 bytes .../frontend/public/background/plane.jpg | Bin 0 -> 174408 bytes .../frontend/public/background/white-room.jpg | Bin 0 -> 151891 bytes .../public/images/access-dialog-pending.png | Bin 0 -> 21458 bytes .../public/images/access-dialog-rejected.png | Bin 0 -> 17744 bytes .../frontend/public/images/favicon.ico | Bin 0 -> 4849 bytes .../public/images/vonage-logo-desktop.svg | 72 + .../public/images/vonage-logo-mobile.svg | 1 + .../project/frontend/src/App.spec.tsx | 35 + .../project/frontend/src/App.tsx | 100 + .../frontend/src/AppContextProvider.tsx | 15 + .../AdvancedSettings/AdvancedSettings.tsx | 185 + .../src/Context/AdvancedSettings/index.ts | 2 + .../BackgroundEffectsDialogContext.tsx | 27 + .../Context/BackgroundEffectsDialog/index.ts | 1 + .../BackgroundPublisherProvider/index.tsx | 31 + .../useBackgroundPublisher/index.tsx | 3 + .../useBackgroundPublisher.spec.tsx | 269 + .../useBackgroundPublisher.tsx | 320 + .../LoggerSynchronizer.spec.tsx | 99 + .../LoggerSynchronizer/LoggerSynchronizer.tsx | 21 + .../src/Context/LoggerSynchronizer/index.tsx | 1 + .../PrecallNetworkTestDialogContext.tsx | 27 + .../Context/PrecallNetworkTestDialog/index.ts | 1 + .../PreviewPublisherProvider/index.tsx | 29 + .../usePreviewPublisher/index.tsx | 3 + .../usePreviewPublisher.spec.tsx | 241 + .../usePreviewPublisher.tsx | 296 + .../PublisherProvider/PublisherProvider.tsx | 30 + .../src/Context/PublisherProvider/index.tsx | 1 + .../applyAdvancedSettingsToPublisher.spec.ts | 110 + .../applyAdvancedSettingsToPublisher.ts | 101 + .../useApplyAdvancedSettings/index.ts | 2 + .../useApplyAdvancedSettings.spec.tsx | 92 + .../useApplyAdvancedSettings.tsx | 21 + .../hooks/useSyncPublisherDevices/index.ts | 1 + .../useSyncPublisherDevices.ts | 76 + .../PublisherProvider/usePublisher/index.tsx | 3 + .../usePublisher/usePublisher.spec.tsx | 633 + .../usePublisher/usePublisher.tsx | 506 + .../usePublisherOptions/index.tsx | 3 + .../usePublisherOptions.spec.tsx | 295 + .../usePublisherOptions.tsx | 108 + .../usePublisherQuality/index.tsx | 3 + .../usePublisherQuality.spec.tsx | 61 + .../usePublisherQuality.tsx | 56 + .../frontend/src/Context/RoomProvider.tsx | 13 + .../Context/SessionProvider/session.spec.tsx | 516 + .../src/Context/SessionProvider/session.tsx | 639 + .../src/Context/tests/RoomContext.spec.tsx | 117 + .../frontend/src/Context/tests/user.spec.tsx | 74 + .../project/frontend/src/Context/user.tsx | 86 + .../frontend/src/VeraRoom/VeraRoom.spec.tsx | 52 + .../src/VeraRoom/VeraRoom.stories.tsx | 121 + .../frontend/src/VeraRoom/VeraRoom.tsx | 79 + .../src/VeraRoom/VeraRoomElement.spec.tsx | 132 + .../frontend/src/VeraRoom/VeraRoomElement.tsx | 157 + .../src/VeraRoom/example/Example.spec.tsx | 33 + .../frontend/src/VeraRoom/example/Example.tsx | 97 + .../frontend/src/VeraRoom/example/index.css | 3 + .../frontend/src/VeraRoom/example/index.html | 17 + .../frontend/src/VeraRoom/example/main.tsx | 10 + .../VeraRoom/example/vite.example.config.ts | 37 + .../VeraRoom/hooks/useStateSynchronizer.ts | 52 + .../project/frontend/src/VeraRoom/index.ts | 5 + .../providers/ShadowStylesProvider.tsx | 51 + .../frontend/src/VeraRoom/providers/index.ts | 1 + .../stages/GoodByeStage/GoodByeStage.spec.tsx | 106 + .../stages/GoodByeStage/GoodByeStage.tsx | 49 + .../src/VeraRoom/stages/GoodByeStage/index.ts | 1 + .../MeetingRoomStage.spec.tsx | 62 + .../MeetingRoomStage/MeetingRoomStage.tsx | 19 + .../VeraRoom/stages/MeetingRoomStage/index.ts | 1 + .../WaitingRoomStage.spec.tsx | 147 + .../WaitingRoomStage/WaitingRoomStage.tsx | 128 + .../VeraRoom/stages/WaitingRoomStage/index.ts | 1 + .../src/VeraRoom/stores/bridge/bridge$.ts | 26 + .../bridge/constants/bridgeAttributes.ts | 3 + .../bridge/constants/bridgeAttributesMap.ts | 33 + .../VeraRoom/stores/bridge/constants/index.ts | 4 + .../stores/bridge/constants/initialState.ts | 18 + .../stores/bridge/constants/metadata.ts | 7 + .../src/VeraRoom/stores/bridge/index.ts | 4 + .../bridge/schemas/BridgeAttribute.schema.ts | 15 + .../VeraRoom/stores/bridge/schemas/index.ts | 1 + .../VeraRoom/stores/bridge/types/BridgeAPI.ts | 3 + .../stores/bridge/types/BridgeAttribute.ts | 5 + .../bridge/types/BridgeAttributeMeta.ts | 26 + .../bridge/types/BridgeAttributeType.ts | 3 + .../src/VeraRoom/stores/bridge/types/index.ts | 4 + .../frontend/src/VeraRoom/stores/index.ts | 1 + .../project/frontend/src/VeraRoom/styles.css | 36 + .../src/VeraRoom/vite.veraroom.config.ts | 35 + .../archiving/getArchives/getArchives.spec.ts | 76 + .../api/archiving/getArchives/getArchives.ts | 45 + .../src/api/archiving/getArchives/index.ts | 1 + .../frontend/src/api/archiving/index.ts | 1 + .../frontend/src/api/archiving/model.ts | 76 + .../frontend/src/api/archiving/tests/data.ts | 110 + .../src/api/archiving/tests/index.spec.ts | 76 + .../src/api/archiving/tests/model.spec.ts | 99 + .../frontend/src/api/fetchCredentials.ts | 21 + .../frontend/src/api/reportFeedback.ts | 28 + .../AdvancedSettings/Dialog/index.tsx | 1 + .../AdvancedSettingsDialog.spec.tsx | 74 + .../AdvancedSettingsDialog.tsx | 67 + .../AdvancedSettingsAudioTab.spec.tsx | 69 + .../AdvancedSettingsAudioTab.tsx | 127 + .../AdvancedSettingsAudioTab/index.tsx | 1 + ...dvancedSettingsCodecPriorityField.spec.tsx | 40 + .../AdvancedSettingsCodecPriorityField.tsx | 139 + .../index.tsx | 1 + ...edSettingsCustomVideoBitrateField.spec.tsx | 51 + ...dvancedSettingsCustomVideoBitrateField.tsx | 87 + .../index.tsx | 1 + .../AdvancedSettingsGeneralTab.spec.tsx | 13 + .../AdvancedSettingsGeneralTab.tsx | 27 + .../AdvancedSettingsGeneralTab/index.tsx | 1 + .../AdvancedSettingsSidebar.spec.tsx | 29 + .../AdvancedSettingsSidebar.tsx | 41 + .../AdvancedSettingsSidebar/index.tsx | 1 + .../AdvancedSettingsStatisticsGroup.spec.tsx | 21 + .../AdvancedSettingsStatisticsGroup.tsx | 89 + .../AdvancedSettingsStatisticsGroup/index.tsx | 1 + .../AdvancedSettingsStatisticsTab.spec.tsx | 161 + .../AdvancedSettingsStatisticsTab.tsx | 55 + .../components/PublisherStatistics.tsx | 117 + .../components/SubscriberStatistics.tsx | 110 + .../AdvancedSettingsStatisticsTab/index.tsx | 1 + .../AdvancedSettingsVideoTab.spec.tsx | 54 + .../AdvancedSettingsVideoTab.tsx | 135 + .../AdvancedSettingsVideoTab/index.tsx | 1 + .../useAdvancedSettingsVideoHandlers.spec.ts | 283 + .../useAdvancedSettingsVideoHandlers.ts | 89 + .../AdvancedSettingsDialog/index.tsx | 1 + .../AdvancedSettingsDialog/types/types.ts | 49 + .../AvatarInitials/AvatarInitials.spec.tsx | 23 + .../AvatarInitials/AvatarInitials.tsx | 56 + .../src/components/AvatarInitials/index.tsx | 3 + .../AddBackgroundEffectLayout.spec.tsx | 87 + .../AddBackgroundEffectLayout.tsx | 115 + .../AddBackgroundEffectLayout/Index.tsx | 3 + .../BackgroundEffectOptions.spec.tsx | 60 + .../BackgroundEffectOptions.tsx | 63 + .../BackgroundEffectOptions/Index.tsx | 1 + .../BackgroundEffectsLayout.spec.tsx | 194 + .../BackgroundEffectsLayout.tsx | 165 + .../BackgroundEffectsLayout/index.tsx | 3 + .../BackgroundGallery.spec.tsx | 210 + .../BackgroundGallery/BackgroundGallery.tsx | 118 + .../BackgroundGallery/Index.tsx | 3 + .../BackgroundVideoContainer.spec.tsx | 36 + .../BackgroundVideoContainer.tsx | 123 + .../BackgroundVideoContainer/index.tsx | 3 + .../EffectOptionButtons.spec.tsx | 125 + .../EffectOptionButtons.tsx | 57 + .../EffectOptionButtons/Index.tsx | 3 + .../SelectableOption.spec.tsx | 83 + .../SelectableOption/SelectableOption.tsx | 104 + .../SelectableOption/index.tsx | 3 + .../src/components/Banner/Banner.spec.tsx | 17 + .../frontend/src/components/Banner/Banner.tsx | 34 + .../frontend/src/components/Banner/index.tsx | 3 + .../BannerLanguage/BannerLanguage.spec.tsx | 17 + .../BannerLanguage/BannerLanguage.tsx | 21 + .../src/components/BannerLanguage/index.tsx | 3 + .../components/BannerLogo/BannerLogo.spec.tsx | 30 + .../src/components/BannerLogo/BannerLogo.tsx | 45 + .../src/components/BannerLogo/index.tsx | 3 + .../DeviceAccessAlert.spec.tsx | 63 + .../DeviceAccessAlert/DeviceAccessAlert.tsx | 77 + .../components/DeviceAccessAlert/index.tsx | 3 + .../src/components/EnvGuard/EnvGuard.tsx | 16 + .../frontend/src/components/EnvGuard/index.ts | 3 + .../ErrorBoundary/ErrorBoundary.tsx | 38 + .../src/components/ErrorBoundary/index.ts | 3 + .../src/components/Footer/Footer.spec.tsx | 17 + .../frontend/src/components/Footer/Footer.tsx | 25 + .../frontend/src/components/Footer/index.tsx | 3 + .../FooterLinks/FooterLinks.spec.tsx | 29 + .../components/FooterLinks/FooterLinks.tsx | 34 + .../src/components/FooterLinks/index.tsx | 3 + .../GHRepoButton/GHRepoButton.spec.tsx | 32 + .../components/GHRepoButton/GHRepoButton.tsx | 32 + .../src/components/GHRepoButton/index.tsx | 3 + .../GoodBye/ArchiveList/ArchiveList.spec.tsx | 45 + .../GoodBye/ArchiveList/ArchiveList.tsx | 194 + .../components/GoodBye/ArchiveList/index.tsx | 3 + .../GoToLandingPageButton.spec.tsx | 20 + .../GoToLandingPageButton.tsx | 26 + .../GoodBye/GoToLandingPageButton/index.tsx | 3 + .../GoodbyeMessage/GoodbyeMessage.spec.tsx | 46 + .../GoodBye/GoodbyeMessage/GoodbyeMessage.tsx | 54 + .../GoodBye/GoodbyeMessage/index.tsx | 3 + .../ReenterRoomButton.spec.tsx | 46 + .../ReenterRoomButton/ReenterRoomButton.tsx | 43 + .../GoodBye/ReenterRoomButton/index.tsx | 3 + .../HiddenParticipantsTile.spec.tsx | 140 + .../HiddenParticipantsTile.tsx | 78 + .../HiddenParticipantsTile/index.tsx | 3 + .../PushPinOffIcon/PushPinOffIcon.spec.tsx | 11 + .../Icons/PushPinOffIcon/PushPinOffIcon.tsx | 29 + .../components/Icons/PushPinOffIcon/index.tsx | 3 + .../JoinContainerSeparator.spec.tsx | 14 + .../JoinContainerSeparator.tsx | 26 + .../JoinContainerSeparator/index.tsx | 3 + .../JoinExistingRoom.spec.tsx | 23 + .../JoinExistingRoom/JoinExistingRoom.tsx | 29 + .../src/components/JoinExistingRoom/index.tsx | 3 + .../JoinWaitRoomButton.spec.tsx | 67 + .../JoinWaitRoomButton/JoinWaitRoomButton.tsx | 55 + .../components/JoinWaitRoomButton/index.tsx | 3 + .../LandingPageWelcome.spec.tsx | 14 + .../LandingPageWelcome/LandingPageWelcome.tsx | 79 + .../components/LandingPageWelcome/index.tsx | 3 + .../LanguageSelector.spec.tsx | 416 + .../LanguageSelector/LanguageSelector.tsx | 103 + .../LanguageSelector.types.tsx | 11 + .../src/components/LanguageSelector/index.tsx | 3 + .../AdvancedSettingsButton.spec.tsx | 26 + .../AdvancedSettingsButton.tsx | 54 + .../AdvancedSettingsButton/index.tsx | 3 + .../ArchivingButton/ArchivingButton.spec.tsx | 134 + .../ArchivingButton/ArchivingButton.tsx | 134 + .../MeetingRoom/ArchivingButton/index.tsx | 3 + .../AudioIndicator/AudioIndicator.spec.tsx | 82 + .../AudioIndicator/AudioIndicator.tsx | 120 + .../MeetingRoom/AudioIndicator/index.tsx | 3 + .../CaptionsBox/CaptionsBox.spec.tsx | 52 + .../CaptionsBox/CaptionsBox.tsx | 59 + .../UserCaption/UserCaption.spec.tsx | 76 + .../CaptionsBox/UserCaption/UserCaption.tsx | 84 + .../CaptionsBox/UserCaption/index.tsx | 3 + .../CaptionsButton/CaptionsBox/index.tsx | 3 + .../CaptionsButton/CaptionsButton.spec.tsx | 112 + .../CaptionsButton/CaptionsButton.tsx | 124 + .../MeetingRoom/CaptionsButton/index.tsx | 3 + .../CaptionsError/CaptionsError.spec.tsx | 34 + .../CaptionsError/CaptionsError.tsx | 49 + .../MeetingRoom/CaptionsError/index.tsx | 3 + .../components/MeetingRoom/Chat/Chat.spec.tsx | 80 + .../src/components/MeetingRoom/Chat/Chat.tsx | 72 + .../src/components/MeetingRoom/Chat/index.tsx | 3 + .../ChatButton/ChatButton.spec.tsx | 76 + .../MeetingRoom/ChatButton/ChatButton.tsx | 62 + .../MeetingRoom/ChatButton/index.tsx | 3 + .../MeetingRoom/ChatInput/ChatInput.spec.tsx | 151 + .../MeetingRoom/ChatInput/ChatInput.tsx | 94 + .../MeetingRoom/ChatInput/index.tsx | 3 + .../MeetingRoom/ChatMessage/ChatMessage.tsx | 92 + .../MeetingRoom/ChatMessage/index.tsx | 3 + .../DeviceControlButton.spec.tsx | 195 + .../DeviceControlButton.tsx | 210 + .../MeetingRoom/DeviceControlButton/index.tsx | 3 + .../DeviceSettingsMenu.spec.tsx | 375 + .../DeviceSettingsMenu/DeviceSettingsMenu.tsx | 139 + .../MeetingRoom/DeviceSettingsMenu/index.tsx | 3 + .../DropdownSeparator/DropdownSeparator.tsx | 23 + .../MeetingRoom/DropdownSeparator/index.tsx | 3 + .../MeetingRoom/Emoji/Emoji.spec.tsx | 36 + .../components/MeetingRoom/Emoji/Emoji.tsx | 57 + .../components/MeetingRoom/Emoji/index.tsx | 3 + .../MeetingRoom/EmojiGrid/EmojiGrid.spec.tsx | 89 + .../MeetingRoom/EmojiGrid/EmojiGrid.tsx | 119 + .../MeetingRoom/EmojiGrid/index.tsx | 3 + .../EmojiGridButton/EmojiGridButton.spec.tsx | 68 + .../EmojiGridButton/EmojiGridButton.tsx | 74 + .../MeetingRoom/EmojiGridButton/index.tsx | 3 + .../MeetingRoom/EmojisOrigin/EmojisOrigin.tsx | 23 + .../MeetingRoom/EmojisOrigin/index.tsx | 3 + .../MeetingRoom/ExitButton/ExitButton.tsx | 52 + .../MeetingRoom/ExitButton/index.tsx | 3 + .../FormattedMessageBody.spec.tsx | 108 + .../FormattedMessageBody.tsx | 58 + .../FormattedMessageBody/index.tsx | 3 + .../InputAudioDevices.spec.tsx | 203 + .../InputAudioDevices/InputAudioDevices.tsx | 135 + .../MeetingRoom/InputAudioDevices/index.tsx | 3 + .../LayoutButton/LayoutButton.spec.tsx | 194 + .../MeetingRoom/LayoutButton/LayoutButton.tsx | 94 + .../MeetingRoom/LayoutButton/index.tsx | 3 + .../MutingDialog/MutingDialog.spec.tsx | 100 + .../MeetingRoom/MutingDialog/MutingDialog.tsx | 75 + .../MeetingRoom/MutingDialog/index.tsx | 3 + .../MeetingRoom/NameDisplay/NameDisplay.tsx | 32 + .../MeetingRoom/NameDisplay/index.tsx | 3 + .../OutputAudioDevices/OutputAudioDevices.tsx | 152 + .../OutputAudioDevices/OutputDevices.spec.tsx | 157 + .../MeetingRoom/OutputAudioDevices/index.tsx | 3 + .../MeetingRoom/ParticipantList/Index.tsx | 3 + .../ParticipantList/ParticipantList.spec.tsx | 288 + .../ParticipantList/ParticipantList.tsx | 193 + .../ParticipantListButton.tsx | 75 + .../ParticipantsListButton.spec.tsx | 38 + .../ParticipantListButton/index.tsx | 3 + .../ParticipantListItem.spec.tsx | 128 + .../ParticipantListItem.tsx | 108 + .../MeetingRoom/ParticipantListItem/index.tsx | 3 + .../ParticipantListItemMenu.spec.tsx | 150 + .../ParticipantListItemMenu.tsx | 73 + .../ParticipantPinMenuItem.tsx | 87 + .../ParticipantListItemMenu/index.tsx | 3 + .../MeetingRoom/PinButton/PinButton.tsx | 124 + .../MeetingRoom/PinButton/index.tsx | 3 + .../PopupAlert/PopupAlert.spec.tsx | 45 + .../MeetingRoom/PopupAlert/PopupAlert.tsx | 85 + .../MeetingRoom/PopupAlert/index.tsx | 3 + .../PopupDialog/PopupDialog.spec.tsx | 65 + .../MeetingRoom/PopupDialog/PopupDialog.tsx | 62 + .../MeetingRoom/PopupDialog/index.tsx | 4 + .../RecordingIndicator.spec.tsx | 32 + .../RecordingIndicator/RecordingIndicator.tsx | 43 + .../MeetingRoom/RecordingIndicator/index.tsx | 3 + .../RecordingPopupIndicator.spec.tsx | 125 + .../RecordingPopupIndicator.tsx | 70 + .../RecordingPopupIndicator/index.tsx | 3 + .../ReduceNoiseTestSpeakers.spec.tsx | 156 + .../ReduceNoiseTestSpeakers.tsx | 104 + .../ReduceNoiseTestSpeakers/index.tsx | 3 + .../FeedbackForm/FeedbackForm.spec.tsx | 260 + .../ReportIssue/FeedbackForm/FeedbackForm.tsx | 238 + .../FilePicker/FilePicker.spec.tsx | 127 + .../FeedbackForm/FilePicker/FilePicker.tsx | 182 + .../FeedbackForm/FilePicker/index.tsx | 3 + .../HelperText/HelperText.spec.tsx | 54 + .../FeedbackForm/HelperText/HelperText.tsx | 64 + .../FeedbackForm/HelperText/index.tsx | 3 + .../ReportIssue/FeedbackForm/index.tsx | 3 + .../FormSubmitted/FormSubmitted.spec.tsx | 52 + .../FormSubmitted/FormSubmitted.tsx | 124 + .../ReportIssue/FormSubmitted/index.tsx | 3 + .../ReportIssue/ReportIssue.spec.tsx | 83 + .../MeetingRoom/ReportIssue/ReportIssue.tsx | 176 + .../MeetingRoom/ReportIssue/index.tsx | 3 + .../ReportIssueButton.spec.tsx | 27 + .../ReportIssueButton/ReportIssueButton.tsx | 57 + .../MeetingRoom/ReportIssueButton/index.tsx | 3 + .../MeetingRoom/RightPanel/RightPanel.tsx | 67 + .../RightPanel/RightPanelTitle.tsx | 51 + .../MeetingRoom/RightPanel/index.tsx | 3 + .../ScreenSharePublisher.spec.tsx | 64 + .../ScreenSharePublisher.tsx | 67 + .../ScreenSharePublisher/index.tsx | 3 + .../ScreenshareVideoTile.spec.tsx | 423 + .../ScreenshareVideoTile.tsx | 232 + .../ScreenshareVideoTile/index.tsx | 3 + .../SendEmojiButton/SendEmojiButton.tsx | 37 + .../MeetingRoom/SendEmojiButton/index.tsx | 3 + .../SmallViewportHeader.spec.tsx | 233 + .../SmallViewportHeader.tsx | 97 + .../SmallViewportHeader/hooks/index.ts | 1 + .../useSwitchCameraFacingModeHandler.spec.ts | 74 + .../hooks/useSwitchCameraFacingModeHandler.ts | 120 + .../MeetingRoom/SmallViewportHeader/index.tsx | 3 + .../MeetingRoom/TimeRoomName/TimeRoomName.tsx | 32 + .../MeetingRoom/TimeRoomName/index.tsx | 3 + .../MeetingRoom/Toolbar/Toolbar.spec.tsx | 140 + .../MeetingRoom/Toolbar/Toolbar.tsx | 231 + .../components/MeetingRoom/Toolbar/index.tsx | 3 + .../ToolbarButton/ToolbarButton.tsx | 51 + .../MeetingRoom/ToolbarButton/index.tsx | 3 + .../ToolbarOverflowButton.spec.tsx | 106 + .../ToolbarOverflowButton.tsx | 99 + .../ToolbarOverflowButton/index.tsx | 3 + .../ToolbarOverflowMenu.spec.tsx | 146 + .../ToolbarOverflowMenu.tsx | 168 + .../MeetingRoom/ToolbarOverflowMenu/index.tsx | 3 + .../UnreadMessagesBadge.spec.tsx | 229 + .../UnreadMessagesBadge.tsx | 47 + .../MeetingRoom/UnreadMessagesBadge/index.tsx | 3 + .../VideoDevices/VideoDevices.spec.tsx | 160 + .../MeetingRoom/VideoDevices/VideoDevices.tsx | 139 + .../MeetingRoom/VideoDevices/index.tsx | 3 + .../VideoDevicesOptions.spec.tsx | 39 + .../VideoDevicesOptions.tsx | 43 + .../MeetingRoom/VideoDevicesOptions/index.tsx | 3 + .../MeetingRoom/VideoTile/VideoTile.spec.tsx | 92 + .../MeetingRoom/VideoTile/VideoTile.tsx | 107 + .../MeetingRoom/VideoTile/index.tsx | 3 + .../VideoTileCanvas/VideoTileCanvas.spec.tsx | 49 + .../VideoTileCanvas/VideoTileCanvas.tsx | 168 + .../MeetingRoom/VideoTileCanvas/index.tsx | 3 + .../VoiceIndicator/VoiceIndicator.tsx | 77 + .../MeetingRoom/VoiceIndicator/index.tsx | 3 + .../ZoomIndicator/ZoomIndicator.spec.tsx | 213 + .../ZoomIndicator/ZoomIndicator.tsx | 168 + .../MeetingRoom/ZoomIndicator/index.tsx | 3 + .../src/components/MutedAlert/MutedAlert.tsx | 53 + .../src/components/MutedAlert/index.tsx | 3 + .../NewRoomButton/NewRoomButton.spec.tsx | 26 + .../NewRoomButton/NewRoomButton.tsx | 36 + .../src/components/NewRoomButton/index.tsx | 3 + .../src/components/Publisher/Publisher.tsx | 103 + .../src/components/Publisher/index.tsx | 3 + .../RedirectToUnsupportedBrowserPage.spec.tsx | 51 + .../RedirectToUnsupportedBrowserPage.tsx | 17 + .../index.tsx | 3 + .../RedirectToWaitingRoom.spec.tsx | 108 + .../RedirectToWaitingRoom.tsx | 39 + .../RedirectToWaitingRoom/index.tsx | 3 + .../RoomJoinContainer.spec.tsx | 73 + .../RoomJoinContainer/RoomJoinContainer.tsx | 48 + .../components/RoomJoinContainer/index.tsx | 3 + .../RoomNameInput/RoomNameInput.spec.tsx | 126 + .../RoomNameInput/RoomNameInput.tsx | 66 + .../src/components/RoomNameInput/index.tsx | 3 + .../ScreenShareNameDisplay.tsx | 32 + .../ScreenShareNameDisplay/index.tsx | 3 + .../ScreenSharingButton.spec.tsx | 66 + .../ScreenSharingButton.tsx | 108 + .../components/ScreenSharingButton/index.tsx | 3 + .../components/Separator/Separator.spec.tsx | 12 + .../src/components/Separator/Separator.tsx | 32 + .../src/components/Separator/index.tsx | 3 + .../components/SoundTest/SoundTest.spec.tsx | 161 + .../src/components/SoundTest/SoundTest.tsx | 74 + .../src/components/SoundTest/index.tsx | 3 + .../components/Subscriber/Subscriber.spec.tsx | 159 + .../src/components/Subscriber/Subscriber.tsx | 162 + .../src/components/Subscriber/index.tsx | 3 + .../SupportedBrowserListItem.tsx | 60 + .../SupportedBrowserListItem/index.tsx | 3 + .../SupportedBrowsers/SupportedBrowsers.tsx | 43 + .../SupportedBrowsers/index.tsx | 3 + .../UnsupportedBrowserMessage.tsx | 50 + .../UnsupportedBrowserMessage/index.tsx | 3 + .../src/components/VividIcon/VividIcon.tsx | 3 + .../BackgroundEffectsButton.spec.tsx | 65 + .../BackgroundEffectsButton.tsx | 64 + .../BackgroundEffectsButton/index.tsx | 3 + .../BackgroundEffectsDialog.spec.tsx | 107 + .../BackgroundEffectsDialog.tsx | 71 + .../BackgroundEffectsDialog/index.tsx | 3 + .../CameraButton/CameraButton.spec.tsx | 183 + .../WaitingRoom/CameraButton/CameraButton.tsx | 90 + .../WaitingRoom/CameraButton/index.tsx | 3 + .../ControlPanel/ControlPanel.spec.tsx | 191 + .../WaitingRoom/ControlPanel/ControlPanel.tsx | 187 + .../WaitingRoom/ControlPanel/index.tsx | 3 + .../MenuDevices/MenuDevices.spec.tsx | 203 + .../WaitingRoom/MenuDevices/MenuDevices.tsx | 105 + .../WaitingRoom/MenuDevices/index.tsx | 3 + .../MenuMoreOptions/MenuMoreOptions.spec.tsx | 162 + .../MenuMoreOptions/MenuMoreOptions.tsx | 173 + .../WaitingRoom/MenuMoreOptions/index.tsx | 3 + .../WaitingRoom/MicButton/MicButton.spec.tsx | 128 + .../WaitingRoom/MicButton/MicButton.tsx | 84 + .../WaitingRoom/MicButton/index.tsx | 3 + .../DialogActionsRow.spec.tsx | 40 + .../DialogActionsRow/DialogActionsRow.tsx | 64 + .../DialogActionsRow/index.ts | 2 + .../PrecallNetworkTestDialog.spec.tsx | 330 + .../PrecallNetworkTestDialog.tsx | 289 + .../PrecallNetworkTestQualityRow.spec.tsx | 45 + .../PrecallNetworkTestQualityRow.tsx | 80 + .../PrecallNetworkTestQualityRow/index.ts | 1 + .../hooks/useNetworkTest.spec.tsx | 245 + .../hooks/useNetworkTest.tsx | 235 + .../PrecallNetworkTestDialog/index.tsx | 3 + .../PreviewAvatar/PreviewAvatar.spec.tsx | 68 + .../PreviewAvatar/PreviewAvatar.tsx | 66 + .../WaitingRoom/PreviewAvatar/index.tsx | 3 + .../UserNameInput.skeleton.spec.tsx | 10 + .../UserNameInput/UserNameInput.skeleton.tsx | 37 + .../UserNameInput/UserNameInput.tsx | 140 + .../WaitingRoom/UserNameInput/index.tsx | 3 + .../VideoContainer.skeleton.spec.tsx | 10 + .../VideoContainer.skeleton.tsx | 43 + .../VideoContainer/VideoContainer.tsx | 136 + .../WaitingRoom/VideoContainer/index.tsx | 3 + .../VideoContainerButton.tsx | 41 + .../VideoContainerButton/index.tsx | 3 + .../VideoLoading/VideoLoading.spec.tsx | 15 + .../WaitingRoom/VideoLoading/VideoLoading.tsx | 35 + .../WaitingRoom/VideoLoading/index.tsx | 3 + .../VideoStatsOverlay.spec.tsx | 109 + .../VideoStatsOverlay/VideoStatsOverlay.tsx | 30 + .../WaitingRoom/VideoStatsOverlay/index.tsx | 1 + .../VignetteEffect/VignetteEffect.tsx | 26 + .../WaitingRoom/VignetteEffect/index.tsx | 3 + .../project/frontend/src/components/index.ts | 29 + .../project/frontend/src/css/App.css | 158 + .../project/frontend/src/css/index.css | 38 + .../project/frontend/src/env.ts | 247 + .../src/hooks/tests/useAudioLevels.spec.tsx | 116 + .../frontend/src/hooks/tests/useChat.spec.tsx | 63 + .../useCollectBrowserInformation.spec.tsx | 102 + .../src/hooks/tests/useDateTime.spec.tsx | 29 + .../tests/useDropdownResizeObserver.spec.tsx | 66 + .../hooks/tests/useElementDimensions.spec.tsx | 32 + .../src/hooks/tests/useEmoji.spec.tsx | 146 + .../src/hooks/tests/useGoodByePage.spec.tsx | 133 + .../hooks/tests/useIsSmallViewport.spec.tsx | 47 + .../hooks/tests/useIsTabletViewport.spec.tsx | 46 + .../src/hooks/tests/useLayoutManager.spec.tsx | 44 + .../src/hooks/tests/useMeetingRoom.spec.tsx | 198 + .../src/hooks/tests/usePushToTalk.spec.tsx | 150 + .../hooks/tests/useReceivingCaptions.spec.tsx | 84 + .../src/hooks/tests/useRightPannel.spec.tsx | 93 + .../src/hooks/tests/useRoomShareUrl.spec.tsx | 29 + .../src/hooks/tests/useScreenShare.spec.tsx | 314 + .../hooks/tests/useToolbarButtons.spec.tsx | 187 + .../src/hooks/tests/useWaitingRoom.spec.tsx | 216 + .../src/hooks/tests/useWindowWidth.spec.tsx | 41 + .../frontend/src/hooks/useActiveSpeaker.tsx | 12 + .../frontend/src/hooks/useArchives.tsx | 56 + .../frontend/src/hooks/useAudioLevels.tsx | 68 + .../hooks/useBackgroundPublisherContext.tsx | 16 + .../project/frontend/src/hooks/useChat.tsx | 77 + .../hooks/useCollectBrowserInformation.tsx | 44 + .../frontend/src/hooks/useDateTime.tsx | 55 + .../src/hooks/useDecodedSessionKey.ts | 34 + .../src/hooks/useDropdownResizeObserver.tsx | 37 + .../src/hooks/useElementDimensions.tsx | 42 + .../project/frontend/src/hooks/useEmoji.tsx | 130 + .../frontend/src/hooks/useGoodByePage.ts | 36 + .../frontend/src/hooks/useIsSmallViewport.tsx | 14 + .../src/hooks/useIsTabletViewport.tsx | 14 + .../frontend/src/hooks/useLayoutManager.tsx | 20 + .../frontend/src/hooks/useMeetingRoom.ts | 290 + .../frontend/src/hooks/usePermissions.tsx | 53 + .../src/hooks/usePreviewPublisherContext.tsx | 16 + .../src/hooks/usePublisherContext.tsx | 13 + .../frontend/src/hooks/usePushToTalk.tsx | 75 + .../src/hooks/useReceivingCaptions.tsx | 63 + .../frontend/src/hooks/useRightPanel.tsx | 124 + .../frontend/src/hooks/useRoomShareUrl.tsx | 12 + .../frontend/src/hooks/useScreenShare.tsx | 149 + .../src/hooks/useSelectDeviceHandler/index.ts | 1 + .../useSelectDeviceHandler.test.ts | 33 + .../useSelectDeviceHandler.ts | 53 + .../frontend/src/hooks/useSessionContext.tsx | 13 + .../frontend/src/hooks/useSessionKeyParam.ts | 42 + .../src/hooks/useSpeakingDetector.tsx | 60 + .../src/hooks/useSubscriberTalking.tsx | 67 + .../hooks/useSubscribersInDisplayOrder.tsx | 21 + .../frontend/src/hooks/useToolbarButtons.tsx | 131 + .../frontend/src/hooks/useUserContext.tsx | 16 + .../frontend/src/hooks/useWaitingRoom.ts | 104 + .../frontend/src/hooks/useWindowWidth.tsx | 20 + .../project/frontend/src/i18n.ts | 23 + .../project/frontend/src/index.d.ts | 33 + .../project/frontend/src/locales/de.json | 312 + .../project/frontend/src/locales/en.json | 320 + .../project/frontend/src/locales/es-MX.json | 318 + .../project/frontend/src/locales/es.json | 318 + .../project/frontend/src/locales/index.ts | 35 + .../project/frontend/src/locales/it.json | 318 + .../src/logger/FrontendLogger.spec.ts | 109 + .../frontend/src/logger/FrontendLogger.ts | 35 + .../logger/event/createClientEvent.spec.ts | 121 + .../src/logger/event/createClientEvent.ts | 55 + .../frontend/src/logger/event/index.ts | 1 + .../project/frontend/src/logger/index.ts | 3 + .../providers/backendLoggingProvider.spec.ts | 103 + .../providers/backendLoggingProvider.ts | 11 + .../frontend/src/logger/providers/index.ts | 1 + .../transport/backendLogTransport.spec.ts | 70 + .../logger/transport/backendLogTransport.ts | 84 + .../frontend/src/logger/transport/index.ts | 1 + .../project/frontend/src/main.tsx | 30 + .../pages/ErrorBoundary/ErrorPage.spec.tsx | 16 + .../src/pages/ErrorBoundary/ErrorPage.tsx | 41 + .../src/pages/ErrorBoundary/index.tsx | 1 + .../src/pages/GoodBye/GoodBye.spec.tsx | 153 + .../frontend/src/pages/GoodBye/GoodBye.tsx | 63 + .../frontend/src/pages/GoodBye/index.tsx | 3 + .../pages/LandingPage/LandingPage.spec.tsx | 30 + .../src/pages/LandingPage/LandingPage.tsx | 38 + .../frontend/src/pages/LandingPage/index.tsx | 3 + .../MeetingRoom/MeetingRoom.skeleton.spec.tsx | 19 + .../MeetingRoom/MeetingRoom.skeleton.tsx | 93 + .../pages/MeetingRoom/MeetingRoom.spec.tsx | 586 + .../pages/MeetingRoom/MeetingRoom.stories.tsx | 59 + .../src/pages/MeetingRoom/MeetingRoom.tsx | 158 + .../frontend/src/pages/MeetingRoom/index.tsx | 3 + .../UnsupportedBrowserPage.spec.tsx | 17 + .../UnsupportedBrowserPage.tsx | 36 + .../pages/UnsupportedBrowserPage/index.tsx | 3 + .../WaitingRoom/WaitingRoom.skeleton.spec.tsx | 15 + .../WaitingRoom/WaitingRoom.skeleton.tsx | 42 + .../pages/WaitingRoom/WaitingRoom.spec.tsx | 351 + .../src/pages/WaitingRoom/WaitingRoom.tsx | 109 + .../frontend/src/pages/WaitingRoom/index.tsx | 3 + .../project/frontend/src/services/index.ts | 1 + .../frontend/src/services/videoClient.ts | 8 + .../project/frontend/src/setup/index.ts | 1 + .../src/setup/tryOverrideVonageVideoHost.ts | 42 + .../frontend/src/test/RouterWrapper.tsx | 21 + .../project/frontend/src/test/globals.ts | 4 + .../frontend/src/test/mocks/vonageVideo.ts | 66 + .../frontend/src/test/providers/index.ts | 1 + .../makeAdvancedSettingsProviderWrapper.tsx | 31 + .../makeBackgroundPublisherProviderWrapper.ts | 35 + .../makePreviewPublisherProviderWrapper.ts | 33 + .../providers/makePublisherProviderWrapper.ts | 30 + .../providers/makeRuntimeProviderWrapper.tsx | 23 + .../providers/makeSessionProviderWrapper.ts | 26 + .../src/test/providers/makeTestProvider.ts | 215 + .../test/providers/makeUserProviderWrapper.ts | 26 + .../src/test/providers/makersIndex.ts | 34 + .../project/frontend/src/test/setup.ts | 61 + .../project/frontend/src/test/test.mp4 | Bin 0 -> 2565509 bytes .../project/frontend/src/types/chat.ts | 5 + .../project/frontend/src/types/session.ts | 60 + .../activeSpeakerTracker.spec.ts | 170 + .../activeSpeakerTracker.ts | 111 + .../src/utils/ActiveSpeakerTracker/index.ts | 3 + .../src/utils/SpeakingDetector/index.ts | 3 + .../SpeakingDetector/speakingDetector.spec.ts | 135 + .../SpeakingDetector/speakingDetector.ts | 144 + .../src/utils/VonageVideoClient/index.ts | 3 + .../vonageVideoClient.spec.ts | 457 + .../VonageVideoClient/vonageVideoClient.ts | 551 + .../project/frontend/src/utils/async.ts | 28 + .../applyBackgroundFilter.spec.ts | 147 + .../applyBackgroundFilter.ts | 80 + .../getInitialBackgroundFilter.spec.ts | 87 + .../getInitialBackgroundFilter.ts | 37 + .../frontend/src/utils/captureScreenshot.ts | 30 + .../cleanAndDedupeDeviceLabels.spec.ts | 148 + .../cleanAndDedupeDeviceLabels.ts | 68 + .../utils/cleanAndDedupeDeviceLabels/index.ts | 3 + .../project/frontend/src/utils/constants.tsx | 186 + .../frontend/src/utils/dateTime.spec.ts | 16 + .../project/frontend/src/utils/dateTime.ts | 28 + .../frontend/src/utils/emojis/emojis.ts | 16 + .../frontend/src/utils/emojis/index.ts | 3 + .../formatDuration/formatDuration.spec.ts | 40 + .../utils/formatDuration/formatDuration.ts | 23 + .../src/utils/formatDuration/index.ts | 3 + .../formatFileSize/formatFileSize.spec.ts | 55 + .../utils/formatFileSize/formatFileSize.ts | 27 + .../src/utils/formatFileSize/index.ts | 3 + .../generateRoomName/generateRoomName.spec.ts | 16 + .../generateRoomName/generateRoomName.ts | 276 + .../src/utils/generateRoomName/index.ts | 3 + .../frontend/src/utils/getAppVersion.ts | 7 + .../getControlButtonTooltip.spec.ts | 96 + .../getControlButtonTooltip.ts | 37 + .../utils/getControlButtonTooltip/index.ts | 3 + .../utils/getInitials/getInitials.spec.tsx | 234 + .../src/utils/getInitials/getInitials.tsx | 27 + .../frontend/src/utils/getInitials/index.tsx | 3 + .../getOverflowMenuButtons.spec.ts | 41 + .../getOverflowMenuButtons.tsx | 12 + .../utils/getOverflowMenuButtons/index.tsx | 3 + .../getParticipantColor.spec.ts | 38 + .../getParticipantColor.ts | 31 + .../src/utils/getParticipantColor/index.ts | 3 + .../frontend/src/utils/helpers/getBoxStyle.ts | 31 + .../getLayoutBoxes/getLayoutBoxes.spec.ts | 234 + .../helpers/getLayoutBoxes/getLayoutBoxes.ts | 55 + .../getLayoutBoxes/getLayoutElements.spec.ts | 224 + .../getLayoutBoxes/getLayoutElements.ts | 204 + .../src/utils/helpers/getLayoutBoxes/index.ts | 3 + .../getMaxSubscriberOnScreenCount.spec.ts | 102 + .../getMaxSubscriberOnScreenCount.ts | 45 + .../getMaxSubscriberOnScreenCount/index.ts | 3 + .../getSubscribersInDisplayOrder.spec.ts | 93 + .../getSubscribersInDisplayOrder.ts | 138 + .../getSubscribersInDisplayOrder/index.ts | 1 + .../getSubscribersToDisplay.ts | 51 + .../helpers/getSubscribersToDisplay/index.ts | 3 + .../src/utils/isMouseEventInsideBox.spec.ts | 43 + .../src/utils/isMouseEventInsideBox.ts | 22 + .../src/utils/isReportIssueEnabled/index.tsx | 3 + .../isReportIssueEnabled.spec.tsx | 18 + .../isReportIssueEnabled.tsx | 7 + .../src/utils/isValidUserName/index.ts | 1 + .../isValidUserName/isValidUserName.spec.ts | 56 + .../utils/isValidUserName/isValidUserName.ts | 43 + .../frontend/src/utils/layoutManager.spec.ts | 50 + .../frontend/src/utils/layoutManager.ts | 57 + .../src/utils/linkGroupsParser/index.ts | 3 + .../linkGroupsParser/linkGroupsParser.spec.ts | 97 + .../linkGroupsParser/linkGroupsParser.ts | 38 + .../frontend/src/utils/mockData/device.ts | 93 + .../src/utils/mockData/localStorageMock.ts | 17 + .../utils/movingAverageAudioLevelTracker.ts | 39 + .../compareSubscriberByName.spec.tsx | 40 + .../compareSubscriberByName.ts | 11 + .../participantList/createNameMatcher.spec.ts | 26 + .../participantList/createNameMatcher.ts | 18 + .../getFilteredSubscribers.spec.ts | 43 + .../participantList/getFilteredSubscribers.ts | 24 + .../participantList/shouldShowUser.spec.ts | 18 + .../utils/participantList/shouldShowUser.ts | 8 + .../publisher/handlePublisherAccessDenied.ts | 30 + .../src/utils/sessionStateOperations/index.ts | 4 + .../sortByDisplayPriority.spec.ts | 76 + .../sortByDisplayPriority.ts | 46 + .../togglePinAndSortByDisplayOrder.spec.ts | 86 + .../togglePinAndSortByDisplayOrder.ts | 33 + .../project/frontend/src/utils/storage.ts | 18 + .../useImageStorage/useImageStorage.spec.ts | 102 + .../utils/useImageStorage/useImageStorage.ts | 183 + .../project/frontend/src/utils/util.spec.tsx | 160 + .../project/frontend/src/utils/util.ts | 43 + .../src/utils/waitUntilPlaying/index.ts | 3 + .../waitUntilPlaying/waitUntilPlaying.spec.ts | 42 + .../waitUntilPlaying/waitUntilPlaying.ts | 33 + .../project/frontend/src/vite-env.d.ts | 1 + .../project/frontend/tailwind.config.cjs | 24 + .../project/frontend/tsconfig.json | 84 + .../project/frontend/tsconfig.node.json | 10 + .../project/frontend/tsdoc.json | 11 + .../project/frontend/typedoc.json | 22 + .../project/frontend/vite.config.ts | 243 + .../project/integration-tests/.gitignore | 5 + .../integration-tests/eslint.config.mjs | 54 + .../fixtures/testWithLogging.ts | 47 + .../project/integration-tests/globalSetup.js | 7 + .../project/integration-tests/main.js | 1 + .../project/integration-tests/package.json | 6 + .../integration-tests/playwright.config.ts | 152 + .../project/integration-tests/project.json | 54 + ...macOS_Test_Resources_female_aqua_48000.wav | Bin 0 -> 4777820 bytes .../test-api/apiIntegrity.test.ts | 587 + .../integration-tests/test-api/jest.config.js | 32 + .../integration-tests/test-api/tsconfig.json | 25 + .../tests/activeSpeaker.spec.ts | 50 + .../tests/advancedSettings.spec.ts | 105 + .../integration-tests/tests/chat.spec.ts | 111 + .../integration-tests/tests/goodbye.spec.ts | 48 + .../integration-tests/tests/landing.spec.ts | 77 + .../tests/meetingroom.spec.ts | 62 + .../tests/multiparty.spec.ts | 159 + .../integration-tests/tests/pinning.spec.ts | 109 + .../integration-tests/tests/recording.spec.ts | 122 + .../tests/reportIssue.spec.ts | 61 + .../project/integration-tests/tests/utils.ts | 62 + .../tests/visualComparisons.spec.ts | 52 + ...st-1-Google-Chrome-Fake-Devices-darwin.png | Bin 0 -> 66335 bytes ...est-1-Google-Chrome-Fake-Devices-linux.png | Bin 0 -> 66335 bytes ...ng-page-UI-test-1-Mobile-Chrome-darwin.png | Bin 0 -> 26802 bytes ...ing-page-UI-test-1-Mobile-Chrome-linux.png | Bin 0 -> 26246 bytes .../Landing-page-UI-test-1-firefox-darwin.png | Bin 0 -> 100876 bytes .../Landing-page-UI-test-1-firefox-linux.png | Bin 0 -> 100876 bytes .../Landing-page-UI-test-1-webkit-linux.png | Bin 0 -> 56491 bytes ...st-1-Google-Chrome-Fake-Devices-darwin.png | Bin 0 -> 62897 bytes ...est-1-Google-Chrome-Fake-Devices-linux.png | Bin 0 -> 62897 bytes ...er-page-UI-test-1-Mobile-Chrome-darwin.png | Bin 0 -> 27713 bytes ...ser-page-UI-test-1-Mobile-Chrome-linux.png | Bin 0 -> 28653 bytes ...-browser-page-UI-test-1-firefox-darwin.png | Bin 0 -> 99817 bytes ...d-browser-page-UI-test-1-firefox-linux.png | Bin 0 -> 99817 bytes ...ed-browser-page-UI-test-1-webkit-linux.png | Bin 0 -> 47252 bytes ...st-1-Google-Chrome-Fake-Devices-darwin.png | Bin 0 -> 32685 bytes ...est-1-Google-Chrome-Fake-Devices-linux.png | Bin 0 -> 32472 bytes ...ng-page-UI-test-1-Mobile-Chrome-darwin.png | Bin 0 -> 16372 bytes ...ing-page-UI-test-1-Mobile-Chrome-linux.png | Bin 0 -> 17431 bytes .../Waiting-page-UI-test-1-firefox-darwin.png | Bin 0 -> 66588 bytes .../Waiting-page-UI-test-1-firefox-linux.png | Bin 0 -> 67119 bytes .../Waiting-page-UI-test-1-webkit-linux.png | Bin 0 -> 31237 bytes .../tests/waitingRoom.spec.ts | 83 + .../project/integration-tests/tsconfig.json | 19 + .../project/libs/api/eslint.config.mjs | 19 + .../project/libs/api/package.json | 5 + .../project/libs/api/project.json | 47 + .../project/libs/api/src/constants/index.ts | 1 + .../libs/api/src/constants/schemasByAction.ts | 28 + .../src/core/VideoClient/VideoClient.test.ts | 540 + .../api/src/core/VideoClient/VideoClient.ts | 180 + .../libs/api/src/core/VideoClient/index.ts | 2 + .../project/libs/api/src/core/index.ts | 2 + .../src/errors/ApplicationServerError.test.ts | 52 + .../api/src/errors/ApplicationServerError.ts | 139 + .../libs/api/src/errors/assertions/index.ts | 3 + .../isApplicationServerError/index.ts | 2 + .../isApplicationServerError.test.ts | 24 + .../isApplicationServerError.ts | 12 + .../isApplicationServerErrorLike/index.ts | 2 + .../isApplicationServerErrorLike.test.ts | 26 + .../isApplicationServerErrorLike.ts | 15 + .../assertions/isHttpErrorLike/index.ts | 1 + .../isHttpErrorLike/isHttpErrorLike.ts | 10 + .../libs/api/src/errors/handlers/index.ts | 6 + .../makeBadRequestErrorHandler/index.ts | 1 + .../makeBadRequestErrorHandler.test.ts | 13 + .../makeBadRequestErrorHandler.ts | 16 + .../makeInternalErrorHandler/index.ts | 1 + .../makeInternalErrorHandler.test.ts | 13 + .../makeInternalErrorHandler.ts | 49 + .../makeNotFoundErrorHandler/index.ts | 1 + .../makeNotFoundErrorHandler.ts | 16 + .../makeThirdPartyErrorHandler/index.ts | 5 + .../makeThirdPartyErrorHandler.test.ts | 32 + .../makeThirdPartyErrorHandler.ts | 50 + .../makeUnauthorizedErrorHandler/index.ts | 1 + .../makeUnauthorizedErrorHandler.test.ts | 13 + .../makeUnauthorizedErrorHandler.ts | 16 + .../makeVideoApiErrorHandler/index.ts | 1 + .../makeVideoApiErrorHandler.test.ts | 49 + .../makeVideoApiErrorHandler.ts | 86 + .../libs/api/src/errors/helpers/index.ts | 2 + .../helpers/mapServerSourceToState/index.ts | 1 + .../mapServerSourceToState.test.ts | 28 + .../mapServerSourceToState.ts | 13 + .../api/src/errors/helpers/toTRPCError.ts | 61 + .../project/libs/api/src/errors/index.ts | 5 + .../types/ApplicationErrorFallbackConfig.ts | 1 + .../src/errors/types/ApplicationErrorState.ts | 1 + .../api/src/errors/types/ErrorSeverity.ts | 1 + .../libs/api/src/errors/types/HttpError.ts | 24 + .../libs/api/src/errors/types/index.ts | 4 + .../libs/api/src/executions/assertResult.ts | 36 + .../project/libs/api/src/executions/index.ts | 1 + .../api/src/handlers/createEphemeralToken.ts | 38 + .../libs/api/src/handlers/createSession.ts | 37 + .../api/src/handlers/createSessionAndJoin.ts | 22 + .../libs/api/src/handlers/decodeSessionId.ts | 19 + .../libs/api/src/handlers/decodeSessionKey.ts | 60 + .../libs/api/src/handlers/disableCaptions.ts | 30 + .../libs/api/src/handlers/enableCaptions.ts | 28 + .../api/src/handlers/ensureCaptionsEnabled.ts | 54 + .../project/libs/api/src/handlers/index.ts | 12 + .../libs/api/src/handlers/joinSession.ts | 23 + .../libs/api/src/handlers/searchArchives.ts | 23 + .../libs/api/src/handlers/startArchive.ts | 25 + .../libs/api/src/handlers/stopArchive.ts | 24 + .../project/libs/api/src/index.ts | 3 + .../helpers/composeHandlers.test.ts | 424 + .../httpHandler/helpers/composeHandlers.ts | 78 + .../helpers/handlerErrorWrapper.ts | 36 + .../routing/httpHandler/httpHandler.test.ts | 343 + .../src/routing/httpHandler/httpHandler.ts | 85 + .../libs/api/src/routing/httpHandler/index.ts | 1 + .../project/libs/api/src/routing/index.ts | 3 + .../videoHandler/createVideoHandler.test.ts | 545 + .../videoHandler/createVideoHandler.ts | 172 + .../api/src/routing/videoHandler/index.ts | 1 + .../videoRouter/createVideoRouter.test.ts | 718 + .../routing/videoRouter/createVideoRouter.ts | 670 + .../libs/api/src/routing/videoRouter/index.ts | 2 + .../libs/api/src/schemas/ACL.schema.ts | 9 + .../libs/api/src/schemas/ACLRule.schema.ts | 9 + .../api/src/schemas/AlgorithmTypes.schema.ts | 6 + .../src/schemas/ArchiveSearchFilter.schema.ts | 20 + .../libs/api/src/schemas/AuthParams.schema.ts | 40 + .../api/src/schemas/CaptionOptions.schema.ts | 11 + .../src/schemas/ClientTokenOptions.schema.ts | 11 + .../api/src/schemas/ConfigParams.schema.ts | 15 + .../CreateEphemeralTokenPayload.schema.ts | 11 + .../CreateSessionAndJoinPayload.schema.ts | 11 + .../schemas/CreateSessionPayload.schema.ts | 18 + .../schemas/DecodeSessionIdPayload.schema.ts | 14 + .../schemas/DisableCaptionsPayload.schema.ts | 10 + .../schemas/EnableCaptionsPayload.schema.ts | 11 + .../src/schemas/GeneratorOptions.schema.ts | 18 + .../src/schemas/JoinSessionPayload.schema.ts | 15 + .../src/schemas/ListArchivesPayload.schema.ts | 8 + .../libs/api/src/schemas/Metadata.schema.ts | 7 + .../api/src/schemas/ResponseTypes.schema.ts | 6 + .../schemas/SearchArchivesPayload.schema.ts | 14 + .../api/src/schemas/SessionOptions.schema.ts | 16 + .../api/src/schemas/SessionSigning.schema.ts | 30 + .../src/schemas/SignedHashParams.schema.ts | 10 + .../src/schemas/StartArchivePayload.schema.ts | 17 + .../src/schemas/StopArchivePayload.schema.ts | 10 + .../TRPCRuntimeConfigOptions.schema.ts | 9 + .../api/src/schemas/VideoAction.schema.ts | 13 + .../src/schemas/VideoClientConfig.schema.ts | 46 + .../api/src/schemas/VideoPayload.schema.ts | 10 + .../src/schemas/VideoRouterConfig.schema.ts | 50 + .../project/libs/api/src/schemas/index.ts | 29 + .../src/types/ApplicationErrorMiddleware.ts | 21 + .../libs/api/src/types/ApplicationHandler.ts | 27 + .../libs/api/src/types/ApplicationRequest.ts | 14 + .../src/types/ApplicationRequestHandler.ts | 24 + .../libs/api/src/types/HandlerConfig.ts | 20 + .../libs/api/src/types/HandlersConfig.ts | 17 + .../libs/api/src/types/HandlersDefaults.ts | 10 + .../libs/api/src/types/IVideoClient.ts | 1 + .../libs/api/src/types/IVideoRouter.ts | 1 + .../libs/api/src/types/ParamsDictionary.ts | 5 + .../project/libs/api/src/types/Query.ts | 5 + .../project/libs/api/src/types/TokenRole.ts | 8 + .../project/libs/api/src/types/VideoAction.ts | 17 + .../project/libs/api/src/types/index.ts | 32 + .../project/libs/api/test/setup.ts | 11 + .../project/libs/api/tsconfig.json | 32 + .../project/libs/api/tsconfig.lib.json | 20 + .../project/libs/api/tsconfig.spec.json | 21 + .../project/libs/api/vite.config.ts | 38 + .../project/libs/common/README.md | 7 + .../project/libs/common/eslint.config.mjs | 18 + .../project/libs/common/package.json | 5 + .../project/libs/common/project.json | 43 + .../src/assertions/assertNotEmptyString.ts | 9 + .../assertNotNil/assertNotNil.test.ts | 15 + .../assertions/assertNotNil/assertNotNil.ts | 9 + .../src/assertions/assertNotNil/index.ts | 1 + .../assertNumericString.ts | 9 + .../assertions/assertNumericString/index.ts | 1 + .../assertRecord/assertRecord.test.ts | 31 + .../assertions/assertRecord/assertRecord.ts | 9 + .../src/assertions/assertRecord/index.ts | 1 + .../assertSessionId/assertSessionId.test.ts | 15 + .../assertSessionId/assertSessionId.ts | 10 + .../src/assertions/assertSessionId/index.ts | 1 + .../common/src/assertions/assertString.ts | 9 + .../libs/common/src/assertions/index.ts | 22 + .../src/assertions/isErrorLike/index.ts | 1 + .../isErrorLike/isErrorLike.test.ts | 18 + .../src/assertions/isErrorLike/isErrorLike.ts | 9 + .../common/src/assertions/isFunction/index.ts | 1 + .../assertions/isFunction/isFunction.test.ts | 18 + .../src/assertions/isFunction/isFunction.ts | 4 + .../libs/common/src/assertions/isNil/index.ts | 1 + .../common/src/assertions/isNil/isNil.test.ts | 20 + .../libs/common/src/assertions/isNil/isNil.ts | 3 + .../common/src/assertions/isNotNil/index.ts | 1 + .../src/assertions/isNotNil/isNotNil.test.ts | 12 + .../src/assertions/isNotNil/isNotNil.ts | 5 + .../common/src/assertions/isNumber/index.ts | 1 + .../src/assertions/isNumber/isNumber.ts | 5 + .../src/assertions/isNumericString/index.ts | 1 + .../isNumericString/isNumericString.ts | 17 + .../common/src/assertions/isObject/index.ts | 1 + .../src/assertions/isObject/isObject.test.ts | 18 + .../src/assertions/isObject/isObject.ts | 4 + .../common/src/assertions/isPromise/index.ts | 1 + .../assertions/isPromise/isPromise.test.ts | 17 + .../src/assertions/isPromise/isPromise.ts | 5 + .../common/src/assertions/isRecord/index.ts | 1 + .../src/assertions/isRecord/isRecord.test.ts | 20 + .../src/assertions/isRecord/isRecord.ts | 14 + .../src/assertions/isSessionIdLike/index.ts | 1 + .../isSessionIdLike/isSessionIdLike.test.ts | 11 + .../isSessionIdLike/isSessionIdLike.ts | 17 + .../src/assertions/isSessionKeyLike/index.ts | 1 + .../isSessionKeyLike/isSessionKeyLike.test.ts | 11 + .../isSessionKeyLike/isSessionKeyLike.ts | 10 + .../common/src/assertions/isString/index.ts | 1 + .../src/assertions/isString/isString.test.ts | 17 + .../src/assertions/isString/isString.ts | 3 + .../src/assertions/isUndefined/index.ts | 1 + .../isUndefined/isUndefined.test.ts | 11 + .../src/assertions/isUndefined/isUndefined.ts | 3 + .../src/assertions/isValidRoomName/index.ts | 1 + .../isValidRoomName/isValidRoomName.spec.ts | 27 + .../isValidRoomName/isValidRoomName.ts | 12 + .../src/assertions/isValidSessionId/index.ts | 1 + .../isValidSessionId/isValidSessionId.test.ts | 16 + .../isValidSessionId/isValidSessionId.ts | 15 + .../src/assertions/isValidSessionKey/index.ts | 1 + .../isValidSessionKey/isValidSessionKey.ts | 14 + .../src/constants/frontFacingKeywords.ts | 3 + .../libs/common/src/constants/index.ts | 2 + .../src/constants/rearFacingKeywords.ts | 3 + .../src/errors/ApplicationError.test.ts | 44 + .../common/src/errors/ApplicationError.ts | 163 + .../common/src/errors/assertions/index.ts | 2 + .../assertions/isApplicationError/index.ts | 2 + .../isApplicationError.test.ts | 44 + .../isApplicationError/isApplicationError.ts | 18 + .../isApplicationErrorLike/index.ts | 2 + .../isApplicationErrorLike.test.ts | 67 + .../isApplicationErrorLike.ts | 13 + .../libs/common/src/errors/helpers/index.ts | 1 + .../errors/helpers/mapSourceToState/index.ts | 1 + .../mapSourceToState/mapSourceToState.test.ts | 30 + .../mapSourceToState/mapSourceToState.ts | 39 + .../project/libs/common/src/errors/index.ts | 5 + .../types/ApplicationErrorFallbackConfig.ts | 28 + .../src/errors/types/ApplicationErrorState.ts | 20 + .../common/src/errors/types/ErrorSeverity.ts | 1 + .../libs/common/src/errors/types/ZodIssue.ts | 9 + .../libs/common/src/errors/types/index.ts | 4 + .../assertResult/assertResult.test.ts | 63 + .../execution/assertResult/assertResult.ts | 55 + .../src/execution/assertResult/index.ts | 2 + .../src/execution/attempt/attempt.test.ts | 34 + .../common/src/execution/attempt/attempt.ts | 29 + .../common/src/execution/attempt/index.ts | 1 + .../src/execution/debounce/debounce.test.ts | 186 + .../common/src/execution/debounce/debounce.ts | 19 + .../common/src/execution/debounce/index.ts | 1 + .../common/src/execution/defer/defer.test.ts | 20 + .../libs/common/src/execution/defer/defer.ts | 23 + .../libs/common/src/execution/defer/index.ts | 2 + .../src/execution/enqueue/enqueue.test.ts | 32 + .../common/src/execution/enqueue/enqueue.ts | 47 + .../common/src/execution/enqueue/index.ts | 1 + .../idempotentCallbackWithRetry.spec.ts | 98 + .../idempotentCallbackWithRetry.ts | 50 + .../idempotentCallbackWithRetry/index.ts | 1 + .../libs/common/src/execution/index.ts | 9 + .../common/src/execution/throttle/index.ts | 1 + .../src/execution/throttle/throttle.test.ts | 54 + .../common/src/execution/throttle/throttle.ts | 66 + .../common/src/execution/tryCatch/index.ts | 1 + .../src/execution/tryCatch/tryCatch.test.ts | 62 + .../common/src/execution/tryCatch/tryCatch.ts | 53 + .../libs/common/src/execution/wait/index.ts | 1 + .../common/src/execution/wait/wait.spec.ts | 18 + .../libs/common/src/execution/wait/wait.ts | 11 + .../src/helpers/decodeJwt/decodeJwt.test.ts | 31 + .../common/src/helpers/decodeJwt/decodeJwt.ts | 29 + .../common/src/helpers/decodeJwt/index.ts | 1 + .../decodeSessionId/decodeSessionId.ts | 33 + .../src/helpers/decodeSessionId/index.ts | 1 + .../decodeSessionKey/decodeSessionKey.ts | 12 + .../src/helpers/decodeSessionKey/index.ts | 1 + .../project/libs/common/src/helpers/index.ts | 8 + .../src/helpers/interceptObject/index.ts | 1 + .../interceptObject/interceptObject.test.ts | 120 + .../interceptObject/interceptObject.ts | 126 + .../common/src/helpers/isZodError/index.ts | 1 + .../src/helpers/isZodError/isZodError.test.ts | 16 + .../src/helpers/isZodError/isZodError.ts | 11 + .../libs/common/src/helpers/kebabToCamel.ts | 14 + .../src/helpers/removeUndefinedProps/index.ts | 1 + .../removeUndefinedProps.test.ts | 22 + .../removeUndefinedProps.ts | 8 + .../common/src/helpers/toRemValue/index.ts | 1 + .../src/helpers/toRemValue/toRemValue.test.ts | 16 + .../src/helpers/toRemValue/toRemValue.ts | 3 + .../libs/common/src/logger/Logger.spec.ts | 365 + .../project/libs/common/src/logger/Logger.ts | 286 + .../project/libs/common/src/logger/index.ts | 3 + .../ClientLogEvent.schema.spec.ts | 58 + .../ClientLogEvent/ClientLogEvent.schema.ts | 34 + .../src/schemas/ClientLogEvent/index.ts | 5 + .../libs/common/src/schemas/FacingMode.ts | 8 + .../schemas/RoomName/RoomName.schema.spec.ts | 13 + .../src/schemas/RoomName/RoomName.schema.ts | 8 + .../libs/common/src/schemas/RoomName/index.ts | 1 + .../VonageAudioOutputDevice.schema.spec.ts | 36 + .../VonageAudioOutputDevice.schema.ts | 20 + .../schemas/VonageAudioOutputDevice/index.ts | 1 + .../VonageDevice/VonageDevice.schema.spec.ts | 36 + .../VonageDevice/VonageDevice.schema.ts | 16 + .../common/src/schemas/VonageDevice/index.ts | 1 + .../VonageDeviceKind.schema.spec.ts | 21 + .../VonageDeviceKind.schema.ts | 7 + .../src/schemas/VonageDeviceKind/index.ts | 1 + .../project/libs/common/src/schemas/index.ts | 5 + .../project/libs/common/src/types/Any.ts | 2 + .../libs/common/src/types/AnyFunction.ts | 3 + .../libs/common/src/types/DecodedSessionId.ts | 27 + .../libs/common/src/types/DeepPartial.ts | 3 + .../libs/common/src/types/FacingMode.ts | 7 + .../libs/common/src/types/IsOptionalKey.ts | 10 + .../libs/common/src/types/KebabToCamel.ts | 7 + .../project/libs/common/src/types/Mockable.ts | 13 + .../libs/common/src/types/ObjectKeys.ts | 8 + .../project/libs/common/src/types/Prettify.ts | 3 + .../project/libs/common/src/types/SameKeys.ts | 5 + .../libs/common/src/types/SessionId.ts | 3 + .../libs/common/src/types/SessionKey.ts | 5 + .../common/src/types/SessionKeyPayload.ts | 6 + .../common/src/types/VideoSessionDetails.ts | 12 + .../src/types/VideoSessionDetailsWithToken.ts | 6 + .../project/libs/common/src/types/index.ts | 21 + .../createStoreApiAssertion.test.ts | 18 + .../createStoreApiAssertion.ts | 57 + .../createStoreApiAssertion/index.ts | 1 + .../common/srcBrowser/assertions/index.ts | 2 + .../SuspenseBoundary.test.tsx | 50 + .../SuspenseBoundary/SuspenseBoundary.tsx | 22 + .../components/SuspenseBoundary/index.ts | 2 + .../composeProviders.test.tsx | 32 + .../composeProviders/composeProviders.tsx | 17 + .../helpers/composeProviders/index.ts | 1 + .../libs/common/srcBrowser/helpers/index.ts | 2 + .../libs/common/srcBrowser/hooks/index.ts | 11 + .../common/srcBrowser/hooks/use$/index.ts | 1 + .../srcBrowser/hooks/use$/use$.test.tsx | 37 + .../libs/common/srcBrowser/hooks/use$/use$.ts | 30 + .../srcBrowser/hooks/useAccumulator/index.ts | 1 + .../useAccumulator/useAccumulator.test.ts | 119 + .../hooks/useAccumulator/useAccumulator.ts | 19 + .../hooks/useAnchorElement/index.ts | 1 + .../useAnchorElement/useAnchorElement.ts | 66 + .../hooks/useAssertSuspense/index.ts | 1 + .../useAssertSuspense.test.ts | 24 + .../useAssertSuspense/useAssertSuspense.ts | 17 + .../hooks/useDebouncedValue/index.ts | 1 + .../useDebouncedValue.test.ts | 236 + .../useDebouncedValue/useDebouncedValue.ts | 28 + .../hooks/useDidUnmountRef/index.ts | 1 + .../useDidUnmountRef/useDidUnmountRef.test.ts | 21 + .../useDidUnmountRef/useDidUnmountRef.ts | 19 + .../common/srcBrowser/hooks/useMountEffect.ts | 13 + .../srcBrowser/hooks/useRenderCount/index.ts | 1 + .../useRenderCount/useRenderCount.test.ts | 15 + .../hooks/useRenderCount/useRenderCount.ts | 7 + .../hooks/useStableCallback/index.ts | 1 + .../useStableCallback.test.ts | 26 + .../useStableCallback/useStableCallback.ts | 25 + .../hooks/useDisposableStableRef.ts | 81 + .../hooks/useNonDisposableStableRef.ts | 34 + .../hooks/useStableRef/hooks/useSimpleRef.ts | 16 + .../srcBrowser/hooks/useStableRef/index.ts | 2 + .../hooks/useStableRef/useStableRef.test.ts | 173 + .../hooks/useStableRef/useStableRef.ts | 75 + .../hooks/useStableRef/useStableRef.types.ts | 5 + .../srcBrowser/hooks/useSuspenseMemo/index.ts | 1 + .../useSuspenseMemo/useSuspenseMemo.test.tsx | 48 + .../hooks/useSuspenseMemo/useSuspenseMemo.ts | 31 + .../libs/common/srcBrowser/platform/index.ts | 3 + .../common/srcBrowser/platform/isFirefox.ts | 12 + .../srcBrowser/platform/isMobile/index.ts | 1 + .../platform/isMobile/isMobile.spec.ts | 41 + .../srcBrowser/platform/isMobile/isMobile.ts | 15 + .../platform/isSinkIdSupported/index.ts | 1 + .../isSinkIdSupported.spec.ts | 30 + .../isSinkIdSupported/isSinkIdSupported.ts | 9 + .../srcBrowser/platform/isWebKit/index.ts | 1 + .../platform/isWebKit/isWebKit.spec.ts | 37 + .../srcBrowser/platform/isWebKit/isWebKit.ts | 10 + .../DeviceKind/DeviceKind.schema.spec.ts | 26 + .../schemas/DeviceKind/DeviceKind.schema.ts | 13 + .../srcBrowser/schemas/DeviceKind/index.ts | 2 + .../MediaDeviceInfo.schema.spec.ts | 41 + .../MediaDeviceInfo/MediaDeviceInfo.schema.ts | 28 + .../schemas/MediaDeviceInfo/index.ts | 2 + .../libs/common/srcBrowser/schemas/index.ts | 3 + .../srcBrowser/types/MediaDeviceInfoJSON.ts | 1 + .../libs/common/srcBrowser/types/index.ts | 2 + .../libs/common/srcNode/assertions/index.ts | 1 + .../libs/common/srcNode/helpers/index.ts | 1 + .../srcNode/schemas/ArchiveLayout.schema.ts | 11 + .../ArchiveMode/ArchiveMode.schema.spec.ts | 13 + .../schemas/ArchiveMode/ArchiveMode.schema.ts | 6 + .../srcNode/schemas/ArchiveMode/index.ts | 1 + .../srcNode/schemas/ArchiveOptions.schema.ts | 19 + .../ArchiveOptionsWithMaxBitrate.schema.ts | 10 + ...OptionsWithQuantizationParameter.schema.ts | 12 + .../schemas/ArchiveOutputMode.schema.ts | 7 + .../ArchiveWithTranscription.schema.ts | 14 + .../ArchiveWithoutTranscription.schema.ts | 10 + .../schemas/BaseArchiveOptions.schema.ts | 22 + .../srcNode/schemas/LayoutType.schema.ts | 6 + .../srcNode/schemas/MediaMode.schema.ts | 6 + .../srcNode/schemas/Resolution.schema.ts | 6 + .../SessionId/SessionId.schema.spec.ts | 16 + .../schemas/SessionId/SessionId.schema.ts | 9 + .../common/srcNode/schemas/SessionId/index.ts | 1 + .../SessionKey/SessionKey.schema.spec.ts | 15 + .../schemas/SessionKey/SessionKey.schema.ts | 9 + .../srcNode/schemas/SessionKey/index.ts | 1 + .../srcNode/schemas/StreamMode.schema.ts | 6 + .../schemas/TranscriptionProperties.schema.ts | 11 + .../libs/common/srcNode/schemas/index.ts | 17 + .../libs/common/srcNode/types/index.ts | 8 + .../libs/common/test/environment/index.ts | 1 + .../environment/setupCancelablePromiseHook.ts | 16 + .../libs/common/test/fixtures/index.ts | 1 + .../common/test/fixtures/sessionIdFixtures.ts | 13 + .../project/libs/common/test/helpers/index.ts | 3 + .../common/test/helpers/makeGenericMock.ts | 36 + .../libs/common/test/helpers/mockModule.ts | 106 + .../common/test/helpers/setupPartialMock.ts | 147 + .../project/libs/common/test/index.ts | 3 + .../project/libs/common/test/setup.ts | 7 + .../testBrowser/environment/helpers/index.ts | 5 + .../helpers/setupHtmlCanvasElementGuards.ts | 27 + .../helpers/setupHtmlMediaElementGuards.ts | 44 + .../helpers/setupMuiMaterialStylesMock.ts | 30 + .../helpers/setupResizeObserverMock/index.ts | 1 + .../mocks/resizeObserverMock.ts | 1 + .../setupResizeObserverMock.ts | 14 + .../helpers/setupScrollIntoViewMock.ts | 11 + .../common/testBrowser/environment/index.ts | 7 + .../setupFrontendTestEnvironment.ts | 49 + .../libs/common/testBrowser/fixtures/index.ts | 12 + .../fixtures/makeMediaDeviceInfos.ts | 120 + .../fixtures/makeMediaStreamMock.ts | 13 + .../helpers/makeMediaDevicesMock.ts | 13 + .../helpers/makePermissionsMock.ts | 9 + .../fixtures/makeWindowNavigatorMock/index.ts | 1 + .../makeWindowNavigatorMock.ts | 60 + .../fixtures/mockPlatformModule.ts | 18 + .../setupWindowNavigatorMock/index.ts | 1 + .../setupWindowNavigatorMock.ts | 12 + .../project/libs/common/testBrowser/index.ts | 8 + .../makeGenericProviderWrapper.tsx | 92 + .../libs/common/testBrowser/mocks/index.ts | 3 + .../testBrowser/mocks/mediaDevicesMock.ts | 57 + .../testBrowser/mocks/mediaStreamMock.ts | 44 + .../testBrowser/mocks/permissionsMock.ts | 11 + .../testBrowser/renderAsyncComponent.ts | 46 + .../common/testBrowser/renderAsyncHook.ts | 28 + .../libs/common/testNode/helpers/index.ts | 3 + .../common/testNode/helpers/mockAuthModule.ts | 67 + .../testNode/helpers/mockVideoModule.ts | 70 + .../common/testNode/helpers/waitForEvent.ts | 30 + .../project/libs/common/testNode/index.ts | 1 + .../project/libs/common/tsconfig.json | 27 + .../project/libs/common/tsconfig.lib.json | 25 + .../project/libs/common/tsconfig.spec.json | 23 + .../project/libs/common/vite.config.ts | 65 + .../project/libs/core/README.md | 7 + .../project/libs/core/eslint.config.mjs | 18 + .../project/libs/core/package.json | 5 + .../project/libs/core/project.json | 49 + .../ApplicationClientError.test.ts | 29 + .../ApplicationClientError.ts | 45 + .../errors/ApplicationClientError/index.ts | 2 + .../types/ClientErrorFallbackConfig.ts | 8 + .../project/libs/core/src/errors/ErrorCode.ts | 7 + .../project/libs/core/src/errors/index.ts | 9 + .../libs/core/src/errors/mappers/index.ts | 1 + .../makeApplicationErrorMapper/index.ts | 1 + .../makeApplicationErrorMapper.ts | 42 + .../project/libs/core/src/hooks/index.ts | 5 + .../libs/core/src/hooks/useArchives/index.ts | 2 + .../src/hooks/useArchives/useArchives.test.ts | 109 + .../core/src/hooks/useArchives/useArchives.ts | 50 + .../core/src/hooks/usePublisherStats/index.ts | 1 + .../usePublisherStats.spec.ts | 463 + .../usePublisherStats/usePublisherStats.ts | 202 + .../src/hooks/useSubscriberStats/index.ts | 1 + .../useSubscriberStats.spec.ts | 145 + .../useSubscriberStats/useSubscriberStats.ts | 161 + .../helpers/formatFrameRate.spec.ts | 18 + .../useVideoStats/helpers/formatFrameRate.ts | 11 + .../helpers/formatResolution.spec.ts | 19 + .../useVideoStats/helpers/formatResolution.ts | 11 + .../src/hooks/useVideoStats/helpers/index.ts | 2 + .../helpers/readPublisherStats.ts | 42 + .../core/src/hooks/useVideoStats/index.ts | 3 + .../core/src/hooks/useVideoStats/types.ts | 5 + .../hooks/useVideoStats/useVideoStats.spec.ts | 179 + .../src/hooks/useVideoStats/useVideoStats.ts | 46 + .../libs/core/src/interceptors/index.ts | 8 + .../src/interceptors/mediaDevicesEnvelop.ts | 11 + .../webrtc-adapter.patch/index.ts | 0 .../webrtc-adapter.patch.test.ts | 38 + .../webrtc-adapter.patch.ts | 21 + .../src/interceptors/xmlHttpRequestEnvelop.ts | 67 + .../project/libs/core/src/logger/index.ts | 2 + .../project/libs/core/src/logger/logger.ts | 3 + .../metrics/BitrateValue/BitrateValue.test.ts | 17 + .../src/metrics/BitrateValue/BitrateValue.ts | 37 + .../core/src/metrics/BitrateValue/index.ts | 1 + .../src/metrics/BytesValue/BytesValue.test.ts | 13 + .../core/src/metrics/BytesValue/BytesValue.ts | 38 + .../libs/core/src/metrics/BytesValue/index.ts | 1 + .../DurationValue/DurationValue.test.ts | 11 + .../metrics/DurationValue/DurationValue.ts | 24 + .../core/src/metrics/DurationValue/index.ts | 1 + .../FrameRateValue/FrameRateValue.test.ts | 16 + .../metrics/FrameRateValue/FrameRateValue.ts | 23 + .../core/src/metrics/FrameRateValue/index.ts | 1 + .../metrics/IntegerValue/IntegerValue.test.ts | 12 + .../src/metrics/IntegerValue/IntegerValue.ts | 17 + .../core/src/metrics/IntegerValue/index.ts | 1 + .../src/metrics/MetricValue/MetricValue.ts | 102 + .../core/src/metrics/MetricValue/index.ts | 1 + .../OptionalValue/OptionalValue.test.ts | 22 + .../metrics/OptionalValue/OptionalValue.ts | 91 + .../core/src/metrics/OptionalValue/index.ts | 1 + .../PacketLossValue/PacketLossValue.test.ts | 11 + .../PacketLossValue/PacketLossValue.ts | 20 + .../core/src/metrics/PacketLossValue/index.ts | 1 + .../ResolutionValue/ResolutionValue.test.ts | 22 + .../ResolutionValue/ResolutionValue.ts | 64 + .../core/src/metrics/ResolutionValue/index.ts | 1 + .../project/libs/core/src/metrics/index.ts | 9 + .../project/libs/core/src/services/index.ts | 1 + .../videoClient/createVideoClient.test.ts | 69 + .../services/videoClient/createVideoClient.ts | 96 + .../core/src/services/videoClient/index.ts | 1 + .../actions/getUserMedia/getUserMedia.spec.ts | 106 + .../actions/getUserMedia/getUserMedia.ts | 35 + .../devices/actions/getUserMedia/index.ts | 1 + .../core/src/stores/devices/actions/index.ts | 3 + .../devices/actions/selectDevice/index.ts | 1 + .../actions/selectDevice/selectDevice.spec.ts | 52 + .../actions/selectDevice/selectDevice.ts | 65 + .../devices/actions/syncMediaDevicesInfo.ts | 61 + .../devices/assertions/assertDevicesAPI.ts | 12 + .../src/stores/devices/assertions/index.ts | 1 + .../devices/constants/frontFacingKeywords.ts | 3 + .../src/stores/devices/constants/index.ts | 4 + .../stores/devices/constants/initialValue.ts | 33 + .../src/stores/devices/constants/metadata.ts | 40 + .../devices/constants/rearFacingKeywords.ts | 3 + .../core/src/stores/devices/devices$.test.ts | 97 + .../libs/core/src/stores/devices/devices$.ts | 43 + .../core/src/stores/devices/devicesStore.ts | 68 + .../helpers/assertMediaStreamAccess.ts | 32 + .../getMediaDevicesInfo.spec.ts | 70 + .../getMediaDevicesInfo.ts | 74 + .../helpers/getMediaDevicesInfo/index.ts | 1 + .../core/src/stores/devices/helpers/index.ts | 4 + .../helpers/organizeMediaDevicesByKind.ts | 27 + .../devices/helpers/reviseMediaSelection.ts | 63 + .../devices/helpers/setupDeviceStore/index.ts | 1 + .../setupDeviceStore/setupDeviceStore.test.ts | 462 + .../setupDeviceStore/setupDeviceStore.ts | 132 + .../core/src/stores/devices/hooks/index.ts | 4 + .../src/stores/devices/hooks/useDeviceId.ts | 10 + .../devices/hooks/useMediaDeviceInfo/index.ts | 1 + .../useMediaDeviceInfo.test.ts | 44 + .../useMediaDeviceInfo/useMediaDeviceInfo.ts | 63 + .../hooks/useMediaDeviceInfoByKind$.ts | 10 + .../stores/devices/hooks/useMediaDevices.ts | 109 + .../libs/core/src/stores/devices/index.ts | 3 + .../src/stores/devices/observables/index.ts | 1 + .../devices/observables/mediaDevicesMap$.ts | 12 + .../schemas/DevicesStoreState.schema.ts | 26 + .../core/src/stores/devices/schemas/index.ts | 1 + .../stores/devices/types/AudioOutputDevice.ts | 8 + .../src/stores/devices/types/DevicesAPI.ts | 1 + .../stores/devices/types/DevicesStoreMeta.ts | 3 + .../stores/devices/types/DevicesStoreState.ts | 3 + .../core/src/stores/devices/types/index.ts | 4 + .../project/libs/core/src/stores/index.ts | 4 + .../actions/clearAllNotifications.ts | 9 + .../actions/dismissNotification.ts | 14 + .../src/stores/notifications/actions/index.ts | 3 + .../notifications/actions/pushNotification.ts | 28 + .../stores/notifications/constants/index.ts | 1 + .../notifications/constants/initialValue.ts | 5 + .../core/src/stores/notifications/index.ts | 2 + .../notifications/notifications$.test.ts | 23 + .../stores/notifications/notifications$.ts | 9 + .../notifications/notificationsStore.ts | 28 + .../notifications/types/NotificationEntry.ts | 12 + .../notifications/types/NotificationId.ts | 11 + .../notifications/types/NotificationType.ts | 3 + .../notifications/types/NotificationsAPI.ts | 3 + .../notifications/types/NotificationsState.ts | 5 + .../src/stores/notifications/types/index.ts | 5 + .../stores/publisher/actions/getFacingMode.ts | 54 + .../src/stores/publisher/actions/index.ts | 1 + .../libs/core/src/stores/publisher/index.ts | 1 + .../src/stores/publisher/publisher$.test.ts | 173 + .../core/src/stores/publisher/publisher$.ts | 9 + .../src/stores/runtime/RuntimeProvider.ts | 89 + .../core/src/stores/runtime/hooks/index.ts | 3 + .../src/stores/runtime/hooks/useLanguage.ts | 5 + .../core/src/stores/runtime/hooks/useQuery.ts | 35 + .../stores/runtime/hooks/useVideoClient.ts | 9 + .../libs/core/src/stores/runtime/index.ts | 2 + .../core/src/stores/runtime/runtime$.test.ts | 17 + .../libs/core/src/stores/runtime/runtime$.ts | 37 + .../core/src/stores/runtime/runtimeStore.ts | 17 + .../src/stores/runtime/types/RuntimeState.ts | 10 + .../core/src/stores/runtime/types/index.ts | 2 + .../libs/core/src/types/QueryOptions.ts | 8 + .../project/libs/core/src/types/index.ts | 1 + .../project/libs/core/test/fixtures/index.ts | 1 + .../core/test/fixtures/makeVideoClientMock.ts | 46 + .../project/libs/core/test/index.ts | 1 + .../project/libs/core/test/providers/index.ts | 6 + .../providers/makeRuntimeProviderWrapper.ts | 23 + .../core/test/providers/makeTestProvider.ts | 138 + .../libs/core/test/providers/makersIndex.ts | 4 + .../project/libs/core/test/setup.ts | 11 + .../project/libs/core/tsconfig.json | 39 + .../project/libs/core/tsconfig.lib.json | 38 + .../project/libs/core/tsconfig.spec.json | 24 + .../project/libs/core/vite.config.ts | 70 + .../project/libs/ui/.storybook/main.ts | 30 + .../project/libs/ui/.storybook/preview.tsx | 26 + .../project/libs/ui/README.md | 7 + .../project/libs/ui/eslint.config.mjs | 36 + .../project/libs/ui/package.json | 5 + .../project/libs/ui/project.json | 62 + .../project/libs/ui/src/Card/Card.spec.tsx | 51 + .../project/libs/ui/src/Card/Card.story.tsx | 0 .../project/libs/ui/src/Card/Card.tsx | 34 + .../project/libs/ui/src/Card/index.ts | 1 + .../project/libs/ui/src/Field/Field.tsx | 26 + .../libs/ui/src/Field/FieldDescription.tsx | 20 + .../libs/ui/src/Field/FieldInput.test.tsx | 74 + .../project/libs/ui/src/Field/FieldInput.tsx | 49 + .../project/libs/ui/src/Field/FieldLabel.tsx | 20 + .../project/libs/ui/src/Field/FieldRow.tsx | 18 + .../project/libs/ui/src/Field/index.tsx | 4 + .../libs/ui/src/Header/Header.spec.tsx | 36 + .../libs/ui/src/Header/Header.stories.tsx | 19 + .../libs/ui/src/Header/Header.story.tsx | 0 .../project/libs/ui/src/Header/Header.tsx | 41 + .../project/libs/ui/src/Header/index.ts | 1 + .../src/LabeledValueList/LabeledValueList.tsx | 39 + .../libs/ui/src/LabeledValueList/index.tsx | 4 + .../ui/src/PageLayout/PageLayout.spec.tsx | 39 + .../ui/src/PageLayout/PageLayout.story.tsx | 0 .../libs/ui/src/PageLayout/PageLayout.tsx | 103 + .../project/libs/ui/src/PageLayout/index.tsx | 1 + .../PageLayoutEmbed/PageLayoutEmbed.spec.tsx | 39 + .../PageLayoutEmbed/PageLayoutEmbed.story.tsx | 0 .../src/PageLayoutEmbed/PageLayoutEmbed.tsx | 118 + .../libs/ui/src/PageLayoutEmbed/index.tsx | 1 + .../libs/ui/src/SelectField/SelectField.tsx | 80 + .../project/libs/ui/src/SelectField/index.tsx | 4 + .../libs/ui/src/SwitchField/SwitchField.tsx | 38 + .../project/libs/ui/src/SwitchField/index.tsx | 4 + .../libs/ui/src/VividIcon/VividIcon.tsx | 49 + .../project/libs/ui/src/VividIcon/index.ts | 2 + .../Collapsible/Collapsible.spec.tsx | 55 + .../components/Collapsible/Collapsible.tsx | 105 + .../components/Collapsible/collapsible$.ts | 25 + .../Collapsible/components/Details.tsx | 26 + .../Collapsible/components/Icon.tsx | 32 + .../Collapsible/components/Summary.tsx | 57 + .../Collapsible/components/index.ts | 2 + .../Collapsible/constants/CollapsibleSlots.ts | 6 + .../components/Collapsible/constants/index.ts | 1 + .../ui/src/components/Collapsible/index.tsx | 1 + .../NotificationItem.spec.tsx | 72 + .../NotificationItem.stories.tsx | 144 + .../NotificationItem/NotificationItem.tsx | 105 + .../src/components/NotificationItem/index.ts | 1 + .../NotificationsContainer.stories.tsx | 166 + .../NotificationsContainer.tsx | 48 + .../NotificationsContainer/index.ts | 1 + .../project/libs/ui/src/components/index.ts | 3 + .../findSlotByDisplayName.ts | 24 + .../helpers/findSlotByDisplayName/index.ts | 1 + .../handleClientApplicationError.test.tsx | 44 + .../handleClientApplicationError.tsx | 101 + .../handleClientApplicationError/index.ts | 1 + .../project/libs/ui/src/helpers/index.ts | 2 + .../project/libs/ui/src/helpers/pick | 0 .../project/libs/ui/src/hooks/index.ts | 1 + .../cleanAndDedupeDeviceLabels.spec.ts | 143 + .../cleanAndDedupeDeviceLabels.ts | 68 + .../cleanAndDedupeDeviceLabels/index.ts | 3 + .../helpers/index.ts | 1 + .../useDistinctLabelMediaDevices/index.ts | 1 + .../useDistinctLabelMediaDevices.spec.ts | 68 + .../useDistinctLabelMediaDevices.ts | 84 + .../project/libs/ui/src/index.ts | 18 + .../project/libs/ui/src/styles.css | 21 + .../libs/ui/src/theme/ThemeProvider.tsx | 16 + .../libs/ui/src/theme/ThemeProvider.types.ts | 182 + .../helpers/designTokens/designTokens.json | 195 + .../helpers/designTokens/designTokens.ts | 11 + .../designTokens/helpers/tokensToJson.ts | 145 + .../src/theme/helpers/designTokens/index.ts | 3 + .../helpers/designTokens/tokens/border.ts | 41 + .../helpers/designTokens/tokens/color.ts | 528 + .../designTokens/tokens/typography/index.ts | 3 + .../tokens/typography/typeface.ts | 17 + .../tokens/typography/typescale.ts | 143 + .../tokens/typography/typography.ts | 19 + .../designTokens/tokens/typography/weight.ts | 85 + .../theme/helpers/getMuiCustomTheme.spec.ts | 45 + .../ui/src/theme/helpers/getMuiCustomTheme.ts | 323 + .../libs/ui/src/theme/helpers/isDarkMode.ts | 5 + .../tailwind/generateTailwindPlugin.ts | 718 + .../ui/src/theme/helpers/tailwind/veraUI.cjs | 821 + .../libs/ui/src/theme/helpers/veraUI.types.ts | 244 + .../useSynchronizeThemeAndMedia/index.ts | 1 + .../useSynchronizeThemeAndMedia.test.ts | 96 + .../useSynchronizeThemeAndMedia.ts | 53 + .../project/libs/ui/src/theme/index.ts | 2 + .../project/libs/ui/tailwind.config.cjs | 23 + .../project/libs/ui/test/setup.ts | 11 + .../project/libs/ui/tsconfig.json | 32 + .../project/libs/ui/tsconfig.lib.json | 39 + .../project/libs/ui/tsconfig.spec.json | 26 + .../project/libs/ui/vite.config.ts | 73 + .../project/nx.json | 98 + .../project/package.json | 214 + .../project/scripts/build.ts | 124 + .../project/scripts/dev.ts | 136 + .../scripts/generateDependenciesList.js | 53 + .../project/scripts/generateTokens.ts | 116 + .../project/scripts/licenseAllowList.json | 30 + .../project/scripts/licenseCheck.js | 73 + .../project/scripts/lintFileNames.sh | 8 + .../project/scripts/lintFix.ts | 98 + .../project/scripts/qualityCheck.ts | 91 + .../project/scripts/start.ts | 93 + .../project/scripts/startBackend.ts | 71 + .../project/scripts/testBackend.ts | 171 + .../project/scripts/testFrontend.ts | 164 + .../project/scripts/testIntegration.ts | 251 + .../project/scripts/testLibs.ts | 146 + .../project/scripts/tsCheck.ts | 67 + .../project/scripts/vcrDev.ts | 51 + .../project/sonar-project.properties | 93 + .../project/tailwind.eslint.config.cjs | 1 + .../project/tsconfig.base.json | 21 + .../project/tsconfig.json | 23 + .../project/vcr-gha.yml | 48 + .../project/vcr.yml.example | 11 + .../project/vcrBuild.dev.sh | 24 + .../project/vcrBuild.env.sh | 29 + .../project/vcrBuild.sh | 21 + .../project/vitest.workspace.ts | 1 + .../project/yarn.lock | 14774 ++++++++++++++++ .../public/favicon.svg | 1 + .../src/assets/houston.webp | Bin 0 -> 98506 bytes .../src/content.config.ts | 7 + .../src/content/docs/01_First_Step.md | 17 + .../src/content/docs/index.mdx | 7 + .../src/content/docs/reference.mdoc | 144 + .../src/env.d.ts | 2 + .../steps/01_first_step/index.html | 72 + .../steps/404.html | 37 + ...astro_type_script_index_0_lang.hwBsy0Mo.js | 1 + ...astro_type_script_index_0_lang.EjmW2doR.js | 1 + ...astro_type_script_index_0_lang.FuRcXuRY.js | 1 + .../steps/_astro/ec.0vx5m.js | 3 + .../steps/_astro/ec.v4551.css | 1 + .../steps/_astro/index.BsKNCfOq.css | 1 + .../steps/_astro/page.B1D-nYk3.js | 1 + .../steps/_astro/print.DNXP8c50.css | 1 + .../steps/_astro/ui-core.CJyTyO9Y.js | 2 + .../steps/favicon.svg | 1 + .../steps/index.html | 37 + .../steps/reference/index.html | 76 + .../tsconfig.json | 3 + .../tutorial-config.json | 13 + .../vonage-toolbar/README.md | 6 + .../vonage-toolbar/app.ts | 470 + .../vonage-toolbar/integration.ts | 87 + .../vonage-toolbar/toolbar.png | Bin 0 -> 426515 bytes ...nage_video_ios_app-theme-customization.zip | Bin 617379 -> 0 bytes 1731 files changed, 121417 insertions(+) create mode 100644 .devcontainer/vonage_video_ios_app-theme-customization/devcontainer.json create mode 100644 sources/vonage_video_ios_app-theme-customization/.astro/collections/docs.schema.json create mode 100644 sources/vonage_video_ios_app-theme-customization/.astro/content-assets.mjs create mode 100644 sources/vonage_video_ios_app-theme-customization/.astro/content-modules.mjs create mode 100644 sources/vonage_video_ios_app-theme-customization/.astro/content.d.ts create mode 100644 sources/vonage_video_ios_app-theme-customization/.astro/data-store.json create mode 100644 sources/vonage_video_ios_app-theme-customization/.astro/settings.json create mode 100644 sources/vonage_video_ios_app-theme-customization/.astro/types.d.ts create mode 100644 sources/vonage_video_ios_app-theme-customization/.vscode/extensions.json create mode 100644 sources/vonage_video_ios_app-theme-customization/.vscode/tasks.json create mode 100644 sources/vonage_video_ios_app-theme-customization/README.md create mode 100644 sources/vonage_video_ios_app-theme-customization/astro.config.mjs create mode 100644 sources/vonage_video_ios_app-theme-customization/download-toolbar.js create mode 100644 sources/vonage_video_ios_app-theme-customization/markdoc.config.mjs create mode 100644 sources/vonage_video_ios_app-theme-customization/package-lock.json create mode 100644 sources/vonage_video_ios_app-theme-customization/package.json create mode 100644 sources/vonage_video_ios_app-theme-customization/public/favicon.svg create mode 100644 sources/vonage_video_ios_app-theme-customization/setup-project.js create mode 100644 sources/vonage_video_ios_app-theme-customization/src/assets/houston.webp create mode 100644 sources/vonage_video_ios_app-theme-customization/src/content.config.ts create mode 100644 sources/vonage_video_ios_app-theme-customization/src/content/docs/01_First_Step.md create mode 100644 sources/vonage_video_ios_app-theme-customization/src/content/docs/index.mdx create mode 100644 sources/vonage_video_ios_app-theme-customization/src/content/docs/reference.mdoc create mode 100644 sources/vonage_video_ios_app-theme-customization/src/env.d.ts create mode 100644 sources/vonage_video_ios_app-theme-customization/tsconfig.json create mode 100644 sources/vonage_video_ios_app-theme-customization/tutorial-config.json create mode 100644 sources/vonage_video_ios_app-theme-customization/vonage-toolbar/README.md create mode 100644 sources/vonage_video_ios_app-theme-customization/vonage-toolbar/app.ts create mode 100644 sources/vonage_video_ios_app-theme-customization/vonage-toolbar/integration.ts create mode 100644 sources/vonage_video_ios_app-theme-customization/vonage-toolbar/toolbar.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/.astro/collections/docs.schema.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/.astro/content-assets.mjs create mode 100644 tutorials/vonage_video_ios_app-theme-customization/.astro/content-modules.mjs create mode 100644 tutorials/vonage_video_ios_app-theme-customization/.astro/content.d.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/.astro/data-store.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/.astro/settings.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/.astro/types.d.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/README.md create mode 100644 tutorials/vonage_video_ios_app-theme-customization/astro.config.mjs create mode 100644 tutorials/vonage_video_ios_app-theme-customization/download-toolbar.js create mode 100644 tutorials/vonage_video_ios_app-theme-customization/markdoc.config.mjs create mode 100644 tutorials/vonage_video_ios_app-theme-customization/package-lock.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/package.json create mode 120000 tutorials/vonage_video_ios_app-theme-customization/project/.clinerules create mode 120000 tutorials/vonage_video_ios_app-theme-customization/project/.cursorrules create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.eslintignore create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.eslintrc-filenames create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.github/ISSUE_TEMPLATE/1-bug-report.yml create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.github/ISSUE_TEMPLATE/2-feature-request.yml create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.github/ISSUE_TEMPLATE/config.yml create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.github/actions/deploy-vcr/action.yml create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.github/actions/install-vcr-cli/action.yml create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.github/actions/slack-notify/action.yml create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.github/copilot-instructions.md create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.github/instructions/test-files.instructions.md create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.github/pull_request_template.md create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/auto-set-base.yml create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/auto-update-dependencies.yml create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/check-pull-request-title.yml create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/deploy-to-vcr.yml create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/lint.yml create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/release-notification.yml create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/run-tests.yml create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/vcr-deploy-on-comment.yml create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/vcr-remove-non-use-instance.yml create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/vcr-remove-on-comment.yml create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.gitignore create mode 100755 tutorials/vonage_video_ios_app-theme-customization/project/.husky/pre-commit create mode 100755 tutorials/vonage_video_ios_app-theme-customization/project/.husky/pre-push create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.nvmrc create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.prettierignore create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.prettierrc create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.vcrignore create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.vonage/catalog-info.yaml create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.vonage/deploy/.gitkeep create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.vscode/extensions.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.vscode/launch.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.vscode/vera.contextStore.code-snippets create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/.vscode/vera.reactComponent.code-snippets create mode 120000 tutorials/vonage_video_ios_app-theme-customization/project/.windsurfrules create mode 120000 tutorials/vonage_video_ios_app-theme-customization/project/AGENTS.md create mode 120000 tutorials/vonage_video_ios_app-theme-customization/project/CLAUDE.md create mode 120000 tutorials/vonage_video_ios_app-theme-customization/project/CODEX.md create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/CODE_OF_CONDUCT.md create mode 120000 tutorials/vonage_video_ios_app-theme-customization/project/GEMINI.md create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/LICENSE create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/MAINTAINERS.md create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/README.md create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/.env.example create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/eslint.config.mjs create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/__mocks__/config.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/blockCallsForArgs.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/config.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/delay.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/getOrCreateSessionKeyFromRoomName.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/getSessionKeyFromRoomName.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/jest.config.js create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/jest/documentPolyfill.js create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/jest/documentPolyfill.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/jest/setEnvVars.js create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/jest/setEnvVars.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/middleware/errorHandler.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/middleware/helmetMiddleware/helmetMiddleware.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/middleware/helmetMiddleware/helmetMiddleware.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/middleware/helmetMiddleware/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/middleware/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/middleware/isVcr.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/middleware/rateLimitMiddleware.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/package.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/project.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/routes/feedback.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/routes/health.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/routes/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/routes/logger.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/routes/session.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/routes/video/VONAGE_HOOKS_CONCLUSIONS.md create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/routes/video/constants/createSession.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/routes/video/constants/enableCaptions.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/routes/video/constants/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/routes/video/constants/joinSession.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/routes/video/constants/startArchive.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/routes/video/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/routes/video/schemas/ArchiveHookPayload.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/routes/video/schemas/CaptionsHookPayload.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/routes/video/schemas/CaptionsStatus.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/routes/video/schemas/SessionHookPayload.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/routes/video/schemas/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/routes/video/setup.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/routes/video/types/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/routes/video/video.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/routes/wellKnown.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/server.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/services/feedbackService.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/services/getFeedbackService.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/services/jiraFeedbackService.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/services/loggerService.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/services/tests/feedbackService.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/services/tests/jiraFeedbackService.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/services/tests/loggerService.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/services/tests/loggerServiceWarnOnce.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/sessionStorageService.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/storage/inMemorySessionStorage/inMemorySessionStorage.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/storage/inMemorySessionStorage/inMemorySessionStorage.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/storage/inMemorySessionStorage/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/storage/sessionStorage.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/storage/vcrSessionStorage.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/tests/apple-app-site-association.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/tests/assetlinks.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/tests/blockCallsForArgs.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/tests/errorHandler.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/tests/feedback.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/tests/health.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/tests/helpers/config.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/tests/logger.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/tests/session.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/tests/sessionStorageService.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/tsconfig.app.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/tsconfig.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/tsconfig.spec.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/types/config.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/types/feedback.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/types/opentok-jwt-d.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/videoService/opentokVideoService.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/videoService/tests/opentokVideoService.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/videoService/tests/vonageVideoService.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/videoService/videoServiceFactory.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/videoService/videoServiceInterface.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/videoService/vonageVideoService.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/backend/webpack.config.cjs create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/customWordList.mjs create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/designTokens.example.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/designTokens.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/docs/CONTRIBUTING.md create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/docs/DEPENDENCIES.md create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/docs/KNOWN_ISSUES.md create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/docs/assets/Archiving.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/docs/assets/BGEffects.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/docs/assets/DeviceSelector.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/docs/assets/Emojis.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/docs/assets/Goodbye.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/docs/assets/MutingParticipant.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/docs/assets/NoiseSupression.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/docs/assets/ParticipantList.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/docs/assets/ReportIssue.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/docs/assets/WaitingRoom.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/docs/assets/Welcome.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/docs/assets/chrome.svg create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/docs/assets/edge.svg create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/docs/assets/electron.svg create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/docs/assets/ff.svg create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/docs/assets/opera.svg create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/docs/assets/project-architecture.svg create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/docs/assets/readme/1-dashboard-applications.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/docs/assets/readme/2-create-app.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/docs/assets/readme/3-create-app-form.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/docs/assets/readme/4-forwarding.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/docs/assets/safari.svg create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/eslint.config.mjs create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/.gitignore create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/.storybook/main.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/.storybook/preview.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/eslint.config.mjs create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/index.html create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/package.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/project.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/assets/sound.mp3 create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/background/bookshelf-room.jpg create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/background/busy-room.jpg create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/background/dune-view.jpg create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/background/hogwarts.jpg create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/background/library.jpg create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/background/new-york.jpg create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/background/plane.jpg create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/background/white-room.jpg create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/images/access-dialog-pending.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/images/access-dialog-rejected.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/images/favicon.ico create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/images/vonage-logo-desktop.svg create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/images/vonage-logo-mobile.svg create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/App.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/App.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/AppContextProvider.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/AdvancedSettings/AdvancedSettings.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/AdvancedSettings/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/BackgroundEffectsDialog/BackgroundEffectsDialogContext.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/BackgroundEffectsDialog/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/BackgroundPublisherProvider/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/BackgroundPublisherProvider/useBackgroundPublisher/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/BackgroundPublisherProvider/useBackgroundPublisher/useBackgroundPublisher.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/BackgroundPublisherProvider/useBackgroundPublisher/useBackgroundPublisher.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/LoggerSynchronizer/LoggerSynchronizer.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/LoggerSynchronizer/LoggerSynchronizer.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/LoggerSynchronizer/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PrecallNetworkTestDialog/PrecallNetworkTestDialogContext.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PrecallNetworkTestDialog/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PreviewPublisherProvider/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PreviewPublisherProvider/usePreviewPublisher/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PreviewPublisherProvider/usePreviewPublisher/usePreviewPublisher.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PreviewPublisherProvider/usePreviewPublisher/usePreviewPublisher.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/PublisherProvider.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/useApplyAdvancedSettings/applyAdvancedSettingsToPublisher.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/useApplyAdvancedSettings/applyAdvancedSettingsToPublisher.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/useApplyAdvancedSettings/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/useApplyAdvancedSettings/useApplyAdvancedSettings.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/useApplyAdvancedSettings/useApplyAdvancedSettings.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisher/hooks/useSyncPublisherDevices/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisher/hooks/useSyncPublisherDevices/useSyncPublisherDevices.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisher/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisher/usePublisher.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisher/usePublisher.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisherOptions/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisherOptions/usePublisherOptions.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisherOptions/usePublisherOptions.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisherQuality/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisherQuality/usePublisherQuality.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisherQuality/usePublisherQuality.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/RoomProvider.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/SessionProvider/session.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/SessionProvider/session.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/tests/RoomContext.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/tests/user.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/user.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/VeraRoom.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/VeraRoom.stories.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/VeraRoom.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/VeraRoomElement.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/VeraRoomElement.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/example/Example.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/example/Example.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/example/index.css create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/example/index.html create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/example/main.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/example/vite.example.config.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/hooks/useStateSynchronizer.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/providers/ShadowStylesProvider.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/providers/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/GoodByeStage/GoodByeStage.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/GoodByeStage/GoodByeStage.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/GoodByeStage/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/MeetingRoomStage/MeetingRoomStage.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/MeetingRoomStage/MeetingRoomStage.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/MeetingRoomStage/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/WaitingRoomStage/WaitingRoomStage.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/WaitingRoomStage/WaitingRoomStage.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/WaitingRoomStage/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/bridge$.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/constants/bridgeAttributes.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/constants/bridgeAttributesMap.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/constants/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/constants/initialState.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/constants/metadata.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/schemas/BridgeAttribute.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/schemas/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/types/BridgeAPI.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/types/BridgeAttribute.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/types/BridgeAttributeMeta.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/types/BridgeAttributeType.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/types/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/styles.css create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/vite.veraroom.config.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/getArchives/getArchives.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/getArchives/getArchives.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/getArchives/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/model.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/tests/data.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/tests/index.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/tests/model.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/fetchCredentials.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/reportFeedback.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettings/Dialog/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/AdvancedSettingsDialog.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/AdvancedSettingsDialog.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/AdvancedSettingsAudioTab.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/AdvancedSettingsAudioTab.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/AdvancedSettingsCodecPriorityField.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/AdvancedSettingsCodecPriorityField.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/AdvancedSettingsCustomVideoBitrateField.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/AdvancedSettingsCustomVideoBitrateField.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/AdvancedSettingsGeneralTab.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/AdvancedSettingsGeneralTab.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/AdvancedSettingsSidebar.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/AdvancedSettingsSidebar.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/AdvancedSettingsStatisticsGroup.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/AdvancedSettingsStatisticsGroup.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/AdvancedSettingsStatisticsTab.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/AdvancedSettingsStatisticsTab.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/components/PublisherStatistics.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/components/SubscriberStatistics.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/AdvancedSettingsVideoTab.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/AdvancedSettingsVideoTab.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/useAdvancedSettingsVideoHandlers.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/useAdvancedSettingsVideoHandlers.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/types/types.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AvatarInitials/AvatarInitials.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AvatarInitials/AvatarInitials.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AvatarInitials/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/AddBackgroundEffect/AddBackgroundEffectLayout/AddBackgroundEffectLayout.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/AddBackgroundEffect/AddBackgroundEffectLayout/AddBackgroundEffectLayout.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/AddBackgroundEffect/AddBackgroundEffectLayout/Index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/BackgroundEffectOptions.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/BackgroundEffectOptions.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/Index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/BackgroundEffectsLayout.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/BackgroundEffectsLayout.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundGallery/BackgroundGallery.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundGallery/BackgroundGallery.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundGallery/Index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundVideoContainer/BackgroundVideoContainer.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundVideoContainer/BackgroundVideoContainer.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundVideoContainer/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/EffectOptionButtons/EffectOptionButtons.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/EffectOptionButtons/EffectOptionButtons.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/EffectOptionButtons/Index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/SelectableOption/SelectableOption.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/SelectableOption/SelectableOption.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/SelectableOption/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Banner/Banner.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Banner/Banner.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Banner/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BannerLanguage/BannerLanguage.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BannerLanguage/BannerLanguage.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BannerLanguage/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BannerLogo/BannerLogo.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BannerLogo/BannerLogo.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BannerLogo/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/DeviceAccessAlert/DeviceAccessAlert.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/DeviceAccessAlert/DeviceAccessAlert.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/DeviceAccessAlert/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/EnvGuard/EnvGuard.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/EnvGuard/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ErrorBoundary/ErrorBoundary.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ErrorBoundary/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Footer/Footer.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Footer/Footer.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Footer/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/FooterLinks/FooterLinks.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/FooterLinks/FooterLinks.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/FooterLinks/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GHRepoButton/GHRepoButton.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GHRepoButton/GHRepoButton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GHRepoButton/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/ArchiveList/ArchiveList.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/ArchiveList/ArchiveList.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/ArchiveList/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/GoToLandingPageButton/GoToLandingPageButton.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/GoToLandingPageButton/GoToLandingPageButton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/GoToLandingPageButton/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/GoodbyeMessage/GoodbyeMessage.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/GoodbyeMessage/GoodbyeMessage.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/GoodbyeMessage/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/ReenterRoomButton/ReenterRoomButton.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/ReenterRoomButton/ReenterRoomButton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/ReenterRoomButton/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/HiddenParticipantsTile/HiddenParticipantsTile.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/HiddenParticipantsTile/HiddenParticipantsTile.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/HiddenParticipantsTile/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Icons/PushPinOffIcon/PushPinOffIcon.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Icons/PushPinOffIcon/PushPinOffIcon.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Icons/PushPinOffIcon/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinContainerSeparator/JoinContainerSeparator.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinContainerSeparator/JoinContainerSeparator.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinContainerSeparator/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinExistingRoom/JoinExistingRoom.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinExistingRoom/JoinExistingRoom.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinExistingRoom/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinWaitRoomButton/JoinWaitRoomButton.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinWaitRoomButton/JoinWaitRoomButton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinWaitRoomButton/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LandingPageWelcome/LandingPageWelcome.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LandingPageWelcome/LandingPageWelcome.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LandingPageWelcome/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LanguageSelector/LanguageSelector.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LanguageSelector/LanguageSelector.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LanguageSelector/LanguageSelector.types.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LanguageSelector/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/AdvancedSettingsButton/AdvancedSettingsButton.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/AdvancedSettingsButton/AdvancedSettingsButton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/AdvancedSettingsButton/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ArchivingButton/ArchivingButton.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ArchivingButton/ArchivingButton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ArchivingButton/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/AudioIndicator/AudioIndicator.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/AudioIndicator/AudioIndicator.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/AudioIndicator/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsBox/CaptionsBox.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsBox/CaptionsBox.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsBox/UserCaption/UserCaption.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsBox/UserCaption/UserCaption.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsBox/UserCaption/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsBox/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsButton.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsButton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsError/CaptionsError.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsError/CaptionsError.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsError/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Chat/Chat.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Chat/Chat.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Chat/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatButton/ChatButton.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatButton/ChatButton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatButton/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatInput/ChatInput.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatInput/ChatInput.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatInput/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatMessage/ChatMessage.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatMessage/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DeviceControlButton/DeviceControlButton.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DeviceControlButton/DeviceControlButton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DeviceControlButton/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DeviceSettingsMenu/DeviceSettingsMenu.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DeviceSettingsMenu/DeviceSettingsMenu.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DeviceSettingsMenu/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DropdownSeparator/DropdownSeparator.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DropdownSeparator/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Emoji/Emoji.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Emoji/Emoji.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Emoji/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/EmojiGrid/EmojiGrid.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/EmojiGrid/EmojiGrid.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/EmojiGrid/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/EmojiGridButton/EmojiGridButton.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/EmojiGridButton/EmojiGridButton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/EmojiGridButton/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/EmojisOrigin/EmojisOrigin.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/EmojisOrigin/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ExitButton/ExitButton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ExitButton/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/FormattedMessageBody/FormattedMessageBody.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/FormattedMessageBody/FormattedMessageBody.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/FormattedMessageBody/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/InputAudioDevices/InputAudioDevices.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/InputAudioDevices/InputAudioDevices.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/InputAudioDevices/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/LayoutButton/LayoutButton.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/LayoutButton/LayoutButton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/LayoutButton/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/MutingDialog/MutingDialog.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/MutingDialog/MutingDialog.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/MutingDialog/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/NameDisplay/NameDisplay.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/NameDisplay/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/OutputAudioDevices/OutputAudioDevices.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/OutputAudioDevices/OutputDevices.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/OutputAudioDevices/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantList/Index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantList/ParticipantList.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantList/ParticipantList.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListButton/ParticipantListButton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListButton/ParticipantsListButton.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListButton/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItem/ParticipantListItem.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItem/ParticipantListItem.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItem/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItemMenu/ParticipantListItemMenu.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItemMenu/ParticipantListItemMenu.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItemMenu/ParticipantPinMenuItem.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItemMenu/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PinButton/PinButton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PinButton/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PopupAlert/PopupAlert.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PopupAlert/PopupAlert.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PopupAlert/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PopupDialog/PopupDialog.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PopupDialog/PopupDialog.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PopupDialog/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RecordingIndicator/RecordingIndicator.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RecordingIndicator/RecordingIndicator.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RecordingIndicator/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RecordingPopupIndicator/RecordingPopupIndicator.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RecordingPopupIndicator/RecordingPopupIndicator.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RecordingPopupIndicator/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReduceNoiseTestSpeakers/ReduceNoiseTestSpeakers.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReduceNoiseTestSpeakers/ReduceNoiseTestSpeakers.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReduceNoiseTestSpeakers/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/FeedbackForm.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/FeedbackForm.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/FilePicker/FilePicker.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/FilePicker/FilePicker.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/FilePicker/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/HelperText/HelperText.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/HelperText/HelperText.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/HelperText/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FormSubmitted/FormSubmitted.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FormSubmitted/FormSubmitted.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FormSubmitted/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/ReportIssue.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/ReportIssue.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssueButton/ReportIssueButton.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssueButton/ReportIssueButton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssueButton/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RightPanel/RightPanel.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RightPanel/RightPanelTitle.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RightPanel/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ScreenSharePublisher/ScreenSharePublisher.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ScreenSharePublisher/ScreenSharePublisher.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ScreenSharePublisher/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ScreenshareVideoTile/ScreenshareVideoTile.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ScreenshareVideoTile/ScreenshareVideoTile.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ScreenshareVideoTile/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SendEmojiButton/SendEmojiButton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SendEmojiButton/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SmallViewportHeader/SmallViewportHeader.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SmallViewportHeader/SmallViewportHeader.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SmallViewportHeader/hooks/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SmallViewportHeader/hooks/useSwitchCameraFacingModeHandler.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SmallViewportHeader/hooks/useSwitchCameraFacingModeHandler.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SmallViewportHeader/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/TimeRoomName/TimeRoomName.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/TimeRoomName/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Toolbar/Toolbar.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Toolbar/Toolbar.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Toolbar/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ToolbarButton/ToolbarButton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ToolbarButton/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ToolbarOverflowButton/ToolbarOverflowButton.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ToolbarOverflowButton/ToolbarOverflowButton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ToolbarOverflowButton/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ToolbarOverflowMenu/ToolbarOverflowMenu.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ToolbarOverflowMenu/ToolbarOverflowMenu.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ToolbarOverflowMenu/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/UnreadMessagesBadge/UnreadMessagesBadge.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/UnreadMessagesBadge/UnreadMessagesBadge.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/UnreadMessagesBadge/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/VideoDevices/VideoDevices.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/VideoDevices/VideoDevices.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/VideoDevices/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/VideoDevicesOptions/VideoDevicesOptions.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/VideoDevicesOptions/VideoDevicesOptions.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/VideoDevicesOptions/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/VideoTile/VideoTile.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/VideoTile/VideoTile.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/VideoTile/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/VideoTileCanvas/VideoTileCanvas.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/VideoTileCanvas/VideoTileCanvas.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/VideoTileCanvas/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/VoiceIndicator/VoiceIndicator.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/VoiceIndicator/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ZoomIndicator/ZoomIndicator.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ZoomIndicator/ZoomIndicator.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ZoomIndicator/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MutedAlert/MutedAlert.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MutedAlert/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/NewRoomButton/NewRoomButton.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/NewRoomButton/NewRoomButton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/NewRoomButton/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Publisher/Publisher.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Publisher/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RedirectToUnsupportedBrowserPage/RedirectToUnsupportedBrowserPage.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RedirectToUnsupportedBrowserPage/RedirectToUnsupportedBrowserPage.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RedirectToUnsupportedBrowserPage/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RedirectToWaitingRoom/RedirectToWaitingRoom.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RedirectToWaitingRoom/RedirectToWaitingRoom.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RedirectToWaitingRoom/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RoomJoinContainer/RoomJoinContainer.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RoomJoinContainer/RoomJoinContainer.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RoomJoinContainer/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RoomNameInput/RoomNameInput.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RoomNameInput/RoomNameInput.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RoomNameInput/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ScreenShareNameDisplay/ScreenShareNameDisplay.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ScreenShareNameDisplay/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ScreenSharingButton/ScreenSharingButton.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ScreenSharingButton/ScreenSharingButton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ScreenSharingButton/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Separator/Separator.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Separator/Separator.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Separator/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/SoundTest/SoundTest.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/SoundTest/SoundTest.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/SoundTest/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Subscriber/Subscriber.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Subscriber/Subscriber.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Subscriber/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/UnsupportedBrowser/SupportedBrowserListItem/SupportedBrowserListItem.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/UnsupportedBrowser/SupportedBrowserListItem/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/UnsupportedBrowser/SupportedBrowsers/SupportedBrowsers.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/UnsupportedBrowser/SupportedBrowsers/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/UnsupportedBrowser/UnsupportedBrowserMessage/UnsupportedBrowserMessage.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/UnsupportedBrowser/UnsupportedBrowserMessage/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/VividIcon/VividIcon.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/BackgroundEffects/BackgroundEffectsButton/BackgroundEffectsButton.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/BackgroundEffects/BackgroundEffectsButton/BackgroundEffectsButton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/BackgroundEffects/BackgroundEffectsButton/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/BackgroundEffects/BackgroundEffectsDialog/BackgroundEffectsDialog.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/BackgroundEffects/BackgroundEffectsDialog/BackgroundEffectsDialog.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/BackgroundEffects/BackgroundEffectsDialog/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/CameraButton/CameraButton.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/CameraButton/CameraButton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/CameraButton/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/ControlPanel/ControlPanel.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/ControlPanel/ControlPanel.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/ControlPanel/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MenuDevices/MenuDevices.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MenuDevices/MenuDevices.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MenuDevices/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MenuMoreOptions/MenuMoreOptions.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MenuMoreOptions/MenuMoreOptions.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MenuMoreOptions/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MicButton/MicButton.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MicButton/MicButton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MicButton/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/DialogActionsRow/DialogActionsRow.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/DialogActionsRow/DialogActionsRow.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/DialogActionsRow/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/PrecallNetworkTestDialog.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/PrecallNetworkTestDialog.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/PrecallNetworkTestQualityRow/PrecallNetworkTestQualityRow.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/PrecallNetworkTestQualityRow/PrecallNetworkTestQualityRow.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/PrecallNetworkTestQualityRow/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/hooks/useNetworkTest.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/hooks/useNetworkTest.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PreviewAvatar/PreviewAvatar.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PreviewAvatar/PreviewAvatar.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PreviewAvatar/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/UserNameInput/UserNameInput.skeleton.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/UserNameInput/UserNameInput.skeleton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/UserNameInput/UserNameInput.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/UserNameInput/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoContainer/VideoContainer.skeleton.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoContainer/VideoContainer.skeleton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoContainer/VideoContainer.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoContainer/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoContainerButton/VideoContainerButton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoContainerButton/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoLoading/VideoLoading.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoLoading/VideoLoading.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoLoading/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoStatsOverlay/VideoStatsOverlay.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoStatsOverlay/VideoStatsOverlay.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoStatsOverlay/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VignetteEffect/VignetteEffect.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VignetteEffect/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/css/App.css create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/css/index.css create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/env.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useAudioLevels.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useChat.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useCollectBrowserInformation.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useDateTime.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useDropdownResizeObserver.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useElementDimensions.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useEmoji.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useGoodByePage.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useIsSmallViewport.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useIsTabletViewport.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useLayoutManager.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useMeetingRoom.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/usePushToTalk.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useReceivingCaptions.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useRightPannel.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useRoomShareUrl.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useScreenShare.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useToolbarButtons.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useWaitingRoom.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useWindowWidth.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useActiveSpeaker.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useArchives.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useAudioLevels.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useBackgroundPublisherContext.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useChat.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useCollectBrowserInformation.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useDateTime.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useDecodedSessionKey.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useDropdownResizeObserver.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useElementDimensions.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useEmoji.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useGoodByePage.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useIsSmallViewport.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useIsTabletViewport.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useLayoutManager.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useMeetingRoom.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/usePermissions.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/usePreviewPublisherContext.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/usePublisherContext.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/usePushToTalk.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useReceivingCaptions.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useRightPanel.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useRoomShareUrl.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useScreenShare.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSelectDeviceHandler/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSelectDeviceHandler/useSelectDeviceHandler.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSelectDeviceHandler/useSelectDeviceHandler.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSessionContext.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSessionKeyParam.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSpeakingDetector.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSubscriberTalking.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSubscribersInDisplayOrder.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useToolbarButtons.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useUserContext.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useWaitingRoom.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useWindowWidth.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/i18n.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/index.d.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/locales/de.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/locales/en.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/locales/es-MX.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/locales/es.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/locales/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/locales/it.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/FrontendLogger.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/FrontendLogger.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/event/createClientEvent.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/event/createClientEvent.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/event/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/providers/backendLoggingProvider.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/providers/backendLoggingProvider.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/providers/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/transport/backendLogTransport.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/transport/backendLogTransport.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/transport/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/main.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/ErrorBoundary/ErrorPage.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/ErrorBoundary/ErrorPage.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/ErrorBoundary/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/GoodBye/GoodBye.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/GoodBye/GoodBye.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/GoodBye/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/LandingPage/LandingPage.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/LandingPage/LandingPage.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/LandingPage/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/MeetingRoom/MeetingRoom.skeleton.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/MeetingRoom/MeetingRoom.skeleton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/MeetingRoom/MeetingRoom.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/MeetingRoom/MeetingRoom.stories.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/MeetingRoom/MeetingRoom.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/MeetingRoom/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/UnsupportedBrowserPage/UnsupportedBrowserPage.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/UnsupportedBrowserPage/UnsupportedBrowserPage.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/UnsupportedBrowserPage/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/WaitingRoom/WaitingRoom.skeleton.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/WaitingRoom/WaitingRoom.skeleton.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/WaitingRoom/WaitingRoom.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/WaitingRoom/WaitingRoom.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/WaitingRoom/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/services/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/services/videoClient.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/setup/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/setup/tryOverrideVonageVideoHost.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/test/RouterWrapper.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/test/globals.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/test/mocks/vonageVideo.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/test/providers/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/test/providers/makeAdvancedSettingsProviderWrapper.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/test/providers/makeBackgroundPublisherProviderWrapper.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/test/providers/makePreviewPublisherProviderWrapper.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/test/providers/makePublisherProviderWrapper.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/test/providers/makeRuntimeProviderWrapper.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/test/providers/makeSessionProviderWrapper.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/test/providers/makeTestProvider.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/test/providers/makeUserProviderWrapper.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/test/providers/makersIndex.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/test/setup.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/test/test.mp4 create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/types/chat.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/types/session.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/ActiveSpeakerTracker/activeSpeakerTracker.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/ActiveSpeakerTracker/activeSpeakerTracker.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/ActiveSpeakerTracker/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/SpeakingDetector/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/SpeakingDetector/speakingDetector.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/SpeakingDetector/speakingDetector.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/VonageVideoClient/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/VonageVideoClient/vonageVideoClient.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/VonageVideoClient/vonageVideoClient.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/async.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/backgroundFilter/applyBackgroundFilter/applyBackgroundFilter.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/backgroundFilter/applyBackgroundFilter/applyBackgroundFilter.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/backgroundFilter/getInitialBackgroundFilter/getInitialBackgroundFilter.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/backgroundFilter/getInitialBackgroundFilter/getInitialBackgroundFilter.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/captureScreenshot.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/cleanAndDedupeDeviceLabels/cleanAndDedupeDeviceLabels.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/cleanAndDedupeDeviceLabels/cleanAndDedupeDeviceLabels.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/cleanAndDedupeDeviceLabels/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/constants.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/dateTime.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/dateTime.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/emojis/emojis.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/emojis/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/formatDuration/formatDuration.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/formatDuration/formatDuration.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/formatDuration/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/formatFileSize/formatFileSize.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/formatFileSize/formatFileSize.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/formatFileSize/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/generateRoomName/generateRoomName.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/generateRoomName/generateRoomName.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/generateRoomName/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/getAppVersion.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/getControlButtonTooltip/getControlButtonTooltip.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/getControlButtonTooltip/getControlButtonTooltip.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/getControlButtonTooltip/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/getInitials/getInitials.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/getInitials/getInitials.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/getInitials/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/getOverflowMenuButtons/getOverflowMenuButtons.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/getOverflowMenuButtons/getOverflowMenuButtons.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/getOverflowMenuButtons/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/getParticipantColor/getParticipantColor.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/getParticipantColor/getParticipantColor.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/getParticipantColor/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/helpers/getBoxStyle.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/helpers/getLayoutBoxes/getLayoutBoxes.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/helpers/getLayoutBoxes/getLayoutBoxes.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/helpers/getLayoutBoxes/getLayoutElements.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/helpers/getLayoutBoxes/getLayoutElements.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/helpers/getLayoutBoxes/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/helpers/getMaxSubscriberOnScreenCount/getMaxSubscriberOnScreenCount.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/helpers/getMaxSubscriberOnScreenCount/getMaxSubscriberOnScreenCount.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/helpers/getMaxSubscriberOnScreenCount/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/helpers/getSubscribersInDisplayOrder/getSubscribersInDisplayOrder.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/helpers/getSubscribersInDisplayOrder/getSubscribersInDisplayOrder.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/helpers/getSubscribersInDisplayOrder/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/helpers/getSubscribersToDisplay/getSubscribersToDisplay.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/helpers/getSubscribersToDisplay/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/isMouseEventInsideBox.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/isMouseEventInsideBox.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/isReportIssueEnabled/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/isReportIssueEnabled/isReportIssueEnabled.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/isReportIssueEnabled/isReportIssueEnabled.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/isValidUserName/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/isValidUserName/isValidUserName.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/isValidUserName/isValidUserName.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/layoutManager.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/layoutManager.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/linkGroupsParser/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/linkGroupsParser/linkGroupsParser.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/linkGroupsParser/linkGroupsParser.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/mockData/device.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/mockData/localStorageMock.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/movingAverageAudioLevelTracker.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/participantList/compareSubscriberByName.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/participantList/compareSubscriberByName.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/participantList/createNameMatcher.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/participantList/createNameMatcher.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/participantList/getFilteredSubscribers.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/participantList/getFilteredSubscribers.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/participantList/shouldShowUser.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/participantList/shouldShowUser.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/publisher/handlePublisherAccessDenied.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/sessionStateOperations/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/sessionStateOperations/sortByDisplayPriority.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/sessionStateOperations/sortByDisplayPriority.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/sessionStateOperations/togglePinAndSortByDisplayOrder.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/sessionStateOperations/togglePinAndSortByDisplayOrder.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/storage.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/useImageStorage/useImageStorage.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/useImageStorage/useImageStorage.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/util.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/util.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/waitUntilPlaying/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/waitUntilPlaying/waitUntilPlaying.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/utils/waitUntilPlaying/waitUntilPlaying.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/vite-env.d.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/tailwind.config.cjs create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/tsconfig.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/tsconfig.node.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/tsdoc.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/typedoc.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/frontend/vite.config.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/.gitignore create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/eslint.config.mjs create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/fixtures/testWithLogging.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/globalSetup.js create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/main.js create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/package.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/playwright.config.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/project.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/quality_macOS_Test_Resources_female_aqua_48000.wav create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/test-api/apiIntegrity.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/test-api/jest.config.js create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/test-api/tsconfig.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/activeSpeaker.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/advancedSettings.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/chat.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/goodbye.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/landing.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/meetingroom.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/multiparty.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/pinning.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/recording.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/reportIssue.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/utils.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/visualComparisons.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/visualComparisons.spec.ts-snapshots/Landing-page-UI-test-1-Google-Chrome-Fake-Devices-darwin.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/visualComparisons.spec.ts-snapshots/Landing-page-UI-test-1-Google-Chrome-Fake-Devices-linux.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/visualComparisons.spec.ts-snapshots/Landing-page-UI-test-1-Mobile-Chrome-darwin.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/visualComparisons.spec.ts-snapshots/Landing-page-UI-test-1-Mobile-Chrome-linux.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/visualComparisons.spec.ts-snapshots/Landing-page-UI-test-1-firefox-darwin.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/visualComparisons.spec.ts-snapshots/Landing-page-UI-test-1-firefox-linux.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/visualComparisons.spec.ts-snapshots/Landing-page-UI-test-1-webkit-linux.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/visualComparisons.spec.ts-snapshots/Unsupported-browser-page-UI-test-1-Google-Chrome-Fake-Devices-darwin.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/visualComparisons.spec.ts-snapshots/Unsupported-browser-page-UI-test-1-Google-Chrome-Fake-Devices-linux.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/visualComparisons.spec.ts-snapshots/Unsupported-browser-page-UI-test-1-Mobile-Chrome-darwin.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/visualComparisons.spec.ts-snapshots/Unsupported-browser-page-UI-test-1-Mobile-Chrome-linux.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/visualComparisons.spec.ts-snapshots/Unsupported-browser-page-UI-test-1-firefox-darwin.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/visualComparisons.spec.ts-snapshots/Unsupported-browser-page-UI-test-1-firefox-linux.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/visualComparisons.spec.ts-snapshots/Unsupported-browser-page-UI-test-1-webkit-linux.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/visualComparisons.spec.ts-snapshots/Waiting-page-UI-test-1-Google-Chrome-Fake-Devices-darwin.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/visualComparisons.spec.ts-snapshots/Waiting-page-UI-test-1-Google-Chrome-Fake-Devices-linux.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/visualComparisons.spec.ts-snapshots/Waiting-page-UI-test-1-Mobile-Chrome-darwin.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/visualComparisons.spec.ts-snapshots/Waiting-page-UI-test-1-Mobile-Chrome-linux.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/visualComparisons.spec.ts-snapshots/Waiting-page-UI-test-1-firefox-darwin.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/visualComparisons.spec.ts-snapshots/Waiting-page-UI-test-1-firefox-linux.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/visualComparisons.spec.ts-snapshots/Waiting-page-UI-test-1-webkit-linux.png create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tests/waitingRoom.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/integration-tests/tsconfig.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/eslint.config.mjs create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/package.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/project.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/constants/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/constants/schemasByAction.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/core/VideoClient/VideoClient.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/core/VideoClient/VideoClient.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/core/VideoClient/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/core/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/ApplicationServerError.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/ApplicationServerError.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/assertions/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/assertions/isApplicationServerError/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/assertions/isApplicationServerError/isApplicationServerError.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/assertions/isApplicationServerError/isApplicationServerError.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/assertions/isApplicationServerErrorLike/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/assertions/isApplicationServerErrorLike/isApplicationServerErrorLike.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/assertions/isApplicationServerErrorLike/isApplicationServerErrorLike.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/assertions/isHttpErrorLike/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/assertions/isHttpErrorLike/isHttpErrorLike.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/handlers/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/handlers/makeBadRequestErrorHandler/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/handlers/makeBadRequestErrorHandler/makeBadRequestErrorHandler.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/handlers/makeBadRequestErrorHandler/makeBadRequestErrorHandler.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/handlers/makeInternalErrorHandler/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/handlers/makeInternalErrorHandler/makeInternalErrorHandler.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/handlers/makeInternalErrorHandler/makeInternalErrorHandler.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/handlers/makeNotFoundErrorHandler/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/handlers/makeNotFoundErrorHandler/makeNotFoundErrorHandler.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/handlers/makeThirdPartyErrorHandler/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/handlers/makeThirdPartyErrorHandler/makeThirdPartyErrorHandler.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/handlers/makeThirdPartyErrorHandler/makeThirdPartyErrorHandler.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/handlers/makeUnauthorizedErrorHandler/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/handlers/makeUnauthorizedErrorHandler/makeUnauthorizedErrorHandler.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/handlers/makeUnauthorizedErrorHandler/makeUnauthorizedErrorHandler.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/handlers/makeVideoApiErrorHandler/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/handlers/makeVideoApiErrorHandler/makeVideoApiErrorHandler.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/handlers/makeVideoApiErrorHandler/makeVideoApiErrorHandler.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/helpers/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/helpers/mapServerSourceToState/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/helpers/mapServerSourceToState/mapServerSourceToState.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/helpers/mapServerSourceToState/mapServerSourceToState.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/helpers/toTRPCError.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/types/ApplicationErrorFallbackConfig.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/types/ApplicationErrorState.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/types/ErrorSeverity.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/types/HttpError.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/errors/types/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/executions/assertResult.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/executions/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/handlers/createEphemeralToken.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/handlers/createSession.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/handlers/createSessionAndJoin.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/handlers/decodeSessionId.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/handlers/decodeSessionKey.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/handlers/disableCaptions.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/handlers/enableCaptions.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/handlers/ensureCaptionsEnabled.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/handlers/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/handlers/joinSession.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/handlers/searchArchives.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/handlers/startArchive.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/handlers/stopArchive.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/routing/httpHandler/helpers/composeHandlers.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/routing/httpHandler/helpers/composeHandlers.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/routing/httpHandler/helpers/handlerErrorWrapper.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/routing/httpHandler/httpHandler.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/routing/httpHandler/httpHandler.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/routing/httpHandler/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/routing/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/routing/videoHandler/createVideoHandler.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/routing/videoHandler/createVideoHandler.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/routing/videoHandler/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/routing/videoRouter/createVideoRouter.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/routing/videoRouter/createVideoRouter.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/routing/videoRouter/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/ACL.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/ACLRule.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/AlgorithmTypes.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/ArchiveSearchFilter.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/AuthParams.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/CaptionOptions.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/ClientTokenOptions.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/ConfigParams.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/CreateEphemeralTokenPayload.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/CreateSessionAndJoinPayload.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/CreateSessionPayload.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/DecodeSessionIdPayload.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/DisableCaptionsPayload.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/EnableCaptionsPayload.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/GeneratorOptions.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/JoinSessionPayload.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/ListArchivesPayload.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/Metadata.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/ResponseTypes.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/SearchArchivesPayload.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/SessionOptions.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/SessionSigning.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/SignedHashParams.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/StartArchivePayload.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/StopArchivePayload.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/TRPCRuntimeConfigOptions.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/VideoAction.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/VideoClientConfig.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/VideoPayload.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/VideoRouterConfig.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/schemas/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/types/ApplicationErrorMiddleware.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/types/ApplicationHandler.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/types/ApplicationRequest.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/types/ApplicationRequestHandler.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/types/HandlerConfig.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/types/HandlersConfig.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/types/HandlersDefaults.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/types/IVideoClient.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/types/IVideoRouter.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/types/ParamsDictionary.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/types/Query.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/types/TokenRole.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/types/VideoAction.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/src/types/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/test/setup.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/tsconfig.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/tsconfig.lib.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/tsconfig.spec.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/api/vite.config.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/README.md create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/eslint.config.mjs create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/package.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/project.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/assertNotEmptyString.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/assertNotNil/assertNotNil.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/assertNotNil/assertNotNil.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/assertNotNil/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/assertNumericString/assertNumericString.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/assertNumericString/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/assertRecord/assertRecord.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/assertRecord/assertRecord.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/assertRecord/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/assertSessionId/assertSessionId.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/assertSessionId/assertSessionId.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/assertSessionId/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/assertString.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isErrorLike/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isErrorLike/isErrorLike.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isErrorLike/isErrorLike.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isFunction/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isFunction/isFunction.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isFunction/isFunction.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isNil/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isNil/isNil.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isNil/isNil.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isNotNil/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isNotNil/isNotNil.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isNotNil/isNotNil.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isNumber/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isNumber/isNumber.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isNumericString/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isNumericString/isNumericString.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isObject/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isObject/isObject.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isObject/isObject.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isPromise/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isPromise/isPromise.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isPromise/isPromise.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isRecord/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isRecord/isRecord.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isRecord/isRecord.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isSessionIdLike/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isSessionIdLike/isSessionIdLike.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isSessionIdLike/isSessionIdLike.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isSessionKeyLike/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isSessionKeyLike/isSessionKeyLike.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isSessionKeyLike/isSessionKeyLike.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isString/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isString/isString.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isString/isString.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isUndefined/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isUndefined/isUndefined.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isUndefined/isUndefined.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isValidRoomName/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isValidRoomName/isValidRoomName.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isValidRoomName/isValidRoomName.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isValidSessionId/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isValidSessionId/isValidSessionId.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isValidSessionId/isValidSessionId.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isValidSessionKey/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/assertions/isValidSessionKey/isValidSessionKey.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/constants/frontFacingKeywords.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/constants/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/constants/rearFacingKeywords.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/errors/ApplicationError.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/errors/ApplicationError.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/errors/assertions/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/errors/assertions/isApplicationError/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/errors/assertions/isApplicationError/isApplicationError.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/errors/assertions/isApplicationError/isApplicationError.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/errors/assertions/isApplicationErrorLike/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/errors/assertions/isApplicationErrorLike/isApplicationErrorLike.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/errors/assertions/isApplicationErrorLike/isApplicationErrorLike.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/errors/helpers/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/errors/helpers/mapSourceToState/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/errors/helpers/mapSourceToState/mapSourceToState.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/errors/helpers/mapSourceToState/mapSourceToState.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/errors/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/errors/types/ApplicationErrorFallbackConfig.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/errors/types/ApplicationErrorState.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/errors/types/ErrorSeverity.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/errors/types/ZodIssue.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/errors/types/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/assertResult/assertResult.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/assertResult/assertResult.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/assertResult/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/attempt/attempt.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/attempt/attempt.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/attempt/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/debounce/debounce.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/debounce/debounce.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/debounce/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/defer/defer.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/defer/defer.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/defer/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/enqueue/enqueue.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/enqueue/enqueue.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/enqueue/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/idempotentCallbackWithRetry/idempotentCallbackWithRetry.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/idempotentCallbackWithRetry/idempotentCallbackWithRetry.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/idempotentCallbackWithRetry/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/throttle/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/throttle/throttle.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/throttle/throttle.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/tryCatch/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/tryCatch/tryCatch.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/tryCatch/tryCatch.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/wait/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/wait/wait.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/execution/wait/wait.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/helpers/decodeJwt/decodeJwt.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/helpers/decodeJwt/decodeJwt.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/helpers/decodeJwt/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/helpers/decodeSessionId/decodeSessionId.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/helpers/decodeSessionId/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/helpers/decodeSessionKey/decodeSessionKey.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/helpers/decodeSessionKey/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/helpers/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/helpers/interceptObject/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/helpers/interceptObject/interceptObject.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/helpers/interceptObject/interceptObject.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/helpers/isZodError/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/helpers/isZodError/isZodError.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/helpers/isZodError/isZodError.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/helpers/kebabToCamel.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/helpers/removeUndefinedProps/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/helpers/removeUndefinedProps/removeUndefinedProps.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/helpers/removeUndefinedProps/removeUndefinedProps.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/helpers/toRemValue/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/helpers/toRemValue/toRemValue.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/helpers/toRemValue/toRemValue.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/logger/Logger.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/logger/Logger.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/logger/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/schemas/ClientLogEvent/ClientLogEvent.schema.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/schemas/ClientLogEvent/ClientLogEvent.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/schemas/ClientLogEvent/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/schemas/FacingMode.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/schemas/RoomName/RoomName.schema.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/schemas/RoomName/RoomName.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/schemas/RoomName/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/schemas/VonageAudioOutputDevice/VonageAudioOutputDevice.schema.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/schemas/VonageAudioOutputDevice/VonageAudioOutputDevice.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/schemas/VonageAudioOutputDevice/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/schemas/VonageDevice/VonageDevice.schema.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/schemas/VonageDevice/VonageDevice.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/schemas/VonageDevice/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/schemas/VonageDeviceKind/VonageDeviceKind.schema.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/schemas/VonageDeviceKind/VonageDeviceKind.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/schemas/VonageDeviceKind/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/schemas/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/types/Any.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/types/AnyFunction.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/types/DecodedSessionId.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/types/DeepPartial.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/types/FacingMode.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/types/IsOptionalKey.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/types/KebabToCamel.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/types/Mockable.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/types/ObjectKeys.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/types/Prettify.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/types/SameKeys.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/types/SessionId.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/types/SessionKey.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/types/SessionKeyPayload.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/types/VideoSessionDetails.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/types/VideoSessionDetailsWithToken.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/src/types/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/assertions/createStoreApiAssertion/createStoreApiAssertion.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/assertions/createStoreApiAssertion/createStoreApiAssertion.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/assertions/createStoreApiAssertion/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/assertions/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/components/SuspenseBoundary/SuspenseBoundary.test.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/components/SuspenseBoundary/SuspenseBoundary.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/components/SuspenseBoundary/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/helpers/composeProviders/composeProviders.test.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/helpers/composeProviders/composeProviders.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/helpers/composeProviders/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/helpers/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/use$/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/use$/use$.test.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/use$/use$.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useAccumulator/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useAccumulator/useAccumulator.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useAccumulator/useAccumulator.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useAnchorElement/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useAnchorElement/useAnchorElement.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useAssertSuspense/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useAssertSuspense/useAssertSuspense.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useAssertSuspense/useAssertSuspense.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useDebouncedValue/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useDebouncedValue/useDebouncedValue.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useDebouncedValue/useDebouncedValue.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useDidUnmountRef/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useDidUnmountRef/useDidUnmountRef.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useDidUnmountRef/useDidUnmountRef.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useMountEffect.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useRenderCount/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useRenderCount/useRenderCount.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useRenderCount/useRenderCount.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useStableCallback/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useStableCallback/useStableCallback.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useStableCallback/useStableCallback.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useDisposableStableRef.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useNonDisposableStableRef.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useSimpleRef.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useStableRef/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useStableRef/useStableRef.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useStableRef/useStableRef.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useStableRef/useStableRef.types.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useSuspenseMemo/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useSuspenseMemo/useSuspenseMemo.test.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/hooks/useSuspenseMemo/useSuspenseMemo.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/platform/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/platform/isFirefox.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/platform/isMobile/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/platform/isMobile/isMobile.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/platform/isMobile/isMobile.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/platform/isSinkIdSupported/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/platform/isSinkIdSupported/isSinkIdSupported.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/platform/isSinkIdSupported/isSinkIdSupported.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/platform/isWebKit/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/platform/isWebKit/isWebKit.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/platform/isWebKit/isWebKit.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/schemas/DeviceKind/DeviceKind.schema.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/schemas/DeviceKind/DeviceKind.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/schemas/DeviceKind/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/schemas/MediaDeviceInfo/MediaDeviceInfo.schema.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/schemas/MediaDeviceInfo/MediaDeviceInfo.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/schemas/MediaDeviceInfo/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/schemas/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/types/MediaDeviceInfoJSON.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcBrowser/types/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcNode/assertions/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcNode/helpers/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcNode/schemas/ArchiveLayout.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcNode/schemas/ArchiveMode/ArchiveMode.schema.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcNode/schemas/ArchiveMode/ArchiveMode.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcNode/schemas/ArchiveMode/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcNode/schemas/ArchiveOptions.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcNode/schemas/ArchiveOptionsWithMaxBitrate.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcNode/schemas/ArchiveOptionsWithQuantizationParameter.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcNode/schemas/ArchiveOutputMode.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcNode/schemas/ArchiveWithTranscription.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcNode/schemas/ArchiveWithoutTranscription.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcNode/schemas/BaseArchiveOptions.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcNode/schemas/LayoutType.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcNode/schemas/MediaMode.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcNode/schemas/Resolution.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcNode/schemas/SessionId/SessionId.schema.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcNode/schemas/SessionId/SessionId.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcNode/schemas/SessionId/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcNode/schemas/SessionKey/SessionKey.schema.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcNode/schemas/SessionKey/SessionKey.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcNode/schemas/SessionKey/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcNode/schemas/StreamMode.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcNode/schemas/TranscriptionProperties.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcNode/schemas/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/srcNode/types/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/test/environment/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/test/environment/setupCancelablePromiseHook.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/test/fixtures/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/test/fixtures/sessionIdFixtures.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/test/helpers/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/test/helpers/makeGenericMock.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/test/helpers/mockModule.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/test/helpers/setupPartialMock.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/test/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/test/setup.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/environment/helpers/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/environment/helpers/setupHtmlCanvasElementGuards.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/environment/helpers/setupHtmlMediaElementGuards.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/environment/helpers/setupMuiMaterialStylesMock.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/environment/helpers/setupResizeObserverMock/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/environment/helpers/setupResizeObserverMock/mocks/resizeObserverMock.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/environment/helpers/setupResizeObserverMock/setupResizeObserverMock.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/environment/helpers/setupScrollIntoViewMock.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/environment/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/environment/setupFrontendTestEnvironment.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/fixtures/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/fixtures/makeMediaDeviceInfos.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/fixtures/makeMediaStreamMock.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/fixtures/makeWindowNavigatorMock/helpers/makeMediaDevicesMock.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/fixtures/makeWindowNavigatorMock/helpers/makePermissionsMock.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/fixtures/makeWindowNavigatorMock/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/fixtures/makeWindowNavigatorMock/makeWindowNavigatorMock.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/fixtures/mockPlatformModule.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/fixtures/setupWindowNavigatorMock/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/fixtures/setupWindowNavigatorMock/setupWindowNavigatorMock.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/makeGenericProviderWrapper.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/mocks/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/mocks/mediaDevicesMock.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/mocks/mediaStreamMock.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/mocks/permissionsMock.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/renderAsyncComponent.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testBrowser/renderAsyncHook.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testNode/helpers/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testNode/helpers/mockAuthModule.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testNode/helpers/mockVideoModule.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testNode/helpers/waitForEvent.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/testNode/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/tsconfig.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/tsconfig.lib.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/tsconfig.spec.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/common/vite.config.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/README.md create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/eslint.config.mjs create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/package.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/project.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/errors/ApplicationClientError/ApplicationClientError.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/errors/ApplicationClientError/ApplicationClientError.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/errors/ApplicationClientError/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/errors/ApplicationClientError/types/ClientErrorFallbackConfig.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/errors/ErrorCode.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/errors/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/errors/mappers/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/errors/mappers/makeApplicationErrorMapper/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/errors/mappers/makeApplicationErrorMapper/makeApplicationErrorMapper.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/hooks/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/hooks/useArchives/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/hooks/useArchives/useArchives.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/hooks/useArchives/useArchives.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/hooks/usePublisherStats/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/hooks/usePublisherStats/usePublisherStats.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/hooks/usePublisherStats/usePublisherStats.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/hooks/useSubscriberStats/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/hooks/useSubscriberStats/useSubscriberStats.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/hooks/useSubscriberStats/useSubscriberStats.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/hooks/useVideoStats/helpers/formatFrameRate.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/hooks/useVideoStats/helpers/formatFrameRate.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/hooks/useVideoStats/helpers/formatResolution.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/hooks/useVideoStats/helpers/formatResolution.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/hooks/useVideoStats/helpers/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/hooks/useVideoStats/helpers/readPublisherStats.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/hooks/useVideoStats/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/hooks/useVideoStats/types.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/hooks/useVideoStats/useVideoStats.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/hooks/useVideoStats/useVideoStats.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/interceptors/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/interceptors/mediaDevicesEnvelop.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/interceptors/webrtc-adapter.patch/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/interceptors/webrtc-adapter.patch/webrtc-adapter.patch.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/interceptors/webrtc-adapter.patch/webrtc-adapter.patch.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/interceptors/xmlHttpRequestEnvelop.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/logger/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/logger/logger.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/BitrateValue/BitrateValue.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/BitrateValue/BitrateValue.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/BitrateValue/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/BytesValue/BytesValue.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/BytesValue/BytesValue.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/BytesValue/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/DurationValue/DurationValue.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/DurationValue/DurationValue.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/DurationValue/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/FrameRateValue/FrameRateValue.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/FrameRateValue/FrameRateValue.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/FrameRateValue/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/IntegerValue/IntegerValue.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/IntegerValue/IntegerValue.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/IntegerValue/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/MetricValue/MetricValue.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/MetricValue/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/OptionalValue/OptionalValue.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/OptionalValue/OptionalValue.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/OptionalValue/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/PacketLossValue/PacketLossValue.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/PacketLossValue/PacketLossValue.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/PacketLossValue/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/ResolutionValue/ResolutionValue.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/ResolutionValue/ResolutionValue.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/ResolutionValue/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/metrics/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/services/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/services/videoClient/createVideoClient.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/services/videoClient/createVideoClient.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/services/videoClient/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/actions/getUserMedia/getUserMedia.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/actions/getUserMedia/getUserMedia.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/actions/getUserMedia/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/actions/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/actions/selectDevice/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/actions/selectDevice/selectDevice.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/actions/selectDevice/selectDevice.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/actions/syncMediaDevicesInfo.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/assertions/assertDevicesAPI.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/assertions/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/constants/frontFacingKeywords.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/constants/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/constants/initialValue.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/constants/metadata.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/constants/rearFacingKeywords.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/devices$.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/devices$.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/devicesStore.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/helpers/assertMediaStreamAccess.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo/getMediaDevicesInfo.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo/getMediaDevicesInfo.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/helpers/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/helpers/organizeMediaDevicesByKind.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/helpers/reviseMediaSelection.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/helpers/setupDeviceStore/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/helpers/setupDeviceStore/setupDeviceStore.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/helpers/setupDeviceStore/setupDeviceStore.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/hooks/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/hooks/useDeviceId.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/hooks/useMediaDeviceInfo/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/hooks/useMediaDeviceInfo/useMediaDeviceInfo.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/hooks/useMediaDeviceInfo/useMediaDeviceInfo.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/hooks/useMediaDeviceInfoByKind$.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/hooks/useMediaDevices.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/observables/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/observables/mediaDevicesMap$.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/schemas/DevicesStoreState.schema.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/schemas/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/types/AudioOutputDevice.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/types/DevicesAPI.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/types/DevicesStoreMeta.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/types/DevicesStoreState.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/devices/types/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/notifications/actions/clearAllNotifications.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/notifications/actions/dismissNotification.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/notifications/actions/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/notifications/actions/pushNotification.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/notifications/constants/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/notifications/constants/initialValue.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/notifications/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/notifications/notifications$.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/notifications/notifications$.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/notifications/notificationsStore.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/notifications/types/NotificationEntry.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/notifications/types/NotificationId.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/notifications/types/NotificationType.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/notifications/types/NotificationsAPI.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/notifications/types/NotificationsState.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/notifications/types/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/publisher/actions/getFacingMode.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/publisher/actions/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/publisher/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/publisher/publisher$.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/publisher/publisher$.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/runtime/RuntimeProvider.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/runtime/hooks/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/runtime/hooks/useLanguage.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/runtime/hooks/useQuery.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/runtime/hooks/useVideoClient.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/runtime/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/runtime/runtime$.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/runtime/runtime$.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/runtime/runtimeStore.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/runtime/types/RuntimeState.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/stores/runtime/types/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/types/QueryOptions.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/src/types/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/test/fixtures/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/test/fixtures/makeVideoClientMock.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/test/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/test/providers/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/test/providers/makeRuntimeProviderWrapper.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/test/providers/makeTestProvider.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/test/providers/makersIndex.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/test/setup.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/tsconfig.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/tsconfig.lib.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/tsconfig.spec.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/core/vite.config.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/.storybook/main.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/.storybook/preview.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/README.md create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/eslint.config.mjs create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/package.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/project.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/Card/Card.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/Card/Card.story.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/Card/Card.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/Card/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/Field/Field.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/Field/FieldDescription.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/Field/FieldInput.test.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/Field/FieldInput.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/Field/FieldLabel.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/Field/FieldRow.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/Field/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/Header/Header.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/Header/Header.stories.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/Header/Header.story.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/Header/Header.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/Header/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/LabeledValueList/LabeledValueList.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/LabeledValueList/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/PageLayout/PageLayout.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/PageLayout/PageLayout.story.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/PageLayout/PageLayout.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/PageLayout/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/PageLayoutEmbed/PageLayoutEmbed.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/PageLayoutEmbed/PageLayoutEmbed.story.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/PageLayoutEmbed/PageLayoutEmbed.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/PageLayoutEmbed/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/SelectField/SelectField.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/SelectField/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/SwitchField/SwitchField.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/SwitchField/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/VividIcon/VividIcon.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/VividIcon/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/components/Collapsible/Collapsible.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/components/Collapsible/Collapsible.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/components/Collapsible/collapsible$.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/components/Collapsible/components/Details.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/components/Collapsible/components/Icon.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/components/Collapsible/components/Summary.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/components/Collapsible/components/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/components/Collapsible/constants/CollapsibleSlots.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/components/Collapsible/constants/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/components/Collapsible/index.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/components/NotificationItem/NotificationItem.spec.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/components/NotificationItem/NotificationItem.stories.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/components/NotificationItem/NotificationItem.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/components/NotificationItem/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/components/NotificationsContainer/NotificationsContainer.stories.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/components/NotificationsContainer/NotificationsContainer.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/components/NotificationsContainer/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/components/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/helpers/findSlotByDisplayName/findSlotByDisplayName.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/helpers/findSlotByDisplayName/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/helpers/handleClientApplicationError/handleClientApplicationError.test.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/helpers/handleClientApplicationError/handleClientApplicationError.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/helpers/handleClientApplicationError/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/helpers/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/helpers/pick create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/hooks/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/hooks/useDistinctLabelMediaDevices/helpers/cleanAndDedupeDeviceLabels/cleanAndDedupeDeviceLabels.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/hooks/useDistinctLabelMediaDevices/helpers/cleanAndDedupeDeviceLabels/cleanAndDedupeDeviceLabels.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/hooks/useDistinctLabelMediaDevices/helpers/cleanAndDedupeDeviceLabels/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/hooks/useDistinctLabelMediaDevices/helpers/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/hooks/useDistinctLabelMediaDevices/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/hooks/useDistinctLabelMediaDevices/useDistinctLabelMediaDevices.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/hooks/useDistinctLabelMediaDevices/useDistinctLabelMediaDevices.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/styles.css create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/theme/ThemeProvider.tsx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/theme/ThemeProvider.types.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/theme/helpers/designTokens/designTokens.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/theme/helpers/designTokens/designTokens.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/theme/helpers/designTokens/helpers/tokensToJson.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/theme/helpers/designTokens/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/theme/helpers/designTokens/tokens/border.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/theme/helpers/designTokens/tokens/color.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/theme/helpers/designTokens/tokens/typography/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/theme/helpers/designTokens/tokens/typography/typeface.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/theme/helpers/designTokens/tokens/typography/typescale.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/theme/helpers/designTokens/tokens/typography/typography.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/theme/helpers/designTokens/tokens/typography/weight.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/theme/helpers/getMuiCustomTheme.spec.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/theme/helpers/getMuiCustomTheme.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/theme/helpers/isDarkMode.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/theme/helpers/tailwind/generateTailwindPlugin.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/theme/helpers/tailwind/veraUI.cjs create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/theme/helpers/veraUI.types.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/theme/hooks/useSynchronizeThemeAndMedia/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/theme/hooks/useSynchronizeThemeAndMedia/useSynchronizeThemeAndMedia.test.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/theme/hooks/useSynchronizeThemeAndMedia/useSynchronizeThemeAndMedia.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/src/theme/index.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/tailwind.config.cjs create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/test/setup.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/tsconfig.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/tsconfig.lib.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/tsconfig.spec.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/libs/ui/vite.config.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/nx.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/package.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/scripts/build.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/scripts/dev.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/scripts/generateDependenciesList.js create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/scripts/generateTokens.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/scripts/licenseAllowList.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/scripts/licenseCheck.js create mode 100755 tutorials/vonage_video_ios_app-theme-customization/project/scripts/lintFileNames.sh create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/scripts/lintFix.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/scripts/qualityCheck.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/scripts/start.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/scripts/startBackend.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/scripts/testBackend.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/scripts/testFrontend.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/scripts/testIntegration.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/scripts/testLibs.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/scripts/tsCheck.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/scripts/vcrDev.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/sonar-project.properties create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/tailwind.eslint.config.cjs create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/tsconfig.base.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/tsconfig.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/vcr-gha.yml create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/vcr.yml.example create mode 100755 tutorials/vonage_video_ios_app-theme-customization/project/vcrBuild.dev.sh create mode 100755 tutorials/vonage_video_ios_app-theme-customization/project/vcrBuild.env.sh create mode 100755 tutorials/vonage_video_ios_app-theme-customization/project/vcrBuild.sh create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/vitest.workspace.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/project/yarn.lock create mode 100644 tutorials/vonage_video_ios_app-theme-customization/public/favicon.svg create mode 100644 tutorials/vonage_video_ios_app-theme-customization/src/assets/houston.webp create mode 100644 tutorials/vonage_video_ios_app-theme-customization/src/content.config.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/src/content/docs/01_First_Step.md create mode 100644 tutorials/vonage_video_ios_app-theme-customization/src/content/docs/index.mdx create mode 100644 tutorials/vonage_video_ios_app-theme-customization/src/content/docs/reference.mdoc create mode 100644 tutorials/vonage_video_ios_app-theme-customization/src/env.d.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/steps/01_first_step/index.html create mode 100644 tutorials/vonage_video_ios_app-theme-customization/steps/404.html create mode 100644 tutorials/vonage_video_ios_app-theme-customization/steps/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.hwBsy0Mo.js create mode 100644 tutorials/vonage_video_ios_app-theme-customization/steps/_astro/Search.astro_astro_type_script_index_0_lang.EjmW2doR.js create mode 100644 tutorials/vonage_video_ios_app-theme-customization/steps/_astro/TableOfContents.astro_astro_type_script_index_0_lang.FuRcXuRY.js create mode 100644 tutorials/vonage_video_ios_app-theme-customization/steps/_astro/ec.0vx5m.js create mode 100644 tutorials/vonage_video_ios_app-theme-customization/steps/_astro/ec.v4551.css create mode 100644 tutorials/vonage_video_ios_app-theme-customization/steps/_astro/index.BsKNCfOq.css create mode 100644 tutorials/vonage_video_ios_app-theme-customization/steps/_astro/page.B1D-nYk3.js create mode 100644 tutorials/vonage_video_ios_app-theme-customization/steps/_astro/print.DNXP8c50.css create mode 100644 tutorials/vonage_video_ios_app-theme-customization/steps/_astro/ui-core.CJyTyO9Y.js create mode 100644 tutorials/vonage_video_ios_app-theme-customization/steps/favicon.svg create mode 100644 tutorials/vonage_video_ios_app-theme-customization/steps/index.html create mode 100644 tutorials/vonage_video_ios_app-theme-customization/steps/reference/index.html create mode 100644 tutorials/vonage_video_ios_app-theme-customization/tsconfig.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/tutorial-config.json create mode 100644 tutorials/vonage_video_ios_app-theme-customization/vonage-toolbar/README.md create mode 100644 tutorials/vonage_video_ios_app-theme-customization/vonage-toolbar/app.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/vonage-toolbar/integration.ts create mode 100644 tutorials/vonage_video_ios_app-theme-customization/vonage-toolbar/toolbar.png delete mode 100644 uploads/vonage_video_ios_app-theme-customization.zip diff --git a/.devcontainer/vonage_video_ios_app-theme-customization/devcontainer.json b/.devcontainer/vonage_video_ios_app-theme-customization/devcontainer.json new file mode 100644 index 00000000..dc9e3175 --- /dev/null +++ b/.devcontainer/vonage_video_ios_app-theme-customization/devcontainer.json @@ -0,0 +1,61 @@ +{ + "name": "Tutorial: vonage_video_ios_app-theme-customization", + "image": "mcr.microsoft.com/devcontainers/javascript-node:1-22-bookworm", + "workspaceFolder": "/workspaces/tutorial-interactive_tutorials/tutorials/vonage_video_ios_app-theme-customization", + "waitFor": "onCreateCommand", + "updateContentCommand": "npm install", + "postCreateCommand": "", + "postAttachCommand": "nohup ./node_modules/.bin/http-server steps -p 1234 --cors -c-1 > /dev/null 2>&1 & cd project && (sleep 4 && echo -e \"\\n\\n🚀 APPLICATION READY:\\nhttps://${CODESPACE_NAME}-3000.app.github.dev\\n\\n\" &) && (nohup sh -c \"sleep 5 && gh codespace ports visibility 3000:public -c $CODESPACE_NAME\" > /dev/null 2>&1 &) && npm start", + "forwardPorts": [ + "1234", + "3000" + ], + "portsAttributes": { + "1234": { + "label": "Tutorial Guide", + "onAutoForward": "openPreview" + }, + "3000": { + "label": "My Backend Service", + "onAutoForward": "notify", + "visibility": "public" + } + }, + "features": { + "ghcr.io/devcontainers/features/github-cli:1": {} + }, + "customizations": { + "vscode": { + "extensions": [], + "settings": { + "editor.formatOnSave": true, + "files.exclude": { + "node_modules": true, + "dist": true, + "steps": true, + ".devcontainer": true, + ".vscode": true, + "package.json": true, + "package-lock.json": true, + "tutorial-config.json": true, + "tsconfig.json": true, + "astro.config.mjs": true, + ".git": true, + ".DS_Store": true, + "project/setup-project.js": true, + "vonage-toolbar": true, + "src": true, + "markdoc.config.mjs": true, + ".astro": true, + "README.md": true, + "public": true, + "download-toolbar.js": true + }, + "terminal.integrated.cwd": "${workspaceFolder}/project" + } + }, + "codespaces": { + "openFiles": [] + } + } +} \ No newline at end of file diff --git a/sources/vonage_video_ios_app-theme-customization/.astro/collections/docs.schema.json b/sources/vonage_video_ios_app-theme-customization/.astro/collections/docs.schema.json new file mode 100644 index 00000000..15dc3fb5 --- /dev/null +++ b/sources/vonage_video_ios_app-theme-customization/.astro/collections/docs.schema.json @@ -0,0 +1,650 @@ +{ + "$ref": "#/definitions/docs", + "definitions": { + "docs": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "description": { + "type": "string" + }, + "editUrl": { + "anyOf": [ + { + "type": "string", + "format": "uri" + }, + { + "type": "boolean" + } + ], + "default": true + }, + "head": { + "type": "array", + "items": { + "type": "object", + "properties": { + "tag": { + "type": "string", + "enum": [ + "title", + "base", + "link", + "style", + "meta", + "script", + "noscript", + "template" + ] + }, + "attrs": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "boolean" + }, + { + "not": {} + } + ] + } + }, + "content": { + "type": "string" + } + }, + "required": [ + "tag" + ], + "additionalProperties": false + }, + "default": [] + }, + "tableOfContents": { + "anyOf": [ + { + "type": "object", + "properties": { + "minHeadingLevel": { + "type": "integer", + "minimum": 1, + "maximum": 6, + "default": 2 + }, + "maxHeadingLevel": { + "type": "integer", + "minimum": 1, + "maximum": 6, + "default": 3 + } + }, + "additionalProperties": false + }, + { + "type": "boolean" + } + ], + "default": { + "minHeadingLevel": 2, + "maxHeadingLevel": 3 + } + }, + "template": { + "type": "string", + "enum": [ + "doc", + "splash" + ], + "default": "doc" + }, + "hero": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "tagline": { + "type": "string" + }, + "image": { + "anyOf": [ + { + "type": "object", + "properties": { + "alt": { + "type": "string", + "default": "" + }, + "file": { + "type": "string" + } + }, + "required": [ + "file" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "alt": { + "type": "string", + "default": "" + }, + "dark": { + "type": "string" + }, + "light": { + "type": "string" + } + }, + "required": [ + "dark", + "light" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "html": { + "type": "string" + } + }, + "required": [ + "html" + ], + "additionalProperties": false + } + ] + }, + "actions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "link": { + "type": "string" + }, + "variant": { + "type": "string", + "enum": [ + "primary", + "secondary", + "minimal" + ], + "default": "primary" + }, + "icon": { + "anyOf": [ + { + "type": "string", + "enum": [ + "up-caret", + "down-caret", + "right-caret", + "left-caret", + "up-arrow", + "down-arrow", + "right-arrow", + "left-arrow", + "bars", + "translate", + "pencil", + "pen", + "document", + "add-document", + "setting", + "external", + "download", + "cloud-download", + "moon", + "sun", + "laptop", + "open-book", + "information", + "magnifier", + "forward-slash", + "close", + "error", + "warning", + "approve-check-circle", + "approve-check", + "rocket", + "star", + "puzzle", + "list-format", + "random", + "comment", + "comment-alt", + "heart", + "github", + "gitlab", + "bitbucket", + "codePen", + "farcaster", + "discord", + "gitter", + "twitter", + "x.com", + "mastodon", + "codeberg", + "youtube", + "threads", + "linkedin", + "twitch", + "azureDevOps", + "microsoftTeams", + "instagram", + "stackOverflow", + "telegram", + "rss", + "facebook", + "email", + "phone", + "reddit", + "patreon", + "signal", + "slack", + "matrix", + "hackerOne", + "openCollective", + "blueSky", + "discourse", + "zulip", + "pinterest", + "tiktok", + "astro", + "alpine", + "pnpm", + "biome", + "bun", + "mdx", + "apple", + "linux", + "homebrew", + "nix", + "starlight", + "pkl", + "node", + "cloudflare", + "vercel", + "netlify", + "deno", + "jsr", + "nostr", + "backstage", + "confluence", + "jira", + "storybook", + "vscode", + "jetbrains", + "zed", + "vim", + "figma", + "sketch", + "npm", + "sourcehut", + "substack", + "chrome", + "edge", + "firefox", + "safari", + "seti:folder", + "seti:bsl", + "seti:mdo", + "seti:salesforce", + "seti:asm", + "seti:bicep", + "seti:bazel", + "seti:c", + "seti:c-sharp", + "seti:html", + "seti:cpp", + "seti:clojure", + "seti:coldfusion", + "seti:config", + "seti:crystal", + "seti:crystal_embedded", + "seti:json", + "seti:css", + "seti:csv", + "seti:xls", + "seti:cu", + "seti:cake", + "seti:cake_php", + "seti:d", + "seti:word", + "seti:elixir", + "seti:elixir_script", + "seti:hex", + "seti:elm", + "seti:favicon", + "seti:f-sharp", + "seti:git", + "seti:go", + "seti:godot", + "seti:gradle", + "seti:grails", + "seti:graphql", + "seti:hacklang", + "seti:haml", + "seti:mustache", + "seti:haskell", + "seti:haxe", + "seti:jade", + "seti:java", + "seti:javascript", + "seti:jinja", + "seti:julia", + "seti:karma", + "seti:kotlin", + "seti:dart", + "seti:liquid", + "seti:livescript", + "seti:lua", + "seti:markdown", + "seti:argdown", + "seti:info", + "seti:clock", + "seti:maven", + "seti:nim", + "seti:github", + "seti:notebook", + "seti:nunjucks", + "seti:npm", + "seti:ocaml", + "seti:odata", + "seti:perl", + "seti:php", + "seti:pipeline", + "seti:pddl", + "seti:plan", + "seti:happenings", + "seti:powershell", + "seti:prisma", + "seti:pug", + "seti:puppet", + "seti:purescript", + "seti:python", + "seti:react", + "seti:rescript", + "seti:R", + "seti:ruby", + "seti:rust", + "seti:sass", + "seti:spring", + "seti:slim", + "seti:smarty", + "seti:sbt", + "seti:scala", + "seti:ethereum", + "seti:stylus", + "seti:svelte", + "seti:swift", + "seti:db", + "seti:terraform", + "seti:tex", + "seti:default", + "seti:twig", + "seti:typescript", + "seti:tsconfig", + "seti:vala", + "seti:vite", + "seti:vue", + "seti:wasm", + "seti:wat", + "seti:xml", + "seti:yml", + "seti:prolog", + "seti:zig", + "seti:zip", + "seti:wgt", + "seti:illustrator", + "seti:photoshop", + "seti:pdf", + "seti:font", + "seti:image", + "seti:svg", + "seti:sublime", + "seti:code-search", + "seti:shell", + "seti:video", + "seti:audio", + "seti:windows", + "seti:jenkins", + "seti:babel", + "seti:bower", + "seti:docker", + "seti:code-climate", + "seti:eslint", + "seti:firebase", + "seti:firefox", + "seti:gitlab", + "seti:grunt", + "seti:gulp", + "seti:ionic", + "seti:platformio", + "seti:rollup", + "seti:stylelint", + "seti:yarn", + "seti:webpack", + "seti:lock", + "seti:license", + "seti:makefile", + "seti:heroku", + "seti:todo", + "seti:ignored" + ] + }, + { + "type": "string", + "pattern": "^\\ import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Findex.mdx&astroContentModuleFlag=true")], +["src/content/docs/reference.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Freference.mdoc&astroContentModuleFlag=true")]]); + \ No newline at end of file diff --git a/sources/vonage_video_ios_app-theme-customization/.astro/content.d.ts b/sources/vonage_video_ios_app-theme-customization/.astro/content.d.ts new file mode 100644 index 00000000..ba5cbfb8 --- /dev/null +++ b/sources/vonage_video_ios_app-theme-customization/.astro/content.d.ts @@ -0,0 +1,227 @@ +declare module 'astro:content' { + interface Render { + '.mdoc': Promise<{ + Content(props: Record): import('astro').MarkdownInstance<{}>['Content']; + headings: import('astro').MarkdownHeading[]; + }>; + } +} + +declare module 'astro:content' { + interface Render { + '.mdx': Promise<{ + Content: import('astro').MDXContent; + headings: import('astro').MarkdownHeading[]; + remarkPluginFrontmatter: Record; + components: import('astro').MDXInstance<{}>['components']; + }>; + } +} + +declare module 'astro:content' { + export interface RenderResult { + Content: import('astro/runtime/server/index.js').AstroComponentFactory; + headings: import('astro').MarkdownHeading[]; + remarkPluginFrontmatter: Record; + } + interface Render { + '.md': Promise; + } + + export interface RenderedContent { + html: string; + metadata?: { + imagePaths: Array; + [key: string]: unknown; + }; + } +} + +declare module 'astro:content' { + type Flatten = T extends { [K: string]: infer U } ? U : never; + + export type CollectionKey = keyof AnyEntryMap; + export type CollectionEntry = Flatten; + + export type ContentCollectionKey = keyof ContentEntryMap; + export type DataCollectionKey = keyof DataEntryMap; + + type AllValuesOf = T extends any ? T[keyof T] : never; + type ValidContentEntrySlug = AllValuesOf< + ContentEntryMap[C] + >['slug']; + + export type ReferenceDataEntry< + C extends CollectionKey, + E extends keyof DataEntryMap[C] = string, + > = { + collection: C; + id: E; + }; + export type ReferenceContentEntry< + C extends keyof ContentEntryMap, + E extends ValidContentEntrySlug | (string & {}) = string, + > = { + collection: C; + slug: E; + }; + export type ReferenceLiveEntry = { + collection: C; + id: string; + }; + + /** @deprecated Use `getEntry` instead. */ + export function getEntryBySlug< + C extends keyof ContentEntryMap, + E extends ValidContentEntrySlug | (string & {}), + >( + collection: C, + // Note that this has to accept a regular string too, for SSR + entrySlug: E, + ): E extends ValidContentEntrySlug + ? Promise> + : Promise | undefined>; + + /** @deprecated Use `getEntry` instead. */ + export function getDataEntryById( + collection: C, + entryId: E, + ): Promise>; + + export function getCollection>( + collection: C, + filter?: (entry: CollectionEntry) => entry is E, + ): Promise; + export function getCollection( + collection: C, + filter?: (entry: CollectionEntry) => unknown, + ): Promise[]>; + + export function getLiveCollection( + collection: C, + filter?: LiveLoaderCollectionFilterType, + ): Promise< + import('astro').LiveDataCollectionResult, LiveLoaderErrorType> + >; + + export function getEntry< + C extends keyof ContentEntryMap, + E extends ValidContentEntrySlug | (string & {}), + >( + entry: ReferenceContentEntry, + ): E extends ValidContentEntrySlug + ? Promise> + : Promise | undefined>; + export function getEntry< + C extends keyof DataEntryMap, + E extends keyof DataEntryMap[C] | (string & {}), + >( + entry: ReferenceDataEntry, + ): E extends keyof DataEntryMap[C] + ? Promise + : Promise | undefined>; + export function getEntry< + C extends keyof ContentEntryMap, + E extends ValidContentEntrySlug | (string & {}), + >( + collection: C, + slug: E, + ): E extends ValidContentEntrySlug + ? Promise> + : Promise | undefined>; + export function getEntry< + C extends keyof DataEntryMap, + E extends keyof DataEntryMap[C] | (string & {}), + >( + collection: C, + id: E, + ): E extends keyof DataEntryMap[C] + ? string extends keyof DataEntryMap[C] + ? Promise | undefined + : Promise + : Promise | undefined>; + export function getLiveEntry( + collection: C, + filter: string | LiveLoaderEntryFilterType, + ): Promise, LiveLoaderErrorType>>; + + /** Resolve an array of entry references from the same collection */ + export function getEntries( + entries: ReferenceContentEntry>[], + ): Promise[]>; + export function getEntries( + entries: ReferenceDataEntry[], + ): Promise[]>; + + export function render( + entry: AnyEntryMap[C][string], + ): Promise; + + export function reference( + collection: C, + ): import('astro/zod').ZodEffects< + import('astro/zod').ZodString, + C extends keyof ContentEntryMap + ? ReferenceContentEntry> + : ReferenceDataEntry + >; + // Allow generic `string` to avoid excessive type errors in the config + // if `dev` is not running to update as you edit. + // Invalid collection names will be caught at build time. + export function reference( + collection: C, + ): import('astro/zod').ZodEffects; + + type ReturnTypeOrOriginal = T extends (...args: any[]) => infer R ? R : T; + type InferEntrySchema = import('astro/zod').infer< + ReturnTypeOrOriginal['schema']> + >; + + type ContentEntryMap = { + + }; + + type DataEntryMap = { + "docs": Record; + rendered?: RenderedContent; + filePath?: string; +}>; + + }; + + type AnyEntryMap = ContentEntryMap & DataEntryMap; + + type ExtractLoaderTypes = T extends import('astro/loaders').LiveLoader< + infer TData, + infer TEntryFilter, + infer TCollectionFilter, + infer TError + > + ? { data: TData; entryFilter: TEntryFilter; collectionFilter: TCollectionFilter; error: TError } + : { data: never; entryFilter: never; collectionFilter: never; error: never }; + type ExtractDataType = ExtractLoaderTypes['data']; + type ExtractEntryFilterType = ExtractLoaderTypes['entryFilter']; + type ExtractCollectionFilterType = ExtractLoaderTypes['collectionFilter']; + type ExtractErrorType = ExtractLoaderTypes['error']; + + type LiveLoaderDataType = + LiveContentConfig['collections'][C]['schema'] extends undefined + ? ExtractDataType + : import('astro/zod').infer< + Exclude + >; + type LiveLoaderEntryFilterType = + ExtractEntryFilterType; + type LiveLoaderCollectionFilterType = + ExtractCollectionFilterType; + type LiveLoaderErrorType = ExtractErrorType< + LiveContentConfig['collections'][C]['loader'] + >; + + export type ContentConfig = typeof import("../src/content.config.js"); + export type LiveContentConfig = never; +} diff --git a/sources/vonage_video_ios_app-theme-customization/.astro/data-store.json b/sources/vonage_video_ios_app-theme-customization/.astro/data-store.json new file mode 100644 index 00000000..27b0ccc2 --- /dev/null +++ b/sources/vonage_video_ios_app-theme-customization/.astro/data-store.json @@ -0,0 +1 @@ +[["Map",1,2,9,10],"meta::meta",["Map",3,4,5,6,7,8],"astro-version","5.18.1","content-config-digest","a30a942a2ceda2e1","astro-config-digest","{\"root\":{},\"srcDir\":{},\"publicDir\":{},\"outDir\":{},\"cacheDir\":{},\"compressHTML\":true,\"base\":\"/\",\"trailingSlash\":\"ignore\",\"output\":\"static\",\"scopedStyleStrategy\":\"where\",\"build\":{\"format\":\"directory\",\"client\":{},\"server\":{},\"assets\":\"_astro\",\"serverEntry\":\"entry.mjs\",\"redirects\":true,\"inlineStylesheets\":\"auto\",\"concurrency\":1},\"server\":{\"open\":false,\"host\":false,\"port\":4321,\"streaming\":true,\"allowedHosts\":[]},\"redirects\":{},\"image\":{\"endpoint\":{\"route\":\"/_image\"},\"service\":{\"entrypoint\":\"astro/assets/services/sharp\",\"config\":{}},\"domains\":[],\"remotePatterns\":[],\"responsiveStyles\":false},\"devToolbar\":{\"enabled\":true},\"markdown\":{\"syntaxHighlight\":false,\"shikiConfig\":{\"langs\":[],\"langAlias\":{},\"theme\":\"github-dark\",\"themes\":{},\"wrap\":false,\"transformers\":[]},\"remarkPlugins\":[null,null,null],\"rehypePlugins\":[[null,{\"experimentalHeadingIdCompat\":false}],null,[null,{\"themes\":[{\"name\":\"Night Owl No Italics\",\"type\":\"dark\",\"colors\":{\"focusBorder\":\"#122d42\",\"foreground\":\"#d6deeb\",\"disabledForeground\":\"#cccccc80\",\"descriptionForeground\":\"#d6deebb3\",\"errorForeground\":\"#ef5350\",\"icon.foreground\":\"#c5c5c5\",\"contrastActiveBorder\":null,\"contrastBorder\":\"#122d42\",\"textBlockQuote.background\":\"#7f7f7f1a\",\"textBlockQuote.border\":\"#007acc80\",\"textCodeBlock.background\":\"#4f4f4f\",\"textLink.activeForeground\":\"#3794ff\",\"textLink.foreground\":\"#3794ff\",\"textPreformat.foreground\":\"#d7ba7d\",\"textSeparator.foreground\":\"#ffffff2e\",\"editor.background\":\"#23262f\",\"editor.foreground\":\"#d6deeb\",\"editorLineNumber.foreground\":\"#4b6479\",\"editorLineNumber.activeForeground\":\"#c5e4fd\",\"editorActiveLineNumber.foreground\":\"#c6c6c6\",\"editor.selectionBackground\":\"#1d3b53\",\"editor.inactiveSelectionBackground\":\"#7e57c25a\",\"editor.selectionHighlightBackground\":\"#5f7e9779\",\"editorError.foreground\":\"#ef5350\",\"editorWarning.foreground\":\"#b39554\",\"editorInfo.foreground\":\"#3794ff\",\"editorHint.foreground\":\"#eeeeeeb2\",\"problemsErrorIcon.foreground\":\"#ef5350\",\"problemsWarningIcon.foreground\":\"#b39554\",\"problemsInfoIcon.foreground\":\"#3794ff\",\"editor.findMatchBackground\":\"#5f7e9779\",\"editor.findMatchHighlightBackground\":\"#1085bb5d\",\"editor.findRangeHighlightBackground\":\"#3a3d4166\",\"editorLink.activeForeground\":\"#4e94ce\",\"editorLightBulb.foreground\":\"#ffcc00\",\"editorLightBulbAutoFix.foreground\":\"#75beff\",\"diffEditor.insertedTextBackground\":\"#99b76d23\",\"diffEditor.insertedTextBorder\":\"#c5e47833\",\"diffEditor.removedTextBackground\":\"#ef535033\",\"diffEditor.removedTextBorder\":\"#ef53504d\",\"diffEditor.insertedLineBackground\":\"#9bb95533\",\"diffEditor.removedLineBackground\":\"#ff000033\",\"editorStickyScroll.background\":\"#011627\",\"editorStickyScrollHover.background\":\"#2a2d2e\",\"editorInlayHint.background\":\"#5f7e97cc\",\"editorInlayHint.foreground\":\"#ffffff\",\"editorInlayHint.typeBackground\":\"#5f7e97cc\",\"editorInlayHint.typeForeground\":\"#ffffff\",\"editorInlayHint.parameterBackground\":\"#5f7e97cc\",\"editorInlayHint.parameterForeground\":\"#ffffff\",\"editorPane.background\":\"#011627\",\"editorGroup.emptyBackground\":\"#011627\",\"editorGroup.focusedEmptyBorder\":null,\"editorGroupHeader.tabsBackground\":\"var(--sl-color-black)\",\"editorGroupHeader.tabsBorder\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"editorGroupHeader.noTabsBackground\":\"#011627\",\"editorGroupHeader.border\":null,\"editorGroup.border\":\"#011627\",\"editorGroup.dropBackground\":\"#7e57c273\",\"editorGroup.dropIntoPromptForeground\":\"#d6deeb\",\"editorGroup.dropIntoPromptBackground\":\"#021320\",\"editorGroup.dropIntoPromptBorder\":null,\"sideBySideEditor.horizontalBorder\":\"#011627\",\"sideBySideEditor.verticalBorder\":\"#011627\",\"scrollbar.shadow\":\"#010b14\",\"scrollbarSlider.background\":\"#ffffff17\",\"scrollbarSlider.hoverBackground\":\"#ffffff40\",\"scrollbarSlider.activeBackground\":\"#084d8180\",\"panel.background\":\"#011627\",\"panel.border\":\"#5f7e97\",\"panelTitle.activeBorder\":\"#5f7e97\",\"panelTitle.activeForeground\":\"#ffffffcc\",\"panelTitle.inactiveForeground\":\"#d6deeb80\",\"panelSectionHeader.background\":\"#80808051\",\"terminal.background\":\"#011627\",\"widget.shadow\":\"#011627\",\"editorWidget.background\":\"#021320\",\"editorWidget.foreground\":\"#d6deeb\",\"editorWidget.border\":\"#5f7e97\",\"quickInput.background\":\"#021320\",\"quickInput.foreground\":\"#d6deeb\",\"quickInputTitle.background\":\"#ffffff1a\",\"pickerGroup.foreground\":\"#d1aaff\",\"pickerGroup.border\":\"#011627\",\"editor.hoverHighlightBackground\":\"#7e57c25a\",\"editorHoverWidget.background\":\"#011627\",\"editorHoverWidget.foreground\":\"#d6deeb\",\"editorHoverWidget.border\":\"#5f7e97\",\"editorHoverWidget.statusBarBackground\":\"#011a2f\",\"titleBar.activeBackground\":\"var(--sl-color-black)\",\"titleBar.activeForeground\":\"var(--sl-color-text)\",\"titleBar.inactiveBackground\":\"#010e1a\",\"titleBar.inactiveForeground\":\"#eeefff99\",\"titleBar.border\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"toolbar.hoverBackground\":\"#5a5d5e50\",\"toolbar.activeBackground\":\"#63666750\",\"tab.activeBackground\":\"#0b2942\",\"tab.unfocusedActiveBackground\":\"#0b2942\",\"tab.inactiveBackground\":\"#01111d\",\"tab.unfocusedInactiveBackground\":\"#01111d\",\"tab.activeForeground\":\"var(--sl-color-text)\",\"tab.inactiveForeground\":\"#5f7e97\",\"tab.unfocusedActiveForeground\":\"#5f7e97\",\"tab.unfocusedInactiveForeground\":\"#5f7e97\",\"tab.hoverBackground\":null,\"tab.unfocusedHoverBackground\":null,\"tab.hoverForeground\":null,\"tab.unfocusedHoverForeground\":null,\"tab.border\":\"#272b3b\",\"tab.lastPinnedBorder\":\"#585858\",\"tab.activeBorder\":\"transparent\",\"tab.unfocusedActiveBorder\":\"#262a39\",\"tab.activeBorderTop\":\"var(--sl-color-accent-high)\",\"tab.unfocusedActiveBorderTop\":null,\"tab.hoverBorder\":null,\"tab.unfocusedHoverBorder\":null,\"tab.activeModifiedBorder\":\"#3399cc\",\"tab.inactiveModifiedBorder\":\"#3399cc80\",\"tab.unfocusedActiveModifiedBorder\":\"#3399cc80\",\"tab.unfocusedInactiveModifiedBorder\":\"#3399cc40\",\"badge.background\":\"#5f7e97\",\"badge.foreground\":\"#ffffff\",\"button.background\":\"#7e57c2cc\",\"button.foreground\":\"#ffffffcc\",\"button.border\":\"#122d42\",\"button.separator\":\"#ffffff52\",\"button.hoverBackground\":\"#7e57c2\",\"button.secondaryBackground\":\"#3a3d41\",\"button.secondaryForeground\":\"#ffffff\",\"button.secondaryHoverBackground\":\"#46494e\",\"dropdown.background\":\"#011627\",\"dropdown.foreground\":\"#ffffffcc\",\"dropdown.border\":\"#5f7e97\",\"list.activeSelectionBackground\":\"#234d708c\",\"list.activeSelectionForeground\":\"#ffffff\",\"tree.indentGuidesStroke\":\"#585858\",\"input.background\":\"#0b253a\",\"input.foreground\":\"#ffffffcc\",\"input.placeholderForeground\":\"#5f7e97\",\"inputOption.activeBorder\":\"#ffffffcc\",\"inputOption.hoverBackground\":\"#5a5d5e80\",\"inputOption.activeBackground\":\"#122d4266\",\"inputOption.activeForeground\":\"#ffffff\",\"inputValidation.infoBackground\":\"#00589ef2\",\"inputValidation.infoBorder\":\"#64b5f6\",\"inputValidation.warningBackground\":\"#675700f2\",\"inputValidation.warningBorder\":\"#ffca28\",\"inputValidation.errorBackground\":\"#ab0300f2\",\"inputValidation.errorBorder\":\"#ef5350\",\"keybindingLabel.background\":\"#8080802b\",\"keybindingLabel.foreground\":\"#cccccc\",\"keybindingLabel.border\":\"#33333399\",\"keybindingLabel.bottomBorder\":\"#44444499\",\"menu.foreground\":\"#ffffffcc\",\"menu.background\":\"#011627\",\"menu.selectionForeground\":\"#ffffff\",\"menu.selectionBackground\":\"#234d708c\",\"menu.separatorBackground\":\"#606060\",\"editor.snippetTabstopHighlightBackground\":\"#7c7c74c\",\"editor.snippetFinalTabstopHighlightBorder\":\"#525252\",\"terminal.ansiBlack\":\"#011627\",\"terminal.ansiRed\":\"#ef5350\",\"terminal.ansiGreen\":\"#22da6e\",\"terminal.ansiYellow\":\"#c5e478\",\"terminal.ansiBlue\":\"#82aaff\",\"terminal.ansiMagenta\":\"#c792ea\",\"terminal.ansiCyan\":\"#21c7a8\",\"terminal.ansiWhite\":\"#ffffff\",\"terminal.ansiBrightBlack\":\"#575656\",\"terminal.ansiBrightRed\":\"#ef5350\",\"terminal.ansiBrightGreen\":\"#22da6e\",\"terminal.ansiBrightYellow\":\"#ffeb95\",\"terminal.ansiBrightBlue\":\"#82aaff\",\"terminal.ansiBrightMagenta\":\"#c792ea\",\"terminal.ansiBrightCyan\":\"#7fdbca\",\"terminal.ansiBrightWhite\":\"#ffffff\",\"selection.background\":\"#4373c2\",\"input.border\":\"#5f7e97\",\"punctuation.definition.generic.begin.html\":\"#ef5350f2\",\"progress.background\":\"#7e57c2\",\"breadcrumb.foreground\":\"#a599e9\",\"breadcrumb.focusForeground\":\"#ffffff\",\"breadcrumb.activeSelectionForeground\":\"#ffffff\",\"breadcrumbPicker.background\":\"#001122\",\"list.invalidItemForeground\":\"#975f94\",\"list.dropBackground\":\"#011627\",\"list.focusBackground\":\"#010d18\",\"list.focusForeground\":\"#ffffff\",\"list.highlightForeground\":\"#ffffff\",\"list.hoverBackground\":\"#011627\",\"list.hoverForeground\":\"#ffffff\",\"list.inactiveSelectionBackground\":\"#0e293f\",\"list.inactiveSelectionForeground\":\"#5f7e97\",\"activityBar.background\":\"#011627\",\"activityBar.dropBackground\":\"#5f7e97\",\"activityBar.foreground\":\"#5f7e97\",\"activityBar.border\":\"#011627\",\"activityBarBadge.background\":\"#44596b\",\"activityBarBadge.foreground\":\"#ffffff\",\"sideBar.background\":\"#011627\",\"sideBar.foreground\":\"#89a4bb\",\"sideBar.border\":\"#011627\",\"sideBarTitle.foreground\":\"#5f7e97\",\"sideBarSectionHeader.background\":\"#011627\",\"sideBarSectionHeader.foreground\":\"#5f7e97\",\"editorCursor.foreground\":\"#80a4c2\",\"editor.wordHighlightBackground\":\"#f6bbe533\",\"editor.wordHighlightStrongBackground\":\"#e2a2f433\",\"editor.lineHighlightBackground\":\"#0003\",\"editor.rangeHighlightBackground\":\"#7e57c25a\",\"editorIndentGuide.background\":\"#5e81ce52\",\"editorIndentGuide.activeBackground\":\"#7e97ac\",\"editorRuler.foreground\":\"#5e81ce52\",\"editorCodeLens.foreground\":\"#5e82ceb4\",\"editorBracketMatch.background\":\"#5f7e974d\",\"editorOverviewRuler.currentContentForeground\":\"#7e57c2\",\"editorOverviewRuler.incomingContentForeground\":\"#7e57c2\",\"editorOverviewRuler.commonContentForeground\":\"#7e57c2\",\"editorGutter.background\":\"#011627\",\"editorGutter.modifiedBackground\":\"#e2b93d\",\"editorGutter.addedBackground\":\"#9ccc65\",\"editorGutter.deletedBackground\":\"#ef5350\",\"editorSuggestWidget.background\":\"#2c3043\",\"editorSuggestWidget.border\":\"#2b2f40\",\"editorSuggestWidget.foreground\":\"#d6deeb\",\"editorSuggestWidget.highlightForeground\":\"#ffffff\",\"editorSuggestWidget.selectedBackground\":\"#5f7e97\",\"debugExceptionWidget.background\":\"#011627\",\"debugExceptionWidget.border\":\"#5f7e97\",\"editorMarkerNavigation.background\":\"#0b2942\",\"editorMarkerNavigationError.background\":\"#ef5350\",\"editorMarkerNavigationWarning.background\":\"#ffca28\",\"peekView.border\":\"#5f7e97\",\"peekViewEditor.background\":\"#011627\",\"peekViewEditor.matchHighlightBackground\":\"#7e57c25a\",\"peekViewResult.background\":\"#011627\",\"peekViewResult.fileForeground\":\"#5f7e97\",\"peekViewResult.lineForeground\":\"#5f7e97\",\"peekViewResult.matchHighlightBackground\":\"#ffffffcc\",\"peekViewResult.selectionBackground\":\"#2e3250\",\"peekViewResult.selectionForeground\":\"#5f7e97\",\"peekViewTitle.background\":\"#011627\",\"peekViewTitleDescription.foreground\":\"#697098\",\"peekViewTitleLabel.foreground\":\"#5f7e97\",\"merge.currentHeaderBackground\":\"#5f7e97\",\"merge.incomingHeaderBackground\":\"#7e57c25a\",\"statusBar.background\":\"#011627\",\"statusBar.foreground\":\"#5f7e97\",\"statusBar.border\":\"#262a39\",\"statusBar.debuggingBackground\":\"#202431\",\"statusBar.debuggingBorder\":\"#1f2330\",\"statusBar.noFolderBackground\":\"#011627\",\"statusBar.noFolderBorder\":\"#25293a\",\"statusBarItem.activeBackground\":\"#202431\",\"statusBarItem.hoverBackground\":\"#202431\",\"statusBarItem.prominentBackground\":\"#202431\",\"statusBarItem.prominentHoverBackground\":\"#202431\",\"notifications.background\":\"#01111d\",\"notifications.border\":\"#262a39\",\"notificationCenter.border\":\"#262a39\",\"notificationToast.border\":\"#262a39\",\"notifications.foreground\":\"#ffffffcc\",\"notificationLink.foreground\":\"#80cbc4\",\"extensionButton.prominentForeground\":\"#ffffffcc\",\"extensionButton.prominentBackground\":\"#7e57c2cc\",\"extensionButton.prominentHoverBackground\":\"#7e57c2\",\"terminal.selectionBackground\":\"#1b90dd4d\",\"terminalCursor.background\":\"#234d70\",\"debugToolBar.background\":\"#011627\",\"welcomePage.buttonBackground\":\"#011627\",\"welcomePage.buttonHoverBackground\":\"#011627\",\"walkThrough.embeddedEditorBackground\":\"#011627\",\"gitDecoration.modifiedResourceForeground\":\"#a2bffc\",\"gitDecoration.deletedResourceForeground\":\"#ef535090\",\"gitDecoration.untrackedResourceForeground\":\"#c5e478ff\",\"gitDecoration.ignoredResourceForeground\":\"#395a75\",\"gitDecoration.conflictingResourceForeground\":\"#ffeb95cc\",\"source.elm\":\"#5f7e97\",\"string.quoted.single.js\":\"#ffffff\",\"meta.objectliteral.js\":\"#82aaff\"},\"fg\":\"#d6deeb\",\"bg\":\"#23262f\",\"semanticHighlighting\":false,\"settings\":[{\"name\":\"Changed\",\"scope\":[\"markup.changed\",\"meta.diff.header.git\",\"meta.diff.header.from-file\",\"meta.diff.header.to-file\"],\"settings\":{\"foreground\":\"#a2bffc\"}},{\"name\":\"Deleted\",\"scope\":[\"markup.deleted.diff\"],\"settings\":{\"foreground\":\"#f27775fe\"}},{\"name\":\"Inserted\",\"scope\":[\"markup.inserted.diff\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Global settings\",\"settings\":{\"background\":\"#011627\",\"foreground\":\"#d6deeb\"}},{\"name\":\"Comment\",\"scope\":[\"comment\"],\"settings\":{\"foreground\":\"#919f9f\",\"fontStyle\":\"\"}},{\"name\":\"String\",\"scope\":[\"string\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"String Quoted\",\"scope\":[\"string.quoted\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"Support Constant Math\",\"scope\":[\"support.constant.math\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Number\",\"scope\":[\"constant.numeric\",\"constant.character.numeric\"],\"settings\":{\"foreground\":\"#f78c6c\",\"fontStyle\":\"\"}},{\"name\":\"Built-in constant\",\"scope\":[\"constant.language\",\"punctuation.definition.constant\",\"variable.other.constant\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"User-defined constant\",\"scope\":[\"constant.character\",\"constant.other\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Constant Character Escape\",\"scope\":[\"constant.character.escape\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"RegExp String\",\"scope\":[\"string.regexp\",\"string.regexp keyword.other\"],\"settings\":{\"foreground\":\"#5ca7e4\"}},{\"name\":\"Comma in functions\",\"scope\":[\"meta.function punctuation.separator.comma\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"Variable\",\"scope\":[\"variable\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Keyword\",\"scope\":[\"punctuation.accessor\",\"keyword\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Storage\",\"scope\":[\"storage\",\"meta.var.expr\",\"meta.class meta.method.declaration meta.var.expr storage.type.js\",\"storage.type.property.js\",\"storage.type.property.ts\",\"storage.type.property.tsx\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type.function.arrow.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Class name\",\"scope\":[\"entity.name.class\",\"meta.class entity.name.type.class\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Inherited class\",\"scope\":[\"entity.other.inherited-class\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Function name\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Meta Tag\",\"scope\":[\"punctuation.definition.tag\",\"meta.tag\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"HTML Tag names\",\"scope\":[\"entity.name.tag\",\"meta.tag.other.html\",\"meta.tag.other.js\",\"meta.tag.other.tsx\",\"entity.name.tag.tsx\",\"entity.name.tag.js\",\"entity.name.tag\",\"meta.tag.js\",\"meta.tag.tsx\",\"meta.tag.html\"],\"settings\":{\"foreground\":\"#caece6\",\"fontStyle\":\"\"}},{\"name\":\"Tag attribute\",\"scope\":[\"entity.other.attribute-name\"],\"settings\":{\"fontStyle\":\"\",\"foreground\":\"#c5e478\"}},{\"name\":\"Entity Name Tag Custom\",\"scope\":[\"entity.name.tag.custom\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Library (function & constant)\",\"scope\":[\"support.function\",\"support.constant\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Support Constant Property Value meta\",\"scope\":[\"support.constant.meta.property-value\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Library class/type\",\"scope\":[\"support.type\",\"support.class\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Support Variable DOM\",\"scope\":[\"support.variable.dom\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Invalid\",\"scope\":[\"invalid\"],\"settings\":{\"background\":\"#ff2c83\",\"foreground\":\"#ffffff\"}},{\"name\":\"Invalid deprecated\",\"scope\":[\"invalid.deprecated\"],\"settings\":{\"foreground\":\"#ffffff\",\"background\":\"#d3423e\"}},{\"name\":\"Keyword Operator\",\"scope\":[\"keyword.operator\"],\"settings\":{\"foreground\":\"#7fdbca\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Relational\",\"scope\":[\"keyword.operator.relational\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Assignment\",\"scope\":[\"keyword.operator.assignment\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Arithmetic\",\"scope\":[\"keyword.operator.arithmetic\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Bitwise\",\"scope\":[\"keyword.operator.bitwise\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Increment\",\"scope\":[\"keyword.operator.increment\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Ternary\",\"scope\":[\"keyword.operator.ternary\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Double-Slashed Comment\",\"scope\":[\"comment.line.double-slash\"],\"settings\":{\"foreground\":\"#919f9f\"}},{\"name\":\"Object\",\"scope\":[\"object\"],\"settings\":{\"foreground\":\"#cdebf7\"}},{\"name\":\"Null\",\"scope\":[\"constant.language.null\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Meta Brace\",\"scope\":[\"meta.brace\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Meta Delimiter Period\",\"scope\":[\"meta.delimiter.period\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Punctuation Definition String\",\"scope\":[\"punctuation.definition.string\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Punctuation Definition String Markdown\",\"scope\":[\"punctuation.definition.string.begin.markdown\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Boolean\",\"scope\":[\"constant.language.boolean\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Object Comma\",\"scope\":[\"object.comma\"],\"settings\":{\"foreground\":\"#ffffff\"}},{\"name\":\"Variable Parameter Function\",\"scope\":[\"variable.parameter.function\"],\"settings\":{\"foreground\":\"#7fdbca\",\"fontStyle\":\"\"}},{\"name\":\"Support Type Property Name & entity name tags\",\"scope\":[\"support.type.vendor.property-name\",\"support.constant.vendor.property-value\",\"support.type.property-name\",\"meta.property-list entity.name.tag\"],\"settings\":{\"foreground\":\"#80cbc4\",\"fontStyle\":\"\"}},{\"name\":\"Entity Name tag reference in stylesheets\",\"scope\":[\"meta.property-list entity.name.tag.reference\"],\"settings\":{\"foreground\":\"#57eaf1\"}},{\"name\":\"Constant Other Color RGB Value Punctuation Definition Constant\",\"scope\":[\"constant.other.color.rgb-value punctuation.definition.constant\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Constant Other Color\",\"scope\":[\"constant.other.color\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Keyword Other Unit\",\"scope\":[\"keyword.other.unit\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Meta Selector\",\"scope\":[\"meta.selector\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Entity Other Attribute Name Id\",\"scope\":[\"entity.other.attribute-name.id\"],\"settings\":{\"foreground\":\"#fad430\"}},{\"name\":\"Meta Property Name\",\"scope\":[\"meta.property-name\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Doctypes\",\"scope\":[\"entity.name.tag.doctype\",\"meta.tag.sgml.doctype\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Punctuation Definition Parameters\",\"scope\":[\"punctuation.definition.parameters\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Keyword Control Operator\",\"scope\":[\"keyword.control.operator\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Keyword Operator Logical\",\"scope\":[\"keyword.operator.logical\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Variable Instances\",\"scope\":[\"variable.instance\",\"variable.other.instance\",\"variable.readwrite.instance\",\"variable.other.readwrite.instance\",\"variable.other.property\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Variable Property Other object property\",\"scope\":[\"variable.other.object.property\"],\"settings\":{\"foreground\":\"#faf39f\",\"fontStyle\":\"\"}},{\"name\":\"Variable Property Other object\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Entity Name Function\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#82aaff\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Comparison, returns, imports, and Keyword Operator Ruby\",\"scope\":[\"keyword.control.conditional.js\",\"keyword.operator.comparison\",\"keyword.control.flow.js\",\"keyword.control.flow.ts\",\"keyword.control.flow.tsx\",\"keyword.control.ruby\",\"keyword.control.def.ruby\",\"keyword.control.loop.js\",\"keyword.control.loop.ts\",\"keyword.control.import.js\",\"keyword.control.import.ts\",\"keyword.control.import.tsx\",\"keyword.control.from.js\",\"keyword.control.from.ts\",\"keyword.control.from.tsx\",\"keyword.control.conditional.js\",\"keyword.control.conditional.ts\",\"keyword.control.switch.js\",\"keyword.control.switch.ts\",\"keyword.operator.instanceof.js\",\"keyword.operator.expression.instanceof.ts\",\"keyword.operator.expression.instanceof.tsx\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Support Constant, `new` keyword, Special Method Keyword, `debugger`, other keywords\",\"scope\":[\"support.constant\",\"keyword.other.special-method\",\"keyword.other.new\",\"keyword.other.debugger\",\"keyword.control\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Support Function\",\"scope\":[\"support.function\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Invalid Broken\",\"scope\":[\"invalid.broken\"],\"settings\":{\"foreground\":\"#989da0\",\"background\":\"#F78C6C\"}},{\"name\":\"Invalid Unimplemented\",\"scope\":[\"invalid.unimplemented\"],\"settings\":{\"background\":\"#8BD649\",\"foreground\":\"#ffffff\"}},{\"name\":\"Invalid Illegal\",\"scope\":[\"invalid.illegal\"],\"settings\":{\"foreground\":\"#ffffff\",\"background\":\"#ec5f67\"}},{\"name\":\"Language Variable\",\"scope\":[\"variable.language\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Support Variable Property\",\"scope\":[\"support.variable.property\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Variable Function\",\"scope\":[\"variable.function\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Variable Interpolation\",\"scope\":[\"variable.interpolation\"],\"settings\":{\"foreground\":\"#ef787f\"}},{\"name\":\"Meta Function Call\",\"scope\":[\"meta.function-call\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Punctuation Section Embedded\",\"scope\":[\"punctuation.section.embedded\"],\"settings\":{\"foreground\":\"#e2817f\"}},{\"name\":\"Punctuation Tweaks\",\"scope\":[\"punctuation.terminator.expression\",\"punctuation.definition.arguments\",\"punctuation.definition.array\",\"punctuation.section.array\",\"meta.array\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"More Punctuation Tweaks\",\"scope\":[\"punctuation.definition.list.begin\",\"punctuation.definition.list.end\",\"punctuation.separator.arguments\",\"punctuation.definition.list\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Template Strings\",\"scope\":[\"string.template meta.template.expression\"],\"settings\":{\"foreground\":\"#e2817f\"}},{\"name\":\"Backticks(``) in Template Strings\",\"scope\":[\"string.template punctuation.definition.string\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Italics\",\"scope\":[\"italic\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"italic\"}},{\"name\":\"Bold\",\"scope\":[\"bold\"],\"settings\":{\"foreground\":\"#c5e478\",\"fontStyle\":\"bold\"}},{\"name\":\"Quote\",\"scope\":[\"quote\"],\"settings\":{\"foreground\":\"#969bb7\",\"fontStyle\":\"\"}},{\"name\":\"Raw Code\",\"scope\":[\"raw\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"CoffeeScript Variable Assignment\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#31e1eb\"}},{\"name\":\"CoffeeScript Parameter Function\",\"scope\":[\"variable.parameter.function.coffee\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"CoffeeScript Assignments\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"C# Readwrite Variables\",\"scope\":[\"variable.other.readwrite.cs\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C# Classes & Storage types\",\"scope\":[\"entity.name.type.class.cs\",\"storage.type.cs\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"C# Namespaces\",\"scope\":[\"entity.name.type.namespace.cs\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"C# Unquoted String Zone\",\"scope\":[\"string.unquoted.preprocessor.message.cs\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C# Region\",\"scope\":[\"punctuation.separator.hash.cs\",\"keyword.preprocessor.region.cs\",\"keyword.preprocessor.endregion.cs\"],\"settings\":{\"foreground\":\"#ffcb8b\",\"fontStyle\":\"bold\"}},{\"name\":\"C# Other Variables\",\"scope\":[\"variable.other.object.cs\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"C# Enum\",\"scope\":[\"entity.name.type.enum.cs\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Dart String\",\"scope\":[\"string.interpolated.single.dart\",\"string.interpolated.double.dart\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Dart Class\",\"scope\":[\"support.class.dart\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Tag names in Stylesheets\",\"scope\":[\"entity.name.tag.css\",\"entity.name.tag.less\",\"entity.name.tag.custom.css\",\"support.constant.property-value.css\"],\"settings\":{\"foreground\":\"#ff6d6d\",\"fontStyle\":\"\"}},{\"name\":\"Wildcard(*) selector in Stylesheets\",\"scope\":[\"entity.name.tag.wildcard.css\",\"entity.name.tag.wildcard.less\",\"entity.name.tag.wildcard.scss\",\"entity.name.tag.wildcard.sass\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"CSS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Attribute Name for CSS\",\"scope\":[\"meta.attribute-selector.css entity.other.attribute-name.attribute\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Elixir Classes\",\"scope\":[\"source.elixir support.type.elixir\",\"source.elixir meta.module.elixir entity.name.class.elixir\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Elixir Functions\",\"scope\":[\"source.elixir entity.name.function\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir Constants\",\"scope\":[\"source.elixir constant.other.symbol.elixir\",\"source.elixir constant.other.keywords.elixir\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Elixir String Punctuations\",\"scope\":[\"source.elixir punctuation.definition.string\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir\",\"scope\":[\"source.elixir variable.other.readwrite.module.elixir\",\"source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir Binary Punctuations\",\"scope\":[\"source.elixir .punctuation.binary.elixir\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Closure Constant Keyword\",\"scope\":[\"constant.keyword.clojure\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Go Function Calls\",\"scope\":[\"source.go meta.function-call.go\"],\"settings\":{\"foreground\":\"#dddddd\"}},{\"name\":\"Go Keywords\",\"scope\":[\"source.go keyword.package.go\",\"source.go keyword.import.go\",\"source.go keyword.function.go\",\"source.go keyword.type.go\",\"source.go keyword.struct.go\",\"source.go keyword.interface.go\",\"source.go keyword.const.go\",\"source.go keyword.var.go\",\"source.go keyword.map.go\",\"source.go keyword.channel.go\",\"source.go keyword.control.go\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Go Constants e.g. nil, string format (%s, %d, etc.)\",\"scope\":[\"source.go constant.language.go\",\"source.go constant.other.placeholder.go\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"C++ Functions\",\"scope\":[\"entity.name.function.preprocessor.cpp\",\"entity.scope.name.cpp\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"C++ Meta Namespace\",\"scope\":[\"meta.namespace-block.cpp\"],\"settings\":{\"foreground\":\"#e0dec6\"}},{\"name\":\"C++ Language Primitive Storage\",\"scope\":[\"storage.type.language.primitive.cpp\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"C++ Preprocessor Macro\",\"scope\":[\"meta.preprocessor.macro.cpp\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C++ Variable Parameter\",\"scope\":[\"variable.parameter\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Powershell Variables\",\"scope\":[\"variable.other.readwrite.powershell\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Powershell Function\",\"scope\":[\"support.function.powershell\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"ID Attribute Name in HTML\",\"scope\":[\"entity.other.attribute-name.id.html\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"HTML Punctuation Definition Tag\",\"scope\":[\"punctuation.definition.tag.html\"],\"settings\":{\"foreground\":\"#6ae9f0\"}},{\"name\":\"HTML Doctype\",\"scope\":[\"meta.tag.sgml.doctype.html\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Classes\",\"scope\":[\"meta.class entity.name.type.class.js\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"JavaScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.js\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"JavaScript Terminator\",\"scope\":[\"terminator.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Meta Punctuation Definition\",\"scope\":[\"meta.js punctuation.definition.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Entity Names in Code Documentations\",\"scope\":[\"entity.name.type.instance.jsdoc\",\"entity.name.type.instance.phpdoc\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"Other Variables in Code Documentations\",\"scope\":[\"variable.other.jsdoc\",\"variable.other.phpdoc\"],\"settings\":{\"foreground\":\"#78ccf0\"}},{\"name\":\"JavaScript module imports and exports\",\"scope\":[\"variable.other.meta.import.js\",\"meta.import.js variable.other\",\"variable.other.meta.export.js\",\"meta.export.js variable.other\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Variable Parameter Function\",\"scope\":[\"variable.parameter.function.js\"],\"settings\":{\"foreground\":\"#8b96ea\"}},{\"name\":\"JavaScript[React] Variable Other Object\",\"scope\":[\"variable.other.object.js\",\"variable.other.object.jsx\",\"variable.object.property.js\",\"variable.object.property.jsx\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Variables\",\"scope\":[\"variable.js\",\"variable.other.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Entity Name Type\",\"scope\":[\"entity.name.type.js\",\"entity.name.type.module.js\"],\"settings\":{\"foreground\":\"#ffcb8b\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Support Classes\",\"scope\":[\"support.class.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JSON Property Names\",\"scope\":[\"support.type.property-name.json\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"JSON Support Constants\",\"scope\":[\"support.constant.json\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"JSON Property values (string)\",\"scope\":[\"meta.structure.dictionary.value.json string.quoted.double\"],\"settings\":{\"foreground\":\"#c789d6\"}},{\"name\":\"Strings in JSON values\",\"scope\":[\"string.quoted.double.json punctuation.definition.string.json\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Specific JSON Property values like null\",\"scope\":[\"meta.structure.dictionary.json meta.structure.dictionary.value constant.language\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"JavaScript Other Variable\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Ruby Variables\",\"scope\":[\"variable.other.ruby\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Ruby Class\",\"scope\":[\"entity.name.type.class.ruby\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"Ruby Hashkeys\",\"scope\":[\"constant.language.symbol.hashkey.ruby\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"LESS Tag names\",\"scope\":[\"entity.name.tag.less\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"LESS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Attribute Name for LESS\",\"scope\":[\"meta.attribute-selector.less entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Markdown Headings\",\"scope\":[\"markup.heading.markdown\",\"markup.heading.setext.1.markdown\",\"markup.heading.setext.2.markdown\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown Italics\",\"scope\":[\"markup.italic.markdown\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"italic\"}},{\"name\":\"Markdown Bold\",\"scope\":[\"markup.bold.markdown\"],\"settings\":{\"foreground\":\"#c5e478\",\"fontStyle\":\"bold\"}},{\"name\":\"Markdown Quote + others\",\"scope\":[\"markup.quote.markdown\"],\"settings\":{\"foreground\":\"#969bb7\",\"fontStyle\":\"\"}},{\"name\":\"Markdown Raw Code + others\",\"scope\":[\"markup.inline.raw.markdown\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Markdown Links\",\"scope\":[\"markup.underline.link.markdown\",\"markup.underline.link.image.markdown\"],\"settings\":{\"foreground\":\"#ff869a\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Link Title and Description\",\"scope\":[\"string.other.link.title.markdown\",\"string.other.link.description.markdown\"],\"settings\":{\"foreground\":\"#d6deeb\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Punctuation\",\"scope\":[\"punctuation.definition.string.markdown\",\"punctuation.definition.string.begin.markdown\",\"punctuation.definition.string.end.markdown\",\"meta.link.inline.markdown punctuation.definition.string\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown MetaData Punctuation\",\"scope\":[\"punctuation.definition.metadata.markdown\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Markdown List Punctuation\",\"scope\":[\"beginning.punctuation.definition.list.markdown\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown Inline Raw String\",\"scope\":[\"markup.inline.raw.string.markdown\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"PHP Variables\",\"scope\":[\"variable.other.php\"],\"settings\":{\"foreground\":\"#bec5d4\"}},{\"name\":\"Support Classes in PHP\",\"scope\":[\"support.class.php\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Punctuations in PHP function calls\",\"scope\":[\"meta.function-call.php punctuation\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"PHP Global Variables\",\"scope\":[\"variable.other.global.php\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Declaration Punctuation in PHP Global Variables\",\"scope\":[\"variable.other.global.php punctuation.definition.variable\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Language Constants in Python\",\"scope\":[\"constant.language.python\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Python Function Parameter and Arguments\",\"scope\":[\"variable.parameter.function.python\",\"meta.function-call.arguments.python\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Python Function Call\",\"scope\":[\"meta.function-call.python\",\"meta.function-call.generic.python\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"Punctuations in Python\",\"scope\":[\"punctuation.python\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Decorator Functions in Python\",\"scope\":[\"entity.name.function.decorator.python\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Python Language Variable\",\"scope\":[\"source.python variable.language.special\"],\"settings\":{\"foreground\":\"#8eace3\"}},{\"name\":\"Python import control keyword\",\"scope\":[\"keyword.control\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"SCSS Variable\",\"scope\":[\"variable.scss\",\"variable.sass\",\"variable.parameter.url.scss\",\"variable.parameter.url.sass\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#bec5d4\"}},{\"name\":\"Attribute Name for SASS\",\"scope\":[\"meta.attribute-selector.scss entity.other.attribute-name.attribute\",\"meta.attribute-selector.sass entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Tag names in SASS\",\"scope\":[\"entity.name.tag.scss\",\"entity.name.tag.sass\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"SASS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.scss\",\"keyword.other.unit.sass\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"TypeScript[React] Variables and Object Properties\",\"scope\":[\"variable.other.readwrite.alias.ts\",\"variable.other.readwrite.alias.tsx\",\"variable.other.readwrite.ts\",\"variable.other.readwrite.tsx\",\"variable.other.object.ts\",\"variable.other.object.tsx\",\"variable.object.property.ts\",\"variable.object.property.tsx\",\"variable.other.ts\",\"variable.other.tsx\",\"variable.tsx\",\"variable.ts\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript[React] Entity Name Types\",\"scope\":[\"entity.name.type.ts\",\"entity.name.type.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript[React] Node Classes\",\"scope\":[\"support.class.node.ts\",\"support.class.node.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"TypeScript[React] Entity Name Types as Parameters\",\"scope\":[\"meta.type.parameters.ts entity.name.type\",\"meta.type.parameters.tsx entity.name.type\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"TypeScript[React] Import/Export Punctuations\",\"scope\":[\"meta.import.ts punctuation.definition.block\",\"meta.import.tsx punctuation.definition.block\",\"meta.export.ts punctuation.definition.block\",\"meta.export.tsx punctuation.definition.block\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.decorator punctuation.decorator.ts\",\"meta.decorator punctuation.decorator.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.tag.js meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"YAML Entity Name Tags\",\"scope\":[\"entity.name.tag.yaml\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"JavaScript Variable Other ReadWrite\",\"scope\":[\"variable.other.readwrite.js\",\"variable.parameter\"],\"settings\":{\"foreground\":\"#d7dbe0\"}},{\"name\":\"Support Class Component\",\"scope\":[\"support.class.component.js\",\"support.class.component.tsx\"],\"settings\":{\"foreground\":\"#f78c6c\",\"fontStyle\":\"\"}},{\"name\":\"Text nested in React tags\",\"scope\":[\"meta.jsx.children\",\"meta.jsx.children.js\",\"meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript Classes\",\"scope\":[\"meta.class entity.name.type.class.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript Entity Name Type\",\"scope\":[\"entity.name.type.tsx\",\"entity.name.type.module.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript Class Variable Keyword\",\"scope\":[\"meta.class.ts meta.var.expr.ts storage.type.ts\",\"meta.class.tsx meta.var.expr.tsx storage.type.tsx\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"TypeScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.ts\",\"meta.method.declaration storage.type.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"normalize font style of certain components\",\"scope\":[\"meta.property-list.css meta.property-value.css variable.other.less\",\"meta.property-list.scss variable.scss\",\"meta.property-list.sass variable.sass\",\"meta.brace\",\"keyword.operator.operator\",\"keyword.operator.or.regexp\",\"keyword.operator.expression.in\",\"keyword.operator.relational\",\"keyword.operator.assignment\",\"keyword.operator.comparison\",\"keyword.operator.type\",\"keyword.operator\",\"keyword\",\"punctuation.definition.string\",\"punctuation\",\"variable.other.readwrite.js\",\"storage.type\",\"source.css\",\"string.quoted\"],\"settings\":{\"fontStyle\":\"\"}}],\"styleOverrides\":{\"frames\":{\"editorBackground\":\"var(--sl-color-gray-6)\",\"terminalBackground\":\"var(--sl-color-gray-6)\",\"editorActiveTabBackground\":\"var(--sl-color-gray-6)\",\"terminalTitlebarDotsForeground\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"terminalTitlebarDotsOpacity\":\"0.75\",\"inlineButtonForeground\":\"var(--sl-color-text)\",\"frameBoxShadowCssValue\":\"none\"},\"textMarkers\":{\"markBackground\":\"#ffffff17\",\"markBorderColor\":\"#ffffff40\"}}},{\"name\":\"Night Owl Light\",\"type\":\"light\",\"colors\":{\"focusBorder\":\"#93a1a1\",\"foreground\":\"#403f53\",\"disabledForeground\":\"#61616180\",\"descriptionForeground\":\"#403f53\",\"errorForeground\":\"#403f53\",\"icon.foreground\":\"#424242\",\"contrastActiveBorder\":null,\"contrastBorder\":null,\"textBlockQuote.background\":\"#7f7f7f1a\",\"textBlockQuote.border\":\"#007acc80\",\"textCodeBlock.background\":\"#dcdcdc66\",\"textLink.activeForeground\":\"#006ab1\",\"textLink.foreground\":\"#006ab1\",\"textPreformat.foreground\":\"#a31515\",\"textSeparator.foreground\":\"#0000002e\",\"editor.background\":\"#f6f7f9\",\"editor.foreground\":\"#403f53\",\"editorLineNumber.foreground\":\"#90a7b2\",\"editorLineNumber.activeForeground\":\"#403f53\",\"editorActiveLineNumber.foreground\":\"#0b216f\",\"editor.selectionBackground\":\"#e0e0e0\",\"editor.inactiveSelectionBackground\":\"#e0e0e080\",\"editor.selectionHighlightBackground\":\"#339cec33\",\"editorError.foreground\":\"#e64d49\",\"editorWarning.foreground\":\"#daaa01\",\"editorInfo.foreground\":\"#1a85ff\",\"editorHint.foreground\":\"#6c6c6c\",\"problemsErrorIcon.foreground\":\"#e64d49\",\"problemsWarningIcon.foreground\":\"#daaa01\",\"problemsInfoIcon.foreground\":\"#1a85ff\",\"editor.findMatchBackground\":\"#93a1a16c\",\"editor.findMatchHighlightBackground\":\"#93a1a16c\",\"editor.findRangeHighlightBackground\":\"#7497a633\",\"editorLink.activeForeground\":\"#0000ff\",\"editorLightBulb.foreground\":\"#ddb100\",\"editorLightBulbAutoFix.foreground\":\"#007acc\",\"diffEditor.insertedTextBackground\":\"#9ccc2c40\",\"diffEditor.insertedTextBorder\":null,\"diffEditor.removedTextBackground\":\"#ff000033\",\"diffEditor.removedTextBorder\":null,\"diffEditor.insertedLineBackground\":\"#9bb95533\",\"diffEditor.removedLineBackground\":\"#ff000033\",\"editorStickyScroll.background\":\"#fbfbfb\",\"editorStickyScrollHover.background\":\"#f0f0f0\",\"editorInlayHint.background\":\"#2aa29899\",\"editorInlayHint.foreground\":\"#f0f0f0\",\"editorInlayHint.typeBackground\":\"#2aa29899\",\"editorInlayHint.typeForeground\":\"#f0f0f0\",\"editorInlayHint.parameterBackground\":\"#2aa29899\",\"editorInlayHint.parameterForeground\":\"#f0f0f0\",\"editorPane.background\":\"#fbfbfb\",\"editorGroup.emptyBackground\":null,\"editorGroup.focusedEmptyBorder\":null,\"editorGroupHeader.tabsBackground\":\"var(--sl-color-gray-6)\",\"editorGroupHeader.tabsBorder\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"editorGroupHeader.noTabsBackground\":\"#f0f0f0\",\"editorGroupHeader.border\":null,\"editorGroup.border\":\"#f0f0f0\",\"editorGroup.dropBackground\":\"#2677cb2d\",\"editorGroup.dropIntoPromptForeground\":\"#403f53\",\"editorGroup.dropIntoPromptBackground\":\"#f0f0f0\",\"editorGroup.dropIntoPromptBorder\":null,\"sideBySideEditor.horizontalBorder\":\"#f0f0f0\",\"sideBySideEditor.verticalBorder\":\"#f0f0f0\",\"scrollbar.shadow\":\"#cccccc\",\"scrollbarSlider.background\":\"#0000001a\",\"scrollbarSlider.hoverBackground\":\"#00000055\",\"scrollbarSlider.activeBackground\":\"#00000099\",\"panel.background\":\"#f0f0f0\",\"panel.border\":\"#d9d9d9\",\"panelTitle.activeBorder\":\"#424242\",\"panelTitle.activeForeground\":\"#424242\",\"panelTitle.inactiveForeground\":\"#424242bf\",\"panelSectionHeader.background\":\"#80808051\",\"terminal.background\":\"#f6f6f6\",\"widget.shadow\":\"#d9d9d9\",\"editorWidget.background\":\"#f0f0f0\",\"editorWidget.foreground\":\"#403f53\",\"editorWidget.border\":\"#d9d9d9\",\"quickInput.background\":\"#f0f0f0\",\"quickInput.foreground\":\"#403f53\",\"quickInputTitle.background\":\"#0000000f\",\"pickerGroup.foreground\":\"#403f53\",\"pickerGroup.border\":\"#d9d9d9\",\"editor.hoverHighlightBackground\":\"#339cec33\",\"editorHoverWidget.background\":\"#f0f0f0\",\"editorHoverWidget.foreground\":\"#403f53\",\"editorHoverWidget.border\":\"#d9d9d9\",\"editorHoverWidget.statusBarBackground\":\"#e4e4e4\",\"titleBar.activeBackground\":\"var(--sl-color-gray-6)\",\"titleBar.activeForeground\":\"var(--sl-color-text)\",\"titleBar.inactiveBackground\":\"#f0f0f099\",\"titleBar.inactiveForeground\":\"#33333399\",\"titleBar.border\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"toolbar.hoverBackground\":\"#b8b8b850\",\"toolbar.activeBackground\":\"#a6a6a650\",\"tab.activeBackground\":\"#f6f6f6\",\"tab.unfocusedActiveBackground\":\"#f6f6f6\",\"tab.inactiveBackground\":\"#f0f0f0\",\"tab.unfocusedInactiveBackground\":\"#f0f0f0\",\"tab.activeForeground\":\"var(--sl-color-text)\",\"tab.inactiveForeground\":\"#403f53\",\"tab.unfocusedActiveForeground\":\"#403f53b3\",\"tab.unfocusedInactiveForeground\":\"#403f5380\",\"tab.hoverBackground\":null,\"tab.unfocusedHoverBackground\":null,\"tab.hoverForeground\":null,\"tab.unfocusedHoverForeground\":null,\"tab.border\":\"#f0f0f0\",\"tab.lastPinnedBorder\":\"#a9a9a9\",\"tab.activeBorder\":\"transparent\",\"tab.unfocusedActiveBorder\":null,\"tab.activeBorderTop\":\"var(--sl-color-accent)\",\"tab.unfocusedActiveBorderTop\":null,\"tab.hoverBorder\":null,\"tab.unfocusedHoverBorder\":null,\"tab.activeModifiedBorder\":\"#2aa298\",\"tab.inactiveModifiedBorder\":\"#93a1a1\",\"tab.unfocusedActiveModifiedBorder\":\"#93a1a1\",\"tab.unfocusedInactiveModifiedBorder\":\"#93a1a1\",\"badge.background\":\"#2aa298\",\"badge.foreground\":\"#f0f0f0\",\"button.background\":\"#2aa298\",\"button.foreground\":\"#f0f0f0\",\"button.border\":null,\"button.separator\":\"#f0f0f066\",\"button.hoverBackground\":\"#22827a\",\"button.secondaryBackground\":\"#5f6a79\",\"button.secondaryForeground\":\"#ffffff\",\"button.secondaryHoverBackground\":\"#4c5561\",\"dropdown.background\":\"#f0f0f0\",\"dropdown.foreground\":\"#403f53\",\"dropdown.border\":\"#d9d9d9\",\"list.activeSelectionBackground\":\"#d3e8f8\",\"list.activeSelectionForeground\":\"#403f53\",\"tree.indentGuidesStroke\":\"#a9a9a9\",\"input.background\":\"#f0f0f0\",\"input.foreground\":\"#403f53\",\"input.placeholderForeground\":\"#93a1a1\",\"inputOption.activeBorder\":\"#2aa298\",\"inputOption.hoverBackground\":\"#b8b8b850\",\"inputOption.activeBackground\":\"#93a1a133\",\"inputOption.activeForeground\":\"#000000\",\"inputValidation.infoBackground\":\"#f0f0f0\",\"inputValidation.infoBorder\":\"#d0d0d0\",\"inputValidation.warningBackground\":\"#daaa01\",\"inputValidation.warningBorder\":\"#e0af02\",\"inputValidation.errorBackground\":\"#f76e6e\",\"inputValidation.errorBorder\":\"#de3d3b\",\"keybindingLabel.background\":\"#dddddd66\",\"keybindingLabel.foreground\":\"#555555\",\"keybindingLabel.border\":\"#cccccc66\",\"keybindingLabel.bottomBorder\":\"#bbbbbb66\",\"menu.foreground\":\"#403f53\",\"menu.background\":\"#f0f0f0\",\"menu.selectionForeground\":\"#403f53\",\"menu.selectionBackground\":\"#d3e8f8\",\"menu.separatorBackground\":\"#d4d4d4\",\"editor.snippetTabstopHighlightBackground\":\"#0a326433\",\"editor.snippetFinalTabstopHighlightBorder\":\"#0a326480\",\"terminal.ansiBlack\":\"#403f53\",\"terminal.ansiRed\":\"#de3d3b\",\"terminal.ansiGreen\":\"#08916a\",\"terminal.ansiYellow\":\"#e0af02\",\"terminal.ansiBlue\":\"#288ed7\",\"terminal.ansiMagenta\":\"#d6438a\",\"terminal.ansiCyan\":\"#2aa298\",\"terminal.ansiWhite\":\"#f0f0f0\",\"terminal.ansiBrightBlack\":\"#403f53\",\"terminal.ansiBrightRed\":\"#de3d3b\",\"terminal.ansiBrightGreen\":\"#08916a\",\"terminal.ansiBrightYellow\":\"#daaa01\",\"terminal.ansiBrightBlue\":\"#288ed7\",\"terminal.ansiBrightMagenta\":\"#d6438a\",\"terminal.ansiBrightCyan\":\"#2aa298\",\"terminal.ansiBrightWhite\":\"#f0f0f0\",\"selection.background\":\"#7a8181ad\",\"notifications.background\":\"#f0f0f0\",\"notifications.foreground\":\"#403f53\",\"notificationLink.foreground\":\"#994cc3\",\"notifications.border\":\"#cccccc\",\"notificationCenter.border\":\"#cccccc\",\"notificationToast.border\":\"#cccccc\",\"notificationCenterHeader.foreground\":\"#403f53\",\"notificationCenterHeader.background\":\"#f0f0f0\",\"input.border\":\"#d9d9d9\",\"progressBar.background\":\"#2aa298\",\"list.inactiveSelectionBackground\":\"#e0e7ea\",\"list.inactiveSelectionForeground\":\"#403f53\",\"list.focusBackground\":\"#d3e8f8\",\"list.hoverBackground\":\"#d3e8f8\",\"list.focusForeground\":\"#403f53\",\"list.hoverForeground\":\"#403f53\",\"list.highlightForeground\":\"#403f53\",\"list.errorForeground\":\"#e64d49\",\"list.warningForeground\":\"#daaa01\",\"activityBar.background\":\"#f0f0f0\",\"activityBar.foreground\":\"#403f53\",\"activityBar.dropBackground\":\"#d0d0d0\",\"activityBarBadge.background\":\"#403f53\",\"activityBarBadge.foreground\":\"#f0f0f0\",\"activityBar.border\":\"#f0f0f0\",\"sideBar.background\":\"#f0f0f0\",\"sideBar.foreground\":\"#403f53\",\"sideBarTitle.foreground\":\"#403f53\",\"sideBar.border\":\"#f0f0f0\",\"editorGroup.background\":\"#f6f6f6\",\"editorCursor.foreground\":\"#90a7b2\",\"editor.wordHighlightBackground\":\"#339cec33\",\"editor.wordHighlightStrongBackground\":\"#007dd659\",\"editor.lineHighlightBackground\":\"#f0f0f0\",\"editor.rangeHighlightBackground\":\"#7497a633\",\"editorWhitespace.foreground\":\"#d9d9d9\",\"editorIndentGuide.background\":\"#d9d9d9\",\"editorCodeLens.foreground\":\"#403f53\",\"editorBracketMatch.background\":\"#d3e8f8\",\"editorBracketMatch.border\":\"#2aa298\",\"editorError.border\":\"#fbfbfb\",\"editorWarning.border\":\"#daaa01\",\"editorGutter.addedBackground\":\"#49d0c5\",\"editorGutter.modifiedBackground\":\"#6fbef6\",\"editorGutter.deletedBackground\":\"#f76e6e\",\"editorRuler.foreground\":\"#d9d9d9\",\"editorOverviewRuler.errorForeground\":\"#e64d49\",\"editorOverviewRuler.warningForeground\":\"#daaa01\",\"editorSuggestWidget.background\":\"#f0f0f0\",\"editorSuggestWidget.foreground\":\"#403f53\",\"editorSuggestWidget.highlightForeground\":\"#403f53\",\"editorSuggestWidget.selectedBackground\":\"#d3e8f8\",\"editorSuggestWidget.border\":\"#d9d9d9\",\"debugExceptionWidget.background\":\"#f0f0f0\",\"debugExceptionWidget.border\":\"#d9d9d9\",\"editorMarkerNavigation.background\":\"#d0d0d0\",\"editorMarkerNavigationError.background\":\"#f76e6e\",\"editorMarkerNavigationWarning.background\":\"#daaa01\",\"debugToolBar.background\":\"#f0f0f0\",\"extensionButton.prominentBackground\":\"#2aa298\",\"extensionButton.prominentForeground\":\"#f0f0f0\",\"statusBar.background\":\"#f0f0f0\",\"statusBar.border\":\"#f0f0f0\",\"statusBar.debuggingBackground\":\"#f0f0f0\",\"statusBar.debuggingForeground\":\"#403f53\",\"statusBar.foreground\":\"#403f53\",\"statusBar.noFolderBackground\":\"#f0f0f0\",\"statusBar.noFolderForeground\":\"#403f53\",\"peekView.border\":\"#d9d9d9\",\"peekViewEditor.background\":\"#f6f6f6\",\"peekViewEditorGutter.background\":\"#f6f6f6\",\"peekViewEditor.matchHighlightBackground\":\"#49d0c5\",\"peekViewResult.background\":\"#f0f0f0\",\"peekViewResult.fileForeground\":\"#403f53\",\"peekViewResult.lineForeground\":\"#403f53\",\"peekViewResult.matchHighlightBackground\":\"#49d0c5\",\"peekViewResult.selectionBackground\":\"#e0e7ea\",\"peekViewResult.selectionForeground\":\"#403f53\",\"peekViewTitle.background\":\"#f0f0f0\",\"peekViewTitleLabel.foreground\":\"#403f53\",\"peekViewTitleDescription.foreground\":\"#403f53\",\"terminal.foreground\":\"#403f53\"},\"fg\":\"#403f53\",\"bg\":\"#f6f7f9\",\"semanticHighlighting\":false,\"settings\":[{\"name\":\"Changed\",\"scope\":[\"markup.changed\",\"meta.diff.header.git\",\"meta.diff.header.from-file\",\"meta.diff.header.to-file\"],\"settings\":{\"foreground\":\"#556484\"}},{\"name\":\"Deleted\",\"scope\":[\"markup.deleted.diff\"],\"settings\":{\"foreground\":\"#ae3c3afd\"}},{\"name\":\"Inserted\",\"scope\":[\"markup.inserted.diff\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Global settings\",\"settings\":{\"background\":\"#011627\",\"foreground\":\"#403f53\"}},{\"name\":\"Comment\",\"scope\":[\"comment\"],\"settings\":{\"foreground\":\"#5f636f\"}},{\"name\":\"String\",\"scope\":[\"string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"String Quoted\",\"scope\":[\"string.quoted\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Support Constant Math\",\"scope\":[\"support.constant.math\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Number\",\"scope\":[\"constant.numeric\",\"constant.character.numeric\"],\"settings\":{\"foreground\":\"#aa0982\",\"fontStyle\":\"\"}},{\"name\":\"Built-in constant\",\"scope\":[\"constant.language\",\"punctuation.definition.constant\",\"variable.other.constant\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"User-defined constant\",\"scope\":[\"constant.character\",\"constant.other\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Constant Character Escape\",\"scope\":[\"constant.character.escape\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"RegExp String\",\"scope\":[\"string.regexp\",\"string.regexp keyword.other\"],\"settings\":{\"foreground\":\"#3a688f\"}},{\"name\":\"Comma in functions\",\"scope\":[\"meta.function punctuation.separator.comma\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"Variable\",\"scope\":[\"variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Keyword\",\"scope\":[\"punctuation.accessor\",\"keyword\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage\",\"scope\":[\"storage\",\"meta.var.expr\",\"meta.class meta.method.declaration meta.var.expr storage.type.js\",\"storage.type.property.js\",\"storage.type.property.ts\",\"storage.type.property.tsx\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type.function.arrow.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Class name\",\"scope\":[\"entity.name.class\",\"meta.class entity.name.type.class\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Inherited class\",\"scope\":[\"entity.other.inherited-class\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Function name\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Meta Tag\",\"scope\":[\"punctuation.definition.tag\",\"meta.tag\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"HTML Tag names\",\"scope\":[\"entity.name.tag\",\"meta.tag.other.html\",\"meta.tag.other.js\",\"meta.tag.other.tsx\",\"entity.name.tag.tsx\",\"entity.name.tag.js\",\"entity.name.tag\",\"meta.tag.js\",\"meta.tag.tsx\",\"meta.tag.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Tag attribute\",\"scope\":[\"entity.other.attribute-name\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Entity Name Tag Custom\",\"scope\":[\"entity.name.tag.custom\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Library (function & constant)\",\"scope\":[\"support.function\",\"support.constant\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Support Constant Property Value meta\",\"scope\":[\"support.constant.meta.property-value\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Library class/type\",\"scope\":[\"support.type\",\"support.class\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Support Variable DOM\",\"scope\":[\"support.variable.dom\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Invalid\",\"scope\":[\"invalid\"],\"settings\":{\"foreground\":\"#bb2060\"}},{\"name\":\"Invalid deprecated\",\"scope\":[\"invalid.deprecated\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Keyword Operator\",\"scope\":[\"keyword.operator\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Relational\",\"scope\":[\"keyword.operator.relational\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Assignment\",\"scope\":[\"keyword.operator.assignment\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Arithmetic\",\"scope\":[\"keyword.operator.arithmetic\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Bitwise\",\"scope\":[\"keyword.operator.bitwise\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Increment\",\"scope\":[\"keyword.operator.increment\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Ternary\",\"scope\":[\"keyword.operator.ternary\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Double-Slashed Comment\",\"scope\":[\"comment.line.double-slash\"],\"settings\":{\"foreground\":\"#5d6376\"}},{\"name\":\"Object\",\"scope\":[\"object\"],\"settings\":{\"foreground\":\"#58656a\"}},{\"name\":\"Null\",\"scope\":[\"constant.language.null\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Meta Brace\",\"scope\":[\"meta.brace\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Meta Delimiter Period\",\"scope\":[\"meta.delimiter.period\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Punctuation Definition String\",\"scope\":[\"punctuation.definition.string\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Punctuation Definition String Markdown\",\"scope\":[\"punctuation.definition.string.begin.markdown\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Boolean\",\"scope\":[\"constant.language.boolean\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Object Comma\",\"scope\":[\"object.comma\"],\"settings\":{\"foreground\":\"#646464\"}},{\"name\":\"Variable Parameter Function\",\"scope\":[\"variable.parameter.function\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Support Type Property Name & entity name tags\",\"scope\":[\"support.type.vendor.property-name\",\"support.constant.vendor.property-value\",\"support.type.property-name\",\"meta.property-list entity.name.tag\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Entity Name tag reference in stylesheets\",\"scope\":[\"meta.property-list entity.name.tag.reference\"],\"settings\":{\"foreground\":\"#286d70\"}},{\"name\":\"Constant Other Color RGB Value Punctuation Definition Constant\",\"scope\":[\"constant.other.color.rgb-value punctuation.definition.constant\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Constant Other Color\",\"scope\":[\"constant.other.color\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Keyword Other Unit\",\"scope\":[\"keyword.other.unit\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Meta Selector\",\"scope\":[\"meta.selector\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Entity Other Attribute Name Id\",\"scope\":[\"entity.other.attribute-name.id\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Meta Property Name\",\"scope\":[\"meta.property-name\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Doctypes\",\"scope\":[\"entity.name.tag.doctype\",\"meta.tag.sgml.doctype\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Punctuation Definition Parameters\",\"scope\":[\"punctuation.definition.parameters\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Keyword Control Operator\",\"scope\":[\"keyword.control.operator\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Keyword Operator Logical\",\"scope\":[\"keyword.operator.logical\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"\"}},{\"name\":\"Variable Instances\",\"scope\":[\"variable.instance\",\"variable.other.instance\",\"variable.readwrite.instance\",\"variable.other.readwrite.instance\",\"variable.other.property\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Variable Property Other object property\",\"scope\":[\"variable.other.object.property\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Variable Property Other object\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Entity Name Function\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Keyword Operator Comparison, imports, returns and Keyword Operator Ruby\",\"scope\":[\"keyword.operator.comparison\",\"keyword.control.flow.js\",\"keyword.control.flow.ts\",\"keyword.control.flow.tsx\",\"keyword.control.ruby\",\"keyword.control.module.ruby\",\"keyword.control.class.ruby\",\"keyword.control.def.ruby\",\"keyword.control.loop.js\",\"keyword.control.loop.ts\",\"keyword.control.import.js\",\"keyword.control.import.ts\",\"keyword.control.import.tsx\",\"keyword.control.from.js\",\"keyword.control.from.ts\",\"keyword.control.from.tsx\",\"keyword.operator.instanceof.js\",\"keyword.operator.expression.instanceof.ts\",\"keyword.operator.expression.instanceof.tsx\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Control Conditional\",\"scope\":[\"keyword.control.conditional.js\",\"keyword.control.conditional.ts\",\"keyword.control.switch.js\",\"keyword.control.switch.ts\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"\"}},{\"name\":\"Support Constant, `new` keyword, Special Method Keyword, `debugger`, other keywords\",\"scope\":[\"support.constant\",\"keyword.other.special-method\",\"keyword.other.new\",\"keyword.other.debugger\",\"keyword.control\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Support Function\",\"scope\":[\"support.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Invalid Broken\",\"scope\":[\"invalid.broken\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Invalid Unimplemented\",\"scope\":[\"invalid.unimplemented\"],\"settings\":{\"foreground\":\"#486e26\"}},{\"name\":\"Invalid Illegal\",\"scope\":[\"invalid.illegal\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Language Variable\",\"scope\":[\"variable.language\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Support Variable Property\",\"scope\":[\"support.variable.property\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Variable Function\",\"scope\":[\"variable.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variable Interpolation\",\"scope\":[\"variable.interpolation\"],\"settings\":{\"foreground\":\"#a64348\"}},{\"name\":\"Meta Function Call\",\"scope\":[\"meta.function-call\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Punctuation Section Embedded\",\"scope\":[\"punctuation.section.embedded\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Punctuation Tweaks\",\"scope\":[\"punctuation.terminator.expression\",\"punctuation.definition.arguments\",\"punctuation.definition.array\",\"punctuation.section.array\",\"meta.array\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"More Punctuation Tweaks\",\"scope\":[\"punctuation.definition.list.begin\",\"punctuation.definition.list.end\",\"punctuation.separator.arguments\",\"punctuation.definition.list\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Template Strings\",\"scope\":[\"string.template meta.template.expression\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Backticks(``) in Template Strings\",\"scope\":[\"string.template punctuation.definition.string\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Italics\",\"scope\":[\"italic\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"italic\"}},{\"name\":\"Bold\",\"scope\":[\"bold\"],\"settings\":{\"foreground\":\"#3b61b0\",\"fontStyle\":\"bold\"}},{\"name\":\"Quote\",\"scope\":[\"quote\"],\"settings\":{\"foreground\":\"#5c6285\"}},{\"name\":\"Raw Code\",\"scope\":[\"raw\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"CoffeeScript Variable Assignment\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#186e73\"}},{\"name\":\"CoffeeScript Parameter Function\",\"scope\":[\"variable.parameter.function.coffee\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"CoffeeScript Assignments\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"C# Readwrite Variables\",\"scope\":[\"variable.other.readwrite.cs\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"C# Classes & Storage types\",\"scope\":[\"entity.name.type.class.cs\",\"storage.type.cs\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"C# Namespaces\",\"scope\":[\"entity.name.type.namespace.cs\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Tag names in Stylesheets\",\"scope\":[\"entity.name.tag.css\",\"entity.name.tag.less\",\"entity.name.tag.custom.css\",\"support.constant.property-value.css\"],\"settings\":{\"foreground\":\"#984e4d\",\"fontStyle\":\"\"}},{\"name\":\"Wildcard(*) selector in Stylesheets\",\"scope\":[\"entity.name.tag.wildcard.css\",\"entity.name.tag.wildcard.less\",\"entity.name.tag.wildcard.scss\",\"entity.name.tag.wildcard.sass\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"CSS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Attribute Name for CSS\",\"scope\":[\"meta.attribute-selector.css entity.other.attribute-name.attribute\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Elixir Classes\",\"scope\":[\"source.elixir support.type.elixir\",\"source.elixir meta.module.elixir entity.name.class.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Functions\",\"scope\":[\"source.elixir entity.name.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Constants\",\"scope\":[\"source.elixir constant.other.symbol.elixir\",\"source.elixir constant.other.keywords.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir String Punctuations\",\"scope\":[\"source.elixir punctuation.definition.string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir\",\"scope\":[\"source.elixir variable.other.readwrite.module.elixir\",\"source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Binary Punctuations\",\"scope\":[\"source.elixir .punctuation.binary.elixir\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Closure Constant Keyword\",\"scope\":[\"constant.keyword.clojure\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Go Function Calls\",\"scope\":[\"source.go meta.function-call.go\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Go Keywords\",\"scope\":[\"source.go keyword.package.go\",\"source.go keyword.import.go\",\"source.go keyword.function.go\",\"source.go keyword.type.go\",\"source.go keyword.struct.go\",\"source.go keyword.interface.go\",\"source.go keyword.const.go\",\"source.go keyword.var.go\",\"source.go keyword.map.go\",\"source.go keyword.channel.go\",\"source.go keyword.control.go\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Go Constants e.g. nil, string format (%s, %d, etc.)\",\"scope\":[\"source.go constant.language.go\",\"source.go constant.other.placeholder.go\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"C++ Functions\",\"scope\":[\"entity.name.function.preprocessor.cpp\",\"entity.scope.name.cpp\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"C++ Meta Namespace\",\"scope\":[\"meta.namespace-block.cpp\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"C++ Language Primitive Storage\",\"scope\":[\"storage.type.language.primitive.cpp\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"C++ Preprocessor Macro\",\"scope\":[\"meta.preprocessor.macro.cpp\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"C++ Variable Parameter\",\"scope\":[\"variable.parameter\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Powershell Variables\",\"scope\":[\"variable.other.readwrite.powershell\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Powershell Function\",\"scope\":[\"support.function.powershell\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"ID Attribute Name in HTML\",\"scope\":[\"entity.other.attribute-name.id.html\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"HTML Punctuation Definition Tag\",\"scope\":[\"punctuation.definition.tag.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"HTML Doctype\",\"scope\":[\"meta.tag.sgml.doctype.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"JavaScript Classes\",\"scope\":[\"meta.class entity.name.type.class.js\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"JavaScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.js\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"JavaScript Terminator\",\"scope\":[\"terminator.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Meta Punctuation Definition\",\"scope\":[\"meta.js punctuation.definition.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Entity Names in Code Documentations\",\"scope\":[\"entity.name.type.instance.jsdoc\",\"entity.name.type.instance.phpdoc\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"Other Variables in Code Documentations\",\"scope\":[\"variable.other.jsdoc\",\"variable.other.phpdoc\"],\"settings\":{\"foreground\":\"#3e697c\"}},{\"name\":\"JavaScript module imports and exports\",\"scope\":[\"variable.other.meta.import.js\",\"meta.import.js variable.other\",\"variable.other.meta.export.js\",\"meta.export.js variable.other\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Variable Parameter Function\",\"scope\":[\"variable.parameter.function.js\"],\"settings\":{\"foreground\":\"#555ea2\"}},{\"name\":\"JavaScript[React] Variable Other Object\",\"scope\":[\"variable.other.object.js\",\"variable.other.object.jsx\",\"variable.object.property.js\",\"variable.object.property.jsx\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Variables\",\"scope\":[\"variable.js\",\"variable.other.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Entity Name Type\",\"scope\":[\"entity.name.type.js\",\"entity.name.type.module.js\"],\"settings\":{\"foreground\":\"#111111\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Support Classes\",\"scope\":[\"support.class.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JSON Property Names\",\"scope\":[\"support.type.property-name.json\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"JSON Support Constants\",\"scope\":[\"support.constant.json\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"JSON Property values (string)\",\"scope\":[\"meta.structure.dictionary.value.json string.quoted.double\"],\"settings\":{\"foreground\":\"#7c5686\"}},{\"name\":\"Strings in JSON values\",\"scope\":[\"string.quoted.double.json punctuation.definition.string.json\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Specific JSON Property values like null\",\"scope\":[\"meta.structure.dictionary.json meta.structure.dictionary.value constant.language\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"JavaScript Other Variable\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Ruby Variables\",\"scope\":[\"variable.other.ruby\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Ruby Class\",\"scope\":[\"entity.name.type.class.ruby\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Ruby Hashkeys\",\"scope\":[\"constant.language.symbol.hashkey.ruby\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Ruby Symbols\",\"scope\":[\"constant.language.symbol.ruby\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"LESS Tag names\",\"scope\":[\"entity.name.tag.less\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"LESS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Attribute Name for LESS\",\"scope\":[\"meta.attribute-selector.less entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Markdown Headings\",\"scope\":[\"markup.heading.markdown\",\"markup.heading.setext.1.markdown\",\"markup.heading.setext.2.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown Italics\",\"scope\":[\"markup.italic.markdown\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"italic\"}},{\"name\":\"Markdown Bold\",\"scope\":[\"markup.bold.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\",\"fontStyle\":\"bold\"}},{\"name\":\"Markdown Quote + others\",\"scope\":[\"markup.quote.markdown\"],\"settings\":{\"foreground\":\"#5c6285\"}},{\"name\":\"Markdown Raw Code + others\",\"scope\":[\"markup.inline.raw.markdown\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Markdown Links\",\"scope\":[\"markup.underline.link.markdown\",\"markup.underline.link.image.markdown\"],\"settings\":{\"foreground\":\"#954f5a\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Link Title and Description\",\"scope\":[\"string.other.link.title.markdown\",\"string.other.link.description.markdown\"],\"settings\":{\"foreground\":\"#403f53\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Punctuation\",\"scope\":[\"punctuation.definition.string.markdown\",\"punctuation.definition.string.begin.markdown\",\"punctuation.definition.string.end.markdown\",\"meta.link.inline.markdown punctuation.definition.string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown MetaData Punctuation\",\"scope\":[\"punctuation.definition.metadata.markdown\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Markdown List Punctuation\",\"scope\":[\"beginning.punctuation.definition.list.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown Inline Raw String\",\"scope\":[\"markup.inline.raw.string.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"PHP Variables\",\"scope\":[\"variable.other.php\",\"variable.other.property.php\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Support Classes in PHP\",\"scope\":[\"support.class.php\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Punctuations in PHP function calls\",\"scope\":[\"meta.function-call.php punctuation\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"PHP Global Variables\",\"scope\":[\"variable.other.global.php\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Declaration Punctuation in PHP Global Variables\",\"scope\":[\"variable.other.global.php punctuation.definition.variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Language Constants in Python\",\"scope\":[\"constant.language.python\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Python Function Parameter and Arguments\",\"scope\":[\"variable.parameter.function.python\",\"meta.function-call.arguments.python\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Python Function Call\",\"scope\":[\"meta.function-call.python\",\"meta.function-call.generic.python\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Punctuations in Python\",\"scope\":[\"punctuation.python\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Decorator Functions in Python\",\"scope\":[\"entity.name.function.decorator.python\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Python Language Variable\",\"scope\":[\"source.python variable.language.special\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Python import control keyword\",\"scope\":[\"keyword.control\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"SCSS Variable\",\"scope\":[\"variable.scss\",\"variable.sass\",\"variable.parameter.url.scss\",\"variable.parameter.url.sass\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Attribute Name for SASS\",\"scope\":[\"meta.attribute-selector.scss entity.other.attribute-name.attribute\",\"meta.attribute-selector.sass entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Tag names in SASS\",\"scope\":[\"entity.name.tag.scss\",\"entity.name.tag.sass\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"SASS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.scss\",\"keyword.other.unit.sass\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"TypeScript[React] Variables and Object Properties\",\"scope\":[\"variable.other.readwrite.alias.ts\",\"variable.other.readwrite.alias.tsx\",\"variable.other.readwrite.ts\",\"variable.other.readwrite.tsx\",\"variable.other.object.ts\",\"variable.other.object.tsx\",\"variable.object.property.ts\",\"variable.object.property.tsx\",\"variable.other.ts\",\"variable.other.tsx\",\"variable.tsx\",\"variable.ts\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript[React] Entity Name Types\",\"scope\":[\"entity.name.type.ts\",\"entity.name.type.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript[React] Node Classes\",\"scope\":[\"support.class.node.ts\",\"support.class.node.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"TypeScript[React] Entity Name Types as Parameters\",\"scope\":[\"meta.type.parameters.ts entity.name.type\",\"meta.type.parameters.tsx entity.name.type\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"TypeScript[React] Import/Export Punctuations\",\"scope\":[\"meta.import.ts punctuation.definition.block\",\"meta.import.tsx punctuation.definition.block\",\"meta.export.ts punctuation.definition.block\",\"meta.export.tsx punctuation.definition.block\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.decorator punctuation.decorator.ts\",\"meta.decorator punctuation.decorator.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.tag.js meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"YAML Entity Name Tags\",\"scope\":[\"entity.name.tag.yaml\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"JavaScript Variable Other ReadWrite\",\"scope\":[\"variable.other.readwrite.js\",\"variable.parameter\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Support Class Component\",\"scope\":[\"support.class.component.js\",\"support.class.component.tsx\"],\"settings\":{\"foreground\":\"#aa0982\",\"fontStyle\":\"\"}},{\"name\":\"Text nested in React tags\",\"scope\":[\"meta.jsx.children\",\"meta.jsx.children.js\",\"meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript Classes\",\"scope\":[\"meta.class entity.name.type.class.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript Entity Name Type\",\"scope\":[\"entity.name.type.tsx\",\"entity.name.type.module.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript Class Variable Keyword\",\"scope\":[\"meta.class.ts meta.var.expr.ts storage.type.ts\",\"meta.class.tsx meta.var.expr.tsx storage.type.tsx\"],\"settings\":{\"foreground\":\"#76578b\"}},{\"name\":\"TypeScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.ts\",\"meta.method.declaration storage.type.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"normalize font style of certain components\",\"scope\":[\"meta.property-list.css meta.property-value.css variable.other.less\",\"meta.property-list.scss variable.scss\",\"meta.property-list.sass variable.sass\",\"meta.brace\",\"keyword.operator.operator\",\"keyword.operator.or.regexp\",\"keyword.operator.expression.in\",\"keyword.operator.relational\",\"keyword.operator.assignment\",\"keyword.operator.comparison\",\"keyword.operator.type\",\"keyword.operator\",\"keyword\",\"punctuation.definition.string\",\"punctuation\",\"variable.other.readwrite.js\",\"storage.type\",\"source.css\",\"string.quoted\"],\"settings\":{\"fontStyle\":\"\"}}],\"styleOverrides\":{\"frames\":{\"editorBackground\":\"var(--sl-color-gray-7)\",\"terminalBackground\":\"var(--sl-color-gray-7)\",\"editorActiveTabBackground\":\"var(--sl-color-gray-7)\",\"terminalTitlebarDotsForeground\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"terminalTitlebarDotsOpacity\":\"0.75\",\"inlineButtonForeground\":\"var(--sl-color-text)\",\"frameBoxShadowCssValue\":\"none\"},\"textMarkers\":{\"markBackground\":\"#0000001a\",\"markBorderColor\":\"#00000055\"}}}],\"defaultLocale\":\"en\",\"cascadeLayer\":\"starlight.components\",\"styleOverrides\":{\"borderRadius\":\"0px\",\"borderWidth\":\"1px\",\"codePaddingBlock\":\"0.75rem\",\"codePaddingInline\":\"1rem\",\"codeFontFamily\":\"var(--__sl-font-mono)\",\"codeFontSize\":\"var(--sl-text-code)\",\"codeLineHeight\":\"var(--sl-line-height)\",\"uiFontFamily\":\"var(--__sl-font)\",\"textMarkers\":{\"lineDiffIndicatorMarginLeft\":\"0.25rem\",\"defaultChroma\":\"45\",\"backgroundOpacity\":\"60%\"}},\"plugins\":[{\"name\":\"Starlight Plugin\",\"hooks\":{}},{\"name\":\"astro-expressive-code\",\"hooks\":{}}]}]],\"remarkRehype\":{},\"gfm\":true,\"smartypants\":true},\"security\":{\"checkOrigin\":true,\"allowedDomains\":[],\"actionBodySizeLimit\":1048576},\"env\":{\"schema\":{},\"validateSecrets\":false},\"experimental\":{\"clientPrerender\":false,\"contentIntellisense\":false,\"headingIdCompat\":false,\"preserveScriptOrder\":false,\"liveContentCollections\":false,\"csp\":false,\"staticImportMetaEnv\":false,\"chromeDevtoolsWorkspace\":false,\"failOnPrerenderConflict\":false,\"svgo\":false},\"legacy\":{\"collections\":false},\"prefetch\":{\"prefetchAll\":true},\"i18n\":{\"defaultLocale\":\"en\",\"locales\":[\"en\"],\"routing\":{\"prefixDefaultLocale\":false,\"redirectToDefaultLocale\":false,\"fallbackType\":\"redirect\"}}}","docs",["Map",11,12,27,28,42,43],"index",{"id":11,"data":13,"filePath":25,"digest":26,"deferredRender":16},{"title":14,"description":15,"editUrl":16,"head":17,"template":18,"hero":19,"sidebar":22,"pagefind":16,"draft":23},"Starter Tutorial","Get started building a tutorial.",true,[],"splash",{"tagline":20,"actions":21},"Starting a tutorial!",[],{"hidden":23,"attrs":24},false,{},"src/content/docs/index.mdx","369e120ef938088e","reference",{"id":27,"data":29,"body":39,"filePath":40,"digest":41,"deferredRender":16},{"title":30,"description":31,"editUrl":16,"head":32,"template":33,"hero":34,"sidebar":37,"pagefind":16,"draft":23},"Reference","Get started building your docs site with Starlight.",[],"doc",{"tagline":35,"actions":36},"Components that can be used in Tutorials",[],{"hidden":23,"attrs":38},{},"## Asides\n\n{% aside %}\nNote aside.\n{% /aside %}\n\n```\n{% aside %}\nNote aside.\n{% /aside %}\n```\n\n{% aside type=\"caution\" %}\nCaution aside.\n{% /aside %}\n\n```\n{% aside type=\"caution\" %}\nCaution aside.\n{% /aside %}\n```\n\n{% aside type=\"tip\" %}\nTip aside.\n{% /aside %}\n\n```\n{% aside type=\"tip\" %}\nTip aside.\n{% /aside %}\n```\n\n{% aside type=\"danger\" %}\nDanger aside.\n{% /aside %}\n\n```\n{% aside type=\"danger\" %}\nDanger aside.\n{% /aside %}\n```\n\n## Blockquotes\n\n> This is a blockquote.\n>\n> This is another line in the blockquote.\n\n## Code Blocks\n\n```js\nfunction demo() {\n // This is a comment\n console.log('Hello World');\n}\n```\n\n## File Trees\n\n{% filetree %}\n\n- astro.config.mjs\n- package.json\n- src\n - components\n - Header.astro\n - Title.astro\n - pages/\n\n{% /filetree %}\n\n```\n{% filetree %}\n\n- astro.config.mjs\n- package.json\n- src\n - components\n - Header.astro\n - Title.astro\n - pages/\n\n{% /filetree %}\n```\n\n## Steps\n\n{% steps %}\n\n1. Import the component into your MDX file:\n\n ```js\n import { Steps } from '@astrojs/starlight/components';\n ```\n\n2. Wrap `\u003CSteps>` around your ordered list items.\n\n{% /steps %}\n\n```\n {% steps %}\n\n 1. Import the component into your MDX file:\n\n ```js\n import { Steps } from '@astrojs/starlight/components';\n ```\n\n 2. Wrap `\u003CSteps>` around your ordered list items.\n\n {% /steps %}\n```\n\n## Tabs\n\n{% tabs %}\n{% tabitem label=\"Tab 1\" %}\nTab 1 text\n{% /tabitem %}\n\n{% tabitem label=\"Tab 2\" %}\nTab 2 text\n{% /tabitem %}\n{% /tabs %}\n\n```\n{% tabs %}\n{% tabitem label=\"Tab 1\" %}\nTab 1 text\n{% /tabitem %}\n\n{% tabitem label=\"Tab 2\" %}\nTab 2 text\n{% /tabitem %}\n{% /tabs %}\n```","src/content/docs/reference.mdoc","17bf736636d92cae","01_first_step",{"id":42,"data":44,"body":50,"filePath":51,"digest":52,"rendered":53},{"title":45,"description":46,"editUrl":16,"head":47,"template":33,"sidebar":48,"pagefind":16,"draft":23},"Introduction","An introduction to the onboarding tutorial",[],{"hidden":23,"attrs":49},{},"# Starter Tutorial\n\nThis is a paragraph about what the tutorial contains.\n\nHere is some code:\n\n```js\nfunction demo() {\n // This is a comment\n console.log('Hello World');\n}\n```","src/content/docs/01_First_Step.md","5f8f5e057d466cd2",{"html":54,"metadata":55},"\u003Cdiv class=\"sl-heading-wrapper level-h1\">\u003Ch1 id=\"starter-tutorial\">Starter Tutorial\u003C/h1>\u003Ca class=\"sl-anchor-link\" href=\"#starter-tutorial\">\u003Cspan aria-hidden=\"true\" class=\"sl-anchor-icon\">\u003Csvg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\">\u003Cpath fill=\"currentcolor\" d=\"m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan class=\"sr-only\" data-pagefind-ignore=\"\">Section titled “Starter Tutorial”\u003C/span>\u003C/a>\u003C/div>\n\u003Cp>This is a paragraph about what the tutorial contains.\u003C/p>\n\u003Cp>Here is some code:\u003C/p>\n\u003Cdiv class=\"expressive-code\">\u003Clink rel=\"stylesheet\" href=\"/_astro/ec.v4551.css\">\u003Cscript type=\"module\" src=\"/_astro/ec.0vx5m.js\">\u003C/script>\u003Cfigure class=\"frame not-content\">\u003Cfigcaption class=\"header\">\u003C/figcaption>\u003Cpre data-language=\"js\">\u003Ccode>\u003Cdiv class=\"ec-line\">\u003Cdiv class=\"code\">\u003Cspan style=\"--0:#C792EA;--1:#8844AE\">function\u003C/span>\u003Cspan style=\"--0:#D6DEEB;--1:#403F53\"> \u003C/span>\u003Cspan style=\"--0:#82AAFF;--1:#3B61B0\">demo\u003C/span>\u003Cspan style=\"--0:#D9F5DD;--1:#111111\">()\u003C/span>\u003Cspan style=\"--0:#D6DEEB;--1:#403F53\"> {\u003C/span>\u003C/div>\u003C/div>\u003Cdiv class=\"ec-line\">\u003Cdiv class=\"code\">\u003Cspan class=\"indent\"> \u003C/span>\u003Cspan style=\"--0:#919F9F;--1:#5D6376\">// This is a comment\u003C/span>\u003C/div>\u003C/div>\u003Cdiv class=\"ec-line\">\u003Cdiv class=\"code\">\u003Cspan class=\"indent\"> \u003C/span>\u003Cspan style=\"--0:#7FDBCA;--1:#096E72\">console\u003C/span>\u003Cspan style=\"--0:#C792EA;--1:#8844AE\">.\u003C/span>\u003Cspan style=\"--0:#82AAFF;--1:#3B61B0\">log\u003C/span>\u003Cspan style=\"--0:#D6DEEB;--1:#403F53\">(\u003C/span>\u003Cspan style=\"--0:#D9F5DD;--1:#111111\">'\u003C/span>\u003Cspan style=\"--0:#ECC48D;--1:#984E4D\">Hello World\u003C/span>\u003Cspan style=\"--0:#D9F5DD;--1:#111111\">'\u003C/span>\u003Cspan style=\"--0:#D6DEEB;--1:#403F53\">);\u003C/span>\u003C/div>\u003C/div>\u003Cdiv class=\"ec-line\">\u003Cdiv class=\"code\">\u003Cspan style=\"--0:#D6DEEB;--1:#403F53\">}\u003C/span>\u003C/div>\u003C/div>\u003C/code>\u003C/pre>\u003Cdiv class=\"copy\">\u003Cdiv aria-live=\"polite\">\u003C/div>\u003Cbutton title=\"Copy to clipboard\" data-copied=\"Copied!\" data-code=\"function demo() { // This is a comment console.log('Hello World');}\">\u003Cdiv>\u003C/div>\u003C/button>\u003C/div>\u003C/figure>\u003C/div>",{"headings":56,"localImagePaths":60,"remoteImagePaths":61,"frontmatter":62,"imagePaths":63},[57],{"depth":58,"slug":59,"text":14},1,"starter-tutorial",[],[],{"title":45,"description":46},[]] \ No newline at end of file diff --git a/sources/vonage_video_ios_app-theme-customization/.astro/settings.json b/sources/vonage_video_ios_app-theme-customization/.astro/settings.json new file mode 100644 index 00000000..6945ae7d --- /dev/null +++ b/sources/vonage_video_ios_app-theme-customization/.astro/settings.json @@ -0,0 +1,5 @@ +{ + "_variables": { + "lastUpdateCheck": 1785852561838 + } +} \ No newline at end of file diff --git a/sources/vonage_video_ios_app-theme-customization/.astro/types.d.ts b/sources/vonage_video_ios_app-theme-customization/.astro/types.d.ts new file mode 100644 index 00000000..03d7cc43 --- /dev/null +++ b/sources/vonage_video_ios_app-theme-customization/.astro/types.d.ts @@ -0,0 +1,2 @@ +/// +/// \ No newline at end of file diff --git a/sources/vonage_video_ios_app-theme-customization/.vscode/extensions.json b/sources/vonage_video_ios_app-theme-customization/.vscode/extensions.json new file mode 100644 index 00000000..de4e2f35 --- /dev/null +++ b/sources/vonage_video_ios_app-theme-customization/.vscode/extensions.json @@ -0,0 +1,6 @@ +{ + "recommendations": [ + "astro-build.astro-vscode", + "ms-vscode.live-server" + ] +} \ No newline at end of file diff --git a/sources/vonage_video_ios_app-theme-customization/.vscode/tasks.json b/sources/vonage_video_ios_app-theme-customization/.vscode/tasks.json new file mode 100644 index 00000000..ee6b95ff --- /dev/null +++ b/sources/vonage_video_ios_app-theme-customization/.vscode/tasks.json @@ -0,0 +1,21 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Start Tutorial Editor", + "type": "shell", + "command": "npm install && npm run dev", + "group": { + "kind": "build", + "isDefault": true + }, + "presentation": { + "reveal": "always", + "panel": "new" + }, + "runOptions": { + "runOn": "folderOpen" + } + } + ] +} \ No newline at end of file diff --git a/sources/vonage_video_ios_app-theme-customization/README.md b/sources/vonage_video_ios_app-theme-customization/README.md new file mode 100644 index 00000000..0a78c808 --- /dev/null +++ b/sources/vonage_video_ios_app-theme-customization/README.md @@ -0,0 +1,9 @@ +# Astro Dev Toolbar application for Vonage Onboarding Tutorials + +[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/fork/github/Vonage-Community/tutorial-interactive_tutorials/tree/main/toolbar-app/) + +or if working locally, run `npm install && npm run dev` + +For more information on the Astro Dev Toolbar, please see their [documentation](https://docs.astro.build/en/guides/dev-toolbar/) + +[![Built with Starlight](https://astro.badg.es/v2/built-with-starlight/tiny.svg)](https://starlight.astro.build) diff --git a/sources/vonage_video_ios_app-theme-customization/astro.config.mjs b/sources/vonage_video_ios_app-theme-customization/astro.config.mjs new file mode 100644 index 00000000..8f4ad034 --- /dev/null +++ b/sources/vonage_video_ios_app-theme-customization/astro.config.mjs @@ -0,0 +1,20 @@ +import { defineConfig } from 'astro/config'; +import starlight from '@astrojs/starlight'; +import relativeLinks from 'astro-relative-links'; +import vonageIntegration from './vonage-toolbar/integration.ts'; + +import markdoc from '@astrojs/markdoc'; + +// https://astro.build/config +export default defineConfig({ + integrations: [ + relativeLinks(), + vonageIntegration, + starlight({ + title: 'Vonage Coding Exercise', + tableOfContents: true, + pagefind: false, + }), + markdoc(), + ], +}); diff --git a/sources/vonage_video_ios_app-theme-customization/download-toolbar.js b/sources/vonage_video_ios_app-theme-customization/download-toolbar.js new file mode 100644 index 00000000..34c88a09 --- /dev/null +++ b/sources/vonage_video_ios_app-theme-customization/download-toolbar.js @@ -0,0 +1,40 @@ +import fs from 'fs/promises'; + +async function downloadFile(url, filename) { + console.log('downloading: ', filename); + try { + const response = await fetch(url); + const buffer = await response.arrayBuffer(); + + await fs.mkdir('./vonage-toolbar', { recursive: true }); + + await fs.writeFile( + `./vonage-toolbar/${filename}`, + Buffer.from(buffer) + ); + + console.log(`✅ File ${filename} downloaded and written successfully!`); + + } catch (error) { + console.error(`❌ Error downloading/writing ${filename}:`, error); + } +} + +async function main() { + console.log('download toolbar application files'); + + await Promise.all([ + downloadFile( + 'https://raw.githubusercontent.com/vonage-community/tutorial-interactive_tutorials/refs/heads/main/toolbar-app/vonage-toolbar/integration.ts', + 'integration.ts' + ), + downloadFile( + 'https://raw.githubusercontent.com/vonage-community/tutorial-interactive_tutorials/refs/heads/main/toolbar-app/vonage-toolbar/app.ts', + 'app.ts' + ) + ]); + + console.log('🎉 All downloads complete. Starting Astro...'); +} + +main(); diff --git a/sources/vonage_video_ios_app-theme-customization/markdoc.config.mjs b/sources/vonage_video_ios_app-theme-customization/markdoc.config.mjs new file mode 100644 index 00000000..329155ae --- /dev/null +++ b/sources/vonage_video_ios_app-theme-customization/markdoc.config.mjs @@ -0,0 +1,6 @@ +import { defineMarkdocConfig } from '@astrojs/markdoc/config'; +import starlightMarkdoc from '@astrojs/starlight-markdoc'; + +export default defineMarkdocConfig({ + extends: [starlightMarkdoc()], +}); diff --git a/sources/vonage_video_ios_app-theme-customization/package-lock.json b/sources/vonage_video_ios_app-theme-customization/package-lock.json new file mode 100644 index 00000000..f5acc680 --- /dev/null +++ b/sources/vonage_video_ios_app-theme-customization/package-lock.json @@ -0,0 +1,7900 @@ +{ + "name": "@example/starlight-basics", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@example/starlight-basics", + "version": "0.0.1", + "dependencies": { + "@astrojs/markdoc": "^0.15.10", + "@astrojs/starlight": "^0.37.6", + "@astrojs/starlight-markdoc": "^0.5.1", + "adm-zip": "^0.5.16", + "astro": "^5.18.1", + "astro-relative-links": "^0.4.2", + "sharp": "^0.33.0" + } + }, + "node_modules/@astrojs/compiler": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.13.0.tgz", + "integrity": "sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==", + "license": "MIT" + }, + "node_modules/@astrojs/internal-helpers": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.7.5.tgz", + "integrity": "sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA==", + "license": "MIT" + }, + "node_modules/@astrojs/markdoc": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/@astrojs/markdoc/-/markdoc-0.15.10.tgz", + "integrity": "sha512-05V4Vy4J14aDpBstKbuyO7ArY+VCF80SElWyx80ddeWkUiOERw4SjGbnzgAI4AQtDdJ+pJdlv/16TMM65+YafA==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.5", + "@astrojs/markdown-remark": "6.3.10", + "@astrojs/prism": "3.3.0", + "@markdoc/markdoc": "^0.5.4", + "esbuild": "^0.25.0", + "github-slugger": "^2.0.0", + "htmlparser2": "^10.0.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^5.0.0" + } + }, + "node_modules/@astrojs/markdown-remark": { + "version": "6.3.10", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.10.tgz", + "integrity": "sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.5", + "@astrojs/prism": "3.3.0", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-to-text": "^4.0.2", + "import-meta-resolve": "^4.2.0", + "js-yaml": "^4.1.1", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-smartypants": "^3.0.2", + "shiki": "^3.19.0", + "smol-toml": "^1.5.2", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.2", + "vfile": "^6.0.3" + } + }, + "node_modules/@astrojs/mdx": { + "version": "4.3.13", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.13.tgz", + "integrity": "sha512-IHDHVKz0JfKBy3//52JSiyWv089b7GVSChIXLrlUOoTLWowG3wr2/8hkaEgEyd/vysvNQvGk+QhysXpJW5ve6Q==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "6.3.10", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.15.0", + "es-module-lexer": "^1.7.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "piccolore": "^0.1.3", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^5.0.0" + } + }, + "node_modules/@astrojs/prism": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.3.0.tgz", + "integrity": "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==", + "license": "MIT", + "dependencies": { + "prismjs": "^1.30.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + } + }, + "node_modules/@astrojs/sitemap": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.7.0.tgz", + "integrity": "sha512-+qxjUrz6Jcgh+D5VE1gKUJTA3pSthuPHe6Ao5JCxok794Lewx8hBFaWHtOnN0ntb2lfOf7gvOi9TefUswQ/ZVA==", + "license": "MIT", + "dependencies": { + "sitemap": "^8.0.2", + "stream-replace-string": "^2.0.0", + "zod": "^3.25.76" + } + }, + "node_modules/@astrojs/starlight": { + "version": "0.37.6", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.6.tgz", + "integrity": "sha512-wQrKwH431q+8FsLBnNQeG+R36TMtEGxTQ2AuiVpcx9APcazvL3n7wVW8mMmYyxX0POjTnxlcWPkdMGR3Yj1L+w==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "^6.3.1", + "@astrojs/mdx": "^4.2.3", + "@astrojs/sitemap": "^3.3.0", + "@pagefind/default-ui": "^1.3.0", + "@types/hast": "^3.0.4", + "@types/js-yaml": "^4.0.9", + "@types/mdast": "^4.0.4", + "astro-expressive-code": "^0.41.1", + "bcp-47": "^2.1.0", + "hast-util-from-html": "^2.0.1", + "hast-util-select": "^6.0.2", + "hast-util-to-string": "^3.0.0", + "hastscript": "^9.0.0", + "i18next": "^23.11.5", + "js-yaml": "^4.1.0", + "klona": "^2.0.6", + "magic-string": "^0.30.17", + "mdast-util-directive": "^3.0.0", + "mdast-util-to-markdown": "^2.1.0", + "mdast-util-to-string": "^4.0.0", + "pagefind": "^1.3.0", + "rehype": "^13.0.1", + "rehype-format": "^5.0.0", + "remark-directive": "^3.0.0", + "ultrahtml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.2" + }, + "peerDependencies": { + "astro": "^5.5.0" + } + }, + "node_modules/@astrojs/starlight-markdoc": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@astrojs/starlight-markdoc/-/starlight-markdoc-0.5.1.tgz", + "integrity": "sha512-YxTvCHr/0ovDUhuRm0xeCjjGYtnqpa9EtTwc9fTbRO7Zpnsu1mDmm2L9HHSBWZ4YsFb005/GJYNDjk4WXNLoUg==", + "license": "MIT", + "peerDependencies": { + "@astrojs/markdoc": ">=0.12.1", + "@astrojs/starlight": ">=0.35.0" + } + }, + "node_modules/@astrojs/telemetry": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.0.tgz", + "integrity": "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^4.2.0", + "debug": "^4.4.0", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "is-docker": "^3.0.0", + "is-wsl": "^3.1.0", + "which-pm-runs": "^1.1.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@capsizecss/unpack": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.0.tgz", + "integrity": "sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz", + "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", + "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@expressive-code/core": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.41.7.tgz", + "integrity": "sha512-ck92uZYZ9Wba2zxkiZLsZGi9N54pMSAVdrI9uW3Oo9AtLglD5RmrdTwbYPCT2S/jC36JGB2i+pnQtBm/Ib2+dg==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^4.0.4", + "hast-util-select": "^6.0.2", + "hast-util-to-html": "^9.0.1", + "hast-util-to-text": "^4.0.1", + "hastscript": "^9.0.0", + "postcss": "^8.4.38", + "postcss-nested": "^6.0.1", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1" + } + }, + "node_modules/@expressive-code/plugin-frames": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-frames/-/plugin-frames-0.41.7.tgz", + "integrity": "sha512-diKtxjQw/979cTglRFaMCY/sR6hWF0kSMg8jsKLXaZBSfGS0I/Hoe7Qds3vVEgeoW+GHHQzMcwvgx/MOIXhrTA==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.7" + } + }, + "node_modules/@expressive-code/plugin-shiki": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-shiki/-/plugin-shiki-0.41.7.tgz", + "integrity": "sha512-DL605bLrUOgqTdZ0Ot5MlTaWzppRkzzqzeGEu7ODnHF39IkEBbFdsC7pbl3LbUQ1DFtnfx6rD54k/cdofbW6KQ==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.7", + "shiki": "^3.2.2" + } + }, + "node_modules/@expressive-code/plugin-text-markers": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.41.7.tgz", + "integrity": "sha512-Ewpwuc5t6eFdZmWlFyeuy3e1PTQC0jFvw2Q+2bpcWXbOZhPLsT7+h8lsSIJxb5mS7wZko7cKyQ2RLYDyK6Fpmw==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.7" + } + }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@markdoc/markdoc": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@markdoc/markdoc/-/markdoc-0.5.4.tgz", + "integrity": "sha512-36YFNlqFk//gVNGm5xZaTWVwbAVF2AOmVjf1tiUrS6tCoD/YSkVy2E3CkAfhc5MlKcjparL/QFHCopxL4zRyaQ==", + "license": "MIT", + "engines": { + "node": ">=14.7.0" + }, + "optionalDependencies": { + "@types/linkify-it": "^3.0.1", + "@types/markdown-it": "12.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@oslojs/encoding": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", + "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", + "license": "MIT" + }, + "node_modules/@pagefind/darwin-arm64": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.3.0.tgz", + "integrity": "sha512-365BEGl6ChOsauRjyVpBjXybflXAOvoMROw3TucAROHIcdBvXk9/2AmEvGFU0r75+vdQI4LJdJdpH4Y6Yqaj4A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/darwin-x64": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.3.0.tgz", + "integrity": "sha512-zlGHA23uuXmS8z3XxEGmbHpWDxXfPZ47QS06tGUq0HDcZjXjXHeLG+cboOy828QIV5FXsm9MjfkP5e4ZNbOkow==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/default-ui": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@pagefind/default-ui/-/default-ui-1.3.0.tgz", + "integrity": "sha512-CGKT9ccd3+oRK6STXGgfH+m0DbOKayX6QGlq38TfE1ZfUcPc5+ulTuzDbZUnMo+bubsEOIypm4Pl2iEyzZ1cNg==", + "license": "MIT" + }, + "node_modules/@pagefind/linux-arm64": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.3.0.tgz", + "integrity": "sha512-8lsxNAiBRUk72JvetSBXs4WRpYrQrVJXjlRRnOL6UCdBN9Nlsz0t7hWstRk36+JqHpGWOKYiuHLzGYqYAqoOnQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/linux-x64": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.3.0.tgz", + "integrity": "sha512-hAvqdPJv7A20Ucb6FQGE6jhjqy+vZ6pf+s2tFMNtMBG+fzcdc91uTw7aP/1Vo5plD0dAOHwdxfkyw0ugal4kcQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/windows-x64": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.3.0.tgz", + "integrity": "sha512-BR1bIRWOMqkf8IoU576YDhij1Wd/Zf2kX/kCI0b2qzCKC8wcc2GQJaaRMCpzvCCrmliO4vtJ6RITp/AnoYUUmQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz", + "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz", + "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", + "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz", + "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz", + "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz", + "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz", + "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz", + "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz", + "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz", + "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz", + "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz", + "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz", + "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz", + "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz", + "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz", + "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz", + "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", + "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz", + "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz", + "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz", + "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz", + "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz", + "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz", + "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz", + "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.23.0.tgz", + "integrity": "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.23.0.tgz", + "integrity": "sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.4" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.23.0.tgz", + "integrity": "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.23.0.tgz", + "integrity": "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.23.0.tgz", + "integrity": "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0" + } + }, + "node_modules/@shikijs/types": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.23.0.tgz", + "integrity": "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "license": "MIT" + }, + "node_modules/@types/linkify-it": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", + "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/markdown-it": { + "version": "12.2.3", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", + "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "license": "MIT" + }, + "node_modules/@types/nlcst": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/node": { + "version": "22.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", + "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", + "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", + "license": "ISC" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/adm-zip": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", + "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", + "license": "MIT", + "engines": { + "node": ">=12.0" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-iterate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", + "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/astro": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.18.1.tgz", + "integrity": "sha512-m4VWilWZ+Xt6NPoYzC4CgGZim/zQUO7WFL0RHCH0AiEavF1153iC3+me2atDvXpf/yX4PyGUeD8wZLq1cirT3g==", + "license": "MIT", + "dependencies": { + "@astrojs/compiler": "^2.13.0", + "@astrojs/internal-helpers": "0.7.6", + "@astrojs/markdown-remark": "6.3.11", + "@astrojs/telemetry": "3.3.0", + "@capsizecss/unpack": "^4.0.0", + "@oslojs/encoding": "^1.1.0", + "@rollup/pluginutils": "^5.3.0", + "acorn": "^8.15.0", + "aria-query": "^5.3.2", + "axobject-query": "^4.1.0", + "boxen": "8.0.1", + "ci-info": "^4.3.1", + "clsx": "^2.1.1", + "common-ancestor-path": "^1.0.1", + "cookie": "^1.1.1", + "cssesc": "^3.0.0", + "debug": "^4.4.3", + "deterministic-object-hash": "^2.0.2", + "devalue": "^5.6.2", + "diff": "^8.0.3", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "es-module-lexer": "^1.7.0", + "esbuild": "^0.27.3", + "estree-walker": "^3.0.3", + "flattie": "^1.1.1", + "fontace": "~0.4.0", + "github-slugger": "^2.0.0", + "html-escaper": "3.0.3", + "http-cache-semantics": "^4.2.0", + "import-meta-resolve": "^4.2.0", + "js-yaml": "^4.1.1", + "magic-string": "^0.30.21", + "magicast": "^0.5.1", + "mrmime": "^2.0.1", + "neotraverse": "^0.6.18", + "p-limit": "^6.2.0", + "p-queue": "^8.1.1", + "package-manager-detector": "^1.6.0", + "piccolore": "^0.1.3", + "picomatch": "^4.0.3", + "prompts": "^2.4.2", + "rehype": "^13.0.2", + "semver": "^7.7.3", + "shiki": "^3.21.0", + "smol-toml": "^1.6.0", + "svgo": "^4.0.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tsconfck": "^3.1.6", + "ultrahtml": "^1.6.0", + "unifont": "~0.7.3", + "unist-util-visit": "^5.0.0", + "unstorage": "^1.17.4", + "vfile": "^6.0.3", + "vite": "^6.4.1", + "vitefu": "^1.1.1", + "xxhash-wasm": "^1.1.0", + "yargs-parser": "^21.1.1", + "yocto-spinner": "^0.2.3", + "zod": "^3.25.76", + "zod-to-json-schema": "^3.25.1", + "zod-to-ts": "^1.2.0" + }, + "bin": { + "astro": "astro.js" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/astrodotbuild" + }, + "optionalDependencies": { + "sharp": "^0.34.0" + } + }, + "node_modules/astro-expressive-code": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.41.7.tgz", + "integrity": "sha512-hUpogGc6DdAd+I7pPXsctyYPRBJDK7Q7d06s4cyP0Vz3OcbziP3FNzN0jZci1BpCvLn9675DvS7B9ctKKX64JQ==", + "license": "MIT", + "dependencies": { + "rehype-expressive-code": "^0.41.7" + }, + "peerDependencies": { + "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta" + } + }, + "node_modules/astro-relative-links": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/astro-relative-links/-/astro-relative-links-0.4.2.tgz", + "integrity": "sha512-YXwnmZz47yxiIIxWR10LwpGlqvGTERJ7JWX2lFRINTg/sFaPkqTx9xNM50W1+9FNMMxtTn7C8YNW5yDVX33Vzw==", + "license": "MIT", + "dependencies": { + "glob": "^10.3.10" + }, + "peerDependencies": { + "astro": ">=3.0.0" + } + }, + "node_modules/astro/node_modules/@astrojs/internal-helpers": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.7.6.tgz", + "integrity": "sha512-GOle7smBWKfMSP8osUIGOlB5kaHdQLV3foCsf+5Q9Wsuu+C6Fs3Ez/ttXmhjZ1HkSgsogcM1RXSjjOVieHq16Q==", + "license": "MIT" + }, + "node_modules/astro/node_modules/@astrojs/markdown-remark": { + "version": "6.3.11", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.11.tgz", + "integrity": "sha512-hcaxX/5aC6lQgHeGh1i+aauvSwIT6cfyFjKWvExYSxUhZZBBdvCliOtu06gbQyhbe0pGJNoNmqNlQZ5zYUuIyQ==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.6", + "@astrojs/prism": "3.3.0", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-to-text": "^4.0.2", + "import-meta-resolve": "^4.2.0", + "js-yaml": "^4.1.1", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-smartypants": "^3.0.2", + "shiki": "^3.21.0", + "smol-toml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.2", + "vfile": "^6.0.3" + } + }, + "node_modules/astro/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/astro/node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base-64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz", + "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==", + "license": "MIT" + }, + "node_modules/bcp-47": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.0.tgz", + "integrity": "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-match": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", + "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^8.0.0", + "chalk": "^5.3.0", + "cli-boxes": "^3.0.0", + "string-width": "^7.2.0", + "type-fest": "^4.21.0", + "widest-line": "^5.0.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/camelcase": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "license": "ISC" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cookie-es": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", + "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crossws": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", + "license": "MIT", + "dependencies": { + "uncrypto": "^0.1.3" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-selector-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.3.0.tgz", + "integrity": "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/defu": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.6.tgz", + "integrity": "sha512-f8mefEW4WIVg4LckePx3mALjQSPQgFlg9U8yaPdlsbdYcHQyj9n2zL2LJEA52smeYxOvmd/nB7TpMtHGMTHcug==", + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/deterministic-object-hash": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/deterministic-object-hash/-/deterministic-object-hash-2.0.2.tgz", + "integrity": "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==", + "license": "MIT", + "dependencies": { + "base-64": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/devalue": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.4.tgz", + "integrity": "sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA==", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.3.tgz", + "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/direction": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/direction/-/direction-2.0.1.tgz", + "integrity": "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==", + "license": "MIT", + "bin": { + "direction": "cli.js" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dset": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "license": "MIT" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "license": "MIT" + }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, + "node_modules/expressive-code": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/expressive-code/-/expressive-code-0.41.7.tgz", + "integrity": "sha512-2wZjC8OQ3TaVEMcBtYY4Va3lo6J+Ai9jf3d4dbhURMJcU4Pbqe6EcHe424MIZI0VHUA1bR6xdpoHYi3yxokWqA==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.7", + "@expressive-code/plugin-frames": "^0.41.7", + "@expressive-code/plugin-shiki": "^0.41.7", + "@expressive-code/plugin-text-markers": "^0.41.7" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/flattie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", + "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/fontace": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.4.1.tgz", + "integrity": "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.2" + } + }, + "node_modules/fontkitten": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fontkitten/-/fontkitten-1.0.2.tgz", + "integrity": "sha512-piJxbLnkD9Xcyi7dWJRnqszEURixe7CrF/efBfbffe2DPyabmuIuqraruY8cXTs19QoM8VJzx47BDRVNXETM7Q==", + "license": "MIT", + "dependencies": { + "tiny-inflate": "^1.0.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "license": "ISC" + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/h3": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.10.tgz", + "integrity": "sha512-YzJeWSkDZxAhvmp8dexjRK5hxziRO7I9m0N53WhvYL5NiWfkUkzssVzY9jvGu0HBoLFW6+duYmNSn6MaZBCCtg==", + "license": "MIT", + "dependencies": { + "cookie-es": "^1.2.2", + "crossws": "^0.3.5", + "defu": "^6.1.4", + "destr": "^2.0.5", + "iron-webcrypto": "^1.2.1", + "node-mock-http": "^1.0.4", + "radix3": "^1.1.2", + "ufo": "^1.6.3", + "uncrypto": "^0.1.3" + } + }, + "node_modules/hast-util-embedded": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", + "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-format": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hast-util-format/-/hast-util-format-1.1.0.tgz", + "integrity": "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-minify-whitespace": "^1.0.0", + "hast-util-phrasing": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "html-whitespace-sensitive-tag-names": "^3.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.2.tgz", + "integrity": "sha512-SfMzfdAi/zAoZ1KkFEyyeXBn7u/ShQrfd675ZEE9M3qj+PMFX05xubzRyF76CCSJu8au9jgVxDV1+okFvgZU4A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^6.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-has-property": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", + "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-body-ok-link": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz", + "integrity": "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-minify-whitespace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz", + "integrity": "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-is-body-ok-link": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-select": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-6.0.4.tgz", + "integrity": "sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "bcp-47-match": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "css-selector-parser": "^3.0.0", + "devlop": "^1.0.0", + "direction": "^2.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-to-string": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "nth-check": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-select/node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree/node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html/node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-string": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.0.tgz", + "integrity": "sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-escaper": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-whitespace-sensitive-tag-names": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz", + "integrity": "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/htmlparser2": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/i18next": { + "version": "23.16.8", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.16.8.tgz", + "integrity": "sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT" + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", + "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "source-map-js": "^1.2.1" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-definitions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", + "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", + "integrity": "sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", + "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "license": "CC0-1.0" + }, + "node_modules/micromark": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz", + "integrity": "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.2.tgz", + "integrity": "sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", + "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", + "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.3.tgz", + "integrity": "sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", + "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neotraverse": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/nlcst-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "license": "MIT" + }, + "node_modules/node-mock-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz", + "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/ofetch": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", + "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", + "license": "MIT", + "dependencies": { + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "license": "MIT" + }, + "node_modules/oniguruma-parser": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", + "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.4.tgz", + "integrity": "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.1", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/p-limit": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", + "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.1.tgz", + "integrity": "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "license": "MIT" + }, + "node_modules/pagefind": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.3.0.tgz", + "integrity": "sha512-8KPLGT5g9s+olKMRTU9LFekLizkVIu9tes90O1/aigJ0T5LmyPqTzGJrETnSw3meSYg58YH7JTzhTTW/3z6VAw==", + "license": "MIT", + "bin": { + "pagefind": "lib/runner/bin.cjs" + }, + "optionalDependencies": { + "@pagefind/darwin-arm64": "1.3.0", + "@pagefind/darwin-x64": "1.3.0", + "@pagefind/linux-arm64": "1.3.0", + "@pagefind/linux-x64": "1.3.0", + "@pagefind/windows-x64": "1.3.0" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-latin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", + "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "@types/unist": "^3.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-modify-children": "^4.0.0", + "unist-util-visit-children": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "license": "MIT", + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/piccolore": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", + "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==", + "license": "ISC" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, + "node_modules/rehype": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", + "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-expressive-code": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/rehype-expressive-code/-/rehype-expressive-code-0.41.7.tgz", + "integrity": "sha512-25f8ZMSF1d9CMscX7Cft0TSQIqdwjce2gDOvQ+d/w0FovsMwrSt3ODP4P3Z7wO1jsIJ4eYyaDRnIR/27bd/EMQ==", + "license": "MIT", + "dependencies": { + "expressive-code": "^0.41.7" + } + }, + "node_modules/rehype-format": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rehype-format/-/rehype-format-5.0.1.tgz", + "integrity": "sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-format": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.0.tgz", + "integrity": "sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-smartypants": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.2.tgz", + "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==", + "license": "MIT", + "dependencies": { + "retext": "^9.0.0", + "retext-smartypants": "^6.0.0", + "unified": "^11.0.4", + "unist-util-visit": "^5.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", + "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "retext-latin": "^4.0.0", + "retext-stringify": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz", + "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "parse-latin": "^7.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", + "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-stringify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz", + "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rollup": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz", + "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.1", + "@rollup/rollup-android-arm64": "4.60.1", + "@rollup/rollup-darwin-arm64": "4.60.1", + "@rollup/rollup-darwin-x64": "4.60.1", + "@rollup/rollup-freebsd-arm64": "4.60.1", + "@rollup/rollup-freebsd-x64": "4.60.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", + "@rollup/rollup-linux-arm-musleabihf": "4.60.1", + "@rollup/rollup-linux-arm64-gnu": "4.60.1", + "@rollup/rollup-linux-arm64-musl": "4.60.1", + "@rollup/rollup-linux-loong64-gnu": "4.60.1", + "@rollup/rollup-linux-loong64-musl": "4.60.1", + "@rollup/rollup-linux-ppc64-gnu": "4.60.1", + "@rollup/rollup-linux-ppc64-musl": "4.60.1", + "@rollup/rollup-linux-riscv64-gnu": "4.60.1", + "@rollup/rollup-linux-riscv64-musl": "4.60.1", + "@rollup/rollup-linux-s390x-gnu": "4.60.1", + "@rollup/rollup-linux-x64-gnu": "4.60.1", + "@rollup/rollup-linux-x64-musl": "4.60.1", + "@rollup/rollup-openbsd-x64": "4.60.1", + "@rollup/rollup-openharmony-arm64": "4.60.1", + "@rollup/rollup-win32-arm64-msvc": "4.60.1", + "@rollup/rollup-win32-ia32-msvc": "4.60.1", + "@rollup/rollup-win32-x64-gnu": "4.60.1", + "@rollup/rollup-win32-x64-msvc": "4.60.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shiki": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.23.0.tgz", + "integrity": "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.23.0", + "@shikijs/engine-javascript": "3.23.0", + "@shikijs/engine-oniguruma": "3.23.0", + "@shikijs/langs": "3.23.0", + "@shikijs/themes": "3.23.0", + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-8.0.3.tgz", + "integrity": "sha512-9Ew1tR2WYw8RGE2XLy7GjkusvYXy8Rg6y8TYuBuQMfIEdGcWoJpY2Wr5DzsEiL/TKCw56+YKTCCUHglorEYK+A==", + "license": "MIT", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.4.1" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=6.0.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "license": "MIT" + }, + "node_modules/smol-toml": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.1.tgz", + "integrity": "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stream-replace-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stream-replace-string/-/stream-replace-string-2.0.0.tgz", + "integrity": "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==", + "license": "MIT" + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/svgo": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz", + "integrity": "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==", + "license": "MIT", + "dependencies": { + "commander": "^11.1.0", + "css-select": "^5.1.0", + "css-tree": "^3.0.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.1.1", + "sax": "^1.5.0" + }, + "bin": { + "svgo": "bin/svgo.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tsconfck": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "node_modules/type-fest": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.31.0.tgz", + "integrity": "sha512-yCxltHW07Nkhv/1F6wWBr8kz+5BGMfP+RbRSYFnegVb0qV/UMT0G0ElBloPVerqn4M2ZV80Ir1FtCcYv1cT6vQ==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "license": "MIT" + }, + "node_modules/ultrahtml": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.6.0.tgz", + "integrity": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==", + "license": "MIT" + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unifont": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.4.tgz", + "integrity": "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==", + "license": "MIT", + "dependencies": { + "css-tree": "^3.1.0", + "ofetch": "^1.5.1", + "ohash": "^2.0.11" + } + }, + "node_modules/unist-util-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-modify-children": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz", + "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "array-iterate": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-children": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz", + "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unstorage": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.4.tgz", + "integrity": "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==", + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^5.0.0", + "destr": "^2.0.5", + "h3": "^1.15.5", + "lru-cache": "^11.2.0", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.1", + "ufo": "^1.6.3" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6 || ^7 || ^8", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1 || ^2 || ^3", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/unstorage/node_modules/lru-cache": { + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.2.tgz", + "integrity": "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", + "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-pm-runs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", + "license": "MIT", + "dependencies": { + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/xxhash-wasm": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", + "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", + "license": "MIT" + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yocto-spinner": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/yocto-spinner/-/yocto-spinner-0.2.3.tgz", + "integrity": "sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==", + "license": "MIT", + "dependencies": { + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18.19" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", + "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25 || ^4" + } + }, + "node_modules/zod-to-ts": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zod-to-ts/-/zod-to-ts-1.2.0.tgz", + "integrity": "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==", + "peerDependencies": { + "typescript": "^4.9.4 || ^5.0.2", + "zod": "^3" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/sources/vonage_video_ios_app-theme-customization/package.json b/sources/vonage_video_ios_app-theme-customization/package.json new file mode 100644 index 00000000..a05692a9 --- /dev/null +++ b/sources/vonage_video_ios_app-theme-customization/package.json @@ -0,0 +1,22 @@ +{ + "name": "@example/starlight-basics", + "type": "module", + "version": "0.0.1", + "private": true, + "scripts": { + "dev": "node download-toolbar.js && astro dev", + "start": "node download-toolbar.js && astro dev", + "build": "astro build", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "@astrojs/markdoc": "^0.15.10", + "@astrojs/starlight": "^0.37.6", + "@astrojs/starlight-markdoc": "^0.5.1", + "adm-zip": "^0.5.16", + "astro": "^5.18.1", + "astro-relative-links": "^0.4.2", + "sharp": "^0.33.0" + } +} diff --git a/sources/vonage_video_ios_app-theme-customization/public/favicon.svg b/sources/vonage_video_ios_app-theme-customization/public/favicon.svg new file mode 100644 index 00000000..cba5ac14 --- /dev/null +++ b/sources/vonage_video_ios_app-theme-customization/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sources/vonage_video_ios_app-theme-customization/setup-project.js b/sources/vonage_video_ios_app-theme-customization/setup-project.js new file mode 100644 index 00000000..d3f5a12f --- /dev/null +++ b/sources/vonage_video_ios_app-theme-customization/setup-project.js @@ -0,0 +1 @@ + diff --git a/sources/vonage_video_ios_app-theme-customization/src/assets/houston.webp b/sources/vonage_video_ios_app-theme-customization/src/assets/houston.webp new file mode 100644 index 0000000000000000000000000000000000000000..930c164974ad8eb528878f15a98016249b8cf546 GIT binary patch literal 98506 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 b6~t;_wBcJ3AWgga7~Sz~izoKbpAY~5r|m$8 literal 0 HcmV?d00001 diff --git a/sources/vonage_video_ios_app-theme-customization/src/content.config.ts b/sources/vonage_video_ios_app-theme-customization/src/content.config.ts new file mode 100644 index 00000000..95372921 --- /dev/null +++ b/sources/vonage_video_ios_app-theme-customization/src/content.config.ts @@ -0,0 +1,7 @@ +import { defineCollection } from 'astro:content'; +import { docsLoader } from "@astrojs/starlight/loaders"; +import { docsSchema } from '@astrojs/starlight/schema'; + +export const collections = { + docs: defineCollection({ loader: docsLoader(), schema: docsSchema() }), +}; diff --git a/sources/vonage_video_ios_app-theme-customization/src/content/docs/01_First_Step.md b/sources/vonage_video_ios_app-theme-customization/src/content/docs/01_First_Step.md new file mode 100644 index 00000000..d71ea4c2 --- /dev/null +++ b/sources/vonage_video_ios_app-theme-customization/src/content/docs/01_First_Step.md @@ -0,0 +1,17 @@ +--- +title: Introduction +description: An introduction to the onboarding tutorial +--- + +# Starter Tutorial + +This is a paragraph about what the tutorial contains. + +Here is some code: + +```js +function demo() { + // This is a comment + console.log('Hello World'); +} +``` diff --git a/sources/vonage_video_ios_app-theme-customization/src/content/docs/index.mdx b/sources/vonage_video_ios_app-theme-customization/src/content/docs/index.mdx new file mode 100644 index 00000000..bce9fdc3 --- /dev/null +++ b/sources/vonage_video_ios_app-theme-customization/src/content/docs/index.mdx @@ -0,0 +1,7 @@ +--- +title: Starter Tutorial +description: Get started building a tutorial. +template: splash +hero: + tagline: Starting a tutorial! +--- diff --git a/sources/vonage_video_ios_app-theme-customization/src/content/docs/reference.mdoc b/sources/vonage_video_ios_app-theme-customization/src/content/docs/reference.mdoc new file mode 100644 index 00000000..a9ec9429 --- /dev/null +++ b/sources/vonage_video_ios_app-theme-customization/src/content/docs/reference.mdoc @@ -0,0 +1,144 @@ +--- +title: Reference +description: Get started building your docs site with Starlight. + +hero: + tagline: Components that can be used in Tutorials +--- + +## Asides + +{% aside %} +Note aside. +{% /aside %} + +``` +{% aside %} +Note aside. +{% /aside %} +``` + +{% aside type="caution" %} +Caution aside. +{% /aside %} + +``` +{% aside type="caution" %} +Caution aside. +{% /aside %} +``` + +{% aside type="tip" %} +Tip aside. +{% /aside %} + +``` +{% aside type="tip" %} +Tip aside. +{% /aside %} +``` + +{% aside type="danger" %} +Danger aside. +{% /aside %} + +``` +{% aside type="danger" %} +Danger aside. +{% /aside %} +``` + +## Blockquotes + +> This is a blockquote. +> +> This is another line in the blockquote. + +## Code Blocks + +```js +function demo() { + // This is a comment + console.log('Hello World'); +} +``` + +## File Trees + +{% filetree %} + +- astro.config.mjs +- package.json +- src + - components + - Header.astro + - Title.astro + - pages/ + +{% /filetree %} + +``` +{% filetree %} + +- astro.config.mjs +- package.json +- src + - components + - Header.astro + - Title.astro + - pages/ + +{% /filetree %} +``` + +## Steps + +{% steps %} + +1. Import the component into your MDX file: + + ```js + import { Steps } from '@astrojs/starlight/components'; + ``` + +2. Wrap `` around your ordered list items. + +{% /steps %} + +``` + {% steps %} + + 1. Import the component into your MDX file: + + ```js + import { Steps } from '@astrojs/starlight/components'; + ``` + + 2. Wrap `` around your ordered list items. + + {% /steps %} +``` + +## Tabs + +{% tabs %} +{% tabitem label="Tab 1" %} +Tab 1 text +{% /tabitem %} + +{% tabitem label="Tab 2" %} +Tab 2 text +{% /tabitem %} +{% /tabs %} + +``` +{% tabs %} +{% tabitem label="Tab 1" %} +Tab 1 text +{% /tabitem %} + +{% tabitem label="Tab 2" %} +Tab 2 text +{% /tabitem %} +{% /tabs %} +``` diff --git a/sources/vonage_video_ios_app-theme-customization/src/env.d.ts b/sources/vonage_video_ios_app-theme-customization/src/env.d.ts new file mode 100644 index 00000000..acef35f1 --- /dev/null +++ b/sources/vonage_video_ios_app-theme-customization/src/env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/sources/vonage_video_ios_app-theme-customization/tsconfig.json b/sources/vonage_video_ios_app-theme-customization/tsconfig.json new file mode 100644 index 00000000..bcbf8b50 --- /dev/null +++ b/sources/vonage_video_ios_app-theme-customization/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "astro/tsconfigs/strict" +} diff --git a/sources/vonage_video_ios_app-theme-customization/tutorial-config.json b/sources/vonage_video_ios_app-theme-customization/tutorial-config.json new file mode 100644 index 00000000..1b5a8c41 --- /dev/null +++ b/sources/vonage_video_ios_app-theme-customization/tutorial-config.json @@ -0,0 +1,13 @@ +{ + "files": [], + "openFiles": [], + "panels": [], + "repository": "https://github.com/Vonage/vonage-video-react-app", + "starterFiles": [], + "capabilities": [], + "version": "1.0.0", + "filename": "vonage_video_ios_app-theme-customization", + "customInstallCmd": "yarn", + "customSetupCmd": "", + "customStartCmd": "" +} \ No newline at end of file diff --git a/sources/vonage_video_ios_app-theme-customization/vonage-toolbar/README.md b/sources/vonage_video_ios_app-theme-customization/vonage-toolbar/README.md new file mode 100644 index 00000000..d5f36b4d --- /dev/null +++ b/sources/vonage_video_ios_app-theme-customization/vonage-toolbar/README.md @@ -0,0 +1,6 @@ +# Vonage toolbar application for authoring tutorials + +In the preview, there will be a toolbar in the bottom middle of the page. +Click the Vonage logo for the instructions. + +![Screenshot of toolbar app. A dark gray rectangular interface element with rounded corners, displaying a list of six steps in white text, each preceded by a right-pointing triangle. Below the rectangle is a smaller dark gray rounded rectangle containing five white icons: an Astro logo, cursor arrow, three horizontal lines with a magnification glass, a V, and a gear icon. ](./toolbar.png) diff --git a/sources/vonage_video_ios_app-theme-customization/vonage-toolbar/app.ts b/sources/vonage_video_ios_app-theme-customization/vonage-toolbar/app.ts new file mode 100644 index 00000000..9861ba96 --- /dev/null +++ b/sources/vonage_video_ios_app-theme-customization/vonage-toolbar/app.ts @@ -0,0 +1,470 @@ +import { defineToolbarApp } from 'astro/toolbar'; + +let tutorial: { + files: string[]; + openFiles: string[]; + panels: string[]; + repository: string; + starterFiles: string[]; + capabilities: string[]; + version: string; + filename: string; + customInstallCmd: string; + customSetupCmd: string; + customStartCmd: string; +} = { + files: [], + openFiles: [], + panels: [], + repository: '', + starterFiles: [], + capabilities: [], + version: '', + filename: '', + customInstallCmd: '', + customSetupCmd: '', + customStartCmd: '' +}; + +export default defineToolbarApp({ + init(canvas, app, server) { + const myWindow = document.createElement('astro-dev-toolbar-window'); + const myContent = document.createElement('div'); + myContent.style.overflowY = 'auto'; + myContent.innerHTML = ` +

+ Step 1: Select panels needed + Please select other panels used in the tutorial +
+
+ + +
+
+ + +
+
+
+
+ Step 2: Load an external repo (optional) + The repo will be loaded in the project folder. + +

Default install command is npm install, if you have custom install command, please enter it here: + +

Default setup command is node setup-project.js that will run the code in the setup-project.js file. If you have a custom setup command, please enter it here and make sure to create any files you need: + + +

Default start command is npm start, if you have custom start command, please enter it here: +
+
+ Step 3: Set Starter Files to be used + Starter Files are files that have the code that the user does not need to worry about. They have comments to let the user know where the code they see in the tutorial needs to go. If you are pulling from an external repo make sure to add 'project/' in front and it will overwrite the external repo file for the tutorial otherwise place the files in the root directory. +
+ please include filename AND filetype +
Starter File list: +
    +
    +
    + Step 4: Set Files to be opened + Please enter the names and file type of the files to be opened for the tutorial one at a time. If from external repo make sure to add 'project/' in front. +
    + please include filename AND filetype +
    Open File list: +
      +
      +
      + Step 5: Create steps + In the src -> content -> docs folder, please add the steps for the tutorial. If you are using any components from the Reference page, please rename the file type from '.md' to '.mdoc' Delete reference.mdoc when finished. +

      See Reference for components you can add.

      +
      +
      + Step 6: Set Files to be created + Please enter the names and file type of the files to be created for the tutorial one at a time. They will be opened in the editor. If the file should be in a folder, make sure to put it in front of the filename ex. 'public/'. +
      + please include filename AND filetype +
      File list: +
        +
        +
        + Step 7: Select capabilities needed + Please select any capabilities used in the tutorial +
        +
        + + +
        +
        +
        +
        + Step 8: Enter version + +
        +
        + Step 9: Enter filename for the zip file + This will be used also for the repo's folder name +
        +
        +
        + Step 10: Finish up + Click to start generating the tutorial: +

        + + Click to download +
        Then rename the zip file and upload the zip file to the GitHub repository uploads folder. +
        +
        + `; + // use appendChild directly on `window`, not `myWindow.shadowRoot` + myWindow.appendChild(myContent); + + canvas.append(myWindow); + + const astroToolbarWindow = canvas.querySelector('astro-dev-toolbar-window'); + + const filenameInput = astroToolbarWindow?.querySelector( + '#filename' + ) as HTMLInputElement; + filenameInput.value = tutorial.filename !== '' ? tutorial.filename : ''; + filenameInput?.addEventListener('change', (event) => { + tutorial.filename = filenameInput?.value; + saveConfig(); + }); + + const versionInput = astroToolbarWindow?.querySelector( + '#version' + ) as HTMLInputElement; + versionInput.value = tutorial.version !== '' ? tutorial.version : ''; + versionInput?.addEventListener('change', (event) => { + tutorial.version = versionInput?.value; + saveConfig(); + }); + + const repositoryInput = astroToolbarWindow?.querySelector( + '#repository' + ) as HTMLInputElement; + repositoryInput.value = + tutorial.repository !== '' ? tutorial.repository : ''; + repositoryInput?.addEventListener('change', (event) => { + tutorial.repository = repositoryInput?.value; + saveConfig(); + }); + + + const customInstallCmdInput = astroToolbarWindow?.querySelector( + '#custom-install-command' + ) as HTMLInputElement; + customInstallCmdInput.value = + tutorial.customInstallCmd !== '' ? tutorial.customInstallCmd : ''; + customInstallCmdInput?.addEventListener('change', (event) => { + tutorial.customInstallCmd = customInstallCmdInput?.value; + saveConfig(); + }); + + const customSetupCmdInput = astroToolbarWindow?.querySelector( + '#custom-setup-command' + ) as HTMLInputElement; + customSetupCmdInput.value = + tutorial.customSetupCmd !== '' ? tutorial.customSetupCmd : ''; + customSetupCmdInput?.addEventListener('change', (event) => { + tutorial.customSetupCmd = customSetupCmdInput?.value; + saveConfig(); + }); + + const customStartCmdInput = astroToolbarWindow?.querySelector( + '#custom-start-command' + ) as HTMLInputElement; + customStartCmdInput.value = + tutorial.customStartCmd !== '' ? tutorial.customStartCmd : ''; + customStartCmdInput?.addEventListener('change', (event) => { + tutorial.customStartCmd = customStartCmdInput?.value; + saveConfig(); + }); + + // Always read tutorial-config.json from disk on toolbar open + server.send('vonage-app:config-check', {}); + + server.on('config-checked', (data: any) => { + if (data.found) { + tutorial = data.tutorial; + saveConfig(); + updateUI(); + } + }); + + function updateUI() { + refreshFilesList(); + refreshFilesOpenList(); + refreshStarterFilesList(); + if (tutorial.panels.length !== 0) { + tutorial.panels.forEach((panel) => { + ( + astroToolbarWindow?.querySelector(`#${panel}`) as HTMLInputElement + ).checked = true; + }); + } + + if (tutorial.capabilities.length !== 0) { + tutorial.capabilities.forEach((capability) => { + ( + astroToolbarWindow?.querySelector( + `#${capability}` + ) as HTMLInputElement + ).checked = true; + }); + } + versionInput.value = tutorial.version; + repositoryInput.value = tutorial.repository; + filenameInput.value = tutorial.filename; + customInstallCmdInput.value = tutorial.customInstallCmd; + customSetupCmdInput.value = tutorial.customSetupCmd; + } + + + const completeSpan = astroToolbarWindow?.querySelector( + '#complete' + ) as HTMLSpanElement; + + completeSpan.style.display = 'none'; + + const panelsForm = astroToolbarWindow?.querySelector('#panels'); + + panelsForm?.addEventListener('change', (event) => { + tutorial.panels = []; + const panelsChecked = astroToolbarWindow?.querySelectorAll( + 'input[type="checkbox"][name="panels"]:checked' + ); + panelsChecked?.forEach((panel) => { + tutorial.panels.push(panel.id); + }); + saveConfig(); + }); + + const capabilitiesForm = astroToolbarWindow?.querySelector('#capabilities'); + + capabilitiesForm?.addEventListener('change', (event) => { + console.log('capabilities change event'); + tutorial.capabilities = []; + const capabilitiesChecked = astroToolbarWindow?.querySelectorAll( + 'input[type="checkbox"][name="capabilities"]:checked' + ); + capabilitiesChecked?.forEach((capability) => { + tutorial.capabilities.push(capability.id); + }); + saveConfig(); + }); + + function saveConfig() { + server.send('vonage-app:save-config', { tutorial }); + } + + function refreshFilesList() { + const fileUl = astroToolbarWindow?.querySelector( + '#file-list' + ) as HTMLButtonElement; + fileUl.innerHTML = ''; + tutorial.files = Array.from(new Set(tutorial.files)); + tutorial.files.forEach((file) => { + const fileLi = document.createElement('li'); + fileLi.id = file; + fileLi.innerText = file + ' '; + fileLi.classList.add('file'); + const fileButton = document.createElement('button'); + fileButton.dataset.id = file; + fileButton.innerText = 'delete'; + fileButton.addEventListener('click', (event) => { + const id = (event.currentTarget as HTMLElement).dataset.id; + if (!id) return; + const idx = tutorial.files.indexOf(id); + if (idx > -1) { + tutorial.files.splice(idx, 1); + refreshFilesList(); + } + // tutorial.files.splice( + // tutorial.files.indexOf((event.target as HTMLElement).dataset.id), + // 1 + // ); + // refreshFilesList(); + }); + fileLi.appendChild(fileButton); + fileUl.appendChild(fileLi); + }); + saveConfig(); + } + + const fileInputError = astroToolbarWindow?.querySelector( + '#file-input-error' + ) as HTMLElement; + + fileInputError.style.display = 'none'; + + astroToolbarWindow + ?.querySelector('#add-file') + ?.addEventListener('click', (event) => { + fileInputError.style.display = 'none'; + const fileInput = astroToolbarWindow?.querySelector( + '#file-input' + ) as HTMLInputElement; + // make sure has extension + if (fileInput.value.includes('.')) { + tutorial.files = [...tutorial.files, fileInput.value]; + fileInput.value = ''; + refreshFilesList(); + } else { + fileInputError.style.display = 'block'; + } + }); + + function refreshFilesOpenList() { + const fileUl = astroToolbarWindow?.querySelector( + '#file-open-list' + ) as HTMLButtonElement; + fileUl.innerHTML = ''; + tutorial.openFiles = Array.from(new Set(tutorial.openFiles)); + tutorial.openFiles.forEach((file) => { + const fileLi = document.createElement('li'); + fileLi.id = file; + fileLi.innerText = file + ' '; + fileLi.classList.add('file'); + const fileButton = document.createElement('button'); + fileButton.dataset.id = file; + fileButton.innerText = 'delete'; + fileButton.addEventListener('click', (event) => { + const id = (event.currentTarget as HTMLElement).dataset.id; + if (!id) return; + const idx = tutorial.openFiles.indexOf(id); + if (idx > -1) { + tutorial.openFiles.splice(idx, 1); + refreshFilesOpenList(); + } + // tutorial.files.splice( + // tutorial.files.indexOf((event.target as HTMLElement).dataset.id), + // 1 + // ); + // refreshFilesList(); + }); + fileLi.appendChild(fileButton); + fileUl.appendChild(fileLi); + }); + saveConfig(); + } + + const fileOpenInputError = astroToolbarWindow?.querySelector( + '#file-open-input-error' + ) as HTMLElement; + + fileOpenInputError.style.display = 'none'; + + astroToolbarWindow + ?.querySelector('#add-file-open') + ?.addEventListener('click', (event) => { + fileOpenInputError.style.display = 'none'; + const fileOpenInput = astroToolbarWindow?.querySelector( + '#file-open-input' + ) as HTMLInputElement; + // make sure has extension + if (fileOpenInput.value.includes('.')) { + tutorial.openFiles = [...tutorial.openFiles, fileOpenInput.value]; + fileOpenInput.value = ''; + refreshFilesOpenList(); + } else { + fileOpenInputError.style.display = 'block'; + } + }); + + + // Starter files + + function refreshStarterFilesList() { + const fileUl = astroToolbarWindow?.querySelector( + '#starter-file-list' + ) as HTMLButtonElement; + fileUl.innerHTML = ''; + tutorial.starterFiles = Array.from(new Set(tutorial.starterFiles)); + tutorial.starterFiles.forEach((file) => { + const fileLi = document.createElement('li'); + fileLi.id = file; + fileLi.innerText = file + ' '; + fileLi.classList.add('file'); + const fileButton = document.createElement('button'); + fileButton.dataset.id = file; + fileButton.innerText = 'delete'; + fileButton.addEventListener('click', (event) => { + const id = (event.currentTarget as HTMLElement).dataset.id; + if (!id) return; + const idx = tutorial.starterFiles.indexOf(id); + if (idx > -1) { + tutorial.starterFiles.splice(idx, 1); + refreshStarterFilesList(); + } + // tutorial.files.splice( + // tutorial.files.indexOf((event.target as HTMLElement).dataset.id), + // 1 + // ); + // refreshFilesList(); + }); + fileLi.appendChild(fileButton); + fileUl.appendChild(fileLi); + }); + saveConfig(); + } + + const starterFileInputError = astroToolbarWindow?.querySelector( + '#starter-file-input-error' + ) as HTMLElement; + + starterFileInputError.style.display = 'none'; + + astroToolbarWindow + ?.querySelector('#add-starter-file') + ?.addEventListener('click', (event) => { + starterFileInputError.style.display = 'none'; + const starterFileInput = astroToolbarWindow?.querySelector( + '#starter-file-input' + ) as HTMLInputElement; + // make sure has extension + if (starterFileInput.value.includes('.')) { + tutorial.starterFiles = [...tutorial.starterFiles, starterFileInput.value]; + starterFileInput.value = ''; + refreshStarterFilesList(); + } else { + starterFileInputError.style.display = 'block'; + } + }); + /////// + + const generateButton = astroToolbarWindow?.querySelector( + '#generate' + ) as HTMLButtonElement; + + const statusEl = astroToolbarWindow?.querySelector( + '#status' + ) as HTMLParagraphElement; + + generateButton?.addEventListener('click', (event) => { + generateButton.disabled = true; + statusEl.innerText = ''; + completeSpan.style.display = 'none'; + server.send('vonage-app:generate', { tutorial }); + }); + + server.on('server-status', (data: any) => { + statusEl.innerText = data.status; + if (data.status === 'Complete!') { + astroToolbarWindow?.querySelector('#complete') as HTMLParagraphElement; + ( + astroToolbarWindow?.querySelector( + '#download-link' + ) as HTMLAnchorElement + ).style = `color: white; background-color: black`; + ( + astroToolbarWindow?.querySelector( + '#download-link' + ) as HTMLAnchorElement + ).href = `${window.location.origin}/${tutorial.filename}.zip`; + generateButton.disabled = false; + completeSpan.style.display = 'block'; + } + }); + }, +}); diff --git a/sources/vonage_video_ios_app-theme-customization/vonage-toolbar/integration.ts b/sources/vonage_video_ios_app-theme-customization/vonage-toolbar/integration.ts new file mode 100644 index 00000000..8d35ada6 --- /dev/null +++ b/sources/vonage_video_ios_app-theme-customization/vonage-toolbar/integration.ts @@ -0,0 +1,87 @@ +import { fileURLToPath } from 'node:url'; +import type { AstroIntegration } from 'astro'; +import { exec } from 'child_process'; +import util from 'util'; +import AdmZip from 'adm-zip'; +import fs from 'fs/promises'; +import path from 'path'; +export default { + name: 'vonage-onboarding-integration', + hooks: { + 'astro:config:setup': ({ addDevToolbarApp }) => { + addDevToolbarApp({ + id: 'vonage-toolbar-app', + name: 'Vonage Toolbar App', + icon: 'Vonage', + entrypoint: fileURLToPath(new URL('./app.ts', import.meta.url)), + }); + }, + 'astro:server:setup': ({ toolbar }) => { + + toolbar.on('vonage-app:config-check', async (data:any) => { + try { + const filePath = 'tutorial-config.json'; + const fileData = await fs.readFile(filePath, 'utf8'); + const config = JSON.parse(fileData); + toolbar.send('config-checked', { + found: true, + tutorial: config, + }); + + } catch (err) { + if (err.code === 'ENOENT') { + console.error('Config file not found.'); + toolbar.send('config-checked', { + found: false, + tutorial: {}, + }); + } else { + console.error('Error reading config file:', err); + toolbar.send('config-checked', { + found: false, + tutorial: {}, + }); + } + } + }); + + toolbar.on('vonage-app:save-config', async (data: any) => { + try { + const configData = JSON.stringify(data.tutorial, null, 2); + await fs.writeFile('tutorial-config.json', configData); + } catch (err) { + console.error('Error saving config:', err); + } + }); + + toolbar.on('vonage-app:generate', async (data: any) => { + try { + // create tutorial-config.json file + toolbar.send('server-status', { + status: 'Creating configuration file (tutorial-config.json)', + }); + const configData = JSON.stringify(data.tutorial, null, 2); + await fs.writeFile('tutorial-config.json', configData); + + // Zip up the whole project folder without the node_module folder and name it the slug generated from the title + toolbar.send('server-status', { + status: 'Zipping up project... could take a minute', + }); + const zip = new AdmZip(); + let exclude = ['node_modules', 'dist']; + const sourceDir = './'; + const zipFile = data.tutorial.filename === '' ? './public/product_name-language-topic.zip' : `./public/${data.tutorial.filename}.zip`; + await zip.addLocalFolderPromise(sourceDir, { + filter: (filePath) => !exclude.some((ex) => filePath.includes(ex)), + }); + await zip.writeZipPromise(zipFile); + console.log(`Zip file ${zipFile} created successfully!`); + // display link to download project zip file in toolbar. + toolbar.send('server-status', { status: 'Complete!' }); + } catch (error) { + console.error('Error:', error); + } + }); + }, + }, +} satisfies AstroIntegration; diff --git a/sources/vonage_video_ios_app-theme-customization/vonage-toolbar/toolbar.png b/sources/vonage_video_ios_app-theme-customization/vonage-toolbar/toolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..f5bc53e5988516b7a2f32f10b55f37f497303e34 GIT binary patch literal 426515 zcmeFZcT`i|)-MdAA|jxoQUwGN5$Qsxi5-w;K~MukN+?1SdJhpBAOb4Vq*>_@dJ7Pw zN{vbjgx&%K2oNBIw2RL<&vVYb_nh~hG2T1w_s_=&BYUsR`I~*NwfEXdT#=*h4aA42wNOV`o-0mBXhv9v14h~+y-~XH(?^A_$$7WqE?)ls^ zHPLZEz?AG95%y4}0GP)vH3x?tD8R$c!42voWe;_Bh3iX`F<5CSS4VwmD-BZ>Q;#c9 z7gxg|FX){hGYf|xHwSG;X%J9KFFW2mVq z?oudv2f}^q0u+6QsI939&~|Xp z)U>+*{geMH!ol}LNG1)yQ?r2QwFxtHs1wc5G=GwN@x9Cs1b>>O3?)g3MMFbX zX=yoXYOASeYXYRD{vr1Y!X4pdig4WZx%%%y`6FR<3|+l<0~`4F(z^ro{QHr+tJEJk zs$=KyyNvXu9e$?()KU8H!><3rPyd-le}naRf$oC-7s3A|s5>dDJ3_S;FF2}bD{9-Tsw>*rX+qWQHSDxhob3K|%)c~j zx6=XsOw|AThW$Mx4lZ_ZXXtKASC;;7n5wE}e?faUJJmF_cTI(={!UDFO+|H;U4zxN z)Kne+;i`XQ>OX4o|5H;P5O6=J*FUAKhn<(*?xY3v^46Dj+U-VCyOsGztt$J$9sisK zJiHwh9329rd=OIq=nenYosLj1*MG{Lf0poJpPcMu8Jf z?vJhpX5}jPrW8Vx&Fi5pwKs`7^b~K6Wss|@ zmJTnJf|+@^q4BywTQ}R*RFc}j%dTd65QI!Z)}g7J^<#tobW%T4&Ppq6_@|M7{+QfB z8vPvlZ#X+PS8iedH^4vGA+tf$?D2n=^AA+CS6y)5ztm-H(5iY&fAN1+@$am8)?|sz zf1~H!LjTyEe_`D&>(04Bi~;k1Hu_Ixkn#V&dH=#QklCFX^f!Q-x-lcmOG@3g3|UmMv74XT|SJU*R6F zc`%)*Ay5nN<2Ivy0|$I$3fQuxk8eLAhu)8)k65OLVjm52A8$yz6LRSlv*A3mC($dc zw_D*I@@6YkT-(9!^a}BK1aS6bIj;uRQ(9mX-eT+5hP_%E2;8=j8{P^Y z;O{V~EzhF2LdZEuNu9>F>%Il6LOx9b2WcOQB^$Q$KH1WKDrB>#@Da))UuXJ%bZ}D;UB7*4U%jC$=q%-_5F%{W(sFQouwt6>WoJzYG-!>$`abzU zrf*v186Y2dI7zg525~6+Jk}-GT`N>Rx?Bih2xHJx?88%%96#Fk*tYxxFVv}JMt#T5 zZypqZl&^{ILyQM)W+^y^h{uCi8?eJQ*OskrZEeLXD}`A#vK#Ez8WRc;HnXdj_^=W0 zY{NzulHFt>M%$J*(9itn1y-Ib6~`-Wz4`J6D>BY4Ebnl5AV{wS%4r9=fd|wpAA9o( z4GN*}`7k%~Vnc7TxYtqrT>|eJVHbgq(YW|kZg!vo#VQ_qw@ra(+>#Z)0W9irLly>o zOZz$sWEbxMvlrXOf_{zW4UAgiG}b*w;a`z%1T=%!=~Nch9`Hh7Vs>MP`?zjAJ1hbS zpI9iia`DLhRsO>24voVCOIceV@$~D@h#6`#PL%L9{<4G1;XNQ_j!PY5;w^zy_1_&JMcK;hJ3`?s>gM43PDvxX{wyg< zX#L=e`q=#xD*}VXE?}Tv2up&z57Hz-Tm4@=%b$_a@}W7u>Yr$YeiImV68>E~eY89q zNYNZ>6S#(CkK|koxjP+lcS7jGTY}Frdd3^Fh0byY0@PXcr-dPVZv#(E|(bn78(m|@~UAo&+59C`Xa77C#iB?Xk8waj>c0=^HtT1p$MFTnbB+!hfUirgL zH5zqojkN8-)^_bT10NuhusezCB8xOLz`qBH9TnhcJu5%m){U}nc`;Mh~j3^(?$ zB;5hE6w6)!F`Zcq0BR)>wUAiPT!!GfuI>plaaUZ6@n@IA(&nSPE1|77bHIqRWQ>CJau7^6=IJj6b#`ZTwa}36;SkxtHttDr=MBP%}@cl z)$@7mVav)yqqUgpnct`xd5w@q%MbW!-z8!2cU>ya0XtFDOrg-S%AMQ8wv@9B)it;; zzC#-TV|hG!z#gqHckNbK0IEsWytH)DqIT5(aV^4-3)*4F_0^b?TXQS(-W*j zvsoAe8a+(ihk1t1))?eH-=9%2_O0Lv{N={MaeORGP%9_2J^%$XLq-DmD=0HI5knr^ zK#p%InlXoxB(RUq!bPJ>9cyipBkmmmF`7UdaUhx?c5R%Zj-re+QrH97%}Pc%tAagY z&g4T~q2^(9naBkz6som2*uSu=%B)Uy2b%~f-#>lqD8=DhyF473 zSs%2;w=@^J3{Tq_6-bS0j7l;HAJ^5>a-(KKJlk*CX1blQsyM&3CFr#33aRys^|m;W zNZxNZcy5$MRGPd~RBN7Oy)346-y=O?r9kJas8y3kS<9A+ho{ArN?dV+7*^vaC*HXJ zMTTw?J|%?5D#8>>+_u{zz-}5lVGPW)uROJ?dAX`QRkUu_YS6Os)aY>R7F{O!j@e5(KeU|Y|z#khM)_o_B5Vo z$=oJ!%<^9vv_yG0b5|A&XSHPwZ)%g(-7EZ`$kYY9wv#wK^QIIJ*m^w%$7$KfNsZ=D z9F^a}4PXM&c%xsf55G)da0B|sTH|}BMl%BKK<)4AxZGrbheE$XUqugl#C<~VySiJu{dDx zocAey$A_iNy(gw_ir&TweUMvtx8akuq^t7y-vovmdp{l2vGT#WLZ`SZTBan7HDz9`pY5eF4OWoTrO)15sF>Y7L zHEG1p7Qwn_V#*llF}@p^jUM6PD8np6qGoC5%>z<|))w8qRvY`vS>Uebf&{e7gx{=A z&4;#rtnCe)!$7#G_U8@lgwa0A(oeK%R$XxEm|I!UU7XEa3|pF|mfEt9AD#<8C@uS-E{f|u`*_5wMPjA)-cQ)C z2&w)c@reVU>PfTPlzf3r{5UiXfz{aTdSx*4&7X(kJV@s2b6<(rS&v&HLa${p`E0(9 ztb^}Co!PR^;+8$PIzFU&=4Sa!maNld*%xelm@h$m&z&7)J3 z`7DCX{e)jRR6-OFhD-oCcA7SG&5`$tujm7)4`ngMrbIb|g#w9;@_j=4@ z8HBGhj_}qpuhcGQ#p4aeh4zr&y6+Z#aottRuZW* zx#KJ1hg=FQBWDz~!1@WHQSBzevN08vHtCaEe!Yc}kc&=3)r3e8r1WsHv_Js_?^)&X zf%M7-n@ebxLXB+(H@+S?GMf}(U_I?bKhQN7w=AlC&*WPORoXoEBV!xiux$fU@4WcD zE+v}BdogDRZl?F?vV9o-tj&zJv!V5zK2wB(DON2?r@*Hf+UWV9fzy!;3++RqAkWjz z?t5Y?ZMbOPV?Z!tOvrVA{{Z7I-1$24?7jSAzxMPduOjc-F?;*?vROHBGF*-*ELWRb z6|0YJtd3q4&nIWBjvzm7nkDA};cVxTswmIptd!;Zz+T!%qV{W3KmE2IUdfRPS#Qx{ zl1}Ft1Iu))GD#b+BK6F6VE^W=kqah0f|?zg*0Guu|PCkI>ufEClw~YinvV-{kQL%#F-wgW=viVt0y-wD%7KJfmy|Ku;2L7^$8k z_MYvt2H3UFrAkCbq~yL5IYaSt936p-}ausklT!U&L~K}zUpwxi(it?jB-~OqwZNI2NL~N#zz+8-h=ChYp3z> zU@P`cga7&!T3$$#B-M>xIK3!;VuWzL&J7sgX7zDz{+wM=XJAKuYoEXIYu$vg<|CvA zTa`PZ1>~{LWxUQAhYTSCNvBL{j>?-cyr_QiaDd)0Y(XZYZul{sr2))^H`m0CQLDT~ z?u`+G-?HzXS<6lDy%baEyi(z_u8U?nfj0HH10b!WU_xod6|X3a=A4bmAyUKC(NZ&5 zZF5N}V(L*|%&o!g^0sl;&y3l{6kB#{*8uM!foaP@ph`euxYm{}G<1`iV0mS)~|hiTuE4~g8J?lq*)EkUKnkUQ}#QMh>EVz zgR2manNMGXOjMwJ9wCJ1tSOUPn|J)^Jmf^=>ZlEbb4DP9$&F&Pp{Bx7GX`&HmF#8q z65dOR|_QD(^if?9*8##;0OnMa711C*mZdihn(ccXP3K8#lL?j3oz(N%9`o8 zSfFOe@#CQ;wN6XgGWT$>+se-sv)K!GU!Z0wwniKiH4?J+j~7!PFMHs-KkaoFx)~ZY zO!y?Bjm-v)kNRbhqs=~*3v$e&bY6d0$-11u0;wMv3L05{wk}>*6m8J_e(uYQ#Z$_z z-M1g7Fu*zwgIy&o?{<9D*r(8j?Akb*{@P>vaCM*~8)T+d2o}jcp0Jo-mhdJ*qhoj( z6&G6~k5sTI83Khv2?uDk<$z6i=Dtkf6e4%s>$tQlUf#%VBu(hT_xagZX@>CyLP$rh zbA`HjN8l;?kLdpWm1CUUdu09Crn6!1()&J!B@dlY0_chpfo7qDn@ePVT^&KgVcOWU z{VR8F>kq>#FTfoiJ+Q_Xmn4|(m~@`u;Al2*vLZn>NSy6nW2qPKRV}H>vCaMOPb%C z2Pv%t%i<|-cd4A67uD*g1yg5+LPvSH^X*H*2K_WmbZRo zdtv}BkhMq7J~z*vW6HWi z`p{CskuzLyO%`S(0Nag7y-@@ZUHDXKa{bd4kbwHN$=G@q>MU9CYG#r*=9!$})d$1z zSs(Rn2DHwE)FX=WuU~6xyQJ4qzt-U_X&x8@HE6sd7%I#<^pLzh{_4v#nvN#QeLi2N zY|g?)Dhb^6GdFUm*Nxt%gL545*A{^59#b*jYQ$AlUYge<|DtT`ij*#W(TMq3zy94j zP6SO)0Wja+Vfup}>4rtx#FH7lPg_nTVqWYxsIkR6l`EBEI;Hq+@oWj~egQE#uySxj z`_)%^avJ((%mX-LvBK9*?S0Cl;m;8T);!i3xGqW78wBIU`05=9eR$BmAcLvTemcHJ zKoO?bvO|5Zh76f)Ca&DdDqOtD{s`JIU=@#3W4X2m(5x27c1s5O%?nWnl~g}J7i-H_ z1GGQrLgud(1=F!w-`PSfs~Z~HqhXYe{F%g8Q$n>-h3(0^HyqN!UGw)l&&_y9QMw{) zie%vR+fPK)mVR)FsfQmeT1VH4>Z{MX{$3u!hAnz|s6w%S_d#Gx&r+2E+H9rMwLnoU3b>CtWqg|;4>z+f*r zGHa+}Og9;_I9EZ$jR(wst+OQLF&(HI;QAkDDx*w*KSuQ_9Y^N+Pgc$tYfpA{DS*lR zcUNG(oaWueZOKQ1n&Ny+s(Kss2kKrE8Nm_b5`s1WF|D=tF&H)U*`P}WRW6hV1k)Gj z^fEHMeycITqbaTnKCM6pwFr$25?@N31cZfqZY#6a59*s8xX2sg1?PsxVfaie>hP`i z$xVBh2bg}b7}WZJ0z&cI=Z3Ns*9xj=p6Aa-p7H(3RFmmNx+Ff{2&|qhgdBZ`>Tl8L zuyzZGtgQ;_J-I)9b9Y86C`(%lzINzT5{deWnX-eY42FCdAEqW&PpV@Ql;5nyL#E@! z;ojAl>`JJC+`D?OFLiU5I~64{R|$!l6JtKzN2#w?j(tWf)827~oL434Wy!QER3ihN z^CoTHEhVI%r<~8ogJBy4m5HL?{4JKW3&9}-^*G{E+>^TWz;>=`rO%d{qekRs#|wEw zA|$NDs}@E_`mx2c7P#7tFFi+S!){fbYdy&XMKy)Xv)5ioQX^~9seyg6mDo$^&$lBp zb`~U=KP9=QBx$4UAE-6#s&4SU?ZjmZRJBC8Z&pSIa%+gq%wVDz4(vRXcmtZTuFPt| zZU~u?HissDxLA3dm*$j8R@=*c@pXg8rwi{qCpqRvvmyAveOs@ZD?o9E9yXzHH)hJ` z+rRL%RNe6p52XEbK5Bu-&CRaW6?&sQb3@#rD;K&};u3!8Ig1q}?o%xdE- z>QqOMo1Si_UT3cO8Ts=>q}?j7&tvOB%<8<6(a!i%*8(AqioMOy6ww1>n3omFcW4!k zrni;2XDcs=p4Z>PFis}Qp3%*!>^MR_!`1YSH_n+b?1T$(Ds^r@*qz~cQb~N`JV9wy zIQC@%xcw3FWOdi%x^h}c`XhReIi@sY(x-UY#u;3p!H}e+{UY})XbcS_QbV$qi+mGH zid*?g`Pw&q# zZhdkpVoU8XOM$3TKVBFW-A1t1;1B=agRUBdy)pSjun+AJwkRj-_+XB8uFxnhJ?VDG zV6Ccwv1EDR$4Q_+r-s$qj=*$0k8-p>~krVlVOzV7qLmfSPJd zh%KG~LsZ24@*5_a9!^AA`!ro&^EKb5s3E8UHnU~Q#xFQ=Y=OHEdu`}KI&4Wo!~ofJ ztepOYYPz+R`K-j_?cL5IRn8P<_)rQqxIIzFAgGxAyltK|cKfx>^7?6b@CZUu2zbb^ zB?oSK201d-H;|zttXht{{Jwh$8MaXu3U_>)D2(hV-{_}!1rqZHkwf<^LGUbB8xQ&t z77Uti3!MTmwjpf6iwqeoU6Q4{dw+3g_sV-_E#QxCPP!%JzeC%-1i+ytA&kU7R!tnC z3yGmDEA}tQF>K!RrnAyFwRy7=uYP*kq8GQQWHKwB|7hegwT@wQ`4MCKHg}9sA0?4~ zlSb)+a+Q~=f=4;L$FA=CP^4zpKq5DeZF;TWW*z?!AtfX+I7(i4XG4?7s@X((-#)Gp zw%Ns9Pux%P=kN$cL>sqU>ycc9F1j+zlVYyJ2^1=f+A{$cOWvQZ)o|9gm}m+N@y|mI zE)VSQ@mnbwh6-c!91>xbfaTE=uL7nNn337Th8@A&kWr-PWuat!Eb5I$HU~@tLOPKh;%ZxM1d@o z>OOZr=dJH;4}`JJ++8@NSsCuRV4YFN{|i0v#ky0qORuxJs#&t_x!dcs?OE86d+@4V ztba1NZD{Hk_cuR1v>G%ntLmu@>s_gAKbRKWRp)A4UMcD=$BwgE4#A4iwWqtTDJxOH zV!#D{t8r?LO_5tCcNdzL(^)T9(!gPBsdzJ1e?$V+-rEAqO*DHNwjXQ zK7F&$-1KcXKn3W#t4mNfR*uVzIz6i0icq(RSWTX-)0C}zTv)~F~nr%^T@);9t()v?SyTSut`|JA<6o_EQ>d!1l?vl_U7Y z7C^x?`&`AC-4ge9U<-;PD`fha4SJnT7bm|mjz$20zHT5nX8P3kHfDL=GK|(QYhIu8 zl-{@i2CX}wnC7e*b1qsbmWbNc4W%PUW}8Ce*-OS7*?GE1@iyn(=HJF{&R`&zh3rr# zR>$tz1G}w&x)eYC^;8?pJZ6Z*%FmiF5A&04IcC->CDqSWx+2LO9f8n3T)21YK@Q@| zt>8(EzGEjwW0opoy_Q6MWbESLv+qd2)cggFu+=6k2nGBoJqX|~Oo>+BCXhf&U-NIQzb zo-dH#>cRtw1)^`klSkJJx-qh4&lg5bZ&=aCK>$hE*I0x3&`RD+Xi})E>Ib)dC=9Fk z)ZF7vM`E%2@qlIi0mtUAFC^=Jb$kswl8oqTI8x7ix(kxv;deq5@nAw70F+@=%hJ^GaMxRMY*%M}c)fHul4a?UJ!%;tx$!vGPvbRu{g@c9{S1=O=5}1?lQkPV=HLzOWKs(s&c60)vZ)NXsrToY!@yl@_s{(w z*=n(YPikD9P57g&I9t4y$Hy8+Y&MrnSN6rcc9L6>;xo{#N~6S`SlDdu zo>sc)A@=HaTJOMgnt^)9L}A6zg`^GB&tLrME)(Kcv%`54;BTwd}hI{japV;y{KVl$XS8O)LJ;h{%Qc7n(0W9$tS3%fmsV=^jP>%Xs7S9ko!n zZ6Y>M`{0Xed;-U-ybr@>+97Ic;2WEV%>2*PLic?Ad=Z${j|{TyJS{M|hisu=-S8#h za+@IsUPI$Sf(ifqmbWW?*UO*RMvSmu9xqTfGB^3jwa|4q&-=>L{x9_@4soI>T|Zg) z*gE6r@N{>l2sciJxdK)Y0sq$KeShp`7 zLuFmr5@+%Xd8nyah8WmbOi+FJ^7`Y!6F<{SI<-xn=E(|9`oT*?1>Txp^3!1lHJvPkUwgL0x~?vK_PQxR(qoj6De@t~Z;7oXy|?(rPzFyy_2zNiSZ=MyMs z=#G}2u!iEYuG3c=inr;(wf%ykzAX|KnR+^~cDe6e?#sG6(eV<&c@C7RZc71lDYBSc zX4{iCzU}JZ)I1|LmsQ*{9(m?CMEKI7p)N_T z6XXi)nElCOW50S6`>ss)&D4)~T6Fup)%JGWSUZ`rtZH1h^ZDkrS&xs|wGYcrXGOm} z=B|8xP_4@%6q;Ujs>|N>RL+Yw|5u^7H!X*qrZgxby)BmfBs~}ak!G^3qAl4zo=cM` zuiPfk90^$Gq^A3u!k(#1c84E!a_cxj4|`vaO^YL(>+P-@x99;O_%kp%%%dodHe$1CN42ND9&#D|I z_s|%Qjdz^vj5B8+S~cT`c|S7mRYC7N7^kTw#NUhZt9|tBmZn<(CU~k2`oP*Ok?`oz zvwFDpeiWiEwg|cR5Vr+xMOLGyvTSx!P(jAb(jc#g%-r#pfY5h-Z#=MO`0hVE@2#9?Lp5Gw z2)`5#oere^OdX#$HZk+vZ(tpybHzzEnh!Nsb{^eXeSaX|c~O10{)ij)(?D&jOZ*Wu zn{sVR+ZO|V9VkCQOb-+L)Tk4eR`2!T6M+y^eI6yR5#5cyz2LZq#3oRmcb>*5;()1ZeWF zrsXg&JW~(%Z^I z)~vwIy&IbS%wd`NIweRs&a5H9&3&%Hfn06`1cNHZ+qbq zbz26;yl0%0-+DFP&kO+y27@zEsj7P;gHy|@4#UM!+ol0mC>KYFcFH34=pye-pyak*-Sr5KKJH2rdS1TKv3S-@+`2^&6Ih;=X;T zFsVNkIAul_rYHKeraPZ(9Nz#i=gjL_o9rGGoy^9tJ5j{J`mIegayc&I9?7Y5r*~6Z zf3fdFtEYIIXUNV%7JCbTr9tQj#!~|c5Vae`PD7yFUO{+xJm%C*O7tTQVn=H(7VV3` zZwpwlN;wyDLLPG2p$Q%iUOnndL=wyAq4zYI_ToPB#MvI0_F&s=lUPq6UduvUGM9~W zOC!~{bMGlm3vci;^W}|soIYEsJshtKQ;RHoTDkT?ey-^;l)C{)5wWZc6cUr0d3)$y zvcxgJnCAX5IBaR)j19IhQ4k;W<6C>78MUQJyR!rKuyQ$$QO6QesYQ^tFzMsS8H)@s z;pS!C+0>=5mj!e{yNP}rPi;vu809Kf^(J26MUn};x;aZHgS&pE6Z^(FQJ{j#}g; z4jC94#g!sq4ht#Awx^x6M-2KRo`C6LJ@xfoKF6)el>S<}lB3w5PA7jQMHw^n)|`g_C}}{aMT0+dS`4(_3!ao^<8hdilc*GBJ)%8Xw7S zdiu0TPU@J=hjg|LaB9^^GvEV4zGgNLjUbyLhd1U8zip>EION_pLv90W;>>%shJ-E5 za&6rAgk9N3;y!QJbX0Rcz}ua^5MD8N&=gGZx-H!kq(-eP-;}j1w+y{!${~VVhwE|6ekVxab z7}2yH<^G~vAuyq>Lf;^<*LT|baM2SlvzeFB9ofQn_2&+s_R8_pAbix6-j&;GH!8qU zUKMkY^Td&Neo7IY&(DJ%8S+fU>L~uKN_=?)KV^8dq@d}?a=}fjAa{F9DF9#97qWA6lt(L~TwGPl)ppC8?6WWv#zoVaWo44RzVs&}K{n?E zn!r!%d_CKy;_Whfg&OOEkRDIZeZG)MF4YN2_w3?Y3+oX~3O`mM35)4;B1s01kOOqK zGgU68*{0PHZg5%VzX!TnPtiHI+fKc6K&>kYtrWuwn5sDFHy zuoFL$Byip--IslK!#Cm?DVsU8g$V;SwT;yBOYi;I{()F_1 z%FVCJfWny2BVBod9ZeipcZ)rA`FGhP7~f-Alc04RlZhHf)$RPcmd)DUafzwfpo9Q9 zL$-#Tcl*SGGIJfW9n2bIJI$?igQy7P?yk4$z*#D6i_*LYsU-RH?AzMseN}JLO_*E# z?8Z}k)5(z&KTLkk)Hz&zr_`3L>XrXJ6`Jg#gwm1gO+i9+R}$XRFn^l?z7lAcWX zDJ~1`cjlEp$48C5<*W5t62-JJBZnhp9=?BR19bHggXQvj7uqBa{LFN-55i3szEG0P zv-^J346!i&O!y2q4b!!v3VD?7=0;xdsaJt7N3U#;{$$y*iz^FE5U#0i8U-n~ELs6x zBWBtjXDPAzBLfsDl}Rtg0scAfLLl2vWL4 zj5^@g=L^5`seRH*Rg+6;V3IR zMY*|xyW>RWITMPE=`!y^<-bN9LW_>5%pAR=#I}WT2`$+5M%j%jo=e}1?+zaE`p74# z38BcfRX{ozw=1L4ti2<}z{8Y0x4wEDs&Hs{g;y>)xV}!%o>=W~tTWWm=VrQlX5>r89jg;$Y@}O|g(c4S z(Tl6O+@1u0_Vi48U}zz3?89uoTgCRLdqu=kV8j%^*t8pHl?%IoV00f@GiPV8{eM42 zI_b8%BPW*;vgbomKRPo9gzEQS+*lxoQZcCQScW&2Ol8N7v&yjy-rbd!DCeqoJG?qk z*W3Zj9owlkQskc(BEFeODJe26nlrw32m)9PEFc?re+(zxHDACOY7Gi;o+e79#GQ!f z9A+j=d4&D2jv5KDYy!0}=U+SIyu>;LE|R!|B05|U;@AIL)wybx&hr85n=5vrhfybz zfF52=oqQDVRdMRhzDHkp_t-$r1WeXV$M6oW6S=_#hRuC^iW%wvVL7EZ(#mP@kX^ZB zDM86#3kLHy``$Ci7d#ed;DhxV3Z*(`H~v7!>xxRga8 z%o>l@ou=A5EN4v-ib{{`Iw#$;V_X@UNp`@}8cW}8{1izs9H4HPkXn|ydpujV5#=Py z*gLorJ8xHP+bv7Jh-U&{+$uqp+Ogp`ST@ATqVygP(DEHAh!V;jyRu%lyiyuk zxWpr7x7}McS>uWVwhFixo}R$M`kUEO?ar*Y!Nth$^S zaMm4G={-IzbpAxD2kQ$akv4hqL~;Rq{ro5lueB*YT17UjsGdE2B1;@|hzoE(Z8?h+ z(*5-=aXu+qua_ExhuH#?DiVL-vHjIdL!gANS-L~?M&US2PR4w2aJytyGfSMy0ptPN ztVoIdK-t@Q3UEJA!Y%N?1F|5PFxS>*08fycSmGt>i8wFm%pSGO_+~q+NMyB~AP@6n zlmmNI8P@O%rk81YXNcNFGdVq~=C2RKPJT8SQ}Pu_x~dPBM|^zNqh4;#>ITPz!O_%6 z9cRDMQ+9oCHmtvUPpHo+pttZ=!Dks8I7X%h6=;1C^nhQ$9=YE>Zf6Ia|*5 zJdP?Dihm;Hyu3qJ5cu+RAA&p64l+Z-Aad?>C0^#-TkTz>JnIvT9#{Mrd{MifcI>R@ zB1dl5{)<5DckXPW7aGjfqqVJ8_&h%FZM%ki9ZXqsI@PO@?Ckd`7^YhrQZ5VWT+Kzh zF#%v5WT(6GAqE20H2Wed^dm<&lWLk~s*DaTt?L&?U`X@v^_q3y)qW;N5#@O!W23_u z&F-;D-?4PcFc|ioH|xFIvqfK&ISVPRnQU71Ye_QO*Djy{%lEqjfU#M&^=B`IeF>qMr+Aaq1;}P86$G z1vf_Gr+u|rj&)$|ONywL{7M8ddhPC4pc+zn>)Xj?4E_hczwp~ngl^b4W_s@<7j5M0 zR&RGR4BocIGiWvE>p@aK-Z%vuDkZtd;5^a7J*|=BGRG zy!R@qG)ysO+Oh`&`@roE=?jd~RbEd8yK7I!`(E!UX7O`tG7H6mS$KaB_gQNg5RFwR zWlK3%Mf)d)ELcple6c zRyar6EUgz&>)-NH5oKzD*rlq}mPUpzX zmdyAzDRj{}bQ-}dKoQtWR93nqYf_RmJh;0d7l#}Av_uK+D?c?vt*6$3s6_TMmMpm) zPSIj@Ww7EN614Ul|HX|l-O3O@m2{&ieGosXH+MNTye>Nw*w3`EN5r@JMad|r+h&sC z8hWU+cW>X*W+;6)cy;&dP>a`3!AS{&DWiVEC=JGEnG^hD0r7Bfw9V3(?W5fHo>Y5m z@UMN=@|hzE&Uj2pDh@ULrC>5&OQS7sz%-)NMC&$KU}$6cLQR2B>0R{OIXoQJzM;1D zI+*m3Tp?3cVs?Ace)L&kjCy~P+-QUKxmB#apz`y%#rgx!o;(T35a{jPkS%yKRNHF8 zJlCW&`Ncr!fmp=_EkxzrnQK7)OMo$?0>N)AO14t3?iyOJnB7YVP%8yHc(2*ViS?{& z>#}GV_|XF0RBSLyP%}F3Hq01C6chl^zqJhAEjhDdb{W(A0kHZdr|8q^*TMNsU-vF) zAx`jy%XEeJ`Q^ct9ei#s=0BW@5p{*8gM$RV!)AmSBN^|y{Jm!(U3~gW>9Qkumlw!r zWedug1RvJ`lW~uLs3XMeAR(c`8$-uD2gsZCIjy;md$Vk08txyFxQ^(?*Dnd%pIB-7 zIOuo!y&Nm;_qbHiU*{;QoY2~+-(B?G;Al*wRmO+Mb zdK($TzK`n15yE5?8XDAuJBw_;>?xOL_4V69qf)kI+nJi5J>T<(i;@1PRWB|FM$|>} zg+jj23qQo+nZ}i>aKZA(?@=dt?mYoS2Oa;pl0W>j{diC=&9vV0R$hHsmO0U)d1W*^ zxG`Jz=K|VUMH?zVU}qFOzo8hs_KuKRFRTRCaBSLZ_?_w+d%y8?z`3QF9zgtvLWMSc zU%RrB=8Kn+xy5$_>YeW1`7|almc^ZQu-1>;ZJonv@Nff`I!*;kPodc6Ocr(xz-*P= z4wKAwT@0G5=!*3_V+=F&6Q?a?Ww6#jEV(zdwB1W@DZ#4kns7hcDZ~5amS@Ep-ehCb zXeyECBMT$A3|#tIcAtf;eK_`-8@%EY@ypS?}^oBRqJ;_=^7W{ z=6w)Xc`-mk&&}r`?eT)0qM4nJWI$u_mf-X|B`=OxnvKz&AseaS@}YOuokCxZyqc+o zUEi{eU<6r!@h_!tZNfs4Gp%9=#B)D>c|Y=XCer@L$vzpypW0S3(Fu>gEMlRjWW%)$ z3X#B4(g5rbP1;(Bp}5kvHJWy$<4E2kx>H!8{C(G__ocy>u(}e#gdenh%eC8PLqS(L za03CUgnP1t>YQI@uW9XDdlaUU+omelJzUE+0+ay!=}}2#vT?TVBe{B44;&EJOXs=1_u2QfZ=W_np_$Q;8%W04YmhamF3f&a>#f`J^ zx^7D*pae?Sm0Jy;?*XGv4fzRQbj?!jCdpfX_}vCyaZ2?jl=@ys{;uK8nsIgtc5x3~ zo9Qw-JMiwB>8rDJ^v;KsUcl_7G_k#kmS>wM!?uv8cuuUZ(ogB$@(EpkHkK07P|Ncw z{j$WzRQKCS*v~o{oYsSig32(){{Uq`n!iil?fxhnh_-ObQyZh@#A~=tQ$960#<6{O zY;WIF=IDqvsrQCO(iD!x(hB+0ye2I=G$N(6GZAOmt^~{hV#9&lpL{Li`9XIYuX@y{?tXQv|Ky+gHxTjN@BR8hz=CnK&~xd2 zu4GX3b8fM)j{0A&W!Jlii~v?3xQs6&Y9v3PKvmncEpZrFL9L0e`?Y1;ib(E38T{J; z01xz$T&VwB862Ca=d0tourkU4G7v{{H$v63%Pc5VLJ?J;l_nn>LytseK4R5!1dhyz z(^Bcay3?q-RV#x|9LV8C)OXj>ZTIi;_d;m-NcJ;XJMU?Xh)z{YA3`l}-P!j1A$g|c z7GMGu)p&NT0-2#>0fKsAnYmcEY76DRJzrrq3vsa`jzomn4CP--8<(}WonOBhz9i=W z5Se(yI+&hH?~opqOYj*4u(yS_9ZJDsY-|SEmV!vNozg4mmd!*)w(sDgmso9Mg}afr zwv^&EE#tM;yO?Emt#{Rj_1D(k^eO3x?}X8Rj&;ZN63m zOn5}J9j^9wG`<1OkuLovH^W^1tyDdQV}pC;XQP)#C{5h;c)|_nUHNzoX-CU}$zQUL zSW$Q)JT!S8?Q4=rX0F;(Gy_WR${mQev8?SU%z=Evx46?n}HQSyWR?znNyCUt=>$72FZgLLk(c=Y&6;Q)qnJbp%9$_*(+e|b* zXz)Wis$TQNV%eB>^ImHmO7vruk5v61SjvSO(`K&(_i@_Z#O{uFQ|Cuums`oCuw3Od zz8TK54#e}Ae52l2P)tt^Fqf}ZyEH{X9SH+v!x~D6TyPv%#J5nc*!iR|Z9(;4?K{Mf zXXlpr$R)j3jHsMB;@I@gUcg%N1?DHp6R_FpQz@GU)Ys@*F#;QA(heUHPb5$|hI}M4 z8uRP69o1HMjsysd->jT}z zhTFMvm{mR%kHzKP%m=dbpBOn5uNalv5R1b5DcDxNt?{YO+tFB0T^F_l29wQqqGK6n zqM#ue`rVU5;lf)ULh=}&6%}|B3(jf9yD(nX}&ex)27pJ?eVyIF95o)cJfqpU=VCwL$;l->LuK_C3|8*E5yjTXOwr6D@q}ii6Gtbv z{HlI8AoCdju~`4C6#wW^oV5Dah$R4EsVxaqm`R}O+-EPZEF(um)jtuDIMz`HlPE#= zh*V-^X!Yj|0!`mW&3n!G z)Jq@^lmBhI0+BhtkL>zanN{ja90A(ckyE$BM*C`P3JFBZhrjE7j4gTH&T?Q|4%H{9 z)n`t!q&nBTvf+Lg*lcfaBYz{2kHoS0PC|3JvTdv*4}LaRhJwhkSVbIpaF!#GI95_B zi7dU>Ffi}e>{I5myEIAeT=E&oma?k)9||rz$0oDdp1>o=udD5w90I^G_8GDAm<_Yi zJN`Z1&-&E!T3XljtSvZFcv61RGPJe?R>l*Q;yN5dQr3p9B_eU8e7P~Fe&?ZqSZ@oC znwQQUqiBbG=t#QRCTD6C7`&q1v#}+FrL=h_rK}Gm&um}QyR5@AIm}}?7C0EK(Dq-+ z)p0x-+hdj9gSa7lHeW73>K0Uu!+z@-io5G(^}*m0rar3Y$RuLNWZq0<$%ok+aiBF> zow!`1FUN4{1t}YIe@P|?HFH5sD`_SW>oBXSxid9%$2yqJfW3zUyT2UL9qXT`a!l`b zUok5x4j$csTBD;hJUQu3ZC5Nd*@9Sfq{Yhii{@drEy)m%Z21$TsK=CD0S7nwi3r0( zY`S~4z2Ow6WVelV^-SX)RvLdbwPEER$6G#zGkONtpNFu8_9>hf=8r#4+-V(|ZFgS5 zw$xnGQJG)cWH<)4kBklHlwVB*4(@RznaB>0?r>$x0TY|hx*Mzu)&b8WH$AFbK-?Jo z+~P~+5%h{YG9UVq@G9wnM<(|O@XcR3Mx^U*9gY=-M#tbej-&0i ze{XSTFqW8H`xmH8zFX5XJ5CM`(D#qdOFNFUo{h{M)uM zy1D#RcGWiQK2Gb&z@to)HrzQ+=L{9^aFH9!9NzeGbgoGGWJa8P5U$7GXT*G}bFgV| zf&N3bhp1d7EPtr`$u>sY^Fcdr?24{p*~xKGNRW?YCRgaF{GLR+Vo|Am>?afJ*|{7Z zZHJNmE?R%Q8Rp&{Q?lz*5hka- z`MvLc7r>wSxBl$&`PuXN{N(XTW`5AAemO^7|7K?9QG0!V^P4{p#PicnIpV;Irp^-! z+?=0QqZSFSH;JVTKJ57}g2vRH#5uPR5(rO7i~ff*X?*MfAqXP)mB?OXp6uAvFp4rd z8mP{NOQ9b$wSQnv-d1&3epMV=-mo%rsmdG;(r}~R)o2P!iASHSDKV8W7TZ{(Hf)vZ zU~-6xc<6HrshZZ&S#E5bo%@#y$~IX2V;Mfx?}`F-pU zwwxt@JNGpZOB3r-6PvuCwf-f~G11YZW-_WOvctU&_FXOiMgj8yjh%&Rspm_{(a)!B zGt}PfT4`b?BnJWq4rKItYt=HwFZ5lF>Vgoc@790nY+f#93c6mb_S3Nk*(XPn(behI zVdaVKzrd>c^n#+GeWvgsbH>5hndc;2gcg_9fL}^48R)KCP>;aOC$ltSi!=h+5(kJ& zAei8_0rT+TBnNOYAo~XlsrprNE$D3 zQf=-mh`1`dHNWO`8torChjwih3$u3zvoKEKF2P0JW+hHXqUo6OtlB+d!U~%UD1aDgsVl&FWk<@p26IV zbvfB{y*gn=&zJdxsDox#0mLID{8$ehh?2unyep`Y%%USEM*h3A7c{h8HNws$SGLcPK?a{*O#KCQRG6XhhS18kx_+T`H%tjg5=(PM|&U}g}?T`4c62vs{4((U4VyPpzg zFz_LK^K-3bi6Cx3-541!&+$%Hl!3nD!nlK)4B!#1uSV^$hsiUjo(QrcWOE%4X%GDs zzW&g(E-b&5ocKZJU`(_Q#A;GrTke)e0j7cJ{03SHvVW?8NpI0ETFIeNYhmETDG7Sn zdC{JSclp%j>T2q{7@QpYx#GF^E2Xcr{7o23KxTbD`}9*FzWH-M_vxpfKA+D-9>)=P zJ2lkxl1E*gX&`Ej`qNK8`{iH$WdNUj_F0X5rQ$7YJhfM!mqC~1CWh}Pj7+LaCnPkd zNY5PQg~!HHgRwUeWM;A-lNe|1AYtq>gu1rPfkAnt3r929BNgoSP;>5HYrW{F#TqbNzUMXP{QGQr`)pE;uq(^StwZ< zgl6(%1)6WX$(gO=1eevJdoU%pVvpy@foGf^iUHmBSY(C_pR>k$mdbzb%v;$lnOfay zvWA-3CA}DL7Tr4H7Himm(F}QxtV`o9Rd`E5)SU9|-ze_xBb=?5W>M3n336uI{`pKv z2FBkrf02KU?wY$x2Ik0rv}T@?3Ma+n?1MsD!n2xxc6_x@qzmzcw5=WN9O%vbr_xwGyPeS|HZ;tkz{1YYX(~LtfncCHJ`I$4X+_ z#eHzKah|r__h;Ut^=nvHax3Prd8oP;DLI4&4SV%X`;n|#F(n$=3XvS^h_r2u$M~9Q zfi^iDSIrSJTR0{?h3yJ)v?PT*ILxmHt4&Akah>df<#c@_riSj0Bi?e2BeWBzraPIk%Q9T*D>lLiU-V9vroEVuTjxYOjYdHYshO z_tfZ;ad5)JEJx34UxqMy9{&pM-g0!O(f61T&X`}PXH&eBbpZx7up?qU9{HugJHHLw^8&nnUiUxa{DHt&Hg4GL)Fq;asC!G?R?Z&roIxX6?}>#hLdm&f^Qvr z{jKH}VW;<0<#Q%z_HI~eW1rkE|2kyzv&Y0?5n(bz9M8mx<9nZd2IOD()T|n)-B|d(=KV4WO2;JfF|!^ZD&>|2p{LplliHYh+-!7BqpH8Bn;W`%AyO+g(<) z4%B;06biI8Hzh8CMwB$>@hByU2ZaY9ZjzG3jr*tG0mr0@;~^*)mlA;oIU8DAzu4ng zYmI|%JRc6ZKxOT6hyeM(HL=0+(fkK!1b7w47Sr_^UeLxx#3O)(Fh0_WlU7FA9FLH! zm|d{#5lF!*M<$n&hgc?)HN&K6{sZ|8$}?rt zHpl}(wXtjk8ne}OHOS4&z^WjIh!q8EWvf*VxnZ%$C#0^ApghHWs^K#Zg^iuF3rucg zgc5Tlpt)j~c_ebhBjtp~*OFZc+-pCAbS`%m$F=7#n@5+%GpBzAd-2UrMsNyaRo%pg zab2{%RbCx6;7*%E0*~To5tfmh)s+p8eTvsqew|8Pc>EEX`>JoPk*)1JkYk4?lg;1B zsY~N8Q7e2#e5wNkDcP0EA6$AI?K`#Lr=r`&pVXcO<#))P0~~F)?T-M&$tmA4ZfXqA zHnw&}X0Bx%P8esnaSY`Dj69>|@3t2QpgkZ|hr;A&TqVD~{arE?-$}fWJ+K@zVl~|5;`N&6`c+qxi-%j9XJA zxV`HbGMLbuLt!laF}hdv7{9hywobMet*^yl17Tp{9K;pe^f>a5;iD20#OIe?)&J72 zQZ`Un{h%H484ah!2|tx8W+0kBS$_0T5~w{CCQh}@FUpxR%;uTT63@zQI8w@-Cn7D= z5r^E$AA6QyoiuIcMRd)!*!@?SJ)BUFD6$BHy=V zFh@2+Tw;9meG_0hT9tEpep^0RcE9uU*_o_dcjE7y1s&^{SWtHEa@*}8497}etY+s? zjWeiuxt`_**v8m>EfWv&$pg`S)lgm$v~%XGovU*oD0=S(?n$9GwmnpLzsk&5#id`` zyP^G8T;j~sZV4T~MhF&=p)RXre797F87y;t=&i4a2Ty4*-Yis!NMeA0QC#W|5)>Tvsl%#rPxqo{AKu21C39Ny`H0~HZjX0)9L zG=)>kUK8lO075q3da2~0e7x@0Y6A>#U3D5r`bf!V_%jhO8-{UjHeR3P)4s;aNvEvG zQ;^v9oZ{Td{u>i=WwZ|(kFnn^ADr3dN=UhOOKpceQ#K~NO0Qej;Q)s=5XiP4@qUwb zcTBQZ^-QKh!&wU1i8$~lJ49gQAbiM9{4$QnBQwZN;xiY%B7~pv@UgK3g1pLr-mT|1 z{4Y<)!5lb#V*6JAHVkRp9)4hR(c9n4l`DxoWHaba>)>!;`2SVUpskv}oUoCj+BE^G zyKFm0V6(7-zEik?;jv%Z<$PxIuM*RgQzb=Q+Ah5e_TtKY9h+>Ontks4MjQ<89xoaL zOP-wNqaC{4Zn01HVEY2p@56k*-NXQoVEt(SDW!f=}z_Z#;vdaoN=#Rju&*-x}> zgm~k!jf$syKD!Qz(W!YwtlD=*dSRV2E9um`-S*y7pz&w$jpa99ZTZ;vTC$v&oI&U; z{Lv7dxYI{kj^y?h9fK;qL%AZmuf(4n>vp^{eL>xV<7ke0*=NaVv9z0Q3VwnH}HxiORz zDu0U&-TXlqW;6pgM+~8#71hdR8njAD{Sc{wsSE z{@>ud<=$rJ2-Oo~lM|!2T!QWx;y-sR)}Ico#bE41<9VWG*l3iayHnnEbndt98zR4` zXW)Ge)venldz0@p4?oGrR(`AaEBj$lCFi(cOUG{di{!?41F`9-V@Jn*)yMHFF*%at zobF$Nhwt|!+sncn6euNy#h``EyocbX$X6oxhZ55w^Jdp?6{lK5&>3lN+WBegu)k}Ig!54 zHV}$Bs8O!wWR-HEQR*&V?d{Rkp7{eqPpCjZb;uEff?U@jTy8c7qVH<)?I>OgAv9}| z%#6-DR}#-bEQE%v8A(>RQDe`kI=dVIMVM-uMyXo~8e5FLi7|H4J8*06wFC~CNNJJP zMP}`cNT;Cg$|#x^$(e*K33mT1q}i~tTSou~?9hvXB-{G0t^?~Q8MI~gOqH}F4V0ag zktYdKtO%1{L;wpj&}DXFd@Zzp(HH75=AcuPHtBqj?7>mq)!*YcGl72CIgLpvWz(*r z|6z_zzk_^%3KrE?r&wVD?bp+GvyGguR7=Y26VBCio$>ewe%di%F?A`wjs}t?SL!;q zNXIB;!_dr9%ee)xl)VY-h-Z`dYPPa8-gd3}Ag3wBy|%Fw*LOT;hZy_2~KPpYkBsKPyaQbq`%?Y80p7gU{JWF3f2lJ}AajSMNS zwz5T=+4bl$0dmTmn8J=&OUAH8`pt}3YxfQ{*|_VjyNQXk-1hykUBhYymiA57xfDCp zbT7Xbg}!Pp$M5u?jRTn0ZTj6~N1J7|zF;;paY|)+?3Pv<54XCR2nlPI|7gje?8~y3 z`l1%S5ryb)vJA851mfZLPx)7zov)+)5qQKr|LDLyz?9g1s@rI>*a5tLxF1bAcfpyG zRpIMo34M9GSg&a|cayE!E?p@0F~=hg$M{#s{?pq*(d^9`>}v3__!xuC3J2{_*)!mV zS5?!(*w%~Zfy{lT{vIncPPWkqIP#?2kh2{?Zxax`a$oVNH0gO`sNoi#s*U6F#4Gw> z+f`wH$#iV&q}T?5&YA78DMz*e4i3apF3qo-4RpfOJ}x1sKcaLhgmrst96D|qK7{PS zy)u`qI453DL7BCDy7Q(Da+kgWG8F4pT_ylNj6+99V#ET z;+d{bZqv_rEX%<_&;8)>y$z?i&5r*vF_J%8 zkJ-92yE2<>+n_WgnOr(KwqLt#wbkq;lMivU6N_rb2y4LUnrY$cPh@Y8U0e1zJ`&0@#q`x&Kyb{=e>7%bcl zDai%%I55i-BSMDq7y&- zu-ND5acpO&JGR&t16Gc7WEv4ObEMb0exA-YH?&zMXP~_gYD-(x#8$Ij+4DI|$-NGW zO`0QY9m%6xUyiqkiKj4r?{?nr((IGvMQzW@D9)M2?x&8@jQA%cHymba9K8?4)YkID zg?Qp<=JP~{ZJ(E8%TC1?jbah+`JSD$+!#_gruaCRdBkRWI!Qjd?N;*ab+UO%m2=6d zV76fh!}>EiN1T1iy?&4(C;|AWjO~T7G=nIN5;g|%ib4^qb7tvFtXki$x~{Hze=82P5IZ^_xBurtJTR4+l$LWBKxfDZNH2wVl0cx8zu(| zu`{4u5~i<2$>hW=M*t!7DdL~}&Z66;9FM9Vf4c|oIr*%}$nMkaI6PJd;r0o&x__}* z`!W0P#GG9}=+qe||N7i|9NM!0p-7QuJW;L8TN~4qt8{IH=W<&gp*4%{Pqi-qY)NMK zh;ywk!K03Pt-98=_WQHvQ$xXAmmff`jl)oj5Edpa4bCb8K%Y$-CHloh1ss`w0^+aM zyTvIB4nNm3!yR%CLnJ`%#F@_qIeGCg=e$iIfLLMt5GD>to%uZHk|of*agLx5S6Qhm z&7(NFnSoG!GSr^zq`ZGGD@W%fS2>hnwdH`g2OODMpm|2D2Y}{rN#?0%wB()Rv>ZCp zvgZAnDrc)F`kd0@e%G9*4j?EVLdzfy4Q+<_MaCly>Nkk(I-fbD>lzUhACGbl%?eg~ zn-AGMNz|E#B`V`Jd&AK^aT=@q zGe1Xj-Febi0347iS&4UQ_Jg$ZMcW^H9I^Rt#c62{nA$Epc}ilV$4Q5oP{IIgBs6ng5yFuEuJda8tljomc7fQIK+7|n{|VS$25CG=EcLZpR>L3T&;D+Gd$C@i z96%0do!LJA#k%=-$4A-+S5#oBjIN&#=|wXi!{fqkle95y>l}{fXl`&84$%iwzT;fM z;ll?)Jit)G5;=UllF7rkwc1mlO4kfO&xYOjy%vKE-}XH|4F9#)K+iTUp6SZ_%`f#c z$$75znRf?GPj|eqcw}uaAL$rc>FD;n_9KWuAsR7cIF_xi#x(gLao{1_6Rz%iYG^MH z?&+{|r|WD|9SfFY!1!MxV-u8dh9i zw&kI=P`i5GZ9_4!dDKLy#Z@bICi5O=Gq7@G8;Qikm-%jSn0qDL;GtGsEglpkfAPAp z{I*rY_Le!?*J@9hiiv0pd<<{4&sT@A8heZ=xrf?YXTY*!sJ%a~wpZQs)p#=TWp!Nc zeKGu;AbXKH1R0Q9;$9!@iD$&Skx<>a&X>#*7Aq>-#yojwvE|;Vf(IPE(XJa zjJ1UMvUzo!D(_|6HTP(Gf#rD8Q6=}$`@)=a63dIWbEL-(SLX?p&o@?d4%5CI%7ugv z+ukCE8@*o%?UwSFUV?n)?k+XvQbvo}XzWt#oODL-c{eky}U0wh8A9JT-J zUF)q!t%r^viTYVLxzwnJoya2!AUEEl&MHg{s~~~LoX=dp>QBuR<1k{6XRJAs^Kkxy z&V7yIW{W=-JJ%YA26T*rQ8Rml*)q-=MCVvjm2-%r$Z(jbF_OfAPnwWDP=iJVO_zyuD3J^F?%i$p(dE&Q%a^@Jq@B|P%nO{M5h^>}4_Kfm%gZe-Q3Wo|x#B|q)G4>lW!Zj0;7eK}Q6)_-gpO!(A!XQ6t-BXq;L;%5J2 zOIv#nKhw3&#yo^+I|dehZfB$q(xLSgPd|A;@+ z`EbV|?LkwxoyR$sm{@R_&w30Bm!ZDf=OmwUhRt6bW9|9c^92*Tr~Wu&%a-#q53&4b z{Njj2D896PP9EORBe#5}_k&2~KlP=t`Ruw){FSUycEy~k`ufac%Ou2?mQCLDM><~( z=_NX6PRVv{_AvR0Y`*h7rV9JsPj0J|1K`lnAV3^=lK$56iSo6U^W?NGAGd)m51g3N zd4 zgFOhlC>t_DYH~Uey{4u<9%!DJR=OY-2l&fK52(%+y!Z?eiiXVeBr}4O9QNHR_dtPC zB_uUB+w1;&=#Y`xM( z)_)OL=YGsl9LT`Z91(QRp_T&!S^>bhLA6UmusS;}*-Xr;L&VrtgvuDmd{{;aJ^f*sG~UOU;2Q2lTMq)K`p(j z)6H>K>D|9YjCg)PZ*(cW>eve915cBQ~+O#=~R z&Oz}aOz%r=v~TbCHQhA%ZTV5lb+sp07*52B-Z=XdJC0>HE|{ZyKzUlnM0 z{zEv!_-IO?orJ!Ha5>aBv8bGaFvrhnpWzQi3IQm7@qH-AmSK-Pxx0DWzwajkuKtd~ zaDG_%fX69#UeR*yxMuNG_Q^g%^%Eyg7ItT2mzJZ4>>*P5#tENGTC6=kG5r#@OL?z4 zA66{{Y53`dtd`DI zt0fCkpU%2=5B1llPMwVk%yQ8_QBB;5qf6+zkxzoqGi5b>>e>;BBf`#q z10g%&2|W7zH-4o#EqQKZb4p_`zeaOo&MB<{|Hyj3&leSoX|g}cC!A02=cfr$)uNz0 zjUT1+-=NlI%h@$3nL}(kbc>|x^Lfr(!@B=9sb$Pq^;R16*OYsxdolGX+u)G3vfwjE zA_!Zo;W3)cns=$?DLV5Lea^Xk1*&KCT$7~Qx>kFG?TzLpMN6A<_H)7|=hF2sJr1#M zg6A_sfFDs`E$Ar^dq&a*+ea$R05V}U12A1x(uV|z823_&N-=4Fr94=1IN&J^AH0~GRgTp zCua&1rao!)VLffcC8O#S@yugw_BMK?-*Uin>~Q1h_46TbQcRbenO^u?vSed{l8wey zm3#eR=ijQw$#;`@lFp(>=$v--6n!6r(k%aKa&CWTToC>c`9LIOMsSEd#gcVOB<;3( zH{%691}}gSX<9(Ie=^ z)3fnboUlUN{?=Wz#G2dY=#4ENv9^i9XN!!*nM7{qc^WQtD{8RPd@}kZPEV64*rt@vL zL)O-!gT*^Ede7`Ml(92Tsm_s>A(TDi;3QLb5#28)y9nDiYAhtWKV^BKaB2L7BdqeT z@OXDf%Z%Dj?eM?Uzb8vM##)|%Wf@3Mu3Yo0uAAd?_j7Zz;f|Y=*GZCFKc(`AgGVG! zUUAO5qI01=69`O39i7`u-qM+*#T_AJRJ1sHn!2Z)HRk+cj=DSC{T#D{qffvjXNhBS z;;NB%^qjHhn#T2Y@OpL_HT7(6Lw&3GS^=J^OK6?*C)r;5<0ERJS98WxXYzKc%sw}pCvtM64&eFN3)}h6 z;saD5FqxFNVB0n8apFNW2d2h@I1HO; z{(O~Rb!*q6J?orOwH=`V?_8SZCB}ni7_wbuKSA3|oqHJvfLJl7)|O6BZA5Qz(dRSU z8I>5m$F9env(#-F8HQ43@IB)Qk&m=;_7~`P3(nFwc;c2&=Uf_*Fb+(h+FMIGHqH#1 z=L7MbI0KL=U)#9-;!^>`HL^2o6V7ukyUo$*aF%+C5Lyge>jcEzk}hKES>@Abw=K5?_aR6w zw&p#@UskdcHTJXPPlh;+DNfYP8jOC83rF9HT`%3OiSeDnmTr3pGtu^-`BLY>_V4g- z6;9TKJ$ce)-Ll(`U!2s}S>g-g-O1h>Goc|~$%pBBs4b=Y=16z_C-wo$Y^GzDIte)Q zS8K(`A|a)Dn`Vd1S|`5eoXsnp(tfl*NJPg|$)tIzg{x+VOv|`;0Jn;9eq-B4ZLXMx zz4ZO?I#buKuaN`n?DWF=I{#LPIeyo}Cm^;kscL?2;d2~-ovYlKeB$^)z7xq%(0e^F zHt6hh$Fb%iV{apUzdV|=D$*VEC=C~}4x##cT!8W%VWXXg-1{{&SJU#4i4lX(ItRN` zVBvXKj)9Y$!}7f-oYHr*b0_m_$~=30S+^yzc)q>zA9Sv_BtORl#hvEphGAC+EZ zMe&$E3;mAYQ!b(0UiL6P;{J}yo({R!XYhZ;S%%u@pY|WJhu$N`e%GD_?Jq>%#+l7l zPx)1HPXvaSM@)?C{(`V#`bTBA?NioXXg@657iRYNvAEp0+GX;-zO^8KPsM6tTH8{mhaEednOgM?T{q`ZH}_h-=mhY5YK|c@5s3pEm!rBgVduY9k3YlK$KyGiv_4le zLHFoobqN{2aYA?|YL!!?E=UZ20O_2QKoncHMsCE(IhvD65I`qm#?z=!O(BuXRP{Od zQQ*Xx6z7)arMA~N7yv}%(eeqazj%@XU|IR%Bn04mb*2#4s?a*kSRFr9JszTvzPl}W>i>@s8JF&lW%W}x4uBWUpj>l4Yg1SFrfACqS} zP)N?z>BmtV56(!m?RC2vWO_u(xNX#LUCq&QnFP$9lYA1k#btsgl%$CVQuBDlUt%Xt zJQm5JJWcv7zaY0TOz&u}BY@(O2Ccw&-Qv=O?2z#m;?HpHfC5nJ-S!23A&fUDpLKt! z??&@s%$6d!_kq5#$@A#@2d%m7jX|O)ZV4>$xO2k;;tI1~F>+0Pr>&f+l+4upLR zWcRxt?dN z3 zDo+q+uSWH>p9r9NqH2rS<$728a$W1YUB1VcmU&|i=Y4>VQ?j3l5nK6lE^);O#qNnC zhwM4?wEse8*V*=tnK~Tg2AluNk6>}fG7sm9_r52sFWH-&iS3-#jte0j@%|AOe?#`x zXL@rGg!coQSjd!L$oCu12PfO_Xx_(RHh+o*w7tPw+d~1G8?4r!xsH_|JDzNEV3~{q zZEum2=d|zFw|ajB`Q6|EaU)G`?JtF_d9Xgr_YA8;U5LTSi@)hR;bGiyXZ~WF8OBh00DG zOId~NzCfD36w~$c{)%NRV2Mc0(~B-*?@830I*XT z&|2!U5Q?3%5vBLw_f>~-t%S)bl~A;;btbClI)a<2qNOeH{7?O7kkNaYaGit9UVr~?pc zBV@OdiL_5GZaZOUrmF0Dsmax=V|FLMQ)w5RIe|t>)HHI8Q^4@V^^$fzWNM_pqT-w< z*_CElBi*V)nX7zp!)Eh638W-g6-e|-g%*f&8XX^6kEviqDaPoF&reK5K5VyRiv^9D)c{TMjl?L! zwfSAWo_3z|P(|(aQG{-{1)^<6)pc+qbO>|Oj3ipNZhIs_%1S&hf`uOU z$C$zJY}2B!C~!ra)|d1i8}7|yjKm1gpD(8hE9V(=GL39D*77^Ycg>Ua$tRL0=Zw4j zM26PKrJYOf^_TC*rUq!mhNnYDZMKyYq+TU{T^9;wA7 zHk;0-=ADbk<&G8ymB!G_T zXkCLJh|y`aiw@V$n-(k0W`ce(NXu%YRs;;f5PJ>B((=;MP1TtL2PJXNL7OFqnx?&$ z?7On+`n`2vvcD{wktJH#Vh)puN_}=4X4ro);p{zJSVI+3KBdn}ZdFd(p2@AHu}?^S9^?REGYOc z(N)ZC9J};uXswJ3>L;~^tRFG>FOO(hwT(bHAYW!f^ z39E_XeU)0n*3%oiQg1F{a1x{*+9V9YiO7rzi6h= zR!_Gp#MX+qw(A)5Xckbv1?jHw0sSwRkPW+xR;?VLETBVAZuhEyeOp zJAZg0pyqsBgMEkAD+KQS9ZshZ4=1zlANDQEt>&Yw&h`Ax+dMN@5BE((b1!qZjo9B( z%^@#Koekc17z>1fou*j%cJ}*@@Q0qswa4*2*3dqQFzM&pbLp-7tn7`mh0=bSN8?U1 zm^j|UjqO>&Sgyz%@9XHJoP@X+ex|y*wwB>ESAX-+D{kaPM?!v=XW2vXF8u$}7HTPBpvj?!}%3S#;a*!Sm8cW|h5^)^pUo5HtD?}(v{iy(wc2(uXg~5?v2m#|zq4Y+h}q8~#z!t$O`I$_ z8Wk7t%;OQ~EY}bwWi3SS-c!l?LDs|CTU3bTs6Kl}Y$wBqX%iMbdzS&v6GjeO)JPm4 z58rgk-b%1%VYzyiolHN=a~t<%%vZ$!XU|JtiH-~DwdxoI^|`j%PPcy0b=zH~hbkJ& z5Ys2tt+K3{qprptN3Zp$o3jXW(W-ESCb460)5Ug)% zdN9aK!N{b_Z(c_hziZ=Y={(gspDjR>#*0y&+%>!?Uf@3=_2|7bwG;0oKJ|~RpbBUGRcO8C!3wSZAU^} zj^XY){~X&{rhazl#t#oWyLF|8k(=u)+tc&Y#_Aj+)PZat6*o+B(2O73l8;zwi*b6p z%M+gzOLw(YUW-R4KXheputtle~8TxiCe`qHe? z!_N-QK1Ut$WhBqbHJj`aXv{3_hOy+@Md&$wYu|TcY`+Fmi{o5#=E5%4CA1%eY#xIZ zY-8`iG4(X;Ei58u6`C1eO35&QEUp_jnzHhr;$%cGW&hRHIEQ zrmH`py)Am5f~9(f^9Gj&EPCrp$5@Xq7JtXyEG~mKu;y&%+Pefm&GtE#D)w!7-gp&g zu47g{1IDJEdujWy>~W;`O=!%FJ-#b0GcJrR8Rm4|dY=pAwY~D4iQRl=_>=LN{X0vPYLBMjturuw&@s^FTj}ck1 zV{)p3E9Ud@AZCU<)At0SY>~#TWv;&KZi{Q<*IPbZt7i6`p*iHC4lyxP*h0Q9v5{?T zKUE%^F?nx1rY;+vD8480!En|5A}#+^&sueO(EhbhkZqiPhstNp@Ceg;>VzRqn0DMr z&xf~owCyc5dqY$_wft?#=2QI+^~UCR*7#dIR*h!p{Acso=`*fi99h-xi_rPc2jth& zM;P22%vrQo=B~q6?>?s28q&O=NaAx;n@;poACK^r(9| zcz3Fs9WXZ|f@eDeAzoHQ&Y7rL4p5Cvq@4-IuwBC*p+y);Zga4AYaB)6Y7X}=^=`f1 z>*;~!$Q^aR`4WD9uQ(5p$kpfHmVq$toj9WCF^0Np=hSh9OLKG+*<7Hga!MiGn=Uv; zvT=irmtwri<_`cGO(js*s0py~=#1|)zfmJ1dKWx1P!7=@1djhhasi0>8<%*v6ZVYp zu6aKbk$rw+jUm-YugS0ySDg)u`aPR;l!@^9RAPVPhiA#Q+-#CY+Z}X?MJi6+*g)4` z)}wNmz+cbNl~I!C18_u*-laqW08VFm%hKa=t{}@9d#e#^2+YOdPxC3soWAgojR6}6 z%=k;jy~$2OQ1VGmECe~slx>&q`wKXiPc^I2R+F3Ld|>QcHq)!u4({b!gZSfLW>;~H z)u=6zC=PRAbjN_w`vT<7DGKAy@4PIuU7`5Nw3M;=&{?&KomcM+P1#Rob0cZP2NRfs zqp$4h92~?Oj(w`0kaW!-$>#ykyg2DJcxLA85x|r;g%yoa2%Y^X`=rf_V_CkuVeHX1 zJf~?p_X);rOZi%tLmTrmy_ef+bE{BwtNgcyaj2qzGu%%P9Km=xxH0=v znC@CH)%J?-%1Fj$8r!4ee%)vJl205=elVQ*6LuXZd#3TRoIp&BV~w8OQ8N7w=N2$d z>2Td;lVSP5sl6Q|CcbD8@3eQr)Dtroa6vbc0ThU-XeMSJ6msOhKFI4 z$7^U01prE$CQsPgm5A||180oQo)6?Edo|bHvD;!_3V-+!#Rz?OY<0&g#=AWR30tt) zVbwQr$WPPa_<`ye_7^6ecI-~c$6`%_gC3nT2ezC?xddauOmm4}UFm_zeB;I&x3(oK z{OQgk^xdgjZn>Z3FvBrE3_taZe8DjP`%oC)Gh-a!(Kb-A~3mkk# z@sMHPt;_cZ@qIB|zv=cvdzhRb%xSlrAL%;UG2deM^iB5iiA%i)hji4~-j*ld2cr4> zC>%(hBOO~mNP}d;7SF+`-@QMQQ_m}QRYzNWu9Ppx#h!=bz}Ri!b97rKXPEw)c41O{ zq^VZ@lXW<>pG64sq5N&ylB~1GzQm5tor`K;fQiLbxd*HdRefmdSIfhYZJxS$voje0 zZD5=B&> ziZS5y1&=a>Mxpc}W<4CeYS;!R8WS1@5x~`Vp?5;H&7&C<3*FVN!6oraHKtW^Royfg z#&!Ih9vkuT-2~f}8VsrtuVg#W%O|RhsWuKN6o|lfUSb0JN-I#YMM&S13Lz~gjg}rG zEg_^R5@f~U`Q~t>6(-?wEW?D_sV|{Kh`_0pq1Y!Wd z`8gqehRiQfJPPE}T&Q#zV;70&Oat+??!F-{tf) zs0MikWmjRg@itF*OVJEIn@vKxt|iv>d8H82WBunty%f|Ap!x6{*LTkU!=frmTa-4(t z+VJO@zbW!ISFm)P$(MPS-{SrnwJtSi?zAAYE3+THOymqpKy^e1AKvV6+pz-jk?7nn zCWwRU<@s)x6rpqMJ>LV*q1|^wK>N{B-06k^c7MwcJA0;_+kPOu(?(0SL18F<(Vnw0 zwzbf4q`s^4&hh~og5hcs&kNty;C{um!QqK7GRW~6#<=N-p7Fm2@yG9?aa;L7==a2h z-k?W%49Q;t33xrby`>kAYpO(ye+A@U9d|-?8xwNeUg{}Te_<=%^5>8rSuR~U>sC+M zMp<@=GeZ1w59H#*-o3vYbmKGG{>Kb2qgpq>Vzfn0J>#qq9lc3qSu6zWeu z&hqDFaRkD{)^DWwouEVg3*#YA{)rrXP<<}`6?wg{+4{1R>;zocGJd-C7ii}luPGtQ zjQAY11ln`gu~9&&vs75YE7PW&d(blaUtD)4i@CNrYU}yeFF)TH;%0>i;=e z+PR3ywGM~oDns4KK95c=-1R}TZj#@v()h3OotO$NJL8(|)dcuO!nB>1)tYC*&PxpA z6?2Br_>jyuf=TeSdWnaVF?z3b?FsJqH_wc$bl!5aE4k?JNHM;;C#^4@xqowCOd++G zyf{!7aftD9I&VLhw0NV^JX;aGpEBaeYl{r>#Y&*dZDcd_XjTE7QgGaQ_@|3po zWB$c%SCf>f)#2wZuFd<7=9I3nAIM*N@6eFtY;3)L3+A~lH=R3LC5KtX`0o-U?ihPx z7xd8KXpzmC3|TTq4^=m3Esnp?9wKVuqt10#JzEadu6k0n8n);84A|0RigWAsW-A>w zd-n54o#7U9cJcOBgtrm7c^~&#@cJ)I+lgbf_-o`gnZ-#yOP1MoSb@{LgLu+4?DL1& zuC(u-YjyMxLX|J(_GU}!=H_lictqPL@WBPb3CE z<6V!sT(RU`0Dos&lYpI`qOZyjJF(vbE zX?m0~)^tSe@M4@;moVeP;J_w5^YO_Cj-cE$>^O2>v%|uiJbWZpG@cL>9*jq4dzkM= znoTOf9~|ByjzzHuopo$-^YTL|wDExrRanD*-lgq!D4R*QkR36i#~_!XhcJ*Sz7XS( zXHUE{Zg69Ah^y~R*B(ST<#p$5s*zmwPGNz+!(TfI~6M;->7-JT%+C4lUdr z+v_-jvaU8)|W7*oa8-=py z$C3b6zN5B;e^+tvXgqX$mfjEf6#E6s_pvf0k@c#*q53$gb4X+2zT2~9 zl^q54NMW937FF>*Z|$Vx;1l_v$4#ExlJvgS#F4h5#>0SFJN@MV*Ms!^BckI%^-9{7 zrf0#dxV@?Ck5h*B9CzUr+ah2MB&&D*N&f+Wlc-N~+})oqfaiEpFmwQX{l14&eJOpT{SfTG#4lW!;7GpbjB$jQRj%#pv6ysI9fG&9EXC) zc6Ml)M(Dl_x5_WhkN8M6FjVSYfb%fLe@3wFJxP>yo@#TqD*Xh+S=xDDONGvvZ*p;& zo$19m=f(A1Yvj-QwUx-)L3g+=Fm84>XI^y%cuq3Z-pIfstIpZ71bofGPXNkvRoLZyzu)Pe7SJQKzsrDIH4dmK24~o9i z@~`TzXM!~qA2R!#PdMhpZYL?;@`bm*?X3{PsMeSKSAIHYlSZc)l4mwl(#BHfjT=5x zo$X9Z`WGi#>+IaJRq_Vc8vCJsLAz?3g!yJf^V6<2DNg=|nbk&+;L`RN`PhUc7!7`%F%u%heFG=FTVxrGNi;Y?9Y*SYcEAk1w1 zOgodD)7C2;6P)i_yjBG5nLXdZXT_Js_Qsqkr&7>|@42vonA03}6o!aHPMqic+E+pt zIJUI1V!_C#RyJ|Zf{KH|=>~|W8uGy-8|O>r9kY`E>zqdN=Y_3sy};|xGC#EbqVYc} z20<}87QoKFh8BvW*uJbSzlcAfxHkSJtgjeNAFO2^i;K6-u81KWm${EXW8)DWXM1k~ z1RnB*@~POcg0Z#pjrKL!MgePJFuZaJ^>MnrKrZ=FJ#%DWb_H9Y56;Hzr%PUNe=7X!xlqR>9dDHU!Wnj3p%S|zne#n`!wJiQJ zhfJP%-q>#VsilLO9rnCbexaC^>@d+erT3BveXV_!t0S5Vy7_oK)s;Tqx3+o7BnFEyM|$i@`P}I>35Y2RhhvUHojx|fY~rObfNxQ-B*5v$%Q)Z zU~yi|zbldEHDzGQp9LJPlN?)B~ef}QQ?M-#xTr{@zjDg$uD1~raS zqc>H`taon?WEcm#%FF@70}OU`7(CmEoeR-lh~eP`yB5voY!1)Hmry-noVo^ zC$h3zc7k((H=mCp2T)!boa@Z7nP=MOhcg-5nR~`-iY}A3 z#QsOhHkd3Q-9aXI1wctbPRd^#gKXbvIRN4`mOM8On9h4do$;;$j((RiNu>E>m4n_x zVdEq>-wDo5sBkjR-y&eZF_rJWti4cu-YhGqL15 z^cF0hufD~OKp4(!JU8QP&;ARe-^#FtKb-CRJH}!qjLSOOmaVou(B~=^h(lO@y~UR_ zp6B3|WN2|SlTQrCGI2P^&p3@HXX3MZEl>0PMEhe{Ig$C?^e7*(vy_W}X#9ME>Fj-Q z;x0~onopaFrD&h~-VK~rlI@%qE)@1s=EF6`F}k*x(m5n7pGlLOa8-4yym7;{>Q(gF#Sy`Mh?Mil zwk z*LF@|$;R!--19)K^J@L7y@P4Z(}v>CV4do=?GJ(j%>M&8vSZoWa{Gw|^pLG?B@@mr zW}jJY@uG8;&W(*vuKJAbh+^soZ9bmB!}b&~T?|HHa_Nq1*?8WuDaMv6U*$6!-loSO zLv+JfKkMG&LhJpK%Q2=Gep)|B`)x_iR%UcehX(5sj7OAPcwyxX-DGH z^vjx-k}UMR$p>58=N`vOLhX_Q=ersirEpk2M`@?xB^@>*N|mv)&#CL&l!+9Vj!4c5 z9aF^sdDq!(gywusvZ}^#bSE`pEA>HbF_UO{_L4y7V8j4sz|KCcI&*brH(U3!XUJfU zWle(_8vi77b=kJ1m0j@p)HrB_#^xkm%vrm%$y9JPJJjf+M#^PBffVm3#iwc+P*hdV zdfCaj_dgHaIoDCHEYx# z2l|}St^)=uy2+81R2h<(e8OtLd!>D|j}5gTMRVqD#*w9qXrDqvZ`}~)BW_tGQf7XY zY{_WLi#dkdx-eOpjta7^{1qmxwtvIYL_Rozui1kI%_t>rRuev$mGU;+UM1;u)!e5uC+trk#tXJ4RQOU4qQ-O3Eri;z54O@0DegCyF zWJfDv1)*Tc3KJo{2eMA7sJaI__v^gE>?RFoI!B!Zpd~r~p}H}Fru@;X92&SpP_}yh$<<4ixUSX{DMr#$YB;F*oJjmOp5}l0u$`o^Fkl^0-^}>Hf%} zAlAQ23~61v9a1cco6<$fYO?z~v@yva^c`>kJlJ>8Cz+q*MPEJVsyf5)>OO`V+Mx4k z$JmyJ;Jwk+?pB%%%)4Df12@UqII2Fy) z;P`YcF?$4_WUb`bX_?l1rH06i17M?itlOMcH?f-U)-ptpo#m%5o>;rjq}xaHuL5FU zj0Dy&mqNLTSO)>sA#^$@7mkJTt`}Qge`xN6OX=o4JSI7>_*jd`_3^8D`Hp%smU z4`bHVSY%5hny(^Vo2Iy%pL0PU{*@SQmM)yz4Bq!Tn>@*z>MxcBLag|)bI>NEd08jE zN^-~{#|yR-tyPYOJuLN!wombOXLQgzFs0?leAdx7)P+gRJh5zVz8+SBh8Sg~JO5{R zMd@ z`(5#fVxFmxX)LTD-+pvgR=viHhbbh>X;!wn(Bm(=WTNe`&IBHI*7&%zX);e}*kE{B z(vsK zXOq?38H^2UFSU%ZmT*7ft_PubVXbKSA0{P)F@fb%&C(}Y(xW5neCEbIp@hlPGLTbb zA6tsS-j@8n8wKMa=f!7M>1&d!&q8u z8KWVXYNANt*_|Y5ak(sQb`;#Tx#g4TarT_uL2UW?F2b1VZl8@~xyd2ie@}6I*D|*H zM;?P?(NS2^3n2`5a9Fok6yu>gE-6wgw|wR?R;~C5vl${o4C*@PS(a01uWU`Zu4`w{ z4=JCgVn^ZR)VX#sn0NEW2BIaO7PadXxZI?%X{vL6WfYSUrR#cn6Vvagny2+U#%mPa z&>8Zr-Bu=SSkx^2EjP9(HW^D;e(O1*XWHIU>1+HwkWUmLuVb#us`LET(ZPr_gOqKt zvMy3~ETb^=W2V}C{>VqyfA%Tx?@s<1Rx7LL5sBwy`;#Y^{FRjra*ke*3dM7hbWb^Z zH@SXnJnDMxv{-yzC@Y%tEy=1(^2fwIgK-OU&YC00icf_H`K6CQMiw85hIMdcQQQfR z9{8Eb%`HL9j0QN}R_EX`@mzdNrMNA%cK;Cq%Mib%vfoN{682kA5YcCN z4qrFPlZ*zDto!_485_^^7C#3y4uYN*47EMfb{JPAn&*tud9bx@DrAP_G}cJn+z*%M zP5I7$YhK@Qb+{Er!rsNHy~A5TP_``}@!<=kjPI1ic`N>KJzuur-03xTg=v@cTk;e? z8U3vWBMd(fF}%U;MaVvD9|4VgYP_!bNa=j4Y0JvQ z(k4&#UC7SOe>KW1o}1dp*&^+mFm{{NZiE2fOvVP~ik+ zsg2cBhm$RJyCC^gnC#4_o-5wqY8y_F=V|=&-fu$t9rXSJnJ90ceGpPu*VvNsofp6(G7Y4yX)v0h>HKHmQxS$2oU2#Fwr(7>DMKqWx%aTXqgkWzU(hp}I}m(f-oD`S5)) zqU*1H2bwF$@2V47Q@zYG3cD&+cD|ul3B{)7RP($2o2!6&jg_z~rp$%yd}$1)S{OnO z_R-}y4rke0`)S9=!Fgg@9geXae~Q-!#dO-#%5Gzw^-4?#=MQrc`!c(N#RAV0`gw~N zVez7>AQ@>W+~c_EPVorQc>>GwxXf6rPF2}qb9Bd#3QN}s-?IHh{#9p&2Qd4;lr1zL zQs0t-IXuO>Jv+xZ+bTM~b5D@QQtdUN;aP>$`0O z2<3hecE6Wg2C_Nup_to!4asxz#?A>#-g>S+rEYQMW6BRx`z%Bd$2uN)>>JE)Tzx=8 z8hg%+(dh|`CccN|e#_*uI`881YxU9{%RP2or0toK>T@k@=Sy3x@jYuS@1oDhXT8r- zhp|n6O=n*}te;}>YudPD^4iaKW}*+^ZrrA+upD?F6FsDX%;A zp~gO!`SRqGRsBcHK{;^6qwZVylrvDB<;UaUfBMA#!zQR#=4XDVJQ@-CJZeb?X07>A zl~9M#nM{3FFaV7e#5_}r3-&Wkp`?gsOIFJF*v^d{UZt=5UmF*~=8JYNS=Zms+zaEl zE;7cN%Y@-$BkDEreiPU^06GIO0iAc9)t+YwXgFN~q&P50kTT>mI`f(J)D)|8UtK;MC*mc4>sLm(eSIG@PoxcjT9do`Y?H|du z)25mqo}(9ZH>Q5CXWQy_rnHw?e70(>>D_ox7#SX8pVXIrcR93;4t%yJ!Y2RCNBBF- zud|oi+SZ3BF1_)tyFU5I-FL?3k@~L5yyQS}J#IMd1(?SHLW+_)`|V{WLa-~F$N21- z2Ppm89uRAIkL?!$9L{y$`LS`qrQE-3Cp;ELK@K!$Y^I&@n|Jo?@vd)Lo%SC z_0_!VOrJv@S*f0o+`JB5=jb{o?_)5Zcu4O@?NIHwR|(w6Ep%>ng-o6~Z2T)k+eS*)VSF|k^lDsETO5lTdrug} zp0wS!n48AktvGdq=f({dm$Gzs?0ZsZtVw>&chz>pF=xY0?B02pv-d}A@oPAfj%kA} zVZYn92fMsJgUQZOZ%%k@T)Pvmeq!I8OPsWgpqh?}--ME)j6?Pfs zvh(5F{vC%EbGa`ACYRXoUzp$WY3$w3LT}$OAH>89#&iV$+D{yL)PC2*%wuBWoF}~T zt6l3gc%xV>E1|Ddd!zk&bPB!e@m(lWQ7zM-2?S-UVG_4(LuAfk3)A)(N?nUPosO}b zw`Z9ttSi)KJ|N6wjVJxpg;quABkN z59t?-aq@-nS?F7BW2jt+dUr1CVR`A6dt-mT^{ZSrGW=chP2bzX{3|2z1V>LSUdO~T z;v2a3x%ah+=>1AAam}#8vB=_x?`?G1=g93Dkk3vmn4BLm=SxTLZ=$$!2xHr#=XXwA zPV@c7rGt%BE@wJ*Tg^?Uv}fU=$G(=h<<&XoHg`Pg{J-1VF%CWa$4k8Q0|)nQnON^Q zARwu8*BSR`uPfVgr@OqjvC{le*yVP6$IVtQt`2g~PIt5drUxCq*Y|micgWU~{sRsE zG~+65tv`UMwR>oRal9Y^@#Q!+(Asm3S-*xpm$+uPIP)5TLvw@ZP6TSyfx={uK>t!A zRVU-*)G&||t9lxN%lUXz64ybr(UGCVfzg~XLMn{w1>}dFxYtUAO3Dc%5n6agkm46> zgsgQ|AJ-Xc9Z{guP#FldN))jAMCja0DOIv9rETA!Oj9_&bCNfC%BnczuI6%39tfU8 zTdmZPakVRZSV$ylj9wVPT9YDu5`@T0srDkIQ^}QyP(XYuO%i0=>Sm)Q2M+#1BY4>D zs!tS$?1BHS#Wo;-WVB5J1p^d814P?@jV>3CEPWKM7fB#M91nhd>O;}id3{_WxFD-3 z7nKYlpoz#C@YQ|F8D`J&m$38U$Gyu3sjn6*+P@-YV;nmKB)4^`+t`%64CbfZAdS8> z7|O0PGh@}csnuUy{3!ib6D|C<^sceh@r6wBuk<{Xnt?v2Q9jZ$5VgU&Mv(z%t@MiV zy9N;118oxe^nBO&-p~>tCLHMDKtXWTGuor2>)r3*{>9WYgdQqGAW-uw?boi;ApX#; zVzgF4dKipC^uf0-zu>6PQ?(k_Crh1;G2H~==gtr8a^(NaBFRrG{|P!yMAWLTHGV-C zTl+cZhO6|Ks8u# zlM16d2hx2#+kz&J^Yi8JB^oM(`hx64a;6Og+-6jdF7i;U0Yh_THe5l844u24NbYa4 z$5YwdW{1J`l8v8^|4^K=umTPQ==|;IREKTM&O;*GN)guHrN1Q0F>_YUPPp9=tt6|1 zm*lFxQtG^Gr8Mq$^rreQWQWnM7#mnoD+=2vXF|QKiXp4>2X+`~lNvM}FoA4%YZvGm zvWL>H48HBQ6Py5-pVsV_)xTxVMAY)tpsgzZVSGW!Fh_<2$*lIe-Li)qiX%DkT`|t^ zyvMIHI&{=5an*;bVhnQ(6T0ad7o?zSJ+JDoFL(SMBayvn(U0OL?RExa9S^+@%<&Qt z@sOQ#ngU8y9gtW`_aQwl1wg>+DdRF6PE3Lc%~-Myop*7hQEe#)q*#;TgZWjNh~Xsr z7b*F7F4s7q7~OT7ILJJKeF?WJ`uwL0S2o{A3Q1X$}y3n_7M$1uLc8;N-fT3;}{KIb%s zbj`$;ct{Uaee9fY{c9z}acbjm!iRUH*6nqx)p%?dT0WE~lcm;Cw2t~)tWTda*$6Gk zOU@e;I}j|h#?@jtBndSChu&2BWspw)u4K~ZPN!;8{F#<;xWpjFDRVdT_Z%Lt{yNNR z4muvg!`aSNKBm3SSuKR~6VAoBo^(m`4_rFc&m65^EqBf-pFWk+h1r3e!!!Gvo!y7RowsYEv^fjU?8^{f3q!*P#n=B9Np|@-%?XcfR!uowc zHSD%*C$wu?PhUS`o^L7jNx~RhQoEF&r0s*?a?U5Trv`0fVnMWh%F9?2F7P}yO_km| zHj!r-rVGXw*t0NDBDsj&fiko*+eZU}>-mOm5*X3IY`;^N+_Q#^DZ-2a8#_zd?=*@+V3jO_DH z-D|3}=C@CV(BnV*-Yy+AXqjTDPJ9W=!4ww`P`^Zs;rW{!;)E)F&bFae=USF;#K>7& zvW-8|`wZWji{4%XY2V_=l;3*nIKtdg^=ylBZSI-aaCgP54n^C+sL}^xN{xG@B)O)X zLmkDez0Yk2obbG*bHY>P5~6Bf9^!oa_(UIRKZNb$amqKM$HP1ik(`B`A^FTc6o%*R zO|%@Hs2S~>6a6hem)>bh&GYA=bL4SEA$)W1C;#bqYI%a=?X2!;n=~Jp=T*<+=zMa^ z8(R+jT`!@tQ;&V@BRsgHN~)fx=oTBQR9p}$x_lzb_d^jO&8Iq!bXG9wfcRsx5z157=4oVmaY;0-}2Rv$z z+$LAFoZ0ge=3om^@y=|l$B!!>breSBS~^dAk0#OfhEVqym#c4f$9eYp_8DzphKQ@1 zois>f;L$vd<|zT>2o<0=_alc}#r5}3ITd*_#R*`X3SZeSL#sOO(7pMl8#fRbC ziVe8Q(aFP8M%U~3v7*jxv+_%PV0|)m<{@V)#g7HZddonFi-iRlp!fih;BYm^i(;jC zYvL8-0EXvA4hHJ1QJ_X+ns>pju=5RePF)T91mi3?&dj>S+BryBvzkf=hQlUVIp?Rs z=FZbFj&Y*7UL^;ee_N>~sIUi7BC`3z&DRRSW%H=fyeUW*Xh_v>7}p4ztq^yFZC9OH zeogt6-5CFhJYjbKQiC!aj$;|a;aS54!fEwg(#ai1n8@{G?bz5 zBhb9omP6Zyo(WE$N$;%l@Di7JQ{7oDd1NZBUc2p?jnS?`->UsHL-ybPSbn!cDbjR| zL+>_Mv%3zm=i--UaR@mgtMi$I^*q3l_~9d!J>?l^*cOoaLt84FLDwM`#4jx?vUWWS zeb&ZtTGX}pne^G1vy{7ySje)6G%la)f6l*EogqIGYHvKxv@@CIve-^C0 zr{B=PeRK0hzlw=LkJF&(!(y&d+m!#d?|1sIar)Hk*urCQ10kL*Q&d_#ng>`isq{(v zEHLWSFi(~9z~F|(RuWaTcZpWqh)24FT`lM07?%yhu*G&Pd@7``_Fq4@cI+9Voh~249_vV)Aqa6xzj6Uc5K(tT+Mm6bAa8( zR@?mKAvMmiofRLan9lZYc>)JO7SMLPfY}FuIS<1TR-b!3dL%ZEFR=W|J=Q@{8P|RC zAGX)xpzXO3F(WE=ZoKc0&@`Ed~WU$CZPn z?QJo8SSU}R_?z#ViN{*!_6k3hUv+&vm#Z>6R?^;Pj{~5_sUAgaq-+fXJ60|Ts|~}^ zI8*fu?dv4m82R{qJ)LJ72RM{Raj}l!6@0HE^RM#9HTmMmQ0=mPe>yMf`-8pO%RqK$ zF+w^2HFn6yJJ%iCCKjCTcfUY>`e6GMBdQ(iw2u$^nTK=rH`#VSQ#tv}n1|#}-*giVDEpXbI?Dnc|_N-gv zy8K8S#&f_bJ_As{*(r; z-=13-INK*mlV;nhe^7o)XXWK)KgN@Zh{HxAYkalZHNG}0N%XC;!|4DT582MD9gbyU z=bWeBjs7j0F6_}WyIn>9#@J8!%g%K?tS#ckWSzSxixUrdMiAxUG=M|rRVGuPe4?^P z!<>;%=J*{F=^TFJ;S8TVv(I5}T%r$RaH-_5x4l;U58`IbZW4AzV%faOTpff%E&;dg z1lAGc>jJDN?JC8eEZ!Pr-keqGPWCXk(a2l!F&`gIpgGCAFTnU(W&gBE`);4nTDH_2 zdq{4;V62y)yHBxhHL7gS@a$Yr{yCj2+y*!e>5A8Jx=vm#KJDKN!dWh#Kt#tY)a~pI?8R&2;Yxm^qaGH z1Ed$WanY|cGnaOKpkG*fkHIwZ;j4`%D`eovBf`%_^|niHW^azwg+C7v8+RY+aw0Py zH9vTk)t2XI4+8p>aOqk%v@grf!|T@ew%cShzcd?fEB5(5GRE*;$|v7%C<*t zZO`3CVc_gpkisjMXTJ;mhGbH?N{pX!8a5{11LNii18D<+Sq}vTl4IU=98>x7oyyJ! z^C$jhm!o|Aygv?YJ|EC|)SFIm$<0pkue?1vK6<`~i5H$P^`1MGgL%9#8`$x=(@N_wpFLzUroMI;Fz zBS?YOOa?TfT1u_Az}X0wFUN;!LCzz>%VI} zQJevREIFCXCTz!Ljq!*MqSPB&g(0X5VPyS?hIXJV2XL3B0jvD^k}VsrtHQE5a8 zsBt6IjLd?SjM09Y;mu$BS(jngtz}qkb*|l_B3kBLxDcj#>a+l8?0MQE`MZuNy2x22 zBKfq%nxYkC`@BTN3iY6-iH##Qe>IlR0Ik99HtT95g$bQ6eXf5rV6@TB?-s6qi~PL= z#F^~o=tr1jOpho4Bwv(kD8?@;V=Ad>2$uJm*df*m+Ii}WixYBOewLEz*hkRc)#9WK z8%C{(IAT8r-w` z)8_l$+BE|7v8}=tDvDU)eiVAqu(9k7(jy%!us>laJ?$0FwqCaSQ%ba}I?$NVFtH{s ze#cIHytpLmC$>rZ0@m8|GlCb?CY^ zvTIOcRu^schh(b^VX6nn6W8Dj?aCFZrQ_(-Cp0~;cFcb}^r1QCij`F#1}uxeY*(;p zS~=%3lzhtGw!Jypo`ZdL@*$-o>Tx27`wj)%^KqN~oa#ww=$Q!lT5jMfP(eN+LjR z_j6>TcpY{>g?`G-WJv9IEx?(eYSBbDzj5B`(}nf_MCY_Lv-VAL#iMhxDc0lC$T>Y6 zwy1OD$#TNJGvBrJz?-a9L94{wem8QXl(oB9{QFWXxT1IcZ1cYBa1=pQv3|ucOKf51dV&reJ>;mz1yuAOU}tT zIINqRvQ=CPLf>ZRi{G7`p;QzDyxoyW<%QmqO#6C{6>Zn>sQt>!<2Yyo^Vf<>Cnjn% zL!+zGY1dJU0>nM&HTw0|fjMU^(dS!c4nlK9`yp6d%@)vKWja}=c>vAdJ5@$IilyDGkOC8UC%to10OG4t*i3nzm;0wX<1^@)5aiIkMa zf4f$~A}ylOS1=MQ3qN=gXT=9p;u7n=BTYmeFNtKc(l2dMKug=yEV@L`sjPph;8Bd+Wc3v7!*GUi)Nzq&&!u=I-Qq7LHiN2Og3cRv3jwlE=Z@I@R3|fcj63hw zpqft|wir4{n1;8uf5Dt}pS^#(QWn{H+iLV&sK*hg?`r;X_U;}x$&+mdxrLkMxSb># z!Jr5}SaA$KcsAnc9os^tL0d0ocBs9tdBQRE9Q_{C-qES&PVW1Lv7HxzXWGMYenX)> zm-D>Kqkv=^;ap-$j9Jr$^QskP)tb@?$*R9)9Xmd#?H!#<7ddrv95&nT9Y7{qTNf0% zdTU{|cy99UkmZ!t6bEF-o`SEs%qENAu~Gf&AkL{7G72)E3LIVhG}N2+Hrt! zzw;>T-3%@T?L4TLLfAZYlbd$a|7Pa-^sN3pH`T|UViKrP2O5I$P6L6|xvU$v4d|)i z;-zrzCG44n24f}evi}V9nYtQNlCjmug-yGAb>B^J+9yt9n)La#+iS_(h|>#v&_naYw_gojYS>1 z6Klz*x(njA5svLoOYGp=aZ+~m@J=3GhXNy5=i+AGvPTVPuWORqZby7QbUJM`SIY`B1!d5Gup>K>av;$*k9Pj%m! z1so8E8J2I%o+HJPHeY7!k_>BIRX*5HnKqi<%U?n{4E-*YFY(9$MD>qS@y&C&j%96c zvJ?5v#KA2uz2=;$Gop3wcj;)eXUumy#~7@R&8|>$8D59Zd!?7j8A?8#!`Qj>WF*(S zkF6ZfD}n)1eY(ndX4ZQR);YJI{V(A>F;g?mzkM3-% zWl(i!IY4H1f7yG@oTKhrr_1}_w5mDhIoDB2L;@U}MFOxh{f4W98b1KvjaiF7oB;Vi z2ERa{xo61YZUH;5HM9A0OsF{C48YIIYhEjc^O;>veT-+=2BMsYr8J*Jot&=oF@w_D zLzs1Lu0_`;v2mL@3Rk)L@Oe^gY+13hDPCV0aLcMV8yybGX$S25z#vBmH)ZzNq;ngx zLi?_llwMf>=H3)+b^XJ5mBV!m^4M9}d<)Kj)c6n+<-^L)8iEbzyydb8B!}tGd`<;x zo?*`V97tpt%_cY2zuN0O4bTRpck0E?72kMG(kW1!tC4xq#{3Lz@rVlb+ulaz>_V7* z2E_-BQcjujso{|KN|ZTsvRdV5JT@mejq_ID6+g#$_$>$8&$HK?(B@r_7{3D&cuYAO z@r%&@3v7$?h&J91)nD&w$6foD>^7CyBdJ)PFIp}c&RgbLonB9d)y9p2Y;|N(o2{hj zYvU_&?|?*vpS5^7m(_f&>|uP6HcXkMxSHiReNJQBOnr8I1jA{RkM~wB(naD?dw(OV zz1i48>uj5(3^&es`%9g#&SiGZAIq-4X3WYLh~afkY$k^t=UwPoJ3G|)tJ_`%gJZ+x z6V7v1Fz3L-e74(LwmM$E&Sw#qoSoObowcjB!0@dx9BL!Pn{}*) z@klpJ7#kZq5oRiW#WDD!vrjYKPNMjts?T=L^YEPG;Ow#M0)r2XagBlFzoFRLIYY;z z?X2l^91z}e9>+0I*js0Ih+SE zDtGKU*-`+RiQ!d7>#=>OJDZNx@OtKEGpuLZMr?VJVRD@J7tpR6h36TYZFHWHjV+GJ zdmF0~#ZlK>&ftlCX^XA7@%iU0SqPUDyY=oGdyp+f|HfXo(YwCI?5x`b;^7t-s_h4k z$0pm}lLg{7Pi}cI59x1hxt8Z_j8msP$Lgc{(>9AE-M(-L{>?tI`Ahp?M8|r|<*IF) ztg=yqXZ$w)sC>7*K7Uv`Vq2IK9*l$R)XFwIKV%)!8ZeXYY{E+)>ZjR8RCa$8@iaMJeFzzrs}jt6u$=V9k4_VcrDUJH~I-KcD7J^LJE zAdUBxfX*H5<$J96g2s=H8=!jfXZ59n<0D)p5$Z zK7DtLxMW!l%yl2E?KlWVmcd_YFDsriYemDZ?^ii>lRm{cb%`jesccDdAcs5zfyB!Sjvve30(}p9JL+xSI8cR=uzp=z97MH5n}vu=12iaEU}|E)vmKGRlx+{7Z*mY4^BakLuwb;kCF@xYBCMCt_IG72gAXgA*+_lP@Y6Jj zh>jp#U46GPwyIkzw|H)IYUWn2^qO3P!!93TV6>eC8cQ_*FMA{2*5Wn8rFQOt4}j;I z0&Nc|{LF?aw7q5PNWAPNyFCm)X@yl!bf?{5HEOLXJ#H{+J2y3DRTUpAP;6XWw0{Xs z+v6(>(P|)i$m;X$%Q0jFvUBS(l{mxBD{i^TJ63yQyOPRp=SpEI71}-Gq}*CQtMiS* z|5`vWevOEV*D6vNYu{y=mNltoY)MXOXMjAW{t>OmN_R+?&DOOvCV!OJ-CvYfbeyF` zh1=0M5Mvt?qhv!J>S*?c^C4zcl@s>ewx4v9)_Jz_Q(2bIyRIOPjtGovVDwp<8ZlC;Z;X0rV?qECZGybONB2s*_IlKxm-x*%N~@ zXxCQ;Lg(H$PR7LLWJOMKB$Pj!-3D|%ytlXW3gzJlCEaa@(8#uY_SoXMQivG84mB3- zcNMofE{C{f)v<5;wE9Dt0DlGT2ZBo4q?2vi9?Wh_cN_{(YPjYd3D0xm_Un+ng|<%U zRMYd81TuKo9f`GbFy$J^hicV%FXQ-ziO25O49$^; zStgCM2Ct#81?6m=&&aqLnCj1raUI`z=jezNEoUK@*(N0F!|_m_gw;|ctkWZ{i!yuA zl)WK`Q=MvB<5HL3a=_$rBk01bHYcdx+SAc}GmRy^%~AUgf0;j+6c)EIGmKZJIqu+4 zM2}xmCkr@m%sGmJ7T^#z9Ki&rTF|pn!{Kc1R?i((W-abk4tJ>YBc0ghte6CxAxYj~ zqLN6h?t;y?u)Xs|rB-J~&73#eJU9KT#IOLR45h|l4}j-#*Ix-$&UelJuH@P66&s-z z_A-gf92uwDh{cn-ncGM*Vm~%-aARR{Syq*7b%?m0?K$lNPbMrq)|`NyC)v;Y>8442 zT^a1sh3*t9Pj#z#={g2Q>E?F6B@Q&Nd-!_*dPcV`#I@6shku=%8K~`T=h1p!F?wIj zX=e8UsPk4}^bGM=#s8mnu`Tqbqt06}m}psTcEz3$=eIjo3gZ`z?qY19t zc4p?rfgk1=y8J%Ja`1uvK9Xq*lzwYDoiqJ5evAEExY4INb9`d#A+!{lRyQ@@ZE4Qq zeQ-I_k;+;0WIYqd;L^d|zZbD?yC?A9nprut2TlzOug%NyR3AGFy7vM|!z%`uC$ThC zH_jz?(hzpuBj4h8n^B4OJ6T<0kr0peziCA8_Q}c68I{GI-Wh|klMM;Ss>coui)gpU zSh781C`yzVT-tb9%g$$B$|Z*BXWns3&U)cf!} zJ?>K)c1n55ANTWkLoyG~1e^)Xl4)=BQ^kvp<3ienc;?YQXc&c@oes_#w>%+a8;Wt` zmF>Bu{gkxP(OFTWTQ``gIO2?4&q-WjmKU*vqk7)j6Yn@enap@oCBYL(WrtWe$o!aQ-3s}L*`8~^*F%Z7sdYUw6(byg`Euzfyl%v(XQoh*sG@ypWJR3FnW$%I(|PIO zr#j?$xW}RM=;IQ3E6?24c_|;m8jU+{GZG0!8O1tw7}h~^iDaI%?R96*EO2ac8REs% zq?gs3cjs>BvX(+WRGwLE((EiQEH839?445}1km^q&#yj&w1;vz`b(cbZ2EQF2t~t* z0ydaCF=c1h&n_x6oi=R`)oSc&i)-4!r_Zkr%lG1p4+T2H;pQhJAJKSn?WffGg0j-V ziakp)zPe>!+UvohPvQ}0%-Q=O{cqKOcKYh*~8PoB&T~>zfG78FbDWL;Cq?T-RPzhn*iQwTR!x@|zFL z8HeTx&ra4Ue#XwzXx>pa$1fwrJ1b60fV^DP5Cr)H3ZDs(v!UlJ9A&2XkmAxbkFEyH zjknw!Le)9cUf4N@rMd;4VapLjafuhEd(>?~8+2-HhADsOem%2sW|C)5>;Gq&FS!ap z##$TaB$Zw)=eLNnl-Z+>ey+9j8~tv9U-RgghKc9%ILW-~t$K#)hUVD@vU%4iHb%7r zT_*o~b}e7|z+;^eQE?X?c|-#oijuF3wvYMCe2YED|&2K67q*}#Jd?*n1w zlUq{X)cpW5RxI{bIuvA|Ey=OEK69^D@XX z6?HE6@W)tAV_Nf*&u7JR3|h+((lNZ{iQ(QWl`*U?`)6Qb8ym+qyXBzuI>(E)=jN|6 zN#VQsNHM;uD^TyQ=BY~NJyc|VM0_J&u`YAJv6Q&v=XrMaJH83WhpOk3ou%R6SsP>g zqWAdF#LDp8Ob*l??U}lc@g3Rons_>VQP&Z=z5QMK_?q^L>xdAxyD!iOwQoYpld1b~ z{ui|qv9e~K#twtuouwLOS26l^&LpR_LNPRDV}1TJrJT*76>iwRDvk4xEjOSqB+z>q zw0t@Zwm2K*Bib*ZaA5KT`sRwobA3COwO-KA%csc4RtK!>oLn-c37Bgx;qiUh$U_h_ zl_S+2E5dwnIGJnJ>{hp(v$Wg?p?zV)XAFLlt?788_9|x!#zd1j_xK1UxjlJYU9_r0 z?}4)CFt*RmBb2v<@;746npoiZTVspbtG!BEFP$gQp1HR|=YIA7bG~%$zQ!CfZNCZP zQgmC0fuYq$ljo=o!+lkkym}2QTt|y}Y;~ry^&1BmULN4SGs*pc(9dK>?RR4`sm=k{ zIH-$BJABf*axg@CAr^&juQ|hvm9>^_i}mQdvHT*I{K(3w&9yWU>2lLP8qwd&#-GMI z%L(O!t|QMg+mAXIwLMdW$;vZX&I9Yn@~zRk+0Vq90D8rU>S;1eizC@NXZtCCqvK=A z7N{=qKA_I@<)WUczX zUNgd|PIYFg17E)?WOAe&2r+fCz@;78_(irN9y>4Vu(?6wVmW8Y?^hS7R9NGp><}5J zPGfZ%w*wHm&+ihNS!d^ZQFxWSk~7xdt%+afY{b+!SH`p0$J0g`h49MxB+W$x$T=w~ z>s(wUVo?rNJ}UVEKsgtP9Y_Qh{~vu;A-lvJ3OQ`d_~^E8d?ayBVtDL%1m$1-jAP1I zmz#2)^Y`XF$&r8Qw|Ryrt_X*_cAf?UWx}|ocA9&xUQA>~Xt-&OC7u z+a|5dD<=eIhe}X~qtfyWP$q%Ef#Z?U-16qqBp`0d|Btcvj@P^@&cL5J?`8Wgy9>L3 zOK(yl#ezr>5M#+NMX*G%Bqk9`5KIS;rqq!C{MTjdCqk)F*sS5PCcX8(VKt(U6O}Ojh|Fb&{}VqIH50u z9X0%{oIxNFI{?ZMKC4AJ>>AUH??hc5!pv8^@z8c~I)xN@d#rlkhma{X$ zMr;SXuRiw3sB=`vI-mG^+5f6dk} zu24f27b!!dFZoO3a$f!R&c& z6O8q|!&&lPWgY5d;4gkhapjPRanWBJ;7s&gJWxkQ|u2w=* zevxWZ&DvdI-Xf*_@N234HH@j+@lHm+k=_NTY2b%>xJ`?|fjqd2UIK@V=^A`h?dTx$ zTZ7f6gmjRbx!RW`{#Pf>k?}eX}#ps(5sA4pz@wO8NY_cLw8yNa{rln zTl^H2qb77!zdOhkmC=b~91La9L7SDsC&yDW{4}t^{5I>}Yi%}$=K?_C2R9AIR+dXd zyjI_n(xSG!iufYI815u)h1BpV+Jefyfz8AnTJAQQOG|&7>1E z1<{TR!8xf&c0)J9S|Q3G`_v#*q1q%5bj6C5PkiDLE4E#+WXX~T9(drcyYBkQPk(&R z>U&&|67LlNBT4yvqJ>Eh3+OnGcOWX$8P2eKUnswqABh7otONTf_0P#Br4{`DaUreh zO2lm>p^&0Ta7DzuH(=%SdDIVeWwws_a_G=rE4JO{iANl{V%wEVmMq?|;eosFzUwDH z{qgG6t0fnDUBv9Wb;nD2h$qBQz~|nS82HkczuH>sy}#n$UVhhIcX^wR0I!@L%$#?Vi!KV~U7!RN+sVzbjse!iB_1?pt~s+yEv9ZK@GQiu+N`aq z$m`ss_)GjgDVs5t)#1S0I=dfxsQ}cPG>56{s^X1P{DHTlp7f-bz3k-x9(dq^zkl)H z606>wq9Vze&!T_i!`>GkCL(8{X-Dt7#NSPKPBx*F+NS@F3x7cf2Ehmg@n={f(qf+u z`2Ugh=aQ1NDqFr$B;`^4=YM|r(NBIdfZzW1){|cQn!=wD(qrg3+|5nHGaAe?BeDV8 z2mL5{_0$iZx@y&q0(|S+-~9A{|2G30+XUBbL@b$$`%YzG7vEtQ?CtL@c2sU`vo)Ax z#^lv(liUbSTNjP9-j9DOd}RyT;0l1_pXXdKJeZKh-+d*)1kUyc*b~f%BjmS;BLs;7 zgO(zTYC1}CK4KyimEVBam7xQYL-W+sb*;p+^C5t8Pc`E*-JApx@>};?`n%7-2p2y> z|A=^z{APM{LwM-5$Nb*l;B9}An$&bFGh9ZH@=N%sAZ3oeS7z4yoVyRw9Pv|YGI@8a zg3c_;0iIM~hWP*)`e5{(@j5XanAAZ`iRU$AsN2_mH|ofWQ0mh^s5~r8FsLgslyi%7 zd&(B8AVAocG0UE41Zr?paH(fy1D*4%7E^nPp?Ma7eXCM8wAgYOOm*N#mUkr>+Q19) z>k)Gq?xV{UPN5q#2Fe-yFOh3hANM~Ae@S;p4w1>n*ny!Qz_l(;IG9}!c4;tqN{kMT z*I33C;<&)h7TfYr3$phx)_@q`=f#>q1&uwJp!Y^+qqIn z-h}HtZP#2QB6hO$uwV4MjPH#J2^cGd?J$lgb4bPv`cX|srT9yn{X{5`tHW^NEyMzTc-ASzze(gA`GzHBz=b?6P_;>Pxt$2|5iuRQV9bLY(iaR2>lkAKNO&~|VOW~D?* zOB;pWz`n5NNAbvg_c`gcZ`gY4qCi!Mm;z5Z<=r>jaD9Atp#QAC({Rg>DEsR(${3AC zP#uj%Tg{!LtXXxG3WOD{p~-r4sYu+IO34KU+d{OklF+ZH;JSy`^g@POHCu<(z&`Sm z^pWn>Um{t9hgLA}v2;-1B5rH()qBZ%$l0&ziH^qHo|>o=)XKxOqkE`r353-fI~vRS zL*vYN)T%Yr`3vS7%gmcQcdVT^6UxwwT{DqJgT7pkO|3Z#$n~2Z$XL*c3HS+p{Z!$!i9jU z>o9ya*LJFIg=-6}vX(aZD~JKwf*iYWp}%g?!iDAq)JeIy+HK04Dt+}s2X={*FKD$= zCl;75Re!wKG+Ba-6gM_2w{}guYXS+gqdL4#YJU;ya`p5F?nlt@(-JA9vUlh$ec$by zK3=_`{4RN8YUO-E>cpi@whUVo{)dlx>zNwd4W>hXmr}J$f1K1_K4TgqVz~je_nZ#q zw2fz)7*rT)VqkEVN8D2#ktqL)HW4X`HN&r^#%n=GttSutPv~S2=^A%vsRY-tMiG^- zAce78(RPV$Lyt%=^ImWRe(42yvh+nVk_M9pS4^Ik;@pCGGIJGl*oI84EM5I2c&sNA zN=I)ZWAst@czR0MrA8~1J7eQ415^xzfy=Boq335B)#O=HX#^{C&?rpFBl_gJ%84e($;Q;!V=6^!xlw`8WU$ZgJZz|%uzLQ z;|W8+>gVlNw!Z$O`o;+6!~yH$pywm$sRmNHE#droznTP;V1**r?FIROTkiR zSiX}*qYBu59{?EK%jbLgOI-m3^$xlgGbi?)sKM|W z71j#2&eTmz<#i=jOT-wjlrOV#__IG{mbDur`g7d8JMvf!M3t#x60}eb;M6S5}@-xr;JfJG| zZc^J&;dK|1H9RP_SXqxpJwVj%RZEf`*0;F+;dk-be4-Y6nJuD@LI8;3<^T4IBab|a zeZ<_k^Sqxt!Z>8`N1~?1+w@sUqp@73QTfZi{Hqtg`0p{qU;O9NrOV#&j(30VbDur` z8|M}LWZ&EHy~um{vR|xAk!ZQ00nP7K?wqwU@|dU_QH?slkz{>E)Pckb5%1B3a#OKQ zbVi+_N_)cN4}I3No(*8ln)}}M&Ub3u*H`M>#qa(FTFX08qYj){)mrNU2o%z61C{wp z+yN-0t``0X2;g;4VEwjZK;ygv`;3@RpF+`z)uga47ig`qp4R+Vyf4UYZGurIkpAQR zFs7HqeZtE6avwx!)-DQ4Esc)An*y?ivsG+6i`jC{$j=3c=S{}I*vvcFY13vDYnh(c z#kp*?J~QgCn&AP6yQaDN;daUIhX2~j4Y2R`e5-M9t?ux`Klf?(+H z9zcTZ5Wa&vi-CO)o0h3s=L+5pj)vxE0a!}LI>Y2x;&9Z9p6PdSZ|W#&v0SFO|CaHB zA_qT5d@&9;{m18^4qN9;zew~ebU3V0H{TKX{i1=ZxNjVzv}xf(V;v@v0tJV{m7`p5 ztV=BCfWXg~V12T9a=|)SpMh_}JG4vPn#Sj`E>`jE3k}0sZn32x*R%U_3@At0POYak zOgB+>m}j6=?u|*h@L8|@Q`Qr@U4)oPe=oe}n6zn9%BJKAn?5xTWSy`g&s#~Xs$3$VIMtSGv>yS#)wFjM}~&)415`Bi@>UJzMnx5 z^`&SSb!*>Z3VE2hMD*SGAu*uPCL`jIb%ueH0j{c_Qhtape}HwW^}L(JK#i^BE<2;d z6ZXK55a;9>puAV3R(}i?j~!uaYZGWShiPDqH&h_Ryw{GJ9*}t;1bzmA*`4*S5FwT< z&n)L|NCRt74To)l+nq~2M@?J>ANq*KWOExu?y8$u~j@} zd~ESuAfEB(P3Gbkuo`|qyyiUW{3mOwv)A3s1;3x6{)vG6#0dNaRbotX2FA&LbYzG-|~us7%CJ#-oZ8=j2i5 zU|G-aKE?a(nTt+xNEz2;z7+Xh=$7$Ri$8k)Ut&SVui)@}Ux}L-zE_gBlP7&IPqDiX zoz42b!p?Y+=VWEhCNp@?a2|PngW;KZAkV~!I1<0R41&zHtS#n9Wy}&|K=8bh0XB5T z_|bmG;az{6*=22^04SAP zimcOP9m320`DIUj@>4@UIDi2U8(y?CdccKqnaKH@s* z+C>k3^ka73d1t7$Hu~I|p98ekPS=_)_N%Af4DbrxqX>yQ2eG=8DyK%99j-*5y>lRC zEmp1D5ycq#i0yZH+uPp0eEBx61<$lm^z1Jl)KTR9fjUtOWc@PP{^^8&{U^G7 zS5;ffa+zUCU*Ngcp4EE1$+HH~jc11SW;*m)2DnlaUTSWmhES3AMc~AAWy1-J(QQyi zs-+fAhz%WnH`Wh%Z)EzNmWc@J>d+Ie+|$&4dW14%uLt2*SjKC-@)wbmKC-Cz@bK|jU7H}iZ1wBmyjzT>|W zGps>Pou^-P=O6VzMtfN#>c}$-;FJ9Wncb)8FYyfR&b7f&))oryl9k8-90uiFgMu*i zcvmqK@(=K@RfpaQ?oNV;_#M33^PX4$h_e!U`Y${$;=+_rPX6vj7T>D^gnu#adtZ{r ze4x|0ywmbr59V^V!V{d63oO=`kS%yA{lyWTXS>9m=Mht2#5~IT&!zHYyh{Pzfeb~@ zvjap~_ZU7%6eP~$CSpZ$J|eI4FGL-?FrRcj>9lY72;gT-*f|1@Ra?=P^cUB;`MV97 zH2se2TI0@v*uZy&x!J_|BNWJE8N!Y(r*VivWLW=Szgucqhp}UrlRMA#Y9qUA+VEWK z?LDuyt-|Fzg3PbHh8%uqLpdV=%zIT)?rn~-gMGK?p_~nbVU2Fa8s;839*O;2>@Uxc zu>N))`o;=-O!)X@E~KgR&|#eEK-pXnX%!naA0xIcp1PhTy_@?uu6kA}1PeJ`0mVsXwe@=`OJMla?Q((3qoAFWZs{qhi(>R$d{xGpd zUFtissl0DcImu+xz5E>f8@QbboMiD87qyw-tk-B@x@w5>Bj0>7p0n8suuj|YBfIau z$4Mu>;b%Yp*;l^w#XtPvwl-1QkYhy8T(#U&3UK%>Lea&*x?0Vr_dD^5K8iAPvppLEod&;9zjx8L?h5u3eZoE2$aN?|iw)gK@3 zzG7W+7HP=)oN0d9W}D?te)3a7lu)2~n4rDl6|X$}@WV~LM<4y;`;0Sy;1%lj9~EKh-%Gxzi|P%a4x6`yr$Pgjr$MPlTwf5b}wB4SZ>+LfC#& zG6_`#v4dBmAT9fzc8BNcR(IKpPtjq;`>SAGqN@nvV^W``bv&dzD1Kqs?*2gxrvb30 z&dfR@z(|5#Mku6cTTm!3n#4Y040m#jiGjLV>F8w|2QtlB|wFysQ z-x0he)GZAQ%G}|*4t-&R5BUAtni%sXGb6odU(&C=1@ExEPzJneu|Q!fyrnphaP<{t z$13#_{Z;d^06Y-(oj6;e+@EYA$o5VUx2_ZJ|B~2#W{L?tG)EZfG5gvnC^k zwZt_pH(EvQYFF|@L$qgl@XJRf%_TzFO5FEH!Nq{a=*B_41Zfo4%lp;2QCTMBp=7uRSPR;GpP&-|kSN6je6U8#H%}h?zG8zV<5bwX(VZKWLw*j7g{u8tbj#T$ z_@NPFB{_C81#c@~G2|sex54%%5Bw47zabu|Tk~JSg8nq}y`^QhLFtR|^CTg+?|`2{ zehWDr|3&`#Uh=sMF65rXv+u_B?E<6-cZkHNNR2NN0Z_zusxpC<^r<8~@-w8!?+9df znQtpf{2Jh)#v?HK`O4q!Oy^M$tvFoZ<9Q)+_e_@j5~%% zU_oReo>smM!l?MKd38K*IE*Bh{vLc%{a2AnX&zJv!f2m!Tk+;5^rMtVRbm4`%>9v{ zO&%jVg3V%??SPl?Blgh_c^Br%AU|6^L;eh)Iv!BtW9Ai3GLbLw+A}V~fT*@5a@sFL zCwEv6^>6b{?5}rL71DoukZjPNz~#js;|j;&49ws z%I?a&{>VFN)#hbYdxr{oN9WGJ=-+$^0|Mo?SuG;;! zM%Y`rYFANcSE%j&_jc?_DF5}(0X^oJX9gNS|M|~;##~%Bv0M+L{ z|CtYe^iifU&KW7FUk9o#1Dq!#2F6uQr)>FhA?RT>vF;-WM?5`$?LXuVi|9C_;asH-%kh;40qL z>DM~hFUN!FS@MQe*QfU)F`(?btzQL}(#y){@h^rr&pxt-R>MXfa(z4;h@$?%wKxe$ z%%;BXG4QY2U(v9;qfQyu$ODBRdO?D!09x=vG=?55#;LEJ=66L{!z`-kWLJ%7<<^11 z&w$nHiL?|1+HDV$kX=P1Hc9C<$IVgA=-wTzG46+7&^M#yjB&J!rk;ymq`iijfW<`j zFV~57x4vM|JI#1e`9~ts1)e?43QT(Zg$DkqfkcJPA}B=1>RuW6;diy<57q8HEFO79 z)w7LbY|s>%@9sygALiWgt;{7R^dIpeyuR?iwdr0N8Vj7rFshd5A+y{44pY^r*0_6hBgdW=sLna)J@uK{Z{clfhTmeoo!J7l4MiUp zJ359X{V}4j7FzS4r!ja3f@Hj5^qHhB?qwfwR{dK z_AQ9g$cIaYmU&mjt$76Fhz>Jhuh~{5&uB!YxUqR6o>D(ap5cQCuMhc==pzl>H&uE@O0>{263Voyu{P)2qo(}vb;C-^O`qa`M4 z^+#y;rFp6Ok6BiRqq$!HTI5k1J*E6gKk^Z1@a^Cyr-m$Zi$xAq#K~ka?5=-{(KVPF z+kbPfd9x`9n_O05Etx`FV=ae7y_`8lsU6CDN8_G7@u@AJpcw3}pHUC2iY6`l+1fGB zc;;bGIQ*Qio%P-CeHTqeJfOtuLVYPDYr698G7R_bi|n$?E}#l7IRAVgYt>8!G@N_R zInR35bLP#P2Vl3|_5j+}ix)rckjFu>c*$ZLRxeqy=;))LY~Q)`(#!5&yH?a|>TE&m zfCCRa_~1vcTD1z0JMOscvdeyb`Q?|3s+PMM(PYkO&J&+_IDqMm(-&QIF@UWXFFxYP zBlp^C@5PH3-+kv@mtXnoU;O+RvAA!?%tvif43xbFL$G4I?d-GhczoJvAN}!Me0nRz+YtMex-^`sm z7r^ej?;$G4`!HSJRXeRZ;_xF^t=e(^f(7^7bN3C`-|)Tff3Mb%SgnO<;@;}0i@i){ z-FelHPkiE$t5&U=zhJ@YyI0?M;|<^Y-gmtYL_|<(tDtfJE@gM_uJpu(zld)V?S#EYISaH z+ZEd$e9)u!*>~TiTW@{yEw@~D*`?QAe=YGWQL{8>t2u`s@uyI1oZfiRMHk6Pwi?Yj z;)#bp_OXwH;O3iezU zcZwah+iw3y{Rukmy6djrTzxe}wpqILs3#r0|Neh+|NZyhbmNVeT=MgK@4e4!p90Sw z-vPm*`3s)*^r!E%(@x8lEnlO9!}q@XJs~I9}fmgywigD3x4=V6B( zzG~GYde>WSzWHZAyXX(M{ZR!$@}^buS+5zh8TZ!wE>kF))H*lYyDGw{V=&A z&rm3S7d5v)6Lgh`7s11L7;t|N1zHyXxuQ7$I3al%3 z*65QmBkR4Rwkl=FyWe@oX7QJ(m*Yrq)ZovXY#R2eXO39WflvJT-L|%$%$`BHuUJ*A zrc@e$k&gwe#x>$p{N4&zCx<(>GhP?&&HLD^U(*&Ys5IZAB&9aq(eL$aDx=oA#}Miy zWRT<;!JzkWunp&EI%_gy#=3W_IplVce_cYwI^9lf5D zC^rZ=w|IVQ8>gE{k2U=n-i;~)Rhm!7colC4uN5diDf-GBP&AG_p|Uxc#@^x#K7=8gY;vYGJN z&pGxV|KTN1d)lAJ3bXxe*s$Sar+xSrzxag{0w6qPafbfo<^S^XCq3!Ociwr&o8J7! zwfEhpz`yTx%QeXuDHDDDr&;hM)t>dy!~CK zz%5(0JnwnW=H8f)$G^MN&O2|rVq1aSamO9E-*J0wXS?mTd&BGheW#svPWu87*}Qqv z*U$UPz3Jq)Y_rX_@kUCjKl;%R zKl0HJ*XJK?C{k76+0QxlUGIF)-h1s`u?OJVYp;FxyZ&>-gAdNc{Go>)`qJZ1*m~=w z(OLUt-THN>o&K>)F8M{pz+e8wUzsm#-n{vF$33U|;IgGl-~RS@ZomBw6Ecs-579s)V?@efi-LHd)2E?{LrZ%S-f~jZBSLe^PO*f>QkSnI5B&TMx)oi z?hOYY{1_SbT~&Ym>&xExuD2Uw4hM9)a=YyZfTR*OZ{Bp?dFOrcf6nxSISL<+Mx!_W z`-`^i?=ie05dE6O$;0Rk|6k8Y>HB27o`JV2!$co3Y;$1W+3+vQ^QG+z4N~unRp*SF zs|;-Vu=&R9{v{20CP?{xp!1?D*y+Iqt5t6(`kbZxih+Wehl}F_JQrWc&vTpTEPglO z&uFva>f!BP&ik0%-)EI)QnywA4`UZRoNvzHjfe9c%=mn!|NbAo3{2u#<4lS+iTVFa zZ)zupPxk%cY&xq9I^%blVN;#?-G}4G85}r}A^dCDcmI5b9V<6d&(+_PKWi*_I4+vW zS2N!=tA9;$%M81RJ~112{r}OYKjX1-&}NZAEx*OE@2Q^&Jj~$phkfsiem!hVe7JUI z$ehnu4yN3aUB9b<4Dvn9h`&|O56AQQ{4lSWkS(!M#+8`KUAyn`NI>6z%6~3hx^(g4 z#q;LPoi}gZoH=tu+Gx~TYjsce=&f&kYYeY}It178c)VrHmhpJJY15|Z>FMu$_lE%P zUvryg>fuZ=Rcq z;=e0bt~}~VN3Yms+na8@apUwxubF^P1Eom9Pt?BY@+)N9ZMWHf|3^W!wYGlUx?66# z+4~!>77@t0b@$(O$DMcHdFKNgHV98!pr8( zo1bEHd@^_5yu%JV{GsWGZoJ_}0Zi2GcX-4RPdvif*?zn2pYmr+Zk*&O7eB^UgarY}f#oS%9|xzWcrFU8gKtwmb(sRMBWO+Hc?ecH4cAi!Zte1`>sc z{LSAy&mQ~V@BHt&``3v;q&1QK_TBH@@BXi4%a-NfO#vuGMs2k3zWeRI`|cNAcwvG8 z(jd=y&U24HesW~XSuOdK{U5dW-uqnm)1QijYj+KyWfthR{i|vKX0zR)*yfW^#A7#Z+PQ^1qBBab@&8|R1hMWu-x zbIh?P{L{0yUYPfy=?!;QuUB5m)z_dfWbM;n8lb@o@oVGlg; zpm)9N-99WI%G_Ez_~1wHwddX!{q&~=CjxlYvXBY@IrQ<5-(}Zb0c_kj{q(2(c{Z2} z{MZ*PmbfGiw2mCT-EeMIZXmNB7u$j|odbRe&8H@ra|3e)9Lf`~C5F94;>? zD4KzX(P*^azWeUJ`yLlvbW!EQxm(Tq@P|IS`|f+@xSjtlT)6P4qmJINe*KCSD*<~N0|3dJ$U9DBkE|1xjxyqQ{>J7>>WTNLeU0>P0I8Z1Z#*=b>dv%wkV`mvF&0gbA~}sXkOUIz9@X{&SLHaoKSAVZfO2Z(qo}7 zTX_>gw6uU&bCb{y&sA~SWaG99MoSf!vG=x_W}+{&^5HO0MiwLj>up%gBWdEcxLzv| zs-9B(X!wg14O3l8r3K#7E-72J#Q@tgBnd1@b>ZS}164Rz&?wxC;IQXHZ0&d=7JP;{ z&zM-WL3f}4TE06lMC!qPM*@3%@2qXoK$H28Vbb(vYrv8G42Y%VleI6&b;VC7-%<%} zLbf4q&_f$PN&L6)#{s8Jd~wk7FfQ2d^p0$BrrjqcwBJko%2!wD&ahNI8II#`RIyd= zs_K-}pD~~pTa-b^OjJx*Txizd)rqeR+@G;k3a;3QV>R8pkdIl`UoFFyiwyjV3*#&N zv&8GLRK~>U^~4*)rv`tDz{kfbc)VW&C}KipNcxvE#tef_!Xt=19j#UCgB`5H3dR)h z93_vf$swFq%mATiG7xFt`w9_Rwrn{BPkYMI^XJc>GiT1!)YR0})Mzvkk=DGu7*vnm z`qsDBC2ZuN+7_$Fn>TOXym|BV^z?VW`vXAMu32q!15ueH!Yy=wa8`i3|eBtkY|GVG)_SPT$_(%7zy{|*}dE_HcJn>aA7+$|& z{nb}rb=O^YEnK*8?%a9S=YtMB_@aw1+^~Lqhc@W;JM3`86OT0G?Yir302Elg`tHjv zyR7%|;>C-7?*Z`WM?dC!Kltv04?WmoGSDprNvq+88?O7+rI-3&1qyxqA&=i>*WCbY z*|OzpU;Ang`vQOe_y4%Z9($OyJM6H-*=K!))eCN4v!iL%W~}dBz4|Zy@~`YGkAC!H zmM-1;>Z^aVdCL|@0%9Yamb?4x=0MEZYU=$TICajPIo5&c>FJwqzUhV=u3xZV!TkC2 zjbv7>TJ_*V58Qae4ITc*K*D$a_uK34Uu!*WQ=<=j;6rQ*8>ctkeDh5=+;H9e1qJg84@Sz8{oQXb{OM1B_xs-^&K>`b zVe9qZJmU-|K<+ry8wf!G&`_K66 zz4zX8?X_25cG;yHHf&hAay!Gr%9Sf0dg!4WZ@69s4cLB%?TBctFW9tc({&c3F%~=U zfCDeQ=%?$~uQQ+8Ywx{ncB%LASI_>cz&-B0@BP5MdGpLkZ@A(5?|kRmS6p!von>58 zZ5YN00TlrO0i}kbpdupDjZz{~N~eHyjF66rfOJcDcXuP*BS!b=91Yvp_MZ0xKlXt$ z&U504>;7NYgS6nS^Fp4@(5nFhJL_BI7S~L9TO@snjU=&(*yd^A|N00XFvv)NSG?5Q zcG9Oiu$OrPtB&Wu7twMV*eo?}6f<$5=4B2L9jo4qs0i0q>*-?k?FE2Gs9(go0qRRF zTPPi8y?x#H^{zJHv;ld&do4pX^Df>yQWjtJ5*M$Ne!?Q8(>nGxyNb3e7c8B2 z!!dTa;^q>7EE^1(FJUl^GCl?+LO0-Vxf<76cQ*hwU}J&ScL10dl((Y<#weV&=^-Gu zwGVW_tMcda00vH*239Aq08%>PNRIzyDnlIVtGa%zg@d&%7I?sR(6`G7pXrY6i zmWIhz#1B$q&|b2^au*`qgipS73xxWAlA!T<_Ex>XCo0CRf}!MZ9ah1X=lF5`)O~_5 zp7iXYHNJ3njuu*R)tQYVwUT?hZ%UplzYHF%F!G-DlTMj&y>73xsbxeMzlmr}g_>$y<_9a`D1mZ9|DfYQYFQe)u@5BbW+$IO#g#W>oA9zKy7+T+kXogGpBs^FzC7bHeymcnHDZ}aVJ z#{%(bO!$Dm={IP*H)zZ0S#07xv#}sUvCsjqJDr_nQdqPBEm)PT;?b^F_cP(Yv{_C= zuTIN)e)-RebZb4zJeoW(udK2zy?C3%$t~(z{^1MP6TuCoX&z34HY)Fv=MN7zk3N|$ z_k@l7hzW9~Hy}hrPlBu&vxo<9z9nI%(S#I9Pm|`AElCZjWoxxrDXk*Jz6&vw*?XtU zIguG#oc{grvt&hQ;y^2JXQ7RRPxvR3^!;|%HM!}Te~vtt4`&cO&$;J=GDJyy`5if+ z(jr3c?_Ge1J~we>lF4Lw-2CqY>8#=S3cSrChzksO-nYlnM7Xo-`K)x;Y|0cB$>osL z3Nxn_gQY&2={qx}5+90?zMq$%uUefRP|0a^X}+x{&kbHa5HuDs@Z&4yW4F3qtHSn$ zZ|*aNFrTCVf-Pw}F1s6d5mb?enGSv1{%OrQi8!;c$U10&3Nrh@n(H{s2`npH>TrJx z#4*tHv)V;4ZX>S)H61{Qy@=Pf`(XVS-@@S98Ep%>9hXz0iM#H=`2m_Dj~YVT8yYBa zYowX@ar_P{dA9ZKpQ#M=lKGej;vlP=P825t6uiEmp#X{BOs(uCV?zHG!knBgj=f2+ zS-Oa_#r@v*R6#L z>~CsAWHB&vP2R3(-XChf^y|KQ#C*vf>2aR2YW2JQ1j&WkM$+*fmHIkRdb3ew|JKa7 zNp9kQNTv17C{#{tUlr_guB*t&<*~kMVE>Qkew}cJX4_d^RxsG-;5U!>x#f`+wWdM> zr`VARXw|BujOEN<0y7oqb-{`!4rmclCvZAk_y1zThj%O0TiqaRlyyx~LgH9<`+)r} zWhQ}^`s&%XfWFfaUzg6m9Wg|sxfoiA_z-g2pMc#Blz5*8avI@wvL&Ow=@S@3ADT-L zo;GI^kV{x`b`;neYPgezT4Cz_O>O|ZvFvi{v$cev!9sRG#>#m^qS@Q}cFwhR4 zW1-{WklEI&%T)TF9e~F;Z^t^5lV1>VxlL5{i%AV@c*dD^#h#r{f5bat{Pr+#=us1P6zB9Y9h?7T7bl#9}u|3={6=dGB_E zZucS~@X{Bk-x~&QhdddkpFPKF(w+8;K)hc-r#-C0wY|;M*uA_Iep_BfE`!=#lY%sH z2$ld3a>gFH0M5Xaw_$Y-hD(&a6!Ff6I4W+T4IO;-+1NpRl2+tq!7sVP}5`?DHjwL_vFTOH@f>misJXBD#GLXmFIDjIlX}(=`g*`x%LyA zvU1lLx+M==8oUrBxlWRg zIjrfo59zKjtnsOxShn`n{yUywyB-T7jXxO(J7*2EcQ=32;TOb|ooSOdR-a1d+xTrc zkc(E1{&sBr@zCd5%ga>OsvbG-FZ#!{vfYI?$gSnFTm6p>$kypgnK%3cRd(SVH9o73 zHs1V%clvcop)cO8SJe%P^pUZva%o!a!?si}(K<(m6!^I-r1a)R{z_CCSDs6k%UTJK z9Y!6)G=3UaF%!j>QZT~y0*->JzOK&EOg`Vgem^!jNpNbLqqA~=`ccZbTj`ETpZ$&6 z%`}qrfkXYlI))E2(jRH2zi}gNb4OpWKCfrsj*Oo(@vhKuPk*%fXsBXqgs$acxR&LD zl<$kAS9sWEZQjZ>wN~8I?Yz0MgHG1K=nK;ssbV~u?mmTRiW97D3A^0-Tgjh6zM^t? z#eLynaYN|Bb-t7QH}KTv--yJg5T!L0MTWNpl{x~BuPJ-P7W;Tyn4|9UqC{TTwO`0> zsIRlUx?NV>htBOAD~vU)w3O*OI-e!Zh{P^d5~rBA2#)2DEkvLB-9)1EVyV@JlPK9b zD6TpK=pwcEg^I@t5tkFDgR0gbsf>vAW0R;XY!ispi+{gU-Drt9wc@42l$X|%!qz_V zONzO3?Ldjo?n?$jEBLwYHXPRyv*;41k;!ag-KQ=QUqvbMGLpxFlinMUCNY@OzMxnX zd~4O4*TXhih38)2SjR4y*OxxB0}Xey9JM}_BZ%A$20a;qrhaX!_Kk<+1O0gJ^+sx6)|{DrvWuBvKB_){Tj4crtt7lh)^b=) z3fr8haw&|Mm>#1!yn06V#K3d1hQr7!++{l#WUG{-73T-_TsfEh z_U$kS2VLB8eKf-q+vK`i-f~3iDF-?6L!`T|H04VjY$O@p+~y@sn{RDWfco3lmX{kxWfPlN7?C(`46hB0#XV=XLEx9u5hg zo;9$o6WZM{m$M6mfT$<3mPshXE!zQ1=DiS}s~GGx_8I_6y3EBr|BT*hqZyc& zfa?o^{_7YnA77cKpd{m5b{rlBAqR?{vU_yw@2~1zrf}GPwjYdnk;V_yU-jcTb`W15A_i+k;?#_bimEywjK-UMqL=H7hvf-_k3q8+;8 z+sb7d!W&qJ;Ep4GZl$`VcEa)J3a#ziXDySEmvhuVa=sfYx=Hd#RUj{M0 zs^{LzE`fB2HRVkfJ}YETdeASrF=s!|1=$PLH1y>2Zgsujx`ieI4~b%33o@Ai#?NvF zwCS2*$6LP!ff?cQI-XR3m>TNUSxu+9p9?n^GP}cKe>1LJ)eA`QVt$2$Tvc5~VDn>F zZvgS<*11@PU704uLppHu6UmsO(zTqbQ=wqdG*0dEVe^?f<(a#E(2Ia=Qn9AI5{Vq& z22p*DSLKBfQ?BFcd)rT;TB8MOO&a5aN1Fn5iSRU8)>U3=&y)Em=jrL40+Gu zsrtzp2z6%#?K~7fTrS*V4BMPs`+Ku(QzWnazG4UPzm7$$Oux%aDxlQNSFmRHik~}x z$x}d{SaS)7i53ScYd^SL`npu$vCW=kUZX$S-$na&ZqE64mx2xd>hPQ*IZzl&2enXr zUQ%ue8{S)*=}%4xFqBK7CD`A2f5N1w=gi(vDRXN2f|vlj&9zysq(VgD500rQE_;!2 zD#~-q{X>B{DjC8?@lq|u9Ok4jR8d*lixIwDGb$lL5CuMP{IllU`9)bjIP%pQG6Y%0 zR-sc9Q&7a=z~@Vb^GY>en>uD>ox92F)-RnKNY9Ea)FC%S3Z=`7*De|S3VQX&Hf!}V zJCI6lPN_$aTvyaQNNc-Qvr(a&cJt&WRWEle=^`P_`X6#oD1fkA&IV7bu{V8?dt3S~ zgKQk_!4V>T;+ZtmHt++bstE}SDNK}grwmPe-ue7(WJ60lwpdZ2v z?7fQcM4%0CU2*TGWxMu&QzmByhy3WUk3cPryZlV*nfbwivkd}ct>_BF4 zdF>JPw{@Bo$r;?8NKUwqr}h^*OF+PQKHKj<29OR@Hu-_WEM*^*a5sCuI4y>!GOm8c z)+_)>Zp&_b3V6&li?4Pxg&*e{Mj@BON-p8JY07Lw$|79ihp;LV=Fxo3Z%go@zr^4& zWCwJe3QX!7!QKbDk_;1f_OGnqxDCnAdH5CXqa|FeCtZQx)@sr*sW@bprh)y^Ia2@b zrbDFrp~kmwY=h=wH?^Ov*XSvwSynM)IJ?yJ`UKIv!W^kF=`zJ`j{m1{ii*g$VLalP zJ>rKv2HvL~tH`mwaE4K%2=RT3lyu}lha=&K%gtD2yN80gwwk|h*F0CzFm?%tV2rHAr6hv6aB6pnZ~HifUQiTR{sHCEs_Z;8ji6?0Jn16sZYQWpLJvc{o5E8Y z7OXfB?-#2284ubkP*suMwRy{mKFFJX<(<@0(W5r{KdZJ%>2%vypGfJ@bj^nr0)_y%2Q8*K!+qkqi<+lAC+Vo;p$~$qQCnLvdGShM2Pifn~SYLZ|Id$(i8-U~x=sWN$-f zF?(QA@g7L#lOV{fm#K>WQildA34eOaaT0kFt?@;BA*}gd5Zx$dEa^2|MjVvYk5PCd zEBPplmDv?W+Xc+_#G{`TKpIZNXM&KhAdEBQ)FeCwZ>F^QJB&SJ_O{1$uear+XT9|x zPy>VgP{Mu8(wKr&$@mytf>gC$MHY4@Nf?)eR1B$olNEurc6VNWJ5-0auPXw8{B2#w zVOm*kaAAN#L+FFm&{93VRq0&XM_+=vJI!;v0~|wkIJ#4R1Ubz{iV?;|`>U3ENWH9q zJg)i*6P)U9{yJbry{3^es$M;AyIZ*?eZO2%6gJ0nMHVXk1-x!(M_M)~dE>}yij?(H z!iYfr$ldI$8)hP4yim-5t%q6*Plw-a zQ#{s?;lTx8(=xL_J|=SUq3&ACsVAR?5jve+xY3sN<%UV=Qge#7t-? zDx}yMZx}&ed}`{u$67QOugVEmhmy#`%kSL7_=^WrO-_XVqzxAJ6-`B5xb2_@m;8i3 zJn8u4lYrnv#Kd?ujLWabvUR?6&tGte5|I58?6PZZLFHmOdM@C0mxGnE>=c%!bC^_F zVJ>%Kx)&`d7B9-)Z^$^DnD<^e6U_f1)CoTbzi+qLsiEi&Np;8Gn?rEl!7uH)9Bmi> zzBK8fYcmqt?0TS_5wS5td;89JkzX$-0%9`gV$A1Jd9X-K=v;8UX1Tfo6JgnJxDE^V zwE^yn()C>M@m}^(76@sFF64}kMy?5ih%TV5GXwx1s+_$!RZaU9w<2gJy%n5~+h?tsJeb52RJ6wsbyGDVY zq#A95_?30_UMaSRkGs?(=O)@O0PWj$g;()QR|8OG+Z0(vZa-c#LPxmRe|!EbLi}Ud z!`LyA2QOauYa&i|0Gy3gM=wJ|pxRvl0%)XVpIx?GL^@B4(ij5nG}}*PA8Fb(0AC)@ zsbBx&po~IzcS7dH@dxoIoCIrKp+3e_?C^uvD*q5Zt|b_Cyz>^~(glZtn;B|ykuR{a z&Sv^@uMoUB%YLRdJGm*5xa;JVpWS2|r*ri#6311MBIl%rx0j{~m=i$Y0Ddp%+~G** zM5Ug{y;^$q#~huMp1yLjMm#H}Av?J2x?BgeoN&&nV*2Y->hzNW>c)Lj zxYf$7`?K9$G@`>0b8;_`i7hj=_=+>bU2WNH(e_Y3l=f|P#gY#iq}~$pxcec+oajoc zQ8%hLG@`963+24Jv6&aBk%RE{#w~`253Z4YH3K+~b1aT-P2m zSMdshi4|?obPO&a&PHedV_x6g{;bRoEw;+JYFn#H(pfF89CM+CD`5+2#v=knaf#ET zy2A~nrk^>e&jSC%sT;LFsTm9tpvqf@igKY&4R%#BDw79~8Q|madNCME{Z(AlM~we6 zC6MAR-5p%$GN=W*qSAPyJADB>dELP;S!FoXuW6?ORZGn|n=Mz00~7%s{&xj^(&%kA z=^WcugEHG0^}UM7_!bApwOH!E!7t>8%|Ij;{&!J{3__e04+{@gQ8XB)p^C#IU?cW= z?O8FHr>0|;mx;LFh3R$6kkE;MPU(-<`sq*6ofI7m9;9j)F-^#oc-j$_vu3K4!|-FK z`=4$?kvaZx6BE&x$z()bPvSdG=^@rV*6HJ3zc+?t@dJ;IC_%M8$_KIdUju_dKEu{y z{l8XO5-4AL)z4a(x*&RVYshK`P*ApjByA%Fvzbz+xa1>MDhc; zHw!IOR1ECco)<}anS}I8S?A(x>%(2*%Vxj8ytT1vj2o}4Aqnw8{d)36vz>&;UYAvs z$@-naz?zfk&!E?tol^heGJl*=_ID$a7wJu=qx}(g#RP6k+&Iu$Ia+Ss4IGr_n^9sm z&p&Z^9*#f#LyBwZ^QcSCbtMsrbBNmQjEHeiB>74sI%~02)hDJo3Cf%IxVe*)FB&#r zXFY3sX&5USqFZ-p-;fUPuN5>5R_J3)u@%%zUSM9X zY2B_+I@V-L_5~&)Kbh2AHPPBPc>IrHDSCJz*l1Y+HuG91RG5}`W+aFqzACutS4_MX z53h+_E^i}Oc7AFt)o$Em^Wkizz|&EBa5-n7BR1{`P=mqfAiC{%QG#V zXxM7F#cjuz=j(CbzCgmS@jf^i#3-f+c%R>rw!34A@Mt*=ZhE>SMd3mJpH-x)^-RwH zQs-=W8=|ykOarL3Ey^kb#mni~s>O&JaHRp$u~FUwk^h{UN<3{o2vFT`(FQk z2Sm+0BBeuX?XGwts*?D5J4$GSl9hv#Ay|CzQeqYW*UFJ4&08^p`>4Gj#1~lo$tvAi z-)}AC6@U8w5tNtNGNcbmXwx%p{}zZISwjAYWw%F?(DrG=p7q|g_ZHCJ*X6#_ipi@l zT8z30v%KK63bbIdv5_{EdPUk6QL<8l4U!)obpa)MSlcfyW-32854)Y`E2iAq^Hth4iLe% zr~2RFOdC)s#;l`uU@AEAYmF^}ra!2fSr>*_*gUh{n6Om*DT%FUr-! zle5Y!ykYT?pNJ~u&cIENdJ(5T#l9QJ5v4?p$7xOeEigGY^S0HUCx^HMq|uS1J8u}_ z5f*D(rNl}s6H$;K%r+fSt2(WFHH=znF3gyX;&zZ-uD*Ftwye(l_?!9R$i24Fitf>qLYCOe&$jCIAD3`M{lpUSdq!>8IUR0_FjFWL5P?b>_T z{S;2Vp2+5q&Ui-Lh4|~9iZQ%MXdTtle`e=c+-qWmEH{mQ?N0ZzRp8A1RCJ}OtIssr zd_j1JCI1eV?*!_(AVl%1>`I2+Dl*4lS@6-nz<;q}e9R_(Eh7e21p+;8Jr{!8BYu&J zAxxo1?<&)Vg?^u!J7J%jXNxEW9>I86KjMCUI$(_9gUvmv$x-bXWps{FAUlr_eP(>m z8Wwn6MdEXN`)C3mn&4#c+%2W*l}X@F?vnX=+V<>4o1TT|O-jFUgc<22lA%5XJ6&4$ zGJa7pHH8(5e?{QYMTiYQ4iu6UGGuj3x3X4xHScqu-R%JcMskz-ir~97tey8Y6`%h< z3cuA}rgY!MtLhZ;W~h%O*~PNN&Ilo%#leI&L;5|uAR;-CoGkj+(QJeAgj)0HvSjad zPdCq+w(RFv%$<{E1O@?AKd`=J2SPm0jnSC0fEA}NW>UtiUPR$}yUjk`f6hCQ;pZLh zSa<;G>d!OXt0gBcbl*B)KA5g)Cup=RdW>#Ef1$xEOrzsFXV2X_xsM0*4%Ywt>4|=c zAlj#X*p=4YPXh$2ad=t%?}6V$p*E8ZMHLPlwN>#fwm(!JTWKN=O1K z5VcpUA~UCoZy7>&lK-3h|;KY?}EW%KSk`gkKrJhS_f(wk)9 zo9lkjZ3h{7!p{DOs-7b^#35Y}%PFM?C%VL&`H4KPW4JtFNJ7gxFw<^(7kuUTxUu8l z+UKN=qyXeGL5g$P8anFAd{*t)>(bA3{d-6Jx=|T|`nHO?5=hg%L#P)VAk@NobvQ&hKOtT&A$LWTcyh}VWWck(M3hCXk0*e_UJTM zi}m>YA9tgHHrAkzSG<1`mOYo~8TtP1TG9>wo%vWQxqkKK%+pER4qRIU1=DWs27m~k zQ97Rm^D3_98hRGiBx^k2xZAY;C+p|8_1M`UsRhp0^O3{aPr5IUi*7d#{yw zjy_$ym$DzG^~7QIr|CUDCSl`-jh?^{lN&7yYJGasUmkdhlyjh$H9arSuiU9qUz zLtp3xRgI`iqPNrg7R#l;((qLci=6Ak;~#{UWoxq_h6V;gzfU;XP@j{(+}) z{!R6x3`M0v)D!rS(1+sio|8TCyHmPn_h!4(OmYx@qI%1#)EQl=l^3(p5$&PHN9<%m zAJPhYiA1QD+7A#+nh$PJ%&XSicNIM&dwAg2owV;DwG!N}A?J9>dMQLN|E$c4mQsY2<>6t)64ch*QgOmvLXeHM?Zx|ejG@_tapPHr*!V@rY3n~1`XrIEJ^ z>up0kl!&M$BFPYaM-Hjde9S`jnXadC=B`M%la5OcFlw%8PiIPn}*hC3rnUFh#W| zlsCcB;^)o(mC_;2_MaH%*{0jn4uQBz%&u=BjZvTztNdUSz^(k7?ZDIQ8v8S#K2?G4!eBOpKQKq)CPU>)avvs=Y@hYb^oHFNHP0yE0 z5NGb4m0uqD0tSgP(pVp~$SPIv3Du$;EQKCy;C;Q!e;_I*W_#cdEPuTxo_akKVW+QM zo4@SZ{#FG7&N4C1lmm)mzkx$@TvQE7l3m?Jyt5& z2T~C=D-7DqM!gSa%Q_&-3rw0vKX0frKIPcs^gq3P7_RdWlCYsM`B$ZI065Zj4gi~U zd#qj5X#nyMvYQo%2b5n*S`lF$WcITv0x&2ScK-h#V8x6cF&DS)0K8rRWn3W3nqg{p z^n%OXGWKc|tk2Rz>U@lTE5&~0p*u|Ctnj?&9gLZZ5}>X;i@e)*yGUmxDp&G9Z}e{; z0CW_3{Ng7l5|q61@-;wSZ5VDXu3|M_K4h7a0yN18yp(zyfIn(kdeIaIj$FRFYi6G! zoc#kZZUmMPt$&LHwF5?kq!wCwjk9hkJm8)V5jS0@du~7@y*Art4P0#-3EioFy*X>C zE6pkAR@i=~b~jsdGK$tQ|;qeyqJ>h7)X7~1HVfUD=LHV?TI4sf^G=D z_t;r3^zt07os0)pq^d~dA$;wFU4Ajn{=jntb>EE!v>MlGO#h(FaX0$ah4$nf9sMr)N$0?DVjn(?(9bAhPL= zlvKCcR+9ni1l_Az&APEk+9VyTcxs(FDDbR6+A52Z|U9GwVLBC8!oM9 zcs4gD_-{nPwTFWuinq{DKa$mRfpT(?PA+2()Gxf ziPtc>7enw6yRSPF4Ow@%Z^wnjZIFI11>5RFpR*vMW<}v z*Ql2Pr30$;T7})fid!w|mBXQ^yQfB2xoYoS2lYC&N3~z|OiLcM4tHF0z@&I)C(Pm^ z%$(6WUko7BZI@b$km=Y`#&=|Tw>6=F)e1-72>`gMW%UbUBQr<*XOwN9QY07BP zRud1186^=v9aOIUP#1j3QPODA54ndDT~Qi*;ll5ES|Rr47}@;KMj!kynJz{nYN!f*Hg3T-^R3*6cQ<3nP&EL$P6s*F zeD*#$8IaCPPPY}Wmr}a@pgzYuDg1V7^l_-j*P(Z92%kS@`nlV7y+r-}27vW>+8n;k zM0|Ce%_{Jj^t}XnI;|?I&dEFl{OMNpNxAE%62;TTS>24i+v&@!UU9O-aS9Qe?>qAU zC$_ZsRKLejz16K>dQjto@vt^u^}cREEW56HSBUIQUzh1qC+>}R+(5AJWnsrP{FERa zs=MHt+=}U76UxHr`{lX~b}6>?d_6$wNyf|SrVLuf><=D#Pw_efd4;9#3je$mbIrg8 zPaU<8Fu9F8Wq2;FcuGvJU}vFjeGTo-A7Cj@Z$DC%JT3ka-mGRLXHN9447*Oz;c7tH zbcM3+xI6-DM3N%RIP=1BYcHvM;pZ75CLU94&)B`57g*ff18j3J*du9|1yj1`i_%=V zIpCHf{_b(EsmT4e<|N0XDL>T|Yl?0aiV;4RNqy4C}Cf(`Qe)fY#l8|SqeQw#&n z>dd-y<6Dh`E7VA;@d4YO}>_-jz!!fSDq0YF#wraZUuAoS#M;=d>Tg2asL{<&mh z(#yv&g36^4lZd%c{IMK*jr*kPb3pF z#|Byy)NfGtC9H*v%c@-_OucoZ-So(sxb z$c5Bce9mllHAaQzKT_kDcVLOFfpt?;%W-o_9=~W+WtO~@2=)bg>-r_wtD8Y-#j~Pq zKH<;4`@=*JGEbNI>RFA?QEv#kiyzJdHEeC3)m=Kp2@SiJXZ(b?tC`i}?_2d8rKR+p zauR1*b=C+03@K&{uzi^j;LT>$dVuPNSDvi@Hozq_khc>tElTB3@Vh zm|H7~lz$bG*ToQi!yTsYfTRK6UJERF9B}3b+Qx%(dXM`kP7tVjg&$RE7WAO`P};|& ztGtKH?z3qowDpX@7~xR-eBll>ca^Vpm`n!mP9)^k$Uv7EPZ1{gIrG`;e>`N4tKQ<= zwHpy7Rw)L4@X#4f-fNwdkEbCR~gSvyoLnN_o{YMU|SbP%Z zfhlR-T|E{#=F3f%7aPKtY3vTod`%0^&x|qI9i(WHn0&95Mjg1jKS+p6rbG6ENnU~~ zGyI{~v7Yo3`Tm;EL|Fe|hg+SO+C?ZL?t1kE<5l`VfC=0XG& z)Gt?;3>!HReJ#}Y{or#J7pjBGJ#?%!%Va=x#rqfTAp_=7Y!Fxm7R%RAH@tfIW)^al0l^_P9wj@r~30y#KE zp@pE4_n{;WBNqY5C2|IT-M{w`5FNg;kRN%xom9iOxS|gSJ1xa<)D8$uxl}Sv&t_oU zt5tfcD>Zj>Q7rEbHqWU{eAj59$WY~IYEj%~(Jb|Av`!o~TCw^Zvdln`CoK$3W_=AX6i6Q*>u>N8f+i>PO*NT=Z}Cz=C@3hloZ4X&L8FN-Rh~xhmbtS`Ja`G;=4f{<>ZuQ{xvG~_PO#T7{hspSPF_BNQui`pqhX%N4S3MImLFc2cX&#;5Ijhsuq(yeS{CR0Egx=Pd%OA zh{Uni=Cg`*s%Nnkc{3iGn<( z{@dXrX2E|d;rt|!F(GLiYrtjV$#ya|k-(+vf$Eny-2=$<|9|}1MgK8`B{&^x`)YP< z*8%qS(@0=er`f)*zM{B6HWA?iFo+I^uP;~7|I(U$Is|45@g?s!Br=ar4Eu06`df{V zi(XX)GTM*(=EqOciLKvIi#zr0j0tYk{Qob%+|x90-pUV;$lfqSDTg)~*fhTn;Th>b zixs4vCP95r9THBrr(AXUZ<{uEuHumAbgkGraOSc|Sc~*3vfQ=*FX5wqGGi3ao}C@L z;^>-PoQ!tVmpzb^Qxe!<00o*?&Nxky%CIj)_S!aJ{?U7GvR(_Jpy{d20WSah%}%oE z+V7qUZwPZQ$E3>SEfJL!?EonY%~2B6Ub}g)F&bBH=&;02}lchqKG!`gC_$$@vDai4gN<^G*~-KofGu6nD9 z(27?Zj&px)JwQnezdTORwF;on@;>(lPDb#)LqEcz?D`$YmP1;KO|oE*3V#jw+WIKC z!HW)YGs<7b1D#-zjR}P`T*$a{Sr0rwoC$K%A|~Y-v#C8D0_}Hn3Kw)}5hVFGSc!!$ zP2XqRv?KjI`=_vJ(iP4O!K(fdWpy>8UF6$4;J@f3)`&tU0`K_i5)!BicqBouq5RH5 z==(}87f4<9(o~A;;LPJ_Y*1@t!9`#BM3-W%DP1QsKgM&BusZUE5z0WR{ z(5;?&3gkrtjI1_Uo6642yGC55^at+RVKJY5(xeLbPhagf1o}Ci6IH2;rzlj;N3>F? z5D5WJb393FuN5;t`ii^MGEyV{^A{}Jm>Yvg=R(_~ZNJOWn+nfg};!y^-bymQ?IO?SV^U{2@Bv>*eLGRQHT z>{yYv#cen6&_f!w9YF9h&){12*i)5bR^LnzvFiZV$Ux@Sar1CFknk`=bWW?%RS#vo zMs}i=^xM5sdV#G!bZT#a0F&_12h(XJcuIonrh%fz4^!Nk>;1|Egxwn6(t>tI$O6BZB&OdvqY z5}K=NGr`zt+5*yg6#2C4|5OxRMMVeo9(11GE_Dy4d0Ry9i-tE41Jb_MNT(E@Kk`lBc=*7-npF7!?Umrmn54V$YaZ$LY{G4Y{n2%i}- zxc`W=_j3?B6AivUb!#Brv~jgaSOutW=s~c@!L2)~5GdH2xd{ryX6^GY+O)Wx#>j-y z8hTHw8;RzLj^~OkZ{f;tmYe-!5`>VxH~Yz0)!=`ieFWom{1690zj#~Rc#z{ zZSsY}$`uHq)o$ZXl`!|9oWFL60%+7?ijvPk7m_qpQyoAMStY(N7}UB=WcO;~wgvd9 zy{@zk$;iF-PT56|xg*J#S1hL^5MKQ)$OH}MPLoeAV&1;%+dU^32X1TBg=>U;*omj0V zcq)&BjF^QZTW@`t^;6|wxia+?lW(+!qT=z3?}MET+t%ChUiL&hJb@Z()3c9!C^1>`ZvEU{#C+fQnlHu-pi@`O1pkTjro_z%4CTClid<# zIFi$ z469uRzVa4ln-UINOw8EIA4PH3%&mH38j&afl`!1w|pFZM72`0A4d12eA*WhR4F#3JGL4Lh=E8N8JkYFuu==p_CcK#p;q6ff5eUi4mxixZtlQp zDmntVGB5JZ9_XBY$k8|tbxSzyzLQZ|Q{NoaS#zFsq|S}8aIXj{T$ldMQ3!b?a{rQA z@X6ZivqJt_&5IIl=2s$0Pv*FWxTMgnfpbO}RR7*g7CL4>|)_vXAOHw#SmF@0|jZ-VE`Lsa9tVn#Qf| z6ms#K@81?Wum>Ff_r8E`kKSaLzz!Q4O!~UE9~^;DYjTGbfX{Ai2YL%{c0OSCI`IX( zeQ&j^pL<-yX56}Uqb`>tXveE}3l?-dmk(AdfoUX=GNcQ<(yi|9gXaJsEpeMg;nFcZ zei;U1=UdY?YD2u{*WbF#UTepjngpV$+^Y_5g4mheQT^gyOJ34g%1s$)Vom}j+&Xi_ z`6M2>!Ao#Rf5`u4Xn-#^AB-sjpqxeDkre*)(>lv z#@k7Es?Toe%Is)D?cYpA%Q3q5P|B6-w`^yJz7^fz$#{D$CCgbTZL93?_U_3D;GUcV zN-m?xeBZw1yillj$#{r=f~B}kID53DYu9uc9qIM_7vRhHxvDW=f#4Q^HiOYe4gV(s zjN7i$NXxR>3{9kCExaZ}-|0Wq5IP@oZNtDQe0pHc;~z-U+_&i-Q~@}YPU~~18E#P7 zr_~N43}%-Lz02thd?TaBu93@GA5Vn)_Eb7{2N-wiJrOOgfk&XK4W(8!?M;SNL5f`m z_N>ajud%v#PxXc^$-`;YNPcs$pw5OBAkJGfnvC{qzId`Z6S}Kspl#{m=Fu}-Sw z?cuh~lfh>>_0^N`Jwt8Dr|BzS62^BT5<$1XbEpHpWpSKzB?k`!tc-qj`C>RdR;(<1etEF?V%_B6YfHy(azg z!bJ|L8`@nMzEwxwoqq@Odsa-%8ga)YH1|(V$B)Ogjy2W{8k2oH@RV!#wu`08xyQax zw8m>ZPEb^`^Fs!A_#XnrLj#NbnTKyFdp|0*M5ZyTTIGrzJPhqw-p;EwY(+FI?$E3M zt4-VJU;MDCI`W0ydH_>Fg;7M$?C66HFmrx`3|2=kx;9c#ZLcSHrdyjAC$^}*#+)2? z`jwIYz6_D!fp-XeqPxza<%{3@CT2qB^e%n)A??I(cd{0d8WE3{kiUy-(KpxW&CJRA zu-++mVmF4hhtm3I!BJ8}4OE(AACLWZx13(=M3#88{^Z9*x5-T22 z8{E*OwN29-kAKNO-g3(=T-CwcxpP;p+-|@9_FuJX$GLOo#`taH#*MFg{Ye|AH+rqC zh(Nybl`l_EPlwL7+G?xi%a-rF)6O>AbjKZcy!(`QceV^*$&w}8Z@KDd>9wz&-Z)L$iL`doYhS%?{rb?)ym|At-+qT>%a*y?RoARp^U4!n z0YrUQ0+ln?ZtK^b^qO_+*43tV*kOldOP9tM)~s3c%2)oI5VwG=y>IPX|KrV@H*XGS zSiE@2_S*e<4kXsEMC0*_B+(!v?G>2#l*(Q zOH8---gDoVzx+SSF3p=eZ;w6qI^>W;ciMU9*iLiKIcI<6%U`DNJ1j?%^;c#iE?@w8 zC#Um6eAnLt_-fLqHOSlF{r zYu2q_muxU^-uBz?uzdNlV8}IV*1YmnuZX#A6*=>BpZmonzu@t#xO?WNHo2!1HjZI@kk>4#4})%DY)p`HAuH{G-Po`B2L)YQtAE9cGi zd8^BQ{p&Sr?hC`()J01iN<%}|RW@Xe6X5q9x8QU35v_1?tgfiQXU7M1n+>hlG;5qB zYl*YY*5o1ot7IKD1X&-Rb%UV?#-LnXgv6?>J;T+5mMb}4rza(TIo`zI>jAh$yzshT z^}dwnx#G&&Q~_%JcCBmWyS(<5D?GJ^&~;mCutmuyu_6K1yyfqVWuYr%eKPF3hHaF( zVw8GC_C-u)>OqjQWqo6lJj;OjKw~UUc?=H|IH{kD0<4`L*_*{z5fSzLjI&CA54!|5 zDi4SPtu?9VxwM)~&=)caW<)7Ha$X|N_4 zD_5l^(DeZJx3(h~yf+fZ{O;hK4y)g$-fWe|^Ddqn67r}7510&%tKv$0a$2O+52q~< zxK*C(;kFRUP%tmGX1k)=xJw$jE9=PF^ktH)D?<(V9!xC|}xMqhyp zE<(Xu=A1xaCgZ!;U1#1qD|gur9pVs~uj;J)+?eAbY{dMw6?uHe1d2S74-Eaq?2E`x z!tQ|w$|+G3JK%rz#oAZ;UF>qocL~qeP>(O!PM*2rzDd5aK$~_iF`|hveAdhh&tPi7 zy{21l-*pl)w8GVq8wWNd;vH=vXw9ee)iICcd9Luc=I0|g_S|zT9~RsSB;|+S_>vr6 z^LfMepia2?{!`k;W0Q}A5{E(^rtKou1b%3*=C&@JKgplLfy7CSS(1^8y_^&L%!{;3 zIWxlF%Y4Im-r}j-O97GG_hEQbi76+uov_wgf`2^T4fs5A^5E*=Os^Yf0vG>2+;|x= zqMrD%742ERtP1U2Sl-sH7)fIveAJe7)@%rCQMf7s6)3zeOT7+(wGdI4BDFRw>TOhQ zUAp%%Ydn7a>q}qv`qzH)Qy+h5`XP7?52CIqYocmRNY>|gaRv9^_o#*F=+m2~U;Db( zeEqz0<20jz9)R(9{L5cn^5Pf&?H_OZL#;ni=$5|aHLrcuFMjc}&6_ua+fRFJ+3)?A zzr5tcSN`j@*IlD*EwbnP?z{JW?>psP?|eJ=_q*f9%g;IYocFxvo%gT1ALY9WTzB1d z|90ZP-gxs3zCt9N=`o#%)lqo43$h;1>rb}yEtJ#k7`1<2IqNI;-M7XV^4zbV1J;~- z&55wi#OtYS{z|7eZhZA?U;Xv3pEDkhF#$ml0KNB1F1h6I{{C-oyZsLs)_vW5&ppS# z^dElwlOJu`w9&iApN$)*&pP`n$G_z7r#DS2vR^Shy?MNuH6&f3cdfqr_?P~}Pk!>F z*d`qUOiw>_)>&V9$?<Yr=xU1;3*IfPbm!EL?<(J2qPcHL#eDA&Yy#4L}@#U|4 zshlIAP#vSc<*jeN;DYmWpv$cx9Z^FVHEhayl^&BNf4u$nSH9|BW6ybX`|j0uzvtcW zxZs-?lzKT`eb4ISU;2`pZ@SS3x&*^L_pE-)Ti$f_Z?3Y>tlq?owPo|B7&5b7NR_tk z&`n!7i2!K&vMThFU;g66SN-cX*Icbd8}?E|>^t81cB{{HpBj%{W12O(9sR3kedWXx z|MiYL?ije0>Ucc9_uhL>KKb9z{KDr4^*M-oEw44Q&&PcWI~es&wKhh#@F)b0vY&D9 z=wt2w{>In;&lkV2e*L=YKBlXSe|GUdyyV3<-h7kUGqWiB?1AYAUiR{T`pJ)fxMjrv^O{7>p!i_W$73mw|WX=|@lD{VSX#w zlwSj%W)v-0HCtGcFwx)4&BSUoLnm(NalxncJ8Cs0YZ^1&*>ExXQqMIYuC%lhc^d6f z&m*XH%f)}oGaXs`jqp>$cIw&fo{LbP&-8)~Kf4FLa3F1w{-V$^F_ZD#bUyGk_nojs zJs%AQX$!Yw__*icuIl9Ef{mi*(4hwQ z7?(A0TXc(vUu-AhPV$%z@+J2#mzi;7jE+)UTh3*$_~pKj;Ta;HnE87rZ4u)L@+u<6 zc@49lG2sEr+UC2uj)TKNe}qoPqr?*N3Cf9HF)ZM_65A$ZIhVxsKh78wb^ggeLmuwM zj)5`FK0?V?8a4`kh_eh#wz2my`WrSa{biR2pBqoc85tR;Xm{cHDKe}wON*k$KHei9$Z@LPP?W(I9FDHqV=yRiak_K@V!k9o|$ z|NEQFhJW*%XW6@!Y`x^b0}oobaN(VI-F59X*G^AAgrd)))uMdWm`*93{7k*WP;|mM|Nr zaDoRWAO~Q@wkr-g=%8^QU;UeF?z;QViqe9^;>)w?u)-jmj)tj{WKZKix7~KzJ@?vc z*|KF1Jn+CZ*Id1N^*vII7^Easa@C!8*=4Ui_nbR_-s-zoUwiE}8`f`_Nj~`^RS{XW zC3Yl{5Pwcmc*AFsdu`psLm%wnVB!lTh>&%O8B zZI|7~<1N=*bM5W7{}F>1xwQwqD<%#zQJ~@*5k-8(X#k|6afj0clLz@@K+EiEF>z(E z0nfPCOz4>ns80547;&--L-|vtV(W0O=u3V3Br?k!#>8V`smWM2BkolFrN{BRGtp8w zb0Ws&i*!cxoRDy)qA;6UFoR2LAfB}2EJ1wGtj>7#gidBgf(XZ^>BkfhJhJG%`Tx zppOx8LcfU$QqVwYm`%=j^)Mep$$@7?#+eUSMjgIIhyNs~_^p&-mWbmGx?53!qxG+o9zD=c z^gRWsnZwNJJVEk0TU?G0cim%e0PjELZA+IfUA%blym@oy&6_thHPzZ^YHB1RqtPgO z=h>$%U)bon_iiKV&6_t*PfwQ-^~q5D_LdubmPlkqbqAt`qz~`$Yr~sVd$}tzS}XNt zrtxSezgyqJil78~)J^rW%YUpGiT~S&(w2GyjDT_6DVOr2RuQxrH&>VUVwQdZrOG9K zul>@=7JycDYj05;{OCu&@r`db8$J6u$MRh=A!kE=GUM%N!<$HTQdbkb8%QfzgE8n` ztuf0Anf$I!)V&wI&8ml#q4Wqd?pDQ2>le$;?8QuN$P5(8u(lJkYN^UUXwAKU@{?kn zK_6>h&id-t%pu?R{`da;;)`Zr9%E|0^mIZ(oq>VbwOZfXpkv}~W`7?B?E}jWZB+bs z7EaLF@ELv4KEpf4&{1t!b;5I7*0N$I=BqXy4ktmSGwg!6fwSU)l1zLH6J9VxIBM?- zAL>jlDmq7bexU7{T-OSB%|PJ5UuM{gEImXoz4+mHEcI;6*=O-+%o*Zgv;3M^> z^mt~1k*JxOv7puo4|P7MC5uxw{(tdOJX2XNG*C2&8LeS}pP9NUTrpA2HQ_rmeb8fZ zTJYhRVFH4%P%1E*ML7 z2E1){naLhAd1LV81oO}I2(90$RvTtJlUe<2Ts;%FlbV@@8z0toGMjAraDAVdC-1(; zBLRK?DgU`_*|J587R{eOZ_b=KbLPwuX;V|9)>>;V<^iUB)DE8%pO|up4}DEVz=W>ox$_|j9TI&e8x_kvDz3kbM<8eT^MQHUjCl-YKv`|)#1GO?N!2mmod zr5;?~m`f3;G#Pa$>>VNVm8Pas@-rPihe}XetVbs*L;uA1U~u9!$0IjA16RYR|}wck#O*wyA&GI`o6kzk;8u zbci%Siw*?>>fCTUIddthXohoy-T)a<9{;>)OMSvlqoA*)%wolU#gFJ;fq$zqiM}W1 zoBBzK_4BGvjGA;c-}E|W2fDPNCsD({RNpE7Vm#7vhPO#qH9jyIRQ*mxb-fWM){c(c z??L|I0H8ZHhaM1imw4W)YZS?2jXH;@V$@pavcX7-9;{#H3;ug>f~&BJbk3>@LWba_ z2C*O+&xB1?s!nXcH?S|$UPSCr)&j!$%J4K{JFh?uuD0)1&T&0M z!bZWR9urm3T8SyvcagAN$(=HePvTP>8chEM!=7(6wA5|z%p@MjhXTpiTKzHlE`W?Y zcWT52~Oxy{AuX#7W)Dx zKKQ1M=;NN7IZQ@^am}^3Mw_uoWz@)fbzI||HQ|qmd2#)w9GcORQ5^U@+i zL+crX%#Om}?F_7k{*dM0BM*nx9i*H{Z>6KJN1Y0D1v_jW`do1zQl9IMJeX4kDf@Ak6i;oq(DTd{%L zi+anujD6xk(GfZq*KK#0n7sfLY*^M1Hl_X@DXN`xEPj7ucOB9e{9KC;0rAwq2WXm_ z7HUc)@SuP+Mdys0>A`qI3T7HDr`dO%z-=31bxhM$Ig32@xr3#AmzGskKvQp^T@*m; z?qBga2N&@!8QRD&890Pw-zkr(`sAXtuH8WgDYYY#xE0|w>kvrq3I~Y$j{8f|fBAi= zx9a-?jH&0{=GWYiQ~K4)^Gz{U_w0C=>xb zvvQPS&%dkcCy-kXLp%fY(*bTpfL^#1%_q&=7M(-K;7m&k3O=o!v~R&}FMi?MvVyxb zZ70+%#O511bwb;@-jYkDsdndtp?wPn)_(bWRYmx@z_~Ph-1*H?A1!tlzXUt&81ZG$ zKHsZ8z%&lYXEgYs=wGRGQS|gX#mHONu4u{I8T*`*;dCV08Bvs6SL0yy1qgyAH8`Yj zl&E&<%D*cvo2Y7w_tL(BZN`*{#ng#}Z0=uLaH1I(j1S!@6e?qo$DAK5=dl{Uk`K_2 zw6kCIi}XPqayt|{>NEQYz;tdH=)vH{?g9bEow3Q%Q)|Dw7Y%sZ^lZOsch z%+!=gvg0cKWf0dSbAyOe=@$}yow@?+Elb=)pTH+z*yuhkNBD&f<27+BfJUxD+4%o+ z%e&(g@{#wI~i8QY1}E<<^qF&dczfcjSe7^C2p zh;eLma_j`ZIaY0mSUEHDfs$YKK~Cs-nihUGT$NZHnCUviGd%8ebk8Sg(c~G}0K!)I z6DPFAEHO0rAKs?_R5VgSfotLEEW2WDaw zV;n`7G1QIhF@ikob?vi_iTJzw7u0o<{UZNVn+{_^#uw%lZl%zPk~hHkLYYg9E-`eF z^N1Qk(_V%DL+6Ft*%ywLyfY(6j4x*7f%KO#mfA33d8|uMAtRE3g@tEN|#O$)$+d zctFJO`w{mPUr?~oKZ9A$)+x8y@Xz8JYN9~n{y0;DPeh9fa@em7uWl^vhVwR?_XV6K zh*6+VRdD-0pMtW##HMwOOF^|A0HVE224y7xuQ`FTzdrZu-sn>_e1&g};RoDm;W{+s zAy!U(kPE*nLHHFB;r>d_YO@`?a)Wk?3GlEH0n1m2-xJ|8>=BQ^&n?QRzc==?_&~|5 zW+H-umv=~$?wbj01}kx*q&@rGXwZ!6Z8Q+8BGrzuGA9DKU5wx&F@R`qZm*bhlF+}< zQjyOz2MA|p(_X|y%4yFS=&UbJ$tt1Gc&7n{TQ8jV4MaY-DpK|1+NR&B*h!BJg|WC> zaN?@xj+2;d^_kR`52gd>{!?2;@ws(z{3v`Tm_2C-`6rrl9EQF4W9=vS0Tr~yoLSOC zt<8Mij-d?wliWp$9|_=#ps;n5z=`d;f~{=v;U@9-0VkL~#W{(t%s#e+b5`cWf{mY4 zY7Ep7>I!(eJ_Aur zgxIhlj@XR2Q(43*33hR7Ca;nQ2ph&hh`8Q@pDi>qy11=vK_|qHn9_rXh3v!$huk5A zi1uIxXS<_3?QhhNO6fI9oI)@+d9U!Z2F6_f9#a@&0iZXxBlB^ORrD`ci+`!v2&2yM zd(5iuipGim(h7B++(vyeKXKgp3XQ?Z;!X@UxY#D#@hyP?0Yj+*V&84yeRe;psw#cR zMWfM?*7zRCE^e4t`%{4M-9;)`#HAvYS=cjq*|e)znbOBm#9Jgsrxcz|Pv zAh+OZf1Yta^0DUemxinPWUz$iIm83f9U$n9i@WTvho#VS8|Ll9L?+%sy%nA}eFnUX zd3<)d&?e}JK1Y-ZKIH`WSlNKb^c}H`dI&$`JV0#)fVU$VW?cWFPYwQ$IO5$YzTbRD zf8Zp?7aZ^<|HC$aNa|T5nNV)380PK4hc-^3hM2#J#g3dRcg~ExuMs)YE?^oifh%Qt z6MC@y&KyogXvRpO)qw1GEHe)g;ZjZ2r(>vXPjG-8UvLHyq6J!@P!-&MX$0l$e?5R4B`UViY%~IHR{x0SIPZC$D%>eYSyY9T>&N~21 zPfsgQ?$CBd^E?7^|C`N93g2Qq24T}lsW=Ub@Oe)%h+b>0``bOK(Fw%PtY#sKLO)Wxsp5a)UtdTtsd&e! zl$%}22L49Qjsr5I!pbBUAA$71$t+w%#42snB=`ZG!^>XRnlTZSIer>GsP(Qj zeg*RsFR=awYb9@t%MH>)o-|Jn&!RrPkSRPd;!b5k@{coZ)GBMq8G7(!i5-Cundy}! zUm|XKlXf3GAGNG5=NNHkc)?p{Pzd`bS_DPTh%BA4+wYyO8Ij)%%oy6(PTo9U;<6WA zP38lEsEDvtp5SD!$c;GS{USqhCfNKgV|TSz<~9;+DZ@w+9#rM*C9Vl?9yTT^S&H={ zveTT~NQMEUMxdo;$VlJR$OiLU=yqqjhCc>R3JUU765FAlK%F3RMV=6W0rrR%;qpky zKS!BUJ3pX!M6teeg+wL!fXDoeY`J__5qFz=tnqw4_aL^Rgyml1^jVaw2FM++f!-2% zD}G8orhG3W7kMW4Xs|C`Cz!l&EXOIfhekQZiE&fer8tS_0avF!sWFad99uEcseFi; ztRiXUHuQyz`wC+Vaqr_TTejHAWE(bYxbMFE zUj4ea0Ql{#H|Us)FsyS>09h;Ruyq)i;5JsTLJQ3fqj2@LCJAK1w`$R9F9J38C%TArymoOnj4L*gp?Zn%Q_!8a1KHBH7PzdlxOH)ooiP^nFoF`p7ogsGFp5pXT~OM zI>Zm{i%Cu>*kjO!7Jqi%46cB(L*Ac)C4b(bK&<*_>5rj*6UY3q@J3)MbQL%h>L>ae zoKS3`VyXQA!&-gB_1tL~?=Pv`xJxAXN~y!5EB8U#LZOh6zqiV-sguxE@T3+U4*QVJ~6{+qzJnQ_FxhX`#!&}dS2$-z%w=9x;xdN#pWtfxEGqw0 zJQRMWjWmZ%6Ee#Xw`L3ep7G*gVx0PvTgn`HRPexLoE^$G$f*hkWH!dGBQ02|Q2ec4j_f@>G0A z9A~aF(Wc8b;EjR*>M$1~Hio~~_sVR!O88pHFf*?k`d6{FwePb8gM45j289m8zK~+C zz;oDoVAIHFs-6d9nd&2TOynFMctGYb@p;X+g9oH=<}endeP<#(`;gM3L{9}{_F$q&LT13-Mhw`eJOkQS*IahL&Exj)-}Q0ovga59kP~vaqSLt)p`MK zhjJ__tQ%CfS4m0%epl2dIHT^uAUjg-9FL)i7Dr=IV&&nT>X+vjr)dR>ir@;Ro@17g2}oexKDQ%t0-t3Sa= z;f!M&ah!eNenCEw;&+j_iKgDFthi|SEr9dRF#Lq7;a1A z-Jx8dC^)g&YzdqU>)GfFv+$U*oyt*}_-O#P)|&d@SQN^$HW)VrHhVodYoPmi1hxoA z-!%WV#m2;g`4rERh|jI>rPh(j8siSZ5oZuct+x!mA|B|ch+09|*#w2th#Bb;=PU#U z9OrI}+TWa@=&FN3I?stv=%~cmrcBagLQV-=GhtR_--91KM;e~Tk#&XxpY@vF?s1b# zCH3r&v{%;Fb_GUk-)kn_M&To>L+qtI!Z;p0Pey1@M7!Cb`XI^N; z7m&~0UufT=x8lpGL-&{Pzi?kb_u4|;>-3f#`^AY zSu}G$p?->e3x^;XG0v?J6r3ZuU3FB>7f3{wT68VX8*fB)YH$lYfA&~EQ_%`ych<%xBf%V?*cg1HlV@i=B^YDl}%*Td00S9q$9)}SB?supht56YNsbfxS zvDF_fwYw8Ita(EC1?9=W;`xKrx_9p_^~rdVb=rYpPl4z!HCG8dq&~?%kxNH>caN_* zFk^xHW1RaF`Jv|T6IhDxW{w2nA-K!yu7&RfLeE2d4)o^M%QLzB>=MZ_UBo+ye5vH# z!}Ao9hjox!+SsSy#NHZFoOvvmtLJVE-tgG_d~$BdAugIlvv1QInI3RRsn!-4vBM8SPu@7R38*PorXhTcQdQ%t?GkreHuJBShMc z*sjUOIbbegL~UCtLm;e>Q9!*&#^27;PZV6`d4Bxd6Cu}mA~Jrd29`h@vFAC{sMLdr zM@DOz(FEL&;~0>TWb$3AR@`cOhyoy?-BD3$jj%wg$Qgcz>PK0R#5GrU*1_|%tvzq@ z2wHr{^&D*uez@S*s1e_|XlnI3Al7Xz9Rp4cfu}}v4gIu6L0}N!fC`R30?xbM%4rc@?GBV z;UNVrrj<)gtmh)+4HIrw$gg5(cOK6{@$74bmq_H1|M)xXhm{5^ll=@v8Q;f2@J20TgqA;m=Mve`mvl*d6Y!npJ5lmDFIj=r&8*F7$#NY zlTvLJl`4D}gy-*>lDd62H@(`Bx9+4*IU96vx2=RE$l5lW4FaMDL;Myvt8kF9_B`6b zonGTz_DttItEJvDsLF6HDPWU1^+wY{bz;^j`8JS2Ek{&mi9|JvX5E_C%qV17Yn>}s zQESaMlfQd`RQYcGM7rPENH_wWrx}9*#_=Eni&tF@-yV9cCO1Bb;{b?jC!lqSXkO9dg$tQ!6j){m+Z zr9Sz2oGFlDbtoaS?#O><&8H9M;M2dw7HKaoU#m!|ONW#i=Fn241+|j4RMBXh7gYPD zM6wL(_OtrVC9#2QR@Z2&8k6ir^))7#LuSZ|EPJwd*14tjI7Hx_rV?Wlw^Qa@B>(E( zG{BXXTB%xljM}fTdl%xCcpi9AtGkg~6IY-XZB6OyAGZv_n-^qAc71nA`)8hhrqWP`# zh(tTj^`K=V9!1S60%;K?Rcb|O@y(12R$+^Zy5Q{+?*?oz;rqpQ>Gk!ENKWv4xz_0w zY{&D^0n%p1Xm#uR=kbgd{?S@@N}J|tSmE=WU}bb0oB=_e88BPLWaI-yZ?XM6PV^Ym z<<|bTM1`Xz>W~W~l^jFS{bW?I5;dYQ{9vuZ8v|d+Xi_~(QgW-09mdd>(K8|fS!L!K z2Y?LDFBs^#hcA>qMphI4f~>7Y@e8#UQgY|a$n!NOj0QYeyllen=#@2|4t#kg2NraZ zEm@76EbUdelaaB!y==0EK(+H)!^DZVFmV27*0` zzf%K}m~WA3512EpGlq^*&dS@a2V{O&P*JP3gPAoe@L5?}nIzbLfJXKLHUzbql*!0g za)ZK_NFU@|1R&$ZNiJa{+FGd9@V?4vk-cQ@ZITV&$f#7jL#Q9^iAiTsTZ`>kKIr*R z8SkXMV)R^M4SOUtvm#0*qkzQ=d>8DMx|M@>0r%UugoF$=2k%k!x4dg57iqD|Va_Dgl>HQ9nB+r+6lCHhdZ$+0k$ zLdCy6qOPOuS%2!Z2&5UXMFdSobQYCddqk6wFLf(?2q+!^Q~>`y?k-av<<>x`8Yq4I zZimaNsED`k_XeArS?bPvYk9CmOgnh{fUQ*UeqDQ4X~ze$O=5RGTLj}#0MbGy*$I0b3$73{j3HbVZGiADSt)j(yaUrPmiILJAQ(J^+fL7kyAxv$ zT{>qFd50Mr;el*{YzjBX}kQ~R}S-DXkjX4^K9kbOL5%_V0Q@uKEY7$$>jQp z*Dj`Ad@HjW4t;*j<&==$mm(AM@Y+hQ5w=`?M)<7xlo28ZZTh8R;`Vi04E%I7X|KSf zB+r-vbEd;iIlC}iE6>h*jVyjU!NK=XRCN4ZXsg#+p8oOg?{qB>$C;zE>jMC zhykCZGky)f%X@v9^tQ?gNWIxGoxYZS(J*3vm9~H?TCz;=17d4z#6*t;BEe~eCwb3v`c&9O_`9LP z{Lirw{8KnK4b!z=G3rymuL666^lHofV7;TW@JAg|k0@m5cm&h6TE;Qnn{w_m4 zB;F$b?9TCU{ugMT10w3H%mU)yV+8fiJFbUZ%5jMBdP5Pv>o#$&iNZ= zBA=Pe8yN=@=dJP&n1{HHtiRe?TvL=h$yll61l#l;d69;miHE`oT721`sq!H5go3fu zbBT$TQ5ipAB+|Jnq%qcDaArsFNr}r!u1L&qyg6NuEu9mY%<3GpEcB#H7&mW06>Q|pQR4LzUxVaL{&%b zrx%TTT-`}k!G;vd38BHgzMV%2L-@S6Ijk3=dIt3m6VC_+eKc~*zLc6njT$OIrH9Pm z^Ahctp*cyQ3a}jjV6CG7UZ>~%V*Nl@)Vn>~;P=ouq~7b>(erm5i-&EiE2eC*x;5xy zsezeUhl!#7rSx68cGe&v@Zb?X@6fCFzM8HiG3I?4)RULm8x<{wYPrT0GulaeP1N5? zv=7#?m>wK&^^V*beJs8Zdh78!B{$OyyALsAQAA2@o(&hkc0{;h)?6-d_D$Vo=nT3C|8FoHNjmXN%4` zE?dU9;eF}SK^tlK*WjFyye||8EU9A&aG$k1#+82L?O0W%^F}$3p!^>3R3U@2Q3igI zwvK!t^=U%+nJfZw9nAL!b}4)tHP4X)xM!yfUbC%L9y5%8-VyJ0exC4gI!DA8fyXHc zn;PCc*4qqd@n6I_DWR*O4owdczXsf!?I*@mvtGKBb0R6#!UMIo8AVqJT)A(Oe=K@q_(C^af18yJI=c_N_#vRfAe8gqir86!da31+X$=?{`?5SFt z8cdDJ_&X8%X6j$c9l4yO^xr4*F8foQHQ>{u%panDJ7cR>nH3n7GkWYipyH>gw~pGT z6IQJirw+pwp3+R7GZJ~i5Hq6U6WAqc;?_?h|=+(Z4_AnN-Gw%60X85ZA5L z_L;9rVo$-uWSF1C_^8DFjLR`S6gg_t)#n)jq7~Z+86>zg@iv3chv&1@b4K#Kq~bfG z%mKP4K10v&0l{SM>iEI9+dx}2&bBa_!HH!^?-|E4->zI&FdTV;(0AyMOgbz{8EoRl zjGw`XIu@(zLUx2~IO#Nrd+Jntm%pztDF|$v6sD-g;3PRWFbj{$=jM?0{x?Bv7!={I zLhFh_$+jZI0#5`W8wEy@24Cy5Zk$~68XLfz*lf*JVkT$IJfmL1H)MD_T(GhJs;W)m zkW^!c1MZ{DPfTGp7)TN0ACH@^B5GM;yC&kETMo=jSZg)Z>h~o=b5$nwZ<$)u8mXyX zJX@1i^xruDprtN4_3XA|D#7M?n`2XjvX+4rLBsn_xy~Uz4JT1grM~i0apLm$ z>WcbIfW+ts(p;Zjs|+6~s)X&J)S>T)?G{=wqF&#jG#``3>qT&jLEm&e;Uvspc zMbI#_(T}7>-^0;c8YGZ!YVEE`cF3^TV7d{~gm~SWAli>wM0Fl$WC!@dx+nQ9N)qDz z;`KcABAP%@cq8T?(1>RvJ5f3;nO4aULJ>MxhD15d?(uw7QcBnz?jykxzQc0nX|8KpXj$MFQ5E(syY0LZJd**$7TI{0Qez!o63#P@hrlNt%%69^Q^qCR9Yf!5#pN5_4x3a&>Rby3oUddUMk0R*`e00PJ(!>R z*$1r6<};}|_Df+ay538>-?&BmiZ~_3)X6_0k>~iX6K~X3v<-Ao!)!j>L;f1?pxpvo zcsi7;f`ro$4<0u)i{tFc9tj2WBFj~Rp9}Yj$Gcc*)8yogIF!(yXI?Rk??OBW3(!V+ z?>blOjWgZ8D&lA0IwnER59%<8ST>wzh)@@k`h@44U;`kSqy46o&;RUsLi$DR7kqTa zaY^wz`}#=2j+*{X{7@&o#IhR7I|_1y)Fk;%_am-)f;_pVChu;LaV!cV2KM6FlEMU)Av6lD7-F)NM%oyB{%0 z37&7{w1|V2W3-~Hj0OCzr?ZjIyKa44BO#}~DE-bNp4m%K`Cp+U_iJ!$rI}}Py8|Ow zyw^WTzvK800l6}Mp4jP)@{@Jc^%ok@xveM()W#JA!txwgRJW!_iD`U>kw*K{V;e3vTgyGY_*O_VDDwMvH`Z_=tLYWrL` zGM$*5Ru^Xz?LGV62RB9vJuhpGL{RRtmC&2DGpH*Q-s|Xn@zH<=iI;i<8^EH^Qf<{6 zWUSq)_?oXJmK&QTB$S!A^9ifXT^p%?>vdKmh-#^X=S|3fXq8#1Tgf_SdyAi?>03(M zpnWa1`ep^~q$Sg8gT1}lH|-)5m6j%t2y2ZdaAjVg5nSCCiWXJV{?|Zz*4vCE>_yz_ zus%ePb;T(|#e>eGXCI5O8c-+nED|VX`@_1d)I->d6+|M%PfJBH({WayRo~AQ zu&ihe6iwDw0|0d>rG9&Gf9XIc$tV7N=zPrizfp2U_(kxER(?Q1vXmM~_-HRYF}*CX zD!gx;_h%ySdrwr@{C&B9HLJ5KuEIJ($(0FQaDvzk70sC;s;B(2RR`bTZv?iSRT4EKMD`!$sMc*F1+N? z!S9o=jNzOX{##g-6Mdz|thN(Ki+I#{Zbi0Mm_z{IURF>?{$Wm3BBOIl@Fe+-Oj2st zD33=ao^4U(33QENCsSbJT_Jyio%;awN;zM-YMAus%6p-!^cPl&cGlSzCJgOG6}`m$ zNQEa&@)`||k&-7dthCo*ra|kNC;HrEcbr3l6C6>j376EykbjizBfW|EoN-b>u~C&L zyn_QU<|Ltw8P+NHerI+BlzY6vX~cn_7WTHxQ5o@B*_%;25vzV-YACJ^I&>PpTp_F z(A@u90h{G&XuQTjN^KY#WDI0&hEF(@8Yi!*Q?D`e8dR%s_0c+9g)T>_1%gD~FCadB z(Io0K{aJ}op|2=4rZ}AUwVFn+7Zr4%)bs)nwf*{7vF(Z{9&yBql`EGlTC!oohP&^+ z>nA_`(dxVJL0MiAZxdcOEASedL7i~aMnX8-6g7%oZ=hahTl;P`+ngnH9G!Jkll|X- z2@z=#5D)Cubs2) zEbi|ouS-U`c=SyM_nO=Aioe($ca7>$=3H4ZjqnK5sLbtNuE+AXLSWmn+^F>m*uYw$ z>cHKNZt}*9^iV6ejHkXnWavAP^sXDfHI5Pa3WbO;9oJ0pp^sX}#{kuy@4~r=?cA!@ z95cP~^;Es>EYJgpS+u7XfhsR`K`f`+3f?`r_aD9RdEW1DFHPf{VlGQlQM_c+2a_{z zw%urT8g*ktMlnRMI`|TD5h1s^R#aym2B8XL;Oi zY8rLaD*9kIJe=_dnv6@iZ>rtODUVs;$=Yk1pC9hj{O0^vpF_aDq-8T_Ej90P3e%g6 zU0;})!zeBmiY`eF6)3n;UfF!n)HS~=X&^I+TCfs;?{|D-w^<54Zf)0_HJ@5|Ac-a-?lA_r#H5 zr=9tHS2=ZDp3zS~Mx-k~)_%5C(f7OE&&trYbzg`2*kXg(z7W5kyDHaJ0d1t2VZSBt zsw3C9hYbY5ug-*L%X}k)n|~B4b@4vJ>_`qvE;SjG4Bi^|*i8Sry%D^~b?$qFf>iCi z@r-MracOmFQGH=g??>%j+8j@tiSq9L)%)#X(0E$7w@jXVTds-xUG@?XPnSaIQk+?0 z)Q09gl(uYyqa}4a6`dbPFc5#Z;`S9CuYW!uYTDUIEoY=k6k1)ZauDew{A|SW-&(Vv z*Nj+YjS4cYGZ{Vg()5vY+jLR`K5I(_TVu50gVAwUGu6pGP0`V(5Gv@X5P|rM7~eF{ zE6jw1S9qytba|aFvAp62rql3A`A*IXhH%Ei2K$)dB{p`Ef5#%7K+spxTAx)yyL>qy z(coVVpN!?ErXS?$!`WVZ90-q7Awbx*;n-CN72F-^0E1i|Cy7+PH0j)YYdgBV3Wgqq$w z{ShWpvaA{E%;M=6gBBUzO&xTMpg^juGLCuLsB%Q-uXd=_{6|^vFrxNH-EDoZ-iXsY zDb<_Ik?ZR9hFNqG$86TcZ0x0nQ=H2c+&M`{p+UUE20Dh{!jzi+R)O|my2eOkta-n5e@bbr zYlh`LR|Z#k4UK6=b}Q-;$w+FF*rKd=>>59(gB{EVkkg2`5^Zg?grh4A3isJ<;NOLe z`Pt}}>uXC*uZG2185T_K?-$}W`&bIFOjNYUd`>Md>KsZS&ps^8P|{tOnO6evB=-BcRMz2?Iml4;d>)(J3vXel{3!?6taF{7R{v2z=fb6jIpUqxdfv$42nW}%v{>QtMbeGug;)k}rp^#Veihq=ly^E9< zOI5mk0sG3kHM;fx>`b2aB$hb_MFsmj(A>!c?_LyVE)CT5c|;)+p7vx`gGV-AV}N0} zKR+b;lYOk67{rU6?H$Gtch#E|s!uEw$Jv)+ng*fO;v&fC&P{!mbMeS*2#ffz+aGQ$ zRNz7KI@^~{9#Ba0k<=~3z04_<~K%!*J?WH(t9KV$d z!>JM9#7p;6(60T4{Ve^hVfeB9C&t4U&=eu;*!-QU6W!gDdQCKwx9ZAo_=&XcLLwsU zSdpPq6vLOvh@YdfrD+Zm^(eFx|%Q00yg8cfUk%jI1V;-?&fXwPdm z(`WKMwDQ=N|Fccdaa^65KE?W>Pz3R>uW#p>BOoDmT+b2SNjJ!yc3czHQNy9bOR71j z2z@&4b`Dmd|ALn6iDZj<%x`Fd6|mHbT1B<{$E~20Rqnr=7tscI7#*JHLna<>93)y6 zoSlzi6f#w-GfH;}>3C-(Uq1Lm&i?kn8o&%W{`;pCPvYj#MCS0QR{0?_ZL?{>uSf!N zcH|#$#EbJ>)WWEF_(}fNy89BZ{~gn+T@CEm-m!Um$3W6_q?6w+ul;Jrmvhws8?aa0 z>aB74)bk~8taQ6jOkP>~-?Fj84%vB+aawVWP}(v%yR%SVt6m0e>2iLGfwI(n?TmMm z14vh|mPpM-Qil8}jLlSj+BHh^i!6qlvmQCcnglK=kC zgY$0k;i4_erCaXNwrZe;z?WTue>=(~|Aw!4L`Dy#b~#V6gh`NZI=-;FEitM zLmjr^WiJWx_XR|QI#YMFNm2a+#e5T81?m@~RWiEIl1V~|&duix9$-=a#g#MfNDD+dl%3M52mZ95H zl+2m~UaZf!flirTweQV&UlcvB9>DhtBq~?ojJG122Jkn)YI62)bT5{RNIpkrVgT4C ztCJ+1Rd9lJWa&H*KFMp`nWm%e*y4UcXdPugl?Z=6s~u*u%zk&`0Ye>f`5%kHup$VL zkSfqybOtKso(VXj{W1Z}9cYa4H^GD}Nlz9q-b<$J0WeSv4lB2G+zlojzOA#q=y7Bw zipuAx8co6~lfCNgeZB5qyKC%2ko;)}`h9Y@%;87-<9%*{WHdK-aq!|#XN8vOR52%4 zW;FLBlvzoNmf?7r=vjM7K^Q=Z^xa}-HLABEu08)Q37p0)Ob$(EmF-uHerP(YJ3@rt z1bWqfncMiLM#qM17%`oEE3-Onxj0xtOIu_4ZzC@K^dG=Iq-J0$m~sOoT+Rc>QYTHD z0E~AnE72NsxZojm+Ue1@S+3Fg2=RpDy>@&(C+`spG<-9A`Ycl0@YxuFY;h*tGvWUN z;|`HOgQzmZ{6PW0%dRb0LsR~|1`U5@iYo8!wQ(G&S+J@-pcH^89&0Yg@MyMjFH^JXmC8p=WPD~DN|KI|HqcJ{<=a)=2UE9~NRWq9$7q)J zh5DP#=ylKVC$P^dw62r;^c-@uBnEmY3P4$u+$LmR}>Beys*(1?8nz6Koxy?Eg2dc%lCh=FMy#Y&kB* z#$C$|X^}4RPG4%Qd-aW|##ZZS>DH;8e}z%IMsOC<2-S3qPEIuY{BB2KD|nD}jXZtt z348X=kITx{K!vRh+i0ocnM{dziYGsPU+(|oFeeqVBvCwGDCix~uzFNR=Qj3v{8>1{ zX1(s`Pt@IGqnVcr)+)>mQ-@JRJ}QE%&3>;NJq)X3ur{UbinkhH>?~RHt-nQJMakO) zI&N!}xwJ1Hbl5NX6q1hLMuz^fHgGZkr_@^U=NA&J{^03jXCu8XK>VHACzHVru+zuH zC$}6mvi^7B{Jfg_Ns+x`a16DMr^6^oxyjvs1QR-f! zyRVf|Sx6uT8n1KN21^cfq!*Zwfe zbtiF(Im=a581!~jvl4r#t>O47iR44%Vs?>82zo59TIaQmd~V#%K^r(mgdtv^OH|ft zJez{@Ngix~ACZb|5z%8NFg^{Wuh6d#@|rcly4(m<`i7J|dB1$@-~j<}QJ|Dhct?Q7 z!Qb^7jsX()7%89JL?-n*PQr8>8)gE3s3)&*EM%s%5$@olIs9Gn4)7AAZ}@#3<`0H$ z+lY|Z?LOR97O~7ci#X=g2e!q*FNM9{w3VSksD&<6e48pVS{9{b{}Qw4Q&42=xPGaR zmlI0*7fytyuWQYgx{5D6?Wp07$vk~ubNy-AL#pz5jwaosPy0oP zbJKqlBd0L%L(1C}}rs;i08p%ll*|jqVJtpFn1hCu=~nwpARNg%0fw<+I?l5e`a8O8m@C z^#hH61HFq@UG9V5{OqqjV~xk3$d(h*?#g|XNw5#)$16j*`>NJ2+jCRm?N0s-Ee1Rq-phzF@qnUrlbpEt1Wo-*B_|ik zhoi0(PcT2lesh0-fVQ>%yiePjm2)h#`8J3En`CD8-_m4zzK7Jx@a=-u@--~#~gkEA8Hf#|6J+)DDZ+wb=8T8M} zsaQ7k?8)@G)aJojqQ2(qZ}hxpfxG8lGn;#y)8&E1b3L?O;GW~Or!_iXN7{G7MU{57 z%G=55FRvnM^o~7fPE=Mo=H1Xptt_V0Bi~l$0ae28K(;;V~nohs+p-YJP zQ~_M^HtqRW3F9}bu9PE>0`-{w9B9@#MiaG}aCkhq;V-Eq!rDd)nIvCNv`LvnERQ|? zMBUIJkU+~4zFc5V?<4x+dvx-ECysGy~ z^@ce&&m}=~my2JfLZ0%JZ<#!cB$i%#TYzP9Y+K*1^kgg&3#n*6?QU#82E#838k5E2 zypA@{c;d zn{nt-2^coc-#;a0ixs#)`k#F?Y4baFd;1;aaql2R@~oaJt(F^QJ&Qhjfk-N#Q=zJ$ z!9Or6IBSzI3Nus4D4*=oq{)}YwpJT2b4Y!i-KFRGujs!0>m12#X-b4tK7ZBWwjY>w zp%bk&`t>y%VQANBr~BW#A6cvE^1m@&jd|yp){FnDj(ZqjaE8mw&hzHVE%Ez`9)p@Y z_?ku6!*YUZ-z78R)iJ9po=M%izl-Ibi{e%BD>8I&cVZJzXCK;8f+u%Z@O=|!pUtce zY;o`XdInV1@6UZ-9y9;uItI-YQC+;3N|3VB@RYTGshUCGN}u)^W81~s;-eG;4@RDx z-mAP}Zr+l6@Vl}sq2w!ZTD9V^E`=9Xihi_)tFB$ot$34%kNT}o^}v+#(C#p@)OgR&69Nn3SA6r`<)l3E%HN6Jkz%QE{jOS z?8whBZ^F{C(o+9uFGPQJIT#&#HUX2ChaX#HcG>-1+umx)_&=n;33_kVCG?rc@l6EM z;FF%$KsJdlhkRd&)s>XL_ny>rr5d`5*)3hsj^~Ppdmnw{PlM=&Z5>ckMpay2hqHe0 zeF3Vk5JF}m1^jcOlveo%-rqV}aZtmi-;ChvcjX03f7&RHw{-uz;F_B_9<^d`^vi=b z*Turcv7o!xzgPUgFhTq~^!R+fjkwi(W=VJVC3#y(DCjU*<9(}|+vyMY<|#i_Rx!pB zT)%|8NSJenx!*f1zJ*C!RQh8Hn;n-Nk)(&OJOsmFrXv=y9OI+ctsk7~?}6DZ8s&Y> z_^2UTChI)ug#8JDW}~-TqJy%CUajVz8m`i`c5ezk&Qqq7?>EI_M7JPEe6^B(ldZqU ziGIyxZ>48t=A%%)iVKzD#z(noY*yqkPm|MUmn5s+wobXn#w;r7i`;3vZrt*DRZHvJ zGRUCCftc9o3NgwQif3(sz3~u)quN3&*d_{HMieR@K)2P};jLRE+rIZe7V#o1ah(`3 zfAjClPr^22c@%d4gL8iWuk1dQvZhgNc#p-@r&Q(pyl~?vsF%|xP3j^mw(QsD?txI? z+p@I>OLIi)W=6Dzh(D6{&m1Ci%b-yO53k@hu~eUc=-R|G3hu0`TMZqE!j6NXD&Fj zZpVqAEBjnZ?55XZchabZMjzsZ0i1O}uMYTieehgHXLRqb8h6tH-+6`pk{3RHl@m6Q z7_^5^uux^zlVY8j{dI}g9v#6z_}wEOmIE`#yBH)RLCCl1P=n1V0;#Zzby|{wYGN$$#~a5j-CM^ z9Ioxng?qOWxXx-c^?pUmu5PGF2DY@7)iW+P*1K-#dMg)t9-)^0QeAub?gTY&-)Mwy zShW*qThVc!4b?sl2d({}((kalS+LHy3}W?#%W|_3tUypQte7=oU^_80Dv77V@A#75 z=wg=@dbR28$mP-O;zm$oxj!jKC2^6768D^2@o2qDwe|NnLHOa8;0~)bDYX^qrik_{ ziM4<`yfb^25`dx#XOETs{A2(7b>FzZV)tJkTGq2uSnIISNsV`5hUl{MfQYWiT`d%M zQBqp5Q&tr6z~l?j`|^lxE7Sa*;|eK+FP#0vV`2p%z+7NEYj}!=-(dmcG+yVOj`#&Y zUIw0k*~3tUY!j=rjHn=9ChCk4Tm63045RX46yY;!*+Q_~6am?(?e<@7z;lW|{G*Fq z3xfj;ZmFY6+2so9r_OLRuTcwa=YAoy!wYFe?KLRJ>Ww0#TK)#G*W1o+Kk~O<5W{iU zH{^YV>0g3>^B8qpbfB6MU13jK0AkcI0Bl78<*BYzve5l$hR+kx-W$dyJyd^Qtk){m zRCo5@=oEY7;lex{PWSLRPipC`S;n?XxHul4L0B?c0?&dR-JOw6J5Nre8c0*qY0mFi zr*(S4#j73N_y5}B(bdnm>6Xm;#AzR|&gHlsjMfT#or%NS_A`2|;w>|e`6g_&D=aYa zPqKS_vmMmDgCVi_rdi`+ktf5{5XxGfi86AfAZ~}O+rFr7;3YXLTNj2#AaH z*Btjco5%=OIPg+O?nyj5$>qGi#?%&-nU976K}Pfsl_tQPjM8Z ze0Jgxp>SEjlu*a_uCdD=OsXHP=P5!puy);=-{PxN}9{{DQ7M4h6P`b~e3IN2W-MrrTZO74Xk%O^kUr^Fw zS?VhFEOKbcunv~atEmB#TB}?wvN-JVK~e{{UQ_Vh*)HI)?3wGh-3Djk3OiKDS3GL{ zBK%cI;ODcA@VgV@ly{lf=)#281a)Pd{{S(u&%lfnLDRuOX(ez?8IaxqgrRb_+_Fy-^wClwCrvKfN~+gQ3dlLwi3q)k z_cs%zdqkkKGu)!t4CTY-ozzm?CLA||={Z7s#7UP#_~OFgmF`EpvDcQXmgn32{wrF} z0H73e2!l2GaBj;JS_Bamc5xuiP_gLJeI!9>9*h20|&|OgGUApcG%g*j>~-h4BAJbsyqCK*DZ4$>ny}8 zgzV3Xjh(mY2A-lL%?_u_u6D#=mn^8J!h0ArboZ{O7SVL)-VkjKMoIvm{pK#e9z*$p zZpH1P2^<^SXbih*$)3C7q1=QAoj8xrwcWZ!(etykpIt3E_|LVjUKNt@RWX6UsD*ey zwjx?+#{|%+$6T?X#dNWhwgc@-iK8kXrdq9D?1{&2+hK+yv}7qCU$alF!!Oe9@Q&3J z2ec1NPP^%2f&s$lut&#Td3?w9&ECglr&bp7e^m6m+sW=UmhjhyV~F-TKY)zIs=8c*pDDt{!IQ(KN zRW?$_8zuV@;yDmj=klkal<(vsQMBYS;@W=ff#Brv5tr*%&QoZyqIL0Gjg#}^oYRIX z-NV<`7vLy-Mui^}+Lat5EAYUIaN5hvEz{6RtFRvjwcVF93DUV&PbE|ORz>TcBzL`` zKW{XvuYS>PrQSrao<^v&C8S)s7~lO|M)ZT_5xS$?uB0vn6L3;_lV~raSuNAwlRlpu z^Iz>P!q;*{s1{_LpTQm&B<(8oBbB70 z0+cQ+NxR{QM`WxAA+MV;<8pPY3duINW1`L*K5U?-w#w}h-TYTp=n2T_;x5}ftOb`P zz{?U`BRdR2O@C6tBN$CqMRQ1XJ#GjAkazZN|SN4PuG)2aBGtjZCg|3aJ<*o zJ*;D`=oP9!bHNnp+oA!?8XBHdM0nOBLT9gQ=ml79jQ0ydO+GvpXQa4HVUy)_xuA&! z6g<$h@gyi96vHN47~lOb+mr&d3^j_we@J96IdItD#NaJ6i?j$HgNCC&mA*4vAZ#^j z#ua;oL!WT*G*&gQy!B?sTIP^(woG_Fy%F!PcQ$8@?~VKHl}TmWL~j6(wJL#LYn`C?9O61Z`Jz$C3|i%8G!@k(%^jl*CT#Qf*c+HyNJx?! zOqrjFMG}n>Q)x-G+gY<+Gg8dPI%npHK)pp^<}y`t3h38C^E1L1A^jdRt;X8Zk2BVG z`NePZXM?`PuqVWM)x~^6QZQf%m@2RyPx7o6f z(f)(Kwf?sqpmy9gDu{mMdznT~5Mj;JD>`d=OD#xq0GwubFp_q+0xNB8j)T#_QjWw= z`m5{F5rgVig6dprpFIf=RX;Aj?W*;XFW;p~7fTwKD49;sAClDvJz%Ll-HL(>^gwD+U7dlu*k}wa~B#YqF!yM)BafD;2z_OwkBE{ zyw#fxTrB0J2-+p;Uy|j%K5JPha`Z6Z(!J+lmZLtqrjktS@{nAX`i%RW;_HUQX7Mw` z;s{HOtIQBDLAFamJSKl#KWUwVR@VgHrl)Lh8#-6k zyXHb)O_BPMUiDuFNAEupEN$X1nvo9UFTGaW+mX;dbzT1ycQNRPzhlcFjLHA?VWsf) zc1ac5$0y476TidUPEc#5AIsWE+Y!-s(xEdS%J5 zwj5lf3j}rqt)*y;h@{Q?kcAP8z0>klXqja|Mw2XR^$>GGDBpX@7sLu|2D`Ax3wfLg z=?rq|B-z3SgYg}cV<8@Fd zGSJK3iTOBwgQhs!)t-#^J*?c*7Jg+dw4Kbi@#I)fAf4f7F)vNhHAjV9KlLTA?}7E> zPOpBV>Z|En$1{{IH>1_DgS2(O3~pk>EuOkVzkgw9v;{d?U%>WFwkMLp#De+h1F z9W?ekJ?Y#Ub@W5-HS5*0gqi`l3=k@;07q><1(V-B*M(q8gGL)K#RVq(Bczn5onC|I z(6)cGZ()XeD$EpLOU!QBX(t8Nf;k_q#0+nP?{3uQ%1wy7R!+PdlRCD(R4eSwE;-yy zL9w1IZgW8D^?f}sq#ql`;$1oAe>rU6(Au}P>^5h_g2@WQ`#F2HYHdP;xjmc%0uNY* zY8YVn5u*+dA2b7uoAFbA-v>ga%1oySS{9$O*uL|1dURe2m^zq3)&|*G{d%cULj2eN z;&8h;;7Wmf=I;}4KMc{1SP-=1 z5anU`Z_+fj3^08h*VC6Zn~sLiW49xRk5k@W{%>kw^2;zD(CM8#^#L+a%yuNq(B~L% z6rs>y>^>E8XB6E@45GEzj7bwUcG>6f$09?3ocg~u&+0B8)QSgeGj@r;<@DVl|Gi3| z(L=j^rjkauGnymG5OZh(ZFfI*1KOhASj-LHV_yC5Nv+G5TwocBiP1Ds$CaAxbC_WR zY85@7wYPX!A+wwAiak#n=7$|k3XNg@(3wl4{u_tP|DxiWS?_0Z#H=937Mh$lC-a8^ z<12BN3MZ-+ey4h~^Gc(sgfiQlp1SCyV>h$Xx37A=#Tp8krSiMJ1Bm(N>p2R54DZdk z%qd_=UYvuGc3G}&6)-s(!u(eFT90f_PFvx)t8sc`&uzLSD4;*`$4s&E?E5b*!JC&( zTIKM5?SBX6FR+(X{^Gi+z-c<-Ud#Vq&6a~l>!F(e70o51Cgc|Q6QSq=v`VxY`t#yY)9dY}2?2Uu3*HPm#2o#bN zsas+AO^U}I_&u5600B=qZ0OoDKoYcXLc|0bsWOW!fa8N&kJ6vrdoKQ8Zu%TKpG!L7 z7KgTWc+H0VE2_ayA5J0(MSc@cGYTB(HU07#ehAxrT)LI>*@M&}pHyZG5#*ZH9dFL6 z%)!qXSA4s>N`G(el@`OF(2byJl6A4Km12e8IZdnm-^v7?dI$su^G@HqIJVVa7m}k_ zGRI>p_Gdaiy;*yF8;MfLzPp)mp#6*IB62*_$G(kJN3>@3GW%p$wsTf@#M6y^_}A)OlXJ_t$n<> z>3E=Sb2Pl$Q+^-y#pyi%T4OMa(X|*DhuTZO&Tgl$2vX$z-pj9I_#^1BPK4`y!t$er zE1X?1YvMV5S*k@*yN*XuBv)fIfzQ*yPns`rDMm! zoaB@KGGl{~AfDS?PAVrt2t3W+Zx{ub{aloby> zR{)orcWklzfp*m@|Mk$kZ`;sMsanA3_o3Z(tB5fzz=nP1AgwP+``YJBv$paqZ7B&t zy&-A=MZVB0JZ?aq`FzZ18r$dBka_BzxTQ7(pD~EJwzXY6VDIm2D_9MrnZ7h>rv0)} z)G*E;=&W3Yo?sgqK0*m0OD=r?{ z(|S8kJ*=CiYWg07XC zyJ9ejy9*Oz?}hwnxslx00j1d6xlJ(UIUcL{$u)-$-;Y6xIr!;16=V=MQnRkxajq?p zj$PgbBg-BArV1Yi0P;%-HObreoFml(9k==X5R!W9#dD4hpl)zCMP^dvym?>zGhkBk zM&YAb@qP_io}VYNqJb-es21B%LSl@a@d-34N*h%i;i1&p%s`Li5)c%72`i>So;-fODj6($_xfMGl2~X zry4u9!Q)_@+K1QlbxE*`KN^hKFmO5wio3C@jgmd_I_(02*tGJ2amX051J#cBn?-Qc zhEzo#`v*X_&xiT_w*@NSY|kIf6UU<0GJTGTfVw71z!mD%&uE?D#Th^hT6-Jsg?x6N z=IVz`QG<|{sebzj47S`{bFtXls}@epb?nR}8G1*^XzQ*PAaU3S6+(2~6pAX1da#>}Z&wg{@ojAt@ zQAwU=kvg?msaUTkv(@*N-*iGohGL`M;FMr-tuo=m*9luFI>Z4 z>E%Eg?Oem9@;fr)!@bszIhR%R!Q9YK{XFN7%L`UJ-&zE*7Rd6Qi_g3OQ5}<=xA%q? zwD~?P>niXFJ$s2)cneWsv-y)hDEm|IFS{9kX7P`3kLjRL-ZH8Yz843<^|M?)@EKip zNl5BB$v4&6>q!Ggr4KpLh*dqkzvv1r)n0Y;B`AGLLPuElF}OXiJPN&E*e)F_<975J z%$7+_ZLyxY^)Oy@kDY^ZlGVPvaqGo1hiaDPMPE6 z`B2M=+7**(^8B2wK230bd#{O?XA<@<-+}C*kd;z7Mj^xYpiP|KhF{Kc@N4B$%j53lpdL$&=x#C_jpuE6#SI%bDYNC)qA;$ zb(=R&|0%G1@k@{($=eYUh%J?rKfV7f@G;G^uKXN=Z|Pe<8W#eT4ZGFeL$JrD%#@FZ z5w9fvs@<4tg zxb>l0FEPe{rQ0R^g_SvRt_aAL*Uhkr*HLvPV4!Tz4vHkbPxqJe3y0G5m>hG~z*8h} z?SPfNwnVLRovp19*DJ0U4u8 z0~C8P0GGVfniIU==QK$V@*i^?uQopEK(jg4TN6U zw)bIm`#Do;xIQ=AO2#(~EMHAtA{>P&_)R*N#Vvb6DSnXp^OxJfwd*tcxk?!BGY_U< zT}P@b#c>#LKhqDhiS<(-_|kX3Bn@@$+gY-c{r(by5*jw58rVwk4M>hcfc+;N-tO3L`;_P_2=Uy|{? zJuM?J93Yi}?-p>N;{ovPS)Bj(ArAWDO()qOk+w5ev!?2MG*HjF=aAvV(E%1@4RCC{ zzVt=fH@5B6S3W7gUUJFY43TOx*P&|o{r97GD{p9m_X7QZue$BDo9w7E>M^h6#f02( zJFp|f-`6?UaW#{zcNGaUzR3ha`2jHY-?zfM@o|5w&?a$*t@>_?e8z_n^;Ea}9T_~o ze9fV9L27TppDhG^667^5ezZ5U2K|}nK8{#Cs>;C2S8lB*g|>VI!brH4jD z`oEbf#?!6D?QPnD&DG7iC&+IW^ar!cUtMx2> zk@99nRO!|S0#?4x3c+Xlc|_5_j88gXmgQ}k@w_V1G*n)}bVj25t7jJc3*45h=s(S! zk3HeKg_18Srq9?X7$G+E8G96USr^^g-|dUsllMJ~kqMLR!E}LU2~RUqt$7-b2d88+ z;2ekWn$JrH`1MEIY-x#k6`StM4-4tDYn%nLMIfW^ z6L5>^WZ0S-BrHh%DyC)*^eI-01-)xA0?R2O&L`J_haGBt}MFJigZQ=RIrn}W=qm-kyPliM9>xD2rx%b*` zz-szQo`@}UoJ?OXe%6j#ag$ag=cC)-GTb<@{DeZL#3n z+GeM>KHJCPAo1vv;qU$4hlhoc@dHO>JXjri)XsV&iOKJmP5alST7mgrYV!L z-T=|C&juIBeItUkeJxPLEVpKj7^!l-sG2rt38>oy3&qi8wT_036*sN-*l6lXvEDQJ zNyc_Yz&v%(Jrz!(@lF-7m5Uh1^yPKZ95zSqDJBbolOiRV`>!dEF-RP37G&t7i9-Xx z%SA51A;5tFIojmHUT}e({i;%5)B67iSA$9VT*DkZvN0+OoL|j6kS0Hh#1kjQW~!~V zp&NeF%Ov3-J5@rjZYJp9c-U>VpwjzXO}?PHvE6p2`>SNTuJ*np zpBo{EhHl;yslHjk^(Ag%0zv9svr*6Ibs3|Rg%t^2rWUY=7&#LiI&<0N(mdWs7<%_= zWsobv0L4B<6%CiPlgC6}e{5}a@B#B0zKDOU=e8;o{3*SZc|36?s5$rpzuIl(*ITLT zgmfP{5C!x=r?8#w$G{e*F5&qHvg?#HZ(aXI}x z_!(n^VxR0bsZT#hj3ufq=~(GR=A?2`jjK4mu2>#qXs*+1V$Scy^L;Y8@K?NsM7-ZL z?KiR^aiVQ^(rRlP>6kNxoi{&RCtw7~Y2Gs(rGJ-&lzGQW2Sb**;3(y?%UxxId+y-m zY}s`mf!ajHA8oB_+0KP2YzGVSUQmXthpWf0)UW>uHq;y0`HgQ4!8buRtW%~;%(1au zll0VhaX!m5C(aWxYM5&!po42Jb=4DG^Vt)R^v~N(*_chR=Q7Yn9t4`r)4&)~0ML3F zCJyu6w-od`*UW4H!W=cs9M?R*lv7u5|C(mBpD*P-pQC!~ujp_z9BgaUrl?qihhH_o z;-jCD&BcNj0LGrhT~Q;n>UiyM(_FD)nG$P!#28Ex*wv^oQ(&I9Re8$n^q8ia37@oW z?}qgFft=lm^ce zM?O!6HpOWP^j?YLpul*G77`?hKS4_jbeY~gKK)<`{Gnr=rP$P5aBQitA%%bxV-J0BPscROZ!%(75y_7g*vLi20oJTct@C z*;?+)+AB^WJpKRzQQm|%%mpa$2G&{5tk&QW`!oR=J)hRgP}MbVpxbuKbO{z+s{V2a z3|)nCd`!dxB15B*ukGnh3~P~` zY&dsF*5EUZTHWe$y4@nw#tw7gUF%#j$IaraxUO z3(m5+KT)HU(LO|Yh$PBPR3AP`do#|;@WDbjceTeiS)Jc%&upZOm-zz++8|3LBBpDc zA}-+*CtV+(h>l9>($UcB4z+6Mp8|YqI*LDsp%boA`r<`J%x{Q^Ji)xQe$(-nNhr(7 zj(nIIyQlQ$2NF7_-Yj1QhR_v^YWe-Mp7a*!Rz||dQRn1e*^zY9C_z<5;sS`K_f+$) zXxZ)s!}AyUo&Gx{qJ+QwUc5ZtGo05^SbmPcieJj;d`3QG%96DDZE%DG!VR6Zz>GYxGvnNJ;){U(U2#iiadt0+r1*=bsjMq2lL?j>N> z<2G>p<6T)fBs4knAWTG2J*<~^)0e4J>PLppC~TP~?@ISJ`O8&3D@t?UJcU*w>^DC? z+qR!)LOSWT*f)pPJ;$MVc9}9?sRv$}*o{{^Ykt)8RXB2}d4}k-hsi5)jtw=h*zAi0 z58uS5>AUzv*@g^Y+8HooS2?bW4uW4}-ahuHTfASd@cCEtWn}kpsJ*A8k@;JvMe&n| zr6mFKSH-5h)eH@-^RzIZ=!gB@R8!qTf^Wtc4OQ@@3qG1k*{4<;6B1HK$?g90b9%KI z744N9M;7kYj@!m^ z-6abzY3&@SgiV@UX#{UR8S?FS4*#jb44bXEdWE?zlsc4B{CBp^kdgE*-0HxI_B!ms z%5x}w&TrlWfcxy6>+sBbCYnQ+$fk30R2-9~d?H`WcF-+a%KV@i${;TZf$Ov%UoEN0 zTyANqNhtWX&w@`>7X%ouffLfn(dxij@F#$2jgetq~`RFA6l0Mg;zkq_d8v z^MC)i&5U8Xa~L*;VY(+b-RzQ4cmaG$u} z_jO&b*Xwz4(dP&2(PI2vzMlWAoG(YqMBu}lc()yF=+Zj#8U)BG*|)=CY-&mIIR&TtHgPC&@q1;NUPJ5*{{9|XoG$sqBiS=bhh8zIA_83}?HisjP1dsnLa!2t<#Qwau&Wk;%Y-wV z{xAd*Kas-c`BVq@?@^Z*+b+zd<6RMMT@N2p722Yd=^Zoj_4;*xtg4)ZVg(N*FF8)C|Ks0Y2c&(6x`WVm@# z7v!vd{)Hy#Z|zu)bU88@S5M8_eu)~mqMWkJ4r=r#5mg3Hze}poX@w9h|SMW~> zMX4$|yWtqnQmwb9cuC4|?EGV^YIC^A^YBxfbDza+Hdd-6;c|SI_2&}lh|W5y_y{)8FJ$$yivxGt zldys`SPe~S*FhWgZ$ zk906xZcnB7_>&7pbuRf@YtcB>9zQ-a?5QR1tdW^ z-!Ug*c3%c=-l{o<224C@Q!GAj9_KYR{E9VQSThEhY|=dz;IyEGSvY1E#*uwsBOdOa zciJJ|x>e3RA9rICi8;liV0rhMIDzV>0c^nKb6hsT!Pk4*^LP>D0pzm?^1LQUk&cqF&xr(oQUvw?k z7d90-Wftd^*@cZ)qC9A;qj;Ir3fjlnp{U|<$Efg{ST`u&s->awqJECsM<1{}z#4!8 z{OZM^ETzRZl!HZ}sQ;DS~!nN7C?I6|I< z%e3E7zMY@Vbo#uar6niCWjB-Q<1;Px3HrO8V(y<-JZ9CMpKE%To5Nv}NB_xw#s!Hs z?ema1K`Xw0!U(Bckb*>FVL&dwmP~<(byij~U&g;@?eDFWGxjAPhEsFw%NbyW`f(0A z<+Yv$S??14*X_)8KBm%o5){Etqd&LRV90Y`PFkz{Pgm^Fhg34j&Z*&KZxBU zT`5d8Cqpq*=F5dZ=8OC9#!5Rs>t!6++(EY zbbD>?x2|?(Oc>TODYE|WXYWow@oHX+ah%@1mmvEQDV_2M*W>~g4+!aLr+kg9{}-*& z?r6{O(wA$}yVVwGe1?jr9Vehcrbs-KF5KQASpxTr}qFQ3sUvO(>4YqC4!UB(JFY-8tRj*KQjLz~rnSebt60ZnI@8m}6 zTL)AxG4bx5Y%GSKzpJz)u z&L0@u#wf ze;YbKX9We8SGMwo zzYE-%Q6F3oC^>uYJ>nNF__T=etOD@MEXMdBVmWP@H2m1+j&qO>doqePvnLi*$i*zR zSXvJw+I|2=^L-4prH{=%J7Zaxi5!OYMgb^;v=smDIC=4N{jq4SG7!}HXt7pc#cKoj z6VIVifpSCWaR`?eVdK;8_hY$#8UtC1l7FsA5Cn;)cV|@f(JW z{ZAvZrmp=$1|gn+88Jm6jo(S@eD6p8(J=3*=s{$)=dxWND?REL;Fyjv_FR}zaYhHM ziT?@I%8Q%6aAetn$T3VN_yp#=rNw)R5E~Y8v6$g=dUo~+)}bKI4Qwa-W#M)5!lcU* zI27HQztf%ho4P^5C9=S8RV~+#=6zyg-5a`JbOXC25$pRtO2BG~X3$C7)a*A_l!`U% zrNbG8=*)4mihsge5?e-t{gZESTz0peBCbzQKZ>#Mm{N1gsrMC7x2h@(Q4~IHvyL! z?Y>7w&zPFifW|a2KVqKniCd+fWZa_3&k+2qt)@cLoSYW_uq**PotnhP&!-EVEKQ@$ z57?*K6mHQzN7fh27aPSPrMGXpu5MRp*2UkPQ0)7t88!v)SeS#=z?HD`La!t&55+Wt zRKf>E8ZcNYVk!A9tYuV??N~SFzI0PJKWkNB$58wFJzOJRFzzJRHq^p~*+nbsjH2o# zXVsJ?!TsI}2gNL%MWQ0pb4o65#N-J^M0J};;4+1GDxVg@j;n=4_(G5X94W1K{6=Tb z)tP;X=(>#By3?k0<;xf^-0;icw}8JYqSm)6L5C5o^_9woo?ly(KZbgKtT{UPWQdl) z68xOML^OZSdpUR1?c?txTTNL01VI*gz^@Z2D0^mdiD=++_J2g$N(O7N!Ms$9@4toW zd?tR+M@M`~5_v6Dv_E+4FVGj;DT`_*SzXyXOiG0!$r?XJfvLP)TZF*3s4?QfL!Zos zhcw$wenM#M)l(YuH%4qg7ao_;L*8Q1Vtx15zrQOyHszMc`d;9S8JXUO4s{Ug3;evF z`a!Aje);urN14!zc!?mgWt_k8kg}gCklxCPa2KDep>25y5BhqPIQ|laeayp1R>yUQ z!-8Qsnu9s%X|vP$33nS?&S=Na_HAFZpSa=yrZNO_mvZ;=ReWIc9yk+P?S@#c$Wz+U(Or8}pgzkM z^!Rb!fTzyzeE{Gt*O`-7>0OZP7kk1F&~@jpQ!B(57DO*Q#r#P=&D?j~Z4rn)4N zc*<5M`fpnH6U&8H1Dgxi2iYJ0E7v^U?~+qYlHrZycfAx?M*Ftro`pQjA4ywtf5i1% zZTfq2(Ss(s`3Jum3iw3?+V(ui%k+tP1a`m4Dw^DUBX7iU{oPcYaIK4Xa$$@)!(qtJ zrB^}FUOQ)k3{&-oFmm_xNJSxn2IRt>N4SX2HLr4B-WA}CK2BlmpbOg_^@mEV@2UFs z0wX-MWF;1Pdeq+y@e}`C-B1GZbJF(rxY&e^z?Gt@md_bAY$M^1Wn>GT^l7C9DWdNO zuV}0vQCFI2-n90pA{EkNol+jZ|K94}pbIYCB7qWPK#EYQaojKorMbJX5j_AbeQB+C zFH|Ax;I?b01_bXoe%|)frL@GBvoK{&_3BsClSt$%he8={CHoQl(>)`W`(smWEujX< zbsA3De;nl=e@#HoW(*Ma_uI3k${8oOWqx`0x8A#dS{z=1)gKrj9QIM~J}{!@ZuPNU z-pJ7uG6%W6?NT*2Tscn2 z6pW0omD8q%(yxFvY$j4(zstq%6Ut%B5Ya3N5oK^blZMfZyo*^v!}x+uHa1gB_B<6u4~gR>r3;6f8PfywHWdRJS}cY3gV!`8Lcbb zp#=iMYu~aV@W?J4LQrF;>uzFyR_*_#@a9z58;3S{o{HG7kNeZgB-oLFN<7C5Y_4j! z^@iDhmG3;Y#mrmf(kceZES}nR@NCjzemHN9942qLsijn9V(?Qe!3Ha!rdr4`azOl> z=&L_koHTD71f{cN>V3M;D2}oeJ0SCAXMq;}s~`M9E-v>*4Lz7RDRUSxZ+{SB`n{n( zQ*|Hu(4V0GcvzSAP1*>?TOP)ZMg++jn2Fx&v|u(NaW1*6gylRFFBZQ|FbXf6nmueL zO2Du%R!I~LOAy0`vmK-`JunKsem~p&Y)hG1c|MGxPatoed-O;(v7MqAAsciqfuj)2Bsb z(LA7H9!$C%7X5TMNxSLJpZ7UuC2#64=P?!2Qi>xCt=8*T3iUum!!>pj!PEDDWV}T0#N!!o+IX0Oj&aCiq zhW2-nDu(<^Pi$csh;U}|-dR?+)4s%pX*6ePR#D}>W0HFAV@jw9>R)s3S~%J4n>*YP z4G)^5rAWC!bL1ZF^1XA0Z-_!kS3}2b+xFKkO4&k+B6VAo+O8&NluuL z7#q`FO9?;C$--W7>zf(#nRPG8*iuXa@*G(qF60EW93LcE8GRA0G5E$>^^Pz`QSMkF ziBwwI{!YmtBfy9U01COZk~oZo19$?2GtOGe3>`+8Ev@qNbzIARX|JLZRO?bYUIn1Z zi(mAs^?UC;m_Sy0Q?RwmbU%cU|NLkP+`PVB0D;UUO{KuaXM>s(ddPE{^7iIg;?g3< zIeg{YFDWx#r_aP#q|Ly&3fMxHymyRcECG+(LmFW8b{P}u>mZ@1)c<66EqJqvgkAg3 zZZ6h3U^snj{vPCR{cAgvi~N+vTEbDYaFOP0P(L&(f<6zVv)3O~xpkkhv@DGW z?h}XPMgPJE4_70CAWvj4(}7vn<7Quh-&zDHRU+Vt7JkdpO0F|7uTPe6$?Py?M60-3 zJosT&f!xIxyBVj4JR*ZyD=a#2cZay?xd7@FIdVwbMDmqLIm``ELGsI>MxKoX9^V`n zZN!4kN0D9LJFVM*M-SeHJjOJgDWX+Ucxg;3rpNS4Gnp`Go*fHUOflUkFgsJO?VEJH z)~^LemI7+(M9FmBHb$#F1v?OxdSRAai?ttK`V?DCO7J;YJBv1^R&AeQGiXUcaV52! zD=%F=W=ObP?HvY}yuyu$<`_ix#FG07=+9;2Iq`k&tPC0GD{AbWpj*z>zzW!8v zxTFBgZ+{=6qHzs_@(zuC5efvHbX7*C;Zo8yC z#x^m^lx4j&w(8p#& zs7RxK#38KY_j=XG0*k-m=WA}72%gV)mS(F9hND|lBSEv4RbER8Y%<1Qc?a5!i6Uu- z-LbRCb*mC1jkE`humb14u?4V#Wt|nKtWc2MSBY{ym6+(P*fknVRL-1eopY~Yq(*2l zB5udh-7<@WpA{Djo$xxZ<8dGuRajJrQXvy2GwFDGVdr-gxn<^6U5$$Rh>VQCPNhnk z6xula-%ZrdF!8rKBzRF<3z$^uT!Mf0mpzD*5AVzLMw$z0NYa1`NB%uy~ zszu?@E=0%2Qt5sEPTRxB9CvG?+xHr}v==pxSBACFg6_<;xx|#B4qx2@tA$o~`!@0O z{_X(}VR4%KYz^l~#x{4tg9UyjRb5g0|A}>;Y3!d}AnEuzX_gmBI^aUs%)X-&AfEzk z!3ewXZITb(x1V-;Xt2M}+t_E~ZSuN|@K~l1W*a2QBSNFd7mlsVDUwobed&;1wXR~J z3i+2b&Lg1SlL$iXUnJf4LH*YvvUU>k{7Mmnp9|(|%iDo?MKgeXoO%R=IIXk~0Q${Q z#eSfQ8FOVNCK=XX$K;^z(f+@xUpPYMtb*YE?pKtlY7RYRlyrN@qffW61}4=r#UHHTiopg;Od z3{AjY4?Q|UR4~kb75>SpN3-2!RK;4%0L?A1R=|(hDsy4x_NY;9o#}$$Ja1zi)?vXjuUYBEwsuHmt6G1Ek zX^Ew*$359cATm5eie*Piu-gnjhXLl0>MWpac>sRm2zOfcFHvt^=P1UayX}|nVNbNR zaf*37Z19o)Wq>ECDuGJcE&yT>5a8%8P)}g7U-W86r#tzl8nCUI^)MU|us;Qqq7uXI}7W+fE-nAhA>7zk~Ut0Q%v_J^ZHuO^k!TB(H~EqM1$KzzIyD} ztJZ>B&l3AGZ%$PqhutyI3oEXIM{C-R5c0AYTUD?z_NkBCg-_UL{PYKuwg;d(EECaA zcT{W-hW0Zp@+JCI=aFbswF38Z5Y4dkq8*JFLa*4b&kSWhIxrMTYkN?v_`k&nx)MET z&HYhSmp>h^K}{RL_AROrlfmInYsexw2bmP?kFe=GsIE2JL2mrOp1x(+V4i{RKE>(_ za_Iuh@?a|2tY6)5wB*n+;8&M_E%H$>qqxIY zJIll^l@u)F`>%P3O?iK+IC`xya^ZusOw3|GU4q?Kd-Ch}3^RMt!F``7z3drJDkxa{ zpQnagB8c?lcivsZT#wbSwS<|zVuPENMG*rjy|_12GplhH@5`~M?#nM~qq}Zl{gl5vA}w5A8dm4KNtQc(%6R?5*k4;BEq{@jKm(}}cW6Ts`K8DU z*!w5@F;m=vf^My)xBOe-s;Z&ISALx0f&S`c`%6Q0PzFq@<~2UKQ|@x4aW4AZ9jwzM z2-BYDwUSDq&8&i6W0h4OTK5m$qYsV-C;D+&qFmdwTdic!__$?_32R%WVt>&crR^}t z3-y<2k5vffgtv|6`=wQkNQ(Gi^>Vq;!p=)#xt!x9?S*JFU!qN#DwNtgaVzNRuNqCPHHu0IlXmWqnUjnJ<;S!hux=1u+O{82LpR)IVO*G} z$dPVDWn|+(gW{CKy_b!_GP>RMv+$2=*RPSrX7)ST0BYvPRr882%c|d3fBA*sz`OMb zE}uCdgd2oU0|t`wf}yY7TryW^S=oyEMHam1%TGAi&VbC)ER|7>?Zl2acoIc_@(NbD zjcP>@%0teGAH`Ax#!lRODWPZ7Gta(xPAMO}dJ32kO1uF7mp!=og^YGt<9@0`dGjn4 z91QmZJ^m2j(y#e&=f4^R1|ml>pjvw%Sym53>Ta_hPWpb7EQM#0qs}7`=k?bwjgKmq zGJynpv-!|9kia`=(B(M(L^h9Y29s*C@4-WOBaqu;*9nub)98BCp6X85aiJ12Jkj)* z$iXH${mltA{3grA3zZi0xEdMB(K&2g+5+@zVqh|UYL92lrW_qDD z3z1UT0Ofov=y+tQp+hxL{V)0E0#*Kp-k zompT*t$=_0@h=eSx@)5K3Vp4I&5Vsh2u78Mzm9c_gax*B?L~#|Ppx7fjA7QT#5|32 zOBcR;-U3|6b!ftMAv*|N{nhcJc7roY?^l9PLu$mU5PI9>-A5ftSE4MFYO;^P(ZK8fnVee zv+VO@sxJ%c(Q2HW+sy>mUks7!*ShXPuQvFe?y&tt>e@x9!$&-GDz5(gSn7Y0* z9zm3KQM+r=;oYbx%5CA5?Z@4QucNU&Y?e-6^7}XVwsY#Z3;+7)&WRMf#oXwZ zzZUnqi{`Ko8=?J*02ciE?uSdxJ!dzY8+$Cj8>fe1an2d~#y9tOm+(F=($f3cLzwjj zr<;oA+lFwjxVCq8^4B;VdK}<;B3`<3!>A#`A^S*{&<1?|587w0C;X?5!giENxllSB zK@-V-#PUbu1)Y?Wa-!U~rCIQaaOX5Pt$CaQb@S`8h)B0l8YXl7#gH5P(RWQp=46e! zx4lH*{pJ+i+q1&H|b`ifD6Oe6MhME$}H8;i+s=av8D@Fct+_GM* z{7Vd_TgD5~m@ja%x#yl*s7XhGdK=>f@za`A1h=Vn-p8@~AeGa7F&Lw6UysrLqzP>P zZeTIGTI^j3r$)WkA2eaF4O=eEt^@rrOLoq{69!O3RvW!h0Jfv)a@KIJ9Q1f*0Yi%$ z;?&Qrc#_#Wg!Z9WzlvL+-S1?>#w&|%aK{`ObA;}He1yMz(aFC-8E~>$o`sF^OaR{U zFs-TbFbi&T3UGPD7yDL~)y9zzz1?@`5UgKeJHaY(3Q{EFT3fQ5%2)pHw|`JO&-){f z09QvX!VM$4$?iOV2fF&`xZJ>fha9#6pa!bm2BH;K2eW`@V=E!+{$>ICP>baWcdFlr zk@#b<1&A1pKpYlG$2I|Q@t%7Bhls3z-L5`E(6PsjS-I~K^@?rHE)aO0D{Z#BJv#!l z5fWu5Sk0dI5DcR$!r{2&*7^sa~bV`hU}4_08e z(MGY55r^p8b6N66h6rPWe`ghAx+Qw2Yxo(ax@1dZ`O4Jg&CW+o^(#$2m-_%9cr;5w z;^8Zh?rpi7DR0@|cj)w_NA8A+9M$j!R*#9FuOR%uj!S62_xan05&Y2uC@sWR+xG=h5UbCU#}ix?z9LtSxq>UEXprshBnr z#@2S9SI(I%A<^6Z-)9KGxBR=PK@JEX)Bzk)?z_UixD1#I0mtyOU4VMt`3!hnDCpx^ zj)y=g@4|nKAM=l#{`ydVl;tF#FZ*hicwBk7cwMIQksE+?5DgoB;#ULXoBzF~EoXz& zE=_LN#-4D$F|o)LG{|K!=yp&S`h8SYnw7ty2Uh}Z4?v;r&h^_#Q*KyZ+%}9jnd(K- zizcY}rr@sdYWr^yB={%6wP(nB7$kcnFEc3VECOcgyW(An%e7J6yew(Iz#-|m{Kbyp zZUG{hG&DrU^fsC5S3{eX905#X7QdJ3dst^Ujc%W*A(H4UOe^d{guWVDZTM=|)A|o0 z3a@C*-W?-r2fjINc;-X5T9+XC4y>C9SG^6pqYa~`DF3KMrTh6L8>?jWr6PCpGnFGn zF?h=8k+Ft*U<&^Mxc(BEfoz_mb`L;0ie%s=3iMu}G6uATC1%X=KH|;0-OI;WP;Br!vXW-?s2W>q-eP>8HTOg!G?Hnebn3h&?nkIhfK9(`d|<~`wni;2Ue#TJ;k0OgIX6Hm$q!mwP= zG^gtj`8XQyP|m=rLJnNfikkT9w^Y2*Y;Smle^O%1|N8MU)m0q5bYV`&&;sg<moy(87k~4{q}ZDpL!f zrX*Td0X$otj9!E5nu^E~WL)Zc9zfiE5q#;m*mA4gM_28=k$=;K20{+%@;fgpFb&?{ zp6iw_ngMqDI!=(^B_G0ntl6AdQ@ei2xfu`u`9i1KT>`F`@B?mwuS8!-!lJ!_q?XOt zFt8orazA6=)dzURE?!*+1%{zNSO!ys+85OkC1avJ_V1;pWz4M`kSR(m=i6M4lG00F zeY8Ctm2O>f!1i4gv0R2EGK?=ncWIB8poiOD!H>AWMNgOjL;>KU^;&%jXjF<#yw+05 z+g5MqjQmOke>?7lu4;V%y}+e0u-TfoF!3JZsQ>PWL;h|Vxb1;F{J^bd<6eH6$zA+o zg*H|YWP_R&HiZ-?}?Zx2J`4S1F!-=gx{Q1lF4ktnNXbP{#$tA?-l>%qw6KGM9`QVbmPe7 z)EyC)li|5&S783_KLO^!qg+2=%BM`_ME;T;bQ`~>Bl90qA9ywx(!cD@x*HAvHEic> zua&O2c0~b43Awa7@C6eEq?hGuarwi_xlB2MBA>yxtO3ADW8c3pzWSt(P1kYwS~;`5 zLWtHTJ0sxxUzxJ;_D>AyENZ@icleaw1O)#K&1B~H`kQg>5DzXJ^p`URPGlf6zQ`&# z4eCPb3<+DvALzbN#qgaaxBha#IPrG&_!hPD=E?)KFg4h9p-Jjni-BJNf>$#U+t^Lv z7pm?IteR}xek!Ai)3xXr*fVCt~vRY&F%g+O|yts#<=C_weuR>-PF}3f`oPGZPQY zpbzke(I>IJSMx}_!H313*+(!%IcyV~El*ENzxzh0SXW{p?0CWFMWgjTw6a5Ylk^y& z&AQE%3ei4Ao9cQKgPnfvJ#b}5Yp$&vRl~J^erSO+{Fhdn%DDZA*@>}DGdlq~hTg?x zurOgETv?rb-~5%iOe6n@<-z2cxV#tp?cc4@Ta&Q+Si#8qKZ&(lI=F28#?N6G_2i72 z%-7*)#FW>@uN|Llw{G7)!v(XQg8z!{fpcQRILPG)YCOK&Meodf&ueNWfQXpkhTkyf z;l!myp)y2;!a;SZeKb5dnRdg28#u7uo5)`#Bm_}6%w~O#FJCggEai@#7Tir&TVMQM zoLUP?SSKeW|2!Jo-G3#Wc_Oke2vP|CWzSL%_$hSr*CBD?{Xe#JbrR8)biel{dfg_nvPll+H++H>7r44IK z=#ur*(M=ikZ8AJFj{>m(9cP++fLilsQeoV#ufi)$9!A2{-ns8vX5C$rjOeJ{!Q2J1_(}M5 zk3m!Z_Y#J6&Xr?^cBTCm1y62h5`WeY``t4BlDOkjDv-FJz$fQ0@&fQ9Gxbir1~jI{ zx6s>>$F}{MzA{jNCS>ThqgE&=yZN~3AejE109jt&aw+j2z(g8P$P(bec!-_@ zBf*>BkC1cHfYzt^W-t6w%a%E#JpQQq-tqoLXyHCR2WP=L-xfgpHnx?YmO!_D1Mt(; z(dNUatAHy9354dY!c=VA>+8Rd8ndE(-N+x2xak0sztgLjGx41x-Md+6vKrEbUM0pr zHg8J1bl%RojOWs!lC2bzq&B$%ZigssG8r_E^4J3RkEop=VPI&h&!q~mGGfV+M@sz= zsB8e!^e=GhxszeOAu+Y^{Y61RDd6q_GH{gEPXXq^53cl!TQ0vXMb&^s-b0h%{{p^q zp!(l>iI)d1cjvMJFsCGAuwJe7o1;xl6Fauy7#b4+Ok56zAgWPYg{8GbpQh1#qE3g_eMYZwrwz+QcltWp4wU$)a= zH+K$Y&72UOpaKaL!l{1rzeim;&2b5X~pDo9Vxck*RO@-sk7Ii z)%-k{c7j10AfK1Te@7jVo-C{-e1w8rPc}JU_8u7KlB8A?}#xH%b;t_bi(ZTSrS{+dQ|(MvZl}Y&z2~ zN3)clBNeQpF;~!F#b*;OT`W$n^3wD~;Sb{N=XO#b6T|P{c6x34 zu}+zjq;<|p!~NwbrOe+EVlAql5qEb8S%^gd*$-;;TmJPDhXJ>;mlf_B04!deNLED# zx%tMItCKU>8vasO(?hHtGPxmcw8T{I2EX>^nu=tJr+%*t$(d)qh2}l*oyG2!A1urn z-x}W~fr>Ol>*uwK=m3+m9@|7Ivr7Md3OT9jr`gYb{PMbYraqO^MmQJmXv3|fc}MX1 zBifolS|k`eOgKdIpB6h3`VCOsrA#)TuL>#7#ltUdUbMVuP1e`pF|p-xEqp&h;yA3( zS+5W`yBH_P08$henoZNW?YVTUlfLml3?+uLOKgIf*#2cP@iu@(mPj0Uh&gfLkx6IH zW>CDUwn~|?9kkgoLhZ8^|5v#lPOY;p1B+g#QrYH zh2#SD`Ra`cm&VtRih1IibYmsfB{Zjl{=f~Aa`wuxq<_@nn zeVM^i6WvG9)d8JT2o5>W-2J!FDq%oIhAP1PFGns19N?X*gi3{){dd0pxA1DdVgl?( zkCa180$tf~&LFW{Bu$^IWfJz4p*wTVnd)~6q>g-7S`&LONrCH#fHJSGhrM5&KGwvz zYH4)ZsM9su@3wi@vco&8w(yMrp@9Zt5pATrXp^UL1M*YlMvdk$%ZLAUwIDFe8!B-g z$=kfcS6BMR#6Vf?>A86^PYUhkt#Y0N})O+J>(^fnh13WB*nXr-Hr8baxO>xd( z`vt~nh5>gU3}}=OMwEclMpNnjNXHReE{$(kWjO$7J>Ulna>tepysIQXb*Mb|ogvaz zIOrowjwXi2V~?j+#Vg}nGvwCNlP~8S^;(7wHkzg_VxyNX|1RLmNEoX{>w zoPn~rm%98B4tl%;4q5i9CqG{sIC&0;C)N1gu5hE{vN8GsSb!&BG1IkgvH-FLg+ZPk zfTXQQ))8IaF<2S?SW0BqrSnI0u{yzk^RS?}tc~qtz@`Xy|CMv{+%|w@be=NvSvsmO z2i1?Zw(OcMoLONW2DFcgAb56NCuGS@JQqOY8{fTLDVjv3?Ag|E)DEHW2cTze-{wdQ zIEOy^B9H2I?}MMY_|-Ji0LYc5E<6$3@!C1#db_Fo>5P$t4~Gq1(U{9yWyLyW4ZuJA z4-z9_6d=7TasQMJgj^hWUb+$O3#YWX$BxCoA*X@F_#U?$Z~`vIfQM9^*_E#es@W_@ zjhX1w#b7-@pi_1bR{9T$R@&<9bSc8Yqx+6hCnTBBe6qmX`liDx8!~rE>EHc<;eG54 zcZwBb9;#DFjB6{fa9-GwsUXZUEkisQe;~zQj``lU6HZ2IAvy5=&FM{+xNLof10%ig(!~y@w=pU4-98 z?lFlaI|i90O=;wFT6d_ts~YpLE*1-a2(w`x12^o~+uB4HHkA4cOn&MfY;@0D#SWyA zb*BF1-9zIxl}Wj!umGmDcngySd5Vg-yosl;YWXuni9HspTGw%ut%{M=AVGw_pmN3l zkqPF6QHtksF$H9e&=-~F^{Ji&pjx)WnL}~Q6zOf~(wd5lLIoLGw-tJCdqDOkRE><@ zxvS&7GRnfZNmU8zkyEhfR@|DsWw$?~ybVQnG~y_+v)+B2T|d|FLE%yD6@LHjbWNLY zB4q4#-<2`a)AcM*08i2#y;7m`z?bri2WZw{u^L$c%9||OSZbp5W?xsr9$#c7^X$SxWPrv zE5b8{xv+}U*(GN~VC*s!ZHvJ&E8B5@pRw|tuMV;e%d=vi} zs$$M5w3%}E?qvDMB^V#Ec{_NEdS!qEj`FUZI*R17xH?Y>1C}dpI4O>Ds;6{CZvf-a zOYLmJN4+%RB(AY5D>8f_Um#?)idgyu7l@Vm$L`ogHvhaH>{S+=A+mF>PZzP{dpJVK zu6|?PAlqzWg9KDs8<^Wi3eNKC5`W%(JvT54HAgzF7IbG<(iR7iHOhw?>8V zS%!tB=h|$KccCfx*WYc^+*W(kn&iS#q$mzzrBogMC;YCHi6T5`fDhIlu)z@5ex zhF^hoEN-4@4}2R;)qd%T?s(!{{Mea6j0gfwqe_nB3{8CZ3pZ+?rxihrfmN=ix6h|7>zpTGScjD})_-A>y ze}de*zlA?>+_)tK(7}rCqVOfRQ9X&Xj0uVpl|zy6%cj!h+;srfhd)esS!ESbXDrXb zc#ft*bj}2~>=+|mHPJ-Qc@`r#6*qRUNx1?mV_vtt3LG;Oe7LvBeL;`$vFDhuR{t{R zXZ&@(vHN*2$B6>E5Q)_*Cl~cv>hu2D3^W$QY8xeLDx}EYKh5Ad;cz`Txm{|tLEYZR z)LH|WLwW2kg7x3FYWi(XIpt*|5K$2o_zQ9 z<>1&4lInjEZ8m-f%WF)bmhxOjMe2e;a`RJuZ(26c5rq`G@IQ+ z)1SPB7EM&_xX4%F_vvC(?8m0YhBmLFIh{~jCEnnho)$+zk#g^+f|rK=F>X5AJ^#5q z>)ei*pncoY`*ecy7%d&jo^Iip^nSlPQAt=U=5JKci}*?+SZ;e5<-l_V4v*be>O}vn zsGK&_CPqG_jX|+2^smYXY2X|PzI$|27D>yZTk^CV@zNMrJkPO0WkfbcXaD{xkEJ8B;ZXOBI|r9 zOzM4#DLeY>ps=a3h01&#!m9l~x0{Ni;b|kgxtkx0Ae3DGv-58u`!JqC(Z0sK9an)5 z-0-*}x%M4=KY3H|Uu3-fCUz}XrdRH$f6-<3paWE+6OVZ=>C@Yw!?G4oV?e zHtW4g{9i^G?^xX+xYLlqF0W30 z*=*^5Ct-nW)rZ7$MJnf!Mxm|-?;lAIl198_Z7DU*vmYkz^Jl%}f*(IicA{1E!ZK+- zcKu0t`_6Sp(GvWTaRiR1kvmaQdmFv#Jm>_mH#FM6Pn-ue9Uj-4W2-YeI}ZL-Jy_jKkzGNpkP zE`sL4vrt&UaU(YKOKiQ710S4CJ^IjpHx&Se&CC?_r&di=(GfusPZ^)|L#b`*Tf9d# zqcHAr>gOMy4nK9cmhOL8=I{St|4N>;NVrHi;ZFBX<*yY{zhe)X-kKve&A-8a{k;>HYOOT1o0-F)SjedV4k(mm*f9 zE8S&cl$cLYjrjx1f;CUrkL$RDU+}7**#kl$#DBYz)qX^0JVp0gexl)0XdBruUY#!c z-Snf(hvANwXj8%FXsL4D>N`(9p+fz4W1O1{<7r8VS+Xs0<*6=n2UPBj#mG(n;w*ez zlG(1AhViQWk;)gYvA>plD^dB|Ng)LmML6f-KV7Z!n!E5O3?9bl0X>OI$T%vxWH%q^ zoo>Xk;Eca!yCPZ45>ZoAx4()^X!c^D+hT4p2`AqjP8fa@k7+BPwNLkX*uzi{PKm)* zSFAE!ogF9Pb69+t?i?cLV!pXPz=H8&+Px~p%z}|lJEB!-N#hU()qO`ju_(eQ6(K)2 z`(>GiBCYp(E?%ThVrXy&Tf$#jYD=}3&Xl5xG+Ssr%{G){eSFdbpV$;-V*WnSgkNj9 zzj!;-8MJf(k7p$|7Ar_BRIlX-S{qzrzSe9%_>Fm^(whmNSJ_tRQtGZp$Yl}>Ic>83 zPHA4*potxp)>wLT7&ISNtd4oyrUohKULXIo50_`ALY|DVOl}E{VVn+=pnO3a8!TWg*|E>!8Lp=gpi<9F<&Exo2g=0&Le; zLY`|%2s^pSQ{D>}j!8MWqA*es8EMuK{oex9jTOKn}LFf^e}%d*{#BkKF6@YV4??hvC$CoD6eIJ^w1z zUGNT)H?*@;I7*aV0zTeG3=e{H-r8gzfdk|;B$lZ<5ltDlEepy*n$zi%ze0caoX^^% zeL6FEm33L`ul)CqREssPEu-emygOs*>fp{jjiP6H{@~w~^r!goKbbQ-3XaXaxZ|dS zEu`1jE!xn7cyNU*!yhKw2qam|`}DD%DKDBPa|;>n4%QQ(tsDL`dU#<2KlE-;m0I>> z;bk36UDGd;Akx)9rJ(p)xu0l<*-eZyaKmq->wk$5$UKkAqnRrmZz7n2E*Q&JZNF`g6bfUkADo)JbDe0Ok;lkP0SV=B&v;yf}N`pQwB%uDMb}PUK7UrOvJf0ntEZ zJd{{#c0uM_{~a{$zT6}x1cE{C5=5~!IkcG1gDWI-1s5t`hKvMt6)3*0WFwk;eRf`v zq}ur%k#HT(#oNNy|4Z|1^eAYJ3^D_8{XXvQ`twvf@#V;lB%?Lq($js2T-Ng5dqT?j z(P!SIfA`e**1vIa`hci*$v2;cao8sR>}ep<>~3^e75;Sh>lq!v*%EFjD`5u5>zwG* zaZTE92w>Q-qu;T`IEWUb$I3P zh%po}vxqgOVlBn(M%=m#5RWTF{f-cnqIOZ(eJ{j+_fwoD-ZxkL3klq*geslbf6b4? zoCmTH0QUY{8NJB8njSP6y+iSozNYctN+0nU*8Ox#NcyLYVm;A(j!yd9vR&QH7rl9e z!8P+(J##fvF>6LSP24wG33MZK81il91449G0}P_IdS|OVQ(=Gq57Iy_zupYD<6JIs zzp#-t$(Y{d0P#Ed*6izLwaoV%1Ca}vpH756;zMA!W1GVkoPGEB+a&uQc_wq_rZ&YG z@xphbL>wf~RCzoHn_x0Lk72LO z$85_FEnN6Kb5Z2)#83KulL;_zqTl>Z+}1Kx-)xv;8K~$4ZDcP=TTA0u!xtK8jX;@Yuv1ed1ZF9U_j$`-)u>!-LK-=4xe(mj30xYhq6vpABso^JMUFdOto^MihA^&b-aBnGu24%LloK#b z&FE_I9XuV=rWkxp4x-3}O?B{j0P(6dQ6qY*trd|r6dCI8t`GsxR6}MaYpM{F-(1b- zgRIa`5+H0=48oHAC97-AkvWnfwg&?;5Ws??8m-}N*xY!vTxTbpm2{=JJLIwW~&ybJaBRxvq@ zF;@Ih)rU;zb*q=&Z$#red7 z-QewTR?r-BkRfV;LWiQF6XIXhhZ&&X#l%Y+(hJR(!$!)3NjrZWM8)7uoQumGwgCIs zagIRLXW5Oo2ew1}t4%`;HdaOqCbY_?0R2Krf3@gMDJOX;ZD%rY=-@h31!Pe5{1alQ z9@`AZpp`4UHdx?&Ona#hf(8j}k8B$6YL0)83n5#*@PiEbd*xW+ zGseBgh9!&R?qA{Wg|EnVB26*XLDF9o zHdz5%Bx*&;ID!D%91B#Y)4}lV~j<84*uRwhAvj3{H}mNWeQG= zFfL2QPiH#?+CT(nYzou@lep`QV2xKk0LcXy0;j6n-Y>XN(@|L92D# zr_^BKH0g3zwXxM;HsZvNlvv#7?VhuV`q)JIdGr_E*r&@ww8k&vG*z8M-r{km=Iv0M z;qY;57|?%Wr!c_jasH?MKCeC(L=0d4k33r`w{T6s697yY-NnUfvCH4L zQ`ySDZ>s0yfv-|1SduM8ibj;@(wIBvz&h%z2ZPOU*u*Q_QEqZ`wqobO{T9MGs$e9A zG@Ify;{ow>bCmiNy@Vk-?PW$SDi8g{tiH*X5=beE=3Y(!xaO*>|Ks2P4J0)d?v~vK zl#{Y~$9=_*^3Yn$S6H3st8Ngex(cWwii+3>=e4qKgC>rSqB;K}*E7p2m3Eb=GVv^5UGp zTY-^?zt{B;rfKXnXC8%ZI_SDKRk?uVgdQ6XBylKBsy;Pv4ojt z4Hys5=>^U6C`p{tfB9aw7p&vXOOez#&(PmP>~M=A_{M{{P1H-^kfId*Tf+oN`keY2iHAldxc=FGs}fk5j#a1>`GaH4 z;*o!r;A8%)!j+ZKk5+yIjpE56UA~vQ&74DA&&k_X=|#?w z>eu845d^&ovC7ZA9p_SuvzDj&KZbMiCyFu^I?2H6`e`M;E3r*`1wUszGT9i99BRao z$rC;$@%Lu@;N3I>S1aMe^dn6M`l!cosEMexUqxo~M}M6}GAiER z^cQ1A=NYcFxZWTczw+!4xW7w2&)lwod!}ur3&C%R`3@(ZFZoImSs8_IgP+}AoX|}F zayvTz3*&gjA$;|+@PDs24irNI`y9ep5Ikm#*Jkt+5_;SW!D(jqM{c^pq}Lm5k#^7c zD8Z|ND~)U}Z`v%n(%cT+$OEnBpTzEm9Vg;>W7&180+~q0 z1?gNqcrti6^C-q;`XhWK;(NhTKf-*2)L^!b_@#8?hK|VBJwuc)3$oLLn)R5G(X3-&E(;^Sa_H(=-=@;&I$Z-wh zUig=f7gD#(+l6OIsH(KW4<;ewK090O;(Ex~7d!ywAz%{jLxac@D1XG56V&6HRj=XUUDI$@*CDFNxQ%h}iX&F&byZ{- zO4Y6-YXE9RVvEWRZwIW};(V!p%g(Nuu zijtE@UZK&+)1sclHbH<}U8BZQEd51Pz508-O_b`&QSDPyY1Rr)AoY{ACDe23#O7ss zJqN8I-iTTQoOQ)fJMBOpQlGJ&5S0m?JiW!ej!3eC%ilt0&Cjc)vQnYwKYCZHdhA=H zN{>NFX|2|o8*W)u;`$Uxc_j5Z{Rj??zZ-4oZ*7a=8`knELX6JeGt@UQ|XsHp`TXjoI{f? ziO^m?F*bxIspp6V+9AsGN1bZaSyjwe&R2CiN?}yDqe%aJVhn>~;&ohFy)yizVKyR^ zihZ7~Fo@W6dW$i%7sOb4;&=w%GS$)-`e})J(lD_8voc=MeE3DyxBKk9y|=RqYFyCD z0|moFFrjocrD+#L!WC&(%>K@;A0JAwVl6NuQLWwF>qAJ{lVeia0EJfC(Kk0Y_l=i4>??Zc2< zUH{eo7H*3v86O8nl<6nWIB;7?qE5rtg2x0+OMknQ1w0Bz<$S>#3d46XxA!3TBg>|J zZdEEv6aVCdsrzHbU)nJ;qKvIIpDCQc>9z1FVO?crr;KZPcfCgTSkH)|9cx`KV@IiT zcByi9B<&S?D|v_%4S==BC4(yOVs05xk6e+}yiqG2KAx7MKhAI_qNn8?0rr<=K zjvQ&WHH`Sy<`48=5fq&W{axHHaRyLSyvqogy*{OCk9pT<1SAzX!kAmf1?W#<$Wxg* zRuR})7|Mv*{G=Y&9&?qjU3yCA1@$BpsiU)u`@u-zkEt06iy$+K)OL(tiXAy7ijii` zDqH$dc<3;cC{RW~=@;>P@V4QZV|*VV&pAwv1?gO)uD`?@bzRZ+INYpWB5GeN@%i1cRthI2;)msce)<63!8T$o6t%>StgQLHEFVNMz zN$8L>T8`wXg;3Unlx+Yuha;ut$L$z3PQtn!p?m^Md80nxr^mIcn-aq(Yn)oKyJNWY z(F23mw77nv#=~py=p$AK?ls$`E-Nuy?d1ehYM9OKz)()gW@3OLtB|;en`0HYt1#Tat4`lQ&qq*w=8W<8IU}yf*ji_SNO1B$6P(KktY6y@*{9=7(+|n zvEhhFiAK`G2u>g*xK2GKOnBzS4M*K*#)j)LhUCLTh z;uhpjKNA7vnc#Mh5zXtp1OGnvPj0Mn)BVe1f!T{lZ61R%R{HZIaaVk_&$QPtn7CCW zZZ&J|eDGiEe)(O)h8S(zxeTSIE{3MHp1Ja5aASFwK-A9QFq=-udBqmhcH+1tPM9So z=AAeCTqRa&Y)T+voO(@fyi0?NLWka$QWH-9bv`zo1{W2(3lMdfT)k`^?@hcN2_GT1 zcs_uMME(}%(MX3eOZ;8^o*x7kmAK=zxEi;flsv(D*6bP20Sh*29E_UPK7W(0-Z*t= zgC5rZI<6F$M4Zw&`K`v9v@hd0>w&X|ws28b7g~HxYWtMGfj(~eQt%sjKJ3-ijusC0 zLMO_vv*$$cJP79;=0z>|KRJBx;UsMn@xmAI)#FQkUNGanMa=v6nw^^ z*+o4rcKvEO78tr5vgD1POQY!Ao|nWqFwQrmoEgNpR>oE#KVxy^QOSYK_oR`3yjI)> zs12em@{`Qf$v-VIEC|`ck37%sc!}++D9^kg_ZHhJF&XjQ|u>pPxC8GrZRRJ*#`BVSi*QEKo8Of4)yyZ!V- ztrO$t6dktWo)xKGy`|Bg`HOUQQwD4WEENkv^Q}sNMoong>on%QO0A%j8kOeHDC~Kv zuhu(>OX(Ac{9U@)XhmP=!?~4#t=l|J=qGB2YAu{-)G=yT(*+D=2CLSX4LXt@{4ciS zb$||9))WClrz`7Y)**P_NQVQ$ULf)DB~t2R`S~CyHR^6tx3GAsM{Z_`~() zILw+-@mgzzcpaB7*mgJ>qW*BU*30!!>(5#96Y^+a$()om9@f6qnYf(MM+GKhTgRZ- zXV)y8SUZD)cMGfA)ZeA%qV>BS4qZP{D<~4RbHqawGt#~Vhg_>t`p#e~?(iSm#6zE? zg2Za{OX)9xTUF1ytma1m)&86X;ufkpnWMJZWn(+Nztq$1cCcq$S;ojl3)A4A;IZI# z=i8@>VT5gn6Ou(>hiB|SEVvSNiaVoZ|J9^fhN$6R$_&9(e^(NVO?b_!W zG(5%eNoMb_^xySiBWa2`mU4F0Cf z9|k}Bz+#Qm{Dir*0E4e8I&O7v;;%KvS&y1=EpnkQUmBt>YGV)Uue~a3aRp$G>Yv+W z9k{ut_cfDk&K$}0>)pd0WEPs4*HSJdio9k{=K`1IHs0xGgfUzj?mK5S*O+Q^!`;ujDT2a<;6)ul3K6 z&X;A|Ifj7yJ^3!jfQm}SyXqIk*L*xu##yd^QRd{M5*E-jzeQA0$oUT7PqV9Hji^RHier_qht$vu4thxb0dCsi9-UY6j0w@)j zxpBXW#Wz;1dnL)zF^dvcB*cf4G$C>9l^ub}Y;>nK<71!M>2s_KGeL>>?(QMHCGUhi-Q$Mx`a zNU4uNQ13sC4}F|QMG5t02Q`IVJPP~TM#Wx_lj055ibH}85O4P0)_E9xgzeW4;l387 zfHWM~Um)(8^tt?cuV${wsM$hTlM`G4);Se9!O&dXiXUj=-+ePKA_$!zX{5MGa84Ht zl7Zv-i4a$+OafocJV1g<$2ST^*piim+TT`HFR+2euV>b$oc+cXK2xr;NA`+6jEIvxI zhbr=3bRY24ze?6ZlQ@baXkTj@nD=)S3_BmHtpJK9SlHj#C@{V+muU=h6%D6lSTv4x z(V^AfjRX{s0DEX!fZwz1XoMZRvmSPiaBPhov;;p*xXG-4(q_#ZvMIZRczY?s{Oh z5N{&?7ySp8*^xq$rvHrER1%;%8S?-KEjAEl?yCF+Ge6z!S=#@^s&(oYs;o3nKuWbn zV_k~PAI5#oE%v^gti zo}I@()ea*4O@qBo zvNDtR3DcS`n}5RlS4URk%0NVDQt7~3p z6Z7%LIrT3@qlQ)?yf0nHb&@F7uN8e`-InTW2scfX@MZ{SWtS8yi&8@R1$5%n30hf! zs8k86LezRq0w<2BQJq!6XIE*aM2q9WRsf=ACO9XNV;T??{n&T4L8hYR`P^qwI3%=J zYu<)h;S74cCcg>2NlTp@Kbfi25-xC6E((-NXo>cvf0a6=;4u;DJiTyT&RL@LrBu67 zW7P|iujs$RspVcazE@GahDb=Rj(@wB$()X{z@D{Z{j&O4vZ#)vO07!qcd741eQ!hx z`l%3&rRA)#%p0UtBr5TeRmQ#Od*?$yPXR3^j@WpTcV>EIVS1ev{^EA;5l*HmoIe!C zAooIox5HDEF(~Xv2~n!u@?YAeaJxjkZdPcw)IhCV4djzyW+Hoco3SLTM>Sv~O{!GE z6?OuP219n9n39k`yQmtclklF~-pUc3kv9*c#NUcB^9ASUQjZsJROTv-U%_A%UBUdL znoKgV%fp>PB?nN(l&D=Cc_^7d3X_Y>)E|!Q7&sBeYpWz@^!FUEcmyZ=YosIUDodd9 zQp^`d{$txVJzMaq(dt1ubQ-e(w|hsueY(g$^tov8IT>~6>`xre_U5%t7>G%R+rOE~ObgzK+un<% z^W{>fohTBC48ijpB%-2*xr^6z)YCIej$Hh6fk3Br31h~uE_Roda!1kB^QBQHTs%>N zJ)F(DXy^-aS`h1JH$*gPDW{A+NlPV*nzoUX9aUppw!o}UO1wypjcngWG!ai{BX43j zygRbf8VzS6MY0xW?|f=EHh9OVxel$n5w(<`*}=Dy7;7o5-lo>kUyYDp^wmO8Y z4XDo>CT%}Gz`7$hhSqws*lJ_7z9z5swKSp-_@TC57cG))D(epgfO4O`4@eARgpu%b zUmmqK%{8qrR+lmnbTtDK_dnPAE+{$HNn~(+djPSSGrJ33k9FxL6rvH@MMZvFt{yZV=N zhDPm{+r7CA&D)&NmjMWj9~i6~WKf@#B$ism`4|HzT%mFAYdj;4VpKfXdjrq5(nBuF zdSIc?Itt2tv&4+)r}}%mmwqa4QaBF>_Kf(zzSo+!urJ#f#AcO)1Ettk0G_{Kz9!c0S5!N13atk29dGVJ+=uD%gHCOLqn9!%#G$(nZeU+arVu{C|) zxk6aK8h2Dmv9IZq>qgc`tu>t9kEqEf4#R&P-NYD=9rmev!)M;lsU24&pXm4u2+3H< zd)=e{t;P#MUn6aI4v#U`Fv&Vn@{;MN#WTbe=u^`BVAe4P9~HR{YY@&wJO2Il;p zD+ccc&KZ|2-$=}txX^J$t;wYSLR!NRF{hlBz_>Y)tg#f4tYdUJgZCW6ah8hZ4?Ity zaJW>S3|=+=fU@>J?d!FgEn+c;1%Cf|y>GeHPS^7V;LDV%tQ!`nV&dmSpvLGf?nLcq z*5Y!LLHE1(z3Y(=WK0j8+h8JNQxwRQ7&lQ4le_w1jXS7`0Wn_|F9Oh#8_-_#O&dPc z+?DY{Jw|&w;{EhXk(85jeNDLatKiULB2@ca5m^S=V0Gy=R)%a{tl>EZGk0hs;~-_5 z<2)cJ+&3k4LM{orIKOzEt>m5C-B}e}r&ZP*+s>@6UR@)f9GycE_;G%)FSI7*Y?{WM z0CDaTGH;RSm*!bTD#0`TUCL$_^;l4Am8O^>4%Ij(U&^DOBo!W&clqk-C0PKzieAlWDR!21LI_#CpA|d z;&R5l;^ppf29)(P_B&L3YNT&7>W*x$Km2!J6;VJi3{^j&Lvu@%8EAF)8(6QX zIa|y&trR=!ay>QCu$Rq&0gxf?sEmFAi2LHaU#yqw>b_XVWzVCpw~^>0^)D#(FfH#d zjrtP-Y7Ke4+mLgf;0zpr+Wd}3li%uIR9rR*?9oOLRaP>NK{fot@$WiGnfYGtamzkxS97jKCq$6CZWXNSCVsLm9Rl_-Fyo>% z9e9U)>b$pOe0Siir(?U`4G70)*B3>--xApqpk+-aN*x+;B08ug9scz;)QKi<$9Q0j zAD`<-uUpZ?2DRv?CWL*{*Lcfpwb4-hy402VcPnP%^SJ-E=vHOG)CSHV+KdCaeop*Y zeCX7u~dcCoR9h2+CWg%`I z!-cC6HMB+kT65TaUSxxxBOn-5C(gr$|BOLV<1L69Fmfa47aBEqv-N@gx>C<#B%jxUUy=)3$jd8{-BG`FSlH184Qeqrs_9|qF z&r?^#UcGNQ&lKpN*Wx=OX=@~AB(M?wMNGz-FCu=ow(-x9zTC>4x)HOOKe)`i|GaWV z;E=I+Y$M}3L;7s>gKXN5@QEj4Gbzob95(3@!ThCu3@Gv-!*snxWhf46C^%T-3ij$><#t97k; z9z^5`A+y0*BZl&sl(RegBQRFuV)S^K1~E`YGs)mGEHLpI^}XRLETOUTFB^ zpgF-<&n(a(`J`lHIWCht>qL=fmyCShb5~K#{LR&lvc_zK=Ng~wKkf7JS>JV!c&X6I zpWK1P`lOi71G@W5m1Rh_W5U-6xy%NiJZ#o#xqsLdD4e{2&36K@`!I6{zjDJ#EQ&zj zwGImSeQ4$+po~ClGy+9|&$@;@g%uS|u;Y$9J?Oy?+G)p~mv6WH_S)uzb+TlL;xzCo(n}7Z5vv0liHecFyyFd^IXNqaYM(V9W0$b&C;cg3`M&5Dt z>IXgO!8@(qY5DT)ZoBQawQH~YQN`mFEus|zho z`=oYW&J0LX<_XlcvN^M(+H97!t?GMTif^71wQxr&wl4y-!l1M@rq;b zd&Cg{E?jfL>)-HtA3GT%!0z#O7&f}0ZJ!3jr-VJ{>GVlG_&je++GINp@9<4WE@KehhSj=tn0h_X%qe!rg)0vbCO_EPeLxTvwm(0tSNue?9d#r6PatD^(Z z%2lB*&qRhVe(5Xo=FJE2#y7lv&6*3$G?U_puIgwfaHY8qh#S3vUud4V-(DcVVfVV% zYhU*U0Gl>#dhTbSD+MP0EP z<&gsuZ#=k@_XewPhUxIblgNdWjqWd{4v_lyhFghljS6-gx`vwgEPU^1QkM13#VojDuXQ&6Om7FyxHq;reliau<{m zOXKqz2toqWb*+rL85lZ$_a#?4iLxIak4z7ofFORdZN}x;=M{r7PPT^S{%%n9?G)(gvLQqK;?&6SYqBN zL6wqxTG(Q^}KgsRk z2Jrpq{_0#KY^i5>9QPH(%z3g6VC)y(j<&IWY(*yHyFw|e*aVivP-df%a(DvJ^Q6>! z(dqJ@S7_$3{`b@a{Y%{%QuAIg>vnub4)1Y_E8&1}g*@Xvf=Ft}uuUe7V+4c(<34SU z7h>13jdK~^8D70IMnr9#6^>-%DTdG(9a)@}!b@f!-hov|>R9+jg~QIIl_`b^xiX}RJFBS~-$d5R{l-R%bQHfc z&FtUZtDJ)g>ycGVX}rt$igr^X5AqUi>frwt4fW>#x85BPSex z(Vs6GfEM-7r8R1)vtzyES4s_r>F#cKyUQ`hymrNk?TgO~fM-7I+3VM@d*6HCeZhqn zM*5|09pa&@O_c$#lhq5ZKnzfC0$>=tdK@9=P%5H{H~)O)ij|-IWe5ztxGRw9Mno1 z+cXz|4w&1>S;X$BygrR!Ko%7~X4U6o`s$u+n&{SvADd8AkHZ z7NSybR!<)c{IkEEWe0@zVA`uySkzUS`KG4~+S!-2UQ+QXQQJ0QzFaHS`3#~8G4KZZ zwR^f`RVw=~B09RWz1-Jb>`UaAzU%mNMi~L8Ey-ZzyOp;c3A`^f{erW|gUj!pg&4xd z4dFzcFlsnIR}b|VQL4Nm?$o#tGSCE7{W7!#IcdbU(`cN|g5U!EmA_|J9yFQ5e8+Lgt64 z4wAL~TvSm2CCYRjnrP|#G*MCV0g;g*-%u51*nK=)Wk)&wgdx=P42~=8DWp8Cl}J^+W?ACt0_gtuPFUim+Pd zgcU{osR7bz6?i3kw=Ax7XFM(GTECLGd=sn zZsxb*`CH`w+W*9dF{qvgAl9XG2;Fc0=6KtuORRp$U{q=zY_8a6QOq5=7r*)MeVuBn zv&?2vL_%RROHnhUtn=aUiFGw7^#gHtqC;G*J;IhVEm4!KteXN-NLDa`Jm)#jJ><|s0Xgs7-+lh1lPFIs zIuRH#vDVi^g3Z!{(}U{zw*5MN&7`FXoX)U$xl-?>tShneUB&I?lS!a0p85CBe9BXv zR;N_#_XP_U?!MdZ?|A!rK7QiIPCM<#QMV9v6abn;-FvM^f+$yuY=(}t4NrL7s>O?uV-+skg-}cVWeg3oG{`R*@y$YC<0OQ(^7MLkpfwLCwHLrc`%9T3+dh*x5 zcJ}|CUGGchoqMdmEO?$jZ@v`JcSi4j#3Y1VdBv6S;jOpcjMk)5HM`3D!|5w3lD=b_ zukzd6GCTup!ur7G-{+KpElXL=NUev7x-1Jp;&nCsc>$U_u`QlrQ*BBX5yU->;TIt@ znD7-}4%r}0>^@->Y}-4k-x)pArk-{neVofe-WSPj{U(de?|N+&TG8i(HKmEAsrw7M za|cQdnCU9}NCmkqTj-(q8u?LtJC~3{*cbCz5!KLh-akn@QlF4X)^G;bSs0#}5Xky) z8N?Ty1#EI!vppBySiGcpWb} zA=|gwLUBEWA6Z}W^GLm=^XtqFkbOs8DTvzC68jXTmfj;#>+U=U>oCoieM^N%a!V5# zw2zx5_Er2#%B*?EH~=X;S?io7>MheRroJL(?+tm1{+su=*E9J+YHmXw&|H%rxZ-AK zLwJp%opT|UKUgiI%RN;QnE-zBijBD@t;A^8)kLyi0`88p9uSjW&+NKY#uvk$-9z3| z4}b`l(!EAnO8s-ekLj7`Ak=eP`q(59zwDk^RG(5FWLI)L;;^fSm%e@VI^KGIN7k7m z?%Ae~NBUR%H)CS&7j9oq;vL&v&gT6R#tYBcnoot=tB7sXc7&KI@2xp7`yw@_w>Yqg zwdD|HXE z&gdPpGxl(s<7p zziU)I_$-YH7k3+qL~XFOGx%3S22tQW?|kpqPyX7ke|-B0-F2?_=G z-ye4Pz4zK{F94Ityw9EVIZqs+3TV9pP0-bZC~V(?vStYah26*N4@LbIAmt9gQa3)X zkpKrETI^-DwffSRyzD^_dPwwf^QO%=t-EnDnYVJqih1+roB99mi~nW$_RCNC#>r#b zK{f87g(tGC*JbU5xGe_gzr6Tg9{%u0#v;db7;eA)w)N}QuUNTa>C$DB$;7DqAD;UU zd+xEv2_OB4_t)o$RI?7e$^dwMwfa_)Qh##j!G})f&j)b#gYJIT*=L4NV|Iy3ebWz83P5#GQIx({ZXqU>cJ~kjWFP4xgMaS# zb(@V42PxXi%!R#fN+7egki>=eOYMA4_jlhHVgGA2vC{P&P&gl|cJoLh-y~o%OL$)_Pe`Dcmw-eNpZCxrYC9bRtOOKM-bX4~J4aj4 zM$R%SiGQ(p!CK;sJ3u*$f!oU*R|8c1d<|>U$uMxhqEScZegWT4 zz(FO*b*TPJ*<`Bf*|7$mQST#dc~^GUeuo{ycNE^2IQIemJB7=$PO|1O{DRoP;LA~g zNmY#fG(2*)&YYe~WV;UrcO^DbZ*F)0GM^d9y-L3m)c6=vm3nc!8t_PwD?!v<4q5j@W+~K4XImrt|B#O)5z0$ zzVaM0c*gn_-sSpaUX-?GeggWS)*4;=-0H(kZwgF;4H33;{jdhr?UH^3q-@@Pt#<{_ zWI^F@U=*i@co%nf6l`xJ*RsA#EB5Vk+7Umvo?90$%K9F0uBhiML|lMjLz7QxJu_t% z+u-7Vh+NChyg;=h@nC+D@rZAmW)1VGPJ0;V@QB>TX6B^#ks2Q#io$hH9==@yVo?jbOCU=D(MX_cOO=&Hf&PZNrRNjg!B&MrR(JuTq=su$+_2 zkQ(zR@eIG{xhcv3#*s?Ua+h(dN=yY17ng)aV<_qvmAw z4m%uqoG)0<7Tt(d;j}A&|5}dA5|6C zlGH{@sadeDPZpCv(AP<(- zt=CK=;XiaWcmHxDqK@4={tZ9nw*spkrTAX;O-hYM6+jwV^_>tqv=sak+V<&=N{*o1 z(#aq`h<1fhB%gdQPDjFZw&d!E#^8<~UGFG%WmQgdfs@Blw(u{H7|pfnGrUNSE%LCl zHs>x(n8bTw`Zr^SUzq=vJAum`xd?7ivA+4NYazN|EqiqoI~AnxB$ZF9loEQ96ks#kBw*ww0O2xZ#5i?;c{mJG3crqx0v%7r ztTF%XT`cq_C_3ayDk6Xf7^E~3UY!1GI;1c2yS^~#V?|O#<;G&u8dEy^);R7{W=Q|b zGaw8keQqGdC4K3?Ym+?eR*Bdrl)rmk=>_o$3BM!G17nO|o_`5zIFa$Ugbc~Dd@v}4 zHBtT10*vF6+Ey*T&m@&xO)>!`$s498g)tiWK?@(kf|TPzTS!&NmbH$x6W0=?%s~0R+9o7r*UGvRH35!3^a}U ziC4K1O;-dq<0&M+3{$Fd#i zc{1`bAr3o}LC}>|8iorAR2s>Csl%)#W@1e~be6T;4IOw!)GdKypG*@(t##8B&F?oR z3COrvM88U`>CetkE$4S6?Nhh;(~$U-8ij*1o$5JoEr=@lUd9x&Z~SLsn5Qa)Z-$(i zdq-TG<8#`yzu!A}qmRoX^-q!D6igz{6fk%(S4hy^PSwN(&&)$Yhy8HaewlN; z93!}(%I>EQzA4^dvm^>t3ZgV-l_RvVwR89>ANbI-pYt4Bf$+Wf0>NNyPIcgZdSykyz`nR__AZm~=qEin zI{vxOf98Y}KE$2^7*zE5R6M=sEGoL!^ ztTPQs3l}ZgZTDTNH?w|~lYLQjtqS~i8)YtpQNiyj5)UT%P%#!D2JwmfSN#vBXPctd!K=>_|AVh@(NaWUYMwf` zeX*vW!Q`Z?3VaSRdt?|uFBQ>Z9;8wbr5M>-fnm_->0pSO26BADSVJB|3!pY*Na0hT zMH2T=T>;=4q3!GFk!)EhLk>Om)br+S3uy9{Y5 zn^^9Xm4t2-_(dYhd0qrs{B-D1SGhD%0YoIqZ#gIH$ZF!1c*Ed4ujLund@@Y% zwmV(HQi&auF!F(F*~-=NU2lJ?mBU?Enmtt!^@tx9(HcXYAv^r<=}AcM}?Ha#AFtC?G*mQD+RG!kv*g1C#SM^Oo=q|E|e7Gop&XVBaRQ@iMMzjR>sv9ErA9k*&x9Q=&8buQ5wX zd#;uf`DbZIiLrHF(90~T#-Nyi4m4F30|#^DIKf?~%+90ky~n?~H9YwRUn1cdcjppF ztS)vqUnFb6CHE$IS++z$4rk#6+ENx*BbBwqhJ3=pu_-?yqI$#;FFf$TgMRS+@BZQ! zzfk93O9Q0&VV>ZbXyFyWKDTz^9H(u!-3}c5IX^xdg%9J)9)cf!{|7I6;frU^oC#q2 z?RNy)#`EUw_vHQ1F>n4n>(~7G^PYa#Gi;i8`5&%Ww(J3ukNDWJ=U#j5v(LUumMj5q z=bcNhxcu@fue{QOiajHMV8*nK4nFuGg|1n%=Aw%(hUmug<{$dhr|z`V&hzHYyZf%Y zuDa&R-(7r(uP_xp$pmL3xiL+i{`6nIr|*M;eoD@W_9y^@ckdW=!O3{W9AG9 zw%>k7&03vYMHAg-$yNs+eCU!TOJ>cUbKkx9+;GDU|NFnc4BN0VZ@2Y!JMFYXx`D{{ z+wXYT)1NLX>(;No;QaG7c#jHl%*;kxIX(y|fF=s%wyx`LoWBR(?+N=oY2$hG0KM$8 z-!EUWTr`%$X`oy;Ry&DB?#(lv{*0Y>*=4iMHe0=F_0pwxoOi*m@3?KL$q=j&+MMU< z%agl2c9;F0u-^_l?zn8(vg`hQ-5-Ac`(+O8IkygQ`n`ICUM$Hfwg!Q<{ zo!ar(y_hD1=gBe$sZyJqO_hU{|{HWi!`2=BExS zn~y^Y$4|D7m)vV@^EJ4I-u1luUaVqQb|Gd!Nd3xr;!CFwV+gm2j)TTVCoNZfwAmlT z;!NXl@L7GR;f%6e~0I^t4uB<`a(-62(tX!etofoCwD zU_+Gy_x;ebF(m&;Riya1oMbVU)l>8pGJ@?nK33mSO$CxOX zoVEWe#WLVzuwe%?mGK5oz^=}1^0za%RE*y);^h@dN+O+OM?nE7*VcB3e(3|_b)}+I zY1a5e35!XF$mb>L>&aYe=NS6sw*uO-)7G2H^4C?jlwI*SD|2VUl|z0^PXywAC^6T& zCuDXe3HoiFWQfb9-|^usDpHQ)G%K0t2`p~O!uJHHlOA&G@Zq}~Sp6{v^>aZ~XZTY` z_*4q)#ycjsdGUzb54=}#57lZ>!UKHV|Co^fUhV zKXT6JGx`|66rX+Z`+(`4p0~h(!h2;BRc{#Lx!-L$#fn^SVVqE;v%Ue{5}L12qr~6#wRC&)OI_x z0zeFr124vwK3t@VBrGeoPQQfH&oK+@lKxYBF}8a>4)#{?Q5d8E=NZ{!Q|QTy3RgZ* zo|8VX4(&{E<1*Z6Q$44;bKfif!5Up|gy-fh6A7(g#;Ly9$!rHm7{aG-@q&+-J@ z>!M+mLX zx5qb6*Png(%`E>%7?s7y?KAQv*x04hr&3W{_3f=Uk$yL)5R{*bV=~Tq#Cs!&8=(DF zw(jhg&Dzj)9;BXg;hx*R30_0pp55+_FErUfDSi5zGL< zvg`Ojdqkw7FgR8feRFH?k3kX^?D2`~Z=$h$?+g<7#;#%k>gt}_*dA7P$Cz3PzTa4r zjO&a>KY)H2&y)-(s5ZuuZ#$K(hX(dX0^tMXin|wKRd6Sx@o6YCz%NZtqR%J8cG=Ye z;mx)KV{TDWr#X>n+@$Sq45wk{zXPFHkox74jM*}sla^twaWo3v|1z`nY7LIdExZ|m ze|*0yFXazR%`F7c4txU?6|@N|W8S&ttZ(4|ZVV>yrh8aT{7fm$(6{7o{9FB+0Q~jc z0^{2|xPU#Sg zv&n8EQeyiT#bjPTt4CXUCjwB=`@!?-ic1E>zi0PeUW1 z_h|QGHINf2FtpqWfFANCNL&d3BW_Coob!V;InjK{;tfTYd~u2W$|_@YJZqx1Mk0xZ z3E5!+N-QYhpC!Oc{Drw>&(j3H|frmD0-i6UIR(l43)-NGHE zeY{=x{ONezdb*SrOm3N>hr*p^OI_rBS%OikWaBGi#eE)oThx6uY1gIctfm*g)52-9 z;GNPK62X(|Wycsx?-4s=u_j@#kJFt{jT38?wNg~BOeHOHjiBr<+Waax8_+$59wTME zTz}8TcEW?IBCqRj4Eo^TZFxu@cg=f9nj!IWXISR>?}(UsjAcdm5v&`P(~)Z=BmQf{@gg16^F5?AXn zT_S%qQR-W7F9#T_j)*Q-2D1~9rC|vupQ zzz54e;9vv!we#4FcovZn!9#4xH$IcR)nmC)U#L^eCB-P`>#35V|+d!WZ7y z^>}W#il42HSuITowQF?;haAO}LKvEJUHd=u);#^L{AAC5tnP}3C9S#7Rbh04Ugs_Q zy~NkTd2db}lk|~$dMO&}Zxd>W9H#Eg!Sz-t+5qzUqEh*)cMsb6l>YW_qKdwFUI!kz z!*KrCtpV3ftV2wooQ|&RbF#q-xtU;JpjAR>bSe1V+^_z z1Mr{V+Hnk7Bh7;zE}FHwKlfe(d1^|F>QCL_V-m*=UjEyK-1p~c?J_UFX>c7o{E`1G zfnCP!|%5OUEs|$IiO!kC{^9zUk?g`s8g3qg`Yx zAe5$@H*}u`$|eF+{{L1yE`ltUic4W>Fo?;8VgLY5`;lk=Cxeb~{@pDGCLY90p0n0;y!g zEzclw&b-|jC~}LlzU`wVPjl!h+g~=B`4%IW-5S;QRrpW4t5f*?9FsC=YYXg270*GutN_?Y-J7}Bp{>mAcjQ&N5VFC+4%R)VYHL1`fk7NiOTvi2b-N4bb-)P_t%Ot5= zk2B=o)^dSPGgh>dvi6@h&i2wTBt%!oGX=jQ3BN07@dCz{|V&j6^G+PA*KB|+aUmXgOOiI+dE zm~?`AWi@v~8uKgE<85E)3-4m%(iI||Pj?kreMuBL8+f&B87{d`-lA*5UWtG%(&V&8 z!#x;DY9tOU?7>yiTDbwDBwzyCB`w>O+6sCIvPA#Jp?A%##jIPQwI9^vjJctI{Za4o zxdpszG8;quty(Z_XR-?b$bg6uZ^==3^_~|$ zpUEc|DRa_(scNoWbz}C5?W(cSGA89wc(3b{=jPXf*J-^x-4ta{Q_x7AFtl_SO9cl9 z#dyp(g}6oa%F9#7sCt|jd#4vGaY(#yS1M81gj|lp(Ub{zh9^Fe;f8bNId7y;kn_`k zM_LhIM4BB)HoW9qF;Bb$$~9T`3@iW!>^%5Yr?8G;z_5q- zk*U2MSLfL((Z|4AInThGQd`>QByV1X%r8c0i%}>XM(ij#%0oTbSCCj$Jf9If@g8nm zM{}Cqo5bCqQ_w<#++OAFCW-e`3DxdpAoa6KZ5@xEy-$Jt#tQExW4-*|sIm0H?Bs9u z37p33J4xp+PtAGLFXr2CJiv%joz`1{DxafR zz1l<$$-3*RKEln$JAhBOABq?kyT5~$>(@;+fqgGa5#y*!A2|9p6cL1oWXG63^**%l zI@<%YX)_w1oo?&gZ49w<2VHM$n^6Jq6m|wgdPOW~eYnninpgxjQLM-1J}%*9;<9n` zADHg;@&HFPA>h)UnnOP~oOd!H*78kF-;(Zzq2xa@?L);kw=wr;pq%SMR=rw)a)NtV z867w?DW8zBwM?FK+QV~`DE&u$jJ8|Kw?&GU0Ff^&~ zgwDg+)1LH=r4VH6365kop6`4+`UpbEC42(-mFbr42$NKV77w#ed|8uZf-&Ik8~~<^ zFDqkGYkgTaZ|pu;l-AQgA_6NZ(c2~+^vapddp_w0X@gI^(nSFL(__7=l(#zR8X0RD3vVu4!LOlzE!93{!U`AL1-ZoR zK4vkV_RpY7Is?60A4v)M>=kYvwgPN#qHr^p8sK2rroB)vjtV3{L-z8R~iuiq<)-^ML^q7w9Tr&rc{+yt$cph`}3#dg?&W@?$Bl4^RT2h zmkK^}v6JV?=J3`{MaK`Tc$y}3$6&6bmqFHrTi)D49y0+dFL^wZrd0QZZn=lv#E!rv z`Ip#>l2=UIW-rYZ~sOb)HaUoUEv2GC*9bKf_{=@P){kT*-GVm2{8h>l9 z4D6@TuOI=A#U0m&<1I;%*S|d}k>=hxD+1`Ewt0B^{@df8xo>w2T00*kzM?*^W($yYx?c>F_zrbK0Txt{-=ypyvDVz%xFVV=);)AP^4QO*aXXdXbD`7te#C|W z6KliJ_HB(-E!ImkWa(is_DJqzd2gB;>Ux|+;^`piY3MTGDWbCn~`nfK^VkW zcD^qKq}~V1Yh$zIB3rT3LEq-|+T7o`jZAV&oDWbhZO$%3G4b_x%bB>RY^{=-@2jnk zGISVGr2+}%BpyK*1&mPFetKC;ep-4Yq`n=#%4)mKx^T&;hx|M+sG%{Surr#|JWig2 zwL3z?2cQrW=sj0l&o(*BBkNb(5CE~0=b;du8-R;(6HsCFu{=`90s-fOR2!vP7f%ojL+J366WuKJ}W4TcoATILXm68 zOgt0ck>NnMF%dT3Gg)f%@n#IR`1V_Tl}thUjuQaAJ>4EioACV^W1rWfq?VrbFlz23 zmM3!z-!eHbe;3I4rjtEnDzLspP6<1z)Yxe)dT-&%x2!)x4SS1AZWx`k+{|U(31{#3 zOJaTi46?_eBDL_A&6Iv%Z)IH`+BTE(#h)wJLody@`ff*mesH&$)*iOrdg22Gy4u9E z|M6y$Wiz?_*0HfetC-9XkbOfZjfXD4B|x_ewbuB3OO2!ExW0q8zq6lnzygZvtyp0}7`GiHh&tj7NbGuX5m9rE7;dZpt0U|V<&{$pW_LzLl2Qex{ zXKXtUyqz3q|B?p-E#9_GN??sMTCoVkT>W!K?k1pb1U-x2>fGYuvl$b;foWNfW>6A@ zJ{Y5(l_vFB0{A|*L3(ZeHwVVZC69#ix|(r-JP~6e>Uvc!^5hV*%+P#vdo6{&5#8dT zN0nN%zFkK_0SHVzK1#1x2 z_wrpCHIs|&*Rg@9M=7^b7ubza`bV~r6Jy!a!=g=b0e!ht_NE_CIR`1_du@W+Tz)i4 z!~CmxyrkuNO$K5RbA#kuAZcAHZg1b7xN;DU#{ljaJu!&hi|f8Xe0&S78Glcj zB|MAs;|Mg3i`J2$n#+fh>4kH5qjYQjueiwx(TR;N(vJrd9BXhzVD3zo+W|+xC$Zpl zPrUI8HwdmvV6$VuJn9pHTGcwkuR5$;+9n86lzP4m+C6W2r?@pYq&vD}k6y@6`=erj zw0ywnlOA$oJ?&boxUb)u>To(`r!yvXu^IszekuGr3Zo@YmHBc07=a_wL;tX|IoUQ+ zavSw-O{a>E8@65~bqi6ctti;F8A!H#vmL<761fhFr00z%@79184JHXPls~A8fMg3t z`N_37`2^?;jK=#axwQZ0D;%vou2HL<)z%dLOWx2gX3r6k+M*F-3|@dNr(B9P{Asa~ z-)~@&2;ag{nA37gzvBj?Za*tHbD*K+L}p*u zBk$_-sgB$n*Inv|{=|NoQWOf;_2-o- z3BD8Nv!k;2efT)D-9d8?xr<~G z%==vS{PNKca56u30Kw7%&IaZcC^VMUL(1uhwwM>E^UDQT-*JIBxs$Xi-f_tnf2VK? zej9uwR2j0&LjrwNjW1yuf+cuU3q1F&+ZFv1+qp{jsAZcqK#7V+H)sUtY$pplZeG{7 zA0>mXtB&fSFMA-CgTPU;7IwoeoS)F|#bM+-__`f62G9Tl(G4?q;H6+icg>$ zzne|w%U;c!p!cb5vM+I1M5e$&TbU+M>rBU-(=gVLmV-Yl1T#e3M>9TO<`O+Dy~QBg zZDun*6E|L6w;@|muw=D5x?;~YA8N|KN9%7N2@e*3mT8qt+v$vCI3Ln^F7~p%&VJs| z|4i28dK0cPZ*g6|US1pMa@wi33J5fFK%1ex{ZhpwNRweWgzev0?H~lFza3oxy6Y)6 z%n6R-(EB(0^Rqokwagf=pui~Nw?Yt;jek3k1i4@P{71UyP9tRVj> zdtSP9T0(60$Wb)w20sZR{8_dBU1E;Um5{x11VdQJBQ;NkL z3*Oi=Ip@EMv(9IeM-||sna)R0;2W{)l&epiP%z$};{Rt|8qW|Y!?vHR6s!?SsZpWF zvw%&#yhJ%W`yh1t=TsxP{7yso+Al|SS~qnw8Ms$0H*k>9s)@%1=nXxocO3#j_dplD z4G`(1HXfr&_5pbixEU6s83Mr!XLrnUJX7O=`+b?tV5->Ri!rZOG_12}a2%T^+_|^GA%__@k(atM^;+QP8ewSvU z4`gVt=PRm*1Zf=mPh*BzXVzEvdYb)NvfQ-x`eLcVAtZA@FVnXNKYKlSHWUJ_gFD_2 z2dL0&8S+2Z=}jCPZ(S?t6x&X%8R;8RtiOCIIZu{Fe&F_GD0)RTeMI_;cvbIJ#b5|0 zZZWL_SEX<3MaOc8g#5q#EO)Uu=wQ9fj7<1F$<7nwwDhK0$My^Ayt|`eBNi$7rP8A4 z^7-sW{8!ssSKYMdPGw|Kh-1n=8BX3wun=|>t1NY_)gT~9Xj3wW%;}eRg1n%l%-z)C*IE zbHN}cX-P^*F-&5Ku+;c^4J@R#uiI!mcmvjZ*qC%>6xUL7o}AQ#b(4JhJORVSqV~8o zENBrPKe$S2=)<`^!)-iW|lr%KS_7Bd(0W`R0}*I z(H<@~BcKvKs|m$8H8a5+u_ce;Ca@g?%Y#Q5xt$5tf*RQR(&XIl-w;=HehJC=8GCt;1Th;88)ez1n)hl zS@RA0H_j71_oAOMXeFH5a9v(*SdA_Y0%*}e*OAmg2boaGoxc|9OB&&fN_h-Ddb*fC z=A59g7~RWZlUrV?dYg>*s^WXYFHhj&s71jw(SaCl%+aV2)O=hBoCJ=594C30NNii4 z7~A7ZZJW}?IN#o$OdWa<5a>M|rTSM);K-lx-vfWrfL4Y45&UUwazgLycaWJNxetn$ zy#4!M+>H4Ou>ys#U)x(86#ee4wfwP!F00l~e`5{Gt?CG1QDW}2zhz1(Hi?2~FJExH9q41lY3 z0V;GVXMhX0$$5VNpICoJW#CY=ogbb_v3jObt>Q^$EvoLQfJ!)+K54(lK#lIi>S-W+ z3A73Hl@fK z5_NWHBe5*GavzLyB!&b4@F!eN4MmQ*d3jsZQumEN958or0DbcP1c}Hs;CEeAP!qXf zKVa0eImnCa{tr>k-FBVN=BNXT1#T^!dzlh>t0HPepcq&Vd_0A9P?88d&oz&+d#q{YX6EBDz!&p8hYM8+5 zw%sKodNflyB<$4%`q<1W)gbnzbt!%F7b zkSJcwTdgDcL}-dj7%^o0tVv5ACE!GWJQU%|)b7B*d|4|a5*BVh48{3!T+sxoh}bS@ z-r|aDQj5hds9frm*W{^83XB@q>ez0!y->;Eos2e&s+MkC#B(Vm?!K=Tl>d2UN8<#e zOB#;jMcRMn{#BcaeI{?q=VZ!qpA=_wC)=wEKsU{mcK&jKo;lRKM%t%5DW}k_hOzbS zn!kO<;KtCm_yzj9g!+enL6LHp_s?@X96AN9gpoL&2b}(&SeE!roRUc2=_6C3yHuRZ#m`ZIS~*s{t~|3i0AV>T|HFMq;%1EgSc1Pl-}DJ{vLg2~Xh8zWOUn8^2ZrIlJ? zV-J0|%qSIHXmq?x`1KbngPNi`ti!CAH+YSp90n&t(&JkQ)pV z9peG?964kQNu1xlEiWX%ea4hCY~dPC*XL~&hqtBaj4UCv&5Bv%0#@|cD;4WcDyHvn zga1qIFFPVv)kM#fgx37s4^#glp=-8^KN7b2KsQxDrk!v+aBc(tx%UL%g5paS)6X$W zkmL5Blp6WX2WKzNnrXPo(`;rY=X9>SoLdu`1=@EVInIIjYq=;a$l6zXN(BcUEUe1b zD}4*+rI+-dJ_iQfSe=akdx8H(IK1Cah2ToO-yVI)5|ZiMcGgGd`~=_y1AoN5j$3H> ztd)U`d|3qqvkM%vzcc!ujPSK5(S~@MqHjIseg@@;K5*5svzMapzn9(+KlCR1S@iIj+XbTp}3bU$&(@N zUh9unw@281JurymKPaYRNi~ap>A0&JdVB@qg?PAZk=ptjwd(9n0NFq9$lL2+91`_l zS!p+!v)&^J^mw1WYJcJYb65OY2@<*w-kS!hvV{LyBGks-n5rN|8S12&8$BkUx9S0N z|L$0XoX4Eee!>C2F4t@J6lYjoJ1^I(4PNWE#m2&CaC!eC`lz~BGL!CTZu!}A zf7L^3nuLDfHssP{?_Y82KnwT;r+~Ht&qGWkdmv+^hUi4DMebwZIwt^cevvYj*GdRk za$`54c{qnW!+?|X9E<|^tVgPEW~dA}AZlL#V0a*!dD}>aZQ!UL&3Oe60R0wanww0O zk^Y%CT4_5*;4<>OOuvM1>y=PRREF-?{?4$c>QI5#Q%n0*+N(FW-q-rQmd`|b|FY6v zI#AN}*fhk`zKi(xS1(@=VPT~&Q4_m#n-J=EnDRBbdgSTb9>1tqjtobF1#)>x%4MHN zut^4dvCaU}$6*{f$7e769`(Jgx17wAzgEDvwN82@8zI7E-%m;?msz8|rxwlsH_moM zDWQ~TL!(N+plUd>$3ZH8VCZ&bcmaQIVTv~7P^zHS54@}#cWz;;6c*VFl|vQxNr-}J z3rey>${&*R7K6JVq&R-kC$j+C^~lqvzkNEQ3t@3!^@LbmSKRe*4&4IW5i~oq-wx-E z@~u9?-6I6%`sAl1*KvUQYZhcg17q7lp53Px6Ff1m1prRCrqlZ+2(n{riO50NLcPXO z|Buv`e5((G(G1!5fHJZnFOJ@JS&3V_%-Bz%`2uwirZT%D;Vb62-8O~Z`4T@;HQCPcnSPkV zkj&w@(cUb{&OBfqqZvsxnJcczf1{5_Orpkb{AIDm-}HS=)3R0*wa{aKTGl|;q(Hp$ z3`e63WKDrMiH@)9BkRnyqE}nb)b{TS!y7fHV^_6No7y3JG^g>TTqdqZxjw&>ZkDrD zZfe7@?~AJhrjL$H^PgIm;8z$M!>>0&a|1LiwZ}V8mF&;Pk93LMA15%AKaCgp2xCZO zIMXrZi3y0;P1bX|=&|G_u`7&I%tmiFx74TdJ!2z*ePN=mNHc!-#Zk+xnuT{x^65j# zdKsg*yLOzr%JHv+O&LAR3ZJqGd-`evgc}b0_QzeQ@*o`M1}Nh9bTbI`D6K0T{hMaPXHdyQp5|ds7ubcnAg8pD^~l{N}L=*`anSZ?xveD@FY^|F0aZa z3K5MP`XO5av_eRs0)Vf*t`^~00aqeyqRwM2(j+1m>)%P&fZUb*in8BaEvWXe(+Y|{ z_QD->tOc>GeP74xKQkipSvE+>)V)u?)@!iU_-?DWj^)xzsiO<_kc=d58r)AQo3ApF za$Ms7>-2As>G~Od-O^X1FK}>F?%w4*)TOI=t>j&1P zkQ_v>GwgNwxgMKud>43v<iVlK+@7oCx{-=9dzyP3zLDK_d3&);KkaVSH((p3|J1uuY}7gT*QT4AGi9& zb3Rxn#!Vryf23C+^oEJYi~prUuzb&hSW&nyKQz|O$z+Ud+vr&$n@ zJFb{1-JMj!MC$yz3#E zr0?+rr?cFh+)~#+$A4{g3X@1bDnXHp)QhfnsKu_r^bptvvM|-QjZ(Igk~2R>f*qox z=d;##st?IRtT|qcHJ}UI{T$b-ljj_Llp^jH@|^#TuAgbL?8!5O8oXN%*1N@oj9(#m zmJ}CiUwH+5^vV}`P2$H=wUDaKf7s(a&xta8 zeLBq2mx8Xp!F3dqw8;wBU*nQBnf*d|#o`IfNg2Vr%xUcw`kDo-F>CJjb0shIykn@c!dEX&PN&%%@F*kqH{4 z$bGbJ$wx*@hGFlGt3AXgvqJ>D<6?>tT(ry5 zSn7dg;x!xJM1!)jG$kiYFelt&*L^}?Ds?L{@J^rGb=EfrGmRg!zhl48GzZ#4g19WSbve~FcGZHers&2h%%jtUzRQOeG58 z@sLrH`Rqa5NuT(N!-D72e_IeiYl^rm;#60acO2IpK%wP0Xfl5(1ZXV`K`YD1H9zRy zbaDSY5Kw45X;WMAg0impz^Aqn{D$}I>?NpVMq$-9!(0bTL?R!Jn&**P^y!6NT&fGU z1#y3_9C6yQu&hVY&6Ivf=69a=t9xzR%#|=n-%qBsn$I&_<#6)S*m2k4d3`UpJM-#0SnmQ@ve z3DmAIViY&S(m*o2KQ9YeHzQaUl6pF~4ECMrOpB+j5HvG$`^c626I7yX_+9Gp>9^qA zT1c(MW%XQ5rpK9mSi&`5_DOFr<3ewv0VL*g+j5Dleg7Hj4TvkKRvJl-Xw+2l>A=@o z3wjyO{wT`x#O6A*;(gj}>tHK|+33x#&8y_U9=v{iZBMDcR}Ex?%vrg5=7uHcZ$$o_ z9|#-2`TkI3Y9?DD@jXq9pN|}yS3s~cY^-;X`#|lWW@|2}F~|9I;!&+x+RZ>fu2wR5&eB(-JS!Q)IK3A|z*O4sq2 z4v~%>uRJl2projP-{Y2*q3iJelN`yUm}QUX*2(s0$EX|qE0McOm8FEHiuiyaqW5yP zKb8(9tei&s_HzahPyB2|EV@V84!4KOOwL)IL_VV!iYY3Hm?uTC^ySmf- z3MsZ-09LETS|Y+C9`m`8xIMJ^Rjw8f`^_2&xi&JVpJEC3T&RR=S8 zuFv|!e#U;t`Hk#0u9=fb4Wawn(C|ssU$GMeo_!%7K4Gh$8-vAOuhU+FUAWdsaIOPq z;9D7Rk9y&#A5onV`6HjM8IRpJ9F;qG_@8!8ag6Kbpb@tMZ4xiy;Uj&Yi1&F} zOVgRhK#T*CXtF1yoednL?&}lHUZr}Ou_$TDT9S)ROunqwCMbrA!(;XGtuIAejA(S@ z<6n(VYm+Z#krt}3)@tlj@|8xE0FTO*7L*)i(blZ~R2?JRDJ}MlgQ$`G_A8FWFu5;T z7pYf=vP+w|6}!)(>zR}s`5OKQ?(yk>NSv6LGZgpxWmUJJ`+_d`JANI32WlPT&G!n5!Hvkec;FXRr@?691*ohHxwzHGGcZZ+x(NqAx(RC1L zUDmf4A_s&3U$|Jp{m>5+Bk&*-7O<$UF*5NMb04C+6%d*q_w{7H6#o=Cx+jmZhy~}QfMS+K4i$N;f$!{n%My@Kb1~rx)$+cpKyqb@cqx7 z6nMiJW&C|?EJMKWvUC=UtNFr<*?S7 z#>DG@JM}Az0$s^^j^Auu|7BV5azVnj@iNMSj8gAt8qnW@qrCryGUtjH*PnZ6ZTc7wbppLY2a*@ zfwQZ$Hoxyp?n^cE`BuUrkMExNT+4P!*vr3)JiG*3%w$-Qa-5GD+PvSsj2RxN8A-j^fI&_7it&e(7EjJv0QOC_?cD_5)C zUxzpgQYRC28NcAy+J4&hgHBX*f`4Qlmwi(&ayaYuV+qJ^T%l9w{{7t-)e4&ffBcbl z1@xa&zP3lS=La3R^uZ|-=7zZLhNw@?bz!+0KiC)&9GtpqrMQycJ$Xr6$dIz!w!%1! zk;j<-dv<}Zkhy0jJSwKxzAnjgwvt15mnP@DU05(n{r99jtYIW}g+#=-jc#&T5DiFb&K)>{6)f0 z+?)M0I-@+H-(cw{eUBAzh1PFU!eRz2$@?*5-Wp_(aek?3B04Ab!R60N$`!)xqckJnN2`K5gxjKE3@-pDyWmaYz09Z6b*TykE+=*~u|}7+YzSo*T0& zJ05V1zy_4efZK~b`+13{Ry|tIZ6rr`W!uAP&i@Ags2er9Z4VY_Ssv)h=3F^jC6H5I z*Uqn@R{V!Y7snDd&x&Ssq4jn|iluLttG zy*zH%63oht3`NtVC0?1HNi4>@Ssu zH?vx8yz8yHD24;PrqiTS;1(DG;_y!ret{JDTjGWU@~uf*u<2xeB!l<+LCkB=C*+bJ zNFgrIm=yt8#!%&B5SR1lixp6m>P5fb!5w=z!GBYEfW|+zZi7pb=rZS;6?^ADV0Znc z;+?$|l=*7LkC6!G~!=~2z3IQ2&RYDElDQHa0x77|vdxWH*6_$kgZDAALU z<}QcID(Bh1&1B7I!SrvXv07ao#nCzEECc|?fx|+A&-%Du4HY2IBs97R`TyW!VmD$H z%o=>Yy{VD*IUH5Byikp>2~#@>dck?9I%x-^9uxJ)TY-AmM z@BOlyT?~6A&7P9*BW708VLh6DI-EmL%oW3@oWh7PLQY62n3!fg2d`K(|5-q(x9x@0ws>dy=yORX!v5DdgbBFZ za)@6xtVp0}EexvbZ2xp(`h|ICD|u~n?$BuGZ5JJR&qNOHDtN>;I-nE}@!ZEf^;hV!h0{Of}Z5i#jcANd0{N1+s72?IicywY<#dQ{@Ro zJ{9td5BITKFMj`Hc8EMXTUYy-hfG_<-J{U*&{ZwYJM)+@U;jM+rxZnFZ@cD^c)&{s zZdivf*LLfhsdohBz6>K53<((K&Vn3aY6b(f?mh5>O)am=CsYgqjqg8^D4u`yAC&!` z%+is|lE?k|CXpg|b(^yjHzoB_KS?}Gw}A%p_i8Q3dyaHm9Fd7-IinxRuKiBaYc>6& z9%B|=Nz>j=CSw3NZREF*^D#|v5IsiO?PV;Y8Ze^#PS?H!p8pY}gHC-iSIL_J;-fhO zV1_4({sk{^5VCXBM|Qnql6A^|$52k(H}HvPs`Y9Kj)LB|Wj?as&fBOiX247M^JbD>)RrPMX#j{ooX6i zxY!AoWZ1*BJq#+%v2mM9eHAdpX`=@p!W-gg-P3lH6T-283R_NF4XF_lLdfS_? zw;1mWFK;?l4Nx*lLJI92>N(joYa?vD|t+%CR`C*sSIk({dBJm_W^g~Tm zen)j`Mi~MUs{!Myu6avZMVAY`cA1I)5JvN4v-RXMC|={utR(!bF}KZP)wWsvS8t0b8yZl*W^kyru}rE9`V0k?R5A>%B2>Tz#> zSBzQP@HWTjK_VSXElc$;(KRztoJx6NubU z3&)uLR79Xpp~XX)FQ6uZt+A8y2zxA`D6RC=J*?s%dL%qzE4qdb^Dt5iSHSwmZ1wD8 zl!lx9YK|3?4p=cp74~%G^Vc?c^uGEIx$yJn-dw(&HB(DMvH#Ma-4dXB-U)^$kdr2> z9gKU>UxZvOxE;Q>jyrD)9yoZ&n}j2DyBPu9Hb@KFIdx+{?5h ztIW=N!lP&q*D?&=;+u=jw7&l_?r3`7cERcxyn%~!(0{Ze_y92t^HW;?kv28Bz)Ic} zFT#96zHz3V(B6Xo@>cI_FJFCm!!Iv2BKuXPzB-L-k1=-UNNl+9>zt(#dLL-?wqWVA zu_B-H<)DOb+Ox;MHmAQk8e@ngwP)8TmnJEV{7$OxYw6S1$dJ0F5-g?ueU0S=0$g(P zCrfele|J|wCj_6r)!FgfNlkw4&EU<6m8i|z<3C-F;qpgh-d|?ge%!Ahn5w~OZECi~SUkGUJ0Ch^94^;CHqHD)sDts^^4~f3W5L`QltG9fVpYEJp)M zX4@giq|zy}P~fZ7dIyf0*pYp4&Q)Dij@!QNl0x2pLlu6QNbdC{x1ASp2ly0cdp!)8 zxc(vpb(;oqG!>(OKAWLzZpijOlFl+J%B~B;AktDIozfxQEsb<{cXu zPkYt`FhhzJ|71Uxt@!|t|69*%?71Aqd!Jz4qM+KZlgmUqF{zgmn9m9Z=5xY>ILh; zMK{Y1F}sjC72!TM)y4cGkvIdCPej+ea!?eVOSeFT;Bp)|I1vSZUFSc;javR#O#)^T z=hL<5_Je!Gmt*^VR$q#9{gNp{yZhP!*4!%<{ls8VG68L5jk<3s1ko4__Ip{HZ4nkL*h zn|JM63}5OP6`R5w$j2H=kYx=GR!OPrcBa4jHs}~ajKE%qR)?|17g7>;`&h%%cRh|6 z#iT>ADHKjsnn`TEk;(4T)wrk=$ayQNaJ;BHwtw?0IEmrLO78ZF2s^8;~@2DdWI!&ruz~EMTBP1jex%Nv@|uvV)Uj zbXJ7A%9hYq1TQt~O#==MU`_OkoqW+VT8UP0KvjwUioa6E1M{I7UXSOI*D(W^F;Drb z$J8sx26HYpiJwu<2)O?#z7LM&iVKftbQg?(|Dj(MGgCV`ckC0o&vz$`45~Bv-h%t( z4hN)2l*=L!H_F=!##uKD*=rwv(z$HhyIy}%GwXOvTmEL84WD^|wNm3nbB%Z)Nia*T zw$nN!$Y#_yrT3b3Mf)57%w_ctmra81BBPxT0UY{Ubt+Oh7lwm|5=^-t4a3CL@+zFE zA4d^-7G9=ZKtXPr7aR|l#VF_rkVw27N(#Z8_oRW5Fx1!#48z7)VNm;4DFKyQ5ma}G4l6^3dCE|3}PUO_A(ym~Wpi!>5f(I}f&H*EhiaM3u zcq<5@fuCMUd2NC~`0j)D(A55)gnEbPsHwpM(IvSG^hU0LyZEUqWY&xCc*K`Gcpdoc zSChFUZxvQu`eBqDx&a3&vG3&EbY&Z0`v)5d|3}g zTQp)RnmWyLLdi5N>(Z{2x!3m)Lf70Sr?inf*Y;gBaI9Z-XnF-a6~Q_j;AWNrp}X4n z=Nnp)wh@}F$t(e)9V5!8Vn8 zlgJTtym>f*2074kc%0taeXhxT4?p+)T77$JdOmm4?dc6gh3;-b-GJA@vTt_f@UXzB z75auqt{4EzUW#{oMY~3Qmg*bUYeh_Ygr^ff(_i{tUgeV?hmht=z13PxrqDSK9_=kN zdq2MiQhrsX$c)v<9f<)lp7@6nNbnnDC*o9ZysAU|6c4A2Ofh||!nFOVA$S(IeMW*~ zLE;Pk&1_od-$|>uvD%f*a+DFmVbJ()MD)yMjz=mye#_d2P%7OzM>^LUg7Xx}2WK;7 zD-A(S_Ft)1J6^LYGakn3cflwq^2y4?NSeVmw;dY7;sW+)3Vq&Df^dTn59)c;8cdRjo;jAA zrgKHAO`93&#dji=SD3|%^7TeJu3JwrCcgC{BHlScWJX7O8GpErVSRq72l2QHCR^Ew zFH5aeYp?uO^|wng9A4Yo{OhzlRa#5T5~T)nX?P#nf1Pqcm*b@I8%MSGs8?w=fS0)q z9D0Q}@}i*IeSbVv2Xy(x5;q-!F^aa(G`U(3B(Fr-(dI{gJl** zzN9dDjkRfwp_uskCGap0u!FUU2!n?vc&=3*1=oGgZeQzRH4SQR`gL&cUckcl8ET4; z$3WXKkKb%?ys7<>sXB0-=qF3yVdwMNs`uLejZ*?QxZtEGgj^a#Nzc+ z!p}=an>WQgU2nHeAi$(-^f(%sX5eWP9sqC(UQVsLtV@FKR@|yNIxi=HieR;Viz(29 zG%S|Ep#Zq28+{loJV%cz7|CVF)||dW0vlY0U2nk_7~@$yfyEwD@1vv_gsvW^{H5w> zNOjP*@~{@81Mb{%-o{Hrtl)J1nwS5#?yGRJPN2nEtdP|Sn7sfm1LKDGtOC#P+di@c zKXMkI5fvhb`b3YbX>s(|e`#HZ?MMrt6X!VP_LKj(j3a)(OnLaG(%G(=oP1V^HZH0$ zgl@K8?>Bh@H~zcs<(OFRcMu0iCRfStCk-=Gq?>4?r{3h>H-*4B3i1DZ3`WA2j6km@ z;GzeSXT^FD*fRQL&s*+)8|B8>>XN+{jAifvjm(m99Dn7HVrQ-i73p#YhMqqoV>Y1cD+_f$~d?)FB@j30D8o; zQ_KDV&|Y$^n`i{ij0Pv*VLu^S`IAi}-z8G{C5I1M%givEE%Qy4@OOHy20|~wZR)#$ zWZglk4OlC%sY^I8!GLq1!1z3tCi>Ab4aTm!2DNx0ZYkdzU^S&^F`sx}?MghsBR9YV zfLWy_Cy_P-5TH;Nxn7>CHfXbayxNb(bubNYZSd+c7Q;Dw$Cc82ijijEKd<3;)_@nZ zumY4`f^Sb2S@iCL${hbXC(pQBHCGsQz4cdv2o48LpQ@GoclyZQ(qC;B4afplY>bRL zU-E8GhEVao)HHoKhaLvw3ul+c2*dmQwytLh&3uU+(s(r;wkq!YK2_1TQUZs1)3Z7= z_}zf+w7F*f?A(>cAx4Y~H~Z1o&iq(H=L_Wd!AZ91!IDXJw#$Y)_}-}SMkL&5 z8J-}H1AV`XQ=^vsP)@N?e^nOr%rB+tik&4{z;D`||4*eGUL(uAjKS6s*E-NHFfSDl3b=@1G4&&3V&4nj*j^{qYEV=iv8qKy zEYn`Xn&F@O=Z4mp=LDwK6Z|4nve(RN)O!_IXz)?h-@zuTh~iutZE}7s=Hh(Ls{Yi7 zTfUW`-w+y6`NRnpdH9$uTakiP7~8K^c13XOL2pDrxP08)0S^;!SC`Yd9a}8`E&)eW z2XOr^aY93zz~hiw@WNT*m)Jc{i*l*7Z-Dzps?&D2q}6e?kmVFdYzzp00a@|GW&EbY zh^F5B(G6w1;MJWMahK;Up&p5Z-Mhz}bC4fk#JU`>pRwNl9=dAZ5qleWl4gl|LjORk7(S7HA zr{B8w`22F1rYE;<)p6d4|NYwY$|5ll(E(i;0*ae%WOIMt6>0Fk6E{#?$mAhuZ7cN6Hj#1tr|`~ z?`0uNi9_`GZy`V62*_gdZ_QknMYWR{EkhHcz1Ii={l2qlL%EZG%v^l=neY)bGNO6D zx0dsE1K9nvU)_MsG~Q?2%o4Ya|Mg~evg_hqmGx)|!1-=F??hGP?xD%DZ`}+~0y;J8 z2jjoRkp(XrcQ@XxG(HJ!nEEA<}K zs-}EShCg}QUZO-mXQ(-NnJ3p-`0VB5~p9=BUKLdpk6C>93=I;JM!h$?C&@ z(wmlL%dDYFKO+H%dMq}qnBUKZ>9=bU=q})LaRa%m)Z1h^v@RcHu~f|-dF5PGA)Xsa zZ94I+Iq%w(_;X!@jNjTHqj8!39=V^t>TNzr$$qJ+dQhpz9UIo_A@a|A$R6W%{~YvF zNN*?0B%=SC279%o;aqmb&{$Qo;ptS%U8HXWig3%?I;!-XT+SHyz!n^Oaz`q(z=f-3`X>azB9v)_*cS2K#8 zwg_A=;@POR3I(F-qZQ4Qz73R4?Pgv(zYbmco|-PpxisPd5F<4|1eYTkB2 zJq^sX)MFKQiV|f&*uHq-A)|YL^1I9yX|+p|x_TbYzS6;2+wC#5ohPoBlB!jSFBgP! zHQ=H{T`{8!mKMZ;<`8z`C!1l}7oWZhtbJTp+^JA~LI&&3V1f&V$+-;8HkDYIT$5m#Pvi}hAAj_a&MKx zp0Xn-lS;~``{P8>9q7UO1T36;l)-%L{X!-&)`IgV!qk5@Yhdpu@Y_`J#u=lG3SWo7 ziD{Zf5wo7Uip)w6#yxi*vpzyqYEtfs`7r){x9QKo4X|aStD$&>=L?JrH1h;-Ii&tu zaAXnCVHWoWdsjiyYP}{$pjHTkQIE?kfpA-Sh-W9xnV}D`H?5>FB6=*fVR`F|7^Yow zi(aXC(aW+iPq-eZPS3g#y>W#7ErCowx+eu7FB!mq0KBf30ib;6uyGz4T=w(_rT(;} zdS^8$45H<(^bJIQ`S^7C0PcEu948=xv|pR)F=8`WUi+`HJiiv5dxKZWbQ|U2x3Y6k z+~rX)X>;U z^oR#MZ&psVk30WSw+dpp%Y?9u2S!sj1+R&$K-VYrA2j@Ca;gPRYpj+ko)I^pXJpkK zgYuK^d)VLbRV4R{Qp(MB(zgBSvV^LDw>*^N?^#7pm&=S`!#IIqsvJj67QyG465 z;5Wf9dqaBmfDH}U>8v>`t8Oa{>J9)M`36u)%sCl4`ON3><4}BzwD~RU1i)8}Nk(%= zf&(x5&H)!RRuSI-KXdLN-iq}>3|QnG{_dg$*d5`p7P*nb}$z&2vQW4Nx9T!=840s4% za>$5%BNACa6&avtB&Zb^H zga86C?ve%6N13P^63?3Z;;s+&H5=*g53-z|rUT!GsM8EgO_6Pi7l`>t!ezvlA2l2&}et5OIgZkDb zPW+RrY@hef5WDPNIG|_bitq;~5}=tKyp4_stRpp;pesHJkBX=@Mz>Wu-;vkxGB4pi z=$Fg#8gyBKDld$u)4&AVopZ5_~s;!PTdIzw~$NN+9Eo9?tq zr)&cUKEo8^?iwD4f^xF4GU0!&PW|V0BnNN{#Uq;TK{kYZVLv^){pDnN9$Oor1ka~! zb1a9bDdPS5-oX1k_hwADYAUB|o~4}^qj1nQmmTP3A90ed$<`m1(OGTdRD*_jfR8d? z@pKvh-bEwHz(9Y^?{=QFP(G&7odej6TH>DQ=Uh-MH`dY64{WV@Ml9_fE?Cmmt4 z3^mPB9U^iydl7qBoOXQ0Aucc>an+APhfaO3{*W*ao2A7nM$dWI`_L{_(7ssJ1d5P)AhF&=&%79&-V z?X_XE3TZs=VCgUeY$s5k^{3lY`}oQuf57pwejZRA`#QiP{I3<@#1fr1+;7xbO?86L z{D6EoXQ9df-taFSJ^w!8##f{i=0!UgSkf+_b1xLo1f=k_LwV zFA~KNuD1tZVafu_u=EV2z8U{Q0FF4^{kl~SfSXJQAh;eU3rv2_%YZ`D<5IG#h}2B+ z0BfU86brU-*>V-=VYv*BXWXy(-RD$4UytH2(&j8WrqTGGF|cQH`;MFav?dd2H{AzZ zFA>^?SHf08-DO^W)qgiX6^CRm%@)!3@yQc3DlX9~G)30~Xq(geSw&zIwO9<8jpbQ$ zJuzyBdZ1Or$$0<)U>l_KSyQgD6=1PdHSa{Z7_nSDSQpp#u{KIM9Z* zd|qRIy?j%;aidep@zcdCezJL#EqSH=t@T2NP>>Sn{%^>%WFuiGJqn`_Gx<$5h2nE~ zf}r#%1OqWzb;^@2pCY_R>qVbP7NZWDD-{(%v!COl9QscZ*(ANYcH}_-nItkf<@fEf zFw5m9_(1m{JhdUzpcSo1hsWU2*0K)?YwUD=9jER882$zBZd(V6@zVJ&Ug1RsM1DeR zHKaKEBvkhGHN`DhIs1Db7d_`Mo_TdY%fK=jCWsv!*+;jz7t`K-p1t^mTKYGfNBPL} z6e9?RAeHG>Nz~KFZ-HM#MN5`MlDi)k%;TfGFmjP2p$u?6=zD{ob4Q1S3vHH>mraJ5 z1Ju<}dC_GGtKq+Yq>V1!rd6WlR)z6+&SMR~td}iZ=?cu4$=ecdcI#oBXs?f9zWNy< z_O=`%WG=vMNC;<9#osM1O9Tg%)V-xjm}X_)G?OwAX5kI81=H}@wJ)_4kB7aXs;h*! zhhy>W4u^E%`B?rU+!KNOn-1=93@^&zuDVELp!jITYa*{9PCzV$)~%D@4hL)iYH(-^XI_be+ZnzcWr6+|4ebzAf7u+ z$yYI(ewyw%7m3?+QLpkhEqFJL45KPjb=rUAEb&7<#D$1+M?V>S*wMX=hy?T4^Tp$a zmc%s?Xeqym3<}KXnuIG#Zhdo_IRE#XmTFnG4(jzuyoW+wR8GDp;g5eh;W-`b!*!A2 zWe8X}GbDT_@1eI~=?(!B_)Y}Tnp=`aOsU#uy)fR1E-Ll;6M~BI)iv6|heWU-O2BBy zPo9(k1>==M(vpKBDAb&Ng@^naO``Ts0B4a17sLE1r+@p}@0y-=uXk`{@Y@`t>O{W@ zUwP=}N9>`{Nl)$sf3%%b1QF4r`LDhon~XmsKF$H<`N38IV1{G4SF8&bqzY8BmWn5R=Pu>!brz@Gjs_-2qrd7X zEg61cSl32FS;)n%sk?CRnS9S%ExPTv)Ne=L7gppPm%PaC@Us49_><-RAmi2kmm0;) zCJbir)Xe14hW9hDdehOm-*c_AOM*oeMD#>7$_uRhaVMUlYF1)sq+{&$JNY5EXPkB% zgKhGmm~Edi-_;CeMxjW(<77ZW%ikzol=}qpqxEm&9Hr;`s)4Zd5m7GNr^u5yvrp9F zLn|sr$~H7)ZCAy4d6L;e$HOb;4yrJ7sM=Pl@|M|-y4== zo5t9u@rgCo>jfGT_1iMw`b5<*(^=r$;#s2udyvhEin6dF$t6&B*cXk7-Y zY&t^(ZqjO2k0~3CN$x7@mF}h6q|D1OqQs`ZZqAs7H~y_et6Z}BGX+3dN@4$*t6%i{ zE8rB+WRI;na$q)BR5+P%1RK-~?LL;u94f-+k9fgDrcXH9NO4r$G)~>no-c)oh(^v( zQH?ZfDjj#P?}|)Qw%ukEUClx|e@)>x%h)Mw|dWWJ*!CYv4{AZ z*oq(nek3R6=1oiZcTtO6`+oBd^0L|E^|jO4%isPmlKMMmXDW;!wfmt~@O^pLyx4OM zi6ksBM$6wIJfl=}T^359v#vO|Z^rOF41;C?*^Zi=V@aw;qZmJFdEC@)#)UK7K~wt2FwTo4<~i*c`dU?pwiR|YWu>rxYBvEvsC>wS z(f$@bV=etYUzl0*m_#l`J$CfYC^6-UjoqBiysDgj^R13uS9xYYk$7rj$uiH=-+x`+ ztFWtH`V3}&{FR5~>CKw>@9N2#gt89Biypp%%~bTX2@t7o@E;GO`j=W52}Br*q?&Xnb}5A&cI( zEU0~raC=luRa>hOW*b9ef8*azt8N)`rZyuOLO3XGMNoc4(}X5+d)3SVe}xYf56Qb+ z%ThVm9I!DVz9uAQ1b#1Hd@^?<3%tj`C+!9Os6FJK@`JDGcrsq&8N(t)Ki+m4PS(j@ z33SoHy!k(AWlZ5QAM~$O2M^E6C>`1 zYCbnNoQO%~HgY??sv3q=LJ6dg+xvt|!_iGMiJ?bfn=72pmA}Qe5co$gk)ag1$_l*WvXkB+k4ei1S5@X_|xMT3w=~a-0)u?>67j(lA;lO$gX=2dl%6}f%8-BKQJ&90} zC2$gkduA@$XuF_?=U>zr@9;l;Yo|?^vAuR_iQ@-Z+RTcbxcgMA{?1cNQ<8i9TFMg2 z>A@ba8wmPXvflw@Et!qyE5Cn~jbU3ekX+O`FL(Bphkf_~Cz2xa1B;pwe;AX-Ei2`g zg2!ZYoO_PRl(mYOg&ZHzYjO|S%iJ}}8sj37uRxJcD!i&VJNf2yQ z#vHP3BsYi=uc|OV5ke8A1#J2#=C~jtr}|$=<`~@iA`i|#!r(LR|Kd&HwtUEJ#jX{g zjjA*a;s{F~9Wkgj1AB`LI}gzCH?Nf`*ggnL3e>OSw}n)PR(;Md!f+N6`yA$BW+nzZ ze=q&#q}~mu-ncDu+@fqe+}Eq?WI$R>^R1VmZ^451=dtvK{K9VZGB-Y|cQrqN&Xz1E z<_?WwvBwj<0ppNR?085(s9=1OVpzmaLm8yt!zFDLQrwQ>F|6kJ@-S~74#RSPf*5w= zMD||`iS?!9z>dk2EnFQB(Vy@=^e(;`F?R`sanKB&$J_=xM*5K=;&hggaaXS`a>*;o zJGW#oBd{aeyLVv9upiJgE@@j!VIFm~ts(f@*E9C@QS^=QN_HXXSJpO@qf10!kl@?w zA>4tgJ%=TjodrNB{bVZ`o4MF65|{ggLx1e1{>V<&eI}NQF_6n@EG*hy{5Nl2s)2X5 z>xl7VjoxAE)QCwS#U*CuG`WK=!1lq+PV?}SZs+2TyVerqg~qK($i5rBVb7b}6LOL9 z;re}6{)ekyablu&!MI@|DmU&A_Ut!jeDM;K z1!V_gT$;AE^V5Fvh7uZPr-@K+Qi=g|zu~UgY9XG2z5(w@4(g^5Ch8Cpl-ik{2=}SB z-hfuiUzM)YrcKkf9Morw*U+81?5Tq26k)kxR{KbwZ0p)^=V6D)Q($R`^ z2Ftu)1g%x1}q?iZiKGX(;F<-ewWF4zz3I)Wyv=r2x@&{}x(lL*Kq zCu-9_kR)-0=o11rJ$XUud^9!$ z&PO^23;s`h1H5J`kx~%u(*tnQmD1OevFcURmTC&_C%Ne;&}%D>d^8&hp4PxUmMCaK zq$r+f;SyqE7RRN=b#_ICF4vIUPll<-nfs4I6Nxo*KTsnuZKpqkbS1DopH1ruJep@LT22%@SD$@%jT^^VbIO>IUnd5r@7t$vNeGs;%FT1&zW+NV0!jUqtZ=D;ESmzX;*r@e&JH+sq@qY*DEB;3PpZtL)VmTsQ$IiA&K6?3JM>QE(|K$jM_ z714n1e%+OAuPUfme}TcqPYF^Wws(aqN_D zlrV$u7H!Q$*1g2uen`Xy;Wj!jn0}F2GI{%8S`CdmCfv{qY+L58{oc!=L_1lU&03?C z(ju;aum0~|<(h3#vK%Hoy$@f8(rbAz&=oeAouFTVEKVW}a12s?$YAjS)iQicf!n1) zQ9J+-WFH+AyE|?6u+~qbbPiCw1B)70gLZ_FY(YNPHcrN!=aRFf9KsZ@bWfOXXD4o4 z*o{iMlkd$=;mAx3Nu)F=*?Xn`{eA=;8@xjh%ky!Q6*U|B7108+w0XxDQTWsg$WE8c;-VbcV`7gNeub<4kR zCPG6j`a~xw;*_-g=tY1@!@z5!MI9$z@b7}ATLqW~5$tf)7IXz6b}Ed?e@7zFS9r0u zq#KRmci{Q>81fVA=hsI)fgUSkrBNAr2cG+Of72wNqL~BhZi%P{=gZrZdhuD~^l9=rLM&GX%_JI&p zPNwjavLQdT=V2*{Yd+d|>o=GyD8?a8w_V$Wuk0DHy$B{DR3DzKm^(#7WwjT*6VOfb zzgy3Ud5gLlsjV=7yOUu1xWDmd`Kv^Gutk^w@)K`7v+q||mY>aR{}@N~UcqP=+$7c{ zuSAEGL0a-mGXJ6mX!?c{)OK?TPdcN2X5_Vv5RHjHXpvol=#|VkYtt;2OObbOQ z4N19Kd*3J3c78+r5~W$at-t8fI^I+|al$z($+Z_VI_A}+Z3k9{Sk2n&*>6;^ji-ormq z8a~7#-0TZa+s~kKXp?B`4l1L?YJDQKmfigp89E6l-gIFKzF7pL*D%*bP~=2xjZe~p zzw4%Il*jO5iMl6zwzkoctxku|y@gxI_WNd=j*wQC>NH~0(cbFCe}~}`hH@<6=s2#XBL;0h8I(i8*;~N(op+%}sI^ z&$c43MEZ;;B`+`JTfarYlb< zls9e`!cNcNAlY3?dm6Xl_?^+60Yi8lksaL_4&}E7GGgix7P3j^ude9PveJA3l zind+H(p|p;IvjwV8GgLkcH1GZ(P$CfLhr}G-l36VVUyXpdD~$7-iDq)M+@3t+@g>()e>w_!7Tt*B57$iQ zI4xIeNs8HvU3y^DntuL6_^T8FA1rE~Yd0!}2}<4K7{dL5H0;Lu=DoeGu9!II!q+vq z6;Dh=1!jT_LGs)bR1mlmuE?%3+o5!0KkzS9&F5G(6D|KXsF~FZ)#RkcXWo5#OczWh zi`zSz*$l$+Abjy$q|eQ#46E-Y$`it9K50B&9p5dn|KaK`&xr;1~uO$`Da+wq2g zkHARAdt_>Ns@U^+1ks+r70(vNV1B~dcn197OHSUYAipDWTt*AJU`TIzbURrgj{ZAp z2Y+WG=MNX&Ajb?X>fFc75mwUA0oCco zEu#qM*q6jUt4AAM_qFLq5aydnuFln4URZ1VcYO?SDwKe zQ>Z1aR0`%{${RKlF4xTKGeDJ<*1b@6F^gJ%Rh$U%br~NGH zL>0gje9Ps=ZKUkfU)AlrBR?oCafU|kseQ_{Tl{`dN**I4V(^s`jeC>ex!C=3Vmh%a zt=8L>`SgL7{W22ZFL7l2+=X45ZYM00K{weqMQdqpoJ1yMY@4TELd_M z3Ai{mfM)Z>2rHQU*f|VD{QlE=*fFRQJ-6KT?ATU%l>poVg{Gd2ymfi`)%=4*DV9?N(Rm zXFkw4jC4vH);kYO<|Oq_Ag$t#DnA(BZjD)`L|gy3{5Mz{T}C;B=3G>f({T||h;yc} ze}senk!qFTBH3mY^Yf6#D7eZfY5CveQ5Jo&@LU@a^P^1JS0cM5P$C@b*%@V$e$T`D z5c}5X-DGD%yzSHy1yRT!kuIXwZHDruA=w5~9GM7>^1-vMm=`w=#j zJyBTa_RKjChaol&EV1uDsAMOziWNud^3m)rPij{2@euH>1NOS$;*bensd6fv8~smz zFW^mjHu&I#vMWZObgb0DjJC1nL;Ky%;Ub)DNn|_imQr2hQAl0CM2W5uT)YsB?|Na! zP-&_4`;<6_2SfKsQD%yJ=(B4wC~|%Wh!Uyo`>*#?UrW#IxrgSIq0;!+>F${A$J4Kd zmo@IyS(Iwt_(EmKd#5)w)CH_&`k7~q?!Ps;MXqOn90ILr#q}rBOQ(;=g27zHDS~-% zJhyfyy3_~gr@uNWkGX$xo7FamAN^p}^JvN2Sez!1ro$e>{S-L!9V634nug6eiIHx` z%2|J<1zEl;?3o@?x3);Gkh*3ThuR$kr*EeAwlVLW8l$%Rv96U`M0t1f9jU;}voH<&i9UU$NFwJdJD z)vV!cW6|6Pvq&9kulebQBQJYDUsbcz0Go?3nU7x8W*|WW0X<-ZuY$@Q6ifjS&3w z{8_rUx*x|T*>KHJWSBGDlhojZEl1pxaLY~NG&=02*{43X153;DepQW&NhFvH0qYQU z+Bmf5sq|hp^b0VwZ?W4)VSu7}qI=i=Aohn}v>-;U&wCNAgU|FzrfJrDHgNJXT|ui^ zd*C=HaS;k!zJ+CP9F&dJ>5@rA2mM4d_nGwP+=pr;uuk4=QhB;mk53K*t0{9x5*hoQ z!jk}Ing3i)I@j|bCjnGL@R|#t+SBbs$-S&$E=|-g(lE-{se9`pF?UJnig2DXatQtE zPf{41fi=|wS0he%u?gDlqdFd&**dO(mQs8E5|p5`j!UnI8uHTAOD__P`2KP2&!3OTTs5`E*N(o%+v3?)r2 z=|dnCxtVR)S)_HXX*4Z6;}?t(fAtmdw;BJ50^XNvn++Z@T0+VHflqI6J|m)R(UA`ZUv*Y z0L(U`Ck4&mA?!aner_isj-EZau?Xf+Cf>cN8( zisy)nXjv>KC9$E3%jkJ&3_$RM3Z&@f@fKf4VgV81d$C1 zc0*T#F`ps4JFGI1zVb!H`i@6-8t?GWoi(Kv(Rk$wV ztVj?XCj-Zw7EEF|gCN;}>iueqdkH~BEG-+XuTLaClg!^qd$&quL5LIsc^Fss5q1Od zA9dIE`lr4iPAVPXaK&*_3Db>cV67qO>_FBKBGZi}{}`Mndt@?!6lAl2p} zr*lK^dHO@RVCq)F-497H=|PNtK6MjQDRhbX@q05&E!rGZ=r46fa)-UP*iUT%lIG+Z zZX35aozphf9TdePhe(*76TdSL(7O(quJ#w$V%YI`BH?Auk%HS-q;5i#(M6IKq<(8N z9DYlzw>aSDJIC)=xG?7wL&r7Cz$j(-_CNuzWG&(zt76aD2Fo8}DZJ~CP|HS}gy25@ z2>Zu1y5a-uh zHgVP7wV9+{7Y^4t_TC_my@tmuwprCl^GhK&di_2)QX4e;?a9WvEMtI+K}I1S3!4%* zQ^8x1-bDjZqKgWn;|cV;;~EmhmOC>!Vb|84Kp8yLuj`n z&=p(4Dcb%;pg<&tn=HTmO_Q&rST+ao%h_24pD-DuzcrM@Ev7uoc(JKoO03OI?E7sQ z-5q9(o$z^A{NEgWR(ac^QCD$T+Q-Z{J7W89=swyiw8xL$Bcwch?j+hIEmGJqF2`E+ z<#7_jT<`d7daOr(dgK}@qo1WN_*xgT+FEzONx2BJnDWrbyrc@JziCskevP@1g^W1j zJpFM~P|F(FL|t`$NA|^=9dSFe8d?>mJHo=m`vcjIzFprYe^*-;dm8Vbl3E%3>?nTZ z2B83$yVgo9)Ad?1^sD5kNW#!V|GK4M6{U!FIPasC03EXuv}$2k%#KVV1o?5b6?3Tc zRA~pKM0VLJiKds#@m#>*Q5fNAt(E?;=3Bmh|6Q(@l`lcWuZlksFc|+yWAkPF9R7J+{pktN)V%39`;Uv(VcHDaxigWK8asv44OOv)S4G2mKwJrCw=zg*=nfhlS7J~D&jio?Lub&h{K5nAC z<9J8Ywa8ym&|47(4v8yIoRJhT!!Kw%pdy%f4L}?b5Dl9l&P&W!Q+QwH8E2?{iA^B6 z?`Fx_B)M?GeqH_XT+Hi7d&Ka8raA@9aaWkw_H7tq{c6NI^}XkFyq~u12Jg7ii?gp% z*F{F@0AUu8R^XhM;oOqY(Sq4>L+PI;o_~%*`FI*W}+>D7|m$5~0gqbG~x0 zk8=c)qWyg`{1VtLQqA|Rhpn*MMIgJjS}Ng>j?pB#*gG_K+&gK6CYuXIl#CQxONq-i zbk382@Qcx;qn3Tl&@zu(iK~CtHFpV~wdKJg+-c(H^BdmXg4Y=m#*<-%x+>$mrs(?w zu}!g@tD3Tpt73Y>Gc9CYeqzHIy$}1vp)2V)&V*p}DS@A*3frQxq;vPP z-q%D9G&#W1C7TGi`|@8$Ww)LIMUM!W1;PTM*+Ehz0lFh}QU?iT0^{!`9Y>(~XwP5 z;d?2_pY8QSc4XboAs$XYTJmFR31*o>a;TVL0g7*ZLZ&~~1gDU>?1tM!aEXaxNZ{R? zy?72esC=FS*k@KmM|Fl>CY)0q2G3X8Di$oRUdI=hq9<4CGRm}=6R!V9(piT!_5KZ* zP-zg5E=4Jk?v@hi2Bo{ZJ4CvqQ&5oZ?(Q7jjPBT|5d-#~@B91rTruAglf#5&s!R<2l(tSKHZd3#{{fAMUHrxFs&3Y#@6V4#Zi-PX%TMT9O-cTYom|Oc zJ3q$M|DY*>Dl4J9poW%H$>^>h0)bCX1|@%TGaL>Xxu6t?;_*{ zn>!;2RXSzgmPeLyjx?CsQ4Lp%s<$}Zi2lH!cE7g#rOp4KJoibnOrM6dp#P^h4gF5? zNhP?#$V1aFsVxIDm|JDVqOaYzV9CR%_RU&)_W^C$c!J9HUTuYEGh<6W{`+*20(&W% zyUJi}mRYAR`o)>^#p-}nXI*3z(@@7s!HNsj-i@Qh<6D31>ft>J!{}yfZ~1|y&8>WB zc$si?xz~6|O&>(`4;!PL-*sph{aQj4NVf*`XxV#M?dnAgDVASa4Ce)@ z)JA+8bsj>)<3XtKp{*HDX&0}PP3QbQ^iI=+*^iA6%6`K$HT|}6M#nCY^<3rkPrOS^ zW=EMX(-zkZa0sbM`}Zv{=an~@CZW@`M)Y#k_!LWF;Rl!X)v4rQXK7j_h>$C52i1Rh z#X{c}A1>n3-i?#cJ#*SMN1AZo?nq@ls8!;v1ATnoG(!27UC&Hog>taG+87{VfmBz^Yf=9p)fOb8bNE4iEUbP46TD1pCl=w4WOeWzuiSe+38s~^VRqwn?s~e*2{}JgM{Q=O zcl+PWz4+UC{^7zs2D#7A??SX)eq!dz z5wO2e9h>vw+}%b0!B;#<1O2<&8b=jQnxelKES#_PQ6q7+B*oTjyz$pNc-SUu=Gq%p z@Vh2Vs!lbM_CIl(prs}5l}|TZn#C+a2HWwqk?!+I&@t^_Ys>h~@*|10k(X&KGS4W2#g&XRYQUO39YnN~1m zL#e9nmYC-6?{oyN0B?wg9(_^+u|A3PVv4DC9>$VH`HQsHQB?%{*+iJ*EmP1=?SOGy z%@W39P{^ue7KWkenK?2&zi>`Go=urtOsFw+-h9Ak;pHIvxSn*SdMM2$F#LnXgA39P^{tfE3Ptt-Way8;mkIK9l%Sg>MNh(|b1$AL z-+}r#*-wer{(A?b6~o<_$ipJD@8VElw_Uu=%m z5`X)M*DgS^cxprY<@OS6Vj3)FjYzWNH4WD6s|v$B5H^ z-$l!&!xfGn{g?F4bhv%!10DFK@8VJscM2Z`CvvZ-zsn+8x<4j@R=8`Tra!29( znHxQl#YR9%v@3h4>Sqv6?vZufz3y>T0>p;cqu2O{tQ~C^i}Tk>WLIw}holdeL}Ve!#SoH2t<07KORLdRHx7 z)g-*xi7njPDIgX;@wi{E$=gTfT+k_2PfHU@{&~1egZQ1yS*Z}3Ft4~U_dBtV%;%@q z&wmX;{*AcN^0Qo>{A%H(zStR`32VB)fD>0xu8gtosT+eLHY@u{2^pX85As$~=YErm zL<;kTuKybyPu1u44{rNT05b~2`CC7i6Tc4AP}{E$j2hNei6TAPtQ@5;AYpAX`&Z1+ zO`zOg!WhSA*Oy`QyOb-u!<+Hieq#^Og&E7xsLvC%ViSa9bTf*I=J32fbNeZ>c?uB=96 z(Vb;fyHBSfVT40dNW(7zTA?iopB0jR9AK!&N>DwhE@96(6nLzDdbT~|fQ1@1zi$%& z@be`+n3qbDr{x{8xdkGx%X=%=&{E!g8MTNsjWbmZDN&a|c(ATfFRP{(5{NpfZ0WZI9HS<|oPnDp z{`xpSqNo$NzDD8)XFuOG+q4_KmP~4)V@8j#?S2EyVB$=jXr{b@R|m zQR*svm3X(_R%3#VtyF$7J%NRJ`>MduUhRG@QeFRY^ ze_vO(Ye_nm3dy6Rg@24Q&|goKw1I0ifn19>U};L9hZN1y>(4kKmknCl@{iL$>n@wq zd7Oz-BS0%s%sr*h@Xpq9%Mgs-zL|rFZeuub*A6NY6x|BIC2w zJ`}LP0I&a*=#R)h`-pde;jqCE6N6OR1QEyt=D5mP9K((&x-SB%enNEdT+-)U#>r7X z%dtm^y&0*8W=D0v8WXdoanxnZrIM~}kSZE*avv&nDh)$y*h^@O`*UJ14}T^H>eiYF z=E@xCB=5F(h?#tDntsaR}Ja_dU!-nGt~r+SRsdFDj{x|ev8VYt7aTfS~p-?u&LqO$=-8O}x{8?78ln19|$tIaX^A zUW?y|#&Tz;e)riUPy@zsZvUG}(-MAk67GB77Wd&di$X5%%59`_JAlmAXkh<^_Dp2_ z2Xz->yy2hg1k9fZUqdl{!e0&>R7{hmBLwCRibaG$*^ubhy0 zmCs*u1da>y@F_{Kl@TMlrpa?-(~>EFrS|-&)k#7mqLY`+_BQpnC)m+idR|g`J9ePx zmB^Ms>INfzBS&}B=gFwb0k|H0q`dL{xvgM7vJ6+J^e7i>aWcfZo$ak~FI|c107>!) z5(XM)vPn2O`PSJhQ8lI}{ki6yp-*Fqm~^kCm6E)yrUiG|_o}wAP)vp39Tfhjrk?lm zcjRX;>iKx^F0tR1me?lnhRqM0>4THVi%J*BU;A(R6Z32X%0ZT)oD)7mjwac?A-M|T za~RvTZLQz^hhO;b>e75{F+@!MsEfhUzspe?eTo=bRi-8RNTe5j%UN8C{YC%DL^4sC z8@+A&D;3|PF8Q=r1^2a@|FSN-nfj&R3v`7zjdnBjmlUQ1(!5OXCD?@{J2G-(ys4-v zBuah{+Y^}9823YK(z48f=1@*DHIY}?&~A~eLG~gw>4uC<7PA*@jQS?FTR#ZWS|u_! z&J&7W+A3sRpG1B9k-5%O9ZqNvR(|2IL3_pP5;T6yz-cV&SW5lIXD*m$lpQqEjxSAK z4$^Z8OC)RkIaa}^=2!8}cZBg(N9=ggA^B6r)Uc7>wsWIVxuqc;jEEAozf`$sA{?8m z>-YFz!QH?gM*?khxV@0t=?8m$m!QOXg~lZOQt`nRe|#}V)`%rO{xfsJF47&SN94Hi zCuM3dzWRxnC49VCb2f~Fwd^RT08XW>&dCk_{XQlt0uWLM6ffT4ZgUi1%pnwb zL{!Gz^T@e;=M!Ildi)qVyKL^bUAC=LBmrgfm@cE@ft?S|x}N8&sK3J_+A>@OSsEzmiNplb!fIc^fcV6!i@~yjZ6$cy$Z9GrjcJ{%{mb>9s*H3i(%6TBz(ydw$t zJD(nI0NbZ-Dr?94N2)C>12zSdc3Ky5L+3#eb2?4bQ(}g zhGn2SbwzYF^^b4%>tta*xZLIcy4Agdb<+0S<-KDbjNk;PzmmNZa&8tM?E7Zn%aaif zRgkVBgo{9Ypu5xA0{3|-Y4S7<_#vN`Ed$K&*hppbpZ+uq`eC3}TJ#hY_Dk-in6p$z zr|0+J$F{Di?69Nl{~9VDxx)4jrB>9M*q|f#bW+(x53uX`c11|G(t;+vQBr@q^7Jwz zq=1dTk(sk=lv05cV9RT%n3v_1`zn*oQCf_OaIzx0DeG!*`q3}D?N8}Ccdr)Ej76D5 zjn(W2aMAdMyUj|xfsl-!Bll9lUpj|S09C>;!4z#WJpLD({PKdH>N;DWa>1QN%pzZl zd?0OKKKQjL%zKpQ; zg%H!55sL63L!l9#<|cGC?*Xf%JN9AO(kHV=qTKh%*LECHdmNo^Z^KGVv%qAo&am@HoP&xQ+nXlivuZ4A!D5#bXS|e3dyv_ z)ZCB&UiQB zFPa$aBHkeI>1KP)MYZhqaDA~iW&4=+&DTk!7UN@OA_rq9cN2G;AMrRYO?o^Xx@b~~ z@V`)7jnloJ36)xqA6E> zpfe@Nx!w2B$sCc@eWSXAN%4baOzD!pI`_Y5SK2nc0V}~;i>u-iC=iSlaJ@sLlb#{u zSjprG%WhG6ck*iv-NUo&k^axt~Fd_Z^zao8*9^se`AdtAoi5Q|o)zTzEUp z(;=FI*AHbz$tSs42R*qo7I%kW0f@{d@vTNBlU>ovVd<|2Yai`F#Lnx~3NfmZ0lfh( zdczNu79i7Z?PTVzuRLrf@^Q|ia)f1Dqi$SM%%HmcQm8jgm2<)V_-}i`Od-#6Qhfp% zsWIOPv}MpQ$^Ms!4(MaSp6~aOH%_R8|IxRFV4T@Zb9`#Ow>;)Nk@^yomXU0EL5m01 z7qt%Fjn+z9V+T*r_$0YAOM+uh96 zl^ya6>EKO29Y4MgSD=?Yy39Nhgs9AX?vj4)PM=g>(d0%*uWOt9;Ih$gOtg>UEc`j{ z>+{JbAdymoY9G6i@#|U$CVWkPT$4m+#5l?>T1;o#$dlvS=4cyU_tghV5@*MdhQe7T zl%x*Fu=$+Rn{Am;v~TBWs{0au4Rx>!S4w$~hv{D4N*!exgK{9wtp!K%dI5}{ou9*Q zR`2!k&k~pmJGt$!`w4%Z`(5}=(Ukb-hpUsYqQ!jkCC;PUn8jedPVd}lh?rGcs{v@L zBvR23#v-!-W$_V?)?1kFC!(R;FCAR-L&Fh5L!K_Iy(TtzDQclZZA&2h!X zb2IupueUnnXS~gfekElgbaFPG{}P6`d6ulDsJI~g=JeRh9?sc1C>HBONSt$*rAl5m z%GiJOs>eBQ&Bxj3hfG)sdN`mse?WqobLB2R*k}+i>X;!my>YfmQN`Os5B{Whyar*t zVn)M%Eg+}ctTpz5WyOhSCv2B4M9L8TcB>NRq2+esd;#t;Q^-3RKlNW5ULp77_Z z_mfY`d9wZyBeJ zv_Pcc;w6!z^+ma$_$@A8evJT0=%Vxo?a@aoV3Zee$yRl3HTpCCQkz;7{b|M}!Tsv< z5G-a;3)Md$ZYNGC0P%!}9l01NZPs?yh!~YMd;;M;!`%Zrm0nX;h_5RtLG>t$=+f?_&`UoyZFuO`H*ar+_hkJ3R{Qe2 z<4T1X$vvlir*kaokFntNuI_>^!D-QIUd6AIuN;>8T1@nqVq^y%Rtbq7SRu(@Bun|N zb&aTxqo4ZtLC4jzc4O97;q{iig?j?qgs&-*alJw!TFZM}^HZmmI(MieuEy`aNJA2H zBJAi+qad+eMar_BC?n6vAD}&h>0X*U11h))jDO~Wiz0oq6pUzN@RdoYRG?%AVg)Y} zyx4@zT}4Vu?FH2hHS+vrt?~LLS+ix{qU(F99hm+4&RH&FSOH8FOoa}`%B;GPmz=E z0NM@odnmUEC2gOr|4@7lJ;C?CQ*v3IUv)(nF#;)vhgf*y%84I8d16{ERnzjvZb1e_ zMOf22{pwf@ltT!^#RE>AmoMpXL^!9_3I=zeX8RQNuP68a5qatnBNS5J!qG3z5vUxxd8OPUur# zfjV-rV*P_)Xx+i|g+tl%mmxoyC}Qv5mtf37>V`^}{y0 zD__|AlZUcrkcJ^o)REtZnCKvZXUiQ6_!L(hdlWxpCb1APuBuiM(3c)Yf$taN{T~UH zeP)v0m73T;T)oa3sKc|_I4%`=z-Z)JaQLfNCl}v&ep3~A-_=h0kB2%w4Zx2&2EtDy z$7qgCA^8!HS7Kd{?p1;Q^^Q9L5`@8_>j`(&zHPlz*(Vd5 zZK|EM96%gGj3(Z(%zmnnRGWO%zHb+JmwV7Pt<)eXO~c&IU@>wCKZXAUAV&Yup_hQg z-(8gs$f$se=L(lGWImAdn%JthOUo+n)*-Auy9vM!=L^zS5}n3HlI9Pm zfw{5Wtt@tVoK!UZ$MpXXY_t# zv#(Rwq=Nu&%MF1jkx0=~+wbD2#5M}BF{kX9hO&fU=~HoqNH|sDHA>Y#E4dF3v*B9P z{$ugYg29f<%#nc&MiOa$RX_K#c6XFi=6}@RvyB(^WAF*+M^Vq{2u=;jB@<6L-q*fN z5U3bf{0n3U3x2=*^-R6MNE_)TDOO7U$)9>NvNZoE?xU(*%>r{FaT&U;vq1W7q~$Bs zjAflaUC|!fyvd0q$2H&njOclb_L?FevWe2kNTp77R>`gSjuqR3Ccr7YeoH}IJ2d0-t}jUKEMP89X#3>_!nFIz&Z0Fxy#(cCb#SFyyJ zQ$3zksn*=zW5!))bu^!Ao}3umYx9R_vG4Zpb0GHyU7mkrM2((#5}NpP&}V2X)8jBj11wgQ{}-MdHC+ZXEK{1@G#Gb~SrY{x zE!xkgh7Op(pf*_H>q;LkxhTMyQkt*QL_tf|Q&<8X9 zi$#?ErW7np1VxstiXe=k0yo?;GcMcx$DhjM+o4 z&-%A}7@MPa@$4F{l8VHhfE3Wi)X;NAD4SF z?7^CQA7go5-4_Sg>AmbMt)7C!$H;dCH${AYD;K*aVH$pYqnfLd^OSvH*D$X&eOFQx zaAVnZNA@NNWyz~&5E8i2O?Ei8^ROxg zJY%<^G`@-FT#MN@H7=~P(A@FOvht1&yg9}ZauPCGcI%3#?q4kn9r|dgcF!t?jDJI* z$QDO5N@Vr*@=f?|2EO-$W`9byb z9qtb*gbi)(<26HrD{o?MQ#FTGiMd<`8qh<_&@8!2idUT=UsCcuKna&Ss2=SX+wo@u zd&!ZMA3N+OTi*mR#p*)wzQF&o-FYc42IEEe)Ca=W#8#SEUM+(AK28&A-znHgo;uHmR#DLO9Xrj%D8*W?<4te{SOhWHoMm7q~#V`wX zGq0u_$4KsZXZkS`Zn(?g{@pPH!-Ep$p;B|u>t?1{Kj8z1`|}M(@ASqom1~oH0(+aa z#R%J%;eDc5pfg0&m@qQeDEU#rgY@8D1Y5mqwL|I6Tje&5II9%R=#7^3&CVhR83#Jj zrIy!MEuMoMGq2{jMNkAkoMgK$cGQQERw;mM)cig|G1WcuP!Iy%0_B;_~=&Iasv7Ta`{9H}ck* zoj=vSThn2t^(Wiv)x-_;9}15jiAkTOB}HF~5zY#K@eF#{n(OVja+@dflD#SLsK;O_|M5L-=qFYRV3P~8nq)&Wg(C{ zI9pAYhV5SWs^G&A-G+JUWXEW`ZJ}mHx;+{zM^|QY8+pdvyez};c&TxByK7Bzb{Z#v7(KB7%4kuEu0o}WTomQwC-UCx#{DGoPn#%t zAL!GTbk1wH)?bwV@Bzhr*BmzU%9Xxd4=|CRe0kXQcOycvpZOph%b&|B{VH>m1*CI+ zy^5hf+eLYsXW)}D#;!#7EM-7)zg0Z!nryEV@S~W82E@)+7hoKuueco$YwV!6tuI-( zlzhchpJ%(Z#tt>^Z{wAFCi96`fAxY>DG3MQuF4gP#Rj_mrC6ndmHETThXtY@R!ET+ z{;0og=2MvyEJMW&)A#?2l;~+6S?fX|6%Zj|)=iit43Ar3pmgd+hC{j#-!1(SKxBj* zQCb_2X?2+_>~EGelCNHE@q6N@U>xB5`dg6$XbHuHPtd@`8}JN}-|>IvooShlxqk26 z1et)XXv2DlM-vCqVQ0jTUR5%u$#B1rLtv=?O^`_AEW;z4bc|}kTJ^8LWCjP#-5e;D zZN0^6jO?xpkzC8 zhd79b2LKzksECFFU^i*}#&kCxxA6RTYvR|5x=+8?d90pY1h&Igen}pFT|N*5*Gz zj@gs$w60jPp==)BaK)7J{@^5dlXQJ6(U-nw=!$oqguZV7U*714mf4Hvn#J~5{Who{ zkoG(u&icWENa5{63&}@+3;pPqIu!e=b)jGKC35>+K%Dma239VY8_R%0ek1$aP}fil zDjYcEopDIJO4HdpdJ^oT`kHTL=ne-`fp?ak{N``z*;b%h_?*e&6Pl~Ko(`n$?~=15 zxR3wr6R>|YSg!9vgZ0`IjQUic27Yp|S~)`+Qh_g*g6OkWPsG|DBL(hbPIP9qhJpn` zlLmD*j1i{FHLb=RI!T+7j)YC${Ak_`)}429o+)d}%a-eQ}Eil%$XuLrljs+j~= z>9NZ!Rrg@+5knflS1Ea%)~J!e|4kwn`DleC*DBJ~Cu>aKuR}Kl4M^;?xs9+5qdCdQ zi}7v-j)%WK|I^Zw*f!XXmkNB%J07tAME>@9DW>!?mKoyQt^G+DJX3hv<66|)k^KvG zFXVVE#23v)qlc`~jgqRJEgy^HC+H^|oGf@#`A6dmkT-#Do><7zzbM|g7)`WV#f;&% zN*OEk{$}Y1&>X6j>X05Yzas4D3C3J}h~+4I*GT}wOTt$$I|vchXQk~ZC;{MvQ@Q?Ha;oR&C#;xp(!S5!{2rNpsi{w6BMwMFq~ zw%rb0g)I{cw%VI-G%cPhjXOl?+JJIL)R@Ara96C|^GicOjyI2+6JBrF`46V&P}#uS zr6SA(afN>V>y$dC+wX&!hw=1{Lc~NJ#XDVJ2m3R3F5-~5oNb z2&%qYVzKhRK8Je0C+xz?qc_`Yi41Z>(Y*nwLtt#$dpyr5LbcBQ_-ulkK_P*6A&}?G zw66M;>aV+Wyy4%nCKsPvXBj6CQEC4(4=#nfPKvHp#k;zCZUrFVVqRNVhQhA<3K4c) zPjM(2VvgVdxCln~5!07r+yyw9iSR_56`t0?4IQv$%iNAzz^B0c8Pe){ zMDq*{XRd0E8p-ZZ)o>sD!i6h(_ZF#4yQ=eUI~o~qGeCYx=Coe1wvGQ5f`9?f^5rOV zfaeGu$J)0iEGkX^mg%6>7wFJR&raWmdTZDSn%EtLq5Y(zlB#Wt%U$Mv$RL+bB4!7i z!WK1+O~R^Y2I+u213TueDE@hnY6XhlJpj`kw-j^SSn`GVBLH~goK{vdg!Wel4D9>A zg<=E=0VLP^J#9Vr`IN?OEAPxVN&CNa+keC(1Anz*3-Bd@+p+x&(eoMFOEV0Z*VMiz z6{xLlf`&@s30wo(={4eLk}AE1%S?bnyPGIa9dKvt4p;pQ2&ixWF^FJfTCfK`3v;1{ z8a#(HQ~Nn(tR_~usn>=EVo{s$Ur$MTF7MUoelloxnJ=}i>>M>13U+##AiDGxAWnj9 zt2#VZ?c;|&d5;6r^zMM)OV4{C<%IgXJRZndc^4qD2=F*>0d$ft=$RBq9FrP>BIS7a6Y_lAgvMb|*sYznis3nIw_+j~0zK9S3Z_n)%} z<^<>{gN<%u|4{+|nir5{E*LuX++!|#WZ8SJSj!+8ppyaqF{<4AYfDBq;d6i$nL~C) z2*{Flyswb-e3lECsSSdI#9?M-bh zL*ScXz@hSilck5|l*PDt!0rIE-nB;jzs~-;LB%TH8S#@}U3v~cpIV%*4MD%X6 zcJ{kSt=-$MNj=&D?azgyNyO)q zU)m=Q3Abc~XRm}iEHEsf;LNXt55Fw}Lo?L(y7|ISxRH@PZR?6yEeBDdPZ-pR!g7Wr*ML9K{-P1Hc z;dV68H#rSdHZ#M%J(-!Pg`ebaJ31gH@XUpN^da9J~ zG1GDef%b|~!*z>~$3cP0ZwJ;K_fD||C(NEZX#rGCYwcNmWXdq ze5Sr7|0jZXq~%wcWM}_xOZopXV}8_sO6k8i^Yf^WWE#C_Ec|C{HglW4DPM?zJyw zsE=nEHIbr89G_PfJGPk6s2zw790;^5w}0%AZ!rs`xzULJ-1z^WKtx{ zh!N$030s4vi$Sbja1E#vbl-NsYWO@A$>4u9BhOlMXeJ-lcJ_P+psr&VCZi4fc5A8x zVbH!@E}K}DDv;Oy7C_v*0}MM(BXnJ5JD64{_ib+2A9XRSA%r>2aEG?#&HsYx+cp0t z+Ea|b?^WF{ws~|}4Ian)a-YTkc=?gOyuRUri&lC}FpicOAhirhwzTmpZ{CSp-GGA$ zEhaPRx?}nDav?7T-4G0rTmn?2Q(#*RyuAha{^uTgz9eC5yPkRQ3zd47QWJcE6Ed=f(-{1I5DU7&0zebunmnhylEnuiT*H zI4Sq>E=614JT=gX2URoT(-Qy0Cg5z_5!!%PYVRghKYB$&Doci^WvHHRLH;?0QI(hp zsCa&I?dPS;RrT$CH;kO7`9}=xa1o$xAtT&1MC~hjl>z!WyzvZc0+JLJCkydeXQ`5c z536y$ZFH< zpj?YJK5tnxkfFY()qI+83;?jl0hM^AVGA_tu2mxc8JXC=RaeKI(8*BwUr3WYFBXZJ zH~Ddy_vmi;tO4Xybli5b`Av((4DHM+i=8nXWK-#Q z&={MDE{M{~LkAFd%Hh-x+(>xBP6+3rj=j3vr(VF#)>980JaQkRv^$Rv#1KbJ47qDu ziyEc`jnjv}A^bpR8jOWG3JIE+AJ@4ZH753$fJauEPB(>eBdZKXxL0{UJ;w6ku7WLd z{SoJoTncK{nz?#*@(~P%c1w`RE$#*wAQl6quY(O&&^n+5VVHeJ{zXMT95}AZ23YQM znx?;4uOh|yZAG6qKfw@>Q)s|#IK(kt7+(!UZ`|hGI@au^PG1t{-u(-FEK1Y!J)=RK zB+-~2(+>7t{$ipIv%WF{Q=O_CzqAX?xv@S&r-qO32rwZ}d^}V$(fh#MK>VQMfNB=D z>Z+VAwLHPxtTXd=$f<8U!S>-eSH#LhF+H+w^)ZyHLtqRF^bpJ4HDcpKhMkY-~B;YPCgCXSFS`bq<8yApF#Bcq6WgJmRDd$)bUT+KTFAnzm zDb1*!UcaQYqVFU5*Y10;Fbw<5b@Eau`h$9rnscQTdd)=C=)2gdh+C-`1R=$Rp-#v9 z{+*x6VR4qj5j9K&5mlV5ayb{SWz=P8KGuqF(P&aFf6Ny^vE9XYwFOX5xg1xSif3P4 z*I>%2F%epKzt;cbEX6qhHq|2N;2gIa$MRXhlTX9%$4sz39EA{sbF_Xt`hYsirm{E^ zbuJRw2SxdclLsMD(_--jFUy2=k5*3p>SRBw&=fm)Ab820SCvY%-}fpS;>2P*|8=@^ z`3Fc)63!D*sypfaT~zdnzaj71Dw?_+SA&@W*(m zIQ6#TFH`>tFt57pEp7#)C-OBUjEKViC)+sthjy6BJS@I6@QM#4dSsgG1!~*i@`YuG z70zVd7zESDo*mwacGo`a@^!V$lT%Poz*iTaDxg1P&m(!rxW)h5HXOgZj3w%(3SUC| zYR;wz$=iN%XN4``E+K+|o)TV$aA^)M%W>g{;vF#b*3r&tv#q)IJ!U%)5WrWv{QHd9 z88--!W{Z@?9*Rv3;m3=44Pm7D>B1D`QYP(>?K~0KD}j$g@QQ{4Wnt%@`)IDP`UU@q zvYwAOJl+#!23ILnIW54E(eIwQs0%h<_0oNjktT&09zLTJA`Im-pEQ6pvu zR6OD1VpGe>%upX%NuuuYjJi0%hi1O#r)Mh|_zUIsdzvSZB(7lpL6duitovwk2}2Ha z`o9Zjd3<|G_)jP^{dPm1wk?$lq!y8XeqT=`gbz0*=@qj{uZj;3l1J2)__y+bq)fyP znc`HVZu7dp0W0jt&EMcfH*i7*37$~YSx%~ru1Wt38a@XtKXo83o&|q5rYWVfZ*_;@ zK6fY3xMkT-JlsDlc04DuC;y8elfKpNoYzT7N3X2~YKqMaCt)tFmuEhso0y8PB*68YX>8iYM8ANLn*wwK6>u*Mb`Zf$ z%3|m8bqmT{kssg=4-?n#S@@-FgusCZ_18SXWUD+jl#u47KQP1L@Bq6$0X^yQEI1jK z4_%tTMj1itADVj4f`RYf!oI|am&R9ng*^V+kv=Rt(47$TfmcRH7;~?TFTL9H{#V5v zX!-32Hm4{P7ILiVi=p|_^J32=)jah6EaT3bYHf46$<;9X_ynEk8u`1D9ECTN408=m z?Gw4v$;vhOX+*1z`89ckahbN1rGs-}HPxPuVyD_Zt+vMT!I~4#OXPuAy3}8fztVP2 zq%WA|oZ#X-EC`bdNCvBbG*{eu@Bo+#>Qhk|;JWfK#-iyY~3dK)}6 zLmD|$+JP;x=-}Cd8tfXete+4mGJ9)#w5^EYsDDA)VY z|Mx4D;G(ePq~D%7`*Q}?0e|6%mYWQPf|At{oRKEUdtN@K$*6W{i^!L8hX?5M4voN| z^N)%flD$m)x?-`Jy~D%mLi2(ryD3|!_$Q6jIDSkxYH*4!KPYc}-k-JKuPH58vP(wC+PU=JQ>Ud%b`948n5T#Mfh37;eWL?fjkwLP2SB>j?1y0nX*}36S4I(r?2# zj8|0zF6zaAyc`grcmD!W+={74mk5#MH=hfh1csld>N?gOpjG(qbL9q3*cwu}yjRl8 zf%%0ySdEgLwqH$#(>yC9PXft{Pv2c;E1JOD1gKKG6OPYm6-~=uG&;B*k3OA93ITC| z&{_K|et4Gvv50nsj`!6B-@4C9VoI6TLgBt+N9^T{QgP=Vi=#i_*CYIkh$3QkXx@6r zMLmj&Vg!p(3!g{17luAlEhkvNYPyE)$vaupu5>Eko};HsHBMF;}(s8U;-T z7tP6sR}!9B-m*D*M>|$VeKy;RN&zfuPawoCV9`79JtM>yxSr~}^#bR-D+~0!^#%4q zt192)5>3yw=Ww8x@Y1%j#plK*e7ih@OU!GIW6EK;?9Dq-kl#(2p{b!>&Gra|L-RSH zCq8SvIgtor^O=@6fJLQ!r@{FePUHOIR@?1}P#)-1FZ{1BQ9gA|m=ae}3IxalH=wtH zj>t6+JfFcUSGfojxciNInPbOIDjP4PEMs7k1lA>1sbNWv*=BCMnYrGyh1Oa`+iKZdC4n z*T=8|#2~xnIxS~x%N%J@ibTLJhvkm02`rR)(~!ZAJA}Kr42|({BNJ!`6*Ylc~|Yg&O-r= zcUl^rU~|hR^v{~wl{zhEBZ^8g78l)F8;@+Oc6ALiyhQ70qF!@ACj`F8_y0Ze=l_4? z?k7kwv9V{ca?5G%&(G7iK8MEP5a0)=m{Gs=`ocEQ9cX^@Iso38v%VS(Lg0t_y^XiA z)1p)F1w)Gw@=I#}>jWT|cntQ1EH^v9mjc#PC*bNA`$alZ(~}PR*f)6_F)ZL9bWCaf z_$M^*4xnRfX!3vv^;XCZmX_%PrnQ%!I4*UsgV$yf7+%I9%i?Mrs3{5^*K^&XfyHQ{ zmH<1LmCuR<@)AN2?@WdW*SGEYH!?9qE9bCyx&F)b?hV@C8+%et%2XksGD^t?PkQn+ zoV}k{-`;LmGA%wI~cMR2fltW^Jv0Nd&_L>+AGL(!p!P^3gfDsn_w#P78d zYq5Yb7kT~UJFZ7`_u zTtcg_{{7%CRSOonosgxRlh?{8!KVD`lkWRpdt5)#Ftt}9VCC3O@2sACbO&q-w`WfQ zx6GOXV*S@wpO-eL_VWE5{!YZ1%$OVSb9t4!NZ{d}R~*^Kpbd}o5N%~G@eTPcNt?Vk zF^Vo5GX2K6k7g1#wZjaNj6IW_JfhJ|I*><{DJNG8xv_$*ipGzQAsobS0?w}_GYH*R zBEu9I%Z3{c3b6x^lLdMi#BQh-jblEj-qO$ao^hY0>u*xb#5lFprs3RVbANkMUeyPM z@HI{Y;35ajZ@Cp*IKq}y!g;-D|6tV~-=1*aBAkxrn8K+%`lDh0h5i1J){{!pN^3Ok zK%O@NGh-`F!Z_a7(?jPSw>i?$ImUT@XSTP#6J>^1o0527zgfjaz;f4d3r793&_nq7 zEgo=22F^yW4w;IwTaC6P7=iEkMU~$@HwE=4N5fsECR?ytN?NW|h~W)Lgq&N-=B4x?|usft|o>f&skv1jIut50{Afk^hdxB~=Pu9j#9vpYZ2p#+1v;XBa#M|47#bB998Ckl> z{?JG)s>m@=e-w2*X_Rc(C(!U9WeH&dbpd#<*>92C6jM01^@?^x5V*$yIP3_|h#kC3 z0acOrCb}QW2CULxEXGjc;9IEgNdg1a8@-3CC%ueVfX~^lCNIKN zG1uemc%=_}VfNs$6{0uskd^8e=hHsRIU(?-4XOZ##?2(r{f0b0PhbP4_d8cvx}d=Q zD!e&`PfY#6Y^@{chk*YAZc5fX4il#D1PlNZl|3J^Cu4zRUhx==J@z)56XX?CwCax` zOA+%5C&2=f{@T6ZB7(0>fZ;ioU`)C|6&zT&_3k>EXumT&zF{>)Eu>7o>Kb3WOA zlGp8d2ac$NtEM9mauKK#-Z$6DiE>~ZrV_iLSCn46l(yNa4Wp!=#+$Xw)VY#{tRUkzsF4C+@fr1H3^&}v-QKl1Gj zCfQTGHP1(zdsOAzL8eu7;&$65?uV$SMpXIl^K9rYpZB)s_m z^knI=J1E~Zc)!mr#i|Go$qQ=a6S2KWb&jB=3b9U?mW(v z-3;R~R@>ZQC}Vrhk>@6FtWTTpyvx1t;~kL#ul=1R)+EC&3jJ9URJvoy=B(FZC8Z~i zj~ip#f%!)0@z-PbN9)Qvr@=Gc`%cQQ@W)SEc60erLHBvI-+b$QYJJ?SfFnI#yxSK4 z7vt!9-g=;pU^W-+;|+gIM-pipzDq)OZ1tDzzEJr$CTt-N^I7dgOs};v;SUo(qnSo! zH!s-|r@88NZF$Ke50sqgZ_`naDNQ#dUWH&*-b;CteF|XN@v)e|qlyQk2!p^e!DODd{CM zJ8r3h>~ru4ex;JVq4(2b$0)wOkK~ake`=3ZvyE zYlJyk*+2S2Hw|JkO|PnsTUtr*F2p;w^3XgxGHeT!ixyOW%=I5BX{pUrDo;HHT6y6l;96{IlMLZ+ z1Z-Yl;diFR-!+;n#lHK+`t6@ymCW~e8@Tx0p`R8xMWD9PC9Eq1 zgIU!gZuKbl^KqsIKyJ#wT+H$gd{^)2i@3|iEFoc-%%jZHZZ%*aCm9``?S9P<1u2G< zVEgj%y{((Dl!JOWcfA_uBqH0;eTU6PNeWjS`{N8KYi0M)X!|XtEHQ12Omxpf^@~3- zSq&BkYIm{+-_E-zqQSdGh5K;~9t-`^WNCJyZ;?wH%?*F-T$ zR2WHF$zaCKCk7eVNmPwysppfna7rZ*BHi$+?xU{aAD^1via7;El$;vPSAADK^<4f^ zw$T0RJz(W<+Df%F{JsWJ0$>-QaE-rsTU)wd58I}3L5{eEVNQ|B`tF39iOE+xc4O#D zz<6HpyCj0Ab$dqFp&m&B5nS=?jJgzwJAmlEx4kSSZ2}>Jv6yb46G2L%03HXOgNRlE z8z{0G-V7v{*6jcgTDHXWhQNE7N-+Gcf*5=iA~{F&H%J!XBk(;|yr3Ar(}dT+N(F64 zt-zMffF@#}S`s@SL~ZbW1=4C=Uz*FJRp&j8y+d0v6G8MK)m@Wyvj%6A*qfq1(|Z@Q z`X~UTpF-g^-yN;|ZWUer#53)Y1N~NJSX@EG=6K9DA|32bT6f4864l+0tjf~z%X&lKhGE?(0PpVK=)N8ef-M< z4LsXTAP=YiojoD1Unf0x1oY3|qcR;0uThI&N6eKYX7&aGck)r%)k}wC+wSf6CAu#s zf5mj@dtk%vq;r;?m_#gYPR%WNc)U*{d^evh4;r3?x3%?3xUVb~tU49^K!U?=i|IKA2yJSEVRNAG{m{Hs(&{c#%M-k>og} z)VymUmn}_9w0O=d-`aB3*u&9!RzEC}anmhH7&Ao97Ls>uVp(h@Df`FRu=S|W{ArI} zPe5jgz@0aZHlt~j|+|^PQ{isg9tAgi4dvxJRsI1ak1~zy*bXnGFi_>3XlPq74 z=B~4FJU7o9BmE06H|l`{AM{;v64T&0^>dCYZzzuHDZ11yiZU?KiF$ip4y7%(OewKL zB*EYq%D${B#4Y6|yLT4gOD^ZwRTaQ(Y03twHO1cok_I#op4@#W5UcTs>t||(zv?2O zRxW+4kC;cxw_BJ7-SFvNA8;t;a)M$+*18_CK&V(*-+eCr-JBV@c1_q%eLeyHeE67y zM)qE+de%~Qp;xs<@@5|4>nfoR;Ol#K(~#|lwQxp>M9`mJ zO~wkFA)aT{IU7&dvo%Y?GFCe5W-J4CV}TTx-bsjMCZn(D9(w|Gd@mRxoetX3F=` zMa_=;*UZ8LK93F;#&0atubc_Lo!toaGBt|m1?+|lvq}~#FYn>=pgWMTYaXC_suIu` z9qV-Q|MYxlJ~*=m0N2TY!e1Sfq<(6(ZS)oxv)IlY(!7HvZgsiN31M}vWDQ~8g1xk< zC+x#TF_{77)=puz!D+Rx^~q4p$oWxyJ$&zyPq^#)+eOn}MGHU}vL1CT7{Z)71zSP& z;=Iou88ja$DBP)UFq=vI+Dt_s?7=IilXSJ2{*6lJ%O1GE$7|awk`{ygx6pERcTgMi&=G!7g#t=;M33F`D5s zvW^tT-Xy7US-rC&Xg=|OhN3YPZ`t^()oMr_CS?YjZTb3!;G;a2!SnzqhihZLT|`bQ zQEw5+u8gNzW|D7J{W}WlIm`i$hFIe|tkorFO~b!$`L+Wo=`sEZ4&7Lf;BMK-olL| z;XBI-J7j6ihz`V|EDQwbrlhv0$D5)^ZbMY>ziQ-dJWXi?XSt+=KkLu5txvHfd-dkZ zVpKd^P+-gL@rXDwysCk7KGqXDwMA?mw2En-z9yquS!PC}&gc|&yQL1X-3EM3Je3cITim+C z&Cnl$*IGZTh+IbUvdKFi`{a2guIClBj-~yF%}N-e;XXA3<^4R0wK7Zr|Hnkal$mx! z)#EsfcI;a^CAQhjW_yN9o~#1=Lr)~!=d#KezMkmV$s$aPe8E&V*=asqV|qK|FsdV4HsyM+D>Y43W_ z2)>I+hEI{)A$4AT*qhaZ6`-ll!%w&*@6Wn*GR1`NOSWXyEg9l_ww>PJ!PxqrZ>;)TPoZ za7*9*9)cDa?0dz$_o3J^_^+QyOMLgq)$_}0!8*eOVgr@E>iKZo=Y0$QI9=e7AA&Q4 zBGWVTpk|!XR`y&Yex)-DqH>}S?~8*@&MCh!mm$1mzg{Y&lwCaS+%|+C2V=4?N-eXU zwst(=eh|+xfmc(zvtEVGGpW+wcavMM6DvR$Zh%4S2*^`x_@0yPu^I6ouw9A(X1!3m zV~D!drdrWeht6H^`mPCVnj#&!mX-i%L)sKkyZM8cct(r%)b3*ip|H@tBk+~zg+w0W z&`@oucBAKdJzDhO`!v7iD;I@Txz;-3dDj#n>j_EBq~s#(r~z@g=h(n#pgH5s=&Tl` z9(tClIQ38;<`l?ac#Zj(fsGTaJa` zkkK(ptIUy7pJrzSsf7FG zk{Bl;deR5?{vOuN5>sV^+qoc1r-J~7v&SXqvBXi~%)Xq$wfOqMVv&5#zd6U#yXwJC zqlrN{x7&F!`}K9?$;9X8b74qvybo#s(WBL9ldu2x<$9n4M~&x=_AJTOyoVvR z)u?C~Osx{*z6ftZ*V|K1SbREcIJ+EaY%(!$(5ZgGKZI62dmSF_DKP)i(i5%#}aHzImqf3}#wKOjh#BfWyX#RjBu+a(Iqr7}d;vkZG8%t{7vn|MIhv z^K|uK8q@2{X8&T+0SpA>SRMF!@eRMuBvNPS_Y+eO{36uts)6L$gmqs#xYrUa4=Z1~Ukm+GmU(#6(GimQ zf$MT2Xvmh!AxfFB(kT`14OzU|XW@HB`g)zR$r=vA8LeGGMjkT_?r2x4jy9VERS5u7 z5!o(giiC!CejRpSMOlvx5Uzj`0jhZ`4le{j<#kJW?tZuA3p$ugG5>DO79@6o zzPi^nQ{7w_At(V|+Z?$Ay@x$(y$77x{qEJ+we(=IPCJp^H?ZGo{EF;JtM=iGdEE!{ zlHC~bN8fglwUb$xB$3WTVi8fzrN+r`STTf)dFhjSF%!8@JQGj%3uldIY;1FVv-C2Z zs?UUbBUsKj2wcgj&67gUviPUvO4>g1w1wILY4y`(0zX9K!{ns_~0sLb|a~ z&{>8`mD(Dpj>jZIT}~S<)S~A2SB(bi6%G`XTYjKF zj=G|cFXMPs_%WwE_7XiwFkpgUt{lMDPV52)~KphUuvnj;7pIC%2;W zdHi-RBeH-(b-&~v)@eSN40Mx6bP7DIYo77PyVy#%k}We*@|#tH=&Fe1;LbIq1j<_X zSD5cbLa_AMx4JOoL;stf$6^_Op|9dXOmCfCBGVvWSan-n=WilLCBY{*#Z8+Ux~;eB z6@WnB53*##*~5GqzzTq$Yk2@O#rR=8*OWZWZt$YuBKDGicd}wuPE=ZD5 z?1c55$Dv-p!!AlL=PP|M(a+SUsbujNP5K=5DLr7pa<`x_L-YxiF#*JH1q3WKyn*Da z&DW78_;m~k^u_w_^B0w!q;Ln+C-+f3QVxUPyHMG**Qz*&t$WRTYFIro!3?cLxsSPmTl$fPkzDrzZNcb3q*B&IoE78B2L&RW?0B|*s>COnz6ZK86+C)gqcqi+5EI{E3jy_F{ z&6A!fk0?Rhw<6JMu;&(Q+0W+z&np;8h*WP&jy(vJqO;O&C11VAB<3Ce=6+LDqYE;v zwzsEezY2QPG`PgGdLbN?=7+B8?QpiIlT$ZEf(N-EyYtRF=~oZtEYffOp*Az_p$~Ar z5B_3f4%yECODbrm1#w{58|rqD{bK(7#Va>EA2Gzl(`>yP8-~P*E74WziL4(!)`h#G zkm;WJ$*ncN7*6l{@hhj{PJaap`OFN&lo(X179SL9*`(*t+BI+k)A0&U(j|Uu;vZ z2FX-pNWSyj|1Gc_*EFa2yg2TPF5sP9R?2uoX*(i3wC#Raf2Bhhj0o{qS#PM1|L|S; z<^F$@nvt9#Z$7^Z?J>>bw13?2kO1&Mx}` zv98te=KfL*>;0845?Oaq4R1c2mEY&`wp`L{;8YV*lqm1DG0b^yZT^OThDj#GzO}uA z56=H8R%q%)S?ISuN=6len1HI#$0gH-PvdNfDV>6uR+ff-h)j?l@dQjwFvYT$op~ko zcCW=;2t_$gOTbiq)PMW*al}%{0J-rp2#!b{OD_0u2HO=|YvA9b3*+*u*Eea{EtBn0 zU6PAV_GP*8cgaSKS(kP>53}2hr(JQr4O>^sB^yz>0}CgKz#_Us{gb=EPyJRD>W%a` z+t0hJ>Ei?E!VjF{h9BzTw-aWJ*01Y%gB;CH_Z{EiAqWkOcVK35*aPz z&kGH^iswqjSKAJ&yyhzK+LSfaIsAdr4vBSp+0AEc)t;BhNb>bMfC?U1;rR%t(gt*}k1iy|F=Dq?>oaboB3Z-AgRd4*hezD`D3~ZCl;cE=G~V}YAx7yf|T~4 zTB*O%Nj$psM(xrnnL*0hr->~f zf%(rSJ|f!feX#guBjp46s`TY)cDgq2N91^8M&lHQltnN@nVy%C z?Qfr-o&lovi-l>dYnP;BRd>?7ovp52Yj;iv(+T$OWXxscrY8m;;EEP7-i>@MbDIRGt3B7&2yQVM; zv2{91rF=JzwLNaUu!*Iy5bSQDNMdVyM?`UfJ=TtX=d0Ex%Ti zY8AaXEj53Kv)7=c5J88E>jW4;PN%*a1=jlO(neOO*rH+Ey zz9{Gee}-nSO-@6vIpYu)As~FVT8_!jb$)_fqg1caq&t2viN|MgafRH_N)OkK92fWm zgu15w_$;yAg+~Mzq*ej|@MLv97WUHX7EJzIOScg*lJ$1;)rp)M5{)J|Kk$hS&U2Hm znexMS`+hpC)e}#dZ*!sr{GJ9aN01r`Em=7W5YWTb=R3>t zEjulA%TA~R3xzaaJp2O1%ryD;VcIx&Zm1uj#gEL4#3~#LNr^g@Z{Ku=2E!hQHoysi znQI0QelRCzWnSq>us*{vMrFY_*Kj--!#;y6Y$8>r(7#RJR~k#Wet4AEOBNfA!fTx> zBN?`9_fY^*#35;Sh&3}v@m+oIA0@3u$1auV^ z8LM|Mv&nhIu1O0~&hdfva4n|&G``wUCb2uIy*G4kVVv$yfW)ax2}1_j&_|5{Lt$w? zk|bI5C$O22txHZ}cgMvnh?<3aWcy|Y@2_shDso1xpv8g>gJQ)2U+L#~i8BkzilAq2 zEmjleJf2TFHZguIEQ>JzWFI^^0p?|J#rZRzlzaM~2&L>fhm`pQdrb1x2}M-e;ox{V zn&?D+f8rZ&>5p4(qxwF8rMo1&JoZOdhgQ{$Ox~vp=roL z{;BM_Aw$S3v3s4!|LlecYu^`L=2~&tso@81OmzKnQaHYNPA{bZdo&*KZscj*4lUvf zk^*6Hq#c3G!{*4Hn;mMk{SNUmF@0Wk+}5`w6Thb?P#IcdBzpT=W2N_mXTCswT+`V{ zElb(zU6#vz4#lzY6G4SHyDoV4*$(`hdX)<%uV>8@dIy*@A7JN@(^S`u9jKk=G=Ya# zwu+g?kH|7Urt-`bMBf}s`6fRdqKFsQZsd_o05j~cBWw~y1W)w9{>XwcWs|pv?+JH* z#Dm`m$CVQ_?ZxO^lqzD%t`y^hp5^}Xl4{AQ`c;!4%-9OL_e$my0me5g*VPdJzDc~n zw98wx{?Mda+fF}>@N33E<$5-mEZD5#-~O`-pj&}{#j=sD>b0ftBU&#+EN~-_qytuA zH6?Mk%h}OzO6}P3wfLWNiAfgr$Cg*fLx(HLu-(|Z;@1|#nFq-DfczMqgOnE&?bHyR z{)+VXyc8XPjhH4eX9T z`lT}6URr1+Jucm-@nuG5BB!mIW!#tlexcL045D7Sb_SDBuz&rz3s|vvQWex(s@{dr z=;_Ojr!L4BA|b~NzdYU5adWj`#(@X)4v=M*O%`o}{$j zY%vXtZP1UFP9M^)d0Y2SU-TnlB)qp~ zM=E(Gu7si3PD#f4vk~ZA_NC;iKNIHKc{lp<&?}fo_cQ<2W2qH^`O$uv%9dHxR%|OQ zSjz!+b_sa%dOP;C*{Hye);D=LuK)mXb&^ z2)6yL5!&u3lh?E-MV(Y|X=0|i3e;-rNwz|hvpdbO-1>+v6JmInL^c?Lth>!<+0xWp zIm`H>GQ0E8lIT+J;CYRg_j;%Ra^a#z92ajR~D zf!kQP+wfbXHmUs_tMrpk5+?jkjJh_$uZ$VAQ&`QOHG6GP1^I_>CAOrZjEv?w6)E+O*fb*^h9Z z$jKI}lAwNHoGnDdWS?lV2s|QY@UTJGKKH*C+kWi+reg?EnjEP)xx{(Y| z7Y+rVg72@J4P&)6OVQa+OV1JzL}-s0cj85A>*9~!v3Y~~{Ck#`C4_8WfeQzf<)yjb z*EslA+r&Q>+$F%~s(c{kP;s-eP=onZLFdt~g=%)eUB6ij5Le5aRT6-{5?*B6s`Zju z$h$C{2XkROo_WGwEF4`8SB;YhhgfmYv;I7+MLT%Uj?BLGhPEas^(ju9D6o7o_Mow9 z9Yi_au?f#KP(RKomoh|%4?vlJ?D;mY@r0L0)K4Yy-1|v&l#Pm2#<5qE z_VlOlG6!r;ZFmc5J}}T~EBp4)Qi$HbeZCveu`rvQ6M5P?)TDX693Oqq*X)(fW*qTt(H`O#YSmyISVr}^fNy>}ql4QWuMwFAg}_1N{??NPQFT@2 zd*~@utC0?yhkJaSw;tHTR#X;{Iu_PwF>0@@9;exgPRyx^H%cP5?H*P86&gYR3l#(LHi)Am=awMMxJaW?niT-CR|*8+GULbQb^n)Ydw7y3wGsnuq0xuDSV74IHs3l}sD8384y{adM!k0+mt z?!UC}O}zO}aZDW8xwz`*o)iPFb83@@)48p5djYQrv#!Bu>fK~+KNBE|@j>OXJ2Aow zt|-s3J*^Hpz9VQdo_#^5^lq@^bR!M)&0PH`hzW87rTKp9H_FDB11))OBwK zXZe@$*B7L!=gwiocM)(ii~)o=D~C6OLNm|#ZD8dUWqR(!U(>G~c7Z8(uWBB5(g>{o zJS{XxVO@BrIIAkTGI%2Y`|*>D{I$x}a;}4*93y~`FCG& z;N}ctPj=>!k@0Z`UDU_KhT{fyn!E=KIF4fbOZ}c?<E*V(&hX2w;K>6W2ERFcS^=g@+n*QsO4P(S- zj%Ie%KUmsEOLod%C&kZq8L4AF+QqN!A966H5;T&UxH8;A2;0uE&@soY#TrTZ`a*A& z_1F`!turBJA!Y!%tzucSedKCAyYdZ2>KjY<3UdD6WnsYBtA4V+XG1Zh$6h{~k(%4; zp8{S=WUDsl$J^BQ&~3QHjwX5%`-eaM@Odk#amIN>{O*tEQMQR(JX8<%ljFUOP|aP6 z=B=v6mFmOQi|jmFMlHu!uF4-)Mab7bR2|1w=#+E@_Z46j|0MVSvIhYLBz~oPDFiQQ z7D{E<^Q`EG@I%Og_-S7!oq%0sj{y|E_lM+p>Q(pE4q*DqZrtNLhyw1~HDo5<#|!N- zAYTB#xHPPAo4aNImom0c@=W+sVXW$~s^w^=-;6deR&S&cnc=dsf;udV&Zgg~$+{@j zY&lJQ$)p>pG7h-CcA4(hlx@9$B?@x4r7^(e6I7Zo=ZAt)>$%Uf0Se3$bIFGDY9_sP zn4$Y;GRVvSFiokh}4?<1DdmU&IyY?Ys{_D8*EHepJ$YloF31e8 znb{Fx2 zS53VW1&XPzFbc`bDy)nS#TOHHzkNx=>kc5A0F8thRZuU)t+e}7vpg>y8uj~oZZY+e zV4(o}FUx*AFIr`)3SSo3Lh@EED=9@fO<@EdwS9Q(gsC5yD;1|5Y9pM7s zon@C{kVkd1hdyGnDRN`vKDW^x&1V@dFgM^#WTA^jwcxmzKVI#j*B_`+?m@IqRd{M1jd9(O0pF8D)pH+Nst|S#sgbORQF~cYIem&|Q)+ zGZLj_dX{HJkfKCLx9i%z4YEFrBEJ6C2jgO1p67mew8W!O)IxKh+pRAz>z6e=@HbjX zrPJm5ytPX&OLe6@tAei1CJeHj=SMbCWvRP?7_8jV4p2d#ozSIiOZ6e2H123lg!c>mEUPADEa=QCW7Ou>+ zDTdi}o>X7f{gEq(l#f6~HD;qnYX0?Dt z%@bJv+gjFZ=HKCMv8r9npNiLS^X)Ph`M4)yABET6yHQ6`hLA(u+v#SI&yF4wm0-U- zB}r_MPITd!C{G+xr2V*Hu~rgl8OhXewAo_Zy+nxgpQUS`UC3l@X^yQ%=LGclXrYQ- z{EmEpLuhPuOWZ8cGlHV_Sk=?`EN}}~JT&z9hm^%ovT$#G-LKQ7Yq+_Y1gT7vV#P^5 zi?+wtwx;htf^~??r$Dt)Y$g2c$2t+~7sGabwXco5U>bvQ7xP^!bo_*$Y-e#+%b|DY zMe&k1K*q~SjvOPok7({?=0mN(@#@cwL%;Y3nuCpXt2ZnHw>SFZsk1%qA`H%-jOJMQ zV}G<<0VJtomrAE?1tzhKRR^BL?bjiZE$%a-V0d}@4EkIAyzL{IB>FMVLn`J%oW3t?-lW-H?ui6@fHudi(P_} z;uoD`bIz0vMS1zWYGheJ-ChOk4&5C=%_D*R-=9&CVYBDS4fUJ)Z1!wD2W8LWb^_{b z$Tgan3cF4Xdpv`)rF05w0H!s~KdO9MkKAL;0CpQ0q}_7B<#7=5qFDO%s?)NZq~XTA3tsBJ@z zK=)5S+1lJj?o3*u0avcthv$;F{(hC6fyHP$mV_X3T5209I*;|8RKN5zK7qIC>)dZnWAv+ z$?V+RPY7mDl#0tc*ehPwp~d{*_JZU9lXb?lrr8QjM_W!<-o_=0MwDXteEk3NB`&!l6mk;(x@}| zLK2mYtva%?yKR6~>i_ZneNRtpvw3W$IUip$bRdntHk4MNg)y(SAoeU>9qt>Q^T?PC z&k3{Ld@1)8^JE^-U2UUFd~|8>Mt-th$H2=uKqoDP9_w6~OX>H$9MT3hUkVqbUGPeb zlN}Tdm?j#W^89LnOc8qDnUKj-M#l*MmY1Qk$Zc;54)hTwLn9E3-1)#B#%a;71 zZMN^omXvT+;?>%9dReR<&n(m_dQ*CG!DYX?!%XSkF7bJ+kQ(ktj5|99fv6O<6@+hl zEPZ>^pVbKX985+pe5e+vs5`RfX!CA#kW0{=3gdThTy6L@*%5>Cq2YU5A!u9a!?mPi z*>D{vV&JLAtew8#RccrL|z+u%6;}NXWVI+e=?8SnK@?eJG|&GbTnh-Ry2_ z5_Xi|>dD<7x60q7p!WxJBAZPT(nmYK(weE716vh;Js$G%9*?%tGF#6Vj~_{Mi0G7A zt%9W|?99kES+RQ+VD6J;tD0l2>$)B;T5P5t)og+Mygf19$&tuPslmDb3G<%?mAD+C z5Veu^GnHBKb7J`Q)1K`0#bn>C`gr=i3?rxK2%^uTl+okvq5~ zpkQ1U8$|x0o`n7V(dRw1=IbCX8_`~9F1H}!@h$B_MDQcsX@1mEy}xQj%905*RFU4a zthXvZTJV6@pm4cr%JpZ(_T=DP=2dQi$9A7*q;HBJapY$>)lhj2qw}f%Y~EpvN{4Ku zOC(=ZuQc@`@kDEvYxu?oCWY^$!hCiDLR~PrhVT|!ng)<=%qWAVs-IL9E0>;eb)pEF z%|sWX_OG$QIt8MqcDO@Q-J?a|9-U$&J4rlj+t|5_Y)g+20ou*by1Dl^G%`wz+GS_uzUZB1*KXW`<>ruI8F4R~ zJ_4!`9lu%ix3R$4V!72;VJ9vy=Z92CpZv!)d@0UGKbk3V4J~MoQ=JaVz2c zbF(=#9#D~2`6epL+g8>#%uuzl8C_ex&8T?vezGP{~5kU zTqeHdcr0TIk${E4-D*=37);?o{mhJ;{tX#HYghhUrBmllA^4_`HRhcW3=n~NO>-Jz zx+d}`7BYlg>|mp{7Z;8hB-5nc0IjxQeF*^hz(4xOk78B>$p8f3acf9hPfIzzxk83W z_A&k{fHVmo{|-#%(iIR8ND+3S8W^Q+J*F{_hKpYY41u~-FjPBnYOyXK} z9xOw@_q0>NQOOf({3(3obJQ{l;88W`e)dmqU3$KR$vo|Dgo}8XLaG|^lRsLCiCgc5 z`qB$zY|(rQxEFcPAg$hK3Kob2fB^_fzF$?+ks=; z#P?}2>N%&Wf9~9~W2g&tAFehZWLHWP^C3+n^*XPT0|Qwcb~fODRy6hBxck_idxj7= z97uq;5b})KM4Q8XD{4d37 zy&DObhn=Sy{*!Z$w7-cT1Rr+}0wGp7f!lx{d#CLlnZeyge4tdiuxWu`N^G8pjN7J~ zlHZ;#viZUg{($^1Bj6;)dTtv71_ndm==SGb3cjpuk`}{nXM}SX!d^8Q>R*)v-ud=j zF4~jD30N_S9A2+|Zvd_tK(U-5<|S{Wh1OqaKaIB+FPM2**4nQ`bbIoxMoN-@248St zTE3pSbD?>wunj&8N?aH?BGpo({ZYVRt6#7J?SoT6Fe5Qvtp>%koRdAlKLBvjYTQp-y!HrfMmXfTYmtxLPkc9MygAR+ zK0jN!=XCf`{PwLhY^#1>=ec0)FN)}Ol(*OF3c=P}PK@yey$$Trnn#ewwnUb}F8N?A zuY8LC{?_33N47&EhjKaf(Q$ryZ{Lm+9fZKn(XKdcDf7?(49_`e9{-)A+PEEs{5Mv{ z8Yizi@Pa~|?l`MC-RZu+6u|)Vsp&jZb@f>EfCroTo>Q{>cdZ#Qt z63=NpTwbxjp=!SquhNFvi>Z_iieukm;{*!VAWXNqL|m?S-00d-t&eTuMgU zm+jEIZj9+=?`h9u%v{5ptGP`>=N-&S{)Eyq@q8xo^Ygv>c!@O6l4m%GP7_#PBQt81 ziH{^Pg}hf`r9a5|p3L`z@3*5&Tj#IG(lv>B7;H}*ji0?gl}Xises6S`-B)idFe!l% zl@m(6*VNPTvWP9os;_N3V$qP$`B=Vw>=I`shj3wmf&xh@|9q40opSph7VpheNFL6a z&Q$0x&W*l2@PT7S7Wi!uP@s6;8cKzJZDCy9_Q4HOK3=f8q4}r8{K{>zUK6NE=^R}mPfG^)c6r65( z*t7`jZDcRMJR|_xdol)(CEk07V()817(KW7vdf-K0uBO)y6GAIbweQ6jwjol_F>8| zy|t3!-~iwy*EKT^w2a_jIoqXa!{cX-AQvu4eJLSats5DW6-h;>q~??Adb` zZNJE-)2jO4|NWytqY?lEVY-p(|Ni3VYblf2vuDqmIV-2rz)%0@CqMnkPh!WWxsB8P zn5;Z}^N8BlXu-oYs<0JklP8)0XPtRQT_T)1b?Ur%n@^fBf#1zP1%4XZF-IS@a^A z%$dRI^pj6MdDD%*M%tiom0f=P;~!u4gG+VkTWr2XOs8+TWy$j8%P5Y-NlX4GeMu!les2De92nd+;4=enCosvARz8MC z1)+Xdfr8<(S6sA-q-A9LzGDzDjy_vIqw`L-andR{Ti4ZML;yhD2@0O#Xv$Pt-*Jvy>BYg>mL1-7CmzFIpYW0+gIBMG1(&QMSG%a z@!r}8?!m_HToVuQ5OSb>UG}brn!?QDbIXwqshZJtZdep z&p@TQ=$vW2O{F>{+vLtIaj24Vpsr)LSu}Q}Tf`x`7nD*>46_{%y&zI#o45+c8akpM zbi)amOWA`JV?~L$!rhE$>_i1Oni2Ua03lpG2GGEyze2&YB-wuvo(c&}W*l23BRL|| zOO3T?cYLM@YJ~q8m$n8`Z$D2T6g+$TDO(%6cw8NE1$~N#+~vKAf9fU5-#}+nZ6{)E8+-UQ`|hCV zf?QO2ppG~ERGfftIYY9aId(sRg~V;D)rC;~sh`4tm`KaKBjzJ1rO;{X{Zq*KXnb|P zR6)P&G~N=5CB7==fE=SBpX|BU`ZIpl+2+pidyBtqGKqTJp>IS+fkw`Z=O9JaN{7ry zQIuSQJS87_0?^1WVlG)Pw=nXiU>~aI2t@|SEw|i!+;K;L{p_>WtXtE|L6XRzW`8of z#@`zm2*YxkKQczvuU~ugu}5Ea*(Dik76Abm4u?10bmKq&%bOo~;QrczqU*Zh2ai7T zh8wPrBaYC>1XF?Dc+(9>9{JweZ~uMS%Jr6?cw*@nzVO+TPyPgRy?mW9lzZuAmwx6m zC)ZhxwSVWGcf9|7@BP!=cSZh^QX}G-Fv|QBmmW$cL&-Pj6kRv;>D+L*(PbjGrlP9d zx6V6v{rdF))~#E2-g)PWWyIxswe*1+(eBTG{qx)3_LkrO{&y8>30jf0Yu9||yWjrz z_q=<<#*OT!XH(pGPV55MQ-At|;emM;CmDWCn+$sZ5hDY^|CHyEV5#19N< zH~#vDBR}vT6n+X2B1@M({)I1m_LC=n9HJpZ%L}^n(n~)2u@nCCmp_ldVB^M(fBDOw z|Lr~Rxb?OrQt$)l#^LbjqmI1chU+(O*Z}dpugW_b$@x+d*1n*TW_%(lA(58H$48t5B=}Yf3{)6`U;A5>(-uo?l-^r&9B8L8#b&b z9%3C34?ghVkstVvd+)u6fxUnJ=%bH(>QkTi(SQF)Ba;o?<4YfZ=R4nV*Ps5_bu5W2 z0$}OV$3J?~iNF8-Z^;T8(&(U_8NJ9;t5&}2U2nVf)>~rf&i;4hiWO&_b^6!NJ_|)M zif*Vwn?G*Yu)*~xYUQ;647*`ujr!O{jH8IaPNDbQd)FsE@v%SNc}MT)jq`)XjC!M^ z&Jf!@{`jMBf5*RGb>%PD^S1vK?D}=zzvz2!d;43~tzTPN?t9<={*mv0@52v2G(sA~ z;qdXtA3O2H4_|n};>dK0yq(MrB6khDp=n1|wa=W!2|+BXnUUC`)2=)Igya6}!V6Ze zTshL`;c$5EwZD4n+y3S5yYK4ft?5lS{<_c+^`h!@bjoKxdGaU1vOIH1@VU=^>iqK; zKV@rV@TDJBz4lkvyz^b}SZ~<@s$JKGE!%(3Tl}q0fA&)kKKNj-f2yi_*IjoV`GNQS z@Q0Um;ZvX;x^?T;y!+qYdDWFyY}~jp)}2jd7hZV5$)EgBTM_~=j4avA#&pYai?+oL z+NnJmf310U!yab>HP4D3#IP3@4Wz!@SC%Z54sf)C%zUmnekNHsW-{9?QK!rh z7UmEJca?so7dEyTYUG}E#?O5p?Gm7;&b+&jQdhhxd+Qcja|MyvfSEhZ%)o9$JN(>y zP1R!`=cb)a<#~=+mN2(4eRS%jL>*Eh2iha!4Wv$Oq*YcWvlo3?erA_`Dx31RjF_mD!#p7u^`CK4O zUzs6XQDJPKS*%((Ej$9bJ@IDG3&!iT*ipzwOaCR`8=n`y6YVp?7cHX;jl_S09~k*d zkIlU2{W~u#5*~W~u$Is3?-}tDz5HvjP%>M!ZW~2#PVdGCDSRH8;TrNRELt+3m9_~o zQX;bp-oWVR1@paVt;PldkP|fY82sP!4i+XD2`W_A>H{XS^XPDj=qW%Bf}$@$4( z^pZuVDMM9ihqIWpf@C3y*=UUcGB}JN1)Ly{Y(m@bQq!zewd*=n-MDe6+O1!|e*OCO zYu2n?xpL+5<;y>C^obDp^SyucU|cM>jc zc<5L~MY$x<1b#$7`8+(;C>nM*_O=tem{SjTI>LsbT%c?<4;wiSmfOKIZRDF_|g6e6DPg;Rj+!+4m-@5GZ)acYt}4%V(HaaU-hRy{>j&Q;`l{_ z`(NsJY;0_&opxHd-F98qJ@CK-f4uX~jorqqWgw6^#v~+65fnTyPYGjVV>|A=({>BD z>$>j22OhZNk9Q0=4CB4g2kql|%A~0~@3QmOTW!5zxc;VJ-?(DM$`QHAz|5UFQym1@ zdj2+JgR%AN);{vcqoz~Cyucl!m_f2^7x?+)$y0XOW#_H8-g?9O^*7yg@gS{`@`>lfB*gWSNuCxX*=Kj-bJRMQ@-%IYp=gf6cZ*)eD<@Sz2#P0 zE?>6njyvyM_QVq*t11T&pWAJ>-7}xL+f!>+|Ms@uEPrwtr7YD3)85mr0oB1^u;8aCf-^XESIxn0-& z_V>Sg?2$*gf}o@PW}4(6vj53f!7WP86s~%RpvQal_j#Ldw&RXF&zU=C)vBj%zy0@* zJ^FZXRM>GI2ZTao!XS<7!3Q3=r^0QX@Ev};rndAsA=Becv?Bj@0(f#C%QV)wDb7DP`Bg1Ju6j zjTTM_{6HZC;axeJzk`ua%8Cugk;hSNkG$8%KK{L%k_oEc$@4iGCn%qb@v1<^+oNky z&Bjfdso#*#NPjA>iVY&-rFcGY753tI&Uf|u-(j3BFdpmKruwIh8`+LBB9s~{+Sp|v zBk}D>95vGCNL>(!w%CtA!~-Lo@PD*3Y9sL2%oxq^M$9A^8J??e8hKaPb&1I(WL0^u z+Hb#aJ)Y#slE=fnn6Pi}(a(Z`;^T^c?ET(RVkKTJ96o}pUd&nX359cQpL0g=P-TMD zm-exz8S~gv!k9Vz<0zlItQ1AgJzLB1+NNmu2;wmMneq6D-(l)w$hpo<_?h^Kk}_W|aUKDIgXJ4T#oe{xsqaF(&~^ZecZQDovEH*IZdj2M+?zyEve`Ml#l ze4+v3kT)Gv$mjp~?*AWoqHmZq96)+^7w5^f1ZJ#3#sx|@ApyL*%as0MXFJrsXE#ePmannzuWN~H2JXC|I+3t9?I`B&eq1` zD*KaxS&kQgsFwm7d9U^{_J5Cy#8i2s@YU1wGx&K_{^Kw(g0T@E-Xyn=VztL_#V?d` zJsnr0=xdWcqKAjT-nc&Z7G$2r*NpZdCeZ>7%#7>jczllM;Z1VR_{q3&)OZ|L9~81h zABX=JKWqxO{(QmzCOKq0enx!CCiFFq!$;*j4$qY{Q7{jFUSj}MUlWs78;fb^>FjY+ zG0AA3E9Z}2B=J~l)OP%#LB=HG{b~JuJSS|D&qw^=h`-LsPRK_QHFyI*9Pg&>ZhUNm zP2!DlV~=w-wctD&1C;n@+@xk4cf}&o2%i{F_WdS8zfX_h@wQO$-=B1ki>t@$w`HH7 zj^Cb+CwqO~lwHJl1<(;5i02u@gv@nZ4A#R#m2K%~^naw!^oI)pCT(-meS4a@PnE-nAFqA*zj*uU^)=FFmF?5T02u%LI2##hXB^KL&Uu=6djy9V z_l%${7Hw)=BmEiSpDLfYw@bx%7%r5G)v^Iv7a_HBV8OXOV~1U!ddlZMK701;>C>lA znKF6Oq)8JePOLNP)|xq{F#xfV-8%$J*Hu4&BI_}_G3N?J1B_+tYvPM?f_{B75JOq- z4j9A+I%`%Vez)}=OR#{~wG+VCk^y+#LYpA@i|lj2zUcB&Ra?;WwG%}9fQmpxyiTcQ z3%F(2;-|mP!$}1iI`+|?_s<2eZrEq`MYaC>Ks@t`!nHb+reMj>S^rS$vw*k|>Roae5MjMj?bliDPfCI8LjgMF1|aG{=6n5J zc346n5@*3}r3jv@rlLaK<>vr(laplTS*a8mi%rA z_4fuLnw){irYH_cQl5qrBM`3`+(PF-d9TSzyUyhiSfF? z5>cu^8xRlCHwudO?vts=1j$1tJ=|tJMwc_+(pecmRb@Ruu$?CSyvTtHfrDIVckuBN zdv2(Vwvx6ao+oBtuTVh?y$CS~5z5WP9`aNm>nJ9(#dt-DK!U_@6?JP5q%DhK}s=Gzn^SvuSKK`HYdtD{Lr(vbl%sD;l34sg2S!dJmo zg=gH4Q_Wt7S$(@C4u52QS6h=}`^1S5dqTojg&k3K9Kr(#E%qoV_z4qf-V>p(;r2^H zPLem`m7L@d&&8quDgK&LbEjDSh@YV-cB*`1*pX2t(GWD{^`eDzX4uK`7Tz;i(T~@D zrjs@dFa|I_sr+v$Yc2e&BhAIw7~z0=uQ=pJnuPs&n-U;Yeo^U9QT;v-7D_)36vlO4 zZ=6Obv^)3v5!DE^a7dgf3!aZS!677WHKIUVmqN-TKe`e{q2kPz7DPW1GL)7uL6Lv? zTET;L(t;HF7a>;@SfUOLyDTiegCWZ z3aX#E=TEjNhXVrmsef1rd=?N<68mO-AuX+mARORbN)m zSp)Z^P{yTz#V1Tk@(IM-k^`<$e>#34J|CWiB5nc447ElyZ~e2TdlO zX8cqAc&;bpy(<2>R8JIg2!1GCqQA?&3VE*!y+l*0>hmCkCdwBN=~E zZf@^}$vU61W=ZS5b6)`EgDv`UPnr%c^ed|aCT?aID9etV^bQ9^I&1u8WaCc6%05hXHpE&t? z11DYT;1gdbXh7%r5;lXk_U(BOHDgj@%FF)5iW;P$iyQVB5Op0eU>1tW*mEru1OKb{ zK|MbNl36R(GDOjd^{ul$(~P~J(G!zKvv?eSQ(wmwyXMX~-r}n=g3Q(N;F|G&k*64O zcPT?eKO3TN5S}`U5%KNlprST+r|#UX_4?Bw_Dtt%Io@&uhS27^Fqvx?VFBax4jnaR z-!eT?lJIpS>jONrjZsMGSNqZ<8l@8*K!)0J%~**{@soTcyU>)sJ>^hpI1{TDWU~(* zVut*i$Et}pLC604DxmlT0F;|MMX9*;s9%Ullc68{894sY$5l#0J-9)%U*zLF#8JEL zG$8Jzgzrdn^}W9G#OF&^MzofAi{P=ywks|zth@4njU|xZr6uzDj^nbCM*CfFyvo1Y zJR@}1v&WXWMZs`>&arg#Bb`Ofos@A&@=WjT5TFa3TSQsy4zz{N^<^9wx`w7S5;?|! zlwMetTc6KIO%5WFE0uT{!C~;N^m#_e$)bRE+@Z4mL_hoAlKfqDAjQ@sdZ_*WL_S;S z$j8;^tKiIHry5r8E!?W>Q`L+bQ{U15@l2YUROnu<6C;l+Z_HNQ)~ za&IW2U3ftF2}Q;aZV@3da+IJl70<|Yf!NYdAD#66i+=nQ9wa?)^>^W?hT07zdCx~D z$y&ubYyVy75TRekZ&e=V=j9V3c9i!T#O#7>AjKD;Nnxtuh3Qi?`{{9A$5=?i3xxlz z8f2fl;36brxQ{O0wlh0I-%h*a6IGu^RR5L8thf!FyW}w}?~2ULsE8c-g*$7wgAG z!4K7!xrfRHqdxyoG7>UOzYuHy+GCM$MSl9G&~io~9_Q_tNI zDuSWHe0}M;^MGXZ*oyvyc3y-~KjrOvm{(g$P=c&K*pg+_z+p#4P7l*YY3Nga46%jvAFFx_MrBo;c&7QZvb#VMQ zX)11zq6S;Bce#jj%ez6)FtBmiyE@p)rE-heKDQ!04Pw)7>!&s}ZE!V5KWzy*`hbzo zLHcVY4?#>vP)M`oz9vomhEdm?t>%ab8k(0~;`89jSZC_Yz9IUcqhrLtT$2DkVKQ1~ zSR|r(G})=SGlMr7`a(Cy;w$s^U0a1Sw}yT@LU%fV2Mdta*pA85#==cOrQAdXQu4H$ zHicUKIdPr((uiYMoVr5q3W%yie-vnmB^8K!XAmc1{jow~i9@I;WMFn-`jzN|HW5Dp zX!@f2CYHQSh3&vc-i|%t{ZYk0S{E|$BUWy2ox22YpZGE!OB=N3#f#OoJbwVcL$$L3 zH@n*%RYxWh%Bqzz;izNN0@a_G`-`)_+@FE_P(k2z9NZ zzUW9B^#3*c8nOM_f0L)Lx%xM>`ES8*7Ce%`)lG5}wgw24I2UpyN}F5=6??|hg{gPP zBxP>cgP@nINopMs1<)jR+zj)++v2tsb^&)& zLY<=WVb2x{&--Zwe_s1K3jbo#k9%lS?}n>^$w5^cYe%~rwDw2RUzB&bwrtPBeOBRH z|2-Mmv_ji=*(4YB_$u|HDuafhugs75qrNQzkOA!-?n5yk#(X~oGAQ>%43Znss*M;| zrtL`OH|ZE~iw=}KOT=F2&iTAmzgF!!>_r04juYbnRScSVAwS0(>~u!(v&)~~6=~(j zyZL2fR_Ou{YQ=Sm48{A`Df-wm88oGji#oloQ?ntrUvjk&1F0|i@wm6e>{^PA&==4~ z+(#!S0W`;U$LF(sE(zOdzQm!&3~W<4MxhP%+HtNAo0Z%_BM#d*-ARc_Bu<#9^KdJ% zNAi62`{bO4^cUK)eNCA&ezWI2mJ9nzf0y=dI&%ATUtjTK`ihv-&bXP)X6z~hU}z*L zg)=ihKloEC&ZYLDA6GyUGleIGKE+~TFph0~JqDi>&-Ob)@790ry8^9|(=z4^3}*~X zJMHmUk-sGN{JkEh4SXBEU{wSvt%31?_Bq_*vEUh>^0$l+X{QnxaQ8^gw^(Q-4zxZ> zgJIQiTyPuw6Y)91|Ay}%_o78CVSVr|Q1V91M*?r|yLw?ptjhocTfKLCvBF~(w-&B&G&KR^6OWS_7ug=4Mtl)*vdJWQpv;4s`#P7K z#|!l70!3@#v#3W@f5iAI@Zrsm+I;-Jk+5NR9XUi&L5_Rp2s<^{eR{_;1FMf~7fFw1+dX&RHFerF01rO&pxqH+<1V!U1w-5IR8_QL(NSNvxww?|MZFTD zg=~gN$}=%9iXlM|@>Hm0q0ttgOyFgWR#il8Lm+Kji4!GedNR?pFYsQ2@wj!p2Zwap z_4eDN5-9Oz{~3oL@h_QP0uTN!hygjcT$w682_lP@DjJ2Y&d*6Z(l&3SJ=vW z=g+VYW?#~5t)5)rBX@afaM94;R5?~yLs%4EW7gagz!1QNE{!y9Ea4rB084+8R-HyQOpRc(RP38Lc10$W38;aFjPW9yp+ZbK&C ze%Ofj2c`eSq2oXGOFk#p1#gQl1qQ$QnR^Ml4(<({qhnkVzO2}e@sHJg4SkWjI_q;+ z`lcoJa2D5)KO}rQtpYDX{wXY9U$im9-9S)@V&$g%&)-Gn!+m-&NM) z*6}_|9mBpe*o)Juha76gJRyfZM;XSbmoA>qdgFzM>sY93(M{+y<0YF)1+MyWQS_nq zzt|CDJn|>;(*>VssoN}NEQ*M801P!2KhYJtV;yo0U1#44J~`UL)KW3ful23;FK7sS zMr=dbihtg^o?S4~5z($& z8uK7z7&s}llugP)U#25^_g;53J{QJ;#cz7dY40?iNB?s;=R0q>4|1+1_JSX5Fs;^V zE^%71Q?*#vrNTrSa(J~b>qGI~jD>t>*y0n>%Hg3qv-jq{%zb59Y$-a`5#Ed6yMlr6 zO?Qsr$9akr*Bx{{-QKL5>Jm{GE`IZ4CN$>-<(BQ@!0s!Ue-4m+aThv?x z5!hOkKd;DqQ743G)mOQUyck9K@8yCDlz#?q=U$;PlKn+7$V1b3=z$0S5FACmc2)XdzbgX_e-r$aK`hL~eega&6U;t&G=B8t5SY@)a2bMH}PWZ6iW zkHoQXP%*A}ZyX8Z0;@CaG9fXVFCKh^j-Kqh(E=+xf5^@6n%4gtyxAZyg zYsfx0!Kc2`{OJZlh7GQ-$fTtm(Nr4(`k99rj==1t&%OLpKLxki8pl`xZt`b-K6DVz zGe@guzeRUSAL0EW+jAMpojdW`f|u+?YP$qRQ=VgHiVZ&-K8tJa$a7KU^CENFCR8=^ z)({L(%>;=tgvO(VkaH!9;$On=xNHY>e$^kPka^OMjymw{xm(ss_5I}7 zR2JvqATE+ZgdqZPR(Hz+nK0s_Y714!)=qBSxbit@cdv1%k~VKTHL6jKUc-qbZI-xV zyu)qsumw<_i4&wGBB>H_Uk}I|=^W{JE!8zd$#?uD;AWMik ze5;Q)vC-o5WQW9?NQgz90fN)at!G@}ek$%hFjQrDt$qJOnY55Uz;G^g$`dN#yG?IW z1X$y+9De-4a9%Qr+)pry)GnUiTmvaIsr}&q^zp#DfXS7GqpHlB>Q!U=B z0d?AXF<$x$Anc{^vm+!z*(SAb*#hma%QN7jb`eZL>OjJ zX(c$9(p2Tlk=VQFL(5$ot~=AR6ac3lsPvfMRlkFfFUM8=NQpjL%jrhGfH%FIzkC zsWOs1rP50vmGaiBFcoQR?9RimZIpykwf_lHP{tIk+pp3 z1;sAXR}xp$+Q>}`DOK@|(9AsCgblWy^rUK`SZ<)Gek=W5;Si;TRvQ727P|B(?MOL5 z-#b%Be7kw}V!6l``Z}V8q7}cu05rLd?We>{@~xnbo>Z7c+=bWB&`5e)M?0sg&Zz8j ziEt8`8q@K($AS3IsK!4LO*W>VZ9w>%jOFqs3yt8rjq6FxHHFiPMCygdX>WQeZZF%csT{P+BI z>tPICiDXJ|ZTX-ZXA9}Gc%OoXM~)k?8GBnsJ@I4Q%XvAqG?0D62s;H53LYZD>_;pTG90}*i&kS1Y(_PPdHy~!1M)bT5j8m8P4vG+ zCiHHSky7#9>Az|WR>#$guFD%cdb*f1*RAPI{;29$%%$se`spU(0MOdNLl1?WQ#Ycw zd|LSLwvx~QG#SJedxLZez&3A~0|v_%RY15(=A_1)DDiK28(^M;z;j@HWsDA1G;*+Q z1xlN3oq0dKKgzs?T(>XzHgFU2J;`j}m)As8d^J)05Rt*5v;*eQ0%G|I)(6XNXn;mu zmdT1au`P0Ft*?HCv}T^9Jue-AXtU(YDX;w`4G1FdC30!pwoH$k>T}2kQPb7hF=y3^ z4B4gtu>x;q-^(*+PK!V_rV;jj%Xt_GdU+J~jOV;*$Q;5m3o(`qG=25X6_frBXXgn9H5U7GenTO%GCcmn!lLnxd zkDa-Wl!N80Cbr8M!TS-Em}!MKJOHa$Re|T&Q}5-w+&Rg-aaHj^EdJ(tv}F}rT+7^^ z7>m~2AxZg+$~^dIka#f8G`*YLgC9KqQ>uJW^E1s(ZTi69I|R>+Vz20qyebmj-|$Ba zNXi+($qa8TciL^dXZ!iyde?^3vG;96;W9_+H0|B7LEj-^FSHLW`GL|>{((1%?}`Eg zsrMk*RL1!^`9#x38ud$VC%>WCY}kTL*A$~R2>3l66$8{!h7!%Dfx*4xN#kV$1YBQ$ zcv&RRIj=e1!F5R8HMCJodcfRZcndj8@-w%o{k^>JJvkYX!x_uWp%*FkOTBB@6nVI3 z565wi zg?h=jqUVo@&z{d}WsJtvHQ!$HP725TfX}6ogG{@Xi#Y~=zOW1xyqDRC($1}cSBi4Y^eiIrd+2Mvb(<)pUf~v z*C#ISLtEsT2S20mv-ITecjZ(Z77U=+n)v~sWh@$YVehT6s4z~p?<)Bua88b5pLxGb zy`PB8+LN2vLX9hYn!@Fh;9Tsnilj{3?*tzf+>Y|Ur0;_$ zcf~zt*y3soVwbp=@9Laj{$da^YZClZ;(64#IZr_{5d7cI zd*}Sc_iJms6k~C&_U}s3Z`{%2b2poxDPt01iF3U{6Q;J-IfCmkIoY7^{1&lL_?Nye zs_*a{B@82=AsKCMHYXz9>8&hWhQ} zgc#PubIp_QV2%I+=4sd>Lgwz4{HtD`4|8!<1BZsa4n=ojdE_MQnWNk6A3i6gWNm0tT@EIznK0fps$`x!Z58ks^{ z`ZBk1>g>K|-1%9r@M!<=?^IKq^_Y2r}N9@9*fnv+XOVY

        3RTaiB`4HAYsj{|OQH`#9=1L!`3jQq343$} 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

        $dDP8yqNA0A9b?|aIA@NO?waX`l{KIUsXC^ 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�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 literal 0 HcmV?d00001 diff --git a/tutorials/vonage_video_ios_app-theme-customization/.astro/collections/docs.schema.json b/tutorials/vonage_video_ios_app-theme-customization/.astro/collections/docs.schema.json new file mode 100644 index 00000000..15dc3fb5 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/.astro/collections/docs.schema.json @@ -0,0 +1,650 @@ +{ + "$ref": "#/definitions/docs", + "definitions": { + "docs": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "description": { + "type": "string" + }, + "editUrl": { + "anyOf": [ + { + "type": "string", + "format": "uri" + }, + { + "type": "boolean" + } + ], + "default": true + }, + "head": { + "type": "array", + "items": { + "type": "object", + "properties": { + "tag": { + "type": "string", + "enum": [ + "title", + "base", + "link", + "style", + "meta", + "script", + "noscript", + "template" + ] + }, + "attrs": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "boolean" + }, + { + "not": {} + } + ] + } + }, + "content": { + "type": "string" + } + }, + "required": [ + "tag" + ], + "additionalProperties": false + }, + "default": [] + }, + "tableOfContents": { + "anyOf": [ + { + "type": "object", + "properties": { + "minHeadingLevel": { + "type": "integer", + "minimum": 1, + "maximum": 6, + "default": 2 + }, + "maxHeadingLevel": { + "type": "integer", + "minimum": 1, + "maximum": 6, + "default": 3 + } + }, + "additionalProperties": false + }, + { + "type": "boolean" + } + ], + "default": { + "minHeadingLevel": 2, + "maxHeadingLevel": 3 + } + }, + "template": { + "type": "string", + "enum": [ + "doc", + "splash" + ], + "default": "doc" + }, + "hero": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "tagline": { + "type": "string" + }, + "image": { + "anyOf": [ + { + "type": "object", + "properties": { + "alt": { + "type": "string", + "default": "" + }, + "file": { + "type": "string" + } + }, + "required": [ + "file" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "alt": { + "type": "string", + "default": "" + }, + "dark": { + "type": "string" + }, + "light": { + "type": "string" + } + }, + "required": [ + "dark", + "light" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "html": { + "type": "string" + } + }, + "required": [ + "html" + ], + "additionalProperties": false + } + ] + }, + "actions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "link": { + "type": "string" + }, + "variant": { + "type": "string", + "enum": [ + "primary", + "secondary", + "minimal" + ], + "default": "primary" + }, + "icon": { + "anyOf": [ + { + "type": "string", + "enum": [ + "up-caret", + "down-caret", + "right-caret", + "left-caret", + "up-arrow", + "down-arrow", + "right-arrow", + "left-arrow", + "bars", + "translate", + "pencil", + "pen", + "document", + "add-document", + "setting", + "external", + "download", + "cloud-download", + "moon", + "sun", + "laptop", + "open-book", + "information", + "magnifier", + "forward-slash", + "close", + "error", + "warning", + "approve-check-circle", + "approve-check", + "rocket", + "star", + "puzzle", + "list-format", + "random", + "comment", + "comment-alt", + "heart", + "github", + "gitlab", + "bitbucket", + "codePen", + "farcaster", + "discord", + "gitter", + "twitter", + "x.com", + "mastodon", + "codeberg", + "youtube", + "threads", + "linkedin", + "twitch", + "azureDevOps", + "microsoftTeams", + "instagram", + "stackOverflow", + "telegram", + "rss", + "facebook", + "email", + "phone", + "reddit", + "patreon", + "signal", + "slack", + "matrix", + "hackerOne", + "openCollective", + "blueSky", + "discourse", + "zulip", + "pinterest", + "tiktok", + "astro", + "alpine", + "pnpm", + "biome", + "bun", + "mdx", + "apple", + "linux", + "homebrew", + "nix", + "starlight", + "pkl", + "node", + "cloudflare", + "vercel", + "netlify", + "deno", + "jsr", + "nostr", + "backstage", + "confluence", + "jira", + "storybook", + "vscode", + "jetbrains", + "zed", + "vim", + "figma", + "sketch", + "npm", + "sourcehut", + "substack", + "chrome", + "edge", + "firefox", + "safari", + "seti:folder", + "seti:bsl", + "seti:mdo", + "seti:salesforce", + "seti:asm", + "seti:bicep", + "seti:bazel", + "seti:c", + "seti:c-sharp", + "seti:html", + "seti:cpp", + "seti:clojure", + "seti:coldfusion", + "seti:config", + "seti:crystal", + "seti:crystal_embedded", + "seti:json", + "seti:css", + "seti:csv", + "seti:xls", + "seti:cu", + "seti:cake", + "seti:cake_php", + "seti:d", + "seti:word", + "seti:elixir", + "seti:elixir_script", + "seti:hex", + "seti:elm", + "seti:favicon", + "seti:f-sharp", + "seti:git", + "seti:go", + "seti:godot", + "seti:gradle", + "seti:grails", + "seti:graphql", + "seti:hacklang", + "seti:haml", + "seti:mustache", + "seti:haskell", + "seti:haxe", + "seti:jade", + "seti:java", + "seti:javascript", + "seti:jinja", + "seti:julia", + "seti:karma", + "seti:kotlin", + "seti:dart", + "seti:liquid", + "seti:livescript", + "seti:lua", + "seti:markdown", + "seti:argdown", + "seti:info", + "seti:clock", + "seti:maven", + "seti:nim", + "seti:github", + "seti:notebook", + "seti:nunjucks", + "seti:npm", + "seti:ocaml", + "seti:odata", + "seti:perl", + "seti:php", + "seti:pipeline", + "seti:pddl", + "seti:plan", + "seti:happenings", + "seti:powershell", + "seti:prisma", + "seti:pug", + "seti:puppet", + "seti:purescript", + "seti:python", + "seti:react", + "seti:rescript", + "seti:R", + "seti:ruby", + "seti:rust", + "seti:sass", + "seti:spring", + "seti:slim", + "seti:smarty", + "seti:sbt", + "seti:scala", + "seti:ethereum", + "seti:stylus", + "seti:svelte", + "seti:swift", + "seti:db", + "seti:terraform", + "seti:tex", + "seti:default", + "seti:twig", + "seti:typescript", + "seti:tsconfig", + "seti:vala", + "seti:vite", + "seti:vue", + "seti:wasm", + "seti:wat", + "seti:xml", + "seti:yml", + "seti:prolog", + "seti:zig", + "seti:zip", + "seti:wgt", + "seti:illustrator", + "seti:photoshop", + "seti:pdf", + "seti:font", + "seti:image", + "seti:svg", + "seti:sublime", + "seti:code-search", + "seti:shell", + "seti:video", + "seti:audio", + "seti:windows", + "seti:jenkins", + "seti:babel", + "seti:bower", + "seti:docker", + "seti:code-climate", + "seti:eslint", + "seti:firebase", + "seti:firefox", + "seti:gitlab", + "seti:grunt", + "seti:gulp", + "seti:ionic", + "seti:platformio", + "seti:rollup", + "seti:stylelint", + "seti:yarn", + "seti:webpack", + "seti:lock", + "seti:license", + "seti:makefile", + "seti:heroku", + "seti:todo", + "seti:ignored" + ] + }, + { + "type": "string", + "pattern": "^\\ import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Freference.mdoc&astroContentModuleFlag=true")], +["src/content/docs/index.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Findex.mdx&astroContentModuleFlag=true")]]); + \ No newline at end of file diff --git a/tutorials/vonage_video_ios_app-theme-customization/.astro/content.d.ts b/tutorials/vonage_video_ios_app-theme-customization/.astro/content.d.ts new file mode 100644 index 00000000..ba5cbfb8 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/.astro/content.d.ts @@ -0,0 +1,227 @@ +declare module 'astro:content' { + interface Render { + '.mdoc': Promise<{ + Content(props: Record): import('astro').MarkdownInstance<{}>['Content']; + headings: import('astro').MarkdownHeading[]; + }>; + } +} + +declare module 'astro:content' { + interface Render { + '.mdx': Promise<{ + Content: import('astro').MDXContent; + headings: import('astro').MarkdownHeading[]; + remarkPluginFrontmatter: Record; + components: import('astro').MDXInstance<{}>['components']; + }>; + } +} + +declare module 'astro:content' { + export interface RenderResult { + Content: import('astro/runtime/server/index.js').AstroComponentFactory; + headings: import('astro').MarkdownHeading[]; + remarkPluginFrontmatter: Record; + } + interface Render { + '.md': Promise; + } + + export interface RenderedContent { + html: string; + metadata?: { + imagePaths: Array; + [key: string]: unknown; + }; + } +} + +declare module 'astro:content' { + type Flatten = T extends { [K: string]: infer U } ? U : never; + + export type CollectionKey = keyof AnyEntryMap; + export type CollectionEntry = Flatten; + + export type ContentCollectionKey = keyof ContentEntryMap; + export type DataCollectionKey = keyof DataEntryMap; + + type AllValuesOf = T extends any ? T[keyof T] : never; + type ValidContentEntrySlug = AllValuesOf< + ContentEntryMap[C] + >['slug']; + + export type ReferenceDataEntry< + C extends CollectionKey, + E extends keyof DataEntryMap[C] = string, + > = { + collection: C; + id: E; + }; + export type ReferenceContentEntry< + C extends keyof ContentEntryMap, + E extends ValidContentEntrySlug | (string & {}) = string, + > = { + collection: C; + slug: E; + }; + export type ReferenceLiveEntry = { + collection: C; + id: string; + }; + + /** @deprecated Use `getEntry` instead. */ + export function getEntryBySlug< + C extends keyof ContentEntryMap, + E extends ValidContentEntrySlug | (string & {}), + >( + collection: C, + // Note that this has to accept a regular string too, for SSR + entrySlug: E, + ): E extends ValidContentEntrySlug + ? Promise> + : Promise | undefined>; + + /** @deprecated Use `getEntry` instead. */ + export function getDataEntryById( + collection: C, + entryId: E, + ): Promise>; + + export function getCollection>( + collection: C, + filter?: (entry: CollectionEntry) => entry is E, + ): Promise; + export function getCollection( + collection: C, + filter?: (entry: CollectionEntry) => unknown, + ): Promise[]>; + + export function getLiveCollection( + collection: C, + filter?: LiveLoaderCollectionFilterType, + ): Promise< + import('astro').LiveDataCollectionResult, LiveLoaderErrorType> + >; + + export function getEntry< + C extends keyof ContentEntryMap, + E extends ValidContentEntrySlug | (string & {}), + >( + entry: ReferenceContentEntry, + ): E extends ValidContentEntrySlug + ? Promise> + : Promise | undefined>; + export function getEntry< + C extends keyof DataEntryMap, + E extends keyof DataEntryMap[C] | (string & {}), + >( + entry: ReferenceDataEntry, + ): E extends keyof DataEntryMap[C] + ? Promise + : Promise | undefined>; + export function getEntry< + C extends keyof ContentEntryMap, + E extends ValidContentEntrySlug | (string & {}), + >( + collection: C, + slug: E, + ): E extends ValidContentEntrySlug + ? Promise> + : Promise | undefined>; + export function getEntry< + C extends keyof DataEntryMap, + E extends keyof DataEntryMap[C] | (string & {}), + >( + collection: C, + id: E, + ): E extends keyof DataEntryMap[C] + ? string extends keyof DataEntryMap[C] + ? Promise | undefined + : Promise + : Promise | undefined>; + export function getLiveEntry( + collection: C, + filter: string | LiveLoaderEntryFilterType, + ): Promise, LiveLoaderErrorType>>; + + /** Resolve an array of entry references from the same collection */ + export function getEntries( + entries: ReferenceContentEntry>[], + ): Promise[]>; + export function getEntries( + entries: ReferenceDataEntry[], + ): Promise[]>; + + export function render( + entry: AnyEntryMap[C][string], + ): Promise; + + export function reference( + collection: C, + ): import('astro/zod').ZodEffects< + import('astro/zod').ZodString, + C extends keyof ContentEntryMap + ? ReferenceContentEntry> + : ReferenceDataEntry + >; + // Allow generic `string` to avoid excessive type errors in the config + // if `dev` is not running to update as you edit. + // Invalid collection names will be caught at build time. + export function reference( + collection: C, + ): import('astro/zod').ZodEffects; + + type ReturnTypeOrOriginal = T extends (...args: any[]) => infer R ? R : T; + type InferEntrySchema = import('astro/zod').infer< + ReturnTypeOrOriginal['schema']> + >; + + type ContentEntryMap = { + + }; + + type DataEntryMap = { + "docs": Record; + rendered?: RenderedContent; + filePath?: string; +}>; + + }; + + type AnyEntryMap = ContentEntryMap & DataEntryMap; + + type ExtractLoaderTypes = T extends import('astro/loaders').LiveLoader< + infer TData, + infer TEntryFilter, + infer TCollectionFilter, + infer TError + > + ? { data: TData; entryFilter: TEntryFilter; collectionFilter: TCollectionFilter; error: TError } + : { data: never; entryFilter: never; collectionFilter: never; error: never }; + type ExtractDataType = ExtractLoaderTypes['data']; + type ExtractEntryFilterType = ExtractLoaderTypes['entryFilter']; + type ExtractCollectionFilterType = ExtractLoaderTypes['collectionFilter']; + type ExtractErrorType = ExtractLoaderTypes['error']; + + type LiveLoaderDataType = + LiveContentConfig['collections'][C]['schema'] extends undefined + ? ExtractDataType + : import('astro/zod').infer< + Exclude + >; + type LiveLoaderEntryFilterType = + ExtractEntryFilterType; + type LiveLoaderCollectionFilterType = + ExtractCollectionFilterType; + type LiveLoaderErrorType = ExtractErrorType< + LiveContentConfig['collections'][C]['loader'] + >; + + export type ContentConfig = typeof import("../src/content.config.js"); + export type LiveContentConfig = never; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/.astro/data-store.json b/tutorials/vonage_video_ios_app-theme-customization/.astro/data-store.json new file mode 100644 index 00000000..27b0ccc2 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/.astro/data-store.json @@ -0,0 +1 @@ +[["Map",1,2,9,10],"meta::meta",["Map",3,4,5,6,7,8],"astro-version","5.18.1","content-config-digest","a30a942a2ceda2e1","astro-config-digest","{\"root\":{},\"srcDir\":{},\"publicDir\":{},\"outDir\":{},\"cacheDir\":{},\"compressHTML\":true,\"base\":\"/\",\"trailingSlash\":\"ignore\",\"output\":\"static\",\"scopedStyleStrategy\":\"where\",\"build\":{\"format\":\"directory\",\"client\":{},\"server\":{},\"assets\":\"_astro\",\"serverEntry\":\"entry.mjs\",\"redirects\":true,\"inlineStylesheets\":\"auto\",\"concurrency\":1},\"server\":{\"open\":false,\"host\":false,\"port\":4321,\"streaming\":true,\"allowedHosts\":[]},\"redirects\":{},\"image\":{\"endpoint\":{\"route\":\"/_image\"},\"service\":{\"entrypoint\":\"astro/assets/services/sharp\",\"config\":{}},\"domains\":[],\"remotePatterns\":[],\"responsiveStyles\":false},\"devToolbar\":{\"enabled\":true},\"markdown\":{\"syntaxHighlight\":false,\"shikiConfig\":{\"langs\":[],\"langAlias\":{},\"theme\":\"github-dark\",\"themes\":{},\"wrap\":false,\"transformers\":[]},\"remarkPlugins\":[null,null,null],\"rehypePlugins\":[[null,{\"experimentalHeadingIdCompat\":false}],null,[null,{\"themes\":[{\"name\":\"Night Owl No Italics\",\"type\":\"dark\",\"colors\":{\"focusBorder\":\"#122d42\",\"foreground\":\"#d6deeb\",\"disabledForeground\":\"#cccccc80\",\"descriptionForeground\":\"#d6deebb3\",\"errorForeground\":\"#ef5350\",\"icon.foreground\":\"#c5c5c5\",\"contrastActiveBorder\":null,\"contrastBorder\":\"#122d42\",\"textBlockQuote.background\":\"#7f7f7f1a\",\"textBlockQuote.border\":\"#007acc80\",\"textCodeBlock.background\":\"#4f4f4f\",\"textLink.activeForeground\":\"#3794ff\",\"textLink.foreground\":\"#3794ff\",\"textPreformat.foreground\":\"#d7ba7d\",\"textSeparator.foreground\":\"#ffffff2e\",\"editor.background\":\"#23262f\",\"editor.foreground\":\"#d6deeb\",\"editorLineNumber.foreground\":\"#4b6479\",\"editorLineNumber.activeForeground\":\"#c5e4fd\",\"editorActiveLineNumber.foreground\":\"#c6c6c6\",\"editor.selectionBackground\":\"#1d3b53\",\"editor.inactiveSelectionBackground\":\"#7e57c25a\",\"editor.selectionHighlightBackground\":\"#5f7e9779\",\"editorError.foreground\":\"#ef5350\",\"editorWarning.foreground\":\"#b39554\",\"editorInfo.foreground\":\"#3794ff\",\"editorHint.foreground\":\"#eeeeeeb2\",\"problemsErrorIcon.foreground\":\"#ef5350\",\"problemsWarningIcon.foreground\":\"#b39554\",\"problemsInfoIcon.foreground\":\"#3794ff\",\"editor.findMatchBackground\":\"#5f7e9779\",\"editor.findMatchHighlightBackground\":\"#1085bb5d\",\"editor.findRangeHighlightBackground\":\"#3a3d4166\",\"editorLink.activeForeground\":\"#4e94ce\",\"editorLightBulb.foreground\":\"#ffcc00\",\"editorLightBulbAutoFix.foreground\":\"#75beff\",\"diffEditor.insertedTextBackground\":\"#99b76d23\",\"diffEditor.insertedTextBorder\":\"#c5e47833\",\"diffEditor.removedTextBackground\":\"#ef535033\",\"diffEditor.removedTextBorder\":\"#ef53504d\",\"diffEditor.insertedLineBackground\":\"#9bb95533\",\"diffEditor.removedLineBackground\":\"#ff000033\",\"editorStickyScroll.background\":\"#011627\",\"editorStickyScrollHover.background\":\"#2a2d2e\",\"editorInlayHint.background\":\"#5f7e97cc\",\"editorInlayHint.foreground\":\"#ffffff\",\"editorInlayHint.typeBackground\":\"#5f7e97cc\",\"editorInlayHint.typeForeground\":\"#ffffff\",\"editorInlayHint.parameterBackground\":\"#5f7e97cc\",\"editorInlayHint.parameterForeground\":\"#ffffff\",\"editorPane.background\":\"#011627\",\"editorGroup.emptyBackground\":\"#011627\",\"editorGroup.focusedEmptyBorder\":null,\"editorGroupHeader.tabsBackground\":\"var(--sl-color-black)\",\"editorGroupHeader.tabsBorder\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"editorGroupHeader.noTabsBackground\":\"#011627\",\"editorGroupHeader.border\":null,\"editorGroup.border\":\"#011627\",\"editorGroup.dropBackground\":\"#7e57c273\",\"editorGroup.dropIntoPromptForeground\":\"#d6deeb\",\"editorGroup.dropIntoPromptBackground\":\"#021320\",\"editorGroup.dropIntoPromptBorder\":null,\"sideBySideEditor.horizontalBorder\":\"#011627\",\"sideBySideEditor.verticalBorder\":\"#011627\",\"scrollbar.shadow\":\"#010b14\",\"scrollbarSlider.background\":\"#ffffff17\",\"scrollbarSlider.hoverBackground\":\"#ffffff40\",\"scrollbarSlider.activeBackground\":\"#084d8180\",\"panel.background\":\"#011627\",\"panel.border\":\"#5f7e97\",\"panelTitle.activeBorder\":\"#5f7e97\",\"panelTitle.activeForeground\":\"#ffffffcc\",\"panelTitle.inactiveForeground\":\"#d6deeb80\",\"panelSectionHeader.background\":\"#80808051\",\"terminal.background\":\"#011627\",\"widget.shadow\":\"#011627\",\"editorWidget.background\":\"#021320\",\"editorWidget.foreground\":\"#d6deeb\",\"editorWidget.border\":\"#5f7e97\",\"quickInput.background\":\"#021320\",\"quickInput.foreground\":\"#d6deeb\",\"quickInputTitle.background\":\"#ffffff1a\",\"pickerGroup.foreground\":\"#d1aaff\",\"pickerGroup.border\":\"#011627\",\"editor.hoverHighlightBackground\":\"#7e57c25a\",\"editorHoverWidget.background\":\"#011627\",\"editorHoverWidget.foreground\":\"#d6deeb\",\"editorHoverWidget.border\":\"#5f7e97\",\"editorHoverWidget.statusBarBackground\":\"#011a2f\",\"titleBar.activeBackground\":\"var(--sl-color-black)\",\"titleBar.activeForeground\":\"var(--sl-color-text)\",\"titleBar.inactiveBackground\":\"#010e1a\",\"titleBar.inactiveForeground\":\"#eeefff99\",\"titleBar.border\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"toolbar.hoverBackground\":\"#5a5d5e50\",\"toolbar.activeBackground\":\"#63666750\",\"tab.activeBackground\":\"#0b2942\",\"tab.unfocusedActiveBackground\":\"#0b2942\",\"tab.inactiveBackground\":\"#01111d\",\"tab.unfocusedInactiveBackground\":\"#01111d\",\"tab.activeForeground\":\"var(--sl-color-text)\",\"tab.inactiveForeground\":\"#5f7e97\",\"tab.unfocusedActiveForeground\":\"#5f7e97\",\"tab.unfocusedInactiveForeground\":\"#5f7e97\",\"tab.hoverBackground\":null,\"tab.unfocusedHoverBackground\":null,\"tab.hoverForeground\":null,\"tab.unfocusedHoverForeground\":null,\"tab.border\":\"#272b3b\",\"tab.lastPinnedBorder\":\"#585858\",\"tab.activeBorder\":\"transparent\",\"tab.unfocusedActiveBorder\":\"#262a39\",\"tab.activeBorderTop\":\"var(--sl-color-accent-high)\",\"tab.unfocusedActiveBorderTop\":null,\"tab.hoverBorder\":null,\"tab.unfocusedHoverBorder\":null,\"tab.activeModifiedBorder\":\"#3399cc\",\"tab.inactiveModifiedBorder\":\"#3399cc80\",\"tab.unfocusedActiveModifiedBorder\":\"#3399cc80\",\"tab.unfocusedInactiveModifiedBorder\":\"#3399cc40\",\"badge.background\":\"#5f7e97\",\"badge.foreground\":\"#ffffff\",\"button.background\":\"#7e57c2cc\",\"button.foreground\":\"#ffffffcc\",\"button.border\":\"#122d42\",\"button.separator\":\"#ffffff52\",\"button.hoverBackground\":\"#7e57c2\",\"button.secondaryBackground\":\"#3a3d41\",\"button.secondaryForeground\":\"#ffffff\",\"button.secondaryHoverBackground\":\"#46494e\",\"dropdown.background\":\"#011627\",\"dropdown.foreground\":\"#ffffffcc\",\"dropdown.border\":\"#5f7e97\",\"list.activeSelectionBackground\":\"#234d708c\",\"list.activeSelectionForeground\":\"#ffffff\",\"tree.indentGuidesStroke\":\"#585858\",\"input.background\":\"#0b253a\",\"input.foreground\":\"#ffffffcc\",\"input.placeholderForeground\":\"#5f7e97\",\"inputOption.activeBorder\":\"#ffffffcc\",\"inputOption.hoverBackground\":\"#5a5d5e80\",\"inputOption.activeBackground\":\"#122d4266\",\"inputOption.activeForeground\":\"#ffffff\",\"inputValidation.infoBackground\":\"#00589ef2\",\"inputValidation.infoBorder\":\"#64b5f6\",\"inputValidation.warningBackground\":\"#675700f2\",\"inputValidation.warningBorder\":\"#ffca28\",\"inputValidation.errorBackground\":\"#ab0300f2\",\"inputValidation.errorBorder\":\"#ef5350\",\"keybindingLabel.background\":\"#8080802b\",\"keybindingLabel.foreground\":\"#cccccc\",\"keybindingLabel.border\":\"#33333399\",\"keybindingLabel.bottomBorder\":\"#44444499\",\"menu.foreground\":\"#ffffffcc\",\"menu.background\":\"#011627\",\"menu.selectionForeground\":\"#ffffff\",\"menu.selectionBackground\":\"#234d708c\",\"menu.separatorBackground\":\"#606060\",\"editor.snippetTabstopHighlightBackground\":\"#7c7c74c\",\"editor.snippetFinalTabstopHighlightBorder\":\"#525252\",\"terminal.ansiBlack\":\"#011627\",\"terminal.ansiRed\":\"#ef5350\",\"terminal.ansiGreen\":\"#22da6e\",\"terminal.ansiYellow\":\"#c5e478\",\"terminal.ansiBlue\":\"#82aaff\",\"terminal.ansiMagenta\":\"#c792ea\",\"terminal.ansiCyan\":\"#21c7a8\",\"terminal.ansiWhite\":\"#ffffff\",\"terminal.ansiBrightBlack\":\"#575656\",\"terminal.ansiBrightRed\":\"#ef5350\",\"terminal.ansiBrightGreen\":\"#22da6e\",\"terminal.ansiBrightYellow\":\"#ffeb95\",\"terminal.ansiBrightBlue\":\"#82aaff\",\"terminal.ansiBrightMagenta\":\"#c792ea\",\"terminal.ansiBrightCyan\":\"#7fdbca\",\"terminal.ansiBrightWhite\":\"#ffffff\",\"selection.background\":\"#4373c2\",\"input.border\":\"#5f7e97\",\"punctuation.definition.generic.begin.html\":\"#ef5350f2\",\"progress.background\":\"#7e57c2\",\"breadcrumb.foreground\":\"#a599e9\",\"breadcrumb.focusForeground\":\"#ffffff\",\"breadcrumb.activeSelectionForeground\":\"#ffffff\",\"breadcrumbPicker.background\":\"#001122\",\"list.invalidItemForeground\":\"#975f94\",\"list.dropBackground\":\"#011627\",\"list.focusBackground\":\"#010d18\",\"list.focusForeground\":\"#ffffff\",\"list.highlightForeground\":\"#ffffff\",\"list.hoverBackground\":\"#011627\",\"list.hoverForeground\":\"#ffffff\",\"list.inactiveSelectionBackground\":\"#0e293f\",\"list.inactiveSelectionForeground\":\"#5f7e97\",\"activityBar.background\":\"#011627\",\"activityBar.dropBackground\":\"#5f7e97\",\"activityBar.foreground\":\"#5f7e97\",\"activityBar.border\":\"#011627\",\"activityBarBadge.background\":\"#44596b\",\"activityBarBadge.foreground\":\"#ffffff\",\"sideBar.background\":\"#011627\",\"sideBar.foreground\":\"#89a4bb\",\"sideBar.border\":\"#011627\",\"sideBarTitle.foreground\":\"#5f7e97\",\"sideBarSectionHeader.background\":\"#011627\",\"sideBarSectionHeader.foreground\":\"#5f7e97\",\"editorCursor.foreground\":\"#80a4c2\",\"editor.wordHighlightBackground\":\"#f6bbe533\",\"editor.wordHighlightStrongBackground\":\"#e2a2f433\",\"editor.lineHighlightBackground\":\"#0003\",\"editor.rangeHighlightBackground\":\"#7e57c25a\",\"editorIndentGuide.background\":\"#5e81ce52\",\"editorIndentGuide.activeBackground\":\"#7e97ac\",\"editorRuler.foreground\":\"#5e81ce52\",\"editorCodeLens.foreground\":\"#5e82ceb4\",\"editorBracketMatch.background\":\"#5f7e974d\",\"editorOverviewRuler.currentContentForeground\":\"#7e57c2\",\"editorOverviewRuler.incomingContentForeground\":\"#7e57c2\",\"editorOverviewRuler.commonContentForeground\":\"#7e57c2\",\"editorGutter.background\":\"#011627\",\"editorGutter.modifiedBackground\":\"#e2b93d\",\"editorGutter.addedBackground\":\"#9ccc65\",\"editorGutter.deletedBackground\":\"#ef5350\",\"editorSuggestWidget.background\":\"#2c3043\",\"editorSuggestWidget.border\":\"#2b2f40\",\"editorSuggestWidget.foreground\":\"#d6deeb\",\"editorSuggestWidget.highlightForeground\":\"#ffffff\",\"editorSuggestWidget.selectedBackground\":\"#5f7e97\",\"debugExceptionWidget.background\":\"#011627\",\"debugExceptionWidget.border\":\"#5f7e97\",\"editorMarkerNavigation.background\":\"#0b2942\",\"editorMarkerNavigationError.background\":\"#ef5350\",\"editorMarkerNavigationWarning.background\":\"#ffca28\",\"peekView.border\":\"#5f7e97\",\"peekViewEditor.background\":\"#011627\",\"peekViewEditor.matchHighlightBackground\":\"#7e57c25a\",\"peekViewResult.background\":\"#011627\",\"peekViewResult.fileForeground\":\"#5f7e97\",\"peekViewResult.lineForeground\":\"#5f7e97\",\"peekViewResult.matchHighlightBackground\":\"#ffffffcc\",\"peekViewResult.selectionBackground\":\"#2e3250\",\"peekViewResult.selectionForeground\":\"#5f7e97\",\"peekViewTitle.background\":\"#011627\",\"peekViewTitleDescription.foreground\":\"#697098\",\"peekViewTitleLabel.foreground\":\"#5f7e97\",\"merge.currentHeaderBackground\":\"#5f7e97\",\"merge.incomingHeaderBackground\":\"#7e57c25a\",\"statusBar.background\":\"#011627\",\"statusBar.foreground\":\"#5f7e97\",\"statusBar.border\":\"#262a39\",\"statusBar.debuggingBackground\":\"#202431\",\"statusBar.debuggingBorder\":\"#1f2330\",\"statusBar.noFolderBackground\":\"#011627\",\"statusBar.noFolderBorder\":\"#25293a\",\"statusBarItem.activeBackground\":\"#202431\",\"statusBarItem.hoverBackground\":\"#202431\",\"statusBarItem.prominentBackground\":\"#202431\",\"statusBarItem.prominentHoverBackground\":\"#202431\",\"notifications.background\":\"#01111d\",\"notifications.border\":\"#262a39\",\"notificationCenter.border\":\"#262a39\",\"notificationToast.border\":\"#262a39\",\"notifications.foreground\":\"#ffffffcc\",\"notificationLink.foreground\":\"#80cbc4\",\"extensionButton.prominentForeground\":\"#ffffffcc\",\"extensionButton.prominentBackground\":\"#7e57c2cc\",\"extensionButton.prominentHoverBackground\":\"#7e57c2\",\"terminal.selectionBackground\":\"#1b90dd4d\",\"terminalCursor.background\":\"#234d70\",\"debugToolBar.background\":\"#011627\",\"welcomePage.buttonBackground\":\"#011627\",\"welcomePage.buttonHoverBackground\":\"#011627\",\"walkThrough.embeddedEditorBackground\":\"#011627\",\"gitDecoration.modifiedResourceForeground\":\"#a2bffc\",\"gitDecoration.deletedResourceForeground\":\"#ef535090\",\"gitDecoration.untrackedResourceForeground\":\"#c5e478ff\",\"gitDecoration.ignoredResourceForeground\":\"#395a75\",\"gitDecoration.conflictingResourceForeground\":\"#ffeb95cc\",\"source.elm\":\"#5f7e97\",\"string.quoted.single.js\":\"#ffffff\",\"meta.objectliteral.js\":\"#82aaff\"},\"fg\":\"#d6deeb\",\"bg\":\"#23262f\",\"semanticHighlighting\":false,\"settings\":[{\"name\":\"Changed\",\"scope\":[\"markup.changed\",\"meta.diff.header.git\",\"meta.diff.header.from-file\",\"meta.diff.header.to-file\"],\"settings\":{\"foreground\":\"#a2bffc\"}},{\"name\":\"Deleted\",\"scope\":[\"markup.deleted.diff\"],\"settings\":{\"foreground\":\"#f27775fe\"}},{\"name\":\"Inserted\",\"scope\":[\"markup.inserted.diff\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Global settings\",\"settings\":{\"background\":\"#011627\",\"foreground\":\"#d6deeb\"}},{\"name\":\"Comment\",\"scope\":[\"comment\"],\"settings\":{\"foreground\":\"#919f9f\",\"fontStyle\":\"\"}},{\"name\":\"String\",\"scope\":[\"string\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"String Quoted\",\"scope\":[\"string.quoted\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"Support Constant Math\",\"scope\":[\"support.constant.math\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Number\",\"scope\":[\"constant.numeric\",\"constant.character.numeric\"],\"settings\":{\"foreground\":\"#f78c6c\",\"fontStyle\":\"\"}},{\"name\":\"Built-in constant\",\"scope\":[\"constant.language\",\"punctuation.definition.constant\",\"variable.other.constant\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"User-defined constant\",\"scope\":[\"constant.character\",\"constant.other\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Constant Character Escape\",\"scope\":[\"constant.character.escape\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"RegExp String\",\"scope\":[\"string.regexp\",\"string.regexp keyword.other\"],\"settings\":{\"foreground\":\"#5ca7e4\"}},{\"name\":\"Comma in functions\",\"scope\":[\"meta.function punctuation.separator.comma\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"Variable\",\"scope\":[\"variable\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Keyword\",\"scope\":[\"punctuation.accessor\",\"keyword\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Storage\",\"scope\":[\"storage\",\"meta.var.expr\",\"meta.class meta.method.declaration meta.var.expr storage.type.js\",\"storage.type.property.js\",\"storage.type.property.ts\",\"storage.type.property.tsx\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type.function.arrow.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Class name\",\"scope\":[\"entity.name.class\",\"meta.class entity.name.type.class\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Inherited class\",\"scope\":[\"entity.other.inherited-class\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Function name\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Meta Tag\",\"scope\":[\"punctuation.definition.tag\",\"meta.tag\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"HTML Tag names\",\"scope\":[\"entity.name.tag\",\"meta.tag.other.html\",\"meta.tag.other.js\",\"meta.tag.other.tsx\",\"entity.name.tag.tsx\",\"entity.name.tag.js\",\"entity.name.tag\",\"meta.tag.js\",\"meta.tag.tsx\",\"meta.tag.html\"],\"settings\":{\"foreground\":\"#caece6\",\"fontStyle\":\"\"}},{\"name\":\"Tag attribute\",\"scope\":[\"entity.other.attribute-name\"],\"settings\":{\"fontStyle\":\"\",\"foreground\":\"#c5e478\"}},{\"name\":\"Entity Name Tag Custom\",\"scope\":[\"entity.name.tag.custom\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Library (function & constant)\",\"scope\":[\"support.function\",\"support.constant\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Support Constant Property Value meta\",\"scope\":[\"support.constant.meta.property-value\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Library class/type\",\"scope\":[\"support.type\",\"support.class\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Support Variable DOM\",\"scope\":[\"support.variable.dom\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Invalid\",\"scope\":[\"invalid\"],\"settings\":{\"background\":\"#ff2c83\",\"foreground\":\"#ffffff\"}},{\"name\":\"Invalid deprecated\",\"scope\":[\"invalid.deprecated\"],\"settings\":{\"foreground\":\"#ffffff\",\"background\":\"#d3423e\"}},{\"name\":\"Keyword Operator\",\"scope\":[\"keyword.operator\"],\"settings\":{\"foreground\":\"#7fdbca\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Relational\",\"scope\":[\"keyword.operator.relational\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Assignment\",\"scope\":[\"keyword.operator.assignment\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Arithmetic\",\"scope\":[\"keyword.operator.arithmetic\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Bitwise\",\"scope\":[\"keyword.operator.bitwise\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Increment\",\"scope\":[\"keyword.operator.increment\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Ternary\",\"scope\":[\"keyword.operator.ternary\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Double-Slashed Comment\",\"scope\":[\"comment.line.double-slash\"],\"settings\":{\"foreground\":\"#919f9f\"}},{\"name\":\"Object\",\"scope\":[\"object\"],\"settings\":{\"foreground\":\"#cdebf7\"}},{\"name\":\"Null\",\"scope\":[\"constant.language.null\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Meta Brace\",\"scope\":[\"meta.brace\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Meta Delimiter Period\",\"scope\":[\"meta.delimiter.period\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Punctuation Definition String\",\"scope\":[\"punctuation.definition.string\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Punctuation Definition String Markdown\",\"scope\":[\"punctuation.definition.string.begin.markdown\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Boolean\",\"scope\":[\"constant.language.boolean\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Object Comma\",\"scope\":[\"object.comma\"],\"settings\":{\"foreground\":\"#ffffff\"}},{\"name\":\"Variable Parameter Function\",\"scope\":[\"variable.parameter.function\"],\"settings\":{\"foreground\":\"#7fdbca\",\"fontStyle\":\"\"}},{\"name\":\"Support Type Property Name & entity name tags\",\"scope\":[\"support.type.vendor.property-name\",\"support.constant.vendor.property-value\",\"support.type.property-name\",\"meta.property-list entity.name.tag\"],\"settings\":{\"foreground\":\"#80cbc4\",\"fontStyle\":\"\"}},{\"name\":\"Entity Name tag reference in stylesheets\",\"scope\":[\"meta.property-list entity.name.tag.reference\"],\"settings\":{\"foreground\":\"#57eaf1\"}},{\"name\":\"Constant Other Color RGB Value Punctuation Definition Constant\",\"scope\":[\"constant.other.color.rgb-value punctuation.definition.constant\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Constant Other Color\",\"scope\":[\"constant.other.color\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Keyword Other Unit\",\"scope\":[\"keyword.other.unit\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Meta Selector\",\"scope\":[\"meta.selector\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Entity Other Attribute Name Id\",\"scope\":[\"entity.other.attribute-name.id\"],\"settings\":{\"foreground\":\"#fad430\"}},{\"name\":\"Meta Property Name\",\"scope\":[\"meta.property-name\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Doctypes\",\"scope\":[\"entity.name.tag.doctype\",\"meta.tag.sgml.doctype\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Punctuation Definition Parameters\",\"scope\":[\"punctuation.definition.parameters\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Keyword Control Operator\",\"scope\":[\"keyword.control.operator\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Keyword Operator Logical\",\"scope\":[\"keyword.operator.logical\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Variable Instances\",\"scope\":[\"variable.instance\",\"variable.other.instance\",\"variable.readwrite.instance\",\"variable.other.readwrite.instance\",\"variable.other.property\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Variable Property Other object property\",\"scope\":[\"variable.other.object.property\"],\"settings\":{\"foreground\":\"#faf39f\",\"fontStyle\":\"\"}},{\"name\":\"Variable Property Other object\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Entity Name Function\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#82aaff\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Comparison, returns, imports, and Keyword Operator Ruby\",\"scope\":[\"keyword.control.conditional.js\",\"keyword.operator.comparison\",\"keyword.control.flow.js\",\"keyword.control.flow.ts\",\"keyword.control.flow.tsx\",\"keyword.control.ruby\",\"keyword.control.def.ruby\",\"keyword.control.loop.js\",\"keyword.control.loop.ts\",\"keyword.control.import.js\",\"keyword.control.import.ts\",\"keyword.control.import.tsx\",\"keyword.control.from.js\",\"keyword.control.from.ts\",\"keyword.control.from.tsx\",\"keyword.control.conditional.js\",\"keyword.control.conditional.ts\",\"keyword.control.switch.js\",\"keyword.control.switch.ts\",\"keyword.operator.instanceof.js\",\"keyword.operator.expression.instanceof.ts\",\"keyword.operator.expression.instanceof.tsx\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Support Constant, `new` keyword, Special Method Keyword, `debugger`, other keywords\",\"scope\":[\"support.constant\",\"keyword.other.special-method\",\"keyword.other.new\",\"keyword.other.debugger\",\"keyword.control\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Support Function\",\"scope\":[\"support.function\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Invalid Broken\",\"scope\":[\"invalid.broken\"],\"settings\":{\"foreground\":\"#989da0\",\"background\":\"#F78C6C\"}},{\"name\":\"Invalid Unimplemented\",\"scope\":[\"invalid.unimplemented\"],\"settings\":{\"background\":\"#8BD649\",\"foreground\":\"#ffffff\"}},{\"name\":\"Invalid Illegal\",\"scope\":[\"invalid.illegal\"],\"settings\":{\"foreground\":\"#ffffff\",\"background\":\"#ec5f67\"}},{\"name\":\"Language Variable\",\"scope\":[\"variable.language\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Support Variable Property\",\"scope\":[\"support.variable.property\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Variable Function\",\"scope\":[\"variable.function\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Variable Interpolation\",\"scope\":[\"variable.interpolation\"],\"settings\":{\"foreground\":\"#ef787f\"}},{\"name\":\"Meta Function Call\",\"scope\":[\"meta.function-call\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Punctuation Section Embedded\",\"scope\":[\"punctuation.section.embedded\"],\"settings\":{\"foreground\":\"#e2817f\"}},{\"name\":\"Punctuation Tweaks\",\"scope\":[\"punctuation.terminator.expression\",\"punctuation.definition.arguments\",\"punctuation.definition.array\",\"punctuation.section.array\",\"meta.array\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"More Punctuation Tweaks\",\"scope\":[\"punctuation.definition.list.begin\",\"punctuation.definition.list.end\",\"punctuation.separator.arguments\",\"punctuation.definition.list\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Template Strings\",\"scope\":[\"string.template meta.template.expression\"],\"settings\":{\"foreground\":\"#e2817f\"}},{\"name\":\"Backticks(``) in Template Strings\",\"scope\":[\"string.template punctuation.definition.string\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Italics\",\"scope\":[\"italic\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"italic\"}},{\"name\":\"Bold\",\"scope\":[\"bold\"],\"settings\":{\"foreground\":\"#c5e478\",\"fontStyle\":\"bold\"}},{\"name\":\"Quote\",\"scope\":[\"quote\"],\"settings\":{\"foreground\":\"#969bb7\",\"fontStyle\":\"\"}},{\"name\":\"Raw Code\",\"scope\":[\"raw\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"CoffeeScript Variable Assignment\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#31e1eb\"}},{\"name\":\"CoffeeScript Parameter Function\",\"scope\":[\"variable.parameter.function.coffee\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"CoffeeScript Assignments\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"C# Readwrite Variables\",\"scope\":[\"variable.other.readwrite.cs\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C# Classes & Storage types\",\"scope\":[\"entity.name.type.class.cs\",\"storage.type.cs\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"C# Namespaces\",\"scope\":[\"entity.name.type.namespace.cs\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"C# Unquoted String Zone\",\"scope\":[\"string.unquoted.preprocessor.message.cs\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C# Region\",\"scope\":[\"punctuation.separator.hash.cs\",\"keyword.preprocessor.region.cs\",\"keyword.preprocessor.endregion.cs\"],\"settings\":{\"foreground\":\"#ffcb8b\",\"fontStyle\":\"bold\"}},{\"name\":\"C# Other Variables\",\"scope\":[\"variable.other.object.cs\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"C# Enum\",\"scope\":[\"entity.name.type.enum.cs\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Dart String\",\"scope\":[\"string.interpolated.single.dart\",\"string.interpolated.double.dart\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Dart Class\",\"scope\":[\"support.class.dart\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Tag names in Stylesheets\",\"scope\":[\"entity.name.tag.css\",\"entity.name.tag.less\",\"entity.name.tag.custom.css\",\"support.constant.property-value.css\"],\"settings\":{\"foreground\":\"#ff6d6d\",\"fontStyle\":\"\"}},{\"name\":\"Wildcard(*) selector in Stylesheets\",\"scope\":[\"entity.name.tag.wildcard.css\",\"entity.name.tag.wildcard.less\",\"entity.name.tag.wildcard.scss\",\"entity.name.tag.wildcard.sass\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"CSS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Attribute Name for CSS\",\"scope\":[\"meta.attribute-selector.css entity.other.attribute-name.attribute\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Elixir Classes\",\"scope\":[\"source.elixir support.type.elixir\",\"source.elixir meta.module.elixir entity.name.class.elixir\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Elixir Functions\",\"scope\":[\"source.elixir entity.name.function\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir Constants\",\"scope\":[\"source.elixir constant.other.symbol.elixir\",\"source.elixir constant.other.keywords.elixir\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Elixir String Punctuations\",\"scope\":[\"source.elixir punctuation.definition.string\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir\",\"scope\":[\"source.elixir variable.other.readwrite.module.elixir\",\"source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir Binary Punctuations\",\"scope\":[\"source.elixir .punctuation.binary.elixir\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Closure Constant Keyword\",\"scope\":[\"constant.keyword.clojure\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Go Function Calls\",\"scope\":[\"source.go meta.function-call.go\"],\"settings\":{\"foreground\":\"#dddddd\"}},{\"name\":\"Go Keywords\",\"scope\":[\"source.go keyword.package.go\",\"source.go keyword.import.go\",\"source.go keyword.function.go\",\"source.go keyword.type.go\",\"source.go keyword.struct.go\",\"source.go keyword.interface.go\",\"source.go keyword.const.go\",\"source.go keyword.var.go\",\"source.go keyword.map.go\",\"source.go keyword.channel.go\",\"source.go keyword.control.go\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Go Constants e.g. nil, string format (%s, %d, etc.)\",\"scope\":[\"source.go constant.language.go\",\"source.go constant.other.placeholder.go\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"C++ Functions\",\"scope\":[\"entity.name.function.preprocessor.cpp\",\"entity.scope.name.cpp\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"C++ Meta Namespace\",\"scope\":[\"meta.namespace-block.cpp\"],\"settings\":{\"foreground\":\"#e0dec6\"}},{\"name\":\"C++ Language Primitive Storage\",\"scope\":[\"storage.type.language.primitive.cpp\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"C++ Preprocessor Macro\",\"scope\":[\"meta.preprocessor.macro.cpp\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C++ Variable Parameter\",\"scope\":[\"variable.parameter\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Powershell Variables\",\"scope\":[\"variable.other.readwrite.powershell\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Powershell Function\",\"scope\":[\"support.function.powershell\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"ID Attribute Name in HTML\",\"scope\":[\"entity.other.attribute-name.id.html\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"HTML Punctuation Definition Tag\",\"scope\":[\"punctuation.definition.tag.html\"],\"settings\":{\"foreground\":\"#6ae9f0\"}},{\"name\":\"HTML Doctype\",\"scope\":[\"meta.tag.sgml.doctype.html\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Classes\",\"scope\":[\"meta.class entity.name.type.class.js\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"JavaScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.js\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"JavaScript Terminator\",\"scope\":[\"terminator.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Meta Punctuation Definition\",\"scope\":[\"meta.js punctuation.definition.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Entity Names in Code Documentations\",\"scope\":[\"entity.name.type.instance.jsdoc\",\"entity.name.type.instance.phpdoc\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"Other Variables in Code Documentations\",\"scope\":[\"variable.other.jsdoc\",\"variable.other.phpdoc\"],\"settings\":{\"foreground\":\"#78ccf0\"}},{\"name\":\"JavaScript module imports and exports\",\"scope\":[\"variable.other.meta.import.js\",\"meta.import.js variable.other\",\"variable.other.meta.export.js\",\"meta.export.js variable.other\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Variable Parameter Function\",\"scope\":[\"variable.parameter.function.js\"],\"settings\":{\"foreground\":\"#8b96ea\"}},{\"name\":\"JavaScript[React] Variable Other Object\",\"scope\":[\"variable.other.object.js\",\"variable.other.object.jsx\",\"variable.object.property.js\",\"variable.object.property.jsx\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Variables\",\"scope\":[\"variable.js\",\"variable.other.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Entity Name Type\",\"scope\":[\"entity.name.type.js\",\"entity.name.type.module.js\"],\"settings\":{\"foreground\":\"#ffcb8b\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Support Classes\",\"scope\":[\"support.class.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JSON Property Names\",\"scope\":[\"support.type.property-name.json\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"JSON Support Constants\",\"scope\":[\"support.constant.json\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"JSON Property values (string)\",\"scope\":[\"meta.structure.dictionary.value.json string.quoted.double\"],\"settings\":{\"foreground\":\"#c789d6\"}},{\"name\":\"Strings in JSON values\",\"scope\":[\"string.quoted.double.json punctuation.definition.string.json\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Specific JSON Property values like null\",\"scope\":[\"meta.structure.dictionary.json meta.structure.dictionary.value constant.language\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"JavaScript Other Variable\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Ruby Variables\",\"scope\":[\"variable.other.ruby\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Ruby Class\",\"scope\":[\"entity.name.type.class.ruby\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"Ruby Hashkeys\",\"scope\":[\"constant.language.symbol.hashkey.ruby\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"LESS Tag names\",\"scope\":[\"entity.name.tag.less\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"LESS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Attribute Name for LESS\",\"scope\":[\"meta.attribute-selector.less entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Markdown Headings\",\"scope\":[\"markup.heading.markdown\",\"markup.heading.setext.1.markdown\",\"markup.heading.setext.2.markdown\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown Italics\",\"scope\":[\"markup.italic.markdown\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"italic\"}},{\"name\":\"Markdown Bold\",\"scope\":[\"markup.bold.markdown\"],\"settings\":{\"foreground\":\"#c5e478\",\"fontStyle\":\"bold\"}},{\"name\":\"Markdown Quote + others\",\"scope\":[\"markup.quote.markdown\"],\"settings\":{\"foreground\":\"#969bb7\",\"fontStyle\":\"\"}},{\"name\":\"Markdown Raw Code + others\",\"scope\":[\"markup.inline.raw.markdown\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Markdown Links\",\"scope\":[\"markup.underline.link.markdown\",\"markup.underline.link.image.markdown\"],\"settings\":{\"foreground\":\"#ff869a\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Link Title and Description\",\"scope\":[\"string.other.link.title.markdown\",\"string.other.link.description.markdown\"],\"settings\":{\"foreground\":\"#d6deeb\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Punctuation\",\"scope\":[\"punctuation.definition.string.markdown\",\"punctuation.definition.string.begin.markdown\",\"punctuation.definition.string.end.markdown\",\"meta.link.inline.markdown punctuation.definition.string\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown MetaData Punctuation\",\"scope\":[\"punctuation.definition.metadata.markdown\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Markdown List Punctuation\",\"scope\":[\"beginning.punctuation.definition.list.markdown\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown Inline Raw String\",\"scope\":[\"markup.inline.raw.string.markdown\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"PHP Variables\",\"scope\":[\"variable.other.php\"],\"settings\":{\"foreground\":\"#bec5d4\"}},{\"name\":\"Support Classes in PHP\",\"scope\":[\"support.class.php\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Punctuations in PHP function calls\",\"scope\":[\"meta.function-call.php punctuation\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"PHP Global Variables\",\"scope\":[\"variable.other.global.php\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Declaration Punctuation in PHP Global Variables\",\"scope\":[\"variable.other.global.php punctuation.definition.variable\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Language Constants in Python\",\"scope\":[\"constant.language.python\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Python Function Parameter and Arguments\",\"scope\":[\"variable.parameter.function.python\",\"meta.function-call.arguments.python\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Python Function Call\",\"scope\":[\"meta.function-call.python\",\"meta.function-call.generic.python\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"Punctuations in Python\",\"scope\":[\"punctuation.python\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Decorator Functions in Python\",\"scope\":[\"entity.name.function.decorator.python\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Python Language Variable\",\"scope\":[\"source.python variable.language.special\"],\"settings\":{\"foreground\":\"#8eace3\"}},{\"name\":\"Python import control keyword\",\"scope\":[\"keyword.control\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"SCSS Variable\",\"scope\":[\"variable.scss\",\"variable.sass\",\"variable.parameter.url.scss\",\"variable.parameter.url.sass\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#bec5d4\"}},{\"name\":\"Attribute Name for SASS\",\"scope\":[\"meta.attribute-selector.scss entity.other.attribute-name.attribute\",\"meta.attribute-selector.sass entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Tag names in SASS\",\"scope\":[\"entity.name.tag.scss\",\"entity.name.tag.sass\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"SASS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.scss\",\"keyword.other.unit.sass\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"TypeScript[React] Variables and Object Properties\",\"scope\":[\"variable.other.readwrite.alias.ts\",\"variable.other.readwrite.alias.tsx\",\"variable.other.readwrite.ts\",\"variable.other.readwrite.tsx\",\"variable.other.object.ts\",\"variable.other.object.tsx\",\"variable.object.property.ts\",\"variable.object.property.tsx\",\"variable.other.ts\",\"variable.other.tsx\",\"variable.tsx\",\"variable.ts\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript[React] Entity Name Types\",\"scope\":[\"entity.name.type.ts\",\"entity.name.type.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript[React] Node Classes\",\"scope\":[\"support.class.node.ts\",\"support.class.node.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"TypeScript[React] Entity Name Types as Parameters\",\"scope\":[\"meta.type.parameters.ts entity.name.type\",\"meta.type.parameters.tsx entity.name.type\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"TypeScript[React] Import/Export Punctuations\",\"scope\":[\"meta.import.ts punctuation.definition.block\",\"meta.import.tsx punctuation.definition.block\",\"meta.export.ts punctuation.definition.block\",\"meta.export.tsx punctuation.definition.block\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.decorator punctuation.decorator.ts\",\"meta.decorator punctuation.decorator.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.tag.js meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"YAML Entity Name Tags\",\"scope\":[\"entity.name.tag.yaml\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"JavaScript Variable Other ReadWrite\",\"scope\":[\"variable.other.readwrite.js\",\"variable.parameter\"],\"settings\":{\"foreground\":\"#d7dbe0\"}},{\"name\":\"Support Class Component\",\"scope\":[\"support.class.component.js\",\"support.class.component.tsx\"],\"settings\":{\"foreground\":\"#f78c6c\",\"fontStyle\":\"\"}},{\"name\":\"Text nested in React tags\",\"scope\":[\"meta.jsx.children\",\"meta.jsx.children.js\",\"meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript Classes\",\"scope\":[\"meta.class entity.name.type.class.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript Entity Name Type\",\"scope\":[\"entity.name.type.tsx\",\"entity.name.type.module.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript Class Variable Keyword\",\"scope\":[\"meta.class.ts meta.var.expr.ts storage.type.ts\",\"meta.class.tsx meta.var.expr.tsx storage.type.tsx\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"TypeScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.ts\",\"meta.method.declaration storage.type.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"normalize font style of certain components\",\"scope\":[\"meta.property-list.css meta.property-value.css variable.other.less\",\"meta.property-list.scss variable.scss\",\"meta.property-list.sass variable.sass\",\"meta.brace\",\"keyword.operator.operator\",\"keyword.operator.or.regexp\",\"keyword.operator.expression.in\",\"keyword.operator.relational\",\"keyword.operator.assignment\",\"keyword.operator.comparison\",\"keyword.operator.type\",\"keyword.operator\",\"keyword\",\"punctuation.definition.string\",\"punctuation\",\"variable.other.readwrite.js\",\"storage.type\",\"source.css\",\"string.quoted\"],\"settings\":{\"fontStyle\":\"\"}}],\"styleOverrides\":{\"frames\":{\"editorBackground\":\"var(--sl-color-gray-6)\",\"terminalBackground\":\"var(--sl-color-gray-6)\",\"editorActiveTabBackground\":\"var(--sl-color-gray-6)\",\"terminalTitlebarDotsForeground\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"terminalTitlebarDotsOpacity\":\"0.75\",\"inlineButtonForeground\":\"var(--sl-color-text)\",\"frameBoxShadowCssValue\":\"none\"},\"textMarkers\":{\"markBackground\":\"#ffffff17\",\"markBorderColor\":\"#ffffff40\"}}},{\"name\":\"Night Owl Light\",\"type\":\"light\",\"colors\":{\"focusBorder\":\"#93a1a1\",\"foreground\":\"#403f53\",\"disabledForeground\":\"#61616180\",\"descriptionForeground\":\"#403f53\",\"errorForeground\":\"#403f53\",\"icon.foreground\":\"#424242\",\"contrastActiveBorder\":null,\"contrastBorder\":null,\"textBlockQuote.background\":\"#7f7f7f1a\",\"textBlockQuote.border\":\"#007acc80\",\"textCodeBlock.background\":\"#dcdcdc66\",\"textLink.activeForeground\":\"#006ab1\",\"textLink.foreground\":\"#006ab1\",\"textPreformat.foreground\":\"#a31515\",\"textSeparator.foreground\":\"#0000002e\",\"editor.background\":\"#f6f7f9\",\"editor.foreground\":\"#403f53\",\"editorLineNumber.foreground\":\"#90a7b2\",\"editorLineNumber.activeForeground\":\"#403f53\",\"editorActiveLineNumber.foreground\":\"#0b216f\",\"editor.selectionBackground\":\"#e0e0e0\",\"editor.inactiveSelectionBackground\":\"#e0e0e080\",\"editor.selectionHighlightBackground\":\"#339cec33\",\"editorError.foreground\":\"#e64d49\",\"editorWarning.foreground\":\"#daaa01\",\"editorInfo.foreground\":\"#1a85ff\",\"editorHint.foreground\":\"#6c6c6c\",\"problemsErrorIcon.foreground\":\"#e64d49\",\"problemsWarningIcon.foreground\":\"#daaa01\",\"problemsInfoIcon.foreground\":\"#1a85ff\",\"editor.findMatchBackground\":\"#93a1a16c\",\"editor.findMatchHighlightBackground\":\"#93a1a16c\",\"editor.findRangeHighlightBackground\":\"#7497a633\",\"editorLink.activeForeground\":\"#0000ff\",\"editorLightBulb.foreground\":\"#ddb100\",\"editorLightBulbAutoFix.foreground\":\"#007acc\",\"diffEditor.insertedTextBackground\":\"#9ccc2c40\",\"diffEditor.insertedTextBorder\":null,\"diffEditor.removedTextBackground\":\"#ff000033\",\"diffEditor.removedTextBorder\":null,\"diffEditor.insertedLineBackground\":\"#9bb95533\",\"diffEditor.removedLineBackground\":\"#ff000033\",\"editorStickyScroll.background\":\"#fbfbfb\",\"editorStickyScrollHover.background\":\"#f0f0f0\",\"editorInlayHint.background\":\"#2aa29899\",\"editorInlayHint.foreground\":\"#f0f0f0\",\"editorInlayHint.typeBackground\":\"#2aa29899\",\"editorInlayHint.typeForeground\":\"#f0f0f0\",\"editorInlayHint.parameterBackground\":\"#2aa29899\",\"editorInlayHint.parameterForeground\":\"#f0f0f0\",\"editorPane.background\":\"#fbfbfb\",\"editorGroup.emptyBackground\":null,\"editorGroup.focusedEmptyBorder\":null,\"editorGroupHeader.tabsBackground\":\"var(--sl-color-gray-6)\",\"editorGroupHeader.tabsBorder\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"editorGroupHeader.noTabsBackground\":\"#f0f0f0\",\"editorGroupHeader.border\":null,\"editorGroup.border\":\"#f0f0f0\",\"editorGroup.dropBackground\":\"#2677cb2d\",\"editorGroup.dropIntoPromptForeground\":\"#403f53\",\"editorGroup.dropIntoPromptBackground\":\"#f0f0f0\",\"editorGroup.dropIntoPromptBorder\":null,\"sideBySideEditor.horizontalBorder\":\"#f0f0f0\",\"sideBySideEditor.verticalBorder\":\"#f0f0f0\",\"scrollbar.shadow\":\"#cccccc\",\"scrollbarSlider.background\":\"#0000001a\",\"scrollbarSlider.hoverBackground\":\"#00000055\",\"scrollbarSlider.activeBackground\":\"#00000099\",\"panel.background\":\"#f0f0f0\",\"panel.border\":\"#d9d9d9\",\"panelTitle.activeBorder\":\"#424242\",\"panelTitle.activeForeground\":\"#424242\",\"panelTitle.inactiveForeground\":\"#424242bf\",\"panelSectionHeader.background\":\"#80808051\",\"terminal.background\":\"#f6f6f6\",\"widget.shadow\":\"#d9d9d9\",\"editorWidget.background\":\"#f0f0f0\",\"editorWidget.foreground\":\"#403f53\",\"editorWidget.border\":\"#d9d9d9\",\"quickInput.background\":\"#f0f0f0\",\"quickInput.foreground\":\"#403f53\",\"quickInputTitle.background\":\"#0000000f\",\"pickerGroup.foreground\":\"#403f53\",\"pickerGroup.border\":\"#d9d9d9\",\"editor.hoverHighlightBackground\":\"#339cec33\",\"editorHoverWidget.background\":\"#f0f0f0\",\"editorHoverWidget.foreground\":\"#403f53\",\"editorHoverWidget.border\":\"#d9d9d9\",\"editorHoverWidget.statusBarBackground\":\"#e4e4e4\",\"titleBar.activeBackground\":\"var(--sl-color-gray-6)\",\"titleBar.activeForeground\":\"var(--sl-color-text)\",\"titleBar.inactiveBackground\":\"#f0f0f099\",\"titleBar.inactiveForeground\":\"#33333399\",\"titleBar.border\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"toolbar.hoverBackground\":\"#b8b8b850\",\"toolbar.activeBackground\":\"#a6a6a650\",\"tab.activeBackground\":\"#f6f6f6\",\"tab.unfocusedActiveBackground\":\"#f6f6f6\",\"tab.inactiveBackground\":\"#f0f0f0\",\"tab.unfocusedInactiveBackground\":\"#f0f0f0\",\"tab.activeForeground\":\"var(--sl-color-text)\",\"tab.inactiveForeground\":\"#403f53\",\"tab.unfocusedActiveForeground\":\"#403f53b3\",\"tab.unfocusedInactiveForeground\":\"#403f5380\",\"tab.hoverBackground\":null,\"tab.unfocusedHoverBackground\":null,\"tab.hoverForeground\":null,\"tab.unfocusedHoverForeground\":null,\"tab.border\":\"#f0f0f0\",\"tab.lastPinnedBorder\":\"#a9a9a9\",\"tab.activeBorder\":\"transparent\",\"tab.unfocusedActiveBorder\":null,\"tab.activeBorderTop\":\"var(--sl-color-accent)\",\"tab.unfocusedActiveBorderTop\":null,\"tab.hoverBorder\":null,\"tab.unfocusedHoverBorder\":null,\"tab.activeModifiedBorder\":\"#2aa298\",\"tab.inactiveModifiedBorder\":\"#93a1a1\",\"tab.unfocusedActiveModifiedBorder\":\"#93a1a1\",\"tab.unfocusedInactiveModifiedBorder\":\"#93a1a1\",\"badge.background\":\"#2aa298\",\"badge.foreground\":\"#f0f0f0\",\"button.background\":\"#2aa298\",\"button.foreground\":\"#f0f0f0\",\"button.border\":null,\"button.separator\":\"#f0f0f066\",\"button.hoverBackground\":\"#22827a\",\"button.secondaryBackground\":\"#5f6a79\",\"button.secondaryForeground\":\"#ffffff\",\"button.secondaryHoverBackground\":\"#4c5561\",\"dropdown.background\":\"#f0f0f0\",\"dropdown.foreground\":\"#403f53\",\"dropdown.border\":\"#d9d9d9\",\"list.activeSelectionBackground\":\"#d3e8f8\",\"list.activeSelectionForeground\":\"#403f53\",\"tree.indentGuidesStroke\":\"#a9a9a9\",\"input.background\":\"#f0f0f0\",\"input.foreground\":\"#403f53\",\"input.placeholderForeground\":\"#93a1a1\",\"inputOption.activeBorder\":\"#2aa298\",\"inputOption.hoverBackground\":\"#b8b8b850\",\"inputOption.activeBackground\":\"#93a1a133\",\"inputOption.activeForeground\":\"#000000\",\"inputValidation.infoBackground\":\"#f0f0f0\",\"inputValidation.infoBorder\":\"#d0d0d0\",\"inputValidation.warningBackground\":\"#daaa01\",\"inputValidation.warningBorder\":\"#e0af02\",\"inputValidation.errorBackground\":\"#f76e6e\",\"inputValidation.errorBorder\":\"#de3d3b\",\"keybindingLabel.background\":\"#dddddd66\",\"keybindingLabel.foreground\":\"#555555\",\"keybindingLabel.border\":\"#cccccc66\",\"keybindingLabel.bottomBorder\":\"#bbbbbb66\",\"menu.foreground\":\"#403f53\",\"menu.background\":\"#f0f0f0\",\"menu.selectionForeground\":\"#403f53\",\"menu.selectionBackground\":\"#d3e8f8\",\"menu.separatorBackground\":\"#d4d4d4\",\"editor.snippetTabstopHighlightBackground\":\"#0a326433\",\"editor.snippetFinalTabstopHighlightBorder\":\"#0a326480\",\"terminal.ansiBlack\":\"#403f53\",\"terminal.ansiRed\":\"#de3d3b\",\"terminal.ansiGreen\":\"#08916a\",\"terminal.ansiYellow\":\"#e0af02\",\"terminal.ansiBlue\":\"#288ed7\",\"terminal.ansiMagenta\":\"#d6438a\",\"terminal.ansiCyan\":\"#2aa298\",\"terminal.ansiWhite\":\"#f0f0f0\",\"terminal.ansiBrightBlack\":\"#403f53\",\"terminal.ansiBrightRed\":\"#de3d3b\",\"terminal.ansiBrightGreen\":\"#08916a\",\"terminal.ansiBrightYellow\":\"#daaa01\",\"terminal.ansiBrightBlue\":\"#288ed7\",\"terminal.ansiBrightMagenta\":\"#d6438a\",\"terminal.ansiBrightCyan\":\"#2aa298\",\"terminal.ansiBrightWhite\":\"#f0f0f0\",\"selection.background\":\"#7a8181ad\",\"notifications.background\":\"#f0f0f0\",\"notifications.foreground\":\"#403f53\",\"notificationLink.foreground\":\"#994cc3\",\"notifications.border\":\"#cccccc\",\"notificationCenter.border\":\"#cccccc\",\"notificationToast.border\":\"#cccccc\",\"notificationCenterHeader.foreground\":\"#403f53\",\"notificationCenterHeader.background\":\"#f0f0f0\",\"input.border\":\"#d9d9d9\",\"progressBar.background\":\"#2aa298\",\"list.inactiveSelectionBackground\":\"#e0e7ea\",\"list.inactiveSelectionForeground\":\"#403f53\",\"list.focusBackground\":\"#d3e8f8\",\"list.hoverBackground\":\"#d3e8f8\",\"list.focusForeground\":\"#403f53\",\"list.hoverForeground\":\"#403f53\",\"list.highlightForeground\":\"#403f53\",\"list.errorForeground\":\"#e64d49\",\"list.warningForeground\":\"#daaa01\",\"activityBar.background\":\"#f0f0f0\",\"activityBar.foreground\":\"#403f53\",\"activityBar.dropBackground\":\"#d0d0d0\",\"activityBarBadge.background\":\"#403f53\",\"activityBarBadge.foreground\":\"#f0f0f0\",\"activityBar.border\":\"#f0f0f0\",\"sideBar.background\":\"#f0f0f0\",\"sideBar.foreground\":\"#403f53\",\"sideBarTitle.foreground\":\"#403f53\",\"sideBar.border\":\"#f0f0f0\",\"editorGroup.background\":\"#f6f6f6\",\"editorCursor.foreground\":\"#90a7b2\",\"editor.wordHighlightBackground\":\"#339cec33\",\"editor.wordHighlightStrongBackground\":\"#007dd659\",\"editor.lineHighlightBackground\":\"#f0f0f0\",\"editor.rangeHighlightBackground\":\"#7497a633\",\"editorWhitespace.foreground\":\"#d9d9d9\",\"editorIndentGuide.background\":\"#d9d9d9\",\"editorCodeLens.foreground\":\"#403f53\",\"editorBracketMatch.background\":\"#d3e8f8\",\"editorBracketMatch.border\":\"#2aa298\",\"editorError.border\":\"#fbfbfb\",\"editorWarning.border\":\"#daaa01\",\"editorGutter.addedBackground\":\"#49d0c5\",\"editorGutter.modifiedBackground\":\"#6fbef6\",\"editorGutter.deletedBackground\":\"#f76e6e\",\"editorRuler.foreground\":\"#d9d9d9\",\"editorOverviewRuler.errorForeground\":\"#e64d49\",\"editorOverviewRuler.warningForeground\":\"#daaa01\",\"editorSuggestWidget.background\":\"#f0f0f0\",\"editorSuggestWidget.foreground\":\"#403f53\",\"editorSuggestWidget.highlightForeground\":\"#403f53\",\"editorSuggestWidget.selectedBackground\":\"#d3e8f8\",\"editorSuggestWidget.border\":\"#d9d9d9\",\"debugExceptionWidget.background\":\"#f0f0f0\",\"debugExceptionWidget.border\":\"#d9d9d9\",\"editorMarkerNavigation.background\":\"#d0d0d0\",\"editorMarkerNavigationError.background\":\"#f76e6e\",\"editorMarkerNavigationWarning.background\":\"#daaa01\",\"debugToolBar.background\":\"#f0f0f0\",\"extensionButton.prominentBackground\":\"#2aa298\",\"extensionButton.prominentForeground\":\"#f0f0f0\",\"statusBar.background\":\"#f0f0f0\",\"statusBar.border\":\"#f0f0f0\",\"statusBar.debuggingBackground\":\"#f0f0f0\",\"statusBar.debuggingForeground\":\"#403f53\",\"statusBar.foreground\":\"#403f53\",\"statusBar.noFolderBackground\":\"#f0f0f0\",\"statusBar.noFolderForeground\":\"#403f53\",\"peekView.border\":\"#d9d9d9\",\"peekViewEditor.background\":\"#f6f6f6\",\"peekViewEditorGutter.background\":\"#f6f6f6\",\"peekViewEditor.matchHighlightBackground\":\"#49d0c5\",\"peekViewResult.background\":\"#f0f0f0\",\"peekViewResult.fileForeground\":\"#403f53\",\"peekViewResult.lineForeground\":\"#403f53\",\"peekViewResult.matchHighlightBackground\":\"#49d0c5\",\"peekViewResult.selectionBackground\":\"#e0e7ea\",\"peekViewResult.selectionForeground\":\"#403f53\",\"peekViewTitle.background\":\"#f0f0f0\",\"peekViewTitleLabel.foreground\":\"#403f53\",\"peekViewTitleDescription.foreground\":\"#403f53\",\"terminal.foreground\":\"#403f53\"},\"fg\":\"#403f53\",\"bg\":\"#f6f7f9\",\"semanticHighlighting\":false,\"settings\":[{\"name\":\"Changed\",\"scope\":[\"markup.changed\",\"meta.diff.header.git\",\"meta.diff.header.from-file\",\"meta.diff.header.to-file\"],\"settings\":{\"foreground\":\"#556484\"}},{\"name\":\"Deleted\",\"scope\":[\"markup.deleted.diff\"],\"settings\":{\"foreground\":\"#ae3c3afd\"}},{\"name\":\"Inserted\",\"scope\":[\"markup.inserted.diff\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Global settings\",\"settings\":{\"background\":\"#011627\",\"foreground\":\"#403f53\"}},{\"name\":\"Comment\",\"scope\":[\"comment\"],\"settings\":{\"foreground\":\"#5f636f\"}},{\"name\":\"String\",\"scope\":[\"string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"String Quoted\",\"scope\":[\"string.quoted\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Support Constant Math\",\"scope\":[\"support.constant.math\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Number\",\"scope\":[\"constant.numeric\",\"constant.character.numeric\"],\"settings\":{\"foreground\":\"#aa0982\",\"fontStyle\":\"\"}},{\"name\":\"Built-in constant\",\"scope\":[\"constant.language\",\"punctuation.definition.constant\",\"variable.other.constant\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"User-defined constant\",\"scope\":[\"constant.character\",\"constant.other\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Constant Character Escape\",\"scope\":[\"constant.character.escape\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"RegExp String\",\"scope\":[\"string.regexp\",\"string.regexp keyword.other\"],\"settings\":{\"foreground\":\"#3a688f\"}},{\"name\":\"Comma in functions\",\"scope\":[\"meta.function punctuation.separator.comma\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"Variable\",\"scope\":[\"variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Keyword\",\"scope\":[\"punctuation.accessor\",\"keyword\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage\",\"scope\":[\"storage\",\"meta.var.expr\",\"meta.class meta.method.declaration meta.var.expr storage.type.js\",\"storage.type.property.js\",\"storage.type.property.ts\",\"storage.type.property.tsx\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type.function.arrow.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Class name\",\"scope\":[\"entity.name.class\",\"meta.class entity.name.type.class\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Inherited class\",\"scope\":[\"entity.other.inherited-class\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Function name\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Meta Tag\",\"scope\":[\"punctuation.definition.tag\",\"meta.tag\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"HTML Tag names\",\"scope\":[\"entity.name.tag\",\"meta.tag.other.html\",\"meta.tag.other.js\",\"meta.tag.other.tsx\",\"entity.name.tag.tsx\",\"entity.name.tag.js\",\"entity.name.tag\",\"meta.tag.js\",\"meta.tag.tsx\",\"meta.tag.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Tag attribute\",\"scope\":[\"entity.other.attribute-name\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Entity Name Tag Custom\",\"scope\":[\"entity.name.tag.custom\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Library (function & constant)\",\"scope\":[\"support.function\",\"support.constant\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Support Constant Property Value meta\",\"scope\":[\"support.constant.meta.property-value\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Library class/type\",\"scope\":[\"support.type\",\"support.class\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Support Variable DOM\",\"scope\":[\"support.variable.dom\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Invalid\",\"scope\":[\"invalid\"],\"settings\":{\"foreground\":\"#bb2060\"}},{\"name\":\"Invalid deprecated\",\"scope\":[\"invalid.deprecated\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Keyword Operator\",\"scope\":[\"keyword.operator\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Relational\",\"scope\":[\"keyword.operator.relational\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Assignment\",\"scope\":[\"keyword.operator.assignment\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Arithmetic\",\"scope\":[\"keyword.operator.arithmetic\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Bitwise\",\"scope\":[\"keyword.operator.bitwise\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Increment\",\"scope\":[\"keyword.operator.increment\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Ternary\",\"scope\":[\"keyword.operator.ternary\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Double-Slashed Comment\",\"scope\":[\"comment.line.double-slash\"],\"settings\":{\"foreground\":\"#5d6376\"}},{\"name\":\"Object\",\"scope\":[\"object\"],\"settings\":{\"foreground\":\"#58656a\"}},{\"name\":\"Null\",\"scope\":[\"constant.language.null\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Meta Brace\",\"scope\":[\"meta.brace\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Meta Delimiter Period\",\"scope\":[\"meta.delimiter.period\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Punctuation Definition String\",\"scope\":[\"punctuation.definition.string\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Punctuation Definition String Markdown\",\"scope\":[\"punctuation.definition.string.begin.markdown\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Boolean\",\"scope\":[\"constant.language.boolean\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Object Comma\",\"scope\":[\"object.comma\"],\"settings\":{\"foreground\":\"#646464\"}},{\"name\":\"Variable Parameter Function\",\"scope\":[\"variable.parameter.function\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Support Type Property Name & entity name tags\",\"scope\":[\"support.type.vendor.property-name\",\"support.constant.vendor.property-value\",\"support.type.property-name\",\"meta.property-list entity.name.tag\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Entity Name tag reference in stylesheets\",\"scope\":[\"meta.property-list entity.name.tag.reference\"],\"settings\":{\"foreground\":\"#286d70\"}},{\"name\":\"Constant Other Color RGB Value Punctuation Definition Constant\",\"scope\":[\"constant.other.color.rgb-value punctuation.definition.constant\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Constant Other Color\",\"scope\":[\"constant.other.color\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Keyword Other Unit\",\"scope\":[\"keyword.other.unit\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Meta Selector\",\"scope\":[\"meta.selector\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Entity Other Attribute Name Id\",\"scope\":[\"entity.other.attribute-name.id\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Meta Property Name\",\"scope\":[\"meta.property-name\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Doctypes\",\"scope\":[\"entity.name.tag.doctype\",\"meta.tag.sgml.doctype\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Punctuation Definition Parameters\",\"scope\":[\"punctuation.definition.parameters\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Keyword Control Operator\",\"scope\":[\"keyword.control.operator\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Keyword Operator Logical\",\"scope\":[\"keyword.operator.logical\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"\"}},{\"name\":\"Variable Instances\",\"scope\":[\"variable.instance\",\"variable.other.instance\",\"variable.readwrite.instance\",\"variable.other.readwrite.instance\",\"variable.other.property\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Variable Property Other object property\",\"scope\":[\"variable.other.object.property\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Variable Property Other object\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Entity Name Function\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Keyword Operator Comparison, imports, returns and Keyword Operator Ruby\",\"scope\":[\"keyword.operator.comparison\",\"keyword.control.flow.js\",\"keyword.control.flow.ts\",\"keyword.control.flow.tsx\",\"keyword.control.ruby\",\"keyword.control.module.ruby\",\"keyword.control.class.ruby\",\"keyword.control.def.ruby\",\"keyword.control.loop.js\",\"keyword.control.loop.ts\",\"keyword.control.import.js\",\"keyword.control.import.ts\",\"keyword.control.import.tsx\",\"keyword.control.from.js\",\"keyword.control.from.ts\",\"keyword.control.from.tsx\",\"keyword.operator.instanceof.js\",\"keyword.operator.expression.instanceof.ts\",\"keyword.operator.expression.instanceof.tsx\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Control Conditional\",\"scope\":[\"keyword.control.conditional.js\",\"keyword.control.conditional.ts\",\"keyword.control.switch.js\",\"keyword.control.switch.ts\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"\"}},{\"name\":\"Support Constant, `new` keyword, Special Method Keyword, `debugger`, other keywords\",\"scope\":[\"support.constant\",\"keyword.other.special-method\",\"keyword.other.new\",\"keyword.other.debugger\",\"keyword.control\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Support Function\",\"scope\":[\"support.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Invalid Broken\",\"scope\":[\"invalid.broken\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Invalid Unimplemented\",\"scope\":[\"invalid.unimplemented\"],\"settings\":{\"foreground\":\"#486e26\"}},{\"name\":\"Invalid Illegal\",\"scope\":[\"invalid.illegal\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Language Variable\",\"scope\":[\"variable.language\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Support Variable Property\",\"scope\":[\"support.variable.property\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Variable Function\",\"scope\":[\"variable.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variable Interpolation\",\"scope\":[\"variable.interpolation\"],\"settings\":{\"foreground\":\"#a64348\"}},{\"name\":\"Meta Function Call\",\"scope\":[\"meta.function-call\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Punctuation Section Embedded\",\"scope\":[\"punctuation.section.embedded\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Punctuation Tweaks\",\"scope\":[\"punctuation.terminator.expression\",\"punctuation.definition.arguments\",\"punctuation.definition.array\",\"punctuation.section.array\",\"meta.array\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"More Punctuation Tweaks\",\"scope\":[\"punctuation.definition.list.begin\",\"punctuation.definition.list.end\",\"punctuation.separator.arguments\",\"punctuation.definition.list\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Template Strings\",\"scope\":[\"string.template meta.template.expression\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Backticks(``) in Template Strings\",\"scope\":[\"string.template punctuation.definition.string\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Italics\",\"scope\":[\"italic\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"italic\"}},{\"name\":\"Bold\",\"scope\":[\"bold\"],\"settings\":{\"foreground\":\"#3b61b0\",\"fontStyle\":\"bold\"}},{\"name\":\"Quote\",\"scope\":[\"quote\"],\"settings\":{\"foreground\":\"#5c6285\"}},{\"name\":\"Raw Code\",\"scope\":[\"raw\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"CoffeeScript Variable Assignment\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#186e73\"}},{\"name\":\"CoffeeScript Parameter Function\",\"scope\":[\"variable.parameter.function.coffee\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"CoffeeScript Assignments\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"C# Readwrite Variables\",\"scope\":[\"variable.other.readwrite.cs\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"C# Classes & Storage types\",\"scope\":[\"entity.name.type.class.cs\",\"storage.type.cs\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"C# Namespaces\",\"scope\":[\"entity.name.type.namespace.cs\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Tag names in Stylesheets\",\"scope\":[\"entity.name.tag.css\",\"entity.name.tag.less\",\"entity.name.tag.custom.css\",\"support.constant.property-value.css\"],\"settings\":{\"foreground\":\"#984e4d\",\"fontStyle\":\"\"}},{\"name\":\"Wildcard(*) selector in Stylesheets\",\"scope\":[\"entity.name.tag.wildcard.css\",\"entity.name.tag.wildcard.less\",\"entity.name.tag.wildcard.scss\",\"entity.name.tag.wildcard.sass\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"CSS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Attribute Name for CSS\",\"scope\":[\"meta.attribute-selector.css entity.other.attribute-name.attribute\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Elixir Classes\",\"scope\":[\"source.elixir support.type.elixir\",\"source.elixir meta.module.elixir entity.name.class.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Functions\",\"scope\":[\"source.elixir entity.name.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Constants\",\"scope\":[\"source.elixir constant.other.symbol.elixir\",\"source.elixir constant.other.keywords.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir String Punctuations\",\"scope\":[\"source.elixir punctuation.definition.string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir\",\"scope\":[\"source.elixir variable.other.readwrite.module.elixir\",\"source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Binary Punctuations\",\"scope\":[\"source.elixir .punctuation.binary.elixir\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Closure Constant Keyword\",\"scope\":[\"constant.keyword.clojure\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Go Function Calls\",\"scope\":[\"source.go meta.function-call.go\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Go Keywords\",\"scope\":[\"source.go keyword.package.go\",\"source.go keyword.import.go\",\"source.go keyword.function.go\",\"source.go keyword.type.go\",\"source.go keyword.struct.go\",\"source.go keyword.interface.go\",\"source.go keyword.const.go\",\"source.go keyword.var.go\",\"source.go keyword.map.go\",\"source.go keyword.channel.go\",\"source.go keyword.control.go\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Go Constants e.g. nil, string format (%s, %d, etc.)\",\"scope\":[\"source.go constant.language.go\",\"source.go constant.other.placeholder.go\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"C++ Functions\",\"scope\":[\"entity.name.function.preprocessor.cpp\",\"entity.scope.name.cpp\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"C++ Meta Namespace\",\"scope\":[\"meta.namespace-block.cpp\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"C++ Language Primitive Storage\",\"scope\":[\"storage.type.language.primitive.cpp\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"C++ Preprocessor Macro\",\"scope\":[\"meta.preprocessor.macro.cpp\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"C++ Variable Parameter\",\"scope\":[\"variable.parameter\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Powershell Variables\",\"scope\":[\"variable.other.readwrite.powershell\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Powershell Function\",\"scope\":[\"support.function.powershell\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"ID Attribute Name in HTML\",\"scope\":[\"entity.other.attribute-name.id.html\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"HTML Punctuation Definition Tag\",\"scope\":[\"punctuation.definition.tag.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"HTML Doctype\",\"scope\":[\"meta.tag.sgml.doctype.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"JavaScript Classes\",\"scope\":[\"meta.class entity.name.type.class.js\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"JavaScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.js\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"JavaScript Terminator\",\"scope\":[\"terminator.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Meta Punctuation Definition\",\"scope\":[\"meta.js punctuation.definition.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Entity Names in Code Documentations\",\"scope\":[\"entity.name.type.instance.jsdoc\",\"entity.name.type.instance.phpdoc\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"Other Variables in Code Documentations\",\"scope\":[\"variable.other.jsdoc\",\"variable.other.phpdoc\"],\"settings\":{\"foreground\":\"#3e697c\"}},{\"name\":\"JavaScript module imports and exports\",\"scope\":[\"variable.other.meta.import.js\",\"meta.import.js variable.other\",\"variable.other.meta.export.js\",\"meta.export.js variable.other\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Variable Parameter Function\",\"scope\":[\"variable.parameter.function.js\"],\"settings\":{\"foreground\":\"#555ea2\"}},{\"name\":\"JavaScript[React] Variable Other Object\",\"scope\":[\"variable.other.object.js\",\"variable.other.object.jsx\",\"variable.object.property.js\",\"variable.object.property.jsx\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Variables\",\"scope\":[\"variable.js\",\"variable.other.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Entity Name Type\",\"scope\":[\"entity.name.type.js\",\"entity.name.type.module.js\"],\"settings\":{\"foreground\":\"#111111\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Support Classes\",\"scope\":[\"support.class.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JSON Property Names\",\"scope\":[\"support.type.property-name.json\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"JSON Support Constants\",\"scope\":[\"support.constant.json\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"JSON Property values (string)\",\"scope\":[\"meta.structure.dictionary.value.json string.quoted.double\"],\"settings\":{\"foreground\":\"#7c5686\"}},{\"name\":\"Strings in JSON values\",\"scope\":[\"string.quoted.double.json punctuation.definition.string.json\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Specific JSON Property values like null\",\"scope\":[\"meta.structure.dictionary.json meta.structure.dictionary.value constant.language\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"JavaScript Other Variable\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Ruby Variables\",\"scope\":[\"variable.other.ruby\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Ruby Class\",\"scope\":[\"entity.name.type.class.ruby\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Ruby Hashkeys\",\"scope\":[\"constant.language.symbol.hashkey.ruby\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Ruby Symbols\",\"scope\":[\"constant.language.symbol.ruby\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"LESS Tag names\",\"scope\":[\"entity.name.tag.less\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"LESS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Attribute Name for LESS\",\"scope\":[\"meta.attribute-selector.less entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Markdown Headings\",\"scope\":[\"markup.heading.markdown\",\"markup.heading.setext.1.markdown\",\"markup.heading.setext.2.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown Italics\",\"scope\":[\"markup.italic.markdown\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"italic\"}},{\"name\":\"Markdown Bold\",\"scope\":[\"markup.bold.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\",\"fontStyle\":\"bold\"}},{\"name\":\"Markdown Quote + others\",\"scope\":[\"markup.quote.markdown\"],\"settings\":{\"foreground\":\"#5c6285\"}},{\"name\":\"Markdown Raw Code + others\",\"scope\":[\"markup.inline.raw.markdown\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Markdown Links\",\"scope\":[\"markup.underline.link.markdown\",\"markup.underline.link.image.markdown\"],\"settings\":{\"foreground\":\"#954f5a\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Link Title and Description\",\"scope\":[\"string.other.link.title.markdown\",\"string.other.link.description.markdown\"],\"settings\":{\"foreground\":\"#403f53\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Punctuation\",\"scope\":[\"punctuation.definition.string.markdown\",\"punctuation.definition.string.begin.markdown\",\"punctuation.definition.string.end.markdown\",\"meta.link.inline.markdown punctuation.definition.string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown MetaData Punctuation\",\"scope\":[\"punctuation.definition.metadata.markdown\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Markdown List Punctuation\",\"scope\":[\"beginning.punctuation.definition.list.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown Inline Raw String\",\"scope\":[\"markup.inline.raw.string.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"PHP Variables\",\"scope\":[\"variable.other.php\",\"variable.other.property.php\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Support Classes in PHP\",\"scope\":[\"support.class.php\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Punctuations in PHP function calls\",\"scope\":[\"meta.function-call.php punctuation\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"PHP Global Variables\",\"scope\":[\"variable.other.global.php\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Declaration Punctuation in PHP Global Variables\",\"scope\":[\"variable.other.global.php punctuation.definition.variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Language Constants in Python\",\"scope\":[\"constant.language.python\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Python Function Parameter and Arguments\",\"scope\":[\"variable.parameter.function.python\",\"meta.function-call.arguments.python\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Python Function Call\",\"scope\":[\"meta.function-call.python\",\"meta.function-call.generic.python\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Punctuations in Python\",\"scope\":[\"punctuation.python\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Decorator Functions in Python\",\"scope\":[\"entity.name.function.decorator.python\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Python Language Variable\",\"scope\":[\"source.python variable.language.special\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Python import control keyword\",\"scope\":[\"keyword.control\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"SCSS Variable\",\"scope\":[\"variable.scss\",\"variable.sass\",\"variable.parameter.url.scss\",\"variable.parameter.url.sass\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Attribute Name for SASS\",\"scope\":[\"meta.attribute-selector.scss entity.other.attribute-name.attribute\",\"meta.attribute-selector.sass entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Tag names in SASS\",\"scope\":[\"entity.name.tag.scss\",\"entity.name.tag.sass\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"SASS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.scss\",\"keyword.other.unit.sass\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"TypeScript[React] Variables and Object Properties\",\"scope\":[\"variable.other.readwrite.alias.ts\",\"variable.other.readwrite.alias.tsx\",\"variable.other.readwrite.ts\",\"variable.other.readwrite.tsx\",\"variable.other.object.ts\",\"variable.other.object.tsx\",\"variable.object.property.ts\",\"variable.object.property.tsx\",\"variable.other.ts\",\"variable.other.tsx\",\"variable.tsx\",\"variable.ts\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript[React] Entity Name Types\",\"scope\":[\"entity.name.type.ts\",\"entity.name.type.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript[React] Node Classes\",\"scope\":[\"support.class.node.ts\",\"support.class.node.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"TypeScript[React] Entity Name Types as Parameters\",\"scope\":[\"meta.type.parameters.ts entity.name.type\",\"meta.type.parameters.tsx entity.name.type\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"TypeScript[React] Import/Export Punctuations\",\"scope\":[\"meta.import.ts punctuation.definition.block\",\"meta.import.tsx punctuation.definition.block\",\"meta.export.ts punctuation.definition.block\",\"meta.export.tsx punctuation.definition.block\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.decorator punctuation.decorator.ts\",\"meta.decorator punctuation.decorator.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.tag.js meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"YAML Entity Name Tags\",\"scope\":[\"entity.name.tag.yaml\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"JavaScript Variable Other ReadWrite\",\"scope\":[\"variable.other.readwrite.js\",\"variable.parameter\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Support Class Component\",\"scope\":[\"support.class.component.js\",\"support.class.component.tsx\"],\"settings\":{\"foreground\":\"#aa0982\",\"fontStyle\":\"\"}},{\"name\":\"Text nested in React tags\",\"scope\":[\"meta.jsx.children\",\"meta.jsx.children.js\",\"meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript Classes\",\"scope\":[\"meta.class entity.name.type.class.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript Entity Name Type\",\"scope\":[\"entity.name.type.tsx\",\"entity.name.type.module.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript Class Variable Keyword\",\"scope\":[\"meta.class.ts meta.var.expr.ts storage.type.ts\",\"meta.class.tsx meta.var.expr.tsx storage.type.tsx\"],\"settings\":{\"foreground\":\"#76578b\"}},{\"name\":\"TypeScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.ts\",\"meta.method.declaration storage.type.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"normalize font style of certain components\",\"scope\":[\"meta.property-list.css meta.property-value.css variable.other.less\",\"meta.property-list.scss variable.scss\",\"meta.property-list.sass variable.sass\",\"meta.brace\",\"keyword.operator.operator\",\"keyword.operator.or.regexp\",\"keyword.operator.expression.in\",\"keyword.operator.relational\",\"keyword.operator.assignment\",\"keyword.operator.comparison\",\"keyword.operator.type\",\"keyword.operator\",\"keyword\",\"punctuation.definition.string\",\"punctuation\",\"variable.other.readwrite.js\",\"storage.type\",\"source.css\",\"string.quoted\"],\"settings\":{\"fontStyle\":\"\"}}],\"styleOverrides\":{\"frames\":{\"editorBackground\":\"var(--sl-color-gray-7)\",\"terminalBackground\":\"var(--sl-color-gray-7)\",\"editorActiveTabBackground\":\"var(--sl-color-gray-7)\",\"terminalTitlebarDotsForeground\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"terminalTitlebarDotsOpacity\":\"0.75\",\"inlineButtonForeground\":\"var(--sl-color-text)\",\"frameBoxShadowCssValue\":\"none\"},\"textMarkers\":{\"markBackground\":\"#0000001a\",\"markBorderColor\":\"#00000055\"}}}],\"defaultLocale\":\"en\",\"cascadeLayer\":\"starlight.components\",\"styleOverrides\":{\"borderRadius\":\"0px\",\"borderWidth\":\"1px\",\"codePaddingBlock\":\"0.75rem\",\"codePaddingInline\":\"1rem\",\"codeFontFamily\":\"var(--__sl-font-mono)\",\"codeFontSize\":\"var(--sl-text-code)\",\"codeLineHeight\":\"var(--sl-line-height)\",\"uiFontFamily\":\"var(--__sl-font)\",\"textMarkers\":{\"lineDiffIndicatorMarginLeft\":\"0.25rem\",\"defaultChroma\":\"45\",\"backgroundOpacity\":\"60%\"}},\"plugins\":[{\"name\":\"Starlight Plugin\",\"hooks\":{}},{\"name\":\"astro-expressive-code\",\"hooks\":{}}]}]],\"remarkRehype\":{},\"gfm\":true,\"smartypants\":true},\"security\":{\"checkOrigin\":true,\"allowedDomains\":[],\"actionBodySizeLimit\":1048576},\"env\":{\"schema\":{},\"validateSecrets\":false},\"experimental\":{\"clientPrerender\":false,\"contentIntellisense\":false,\"headingIdCompat\":false,\"preserveScriptOrder\":false,\"liveContentCollections\":false,\"csp\":false,\"staticImportMetaEnv\":false,\"chromeDevtoolsWorkspace\":false,\"failOnPrerenderConflict\":false,\"svgo\":false},\"legacy\":{\"collections\":false},\"prefetch\":{\"prefetchAll\":true},\"i18n\":{\"defaultLocale\":\"en\",\"locales\":[\"en\"],\"routing\":{\"prefixDefaultLocale\":false,\"redirectToDefaultLocale\":false,\"fallbackType\":\"redirect\"}}}","docs",["Map",11,12,27,28,42,43],"index",{"id":11,"data":13,"filePath":25,"digest":26,"deferredRender":16},{"title":14,"description":15,"editUrl":16,"head":17,"template":18,"hero":19,"sidebar":22,"pagefind":16,"draft":23},"Starter Tutorial","Get started building a tutorial.",true,[],"splash",{"tagline":20,"actions":21},"Starting a tutorial!",[],{"hidden":23,"attrs":24},false,{},"src/content/docs/index.mdx","369e120ef938088e","reference",{"id":27,"data":29,"body":39,"filePath":40,"digest":41,"deferredRender":16},{"title":30,"description":31,"editUrl":16,"head":32,"template":33,"hero":34,"sidebar":37,"pagefind":16,"draft":23},"Reference","Get started building your docs site with Starlight.",[],"doc",{"tagline":35,"actions":36},"Components that can be used in Tutorials",[],{"hidden":23,"attrs":38},{},"## Asides\n\n{% aside %}\nNote aside.\n{% /aside %}\n\n```\n{% aside %}\nNote aside.\n{% /aside %}\n```\n\n{% aside type=\"caution\" %}\nCaution aside.\n{% /aside %}\n\n```\n{% aside type=\"caution\" %}\nCaution aside.\n{% /aside %}\n```\n\n{% aside type=\"tip\" %}\nTip aside.\n{% /aside %}\n\n```\n{% aside type=\"tip\" %}\nTip aside.\n{% /aside %}\n```\n\n{% aside type=\"danger\" %}\nDanger aside.\n{% /aside %}\n\n```\n{% aside type=\"danger\" %}\nDanger aside.\n{% /aside %}\n```\n\n## Blockquotes\n\n> This is a blockquote.\n>\n> This is another line in the blockquote.\n\n## Code Blocks\n\n```js\nfunction demo() {\n // This is a comment\n console.log('Hello World');\n}\n```\n\n## File Trees\n\n{% filetree %}\n\n- astro.config.mjs\n- package.json\n- src\n - components\n - Header.astro\n - Title.astro\n - pages/\n\n{% /filetree %}\n\n```\n{% filetree %}\n\n- astro.config.mjs\n- package.json\n- src\n - components\n - Header.astro\n - Title.astro\n - pages/\n\n{% /filetree %}\n```\n\n## Steps\n\n{% steps %}\n\n1. Import the component into your MDX file:\n\n ```js\n import { Steps } from '@astrojs/starlight/components';\n ```\n\n2. Wrap `\u003CSteps>` around your ordered list items.\n\n{% /steps %}\n\n```\n {% steps %}\n\n 1. Import the component into your MDX file:\n\n ```js\n import { Steps } from '@astrojs/starlight/components';\n ```\n\n 2. Wrap `\u003CSteps>` around your ordered list items.\n\n {% /steps %}\n```\n\n## Tabs\n\n{% tabs %}\n{% tabitem label=\"Tab 1\" %}\nTab 1 text\n{% /tabitem %}\n\n{% tabitem label=\"Tab 2\" %}\nTab 2 text\n{% /tabitem %}\n{% /tabs %}\n\n```\n{% tabs %}\n{% tabitem label=\"Tab 1\" %}\nTab 1 text\n{% /tabitem %}\n\n{% tabitem label=\"Tab 2\" %}\nTab 2 text\n{% /tabitem %}\n{% /tabs %}\n```","src/content/docs/reference.mdoc","17bf736636d92cae","01_first_step",{"id":42,"data":44,"body":50,"filePath":51,"digest":52,"rendered":53},{"title":45,"description":46,"editUrl":16,"head":47,"template":33,"sidebar":48,"pagefind":16,"draft":23},"Introduction","An introduction to the onboarding tutorial",[],{"hidden":23,"attrs":49},{},"# Starter Tutorial\n\nThis is a paragraph about what the tutorial contains.\n\nHere is some code:\n\n```js\nfunction demo() {\n // This is a comment\n console.log('Hello World');\n}\n```","src/content/docs/01_First_Step.md","5f8f5e057d466cd2",{"html":54,"metadata":55},"\u003Cdiv class=\"sl-heading-wrapper level-h1\">\u003Ch1 id=\"starter-tutorial\">Starter Tutorial\u003C/h1>\u003Ca class=\"sl-anchor-link\" href=\"#starter-tutorial\">\u003Cspan aria-hidden=\"true\" class=\"sl-anchor-icon\">\u003Csvg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\">\u003Cpath fill=\"currentcolor\" d=\"m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\">\u003C/path>\u003C/svg>\u003C/span>\u003Cspan class=\"sr-only\" data-pagefind-ignore=\"\">Section titled “Starter Tutorial”\u003C/span>\u003C/a>\u003C/div>\n\u003Cp>This is a paragraph about what the tutorial contains.\u003C/p>\n\u003Cp>Here is some code:\u003C/p>\n\u003Cdiv class=\"expressive-code\">\u003Clink rel=\"stylesheet\" href=\"/_astro/ec.v4551.css\">\u003Cscript type=\"module\" src=\"/_astro/ec.0vx5m.js\">\u003C/script>\u003Cfigure class=\"frame not-content\">\u003Cfigcaption class=\"header\">\u003C/figcaption>\u003Cpre data-language=\"js\">\u003Ccode>\u003Cdiv class=\"ec-line\">\u003Cdiv class=\"code\">\u003Cspan style=\"--0:#C792EA;--1:#8844AE\">function\u003C/span>\u003Cspan style=\"--0:#D6DEEB;--1:#403F53\"> \u003C/span>\u003Cspan style=\"--0:#82AAFF;--1:#3B61B0\">demo\u003C/span>\u003Cspan style=\"--0:#D9F5DD;--1:#111111\">()\u003C/span>\u003Cspan style=\"--0:#D6DEEB;--1:#403F53\"> {\u003C/span>\u003C/div>\u003C/div>\u003Cdiv class=\"ec-line\">\u003Cdiv class=\"code\">\u003Cspan class=\"indent\"> \u003C/span>\u003Cspan style=\"--0:#919F9F;--1:#5D6376\">// This is a comment\u003C/span>\u003C/div>\u003C/div>\u003Cdiv class=\"ec-line\">\u003Cdiv class=\"code\">\u003Cspan class=\"indent\"> \u003C/span>\u003Cspan style=\"--0:#7FDBCA;--1:#096E72\">console\u003C/span>\u003Cspan style=\"--0:#C792EA;--1:#8844AE\">.\u003C/span>\u003Cspan style=\"--0:#82AAFF;--1:#3B61B0\">log\u003C/span>\u003Cspan style=\"--0:#D6DEEB;--1:#403F53\">(\u003C/span>\u003Cspan style=\"--0:#D9F5DD;--1:#111111\">'\u003C/span>\u003Cspan style=\"--0:#ECC48D;--1:#984E4D\">Hello World\u003C/span>\u003Cspan style=\"--0:#D9F5DD;--1:#111111\">'\u003C/span>\u003Cspan style=\"--0:#D6DEEB;--1:#403F53\">);\u003C/span>\u003C/div>\u003C/div>\u003Cdiv class=\"ec-line\">\u003Cdiv class=\"code\">\u003Cspan style=\"--0:#D6DEEB;--1:#403F53\">}\u003C/span>\u003C/div>\u003C/div>\u003C/code>\u003C/pre>\u003Cdiv class=\"copy\">\u003Cdiv aria-live=\"polite\">\u003C/div>\u003Cbutton title=\"Copy to clipboard\" data-copied=\"Copied!\" data-code=\"function demo() { // This is a comment console.log('Hello World');}\">\u003Cdiv>\u003C/div>\u003C/button>\u003C/div>\u003C/figure>\u003C/div>",{"headings":56,"localImagePaths":60,"remoteImagePaths":61,"frontmatter":62,"imagePaths":63},[57],{"depth":58,"slug":59,"text":14},1,"starter-tutorial",[],[],{"title":45,"description":46},[]] \ No newline at end of file diff --git a/tutorials/vonage_video_ios_app-theme-customization/.astro/settings.json b/tutorials/vonage_video_ios_app-theme-customization/.astro/settings.json new file mode 100644 index 00000000..6945ae7d --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/.astro/settings.json @@ -0,0 +1,5 @@ +{ + "_variables": { + "lastUpdateCheck": 1785852561838 + } +} \ No newline at end of file diff --git a/tutorials/vonage_video_ios_app-theme-customization/.astro/types.d.ts b/tutorials/vonage_video_ios_app-theme-customization/.astro/types.d.ts new file mode 100644 index 00000000..03d7cc43 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/.astro/types.d.ts @@ -0,0 +1,2 @@ +/// +/// \ No newline at end of file diff --git a/tutorials/vonage_video_ios_app-theme-customization/README.md b/tutorials/vonage_video_ios_app-theme-customization/README.md new file mode 100644 index 00000000..31bb373e --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/README.md @@ -0,0 +1,21 @@ + +# vonage_video_ios_app-theme-customization +Generated Tutorial Environment. + +## Start Learning +[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Vonage-Community/tutorial-interactive_tutorials?devcontainer_path=.devcontainer/vonage_video_ios_app-theme-customization/devcontainer.json) + +## 🛠️ Edit this Tutorial +Want to make changes to the lesson, add steps, or update starter files? +[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/Vonage-Community/tutorial-interactive_tutorials/tree/main/sources/vonage_video_ios_app-theme-customization) +1. Clone this repo: `git clone https://github.com/Vonage-Community/tutorial-interactive_tutorials.git` +2. Open the `sources/vonage_video_ios_app-theme-customization` folder in VS Code +3. Install dependencies and start the dev server: `npm install && npm run dev` +4. Preview at `http://localhost:4321` — open it in VS Code via **Ctrl+Shift+P** → **Simple Browser: Show** + +### Environment Details +- **Tutorial Steps**: Port 1234 +- **Your Workspace**: `tutorials/vonage_video_ios_app-theme-customization` +- **Project Code**: `tutorials/vonage_video_ios_app-theme-customization/project` +- **Tutorial Source**: `sources/vonage_video_ios_app-theme-customization` + \ No newline at end of file diff --git a/tutorials/vonage_video_ios_app-theme-customization/astro.config.mjs b/tutorials/vonage_video_ios_app-theme-customization/astro.config.mjs new file mode 100644 index 00000000..8f4ad034 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/astro.config.mjs @@ -0,0 +1,20 @@ +import { defineConfig } from 'astro/config'; +import starlight from '@astrojs/starlight'; +import relativeLinks from 'astro-relative-links'; +import vonageIntegration from './vonage-toolbar/integration.ts'; + +import markdoc from '@astrojs/markdoc'; + +// https://astro.build/config +export default defineConfig({ + integrations: [ + relativeLinks(), + vonageIntegration, + starlight({ + title: 'Vonage Coding Exercise', + tableOfContents: true, + pagefind: false, + }), + markdoc(), + ], +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/download-toolbar.js b/tutorials/vonage_video_ios_app-theme-customization/download-toolbar.js new file mode 100644 index 00000000..34c88a09 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/download-toolbar.js @@ -0,0 +1,40 @@ +import fs from 'fs/promises'; + +async function downloadFile(url, filename) { + console.log('downloading: ', filename); + try { + const response = await fetch(url); + const buffer = await response.arrayBuffer(); + + await fs.mkdir('./vonage-toolbar', { recursive: true }); + + await fs.writeFile( + `./vonage-toolbar/${filename}`, + Buffer.from(buffer) + ); + + console.log(`✅ File ${filename} downloaded and written successfully!`); + + } catch (error) { + console.error(`❌ Error downloading/writing ${filename}:`, error); + } +} + +async function main() { + console.log('download toolbar application files'); + + await Promise.all([ + downloadFile( + 'https://raw.githubusercontent.com/vonage-community/tutorial-interactive_tutorials/refs/heads/main/toolbar-app/vonage-toolbar/integration.ts', + 'integration.ts' + ), + downloadFile( + 'https://raw.githubusercontent.com/vonage-community/tutorial-interactive_tutorials/refs/heads/main/toolbar-app/vonage-toolbar/app.ts', + 'app.ts' + ) + ]); + + console.log('🎉 All downloads complete. Starting Astro...'); +} + +main(); diff --git a/tutorials/vonage_video_ios_app-theme-customization/markdoc.config.mjs b/tutorials/vonage_video_ios_app-theme-customization/markdoc.config.mjs new file mode 100644 index 00000000..329155ae --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/markdoc.config.mjs @@ -0,0 +1,6 @@ +import { defineMarkdocConfig } from '@astrojs/markdoc/config'; +import starlightMarkdoc from '@astrojs/starlight-markdoc'; + +export default defineMarkdocConfig({ + extends: [starlightMarkdoc()], +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/package-lock.json b/tutorials/vonage_video_ios_app-theme-customization/package-lock.json new file mode 100644 index 00000000..c22aa404 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/package-lock.json @@ -0,0 +1,8488 @@ +{ + "name": "@example/starlight-basics", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@example/starlight-basics", + "version": "0.0.1", + "hasInstallScript": true, + "dependencies": { + "@astrojs/markdoc": "^0.15.10", + "@astrojs/starlight": "^0.37.6", + "@astrojs/starlight-markdoc": "^0.5.1", + "adm-zip": "^0.5.16", + "astro": "^5.18.1", + "astro-relative-links": "^0.4.2", + "sharp": "^0.33.0" + }, + "devDependencies": { + "http-server": "^14.1.1" + } + }, + "node_modules/@astrojs/compiler": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.13.0.tgz", + "integrity": "sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==", + "license": "MIT" + }, + "node_modules/@astrojs/internal-helpers": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.7.5.tgz", + "integrity": "sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA==", + "license": "MIT" + }, + "node_modules/@astrojs/markdoc": { + "version": "0.15.10", + "resolved": "https://registry.npmjs.org/@astrojs/markdoc/-/markdoc-0.15.10.tgz", + "integrity": "sha512-05V4Vy4J14aDpBstKbuyO7ArY+VCF80SElWyx80ddeWkUiOERw4SjGbnzgAI4AQtDdJ+pJdlv/16TMM65+YafA==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.5", + "@astrojs/markdown-remark": "6.3.10", + "@astrojs/prism": "3.3.0", + "@markdoc/markdoc": "^0.5.4", + "esbuild": "^0.25.0", + "github-slugger": "^2.0.0", + "htmlparser2": "^10.0.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^5.0.0" + } + }, + "node_modules/@astrojs/markdown-remark": { + "version": "6.3.10", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.10.tgz", + "integrity": "sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.5", + "@astrojs/prism": "3.3.0", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-to-text": "^4.0.2", + "import-meta-resolve": "^4.2.0", + "js-yaml": "^4.1.1", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-smartypants": "^3.0.2", + "shiki": "^3.19.0", + "smol-toml": "^1.5.2", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.2", + "vfile": "^6.0.3" + } + }, + "node_modules/@astrojs/mdx": { + "version": "4.3.13", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.13.tgz", + "integrity": "sha512-IHDHVKz0JfKBy3//52JSiyWv089b7GVSChIXLrlUOoTLWowG3wr2/8hkaEgEyd/vysvNQvGk+QhysXpJW5ve6Q==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "6.3.10", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.15.0", + "es-module-lexer": "^1.7.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "piccolore": "^0.1.3", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^5.0.0" + } + }, + "node_modules/@astrojs/prism": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.3.0.tgz", + "integrity": "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==", + "license": "MIT", + "dependencies": { + "prismjs": "^1.30.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + } + }, + "node_modules/@astrojs/sitemap": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.7.0.tgz", + "integrity": "sha512-+qxjUrz6Jcgh+D5VE1gKUJTA3pSthuPHe6Ao5JCxok794Lewx8hBFaWHtOnN0ntb2lfOf7gvOi9TefUswQ/ZVA==", + "license": "MIT", + "dependencies": { + "sitemap": "^8.0.2", + "stream-replace-string": "^2.0.0", + "zod": "^3.25.76" + } + }, + "node_modules/@astrojs/starlight": { + "version": "0.37.6", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.6.tgz", + "integrity": "sha512-wQrKwH431q+8FsLBnNQeG+R36TMtEGxTQ2AuiVpcx9APcazvL3n7wVW8mMmYyxX0POjTnxlcWPkdMGR3Yj1L+w==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "^6.3.1", + "@astrojs/mdx": "^4.2.3", + "@astrojs/sitemap": "^3.3.0", + "@pagefind/default-ui": "^1.3.0", + "@types/hast": "^3.0.4", + "@types/js-yaml": "^4.0.9", + "@types/mdast": "^4.0.4", + "astro-expressive-code": "^0.41.1", + "bcp-47": "^2.1.0", + "hast-util-from-html": "^2.0.1", + "hast-util-select": "^6.0.2", + "hast-util-to-string": "^3.0.0", + "hastscript": "^9.0.0", + "i18next": "^23.11.5", + "js-yaml": "^4.1.0", + "klona": "^2.0.6", + "magic-string": "^0.30.17", + "mdast-util-directive": "^3.0.0", + "mdast-util-to-markdown": "^2.1.0", + "mdast-util-to-string": "^4.0.0", + "pagefind": "^1.3.0", + "rehype": "^13.0.1", + "rehype-format": "^5.0.0", + "remark-directive": "^3.0.0", + "ultrahtml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.2" + }, + "peerDependencies": { + "astro": "^5.5.0" + } + }, + "node_modules/@astrojs/starlight-markdoc": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@astrojs/starlight-markdoc/-/starlight-markdoc-0.5.1.tgz", + "integrity": "sha512-YxTvCHr/0ovDUhuRm0xeCjjGYtnqpa9EtTwc9fTbRO7Zpnsu1mDmm2L9HHSBWZ4YsFb005/GJYNDjk4WXNLoUg==", + "license": "MIT", + "peerDependencies": { + "@astrojs/markdoc": ">=0.12.1", + "@astrojs/starlight": ">=0.35.0" + } + }, + "node_modules/@astrojs/telemetry": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.0.tgz", + "integrity": "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^4.2.0", + "debug": "^4.4.0", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "is-docker": "^3.0.0", + "is-wsl": "^3.1.0", + "which-pm-runs": "^1.1.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@capsizecss/unpack": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.0.tgz", + "integrity": "sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz", + "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", + "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@expressive-code/core": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.41.7.tgz", + "integrity": "sha512-ck92uZYZ9Wba2zxkiZLsZGi9N54pMSAVdrI9uW3Oo9AtLglD5RmrdTwbYPCT2S/jC36JGB2i+pnQtBm/Ib2+dg==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^4.0.4", + "hast-util-select": "^6.0.2", + "hast-util-to-html": "^9.0.1", + "hast-util-to-text": "^4.0.1", + "hastscript": "^9.0.0", + "postcss": "^8.4.38", + "postcss-nested": "^6.0.1", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1" + } + }, + "node_modules/@expressive-code/plugin-frames": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-frames/-/plugin-frames-0.41.7.tgz", + "integrity": "sha512-diKtxjQw/979cTglRFaMCY/sR6hWF0kSMg8jsKLXaZBSfGS0I/Hoe7Qds3vVEgeoW+GHHQzMcwvgx/MOIXhrTA==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.7" + } + }, + "node_modules/@expressive-code/plugin-shiki": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-shiki/-/plugin-shiki-0.41.7.tgz", + "integrity": "sha512-DL605bLrUOgqTdZ0Ot5MlTaWzppRkzzqzeGEu7ODnHF39IkEBbFdsC7pbl3LbUQ1DFtnfx6rD54k/cdofbW6KQ==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.7", + "shiki": "^3.2.2" + } + }, + "node_modules/@expressive-code/plugin-text-markers": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.41.7.tgz", + "integrity": "sha512-Ewpwuc5t6eFdZmWlFyeuy3e1PTQC0jFvw2Q+2bpcWXbOZhPLsT7+h8lsSIJxb5mS7wZko7cKyQ2RLYDyK6Fpmw==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.7" + } + }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@markdoc/markdoc": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@markdoc/markdoc/-/markdoc-0.5.4.tgz", + "integrity": "sha512-36YFNlqFk//gVNGm5xZaTWVwbAVF2AOmVjf1tiUrS6tCoD/YSkVy2E3CkAfhc5MlKcjparL/QFHCopxL4zRyaQ==", + "license": "MIT", + "engines": { + "node": ">=14.7.0" + }, + "optionalDependencies": { + "@types/linkify-it": "^3.0.1", + "@types/markdown-it": "12.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@oslojs/encoding": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", + "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", + "license": "MIT" + }, + "node_modules/@pagefind/darwin-arm64": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.3.0.tgz", + "integrity": "sha512-365BEGl6ChOsauRjyVpBjXybflXAOvoMROw3TucAROHIcdBvXk9/2AmEvGFU0r75+vdQI4LJdJdpH4Y6Yqaj4A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/darwin-x64": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.3.0.tgz", + "integrity": "sha512-zlGHA23uuXmS8z3XxEGmbHpWDxXfPZ47QS06tGUq0HDcZjXjXHeLG+cboOy828QIV5FXsm9MjfkP5e4ZNbOkow==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/default-ui": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@pagefind/default-ui/-/default-ui-1.3.0.tgz", + "integrity": "sha512-CGKT9ccd3+oRK6STXGgfH+m0DbOKayX6QGlq38TfE1ZfUcPc5+ulTuzDbZUnMo+bubsEOIypm4Pl2iEyzZ1cNg==", + "license": "MIT" + }, + "node_modules/@pagefind/linux-arm64": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.3.0.tgz", + "integrity": "sha512-8lsxNAiBRUk72JvetSBXs4WRpYrQrVJXjlRRnOL6UCdBN9Nlsz0t7hWstRk36+JqHpGWOKYiuHLzGYqYAqoOnQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/linux-x64": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.3.0.tgz", + "integrity": "sha512-hAvqdPJv7A20Ucb6FQGE6jhjqy+vZ6pf+s2tFMNtMBG+fzcdc91uTw7aP/1Vo5plD0dAOHwdxfkyw0ugal4kcQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/windows-x64": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.3.0.tgz", + "integrity": "sha512-BR1bIRWOMqkf8IoU576YDhij1Wd/Zf2kX/kCI0b2qzCKC8wcc2GQJaaRMCpzvCCrmliO4vtJ6RITp/AnoYUUmQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz", + "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz", + "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", + "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz", + "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz", + "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz", + "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz", + "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz", + "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz", + "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz", + "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz", + "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz", + "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz", + "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz", + "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz", + "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz", + "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz", + "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", + "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz", + "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz", + "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz", + "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz", + "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz", + "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz", + "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz", + "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.23.0.tgz", + "integrity": "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.23.0.tgz", + "integrity": "sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.4" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.23.0.tgz", + "integrity": "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.23.0.tgz", + "integrity": "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.23.0.tgz", + "integrity": "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.23.0" + } + }, + "node_modules/@shikijs/types": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.23.0.tgz", + "integrity": "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "license": "MIT" + }, + "node_modules/@types/linkify-it": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", + "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/markdown-it": { + "version": "12.2.3", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", + "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "license": "MIT" + }, + "node_modules/@types/nlcst": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/node": { + "version": "22.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", + "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", + "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", + "license": "ISC" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/adm-zip": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", + "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", + "license": "MIT", + "engines": { + "node": ">=12.0" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-iterate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", + "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/astro": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.18.1.tgz", + "integrity": "sha512-m4VWilWZ+Xt6NPoYzC4CgGZim/zQUO7WFL0RHCH0AiEavF1153iC3+me2atDvXpf/yX4PyGUeD8wZLq1cirT3g==", + "license": "MIT", + "dependencies": { + "@astrojs/compiler": "^2.13.0", + "@astrojs/internal-helpers": "0.7.6", + "@astrojs/markdown-remark": "6.3.11", + "@astrojs/telemetry": "3.3.0", + "@capsizecss/unpack": "^4.0.0", + "@oslojs/encoding": "^1.1.0", + "@rollup/pluginutils": "^5.3.0", + "acorn": "^8.15.0", + "aria-query": "^5.3.2", + "axobject-query": "^4.1.0", + "boxen": "8.0.1", + "ci-info": "^4.3.1", + "clsx": "^2.1.1", + "common-ancestor-path": "^1.0.1", + "cookie": "^1.1.1", + "cssesc": "^3.0.0", + "debug": "^4.4.3", + "deterministic-object-hash": "^2.0.2", + "devalue": "^5.6.2", + "diff": "^8.0.3", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "es-module-lexer": "^1.7.0", + "esbuild": "^0.27.3", + "estree-walker": "^3.0.3", + "flattie": "^1.1.1", + "fontace": "~0.4.0", + "github-slugger": "^2.0.0", + "html-escaper": "3.0.3", + "http-cache-semantics": "^4.2.0", + "import-meta-resolve": "^4.2.0", + "js-yaml": "^4.1.1", + "magic-string": "^0.30.21", + "magicast": "^0.5.1", + "mrmime": "^2.0.1", + "neotraverse": "^0.6.18", + "p-limit": "^6.2.0", + "p-queue": "^8.1.1", + "package-manager-detector": "^1.6.0", + "piccolore": "^0.1.3", + "picomatch": "^4.0.3", + "prompts": "^2.4.2", + "rehype": "^13.0.2", + "semver": "^7.7.3", + "shiki": "^3.21.0", + "smol-toml": "^1.6.0", + "svgo": "^4.0.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tsconfck": "^3.1.6", + "ultrahtml": "^1.6.0", + "unifont": "~0.7.3", + "unist-util-visit": "^5.0.0", + "unstorage": "^1.17.4", + "vfile": "^6.0.3", + "vite": "^6.4.1", + "vitefu": "^1.1.1", + "xxhash-wasm": "^1.1.0", + "yargs-parser": "^21.1.1", + "yocto-spinner": "^0.2.3", + "zod": "^3.25.76", + "zod-to-json-schema": "^3.25.1", + "zod-to-ts": "^1.2.0" + }, + "bin": { + "astro": "astro.js" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/astrodotbuild" + }, + "optionalDependencies": { + "sharp": "^0.34.0" + } + }, + "node_modules/astro-expressive-code": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.41.7.tgz", + "integrity": "sha512-hUpogGc6DdAd+I7pPXsctyYPRBJDK7Q7d06s4cyP0Vz3OcbziP3FNzN0jZci1BpCvLn9675DvS7B9ctKKX64JQ==", + "license": "MIT", + "dependencies": { + "rehype-expressive-code": "^0.41.7" + }, + "peerDependencies": { + "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta" + } + }, + "node_modules/astro-relative-links": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/astro-relative-links/-/astro-relative-links-0.4.2.tgz", + "integrity": "sha512-YXwnmZz47yxiIIxWR10LwpGlqvGTERJ7JWX2lFRINTg/sFaPkqTx9xNM50W1+9FNMMxtTn7C8YNW5yDVX33Vzw==", + "license": "MIT", + "dependencies": { + "glob": "^10.3.10" + }, + "peerDependencies": { + "astro": ">=3.0.0" + } + }, + "node_modules/astro/node_modules/@astrojs/internal-helpers": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.7.6.tgz", + "integrity": "sha512-GOle7smBWKfMSP8osUIGOlB5kaHdQLV3foCsf+5Q9Wsuu+C6Fs3Ez/ttXmhjZ1HkSgsogcM1RXSjjOVieHq16Q==", + "license": "MIT" + }, + "node_modules/astro/node_modules/@astrojs/markdown-remark": { + "version": "6.3.11", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.11.tgz", + "integrity": "sha512-hcaxX/5aC6lQgHeGh1i+aauvSwIT6cfyFjKWvExYSxUhZZBBdvCliOtu06gbQyhbe0pGJNoNmqNlQZ5zYUuIyQ==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.6", + "@astrojs/prism": "3.3.0", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-to-text": "^4.0.2", + "import-meta-resolve": "^4.2.0", + "js-yaml": "^4.1.1", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-smartypants": "^3.0.2", + "shiki": "^3.21.0", + "smol-toml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.2", + "vfile": "^6.0.3" + } + }, + "node_modules/astro/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/astro/node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/astro/node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base-64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz", + "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==", + "license": "MIT" + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bcp-47": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.0.tgz", + "integrity": "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-match": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", + "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^8.0.0", + "chalk": "^5.3.0", + "cli-boxes": "^3.0.0", + "string-width": "^7.2.0", + "type-fest": "^4.21.0", + "widest-line": "^5.0.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "license": "ISC" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cookie-es": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", + "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==", + "license": "MIT" + }, + "node_modules/corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crossws": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", + "license": "MIT", + "dependencies": { + "uncrypto": "^0.1.3" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-selector-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.3.0.tgz", + "integrity": "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/defu": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.6.tgz", + "integrity": "sha512-f8mefEW4WIVg4LckePx3mALjQSPQgFlg9U8yaPdlsbdYcHQyj9n2zL2LJEA52smeYxOvmd/nB7TpMtHGMTHcug==", + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/deterministic-object-hash": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/deterministic-object-hash/-/deterministic-object-hash-2.0.2.tgz", + "integrity": "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==", + "license": "MIT", + "dependencies": { + "base-64": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/devalue": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.4.tgz", + "integrity": "sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA==", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.3.tgz", + "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/direction": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/direction/-/direction-2.0.1.tgz", + "integrity": "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==", + "license": "MIT", + "bin": { + "direction": "cli.js" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dset": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "license": "MIT" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, + "node_modules/expressive-code": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/expressive-code/-/expressive-code-0.41.7.tgz", + "integrity": "sha512-2wZjC8OQ3TaVEMcBtYY4Va3lo6J+Ai9jf3d4dbhURMJcU4Pbqe6EcHe424MIZI0VHUA1bR6xdpoHYi3yxokWqA==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.7", + "@expressive-code/plugin-frames": "^0.41.7", + "@expressive-code/plugin-shiki": "^0.41.7", + "@expressive-code/plugin-text-markers": "^0.41.7" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/flattie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", + "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/fontace": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.4.1.tgz", + "integrity": "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.2" + } + }, + "node_modules/fontkitten": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fontkitten/-/fontkitten-1.0.2.tgz", + "integrity": "sha512-piJxbLnkD9Xcyi7dWJRnqszEURixe7CrF/efBfbffe2DPyabmuIuqraruY8cXTs19QoM8VJzx47BDRVNXETM7Q==", + "license": "MIT", + "dependencies": { + "tiny-inflate": "^1.0.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "license": "ISC" + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/h3": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.10.tgz", + "integrity": "sha512-YzJeWSkDZxAhvmp8dexjRK5hxziRO7I9m0N53WhvYL5NiWfkUkzssVzY9jvGu0HBoLFW6+duYmNSn6MaZBCCtg==", + "license": "MIT", + "dependencies": { + "cookie-es": "^1.2.2", + "crossws": "^0.3.5", + "defu": "^6.1.4", + "destr": "^2.0.5", + "iron-webcrypto": "^1.2.1", + "node-mock-http": "^1.0.4", + "radix3": "^1.1.2", + "ufo": "^1.6.3", + "uncrypto": "^0.1.3" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-embedded": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", + "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-format": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hast-util-format/-/hast-util-format-1.1.0.tgz", + "integrity": "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-minify-whitespace": "^1.0.0", + "hast-util-phrasing": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "html-whitespace-sensitive-tag-names": "^3.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.2.tgz", + "integrity": "sha512-SfMzfdAi/zAoZ1KkFEyyeXBn7u/ShQrfd675ZEE9M3qj+PMFX05xubzRyF76CCSJu8au9jgVxDV1+okFvgZU4A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^6.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-has-property": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", + "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-body-ok-link": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz", + "integrity": "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-minify-whitespace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz", + "integrity": "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-is-body-ok-link": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-select": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-6.0.4.tgz", + "integrity": "sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "bcp-47-match": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "css-selector-parser": "^3.0.0", + "devlop": "^1.0.0", + "direction": "^2.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-to-string": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "nth-check": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-select/node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree/node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html/node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-string": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.0.tgz", + "integrity": "sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-escaper": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-whitespace-sensitive-tag-names": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz", + "integrity": "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/htmlparser2": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-server": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", + "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-auth": "^2.0.1", + "chalk": "^4.1.2", + "corser": "^2.0.1", + "he": "^1.2.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy": "^1.18.1", + "mime": "^1.6.0", + "minimist": "^1.2.6", + "opener": "^1.5.1", + "portfinder": "^1.0.28", + "secure-compare": "3.0.1", + "union": "~0.5.0", + "url-join": "^4.0.1" + }, + "bin": { + "http-server": "bin/http-server" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/http-server/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/http-server/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/i18next": { + "version": "23.16.8", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.16.8.tgz", + "integrity": "sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT" + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", + "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "source-map-js": "^1.2.1" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-definitions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", + "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", + "integrity": "sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", + "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "license": "CC0-1.0" + }, + "node_modules/micromark": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz", + "integrity": "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.2.tgz", + "integrity": "sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", + "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", + "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.3.tgz", + "integrity": "sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", + "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neotraverse": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/nlcst-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "license": "MIT" + }, + "node_modules/node-mock-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz", + "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ofetch": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", + "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", + "license": "MIT", + "dependencies": { + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "license": "MIT" + }, + "node_modules/oniguruma-parser": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", + "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.4.tgz", + "integrity": "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.1", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/p-limit": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", + "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.1.tgz", + "integrity": "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "license": "MIT" + }, + "node_modules/pagefind": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.3.0.tgz", + "integrity": "sha512-8KPLGT5g9s+olKMRTU9LFekLizkVIu9tes90O1/aigJ0T5LmyPqTzGJrETnSw3meSYg58YH7JTzhTTW/3z6VAw==", + "license": "MIT", + "bin": { + "pagefind": "lib/runner/bin.cjs" + }, + "optionalDependencies": { + "@pagefind/darwin-arm64": "1.3.0", + "@pagefind/darwin-x64": "1.3.0", + "@pagefind/linux-arm64": "1.3.0", + "@pagefind/linux-x64": "1.3.0", + "@pagefind/windows-x64": "1.3.0" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-latin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", + "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "@types/unist": "^3.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-modify-children": "^4.0.0", + "unist-util-visit-children": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "license": "MIT", + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/piccolore": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", + "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==", + "license": "ISC" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/portfinder": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.38.tgz", + "integrity": "sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^3.2.6", + "debug": "^4.3.6" + }, + "engines": { + "node": ">= 10.12" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, + "node_modules/rehype": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", + "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-expressive-code": { + "version": "0.41.7", + "resolved": "https://registry.npmjs.org/rehype-expressive-code/-/rehype-expressive-code-0.41.7.tgz", + "integrity": "sha512-25f8ZMSF1d9CMscX7Cft0TSQIqdwjce2gDOvQ+d/w0FovsMwrSt3ODP4P3Z7wO1jsIJ4eYyaDRnIR/27bd/EMQ==", + "license": "MIT", + "dependencies": { + "expressive-code": "^0.41.7" + } + }, + "node_modules/rehype-format": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rehype-format/-/rehype-format-5.0.1.tgz", + "integrity": "sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-format": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.0.tgz", + "integrity": "sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-smartypants": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.2.tgz", + "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==", + "license": "MIT", + "dependencies": { + "retext": "^9.0.0", + "retext-smartypants": "^6.0.0", + "unified": "^11.0.4", + "unist-util-visit": "^5.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/retext": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", + "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "retext-latin": "^4.0.0", + "retext-stringify": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz", + "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "parse-latin": "^7.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", + "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-stringify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz", + "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rollup": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz", + "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.1", + "@rollup/rollup-android-arm64": "4.60.1", + "@rollup/rollup-darwin-arm64": "4.60.1", + "@rollup/rollup-darwin-x64": "4.60.1", + "@rollup/rollup-freebsd-arm64": "4.60.1", + "@rollup/rollup-freebsd-x64": "4.60.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", + "@rollup/rollup-linux-arm-musleabihf": "4.60.1", + "@rollup/rollup-linux-arm64-gnu": "4.60.1", + "@rollup/rollup-linux-arm64-musl": "4.60.1", + "@rollup/rollup-linux-loong64-gnu": "4.60.1", + "@rollup/rollup-linux-loong64-musl": "4.60.1", + "@rollup/rollup-linux-ppc64-gnu": "4.60.1", + "@rollup/rollup-linux-ppc64-musl": "4.60.1", + "@rollup/rollup-linux-riscv64-gnu": "4.60.1", + "@rollup/rollup-linux-riscv64-musl": "4.60.1", + "@rollup/rollup-linux-s390x-gnu": "4.60.1", + "@rollup/rollup-linux-x64-gnu": "4.60.1", + "@rollup/rollup-linux-x64-musl": "4.60.1", + "@rollup/rollup-openbsd-x64": "4.60.1", + "@rollup/rollup-openharmony-arm64": "4.60.1", + "@rollup/rollup-win32-arm64-msvc": "4.60.1", + "@rollup/rollup-win32-ia32-msvc": "4.60.1", + "@rollup/rollup-win32-x64-gnu": "4.60.1", + "@rollup/rollup-win32-x64-msvc": "4.60.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/secure-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", + "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shiki": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.23.0.tgz", + "integrity": "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.23.0", + "@shikijs/engine-javascript": "3.23.0", + "@shikijs/engine-oniguruma": "3.23.0", + "@shikijs/langs": "3.23.0", + "@shikijs/themes": "3.23.0", + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-8.0.3.tgz", + "integrity": "sha512-9Ew1tR2WYw8RGE2XLy7GjkusvYXy8Rg6y8TYuBuQMfIEdGcWoJpY2Wr5DzsEiL/TKCw56+YKTCCUHglorEYK+A==", + "license": "MIT", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.4.1" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=6.0.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "license": "MIT" + }, + "node_modules/smol-toml": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.1.tgz", + "integrity": "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stream-replace-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stream-replace-string/-/stream-replace-string-2.0.0.tgz", + "integrity": "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==", + "license": "MIT" + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/svgo": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz", + "integrity": "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==", + "license": "MIT", + "dependencies": { + "commander": "^11.1.0", + "css-select": "^5.1.0", + "css-tree": "^3.0.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.1.1", + "sax": "^1.5.0" + }, + "bin": { + "svgo": "bin/svgo.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tsconfck": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "node_modules/type-fest": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.31.0.tgz", + "integrity": "sha512-yCxltHW07Nkhv/1F6wWBr8kz+5BGMfP+RbRSYFnegVb0qV/UMT0G0ElBloPVerqn4M2ZV80Ir1FtCcYv1cT6vQ==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "license": "MIT" + }, + "node_modules/ultrahtml": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.6.0.tgz", + "integrity": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==", + "license": "MIT" + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unifont": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.4.tgz", + "integrity": "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==", + "license": "MIT", + "dependencies": { + "css-tree": "^3.1.0", + "ofetch": "^1.5.1", + "ohash": "^2.0.11" + } + }, + "node_modules/union": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", + "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", + "dev": true, + "dependencies": { + "qs": "^6.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/unist-util-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-modify-children": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz", + "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "array-iterate": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-children": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz", + "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unstorage": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.4.tgz", + "integrity": "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==", + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^5.0.0", + "destr": "^2.0.5", + "h3": "^1.15.5", + "lru-cache": "^11.2.0", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.1", + "ufo": "^1.6.3" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6 || ^7 || ^8", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1 || ^2 || ^3", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/unstorage/node_modules/lru-cache": { + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true, + "license": "MIT" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.2.tgz", + "integrity": "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", + "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-pm-runs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", + "license": "MIT", + "dependencies": { + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/xxhash-wasm": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", + "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", + "license": "MIT" + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yocto-spinner": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/yocto-spinner/-/yocto-spinner-0.2.3.tgz", + "integrity": "sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==", + "license": "MIT", + "dependencies": { + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18.19" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", + "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25 || ^4" + } + }, + "node_modules/zod-to-ts": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zod-to-ts/-/zod-to-ts-1.2.0.tgz", + "integrity": "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==", + "peerDependencies": { + "typescript": "^4.9.4 || ^5.0.2", + "zod": "^3" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/package.json b/tutorials/vonage_video_ios_app-theme-customization/package.json new file mode 100644 index 00000000..30533aa2 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/package.json @@ -0,0 +1,27 @@ +{ + "name": "@example/starlight-basics", + "type": "module", + "version": "0.0.1", + "private": true, + "scripts": { + "dev": "node download-toolbar.js && astro dev", + "start": "node download-toolbar.js && astro dev", + "build": "astro build", + "preview": "astro preview", + "astro": "astro", + "start:tutorial": "http-server steps -p 1234 --cors -c-1", + "postinstall": "cd project && yarn" + }, + "dependencies": { + "@astrojs/markdoc": "^0.15.10", + "@astrojs/starlight": "^0.37.6", + "@astrojs/starlight-markdoc": "^0.5.1", + "adm-zip": "^0.5.16", + "astro": "^5.18.1", + "astro-relative-links": "^0.4.2", + "sharp": "^0.33.0" + }, + "devDependencies": { + "http-server": "^14.1.1" + } +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.clinerules b/tutorials/vonage_video_ios_app-theme-customization/project/.clinerules new file mode 120000 index 00000000..02dd1341 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.clinerules @@ -0,0 +1 @@ +.github/copilot-instructions.md \ No newline at end of file diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.cursorrules b/tutorials/vonage_video_ios_app-theme-customization/project/.cursorrules new file mode 120000 index 00000000..02dd1341 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.cursorrules @@ -0,0 +1 @@ +.github/copilot-instructions.md \ No newline at end of file diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.eslintignore b/tutorials/vonage_video_ios_app-theme-customization/project/.eslintignore new file mode 100644 index 00000000..4769bc38 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.eslintignore @@ -0,0 +1,15 @@ +# some individual files +.eslintrc.js +*.json +*.md +*.config.ts +*.config.js + +# some directories +*/dist/ +*/node_modules/ +public/js/ +frontend/docs/ + +# dependency generator +scripts/* diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.eslintrc-filenames b/tutorials/vonage_video_ios_app-theme-customization/project/.eslintrc-filenames new file mode 100644 index 00000000..fe0fe201 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.eslintrc-filenames @@ -0,0 +1,14 @@ +{ + "plugins": [ + "filename-rules" + ], + "rules": { + "filename-rules/match": [ + 2, + { + ".ts": "camelCase", + ".tsx": "camelCase" + } + ] + } +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.github/ISSUE_TEMPLATE/1-bug-report.yml b/tutorials/vonage_video_ios_app-theme-customization/project/.github/ISSUE_TEMPLATE/1-bug-report.yml new file mode 100644 index 00000000..1d680e03 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.github/ISSUE_TEMPLATE/1-bug-report.yml @@ -0,0 +1,72 @@ +name: Bug Report +description: File a bug report. +title: '[Bug]: ' +labels: ['bug', 'triage'] +body: + - type: checkboxes + id: known-issue + attributes: + label: Is this a known issue? + description: Please search through our [Known Issues](../../docs/KNOWN_ISSUES.md) to see if this bug has been reported. + options: + - label: I have searched the existing issues + required: true + + - type: textarea + id: description + attributes: + label: Describe the bug + description: Please include relevant screenshots + value: 'A wild bug appeared!' + validations: + required: true + + - type: textarea + id: expected-behavior + attributes: + label: Describe the expected behavior + value: 'I would expect...' + validations: + required: true + + - type: textarea + id: to-reproduce + attributes: + label: Include steps to reproduce + value: 'Steps to reproduce:' + validations: + required: true + + - type: dropdown + id: platforms + attributes: + label: What platforms are you seeing the problem on? + multiple: true + options: + - Chrome + - Firefox + - Microsoft Edge + - Opera + - Safari + + - type: textarea + id: logs + attributes: + label: Relevant log output + description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. + render: shell + + - type: input + id: session-id + attributes: + label: Session ID + placeholder: 1_abc123def456-fn4 + + - type: checkboxes + id: terms + attributes: + label: Code of Conduct + description: By submitting this issue, you agree to follow our [Code of Conduct](../../CODE_OF_CONDUCT.md). + options: + - label: I agree to follow this project's Code of Conduct + required: true diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.github/ISSUE_TEMPLATE/2-feature-request.yml b/tutorials/vonage_video_ios_app-theme-customization/project/.github/ISSUE_TEMPLATE/2-feature-request.yml new file mode 100644 index 00000000..8539fa91 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.github/ISSUE_TEMPLATE/2-feature-request.yml @@ -0,0 +1,31 @@ +name: Feature Request +description: File a feature request. +title: '[Feature Request]: ' +labels: ['enhancement', 'triage'] +body: + - type: checkboxes + id: known-request + attributes: + label: Is this a known issue? + description: Please search through our [Known Issues](../../docs/KNOWN_ISSUES.md) to see if this feature has been requested. + options: + - label: I have searched the existing issues + required: true + + - type: textarea + id: description + attributes: + label: Describe the feature request + description: Please include relevant mockup images + value: 'I would like to see...' + validations: + required: true + + - type: checkboxes + id: terms + attributes: + label: Code of Conduct + description: By submitting this issue, you agree to follow our [Code of Conduct](../../CODE_OF_CONDUCT.md). + options: + - label: I agree to follow this project's Code of Conduct + required: true diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.github/ISSUE_TEMPLATE/config.yml b/tutorials/vonage_video_ios_app-theme-customization/project/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..d6085307 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Need help with running Vonage Video API React Application? + url: https://api.support.vonage.com/hc/en-us + about: Check out our support page. diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.github/actions/deploy-vcr/action.yml b/tutorials/vonage_video_ios_app-theme-customization/project/.github/actions/deploy-vcr/action.yml new file mode 100644 index 00000000..fa83fb69 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.github/actions/deploy-vcr/action.yml @@ -0,0 +1,57 @@ +name: Deploy to VCR +description: Deploys the application to Vonage Cloud Runtime + +inputs: + app-id: + description: VCR application ID + required: true + api-key: + description: VCR API key + required: true + api-secret: + description: VCR API secret + required: true + filename: + description: VCR config filename to deploy with + required: true + +outputs: + instance-url: + description: The deployed instance URL (if available) + value: ${{ steps.deploy.outputs.instance_url }} + +runs: + using: composite + steps: + - name: Deploy to VCR + id: deploy + shell: bash + env: + APP_ID: ${{ inputs.app-id }} + VCR_API_KEY: ${{ inputs.api-key }} + VCR_API_SECRET: ${{ inputs.api-secret }} + VCR_FILENAME: ${{ inputs.filename }} + run: | + cd backend/dist + + vcr deploy \ + --filename "$VCR_FILENAME" \ + --app-id "$APP_ID" \ + --api-key "$VCR_API_KEY" \ + --api-secret "$VCR_API_SECRET" \ + --region aws.euw1 \ + --graphql-endpoint https://graphql.euw1.runtime.vonage.cloud/v1/graphql \ + --timeout=15m \ + 2>&1 | tee deploy-vcr-logs.log + + if ! grep -Fxq '| Instance has been deployed!' deploy-vcr-logs.log ; then + echo "Deployment failed" + exit 1 + fi + + INSTANCE_URL=$(grep -oE 'https://[^ ]+' deploy-vcr-logs.log | tail -1 | sed -r 's/\x1B\[[0-9;]*[mK]//g') + if [ -z "$INSTANCE_URL" ]; then + echo "Failed to extract instance URL from deploy logs" + exit 1 + fi + echo "instance_url=${INSTANCE_URL}" >> "$GITHUB_OUTPUT" diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.github/actions/install-vcr-cli/action.yml b/tutorials/vonage_video_ios_app-theme-customization/project/.github/actions/install-vcr-cli/action.yml new file mode 100644 index 00000000..265f41c5 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.github/actions/install-vcr-cli/action.yml @@ -0,0 +1,13 @@ +name: Install VCR CLI +description: Downloads and installs the Vonage Cloud Runtime CLI + +runs: + using: composite + steps: + - name: Install VCR CLI + shell: bash + run: | + set -euo pipefail + curl --proto =https --max-redirs 0 -fsSL https://raw.githubusercontent.com/Vonage/cloud-runtime-cli/main/script/install.sh -o install.sh + sudo bash install.sh + vcr -v diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.github/actions/slack-notify/action.yml b/tutorials/vonage_video_ios_app-theme-customization/project/.github/actions/slack-notify/action.yml new file mode 100644 index 00000000..875f532b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.github/actions/slack-notify/action.yml @@ -0,0 +1,33 @@ +name: Slack Notification +description: Sends a Slack notification to the CI channel + +inputs: + slack-bot-token: + description: Slack bot token for authentication + required: true + color: + description: Attachment color hex code (e.g. 28a745 for green, FF0000 for red, FFA500 for orange) + required: true + message: + description: The attachment text content (supports Slack markdown) + required: true + +runs: + using: composite + steps: + - name: Send Slack notification + uses: slackapi/slack-github-action@70cd7be8e40a46e8b0eced40b0de447bdb42f68e # v1.26.0 + with: + channel-id: '#video-solutions-ci-notifications' + payload: | + { + "text": "Vera Deployment GHA Job", + "attachments": [ + { + "color": ${{ toJson(inputs.color) }}, + "text": ${{ toJson(inputs.message) }} + } + ] + } + env: + SLACK_BOT_TOKEN: ${{ inputs.slack-bot-token }} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.github/copilot-instructions.md b/tutorials/vonage_video_ios_app-theme-customization/project/.github/copilot-instructions.md new file mode 100644 index 00000000..d2522d97 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.github/copilot-instructions.md @@ -0,0 +1,1660 @@ + +# Instruction + +All rules in this document should be treated as strict coding and architectural requirements for this repository. +When generating or editing code, always choose the option that is consistent with these rules. +When reviewing code, Copilot must also evaluate changes according to these rules and suggest corrections whenever the submitted code violates any of them. + +# Repository Overview + +- **Rule:** Vera is a video call application built with Vonage Video API and is being transformed into a reusable component library for Vonage Video API React SDK users. +- **Rule:** Video components, hooks, and primitives must be extracted into `libs/ui` and `libs/core`. +- **Rule:** Backend-agnostic Vonage Video API handler logic must live in `libs/api`. +- **Rule:** New features must be designed with **reusability** in mind and must remain **agnostic of Vera** wherever possible. + +--- + +# Project Architecture & Libraries + +This is a mono repo containing: + +- Libs: `ui`, `core`, `common`, `api` +- Main projects: `frontend`, `backend` +- `integration-test` + +--- + +# Technology Stack + +- Frontend: React, TypeScript, MUI, react-router-dom, axios +- Backend: Node.js, TypeScript, Express +- Integration tests: Playwright, TypeScript +- libs/ui: React, TypeScript, MUI +- libs/core: React, TypeScript +- libs/common: React, TypeScript + +React version: `^19.2` +TypeScript version: `^5.8.3` + +--- + +# General Development Guidelines, Import Rules + +## Library and feature placement + +- **Rule:** If a component is completely stateless and generic, it must be placed in: + - `libs/ui` for visual components + - `libs/core` if it is faceless (non-visual logic). + - `libs/common` for helpers, utilities, and hooks that are agnostic of the project. +- **Rule:** If the code is **backend-oriented** and represents **agnostic Vonage Video API orchestration**, it must be placed in `libs/api`. +- **Rule:** Vera-specific business logic (roles, permissions, product policy/decisions) must stay in the app layer (`frontend`/`backend`). +- **Rule:** This is **especially enforced** for video-related components such as publishers, subscribers, sessions, `videoView`s, etc. +- **Rule:** Helpers, utilities, and hooks that are agnostic of the project must be placed in `libs/common`. +- **Rule:** Logic that is shared between different projects (**frontend**, **backend**, **libs**) should be proposed for `libs/common`. +- **Rule:** Do not add new dependencies. Use only the installed dependencies. +- **Rule:** Do not add new state management libraries. Use only existing tooling. +- **Rule:** Components must be kept small, focused, and composable. + +## Testing Guidelines + +- **Rule:** Avoid overtesting. Simple helpers should be covered by only a couple of high-value use cases. +- **Rule:** Prefer tests that validate real functionality and behavior over redundant input permutations. + +--- + +# Coding Style & Programming Patterns + +- **Rule:** Prefer early returns / fast-fail to reduce nesting. +- **Rule:** Prefer **linear code** whenever possible. +- **Rule:** Prefer IIFE (Immediately Invoked Function Expression) for computing values linearly instead of branching assignments. + +**Violation:** + +```tsx +// Bad +let url = ''; + +if (condition1) { + url = 'value1'; +} else { + if (condition2) { + url = 'value2'; + } else { + url = 'value3'; + } +} + +this.API_URL = url; +``` + +**Correct:** + +```tsx +// Good +const url = (() => { + if (condition1) return 'value1'; + if (condition2) return 'value2'; + return 'value3'; +})(); + +this.API_URL = url; +``` + +- **Rule:** Use named boolean expressions or named helper functions for complex boolean conditions. + +**Violation:** + +```tsx +// Bad +if (user.isAdmin && user.isActive && hasValidSubscription(user)) { + // ... +} +``` + +**Correct:** + +```tsx +// Good +const isUserEligible = + user.isAdmin && user.isActive && hasValidSubscription(user); + +if (isUserEligible) { + // ... +} +``` + +**Correct (extracted helper):** + +```tsx +// Good +if (isUserEligible(user)) { + // ... +} +``` + +**Correct (simple null check):** + +```tsx +// Good +if (isNil(data)) return; +``` + +- **Rule:** Abbreviated or shortened names are banned across the codebase, except `req` and `res` when working with Express `Request` and `Response`. +- **Rule:** Use fully descriptive names, even if they are longer. Minification handles bundle size. + +**Violation:** + +```tsx +// Bad: abbreviating "User Details" to "UsrDtls" +function fetchUsrDtls() { + // ... +} +``` + +**Correct:** + +```tsx +// Good: fully spelled out words +function fetchUserDetails() { + // ... +} +``` + +**Violation:** + +```tsx +// Bad: abbreviating "VideoClient" to "vc" +const vc = new VideoClient(); +``` + +**Correct:** + +```tsx +// Good: fully spelled out variable name +const videoClient = new VonageVideoClient(); +``` + +- **Rule:** Prefer linear `tryCatch` helpers instead of nested `try/catch`. +- **Rule:** Nested `try/catch` blocks are banned. + +**Violation:** + +```tsx +// Bad +const ValidateRequest = async (req) => { + const validator = new RequestValidator(); + + let error = null; + let data = null; + + // nested try/catch just make the code messy and hard to read + try { + data = parseRequest(req.body); + } catch (error) { + error = error; + } + + if(error || !data) { + validator.addError(error?.message || 'Unknown parsing error'); + } + + // this is okay + validator.assert(); +}; +``` + +**Correct:** + +```tsx +// Good +import tryCatch from '@common/execution/tryCatch'; + +const myFunction = async () => { + const { result: data, error } = await tryCatch(() => fetchData()); + + if (error) { + console.error('Error fetching data:', error); + return defaultValue; + }; + + return data; +}; +``` + +## Type modeling & correctness + +- **Rule:** Prefer `named parameters` for functions with 2+ parameters or parameters of the same type. + +**Violation:** + +```tsx +// Bad +function createUser(name: string, age: number, isAdmin: boolean) { + // ... +} + +// Call site is hard to read, what does true mean? +createUser('Alice', 30, true); +``` + +**Correct:** + +```tsx +// Good +function createUser(args: { name: string; age: number; isAdmin: boolean }) { + // ... +} + +// Call site is clear and readable +createUser({ name: 'Alice', age: 30, isAdmin: true }); +``` +- **Rule:** Prefer type conjunctions (unions/intersections) over optional properties. + +**Violation:** + +```tsx +// Bad +type PaymentMethod = { + methodType: 'card' | 'bankTransfer' | 'cash'; + + // card-specific + cardNumber?: string; + cardExpiryMonth?: number; + cardExpiryYear?: number; + + // bank-transfer-specific + IBAN?: string; + + // cash-specific + cashReceivedByEmployeeId?: string; +}; + +const charge = (paymentMethod: PaymentMethod): Promise; + +// everything is optional, there is not type safety +charge({ + methodType: 'card', +}); +``` + +**Correct:** + +```tsx +type MethodType = 'card' | 'paypal' | 'bank_transfer'; + +type BasePaymentMethod = { + methodType: M; +}; + +type CardPaymentMethod = BasePaymentMethod<'card'> & { + methodType: 'card'; + cardNumber: string; + cardExpiryMonth: number; + cardExpiryYear: number; +}; + +type PayPalPaymentMethod = BasePaymentMethod<'paypal'> & { + methodType: 'paypal'; + email: string; +}; + +type BankTransferPaymentMethod = BasePaymentMethod<'bank_transfer'> & { + methodType: 'bank_transfer'; + accountNumber: string; + routingNumber: string; +}; + +type PaymentMethod = CardPaymentMethod | PayPalPaymentMethod | BankTransferPaymentMethod; + +const charge = (paymentMethod: PaymentMethod): Promise; + +charge({ + methodType: 'card', +}); // Error: missing cardNumber, cardExpiryMonth, cardExpiryYear + +charge({ + methodType: 'card', + cardNumber: '1234567890123456', + cardExpiryMonth: 12, + cardExpiryYear: 2025, +}); // OK + +charge({ + methodType: 'paypal', + email: 'john@some.com', + routingNumber: '123456', +}); // Error: routingNumber is not valid for PayPal +``` + +- **Rule:** Always use `type` for type-only imports. + +**Violation:** + +```tsx +// Bad +import { User } from './types'; +``` + +**Correct:** + +```tsx +// Good +import type { User } from './types'; // this will not be included in the compiled JS +``` + +- **Rule:** Prefer `type` over `interface` for type definitions. + +**Violation:** + +```tsx +// Bad +interface User { + id: string; + name: string; +} +``` + +**Correct:** + +```tsx +// Good +type User = { + id: string; + name: string; +}; + +// Good: This is okay since function overloads are not supported in the same way with `type`. +// Using a union of function types is not equivalent and is usually less readable with worse IntelliSense/error messages. +interface Select { + (callback: (state: State) => Selected): Selected; + + (callback: (state: State) => Selected, transformer: (selected: Selected) => Result): Result; +} + +// Good: This is an actual interface intend to be implemented by classes. +interface ILogger { + log(message: string): void; + error(message: string): void; +} +``` + +- **Rule:** Ban string IDs... Always prefer to use branded types for identifiers. + +**Violation:** + +```tsx +// Bad +type User = { + id: string; // string ID is not type-safe + name: string; +}; +``` + +**Correct:** + +```tsx +declare const _brand: unique symbol; + +// Good +type UserId = string & { [__brand]: 'UserId' }; + +type User = { + id: UserId; // branded type ID is type-safe + name: string; +}; + +// Even Better +// This allows us to run-time validate ids +type UserId = `user:${string}` & { [__brand]: 'UserId' }; + +// Good +// If the brand is duplicated across different entities use symbols +declare const UserIdBrand: unique symbol; + +// Try to avoid duplicating prefixes and brands but if necessary use symbols +type UserId = `user:${string}` & { [__brand]: typeof UserIdBrand }; +``` +--- + +# Folder and File Structure + +We use a **domain-driven** folder structure. + +- **Rule:** Each feature/domain must live in its own folder and contain all related components, hooks, utils, types, etc. +- **Rule:** Generic "global" buckets like `components/`, `hooks/`, `utils/` at the top are discouraged as a catch-all for unrelated features. + +**Violation:** + +```plaintext +// Bad + +src/ + components/ + Header.tsx + Footer.tsx + UserProfile.tsx + hooks/ + useAuth.ts + useFetchData.ts + utils/ + formatDate.ts + calculateAge.ts +``` + +**Correct:** + +```plaintext +// Good + +src/ + components/ + Banner/ + index.ts + Banner.tsx + Banner.test.tsx + Separator/ + index.ts + Separator.tsx + Separator.test.tsx + features/ + Auth/ + components/ + LoginForm/ + components/ + UsernameInput.tsx + PasswordInput.tsx + hooks/ + useLogin.ts + helpers/ + validateCredentials.ts + index.ts + LoginForm.tsx + LoginForm.test.tsx +``` + +- **Rule:** Each domain may contain its own components, hooks, utils, types, etc. related strictly to that domain/feature. +- **Rule:** Do not overexpose components/helpers/utils/hooks/types to higher levels when they are only useful for a specific domain. +- **Rule:** Only promote an entity to a higher level when strictly necessary. +- **Rule:** When possible, each domain should have an `index.ts` that exports the default entry point of that domain (example: `LoginForm/index.ts` exporting `LoginForm.tsx`). + +--- + +# Single-Responsibility Principle & File Organization + +- **Rule:** Files must have a single responsibility. Each file should contain exactly one component, hook, util, type, etc. +- **Rule:** Test files are an exception. They can group multiple tests or small helpers for the thing being tested. + +**Violation:** + +```tsx +/** +* Bad +* src/helpers/utils.ts +*/ + +export const formatDate = (date: Date): string; +export const calculateAge = (birthDate: Date): number; +export const isAdult = (age: number): boolean; +// etc... +``` + +**Correct (split into multiple files):** + +```tsx +/** +* Good +* src/helpers/formatDate.ts +*/ +export const formatDate = (date: Date): string; + +/** +* Good +* src/helpers/calculateAge.ts +*/ +export const calculateAge = (birthDate: Date): number; + +/** +* Good +* src/helpers/isAdult/ +* isAdult.ts +* isAdult.test.ts +*/ +``` + +- **Rule:** The default export of a file should be visible at first glance when opening the file. +- **Rule:** A file may contain a small number of internal helpers, but: + - They should be declared as **function expressions** (not hoisted arrow functions) to keep linting and hoisting behavior predictable. + - If there are more than 2 helpers, prefer splitting them into separate files inside the same domain/feature folder. + +**Violation:** + +```tsx +// Bad +// hooks/useComplexLogic.ts + +// helpers are preventing use to see the main export at first glance +const helper1 = () => { ... }; + +const helper2 = () => { ... }; + +// too many helpers in the same file, this is probably a big file that is hard to understand and maintain +const helper3 = () => { ... }; + +const useComplexLogic = () => { + // complex logic using helpers +}; + +export default useComplexLogic; +``` + +**Correct (helpers inline but minimal):** + +```tsx +// Good +// hooks/useComplexLogic/ +// useComplexLogic.ts + +// Main export is visible at first glance +const useComplexLogic = () => { + // complex logic using helpers +}; + +// small reusable helper inside the same file, useful to increase readability or semantics +// this helpers is too specialized to be reused outside this file +function helper1() { ... } + +export default useComplexLogic; +``` + +**Correct (helpers split out):** + +```tsx +// Good +// hooks/useComplexLogic/ +// useComplexLogic.ts +import helper1 from './helpers/helper1'; +import useSomething from './hooks/useSomething'; + +const useComplexLogic = () => { + // complex logic using helpers/hooks +}; + +export default useComplexLogic; +``` + +--- + +# React Component Guidelines + +This section defines explicit rules for how components and styling with CSS/MUI/Tailwind must be written. + +--- + +# Component Types & Reusability Rules + +- **Rule:** Reusable components must be: + - Generic + - Stateless (or at least UI-focused and not tied to a specific screen) + - Agnostic of any specific app/screen + - Located in `libs/ui` or `libs/common` +- **Rule:** Screen-specific components must be located in `frontend` or `backend`. + +**Correct reusable logic example:** + +```tsx +const publisherRef = useStableRef(() => { + return new OT.Publisher(...); +}, []); +// useStableRef is agnostic of any specific screen or app, so it can be reused anywhere. Candidate for libs/common +``` + +```tsx +const { result, error } = await tryCatch(() => fetchDataFromApi()); +// tryCatch is agnostic of any specific screen or app, so it can be reused anywhere. Candidate for libs/common +``` + +**Correct reusable UI example (libs/ui):** + +```tsx +// Reusable UI component candidate (libs/ui) +export const Dialog = ({ children }) => { + ... + return ( +

        + {children} + + ); +} +// A dialog is agnostic of any specific screen or app, so it can be reused anywhere. +``` + +**Correct screen-specific example (frontend):** + +```tsx +// Welcome page for the frontend app (frontend) +export const WelcomePager = () => { + return ( + + + + + ); +} +// The WelcomePager, Banner, WelcomeForm, PageLayout are specific to the frontend app and not reusable as generic components. +``` + +**Correct reusable UI example:** + +```tsx +export const RadioButton = ({ selected, onSelect, label }) => { + ... + return ( + + ); +} +// A RadioButton is a reusable UI component that can be used in multiple places. +``` + +**Correct domain-specific example (stays in frontend):** + +```tsx +// Form which uses RadioButton (frontend) +export const SurveyForm = () => { + ... + return ( +
        + + + + ); +} +// The SurveyForm is too specific, it can be reuse in certain domain but is not generic enough to be a reusable UI component. +``` + +--- + +# Async Logic & Suspense Usage Rules + +- **Rule:** `setState` + `useEffect` patterns should be rather used and strongly justified. Prefer linear non reactive code. +- **Rule:** Native `React.Suspense` and `React.use` must not be used directly. + Only `SuspenseBoundary` and `use$` which are boundary aware. +- **Rule:** Asynchronous operations must be handle gracefully, consider using skeletons or placeholders instead of spinners or loading indicators. Take also advantage of tools like `Suspense` and `useSuspenseMemo`. +- **Rule:** `use$` must only be used inside a `SuspenseBoundary` boundary; by design it will throw an explicit error otherwise. + +**Violation (async with state/effect):** + +```tsx +// Bad: using useEffect and setState for async operations +// the component is actually rendering event when data is not ready yet, this could cause flickering, unnecessary re-renders and inconsistent states, make the code harder to read and maintain +const MyComponent = () => { + const [data, setData] = useState(null); + + useEffect(() => { + fetchData().then((result) => setData(result)) + }, []); + + // Super Bad: Conditional rendering root element + if (!data) { + return
        Loading...
        ; + } + + // potentially need to validate nulls everywhere + return
          + {data?.map((item) => ( +
        • {item.name}
        • + ))} +
        ; +}; +``` + +**Correct (use$ and Suspense-aware pattern):** + +```tsx +// Good: uses Vera use$ hook and Suspense$ component for async operations +import use$ from '@ui/suspense/use$'; + +const fetchData = axios.get('https://some-api.com/data'); + +const MyComponent = () => { + // data is the awaited result of fetchData promise + // use$ is aware of the suspense context so it will throw if used outside a Suspense$ boundary + const data = use$(fetchData); + + return
          + {data.map((item) => ( +
        • {item.name}
        • + ))} +
        ; +}; +``` + +**Correct (useSuspenseMemo):** + +```tsx +// Good +import useSuspenseMemo from '@ui/suspense/useSuspenseMemo'; + +const MyComponent = () => { + // execute fetch data only once when the component is first rendered + const data = useSuspenseMemo(() => fetchData(), []); + + // Data is typed as the awaited result of fetchData promise, no need to validate nulls + return
          + {data.map((item) => ( +
        • {item.name}
        • + ))} +
        ; +}; +``` + +**Correct (combining nullable data and Suspense memo):** + +```tsx +// Good +import useSuspenseMemo from '@ui/suspense/useSuspenseMemo'; + +const MyComponent = () => { + const { data: nullableData, fetchData } = useSomeContext(); // data could be null + + // if data was already in place there it can be returning directly preventing unnecessary suspense + const data = useSuspenseMemo(() => { + if (isNil(nullableData)) return fetchData(); + return nullableData; + }, []); + + // Data is typed as the awaited result of fetchData promise, no need to validate nulls + return
          + {data.map((item) => ( +
        • {item.name}
        • + ))} +
        ; +}; +``` + +**Correct parent usage:** + +```tsx +// Parent component +import Suspense$ from '@ui/suspense/Suspense$'; + +const ParentComponent = () => { + return ( + // prefer skeleton instead of loading indicators/spinners +
        + ... + }> + + +
        + ); +}; +``` + +--- + +# React Context Guidelines + +- **Rule:** Do not create highly volatile contexts that change frequently and cause unnecessary re-renders. +- **Rule:** Context state should either: + - be stable enough that you do not need fine-grained granularity, or + - be granular enough that consumers can subscribe to specific portions of the state. +- **Rule:** Context APIs must not be reactive highly reactive. They should not re-render consumers unnecessarily. + +**Violation (manual React context for simple use case):** + +```tsx +// Bad creating unnecessary boilerplate for simple context +// dialogContext.tsx +import React, { useState, useCallback, useContext } from 'react'; + +// React plain context should start with null as default value to avoid misleading consumers +// So context cannot infer the type automatically +type DialogContextType = { + isOpen: boolean; + openDialog: () => void; + closeDialog: () => void; +}; + +const DialogContext = React.createContext(undefined); + +// Prefer not to use this kind of provider which mixes state and actions together +export const DialogProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { + const [isOpen, setIsOpen] = useState(false); + + const openDialog = useCallback(() => { + setIsOpen(true); + }, []); + + const closeDialog = useCallback(() => { + setIsOpen(false); + }, []); + + return ( + + {children} + + ); +}; + +export const useDialog = (): DialogContextType => { + const context = useContext(DialogContext); + if (!context) { + throw new Error('useDialog must be used within a DialogProvider'); + } + return context; +}; +``` + +**Correct (using react-global-state-hooks):** + +```tsx +// Good: prefer use react-global-state-hooks/createContext to create simple contexts +import createContext from 'react-global-state-hooks/createContext'; + +// state and actions are separated so consumer can choose which portion of the context to subscribe to +export const dialog$ = createContext({ + isOpen: false, +}, { + actions: { + open() { + return ({ setState }) => { + // prefer use delta updates in case the state becomes bigger in the future + setState((state) => ({ ...state, isOpen: true })); + }; + }, + close() { + return ({ setState }) => { + setState((state) => ({ ...state, isOpen: false })); + }; + }, + }, +}); + +export default dialog$; + +// Provider component is automatically created + + {children} + +``` + +**Violation (mixed state and actions, no granularity):** + +```tsx +// Bad creating react context with several problems + +// state and actions are mixed so consumer cannot manipulate the context without subscribing to the whole state changes +// consumer cannot choose which portion of the context to subscribe to +const publisherContext = React.createContext<{ + publisher: OT.Publisher | null; + publisherOptions: PublisherOptions | null; + initializePublisher: (options: PublisherOptions) => void; + updatePublisherOptions: (options: Partial) => void; +}>(null); + +/** +* This hooks creates the context for the publisherContext.Provider +*/ +const usePublisher = () => { + const [publisher, setPublisher] = useState(null); + + // using state in context make it impossible to add granularity + const [publisherOptions, setPublisherOptions] = useState(null); + + // callbacks are memoized but the state changes will cause consumer re-renders even if they don't use the state + const initializePublisher = useCallback((options: PublisherOptions) => { + setPublisherOptions(options); + }, []); + + const updatePublisherOptions = useCallback((newOptions: Partial) => { + setPublisherOptions({ + ...prevOptions, + ...newOptions, + }); + }, []); + + // prefer to useEffect only for component lifecycle, not for reacting to state changes/side effects + // this whole useEffect is totally unnecessary, we can initialize the publisher directly in initializePublisher + useEffect(() => { + if (!publisherOptions) return; + + const newPublisher = OT.initPublisher(..., publisherOptions); + setPublisher(newPublisher); + }, [publisherOptions]); + + // this useMemo prevents to lose the state on parent re-renders, + // but will recompute the whole object on every state change which will cause unnecessary re-renders and potentially side effects on consumers making the useEffect useless + // context's API/actions are part of the state so consumer cannot use them subscribing to the state changes + return useMemo(() => ({ + publisher, + publisherOptions, + initializePublisher, + updatePublisherOptions, + }), [publisher, publisherOptions, initializePublisher, updatePublisherOptions]); +}; +``` + +**Correct (granular context using react-global-state-hooks):** + +```tsx +// Good: prefer use react-global-state-hooks/createContext to create granular contexts +// publisherContext.ts +import createContext, { InferContextApi } from 'react-global-state-hooks/createContext'; +import initializePublisher from './actions/initializePublisher'; +import updatePublisherOptions from './actions/updatePublisherOptions'; + +export type PublisherContextApi = InferContextApi; + +// Prefer to use a callback to initialize the default state to prevent multiples providers from sharing the same state reference +const publisher$ = createContext(() => ({ + publisher: null as OT.Publisher | null, + publisherOptions: null as PublisherOptions | null, +}), { + // for complex actions or big contexts, suggest to split actions into separate files + actions: { + initializePublisher, + updatePublisherOptions, + }, +}); + +// Prefer single responsibility files is aligned with splitting actions into separate files +// ./actions/initializePublisher.ts +function initializePublisher(publisherOptions: PublisherOptions) { + return ({ setState }) => { + const publisher = OT.initPublisher(publisherOptions); + + setState({ publisher, publisherOptions }); + }; +} + +// if using single responsibility files, prefer export default instead of named exports +export default initializePublisher; +``` + +```tsx +// ./actions/updatePublisherOptions.ts +// import the types in this way to avoid circular dependencies +export type PublisherContextApi = import('../publisherContext').PublisherContextApi; + +// all actions are bound to the context.actions object so they can access each other +function updatePublisherOptions(this: PublisherContextApi['actions'], updates: Partial) { + return ({ getState }) => { + const { publisherOptions } = getState(); + + this.initializePublisher({ + ...publisherOptions, + ...updates, + }); + }; +} + +export default updatePublisherOptions; + +// provider component is automatically created + + {children} + + +// context hook is automatically created and allows granular subscriptions +const publisherOptions = publisher$.use.select(({ publisherOptions }) => publisherOptions); + +// children can use actions without subscribing to state changes +const { initializePublisher } = publisher.use.actions(); + +// children can consume the whole context if needed +const [{ publisher, publisherOptions }, actions] = publisher$.use(); + +// prefer to create reusable selectors when accessing specific portions of the context is common +const usePublisherOptions = publisher$.use.createSelectorHook(({ publisherOptions }) => publisherOptions); + +// when using an specific property of an state or state derived value, prefer to use selectors. +// SomeComponent.tsx +const allowVideo = usePublisherOptions((options) => options.allowVideo); +``` + +- **Rule:** For `react-global-state-hooks` context, store names must use the `$` suffix (for example `dialog$`), and must not use the `Context` suffix in variable names. +- **Rule:** File names for context definitions must use the `Context` suffix (for example `dialogContext.tsx`). + +**Violation:** + +```tsx +// Bad +const dialogContext = createContext(...); +``` + +**Correct:** + +```tsx +// Good +const dialog$ = createContext(...); +``` + +**Violation (file name):** + +```tsx +// Bad +// dialog$.tsx +``` + +**Correct:** + +```tsx +// Good +// dialogContext.tsx +``` + +--- + +# Root Element, Visibility & Layout Behavior + +These rules define how the **root element** of a reusable component must behave for layout, styling, and customization. + +- **Rule:** Reusable components must allow 100% customization of the root element via props (`className`, `style`, other DOM props). + +**Violation:** + +```tsx +// Bad: no way to customize root element +export const Button: React.FC = ({ children }) => { + return ( + + ); +}; +``` + +**Correct:** + +```tsx +// Good: Allows full customization of root element +export const Button: React.FC>> = + ({ className, onClick, children, ...props }) => { + return ( + + ); + }; +``` + +- **Rule:** Root elements must not contain "hidden" layout hacks such as margins or paddings that affect how the component is placed in its surroundings. + +**Violation:** + +```tsx +// Bad: root element has hidden spacing that breaks reuse +export const UserCard = () => { + return ( +
        + ... +
        + ); +}; +``` + +**Correct (spacing owned by parent):** + +```tsx +// Good: root element is neutral, caller controls spacing +// UserCard can be placed anywhere without unexpected spacing +export const UserList = ({ users }) => { + return ( +
        + {users.map((user, index) => ( + // UserCard should not have extra margin so the parent/orchestrator can control spacing + + ))} +
        + ); +} +``` + +- **Rule:** Reusable components must never conditionally return `null`. Visibility must be controlled by the parent/orchestrator. +- **Rule:** If a component is present in JSX, it must render something (even if visually "empty"); parent controls whether to render the component at all. + +**Violation:** + +```tsx +// Bad: component sometimes returns null +export const SomeComponent = ({ ... }) => { + const isVisible = someLogic(...); + return isVisible ? + ); +}; + +const button = tv({ + base: 'rounded-sm font-medium transition active:opacity-80', + + variants: { + variant: { + primary: 'bg-blue-600 text-white hover:bg-blue-500', + secondary: 'bg-gray-200 text-gray-900 hover:bg-gray-300', + danger: 'bg-red-600 text-white hover:bg-red-500', + outline: 'border border-gray-300 bg-white text-gray-900 hover:bg-gray-100' + }, + + size: { + sm: 'text-sm px-3 py-1.5', + md: 'text-base px-4 py-2', + lg: 'text-lg px-6 py-3' + }, + }, + defaultVariants: { + variant: 'primary', + size: 'md' + } +}); + +export default Button; + +// Usage +// Variants are semantic and predictable + + + + )} + + ); +}; +``` + +**Correct (composition with reusable building blocks):** + +```tsx +// Good: prefer composition with reusable building blocks +const VideoView = ({ children, ...props }) => { + const childrenArray = React.Children.toArray(children); + const controls = pickChild(childrenArray, VideoViewRegions.Controls); + + return ( + +
        + + {controls} +
        +
        + ); +}; + +VideoView.Controls = ControlsWrapper; +VideoView.MuteButton = MuteButton; +VideoView.EndCallButton = EndCallButton; + +export default VideoView; + +// Usage + + + + + + + +``` + +- **Rule:** When using composition, internal elements must be exposed as properties of the main component (e.g. `PageLayout.Header`, `VideoView.Controls`) to keep the API discoverable. +- **Rule:** Do not combine composition with heavy configuration-based rendering or noisy prop drilling to customize internal elements. + +- **Rule:** A reusable component may define its **internal layout** (flex/grid, internal padding) but must not impose external spacing. +- **Rule:** Internal spacing should be defined using gap/padding where appropriate and limited to the component’s internal layout. + +**Correct internal structure example:** + +```tsx +// Good internal structure +export function InfoRow({ label, value }) { + return ( + + {label} + {value} + + ); +} +``` + +--- + +# Conditional Rendering Rules + +- **Rule:** Do not use `style.display = 'none'` to hide components. +- **Rule:** If you need to hide a component while preserving its state, use `Activity` with `mode` instead of conditional display CSS. + +**Violation:** + +```tsx +// Bad: using style.display = 'none' to hide component +
        + +
        +``` + +**Correct:** + +```tsx +// Good: using React.Activity to hide component while preserving state + + + +``` + +- **Rule:** `Activity` will trigger effect cleanups but preserve component state while hidden. +- **Rule:** `Activity` is particularly useful for heavy components or ones that require expensive initialization (video/audio components). + +--- + +# React Hooks Rules & Effect Usage + +These rules define how reusable hooks must be written. + +- **Rule:** Prefer at most one plain `useEffect` per hook/component. +- **Rule:** If more than one effect is needed, split logic into smaller custom hooks to give each effect a clear semantic purpose. + +**Violation (multiple effects in one hook):** + +```tsx +// Bad: multiple useEffect inside a hook +// this is bad cause developers need to read and understand all the effects to understand the hook/component behavior +const useComplexLogic = () => { + useEffect(() => { + // effect 1 + }, [deps1]); + + useEffect(() => { + // effect 2 + }, [deps2]); +}; +``` + +**Correct (single effect per helper hook):** + +```tsx +// Good: single useEffect per hook/component +// this is good cause each hook/component has a single responsibility and its behavior is clear at first glance +type CleanupFunction = () => void; + +// simple hook uses useEffect to access component lifecycle +export const useWindowEvent = (event: string, handler: (e) => void) => { + const handlerWrapper = useEffectEvent(handler); + + useEffect(() => { + const abortController = new AbortController(); + + window.addEventListener(event, handlerWrapper, abortController); + + return () => abortController.abort(); + }, [event]); +} +``` + +**Correct (composing small hooks):** + +```tsx +// Good: semantic small hooks +// instead of having random use effects now we have semantic small hooks +export const useIsOnline = () => { + const [isOnline, setIsOnline] = useState(navigator.onLine); + + useWindowEvent('online', () => setIsOnline(true)); + useWindowEvent('offline', () => setIsOnline(false)); + + return isOnline; +}; +``` + +```tsx +// Good: complex logic is split into multiple simple hooks +const useComplexLogic = () => { + const isOnline = useIsOnline(); + + useWindowEvent('resize', () => { + // handle resize + }); + + return ...; +}; +``` + +- **Rule:** Reactive effect architectures are banned. + - Effects must be preferred for component lifecycle, not as a state reaction graph for side effects like fetching. + +**Violation (reactive effect fetching):** + +```tsx +// Bad: useEffect used for side effects +// Bad: useEffect used as a "state reaction graph" for fetching +// Side effects are difficult to track and reason about, side effects could also get chained which makes it even more complex and unreliable. +const Component = () => { + const [items, setItems] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const [filters, setFilters] = useState({ search: '', sortBy: 'date' }); + const [page, setPage] = useState(1); + + // Bad: Implicit side effect, developers need to read the whole effect to understand what's happening + useEffect(() => { + setIsLoading(true); + + fetchItems({ filters, page }).then(result => { + setItems(result.items); + setIsLoading(false); + }); + }, [filters, page]); + + const handleSearchChange = (value: string) => { + // is not implicit what's happening after changing the filters + setFilters(prev => ({ ...prev, search: value })); + }; + + return ( + ... + ); +}; +``` + +**Correct (explicit linear flow):** + +```tsx +// Good: linear code no reactive effects +const Component = () => { + const [items, setItems] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const [filters, setFilters] = useState({ search: '', sortBy: 'date' }); + const [page, setPage] = useState(1); + + const loadItems = useCallback(async (nextFilters: Filters, nextPage: number) => { + setIsLoading(true); + + const result = await fetchItems({ filters: nextFilters, page: nextPage }); + + setItems(result.items); + setIsLoading(false); + }, []); + + // Initial load, this is component lifecycle not a reaction to state changes + // useOnMountEffect make the effect intention clear and semantically explicit + useOnMountEffect(() => { + loadItems(filters, page); + }); + + // Good stable callback for children props wont trigger shallow compare differences + const handleSearchChange = useStableCallback((value: string) => { + const nextFilters = { ...filters, search: value }; + + setFilters(nextFilters); + setPage(1); + + // what happens after changing the filters is explicit + loadItems(nextFilters, 1); + }); + + const handleNextPage = useStableCallback(() => { + const nextPage = page + 1; + + setPage(nextPage); + + // is clear and easy to identify why we are loading items + // developers can trace easily the call stack + loadItems(filters, nextPage); + }); + + return ( + ... + ); +}; +``` \ No newline at end of file diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.github/instructions/test-files.instructions.md b/tutorials/vonage_video_ios_app-theme-customization/project/.github/instructions/test-files.instructions.md new file mode 100644 index 00000000..ab37b1a7 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.github/instructions/test-files.instructions.md @@ -0,0 +1,149 @@ +--- +applyTo: "**/*.{spec,test}.{ts,tsx}" +--- + +# Test Authoring Instructions + +These instructions apply to all test files across the codebase (unit, integration, backend, libs). + +## Testing philosophy + +- Do not overtest. +- Small helpers/components with one or two relevant behaviors should usually have one condensed, high-value test that validates the behavior end-to-end. +- Prefer business logic tests with clear input and expected output. +- Do not add snapshot tests. Screenshot-based assertions in integration tests (Playwright `toHaveScreenshot`) are the only allowed exception. +- After writing a test, evaluate quality: + - Does it validate real functionality? + - Or is it mostly validating test tooling, mocks, or framework internals? +- Avoid tests that only check a mocked value was returned because it was mocked. + +## What to mock + +| Mock | Do not mock | +|------|-------------| +| External SDKs (e.g. `@vonage/client-sdk-video`) | Application contexts | +| Browser APIs (e.g. `navigator.mediaDevices`) | Custom hooks | +| | Components | + +## Mocking rules + +- Do not overmock. +- Prefer spies over full module mocking whenever possible. +- Avoid mocking our own logic when the scenario can be prepared using real parameters, real state, or real providers. +- Keep mocking minimal and focused on third-party dependencies or APIs not available in the test environment. +- For typed mocked functions, always use `vi.mocked(...)`. +- `as Mocked<...>` type-casting in test files is banned. + +## Provider/context testing rules + +- Do not mock context for our own providers when #sym:makeTestProvider can be used. +- Compose only the providers strictly necessary for the scenario. Every extra provider increases test setup cost and coupling. +- Initialize provider state using provider options to prepare the use case. +- Use returned public contexts to inspect values and interact with exposed actions. + +When a component requires providers, compose only what is needed: + +```tsx +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; + sessionContext?: ProviderOptions['SessionContext']; +}; + +function render( + ui: ReactElement, + { userContext, sessionContext }: RenderOptions = {} +) { + const { wrapper, ...context } = makeTestProvider( + [providers.user, providers.session], + { userContext, sessionContext } + ); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} +``` + +For hooks, the same principle applies: + +```tsx +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; +}; + +function renderHook( + render: (initialProps: Props) => Result, + { userContext }: RenderOptions = {} +) { + const { wrapper, ...context } = makeTestProvider([providers.user], { + userContext, + }); + + return { + ...context, + ...renderHookBase(render, { wrapper }), + }; +} +``` + +## Async test rules + +- Do not use `setTimeout` or arbitrary `waitForTimeout` calls to make async tests pass. They slow the suite and hide real timing issues. +- Use `waitFor` from `@testing-library/react` to wait for observable state changes instead only when necessary. +- Every async test must declare an explicit assertion count with `expect.assertions(n)`. +- Place `expect.assertions(n)` at the start of the async test body so tests fail if execution exits before assertions run. + +## Shared test helpers + +Before adding custom setup, check and reuse existing helpers in: + +- `libs/common/test` +- `libs/common/testNode` +- `libs/common/testBrowser` + +Useful existing helpers include: + +- `libs/common/test/setup.ts` + - Already clears mocks, restores spies, and unstubs globals after each test. Already included in the global test setup — do not duplicate. +- `libs/common/testNode/helpers/waitForEvent.ts` + +### Banned boilerplate — already provided globally + +Do not call any of the following in individual test files. They are already invoked for every test run via the global setup files (`frontend/src/test/setup.ts`, `libs/*/test/setup.ts`): + +```ts +// Global cleanup — already runs after each test via mandatoryAfterEachCleanup() +cleanup(); +vi.clearAllMocks(); +vi.restoreAllMocks(); +vi.unstubAllGlobals(); +cancelablePromiseTracker.mockClear(); + +// Browser environment setup — already runs before each suite via setupFrontendTestEnvironment() +setupResizeObserverMock(); +setupScrollIntoViewMock(); +setupHtmlMediaElementGuards(); +setupHtmlCanvasElementGuards(); +setupCancelablePromiseHook(); +``` + +Duplicating these calls in test files adds noise and can cause double-invocation side effects. + - Useful for event-driven async tests. +- `libs/common/testBrowser/renderAsyncComponent.ts` + - Use for components that resolve async behavior with Suspense boundaries. +- `libs/common/testBrowser/renderAsyncHook.ts` + - Use for hooks that need async/Suspense-aware rendering. +- `libs/common/testBrowser/makeGenericProviderWrapper.tsx` + - Generic provider/context wrapper utility for reusable context testing. +- `libs/common/testBrowser/fixtures/setupWindowNavigatorMock` + - Browser navigator setup helpers for web media-related tests. + +Do not duplicate setup that these helpers already provide. + +## Test data setup + +- Avoid high-level shared variables when possible. +- Prefer creating scenario-specific inputs inside each test. +- Prefer fewer, more robust tests instead of many tiny tests that increase suite runtime with low value. +- Keep tests explicit and linear, with clear Arrange/Act/Assert intent. diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.github/pull_request_template.md b/tutorials/vonage_video_ios_app-theme-customization/project/.github/pull_request_template.md new file mode 100644 index 00000000..3000c9e6 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.github/pull_request_template.md @@ -0,0 +1,17 @@ +#### What is this PR doing? + + +#### How should this be manually tested? + + +#### What are the relevant tickets? +A maintainer will add this ticket number. + +Resolves [VIDSOL-](https://jira.vonage.com/browse/VIDSOL-) + +#### Checklist +[ ] Branch is based on `develop` (not `main`). +[ ] Resolves a `Known Issue`. +[ ] If yes, did you remove the item from the `docs/KNOWN_ISSUES.md`? +[ ] Resolves an item reported in `Issues`. +If yes, which issue? [Issue Number](https://github.com/Vonage/vonage-video-react-app/issues/)? diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/auto-set-base.yml b/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/auto-set-base.yml new file mode 100644 index 00000000..9014d671 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/auto-set-base.yml @@ -0,0 +1,32 @@ +name: Auto-set Base Branch to Develop + +on: + pull_request: + types: [opened] + +permissions: + contents: read + +jobs: + set-base-branch: + runs-on: ubuntu-22.04 + permissions: + pull-requests: write + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Check and Update Base Branch + env: + TARGET_BRANCH: ${{ github.event.pull_request.base.ref }} + BASE_BRANCH: ${{ github.event.pull_request.head.ref }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} + run: | + if [[ "$TARGET_BRANCH" == "main" && "$BASE_BRANCH" != "develop" && "$BASE_BRANCH" != rc-* ]]; then + echo "Switching base branch from $TARGET_BRANCH to develop..." + gh pr edit "$PR_NUMBER" --base "develop" + echo "Base branch updated to 'develop'." + else + echo "No changes needed: Target branch is '$TARGET_BRANCH' and base branch is '$BASE_BRANCH'." + fi diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/auto-update-dependencies.yml b/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/auto-update-dependencies.yml new file mode 100644 index 00000000..31a759ab --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/auto-update-dependencies.yml @@ -0,0 +1,43 @@ +name: auto-update-dependencies + +on: + push: + branches: + - develop + +permissions: + contents: read + +env: + BRANCH_NAME: ${{ github.ref_name }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_REPOSITORY: ${{ github.repository }} + +jobs: + run: + runs-on: ubuntu-22.04 + permissions: + contents: write + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + - name: Install dependencies + run: yarn install --ignore-scripts --frozen-lockfile + - name: Run dependency update script + run: node scripts/generateDependenciesList.js + - name: Auto-commit updated dependencies file + run: | + echo "Committing docs/DEPENDENCIES.md changes..." + FILE="docs/DEPENDENCIES.md" + CONTENT=$(base64 -w 0 "$FILE") + SHA=$(curl -s -H "Authorization: token $GITHUB_TOKEN" "https://api.github.com/repos/$GITHUB_REPOSITORY/contents/$FILE?ref=$BRANCH_NAME" | jq -r .sha) + if [ "$SHA" == "null" ]; then + SHA="" + fi + curl -s -X PUT -H "Authorization: token $GITHUB_TOKEN" \ + -d "{\"message\":\"Commit updated dependencies file [auto-generated]\", \"content\":\"$CONTENT\", \"branch\":\"$BRANCH_NAME\", \"sha\":\"$SHA\"}" \ + "https://api.github.com/repos/$GITHUB_REPOSITORY/contents/$FILE" diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/check-pull-request-title.yml b/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/check-pull-request-title.yml new file mode 100644 index 00000000..fd4f0147 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/check-pull-request-title.yml @@ -0,0 +1,34 @@ +name: check-pull-request-title + +on: + pull_request: + types: [edited, opened] + +permissions: + contents: read + +jobs: + run: + runs-on: ubuntu-22.04 + steps: + - name: Validate PR title + env: + PR_NAME: ${{ github.event.pull_request.title }} + run: | + set -e + + # Regex to check following: + # Starts with "VIDSOL-" followed by digits + # A colon (:) followed by exactly one space + # followed by the actual PR title text + regex="^VIDSOL-[0-9]+: [^ ].*$" + + if echo "$PR_NAME" | grep -Eq "$regex"; then + echo "Acceptable title" + exit 0 + else + echo "Rejected title" + echo "Reason: The PR title must start with 'VIDSOL-' followed by digits, a colon (:), and exactly one space, with the rest of the title immediately after the space." + exit 1 + fi + shell: bash diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/deploy-to-vcr.yml b/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/deploy-to-vcr.yml new file mode 100644 index 00000000..cedab90e --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/deploy-to-vcr.yml @@ -0,0 +1,66 @@ +name: Deploy to VCR + +on: + pull_request: + branches: + - develop + types: [closed] + +permissions: + contents: read + +env: + DOMAIN: ${{secrets.DOMAIN}} + +jobs: + build-and-test: + if: github.event.pull_request.merged == true + runs-on: ubuntu-22.04 + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version-file: .nvmrc + + - name: Verify Node & Yarn versions + run: | + node -v + yarn -v + + - name: Building artefact + run: | + sed -i "s//${DOMAIN}/g" "${{ github.workspace }}/vcr-gha.yml" + ./vcrBuild.sh + + - name: Install VCR CLI + uses: ./.github/actions/install-vcr-cli + + - name: Deploy vcr + uses: ./.github/actions/deploy-vcr + with: + app-id: ${{ secrets.APP_ID }} + api-key: ${{ secrets.VCR_API_KEY }} + api-secret: ${{ secrets.VCR_API_SECRET }} + filename: vcr-gha.yml + + - name: Slack notification on success + uses: ./.github/actions/slack-notify + with: + slack-bot-token: ${{ secrets.SLACK_NOTIFICATION }} + color: '28a745' + message: "Vera pull request ** \n with commit hash: ${{ github.sha }} \n is merged and deployed to VCR \n** \n :large_green_circle: :large_green_circle: :large_green_circle: :large_green_circle:" + if: success() + continue-on-error: true + + - name: Slack notification on failure + uses: ./.github/actions/slack-notify + with: + slack-bot-token: ${{ secrets.SLACK_NOTIFICATION }} + color: FF0000 + message: "Vera pull request ** \n with commit hash: ${{ github.sha }} \n is merged but FAILED to deploy to VCR \n ** \n :red_circle: :red_circle: :red_circle: :red_circle:" + if: failure() + continue-on-error: true diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/lint.yml b/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/lint.yml new file mode 100644 index 00000000..1f6628ed --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/lint.yml @@ -0,0 +1,84 @@ +name: 👮 QA + +on: [pull_request, workflow_dispatch] + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number }} + cancel-in-progress: true + +jobs: + # ---------------------------------------------------- + # Code Quality Checks (Matrix) + # ---------------------------------------------------- + quality-checks: + name: ${{ matrix.check.name }} + runs-on: ubuntu-22.04 + permissions: + contents: read + + strategy: + matrix: + check: + - name: ESLint + command: yarn lint + - name: Prettier + command: yarn prettier . --check --log-level warn + - name: TypeScript Check + command: yarn ts-check + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version-file: .nvmrc + cache: yarn + + - name: Install Dependencies + run: yarn install --ignore-scripts --frozen-lockfile + + - name: Run ${{ matrix.check.name }} + run: ${{ matrix.check.command }} + + # ---------------------------------------------------- + # Filename Linting + # ---------------------------------------------------- + lint-filenames: + name: Filename Linting + runs-on: ubuntu-22.04 + permissions: + contents: read + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Check that new files are camelCase + run: ./scripts/lintFileNames.sh + + # ---------------------------------------------------- + # License Check + # ---------------------------------------------------- + license-check: + name: License Check + runs-on: ubuntu-22.04 + permissions: + contents: read + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version-file: .nvmrc + cache: yarn + + - name: Install Dependencies + run: yarn install --ignore-scripts --frozen-lockfile + + - name: Run license check + run: | + npx license-checker --production --json > scripts/allLicenseResults.json + node scripts/licenseCheck.js diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/release-notification.yml b/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/release-notification.yml new file mode 100644 index 00000000..b7a1b9e3 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/release-notification.yml @@ -0,0 +1,35 @@ +name: Notify Slack on Release + +on: + release: + types: [published] + +permissions: + contents: read + +jobs: + notify-release: + runs-on: ubuntu-22.04 + name: Notify Release + steps: + - name: Send to slack channels + uses: slackapi/slack-github-action@v2.0.0 + with: + webhook: ${{ secrets.SLACK_WEBHOOK_URL }} + webhook-type: incoming-webhook + errors: true + payload: | + blocks: + - type: "header" + text: + type: "plain_text" + text: ":tada: Version ${{ github.event.release.name }} of the Vonage Video Reference App Just Released!" + - type: "section" + text: + type: "mrkdwn" + text: "${{ github.event.release.body }}" + - type: "divider" + - type: "section" + text: + type: "mrkdwn" + text: "You can view the full change log <${{github.event.release.html_url }}|here>" diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/run-tests.yml b/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/run-tests.yml new file mode 100644 index 00000000..bbe05069 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/run-tests.yml @@ -0,0 +1,186 @@ +name: 🧑‍💻 + +on: [pull_request, workflow_dispatch] + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number }} + cancel-in-progress: true + +env: + VIDEO_SERVICE_PROVIDER: ${{vars.VIDEO_SERVICE_PROVIDER}} + OT_API_KEY: ${{secrets.API_KEY}} + OT_API_SECRET: ${{secrets.API_SECRET}} + VONAGE_APP_ID: ${{secrets.VONAGE_APP_ID}} + VONAGE_PRIVATE_KEY: ${{secrets.VONAGE_PRIVATE_KEY}} + SESSION_KEY_SECRET: ${{secrets.SESSION_KEY_SECRET}} + +jobs: + # ---------------------------------------------------- + # Unit Tests (Matrix) + # ---------------------------------------------------- + unit-tests: + name: Unit Tests - ${{ matrix.project }} + runs-on: ubuntu-22.04 + permissions: + contents: read + + strategy: + matrix: + project: [frontend, backend, ui, core, common, api] + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version-file: .nvmrc + cache: yarn + + - name: Install Dependencies + run: yarn install --ignore-scripts --frozen-lockfile + + - name: Run ${{ matrix.project }} unit tests + run: NX_DAEMON=false yarn nx test ${{ matrix.project }} --configuration=coverage + + - name: Upload coverage + uses: actions/upload-artifact@v4 + with: + name: coverage-${{ matrix.project }} + path: | + ${{ matrix.project }}/coverage/ + libs/${{ matrix.project }}/coverage/ + retention-days: 1 + + # ---------------------------------------------------- + # Integration Tests (Playwright) + # ---------------------------------------------------- + integration-tests: + name: 🤖 E2E / ${{ matrix.browser.name }} + runs-on: ubuntu-22.04 + if: github.event.pull_request.head.repo.fork == false + permissions: + contents: read + + strategy: + fail-fast: false + matrix: + browser: + - name: Chrome + project: Google Chrome Fake Devices + - name: Firefox + project: firefox + - name: Mobile Chrome + project: Mobile Chrome + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install chrome latest + if: matrix.browser.name != 'Firefox' + run: | + wget --max-redirect=0 -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add - + sudo sh -c 'echo "deb [arch=amd64] https://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' + sudo apt update && sudo apt install -y google-chrome-stable + echo "Installed Chrome:" + /usr/bin/google-chrome-stable --version + + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version-file: .nvmrc + cache: yarn + + - name: Install Dependencies + run: | + node -v + yarn install --ignore-scripts --frozen-lockfile + + - name: Cache Playwright browsers + uses: actions/cache@v4 + with: + path: ~/.cache/ms-playwright + key: playwright-browsers-${{ hashFiles('**/package.json') }} + + - name: Install Playwright Browsers + run: npx playwright install --with-deps + + - name: Run integration tests + run: | + echo "VIDEO_SERVICE_PROVIDER: $VIDEO_SERVICE_PROVIDER" + Xvfb :99 & export DISPLAY=:99 + cd integration-tests && npx playwright test --project='${{ matrix.browser.project }}' + + - name: Upload Playwright Report + uses: actions/upload-artifact@v4 + if: failure() + with: + name: playwright-report-${{ matrix.browser.name }} + path: integration-tests/playwright-report/ + retention-days: 7 + + # ---------------------------------------------------- + # SonarCloud Analysis + # ---------------------------------------------------- + sonarcloud: + name: SonarCloud + runs-on: ubuntu-22.04 + needs: [unit-tests] + if: github.event.pull_request.head.repo.fork == false + permissions: + contents: read + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version-file: .nvmrc + cache: yarn + + - name: Install Dependencies + run: | + node -v + yarn install --ignore-scripts --frozen-lockfile + + - name: Download all coverage artifacts + uses: actions/download-artifact@v4 + with: + pattern: coverage-* + merge-multiple: false + + - name: List coverage files + run: | + echo "Listing coverage files:" + find . -name "lcov.info" -type f + ls -la coverage-* || true + + - name: SonarCloud Scan On PR + uses: SonarSource/sonarqube-scan-action@fd88b7d7ccbaefd23d8f36f73b59db7a3d246602 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + with: + args: > + -Dsonar.pullrequest.key=${{ github.event.pull_request.number }} + -Dsonar.pullrequest.branch=${{ github.head_ref }} + -Dsonar.pullrequest.base=${{ github.event.pull_request.base.ref }} + + - name: SonarCloud Branch Analysis On base branch + uses: SonarSource/sonarqube-scan-action@fd88b7d7ccbaefd23d8f36f73b59db7a3d246602 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + with: + args: > + -Dsonar.branch.name=${{ github.event.pull_request.base.ref }} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/vcr-deploy-on-comment.yml b/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/vcr-deploy-on-comment.yml new file mode 100644 index 00000000..415f4f0e --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/vcr-deploy-on-comment.yml @@ -0,0 +1,148 @@ +name: Deploy PR to VCR on comment + +on: + issue_comment: + types: [created] + workflow_dispatch: + inputs: + pr_number: + description: PR number to deploy + required: true + type: string + +permissions: + contents: read + pull-requests: write + issues: write + +env: + DOMAIN: ${{ secrets.DOMAIN }} + +jobs: + build-and-test: + name: Deploy to VCR (comment trigger) + # Run only when: + # - comment is on a PR + # - comment body is exactly 'vcr:deploy' + if: > + (github.event_name == 'issue_comment' && + github.event.issue.pull_request && + github.event.comment.body == 'vcr:deploy') || + (github.event_name == 'workflow_dispatch') + runs-on: ubuntu-22.04 + steps: + - name: Load PR details + id: pr + uses: actions/github-script@v7 + with: + script: | + const prNumber = context.payload.issue?.number ?? Number(context.payload.inputs?.pr_number); + const { data: pr } = await github.rest.pulls.get({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: prNumber, + }); + + core.setOutput('number', String(pr.number)); + core.setOutput('title', pr.title || ''); + core.setOutput('head_sha', pr.head.sha); + core.setOutput( + 'is_fork', + String(pr.head.repo.full_name !== pr.base.repo.full_name) + ); + + - name: Block forks + if: steps.pr.outputs.is_fork == 'true' + run: | + echo "Deployment from forked repositories is not allowed." + exit 1 + + - name: Checkout PR HEAD SHA + uses: actions/checkout@v4 + with: + ref: ${{ steps.pr.outputs.head_sha }} + + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version-file: .nvmrc + + - name: Verify Node & Yarn versions + run: | + node -v + yarn -v + + # Create dev VCR config, patch instance name, build artefact + - name: Building artefact + run: | + # Add empty env file to avoid errors during build + touch "${{ github.workspace }}/backend/.env" + + # Create a dev-specific VCR config file + cp "${{ github.workspace }}/vcr-gha.yml" "${{ github.workspace }}/vcr-dev.yml" + + # REMOVE the domain line entirely for comment-based deploys + sed -i '/^[[:space:]]*domains:/d' "${{ github.workspace }}/vcr-dev.yml" + + # Patch instance name to be PR-specific + sed -i \ + "/^instance:/ {n; s/^ name: .*/ name: vera-pr-${{ steps.pr.outputs.number }}/;}" \ + "${{ github.workspace }}/vcr-dev.yml" + + ./vcrBuild.dev.sh + + - name: Install VCR CLI + uses: ./.github/actions/install-vcr-cli + + - name: Deploy vcr + id: deploy + uses: ./.github/actions/deploy-vcr + with: + app-id: ${{ secrets.APP_ID }} + api-key: ${{ secrets.VCR_API_KEY }} + api-secret: ${{ secrets.VCR_API_SECRET }} + filename: vcr-dev.yml + + - name: Comment PR on success + if: success() + uses: actions/github-script@v7 + with: + script: | + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: ${{ steps.pr.outputs.number }}, + body: `## ✅ Deployed to VCR\n\n**URL:** ${{ steps.deploy.outputs.instance-url }}\n\n**Commit:** \`${{ steps.pr.outputs.head_sha }}\`\n\n[View build logs](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})` + }); + continue-on-error: true + + - name: Slack notification on success + uses: ./.github/actions/slack-notify + with: + slack-bot-token: ${{ secrets.SLACK_NOTIFICATION }} + color: '28a745' + message: "Vera pull request ** \n with commit hash: ${{ steps.pr.outputs.head_sha }} \n is deployed to VCR \nURL: ${{ steps.deploy.outputs.instance-url }} \n** \n :large_green_circle: :large_green_circle: :large_green_circle: :large_green_circle:" + if: success() + continue-on-error: true + + - name: Comment PR on failure + if: failure() + uses: actions/github-script@v7 + with: + script: | + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: ${{ steps.pr.outputs.number }}, + body: `## ❌ Deployment to VCR Failed\n\n**Commit:** \`${{ steps.pr.outputs.head_sha }}\`\n\n[View build logs](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})` + }); + continue-on-error: true + + - name: Slack notification on failure + uses: ./.github/actions/slack-notify + with: + slack-bot-token: ${{ secrets.SLACK_NOTIFICATION }} + color: FF0000 + message: "Vera pull request ** \n with commit hash: ${{ steps.pr.outputs.head_sha }} \n FAILED to deploy to VCR \n ** \n :red_circle: :red_circle: :red_circle: :red_circle:" + if: failure() + continue-on-error: true diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/vcr-remove-non-use-instance.yml b/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/vcr-remove-non-use-instance.yml new file mode 100644 index 00000000..f888518a --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/vcr-remove-non-use-instance.yml @@ -0,0 +1,91 @@ +name: Remove PR VCR instance on close + +on: + pull_request: + types: [closed] + +permissions: + contents: read + pull-requests: read + issues: write + +jobs: + remove-vcr: + name: Remove VCR instance + runs-on: ubuntu-22.04 + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install VCR CLI + uses: ./.github/actions/install-vcr-cli + + - name: Remove VCR instance (tolerant) + id: remove + shell: bash + env: + VCR_API_KEY: ${{ secrets.VCR_API_KEY }} + VCR_API_SECRET: ${{ secrets.VCR_API_SECRET }} + run: | + set -euo pipefail + + PROJECT_NAME="vonage-video-react-app" + INSTANCE_NAME="vera-pr-${{ github.event.pull_request.number }}" + + echo "instance_name=$INSTANCE_NAME" >> "$GITHUB_OUTPUT" + + set +e + vcr instance remove \ + --project-name "$PROJECT_NAME" \ + --instance-name "$INSTANCE_NAME" \ + --api-key "$VCR_API_KEY" \ + --api-secret "$VCR_API_SECRET" \ + --region aws.euw1 \ + --graphql-endpoint https://graphql.euw1.runtime.vonage.cloud/v1/graphql \ + 2>&1 | tee remove-vcr-logs.log + RC=${PIPESTATUS[0]} + set -e + + # Removed successfully + if [ "$RC" -eq 0 ]; then + echo "result=removed" >> "$GITHUB_OUTPUT" + exit 0 + fi + + # Instance did not exist -> non-fatal + if grep -Eqi 'not found|does not exist|no such|404' remove-vcr-logs.log; then + echo "result=missing" >> "$GITHUB_OUTPUT" + exit 0 + fi + + # Real failure + echo "result=failed" >> "$GITHUB_OUTPUT" + exit 1 + + - name: Slack notification on removed + uses: ./.github/actions/slack-notify + with: + slack-bot-token: ${{ secrets.SLACK_NOTIFICATION }} + color: '28a745' + message: "Vera pull request ** \n with commit hash: ${{ github.sha }} \n had instance removed from VCR \nInstance: `${{ steps.remove.outputs.instance_name }}` \n** \n :large_green_circle: :large_green_circle: :large_green_circle: :large_green_circle:" + if: steps.remove.outputs.result == 'removed' + continue-on-error: true + + - name: Slack notification on no instance found + uses: ./.github/actions/slack-notify + with: + slack-bot-token: ${{ secrets.SLACK_NOTIFICATION }} + color: FFA500 + message: "Vera pull request ** \n with commit hash: ${{ github.sha }} \n had no VCR instance to remove \nInstance: `${{ steps.remove.outputs.instance_name }}` \n**" + if: steps.remove.outputs.result == 'missing' + continue-on-error: true + + - name: Slack notification on failure + uses: ./.github/actions/slack-notify + with: + slack-bot-token: ${{ secrets.SLACK_NOTIFICATION }} + color: FF0000 + message: "Vera pull request ** \n with commit hash: ${{ github.sha }} \n FAILED to remove instance from VCR \nInstance: `${{ steps.remove.outputs.instance_name }}` \n ** \n :red_circle: :red_circle: :red_circle: :red_circle:" + if: failure() + continue-on-error: true diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/vcr-remove-on-comment.yml b/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/vcr-remove-on-comment.yml new file mode 100644 index 00000000..6af3d163 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.github/workflows/vcr-remove-on-comment.yml @@ -0,0 +1,129 @@ +name: Remove PR VCR instance on comment + +on: + issue_comment: + types: [created] + workflow_dispatch: + inputs: + pr_number: + description: PR number to remove + required: true + type: string + +permissions: + contents: read + pull-requests: read + issues: write + +jobs: + remove-vcr: + name: Remove VCR instance (comment trigger) + # Run only when: + # - comment is on a PR + # - comment body is exactly 'vcr:remove' + if: > + (github.event_name == 'issue_comment' && + github.event.issue.pull_request && + github.event.comment.body == 'vcr:remove') || + (github.event_name == 'workflow_dispatch') + runs-on: ubuntu-22.04 + steps: + - name: Load PR details + id: pr + uses: actions/github-script@v7 + with: + script: | + const prNumber = context.payload.issue?.number ?? Number(context.payload.inputs?.pr_number); + const { data: pr } = await github.rest.pulls.get({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: prNumber, + }); + + core.setOutput('number', String(pr.number)); + core.setOutput('title', pr.title || ''); + core.setOutput('head_sha', pr.head.sha); + core.setOutput( + 'is_fork', + String(pr.head.repo.full_name !== pr.base.repo.full_name) + ); + + - name: Block forks + if: steps.pr.outputs.is_fork == 'true' + run: | + echo "Removal from forked repositories is not allowed." + exit 1 + + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install VCR CLI + uses: ./.github/actions/install-vcr-cli + + - name: Remove VCR instance (tolerant) + id: remove + shell: bash + env: + VCR_API_KEY: ${{ secrets.VCR_API_KEY }} + VCR_API_SECRET: ${{ secrets.VCR_API_SECRET }} + run: | + set -euo pipefail + + PROJECT_NAME="vonage-video-react-app" + INSTANCE_NAME="vera-pr-${{ steps.pr.outputs.number }}" + + echo "instance_name=$INSTANCE_NAME" >> "$GITHUB_OUTPUT" + echo "Removing instance: $INSTANCE_NAME" + + set +e + vcr instance remove \ + --project-name "$PROJECT_NAME" \ + --instance-name "$INSTANCE_NAME" \ + --api-key "$VCR_API_KEY" \ + --api-secret "$VCR_API_SECRET" \ + --region aws.euw1 \ + --graphql-endpoint https://graphql.euw1.runtime.vonage.cloud/v1/graphql \ + 2>&1 | tee remove-vcr-logs.log + RC=${PIPESTATUS[0]} + set -e + + if [ "$RC" -eq 0 ]; then + echo "result=removed" >> "$GITHUB_OUTPUT" + exit 0 + fi + + # Treat "not found" as non-fatal + if grep -Eqi 'not found|does not exist|no such|404' remove-vcr-logs.log; then + echo "result=missing" >> "$GITHUB_OUTPUT" + exit 0 + fi + + echo "result=failed" >> "$GITHUB_OUTPUT" + exit 1 + + - name: Slack notification on removed + uses: ./.github/actions/slack-notify + with: + slack-bot-token: ${{ secrets.SLACK_NOTIFICATION }} + color: '28a745' + message: "Vera pull request ** \n with commit hash: ${{ steps.pr.outputs.head_sha }} \n had instance removed from VCR \nInstance: `${{ steps.remove.outputs.instance_name }}` \n** \n :large_green_circle: :large_green_circle: :large_green_circle: :large_green_circle:" + if: steps.remove.outputs.result == 'removed' + continue-on-error: true + + - name: Slack notification on no instance found + uses: ./.github/actions/slack-notify + with: + slack-bot-token: ${{ secrets.SLACK_NOTIFICATION }} + color: FFA500 + message: "Vera pull request ** \n with commit hash: ${{ steps.pr.outputs.head_sha }} \n had no VCR instance to remove \nInstance: `${{ steps.remove.outputs.instance_name }}` \n**" + if: steps.remove.outputs.result == 'missing' + continue-on-error: true + + - name: Slack notification on failure + uses: ./.github/actions/slack-notify + with: + slack-bot-token: ${{ secrets.SLACK_NOTIFICATION }} + color: FF0000 + message: "Vera pull request ** \n with commit hash: ${{ steps.pr.outputs.head_sha }} \n FAILED to remove instance from VCR \nInstance: `${{ steps.remove.outputs.instance_name }}` \n ** \n :red_circle: :red_circle: :red_circle: :red_circle:" + if: failure() + continue-on-error: true diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.gitignore b/tutorials/vonage_video_ios_app-theme-customization/project/.gitignore new file mode 100644 index 00000000..6aa07aac --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.gitignore @@ -0,0 +1,66 @@ +# ignore techdocs output folder +generated-docs/ +frontend/docs/ + +**/node_modules/* + +**/.env +dist/ +**/dist/ + +lib-cov +*.seed +*.log +*.csv +*.dat +*.out +*.pid +*.gz +.DS_Store +*.env + +pids +logs +results + +node_modules +npm-debug.log +bower_components + +public/js/* + +server.key +server.crt +server.csr + +dump.rdb +coverage/ +/coverage/* +OpenTok-iOS-2.4.0/ +opentok-ios-sdk-* +/BrowserStackLocal +/sc-*/* +sauce-connect.log + +.tern-project + +.vscode/settings.json + +build + +/scripts/allLicenseResults.json + +vcr.yml +.scannerwork/ + +.nx/cache +.nx/workspace-data +.cursor/rules/nx-rules.mdc +.github/instructions/nx.instructions.md +vite.config.*.timestamp* +vitest.config.*.timestamp* +*.tsbuildinfo +vcr-dev.yml + +/frontend/distRoom +room.zip diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.husky/pre-commit b/tutorials/vonage_video_ios_app-theme-customization/project/.husky/pre-commit new file mode 100755 index 00000000..afa3f0c2 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.husky/pre-commit @@ -0,0 +1,8 @@ +#!/usr/bin/env sh +set -eu + +# skip on CI or if deps aren't installed yet +[ -n "${CI:-}" ] && exit 0 + +# Run your quality checks +yarn --silent quality-check diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.husky/pre-push b/tutorials/vonage_video_ios_app-theme-customization/project/.husky/pre-push new file mode 100755 index 00000000..d2893157 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.husky/pre-push @@ -0,0 +1,8 @@ +#!/usr/bin/env sh +set -eu + +# Skip on CI +[ -n "${CI:-}" ] && exit 0 + +echo "🔍 Running tests before push..." +yarn --silent test diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.nvmrc b/tutorials/vonage_video_ios_app-theme-customization/project/.nvmrc new file mode 100644 index 00000000..35d2d08e --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.nvmrc @@ -0,0 +1 @@ +22.12 diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.prettierignore b/tutorials/vonage_video_ios_app-theme-customization/project/.prettierignore new file mode 100644 index 00000000..8eadedc2 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.prettierignore @@ -0,0 +1,20 @@ +# Generated or irrelevant files +*.log +frontend/docs/ + +# Documentation [todo]: We should be able to use prettier for this to ensure consistent formatting +*.md + +# Build and dependency folders +dist/ +node_modules/ +coverage/ +.nx/ +.turbo/ +integration-tests/node_modules/ +integration-tests/playwright-report/ +integration-tests/test-results/ + +# Public compiled assets +public/js/ + diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.prettierrc b/tutorials/vonage_video_ios_app-theme-customization/project/.prettierrc new file mode 100644 index 00000000..789ac2e5 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.prettierrc @@ -0,0 +1,5 @@ +{ + "printWidth": 100, + "singleQuote": true, + "trailingComma": "es5" +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.vcrignore b/tutorials/vonage_video_ios_app-theme-customization/project/.vcrignore new file mode 100644 index 00000000..9a5eb5cb --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.vcrignore @@ -0,0 +1,2 @@ +vcr-dev.yml +vcr-gha.yml diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.vonage/catalog-info.yaml b/tutorials/vonage_video_ios_app-theme-customization/project/.vonage/catalog-info.yaml new file mode 100644 index 00000000..aedf61b2 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.vonage/catalog-info.yaml @@ -0,0 +1,36 @@ +--- +apiVersion: backstage.io/v1alpha1 +kind: System +metadata: + name: video-react-ref-app # SERVICE NAME field + title: Video React Ref App # Title (human-friendly library name) field + description: Vonage Video API JS React reference application + annotations: + vonage.com/jira-id: VPF # video general projects + vonage.com/maintainers: | + - Hossein Movahed @Hossein-Movahed + - Johnny Esteban Quesada @johnny-quesada-developer + - Oscar Fava @OscarFava +spec: + type: library + owner: group:orgdata/vdk # helm "owner" orgdata squad id or general orgdata/vid + domain: video-api # Product this library belongs to +--- +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: video-react-ref-app + description: Video React Ref App Component + annotations: + github.com/project-slug: Vonage/vonage-video-react-app # GH repo + vonage.com/maintainers: | + - Hossein Movahed @Hossein-Movahed + - Johnny Esteban Quesada @johnny-quesada-developer + - Oscar Fava @OscarFava +spec: + type: library + owner: group:orgdata/vdk + system: video-react-ref-app + lifecycle: production + dependsOn: + - component:default/video-js-sdk diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.vonage/deploy/.gitkeep b/tutorials/vonage_video_ios_app-theme-customization/project/.vonage/deploy/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.vscode/extensions.json b/tutorials/vonage_video_ios_app-theme-customization/project/.vscode/extensions.json new file mode 100644 index 00000000..2018509b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.vscode/extensions.json @@ -0,0 +1,12 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint", + "streetsidesoftware.code-spell-checker", + "naumovs.color-highlight", + "nrwl.angular-console", + "ms-playwright.playwright", + "esbenp.prettier-vscode", + "bradlc.vscode-tailwindcss", + "github.copilot-chat" + ] +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.vscode/launch.json b/tutorials/vonage_video_ios_app-theme-customization/project/.vscode/launch.json new file mode 100644 index 00000000..cefbee98 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.vscode/launch.json @@ -0,0 +1,13 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "attach", + "name": "Attach to Backend", + "port": 9229, + "restart": true, + "skipFiles": ["/**", "**/node_modules/**"] + } + ] +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.vscode/vera.contextStore.code-snippets b/tutorials/vonage_video_ios_app-theme-customization/project/.vscode/vera.contextStore.code-snippets new file mode 100644 index 00000000..a7b2747f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.vscode/vera.contextStore.code-snippets @@ -0,0 +1,53 @@ +{ + "Context Store": { + "scope": "typescriptreact,typescript", + "prefix": "contextStore", + "description": "React global state context store template", + "body": [ + "import { createContext, type InferAPI } from 'react-global-state-hooks';", + "", + "export type ${TM_FILENAME_BASE/^(.)(.*?)\\$?$/${1:/upcase}$2/}Api = InferAPI;", + "", + "const ${TM_FILENAME_BASE/^(.)(.*?)\\$?$/${1:/downcase}$2/}\\$ = createContext(initialValue, {", + " name: '${TM_FILENAME_BASE/^(.)(.*?)\\$?$/${1:/downcase}$2/}',", + " metadata,", + "", + " /**", + " * Define your actions here. Or delete this section if you don't have any actions.", + " */", + " // actions: {", + " // someAction(...args) {", + " // return (api) => {", + " // const { getState, setState } = api as ${TM_FILENAME_BASE/^(.)(.*?)\\$?$/${1:/upcase}$2/}Api;", + " // // your logic goes here...", + " // };", + " // },", + " // },", + "", + " /**", + " * Define your lifecycle callbacks here. Or delete this section if you don't have any callbacks.", + " */", + " // callbacks: {", + " // onInit() {", + " // const api = this as ${TM_FILENAME_BASE/^(.)(.*?)\\$?$/${1:/upcase}$2/}Api;", + " // // your logic goes here...", + " // },", + " // },", + "});", + "", + "function initialValue() {", + " return {", + " // Add your initial state properties here", + " };", + "}", + "", + "function metadata() {", + " return {", + " // Add your metadata properties here", + " };", + "}", + "", + "export default ${TM_FILENAME_BASE/^(.)(.*?)\\$?$/${1:/downcase}$2/}\\$;$0", + ], + }, +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.vscode/vera.reactComponent.code-snippets b/tutorials/vonage_video_ios_app-theme-customization/project/.vscode/vera.reactComponent.code-snippets new file mode 100644 index 00000000..34ebf752 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.vscode/vera.reactComponent.code-snippets @@ -0,0 +1,20 @@ +{ + "React Component": { + "scope": "typescriptreact", + "prefix": "reactComponent", + "description": "Vera react component template with tailwind", + "body": [ + "import classNames from 'classnames';", + "import type { ComponentProps, FC } from 'react';", + "import { twMerge } from 'tailwind-merge';", + "", + "type ${TM_FILENAME_BASE}Props = ComponentProps<'${1:div}'> & {$2};", + "", + "const ${TM_FILENAME_BASE}: FC<${TM_FILENAME_BASE}Props> = ({ className, ...props }) => {", + " return <${1:div} className={twMerge(classNames('${TM_FILENAME_BASE}', className))} {...props}$0 />;", + "};", + "", + "export default ${TM_FILENAME_BASE};", + ], + }, +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/.windsurfrules b/tutorials/vonage_video_ios_app-theme-customization/project/.windsurfrules new file mode 120000 index 00000000..02dd1341 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/.windsurfrules @@ -0,0 +1 @@ +.github/copilot-instructions.md \ No newline at end of file diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/AGENTS.md b/tutorials/vonage_video_ios_app-theme-customization/project/AGENTS.md new file mode 120000 index 00000000..02dd1341 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/AGENTS.md @@ -0,0 +1 @@ +.github/copilot-instructions.md \ No newline at end of file diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/CLAUDE.md b/tutorials/vonage_video_ios_app-theme-customization/project/CLAUDE.md new file mode 120000 index 00000000..02dd1341 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/CLAUDE.md @@ -0,0 +1 @@ +.github/copilot-instructions.md \ No newline at end of file diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/CODEX.md b/tutorials/vonage_video_ios_app-theme-customization/project/CODEX.md new file mode 120000 index 00000000..02dd1341 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/CODEX.md @@ -0,0 +1 @@ +.github/copilot-instructions.md \ No newline at end of file diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/CODE_OF_CONDUCT.md b/tutorials/vonage_video_ios_app-theme-customization/project/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..d765a13f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/CODE_OF_CONDUCT.md @@ -0,0 +1,85 @@ + +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at [devrel@vonage.com](mailto:devrel@vonage.com). All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of actions. + +**Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0, +available at `https://www.contributor-covenant.org/version/2/0/code_of_conduct.html`. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +`https://www.contributor-covenant.org/faq`. Translations are available at `https://www.contributor-covenant.org/translations`. diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/GEMINI.md b/tutorials/vonage_video_ios_app-theme-customization/project/GEMINI.md new file mode 120000 index 00000000..02dd1341 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/GEMINI.md @@ -0,0 +1 @@ +.github/copilot-instructions.md \ No newline at end of file diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/LICENSE b/tutorials/vonage_video_ios_app-theme-customization/project/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/MAINTAINERS.md b/tutorials/vonage_video_ios_app-theme-customization/project/MAINTAINERS.md new file mode 100644 index 00000000..fe1ec4ed --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/MAINTAINERS.md @@ -0,0 +1,44 @@ +# Maintainers + +This repository is actively maintained by Vonage engineers. + +## Current Maintainers + +| Role | Name | +|---|---| +| Full Stack | Hossein Movahed ([@Hossein-Movahed](https://github.com/Hossein-Movahed)) | +| Full Stack | Johnny Esteban Quesada ([@johnny-quesada-developer](https://github.com/johnny-quesada-developer)) | +| Full Stack | Oscar Fava ([@OscarFava](https://github.com/OscarFava)) | + +## Responsibilities + +Maintainers are responsible for: + +- Reviewing and approving pull requests +- Maintaining code quality, consistency, and CI stability +- Managing releases and dependency updates +- Triaging issues and discussions +- Ensuring contributions align with the goals and long-term direction of the project +- Evaluating architectural, performance, operational, and product impact of proposed changes + +## Pull Request Expectations + +- At least one maintainer approval is required before merge +- CI must pass before merge +- Breaking changes should be discussed before implementation +- Pull requests should align with the project's scope, maintainability standards, and long-term goals +- Large features should be submitted in isolated pull requests when possible +- Maintainers may request scope reduction or architectural changes to keep the project maintainable and lightweight + +## Project Direction + +Maintainers are responsible not only for reviewing code correctness, but also for evaluating the broader impact of changes on: + +- Bundle size and application performance +- Mobile and low-bandwidth user experience +- Dependency footprint and operational complexity +- Distribution and embeddability constraints +- Developer experience and maintainability +- Product consistency and UI/UX direction + +Contributions may be declined or requested to be re-scoped if they introduce significant architectural, performance, or product tradeoffs that do not align with the current direction of the project. \ No newline at end of file diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/README.md b/tutorials/vonage_video_ios_app-theme-customization/project/README.md new file mode 100644 index 00000000..316d867f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/README.md @@ -0,0 +1,619 @@ +# Vonage Video API Reference App for React + +Nexmo is now known as Vonage + +## Welcome to Vonage + +If you're new to Vonage, you can [sign up for a Vonage API account](https://dashboard.vonage.com/?utm_source=DEV_REL&utm_medium=github&utm_campaign=vonage-video-react-app) and get some free credit to get you started. + +## Table of Contents + + +- [Table of Contents](#table-of-contents) +- [What is it?](#what-is-it) +- [Cross-Platform Support](#cross-platform-support) +- [Why use it?](#why-use-it) +- [Project Architecture](#project-architecture) +- [Platforms Supported](#platforms-supported) +- [Requirements](#requirements) +- [Running Locally](#running-locally) +- [Storybook](#storybook) +- [UI Customization](#ui-customization) +- [Environment Configuration](#environment-configuration) +- [Testing on Multiple Devices](#testing-on-multiple-devices) +- [Deployment to Vonage Cloud Runtime](#deployment-to-vonage-cloud-runtime) +- [Testing](#testing) + - [Integration Tests](#integration-tests) + - [Screenshot tests or Visual comparisons](#screenshot-tests-or-visual-comparisons) + - [Generating and Updating Screenshots](#generating-and-updating-screenshots) + - [Running the backend and frontend test suites](#running-the-backend-and-frontend-test-suites) + - [Backend Suite](#backend-suite) + - [Frontend Suite](#frontend-suite) +- [Code style](#code-style) + - [Linting and auto-formatting](#linting-and-auto-formatting) + - [File names](#file-names) +- [Documentation Generation](#documentation-generation) +- [Code of Conduct](#code-of-conduct) +- [Maintainers](#maintainers) +- [Getting Involved](#getting-involved) +- [Known Issues](#known-issues) +- [Report Issues](#report-issues) + + +## What is it? +The Vonage Video API Reference App for React is an open-source video conferencing reference application for the [Vonage Video API](https://developer.vonage.com/en/video/client-sdks/web/overview) using the React framework. + +The Reference App demonstrates the best practices for integrating the [Vonage Video API](https://developer.vonage.com/en/video/client-sdks/web/overview) with your application for various use cases, from one-to-one and multi-participant video calling to recording, screen sharing, reactions, and more. + +## Why use it? +The Vonage Video API Reference App for React provides developers an easy-to-setup way to get started with using our APIs with React. + +The application is open-source, so you can not only get started quickly, but easily extend it with features needed for your use case. Any features already implemented in the Reference App use best practices for scalability and security. + +As a commercial open-source project, you can also count on a solid information security architecture. While no packaged solution can guarantee absolute security, the transparency that comes with open-source software, combined with the proactive and responsive open-source community and vendors, provides significant advantages in addressing information security challenges compared to closed-source alternatives. + +This application provides features for common conferencing use cases, such as: + +-
        + A landing page for users to create and join meeting rooms. + Screenshot of landing page +
        +-
        + A waiting room for users to preview their audio and video device settings and set their name before entering a meeting room. + Screenshot of waiting room +
        +-
        + A post-call page to navigate users to the landing page, re-enter the left room, and display archive(s), if any. + Screenshot of goodbye page +
        +- A video conferencing “room” supporting up to 25 participants and the following features: +-
        + Input and output device selectors. + Screenshot of audio devices selector +
        +-
        + Noise suppression toggles in meeting room + Screenshot of noise supression toggle +
        +-
        + + Video effects in meeting and waiting room. You can set predefined images, custom image or slight/strong background blur. Images can be uploaded from local device or URL in these formats: JPG, PNG, GIF or BMP. Video effects are not supported in non-Chromium-based browsers or on iOS. + + Please see [OT.hasMediaProcessorSupport](https://vonage.github.io/video-docs/video-js-reference/latest/OT.html#hasMediaProcessorSupport) for more information. + + + Screenshot of video effects +
        +-
        + Composed archiving capabilities to record your meetings. + Screenshot of archiving dialog box +
        +-
        + In-call tools such as screen sharing (subscriber can zoom in/out if hasMediaProcessorSupport), group chat function, and emoji reactions. + Screenshot of emojis +
        +- Active speaker detection. +- Layout manager with options to display active speaker, screen share, or all participants in a grid view. +- The dynamic display adjusts to show new joiners, hide video tiles to conserve bandwidth, and show the “next” participant when someone previously speaking leaves. +-
        + Ability to mute other participants during the meeting. + Screenshot of muting participant dialog box +
        +-
        + Call participant list with audio on/off indicator. + Screenshot of participant list +
        +- Meeting information with an easy-to-share URL to join the meeting. +-
        + A reporting tool to enable participants to file any in-call issues. + Screenshot of report issue pane +
        + +## Project Architecture + +The project uses an Nx workspace to manage the frontend and backend applications. + +![Vonage Video API Reference App Architecture Diagram](./docs/assets/project-architecture.svg) + +## Platforms Supported +The Vonage Video API Reference App for React is currently supported on the latest release versions for the following browsers: +- ![Chrome icon](/docs/assets/chrome.svg) Google Chrome +- ![Firefox icon](/docs/assets/ff.svg) Firefox +- ![Edge icon](/docs/assets/edge.svg) Microsoft Edge +- ![Opera icon](/docs/assets/opera.svg) Opera +- ![Safari icon](/docs/assets/safari.svg) Safari + +*Note:* Some browsers such as Firefox or Safari do not support media processors like video and audio filters (e.g video effects): Please see [OT.hasMediaProcessorSupport](https://vonage.github.io/video-docs/video-js-reference/latest/OT.html#hasMediaProcessorSupport) for more information. + +*Note:* Mobile web views have limited supported at the moment. The minimum supported device width is `360px`. + +## Cross-Platform Support +Looking to build on other platforms? The Vonage Video API Reference App is also available for: + +- *iOS*: [vonage-video-ios-app](https://github.com/Vonage/vonage-video-ios-app) +- *Android*: [vonage-video-android-app](https://github.com/Vonage/vonage-video-android-app) + +These reference apps share the same backend infrastructure and demonstrate consistent best practices across all platforms, making it easy to build unified video experiences for your users. + +## Requirements + + +- [node.js](https://nodejs.org/en/download/releases/) (version 22) +- [yarn](https://yarnpkg.com) +- optional - [nvm](https://github.com/creationix/nvm) (recommended for switching Node versions) + +## Running Locally + +- **Ensure You Have a Vonage Account** + + You can create one at the [Vonage API Dashboard](https://dashboard.vonage.com/applications). + +- **Create an Application in the Dashboard** + + Once logged in, navigate to the [Applications page](https://dashboard.vonage.com/applications) via the main dashboard menu: + +
        + Applications dashboard view + Applications dashboard +
        + + If you don’t already have an application, create a new one: + +
        + Create new app + Create app button +
        + + During the setup process, make sure to: + + - Provide a name for your application. + - Generate and download the public and private keys. + - Enable **Video** capabilities. + + Refer to the following image for visual guidance: + +
        + Configuring a new app + Create app form +
        +
        + +- **Environment Variables** + + In the root project directory, create the backend environment file by running: + + ``` bash + cp backend/.env.example backend/.env + ``` + + Then, open **backend/.env** and fill in the required configuration: + + - **VONAGE_APP_ID** – This is the ID of your Vonage application. You can find it on the [Applications page](https://dashboard.vonage.com/applications). + - **VONAGE_PRIVATE_KEY** – If you've already generated a private key, use that. Otherwise, use the key you downloaded when creating the app. + + Frontend feature flags and display settings are configured in [`vcrBuild.env.sh`](vcrBuild.env.sh). The defaults work out of the box — edit that file only when you need to customise behaviour. See [Environment Configuration](#environment-configuration) for the full list of available options. + +
        + +- **Start in Development Mode** + + ``` bash + yarn dev + ``` + + This starts both the backend server (port **3345**) and the frontend Vite dev server (port **5173**). You can now access the app at [http://localhost:5173](http://localhost:5173). + +## Storybook + +Storybook is available for developing and testing UI components in isolation. + +To run Storybook for the frontend: + +```bash +yarn storybook:frontend +``` + +This will start the Storybook dev server at [http://localhost:6006](http://localhost:6006). + +----- + +To run Storybook for the ui: + +```bash +yarn storybook:ui +``` + +This will start the Storybook dev server at [http://localhost:6007](http://localhost:6007). + +## UI Customization + +The app theme is configured through the root `designTokens.json` file. + +### Customize your theme + +1. Edit `designTokens.json` at the project root with your palette/theme values. +2. Sync theme artifacts: + +```bash +yarn sync:theme-tokens +``` + +This command always regenerates `designTokens.example.json`, syncs `libs/ui/src/theme/helpers/designTokens/designTokens.json` from root `designTokens.json` when present, creates root `designTokens.json` from defaults when missing, rebuilds the Tailwind plugin, and formats the generated plugin file. + +--- + +## Environment Configuration + +The app has two parts — a **backend** server and a **frontend** UI. The backend is configured through `backend/.env`. Frontend settings are configured through [`vcrBuild.env.sh`](vcrBuild.env.sh), which is the single place for all frontend configuration. + +Create the backend configuration file by running: + +```bash +cp backend/.env.example backend/.env +``` + +Then open it in a text editor and fill in the values described below. + +--- + +### Backend (`backend/.env`) + +Open `backend/.env` and configure the following variables. + +#### Video service provider + +Exactly one provider block must be configured. + +**Vonage Video API (default)** + +| Variable | Required | Description | +|----------|----------|-------------| +| `VIDEO_SERVICE_PROVIDER` | ✅ | Must be `vonage` | +| `VONAGE_APP_ID` | ✅ | Your Vonage application ID from the [dashboard](https://dashboard.vonage.com/applications) | +| `VONAGE_PRIVATE_KEY` | ✅ | Contents of the private key file downloaded when creating the application | + +```ini +VIDEO_SERVICE_PROVIDER='vonage' +VONAGE_APP_ID='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' +VONAGE_PRIVATE_KEY='-----BEGIN PRIVATE KEY----- +... +-----END PRIVATE KEY-----' +``` + +**OpenTok (TokBox) SDK** + +| Variable | Required | Description | +|----------|----------|-------------| +| `VIDEO_SERVICE_PROVIDER` | ✅ | Must be `opentok` | +| `OT_API_KEY` | ✅ | Your OpenTok API key | +| `OT_API_SECRET` | ✅ | Your OpenTok API secret | + +```ini +VIDEO_SERVICE_PROVIDER='opentok' +OT_API_KEY='your-api-key' +OT_API_SECRET='your-api-secret' +``` + +#### Vonage Cloud Runtime (VCR) + +| Variable | Required | Description | +|----------|----------|-------------| +| `VCR_PORT` | ⚠️ VCR only | Port exposed by VCR (typically `3345`). **Do not set this locally** — its presence switches the app to VCR storage. | + +#### Jira feedback integration (optional) + +Enables the in-call issue reporting tool to file tickets directly into Jira. + +| Variable | Description | +|----------|-------------| +| `JIRA_URL` | Base URL of your Jira instance | +| `JIRA_API_URL` | Jira REST API base URL | +| `JIRA_TOKEN` | API token for authentication | +| `JIRA_PROJECT_KEY` | Target project key | +| `JIRA_COMPONENT_ID` | Default component ID for filed issues | +| `JIRA_iOS_COMPONENT_ID` | Component ID for iOS issues | +| `JIRA_ANDROID_COMPONENT_ID` | Component ID for Android issues | +| `JIRA_EPIC_LINK` | Epic link field value | +| `JIRA_EPIC_URL` | URL to the target epic | + +--- + +### Frontend + +Frontend settings control which features are visible, what language the app uses, and how the video room behaves by default. **All frontend configuration lives in a single file: [`vcrBuild.env.sh`](vcrBuild.env.sh).** + +This file is loaded automatically whenever the app is built or deployed. To change a setting, open [`vcrBuild.env.sh`](vcrBuild.env.sh), update the relevant `export` line, and restart or rebuild: + +```bash +# vcrBuild.env.sh +export ALLOW_CHAT=false +export DEFAULT_LAYOUT_MODE='grid' +export I18N_SUPPORTED_LANGUAGES='en|es' +``` + +> **Note:** After editing [`vcrBuild.env.sh`](vcrBuild.env.sh) you need to restart the app (`yarn dev`) or trigger a new build for the changes to take effect. + +#### Network + +| Variable | Default | Description | +|----------|---------|-------------| +| `API_URL` | `http://localhost:3345` (local) / `window.location.origin` (production) | URL of the backend API server | +| `TUNNEL_DOMAIN` | — | ngrok (or similar) domain used when testing across devices. See [Testing on Multiple Devices](#testing-on-multiple-devices) | + +#### Internationalisation + +| Variable | Default | Accepted values | Description | +|----------|---------|-----------------|-------------| +| `I18N_FALLBACK_LANGUAGE` | `en` | `en` \| `en-US` \| `es` \| `es-MX` \| `it` | Language used when the user's locale is not supported | +| `I18N_SUPPORTED_LANGUAGES` | `en` | Pipe-separated list, e.g. `en\|es\|it` | Languages offered in the UI | + +#### Feature flags + +All feature flags are **boolean** (`true` / `false`). + +| Variable | Default | Description | +|----------|---------|-------------| +| `ALLOW_BACKGROUND_EFFECTS` | `true` | Enable virtual background and blur effects | +| `ALLOW_CAMERA_CONTROL` | `true` | Show the camera on/off toggle | +| `ALLOW_VIDEO_ON_JOIN` | `true` | Start with camera enabled when joining | +| `ALLOW_ADVANCED_NOISE_SUPPRESSION` | `true` | Enable the advanced noise-suppression toggle | +| `ALLOW_AUDIO_ON_JOIN` | `true` | Start with microphone enabled when joining | +| `ALLOW_MICROPHONE_CONTROL` | `true` | Show the microphone on/off toggle | +| `WAITING_ROOM_ALLOW_DEVICE_SELECTION` | `true` | Show device selectors in the waiting room | +| `MEETING_ROOM_ALLOW_DEVICE_SELECTION` | `true` | Show device selectors inside the meeting room | +| `ALLOW_ARCHIVING` | `true` | Enable meeting recording (archiving) | +| `ALLOW_CAPTIONS` | `true` | Enable live captions | +| `ALLOW_CHAT` | `true` | Enable the in-call group chat | +| `ALLOW_EMOJIS` | `true` | Enable emoji reactions | +| `ALLOW_SCREEN_SHARE` | `true` | Enable screen sharing | +| `SHOW_PARTICIPANT_LIST` | `true` | Show the participant list panel | +| `ENABLE_REPORT_ISSUE` | `false` | Show the in-call issue reporting tool | +| `BYPASS_WAITING_ROOM` | `false` | Skip the waiting room and join directly | +| `AVOID_FETCHING_APP_CONFIG` | `true` | Skip fetching remote app configuration on startup | + +#### Display defaults + +| Variable | Default | Accepted values | Description | +|----------|---------|-----------------|-------------| +| `DEFAULT_RESOLUTION` | `1280x720` | `1920x1080` \| `1280x960` \| `1280x720` \| `640x480` \| `640x360` \| `320x240` \| `320x180` | Default outgoing video resolution | +| `DEFAULT_LAYOUT_MODE` | `active-speaker` | `active-speaker` \| `grid` | Default in-room layout when a participant joins | +| `MIN_CUSTOM_VIDEO_BITRATE_BPS` | `5000` | Positive integer (bps) | Minimum selectable custom video bitrate in the Advanced Settings dialog | +| `MAX_CUSTOM_VIDEO_BITRATE_BPS` | `10000000` | Positive integer (bps) | Maximum selectable custom video bitrate in the Advanced Settings dialog | +| `SUPPORTED_FRAME_RATES` | `30\|15\|7\|1` | `\|`-separated positive integers (fps) | Frame rate options shown in the Advanced Settings video tab | + +> **Note:** `DEFAULT_LAYOUT_MODE` and `ALLOW_AUDIO_ON_JOIN` / `ALLOW_VIDEO_ON_JOIN` require the participant to **rejoin the room** to take effect after being changed. + +--- + +## Testing on Multiple Devices + +To test the video API across multiple devices on your local network, you can use **ngrok** to expose your frontend and backend publicly. + +1. Create an account at [ngrok](https://dashboard.ngrok.com/signup) if you haven't already. + +2. Follow the [Setup and Installation instructions](https://dashboard.ngrok.com/get-started/setup/) for your operating system to install and configure ngrok. + +3. **Start the application locally first:** + + ``` bash + yarn dev + ``` + + Make sure both the backend server (port 3345) and frontend dev server (port 5173) are running before proceeding to the next step. + +4. Create secure tunnels for both frontend and backend: + + **Set up ngrok configuration:** + + First, find your ngrok config file location: + ``` bash + ngrok config check + ``` + + Create or edit the ngrok configuration file (typically located at `~/Library/Application Support/ngrok/ngrok.yml` on macOS; `~/.config/ngrok/ngrok.yml` on Linux and `%HOMEPATH%\AppData\Local\ngrok\ngrok.yml` on Windows) with the following content: + + ``` yaml + version: "2" + tunnels: + frontend: + addr: 5173 + proto: http + backend: + addr: 3345 + proto: http + ``` + + **Start both tunnels:** + ``` bash + ngrok start backend frontend + ``` + + This command will create publicly accessible HTTPS URLs for both your frontend and backend. The output will appear in your terminal, similar to the image below: + +
        + ngrok output example + ngrok tunnel example +
        + +
        + +5. Copy the domains from both outputs and update [`vcrBuild.env.sh`](vcrBuild.env.sh): + + ``` bash + export TUNNEL_DOMAIN=your-frontend-domain.ngrok.io + export API_URL=https://your-backend-domain.ngrok.io + ``` + + **Note:** ngrok assigns temporary domains. You'll need to update these values each time the domains change. + +
        + +6. Open the provided frontend **Forwarding** URL in your browser. This exposes your entire application publicly, allowing devices on any network to access it. + +
        + +Enjoy testing! + +## Deployment to Vonage Cloud Runtime + +You can deploy the application to Vonage Cloud Runtime (VCR) for testing in a cloud environment. See the [VCR overview](https://developer.vonage.com/en/vonage-cloud-runtime/overview) for more information. + +For quick development deployments directly from your local machine, you can use the `vcr:dev` script: + +1. **Install the VCR CLI** (if not already installed): + + Follow the installation instructions at https://developer.vonage.com/en/vonage-cloud-runtime/getting-started/working-locally#cli-installation + +2. **Configure VCR with your credentials**: + + ```bash + vcr configure + ``` + + Enter your Vonage API Key and Secret, and select a region. + +3. **Generate application keys**: + + ```bash + vcr app generate-keys --app-id --region + ``` + + Replace `` with your Vonage application ID and `` with your region. + + > ⚠️ **Warning**: You should use a **separate** Vonage application for VCR deployment (different from the `VONAGE_APP_ID` in your `backend/.env` file) to avoid issues with your private key. + +4. **Set up your development configuration**: + + Copy the development configuration example file: + + ```bash + cp vcr.yml.example vcr-dev.yml + ``` + + Open `vcr-dev.yml` and add your application ID. + +5. **Deploy to development**: + + ```bash + yarn vcr:dev + ``` + +This will deploy using your local development configuration and code, making it quick to test changes in a cloud environment. + +## Testing + +### Integration Tests + +We have integration tests using [Playwright](https://playwright.dev/). We recommend using their [VSCode integration](https://playwright.dev/docs/getting-started-vscode) to run tests. + +To run the tests you need to run the app server separately: + +```console +# In one terminal tab +yarn start + +# In a separate tab. Or use vscode extension to run tests +yarn test:integration +``` + +#### Screenshot tests or Visual comparisons + +We use [Playwright Visual Comparison](https://playwright.dev/docs/test-snapshots) for Screenshot UI tests. Since screenshot tests are part of our integration tests, running our integration tests also executes the screenshot tests. + +#### Generating and Updating Screenshots + +If we need to update the expected screenshot due to UI changes, we can delete the existing expected screenshot and then run the test. The test will fail, but a new expected screenshot will be generated. Running the test again should pass, as the expected and actual screenshots will now match. + +For CI tests, we require screenshots for various browsers and operating systems because they [render interfaces with subtle differences](https://github.com/microsoft/playwright/issues/18240#issuecomment-1287546463). + +To capture CI-specific screenshots, you can use the `update-screenshots` job. This job is triggered by creating a pull request (PR) with the `update-screenshots` label on GitHub. Once triggered, it will capture new screenshots on the virtual machine (VM) and automatically push those to the PR's branch. + +### Running the backend and frontend test suites + +- To run the frontend and backend tests: +```console +yarn test +``` + +### Backend Suite + +- To run backend tests once: + +```console +yarn test:backend +``` + +- For additional CLI options, see [jest docs](https://jestjs.io/docs/cli). + +### Frontend Suite +We have frontend tests using [vitest](https://vitest.dev/) and [React Testing Library](https://testing-library.com/docs/react-testing-library/intro). We recommend using the [vitest VSCode integration]( https://marketplace.visualstudio.com/items?itemName=vitest.explorer) to run tests. + +For guidance on writing unit tests, see the [Test Instructions](./.github/instructions/test-files.instructions.md). + +Alternatively you can run the tests in the terminal: +- To run frontend tests once: + +```console +yarn test:frontend +``` + +- For additional CLI options, see [vitest docs](https://vitest.dev/guide/cli#options) + +## Code style + +### Linting and auto-formatting +We use eslint and prettier to format code. Prettier issues will show up in eslint too via eslint-plugin-prettier. +You can setup an eslint extension for your editor. For VSCode use: [dbaeumer.vscode-eslint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint). + +You can either set up vscode to fix eslint issues on save or fix them with VSCode keyboard command palette shortcut `cmd + shift + p > "ESLint: Fix all auto-fixable problems"`. + +In the terminal you can run + +```console +yarn lint +``` + +to check for eslint issues and + +```console +yarn lint:fix +``` + +to fix any auto-fixable issues and also run prettier on all files. + +### File names + +All filenames are in `camelCase`. + +## Documentation Generation + +We use `typedoc` to generate documentation from our jsdoc comments. +Generated documents can be found in the `frontend/dist` folder. + +To generate documentation, run the following in the terminal + +```console +yarn nx run frontend:docs +``` + +## Code of Conduct + +Please read our [Code of Conduct](CODE_OF_CONDUCT.md). + +## Maintainers + +This repository is actively maintained by the Vonage Video team. + +For maintainer responsibilities, review expectations, and project ownership guidelines, see [MAINTAINERS.md](./MAINTAINERS.md). + +## Getting Involved + +If you wish to contribute to this project, read how in [Contributing](./docs/CONTRIBUTING.md). + +## Known Issues + +We track known issues in [Known Issues](./docs/KNOWN_ISSUES.md). Please refer to it for details. + +## Report Issues + +If you have any issues, feel free to open an issue or reach out to support via [support@api.vonage.com](support@api.vonage.com). diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/backend/.env.example b/tutorials/vonage_video_ios_app-theme-customization/project/backend/.env.example new file mode 100644 index 00000000..cf5a9694 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/backend/.env.example @@ -0,0 +1,44 @@ +# Get your Vonage Application ID and Private Key here: https://dashboard.nexmo.com/ +# If using OpenTok SDK and credentials make sure to remove this block and uncomment the block below with OT_ variables. + +VIDEO_SERVICE_PROVIDER='vonage' +VONAGE_APP_ID='' +# e.g. (this is an example application Id): +# VONAGE_APP_ID='12d0d0-aaaa-bbb-ccc-26b780fb' +VONAGE_PRIVATE_KEY='' +# e.g.: (this is an example private key) +# VONAGE_PRIVATE_KEY='----BEGIN RSA PRIVATE KEY----- +# MIIBOAIBAAJARsF2wfXtjllRR8nnz8+CLULn0bqgZtYktJB2BdcB5bw6OYmmDVCc +# TeTC3VXZATdSqNA6WDWCkSVinC05uYEOEwIDAQABAkArUAaYmSkAeKCO54Pl7Ert +# 1gT+l9XU3cW+Wqhdfnsjkdjaksdjas9phpdiQXNosI60a8YyeyBUjCtQGFwbJ1Kl +# AiEAioOWu1s5nbB6ioOXdhbW4Ovfdkjnldfjlkndfjk/njsCIQCCxRfwRVfDcC0h +# hvuOpFzvZ870deo1/OD8j4U8jG+aCQIgXeU55qO+eODLEN6Ha+urmikc1kyQC/KP +# aKMjV5PzfUUCIdfgdfgdERJ1K9EVwfE/5bH1E+TERb3j21UZZphjGv15AiBBs0w5 +# WRuPspPXIAHPKrjEHkUsgDZHW/V0fJWbIjJarw==6ISP6wuV0E6SRl1xKVyoYT0D +# 8iIsCNO9GfFOx3HWN7Q1++fAAhV37 +# -----END PRIVATE KEY----- +# ' + +# If using OpenTok SDK (https://tokbox.com/developer/sdks/js/) remove the variables above and use these instead. +# VIDEO_SERVICE_PROVIDER='opentok' +# OT_API_KEY=api-key +# OT_API_SECRET=api-secret + +# Secret used to sign and verify session key JWTs. +SESSION_KEY_SECRET='' + +# If deploying to Vonage Cloud Runtime (https://developer.vonage.com/en/vonage-cloud-runtime/overview) +# enter your port here; the default is 3345. +# DO NOT SET THIS VARIABLE IN LOCAL ENV: +# If this variable is set the app will try to use VCR Storage. +# VCR_PORT=3345 + +# If implementing the jira service for customer feedback, enter your credentials here. +# JIRA_URL=jira-url +# JIRA_API_URL=jira-api-url +# JIRA_TOKEN=jira-token +# JIRA_PROJECT_KEY=jira-project-key +# JIRA_COMPONENT_ID=jira-component-id +# JIRA_EPIC_URL='jira-epic-url' +# JIRA_EPIC_LINK='jira-epic-link' +# JIRA_SEVERITY_ID='jira-severity-id' diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/backend/eslint.config.mjs b/tutorials/vonage_video_ios_app-theme-customization/project/backend/eslint.config.mjs new file mode 100644 index 00000000..6fce3e0d --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/backend/eslint.config.mjs @@ -0,0 +1,12 @@ +import globals from 'globals'; +import baseConfig from '../eslint.config.mjs'; + +export default [ + ...baseConfig, + { + files: ['**/*.{ts,tsx,js,jsx}'], + languageOptions: { + globals: globals.node, + }, + }, +]; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/__mocks__/config.ts b/tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/__mocks__/config.ts new file mode 100644 index 00000000..1def333a --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/__mocks__/config.ts @@ -0,0 +1,18 @@ +import { jest } from '@jest/globals'; + +const mockOpentokConfig = () => { + return { + default: jest.fn().mockImplementation(() => { + return { + apiKey: 'test-api-key', + apiSecret: 'test-api-secret', + applicationId: 'test-application-id', + privateKey: 'test-private-key', + provider: 'opentok', + gollumUrl: 'https://example.com', + loggerVerbose: false, + }; + }), + }; +}; +export default mockOpentokConfig; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/blockCallsForArgs.ts b/tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/blockCallsForArgs.ts new file mode 100644 index 00000000..55dbdd26 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/blockCallsForArgs.ts @@ -0,0 +1,26 @@ +type PromiseMap = { + [key: string]: PromiseWithResolvers; +}; + +/** + * Util to block simultaneous calls to a function until the first call resolves + * @param {Function} fn - function to be blocked, first argument must be a string key + * @returns {Function} wrapped function + */ +const blockCallsForArgs = (fn: (key: string, ...args: unknown[]) => T) => { + const callsInProgress: PromiseMap = {}; + return async (key: string, ...args: unknown[]): Promise> => { + if (callsInProgress[key]) { + await callsInProgress[key].promise; + } else { + const promiseWithResolvers = Promise.withResolvers(); + callsInProgress[key] = promiseWithResolvers; + } + const res = await fn(key, ...args); + callsInProgress[key]?.resolve(null); + delete callsInProgress[key]; + return res; + }; +}; + +export default blockCallsForArgs; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/config.ts b/tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/config.ts new file mode 100644 index 00000000..610a8ae1 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/config.ts @@ -0,0 +1,80 @@ +import dotenv from 'dotenv'; +import path from 'node:path'; +import { Config, FeedbackConfig } from '../types/config'; +import { fileURLToPath } from 'node:url'; + +/** + * The runtimeDirectory works different on CJS and ESM + * We are embedding __IS_CJS__ variable during build time enforce the correct behavior + */ +let runtimeDir: string = ''; +if (process.env.__IS_CJS__) { + runtimeDir = __dirname; +} else { + runtimeDir = path.dirname(fileURLToPath(import.meta.url)); +} + +dotenv.config({ path: path.join(runtimeDir, '.env') }); + +const loadConfig = (): Config => { + const provider = process.env.VIDEO_SERVICE_PROVIDER ?? ''; + const sessionKeySecret = process.env.SESSION_KEY_SECRET ?? ''; + + const loggerVerbose = process.env.LOGGER_VERBOSE === 'true'; + + const feedbackConfig: FeedbackConfig = { + url: process.env.JIRA_URL, + apiUrl: process.env.JIRA_API_URL, + token: process.env.JIRA_TOKEN, + key: process.env.JIRA_PROJECT_KEY, + componentId: process.env.JIRA_COMPONENT_ID, + iOSComponentId: process.env.JIRA_iOS_COMPONENT_ID, + androidComponentId: process.env.JIRA_ANDROID_COMPONENT_ID, + epicLink: process.env.JIRA_EPIC_LINK, + epicUrl: process.env.JIRA_EPIC_URL, + severityId: process.env.JIRA_SEVERITY_ID, + gollumUrl: process.env.GOLLUM_BASE_URL, + }; + + if (provider === 'vonage') { + const applicationId = process.env.VONAGE_APP_ID ?? ''; + const privateKey = process.env.VONAGE_PRIVATE_KEY ?? ''; + const videoHost = process.env.VONAGE_VIDEO_HOST; + + if (!applicationId || !privateKey) { + throw new Error('Missing config values for Vonage'); + } + + return { + ...feedbackConfig, + applicationId, + privateKey, + provider: 'vonage', + videoHost, + sessionKeySecret, + loggerVerbose, + }; + } + + if (provider === 'opentok') { + const apiKey = process.env.OT_API_KEY ?? ''; + const apiSecret = process.env.OT_API_SECRET ?? ''; + + if (!apiKey || !apiSecret) { + throw new Error('Missing config values for OpenTok'); + } + + return { + ...feedbackConfig, + apiKey, + apiSecret, + provider: 'opentok', + sessionKeySecret, + loggerVerbose, + }; + } + + throw new Error(`Unknown video service provider: ${provider || 'undefined'}`); +}; + +export default loadConfig; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/delay.ts b/tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/delay.ts new file mode 100644 index 00000000..2951fba3 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/delay.ts @@ -0,0 +1,12 @@ +/** + * Waits for a specified of time + * @param {number} delayMs - the number of milliseconds to wait + * @returns {Promise} a promise that resolves after the delay has elapsed + */ +const delay = (delayMs: number): Promise => + new Promise((resolve) => { + setTimeout(() => { + resolve(); + }, delayMs); + }); +export default delay; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/getOrCreateSessionKeyFromRoomName.ts b/tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/getOrCreateSessionKeyFromRoomName.ts new file mode 100644 index 00000000..7c5573fb --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/getOrCreateSessionKeyFromRoomName.ts @@ -0,0 +1,37 @@ +import { VideoClient } from '../routes/video'; +import getSessionStorageService from '../sessionStorageService'; +import blockCallsForArgs from './blockCallsForArgs'; +import { isValidRoomName } from '@common/assertions'; +import { makeBadRequestErrorHandler } from '@api-lib/errors'; + +const sessionService = getSessionStorageService(); + +const getOrCreateSessionKeyFromRoomName = async ({ + videoClient, + roomName, +}: { + roomName: string; + videoClient: VideoClient; +}) => { + return blockCallsForArgs(async () => { + const storedSessionKey = await sessionService.getSessionKeyByRoomName({ roomName }); + if (storedSessionKey) return storedSessionKey; + + if (!isValidRoomName(roomName)) { + throw makeBadRequestErrorHandler(`Invalid room name: ${roomName}.`)(null); + } + + const session = await videoClient.createSession({ roomName }); + const { sessionKey, sessionId } = session; + + await sessionService.setSession({ + roomName, + sessionKey, + sessionId, + }); + + return session.sessionKey; + })(roomName); +}; + +export default getOrCreateSessionKeyFromRoomName; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/getSessionKeyFromRoomName.ts b/tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/getSessionKeyFromRoomName.ts new file mode 100644 index 00000000..19ecf5d6 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/getSessionKeyFromRoomName.ts @@ -0,0 +1,16 @@ +import { makeNotFoundErrorHandler } from '@api-lib/errors'; +import getSessionStorageService from '../sessionStorageService'; + +const sessionService = getSessionStorageService(); + +const getSessionKeyFromRoomName = async ({ roomName }: { roomName: string }): Promise => { + const storedSessionKey = await sessionService.getSessionKeyByRoomName({ roomName }); + + if (!storedSessionKey) { + throw makeNotFoundErrorHandler(`No session found for room name: ${roomName}`)(null); + } + + return storedSessionKey; +}; + +export default getSessionKeyFromRoomName; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/index.ts new file mode 100644 index 00000000..6a3e710f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/backend/helpers/index.ts @@ -0,0 +1,4 @@ +export { default as blockCallsForArgs } from './blockCallsForArgs'; +export { default as loadConfig } from './config'; +export { default as getOrCreateSessionKeyFromRoomName } from './getOrCreateSessionKeyFromRoomName'; +export { default as getSessionKeyFromRoomName } from './getSessionKeyFromRoomName'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/backend/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/backend/index.ts new file mode 100644 index 00000000..3f538bc5 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/backend/index.ts @@ -0,0 +1,3 @@ +import startServer from './server'; + +void startServer(); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/backend/jest.config.js b/tutorials/vonage_video_ios_app-theme-customization/project/backend/jest.config.js new file mode 100644 index 00000000..3dc769cb --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/backend/jest.config.js @@ -0,0 +1,41 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +export default { + preset: 'ts-jest/presets/default-esm', + testEnvironment: 'node', + clearMocks: true, + moduleDirectories: ['ts', 'tsx', 'node_modules'], + coverageProvider: 'v8', + roots: ['/'], + modulePaths: [''], + testMatch: ['**/tests/**/*.+(ts|tsx)', '**/?(*.)+(test).+(ts|tsx)'], + setupFiles: ['/jest/documentPolyfill.js', '/jest/setEnvVars.js'], + coveragePathIgnorePatterns: ['/node_modules/', '/tests/', '/index\\.ts$'], + collectCoverageFrom: [ + '**/*.{ts,tsx}', + '!**/node_modules/**', + '!**/tests/**', + '!**/index.ts', + + // interfaces/types files, don't need to be tested + '!**/storage/sessionStorage.ts', + ], + moduleNameMapper: { + '^@api-lib$': '/../libs/api/src', + '^@api-lib/(.*)$': '/../libs/api/src/$1', + '^@common$': '/../libs/common/src', + '^@common/(.*)$': '/../libs/common/src/$1', + '^@common-test$': '/../libs/common/test', + '^@common-test/(.*)$': '/../libs/common/test/$1', + '^@node$': '/../libs/common/srcNode', + '^@node/(.*)$': '/../libs/common/srcNode/$1', + }, + transform: { + '^.+\\.tsx?$': [ + 'ts-jest', + { + tsconfig: 'tsconfig.json', + useESM: true, + }, + ], + }, +}; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/backend/jest/documentPolyfill.js b/tutorials/vonage_video_ios_app-theme-customization/project/backend/jest/documentPolyfill.js new file mode 100644 index 00000000..c8e22a86 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/backend/jest/documentPolyfill.js @@ -0,0 +1,15 @@ +/** + * Polyfill for document.cookie required by opentok-solutions-logging in Node.js test environment. + * Must run before any module that imports opentok-solutions-logging is loaded. + */ +if (typeof globalThis.document === 'undefined') { + let cookieStore = ''; + globalThis.document = { + get cookie() { + return cookieStore; + }, + set cookie(val) { + cookieStore = val; + }, + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/backend/jest/documentPolyfill.test.ts b/tutorials/vonage_video_ios_app-theme-customization/project/backend/jest/documentPolyfill.test.ts new file mode 100644 index 00000000..c6a75e45 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/backend/jest/documentPolyfill.test.ts @@ -0,0 +1,25 @@ +import { describe, expect, it } from '@jest/globals'; + +const doc = (globalThis as unknown as { document: { cookie: string } }).document; + +/** + * Tests for documentPolyfill.js. + * The polyfill runs as a Jest setup file before these tests, so document is already defined. + */ +describe('documentPolyfill', () => { + it('defines globalThis.document when missing', () => { + expect(doc).toBeDefined(); + expect(typeof doc).toBe('object'); + }); + + it('provides document.cookie getter that returns a string', () => { + expect(doc.cookie).toBeDefined(); + expect(typeof doc.cookie).toBe('string'); + }); + + it('allows setting and reading document.cookie', () => { + const testValue = 'test=value; path=/'; + doc.cookie = testValue; + expect(doc.cookie).toBe(testValue); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/backend/jest/setEnvVars.js b/tutorials/vonage_video_ios_app-theme-customization/project/backend/jest/setEnvVars.js new file mode 100644 index 00000000..eb30685f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/backend/jest/setEnvVars.js @@ -0,0 +1,14 @@ +process.env.JIRA_API_URL = 'https://example.com'; +process.env.JIRA_URL = 'https://example.com'; +process.env.JIRA_TOKEN = 'JIRA'; +process.env.JIRA_COMPONENT_ID = 'componentId'; +process.env.JIRA_iOS_COMPONENT_ID = 'iOSComponentId'; +process.env.JIRA_ANDROID_COMPONENT_ID = 'androidComponentId'; +process.env.JIRA_EPIC_LINK = 'jiraEpicLink'; +process.env.JIRA_EPIC_URL = 'jiraEpicUrl'; +process.env.VONAGE_APP_ID = 'vonageAppId'; +process.env.VONAGE_PRIVATE_KEY = 'vonagePrivateKey'; +process.env.OT_API_KEY = 'someOpenTokKey'; +process.env.OT_API_SECRET = 'opentokAPISecret'; +process.env.SESSION_KEY_SECRET = 'test-session-key-secret-for-jwt-signing'; +process.env.GOLLUM_BASE_URL = 'https://example.com'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/backend/jest/setEnvVars.test.ts b/tutorials/vonage_video_ios_app-theme-customization/project/backend/jest/setEnvVars.test.ts new file mode 100644 index 00000000..f2f0c418 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/backend/jest/setEnvVars.test.ts @@ -0,0 +1,68 @@ +import { describe, expect, test } from '@jest/globals'; + +describe('Environment Variables', () => { + test('should have the correct JIRA_API_URL', () => { + const jiraApiUrl = 'https://example.com'; + expect(process.env.JIRA_API_URL).toBe(jiraApiUrl); + }); + + test('should have the correct JIRA_URL', () => { + const jiraUrl = 'https://example.com'; + expect(process.env.JIRA_URL).toBe(jiraUrl); + }); + + test('should have the correct JIRA_TOKEN', () => { + const jiraToken = 'JIRA'; + expect(process.env.JIRA_TOKEN).toBe(jiraToken); + }); + + test('should have the correct JIRA_COMPONENT_ID', () => { + const jiraComponentId = 'componentId'; + expect(process.env.JIRA_COMPONENT_ID).toBe(jiraComponentId); + }); + + test('should have the correct JIRA_iOS_COMPONENT_ID', () => { + const jiraComponentId = 'iOSComponentId'; + expect(process.env.JIRA_iOS_COMPONENT_ID).toBe(jiraComponentId); + }); + + test('should have the correct JIRA_ANDROID_COMPONENT_ID', () => { + const jiraComponentId = 'androidComponentId'; + expect(process.env.JIRA_ANDROID_COMPONENT_ID).toBe(jiraComponentId); + }); + + test('should have the correct JIRA_EPIC_LINK', () => { + const jiraEpicLink = 'jiraEpicLink'; + expect(process.env.JIRA_EPIC_LINK).toBe(jiraEpicLink); + }); + + test('should have the correct JIRA_EPIC_URL', () => { + const jiraEpicUrl = 'jiraEpicUrl'; + expect(process.env.JIRA_EPIC_URL).toBe(jiraEpicUrl); + }); + + test('should have the correct VONAGE_APP_ID', () => { + const vonageAppId = 'vonageAppId'; + expect(process.env.VONAGE_APP_ID).toBe(vonageAppId); + }); + + test('should have the correct VONAGE_PRIVATE_KEY', () => { + const vonagePrivateKey = 'vonagePrivateKey'; + expect(process.env.VONAGE_PRIVATE_KEY).toBe(vonagePrivateKey); + }); + + test('should have the correct OT_API_KEY', () => { + const openTokAPIKey = 'someOpenTokKey'; + expect(process.env.OT_API_KEY).toBe(openTokAPIKey); + }); + + test('should have the correct OT_API_SECRET', () => { + const openTokAPISecret = 'opentokAPISecret'; + expect(process.env.OT_API_SECRET).toBe(openTokAPISecret); + }); + + test('should have the correct GOLLUM_BASE_URL', () => { + const gollumBaseUrl = 'https://example.com'; + expect(process.env.GOLLUM_BASE_URL).toBe(gollumBaseUrl); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/backend/middleware/errorHandler.ts b/tutorials/vonage_video_ios_app-theme-customization/project/backend/middleware/errorHandler.ts new file mode 100644 index 00000000..2742e0d6 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/backend/middleware/errorHandler.ts @@ -0,0 +1,84 @@ +import type { Request, Response, NextFunction } from 'express'; +import StatusCodeEnum from 'status-code-enum'; +import { isApplicationError } from '@common/errors/assertions'; +import ApplicationServerError from '@api-lib/errors/ApplicationServerError'; + +const isDevelopment = process.env.NODE_ENV !== 'production'; + +function tryToLogApplicationError(error: unknown): void { + try { + if (error instanceof ApplicationServerError) { + console.error('[ApplicationServerError]', error.retrieveErrorLogDetails()); + } else if (isApplicationError(error)) { + console.error('[ApplicationError]', error.message); + } else { + console.error('[Error]', error); + } + } catch { + console.error('[Error] (log failed)', error); + } +} + +/** + * Application-level error handler. Handles ValidationError with structured issues, + * and all other errors via ApplicationServerError with safe export. + */ +export function errorHandler( + error: unknown, + req: Request, + res: Response, + _next: NextFunction +): void { + if (res.headersSent) return; + + tryToLogApplicationError(error); + + if (isDevelopment) { + console.error('Development error log:', error); + } + + const applicationError = new ApplicationServerError({ + src: error, + // If the error is not an ApplicationError, fallback to internal server error + fallbackConfig: { + fallbackMessage: 'Internal server error', + statusCode: StatusCodeEnum.ServerErrorInternal, + }, + }); + + // avoids exposing sensitive information while still providing useful error information + const safeError = applicationError.exportSafely(); + const { statusCode } = safeError; + + const accepts = req.headers.accept ?? ''; + + const isJsonRequest = + accepts.includes('application/json') || + req.xhr || + req.headers?.['content-type']?.includes('application/json'); + + if (isJsonRequest) { + res.status(safeError.statusCode).json(safeError); + return; + } + + const isHtmlRequest = accepts.includes('text/html'); + + if (isHtmlRequest) { + const safeMessage = safeError.message + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + + res + .status(statusCode) + .send(`

        ${statusCode}

        ${safeMessage}

        `); + + return; + } + + // fallback to plain text response for other request types + res.status(statusCode).send(safeError.message); +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/backend/middleware/helmetMiddleware/helmetMiddleware.test.ts b/tutorials/vonage_video_ios_app-theme-customization/project/backend/middleware/helmetMiddleware/helmetMiddleware.test.ts new file mode 100644 index 00000000..60834149 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/backend/middleware/helmetMiddleware/helmetMiddleware.test.ts @@ -0,0 +1,70 @@ +import type { Request, Response } from 'express'; +import { beforeEach, describe, expect, it, jest } from '@jest/globals'; + +const helmetHandlerMock = jest.fn(); + +const helmetMock = jest.fn(() => helmetHandlerMock) as jest.Mock & { + contentSecurityPolicy: { + getDefaultDirectives: jest.Mock; + }; +}; + +helmetMock.contentSecurityPolicy = { + getDefaultDirectives: jest.fn(() => ({ + 'default-src': ["'self'"], + })), +}; + +jest.unstable_mockModule('helmet', () => ({ + default: helmetMock, +})); + +describe('helmetMiddleware', () => { + beforeEach(() => { + jest.resetModules(); + jest.clearAllMocks(); + process.env.NODE_ENV = 'production'; + }); + + it('should call the helmet handler', async () => { + const { default: helmetMiddleware } = await import('./helmetMiddleware'); + + const { req, res, next } = createRequestParameters(); + + helmetMiddleware(req, res, next); + + expect(helmetHandlerMock).toHaveBeenCalledWith(req, res, next); + }); + + it('should disable contentSecurityPolicy in development', async () => { + process.env.NODE_ENV = 'development'; + + const { default: helmetMiddleware } = await import('./helmetMiddleware'); + + const { req, res, next } = createRequestParameters(); + + helmetMiddleware(req, res, next); + + expect(helmetMock).toHaveBeenCalledWith( + expect.objectContaining({ + contentSecurityPolicy: false, + hsts: false, + }) + ); + + expect(helmetHandlerMock).toHaveBeenCalledWith(req, res, next); + }); +}); + +function createRequestParameters() { + const req = {} as Request; + + const res = { + setHeader: jest.fn(), + removeHeader: jest.fn(), + } as unknown as Response; + + const next = jest.fn(); + + return { req, res, next }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/backend/middleware/helmetMiddleware/helmetMiddleware.ts b/tutorials/vonage_video_ios_app-theme-customization/project/backend/middleware/helmetMiddleware/helmetMiddleware.ts new file mode 100644 index 00000000..58076791 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/backend/middleware/helmetMiddleware/helmetMiddleware.ts @@ -0,0 +1,82 @@ +import helmet from 'helmet'; +import { RequestHandler } from 'express'; + +const isDevelopment = process.env.NODE_ENV !== 'production'; + +const helmetHandler = helmet({ + contentSecurityPolicy: isDevelopment + ? false + : { + directives: { + // Allow scripts from self and Vonage/OpenTok static assets. + // Needed by the Vonage/OpenTok SDK to load MediaPipe transformer assets, + // including task-vision.js and worker-side scripts loaded through importScripts(...). + 'script-src': [ + "'self'", + // required for web assembly + "'unsafe-eval'", + 'blob:', + 'data:', + 'https://static.opentok.com', + ], + + // Allow connections to self and Vonage/OpenTok backend services. + // Needed for signaling, logging, REST calls, and WebSocket traffic. + 'connect-src': [ + "'self'", + 'https://*.opentok.com', + 'https://*.tokbox.com', + 'https://*.vonage.com', + 'wss://*.opentok.com', + 'wss://*.tokbox.com', + 'wss://*.vonage.com', + 'https://static.opentok.com', + ], + + // Allow images from self, inline/base64 images, blob URLs, and any HTTPS image source. + 'img-src': ["'self'", 'data:', 'blob:', 'https:'], + + // Allow workers created by the SDK/app, including blob-based and inline data: workers. + // Also allow Vonage/OpenTok static assets because MediaPipe may load worker-side + // scripts from static.opentok.com. + 'worker-src': ["'self'", 'blob:', 'data:', 'https://static.opentok.com'], + + // Allow media resources from self, blob URLs, and HTTPS sources. + 'media-src': ["'self'", 'blob:', 'https:'], + }, + }, + + // Disabled so this page can consume external resources without requiring CORP/COEP headers. + // This helps avoid breaking third-party fonts, CDNs, workers, and integrations. + crossOriginEmbedderPolicy: false, + + // Allow external sites to load resources served by this app. + // Needed when the VeraRoom web component/assets are embedded on third-party sites. + crossOriginResourcePolicy: { policy: 'cross-origin' }, + + // Prevent clickjacking by allowing this page to be framed only by the same origin. + // This does not affect usage as a custom element via + + diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/package.json b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/package.json new file mode 100644 index 00000000..5b1f88af --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/package.json @@ -0,0 +1,7 @@ +{ + "name": "frontend", + "version": "1.5.0", + "private": true, + "description": "React reference application for the Vonage Video web client SDK.", + "type": "module" +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/project.json b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/project.json new file mode 100644 index 00000000..10f2b219 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/project.json @@ -0,0 +1,134 @@ +{ + "$schema": "../node_modules/nx/schemas/project-schema.json", + "name": "frontend", + "projectType": "application", + "root": "frontend", + "sourceRoot": "frontend/src", + "targets": { + "build": { + "executor": "nx:run-commands", + "outputs": ["{projectRoot}/dist"], + "options": { + "cwd": "frontend", + "command": "bash -c 'source ../vcrBuild.env.sh && vite build && nx run frontend:cp-build'" + } + }, + "build-room": { + "executor": "nx:run-commands", + "outputs": ["{projectRoot}/distRoom"], + "options": { + "cwd": "frontend", + "command": "bash -c 'source ../vcrBuild.env.sh && BUILD_TARGET=vcr vite build --config src/VeraRoom/vite.veraroom.config.ts'" + }, + "configurations": { + "standalone": { + "command": "bash -c 'source ../vcrBuild.env.sh && BUILD_TARGET=standalone vite build --config src/VeraRoom/vite.veraroom.config.ts && find distRoom/assets -type f ! -name \"*.js\" ! -name \"*.mp3\" -delete'" + } + } + }, + "build-room-example": { + "executor": "nx:run-commands", + "outputs": ["{projectRoot}/distRoom"], + "options": { + "cwd": "frontend", + "command": "bash -c 'source ../vcrBuild.env.sh && vite build --config src/VeraRoom/example/vite.example.config.ts'" + } + }, + "dev": { + "executor": "nx:run-commands", + "options": { + "cwd": "frontend", + "command": "bash -c 'source ../vcrBuild.env.sh && concurrently \"nx run frontend:ts-check:watch\" \"vite --host\"'" + } + }, + "serve": { + "executor": "nx:run-commands", + "options": { + "cwd": "frontend", + "command": "bash -c 'source ../vcrBuild.env.sh && vite --host'" + } + }, + "preview": { + "executor": "nx:run-commands", + "options": { + "cwd": "frontend", + "command": "bash -c 'source ../vcrBuild.env.sh && vite preview'" + } + }, + "lint": { + "executor": "nx:run-commands", + "options": { + "command": "eslint 'frontend/src/**/*.{ts,tsx}' --config frontend/eslint.config.mjs --report-unused-disable-directives --max-warnings 0" + } + }, + "lint:fix": { + "executor": "nx:run-commands", + "options": { + "command": "eslint 'frontend/src/**/*.{ts,tsx}' --config frontend/eslint.config.mjs --fix --report-unused-disable-directives --max-warnings 0" + } + }, + "test": { + "executor": "nx:run-commands", + "options": { + "cwd": "frontend", + "command": "bash -c 'source ../vcrBuild.env.sh && vitest run'" + }, + "configurations": { + "coverage": { + "command": "bash -c 'source ../vcrBuild.env.sh && vitest run --coverage'" + } + } + }, + "docs": { + "executor": "nx:run-commands", + "options": { + "cwd": "frontend", + "command": "typedoc" + } + }, + "docs:watch": { + "executor": "nx:run-commands", + "options": { + "cwd": "frontend", + "command": "typedoc --watch" + } + }, + "ts-check": { + "executor": "nx:run-commands", + "options": { + "cwd": "frontend", + "command": "tsc -p tsconfig.json --pretty true --noEmit" + } + }, + "ts-check:watch": { + "executor": "nx:run-commands", + "options": { + "cwd": "frontend", + "command": "tsc -p tsconfig.json --noEmit --watch --preserveWatchOutput" + } + }, + "cp-build": { + "executor": "nx:run-commands", + "options": { + "cwd": "frontend", + "command": "mkdir -p ../backend/dist/dist && cp -R dist/. ../backend/dist/dist/" + } + }, + "storybook": { + "executor": "nx:run-commands", + "options": { + "cwd": "frontend", + "command": "bash -c 'source ../vcrBuild.env.sh && storybook dev -p 6006'" + } + }, + "build-storybook": { + "executor": "nx:run-commands", + "outputs": ["{projectRoot}/storybook-static"], + "options": { + "cwd": "frontend", + "command": "bash -c 'source ../vcrBuild.env.sh && storybook build'" + } + } + }, + "tags": [] +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/assets/sound.mp3 b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/assets/sound.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..ab94045950b2924c5d3c3eb9591d497ccac7a229 GIT binary patch literal 733645 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

        5nwiZ&y+ub_E4Z! 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

        hm#anku|^2rEY>`D;9iDiLte~obB(SHVD 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μ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­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�mFrn^nw($g3+a1 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 literal 0 HcmV?d00001 diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/background/bookshelf-room.jpg b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/background/bookshelf-room.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b6d7fb56fb908dfcbb0666a374c4376830536d51 GIT binary patch literal 331555 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

        E>QY1$nVvvU^5E#M-RAe`bJ{uW`fT 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ΗWymBcZ5H`g|yEYXN@zpGlb3)K0nFR;va6Z$o?W= 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 literal 0 HcmV?d00001 diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/background/busy-room.jpg b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/background/busy-room.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c8f06bd39872fe329757cdbfe5fcfe67d0e0db93 GIT binary patch literal 127590 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 literal 0 HcmV?d00001 diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/background/dune-view.jpg b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/background/dune-view.jpg new file mode 100644 index 0000000000000000000000000000000000000000..39c4a2e4bf2ae68106afd4cefcd811951e2656e7 GIT binary patch literal 120435 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 z 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 R&2MphDdzn3>t9@4peddl&KEUA(KF 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œ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%0A{lI#~XMf|aV3@I1SX+Y^n@SJ@$AENyPJuVE% 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 literal 0 HcmV?d00001 diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/background/library.jpg b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/background/library.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1b033ad7868714498b91c352b3bb74641528e564 GIT binary patch literal 234973 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 literal 0 HcmV?d00001 diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/background/new-york.jpg b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/background/new-york.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3cb2ec7f84a9d753248678cbffed74c38152598c GIT binary patch literal 215616 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

        w4a|rZ2pIKWk3^ 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

        iz6hL?T1d29h$k<6P4IJpj38aHk%&JZzu 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%0DZV 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 JbZZFH@i*wCol8MMn0AgN1B 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 TfM9HOsYPPd#IU+N@jw6B;V0*i literal 0 HcmV?d00001 diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/background/white-room.jpg b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/background/white-room.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4e507c2d25fa843c8443369ea70d0d2cc7102324 GIT binary patch literal 151891 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 Z_`!5$<#bss2AOZiCb{wcs+^z&6hdC@f6Ag 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

        i||T_>k_3zhYUGN!3a#p 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 z

        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

        Tm?p5?f zCeUyP+i^SF9lzQHD;LI~^xfj+3YDBinb?CyPIxgWTYfVvq3rLN7Z(a`dO`FY$2-Tw z%1|HfvogH3xUC1?pr*)m=3DKZcbOeJvgN0j6%Zvc#k|EFy`e&^t2q2haM~Hf4{4i- zI8;_Ng0CIrJIl+J_#~lF8BfI*e=ri#Dl`|MWrkZr3NCgTej<7f{J%090TeVUx*>yx zOrrXhGl(W-vJ1<%@JsVl09*3E82b|SU$~*|aX=RRfoTdwLdDBnQ6<=>YP_qhmG+eV zOAJ%JqTd7=XckgysV@D9Q~*#XA<=d518}zKx!;G}QE$Y{*3wtz2%?5I$>qni1P4}( zUgGgAaA&2F`Jd(0vl*fbn|?giHhpx9pX(o)s7hXQ=uQ&G^+ z$L3kuj3xe{D6}R3EWWiY02P9TdE+s4yi;2pl-%p8#+{2k;}bX=uAvX%jCOFRR^PBL9wcY6(C#Di8xQhrsK%mR?vLmfKh1NKm~q8Rtal_{^cQKm46_6MAh84 z<_F}BfO<8K*5&NP1qhZVN|!U~d6q&8dMt%CDN{qBxK77a{miQ#m@_V_>%YW%BNRkq zxShQpMOX@M04acFw}{6ToZEHmf{NxhRB;O2Su$qgxkuE!A{Fld!OmYSuY($ZEk+7= z+yP9&aME5?;sX}~SqrGyfz-*qy<#P=5}~_bs`Nw&a|9HuXq3#+=An3vm@>yKONGPD z%S#?{lk&t*lq~qvrUEa53VXAr9v5IANOdFa|DB3oeT*KC~ z>y`y=W4{30A&s%u)fEa_6|2YegEHFYe`o!PJ_* z>b3Prf+$tD2;l9a34*BU{3Boj=wT9 z8%i*+dkw@~Fx_7Vy8E%&Cd>|2^ca_F6|MQ`;#mq23K7%1Ut7MqzsTdjv4W5Hoe2k-io zp-a3vcQ}CozKyyoRj~`-ZClzH+W9 z!nZ3b_A(G_3Ii)^@5>fxWp>N$4Kb(-eT*Gl<5l|e8_5zB9v{`k19p(=f zoFgKTk%fYVC#~}+>$2iTf;mh+VU|@8+22H%yo=^wa3i*wIaF|@4i=KJAE^h*!z#tsP55+6A#G#b6Gc3cjv`b@;spuz zml#AjK7FB3x0njvxP>i#qACa8aTVqSJ1lz2)bTbFH%98UC|$si`^p@1D~j9|aS$q) z0eU3?PLL*#nX%){uotLFOHLQ8M(bRK7X=fmIY=R3I=Vgxh6BQ0XjQiz)mxZw$}Juc zyHR+ZBZ#esF_bG%K(=YbdJgjr>MknP0p2C2a)m~c3a+IWH*iw6E(P0N>RteOi3M6P z3joOzsx3gaT*cCn=`mDhT7`A1gxWsl1%xYW5HG7*g@`1{R|@A-0;xmVUloCKRZLWY zcuOPQYG{+KA<_a56h|QByh}SJY~DENMYnQ*x9Tuh+fAwK!3s8twAgoeA*#JLgDCie zZu-cq(ZD}(hS)Fl5L%GcGJ6ChB7!Qcb%Es5!+?;xRCKMc<%xV=7jB$e0>~?t$Cg(! zwb-}S)W!MRLSb(KA!Q4HYUo$(DAHCf9Uw9O*rL@1vB0K#HzPyPXv5|9+qc;;k`IKav(<#{mo zCg1=peIv5}0C6Y@$xu5Z@e>xu9ZvDm)x^6#@huISHs*r)W2aHong0N(U=?)T+1_Lh zim{i7lD?T^*hEQkdf5ic2TG1vHKyYbA`09uRWV(cCAv7oEE&wY?jd?F@Er&u76+m~ zxLqQk*wdgzv{_xaK{AClWIRk(U%o_i1Z7;FB};RNd&e+BT)Zy8)UhT6_!R$SS5yt<;&%X3I)|d$d{hbcR*)wlBsSq zjRXO!&BT@7C9LMoH4>IlFe#&yq0P1C8m6q>%K><;%?!8FS2b~|18+zbusp<8hiyk3 zp?nY)rH)vsMz1UYpl{4*rVk;jS~u?EBVXq2nr@Y zvA85NyJhl?ekJp79~q1Ki{Jw#T7M8rWOsWv#dE(go{~SM2~SEr=dYkna^3>jx|>jeWYrSvF#_o@y2lTo_UA%i95v zWq)xs0P?%;_>a%^!Cia$fbCh;+ZIOzM@9Rj#)5Rb`^@)CqY8qKF$@=3!MR8=PJSW3 zj`xC8!Z`0QAkblt7_xHOD-y0H0Qh4ZIZYDxU_=7|um`7-Q$bwkTHdq6Tk1aZ?hSYBN7}vY+7jl}t^d>nWa+NRQ za=?Acv;0Z`zuU@E}+9N>LxTi+z82g5P$|bU?}Bc985C0 zjp7!t`oslu$5}?)I2iLPCBj;8>r$54j##YQkC?3hW6W|HuvBtol|u8VGz$8#ava>M zRBYVWrxn^*RCHV!LbuoZlp#X(wq8e4^2YYV%(B|KfnOh(ri+fy678ot+^}&Ryh~Jc z(Wv)0&%C6Biwcd4=FZbvqN|eoTEZx5XA!(|EyU)%TZH*mA_BE+rODL|`w%69a3SId zgP_f!=#DYgJBL@YiPYow03(5c3SQky0+uBzq1XoA*oYKL*(Z%>FT*MO0Kq|BRQyyl zP}3sH`CL-TFtaUQ2}%)FIUZUA#5rIJr!T?B%*BPYZkp)Td4Omav866374t8l6R`!e2jLe`$^<@thZ26V8nl{)~b)-q0%~&wEGr8pc=f_^AlyazZU2`eN6Ezto`8DJ4FXkPYZvw5wXV@7!0jA za6O|ICm@&pzN|6uz9*xE#=JFF6>lU=? zCU3t&1HBQKeJ{6m2_Yf2xL&={D>nFJwm8WJH18^(nQ23NpghZPEacw~n9*Rxfp-eH zU5#vvYqCvy3+t&+-$lbEn3?v|M>X0Qs&b2J`rkh@g~E#zKNyJ8eI0zkqMvh2RaFoQ zZaj=XOakq7hy_Avtb5CHFDb`}3nA+OoQGXP@dMfX!8UFcU5U#Yx-Y4QGPibzA$)`# zK`wZWN7;#)v$A;^kGRt1Sik%{KO_iL^IwnpCwY)xD%3sRizF`7>B|Z&)=h3-Szgr@D460Tl%FgEpfg&FMLRiwbw-G* zOcmS#cGV@G{iX~UmR6>vE3X-v_+lVKs)adkq(D;x?hRty^%YEp_1aibL3v;|S$cJX zh#Z8CG(Hhf4Y(y1Xjw)ww$-p9Ul6j@^8lf{UXFx(hKjr97{17jgNh}z8FH~=qWfnM zp`b680v7I!!Lle2DQzrfAOe+S9{nYWwGDNB2Lz*SKqcVnf5}h+gGLz8yueMR;;<2o zgJWk$tjPn&f7PS(}l^aEVih(1Oif97-q^PJrq= zd_aIY#;d;&fuP@0+hm~C%mbPIM4=fgbK)f|k0$&}JD{=PqxzPkAzLwhLKrOanx_}U zKs9d};ex=#GkcO()0XX}{{WLn#pkMVPU0v$nw-IUgOcmpgC&l!j+Y!T(V*MO`<-$M z%DB_kYRbF{=*t2GZQA!QQjZqi!t>q<4&s5c^hM?vqx>*6gv0*CO+gh6m(N&g0^no+ z0Fko%faShB#G&JvM^9*$3w3zDxr(7uv%~&GfTqNzarlF^u@JJjs4$_pVSGyi1xCwB z&GeKztQaq(3YM0Z9r~^&+s$&L0IJnfli`Xr@$2GZkVgqHgjK$=g8;clh~qt^)LCz- zh3$HuE{Du6&fg?)xOzB-8s2vRFOYE%HdXY4Z1&k6dD)$v)-D-9$TM?JdpNXOw8~26)T06 z?T@1PEYF~sxNx+y9*5C?95V+PUKnmXGT_dooDlv!O5)|bU!nF5^G~Aj$vj2nc|hjb zb36~2GRbj;-=H%d6lZh3GYEegrAsBt=A~WQx&r?I$+|p>U+Cq9dl~hw1IXjHUzu>? zf@O{#1o6h<4l{fkjCgn$ZVW$%QjRa0n3wS{iS3p10L}mn_68cgIsCeq&R<3b}k#w)h;!UcV7r z?^LcY(OKW|I)4D|<0Q)}GU_!eIN;o>tA<$Nmb`Zgxuksu7?i(mnO=*3lhgPYH!yN% zkGSQUnP=t^YE{ik^9!l8(mtx2`!zAb%a+R}{{Sbaz2ApyYNhon6EMRYmndMwsc#L- zgf|V%ePfBgs-;UN(HV~K9s7Ns!s+c?xn~{td;65ihulkvPZdWMz!58og^>E2O=Wub z^&en;z_xx5Pz^wBR(_v|i)w2bmi9J3bp*f7>FqD0w+`4bVK*-`99s*-uQJ$XW+fbs zNvyZmw>HEFm8rTf<5HI#_<^X>&mUwKE+W7+;2}^HUiT3d(6oQTJ8-iLqp!>m``GvT zdr1~zPUn6duptDOnNsF!f%7h7i{jeimo)Y^;`YI~%k2)Mjc~vOs>)*t!I?wT9nB*V z)KM1U9GVY^@Q(e8{x42%*2`ROp*wKpN@^S9Fuyz(QK?)q`M72x$*-j6ZV1K-fr*wH zhC$_rX-1FACjl>bw1I6d4rPiMyvNC!ZVH3H=JfWM9+ut-bW3hr>(Eqdfth)w%{?Q| z+zFXGF(~ek(Sk8BhGn6DPCrtKa&q5O8r*bD`FG2hSMi@?r>7O_C5e?gaP5||nW(%s z#U5aB_YmU!4Iz9y9PPlJMNp_iSlC=}XdN8P=uMk_D5Zr-)`ED~h!Yo-H8_j#xqhh|+r_5!P-->gS|{qvu1r?jzfJe|CEJC~V% z5pl+4LSmuA#wu+!hYZ>D4;w>VQ%bx=V~&m`p_m8;7=)#n&&0?9%r5CwtUd_&)){@sc^d0kOm{hJVXNsDIN8{17))wODb9`CI&8Cvo93!?U<6#A< zO|et1z=>fO;yGRzd_!Q^nI7PVLw6F}371v#43P)VqMj6hc%v=}Z?ZI6)XfrODP?Fo zng#k{bsc*w>Fp<|%(17(=5%!y_;$se%|B2h6sSzYGUf^O8D-VW9W~z@O=hg!FPqF6 zywiXI^%+gC;#{fJ%0fAnr49b^8b;Jq?{+4j17Nis`Hhlg(r zc$t(;PNhuBnu~}=N8cN94^7Ou+HDJ)!&3VBfmKwm)W9sSULXNt+Uj#KC|{VRNrA z6ObZXxT=~wO3TzTyjS@4YIXOHIIo%apJ}q(WNBX#ou)oG+lu^B0olZuR|nC+Ut%s3$qVX0Ak!akLWO5Kz}MX#vC zF30&9oxq~Y#50!3nfLzyBmI_lMUhoJ5b5ToCtp!;IU9^clx7MAg0%|KxAu!D4c4JQ zpZw$X2~dBt9^$$M?oe8p-;z@cnL?v~a8?{s{(D_LpuQ29n>;3EN+o*@O5h{L@Wxz3 zi@AOZPt>aJ0{0Bfp{@d_0MA)LIvb4D-}p@atHh(*Oym4w2;5_)Ma)G zv+*7(F^SL|bp@6RDkxhGKQR^EXw*S-K<={;S43*JFF(KYkMTjwRZ#tesGzI+VjZJD zG6hjhMLV=nl_972_PTpR$y2uu_b;7wF)0Z6R=d8!(GZ+S{Rs=VCDF!fz}%joN#wKth}VCM}%%+1J9U)#Z0F|nPl*JfMCgp zkV6#z0G`)RZsy2N+&hjqEM4*fRH8NU2gN?bavUH+IAz;&2kJ9vrzR9~{+L?zaEilO>L zHqFLz(u4`T8ov>PYRnB%k(R_py7{~4Bqf_?~EzBgyDQ+J1PNqIe8I`}DpwoBQ(xRw zHz!yQGQm_v+TBzOK^ud6Ow)iB_faS(Sb#~~Ujk2oCjR0pnP=)31=U<&cpH@AuL5n5%top~+%OBOSepDt;tR|&whCfpFYyh2 zgNSzReU}oXSAvuMm;?-}6)n8~0Gv=MYHn^AFi;(Mz_I%9sVX~#5 z0Kdnz)6{R)%eg9}8NW4v$7#|I)zg&=LWrXf(W+k*6D)oI_ z!70$X#c6_Os$MNk{yK&UYZS#Xe-D^gQFf}jj07O}gRiJ&7H{?c0C-;(`YK)=9Db!J zglZOu0AS{4gyRSvEr)_)M(KVs;he$ph`EbwjGDe7w{u>5l$a~(3`^qLLMo&9gBx{2 zXc?98$Cx}_Xjml$QaXNK(zXTigRan))qfKrHfoBMOXMRidv3GwGp>@qGRKRq2B&hF z_?mFPZyQD^5ul3ZTK*V&uohQ{)QqPzeM|a*1%Rrk7@wJoxl*POvA||fn6qWhicwEN zz63T(6reiu0qPB7aZ`@{XgzR%Kq;5xC26=Um_4D)UmW*dSP|X$g7)HLg#6>vRM@d50H1+x?iAWe)zHn&O6mdJA8=`u zuUM2b6HpNIM64>HR0)$Vz?i|q?jDC1VF#V=7)D$c{pZ@Q9!xk4%Pj!Vj4oK90An%Od{MAjXz|wg9fVV;FL%?)qX~pCn#EJ{X;8L*TGjvS&A!Faf~4!N7T`Qjd1? zFMz2AUoymny?BOW0VpN{QfU~;23VW}5rhH(E70$Y#LTWVG4Z$hkAJ|FLkm{6z>=XV zHQc!x1)-cp6Z!}D3Q!W6F^`y5p|!Nm=)AxBKp>+wf^l-?%hVAF3omCH!(`HI`zF_g zH)CH>X_oKIt42hp;%?XHj_ThL4}w}HxLH3uzVGxIb%qe8H~vdy^H`20a4~yHnMXZ{ zXl<8Z{6k;dqnm&q`jw*SJIoa*DU$0ujBI(fzgL-V)p^aZ{l#4Tw!!a}3ZlLZK&wC0 zIF0@T5se`J=8FvJsqq45i-Rs(=Z$Cn!D@eajkb3b4M0)`$OXl*Q`N<}YvKf$mBq`K z?OIY&0Q%VG#@O&x+Wks^l$3G~WfLyoFj6T}*=#MD49mBZhms>Jh42GV1pffy%pn|F z67`8vzG43W#-qXl{LkJYlQ3&2vfozU%y#bPT}xA*otbRdY5q&#VN65s@i9#tj|_N= zRSiny`2PTBaAM3|L8?P=!C$-vo)_%ns37aB#m&EP(uO^c#Bg$eb%%1FS(ssZYU5{=R^q@x znUr1e)@G9sUnHt#WzAYnIA~vyUeO^DIB;7x#1)WPTu#`&H2~kLB_VH07dIni8TmJyrij^yYjQpqj42e*3ea2Y8 z@hNu=G29v__o2-kEh)cB;#MHX6%ERka{8@-?SS>|F>GP4MW3oR3m&DT1J`7CXuOHk zMKEDXFu1IM&-JJUkob(O7rZ0lU&Ueo6dcs4M6NT*pkJQl@q7l0afl(8jYp5!HcmT7 z7aESG@Uem+Abm7ODd#c7W@TauKZ8#QmkN}6bb_DPB2o$RN)u0tibAke`-Og>s6cx) z$u3_iBGwl8nUfERNLf;^Fe*~wW?DJI=>`u1JC}!((^8@{@f}KrSGu!k-!~|!SllXH z$DcyR?=8$p6yWt##Y{@!B{dV#rY|}J@3=!d{{Uk7DlE;64No%A)6p;hPWTylm%yYP z3+h4O6nl2dNI8`&K82}#_3Kr7DrPgUZn>g5aZj002wDJy9*|;k>*8;q6o-jZ`UsDq zxF0g$%jVJ!1(te0|HJ?(5di=K0s;X90s{d700RI30096IAu$j^Q6Mm3aeyWz-ic3a zqtjd;%&%ho1a&%?uR*6Q?f3jk@JjNCcOL>+A_mnD_E{;`2ET23P7g)@0227?_({pX z$2*6*ywqb&p()U?w}M@Aum^}G;yFN`m6hnc{{Rh#v2z}WP~h}a9vE-mq|b>_L%1u~ z32-jBt!Vwq?7%wrdVlaKh#BM~UWQXE+(9$c@-qb7rdNQLYT*+*mG3`r1Na8tdEn%i z?PHc4lWci!+fqI<)ceGth22XI=fG#+Pm-_$j{g9Kv+ps7HSJ#&F&#sEg+*pLeT#{f zV5$SG$L?%)!tDd+F!E3J0Cnl__-6g=CSmQ@q2bpdNL+7?@cNKN%1{g4&jhN_c|aX| zHpA6&{j=P}Cr%D1kF{QhQ)zq}jlzSMn+3_f0x{jFN)(6 zJ|#ZU?{whh_H{8k7&LoLkfQ4Wxi z3;w3O2%DQv_xCe?!>?%ePB6-b=S~fK7d!OV6&P{1q0|T}d5w1jFQ&6B6 zmpoft+_sAYZ%|M|hA%KBF=ay;i9vc}{eR+JjCcP42wJzM1rL7F>b@>@24YvBXy96e zHE$=P__>KwgZ0CxaZ2Y-4koeFGX$tui9+E3N@Bkq!J#f8Ws@A;KnIorZiXygw=e0s zhubL@4V)Yn8rxB2;`a*;HC4i+^nm4g?S+73tw5z&tR5oU(Qcq9X?v*p<(L32B2jJC zL)kr%l`D#aTn0EWN}~zEa|~`d+^KBDCh$fS_~FzgOXglB!Km1b)SDqv8p5vS7QW_S z537Ixd)3GKI0KV3#k(~Ur-G%FG?|Jr{aj8jHE<{}Xn`>)3Lls?7pZ-Gv)>u|ti?#K zkIWNHo>@?~T@bT!&~BqpXeH6FFa#bU?4HT#+ktTUO+%yro>JiLz)49-NpWYGCoITe zA3&{3JjYU(D8N}!sE-h1g_@iO_yBOpQ@L?xh#&>QyTfwJUvRH%X%l?HgM5`8@No#8 zlLnz4UCOIg8K@M8J7&fO0nx%%bYIl1;$BQkN?c+!=e8nlYCO&1h(X1w@WP^qjad#0r`)FEzU$qg*^kY5tg%Qt=sc?3N|KtR;!3 zh^=M?2TLps2ER~fTB?6hjk}nlr2=}M2&F+bsA=I)`+<`L;L!+}CgtleY2sO?DbI0W zd_!Kz=%bg^$3*H9xj4){8Hb?Y8I>w&URYoO7ZA;2#8m!pV~i1mqvl{2G7{j^3}UNM zg_H#(>9kWv`Pz!5)S&mWmvVoHlwdXzev{-H+VBYALO=KMs*+U4RdIMyswc(2S> z3w2QitdO8PirnuJlw&BnftM6CL9OEDz@}bIZX%eQKis5dPY8syKs#%jTE=@FLbp8T42z6g{z_=j|d^d9}&XwLmDa??lMNkvQl62tLJ7cwKBHgCU)lQA^Fm zyb(aM9h;cjvZgt{=1r_-S&3|tZx8@6lY@fwQ4 z02K&8>@}CXcO7Ej{-60ZtA_>fN;(cMSd(Zq#oAbYVmgoU+QgH_!8>^+cALE6!o zPy!JV)3O>W)5U|VU+!Ejr}-30gk3>o5~a(CT|f?xb8^G;ELH;LfSO|^KZ#6Te8Anm zsG0ZEs*6H3%9LLLp#@(0%*+zEZs33nd1F8W#Gy4SamC7tl**Um zuVC~d4)cB@HE3!70A?ocrOWOk#6zgdB)@r=8I6$n2>2nQ`-+TK>OLuheM1u_CU9ke zD}qx?n2ag`NiGJZDj^;>_8mjnJqJaZbto3L{L76{8)u3%eH@J>LQ)*dTE!9fE8-0_ z?5F^ZrOSG&oO5uF)s&Rjl}u5-`td1mzH=ygiboO6yxkH-4Uzq3#O$9Fgy&)7b-r1Q< z2%x!4Jf-7@%mIyFC6f8Mb29iPJ|kfBm}9^UIX-3CaZ4s8PNhUWKv=?3lf<>|1>}Vq z-^2;Dc7re$if2MT$<+sug~EsAs0dgu$R#V5tZ2a!;3X4L5v|HoeabE%5;S>*czWN@k7k#`juTpfBH=fv_#-j*uT`SAi+ZZ>k)##!|y*${{WF<U2w=S2gbkC-%zWqx*ebkV305Dls^-Tn-r2a7IwYeD%eg z0E@+bpl@UIHcKef6Q}Ag(G=?bVVKf+*k*(;S4$Jj#S(=C}gV=9BuI-|$l-exYbWlt7Y>1c=AAbpTew zxseg#KM0Vk%v02D=GypWH0CizD(($yGf_%WKIIWx@dQSUG+i>Nq^|`;!iD*Tk(XbB zT*R&@iPWw)!70wHityGZxHEW>w>2(VQFR!LsBHpZN;o07NpmGj)Fbsuso$XfC9dUZ z^D10(8gNyv<@ta_#ro-bgc_I#G$wQL5k4>df-9(Ckc=|V%0pjdGOw5vlM;FeFnOs_ zAYvq_ejn}zV5qj>qhHVdO5th-=TW#l1frwu?KZ)e)DA}iEiH|VKSrAxY) zWw7%wu3s}HPUY4j%T>i;!U;A4#c|)i+O!=4u3> QzUCM<`xnhh^gMt6*?t(v>Hq)$ literal 0 HcmV?d00001 diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/images/access-dialog-pending.png b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/images/access-dialog-pending.png new file mode 100644 index 0000000000000000000000000000000000000000..ac42c9e48f97b64eb8260cacd707b16675ca1ddb GIT binary patch literal 21458 zcmeFYWmuHY`|u5j0wOJ@36hpQ(gf;4VN^rECb4PM zNW9iB6ch@$F_EbFZ$mLe+GUuOO0DoZf|bP|7by#G3AgixELVpw3uk={QPRxyh(oSA zB?0ewf!+5&>#6R$uBmfPd!$HiS{@07NaJW}^6J!bp$`pYqz84Q>XDH*kRFyIJ!%%F zT%o3JM^O!!0mn^FB4?PD)aF@SSKNZ1h^9+YA|ZAAB{M0aKcuWd`4op?cu0j5v?OoE zmnoU8&tmw3#{u`yf^gl;rS3}wN269zbaI#f+#{rfpX?J`+-oXZ>j$Z$ik2DJbx|ai+s%hWuT&T+ zJG_wzMY&G|#d%HHfO)aR64_5F@g8$ozv^)3`8#SHR!t_;;O{|kg`^FV--9GaX67hB zu}_8CdF+@a_^N#XDuV?h)+*2(o61w`FXD}q@RIi(-N48^B;7IncV^EGwYuJZx%&Pz z4BJ?N0s0ebvnwW;;TA?wAwH7(I?VGGn*>=x?syy_L%?!JPY1qsa%@3Jd-rhSm2Sg* zkE&bRND}dnvOSTcQTqBj@~_@}aPgycDio!b8U7hEA5G{_W7c`v{Sd$Ml3Ps?H|y)H zFsH&}I$-CrLCE6r*i@&1kvK*-vCu&w|4l7wn2-xg(0xr@Y*k?lbI$k&ho8P@*5nc0 zj2w%h2u6O^q(HG!?;Z+bcZ_%}7%lwrob)R?eL$ywp1XM3(;gvgDGoWV$jn_P<%lk{ z2udQ~r}9YNjN_T#+bXhrCFH3tI(JYu%#jQ8o4tFu1f`d{EnCcacg=#2F(NQh{LuW&{g_*e^1iZO5H*LQX$^UO=Um0g)5;E5u$w1o=(ZxPN`JVC1qAw{Y*2~Ys7b}v@Pw00ae`EE8;RU#Lvl{r9!(v_vT~}TrJhVH0Rlp;JD2PS#LLaxJ?!w~)O%6|_1?tieqEBO`=`G5(lDMQ)3wMg^4Fpk`^?&0JA5`t!)bhQ z58XEsm$y||8jrD^%vPKqj}t#sjG|1E>T9?mWnIwY4^$OVC6Vt9Y0Al_zl>2XyaLI%#B*O$7 zuE)eP{(_=#mQS0y(tX7CZBtK)LONMXpG$}LcQBMP6h1L;QC}4DyuaP*R_4r&XR`Qe z4y$;{l>a`_;^;x$IlhNLGp2R>>;dDsXCuz7SQNGMunmM}uopm>_A!9im&(~y;*sr}^N~`m$2CKcRbgRf;1Upjkg@bd@U$VXIrJsGt z^eyC@RS(kmr!7gW3|fVwT+H0@u?Jf(w@A07NJ&XaNWD`qc=1y%c*l9+jsqKWldckM z-|L2IE2R^^R)4FGo_OCN?*1-klyoEg_>mi)=gX#WudiMaH_CD8eClyIjAJP|8kw`X z?rLXsWa5L`5t&@#C5k2Q_tGHZP1>Gcnm-GwfJ%f^z;AC$Z?LYt?gjV+iZqI(|G@t| z|G)$*mH6u;(nl{I`3GQP)jUgO_vmVQTK$MwwB`IuS&HqKVM{S~JND&gYtNL3VH{hp zx7aw@PdQ~dm|2Qh1kL6;+T*dM$tph8g}Q!nO}X&$>p&ks9}enxLHt&e?BJ*2_jkF$ zUEf;`LERkDXW6et(MLT-3A1Igo%?Orh$=9Q+4?vWQdqZ1f$Xd{-*pW;y6(O3W|8RE z>LchkNw8)E>q4ycfOtlf6{;q-BN>xlfzQkmOzLJ1sQTe)s9=gGI$cG z)RJ#pRdHF^UzAxCGoew$SBPfu-14JEkHzWqTvgUgxuv~@%53%Y>9pE(SWS|piuGBD zKu4-2pjyY=d*&wWbEarw8yB_=wj8Ovwj?LTu5Z9(6HPVmmCEUD~YY`=hKcw`uh zSG^_3Fvw65TUb=vM{VTQUf>4X+W)NT9Mb=)Khen_&Ssg0T89@RzyGr4Pa|1OM z_=DCvO1^-T7UN$FEOlbEV_*=N(ele4OD3nd@CHY*a{!%3wpUA6jk;?Tl0SZXX_@Di zmyqX}XFbw7s+{d8^PJ6gp#5mmc=PKq^wGz+WdgIo(?At66Oz(W;GcQKKSm<&1| z5gtbSROo}X;vN`YU{FDO6MnH_)2g_(0|eU0b#ZXPcZ7yH^6-@KD`v$*94V}`We5P9x%j0Q-wVf|h|Y!& z?DkJ!W+NK(_(-gFIseKdR#$n}VtX3XcmdRwP~phT%H?h~%RlRix$Za^kq9emhrNfuDODqQiJCChUS$|jc`Lxhyj83&Z= zRg{&yRH;<$b~Pfb3&5nBi4~Ow347%-y}`X%y(J~+YGvkGKYB)Da8$x{#%mL+>h(_w zI20z6iw=ut8e{8~>#7TQtLt4;=IhtC1q+Evz{&*571p0G0y;<_7LTnO8(%sov>Au= z$0RLSM_JU>ahRDK6p31nb1qjeTSnC6SP5N|!W-&IjrkayJ?37{PggP8s<@}7ruGTMod)b#TG^OS)koBo*a=OQ%-znOsV(RT;o7IcDB!wnIHy7u-0j?o z!$Ir=7CYwnT#g($T+U=<&b37}rE5bGncj1*?U$1MA67DZ!#_kY@pHN~9=muK6jq&y z?FI*0D$H7el3fnX;C`p!3M@GTSC217yGN5pI|oryc}A$H2f4KO>ufem zKp-5)b0>D~r(>;aiYwiT70jyoPx%J^^y*)?Z#BQYiL*>i58bX7YM>o zd$Jt2tnBD!l_~|6xh#Sw>`V(=U+g^qTf6KYUj+)ixvd@IDl38eUv(^kq_h*8 z=Pr8SN*dm8Zks0kOVA*SjU1j0+obUM%`@O0=uzLf@TL6q@P$EdPQ0A+157kDBM%-O z&&Msg;`Vk(=k|0+#|}tO;}$RUzCs6bn1i6H`Lz2WReOLUkq#2EZYFQBy$13WPQeSq zOAjPPiIY|NPj0SQDwZEsU0ls9h8M#E_nmC^v+g5(e}W{~gNBC2iH+^$=d8H%1gU70 z!&yd&vbEvI6Kg^(t z42^j|ioN|u9Pv$n%GANZh8F;Ec6MfVW@EOtGXb#h@bCa$vjSLInGiXc>|L!K^jw&% z>|gv=@~<8-BYOiopp662+KS>%ub#fOqk{ky)t#X~f4}{702=?bWM%(Pu@D6W+}#1N zFuw-;Phv(c!2g5T-JRcJzsmL79RHm%Ue%9A_SP1TcWw!?u(JbL_ z|GHs=itFNl`X`UPF5>(Bi8OxfKRJXKhtdAc{YlsdPk50~_46V3Z=e+7x1T&bCpq|@LaHn*koC4*Iw(8%FzsZYfaYZw0rbi@jL{s#cqy?HW}lh^3C`{%t9g zpNM;oTXT7H)n*81>VT5}L;<1|zW4}JqiTPCfYoamV%(n;mlS}CoBIxBy9Ded14(rk zy|W;UhZodG6_Q)it*l{bv^7y=PAijW=yiQESs5`pk1bJSH9wQ3;P&bgHPw6Re#PmG zdD1gB<9LGz9@j3hg~n2j|yY)#6Lb{ro8ikA`TG-JZV}5%9i$R zVO;fmO}aYA&W}i9Pm3ot?Zbeh)kOp@fse?NIhmp^B ztj)&r*X$;07$Gdbf;m?WCF*HLk($^XDN4+XQr#aYN5c~22{DW+iMNe6Zfg%;aQ&`) zihC$7`>dbD@X-}xTl|SM<)^8-aDK;QS3D9~W9Wx9oz_?;je1HUEMyb2BK0a(*i2O~ zyK7a}XmZg^62U>%@~TUxAcri!@Kt#O4-FHTjTbYQT+>k@nuNa zifp)u`VmVO?tnPqd2i6G=m0X4teU4CwkP^GjG&gMJJZk!4Qmc^&+~Mghv8ww9IPs{ zuAWI&^+1Yz3d{OvDL_Nt@!rBhp<2by=MIZL#!IdKSzkfk zHy6f3sqXdc@Vy$)#Y%*bFMB7ccjL5CoR&2F6eg3x>!^tcTWI{?&j>D27~A#5I!Hu4 zCG;uJ2)otXRH(}uq5Z674Nd#za-w+&$E;ODQ39WH@iV(AJ&~*Ew!oxn<ZLXV!ah1FaV({mH=J+2Nq`wb!l&D@SR^onZ_ zdxT$ygv4t)ZDwUXdB$%x>Re9sE(B*laJ$fNRw_BqlXJntzEeD^K&6Bee0$T-FewFS zj*q-q4gql9dw|U@baS3rcb4kj$FrWg4Lt{9&*gr|?Ca;6Umf8xof^8j-t*?VzC7hH zFR2JmdXaN^d)|fvJ-NN=eB^!D?PuqR=XI(g5y5F@Uv^yGUcG*OwqUL8bzwyQ?J(CX zt$A5IJ=LUj9YiwjxjB-Rb*NZfyx;{d;(?q3Fbsu=Y{Fq0L^=*p39Lr%^WZNRk4NRW z;4^{@H|0tN$_XH^%kI$1>)nJLkdxk(FJfTERYIw=PZx`kCmU}_A$&V1blbQ&U18!| zt3Y^y-@IGD-6zWj`zCMT%1Y+4FG5GwO2*bSrZ{lIHMi*Z{!KP3vv!5=J0rt zZ+T9YXDW#o%E^8mDca`}lj5?jJ2PC)3W?4T8IAlj0R*1vqe>dtU5~ly#Ds%L=YNR#`9QQXG6C zx4@)qD)lL_=tHAyx8nym|M`&U+k(Q5@uV$qIH8fr3}GITrb{}GQ)gA7s#2q}x{l+? zICBaShhTb-XICuagKgE4q6n4iHA?=?@6mlaJ96b0CUGuJD+7E4?I|PqOatXqYB0^% zccw5SamU(u#RVCz**<>5ThSppnlQze)36chN$4=3bk zBIhqe-Y0_!mPrK*zlOpLX(S(_^a;M3+Lcg#QdZZ<2QzVJ+7lX_JEyZLT+)CVwn7T@ z*`ahUG*Ls4$6+wfb>(Q^;%6Ku4fU>-??ffqtN65Q3H+WAc=>j5L+txvJ?6blV#|)S znimngJx%+LOgNLCXOL~}G%hu{QJf0nIzwW?rU|#z{E^kVF}CKL8FMK9HV^NhTRp98 za{K`kdnLVG&eqEhTr+N+im4V|k(9Eyp`?5hxmv}I%MaJ_l#&Tro)vqMx%JA^F?^HL z$kp_|K7rErZcm$lIC^856iNwNJTH%J*Ozp#EOmyO1Zz@R#t%Zl*Zn7$SGJk>}@66Aex0jBdnOd8>(~>RLP5qo07qxfO1zZ{wR}QfT*eT!B z>#p7UYvl@$3p?j#57!;>b>^P)s-a@VW7@$%ph+r>S;%EiD--nQwX3ipvD-)_NZNN> zoX?MLnsRS`UYj7rTfZYgdkk`OGG$;DwD(nt*;f0JtL8_n>5JnVdXY?` zO6@TQA%1E1TEa)H!D%_EZapR}f#hDbe3J|#1clC>d-v#nd{@fCXJaaiGird(%1Vv`lWzNCWUMD8V0FM8Jzx8) z2*b%@Ev?#H$Iuh%-c=*)Nd?gn{9gU<>wF{F{W*z;i@i(ecTZ#x#%c_j+)-I$6^5sV z(?p+|U~ONfSVWBt#3n&dFkj-fb!=!H5cjb@aQ&7?WB583{5Lz^+Gg zcQjqYh1;Q@z*Vt|4(G;x~h3|qF0 zUX8hNae$cXGw?0eWlRL<;QGwRxzM09T(I{2R=#Vj_T2sZv(bCa@ByuW**8bZ*F$Be z-;cc&1Q!OKuv2S$8S3df;yUo|rbRONU5q%8WS)w9Pv+~-URN0RJ51VJo-4v5tR`8t z=~rMwnIkR=+SW^~o~nuwiQYNEOXZ_GAGA~QoKWgcRilaIQlm>P_2^*kM=qD)O;$yqUUKa&id3Xu&Ge#uWFjY^rf@14xmnsGYF-J^QcShxeu!J*)X{BnZS4wlwzsH%LRwnq9IGp^38t`EUCyqw?TljT}zVq8A(Vl6R8;H(53 z0m}lU*J4j-z5&2jBabR!bbwU9L?Vvno=#R@Rf^OJP0Gv*cU4_QX$K9Jj*A~LHp4qQc8 zkVrJ4mWz^x1cmK*|3odVxyjaoDk4q+-sCr?@-?Z1!(E(2NC%uev!w+ zqePDD@o0d*#LgS>Ai6}=CU20WoNgsMSmoZ!IzAGKUb*J)U$ucpX8Go46nATLdq+KU-0v0#tJKGu+q?ZE^#;YjG~HEA>)sN_YDxv8k982u<=FY-nMA;m^pD3+KQ~fO>mezL@$tRt9WfX()sP1w8p{Aeh_Hm+W!8x1F56!@UjJkaZLHP z%ERRgy&t7qveP;3fejADb@E5h{!ySW@ad#GK8HuVMc!I5VXf_+f!$@UX79b+(_wGJ z{1F9eoFqWat0#Jt*IEykiU=Ex)ZpiWUv7kmjk0>F8yU6|yFEP;^Axf#6*6yMXB{2B z4>!Xkdvw#ookA1f+1 z$7=^1)>@YScmOP*jtE#-u(J9>Nej9VZCFV0GVI9|*r$F(<29+}td-e)g6KNy1AKcs zepB4NLnW#wMvBL|dLmexK*q3nr`i6-lL?Ii!i9_*e2NF-0G+l@2R_v-QSuO*OsxKzgBZ}#Wp_nBOt*3^G(d)p1uNOdVhN}I8q_{F+3i?-ra+UXkxtPi&Im|PazF^58eT!%DUdb z*Rd)|XnLP~qa+^Zs(fcx4%8sr)0;SDjH$}cHRp63S|$fyOS?p`*gTsdm-i-6(RNkh zj<^3O_~TIIP+&jY_pqTWz~S~_I*?g-`K+X5yQLZ3?zY7GLxp4=)pS?qp6&bk&6Ph> zoJx4W*PS?)z2C4-*kqmZW&K_gIsE z^(dj&G8YLTYR9+Nr?k%YYfe32Zg?{>7&SIQnvmH1iKV~TFt*#kqhcN+Hk+NR>8i;Q zG3p-NhN=Ixcfr1-sjtpyPuTVS+Pkq>DwElm8P*e{qTHfFB_*wjyuj-9s7;|aGcMEC zFEg2JDlH>V(Z&|UJ_lfxzl^QCTeBa25r$w5yYb?i4)S04&68M4&_N#;UpQaB>}CH} zaG&Ucc2`jc3k)QQPIqd+FQOVtwZ0t2O$gX%%^vrbnB}ors&oJ1{j*qhTuK>W(p1^> z^bla4^^9!BTXu3LP5I)Ob=0QF>+4>gz}%IToGU8_7TC=;hkr%`5CfE}!9HEfTOY?Q zM>Q)4GLNa5(0a9Qi@@(=7v&QIu#C3oEbt{E8qcsJM(Q|I$*hEmvH@mg^aL7W+zAuL#Bg07|Y ztZTKg+_8U^Y>C}jbx(7hS!>SQtfy-eb-nkwVXknQ zqeaiNT2~h@|DuS=4|@1c?=vee=yyFltLFWyd7_*LG*ss{X)P8G5lzJz6KJ1fwo>}?`k>l#Y`5Fi48VlS4J+}+GGS@nSv_77Gt;OlXl~eshb+fP zz`hGC9dq;3>h_;)C1WlK$I|4=x z-HPizO|~~ZKOD&-*~N^@Q>yTU$*)p3;8|t^K4A4*83#I4v7W>COupfNUOLQlE2gw4 zvKqJ9aDj{aD^h_o2D4r5x2Ii02rL_<hUdxWLsR5Oa?RqE+*S-Ckr zAUIkdd-7;Hz#K1xb82GjfpWjGRKzjjA=8X6ytroGE0(4`qp5bZvP$#3vNO%h`#=Ke z-D*Mn`$h4abQh$%QAk{p!g_s?P)|c_Im&(7x{wUGj%=py7ELRonZhv_$KOaC9GL#~ zA1I1K^Qnb#D4?jgbEHS*wqI>tG(>`|w1D+DN4o2Wfk-F-?-?q5j^XTD^;d@t^O?H} z4N-?(LpSbGE=UXsu`Nb%+GZ+{YF0Mm0m-Cr$zKGj%Nivr>2urycOL0q%;$>Y+9dP7 zeilAF{-uLH8wh$UUece-@<+3z6p~Ne6P&2OLjS)z|F5Z? zT#ZpBtBJ-s9)~Wxx1IT={+LhVO;X)PHiG^DUmtyH`4zH8?IyTlLaoBR_w@OFhUW9x zMbj1`OkY3SJ2j0fYb3y`X9p?~fOO8?X%8}=1sl$kr~|(H%YMINjMbt6>fVgoGTAzB zEJ?%<3O-XI?TFJbM&QnVEH22#NYj2RCNx~HZ3J2eO*EHIs+?o+6^W(p%iflfn&Z^c}omSuzbC?;{J8s7+ zK`u|W8~72_w6}iC43sUCl--w8AEcF?-8@{TKsVZm5)yy>h{UQkT@8U>KSGMtDvXU0 z$Xf211jVmzF!su4XTga>Vd$I#+nKKDFRFo<3105E zeGH|3SX_N{$vN*ZDy&$fTGlF^!aL4?xZh?xSK9}r)pnaU%J#m!F-9N>Xxcp-c1$AX zSB@n|gF*|BX6)tSjBl?`*}Sg~BqE`;D-m1`JLMt3h32L_g`99HHs^uoN7LsA#<`x^ zLbq3Jk_FLtFC-FwhLI%Ul{D&GHNdLwGE$BH1C2{ZVL6~xZnd@-S+oHofyq~#FxjNLR+L-U0m zjlw(!xq@YVU>M(uwKrSXioQ9b_Mx5R-s}j9sovuhNzt@AA|(^YtmW&DXtFL3IIIS0 z-0Kz&1L!rJFNgGh^0}v#a0aoD;8~xu@1HR*fo*Y`jnUg5$#B)JUgEUgC(<_MoVBP( z1LO(i?kvd(0#n_#@@&eIe{Vxz;dP~8(gfm66}d0q=^iY=b2ov`P}VLwQH{Y`d#~PO6mtc4Z~SqdzHWJL z><=PxUSeNM0eKGa7$fK%#;Mizm)D?<&i8D zu@^CJw;F5yO*-`zGxEWc((vGx27V}9%NZxXL=Pxidy4qsIx_EZiYh497D zl`O_;SOLjA7JWWCYW6~;j2QNmRCFvS)J#Yx1$)+IY;V1;Y%Bb=!ip;)W8sI;ceqlE z`oDUa{1NK=o0#H@dil?G=+C|9Y=4AYurNM(ppIM-cM^-$aP72?H5zgn$~GuXZ?rL# zBol~DsyRgm@>u2<{EQZHo7ty55keb1x!3Hz=h(VUyG?khH}Q(7cxlwUNTQfQruF^c`K5VDf>dGP7XNlk zBDbx6T}>qY+~7lwgho>wbsvvfLiaOOJO;TuY0(t~pv&i*Eb)mABvO2z35OYgTsMZ& zMaZy<-kau>V{uNkTwNUvLid!>K}NIt2oU1fJ(i9C(+wL#Y+RJA`u>3@8OJe$bs|@A zFB-WU{W(qxo1BnkIQNx}eJciC{B8KNm9OuX_d_hm)3bo|-{O@m@QUd6TSHz-OawjlP78Z2u|gpg4GI6-VSByya_ z9zvM3%BgGX8W{u!>6DYZL!dC72mxro3Ul2m{yN83q)}WAS5BuLRW8&#SN&f+@*Gd1 zb_f5(QhI$`QA=czX5C1#ZqtXE8*$DV?Cb0GlgWMr?J-xMy6~H|1UC^R6MGdhH0=9g zhPF#`(u&ZGMjqU8TLSI+SXH-SEBm8zQr1|PG5H-!CsoaAw{f!rx+C-T4Jl~6(r6>G$rFKbPs)0Kec?OIk6mvw3cc6d)_V>hS4&qt#}Zb~#_ z))*ZHfQj{fg+w(S0*4DlXYSQEkHuGlSIPN#@16gRlZqU_&LDx+~TYg6Hx5Z z{e{0DFsjL5Jv&1LuGz<&4s1GsCi$doOqPIfWZjQjKL&pd1lCL&lf*gCR056PdF-YH zJm)ZEa9>-CyJx$OvI7XF@5eaGcJ);za;INyn`f zd){rwA9(^phHTOnOs6|9GIf*^H_f_0-k057pXsCW^kxEKHfgW;@0cK0|Ky?a#B#vk z8wgo&xFQ*|&Rb3i*Sc~JPuupSfJ%kwz67=~uaDDjowQe&ui;6%r;OCZf-yNIQKYA@ ztjQL??=>?j&6Th9YQ_6$mY*y5wJLf|Ro1>yuF)3Y5&}Gr^Jq>W96ihkuuLEf@T%o_ zP9_+a<5Eym!?~?iHq$<^J$l3;oiD*Hu>NbTiF8M~|8gJNmtYC;-qSie`Qky~>i8yl zwAaFlZ;v5H;C9a5iu;6{k4P@$)$t3FbkH5w^MLnrS+O<~Ax>kmvr`JC07;^xEsr;b zp{nlS{nxO_q1T1bM%UR|6@d4avdsgcbOJ24-e|hA=_2z^~K z5uE(eXc8clKtyHTpZJx>NNa^G)?vOC{9Wbex`F?wS!%Ku`}2GrUC+x?tY&LQTRSl6 zTfUtkQLR`|VU0`((eViL-jV6iIskov7FGwHBsEwM0V0120Iqe6I?p5S|N_(#`sc5LYy<+{4rl zZ4>_#5AAMt)tV$nC1+o=x;AXq?Lb?SG|~#$H!O4a7i3; zcKjiKD#P zo;w=AWNtg!^Mb>;h#(yP^s$SksU4+uHlOWe*-K=oWU3K61P>q|Kr)ybsikCNogfz~ zz3`+n;q1gSI=O;~vo*y@Tf{C=vFSnEh_$RZ(PZ3) z#@`V#HCANpf{*a&B~>Pr+N&>&_@@e^?QX$z3616p9dtX}m^d>tZ?ZeERi-RikA361 zS2C_goTl{9Mmya=(5cGlc;&Dj#+M4u%2^IPC+5UACM6q)m7r&)+tx&s=P>rlA7z}t zSkHqFB9VmpRAX=@<>(WJ%P#?qA20C=;Je@jS6VG!hMSWew!vC_ny+M~qL9On@6+;{ z0_IuzT;InmHVy3;k-JSqo(n2JWhmj)7wp+Zc1hP#OJW?Ye&rR_{>&s*tDv4LN@*x_Rz{Q{#A6#B$0S!2i6@2LPEI^P5T*W3Qj!F z+BCZV7P042;MddYj~Ut{%^A#pJ@yS~6<5vj%5XM7NFDtX6Z7LlTjIwbl6>xv!s4ay`a$M)?M(@({(eP*z06j zcC)fZo1p<-+#rp{`0AvQ_)V;^45w@J0597CBl?W4YJpjY6ufhj&O%*!xhZC8zb945 z?96f7P(^Rs3qLMVCUipf7d)~lg-1NmH0H&{p*Hm1#cZLfptznP{x*w05uRP7 zS{W}4sakaenJ<&jxJTq28k(!jy1yTLRJmXhBY#M1tmAnS17G$dn))&-XhV$nQHNJC z;~ev0<5mc6=Pclzsgk*xqdMur=)i)61bMbsRF6lkw>Ic)2;GgIkfqa?>yd!wT0Anc ziP!a8Y^N#C9(K;hM(3;qR4YVVafqo(%(Px7X)@ZxSthyH`47{!oj{A*$Ba6AiblA< zgQ<>EzF_^Q=SQ%Bo&9Y_Q^>7_k~>@+9p+5yb6kA=-cP$FAzsXn_Ozs&N({8XAjM4` zmqn@T*&z&hdRyhc%ATNY-X+&&&+59_3SY=#6fH1@&*;5@UDN6%26vl(zdJ~|f3`44 zPxFB7WhNDn{o5;T(jx9?B2I!5l>+6WP-UsX%C?nm5*n57*fIT?OD-&NuVYM$9?rHD z2U!8vh0V%jvMp5!&$1rM1liz+41~k|nL^+YA(Qd*m*|bX+Ok~Kk!&)-s#eZr0B>V#boCqyOl?Oiqt-0?Q zm`GbJj-m~=&dFHh$A1_1cLxE>snT3E|7BosEH%qspMOzAqz-EQ=Qtghh~?kYf>{`k zJKlE2WQ!sH>yxU2gE9Zw!u}?Losz~^2ws@Cr_y)nL zFla{p94quezhhasWw{K0SXLL}M@ImH_uu~>Z^Wbe)Dj|Z@ImQ!IT7G25(B}+XunDR zJ$^_fc6T1+XGZ>C7YR_%8>Q)^9{jN`7KG6JCQMxE-@5oDOp7Q+f;<)0AL~K52+e-P zA^CrCn>3;rtm$IJf2`wDA~d6OJW=w$V|c$RAOTl+(dbPu`(Nw-w-uCTMH~F5T%TAB zW?$XAhiaDG5^hf%tAWPvvPMOP{I6BqpeG1#D`!Gx{(5VNL9yQ>E{5{gTPB3Jrd32$ zf4yD9*Nqad3;OrmAbpZBEdiu=K;{wZ2tn>fD;dAbW*t7}pO&S%W0G~WnXP|ICxEc) zCfNShY}Z{o7I){q{^OgZ9HOmLamxM**&!-B%AA$qKM*Ma0+FtZzWO5+^c ztb9{ft_}+FQY>;YuiV!>%{(M~?4v?PxqPQU6-6eIljEeQRHNP@Ppw|pN9|-CWb={& z#c^xG5jI=t%2v_(u&E>DiBj+Aa76xnbI9Yw0@gv7f6PeftL5U{#Cd_j z8BNO)L3y=Ia-~>Zha(jup`KV26o7{Qcf=;cmw-=C6io+6m6K7&PPgvGa9n;c!g$N) zt#p!U@seV{oaU_?!n`TEX;mTZoI%Gs;lHXXk5rWYOI7t7y()`gcIP}arCF5@C+_3S zkES6EY5A8Qs)ul0rtx10{AuwndqjBhTT|qt{fW171k3M@eY*L#o2DY-WX<*72Z29P z9eGE^tJ@|2Iplc<_>&R6dyph(>))Xa$;SfG7k+#G4?B-sM+B2AL|75$&!Av_P4OH!t)kvk-zoWNu|xZdCC;2=iLf5yZo@I*slTg7DgWK-cGt}UPVNACg9;D zD;dvhg>$badnY(fz_zT8+8xo7#KE^8=WD)Sv7>HrS?H@*Z9_j6s#lHlrCul{j{US~ z7~ITWkPU2L-wUgq_ux5w=A0_$`3iRLu^Kf>Nf&W)Ct@JT5KnVTsrM0PEPx`8Te60D z!Mhs|&a4yj3JwA|4S1tzi=5lt@0y zRHZ+$I|i;!ul)j3&v)&!mEdH?`)U!j`^M%qT#nlu?B2ziv60NtAv2C!368K3@1;ia zzU7Mwwr>3IKs|w=u%sFmdt=$kGi@?I6GwcqYOM;|f8mrCa1({4*CN1!0 z6i+s|m-KZ=36NgW?E6X@KB|;K$(p0m=>&0j~JQkY9M$T%^VXl?m7;8CE5hAq9 zv0c0X5Se?a*Y>j?CV!x294883jsYkMgGg~?aGf*Bc!_M|9x4+01L>7h*{9ER!m5P! zo-&O^Rqa)~;;y6QFRD~~TKwdq(cY@oa-$m)zLq63vnDwv*^rwrI||T1n;fNUCP*e) z!9Xc_s*z$6fQ0(cS9pciJgGS85qn@N+@&wLPJ*x~DD*>oDk^>Oemo3)UA z*u@n%B56&EsLlqX>4%BX7AizO#|CslnX}v#jydbQ4C<@4I646gU zq=OpFX!9{ju-c>h%~5Bo&ip(vyO|j=J3|8FRMo;KKlQ?zgK&(=#0Z9HA{S#0Y!13P zb~(V)jQ-JpboINz<|{_mwp~xy9t~Q9Io7Zj_oda*NgyCARE}_J61&rt`#^n1{dcxy2#d;n9-!Ug}`~8b{9BuYQZ@TTK zdEFye=Zk{XT|$^aB3kWmEWDOCS6e~Qdo-nFlJVWp^d>Uo*kY@o`~p0{S^$H1by&FU zf2lihbwczJUG$B$3HLxzX*d>V|3<=Gsg*}ABd5vku%Cz2lUrj!*P|thLea_o&qwm9POm-yq~f=&%?}b+0j395LTY!bx>Up%O9SI$*?_T z!00>%z~UonSo*-By8yz1I9YG0>EozAOlp{0NZagw% zGntqKf(ks(@PBZ6%WjE3Ms&wVHPtXpR-$~RKr)eOur!>X`;1Oq9Dd;qI*xl8!AI)g zg?lp|2uR%f8TPQ4Cr=Qisha0Cy~ncq;Qe*t>=dKGpAE-z5dV{z8;YY%lCqd-k&IVz z45OW1iI;gK#^V!0FwUv=`MT@NB-Bw9!BPdhi5dvMYt{Iz$>7zD!?fvaT7ZI(HzPM- zf&f*!teSrifhxqpKUKd=INmhR+PYraaPKRY(A2B9EKfQb*s*DuhWhi}d}Pq#PE%^w z{jv52P8h2AL|b6?yU{GgySDS!@hBsnv`k&{1Hn*audA&lC&Y)#$l(o z_Hs?QnkVaDKI%BUJozM!+k$I}$IcpoIL!K3&<96io|J!;_h2vN0rE>(uWMI3+!>D) z>>sY@Vq_xLA>M##BJ0hJ1rHlvU33&S?qMlaAy%f)JU8oK7bAaD)=>fB6{Ce>`2s!VW}LUvAfFXJ`|=E|nL zDfhoLq3vHG4l#(}<{IeOKv*xxHsqp(PP%0<8&1R+%p1Hw6fV{CEmN~|3G)#E zqLDAXcHe5i4BV`mbY9yobY83k!3SQy*aN5u6u9cl!rTKQpsHA?SFJ>ZMFPvTjcko$ za#KmO*6Wlp`Qk>G@mBmC>^LRn3n}-Ixs2XeoR8zQy+^WY-nRWQ*P3U$q>|S|By5bT zjm%CJftZ^<=0djAoV|_2yoYY@ea_4c*f!iGKl)svWy<)_lKpx0Pnk&;jh|d(%I6VI zvfpYz**b?}1;FH#u43 zW)sGxh#uwoqRTSKq{(!K`4VQ&w5!|m2t9Q**#v!XzJIpW+`aq5Ra_QPy$;~}M_vvj zF58Xk6KETY(6tNC!%AF9jpMG?h2fObj;BP*JK*@wDmwz7))A9XDpBFoI?GdDj$CV4 z{fYGGlkIxM(J<&Sr%@}(4Lj^0q)aZU|H1Q>kqt)tq9XJmh+hBX=EiC1QPR?u`1N&r znTT4nplkmZFu{BrTjh{J*F{@@&C1)SSS!T~<~e@jp)0T(mraYS*;~$(dTXN@=lMPw z5{Ev=({0p1<0>`#`orK5Jaq5GJ{-?%eYQ3$k3yLUj&&KvimKA3oXsqvk?%c8422n< zeQ{a0s-`7;;}Wrr*WHEh$m^P(d+KPFo2Cvw7wCJ6O4jsi7hMe9l-?}*Mk2ciMq~hD z)d}~cwIn9LI50m;qCJI|d2Prt(qA*Y2fc-)u3HIAY;4E?hSsh42A(@XR;&m!tJ|h3 zZ$Aj~a?2*{XCIB+M>a~{P*9Z6zRH+Q6a{Qu-?~LS^J+`~F-h3d_0}dEb?207#(pS? zlZ&~Rdbe`3Y=NMpgfzP-w57n5{OBZ!b;*)$|H|?3lx~I`(5QA+xF>k{F65>Q*K*hy z8Syhlln=CNMG7~nuO~f)6m@(gZ@&5~L)%UTD>T6ZzPq+N$|RS~a50)!YmG@i6J#3K6)zynZ*7bhZ*K>_Au8He8%LPf6)Xv8dz z(Agz4{VfYT;Ico^)P+z1x(=mlfM_`)G`*J%Fo)*fzFS04R6r-Lx>#9(FTW)VngDam zLRf+}f!}ykm?kDsdS(`7v^GScS-|-$V#x0oUjpZxih=3gctX9%Gz<6<+>vP_5(6#* zfTN&mls1DK4Dn5&E5(jf9rlzf-BYXhzv;5bv#h?S)QcXFMc81kk^RaI@}j6K8D@K6 zfI}&S;B3X$P|eEHoAVKu@BH+n)qIU$m?Xm?fF~-H?R#&^1>#Fuy*)?L*-YKEW z_q>31mv?xSZ=WzmywVV%woswQ7a50H4%{TiJ zgm!N3QtS(IXxKHBc=lK}Q*!2uYvyia(QGWpkx^WQla9~{ryyW3zCv9~kYG(k(@@3d70X-hFO2^M8rjRrWeR=*r!EtUoFO(8kDy69S?Au=m2-J@{x47#;9B;8@41pU|M$x;tmFwvtf z^q(GOQAALFWxpJ+Q->~BcKTion!U_0_Yy-k&CxB2lDOhoPA4cn*?oZR8Q#8F1>rT)lX%5dl5 zz@EOIOP!tZwd*$pT10n86#MboWtu+Tatu!*@?XQIht=l$O%GBy$2rmWyb-V8Eb>nL6Dbd|vhPFuQA#6Q=`Uc(F^gtC-yJcLC$z;!tjLg+{ zGI1gNPRRK;Hd-^!`Ll9nQD`x-buof(0k8=(T3fiPzLsV?`O|g^O>}ea$`zB?X_aFe z;@NVTd7d2aM&a}-W&I5P+2-rtj}98Wg_I~tX_jfOj;6Q7-I``0l6%ne$>lvICw`hfHlTgXx#Xp$;-b4ChDc2Ek^8%w)Y#oC`@C|?vCNLi zdCuI=E-6L>=1n)*H6`oSCQ36O{(DSb5S>{WYtD_v%doW| z`Mx!D$>+173v?sZ4$B*%thSJOpI^*xcWuftXB%9b%Y2_MlPwY~ShSkpxO&s6g znv!lto((xu3ljqwPcCS&RUyF4*p7h}pA7BCYA_!JExhkn8GG=#BZH5btiIh{rjOk$Dy{3ez-MtD2MA&h6?LR=%g$R92v ze`yb%6_<|Ef%^sJjPcc(v5%7SOv4cfY>G_~CBS!dU^rfyr6^DREF;B~(u4Hp*|E<|}iKSTYY9NYSH{v(lhI%xPO9`B90(ekShGPTQ7QzC4;plZf32(|BPI$I@J#37TpM z>}B{dQ?mXLBu!WIOQ=3yL8hG%fg0y@M>E;%tLMVt1qpOg5={RHdUpcbHF*@XH8~+~ zVRRB^T33vWk7JM@t(feYNeAi!S*&L=9b1FkZfo|60&Z*4B7WXij-%?qKHNTEt0c{F}Uqv)YPgt z2{DLx(h;a)orI*IJsvg>iB(h~`K%l;Wbk=t$Xf$>3zDcM?$F!i36|l9ySJ`|6P9wV4 zjyT7bgqsl8hOjE0=JzG>>Aisq7@(By%>f6vQLA8k^$Kd@xiK%q+4sz!W#LA-{K;S7 zoCL(XMvBI5G&TxstIuu1q?&1N%HDMKna31@KEMp*Amm2xd!@r}b4enxOjMaSx-qwV z6GE9E_Nl9+#-SXMUN5+0C{v)5NrcQnt6lwFczWrHMd6)&W2v_vnvgte9vEWCq~0p^ z$56x?80>*xh^x2;FgO=WJX0L&4quEX45WwjocE#ORbRi-dWVx2H!sSoO2BB|vuYUr za}_qzV`wae+D9t#yIAnP9x+nHl`{lM7Y9pI6xD(^`N^?w?$^3P;`{MaNqFIyPrB6b z*4lleA>2;U1j6y6&o3$BP?&;x0t-E)zL4~bV9E0+^Tm8UU{#OqMUJK+_9p>@d{`#G z=5|!&`OAQ5uX^_2w=Cd_zqR`GzXIbGB`^i=Rh|ZMhvIhH8gO&QZAGN5{BWhFM9<1D zcVD$!@adgzJ4KB~%?Lmaun1slFDZf0@-lK4~d_H!r=bN>yogHGn-ZNsGn8o7H3Qc1fO5}TPd~=_GnGdy3xuEERVc;i?0(v(Wzv}SY9=QTZ~#>{!5d~8BXBa>I%=PY)ep( ziTt~pcYKY06M)Z}GvtclrWxC*4{9dhG{D!~<8TS~G z*bAnhaWEYW-bu9Qi{S8WuE+(@0uKiQQ3u(9Ay~5=cuIbMg3z(%VW`an>KPP@S zT;h2OwW8Z}&i`h)^lHX_kox_eitMp?Lrs%5p3@=4e zCWmSva=TM-^~EaQs`RR`0ZT>vWz38+ZLES^X)g6!!BAyp+JyM2*z=gEc((XPIh#Iy zBbG|W*Kz4$iE#tHYHN#YhHC?BjB9XV!d;noqM-#S&$*rtFwH+_{T%+;x*s&@yCaL4 z!=QQsMTbtpp6oo|q1ch9pr9b5@X0{s$IH0lpX9%B8s1u%c9Y@CZ5XYuR!EJj{ahPA z^`=S6L#|+gVk`R;!yVV_c}tXcoOkrSdQ!H4c2WTgETcf@>pav$>!N{DYD6#kE1y)^ zyRtWjUzVg=^t{4aKM8AOm5FGyNk5d|W8Qfq1o;JvHH&5c!27iL#1u1=G!BCTgAOAw z2pzNTX(qR4?{|_~3^s}Hmthqdc41>ylHB&(t54UTs*&#V>~QRG@p7N@D)F#!mU0S1 z7P>lbO%eBCmxyaT#WhEc{sy68xybt!*$8|BJDLwj@Ejk5Z9;xF=FOrT77 zP7vlR=DQ5pauHXdns5#BrewU_r7-7yX`B1OsH+!&&WBTG==~u6kZFnySKEgrn~&zW z#xzx$rgq~w({bicAt|N}bH~ZX(S#k$Gj9xP=632QZC)4>1*?7kW>QmiT|89swIpFm zr$nF_*^=Dqt!2OE`RqbX-dv@XgQdoN?d5nw5slMYvE`rWJdwzJ<@+edMRF z5~&@0Sc+K66pG|-QF&2kQ7-9QN;FCn8IX)pe*BEt;j3Y?4EBaEY{F~?Nu){PrO=|X zqE4r;7Mo1%Ob;sKDm7oN>&F&eS$A2VSzpL-$@E0Aku7pxUy(F%J~dR2crCOM-xTfP zcjJ69PZ>n{OR!&1Tk!tW@i&3%l&juZj)#={&}H`Ya)1sYiW}#i#IE} z)w|Vx`N=Y+h(OzmHcW568R~M9Eb30!Q1L zJry|>^F6{Cm8h%8R+u|zCP=18HmC<^6<905upmK{8cf2V0~D`zyNxxwbKA_|hTy&q ztiYC)C$^imIvo{9(4(-UD3p$n&mm{H7qnKi4s^S8H#wd;CQ>!h_&J6-8j{ODwT=** z`Sq4xwb?mz*Yu1U#2HNW2!=R?CiK)s$n->$wLxw(UfsMh*Hsk^+3YF{YfJl?%ptVW zgW8FTiVtBBR63PS&v4}rjpgPscNyPZD_=A2t5Z#X`}w(5p?hIUp;MvFc>9EUzLO$3 zm)&sZ$+pRM-023!TWLslRK&d;Zv2$O&hTm9i;-sGSv&i_wJO!Yd;*2n{AxDLK07~N zh^uQ)9Ta2Vx_Yy=iKHd9&@?H3CoCou#1BH#K=+Uo%Sp&#d@c5x#UXR!$$Dx3K5lSG zQD+NYsZqgbHX_EDl}|)%)G1dbMwTBH~CKey2k63rQ2{5 z(+Y?2J-seWI9*0k4zaj`&H7;e=WXgs>{x82&%FicoVtO|hG*Uvn8L2 zg=gXi^?A$PS#*=-td5i_C$^V-9@g`M^KR&yP9xE&Z5D7&V)y=80}BJ{i7nU6`$dU? zMChCBo|jIr>9h65_2Xl*Wkl~PH{4d)N~mGQ^r}<1h#CsZuv(*rx|+8pt)~5fPP9!? z8-;FaRkdNtVWr|g=s?~;Ss98}g+<$Y)#>z-}JEtF^0E(RBsZB6k!wO^p;L0?aO+3(ps4Ygp_wJTmm(FIt~04(yD%8+(mp4hkim z2OU~j+gi*tMmLn%i_DZQJj`EcE$fTmIDFZszWLCBeJ*18s`J&mu@LTI%RLJ`J|~_6 zJ{L+#m--U=^7YZ^uRaTIo!7EMD!;xCM5#ox3i7%(pSt=K71vxy9)t#4sm@zxrMn(O zZUWAuR5=TVZwam@`Xyb8z zdR04(2kS|p6OWoU{)fi0fx6wTyQ3Ro%4b6Lci^L=S-P&T*o){?6I2>P74B~@U?!|1N%E-eGut~ul%JBI&d@CMRZ2jo}hO!XKP?z zcQ;H8E0r}@H;Cof&&c2-XWOGZBv399NVp#v8JQOg%R9j3-5wFBWP-;jhX;Xz%|VF&lu-h%kG~k;e5~{LiVznBLI$4jfYbF0{J*8) zAzu*wy$7`e??7Uz5^{3DRn^em*x1^^%*K)bZL%^zK(&?CasYvd=pRowxwp@b0RB_v z?=&4X6&3gmZLHWn8rc{av$qDWsa>rstsVGXg=qhj;0Nv>$?UY$ ze~LI-2+?XPf~h5J?2V~;*tpp^Xobd6{pa^rPGeW||F&f9@Q+%6g6xlP*g4ra*#E;Ds4DnK(~G{@*75 z=gmJg1=$}p{~t^IHS-@TU}s@8LH7UnOc?DmZVC`sAaZj_<#)jK@&57m5jdItxdQi3 z`4AfR)PO63oTS)0SGc_lfh5j ze;G`nCwK7}G;SbvTM%`SQX-h((#6F->s@$YX-wr3TI3SqGIeh(SblKJZ`w@fciL%o zx<1uV^SM(S|GLRwjP(hGNDYER5e32H^a{Y!qtrAP;iDn`CHR661>pin`QZOsL=_&T zMzDk=4Cy~5a3Bi^I6%oiT&R^%sbR;}224c%sUixs!+zxcr-+{*y)SrRA}m|;KUF~4 z-9rBe02Dd?3=(HmW(hJ7`?m@pz{UT_`2P#=|6~C_M89?8f%hjHthy5>L%P4ZBUj-4 zicw$a)DE)hRrj*$)_><=HvfEPr$#RcRg((2`{M>M0phc9?K(E6>mL~+Hkmq&j^--5 ze8f+&{TLKe>k~_~-TXvc4$@~jNyS++uW5+?L<^HG{EigM^XGO|Cc`g|Sh6qA`)JOc6ng~$MiiFS6WuRSApD}12!~M$)&{M+h zutE;6aUs7eo-zKB*VmWP7yL^)Bpm1kY;kJ{e|woMpqm{_rxYlgh*<8}?{9B-hC&Ui zCtRiV1&4OSI5=vd7JS-AT#J zXJkMdQ5AeqD529?kNa<==P>t+?O)e3`swGZ;p~k`d+ZR4l9t-tshT2>Uy*z{X%6QN z4|*OAs>(u>37rv22~?_S?E&Q363juYIU|=B-LiM=}r6Y+CJtDeYy4NA#hL zl2CdGn;KLum%<6AqL-V8RuP7njD-o){X1hn}WQ8rI3O0;~Ye8rg+7NmkPO=W7MedoB&U53Hoss8k z!n|eNQ+^h)H(j*e=xXfVUIMHazW5>R7Lg#i=mlu!^yi4PhHzu@NY`zCbDpoU*raql z5)&CLbh!Vps=%7_Zn?SxOJFd_H~5*yLTSqesR%)8k-a_TpAe8${=ycht)-=PoLfl8 z=CC<@mh)n+BM2mC>^u!S$bhcZ5S4DeD^SOVDNbWCP3@2d=Bc-dy9H{JDq zLxII?W!|#)#iC1-ona5d1T`#<3GEm`oK?jN&nRp5Ra=n2WIR!^aKN0yh)C9{)T`eC z_{|(>>v9+OF;~zUtNE!zQUh<4W$zoSm$N%XWe0%^8)-I~du|g-PJZ$;8J^>E2TA(g za{1H2HHs06$s9jy$Sm}oL(5t&mgev1+l|92`0q|977yFlZ5h)!+A%M8_2Y$n`N1td zrdeLj-IW&yi#?GfoC^u5;PAP_wugh#wtM%B!3kv`s*| za^W*xZyvcUduf!8=}~0Y)(RbN4yA1pz2j>9&c6}&b!B>cq9B-7&6RyEdn8*TxH0?T zQYO%%-=w3YZei8BkCfaiWh~^uPp}X=d%;dG-d=y%k!!sWu;h8DcE5Yv&+E4RRyGyIDhJE!W?oNpMOFUuI9uXEtOzQ0GRsvg_85VlKGo zvoGY#Piq=t7L27+@8#T_YJKHRN)GYZ>0^v0Pl4>y>xwH%_B;okqeZ*k0!$I_!-F<&-gF_&iYV~0j{ zCxPLC626s+Ku7-^yIl!h#6>bY^5d{WZ4KXm2Z5X(SYjGQ()J=rWA5Hv%#YmNo{aR# z_dkR2&KlvnObqee1QnC^U~7KTEv12UVpoo(b7<#`Wq1v?&_|eXTTBfKLAJRUm_2~d zTR=GXI14_@$E^LeCQyP)k+)xP;P)Zw@aYx}NS(6djvxQl+= z@k)vwmiR(zkJ4>TjJq{K?C z^$u!2{sR|vWzA(STwTU>Tw88uXNsf9efF&)Ex6Si@2$tPfP!(Tg`U1W(jJAN8F=U8 z{X?j8@$JgnVDGQuittL}rH%PdYe=yY&5!*&7dalM6FYn;OLl&D)xEzQ4wC9jI67PX zcP}IS)|^B+XrWlkdZNyCuBjH?IX&4*$Q%!Eg(4kCW$Z@O@vXzi)yU3o{;}IMSzgjOPdb(T{PMg7}TJJ2x7k%jRI-MJwNW}y{sTAke#>+djl=JV91h6 zWnODXXRlo8$T%GnXf8^?3pVGCac_jJLJWQKrts#BliqtqryVaZYKtDT#z+OGN=_J~ zX1#9X`i;jR$Yi^sa-OG9({#`{fGxqSyv`bb`PTcTlMM^lhX1Cirj#31v|R=Mr6vx< zUG_{4BR0q@Wodnafl*_KZL$-o26QoNN|hy8)5E4pX&DSGHNfxTo#hDBEJ7Bgcp@V)==Msv#d7P@ z=!8$ZuhpmBqicCpu|=VIcq=|YS73Y8`E((!&5nboT|f(T+Ip^_>$2!{xAC-X$QA(^ zQ{mbz41w8!N%A^3@Qf>GOZF<6MV? z=+$mEbGzGh+_T|=OZ{J zMi_U6y!YtKD{)|Tuz&BcGvJk&AD)-+1&t;~uci-85vF5eExAp)Q|K1(@Cl6m5Pab< z$afP+tcUVIw9wR4E7fZX|ydp?lWat&`&%#P8OLsOcrNPycIVr*`^|~lLSG7V3^|da` zZav%CZz%?(p^Mh>$ox9HZ}Vr1zrL8#h83zu)j??baUhfk?7;e(0tbqnO|(xRk6p^( z-#3n0W2P;X#6HY1mz|Pp|1<@Xo!s78K6ef+R5*Ot6tQ+d-z)v7b|-DV#l_uUL!~44 zg(+}Oi$bS?a_CqUS_pypYfYF~^b=_EHf|Iwlenow&!`fSs~;XOj$fNQYz*3s(ZGlm zk|W++5=mm!gc3$SLm1u=hi)%?jPrwMh7hSZy&%gb3No4u&wnLe$iieMU1Bl?2s@dr ztPQw=A8|(qYL1j*_@XoRMFx1{+|6q#~RY!hQacfG3PbE3TSz}fx;Bi9IM7>aI%%I^94d>b}Ws&8*FHvjK zSh;)h)2ueguFyDc4w?=VJ8WA~tAwn~nP&sfwK&<0k#%er@bNf>C(gR}jlC^^j}uCj zi|P~kW*}UZ)UcfJN(&>IiUlLIs7zAh?}tps!~v;`AUq?AVDdwx+0D(&wJz;xT+>G9 zmJ3^lW$#6=*Y3G(iuUv{$I9Kk?t|H?0+BL3ZXGqg+t1HcZ%3DWbWoxZUI=SB#)&#! zF%8*!&bSX6;jyMxoOJ$*zL||ibDrm`T!my`he8)rMdIk z_8)MyCK*Ap#;Jt-&VwWmTI{nZH5Pj-x$Biir0}gbnI4{^x=4*`u-&aVH58ucPyh?~ zf`#(9(4R2*crUQ3JT+)CF%YaUa+VpZW<)?F7x`X`A)8^EScq%VkU?b0Ze#kz%H(h& z`si_HQ4&yc&>%MK2%ZNc8X`|j%=5IXMAj|x=T;$sNS&Q?xw*c)g?E;9@ zIDCGMco4M&)q6c{N_J9w)_Ab0-lrFt>)WR3v79=nuUM}$8yTv-1=jNM8FKRmsOQr1 z?@|I%J%3VGMFo@(pSzuVoEKkpe`I;wuoqda=b`be6BAloi>T$A>#%vi9EE2&d3RMx zQf(2+W*S%3Xr;psAs^31?ZXbHO@ZBbrNS6}R-$InR(_iGF(-_m9-Kcb_%TP!QRN(_ z$C@>x=g*$(NfxD41-7!?QO0y7i&~!W#O40Vu0gM@{pQYAsE$To@~ij6L$yHtUSS)kz{F3}tA^0>fA!0iQQfmdll7PVaxH{I{O z&L)M~w5u)Yq$6yDXT}4rhqh`KoyXqaSE;AQwk6;8i_>Y09F({9nI4%OvT*dnkjAX(DjQJvYfc)Md_i^n8Fn=coJR(s$n<@gY zd6@CUA7MNYVkMyMKooxAHwHlKRNUu(5F8NvBmjyP5wYQEhy%4y$({efk|B?e_z?2= zC;(lfAgukD{Ky;Km0TMjmyl!K|AVi={sUTCZ;$8Ij6{%!C5px~D5gt3Ji?YA!GG}c ziZw}wM@axI3!Y)LT8m5L?b}t8p>(b98e(I+X`=Ja`?^|MDLTz&DleqOpk4m43V&gy zQPdagItP!S>p&u_!^!5*SJRSF7Ve&P4Q1^C^^!;Ec5$J>LHBE%bj4=?_(PX|`A0Cn zAW>0+61Ni~r520pA6?WjtZ=BFXE^|}OU)ab??4BuEP)&U4|wiJ4#0KmB(Dno3-iz7 zi9(I#!yNxg{kUW50lfSA$?*0+)&mwHwE$%{j+Ww&?H`@k%LzC)%FluSk4qo*1=R@BL|ksBZDrPrY`P{MMX`^nT1z7u)+x>R-Jv_XWV$yaQ_~Dy|_$Y zz~Ku*E2yy`)R@1AFO6t+H#Ypgk04aZ&!9kUNgE91a70<(e-0+t<fcJDK%HBR zf8+wB6O}{-L#0l;kE;J8h^()8WY&Kag2M}8f>?sQpFjm1>&&SX*UTd}f1E*BjWw>`oK8D6cbFmHCB-PZ(H1`-^10xU}||H_NWci z!ygOw zDgyRyaMS0qQzL++d>J;3`x6ms+<-~bTU)aA$OE;Z^==%0ZRANUnw^O4@;coj7mOav z6)pZ(5*dK?@s^3kQQljq8pj89<-cT~NAh8&28>V@sz#tSCI6RP_eegUD!6Mu5r6eQV4Q6FI#}vo>6L2r!(0Jti%hu^*Cd5l1li$W`EHun#zo~I5Ef1$Z z$7fK8sj-+Q(i!3VC*ESP09_vKElOPwI9FJZ$t+M~`Se0bqFCsB#?Y?Lj{ctj{~QcN zx7(JTev;@g8V`oc`Of4(%M{*#VRys|hZ!of?q3Uo^#FeB^u2eie(8h|tGVjf4gr_i z>8BS?Iaog4*V_elb?dABL6M|=z`n_7QRJbwHRpTb*`RskQz32P ztF`#=1v4!&*sp*3A}Cx<>-)U#j-=S#_qY(c=v5NfH(F}DJD<0o{P|<4R#(qe9my>N zh_Lnk1p8AJnf2qm<2j%`+Q)#P<)cMb0s_Kc+^Qc|=pTwxPUU?mHoQH{H7Zl`Ht)^L z{q>|g`}O|(TVj1rnme|}-ua7CV9lRckt~G9gN;u77?{-ih~uoVbBo0}i}}U)#rlt* z25--Gv}zp-n;K`1-8M5AO*6b|i}mZ2umq338_c(Rp8S-+mSf3SxR_8D=_@Qq$J@xR zy4D0n1!BmhqtpJlR3gI_-kkE!-#t|9#Qb({-r2SLwexR$D6Vg1f`x6sW$$D7trll* z-$ZNkE(>J}pc*myIilBGh+I-X4{>5{HyKK$Z((a5t^RGj63*TrsRYA`i6rBDLq_PC zQrVN`DxS(~#SG*Qny%gtz}$@H?SPe}C{!`!rIhrdtwdo~NkNvIbnSw@d|A3a)Q#-e z(odXq#QGI`5+beW7urB=6_r?*KqMrjrI$pB?E2P{DZ3xPf?0x?c9+0VV?XdGCnwR-b;)D~-2(5~Ev29O5%)y){7UmX{ftsVNlKC@M1 z)vk_dAL2{O^10XYPP<4WAhc3&-E$=a_W-CB^YU)FGq{#ySX#OIV~6xhpC6uADi>1N zsnYPza1`MQ>0v-9KBJR~IAU{e+ONfr$amzwwJp?ZY1DdvDy5QoZD!~_1spA<&ISy( zn$YZNBM*6!Z|UDEEJFA4(`*ujE*7e0OxnP^&I@+qO)fU78^;4|@z^4_<(h6Ge%T#C zeSnfIII2@qW%@R{lL+i>x*Io{JGN6=rhO^b$h-D?6)$(X$@1JzHkR&*b#46y$1hPe z6PVSEE}f?P^gQ<0t@y}Jsdgyr?#_-A!Wi0C8u=!Yg$74kw)4}Bk~8U|R!9*?CN=b} z46YZ>G@S$I%u{s^v8=w6@>(*bSyqN>I4(82*%xA=vyU=rbXL_`&A-WN^%}}WbP?zr zKb_X&sxn(V)3h!h;?*l{6*x=gsm7K1gcfUR^{G2au=MJd((_2H>DvrT^7}H~^HGo8 zC45ib*86LVhSPC*gz!NF!V^qjHVVW;k%!KPiz4Iv9x`L}zFH@KEf>sRl1B?8HG{A? zdaCXV(p5j%Uuh3S-~TAzY;rPcsvJpp=r;VCzVvx-7&0vM_&WkN;&akEj6m&xz&T(U zWK4Ef5&XqB=G9&G#OjiyYtkMuY_W$OhV#|76^(J`CrjC9mnF9XO|PTgA6!Yj)H9_d z+_J*gTXbb8!u7H*FwzP(!wINM8^kgFa)(lR9QcTJr0*_Y4vtB8*Cgq?b%h8j6#Eun zuhM6($l)_WaoYEkri;NkE$%hNT2<0JQzg6B=ZRyzJEK*ELrYl0 z@S6UG7F*j<6nw+Q?Jd5GhS7dG@}DxAF%P@rzI=xWnDlQ9J#WX>vC{c- z+g}N{CnqFso~cb zx@C6ajfp^dYc5B+p0*_Pto27Y5;m!zZ!o!i2)X0Yk4)S2qrEElkrW;c=tqj?59}?c zaVu!N^}~x7GaUpnF^3gB)#SWQi?O|lHfdh~>6}Y$z#F5jp9a;4RxuVjRy7GvOUm1a7lVwe z&CNO(+AeeIp2vbE?5`(AUUhu#uvw5}%rH9kau<*`qamzF#EK1)F93(vgURx9Rj*3d z((Qc&gyb9=&}>GhDEFCL%8Kq(%kx+nO3rnfwP7%Jj1S70w-Y+uIr@1wnN2Ux99h){ z8V@(At9Q}vS$mBkZJ-qgN5FL@ujZ6)_IU|bhaSlZ^W46*CsiDXYPuwC@!5e}OR3xT zW0u*5jOZtQ(^>7jf(@SdUJMq60z#k_n?`fb=$?*EYpB!+0ALBvdIwVsdbl(-v6IS% zj7%z#Qea+IcbvtX2A+v6>2m+d!Iv zqSi#N$wn0~BsQNqt?JJ0G^`L3DMR0Xsd_g8WQ(dO=wwJLYu1PQQSQ-cr^e~WZLhT0 zVGEtL(}jF}!e&BC@u>Ir9wiFtujE=)%49zeZK!;bDQVhhbrWv`$@+$4vojEiDrkL@ z*+|r}=CsiV{|H)t7dY3)3_q+^hKKQM>v!eFbeX>Xk#Vrc4G*FJk=YO3>?gmU;BNBO z-8Y?9yjK>vt8NPk6-yIztHez<`|#7Mas#c#K@G+G;qJmY{vzy&aq^N6$uN-5DhJ%- znnQH|J9u%eMJf4}3S_#}%HRdogmgElppDsQYJcjW)!B6fIJNmTitLU3{?($%bILR#@ZeeHUEjUt*RcFkDv*zm_jE4%rJ?j`9FU7n zIh3Q;M|t-dED?<3Gqo_ImfKPK{{oy46Yzd#0dXyUW z;kTfj$)|gPtuLR}=4Nc4A7CEf4iZ9s8_a-Bkk9h7WzZdd!K}eQEP|V9todH8E)Y!l zoYgLAAGy9DkvvfBPkEgDF&`)Yxc3xuWj5TUd#m1eYh`Ws$6*Y35Y+<3cNdFOn>VOsHIFSKIqemaWT8L-_&Ylc4ehAY&zyk>O)SUOqJx8wtRwRh@1qGl{KdyY zv>H?HS~R%x%khs}Y=jPhr2Znf9qW87-`^BbNrV84nY7tOLPvFI!}Nj3lO>%)Vg?My zslpw=s`BS3&qG)|)pfHs(8@OxPD(gO@=B&#SA_-3B1r}b9ZSIuQpt~zhMz?Rw13y>t!1 z?2WK;bLN>KGc##HkM&87Asftbrr842<}Y@pAu19DH&D9hh&r7GCv|9cMop$@^#ICj zA8)J)`zWCWAIQdD7;| zH6sGe_`SILMQT88m>mY5CFK8#^XtC+#4-6;V8~`l*+a3%EQWEA!d_ktIxE>wD$AMh zHrb4#4H8>2^BSI;~slH|D8PGk94y+;V9ienj7Tz-76Yi+L7eAo zq#v*(N=rhoajd5~Fd8H8KayE~=pY^cRvxDFY}B41kTmlZNDQgN>2%tab62e0mJwd4 zB##-!@yirgYjZU*rfNZU&)c5hLJme5oBfU=y0~_wjixj)9F9Skf)<5nJe{v+ zKTg<@o?ex22%M0ulHgpTN(}mEw2(+b8{$#BBPdyMjJzep=Z_T_X7ndCsk5+Oj2ZdA z3nbmCG@bC_ESr=Tx?Z?@Ag|8iJRG59oJ7F%kbC22G-sr2;qmx&}ziadOnG9LdLg#QZsY04^!{Z#ab-q)<- zQusJc3kceVr>81Zy0gx2gG%t9ix=ZamvXFOd_uy7+@F%0;oRaAEf_V)O*m}r$t#e# zOgK#B{#-}Si58SMDdWLyUkcP-8oOh(94gkbZ31Ou?RJQ#e75T3Hr!H ztU7h)7C~KF!g#ghahPEG3+00cc`E>S1jtk4iw`L}*)?_F3g2J;+Q`92<;g{!lTyXV z-WQJmwx&M17Rp3eBl4ZRp&S2=L9*#qWQ)&EAS* z`WLHQ=t;*6weA?uO{JbwFgeXTeO{+(rCW|BvHUhr4epRrm?9wIbs<{vDehCkP5P<* zO&s$^&tboYffzfH=2~w8G_Fxy7Z^~z&m%i2Tmj-@6rh|M^Jq23$qwRQ%ogm_%|77c z2Etp2GXJ>@$1l7ma6!`4TJ1WP5{Fo!dYne#rVH5`C=!*D7|V_7QzSevzg=hirJSVe zZZm*(IN#Zq@}^t98pC-7A+_pCKC`%|_9)F7Gn z6;XHQkDG$WQDk3;V$Ah2R;C%fD8J1kgl2c9;%oKwh)?sG?7ESF3ox6{DW@UZXVl(& zb?QWDN3S{@!=fS!_mgHMj(=i#&GKxz3z7LoCt$&XB=U#C1YHezrtha)YaHMGn#fK> zc1^+Tpfj_tzfqV;=EhvjGY7i`?~+u-F)wfoO1y5cQg8B{LUkaF_?LmCf)D|$Hbt~F zZaxF6NcYj5+QVmL>Sb}WpKheOzXqYVSMghwGc6gq?lERW{?gV8AU&5!ML{W$d}1?y z#^1cPaf-$a0~b&B~D^Yj`&nfu4)A`~D^a^gmf{uU>H)G^dk)s|vDaGRi{iaDgqV}hqv$ayS zq&TJ%jo+(wKD?)hzzT6{et&N z4&p;g^11tFi|#(=bH$;XALXCH%A;APj+WTR%h_H;r$&bRgR1P_yb{L1K9z39gXf5? zCp5hEt`gtp@{$~donBM=7Tm9yC~1&HqQ3W49_vAic6QLFHtptoLaM8s#SqN~Y24cCK;)+1^^nqA zUyU6z)A2wZ>xjk;9do5t$>)-DH5O&q#)pP+tBp5ey0j~F!;3ZtF~^AeoJ)oN{Wf_C zKLVa$V15W8yjUPbBu(yWVywl`m-9t@DMPK09pr4W9hXO1c^v<{^F~7B`h1_IU`rNZ z?wGeko}Uw^AYvJ>GhsH0L-5p0S!UZI%5*4|koZ}qrSHs#XGSiV_zR;9jRv^$4>vQ0 z{IsJB5uT3WilFM7Y_@>!Uotw}XuHON4<7e6n!Sg#vNx90ZchD;#4*?RZ5b1BlT3oe zep3=9f^U|`US3f7WBxWvW)0VRlrSWK;^S8sY8&GX@#6n5QpU zT1mEFi~rh2BEbsWN-yXrZX3RuBzvOdc)zU~{flS1o@b5iTZl(ol!Flk&}$y>Wb42; zbsJ$i{<1eBgbD-P&Ce2^CMR14os&>#yh5R_Hru8X%_cH5mm(E3_hHxliTSC~fK@+0 z`&w9UyYP7?SYCOkIPei`WDXMLMXL#;`Jp`^?<=l|YF+r-Oz~Rx0MkVrI-6Y6#g*ST z;u67~{v6hSW5+UoPXICg)!hPAd?^EfhQNPy?e`Ku+-1i zOugCeep+d9dwm1ecaW5;OI4_GkU;bs_-9~e05vr>?GXyc{{m(irrQ=ktI2g`w){2v zu>(=r2z*g^6-GddGl9=Sn@PmtLp}nx+pllu@mmVO@{&QjfV%-XbOB~; zm~2VGqIzgG!!<>Hayo?hgOTE_#zqUkUd(m*}tieEKp!-7Rqu`0>DSB&ral@T!pMC zU;sFhQl%7t-rrk~@DFzU43If79lP$yqwMK~@_+I27*T3KP(O|eFbKH9QCFb+Q#|(( zd?nO=krn~4dC9-B5QFK0EDB$H=Zz`HVH` z{b=Rnu#|aWXu?10iW1>NwM$Y72nc%Py27h2nO%2M7{CSA@1HX>#{tQa-1T=%uyOy` zf65yP_(e*Q<(Uj=S9;&MYc&`k30cf~OGpU&xQ+uk5t;-Rjl}hVB)L5QH|DPq&}ynb z7|{dT0Y`%<$e^U$*1^vOQ>30759JLAo=UHJvPdIOF?VH#03vn>8u)MKNVFG73Wz@$ z?)V=P7_fktT*co+%b%=7fC6Alqo4oeUjC2}=>a!im9bBImUz-B| Q3uQj#nc|KR_B0HN4FegFUf literal 0 HcmV?d00001 diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/images/favicon.ico b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1da0b49aa1cc9a8770f9b00f3e6067c006144c47 GIT binary patch literal 4849 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 B(;@%> literal 0 HcmV?d00001 diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/images/vonage-logo-desktop.svg b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/images/vonage-logo-desktop.svg new file mode 100644 index 00000000..cc9f7a8c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/images/vonage-logo-desktop.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/images/vonage-logo-mobile.svg b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/images/vonage-logo-mobile.svg new file mode 100644 index 00000000..c56412cf --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/public/images/vonage-logo-mobile.svg @@ -0,0 +1 @@ +Asset 4 \ No newline at end of file diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/App.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/App.spec.tsx new file mode 100644 index 00000000..d87edc22 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/App.spec.tsx @@ -0,0 +1,35 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect, vi } from 'vitest'; +import { PropsWithChildren } from 'react'; +import App from './App'; + +// Mock the page components to make text assertions easy +vi.mock('./pages/LandingPage', () => ({ default: () =>

        })); +vi.mock('./pages/GoodBye/index', () => ({ default: () =>
        GoodBye Page
        })); +vi.mock('./pages/UnsupportedBrowserPage', () => ({ + default: () =>
        Unsupported Browser
        , +})); + +vi.mock('./components/RedirectToWaitingRoom', () => ({ + default: ({ children }: PropsWithChildren) => children, +})); + +describe('App routing', () => { + it('renders LandingPage on unknown route', () => { + window.history.pushState({}, '', '/unknown'); + render(); + expect(screen.getByText(/Landing Page/i)).toBeInTheDocument(); + }); + + it('renders GoodBye page on /goodbye', () => { + window.history.pushState({}, '', '/goodbye'); + render(); + expect(screen.getByText(/GoodBye Page/i)).toBeInTheDocument(); + }); + + it('renders UnsupportedBrowserPage on /unsupported-browser', () => { + window.history.pushState({}, '', '/unsupported-browser'); + render(); + expect(screen.getByText(/Unsupported Browser/i)).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/App.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/App.tsx new file mode 100644 index 00000000..d723e62e --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/App.tsx @@ -0,0 +1,100 @@ +import { BrowserRouter as Router, Route, Routes, FutureConfig } from 'react-router-dom'; +import './css/App.css'; +import './css/index.css'; +import MeetingRoom from './pages/MeetingRoom'; +import GoodBye from './pages/GoodBye/index'; +import WaitingRoom from './pages/WaitingRoom'; +import { PreviewPublisherProvider } from './Context/PreviewPublisherProvider'; +import LandingPage from './pages/LandingPage'; +import { PublisherProvider } from './Context/PublisherProvider'; +import { RedirectToWaitingRoom, ErrorBoundary, EnvGuard } from './components'; +import UnsupportedBrowserPage from './pages/UnsupportedBrowserPage'; +import RoomProvider from './Context/RoomProvider'; +import AppContextProvider from './AppContextProvider'; +import RedirectToUnsupportedBrowserPage from '@components/RedirectToUnsupportedBrowserPage'; +import SuspenseBoundary from '@web/components/SuspenseBoundary/SuspenseBoundary'; +import WaitingRoomSkeleton from '@pages/WaitingRoom/WaitingRoom.skeleton'; +import MeetingRoomSkeleton from '@pages/MeetingRoom/MeetingRoom.skeleton'; +import SessionProvider from '@Context/SessionProvider/session'; +import LoggerSynchronizer from '@Context/LoggerSynchronizer'; +import { ErrorPage } from './pages/ErrorBoundary'; +import { runtime$ } from '@core/stores'; +import { videoClient } from './services'; +import { NotificationsContainer } from '@ui/components'; +import { BackendLoggingProvider } from './logger/providers'; + +const futureConfig: Partial = { + /** + * Enable relative splat paths to ensure that dynamic imports in the app work correctly regardless of the base path. + */ + v7_relativeSplatPath: true, + v7_startTransition: true, +}; + +const InnerApp = () => { + return ( +
        + + + }> + }> + + + + + + + } + /> + + + }> + + + + + + + + + + + } + /> + + + } /> + } /> + } /> + + +
        + ); +}; + +export const loggerProvider = new BackendLoggingProvider(); + +/** + * The wrapper is necessary temporarily since app also need to have access to theme context. + */ +const App = () => { + return ( + + }> + + + + + + + + ); +}; + +export default App; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/AppContextProvider.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/AppContextProvider.tsx new file mode 100644 index 00000000..a189e8dc --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/AppContextProvider.tsx @@ -0,0 +1,15 @@ +import React, { type PropsWithChildren } from 'react'; +import UserProvider from '@Context/user'; +import { ThemeProvider, type ThemeProviderProps } from '@ui/theme'; + +type AppContextProviderProps = PropsWithChildren; + +const AppContextProvider: React.FC = ({ children, container }) => { + return ( + + {children} + + ); +}; + +export default AppContextProvider; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/AdvancedSettings/AdvancedSettings.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/AdvancedSettings/AdvancedSettings.tsx new file mode 100644 index 00000000..6f1ad158 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/AdvancedSettings/AdvancedSettings.tsx @@ -0,0 +1,185 @@ +import createGlobalState from 'react-global-state-hooks/createGlobalState'; +import actions from 'react-global-state-hooks/actions'; +import { z } from 'zod'; +import type { + AdvancedSettingsAudioBitrateMode, + AdvancedSettingsBitrateMode, + AdvancedSettingsCodecMode, + AdvancedSettingsCustomAudioBitrate, + AdvancedSettingsCustomVideoBitrate, + AdvancedSettingsFrameRate, + AdvancedSettingsManualCodecOrder, + AdvancedSettingsResolution, + AdvancedSettingsTab, +} from '@components/AdvancedSettingsDialog/types/types'; +import { + ADVANCED_SETTINGS_AUDIO_BITRATE_MODE, + ADVANCED_SETTINGS_BITRATE_MODE, + ADVANCED_SETTINGS_CODEC_MODE, +} from '@components/AdvancedSettingsDialog/types/types'; +import { env, RESOLUTIONS } from '../../env'; + +const INITIAL_STATE = { + isOpen: false, + selectedTab: 'general' as AdvancedSettingsTab, + bitrateMode: ADVANCED_SETTINGS_BITRATE_MODE.default as AdvancedSettingsBitrateMode, + customVideoBitrate: 500_000 as AdvancedSettingsCustomVideoBitrate, + codecMode: ADVANCED_SETTINGS_CODEC_MODE.automatic, + codecPriority: ['vp9', 'vp8', 'h264'] as AdvancedSettingsManualCodecOrder, + frameRate: 30 as AdvancedSettingsFrameRate, + resolution: env.DEFAULT_RESOLUTION ?? '1280x720', + audioBitrateMode: ADVANCED_SETTINGS_AUDIO_BITRATE_MODE.automatic, + customAudioBitrate: 128 as AdvancedSettingsCustomAudioBitrate, + enableDtx: true, + publisherAudioFallbackEnabled: false, + subscriberAudioFallbackEnabled: false, + publisherStatisticsEnabled: false, +}; + +export type advancedSettings = typeof INITIAL_STATE; + +const advancedSettingsSchema: z.ZodType = z.object({ + isOpen: z.boolean(), + selectedTab: z.enum(['general', 'video', 'audio', 'statistics']), + bitrateMode: z.enum(['default', 'bw_saver', 'extra_bw_saver', 'custom']), + customVideoBitrate: z + .number() + .int() + .min(env.MIN_CUSTOM_VIDEO_BITRATE_BPS) + .max(env.MAX_CUSTOM_VIDEO_BITRATE_BPS), + codecMode: z.enum(['automatic', 'manual']), + codecPriority: z.tuple([ + z.enum(['vp8', 'vp9', 'h264']), + z.enum(['vp8', 'vp9', 'h264']), + z.enum(['vp8', 'vp9', 'h264']), + ]), + frameRate: z.custom( + (value): value is AdvancedSettingsFrameRate => + typeof value === 'number' && + Number.isInteger(value) && + env.SUPPORTED_FRAME_RATES.includes(value), + { message: 'Unsupported frame rate' } + ), + resolution: z.enum(RESOLUTIONS), + audioBitrateMode: z.enum(['automatic', 'custom']), + customAudioBitrate: z.number().int().min(6).max(510), + enableDtx: z.boolean(), + publisherAudioFallbackEnabled: z.boolean(), + subscriberAudioFallbackEnabled: z.boolean(), + publisherStatisticsEnabled: z.boolean(), +}); + +const advancedSettings$ = createGlobalState(INITIAL_STATE, { + localStorage: { + key: 'advancedSettings', + selector: (state) => + ({ + ...state, + isOpen: false, + }) as advancedSettings, + + validator: ({ restored, initial }): advancedSettings => { + const restoredState = advancedSettingsSchema.safeParse(restored); + const fallbackState = initial as advancedSettings; + + if (restoredState.success) { + return restoredState.data; + } + + console.error('AdvancedSettings: invalid restored localStorage state', restoredState.error); + + return fallbackState; + }, + }, + actions: { + open() { + return () => { + partialUpdate({ isOpen: true }); + }; + }, + close() { + return () => { + partialUpdate({ isOpen: false }); + }; + }, + setSelectedTab(tab: AdvancedSettingsTab) { + return () => { + partialUpdate({ selectedTab: tab }); + }; + }, + setBitrateMode(value: AdvancedSettingsBitrateMode) { + return () => { + partialUpdate({ bitrateMode: value }); + }; + }, + setCustomVideoBitrate(value: AdvancedSettingsCustomVideoBitrate) { + return () => { + partialUpdate({ customVideoBitrate: value }); + }; + }, + setCodecMode(value: AdvancedSettingsCodecMode) { + return () => { + partialUpdate({ codecMode: value }); + }; + }, + setCodecPriority(value: AdvancedSettingsManualCodecOrder) { + return () => { + partialUpdate({ codecPriority: value }); + }; + }, + setFrameRate(value: AdvancedSettingsFrameRate) { + return () => { + partialUpdate({ frameRate: value }); + }; + }, + setResolution(value: AdvancedSettingsResolution) { + return () => { + partialUpdate({ resolution: value }); + }; + }, + setAudioBitrateMode(value: AdvancedSettingsAudioBitrateMode) { + return () => { + partialUpdate({ audioBitrateMode: value }); + }; + }, + setCustomAudioBitrate(value: AdvancedSettingsCustomAudioBitrate) { + return () => { + partialUpdate({ customAudioBitrate: value }); + }; + }, + setEnableDtx(value: boolean) { + return () => { + partialUpdate({ enableDtx: value }); + }; + }, + setPublisherAudioFallbackEnabled(value: boolean) { + return () => { + partialUpdate({ publisherAudioFallbackEnabled: value }); + }; + }, + setSubscriberAudioFallbackEnabled(value: boolean) { + return () => { + partialUpdate({ subscriberAudioFallbackEnabled: value }); + }; + }, + setPublisherStatisticsEnabled(value: boolean) { + return () => { + partialUpdate({ publisherStatisticsEnabled: value }); + }; + }, + }, +}); + +const internals = actions(advancedSettings$, { + update: (updatedValues: Partial) => { + return ({ setState }) => { + setState((state) => ({ ...state, ...updatedValues })); + }; + }, +}); + +function partialUpdate(partialState: Partial) { + internals.update(partialState); +} + +export default advancedSettings$; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/AdvancedSettings/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/AdvancedSettings/index.ts new file mode 100644 index 00000000..509294f2 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/AdvancedSettings/index.ts @@ -0,0 +1,2 @@ +export { default } from './AdvancedSettings'; +export type { advancedSettings } from './AdvancedSettings'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/BackgroundEffectsDialog/BackgroundEffectsDialogContext.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/BackgroundEffectsDialog/BackgroundEffectsDialogContext.tsx new file mode 100644 index 00000000..3cdde4a8 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/BackgroundEffectsDialog/BackgroundEffectsDialogContext.tsx @@ -0,0 +1,27 @@ +import createContext from 'react-global-state-hooks/createContext'; + +/** + * BackgroundEffectsDialog Context + * Manages the state of the Background Effects Dialog. + */ +const backgroundEffectsDialog$ = createContext( + { + isOpen: false, + }, + { + actions: { + open() { + return ({ setState }) => { + setState((state) => ({ ...state, isOpen: true })); + }; + }, + close() { + return ({ setState }) => { + setState((state) => ({ ...state, isOpen: false })); + }; + }, + }, + } +); + +export default backgroundEffectsDialog$; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/BackgroundEffectsDialog/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/BackgroundEffectsDialog/index.ts new file mode 100644 index 00000000..9800299f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/BackgroundEffectsDialog/index.ts @@ -0,0 +1 @@ +export { default } from './BackgroundEffectsDialogContext'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/BackgroundPublisherProvider/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/BackgroundPublisherProvider/index.tsx new file mode 100644 index 00000000..cf132329 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/BackgroundPublisherProvider/index.tsx @@ -0,0 +1,31 @@ +import { ReactElement, ReactNode, createContext } from 'react'; +import useBackgroundPublisher from './useBackgroundPublisher'; + +export type BackgroundPublisherContextType = ReturnType; +export const BackgroundPublisherContext = createContext({} as BackgroundPublisherContextType); + +export type BackgroundPublisherProviderProps = { + children: ReactNode; +}; + +/** + * BackgroundPublisherProvider - React Context Provider for BackgroundPublisherContext + * BackgroundPublisherContextType contains all state and methods for local video publisher + * See useBackgroundPublisher.tsx for methods and state + * @param {BackgroundPublisherProviderProps} props - Background publisher provider properties + * @property {ReactNode} children - The content to be rendered + * @returns {BackgroundPublisherContext} a context provider for a publisher Background + */ +export const BackgroundPublisherProvider = ({ + children, +}: { + children: ReactNode; +}): ReactElement => { + const backgroundPublisherContext = useBackgroundPublisher(); + + return ( + + {children} + + ); +}; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/BackgroundPublisherProvider/useBackgroundPublisher/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/BackgroundPublisherProvider/useBackgroundPublisher/index.tsx new file mode 100644 index 00000000..30ce0a82 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/BackgroundPublisherProvider/useBackgroundPublisher/index.tsx @@ -0,0 +1,3 @@ +import useBackgroundPublisher from './useBackgroundPublisher'; + +export default useBackgroundPublisher; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/BackgroundPublisherProvider/useBackgroundPublisher/useBackgroundPublisher.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/BackgroundPublisherProvider/useBackgroundPublisher/useBackgroundPublisher.spec.tsx new file mode 100644 index 00000000..e3b16181 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/BackgroundPublisherProvider/useBackgroundPublisher/useBackgroundPublisher.spec.tsx @@ -0,0 +1,269 @@ +import { act, renderHook as renderHookBase, waitFor } from '@testing-library/react'; +import { beforeEach, describe, expect, it, Mock, vi } from 'vitest'; +import { hasMediaProcessorSupport, initPublisher, Publisher } from '@vonage/client-sdk-video'; +import EventEmitter from 'node:events'; +import { defaultAudioDevice, defaultVideoDevice } from '@utils/mockData/device'; +import { makeTestProvider, providers, ProviderOptions } from '@test/providers'; +import useBackgroundPublisher from './useBackgroundPublisher'; +import { DEVICE_ACCESS_STATUS } from '@utils/constants'; +import { setupWindowNavigatorMock } from '@web-test/fixtures'; + +vi.mock('@vonage/client-sdk-video'); + +describe('useBackgroundPublisher', () => { + const mockPublisher = Object.assign(new EventEmitter(), { + getAudioSource: () => defaultAudioDevice, + getVideoSource: () => defaultVideoDevice, + applyVideoFilter: vi.fn(), + clearVideoFilter: vi.fn(), + setPreferredFrameRate: vi.fn().mockResolvedValue(undefined), + setPreferredResolution: vi.fn().mockResolvedValue(undefined), + setMaxVideoBitrate: vi.fn().mockResolvedValue(undefined), + setVideoBitratePreset: vi.fn().mockResolvedValue(undefined), + }) as unknown as Publisher; + + const mockedInitPublisher = vi.fn(); + const mockedHasMediaProcessorSupport = vi.fn(); + + beforeEach(() => { + vi.spyOn(console, 'error'); + + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + enumerateDevices: Promise.resolve([]), + }, + }); + + const { permissions } = globalThis.navigator; + + vi.spyOn(permissions, 'query').mockResolvedValue({ state: 'granted' } as PermissionStatus); + + (initPublisher as Mock).mockImplementation(mockedInitPublisher); + (hasMediaProcessorSupport as Mock).mockImplementation(mockedHasMediaProcessorSupport); + }); + + describe('initBackgroundLocalPublisher', () => { + it('should call initBackgroundLocalPublisher', () => { + mockedInitPublisher.mockReturnValue(mockPublisher); + const { result } = render(); + + act(() => { + result.current.initBackgroundLocalPublisher(); + }); + + expect(mockedInitPublisher).toHaveBeenCalled(); + }); + + it('should log access denied errors', () => { + const error = new Error( + "It hit me pretty hard, how there's no kind of sad in this world that will stop it turning." + ); + error.name = 'OT_USER_MEDIA_ACCESS_DENIED'; + (initPublisher as Mock).mockImplementation((_, _args, callback) => { + callback(error); + }); + + const { result } = render(); + act(() => { + result.current.initBackgroundLocalPublisher(); + }); + expect(console.error).toHaveBeenCalledWith('initPublisher error: ', error); + }); + + it('should apply background high blur-sm when initialized and changed background', async () => { + mockedHasMediaProcessorSupport.mockReturnValue(true); + mockedInitPublisher.mockReturnValue(mockPublisher); + const { result } = render(); + act(() => { + result.current.initBackgroundLocalPublisher(); + }); + + await act(async () => { + await result.current.changeBackground('high-blur'); + }); + expect(mockPublisher.applyVideoFilter).toHaveBeenCalledWith({ + type: 'backgroundBlur', + blurStrength: 'high', + }); + }); + + it('should not replace background when initialized if the device does not support it', () => { + mockedHasMediaProcessorSupport.mockReturnValue(false); + mockedInitPublisher.mockReturnValue(mockPublisher); + const { result } = render(); + act(() => { + result.current.initBackgroundLocalPublisher(); + }); + expect(mockedInitPublisher).toHaveBeenCalledWith( + undefined, + expect.objectContaining({ + videoFilter: undefined, + }), + expect.any(Function) + ); + }); + }); + + describe('changeBackground', () => { + let result: ReturnType['result']; + beforeEach(() => { + mockedHasMediaProcessorSupport.mockReturnValue(true); + mockedInitPublisher.mockReturnValue(mockPublisher); + result = render().result; + act(() => { + result.current.initBackgroundLocalPublisher(); + }); + (mockPublisher.applyVideoFilter as Mock).mockClear(); + (mockPublisher.clearVideoFilter as Mock).mockClear(); + }); + + it('applies low blur-sm filter', async () => { + await act(async () => { + await result.current.changeBackground('low-blur'); + }); + expect(mockPublisher.applyVideoFilter).toHaveBeenCalledWith({ + type: 'backgroundBlur', + blurStrength: 'low', + }); + }); + + it('applies background replacement with image', async () => { + await act(async () => { + await result.current.changeBackground('bg1.jpg'); + }); + expect(mockPublisher.applyVideoFilter).toHaveBeenCalledWith({ + type: 'backgroundReplacement', + backgroundImgUrl: expect.stringContaining('bg1.jpg'), + }); + }); + + it('clears video filter for unknown option', async () => { + await act(async () => { + await result.current.changeBackground('none'); + }); + expect(mockPublisher.clearVideoFilter).toHaveBeenCalled(); + }); + + it('logs an error if applyBackgroundFilter rejects', async () => { + mockPublisher.applyVideoFilter = vi.fn(() => { + throw new Error('Simulated internal failure'); + }); + + const { result: res } = render(); + await act(async () => { + res.current.initBackgroundLocalPublisher(); + await res.current.changeBackground('low-blur'); + }); + + expect(console.error).toHaveBeenCalledWith('Failed to apply background filter.'); + }); + }); + + describe('on accessDenied', () => { + const mockQuery = vi.fn(); + let mockedPermissionStatus: { onchange: null | (() => void); state: string }; + const emitAccessDeniedError = () => { + // @ts-expect-error We simulate user denying microphone permissions in a browser. + mockPublisher.emit('accessDenied', { + message: 'Microphone permission denied during the call', + }); + }; + + beforeEach(() => { + mockedPermissionStatus = { + onchange: null, + state: 'prompt', + }; + mockQuery.mockResolvedValue(mockedPermissionStatus); + + const { permissions } = globalThis.navigator; + + vi.spyOn(permissions, 'query').mockImplementation(mockQuery); + }); + + it('handles permission denial', async () => { + mockedInitPublisher.mockReturnValue(mockPublisher); + + const { result } = render(); + + act(() => { + result.current.initBackgroundLocalPublisher(); + }); + + expect(result.current.accessStatus).not.toBe(DEVICE_ACCESS_STATUS.REJECTED); + + act(() => { + emitAccessDeniedError(); + }); + + await waitFor(() => { + expect(result.current.accessStatus).toBe(DEVICE_ACCESS_STATUS.REJECTED); + }); + }); + + it('does not throw on older, unsupported browsers', async () => { + mockQuery.mockImplementation(() => { + return Promise.reject(new Error('Whoops')); + }); + mockedInitPublisher.mockReturnValue(mockPublisher); + + const { result } = render(); + + act(() => { + result.current.initBackgroundLocalPublisher(); + }); + + expect(emitAccessDeniedError).not.toThrow(); + + act(() => { + emitAccessDeniedError(); + }); + + await waitFor(() => { + expect(console.error).toHaveBeenCalledWith( + 'Error querying permissions:', + expect.objectContaining({ message: 'Whoops' }) + ); + }); + }); + }); +}); + +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; + sessionContext?: ProviderOptions['SessionContext']; + publisherContext?: ProviderOptions['PublisherContext']; + backgroundPublisherContext?: ProviderOptions['BackgroundPublisherContext']; +}; + +function render({ + userContext, + sessionContext, + publisherContext, + backgroundPublisherContext, +}: RenderOptions = {}) { + const { wrapper, ...context } = makeTestProvider( + [ + providers.user, + providers.session, + providers.publisher, + providers.backgroundPublisher, + providers.runtime, + ], + { + userContext, + sessionContext, + publisherContext, + backgroundPublisherContext, + runtimeContext: undefined, + } + ); + + return { + ...context, + ...renderHookBase(() => useBackgroundPublisher(), { + wrapper, + }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/BackgroundPublisherProvider/useBackgroundPublisher/useBackgroundPublisher.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/BackgroundPublisherProvider/useBackgroundPublisher/useBackgroundPublisher.tsx new file mode 100644 index 00000000..7ef53442 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/BackgroundPublisherProvider/useBackgroundPublisher/useBackgroundPublisher.tsx @@ -0,0 +1,320 @@ +import { useState, useRef, useCallback } from 'react'; +import { + Publisher, + Event, + initPublisher, + VideoFilter, + hasMediaProcessorSupport, + PublisherProperties, +} from '@vonage/client-sdk-video'; +import usePermissions from '../../../hooks/usePermissions'; +import useUserContext from '../../../hooks/useUserContext'; +import { DEVICE_ACCESS_STATUS } from '../../../utils/constants'; +import { AccessDeniedEvent } from '../../PublisherProvider/usePublisher/usePublisher'; +import applyBackgroundFilter from '../../../utils/backgroundFilter/applyBackgroundFilter/applyBackgroundFilter'; +import useImageStorage, { StoredImage } from '../../../utils/useImageStorage/useImageStorage'; +import getInitialBackgroundFilter from '../../../utils/backgroundFilter/getInitialBackgroundFilter/getInitialBackgroundFilter'; +import handlePublisherAccessDenied from '../../../utils/publisher/handlePublisherAccessDenied'; +import mediaDevices$ from '@core/stores/devices'; +import useSyncPublisherDevices from '@Context/PublisherProvider/usePublisher/hooks/useSyncPublisherDevices'; +import { getStorageItem, STORAGE_KEYS } from '@utils/storage'; +import attempt from '@common/execution/attempt/attempt'; +import { useMountEffect } from '@web/hooks'; +import { env } from '../../../env'; + +export type BackgroundPublisherContextType = { + isPublishing: boolean; + isVideoEnabled: boolean; + publisher: Publisher | null; + publisherVideoElement: HTMLVideoElement | HTMLObjectElement | undefined; + destroyBackgroundPublisher: () => void; + toggleVideo: () => void; + changeBackground: (backgroundSelected: string) => Promise; + backgroundFilter: VideoFilter | undefined; + accessStatus: string | null; + initBackgroundLocalPublisher: () => void; + customImages: StoredImage[]; + addCustomImage: (dataUrl: string) => void; + deleteCustomImage: (id: string) => void; + backgroundSelected: string; + setBackgroundSelected: (value: string) => void; + handleBackgroundChange: (background: string) => void; + handleAddCustomImage: (dataUrl: string) => void; +}; + +type PublisherVideoElementCreatedEvent = Event<'videoElementCreated', Publisher> & { + element: HTMLVideoElement | HTMLObjectElement; +}; + +export type BackgroundPublisherContextInitialValue = Partial< + Pick< + BackgroundPublisherContextType, + | 'publisherVideoElement' + | 'isPublishing' + | 'isVideoEnabled' + | 'customImages' + | 'backgroundSelected' + | 'backgroundFilter' + | 'publisher' + > +>; + +/** + * Hook wrapper for creation, interaction with, and state for local video publisher with background effects. + * Access from app via BackgroundPublisherProvider, not directly. + * @property {boolean} isPublishing - React state boolean showing if we are publishing + * @property {boolean} isVideoEnabled - React state boolean showing if camera is on + * @property {Publisher | null} publisher - Publisher object + * @property {HTMLVideoElement | HTMLObjectElement} publisherVideoElement - video element for publisher + * @property {Function} destroyBackgroundPublisher - Method to destroy publisher + * @property {Function} toggleVideo - Method to toggle camera on/off. State updated internally, can be read via isVideoEnabled. + * @property {Function} changeBackground - Method to change background effect + * @property {VideoFilter | undefined} backgroundFilter - Current background filter applied to publisher + * @property {string | null} accessStatus - Current device access status + * @property {Function} initBackgroundLocalPublisher - Method to initialize the background publisher + * @returns {BackgroundPublisherContextType} Background context + */ +const useBackgroundPublisher = ( + initialValue?: BackgroundPublisherContextInitialValue +): BackgroundPublisherContextType => { + const { user } = useUserContext(); + const { getImagesFromStorage, addImageToStorage, deleteImageFromStorage } = useImageStorage(); + const [publisherVideoElement, setPublisherVideoElement] = useState< + HTMLVideoElement | HTMLObjectElement | undefined + >(initialValue?.publisherVideoElement ?? undefined); + const { setAccessStatus, accessStatus } = usePermissions(); + + const backgroundPublisherRef = useRef(null); + const [isPublishing, setIsPublishing] = useState(initialValue?.isPublishing ?? false); + + const initialBackgroundRef = useRef( + user.defaultSettings.backgroundFilter + ); + + const [backgroundFilter, setBackgroundFilter] = useState( + () => initialValue?.backgroundFilter ?? user.defaultSettings.backgroundFilter + ); + + const [isVideoEnabled, setIsVideoEnabled] = useState( + initialValue?.isVideoEnabled ?? getStorageItem(STORAGE_KEYS.VIDEO_SOURCE_ENABLED) !== 'false' + ); + + const [customImages, setCustomImages] = useState( + () => initialValue?.customImages ?? getImagesFromStorage() + ); + + const [backgroundSelected, setBackgroundSelected] = useState( + initialValue?.backgroundSelected ?? '' + ); + + const handleBackgroundDestroyed = () => { + backgroundPublisherRef.current = null; + }; + + // Sync publisher with selected devices from store (handles device changes and disconnections) + useSyncPublisherDevices(backgroundPublisherRef, { setIsVideoEnabled }); + + /** + * Change background replacement or blur effect + * @param {string} backgroundSelected - The selected background option + * @returns {void} + */ + const changeBackground = useCallback( + (backgroundSelected: string) => { + return applyBackgroundFilter({ + publisher: backgroundPublisherRef.current, + backgroundSelected, + setUser: undefined, + setBackgroundFilter, + storeItem: false, + }).catch(() => { + console.error('Failed to apply background filter.'); + }); + }, + [setBackgroundFilter] + ); + + const handleBackgroundAccessDenied = useCallback( + async (event: AccessDeniedEvent) => { + await handlePublisherAccessDenied(event, setAccessStatus); + }, + [setAccessStatus] + ); + + const handleVideoElementCreated = (event: PublisherVideoElementCreatedEvent) => { + setPublisherVideoElement(event.element); + setIsPublishing(true); + }; + + const addPublisherListeners = useCallback( + (publisher: Publisher | null) => { + if (!publisher) { + return; + } + publisher.on('destroyed', handleBackgroundDestroyed); + publisher.on('accessDenied', handleBackgroundAccessDenied); + publisher.on('videoElementCreated', handleVideoElementCreated); + publisher.on('accessAllowed', () => { + setAccessStatus(DEVICE_ACCESS_STATUS.ACCEPTED); + }); + }, + [handleBackgroundAccessDenied, setAccessStatus] + ); + + /** + * Destroys the background publisher + * @returns {void} + */ + const destroyBackgroundPublisher = useCallback(() => { + attempt(() => { + backgroundPublisherRef.current?.destroy(); + }); + + backgroundPublisherRef.current = null; + }, []); + + const initBackgroundLocalPublisher = useCallback(() => { + if (backgroundPublisherRef.current) return; + + let videoFilter: VideoFilter | undefined; + if (initialBackgroundRef.current && hasMediaProcessorSupport('both')) { + videoFilter = initialBackgroundRef.current; + } + + const publisherOptions: PublisherProperties = { + insertDefaultUI: false, + videoFilter, + resolution: env.DEFAULT_RESOLUTION, + videoSource: mediaDevices$.getState().videoinput, + publishAudio: false, + publishVideo: isVideoEnabled, + }; + + backgroundPublisherRef.current = initPublisher(undefined, publisherOptions, (err: unknown) => { + if (err instanceof Error) { + backgroundPublisherRef.current = null; + if (err.name === 'OT_USER_MEDIA_ACCESS_DENIED') { + console.error('initPublisher error: ', err); + } + } + }); + addPublisherListeners(backgroundPublisherRef.current); + }, [addPublisherListeners, isVideoEnabled]); + + /** + * Turns the camera on and off + * A wrapper for Publisher.publishVideo() + * More details here: https://vonage.github.io/conversation-docs/video-js-reference/latest/Publisher.html#publishVideo + * @returns {void} + */ + const toggleVideo = () => { + if (!backgroundPublisherRef.current) { + return; + } + backgroundPublisherRef.current.publishVideo(!isVideoEnabled); + setIsVideoEnabled(!isVideoEnabled); + }; + + /** + * Add a custom background image + * @param {string} dataUrl - The data URL of the image to add + * @returns {void} + */ + const addCustomImage = useCallback( + (dataUrl: string) => { + addImageToStorage(dataUrl); + setCustomImages(getImagesFromStorage()); + }, + [getImagesFromStorage, addImageToStorage] + ); + + /** + * Delete a custom background image + * If the deleted image is currently selected, clear the background filter + * @param {string} id - The ID of the image to delete + * @returns {void} + */ + const deleteCustomImage = useCallback( + (id: string) => { + const imageToDelete = customImages.find((img) => img.id === id); + if (!imageToDelete) { + throw new Error('Image to delete not found'); + } + + // Don't allow deletion if this image is currently selected + const isSelectedBackground = backgroundSelected === imageToDelete.dataUrl; + if (isSelectedBackground) { + throw new Error('Cannot delete currently selected background image'); + } + + deleteImageFromStorage(id); + setCustomImages((imgs) => imgs.filter((img) => img.id !== id)); + + // If the deleted image was the currently applied background filter, clear it + const currentBackgroundFilter = getInitialBackgroundFilter(backgroundPublisherRef.current); + if (imageToDelete.dataUrl === currentBackgroundFilter) { + changeBackground(backgroundSelected).catch(() => { + throw new Error('Failed to reset background filter after deleting custom image'); + }); + } + }, + [backgroundSelected, customImages, deleteImageFromStorage, changeBackground] + ); + + /** + * Handle background change by updating state and applying the filter + * @param {string} background - The background option to apply + * @returns {void} + */ + const handleBackgroundChange = useCallback( + (background: string) => { + setBackgroundSelected(background); + changeBackground(background).catch((error) => { + console.error('Failed to change background:', error); + }); + }, + [changeBackground] + ); + + /** + * Handle adding a custom image and immediately apply it as background + * @param {string} dataUrl - The data URL of the image to add + * @returns {void} + */ + const handleAddCustomImage = useCallback( + (dataUrl: string) => { + addCustomImage(dataUrl); + handleBackgroundChange(dataUrl); + }, + [addCustomImage, handleBackgroundChange] + ); + + useMountEffect(() => { + return () => { + destroyBackgroundPublisher(); + }; + }); + + return { + initBackgroundLocalPublisher, + isPublishing, + isVideoEnabled, + destroyBackgroundPublisher, + + publisher: backgroundPublisherRef.current, + publisherVideoElement, + toggleVideo, + changeBackground, + backgroundFilter, + accessStatus, + + customImages, + addCustomImage, + deleteCustomImage, + backgroundSelected, + setBackgroundSelected, + handleBackgroundChange, + handleAddCustomImage, + }; +}; +export default useBackgroundPublisher; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/LoggerSynchronizer/LoggerSynchronizer.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/LoggerSynchronizer/LoggerSynchronizer.spec.tsx new file mode 100644 index 00000000..8816dbe2 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/LoggerSynchronizer/LoggerSynchronizer.spec.tsx @@ -0,0 +1,99 @@ +import { describe, it, expect, vi } from 'vitest'; +import { render as renderBase, act, waitFor } from '@testing-library/react'; +import frontendLogger from '../../logger'; +import { makeTestProvider, providers, type ProviderOptions } from '@test/providers'; +import LoggerSynchronizer from './LoggerSynchronizer'; + +vi.mock('../../logger', () => ({ + default: { + setContext: vi.fn(), + clearContext: vi.fn(), + }, +})); + +const mockSetContext = vi.mocked(frontendLogger.setContext); +const mockClearContext = vi.mocked(frontendLogger.clearContext); +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const mockVonageVideoClient = { sessionId: 'session-1', connectionId: 'connection-1' } as any; + +describe('LoggerSynchronizer', () => { + it('syncs userId, sessionId, and connectionId into the logger on mount', () => { + render({ + sessionContext: { + __interceptor: (ctx) => { + if (ctx) ctx.vonageVideoClient = mockVonageVideoClient; + }, + }, + }); + + expect(mockSetContext).toHaveBeenCalledWith({ + userId: 'user-1', + sessionId: 'session-1', + connectionId: 'connection-1', + }); + }); + + it('syncs undefined sessionId and connectionId when no session is connected', () => { + render(); + + expect(mockSetContext).toHaveBeenCalledWith({ + userId: 'user-1', + sessionId: undefined, + connectionId: undefined, + }); + }); + + it('sets userId to undefined when user name is empty', () => { + render({ userContext: { value: { defaultSettings: { name: '' } } } }); + + expect(mockSetContext).toHaveBeenCalledWith(expect.objectContaining({ userId: undefined })); + }); + + it('re-syncs when userId changes', async () => { + const { userContext } = render(); + + act(() => { + userContext.current?.setUser((prev) => ({ + ...prev, + defaultSettings: { ...prev.defaultSettings, name: 'new-name' }, + })); + }); + + await waitFor(() => { + expect(mockSetContext).toHaveBeenLastCalledWith( + expect.objectContaining({ userId: 'new-name' }) + ); + }); + }); + + it('never calls clearContext so async events always keep their context', () => { + const { unmount } = render(); + + unmount(); + + expect(mockClearContext).not.toHaveBeenCalled(); + }); +}); + +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; + sessionContext?: ProviderOptions['SessionContext']; +}; + +function render({ userContext, sessionContext }: RenderOptions = {}) { + const { wrapper, ...context } = makeTestProvider( + [providers.user, providers.session, providers.runtime] as const, + { + userContext: { + value: { defaultSettings: { name: 'user-1' } }, + ...userContext, + }, + sessionContext, + runtimeContext: undefined, + } + ); + + const rendered = renderBase(, { wrapper }); + + return { ...rendered, ...context }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/LoggerSynchronizer/LoggerSynchronizer.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/LoggerSynchronizer/LoggerSynchronizer.tsx new file mode 100644 index 00000000..88e76bc3 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/LoggerSynchronizer/LoggerSynchronizer.tsx @@ -0,0 +1,21 @@ +import { useEffect } from 'react'; +import useSessionContext from '@hooks/useSessionContext'; +import useUserContext from '@hooks/useUserContext'; +import frontendLogger from '../../logger'; + +const LoggerSynchronizer = () => { + const { vonageVideoClient } = useSessionContext(); + const { user } = useUserContext(); + + const userId = user.defaultSettings.name || undefined; + const sessionId = vonageVideoClient?.sessionId; + const connectionId = vonageVideoClient?.connectionId; + + useEffect(() => { + frontendLogger.setContext({ userId, sessionId, connectionId }); + }, [userId, sessionId, connectionId]); + + return null; +}; + +export default LoggerSynchronizer; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/LoggerSynchronizer/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/LoggerSynchronizer/index.tsx new file mode 100644 index 00000000..8d44371f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/LoggerSynchronizer/index.tsx @@ -0,0 +1 @@ +export { default } from './LoggerSynchronizer'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PrecallNetworkTestDialog/PrecallNetworkTestDialogContext.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PrecallNetworkTestDialog/PrecallNetworkTestDialogContext.tsx new file mode 100644 index 00000000..5c4c0965 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PrecallNetworkTestDialog/PrecallNetworkTestDialogContext.tsx @@ -0,0 +1,27 @@ +import createContext from 'react-global-state-hooks/createContext'; + +/** + * PrecallNetworkTestDialog Context + * Manages the state of the Precall Network Test Dialog. + */ +const precallNetworkTestDialog$ = createContext( + { + isOpen: false, + }, + { + actions: { + open() { + return ({ setState }) => { + setState((state) => ({ ...state, isOpen: true })); + }; + }, + close() { + return ({ setState }) => { + setState((state) => ({ ...state, isOpen: false })); + }; + }, + }, + } +); + +export default precallNetworkTestDialog$; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PrecallNetworkTestDialog/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PrecallNetworkTestDialog/index.ts new file mode 100644 index 00000000..3861d879 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PrecallNetworkTestDialog/index.ts @@ -0,0 +1 @@ +export { default } from './PrecallNetworkTestDialogContext'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PreviewPublisherProvider/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PreviewPublisherProvider/index.tsx new file mode 100644 index 00000000..faed2b7c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PreviewPublisherProvider/index.tsx @@ -0,0 +1,29 @@ +import { ReactNode, createContext } from 'react'; +import usePreviewPublisher from './usePreviewPublisher'; + +export type PreviewPublisherContextType = ReturnType; +export const PreviewPublisherContext = createContext({} as PreviewPublisherContextType); + +export type PreviewPublisherProviderProps = { + children: ReactNode; +}; + +/** + * PreviewPublisherProvider - React Context Provider for PublisherContext + * PublisherContext contains all state and methods for local video publisher + * We use Context to make the publisher available in many components across the app without + * prop drilling: https://react.dev/learn/passing-data-deeply-with-context#use-cases-for-context + * See usePreviewPublisher.tsx for methods and state + * @param {PreviewPublisherProviderProps} props - The provider properties + * @property {ReactNode} children - The content to be rendered + * @returns {PreviewPublisherContext} a context provider for a publisher preview + */ +export const PreviewPublisherProvider = ({ children }: { children: ReactNode }) => { + const previewPublisherContext = usePreviewPublisher(); + + return ( + + {children} + + ); +}; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PreviewPublisherProvider/usePreviewPublisher/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PreviewPublisherProvider/usePreviewPublisher/index.tsx new file mode 100644 index 00000000..09b3808c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PreviewPublisherProvider/usePreviewPublisher/index.tsx @@ -0,0 +1,3 @@ +import usePreviewPublisher from './usePreviewPublisher'; + +export default usePreviewPublisher; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PreviewPublisherProvider/usePreviewPublisher/usePreviewPublisher.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PreviewPublisherProvider/usePreviewPublisher/usePreviewPublisher.spec.tsx new file mode 100644 index 00000000..d79fe37c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PreviewPublisherProvider/usePreviewPublisher/usePreviewPublisher.spec.tsx @@ -0,0 +1,241 @@ +import { act, waitFor } from '@testing-library/react'; +import { beforeEach, describe, expect, it, Mock, vi } from 'vitest'; +import { hasMediaProcessorSupport, initPublisher, Publisher } from '@vonage/client-sdk-video'; +import EventEmitter from 'node:events'; +import { defaultAudioDevice, defaultVideoDevice } from '@utils/mockData/device'; +import { DEVICE_ACCESS_STATUS } from '@utils/constants'; +import usePreviewPublisher from './usePreviewPublisher'; +import { makeTestProvider, providers, type ProviderOptions } from '@test/providers'; +import renderAsyncHook from '@web-test/renderAsyncHook'; +import composeProviders from '@web/helpers/composeProviders'; +import SuspenseBoundary from '@web/components/SuspenseBoundary'; +import { setupWindowNavigatorMock } from '@web-test/fixtures'; + +vi.mock('@vonage/client-sdk-video'); + +describe('usePreviewPublisher', () => { + const mockPublisher = Object.assign(new EventEmitter(), { + getAudioSource: () => defaultAudioDevice, + getVideoSource: () => defaultVideoDevice, + applyVideoFilter: vi.fn(), + clearVideoFilter: vi.fn(), + }) as unknown as Publisher; + const mockedInitPublisher = vi.fn(); + const mockedHasMediaProcessorSupport = vi.fn(); + + beforeEach(() => { + vi.spyOn(console, 'error').mockImplementation(vi.fn()); + + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + enumerateDevices: Promise.resolve([]), + }, + }); + + const { permissions } = globalThis.navigator; + + vi.spyOn(permissions, 'query').mockResolvedValue({ state: 'granted' } as PermissionStatus); + + (initPublisher as Mock).mockImplementation(mockedInitPublisher); + (hasMediaProcessorSupport as Mock).mockImplementation(mockedHasMediaProcessorSupport); + }); + + describe('initLocalPublisher', () => { + it('should call initLocalPublisher', async () => { + mockedInitPublisher.mockReturnValue(mockPublisher); + const { result } = await render(); + + result.current.initLocalPublisher(); + + expect(mockedInitPublisher).toHaveBeenCalled(); + }); + + it('should log access denied errors', async () => { + const error = new Error( + "It hit me pretty hard, how there's no kind of sad in this world that will stop it turning." + ); + error.name = 'OT_USER_MEDIA_ACCESS_DENIED'; + (initPublisher as Mock).mockImplementation((_, _args, callback) => { + callback(error); + }); + + const { result } = await render(); + result.current.initLocalPublisher(); + expect(console.error).toHaveBeenCalledWith('initPublisher error: ', error); + }); + + it('should apply background high blur-sm when initialized and changed background', async () => { + mockedHasMediaProcessorSupport.mockReturnValue(true); + mockedInitPublisher.mockReturnValue(mockPublisher); + const { result } = await render(); + result.current.initLocalPublisher(); + + await act(async () => { + await result.current.changeBackground('high-blur'); + }); + expect(mockPublisher.applyVideoFilter).toHaveBeenCalledWith({ + type: 'backgroundBlur', + blurStrength: 'high', + }); + }); + + it('should not replace background when initialized if the device does not support it', async () => { + mockedHasMediaProcessorSupport.mockReturnValue(false); + mockedInitPublisher.mockReturnValue(mockPublisher); + const { result } = await render(); + result.current.initLocalPublisher(); + expect(mockedInitPublisher).toHaveBeenCalledWith( + undefined, + expect.objectContaining({ + videoFilter: undefined, + }), + expect.any(Function) + ); + }); + }); + + describe('changeBackground', () => { + let result: ReturnType; + + beforeEach(async () => { + mockedHasMediaProcessorSupport.mockReturnValue(true); + mockedInitPublisher.mockReturnValue(mockPublisher); + const renderResult = await render(); + + result = renderResult.result.current; + + act(() => { + result.initLocalPublisher(); + }); + + (mockPublisher.applyVideoFilter as Mock).mockClear(); + (mockPublisher.clearVideoFilter as Mock).mockClear(); + }); + + it('applies low blur-sm filter', async () => { + await act(async () => { + await result.changeBackground('low-blur'); + }); + expect(mockPublisher.applyVideoFilter).toHaveBeenCalledWith({ + type: 'backgroundBlur', + blurStrength: 'low', + }); + }); + + it('applies background replacement with image', async () => { + await act(async () => { + await result.changeBackground('bg1.jpg'); + }); + expect(mockPublisher.applyVideoFilter).toHaveBeenCalledWith({ + type: 'backgroundReplacement', + backgroundImgUrl: expect.stringContaining('bg1.jpg'), + }); + }); + + it('clears video filter for unknown option', async () => { + await act(async () => { + await result.changeBackground('none'); + }); + }); + + it('logs an error if applyBackgroundFilter rejects', async () => { + mockPublisher.applyVideoFilter = vi.fn(() => { + throw new Error('Simulated internal failure'); + }); + + const { result: res } = await render(); + await act(async () => { + res.current.initLocalPublisher(); + await res.current.changeBackground('low-blur'); + }); + + expect(console.error).toHaveBeenCalledWith('Failed to apply background filter.'); + }); + }); + + describe('on accessDenied', () => { + const mockQuery = vi.fn(); + let mockedPermissionStatus: { onchange: null | (() => void); status: string }; + const emitAccessDeniedError = () => { + // @ts-expect-error We simulate user denying microphone permissions in a browser. + mockPublisher.emit('accessDenied', { + message: 'Microphone permission denied during the call', + }); + }; + + beforeEach(() => { + mockedPermissionStatus = { + onchange: null, + status: 'prompt', + }; + mockQuery.mockResolvedValue(mockedPermissionStatus); + + const { permissions } = globalThis.navigator; + + vi.spyOn(permissions, 'query').mockImplementation(mockQuery); + }); + + it('handles permission denial', async () => { + mockedInitPublisher.mockReturnValue(mockPublisher); + + const { result } = await render(); + + act(() => { + result.current.initLocalPublisher(); + }); + + expect(result.current.accessStatus).not.toBe(DEVICE_ACCESS_STATUS.REJECTED); + + act(() => { + emitAccessDeniedError(); + }); + + await waitFor(() => { + expect(result.current.accessStatus).toBe(DEVICE_ACCESS_STATUS.REJECTED); + }); + }); + + it('does not throw on older, unsupported browsers', async () => { + mockQuery.mockImplementation(() => { + return Promise.reject(new Error('Whoops')); + }); + mockedInitPublisher.mockReturnValue(mockPublisher); + + const { result } = await render(); + + act(() => { + result.current.initLocalPublisher(); + }); + + expect(emitAccessDeniedError).not.toThrow(); + + act(emitAccessDeniedError); + + expect(console.error).toHaveBeenCalledWith('Error querying permissions:', expect.any(Error)); + }); + }); +}); + +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; + previewPublisherContext?: ProviderOptions['PreviewPublisherContext']; +}; + +async function render({ userContext, previewPublisherContext }: RenderOptions = {}) { + const { wrapper, ...context } = makeTestProvider([providers.user, providers.previewPublisher], { + userContext, + previewPublisherContext, + }); + + const composedWrapper = composeProviders(SuspenseBoundary, wrapper); + + const rendered = await renderAsyncHook(() => usePreviewPublisher(), { + wrapper: composedWrapper, + }); + + return { + ...rendered, + ...context, + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PreviewPublisherProvider/usePreviewPublisher/usePreviewPublisher.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PreviewPublisherProvider/usePreviewPublisher/usePreviewPublisher.tsx new file mode 100644 index 00000000..eeafcf95 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PreviewPublisherProvider/usePreviewPublisher/usePreviewPublisher.tsx @@ -0,0 +1,296 @@ +import { useState, useRef, useCallback } from 'react'; +import { initPublisher, hasMediaProcessorSupport } from '@vonage/client-sdk-video'; +import type { Event, Publisher, PublisherProperties, VideoFilter } from '@vonage/client-sdk-video'; +import usePermissions from '../../../hooks/usePermissions'; +import useUserContext from '../../../hooks/useUserContext'; +import { DEVICE_ACCESS_STATUS } from '../../../utils/constants'; +import { UserType } from '../../user'; +import { AccessDeniedEvent } from '../../PublisherProvider/usePublisher/usePublisher'; +import { setStorageItem, getStorageItem, STORAGE_KEYS } from '../../../utils/storage'; +import applyBackgroundFilter from '../../../utils/backgroundFilter/applyBackgroundFilter/applyBackgroundFilter'; +import handlePublisherAccessDenied from '../../../utils/publisher/handlePublisherAccessDenied'; +import useStableCallback from '@web/hooks/useStableCallback'; +import mediaDevices$ from '@core/stores/devices'; +import useSyncPublisherDevices from '@Context/PublisherProvider/usePublisher/hooks/useSyncPublisherDevices/useSyncPublisherDevices'; +import waitUntilPlaying from '@utils/waitUntilPlaying'; +import { attempt } from '@common/execution'; +import { useMountEffect } from '@web/hooks'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import useApplyAdvancedSettings from '@Context/PublisherProvider/useApplyAdvancedSettings'; +import { env } from '../../../env'; + +type PublisherVideoElementCreatedEvent = Event<'videoElementCreated', Publisher> & { + element: HTMLVideoElement | HTMLObjectElement; +}; + +export type PreviewPublisherContextType = { + isAudioEnabled: boolean; + isPublishing: boolean; + isVideoEnabled: boolean; + publisher: Publisher | null; + publisherVideoElement: HTMLVideoElement | HTMLObjectElement | undefined; + destroyPublisher: () => void; + toggleAudio: () => void; + toggleVideo: () => void; + changeBackground: (backgroundSelected: string) => Promise; + backgroundFilter: VideoFilter | undefined; + accessStatus: string | null; + initLocalPublisher: () => void; + speechLevel: number; + isVideoLoading: boolean; +}; + +export type PreviewPublisherInitialValue = Partial< + Pick< + PreviewPublisherContextType, + | 'publisherVideoElement' + | 'isAudioEnabled' + | 'isPublishing' + | 'isVideoEnabled' + | 'speechLevel' + | 'backgroundFilter' + | 'accessStatus' + | 'publisher' + > +>; + +/** + * Hook wrapper for creation, interaction with, and state for local video preview publisher. + * Access from app via PreviewPublisherProvider, not directly. + * @property {boolean} isAudioEnabled - React state boolean showing if audio is enabled + * @property {boolean} isPublishing - React state boolean showing if we are publishing + * @property {boolean} isVideoEnabled - React state boolean showing if camera is on + * @property {Publisher | null} publisher - Publisher object + * @property {HTMLVideoElement | HTMLObjectElement} publisherVideoElement - video element for publisher + * @property {Function} destroyPublisher - Method to destroy publisher + * @property {() => void} toggleAudio - Method to toggle microphone on/off. State updated internally, can be read via isAudioEnabled. + * @property {() => void} toggleVideo - Method to toggle camera on/off. State updated internally, can be read via isVideoEnabled. + * @property {Function} changeBackground - Method to change background effect + * @property {VideoFilter | undefined} backgroundFilter - Current background filter applied to publisher + * @property {string | undefined} localVideoSource - Current video source device ID + * @property {string | undefined} localAudioSource - Current audio source device ID + * @property {string | null} accessStatus - Current device access status + * @property {Function} initLocalPublisher - Method to initialize the preview publisher + * @property {number} speechLevel - Current speech level for audio visualization + * @returns {PreviewPublisherContextType} preview context + */ +const usePreviewPublisher = ( + initialValue?: PreviewPublisherInitialValue +): PreviewPublisherContextType => { + const videoSourceId = mediaDevices$.useDeviceId('videoinput'); + const audioSourceId = mediaDevices$.useDeviceId('audioinput'); + + const { setUser, user } = useUserContext(); + const [publisherVideoElement, setPublisherVideoElement] = useState< + HTMLVideoElement | HTMLObjectElement | undefined + >(initialValue?.publisherVideoElement ?? undefined); + const [speechLevel, setSpeechLevel] = useState(initialValue?.speechLevel ?? 0); + const { setAccessStatus, accessStatus } = usePermissions(); + const publisherRef = useRef(null); + + const [isPublishing, setIsPublishing] = useState(initialValue?.isPublishing ?? false); + const initialBackgroundRef = useRef( + user.defaultSettings.backgroundFilter + ); + const [backgroundFilter, setBackgroundFilter] = useState( + () => initialValue?.backgroundFilter ?? user.defaultSettings.backgroundFilter + ); + const [isVideoEnabled, setIsVideoEnabled] = useState( + () => + initialValue?.isVideoEnabled ?? getStorageItem(STORAGE_KEYS.VIDEO_SOURCE_ENABLED) !== 'false' + ); + + const [isAudioEnabled, setIsAudioEnabled] = useState( + () => + initialValue?.isAudioEnabled ?? getStorageItem(STORAGE_KEYS.AUDIO_SOURCE_ENABLED) !== 'false' + ); + + const handlePreviewDestroyed = () => { + publisherRef.current = null; + }; + + const [isVideoLoading, setIsVideoLoading] = useState(isVideoEnabled); + + // Sync publisher with selected devices from store (handles device changes and disconnections) + useSyncPublisherDevices(publisherRef, { setIsAudioEnabled, setIsVideoEnabled }); + + /** + * Change background replacement or blur effect + * @param {string} backgroundSelected - The selected background option + * @returns {void} + */ + const changeBackground = useCallback( + (backgroundSelected: string) => { + return applyBackgroundFilter({ + publisher: publisherRef.current, + backgroundSelected, + setUser, + setBackgroundFilter, + }).catch(() => { + console.error('Failed to apply background filter.'); + }); + }, + [setBackgroundFilter, setUser] + ); + + const handleAccessDenied = useCallback( + async (event: AccessDeniedEvent) => { + await handlePublisherAccessDenied(event, setAccessStatus); + }, + [setAccessStatus] + ); + + const handleVideoElementCreated = (event: PublisherVideoElementCreatedEvent) => { + setPublisherVideoElement(event.element); + setIsPublishing(true); + + event.element.classList.add('video__element'); + event.element.title = 'publisher-preview'; + + if (!isVideoLoading) return; + + void waitUntilPlaying(event.element).then(() => { + setIsVideoLoading(false); + }); + }; + + /* TODO: Replace with mvgAverage utils once merged */ // NOSONAR + const calculateAudioLevel = useCallback((audioLevel: number) => { + const currentLogLevel = Math.log(audioLevel) / Math.LN10 / 1.5 + 1; + setSpeechLevel(Math.min(Math.max(currentLogLevel, 0), 1) * 100); + }, []); + + const addPublisherListeners = useStableCallback((publisher: Publisher | null) => { + if (!publisher) { + return; + } + publisher.on('destroyed', handlePreviewDestroyed); + publisher.on('accessDenied', handleAccessDenied); + publisher.on('videoElementCreated', handleVideoElementCreated); + publisher.on('audioLevelUpdated', ({ audioLevel }: { audioLevel: number }) => { + calculateAudioLevel(audioLevel); + }); + publisher.on('accessAllowed', () => { + setAccessStatus(DEVICE_ACCESS_STATUS.ACCEPTED); + }); + }); + + const initLocalPublisher = useStableCallback(() => { + if (publisherRef.current) { + return; + } + + let videoFilter: VideoFilter | undefined; + if (initialBackgroundRef.current && hasMediaProcessorSupport('both')) { + videoFilter = initialBackgroundRef.current; + } + + const { frameRate, codecMode, codecPriority } = advancedSettings$.getState(); + + const publisherOptions: PublisherProperties = { + insertDefaultUI: false, + videoFilter, + resolution: env.PUBLISHER_MAX_RESOLUTION, + frameRate, + preferredVideoCodecs: codecMode === 'automatic' ? 'automatic' : codecPriority, + publishAudio: isAudioEnabled, + publishVideo: isVideoEnabled, + audioSource: audioSourceId, + videoSource: videoSourceId, + }; + + publisherRef.current = initPublisher(undefined, publisherOptions, (err: unknown) => { + if (err instanceof Error) { + publisherRef.current = null; + if (err.name === 'OT_USER_MEDIA_ACCESS_DENIED') { + console.error('initPublisher error: ', err); + } + } + }); + + addPublisherListeners(publisherRef.current); + }); + + /** + * Destroys the preview publisher + * @returns {void} + */ + const destroyPublisher = useCallback(() => { + if (!publisherRef.current) return; + + attempt(() => { + // There is a known race condition in Firefox during navigation where the DOM elements are destroyed before the publisher is destroyed, causing OT to throw an error. + publisherRef.current?.destroy(); + }); + }, []); + + /** + * Turns the camera on and off + * A wrapper for Publisher.publishVideo() + * More details here: https://vonage.github.io/conversation-docs/video-js-reference/latest/Publisher.html#publishVideo + * @returns {void} + */ + const toggleVideo = () => { + if (!publisherRef.current) { + return; + } + + publisherRef.current.publishVideo(!isVideoEnabled); + setStorageItem(STORAGE_KEYS.VIDEO_SOURCE_ENABLED, (!isVideoEnabled).toString()); + setIsVideoEnabled(!isVideoEnabled); + if (setUser) { + setUser((prevUser: UserType) => ({ + ...prevUser, + defaultSettings: { ...prevUser.defaultSettings, publishVideo: !isVideoEnabled }, + })); + } + }; + + /** + * Turns the microphone on and off + * A wrapper for Publisher.publishAudio() + * More details here: https://vonage.github.io/conversation-docs/video-js-reference/latest/Publisher.html#publishAudio + * @returns {void} + */ + const toggleAudio = () => { + if (!publisherRef.current) { + return; + } + publisherRef.current.publishAudio(!isAudioEnabled); + setIsAudioEnabled(!isAudioEnabled); + setStorageItem(STORAGE_KEYS.AUDIO_SOURCE_ENABLED, (!isAudioEnabled).toString()); + if (setUser) { + setUser((prevUser: UserType) => ({ + ...prevUser, + defaultSettings: { ...prevUser.defaultSettings, publishAudio: !isAudioEnabled }, + })); + } + }; + + useMountEffect(() => { + return () => { + destroyPublisher(); + }; + }); + + useApplyAdvancedSettings(isPublishing ? publisherRef.current : null); + + return { + isAudioEnabled, + initLocalPublisher, + isPublishing, + isVideoEnabled, + destroyPublisher, + + publisher: publisherRef.current, + publisherVideoElement, + toggleAudio, + toggleVideo, + changeBackground, + backgroundFilter, + accessStatus, + speechLevel, + isVideoLoading, + }; +}; +export default usePreviewPublisher; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/PublisherProvider.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/PublisherProvider.tsx new file mode 100644 index 00000000..f07e999b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/PublisherProvider.tsx @@ -0,0 +1,30 @@ +import { ReactElement, ReactNode, createContext } from 'react'; +import usePublisher from './usePublisher'; +import { PublisherContextInitialValue } from './usePublisher/usePublisher'; + +export type PublisherContextType = ReturnType; +export const PublisherContext = createContext({} as PublisherContextType); + +export type PublisherProviderProps = { + children: ReactNode; + initialValue?: PublisherContextInitialValue; +}; + +/** + * PublisherProvider - React Context Provider for PublisherContext + * PublisherContext contains all state and methods for local video publisher + * We use Context to make the publisher available in many components across the app without + * prop drilling: https://react.dev/learn/passing-data-deeply-with-context#use-cases-for-context + * See usePublisher.tsx for methods and state + * @param {PublisherProviderProps} props - The provider properties + * @property {ReactNode} children - The content to be rendered + * @returns {PublisherContextType} a context provider for a publisher + */ +export const PublisherProvider = ({ + children, + initialValue, +}: PublisherProviderProps): ReactElement => { + const publisherContext = usePublisher(initialValue); + + return {children}; +}; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/index.tsx new file mode 100644 index 00000000..eb76f682 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/index.tsx @@ -0,0 +1 @@ +export * from './PublisherProvider'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/useApplyAdvancedSettings/applyAdvancedSettingsToPublisher.spec.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/useApplyAdvancedSettings/applyAdvancedSettingsToPublisher.spec.ts new file mode 100644 index 00000000..ef8c0cbe --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/useApplyAdvancedSettings/applyAdvancedSettingsToPublisher.spec.ts @@ -0,0 +1,110 @@ +import { describe, expect, it, vi, beforeEach } from 'vitest'; +import type { Publisher } from '@vonage/client-sdk-video'; +import applyAdvancedSettingsToPublisher, { + applyBitrate, + applyFrameRate, + applyResolution, +} from './applyAdvancedSettingsToPublisher'; + +const createMockPublisher = () => + ({ + getVideoSource: vi.fn().mockReturnValue({ track: {} }), + setPreferredFrameRate: vi.fn().mockResolvedValue(undefined), + setPreferredResolution: vi.fn().mockResolvedValue(undefined), + setMaxVideoBitrate: vi.fn().mockResolvedValue(undefined), + setVideoBitratePreset: vi.fn().mockResolvedValue(undefined), + }) as unknown as Publisher; + +describe('applyAdvancedSettingsToPublisher', () => { + beforeEach(() => { + vi.restoreAllMocks(); + }); + + it('returns early for frame rate when publisher is null', async () => { + await expect(applyFrameRate(null, 15)).resolves.toBeUndefined(); + }); + + it('returns early for resolution when publisher is null', async () => { + await expect(applyResolution(null, '640x480')).resolves.toBeUndefined(); + }); + + it('returns early for bitrate when publisher is null', async () => { + await expect(applyBitrate(null, 'default', 500_000)).resolves.toBeUndefined(); + }); + + it('applies parsed resolution dimensions', async () => { + const publisher = createMockPublisher(); + + await applyResolution(publisher, '1280x720'); + + expect(publisher.setPreferredResolution).toHaveBeenCalledWith({ width: 1280, height: 720 }); + }); + + it('uses the preset bitrate method for non-custom bitrate modes', async () => { + const publisher = createMockPublisher(); + + await applyBitrate(publisher, 'bw_saver', 500_000); + + expect(publisher.setVideoBitratePreset).toHaveBeenCalledWith('bw_saver'); + expect(publisher.setMaxVideoBitrate).not.toHaveBeenCalled(); + }); + + it('continues applying remaining settings when frame rate update fails', async () => { + const publisher = createMockPublisher(); + const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => undefined); + + publisher.setPreferredFrameRate = vi.fn().mockRejectedValue(new Error('frame rate failure')); + + await applyAdvancedSettingsToPublisher(publisher, { + frameRate: 15, + resolution: '640x480', + bitrateMode: 'default', + customVideoBitrate: 500_000, + }); + + expect(consoleErrorSpy).toHaveBeenCalledWith( + 'applyAdvancedSettingsToPublisher: setPreferredFrameRate failed', + expect.any(Error) + ); + expect(publisher.setPreferredResolution).toHaveBeenCalledWith({ width: 640, height: 480 }); + expect(publisher.setVideoBitratePreset).toHaveBeenCalledWith('default'); + }); + + it('logs the custom bitrate method name when a custom bitrate update fails', async () => { + const publisher = createMockPublisher(); + const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => undefined); + + publisher.setMaxVideoBitrate = vi.fn().mockRejectedValue(new Error('bitrate failure')); + + await applyAdvancedSettingsToPublisher(publisher, { + frameRate: 15, + resolution: '640x480', + bitrateMode: 'custom', + customVideoBitrate: 750_000, + }); + + expect(consoleErrorSpy).toHaveBeenCalledWith( + 'applyAdvancedSettingsToPublisher: setMaxVideoBitrate failed', + expect.any(Error) + ); + }); + + it('logs the preset bitrate method name when a preset bitrate update fails', async () => { + const publisher = createMockPublisher(); + const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => undefined); + + publisher.setVideoBitratePreset = vi.fn().mockRejectedValue(new Error('bitrate failure')); + + await applyAdvancedSettingsToPublisher(publisher, { + frameRate: 15, + resolution: '640x480', + bitrateMode: 'default', + customVideoBitrate: 500_000, + }); + + expect(consoleErrorSpy).toHaveBeenCalledWith( + 'applyAdvancedSettingsToPublisher: setVideoBitratePreset failed', + expect.any(Error) + ); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/useApplyAdvancedSettings/applyAdvancedSettingsToPublisher.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/useApplyAdvancedSettings/applyAdvancedSettingsToPublisher.ts new file mode 100644 index 00000000..2073621a --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/useApplyAdvancedSettings/applyAdvancedSettingsToPublisher.ts @@ -0,0 +1,101 @@ +import type { Publisher } from '@vonage/client-sdk-video'; +import { assertResult } from '@common/execution'; +import tryCatch from '@common/execution/tryCatch'; +import { makeApplicationErrorMapper } from '@core/errors'; +import { ADVANCED_SETTINGS_BITRATE_MODE } from '@components/AdvancedSettingsDialog/types/types'; +import type { + AdvancedSettingsBitrateMode, + AdvancedSettingsCustomVideoBitrate, + AdvancedSettingsFrameRate, + AdvancedSettingsResolution, +} from '@components/AdvancedSettingsDialog/types/types'; +import { t } from 'i18next'; + +export const applyFrameRate = async ( + publisher: Publisher | null, + frameRate: AdvancedSettingsFrameRate +): Promise => { + if (!publisher) return; + const hasVideoTrack = publisher?.getVideoSource()?.track; + if (!hasVideoTrack) return; + + await assertResult( + () => publisher.setPreferredFrameRate(frameRate), + makeApplicationErrorMapper(t('advancedSettings.video.error.frameRateNotSupported')) + ); +}; + +export const applyResolution = async ( + publisher: Publisher | null, + resolution: AdvancedSettingsResolution +): Promise => { + if (!publisher) return; + const hasVideoTrack = publisher?.getVideoSource()?.track; + if (!hasVideoTrack) return; + + const [width, height] = resolution.split('x').map(Number); + await assertResult( + () => publisher.setPreferredResolution({ width, height }), + makeApplicationErrorMapper(t('advancedSettings.video.error.resolutionNotSupported')) + ); +}; + +export const applyBitrate = async ( + publisher: Publisher | null, + bitrateMode: AdvancedSettingsBitrateMode, + customVideoBitrate: AdvancedSettingsCustomVideoBitrate +): Promise => { + if (!publisher) return; + const hasVideoTrack = publisher?.getVideoSource()?.track; + if (!hasVideoTrack) return; + + if (bitrateMode === ADVANCED_SETTINGS_BITRATE_MODE.custom) { + await assertResult( + () => publisher.setMaxVideoBitrate(customVideoBitrate), + makeApplicationErrorMapper(t('advancedSettings.video.error.bitrateNotSupported')) + ); + } else { + await assertResult( + () => publisher.setVideoBitratePreset(bitrateMode), + makeApplicationErrorMapper(t('advancedSettings.video.error.bitrateNotSupported')) + ); + } +}; + +const applyAdvancedSettingsToPublisher = async ( + publisher: Publisher | null, + args: { + frameRate: AdvancedSettingsFrameRate; + resolution: AdvancedSettingsResolution; + bitrateMode: AdvancedSettingsBitrateMode; + customVideoBitrate: AdvancedSettingsCustomVideoBitrate; + } +): Promise => { + const { frameRate, resolution, bitrateMode, customVideoBitrate } = args; + + const { error: frameRateError } = await tryCatch(() => applyFrameRate(publisher, frameRate)); + + if (frameRateError) + console.error('applyAdvancedSettingsToPublisher: setPreferredFrameRate failed', frameRateError); + + const { error: resolutionError } = await tryCatch(() => applyResolution(publisher, resolution)); + if (resolutionError) + console.error( + 'applyAdvancedSettingsToPublisher: setPreferredResolution failed', + resolutionError + ); + + const { error: bitrateError } = await tryCatch(() => + applyBitrate(publisher, bitrateMode, customVideoBitrate) + ); + + if (bitrateError) { + const methodName = + bitrateMode === ADVANCED_SETTINGS_BITRATE_MODE.custom + ? 'setMaxVideoBitrate' + : 'setVideoBitratePreset'; + console.error(`applyAdvancedSettingsToPublisher: ${methodName} failed`, bitrateError); + } +}; + +export default applyAdvancedSettingsToPublisher; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/useApplyAdvancedSettings/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/useApplyAdvancedSettings/index.ts new file mode 100644 index 00000000..d3ee7067 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/useApplyAdvancedSettings/index.ts @@ -0,0 +1,2 @@ +export { default } from './useApplyAdvancedSettings'; +export { applyFrameRate, applyResolution, applyBitrate } from './applyAdvancedSettingsToPublisher'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/useApplyAdvancedSettings/useApplyAdvancedSettings.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/useApplyAdvancedSettings/useApplyAdvancedSettings.spec.tsx new file mode 100644 index 00000000..7b8af2bf --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/useApplyAdvancedSettings/useApplyAdvancedSettings.spec.tsx @@ -0,0 +1,92 @@ +import { afterEach, describe, expect, it, vi, beforeEach } from 'vitest'; +import { renderHook as renderHookBase, waitFor } from '@testing-library/react'; +import type { Publisher } from '@vonage/client-sdk-video'; +import type { advancedSettings } from '@Context/AdvancedSettings'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import useApplyAdvancedSettings from './useApplyAdvancedSettings'; + +const createMockPublisher = () => + ({ + getVideoSource: vi.fn().mockReturnValue({ track: {} }), + setPreferredFrameRate: vi.fn().mockResolvedValue(undefined), + setPreferredResolution: vi.fn().mockResolvedValue(undefined), + setMaxVideoBitrate: vi.fn().mockResolvedValue(undefined), + setVideoBitratePreset: vi.fn().mockResolvedValue(undefined), + }) as unknown as Publisher; + +describe('useApplyAdvancedSettings', () => { + beforeEach(() => { + vi.restoreAllMocks(); + }); + + afterEach(() => { + advancedSettings$.reset(); + }); + + it('applies all current settings when publisher becomes available', async () => { + const publisher = createMockPublisher(); + + renderHook(() => useApplyAdvancedSettings(publisher), { + dialogState: { frameRate: 15, resolution: '640x480', bitrateMode: 'default' }, + }); + + await waitFor(() => { + expect(publisher.setPreferredFrameRate).toHaveBeenCalledWith(15); + expect(publisher.setPreferredResolution).toHaveBeenCalledWith({ width: 640, height: 480 }); + expect(publisher.setVideoBitratePreset).toHaveBeenCalledWith('default'); + }); + }); + + it('calls setMaxVideoBitrate instead of setVideoBitratePreset when bitrateMode is custom', async () => { + const publisher = createMockPublisher(); + + renderHook(() => useApplyAdvancedSettings(publisher), { + dialogState: { bitrateMode: 'custom', customVideoBitrate: 750_000 }, + }); + + await waitFor(() => { + expect(publisher.setMaxVideoBitrate).toHaveBeenCalledWith(750_000); + expect(publisher.setVideoBitratePreset).not.toHaveBeenCalled(); + }); + }); + + it('does nothing when publisher is null', () => { + const publisher = createMockPublisher(); + + renderHook(() => useApplyAdvancedSettings(null), { + dialogState: { frameRate: 15 }, + }); + + expect(publisher.setPreferredFrameRate).not.toHaveBeenCalled(); + }); + + it('applies settings when publisher changes from null to an instance', async () => { + const publisher = createMockPublisher(); + let currentPublisher: Publisher | null = null; + + const { rerender } = renderHook(() => useApplyAdvancedSettings(currentPublisher), { + dialogState: { frameRate: 7 }, + }); + + expect(publisher.setPreferredFrameRate).not.toHaveBeenCalled(); + + currentPublisher = publisher; + rerender(); + + await waitFor(() => { + expect(publisher.setPreferredFrameRate).toHaveBeenCalledWith(7); + }); + }); +}); + +type RenderOptions = { + dialogState?: Partial; +}; + +function renderHook(render: () => Result, { dialogState }: RenderOptions = {}) { + if (dialogState) { + advancedSettings$.setState((state) => ({ ...state, ...dialogState })); + } + + return renderHookBase(render); +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/useApplyAdvancedSettings/useApplyAdvancedSettings.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/useApplyAdvancedSettings/useApplyAdvancedSettings.tsx new file mode 100644 index 00000000..2cfae575 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/useApplyAdvancedSettings/useApplyAdvancedSettings.tsx @@ -0,0 +1,21 @@ +import { useEffect } from 'react'; +import type { Publisher } from '@vonage/client-sdk-video'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import applyAdvancedSettingsToPublisher from './applyAdvancedSettingsToPublisher'; + +const useApplyAdvancedSettings = (publisher: Publisher | null): void => { + useEffect(() => { + if (!publisher) return; + + const { frameRate, resolution, bitrateMode, customVideoBitrate } = advancedSettings$.getState(); + + void applyAdvancedSettingsToPublisher(publisher, { + frameRate, + resolution, + bitrateMode, + customVideoBitrate, + }); + }, [publisher]); +}; + +export default useApplyAdvancedSettings; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisher/hooks/useSyncPublisherDevices/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisher/hooks/useSyncPublisherDevices/index.ts new file mode 100644 index 00000000..e2c0dbb1 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisher/hooks/useSyncPublisherDevices/index.ts @@ -0,0 +1 @@ +export { default } from './useSyncPublisherDevices'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisher/hooks/useSyncPublisherDevices/useSyncPublisherDevices.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisher/hooks/useSyncPublisherDevices/useSyncPublisherDevices.ts new file mode 100644 index 00000000..86e781c1 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisher/hooks/useSyncPublisherDevices/useSyncPublisherDevices.ts @@ -0,0 +1,76 @@ +import type { Publisher } from '@vonage/client-sdk-video'; +import mediaDevices$ from '@core/stores/devices/devices$'; +import { useMountEffect } from '@web/hooks'; +import attempt from '@common/execution/attempt'; +import type { UnsubscribeCallback } from 'react-global-state-hooks'; + +/** + * Syncs publisher video/audio sources with the selected devices from the store. + * Handles device changes (user selection) and disconnections (hardware unplugged). + * + * This is temporal until we refactor the publishers and we implement a more robust solution syncing with the publisher. + */ +const useSyncPublisherDevices = ( + publisherRef: React.RefObject, + args: { + setIsAudioEnabled?: (enabled: boolean) => void; + setIsVideoEnabled?: (enabled: boolean) => void; + } +): void => { + // Sync video source + useMountEffect(() => { + const subscribers = [ + args.setIsVideoEnabled + ? mediaDevices$.subscribe( + ({ videoinput }) => videoinput, + async (input) => { + const didChanged = publisherRef.current?.getVideoSource()?.deviceId !== input; + if (didChanged) void attempt(() => publisherRef.current?.setVideoSource(input!)); + + const { isStoreReady } = mediaDevices$.getMetadata(); + if (isStoreReady.status === 'pending') { + await isStoreReady; + } + + if (hasDevices('videoinput')) return; + args.setIsVideoEnabled?.(false); + }, + { + skipFirst: true, + } + ) + : undefined, + + args?.setIsAudioEnabled + ? mediaDevices$.subscribe( + ({ audioinput }) => audioinput, + async (input) => { + const didChanged = publisherRef.current?.getAudioSource()?.id !== input; + if (didChanged) void attempt(() => publisherRef.current?.setAudioSource(input!)); + + const { isStoreReady } = mediaDevices$.getMetadata(); + if (isStoreReady.status === 'pending') { + await isStoreReady; + } + + if (hasDevices('audioinput')) return; + args.setIsAudioEnabled?.(false); + }, + { + skipFirst: true, + } + ) + : undefined, + ].filter(Boolean) as UnsubscribeCallback[]; + + return () => { + subscribers.forEach((unsubscribe) => unsubscribe()); + }; + }); +}; + +function hasDevices(kind: MediaDeviceKind): boolean { + return Object.keys(mediaDevices$.mediaDevicesMap$.getState()[kind]).length > 0; +} + +export default useSyncPublisherDevices; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisher/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisher/index.tsx new file mode 100644 index 00000000..f8b43ba5 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisher/index.tsx @@ -0,0 +1,3 @@ +import usePublisher from './usePublisher'; + +export default usePublisher; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisher/usePublisher.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisher/usePublisher.spec.tsx new file mode 100644 index 00000000..7a6752b7 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisher/usePublisher.spec.tsx @@ -0,0 +1,633 @@ +import { beforeEach, describe, it, expect, vi } from 'vitest'; +import { act, renderHook as renderHookBase, waitFor } from '@testing-library/react'; +import { + initPublisher, + Publisher, + Stream, + hasMediaProcessorSupport, +} from '@vonage/client-sdk-video'; +import EventEmitter from 'events'; +import usePublisher from './usePublisher'; +import { makeTestProvider, ProviderOptions, providers } from '@test/providers'; +import SuspenseBoundary from '@web/components/SuspenseBoundary'; +import composeProviders from '@web/helpers/composeProviders'; +import { StrictMode } from 'react'; +import { setupWindowNavigatorMock, makeMediaDeviceInfos } from '@web-test/fixtures'; +import mediaDevices$ from '@core/stores/devices'; + +vi.mock('@vonage/client-sdk-video'); + +const mockStream = { + streamId: 'stream-id', + name: 'Jane Doe', +} as unknown as Stream; + +const someDevices = makeMediaDeviceInfos(); + +// Mock functions for session context +const mockedSessionPublish = vi.fn(); +const mockedSessionUnpublish = vi.fn(); + +describe('usePublisher', () => { + const destroySpy = vi.fn(); + const publishAudioSpy = vi.fn(); + const publishVideoSpy = vi.fn(); + let mockPublisher: Publisher; + + const mockedInitPublisher = vi.fn(); + + beforeEach(() => { + vi.clearAllMocks(); + vi.spyOn(console, 'error').mockImplementation(vi.fn()); + setupWindowNavigatorMock({ + mediaDevices: { + enumerateDevices: Promise.resolve(someDevices), + }, + }); + + // Create fresh publisher for each test + mockPublisher = Object.assign(new EventEmitter(), { + destroy: destroySpy, + applyVideoFilter: vi.fn(), + clearVideoFilter: vi.fn(), + publishAudio: publishAudioSpy, + publishVideo: publishVideoSpy, + setPreferredFrameRate: vi.fn().mockResolvedValue(undefined), + setPreferredResolution: vi.fn().mockResolvedValue(undefined), + setMaxVideoBitrate: vi.fn().mockResolvedValue(undefined), + setVideoBitratePreset: vi.fn().mockResolvedValue(undefined), + }) as unknown as Publisher; + + vi.mocked(initPublisher).mockImplementation(mockedInitPublisher); + vi.mocked(hasMediaProcessorSupport).mockImplementation(vi.fn().mockReturnValue(true)); + + // Initialize mediaDevices$ store with devices + mediaDevices$.setState((state) => ({ + ...state, + mediaDeviceInfo: someDevices, + })); + }); + + describe('initializeLocalPublisher', () => { + it('should initialize publisher and update state when access is allowed', async () => { + mockedInitPublisher.mockReturnValue(mockPublisher); + const { result } = renderHook(() => usePublisher()); + + expect(result.current.publisher).toBeNull(); + + act(() => { + result.current.initializeLocalPublisher({}); + // @ts-expect-error We simulate allowing camera and microphone permissions in a browser. + mockPublisher.emit('accessAllowed'); + }); + + // Publisher should be set after accessAllowed event + await waitFor(() => { + expect(result.current.publisher).toBe(mockPublisher); + expect(result.current.publishingError).toBeNull(); + }); + }); + + it('should prevent double initialization', async () => { + mockedInitPublisher.mockReturnValue(mockPublisher); + const { result } = renderHook(() => usePublisher()); + + act(() => { + result.current.initializeLocalPublisher({}); + // @ts-expect-error We simulate allowing camera and microphone permissions in a browser. + mockPublisher.emit('accessAllowed'); + }); + + await waitFor(() => { + expect(result.current.publisher).toBe(mockPublisher); + }); + + // Try to initialize again + act(() => { + result.current.initializeLocalPublisher({}); + }); + + // Should only call initPublisher once + expect(mockedInitPublisher).toHaveBeenCalledOnce(); + }); + + it('should handle initialization errors gracefully', async () => { + vi.mocked(initPublisher).mockImplementation(() => { + throw new Error('Failed to access media devices'); + }); + + const { result } = renderHook(() => usePublisher()); + + act(() => { + result.current.initializeLocalPublisher({}); + }); + + await waitFor(() => { + expect(result.current.publisher).toBeNull(); + }); + }); + }); + + describe('toggleAudio', () => { + it('should toggle audio on and off', async () => { + mockedInitPublisher.mockReturnValue(mockPublisher); + const { result } = renderHook(() => usePublisher(), { + userContext: { + value: { + defaultSettings: { + publishAudio: true, + publishVideo: false, + name: '', + noiseSuppression: true, + publishCaptions: false, + }, + }, + }, + }); + + act(() => { + result.current.initializeLocalPublisher({}); + // @ts-expect-error We simulate allowing camera and microphone permissions in a browser. + mockPublisher.emit('accessAllowed'); + }); + + await waitFor(() => { + expect(result.current.isAudioEnabled).toBe(true); + }); + + // Toggle audio off + act(() => { + result.current.toggleAudio(); + }); + + expect(publishAudioSpy).toHaveBeenCalledWith(false); + expect(result.current.isAudioEnabled).toBe(false); + + // Toggle audio back on + act(() => { + result.current.toggleAudio(); + }); + + expect(publishAudioSpy).toHaveBeenCalledWith(true); + expect(result.current.isAudioEnabled).toBe(true); + }); + + it('should clear force mute flag when toggling audio', async () => { + mockedInitPublisher.mockReturnValue(mockPublisher); + const { result } = renderHook(() => usePublisher()); + + act(() => { + result.current.initializeLocalPublisher({}); + // @ts-expect-error We simulate allowing camera and microphone permissions in a browser. + mockPublisher.emit('accessAllowed'); + }); + + await waitFor(() => { + expect(result.current.publisher).toBe(mockPublisher); + }); + + // Simulate force mute + act(() => { + // @ts-expect-error We simulate a force mute event. + mockPublisher.emit('muteForced'); + }); + + await waitFor(() => { + expect(result.current.isForceMuted).toBe(true); + expect(result.current.isAudioEnabled).toBe(false); + }); + + // User toggles audio manually + act(() => { + result.current.toggleAudio(); + }); + + expect(result.current.isForceMuted).toBe(false); + }); + + it('should not crash if publisher is not initialized', () => { + const { result } = renderHook(() => usePublisher()); + + expect(result.current.publisher).toBeNull(); + + // Should not throw + act(() => { + result.current.toggleAudio(); + }); + + expect(publishAudioSpy).not.toHaveBeenCalled(); + }); + }); + + describe('toggleVideo', () => { + it('should toggle video on and off', async () => { + mockedInitPublisher.mockReturnValue(mockPublisher); + const { result } = renderHook(() => usePublisher(), { + userContext: { + value: { + defaultSettings: { + publishAudio: false, + publishVideo: true, + name: '', + noiseSuppression: true, + publishCaptions: false, + }, + }, + }, + }); + + act(() => { + result.current.initializeLocalPublisher({}); + // @ts-expect-error We simulate allowing camera and microphone permissions in a browser. + mockPublisher.emit('accessAllowed'); + }); + + await waitFor(() => { + expect(result.current.isVideoEnabled).toBe(true); + }); + + // Toggle video off + act(() => { + result.current.toggleVideo(); + }); + + expect(publishVideoSpy).toHaveBeenCalledWith(false); + expect(result.current.isVideoEnabled).toBe(false); + + // Toggle video back on + act(() => { + result.current.toggleVideo(); + }); + + expect(publishVideoSpy).toHaveBeenCalledWith(true); + expect(result.current.isVideoEnabled).toBe(true); + }); + + it('should not crash if publisher is not initialized', () => { + const { result } = renderHook(() => usePublisher()); + + expect(result.current.publisher).toBeNull(); + + // Should not throw + act(() => { + result.current.toggleVideo(); + }); + + expect(publishVideoSpy).not.toHaveBeenCalled(); + }); + }); + + describe('unpublish', () => { + it('should unpublish and clear publisher reference', async () => { + mockedInitPublisher.mockReturnValue(mockPublisher); + + const { result } = renderHook(() => usePublisher()); + + act(() => { + result.current.initializeLocalPublisher({}); + // @ts-expect-error We simulate allowing camera and microphone permissions in a browser. + mockPublisher.emit('accessAllowed'); + }); + + await waitFor(() => { + expect(result.current.publisher).toBe(mockPublisher); + }); + + await act(async () => { + await result.current.publish(); + }); + + act(() => { + result.current.unpublish(); + }); + + expect(mockedSessionUnpublish).toHaveBeenCalledWith(mockPublisher); + }); + }); + + describe('publish', () => { + it('should set isPublishing state when stream is created', async () => { + mockedInitPublisher.mockReturnValue(mockPublisher); + const { result } = renderHook(() => usePublisher()); + + act(() => { + result.current.initializeLocalPublisher({}); + }); + + expect(result.current.isPublishing).toBe(false); + + await act(async () => { + await result.current.publish(); + // @ts-expect-error We simulate the publisher stream being created. + mockPublisher.emit('streamCreated', { stream: mockStream }); + }); + + await waitFor(() => { + expect(result.current.isPublishing).toBe(true); + expect(result.current.stream).toBe(mockStream); + }); + }); + + it('should only publish to session once (idempotency)', async () => { + mockedInitPublisher.mockReturnValue(mockPublisher); + + const { result } = renderHook(() => usePublisher()); + + act(() => { + result.current.initializeLocalPublisher({}); + // @ts-expect-error We simulate the publisher stream being created. + mockPublisher.emit('streamCreated', { stream: mockStream }); + }); + expect(initPublisher).toHaveBeenCalledOnce(); + + expect(result.current.isPublishing).toEqual(true); + act(() => { + // Normally this is async, but it was being called twice in a useEffect hook. + // To accurately test this, let's call it without await. + void result.current.publish(); + }); + await act(async () => { + await result.current.publish(); + }); + + expect(mockedSessionPublish).toHaveBeenCalledOnce(); + }); + + it('should retry publishing 3 times before setting error state', async () => { + mockedInitPublisher.mockReturnValue(mockPublisher); + mockedSessionPublish.mockImplementation((_, callback) => { + callback(new Error('Mocked error')); + }); + const { result } = renderHook(() => usePublisher()); + + act(() => { + result.current.initializeLocalPublisher({}); + }); + + expect(result.current.publishingError).toBeNull(); + + await act(async () => { + await result.current.publish(); + }); + + const publishingBlockedError = { + header: 'Difficulties joining room', + caption: + "We're having trouble connecting you with others in the meeting room. Please check your network and try again.", + }; + expect(result.current.publishingError).toEqual(publishingBlockedError); + expect(mockedSessionPublish).toHaveBeenCalledTimes(3); + }); + + it('should not publish if publisher is not initialized', async () => { + const { result } = renderHook(() => usePublisher()); + + expect(result.current.publisher).toBeNull(); + + await act(async () => { + await result.current.publish(); + }); + + expect(mockedSessionPublish).not.toHaveBeenCalled(); + }); + }); + + describe('device access events', () => { + it('should set publishingError and destroy publisher when camera access is denied', async () => { + mockedInitPublisher.mockReturnValue(mockPublisher); + const { result } = renderHook(() => usePublisher()); + + act(() => { + result.current.initializeLocalPublisher({}); + }); + + expect(result.current.publishingError).toBeNull(); + + act(() => { + // @ts-expect-error We simulate user denying camera permissions in a browser. + mockPublisher.emit('accessDenied', { + message: 'Camera permission denied during the call', + }); + }); + + await waitFor(() => { + expect(result.current.publishingError).toEqual({ + header: 'Camera access is denied', + caption: + "It seems your browser is blocked from accessing your camera. Reset the permission state through your browser's UI.", + }); + expect(destroySpy).toHaveBeenCalled(); + expect(result.current.publisher).toBeNull(); + }); + }); + + it('should set publishingError when microphone access is denied', async () => { + mockedInitPublisher.mockReturnValue(mockPublisher); + const { result } = renderHook(() => usePublisher()); + + act(() => { + result.current.initializeLocalPublisher({}); + }); + + expect(result.current.publishingError).toBeNull(); + + act(() => { + // @ts-expect-error We simulate user denying microphone permissions in a browser. + mockPublisher.emit('accessDenied', { + message: 'Microphone permission denied during the call', + }); + }); + + await waitFor(() => { + // NOTE: Due to a bug in the implementation, when microphone is denied, + // the error message says "Camera access is denied" (the ternary is backwards) + expect(result.current.publishingError).toEqual({ + header: 'Camera access is denied', + caption: + "It seems your browser is blocked from accessing your camera. Reset the permission state through your browser's UI.", + }); + expect(destroySpy).toHaveBeenCalled(); + expect(result.current.publisher).toBeNull(); + }); + }); + + it('should not set publishingError when receiving an accessAllowed event', async () => { + mockedInitPublisher.mockReturnValue(mockPublisher); + const { result } = renderHook(() => usePublisher()); + + act(() => { + result.current.initializeLocalPublisher({}); + + // @ts-expect-error We simulate allowing camera and microphone permissions in a browser. + mockPublisher.emit('accessAllowed'); + }); + + await waitFor(() => { + expect(result.current.publishingError).toBeNull(); + expect(result.current.publisher).toBe(mockPublisher); + }); + }); + }); + + describe('force mute handling', () => { + it('should mute audio and set force mute flag when muteForced event is received', async () => { + mockedInitPublisher.mockReturnValue(mockPublisher); + const { result } = renderHook(() => usePublisher(), { + userContext: { + value: { + defaultSettings: { + publishAudio: true, + publishVideo: false, + name: '', + noiseSuppression: true, + publishCaptions: false, + }, + }, + }, + }); + + act(() => { + result.current.initializeLocalPublisher({}); + // @ts-expect-error We simulate allowing camera and microphone permissions in a browser. + mockPublisher.emit('accessAllowed'); + }); + + await waitFor(() => { + expect(result.current.isAudioEnabled).toBe(true); + expect(result.current.isForceMuted).toBe(false); + }); + + act(() => { + // @ts-expect-error We simulate a force mute event. + mockPublisher.emit('muteForced'); + }); + + await waitFor(() => { + expect(result.current.isForceMuted).toBe(true); + expect(result.current.isAudioEnabled).toBe(false); + expect(publishAudioSpy).toHaveBeenCalledWith(false); + }); + }); + }); + + describe('publisher lifecycle', () => { + it('should update stream state when streamCreated event is fired', async () => { + mockedInitPublisher.mockReturnValue(mockPublisher); + const { result } = renderHook(() => usePublisher()); + + act(() => { + result.current.initializeLocalPublisher({}); + }); + + expect(result.current.stream).toBeNull(); + expect(result.current.isPublishing).toBe(false); + + act(() => { + // @ts-expect-error We simulate the publisher stream being created. + mockPublisher.emit('streamCreated', { stream: mockStream }); + }); + + await waitFor(() => { + expect(result.current.stream).toBe(mockStream); + expect(result.current.isPublishing).toBe(true); + }); + }); + + it('should clear stream state when streamDestroyed event is fired', async () => { + mockedInitPublisher.mockReturnValue(mockPublisher); + const { result } = renderHook(() => usePublisher()); + + act(() => { + result.current.initializeLocalPublisher({}); + // @ts-expect-error We simulate the publisher stream being created. + mockPublisher.emit('streamCreated', { stream: mockStream }); + }); + + await waitFor(() => { + expect(result.current.stream).toBe(mockStream); + expect(result.current.isPublishing).toBe(true); + }); + + act(() => { + // @ts-expect-error We simulate the stream being destroyed. + mockPublisher.emit('streamDestroyed'); + }); + + await waitFor(() => { + expect(result.current.stream).toBeNull(); + expect(result.current.isPublishing).toBe(false); + }); + }); + + it('should set video element when videoElementCreated event is fired', async () => { + mockedInitPublisher.mockReturnValue(mockPublisher); + const { result } = renderHook(() => usePublisher()); + + act(() => { + result.current.initializeLocalPublisher({}); + }); + + expect(result.current.publisherVideoElement).toBeNull(); + + const mockVideoElement = document.createElement('video'); + + act(() => { + // @ts-expect-error We simulate video element creation. + mockPublisher.emit('videoElementCreated', { element: mockVideoElement }); + }); + + await waitFor(() => { + expect(result.current.publisherVideoElement).toBe(mockVideoElement); + }); + }); + }); +}); + +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; + sessionContext?: ProviderOptions['SessionContext']; +}; + +function renderHook( + render: (initialProps: Props) => Result, + { userContext, sessionContext }: RenderOptions = {} +) { + const { wrapper: MainWrapper, ...context } = makeTestProvider( + [providers.user, providers.session, providers.runtime], + { + userContext: { + ...userContext, + value: { + defaultSettings: { + publishAudio: false, + publishVideo: false, + name: '', + noiseSuppression: true, + publishCaptions: false, + ...userContext?.value?.defaultSettings, + }, + }, + }, + sessionContext: { + ...sessionContext, + __interceptor: (ctx) => { + if (ctx) { + ctx.publish = mockedSessionPublish; + ctx.unpublish = mockedSessionUnpublish; + ctx.connected = true; + } + sessionContext?.__interceptor?.(ctx); + }, + }, + runtimeContext: undefined, + } + ); + + const wrapper = composeProviders(StrictMode, SuspenseBoundary, MainWrapper); + const result = renderHookBase(render, { wrapper }); + + return { + ...context, + ...result, + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisher/usePublisher.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisher/usePublisher.tsx new file mode 100644 index 00000000..bbc5f4f4 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisher/usePublisher.tsx @@ -0,0 +1,506 @@ +import { useState, useRef, useEffect, useCallback } from 'react'; +import OT, { + Publisher, + Event, + Stream, + initPublisher, + ExceptionEvent, + PublisherProperties, +} from '@vonage/client-sdk-video'; +import { useTranslation } from 'react-i18next'; +import { getStorageItem, setStorageItem, STORAGE_KEYS } from '@utils/storage'; +import usePublisherQuality, { NetworkQuality } from '../usePublisherQuality/usePublisherQuality'; +import useSyncPublisherDevices from './hooks/useSyncPublisherDevices/useSyncPublisherDevices'; +import usePublisherOptions from '../usePublisherOptions'; +import useApplyAdvancedSettings from '../useApplyAdvancedSettings'; +import useSessionContext from '../../../hooks/useSessionContext'; +import applyBackgroundFilter from '../../../utils/backgroundFilter/applyBackgroundFilter/applyBackgroundFilter'; +import idempotentCallbackWithRetry from '@common/execution/idempotentCallbackWithRetry'; +import frontendLogger from '../../../logger'; + +type PublisherStreamCreatedEvent = Event<'streamCreated', Publisher> & { + stream: Stream; +}; + +type PublisherVideoElementCreatedEvent = Event<'videoElementCreated', Publisher> & { + element: HTMLVideoElement | HTMLObjectElement; +}; + +type DeviceAccessStatus = { + microphone: boolean | undefined; + camera: boolean | undefined; +}; + +export type PublishingErrorType = { + header: string; + caption: string; +} | null; + +export type AccessDeniedEvent = Event<'accessDenied', Publisher> & { + message?: string; +}; + +export type PublisherContextType = { + initializeLocalPublisher: (options: PublisherProperties) => void; + isAudioEnabled: boolean; + isForceMuted: boolean; + isPublishing: boolean; + publishingError: PublishingErrorType; + isVideoEnabled: boolean; + publish: () => Promise; + publisher: Publisher | null; + publisherVideoElement: HTMLVideoElement | HTMLObjectElement | null; + quality: NetworkQuality; + stream: Stream | null | undefined; + toggleAudio: () => void; + toggleVideo: () => void; + changeBackground: (backgroundSelected: string) => void; + unpublish: () => void; + publisherOptions: PublisherProperties; +}; + +export type PublisherContextInitialValue = Partial< + Pick< + PublisherContextType, + | 'initializeLocalPublisher' + | 'isAudioEnabled' + | 'isForceMuted' + | 'isPublishing' + | 'publishingError' + | 'isVideoEnabled' + | 'publisher' + | 'publisherVideoElement' + | 'quality' + | 'stream' + > +>; + +/** + * Hook wrapper for creation, interaction with, and state for local video publisher. + * Access from app via PublisherProvider, not directly. + * @property {() => void} initializeLocalPublisher - Method to initialize publisher + * @property {boolean} isAudioEnabled - React state boolean showing if audio is enabled + * @property {boolean} isPublishing - React state boolean showing if we are publishing + * @property {boolean} publishingError - React state showing any errors thrown while attempting to publish. + * @property {boolean} isVideoEnabled - React state boolean showing if camera is on + * @property {boolean} isForceMuted - React state boolean showing if the end user was force muted + * @property {() => Promise} publish - Method to publish to session + * @property {Publisher | null} publisher - Publisher object + * @property {HTMLVideoElement | HTMLObjectElement} publisherVideoElement - video element for publisher + * @property {NetworkQuality} quality - React state for current network quality + * @property {Stream | null | undefined} stream - OT Stream object for publisher + * @property {() => void} toggleAudio - Method to toggle microphone on/off. State updated internally, can be read via isAudioEnabled. + * @property {() => void} toggleVideo - Method to toggle camera on/off. State updated internally, can be read via isVideoEnabled. + * @property {(backgroundSelected: string) => void} changeBackground - Method to change background replacement or blur effect. + * @property {() => void} unpublish - Method to unpublish from session and destroy publisher (for ending a call). + * @returns {PublisherContextType} the publisher context + */ +const usePublisher = (initialValue: PublisherContextInitialValue = {}): PublisherContextType => { + const { t } = useTranslation(); + const [publisherVideoElement, setPublisherVideoElement] = useState< + HTMLVideoElement | HTMLObjectElement | null + >(initialValue?.publisherVideoElement ?? null); + + const publisherRef = useRef(initialValue.publisher ?? null); + const quality = usePublisherQuality(publisherRef.current); + + const [isPublishing, setIsPublishing] = useState(initialValue?.isPublishing ?? false); + + const [isForceMuted, setIsForceMuted] = useState(initialValue?.isForceMuted ?? false); + + const [isVideoEnabled, setIsVideoEnabled] = useState( + initialValue?.isVideoEnabled ?? getStorageItem(STORAGE_KEYS.VIDEO_SOURCE_ENABLED) !== 'false' + ); + + const [isAudioEnabled, setIsAudioEnabled] = useState( + initialValue?.isAudioEnabled ?? getStorageItem(STORAGE_KEYS.AUDIO_SOURCE_ENABLED) !== 'false' + ); + + const publisherOptions = usePublisherOptions({ isAudioEnabled, isVideoEnabled }); + + const [stream, setStream] = useState(initialValue?.stream ?? null); + + const [publishingError, setPublishingError] = useState( + initialValue?.publishingError ?? null + ); + + const isPublishingToSessionRef = useRef(false); + const isInitializingPublisherRef = useRef(false); + const reconnectingRef = useRef(false); + const consecutivePublishingFailureCountRef = useRef(0); + + const { + publish: sessionPublish, + unpublish: sessionUnpublish, + connected, + reconnecting, + } = useSessionContext(); + const [deviceAccess, setDeviceAccess] = useState({ + microphone: undefined, + camera: undefined, + }); + + // Sync publisher with selected devices from store (handles device changes and disconnections) + useSyncPublisherDevices(publisherRef, { setIsAudioEnabled, setIsVideoEnabled }); + useApplyAdvancedSettings(isPublishing ? publisherRef.current : null); + + // If we do not have audio input or video input access, we cannot publish. + useEffect(() => { + if (deviceAccess?.microphone === false || deviceAccess?.camera === false) { + const device = deviceAccess.camera ? 'Microphone' : 'Camera'; + const accessDeniedError = { + header: t('publishingErrors.accessDenied.title', { device }), + caption: t('publishingErrors.accessDenied.message', { device: device.toLowerCase() }), + }; + setPublishingError(accessDeniedError); + } + }, [deviceAccess, t]); + + reconnectingRef.current = reconnecting === true; + + const handleAccessAllowed = useCallback(() => { + isInitializingPublisherRef.current = false; + setDeviceAccess({ + microphone: true, + camera: true, + }); + }, []); + + const handleDestroyed = useCallback(() => { + frontendLogger.log('usePublisher: handle destroyed'); + + publisherRef.current = null; + }, []); + + /** + * Change background replacement or blur effect + * @param {string} backgroundSelected - The selected background option + * @returns {void} + */ + const changeBackground = useCallback((backgroundSelected: string) => { + applyBackgroundFilter({ + publisher: publisherRef.current, + backgroundSelected, + setUser: undefined, + setBackgroundFilter: undefined, + storeItem: true, + }).catch(() => { + console.error('Failed to apply background filter.'); + }); + }, []); + + const handleStreamCreated = useCallback((e: PublisherStreamCreatedEvent) => { + frontendLogger.log('usePublisher: handle stream created', { + streamId: e.stream?.streamId, + streamHasAudio: e.stream?.hasAudio, + streamHasVideo: e.stream?.hasVideo, + }); + setIsPublishing(true); + setStream(e.stream); + // Reset the flag now that the stream is actually established + isPublishingToSessionRef.current = false; + + // Successful publish resets transient failure tracking + consecutivePublishingFailureCountRef.current = 0; + setPublishingError(null); + }, []); + + const handleStreamDestroyed = useCallback(() => { + frontendLogger.log('usePublisher: handle stream destroyed', { + reconnecting: reconnectingRef.current, + hasPublisher: !!publisherRef.current, + hasStream: !!publisherRef.current?.stream, + }); + setStream(null); + setIsPublishing(false); + + const shouldPreservePublisher = + reconnectingRef.current || + isPublishingToSessionRef.current || + isInitializingPublisherRef.current; + + if (shouldPreservePublisher) { + frontendLogger.log('usePublisher: handle stream destroyed - preserving publisher', { + reconnecting: reconnectingRef.current, + isPublishingToSession: isPublishingToSessionRef.current, + isInitializingPublisher: isInitializingPublisherRef.current, + }); + isPublishingToSessionRef.current = false; + return; + } + + if (publisherRef?.current) { + publisherRef.current.destroy(); + publisherRef.current = null; + } + }, []); + + const handleAccessDenied = useCallback((event: AccessDeniedEvent) => { + const deviceDeniedAccess = event.message?.startsWith('Microphone') ? 'microphone' : 'camera'; + isInitializingPublisherRef.current = false; + // We check the first word of the message to see if the microphone or camera was denied access. + setDeviceAccess((prev) => ({ + ...prev, + [deviceDeniedAccess]: false, + })); + + if (publisherRef.current) { + publisherRef.current.destroy(); + } + publisherRef.current = null; + }, []); + + /** + * Method to unpublish from session and destroy publisher + */ + const unpublish = () => { + if (publisherRef?.current) { + sessionUnpublish(publisherRef.current); + isPublishingToSessionRef.current = false; + } + }; + + const handleVideoElementCreated = useCallback((event: PublisherVideoElementCreatedEvent) => { + setPublisherVideoElement(event.element); + }, []); + + /** + * Method to handle the mute force of a participant + */ + const handleMuteForced = useCallback(() => { + if (!publisherRef?.current) { + return; + } + + setIsForceMuted(true); + setIsAudioEnabled(false); + + // Force mute must survive reconnection/publisher re-creation; persist mic-off. + setStorageItem(STORAGE_KEYS.AUDIO_SOURCE_ENABLED, 'false'); + + // Extra safety: enforce mute on the SDK publisher immediately. + publisherRef.current.publishAudio(false); + }, []); + + const addPublisherListeners = useCallback( + (publisher: Publisher) => { + publisher.on('destroyed', handleDestroyed); + publisher.on('streamCreated', handleStreamCreated); + publisher.on('streamDestroyed', handleStreamDestroyed); + publisher.on('accessDenied', handleAccessDenied); + publisher.on('videoElementCreated', handleVideoElementCreated); + publisher.on('muteForced', handleMuteForced); + publisher.on('accessAllowed', handleAccessAllowed); + }, + [ + handleAccessAllowed, + handleAccessDenied, + handleDestroyed, + handleMuteForced, + handleStreamCreated, + handleStreamDestroyed, + handleVideoElementCreated, + ] + ); + + /** + * Method to create local camera publisher. + * @param {PublisherProperties} options - the publisher options to initialize the local publisher with + */ + const initializeLocalPublisher = useCallback( + (options: PublisherProperties) => { + try { + // Don't re-initialize if we're currently publishing + if (isPublishingToSessionRef.current) { + return; + } + // Don't re-initialize if we're already initializing + if (isInitializingPublisherRef.current) { + return; + } + // Don't re-initialize if we already have a publisher + if (publisherRef.current) { + return; + } + isInitializingPublisherRef.current = true; + + const publisher = initPublisher(undefined, options); + // Add listeners synchronously as some events could be fired before callback is invoked + addPublisherListeners(publisher); + publisherRef.current = publisher; + + frontendLogger.log('usePublisher: initialize local publisher'); + + // NOTE: isInitializingPublisherRef.current will be reset in handleAccessAllowed or handleAccessDenied + // NOT here, because getUserMedia is async and we need to keep the lock until media access is granted/denied + } catch (error) { + frontendLogger.reportError(error, { source: 'usePublisher: initialize local publisher' }); + isInitializingPublisherRef.current = false; + if (error instanceof Error) { + console.error(error.stack); + } + } + }, + [addPublisherListeners] + ); + + /** + * Helper function to handle retrying. We allow two attempts when publishing to the session and encountering an + * error before stopping. + */ + const handlePublishingError = useCallback((): void => { + const publishingBlocked: PublishingErrorType = { + header: t('publishingErrors.blocked.title'), + caption: t('publishingErrors.blocked.message'), + }; + setPublishingError(publishingBlocked); + }, [t]); + + /** + * Method to publish to session. + * @returns {Promise} + */ + const publish = useCallback(async (): Promise => { + try { + if (isPublishingToSessionRef.current) { + return; // Avoid multiple simultaneous publish attempts + } + if (reconnecting) { + return; + } + if (!connected) { + throw new Error('You are not connected to session'); + } + if (!publisherRef.current) { + throw new Error('Publisher is not initialized'); + } + if (publisherRef.current?.stream) { + return; + } + + isPublishingToSessionRef.current = true; + + await idempotentCallbackWithRetry(() => sessionPublish(publisherRef.current!), { + retries: 2, + delayMs: 500, + }); + frontendLogger.log('usePublisher: publish success'); + // Don't reset isPublishingToSessionRef here - wait for streamCreated event + } catch (err: unknown) { + frontendLogger.reportError(err, { source: 'usePublisher: publish' }); + // Reset the flag on error since we won't get streamCreated + isPublishingToSessionRef.current = false; + + // Don't surface errors during reconnection - they're transient + if (!reconnectingRef.current) { + handlePublishingError(); + } + + console.error(err); + } + }, [connected, reconnecting, sessionPublish, handlePublishingError]); + + /** + * Turns the camera on and off + * A wrapper for Publisher.publishVideo() + * More details here: https://vonage.github.io/conversation-docs/video-js-reference/latest/Publisher.html#publishVideo + * @returns {void} + */ + const toggleVideo = () => { + if (!publisherRef.current) { + return; + } + publisherRef.current.publishVideo(!isVideoEnabled); + setIsVideoEnabled(!isVideoEnabled); + setStorageItem(STORAGE_KEYS.VIDEO_SOURCE_ENABLED, (!isVideoEnabled).toString()); + }; + + /** + * Turns the microphone on and off + * A wrapper for Publisher.publishAudio() + * More details here: https://vonage.github.io/conversation-docs/video-js-reference/latest/Publisher.html#publishAudio + * @returns {void} + */ + const toggleAudio = () => { + if (!publisherRef.current) { + return; + } + + const nextAudioEnabled = !isAudioEnabled; + + publisherRef.current.publishAudio(nextAudioEnabled); + setIsAudioEnabled(nextAudioEnabled); + setStorageItem(STORAGE_KEYS.AUDIO_SOURCE_ENABLED, nextAudioEnabled.toString()); + setIsForceMuted(false); + }; + + useEffect(() => { + const exceptionHandler = (exceptionEvent: ExceptionEvent) => { + if (exceptionEvent.code === 1500) { + frontendLogger.log('usePublisher: exception 1500', { code: exceptionEvent.code }); + consecutivePublishingFailureCountRef.current += 1; + + const isBrowserOnline = (() => { + if (typeof navigator === 'undefined') return true; + return navigator.onLine; + })(); + + // During network changes, code 1500 is often transient. + // Try to recover by recreating the publisher; only surface a blocking error after repeated failures. + const shouldTreatAsTransient = reconnectingRef.current || !connected || !isBrowserOnline; + + const publisherToCleanup = publisherRef.current; + publisherRef.current = null; + + try { + publisherToCleanup?.destroy(); + } catch { + console.error('[PUBLISHER] exception 1500 - Warning: Failed to destroy publisher'); + } + + isPublishingToSessionRef.current = false; + isInitializingPublisherRef.current = false; + setIsPublishing(false); + setStream(null); + + const shouldSurfaceBlockingError = + shouldTreatAsTransient === false && consecutivePublishingFailureCountRef.current >= 3; + + if (shouldSurfaceBlockingError) { + handlePublishingError(); + return; + } + + // Let the normal flow recreate/publish when possible + // (autoPublish effect + reconnection completion effect) + } + }; + // If a user is `Unable to Publish` to a session and an error is thrown, we log it. + // The retry logic is already handled by idempotentCallbackWithRetry in the publish function. + OT.on('exception', exceptionHandler); + + return () => { + OT.off('exception', exceptionHandler); + }; + }, [connected, handlePublishingError]); + + return { + initializeLocalPublisher, + isAudioEnabled, + isForceMuted, + isPublishing, + publishingError, + isVideoEnabled, + publish, + publisher: publisherRef.current, + publisherVideoElement, + quality, + stream, + toggleAudio, + toggleVideo, + changeBackground, + unpublish, + publisherOptions, + }; +}; +export default usePublisher; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisherOptions/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisherOptions/index.tsx new file mode 100644 index 00000000..567b7836 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisherOptions/index.tsx @@ -0,0 +1,3 @@ +import usePublisherOptions from './usePublisherOptions'; + +export default usePublisherOptions; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisherOptions/usePublisherOptions.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisherOptions/usePublisherOptions.spec.tsx new file mode 100644 index 00000000..c60be209 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisherOptions/usePublisherOptions.spec.tsx @@ -0,0 +1,295 @@ +import { describe, expect, it, vi, beforeEach, afterEach, afterAll } from 'vitest'; +import { renderHook as renderHookBase, waitFor } from '@testing-library/react'; +import OT from '@vonage/client-sdk-video'; +import localStorageMock from '@utils/mockData/localStorageMock'; +import mediaDevices$ from '@core/stores/devices'; +import { makeTestProvider, providers, ProviderOptions } from '@test/providers'; +import type { advancedSettings } from '@Context/AdvancedSettings'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import makeMediaDeviceInfos from '@web-test/fixtures/makeMediaDeviceInfos'; +import { setupWindowNavigatorMock } from '@web-test/fixtures'; +import usePublisherOptions from './usePublisherOptions'; +import { env } from '../../../env'; + +const devices = makeMediaDeviceInfos(); +const audioDevice = devices.find((d) => d.kind === 'audioinput')!; +const videoDevice = devices.find((d) => d.kind === 'videoinput')!; + +describe('usePublisherOptions', () => { + beforeEach(() => { + // Setup window.navigator mock first + setupWindowNavigatorMock({ + mediaDevices: { + enumerateDevices: Promise.resolve([]), + }, + }); + + env.partialUpdate({ + ALLOW_VIDEO_ON_JOIN: true, + ALLOW_AUDIO_ON_JOIN: true, + DEFAULT_RESOLUTION: '1280x720', + }); + + Object.defineProperty(window, 'localStorage', { + value: localStorageMock, + writable: true, + }); + + // Reset mediaDevices$ store to initial state + mediaDevices$.setState((state) => ({ + ...state, + mediaDeviceInfo: [], + audioinput: undefined, + videoinput: undefined, + audiooutput: undefined, + })); + }); + + afterEach(() => { + vi.restoreAllMocks(); + advancedSettings$.reset(); + }); + + afterAll(() => { + window.localStorage.clear(); + }); + + it('should use default settings', async () => { + vi.spyOn(OT, 'hasMediaProcessorSupport').mockReturnValue(true); + const { result } = renderHook(() => + usePublisherOptions({ isAudioEnabled: false, isVideoEnabled: false }) + ); + await waitFor(() => { + expect(result.current).toEqual({ + frameRate: 30, + resolution: env.PUBLISHER_MAX_RESOLUTION, + preferredVideoCodecs: 'automatic', + publishAudio: false, + publishVideo: false, + insertDefaultUI: false, + audioFallback: { + publisher: false, + subscriber: false, + }, + audioFilter: { + type: 'advancedNoiseSuppression', + }, + enableDtx: true, + videoFilter: undefined, + name: '', + initials: '', + publishCaptions: true, + }); + }); + }); + + it('should not have advanced noise suppression if not supported by browser', async () => { + vi.spyOn(OT, 'hasMediaProcessorSupport').mockReturnValue(false); + const { result } = renderHook(() => + usePublisherOptions({ isAudioEnabled: true, isVideoEnabled: true }) + ); + + await waitFor(() => { + expect(result.current?.audioFilter).toBe(undefined); + }); + }); + + it('should use custom settings', async () => { + vi.spyOn(OT, 'hasMediaProcessorSupport').mockReturnValue(true); + + const devices = makeMediaDeviceInfos(); + vi.mocked(navigator.mediaDevices.enumerateDevices).mockResolvedValue(devices); + + // Update mediaDevices$ store with devices and selections + mediaDevices$.setState((state) => ({ + ...state, + mediaDeviceInfo: devices, + audioinput: audioDevice.deviceId, + videoinput: videoDevice.deviceId, + })); + + const { result } = renderHook( + () => usePublisherOptions({ isAudioEnabled: true, isVideoEnabled: true }), + { + userContext: { + value: { + defaultSettings: { + publishAudio: true, + publishVideo: true, + name: 'Foo Bar', + backgroundFilter: { + type: 'backgroundBlur', + blurStrength: 'high', + }, + noiseSuppression: false, + publishCaptions: true, + }, + }, + }, + } + ); + + await waitFor(() => { + expect(result.current).toEqual({ + frameRate: 30, + resolution: env.PUBLISHER_MAX_RESOLUTION, + preferredVideoCodecs: 'automatic', + publishAudio: true, + publishVideo: true, + audioSource: audioDevice.deviceId, + videoSource: videoDevice.deviceId, + insertDefaultUI: false, + audioFallback: { + publisher: false, + subscriber: false, + }, + audioFilter: undefined, + enableDtx: true, + videoFilter: { + type: 'backgroundBlur', + blurStrength: 'high', + }, + name: 'Foo Bar', + initials: 'FB', + publishCaptions: true, + }); + }); + }); + + describe('configurable features', () => { + it('should disable audio publishing when allowAudioOnJoin is false', async () => { + env.partialUpdate({ + ALLOW_AUDIO_ON_JOIN: false, + }); + + const { result } = renderHook(() => + usePublisherOptions({ isAudioEnabled: true, isVideoEnabled: true }) + ); + + await waitFor(() => { + expect(result.current?.publishAudio).toBe(false); + }); + }); + + it('should disable video publishing when allowVideoOnJoin is false', async () => { + env.partialUpdate({ + ALLOW_VIDEO_ON_JOIN: false, + }); + + const { result } = renderHook(() => + usePublisherOptions({ isAudioEnabled: true, isVideoEnabled: true }) + ); + + await waitFor(() => { + expect(result.current?.publishVideo).toBe(false); + }); + }); + + it('should always use max resolution for publisher initialization', async () => { + const { result } = renderHook( + () => usePublisherOptions({ isAudioEnabled: true, isVideoEnabled: true }), + { dialogState: { resolution: '1280x720' } } + ); + + await waitFor(() => { + expect(result.current?.resolution).toBe(env.PUBLISHER_MAX_RESOLUTION); + }); + }); + + it('should configure opus dtx from advanced settings context', async () => { + const { result } = renderHook( + () => usePublisherOptions({ isAudioEnabled: true, isVideoEnabled: true }), + { dialogState: { enableDtx: false } } + ); + + await waitFor(() => { + expect(result.current?.enableDtx).toBe(false); + }); + }); + + it('should apply publisher and subscriber audio fallback toggles from advanced settings', async () => { + const { result } = renderHook( + () => usePublisherOptions({ isAudioEnabled: true, isVideoEnabled: true }), + { + dialogState: { + publisherAudioFallbackEnabled: true, + subscriberAudioFallbackEnabled: true, + }, + } + ); + + await waitFor(() => { + expect(result.current?.audioFallback).toEqual({ + publisher: true, + subscriber: true, + }); + }); + }); + }); + + it('should disable audio and video based on isAudioEnabled and isVideoEnabled params', async () => { + vi.spyOn(OT, 'hasMediaProcessorSupport').mockReturnValue(true); + + const { result } = renderHook( + () => usePublisherOptions({ isAudioEnabled: false, isVideoEnabled: true }), + { + userContext: { + value: { + defaultSettings: { + publishAudio: true, + publishVideo: true, + name: 'Foo Bar', + backgroundFilter: { + type: 'backgroundBlur', + blurStrength: 'high', + }, + noiseSuppression: false, + publishCaptions: true, + }, + }, + }, + } + ); + + await waitFor(() => { + expect(result.current?.publishAudio).toBe(false); + expect(result.current?.publishVideo).toBe(true); + }); + }); +}); + +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; + dialogState?: Partial; +}; + +function renderHook( + render: (initialProps: Props) => Result, + { userContext, dialogState }: RenderOptions = {} +) { + if (dialogState) { + advancedSettings$.setState((state) => ({ ...state, ...dialogState })); + } + + const { wrapper, ...context } = makeTestProvider([providers.user], { + userContext: { + value: { + ...userContext?.value, + defaultSettings: { + publishAudio: false, + publishVideo: false, + name: '', + noiseSuppression: true, + publishCaptions: true, + ...userContext?.value?.defaultSettings, + }, + }, + ...userContext, + }, + }); + + return { + ...context, + ...renderHookBase(render, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisherOptions/usePublisherOptions.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisherOptions/usePublisherOptions.tsx new file mode 100644 index 00000000..147b749b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisherOptions/usePublisherOptions.tsx @@ -0,0 +1,108 @@ +import { useMemo } from 'react'; +import { + PublisherProperties, + VideoFilter, + AudioFilter, + hasMediaProcessorSupport, +} from '@vonage/client-sdk-video'; +import useUserContext from '@hooks/useUserContext'; +import getInitials from '@utils/getInitials'; +import { useDeviceId } from '@core/stores/devices/hooks'; +import useStableCallback from '@web/hooks/useStableCallback'; +import { env } from '../../../env'; +import advancedSettings$ from '@Context/AdvancedSettings'; + +/** + * React hook to get PublisherProperties combining default options and options set in UserContext + * @returns {PublisherProperties | null} publisher properties object + */ + +const usePublisherOptions = ({ + isAudioEnabled, + isVideoEnabled, +}: { + isAudioEnabled: boolean; + isVideoEnabled: boolean; +}): PublisherProperties => { + const { user } = useUserContext(); + const enableDtx = advancedSettings$.use.select((state) => state.enableDtx); + const frameRate = advancedSettings$.use.select((state) => state.frameRate); + const codecMode = advancedSettings$.use.select((state) => state.codecMode); + const codecPriority = advancedSettings$.use.select((state) => state.codecPriority); + const publisherAudioFallbackEnabled = advancedSettings$.use.select( + (state) => state.publisherAudioFallbackEnabled + ); + const subscriberAudioFallbackEnabled = advancedSettings$.use.select( + (state) => state.subscriberAudioFallbackEnabled + ); + + // Extract individual properties to avoid object reference changes + const { name, noiseSuppression, backgroundFilter, publishAudio, publishVideo, publishCaptions } = + user.defaultSettings; + + const videoSource = useDeviceId('videoinput'); + const audioSource = useDeviceId('audioinput'); + + const getOptions = useStableCallback(() => { + const initials = getInitials(name); + + const audioFilter: AudioFilter | undefined = + noiseSuppression && hasMediaProcessorSupport('both') + ? { type: 'advancedNoiseSuppression' } + : undefined; + + const videoFilter: VideoFilter | undefined = + backgroundFilter && hasMediaProcessorSupport('both') ? backgroundFilter : undefined; + + const options = { + audioFallback: { + publisher: publisherAudioFallbackEnabled, + subscriber: subscriberAudioFallbackEnabled, + }, + audioFilter, + audioSource, + enableDtx, + initials, + insertDefaultUI: false, + name, + publishAudio: env.ALLOW_AUDIO_ON_JOIN && publishAudio && isAudioEnabled, + publishCaptions, + publishVideo: env.ALLOW_VIDEO_ON_JOIN && publishVideo && isVideoEnabled, + frameRate, + preferredVideoCodecs: (codecMode === 'automatic' + ? 'automatic' + : codecPriority) as PublisherProperties['preferredVideoCodecs'], + resolution: env.PUBLISHER_MAX_RESOLUTION, + videoFilter, + videoSource, + }; + + return options; + }); + + return useMemo( + () => getOptions(), + // eslint-disable-next-line react-hooks/exhaustive-deps + [ + getOptions, + audioSource, + backgroundFilter, + enableDtx, + name, + noiseSuppression, + publishAudio, + publishCaptions, + publishVideo, + videoSource, + isAudioEnabled, + isVideoEnabled, + frameRate, + codecMode, + codecPriority, + publisherAudioFallbackEnabled, + subscriberAudioFallbackEnabled, + ] + ); +}; + +export default usePublisherOptions; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisherQuality/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisherQuality/index.tsx new file mode 100644 index 00000000..135c413a --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisherQuality/index.tsx @@ -0,0 +1,3 @@ +import usePublisherQuality from './usePublisherQuality'; + +export default usePublisherQuality; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisherQuality/usePublisherQuality.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisherQuality/usePublisherQuality.spec.tsx new file mode 100644 index 00000000..d333f164 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisherQuality/usePublisherQuality.spec.tsx @@ -0,0 +1,61 @@ +import { describe, expect, it, vi, beforeEach } from 'vitest'; +import { act, renderHook, waitFor } from '@testing-library/react'; +import { Publisher } from '@vonage/client-sdk-video'; +import EventEmitter from 'events'; +import useUserContext from '@hooks/useUserContext'; +import type { UserContextType } from '../../user'; +import usePublisherQuality from './usePublisherQuality'; + +vi.mock('@hooks/useUserContext.tsx'); + +const mockUserContext: UserContextType = { + user: { + defaultSettings: { + publishAudio: false, + publishVideo: false, + name: '', + noiseSuppression: true, + publishCaptions: false, + }, + issues: { + reconnections: 0, + audioFallbacks: 0, + }, + }, + setUser: vi.fn(), +}; + +describe('usePublisherQuality', () => { + beforeEach(() => { + vi.mocked(useUserContext).mockImplementation(() => mockUserContext); + }); + + it('should set quality to good on videoEnabled event', async () => { + const mockPublisher = new EventEmitter(); + const { result } = renderHook(() => usePublisherQuality(mockPublisher as unknown as Publisher)); + void act(() => mockPublisher.emit('videoEnabled')); + await waitFor(() => expect(result.current).toBe('good')); + }); + + it('should set quality to good on videoDisableWarningLifted event', async () => { + const mockPublisher = new EventEmitter(); + const { result } = renderHook(() => usePublisherQuality(mockPublisher as unknown as Publisher)); + void act(() => mockPublisher.emit('videoDisableWarningLifted')); + await waitFor(() => expect(result.current).toBe('good')); + }); + + it('should set quality to good on videoDisabled event', async () => { + const mockPublisher = new EventEmitter(); + const { result } = renderHook(() => usePublisherQuality(mockPublisher as unknown as Publisher)); + void act(() => mockPublisher.emit('videoDisabled')); + await waitFor(() => expect(result.current).toBe('bad')); + expect(useUserContext().user.issues.audioFallbacks).toBe(1); + }); + + it('should set quality to good on videoDisableWarning event', async () => { + const mockPublisher = new EventEmitter(); + const { result } = renderHook(() => usePublisherQuality(mockPublisher as unknown as Publisher)); + void act(() => mockPublisher.emit('videoDisableWarning')); + await waitFor(() => expect(result.current).toBe('poor')); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisherQuality/usePublisherQuality.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisherQuality/usePublisherQuality.tsx new file mode 100644 index 00000000..ad69cd8d --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/PublisherProvider/usePublisherQuality/usePublisherQuality.tsx @@ -0,0 +1,56 @@ +import { useCallback, useEffect, useState } from 'react'; +import { Publisher } from '@vonage/client-sdk-video'; +import useUserContext from '../../../hooks/useUserContext'; + +export type NetworkQuality = 'good' | 'poor' | 'bad'; + +/** + * React hook to return react state string of current publisher network quality. + * This hook adds the necessary event listeners to publisher to assign state to one of 3 values: + * 'good' | 'poor' | 'bad'. + * Network quality state will be updated when events are triggered. + * @param {(Publisher | null)} publisher - The publisher to monitor + * @returns {NetworkQuality} network quality + */ +const usePublisherQuality = (publisher: Publisher | null): NetworkQuality => { + const { user } = useUserContext(); + const [quality, setQuality] = useState('good'); + + const handleVideoDisabled = useCallback(() => { + setQuality('bad'); + + // eslint-disable-next-line react-hooks/immutability + user.issues.audioFallbacks += 1; + }, [user]); + + const handleVideoEnabled = useCallback(() => { + setQuality('good'); + }, []); + + const handleVideoWarning = useCallback(() => { + setQuality('poor'); + }, []); + + const handleVideoWarningLifted = useCallback(() => { + setQuality('good'); + }, []); + + useEffect(() => { + if (publisher) { + publisher.on('videoDisabled', handleVideoDisabled); + publisher.on('videoEnabled', handleVideoEnabled); + publisher.on('videoDisableWarning', handleVideoWarning); + publisher.on('videoDisableWarningLifted', handleVideoWarningLifted); + } + }, [ + handleVideoDisabled, + handleVideoEnabled, + handleVideoWarning, + handleVideoWarningLifted, + publisher, + ]); + + return quality; +}; + +export default usePublisherQuality; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/RoomProvider.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/RoomProvider.tsx new file mode 100644 index 00000000..4f47d4bf --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/RoomProvider.tsx @@ -0,0 +1,13 @@ +import { PropsWithChildren } from 'react'; +import { BackgroundPublisherProvider } from './BackgroundPublisherProvider'; + +/** + * Old RoomContext renamed to RoomProvider + * Wrapper for all of the contexts used by the waiting room and the meeting room. + * @returns {ReactElement} The context. + */ +const RoomProvider: React.FC = ({ children }) => ( + {children} +); + +export default RoomProvider; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/SessionProvider/session.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/SessionProvider/session.spec.tsx new file mode 100644 index 00000000..39a82c65 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/SessionProvider/session.spec.tsx @@ -0,0 +1,516 @@ +import { ReactElement, useEffect } from 'react'; +import { describe, expect, it, vi, beforeEach } from 'vitest'; +import { act, render as renderBase, waitFor } from '@testing-library/react'; +import EventEmitter from 'events'; +import { Publisher, Stream } from '@vonage/client-sdk-video'; +import useSessionContext from '@hooks/useSessionContext'; +import ActiveSpeakerTracker from '@utils/ActiveSpeakerTracker'; +import VonageVideoClient from '@utils/VonageVideoClient'; +import { StreamPropertyChangedEvent, SubscriberWrapper } from '@app-types/session'; +import { makeTestProvider, ProviderOptions, providers } from '@test/providers'; +import type { VideoClient } from '@core/services'; + +vi.mock('@utils/ActiveSpeakerTracker'); +vi.mock('@utils/VonageVideoClient'); + +// Override the constants for max pinning test +vi.mock('@utils/constants', () => ({ + MAX_PIN_COUNT_MOBILE: 1, + MAX_PIN_COUNT_DESKTOP: 1, +})); + +vi.mock('@api/fetchCredentials'); + +const mockJoinSessionMutate = vi.fn(); +const mockVideoClient = { + joinSession: (...args: unknown[]) => mockJoinSessionMutate(...args) as unknown, +} as unknown as VideoClient; + +// A valid fake JWT containing sessionId: '1_MX4xMjM0NTY3OH4-VGh1IEZlYiAyNyAwODozMjozNCBQU1QgMjAyMH4wLjI0NDYxMjE' +const validSessionKey = + 'eyJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uSWQiOiIxX01YNHhNak0wTlRZM09INC1WR2gxSUVabFlpQXlOeUF3T0Rvek1qb3pOQ0JRVTFRZ01qQXlNSDR3TGpJME5EWXhNakUiLCJyb29tTmFtZSI6IlRlc3RDb21wb25lbnRSb29tIn0.fakesig'; + +describe('SessionProvider', () => { + let activeSpeakerTracker: ActiveSpeakerTracker; + let vonageVideoClient: VonageVideoClient; + + const TestComponent = () => { + const { + activeSpeakerId, + publish, + unpublish, + joinRoom, + disconnect, + subscriberWrappers, + connected, + reconnecting, + archiveId, + forceMute, + pinSubscriber, + isMaxPinned, + lastStreamUpdate, + } = useSessionContext(); + + useEffect(() => { + if (joinRoom) { + void joinRoom({ sessionKey: validSessionKey }); + } + }, [joinRoom]); + + return ( +
        + + + + + + {activeSpeakerId} + + {subscriberWrappers.map((subscriberWrapper) => ( +
        {subscriberWrapper.id}
        + ))} +
        + {String(connected)} + {String(reconnecting)} + {String(archiveId)} + {String(isMaxPinned)} + + {lastStreamUpdate ? JSON.stringify(lastStreamUpdate) : 'No updates'} + +
        + ); + }; + + beforeEach(() => { + activeSpeakerTracker = Object.assign(new EventEmitter(), { + onSubscriberDestroyed: vi.fn(), + onSubscriberAudioLevelUpdated: vi.fn(), + }) as unknown as ActiveSpeakerTracker; + + vonageVideoClient = Object.assign(new EventEmitter(), { + unpublish: vi.fn(), + publish: vi.fn().mockResolvedValue(undefined), + connect: vi.fn().mockReturnValue(Promise.resolve()), + disconnect: vi.fn(), + forceMuteStream: vi.fn(), + hasStream: vi.fn().mockReturnValue(true), + resubscribeToStreamId: vi.fn().mockResolvedValue(undefined), + emitSubscriberDestroyedOnce: vi.fn(), + }) as unknown as VonageVideoClient; + + const mockedActiveSpeakerTracker = vi.mocked(ActiveSpeakerTracker); + + mockedActiveSpeakerTracker.mockImplementation(() => { + return activeSpeakerTracker; + }); + + const mockedVonageVideoClient = vi.mocked(VonageVideoClient); + + mockedVonageVideoClient.mockImplementation(() => { + return vonageVideoClient; + }); + + mockJoinSessionMutate.mockResolvedValue({ + token: 'token', + sessionId: 'sessionId', + sessionKey: validSessionKey, + }); + }); + + async function renderAndWaitForConnection() { + const result = render(); + await waitFor(() => expect(result.getByTestId('connected')).toHaveTextContent('true')); + return result; + } + + it('should update activeSpeaker state when activeSpeakerTracker emits event', async () => { + const { getByTestId } = await renderAndWaitForConnection(); + void act(() => + activeSpeakerTracker.emit('activeSpeakerChanged', { + previousActiveSpeaker: { subscriberId: undefined, movingAvg: 0 }, + newActiveSpeaker: { subscriberId: 'sub1', movingAvg: 0.3 }, + }) + ); + await waitFor(() => expect(getByTestId('activeSpeaker')).toHaveTextContent('sub1')); + void act(() => + activeSpeakerTracker.emit('activeSpeakerChanged', { + previousActiveSpeaker: { subscriberId: 'sub1', movingAvg: 0 }, + newActiveSpeaker: { subscriberId: 'sub2', movingAvg: 0.4 }, + }) + ); + await waitFor(() => expect(getByTestId('activeSpeaker')).toHaveTextContent('sub2')); + }); + + describe('publish', () => { + it('should call publish on VonageVideoClient when connected', async () => { + const { getByTestId } = await renderAndWaitForConnection(); + + act(() => { + getByTestId('publish').click(); + }); + + await waitFor(() => { + expect(vonageVideoClient.publish).toHaveBeenCalledTimes(1); + }); + }); + + it('should not call publish on VonageVideoClient if not connected', async () => { + const { getByTestId } = await renderAndWaitForConnection(); + + act(() => { + getByTestId('disconnect').click(); + }); + + await waitFor(() => expect(getByTestId('connected')).toHaveTextContent('false')); + + act(() => { + getByTestId('publish').click(); + }); + + expect(vonageVideoClient.publish).toHaveBeenCalledTimes(0); + }); + }); + + describe('unpublish', () => { + it('should call unpublish on VonageVideoClient', async () => { + const { getByTestId } = await renderAndWaitForConnection(); + + act(() => { + getByTestId('unpublish').click(); + }); + + await waitFor(() => { + expect(vonageVideoClient.unpublish).toHaveBeenCalledTimes(1); + }); + }); + + it('should not call unpublish on VonageVideoClient if not connected', async () => { + const { getByTestId } = await renderAndWaitForConnection(); + + act(() => { + getByTestId('disconnect').click(); + }); + + await waitFor(() => expect(getByTestId('connected')).toHaveTextContent('false')); + + act(() => { + getByTestId('unpublish').click(); + }); + + await waitFor(() => { + expect(vonageVideoClient.unpublish).toHaveBeenCalledTimes(0); + }); + }); + }); + + describe('subscriberWrappers', () => { + it('adding a new subscriber should add it to the subscriberWrappers', async () => { + const { getByTestId } = await renderAndWaitForConnection(); + + act(() => { + vonageVideoClient.emit('subscriberVideoElementCreated', { + id: 'sub1', + } as unknown as SubscriberWrapper); + }); + + await waitFor(() => { + expect(getByTestId('subscriberWrappers')).toHaveTextContent('sub1'); + }); + + act(() => { + vonageVideoClient.emit('subscriberVideoElementCreated', { + id: 'sub2', + } as unknown as SubscriberWrapper); + }); + + await waitFor(() => { + expect(getByTestId('subscriberWrappers')).toHaveTextContent('sub2'); + expect(getByTestId('subscriberWrappers').children.length).toBe(2); + }); + }); + + it('removing a subscriber should remove it from the subscriberWrappers', async () => { + const { getByTestId } = await renderAndWaitForConnection(); + + act(() => { + vonageVideoClient.emit('subscriberVideoElementCreated', { + id: 'sub1', + } as unknown as SubscriberWrapper); + }); + + await waitFor(() => { + expect(getByTestId('subscriberWrappers')).toHaveTextContent('sub1'); + }); + + act(() => { + vonageVideoClient.hasStream = vi.fn().mockReturnValue(false); + vonageVideoClient.emit('subscriberDestroyed', 'sub1'); + }); + + await waitFor(() => { + expect(getByTestId('subscriberWrappers')).not.toHaveTextContent('sub1'); + }); + }); + }); + + describe('session', () => { + it('connect should call connect on VonageVideoClient and set connected to true', async () => { + const { getByTestId } = await renderAndWaitForConnection(); + + await waitFor(() => expect(getByTestId('connected')).toHaveTextContent('true')); + expect(vonageVideoClient.connect).toHaveBeenCalledTimes(1); + }); + + it('disconnect should call disconnect on VonageVideoClient and set connected to false', async () => { + const { getByTestId } = await renderAndWaitForConnection(); + + act(() => { + getByTestId('disconnect').click(); + }); + + await waitFor(() => expect(getByTestId('connected')).toHaveTextContent('false')); + expect(vonageVideoClient.disconnect).toHaveBeenCalledTimes(1); + }); + + it('when reconnecting session, sets reconnecting to true', async () => { + const { getByTestId } = await renderAndWaitForConnection(); + + act(() => { + vonageVideoClient.emit('sessionReconnecting'); + }); + + await waitFor(() => expect(getByTestId('reconnecting')).toHaveTextContent('true')); + }); + + it('when reconnected, sets reconnecting to false', async () => { + const { getByTestId } = await renderAndWaitForConnection(); + + act(() => { + vonageVideoClient.emit('sessionReconnected'); + }); + + await waitFor(() => expect(getByTestId('reconnecting')).toHaveTextContent('false')); + }); + + it('when re-connected, sets reconnecting to false', async () => { + const { getByTestId } = await renderAndWaitForConnection(); + + act(() => { + vonageVideoClient.emit('sessionReconnected'); + }); + + await waitFor(() => expect(getByTestId('reconnecting')).toHaveTextContent('false')); + }); + + it('when disconnected, sets connected to false', async () => { + const { getByTestId } = await renderAndWaitForConnection(); + + act(() => { + vonageVideoClient.emit('sessionDisconnected', { reason: 'test reason' }); + }); + + await waitFor(() => expect(getByTestId('connected')).toHaveTextContent('false')); + }); + + it('when a stream property changes, it should update the state', async () => { + const { getByTestId } = await renderAndWaitForConnection(); + + const streamPropertyChangedEvent = { + stream: { + id: 'stream1', + } as unknown as Stream, + changedProperty: 'hasVideo', + newValue: false, + oldValue: true, + } as unknown as StreamPropertyChangedEvent; + + await waitFor(() => { + expect(getByTestId('streamPropertyChanged')).toHaveTextContent('No updates'); + }); + + act(() => { + vonageVideoClient.emit('streamPropertyChanged', streamPropertyChangedEvent); + }); + + await waitFor(() => { + expect(getByTestId('streamPropertyChanged')).toHaveTextContent( + JSON.stringify(streamPropertyChangedEvent) + ); + }); + }); + }); + + describe('archiving', () => { + it('should set archiveId when archiving starts', async () => { + const { getByTestId } = await renderAndWaitForConnection(); + + act(() => { + vonageVideoClient.emit('archiveStarted', 'abc123'); + }); + + await waitFor(() => expect(getByTestId('archiveId')).toHaveTextContent('abc123')); + }); + + it('should set archiveId to null when archiving stops', async () => { + const { getByTestId } = await renderAndWaitForConnection(); + + act(() => { + vonageVideoClient.emit('archiveStopped'); + }); + + await waitFor(() => expect(getByTestId('archiveId')).toHaveTextContent('null')); + }); + }); + + describe('pinning', () => { + it('should move a pinned subscriber to the top of the list', async () => { + const { getByTestId } = await renderAndWaitForConnection(); + + act(() => { + vonageVideoClient.emit('subscriberVideoElementCreated', { + id: 'sub1', + } as unknown as SubscriberWrapper); + }); + + act(() => { + vonageVideoClient.emit('subscriberVideoElementCreated', { + id: 'sub2', + } as unknown as SubscriberWrapper); + vonageVideoClient.emit('subscriberVideoElementCreated', { + id: 'sub3', + } as unknown as SubscriberWrapper); + }); + + await waitFor(() => expect(getByTestId('subscriberWrappers').children.length).toBe(3)); + expect(getByTestId('subscriberWrappers').children[0]).not.toHaveTextContent('sub1'); + + act(() => { + getByTestId('pinSubscriber').click(); + }); + + expect(getByTestId('subscriberWrappers').children[0]).toHaveTextContent('sub1'); + }); + + it('pinning the maximum number of subscribers should set isMaxPinned to true', async () => { + const { getByTestId } = await renderAndWaitForConnection(); + + act(() => { + vonageVideoClient.emit('subscriberVideoElementCreated', { + id: 'sub1', + } as unknown as SubscriberWrapper); + + vonageVideoClient.emit('subscriberVideoElementCreated', { + id: 'sub2', + } as unknown as SubscriberWrapper); + + vonageVideoClient.emit('subscriberVideoElementCreated', { + id: 'sub3', + } as unknown as SubscriberWrapper); + + getByTestId('pinSubscriber').click(); + }); + + await waitFor(() => expect(getByTestId('isMaxPinned')).toHaveTextContent('true')); + }); + }); + + it('forceMute should call forceMute on VonageVideoClient', async () => { + const { getByTestId } = await renderAndWaitForConnection(); + + act(() => { + getByTestId('forceMute').click(); + }); + + await waitFor(() => expect(vonageVideoClient.forceMuteStream).toHaveBeenCalledTimes(1)); + }); + + it('joinRoom should call joinSession and connect', async () => { + await renderAndWaitForConnection(); + + await waitFor(() => { + expect(mockJoinSessionMutate).toHaveBeenCalledTimes(1); + expect(vonageVideoClient.connect).toHaveBeenCalledTimes(1); + }); + }); +}); + +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; + sessionContext?: ProviderOptions['SessionContext']; +}; + +function render(ui: ReactElement, { userContext, sessionContext }: RenderOptions = {}) { + const { wrapper, ...context } = makeTestProvider( + [providers.user, providers.session, providers.runtime], + { + userContext: { + ...userContext, + value: { + defaultSettings: { + publishAudio: false, + publishVideo: false, + name: '', + noiseSuppression: true, + publishCaptions: false, + ...userContext?.value?.defaultSettings, + }, + }, + }, + sessionContext, + runtimeContext: { videoClient: mockVideoClient }, + } + ); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/SessionProvider/session.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/SessionProvider/session.tsx new file mode 100644 index 00000000..c0f1de64 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/SessionProvider/session.tsx @@ -0,0 +1,639 @@ +import { + useState, + createContext, + useRef, + ReactNode, + useMemo, + useCallback, + Dispatch, + SetStateAction, + useEffect, + ReactElement, +} from 'react'; +import { Connection, Publisher, Stream } from '@vonage/client-sdk-video'; +import useRightPanel, { RightPanelActiveTab } from '@hooks/useRightPanel'; +import useUserContext from '@hooks/useUserContext'; +import useChat from '@hooks/useChat'; +import useEmoji, { EmojiWrapper } from '@hooks/useEmoji'; +import ActiveSpeakerTracker from '@utils/ActiveSpeakerTracker'; +import { + Credential, + LocalCaptionReceived, + SignalEvent, + StreamPropertyChangedEvent, + SubscriberAudioLevelUpdatedEvent, + SubscriberWrapper, + LayoutMode, + LAYOUT_MODES, +} from '@app-types/session'; +import { ChatMessageType } from '@app-types/chat'; +import { isMobile } from '@web/platform'; +import { + sortByDisplayPriority, + togglePinAndSortByDisplayOrder, +} from '@utils/sessionStateOperations'; +import { MAX_PIN_COUNT_DESKTOP, MAX_PIN_COUNT_MOBILE } from '@utils/constants'; +import VonageVideoClient from '@utils/VonageVideoClient'; +import wait from '@common/execution/wait'; +import { env } from '../../env'; +import frontendLogger from '../../logger'; +import { runtime$ } from '@core/stores'; +import { decodeSessionKey } from '@common/helpers'; +import type { VideoSessionDetails } from '@common/types'; + +export type { ChatMessageType } from '@app-types/chat'; + +export type SessionContextType = { + vonageVideoClient: null | VonageVideoClient; + disconnect: null | (() => void); + joinRoom: null | ((params: { sessionKey: string }) => Promise); + forceMute: null | ((stream: Stream) => Promise); + connected: null | boolean; + sessionKey: string | null; + sessionDetails: VideoSessionDetails | null; + unreadCount: number; + messages: ChatMessageType[]; + sendChatMessage: (text: string) => void; + reconnecting: null | boolean; + subscriberWrappers: SubscriberWrapper[]; + activeSpeakerId: string | undefined; + layoutMode: LayoutMode; + setLayoutMode: Dispatch>; + archiveId: string | null; + archiveIdStartedBySelf: string | null; + recordingAlreadyNotified: boolean; + setRecordingAlreadyNotified: Dispatch>; + markArchiveStartRequestedBySelf: () => void; + resetArchiveStartRequestedBySelf: () => void; + rightPanelActiveTab: RightPanelActiveTab; + toggleParticipantList: () => void; + toggleBackgroundEffects: () => void; + toggleChat: () => void; + closeRightPanel: () => void; + toggleReportIssue: () => void; + pinSubscriber: (subscriberId: string) => void; + isMaxPinned: boolean; + ownCaptions: string | null; + sendEmoji: (emoji: string) => void; + emojiQueue: EmojiWrapper[]; + publish: (publisher: Publisher) => Promise; + unpublish: (publisher: Publisher) => void; + lastStreamUpdate: StreamPropertyChangedEvent | null; + subscriptionError: Error | null; +}; + +/** + * Context to provide session-related data and actions. + */ +export const SessionContext = createContext({ + vonageVideoClient: null, + disconnect: null, + joinRoom: null, + forceMute: null, + connected: null, + sessionKey: null, + sessionDetails: null, + unreadCount: 0, + messages: [], + sendChatMessage: () => {}, + reconnecting: null, + subscriberWrappers: [], + activeSpeakerId: undefined, + layoutMode: 'grid', + setLayoutMode: () => {}, + archiveId: null, + archiveIdStartedBySelf: null, + recordingAlreadyNotified: false, + setRecordingAlreadyNotified: () => {}, + markArchiveStartRequestedBySelf: () => {}, + resetArchiveStartRequestedBySelf: () => {}, + rightPanelActiveTab: 'closed', + toggleParticipantList: () => {}, + toggleBackgroundEffects: () => {}, + toggleChat: () => {}, + closeRightPanel: () => {}, + toggleReportIssue: () => {}, + pinSubscriber: () => {}, + isMaxPinned: false, + ownCaptions: null, + sendEmoji: () => {}, + emojiQueue: [], + publish: async () => Promise.resolve(), + unpublish: () => {}, + lastStreamUpdate: null, + subscriptionError: null, +}); + +export type ConnectionEventType = { connection: Connection; reason?: string; id?: string }; + +export type SessionContextInitialValue = Partial< + Pick< + SessionContextType, + | 'connected' + | 'reconnecting' + | 'layoutMode' + | 'subscriberWrappers' + | 'lastStreamUpdate' + | 'subscriptionError' + | 'ownCaptions' + | 'archiveId' + | 'activeSpeakerId' + | 'recordingAlreadyNotified' + | 'archiveIdStartedBySelf' + | 'sessionKey' + > +>; + +/** + * @typedef {object} SessionProviderProps + * @property {ReactNode} children - The content to be rendered as children. + * @property {SessionContextInitialValue} initialValue - Optional initial values for session context state. + * @property {boolean} skipBrowserUrlUpdate - When true, skips updating the browser URL on join (for MemoryRouter / embedded contexts). + */ +export type SessionProviderProps = { + children: ReactNode; + initialValue?: SessionContextInitialValue; + /** Set to true when running inside a MemoryRouter to avoid overwriting the host page URL. */ + skipBrowserUrlUpdate?: boolean; +}; + +const MAX_PIN_COUNT = isMobile() ? MAX_PIN_COUNT_MOBILE : MAX_PIN_COUNT_DESKTOP; + +/** + * SessionProvider - React Context Provider for SessionProvider + * Provides session context to the component tree, including managing subscribers, connections, and layout mode. + * We use Context to make the Session object available in many components across the app without + * prop drilling: https://react.dev/learn/passing-data-deeply-with-context#use-cases-for-context + * @param {SessionProviderProps} props - The provider properties + * @returns {SessionContextType} a context provider for a publisher preview + */ +const SessionProvider = ({ + children, + initialValue = {}, + skipBrowserUrlUpdate = false, +}: SessionProviderProps): ReactElement => { + const videoClient = runtime$.useVideoClient(); + const [lastStreamUpdate, setLastStreamUpdate] = useState( + initialValue?.lastStreamUpdate ?? null + ); + const vonageVideoClient = useRef(null); + const [reconnecting, setReconnecting] = useState(initialValue?.reconnecting ?? false); + const [subscriberWrappers, setSubscriberWrappers] = useState( + initialValue?.subscriberWrappers ?? [] + ); + const [subscriptionError, setSubscriptionError] = useState( + initialValue?.subscriptionError ?? null + ); + const [ownCaptions, setOwnCaptions] = useState(initialValue?.ownCaptions ?? null); + + const [layoutMode, setLayoutMode] = useState( + initialValue?.layoutMode ?? + (() => { + const isValidLayoutMode = (LAYOUT_MODES as readonly string[]).includes( + env.DEFAULT_LAYOUT_MODE + ); + return isValidLayoutMode ? env.DEFAULT_LAYOUT_MODE : 'grid'; + })() + ); + + const [archiveId, setArchiveId] = useState(initialValue?.archiveId ?? null); + const [archiveIdStartedBySelf, setArchiveIdStartedBySelf] = useState( + initialValue?.archiveIdStartedBySelf ?? null + ); + const [recordingAlreadyNotified, setRecordingAlreadyNotified] = useState( + initialValue?.recordingAlreadyNotified ?? false + ); + const archiveStartRequestedBySelfRef = useRef(false); + + const markArchiveStartRequestedBySelf = useCallback(() => { + archiveStartRequestedBySelfRef.current = true; + }, []); + + const resetArchiveStartRequestedBySelf = useCallback(() => { + archiveStartRequestedBySelfRef.current = false; + }, []); + const activeSpeakerTracker = useRef(new ActiveSpeakerTracker()); + const [activeSpeakerId, setActiveSpeakerId] = useState( + initialValue?.activeSpeakerId ?? undefined + ); + const activeSpeakerIdRef = useRef(undefined); + const { messages, onChatMessage, sendChatMessage } = useChat({ + signal: vonageVideoClient.current?.signal, + }); + const getConnectionId = useCallback((): string | undefined => { + return vonageVideoClient.current?.connectionId; + }, []); + const { sendEmoji, onEmoji, emojiQueue } = useEmoji({ + signal: vonageVideoClient.current?.signal, + getConnectionId, + }); + const { + closeRightPanel, + toggleParticipantList, + toggleBackgroundEffects, + toggleChat, + rightPanelState: { unreadCount, activeTab: rightPanelActiveTab }, + incrementUnreadCount, + toggleReportIssue, + } = useRightPanel(); + + const handleChatSignal = ({ data }: SignalEvent) => { + if (data) { + onChatMessage(data); + incrementUnreadCount(); + } + }; + + const handleEmoji = useCallback( + (emojiEvent: SignalEvent) => { + setSubscriberWrappers((currentSubscriberWrappers) => { + onEmoji(emojiEvent, currentSubscriberWrappers); + return [...currentSubscriberWrappers]; // Return unchanged state + }); + }, + [onEmoji] + ); + + const setActiveSpeakerIdAndRef = useCallback((id: string | undefined) => { + // We store the current active speaker id in a ref so it can be accessed later when sorting the subscriberWrappers for display. + activeSpeakerIdRef.current = id; + setActiveSpeakerId(id); + }, []); + + /** + * Moves the subscriber with the specified ID to the top of the display order. + * @param {string} id - The ID of the subscriber to move. + */ + const moveSubscriberToTopOfDisplayOrder = useCallback((id: string) => { + setSubscriberWrappers((prevSubscriberWrappers) => { + const activeSpeakerWrapper = prevSubscriberWrappers.find( + ({ id: streamId }) => streamId === id + ); + if (activeSpeakerWrapper) { + // We use a ref to access the value for activeSpeakerId, because it is not updated in the context of this state and shows up as its initial state, undefined. + // When passing the sort function callback, the initial value of activeSpeakerId is captured when the listener is added. Updates to the + // activeSpeakerId are not reflected when it is accessed. A workaround is to use useRef to store state. + // See: https://stackoverflow.com/questions/53845595/wrong-react-hooks-behaviour-with-event-listener + return prevSubscriberWrappers.sort(sortByDisplayPriority(id)); + } + return prevSubscriberWrappers; + }); + }, []); + + /** + * isMaxPinned {boolean} - whether the maximum number of allowed pinned participants has been reached. + * This is used to disable the pin buttons so no more participants can be pinned. + */ + const isMaxPinned = useMemo(() => { + const pinnedCount = subscriberWrappers.filter((sub) => sub.isPinned).length; + return pinnedCount >= MAX_PIN_COUNT; + }, [subscriberWrappers]); + + /** + * Toggles a subscriber's isPinned field, and sorts subscribers by display priority. + * @param {string} id - The ID of the subscriber to pin. + */ + const pinSubscriber = useCallback( + (id: string) => { + setSubscriberWrappers((previousSubscriberWrappers) => { + return togglePinAndSortByDisplayOrder(id, previousSubscriberWrappers, activeSpeakerId); + }); + }, + [activeSpeakerId] + ); + + // hook to keep track of the active speaker during the call and move it to the top of the display order + useEffect(() => { + activeSpeakerTracker.current.on('activeSpeakerChanged', ({ newActiveSpeaker }) => { + const { subscriberId } = newActiveSpeaker; + setActiveSpeakerIdAndRef(subscriberId); + if (subscriberId) { + moveSubscriberToTopOfDisplayOrder(subscriberId); + } + }); + }, [moveSubscriberToTopOfDisplayOrder, setActiveSpeakerIdAndRef]); + + const { user } = useUserContext(); + const [connected, setConnected] = useState(initialValue?.connected ?? false); + const [sessionKey, setSessionKey] = useState(initialValue?.sessionKey ?? null); + + const sessionDetails = useMemo(() => { + if (!sessionKey) return null; + + return decodeSessionKey({ sessionKey }); + }, [sessionKey]); + + /** + * Handles changes to stream properties. This triggers a re-render when a stream property changes + * @param {StreamPropertyChangedEvent} event - The event containing the stream, changed property, new value, and old value. + */ + const handleStreamPropertyChanged = (event: StreamPropertyChangedEvent) => { + const { stream, changedProperty, newValue, oldValue } = event; + // Without a re-render during a stream change, we don't get visual indicators for a subscriber + // muting themselves or the initials being displayed. + setLastStreamUpdate({ stream, changedProperty, newValue, oldValue }); + }; + + // handle the disconnect from session and clean up of the session object + const handleSessionDisconnected = () => { + vonageVideoClient.current = null; + setConnected(false); + }; + + // function to set reconnecting status and to increase the number of reconnections the user has had + // this reconnection count can be then used in the UI to provide user feedback or for post-call analytics + const handleReconnecting = () => { + if (user) { + user.issues.reconnections += 1; + } + + setReconnecting(true); + }; + const handleReconnected = () => { + setReconnecting(false); + setSubscriptionError(null); + }; + + const handleArchiveStarted = (id: string) => { + setArchiveId(id); + + if (!archiveStartRequestedBySelfRef.current) { + return; + } + + setArchiveIdStartedBySelf(id); + archiveStartRequestedBySelfRef.current = false; + }; + + const handleArchiveStopped = () => { + setArchiveId(null); + setArchiveIdStartedBySelf(null); + archiveStartRequestedBySelfRef.current = false; + }; + + const handleSubscriberVideoElementCreated = (subscriberWrapper: SubscriberWrapper) => { + setSubscriberWrappers((previousSubscriberWrappers) => + [ + subscriberWrapper, + ...previousSubscriberWrappers.filter(({ id }) => id !== subscriberWrapper.id), + ].toSorted(sortByDisplayPriority(activeSpeakerIdRef.current)) + ); + }; + + const handleLocalCaptionReceived = (event: LocalCaptionReceived) => { + setOwnCaptions(event.caption); + }; + + const handleSubscriberDestroyed = async (streamId: string) => { + await wait(500); + + const doesStreamStillExistInSession = (() => { + if (!vonageVideoClient.current) { + return false; + } + + return vonageVideoClient.current.hasStream(streamId); + })(); + + console.warn(`Subscriber with stream ID ${streamId} destroyed`, { + doesStreamStillExistInSession, + }); + + if (doesStreamStillExistInSession) { + void vonageVideoClient.current!.resubscribeToStreamId(streamId); + console.warn(`Subscriber with stream ID ${streamId} resubscribing`); + return; + } + destroySubscriber(streamId); + }; + + function destroySubscriber(streamId: string) { + activeSpeakerTracker.current.onSubscriberDestroyed(streamId); + const isNotDestroyedStreamId = ({ id }: { id: string }) => streamId !== id; + setSubscriberWrappers((prevSubscriberWrappers) => + prevSubscriberWrappers.filter(isNotDestroyedStreamId) + ); + console.warn(`Subscriber stream ID ${streamId} destroyed and cleaned up`); + } + + const handleSubscriberAudioLevelUpdated = ({ + movingAvg, + subscriberId, + }: SubscriberAudioLevelUpdatedEvent) => { + activeSpeakerTracker.current.onSubscriberAudioLevelUpdated({ subscriberId, movingAvg }); + }; + + const handleSubscriptionError = useCallback( + (error: unknown) => { + const isBrowserOnline = (() => { + if (typeof navigator === 'undefined') return true; + return navigator.onLine; + })(); + + if (reconnecting || isBrowserOnline === false) { + frontendLogger.log('Session: ignoring subscription error during reconnection/offline', { + reconnecting, + isBrowserOnline, + }); + return; + } + + setSubscriptionError( + error instanceof Error ? error : new Error('Unknown subscription error') + ); + }, + [reconnecting] + ); + + /** + * Connects to the session using the provided credentials. + * @param {Credential} credential - The sessionKey and token for the session. + * @returns {Promise} A promise that resolves when the session is connected. + */ + const connect = useCallback(async (credential: Credential) => { + if (vonageVideoClient.current) { + return; + } + try { + vonageVideoClient.current = new VonageVideoClient(credential); + vonageVideoClient.current.on('streamPropertyChanged', handleStreamPropertyChanged); + vonageVideoClient.current.on('sessionReconnecting', handleReconnecting); + vonageVideoClient.current.on('sessionReconnected', handleReconnected); + vonageVideoClient.current.on('sessionDisconnected', handleSessionDisconnected); + vonageVideoClient.current.on('archiveStarted', handleArchiveStarted); + vonageVideoClient.current.on('archiveStopped', handleArchiveStopped); + vonageVideoClient.current.on('signal:chat', handleChatSignal); + vonageVideoClient.current.on('signal:emoji', handleEmoji); + vonageVideoClient.current.on( + 'subscriberAudioLevelUpdated', + handleSubscriberAudioLevelUpdated + ); + vonageVideoClient.current.on( + 'subscriberVideoElementCreated', + handleSubscriberVideoElementCreated + ); + vonageVideoClient.current.on('subscriberDestroyed', handleSubscriberDestroyed); + vonageVideoClient.current.on('localCaptionReceived', handleLocalCaptionReceived); + vonageVideoClient.current.on('subscriptionError', handleSubscriptionError); + + await vonageVideoClient.current.connect(); + setConnected(true); + } catch (err: unknown) { + console.error(err); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + /** + * Joins a room by fetching an ephemeral token for the given sessionKey and connecting. + * @param {object} params - The join parameters. + * @param {string} params.sessionKey - The session key to join. + */ + const joinRoom = useCallback( + async (args: { sessionKey: string }) => { + const session = await videoClient.joinSession({ + sessionKey: args.sessionKey, + }); + + setSessionKey(args.sessionKey); + if (!skipBrowserUrlUpdate) { + window.history.replaceState(null, '', `/room/${args.sessionKey}`); + } + + return connect({ + sessionKey: args.sessionKey, + token: session.token, + }); + }, + [connect, videoClient, skipBrowserUrlUpdate] + ); + + /** + * Disconnects from the current session and cleans up session-related resources. + */ + const disconnect = useCallback(() => { + if (vonageVideoClient.current) { + vonageVideoClient.current.disconnect(); + vonageVideoClient.current = null; + + setConnected(false); + } + }, []); + + /** + * Force mutes a participant. + * @param {Stream} stream - The stream that is going to be muted. + */ + const forceMute = useCallback(async (stream: Stream) => { + if (vonageVideoClient.current) { + await vonageVideoClient.current.forceMuteStream(stream); + } + }, []); + + /** + * Publishes a stream to the session. + * @param {Publisher} publisher - The publisher object representing the stream to be published. + * @returns {Promise} A promise that resolves when the stream is successfully published. + */ + const publish = useCallback(async (publisher: Publisher): Promise => { + if (!vonageVideoClient.current) { + return; + } + await vonageVideoClient.current.publish(publisher); + }, []); + + /** + * Unpublishes a stream from the session. + * @param {Publisher} publisher - The publisher object representing the stream to be unpublished. + */ + const unpublish = useCallback( + (publisher: Publisher) => { + if (vonageVideoClient.current) { + vonageVideoClient.current.unpublish(publisher); + } + }, + [vonageVideoClient] + ); + + const value = useMemo( + () => ({ + activeSpeakerId, + archiveId, + archiveIdStartedBySelf, + markArchiveStartRequestedBySelf, + resetArchiveStartRequestedBySelf, + vonageVideoClient: vonageVideoClient.current, + disconnect, + joinRoom, + forceMute, + connected, + sessionKey, + sessionDetails, + unreadCount, + messages, + sendChatMessage, + reconnecting, + subscriberWrappers, + layoutMode, + recordingAlreadyNotified, + setRecordingAlreadyNotified, + setLayoutMode, + rightPanelActiveTab, + toggleParticipantList, + toggleBackgroundEffects, + toggleChat, + closeRightPanel, + toggleReportIssue, + pinSubscriber, + isMaxPinned, + ownCaptions, + sendEmoji, + emojiQueue, + publish, + unpublish, + lastStreamUpdate, + subscriptionError, + }), + [ + activeSpeakerId, + archiveId, + archiveIdStartedBySelf, + markArchiveStartRequestedBySelf, + resetArchiveStartRequestedBySelf, + setRecordingAlreadyNotified, + recordingAlreadyNotified, + vonageVideoClient, + disconnect, + unreadCount, + messages, + sendChatMessage, + joinRoom, + forceMute, + connected, + sessionKey, + sessionDetails, + reconnecting, + subscriberWrappers, + layoutMode, + setLayoutMode, + rightPanelActiveTab, + toggleParticipantList, + toggleBackgroundEffects, + toggleChat, + closeRightPanel, + toggleReportIssue, + pinSubscriber, + isMaxPinned, + ownCaptions, + sendEmoji, + emojiQueue, + publish, + unpublish, + lastStreamUpdate, + subscriptionError, + ] + ); + + return {children}; +}; +export default SessionProvider; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/tests/RoomContext.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/tests/RoomContext.spec.tsx new file mode 100644 index 00000000..fcd98721 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/tests/RoomContext.spec.tsx @@ -0,0 +1,117 @@ +import { render as renderBase, screen } from '@testing-library/react'; +import type { MediaDeviceInfoJSON } from '@web/types'; +import { Route, Routes } from 'react-router-dom'; +import MemoryRouter from '@test/RouterWrapper'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import { act, ReactElement } from 'react'; +import { nativeDevices } from '@utils/mockData/device'; +import composeProviders from '@web/helpers/composeProviders'; +import SuspenseBoundary from '@web/components/SuspenseBoundary/SuspenseBoundary'; +import { makeTestProvider, ProviderOptions, providers } from '@test/providers'; +import useUserContext from '@hooks/useUserContext'; + +const fakeName = 'Tommy Traddles'; + +describe('RoomContext', () => { + const nativeMediaDevices = global.navigator.mediaDevices; + + beforeEach(() => { + Object.defineProperty(global.navigator, 'mediaDevices', { + writable: true, + value: { + enumerateDevices: vi.fn( + () => + new Promise((res) => { + res(nativeDevices); + }) + ), + addEventListener: vi.fn(() => []), + removeEventListener: vi.fn(() => []), + }, + }); + }); + + afterEach(() => { + Object.defineProperty(global.navigator, 'mediaDevices', { + writable: true, + value: nativeMediaDevices, + }); + }); + + it('renders content', async () => { + const TestComponent = () =>
        Test Component
        ; + + await render( + + + + } /> + + + + ); + + expect(screen.getByTestId('test-component')).toBeInTheDocument(); + }); + + it('provides context values to child components', async () => { + const TestComponent = () => { + const { user } = useUserContext(); + + return ( +
        +
        {user.defaultSettings.name}
        +
        + ); + }; + + await render( + + + + } /> + + + + ); + + expect(screen.getByTestId('user-name').textContent).toBe(fakeName); + }); +}); + +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; +}; + +async function render(ui: ReactElement, { userContext }: RenderOptions = {}) { + const { wrapper: MainWrapper, ...context } = makeTestProvider([providers.user], { + userContext: { + value: { + ...userContext?.value, + defaultSettings: { + publishAudio: true, + publishVideo: true, + name: fakeName, + noiseSuppression: false, + publishCaptions: true, + ...userContext?.value?.defaultSettings, + }, + }, + ...userContext, + }, + }); + + const wrapper = composeProviders(SuspenseBoundary, MainWrapper); + + let result: ReturnType; + + await act(() => { + result = renderBase(ui, { wrapper }); + return Promise.resolve(); + }); + + return { + ...context, + ...result!, + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/tests/user.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/tests/user.spec.tsx new file mode 100644 index 00000000..dd20e2b0 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/tests/user.spec.tsx @@ -0,0 +1,74 @@ +import { describe, it, expect } from 'vitest'; +import { act, render, renderHook } from '@testing-library/react'; +import { ReactNode } from 'react'; +import UserProvider, { UserType } from '../user'; +import useUserContext from '../../hooks/useUserContext'; + +const TestComponent = () => { + const { user, setUser } = useUserContext(); + const setUserClickHandler = () => { + if (setUser) { + setUser((prevUserSettings: UserType) => ({ + ...prevUserSettings, + defaultSettings: { + ...prevUserSettings.defaultSettings, + name: 'XXXX', + }, + })); + } + }; + + return ( +
        + {user.defaultSettings.name} + +
        + ); +}; + +describe('UserContext', () => { + it('should be initialized with default values', () => { + const wrapper = ({ children }: { children: ReactNode }) => ( + {children} + ); + const expectedUser = { + defaultSettings: { + publishAudio: true, + publishVideo: true, + name: '', + backgroundFilter: undefined, + noiseSuppression: false, + publishCaptions: true, + }, + issues: { + reconnections: 0, + audioFallbacks: 0, + }, + }; + + const { result } = renderHook(() => useUserContext(), { wrapper }); + const { user, setUser } = result.current; + + expect(user).toEqual(expectedUser); + expect(typeof setUser).toBe('function'); + }); + + it('should be able to update the user', () => { + const { getByTestId } = render( + + + + ); + + // Username can be in localStorage, otherwise it's a UUID with shape User-utcDateTime. + expect(getByTestId('username')).not.toBe('XXXX'); + + act(() => { + getByTestId('update-username').click(); + }); + + expect(getByTestId('username')).toHaveTextContent('XXXX'); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/user.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/user.tsx new file mode 100644 index 00000000..5db6f2d0 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/Context/user.tsx @@ -0,0 +1,86 @@ +import { + createContext, + useState, + useMemo, + ReactNode, + SetStateAction, + Dispatch, + ReactElement, +} from 'react'; +import { VideoFilter } from '@vonage/client-sdk-video'; +import { getStorageItem, STORAGE_KEYS } from '../utils/storage'; +import { parseVideoFilter } from '../utils/util'; +import type { DeepPartial } from '@common/types'; + +// Define the shape of the User context +export type UserContextType = { + setUser: Dispatch>; // Function to update the user state + user: UserType; // The current user state +}; + +// Define the structure of the User object +export type UserType = { + defaultSettings: { + publishAudio: boolean; // Whether the user is publishing audio + publishVideo: boolean; // Whether the user is publishing video + name: string; // The user's name + noiseSuppression: boolean; // Whether noise suppression is enabled + publishCaptions: boolean; // Whether captions are published + backgroundFilter?: VideoFilter; // The background replacement filter applied to the video + }; + issues: { + reconnections: number; // The number of reconnections the user has experienced + audioFallbacks: number; // The number of times the user's audio has fallen back to a different input + }; + initials?: string; // The user's initials (optional) +}; + +// Create the User context with an initial value of null +export const UserContext = createContext(null); + +export type UserProviderProps = { + children: ReactNode; + value?: DeepPartial; +}; + +/** + * UserProvider component to wrap the application and provide the User preferences to be used by the publisher. + * @param {UserProviderProps} props - The props for the context. + * @returns {ReactElement} a context provider for the User. + */ +const UserProvider = ({ children, value: initialUserState }: UserProviderProps): ReactElement => { + // Load initial settings from local storage + const noiseSuppression = getStorageItem(STORAGE_KEYS.NOISE_SUPPRESSION) === 'true'; + const backgroundFilter = parseVideoFilter(getStorageItem(STORAGE_KEYS.BACKGROUND_REPLACEMENT)); + const name = getStorageItem(STORAGE_KEYS.USERNAME) ?? ''; + + const [user, setUser] = useState(() => ({ + defaultSettings: { + publishAudio: true, + publishVideo: true, + name, + backgroundFilter, + noiseSuppression, + publishCaptions: true, + ...initialUserState?.defaultSettings, + }, + issues: { + reconnections: 0, // Start with zero reconnections + audioFallbacks: 0, // Start with zero audio fallbacks + ...initialUserState?.issues, + }, + })); + + const value = useMemo( + () => ({ + user, + setUser, + }), + [user] + ); + + // Provide the User context to child components + return {children}; +}; + +export default UserProvider; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/VeraRoom.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/VeraRoom.spec.tsx new file mode 100644 index 00000000..2c37c887 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/VeraRoom.spec.tsx @@ -0,0 +1,52 @@ +import '@web-test/environment/helpers/setupMuiMaterialStylesMock'; + +import { render, screen } from '@testing-library/react'; +import { describe, it, expect, beforeEach } from 'vitest'; +import bridge$ from './stores/bridge'; +import { runtime$ } from '@core/stores'; +import VeraRoom from './VeraRoom'; +import { setupWindowNavigatorMock } from '@web-test/fixtures'; + +const renderWithBridge = (ui: React.ReactElement) => + render( + + {ui} + + ); + +beforeEach(() => { + setupWindowNavigatorMock({ + permissions: { + query: Promise.resolve({ + state: 'granted', + addEventListener: () => {}, + } as unknown as PermissionStatus), + }, + }); +}); + +describe('VeraRoom', () => { + it('renders correctly', () => { + renderWithBridge(); + + const veraRoom = screen.getByTestId('vera-room'); + expect(veraRoom).toBeInTheDocument(); + expect(veraRoom).toHaveClass('VeraRoom'); + }); + + it('applies custom className', () => { + // eslint-disable-next-line tailwindcss/no-custom-classname + renderWithBridge(); + + const veraRoom = screen.getByTestId('vera-room'); + expect(veraRoom).toHaveClass('VeraRoom'); + expect(veraRoom).toHaveClass('custom-class'); + }); + + it('passes additional props to the container', () => { + renderWithBridge(); + + const veraRoom = screen.getByTestId('vera-room'); + expect(veraRoom).toHaveAttribute('id', 'test-id'); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/VeraRoom.stories.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/VeraRoom.stories.tsx new file mode 100644 index 00000000..b36f20a5 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/VeraRoom.stories.tsx @@ -0,0 +1,121 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { ComponentProps, memo, PropsWithChildren, useEffect, useRef, forwardRef } from 'react'; + +import '../i18n'; +import './VeraRoomElement'; +import { BridgeAttribute } from './stores/bridge'; +import { env } from '../env'; + +const entryPoint = `${env.API_URL}/v2`; + +type VeraRoomProps = PropsWithChildren< + { + sessionIdentifier: string; + entryPoint: string; + language: string; + } & ComponentProps<'div'> +>; + +const meta: Meta = { + title: 'VeraRoom/VeraRoomElement', + parameters: { + layout: 'fullscreen', + }, + argTypes: { + sessionIdentifier: { + control: 'text', + description: 'Session identifier to join or create', + defaultValue: 'test-123', + }, + entryPoint: { + control: 'text', + description: 'Entry point identifier for logging and tracking', + defaultValue: entryPoint, + }, + language: { + control: 'text', + description: 'BCP-47 language tag (e.g., en, es, it)', + defaultValue: 'en', + }, + }, +}; + +type Story = StoryObj; + +const StableVeraRoom = memo( + forwardRef((props, ref) => { + return ( + + ); + }), + () => true +); + +/** + * Component that renders vera-room and updates attributes imperatively + * without re-renders when props change + */ +function VeraRoomWrapper({ sessionIdentifier, entryPoint, language }: VeraRoomProps) { + const ref = useRef(null); + + // update the html attributes without re-rendering to emulate a vanilla JS environment. + useUpdateHTMLAttribute('session-identifier', sessionIdentifier, ref); + useUpdateHTMLAttribute('entry-point', entryPoint, ref); + useUpdateHTMLAttribute('language', language, ref); + + return ( + + ); +} + +export const Default: Story = { + args: { + sessionIdentifier: 'test-123', + entryPoint: entryPoint, + language: 'en', + }, + render: VeraRoomWrapper, +}; + +export const SpanishLanguage: Story = { + args: { + sessionIdentifier: 'test-spanish-session', + entryPoint: entryPoint, + language: 'es', + }, + render: VeraRoomWrapper, +}; + +export const CustomSession: Story = { + args: { + sessionIdentifier: 'custom-demo-session', + entryPoint: entryPoint, + language: 'en', + }, + render: VeraRoomWrapper, +}; + +function useUpdateHTMLAttribute( + key: BridgeAttribute, + value: string, + customHtmlRef: React.RefObject +) { + useEffect(() => { + if (!customHtmlRef.current) return; + + customHtmlRef.current.setAttribute(key, value); + }, [key, value, customHtmlRef]); +} + +export default meta; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/VeraRoom.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/VeraRoom.tsx new file mode 100644 index 00000000..ed9f19be --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/VeraRoom.tsx @@ -0,0 +1,79 @@ +import { useMemo, useRef, type ComponentProps, type FC } from 'react'; +import { MemoryRouter, Routes, Route } from 'react-router-dom'; +import AppContextProvider from '../AppContextProvider'; +import RoomProvider from '@Context/RoomProvider'; +import bridge$ from './stores/bridge'; +import WaitingRoomStage from './stages/WaitingRoomStage'; +import MeetingRoomStage from './stages/MeetingRoomStage'; +import GoodByeStage from './stages/GoodByeStage'; +import useStateSynchronizer from './hooks/useStateSynchronizer'; +import { useMountEffect } from '@web/hooks'; + +type BridgeProps = { + /** Identifier passed in from the `entry-point` HTML attribute. */ + entryPoint?: string; + /** + * Room name to join, passed in from the `session-identifier` HTML attribute. + * If provided, the initial view will be the waiting room for that room. + */ + sessionIdentifier?: string; + /** + * BCP-47 language tag passed in from the `language` HTML attribute. + * Overrides the browser's detected language. + * Example: 'es', 'it', 'en' + */ + language?: string; +}; + +type VeraRoomProps = ComponentProps<'div'> & BridgeProps; + +/** + * VeraRoom + * + * Root React component for the custom element. + * Manages the 3-stage embed flow (waiting room → meeting room → goodbye) + * through a MemoryRouter so navigation is fully isolated from the host page. + * + * Props are supplied by VeraRoomElement on every attribute change; React + * reconciliation ensures that only what changed actually re-renders. + */ +const VeraRoom: FC = ({ className, ...props }) => { + useStateSynchronizer(); + + const container = useMemo(() => { + return globalThis.document.createElement('div'); + }, []); + + const mainContainer = useRef(null); + + const sessionIdentifier = bridge$.use.select((state) => state.sessionIdentifier); + const initialEntry = sessionIdentifier ? `/waiting-room/${sessionIdentifier}` : '/waiting-room'; + + useMountEffect(() => { + mainContainer.current?.appendChild(container); + }); + + return ( + +
        + + + + } /> + {/* Fallback route when no session-identifier attribute is set */} + } /> + } /> + } /> + + + +
        +
        + ); +}; + +export default VeraRoom; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/VeraRoomElement.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/VeraRoomElement.spec.tsx new file mode 100644 index 00000000..4c848048 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/VeraRoomElement.spec.tsx @@ -0,0 +1,132 @@ +import '@web-test/environment/helpers/setupMuiMaterialStylesMock'; + +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { setupWindowNavigatorMock } from '@web-test/fixtures'; +import VeraRoomElement from './VeraRoomElement'; + +// Mock CSSStyleSheet since JSDOM doesn't support replaceSync +class MockCSSStyleSheet { + replaceSync = vi.fn(); +} + +beforeEach(() => { + vi.stubGlobal('CSSStyleSheet', MockCSSStyleSheet); + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + enumerateDevices: Promise.resolve([]), + }, + permissions: { + query: Promise.resolve({ + state: 'granted', + } as unknown as PermissionStatus), + }, + }); +}); + +describe('VeraRoomElement', () => { + it('is registered as a custom element', () => { + expect(customElements.get('vera-room')).toBeDefined(); + }); + + it('has correct tag name', () => { + expect(VeraRoomElement.tagName).toBe('vera-room'); + }); + + it('creates a shadow root when appended to DOM', () => { + const element = document.createElement('vera-room'); + document.body.appendChild(element); + expect(element.shadowRoot).not.toBeNull(); + element.remove(); + }); + + it('has mode open for shadow root', () => { + const element = document.createElement('vera-room'); + document.body.appendChild(element); + expect(element.shadowRoot?.mode).toBe('open'); + element.remove(); + }); + + it('contains a mount div inside shadow root', () => { + const element = document.createElement('vera-room'); + document.body.appendChild(element); + const mountDiv = element.shadowRoot?.querySelector('.vera-room-root'); + expect(mountDiv).not.toBeNull(); + element.remove(); + }); +}); + +it('does nothing when newValue is null (null-string bug guard)', async () => { + // This is the regression case: previously a null newValue could be coerced to the + // string "null" by String(value) in tryParseAttribute, corrupting the bridge state. + const element = new VeraRoomElement(); + document.body.appendChild(element); + + await element.isBridgeReady.promise; + + const partialUpdateSpy = vi.fn(); + element.context!.current.actions.partialUpdate = partialUpdateSpy; + + await element.attributeChangedCallback('session-identifier', 'old-room', null); + expect(partialUpdateSpy).not.toHaveBeenCalled(); + + element.remove(); +}); + +it('does nothing for an unrecognised attribute name', async () => { + const element = new VeraRoomElement(); + document.body.appendChild(element); + + await element.isBridgeReady.promise; + + const partialUpdateSpy = vi.fn(); + element.context!.current.actions.partialUpdate = partialUpdateSpy; + + await element.attributeChangedCallback('data-unknown', null, 'some-value'); + expect(partialUpdateSpy).not.toHaveBeenCalled(); + + element.remove(); +}); + +it('calls partialUpdate with parsed value when attribute changes to a new string', async () => { + const element = new VeraRoomElement(); + document.body.appendChild(element); + + // Wait for isBridgeReady to resolve so context is wired up + await element.isBridgeReady.promise; + + const partialUpdateSpy = vi.fn(); + element.context!.current.actions.partialUpdate = partialUpdateSpy; + + await element.attributeChangedCallback('session-identifier', null, 'new-room'); + expect(partialUpdateSpy).toHaveBeenCalledWith({ sessionIdentifier: 'new-room' }); + + element.remove(); +}); + +it('waits for isBridgeReady before dispatching when bridge is not yet ready', async () => { + // Create but do NOT append to DOM so renderReactTree / bridge never runs + const element = new VeraRoomElement(); + + // Spy by replacing isBridgeReady with a promise that we resolve manually + const { defer } = await import('easy-cancelable-promise'); + const manualDefer = defer(); + // Mark as pending before we resolve + element.isBridgeReady = manualDefer; + + const partialUpdateSpy = vi.fn(); + // Wire up a fake context so we can observe the call + element.context = { + current: { actions: { partialUpdate: partialUpdateSpy }, getState: vi.fn() }, + } as never; + + const callbackPromise = element.attributeChangedCallback('language', null, 'es'); + + // partialUpdate must not have been called yet (bridge not ready) + expect(partialUpdateSpy).not.toHaveBeenCalled(); + + manualDefer.resolve(); + await callbackPromise; + + expect(partialUpdateSpy).toHaveBeenCalledWith({ language: 'es' }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/VeraRoomElement.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/VeraRoomElement.tsx new file mode 100644 index 00000000..91fbc44d --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/VeraRoomElement.tsx @@ -0,0 +1,157 @@ +import ReactDOM from 'react-dom/client'; +import VeraRoom from './VeraRoom'; +import bridge$, { + type BridgeAttribute, + isBridgeAttribute, + bridgeAttributesMap, + bridgeAttributes, + initialState, +} from './stores/bridge'; +import { runtime$ } from '@core/stores'; +import type { Any, KebabToCamel } from '@common/types'; +import { ShadowStylesProvider } from './providers'; +import veraStyles from './styles.css?inline'; +import { defer } from 'easy-cancelable-promise'; +import { BridgeAPI } from './stores/bridge/types'; +import { registerIcon } from '@vonage/vivid'; + +type BridgeState = ReturnType; +type BridgeContext = ReturnType['context']; + +registerIcon(); + +class VeraRoomElement extends HTMLElement { + static tagName = 'vera-room'; + + // React root and shadow + shadow: ShadowRoot; + mount: HTMLDivElement; + root?: ReactDOM.Root; + context?: BridgeContext; + isBridgeReady = defer(); + + constructor() { + super(); + + // will use shadow to have isolated css that will not collisions with the target webpage + this.shadow = this.attachShadow({ mode: 'open' }); + + this.mount = document.createElement('div'); + this.mount.classList.add('vera-room-root'); + + // Use adoptedStyleSheets for Tailwind CSS (processed by Vite) + const tailwindSheet = new CSSStyleSheet(); + tailwindSheet.replaceSync(veraStyles); + this.shadow.adoptedStyleSheets = [tailwindSheet]; + + // Additional host-level styles + const hostStyle = document.createElement('style'); + hostStyle.textContent = ` +:host { + display: block; + position: relative; + width: 100%; + height: 100%; +} + +.vera-room-root { + width: 100%; + height: 100%; + overflow: auto; +} + +:host, .vera-room-root { + min-height: 0; +}`; + + this.shadow.appendChild(hostStyle); + this.shadow.appendChild(this.mount); + } + + connectedCallback() { + if (!this.root) { + this.renderReactTree(); + } + } + + renderReactTree() { + const { wrapper: BridgeProvider, context } = bridge$.Provider.makeProviderWrapper({ + onCreated: () => { + this.isBridgeReady.resolve(); + }, + }); + + this.context = context; + this.root = ReactDOM.createRoot(this.mount); + + const initialState = this.readInitialAttributes(); + + this.root?.render( + + + + + + + + ); + } + + readInitialAttributes() { + const initialValue = bridgeAttributes.reduce((acc, name) => { + const rawValue = this.getAttribute(name); + if (rawValue === null) return acc; + + const value = VeraRoomElement.tryParseAttribute(name, rawValue); + + return { ...acc, ...value }; + }, initialState()) as BridgeState; + + return initialValue; + } + + disconnectedCallback() { + this.root?.unmount(); + this.root = undefined; + } + + static get observedAttributes() { + return bridgeAttributes; + } + + async attributeChangedCallback(name: string, oldValue: unknown, newValue: unknown) { + if (oldValue === newValue || !isBridgeAttribute(name)) return; + if (newValue === null) return; + + const updates = VeraRoomElement.tryParseAttribute(name, newValue); + + if (this.isBridgeReady.isPending()) { + await this.isBridgeReady.promise; + } + + this.context?.current.actions.partialUpdate(updates); + } + + static tryParseAttribute( + name: T, + value: unknown + ): { [K in KebabToCamel]: Any } { + const meta = bridgeAttributesMap[name]; + + const parsed = (() => { + switch (meta.type) { + case 'string': + return String(value); + default: + throw new Error(`Unsupported attribute type for "${name}"`); + } + })(); + + return { [meta.name]: parsed } as { [K in KebabToCamel]: Any }; + } +} + +// Define the custom element +customElements.define(VeraRoomElement.tagName, VeraRoomElement); + +export default VeraRoomElement; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/example/Example.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/example/Example.spec.tsx new file mode 100644 index 00000000..9711d40e --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/example/Example.spec.tsx @@ -0,0 +1,33 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import Example from './Example'; + +describe('Example', () => { + it('renders the header', () => { + render(); + + expect(screen.getByRole('heading', { level: 1 })).toHaveTextContent('Vera Room'); + expect(screen.getByText('Embeddable Video Conferencing Web Component')).toBeInTheDocument(); + }); + + it('renders the Live Example section', () => { + render(); + + expect(screen.getByRole('heading', { name: 'Live Example' })).toBeInTheDocument(); + }); + + it('renders the Usage section', () => { + render(); + + expect(screen.getByRole('heading', { name: 'Usage' })).toBeInTheDocument(); + expect( + screen.getByText('Add the script to your page and use the custom element:') + ).toBeInTheDocument(); + }); + + it('renders the Styling the Container section', () => { + render(); + + expect(screen.getByRole('heading', { name: 'Styling the Container' })).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/example/Example.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/example/Example.tsx new file mode 100644 index 00000000..241bec2b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/example/Example.tsx @@ -0,0 +1,97 @@ +import React from 'react'; +import { env } from '../../env'; + +const Example = () => { + return ( +
        +
        +

        Vera Room

        +

        + Embeddable Video Conferencing Web Component +

        +
        + +
        +
        +

        Live Example

        +

        + The component below is a fully functional video room embedded using the{' '} + <vera-room> custom element. +

        +
        + +
        +
        + +
        +

        Usage

        +

        + Add the script to your page and use the custom element: +

        + + + {``} + {'\n'} + <script{' '} + src= + "room.js" + ></script> + {'\n\n'} + {``} + {'\n'} + <vera-room></vera-room> + + +
        + +
        +

        + Styling the Container +

        +

        + The component fills its container. Set dimensions on the parent or the element itself: +

        + + + <style> + {'\n'} + {' vera-room {\n'} + {' width: 100%;\n'} + {' height: 600px;\n'} + {' }\n'} + </style> + {'\n\n'} + <div{' '} + class= + "video-container" + > + {'\n'} + {' '} + <vera-room></vera-room> + {'\n'} + </div> + + +
        +
        +
        + ); +}; + +function CodeBlock({ children }: { children: React.ReactNode }) { + return ( +
        +
        {children}
        +
        + ); +} + +export default Example; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/example/index.css b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/example/index.css new file mode 100644 index 00000000..509eea58 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/example/index.css @@ -0,0 +1,3 @@ +@import 'tailwindcss'; + +@config '../../../tailwind.config.cjs'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/example/index.html b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/example/index.html new file mode 100644 index 00000000..cdb1a733 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/example/index.html @@ -0,0 +1,17 @@ + + + + + + + Vera Room - Example + + +
        + + + + diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/example/main.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/example/main.tsx new file mode 100644 index 00000000..46cf6bb4 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/example/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import Example from './Example'; +import './index.css'; + +createRoot(document.getElementById('root')!).render( + + + +); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/example/vite.example.config.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/example/vite.example.config.ts new file mode 100644 index 00000000..80a74d7b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/example/vite.example.config.ts @@ -0,0 +1,37 @@ +import { defineConfig, mergeConfig } from 'vite'; +import baseConfigFn from '../../../vite.config'; +import * as path from 'node:path'; +import * as fs from 'node:fs'; + +// Plugin to rename index.html to example.html +function renameOutputHtml() { + return { + name: 'rename-output-html', + writeBundle() { + const outDir = path.resolve(__dirname, '../../../distRoom'); + const indexPath = path.resolve(outDir, 'index.html'); + const examplePath = path.resolve(outDir, 'example.html'); + + if (fs.existsSync(indexPath)) { + fs.renameSync(indexPath, examplePath); + } + }, + }; +} + +export default defineConfig((env) => { + const baseConfig = baseConfigFn(env); + + return mergeConfig(baseConfig, { + root: __dirname, + base: './', + plugins: [renameOutputHtml()], + build: { + outDir: path.resolve(__dirname, '../../../distRoom'), + emptyOutDir: false, // Don't clear - room.js should already be there + rollupOptions: { + input: path.resolve(__dirname, './index.html'), + }, + }, + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/hooks/useStateSynchronizer.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/hooks/useStateSynchronizer.ts new file mode 100644 index 00000000..6d658aee --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/hooks/useStateSynchronizer.ts @@ -0,0 +1,52 @@ +import { createVideoClient } from '@core/services'; +import i18n from '../../i18n'; +import bridge$ from '../stores/bridge'; +import { runtime$ } from '@core/stores'; +import { useMountEffect } from '@web/hooks'; + +/** + * Syncs the html element with the internal react state + */ +const useStateSynchronizer = () => { + const bridge = bridge$.use.api(); + const runtime = runtime$.use.api(); + const { setLanguage } = runtime$.use.actions(); + + useMountEffect(() => { + const subscriptions = [ + // language changes from the bridge should update i18n and the runtime store + bridge.subscribe( + ({ language }) => language, + (language) => { + void i18n.changeLanguage(language); + setLanguage(language); + }, + { + skipFirst: true, + } + ), + + // clientUrl changes from the bridge should update the video client in the runtime store + bridge.subscribe( + ({ entryPoint }) => entryPoint, + (entryPoint) => { + runtime.setState((state) => ({ + ...state, + videoClient: createVideoClient({ + url: entryPoint, + }), + })); + }, + { + skipFirst: true, + } + ), + ]; + + return () => { + subscriptions.forEach((unsubscribe) => unsubscribe()); + }; + }); +}; + +export default useStateSynchronizer; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/index.ts new file mode 100644 index 00000000..7a2f0840 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/index.ts @@ -0,0 +1,5 @@ +// runs interceptors before vonage sdk initialize resources (XHR, navigator.mediaDevices clones, etc) +import '@core/interceptors'; + +import '../i18n'; +import './VeraRoomElement'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/providers/ShadowStylesProvider.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/providers/ShadowStylesProvider.tsx new file mode 100644 index 00000000..2e972171 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/providers/ShadowStylesProvider.tsx @@ -0,0 +1,51 @@ +import type { FC, PropsWithChildren } from 'react'; +import { useMemo } from 'react'; +import createCache from '@emotion/cache'; +import { CacheProvider } from '@emotion/react'; + +type ShadowStylesProviderProps = PropsWithChildren<{ + shadowRoot: ShadowRoot; +}>; + +/** + * ⚠️ Architectural Warning + * + * MUI + Emotion is fundamentally misaligned with this project and this widget. + * + * This widget is: + * - Shadow DOM–based + * - Distributed as an embeddable bundle + * - Expected to be lightweight, isolated, and platform-agnostic + * + * MUI was designed around global DOM assumptions (document.head injection), + * runtime CSS generation, and React-specific styling patterns. + * + * In this environment, that results in: + * - Custom style injection workarounds + * - Manual portal container management + * - Runtime style serialization and hashing overhead + * - Increased bundle size + * - Tight coupling to React + Emotion + * + * Every additional use of MUI here increases architectural friction + * and long-term maintenance cost. + * + * Do not introduce new MUI usage in this module. + */ +const ShadowStylesProvider: FC = ({ shadowRoot, children }) => { + const emotionCache = useMemo(() => { + const container = document.createElement('div'); + container.setAttribute('data-emotion-container', 'vera'); + shadowRoot.prepend(container); + + return createCache({ + key: 'vera', + container, + prepend: true, + }); + }, [shadowRoot]); + + return {children}; +}; + +export default ShadowStylesProvider; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/providers/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/providers/index.ts new file mode 100644 index 00000000..24e25b4d --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/providers/index.ts @@ -0,0 +1 @@ +export { default as ShadowStylesProvider } from './ShadowStylesProvider'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/GoodByeStage/GoodByeStage.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/GoodByeStage/GoodByeStage.spec.tsx new file mode 100644 index 00000000..99e1964e --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/GoodByeStage/GoodByeStage.spec.tsx @@ -0,0 +1,106 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect, vi, beforeEach, type Mock } from 'vitest'; +import { MemoryRouter } from 'react-router-dom'; +import useGoodByePage from '@hooks/useGoodByePage'; +import GoodByeStage from './GoodByeStage'; + +vi.mock('@hooks/useGoodByePage'); + +vi.mock('@components/GoodBye/ArchiveList', () => ({ + default: ({ archives }: { archives: unknown[] | 'error' }) => ( +
        + ), +})); + +vi.mock('@components/GoodBye/GoodbyeMessage', () => ({ + default: ({ header, message }: { header: string; message: string }) => ( +
        + ), +})); + +vi.mock('@components/GoodBye/ReenterRoomButton', () => ({ + default: () =>
        , +})); + +vi.mock('@ui', async () => { + const actual = await vi.importActual('@ui'); + return { + ...actual, + Card: ({ children, className }: { children: React.ReactNode; className?: string }) => ( +
        {children}
        + ), + PageLayoutEmbed: Object.assign( + ({ children }: { children: React.ReactNode }) =>
        {children}
        , + { + Left: ({ children }: { children: React.ReactNode }) =>
        {children}
        , + Right: ({ children }: { children: React.ReactNode }) =>
        {children}
        , + } + ), + }; +}); + +const mockUseGoodByePage = useGoodByePage as Mock; + +describe('GoodByeStage', () => { + beforeEach(() => { + mockUseGoodByePage.mockReturnValue({ + sessionKey: 'test-session-key', + archives: [], + header: 'You have left the meeting', + caption: 'Thank you for joining!', + }); + }); + + it('renders the goodbye message with header and caption from the hook', () => { + renderStage(); + const message = screen.getByTestId('goodbye-message'); + expect(message).toHaveAttribute('data-header', 'You have left the meeting'); + expect(message).toHaveAttribute('data-message', 'Thank you for joining!'); + }); + + it('renders the ReenterRoomButton', () => { + renderStage(); + expect(screen.getByTestId('reenter-room-button')).toBeInTheDocument(); + }); + + it('renders the ArchiveList with archives from the hook', () => { + const archives = [{ id: 'archive-1', status: 'available' }]; + mockUseGoodByePage.mockReturnValue({ + sessionKey: 'test-session-key', + archives, + header: 'Gone', + caption: 'Bye', + }); + + renderStage(); + const archiveList = screen.getByTestId('archive-list'); + expect(archiveList).toHaveAttribute('data-value', JSON.stringify(archives)); + }); + + it('renders the ArchiveList with "error" when archives failed to load', () => { + mockUseGoodByePage.mockReturnValue({ + sessionKey: 'test-session-key', + archives: 'error', + header: 'Gone', + caption: 'Bye', + }); + + renderStage(); + const archiveList = screen.getByTestId('archive-list'); + expect(archiveList).toHaveAttribute('data-value', '"error"'); + }); + + it('renders the archive list label', () => { + renderStage(); + // The label is rendered from i18n key 'archiveList.label' which in test env falls back to the key + expect(screen.getByTestId('archive-list')).toBeInTheDocument(); + }); +}); + +function renderStage() { + render( + + + + ); +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/GoodByeStage/GoodByeStage.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/GoodByeStage/GoodByeStage.tsx new file mode 100644 index 00000000..4bd66f1d --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/GoodByeStage/GoodByeStage.tsx @@ -0,0 +1,49 @@ +import ArchiveList from '@components/GoodBye/ArchiveList'; +import GoodByeMessage from '@components/GoodBye/GoodbyeMessage'; +import ReenterRoomButton from '@components/GoodBye/ReenterRoomButton'; +import useGoodByePage from '@hooks/useGoodByePage'; +import { Card, PageLayoutEmbed } from '@ui'; +import type { FC } from 'react'; +import { useTranslation } from 'react-i18next'; + +/** + * GoodByeStage + * + * Embeddable version of the goodbye screen. Equivalent to GoodBye but without + * the Vera chrome (Banner, Footer) and without the GoToLandingPageButton since + * there is no landing page in the embed context. + * + * Re-enter the room button navigates back to /waiting-room/:roomName via + * the parent MemoryRouter in VeraRoom. + */ +const GoodByeStage: FC = () => { + const { t } = useTranslation(); + const { archives, header, caption } = useGoodByePage(); + + return ( + + + + + +
        + +

        + {t('goodBye.title')} +

        + +
        + + +

        + {t('archiveList.label')} +

        + +
        +
        +
        +
        + ); +}; + +export default GoodByeStage; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/GoodByeStage/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/GoodByeStage/index.ts new file mode 100644 index 00000000..15c55fe0 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/GoodByeStage/index.ts @@ -0,0 +1 @@ +export { default } from './GoodByeStage'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/MeetingRoomStage/MeetingRoomStage.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/MeetingRoomStage/MeetingRoomStage.spec.tsx new file mode 100644 index 00000000..0507388e --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/MeetingRoomStage/MeetingRoomStage.spec.tsx @@ -0,0 +1,62 @@ +import { render as renderBase, screen } from '@testing-library/react'; +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import type { ReactElement } from 'react'; +import MeetingRoomStage from './MeetingRoomStage'; +import { makeTestProvider, providers, type ProviderOptions } from '@test/providers'; +import { setupWindowNavigatorMock } from '@web-test/fixtures'; + +vi.mock('@vonage/client-sdk-video'); + +vi.mock('@pages/MeetingRoom', () => ({ + default: (props: Record) => ( +
        + ), +})); + +type RenderOptions = { + sessionContext?: ProviderOptions['SessionContext']; + userContext?: ProviderOptions['UserContext']; +}; + +function render(ui: ReactElement, { sessionContext, userContext }: RenderOptions = {}) { + const { wrapper, ...context } = makeTestProvider( + [providers.user, providers.session, providers.runtime], + + { + sessionContext, + userContext, + runtimeContext: undefined, + } + ); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} + +describe('MeetingRoomStage', () => { + beforeEach(() => { + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + enumerateDevices: Promise.resolve([]), + }, + }); + + vi.spyOn(globalThis.navigator.permissions, 'query').mockResolvedValue({ + state: 'granted', + } as PermissionStatus); + }); + + it('renders without crashing', () => { + render(); + expect(screen.getByTestId('meeting-room')).toBeInTheDocument(); + }); + + it('passes h-full w-full className to MeetingRoom', () => { + render(); + const meetingRoom = screen.getByTestId('meeting-room'); + expect(meetingRoom).toHaveAttribute('data-classname', 'h-full w-full'); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/MeetingRoomStage/MeetingRoomStage.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/MeetingRoomStage/MeetingRoomStage.tsx new file mode 100644 index 00000000..606d3693 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/MeetingRoomStage/MeetingRoomStage.tsx @@ -0,0 +1,19 @@ +import type { FC } from 'react'; +import SessionProvider from '@Context/SessionProvider/session'; +import { PublisherProvider } from '@Context/PublisherProvider'; +import MeetingRoom from '@pages/MeetingRoom'; + +/** + * MeetingRoomStage + * + * Embeddable version of the meeting room. Provides SessionProvider and PublisherProvider. + */ +const MeetingRoomStage: FC = () => ( + + + + + +); + +export default MeetingRoomStage; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/MeetingRoomStage/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/MeetingRoomStage/index.ts new file mode 100644 index 00000000..f3e7f42b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/MeetingRoomStage/index.ts @@ -0,0 +1 @@ +export { default } from './MeetingRoomStage'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/WaitingRoomStage/WaitingRoomStage.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/WaitingRoomStage/WaitingRoomStage.spec.tsx new file mode 100644 index 00000000..d325ceaf --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/WaitingRoomStage/WaitingRoomStage.spec.tsx @@ -0,0 +1,147 @@ +import { render as renderBase, screen } from '@testing-library/react'; +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import type { ReactElement } from 'react'; +import { MemoryRouter, Route, Routes } from 'react-router-dom'; +import bridge$ from '../../stores/bridge'; +import WaitingRoomStage from './WaitingRoomStage'; +import { makeTestProvider, providers, type ProviderOptions } from '@test/providers'; +import { DEVICE_ACCESS_STATUS } from '@utils/constants'; +import { env } from '../../../env'; + +vi.mock('@vonage/client-sdk-video'); +vi.mock('@utils/waitUntilPlaying/waitUntilPlaying', () => ({ default: () => Promise.resolve() })); + +vi.mock('@hooks/usePermissions', () => ({ + default: () => ({ + accessStatus: DEVICE_ACCESS_STATUS.ACCEPTED, + setAccessStatus: vi.fn(), + }), +})); + +vi.mock('@hooks/useBackgroundPublisherContext', () => ({ + default: () => ({ + initBackgroundLocalPublisher: vi.fn(), + publisher: null, + }), +})); + +vi.mock('@components/WaitingRoom/VideoContainer', () => ({ + default: () =>
        , +})); + +vi.mock('@components/WaitingRoom/VideoContainer/VideoContainer.skeleton', () => ({ + default: () =>
        , +})); + +vi.mock('@components/WaitingRoom/ControlPanel', () => ({ + default: () =>
        , +})); + +vi.mock('@components/WaitingRoom/UserNameInput', () => ({ + default: () =>
        , +})); + +vi.mock('@components/WaitingRoom/UserNameInput/UserNameInput.skeleton', () => ({ + default: () =>
        , +})); + +vi.mock('@components/DeviceAccessAlert', () => ({ + default: () =>
        , +})); + +vi.mock('@ui', async () => { + const actual = await vi.importActual('@ui'); + return { + ...actual, + PageLayoutEmbed: Object.assign( + ({ children }: { children: React.ReactNode }) =>
        {children}
        , + { + Left: ({ children }: { children: React.ReactNode }) =>
        {children}
        , + Right: ({ children }: { children: React.ReactNode }) =>
        {children}
        , + } + ), + }; +}); + +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; + initialRoute?: string; + sessionIdentifier?: string; +}; + +function SetBridgeState({ sessionIdentifier }: { sessionIdentifier?: string }) { + const actions = bridge$.use.actions(); + if (sessionIdentifier) { + actions.partialUpdate({ sessionIdentifier }); + } + return null; +} + +function render( + ui: ReactElement, + { + userContext, + initialRoute = '/waiting-room/my-room', + sessionIdentifier = 'my-room', + }: RenderOptions = {} +) { + const { wrapper: ProvidersWrapper, ...context } = makeTestProvider([providers.user], { + userContext, + }); + + return { + ...context, + ...renderBase( + + + + + + + + } /> + + + + + ), + }; +} + +describe('WaitingRoomStage', () => { + beforeEach(() => { + vi.clearAllMocks(); + env.WAITING_ROOM_ALLOW_DEVICE_SELECTION = true; + localStorage.setItem('videoSourceEnabled', 'false'); + }); + + afterEach(() => { + localStorage.clear(); + }); + + it('renders content when sessionIdentifier is set', () => { + render(, { sessionIdentifier: 'my-room' }); + expect(screen.getByTestId('video-container')).toBeInTheDocument(); + expect(screen.getByTestId('username-input')).toBeInTheDocument(); + expect(screen.getByTestId('control-panel')).toBeInTheDocument(); + }); + + it('renders skeletons when isRoomReady is false', () => { + localStorage.setItem('videoSourceEnabled', 'true'); + render(, { sessionIdentifier: 'my-room' }); + + expect(screen.getByTestId('video-container-skeleton')).toBeInTheDocument(); + expect(screen.getByTestId('username-input-skeleton')).toBeInTheDocument(); + expect(screen.queryByTestId('video-container')).not.toBeInTheDocument(); + }); + + it('shows config error message when no sessionIdentifier is set', () => { + render(, { initialRoute: '/waiting-room', sessionIdentifier: '' }); + expect(screen.getByText(/session-identifier/i)).toBeInTheDocument(); + }); + + it('renders content when bridge has a sessionIdentifier', () => { + render(, { sessionIdentifier: 'bridge-room' }); + expect(screen.getByTestId('video-container')).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/WaitingRoomStage/WaitingRoomStage.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/WaitingRoomStage/WaitingRoomStage.tsx new file mode 100644 index 00000000..ecab056c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/WaitingRoomStage/WaitingRoomStage.tsx @@ -0,0 +1,128 @@ +import { type FC } from 'react'; +import { Navigate } from 'react-router-dom'; +import Typography from '@mui/material/Typography'; +import bridge$ from '../../stores/bridge'; +import { PreviewPublisherProvider } from '@Context/PreviewPublisherProvider'; +import backgroundEffectsDialog$ from '@Context/BackgroundEffectsDialog'; +import precallNetworkTestDialog$ from '@Context/PrecallNetworkTestDialog'; +import useWaitingRoom from '@hooks/useWaitingRoom'; +import { Box } from '@mui/material'; +import DeviceAccessAlert from '@components/DeviceAccessAlert'; +import { DEVICE_ACCESS_STATUS } from '@utils/constants'; +import UsernameInputSkeleton from '@components/WaitingRoom/UserNameInput/UserNameInput.skeleton'; +import UsernameInput from '@components/WaitingRoom/UserNameInput'; +import VideoContainerSkeleton from '@components/WaitingRoom/VideoContainer/VideoContainer.skeleton'; +import ControlPanel from '@components/WaitingRoom/ControlPanel'; +import VideoContainer from '@components/WaitingRoom/VideoContainer'; +import { PageLayoutEmbed } from '@ui'; + +/** + * WaitingRoomStage + * + * Embeddable version of the waiting room. Equivalent to WaitingRoom but without + * the Vera chrome (Banner, Footer). Provides its own PreviewPublisherProvider. + * + * Navigation to the meeting room is handled by UsernameInput via react-router-dom, + * which resolves against the parent MemoryRouter in VeraRoom. + * + * If mounted at /waiting-room (no :roomIdentifier param) but bridge$ has a sessionIdentifier, + * redirects to /waiting-room/:sessionIdentifier so useRoomName() resolves correctly. + */ +const WaitingRoomStage: FC = () => { + const sessionIdentifier = bridge$.use.select((state) => state.sessionIdentifier); + + const missingRoomIdentifier = !sessionIdentifier; + const canRedirect = missingRoomIdentifier && !!sessionIdentifier; + const isConfigError = missingRoomIdentifier && !sessionIdentifier; + + if (canRedirect) { + return ; + } + + if (isConfigError) { + return ( +
        + + Set the session-identifier attribute to specify the room to join. + +
        + ); + } + + return ( + + + + ); +}; + +function WaitingRoomStageContent() { + const { + anchorEl, + openAudioInput, + openVideoInput, + openAudioOutput, + username, + setUsername, + accessStatus, + isRoomReady, + roomName, + handleAudioInputOpen, + handleVideoInputOpen, + handleAudioOutputOpen, + handleClose, + } = useWaitingRoom(); + + return ( + + + + + + + {isRoomReady && ( + <> + + + + + )} + + {!isRoomReady && } + + + + + {isRoomReady && ( + + )} + + {!isRoomReady && } + + + {accessStatus !== DEVICE_ACCESS_STATUS.ACCEPTED && ( + + )} + + + + ); +} + +export default WaitingRoomStage; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/WaitingRoomStage/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/WaitingRoomStage/index.ts new file mode 100644 index 00000000..29f1f2aa --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stages/WaitingRoomStage/index.ts @@ -0,0 +1 @@ +export { default } from './WaitingRoomStage'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/bridge$.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/bridge$.ts new file mode 100644 index 00000000..8417c012 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/bridge$.ts @@ -0,0 +1,26 @@ +import { createContext, type InferAPI } from 'react-global-state-hooks'; +import { initialState, metadata } from './constants'; + +export type BridgeAPI = InferAPI; + +type BridgeState = ReturnType; + +/** + * This store contains the state and actions related to the bridge between the VeraRoom web component and the React application. + */ +const bridge$ = createContext(initialState, { + name: 'bridge', + metadata, + actions: { + /** + * Merges the provided attribute values into the bridge state. + */ + partialUpdate(attributes: Partial) { + return ({ setState }) => { + setState((state) => ({ ...state, ...attributes })); + }; + }, + }, +}); + +export default bridge$; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/constants/bridgeAttributes.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/constants/bridgeAttributes.ts new file mode 100644 index 00000000..df029141 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/constants/bridgeAttributes.ts @@ -0,0 +1,3 @@ +const bridgeAttributes = ['entry-point', 'session-identifier', 'language'] as const; + +export default bridgeAttributes; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/constants/bridgeAttributesMap.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/constants/bridgeAttributesMap.ts new file mode 100644 index 00000000..dc6221bb --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/constants/bridgeAttributesMap.ts @@ -0,0 +1,33 @@ +import { BridgeAttributeMeta } from '../types'; + +const bridgeAttributesMap = { + /** + * The entry point for the bridge, used to identify the source of the session and for logging purposes. + */ + 'entry-point': new BridgeAttributeMeta({ + key: 'entry-point', + type: 'string', + default: '', + }), + + /** + * If provided joins directly to the session with the provided session identifier, otherwise a new session may be created + */ + 'session-identifier': new BridgeAttributeMeta({ + key: 'session-identifier', + type: 'string', + default: '', + }), + + /** + * BCP-47 language tag for the UI locale (e.g. 'en', 'es', 'it'). + * Falls back to the browser's detected language when not provided. + */ + language: new BridgeAttributeMeta({ + key: 'language', + type: 'string', + default: '', + }), +} as const; + +export default bridgeAttributesMap; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/constants/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/constants/index.ts new file mode 100644 index 00000000..84cd5c1b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/constants/index.ts @@ -0,0 +1,4 @@ +export { default as initialState } from './initialState'; +export { default as metadata } from './metadata'; +export { default as bridgeAttributes } from './bridgeAttributes'; +export { default as bridgeAttributesMap } from './bridgeAttributesMap'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/constants/initialState.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/constants/initialState.ts new file mode 100644 index 00000000..bdc9655e --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/constants/initialState.ts @@ -0,0 +1,18 @@ +import type { KebabToCamel } from '@common/types'; +import bridgeAttributesMap from './bridgeAttributesMap'; + +function initialValue() { + const htmlAttributes: { + [Key in keyof typeof bridgeAttributesMap as KebabToCamel]: string; + } = { + entryPoint: bridgeAttributesMap['entry-point'].value, + sessionIdentifier: bridgeAttributesMap['session-identifier'].value, + language: bridgeAttributesMap['language'].value, + }; + + return { + ...htmlAttributes, + }; +} + +export default initialValue; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/constants/metadata.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/constants/metadata.ts new file mode 100644 index 00000000..6b899de5 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/constants/metadata.ts @@ -0,0 +1,7 @@ +function metadata() { + return { + isConnected: false, + }; +} + +export default metadata; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/index.ts new file mode 100644 index 00000000..7991ec64 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/index.ts @@ -0,0 +1,4 @@ +export { default } from './bridge$'; +export * from './schemas'; +export * from './types'; +export * from './constants'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/schemas/BridgeAttribute.schema.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/schemas/BridgeAttribute.schema.ts new file mode 100644 index 00000000..7208fa48 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/schemas/BridgeAttribute.schema.ts @@ -0,0 +1,15 @@ +import { z } from 'zod'; +import { bridgeAttributes } from '../constants'; +import type { BridgeAttribute } from '../types'; + +const bridgeAttributeSchema: z.ZodType = z.enum(bridgeAttributes); + +export function assertBridgeAttribute(value: unknown): asserts value is BridgeAttribute { + bridgeAttributeSchema.parse(value); +} + +export function isBridgeAttribute(value: unknown): value is BridgeAttribute { + return bridgeAttributeSchema.safeParse(value).success; +} + +export default bridgeAttributeSchema; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/schemas/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/schemas/index.ts new file mode 100644 index 00000000..d27549eb --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/schemas/index.ts @@ -0,0 +1 @@ +export * from './BridgeAttribute.schema'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/types/BridgeAPI.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/types/BridgeAPI.ts new file mode 100644 index 00000000..87c368ac --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/types/BridgeAPI.ts @@ -0,0 +1,3 @@ +export type BridgeAPI = import('../bridge$').BridgeAPI; + +export default BridgeAPI; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/types/BridgeAttribute.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/types/BridgeAttribute.ts new file mode 100644 index 00000000..2498b4bf --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/types/BridgeAttribute.ts @@ -0,0 +1,5 @@ +import type { bridgeAttributes } from '../constants'; + +export type BridgeAttribute = (typeof bridgeAttributes)[number]; + +export default BridgeAttribute; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/types/BridgeAttributeMeta.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/types/BridgeAttributeMeta.ts new file mode 100644 index 00000000..71b488e8 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/types/BridgeAttributeMeta.ts @@ -0,0 +1,26 @@ +import type { KebabToCamel } from '@common/types'; +import type BridgeAttribute from './BridgeAttribute'; +import type BridgeAttributeType from './BridgeAttributeType'; +import { kebabToCamel } from '@common/helpers'; + +/** + * HTML Attribute metadata + */ +export class BridgeAttributeMeta< + Attribute extends BridgeAttribute, + Type extends BridgeAttributeType, +> { + htmlKey: Attribute; + name: KebabToCamel; + value: string; + type: Type; + + constructor(args: { key: Attribute; default: string; type: Type }) { + this.htmlKey = args.key; + this.name = kebabToCamel(args.key) as KebabToCamel; + this.value = args.default; + this.type = args.type; + } +} + +export default BridgeAttributeMeta; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/types/BridgeAttributeType.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/types/BridgeAttributeType.ts new file mode 100644 index 00000000..1845da9b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/types/BridgeAttributeType.ts @@ -0,0 +1,3 @@ +export type BridgeAttributeType = 'string' | 'number' | 'boolean'; + +export default BridgeAttributeType; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/types/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/types/index.ts new file mode 100644 index 00000000..7ae0c870 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/bridge/types/index.ts @@ -0,0 +1,4 @@ +export * from './BridgeAPI'; +export * from './BridgeAttribute'; +export * from './BridgeAttributeMeta'; +export * from './BridgeAttributeType'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/index.ts new file mode 100644 index 00000000..38179330 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/stores/index.ts @@ -0,0 +1 @@ +export { default as bridge$ } from './bridge'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/styles.css b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/styles.css new file mode 100644 index 00000000..f9b48a6e --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/styles.css @@ -0,0 +1,36 @@ +@import 'tailwindcss'; + +/* Keeps output pixel exact after migration from muiV5 to muiV9 */ +@layer base { + * { + letter-spacing: 0.15008px; + -webkit-font-smoothing: antialiased; + } +} + +/* Tailwind CSS v4 config directive */ +@config '../../tailwind.config.cjs'; + +/* Libs source - outside frontend, needs explicit @source */ +@source "../../../libs/ui/**/*.tsx"; + +/* base app styles */ +@import '../css/App.css'; + +/* + The default border color has changed to `currentcolor` in Tailwind CSS v4, + so we've added these compatibility styles to make sure everything still + looks the same as it did with Tailwind CSS v3. + + If we ever want to remove these styles, we need to add an explicit border + color utility to any element that depends on these defaults. +*/ +@layer base { + *, + ::after, + ::before, + ::backdrop, + ::file-selector-button { + border-color: var(--color-gray-200, currentcolor); + } +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/vite.veraroom.config.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/vite.veraroom.config.ts new file mode 100644 index 00000000..c491aa78 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/VeraRoom/vite.veraroom.config.ts @@ -0,0 +1,35 @@ +import { defineConfig, mergeConfig } from 'vite'; +import baseConfigFn from '../../vite.config'; +import * as path from 'node:path'; + +export default defineConfig((env) => { + const baseConfig = baseConfigFn(env); + + return mergeConfig(baseConfig, { + base: './', + define: { + 'process.env.NODE_ENV': '"production"', + }, + esbuild: { + jsxDev: false, + }, + build: { + outDir: path.resolve(__dirname, '../../distRoom'), + emptyOutDir: true, + + lib: { + entry: path.resolve(__dirname, './index.ts'), + name: 'VeraRoom', + formats: ['iife'], + fileName: () => 'room.js', + }, + + rollupOptions: { + output: { + chunkFileNames: 'assets/[name]-[hash].js', + assetFileNames: 'assets/[name]-[hash][extname]', + }, + }, + }, + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/getArchives/getArchives.spec.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/getArchives/getArchives.spec.ts new file mode 100644 index 00000000..5e780574 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/getArchives/getArchives.spec.ts @@ -0,0 +1,76 @@ +import { describe, expect, it, vi } from 'vitest'; +import { serverArchives } from '../tests/data'; +import getArchives from './getArchives'; +import type { ServerArchive } from '../model'; +import type { VideoClient } from '@core/services'; + +const mockSearchArchivesQuery = vi.fn((_args?: unknown) => + Promise.resolve({ items: [] as ServerArchive[] }) +); + +const mockVideoClient = { + searchArchives: (...args: unknown[]) => mockSearchArchivesQuery(...args), +} as unknown as VideoClient; + +describe('getArchives', () => { + it('returns an object with array of Archives and hasPending flag', async () => { + mockSearchArchivesQuery.mockResolvedValue({ items: serverArchives }); + const archives = await getArchives({ + locale: 'en', + sessionKey: 'test-session-id', + videoClient: mockVideoClient, + }); + expect(archives).toEqual({ + archives: [ + { + createdAt: 1725268594000, + createdAtFormatted: 'Mon, Sep 2 5:16 AM', + duration: 0, + id: 'dc91ede6-0d1a-4de6-90d8-692c2113b34a', + size: 0, + status: 'pending', + url: null, + }, + { + createdAt: 1725268141000, + createdAtFormatted: 'Mon, Sep 2 5:09 AM', + duration: 56, + id: 'c32509e3-24a9-4d1f-98a0-66a0f0fdbca6', + size: 278545, + status: 'available', + url: 'https://example.com.com/tokbox.com.archive2.eu/46969164/c32509e3-24a9-4d1f-98a0-66a0f0fdbca6/archive.mp4', + }, + { + createdAt: 1725268111000, + createdAtFormatted: 'Mon, Sep 2 5:08 AM', + duration: 13, + id: '88417e46-6459-435b-b1a4-8524db79946c', + size: 911104, + status: 'failed', + url: null, + }, + ], + hasPending: true, + }); + }); + + it('returns object with empty array when no archives', async () => { + mockSearchArchivesQuery.mockResolvedValue({ items: [] }); + const archives = await getArchives({ + locale: 'en', + sessionKey: 'test-session-id', + videoClient: mockVideoClient, + }); + expect(archives).toEqual({ + archives: [], + hasPending: false, + }); + }); + + it('throws with error when api call throws', async () => { + mockSearchArchivesQuery.mockRejectedValue(new Error('Network Error')); + await expect( + getArchives({ locale: 'en', sessionKey: 'test-session-id', videoClient: mockVideoClient }) + ).rejects.toThrowError(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/getArchives/getArchives.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/getArchives/getArchives.ts new file mode 100644 index 00000000..5ac165b3 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/getArchives/getArchives.ts @@ -0,0 +1,45 @@ +import { type VideoClient } from '@core/services'; +import { Archive, createArchiveFromServer, hasPending, type ServerArchive } from '../model'; + +export type ArchiveResponse = { + archives: Archive[]; + hasPending: boolean; +}; + +/** + * Returns a list of archives and the status of the archives for a given meeting room. + * @param {string} locale - current locale + * @param {string} sessionId - The session ID to search archives for + * @param {VideoClient} videoClient - The video client instance to use for searching archives + * @returns {Promise} The archives from the meeting room (if any) and whether any archives are pending. + */ +const getArchives = async ({ + locale, + sessionKey, + videoClient, +}: { + locale: string; + sessionKey: string; + videoClient: VideoClient; +}): Promise => { + const response = await videoClient.searchArchives({ sessionKey }); + const archivesFromServer = response?.items; + + if (archivesFromServer instanceof Array) { + const archives = archivesFromServer.map((archiveFromServer) => { + return createArchiveFromServer(locale, archiveFromServer as ServerArchive); + }); + + return { + archives, + hasPending: hasPending(archives), + }; + } + + return { + archives: [], + hasPending: false, + }; +}; + +export default getArchives; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/getArchives/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/getArchives/index.ts new file mode 100644 index 00000000..1353304c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/getArchives/index.ts @@ -0,0 +1 @@ +export { default as getArchives, type ArchiveResponse } from './getArchives'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/index.ts new file mode 100644 index 00000000..8b13c86b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/index.ts @@ -0,0 +1 @@ +export { getArchives, type ArchiveResponse } from './getArchives'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/model.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/model.ts new file mode 100644 index 00000000..86faf87b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/model.ts @@ -0,0 +1,76 @@ +import { getFormattedDate, getFormattedTime } from '../../utils/dateTime'; + +export type ArchiveStatus = 'available' | 'pending' | 'failed'; +export type ServerArchiveStatus = + | 'available' + | 'expired' + | 'failed' + | 'paused' + | 'started' + | 'stopped' + | 'uploaded'; + +export interface ServerArchive { + id: string; + url: string | null; + status: ServerArchiveStatus; + createdAt: number; + duration?: number; + size?: number; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [others: string]: any; +} + +export type Archive = { + id: string; + url: string | null; + status: ArchiveStatus; + createdAt: number; + createdAtFormatted: string; + duration?: number; + size?: number; +}; + +const getDateString = (locale: string, timestamp: number) => { + return `${getFormattedDate(locale, timestamp)} ${getFormattedTime(locale, timestamp)}`; +}; + +const getArchiveStatus = (status: ServerArchiveStatus): ArchiveStatus => { + switch (status) { + case 'available': + return 'available'; + case 'started': + case 'stopped': + case 'uploaded': + case 'paused': + return 'pending'; + default: + return 'failed'; + } +}; + +/** + * Modifies an archive retrieved from the server to be easily consumable. + * @param {string} locale - current locale + * @param {ServerArchive} serverArchive - The archive to be modified. + * @returns {Archive} The modified archive. + */ +export const createArchiveFromServer = (locale: string, serverArchive: ServerArchive): Archive => { + return { + id: serverArchive.id, + url: serverArchive.url, + status: getArchiveStatus(serverArchive.status), + createdAt: serverArchive.createdAt, + createdAtFormatted: getDateString(locale, serverArchive.createdAt), + duration: serverArchive.duration, + size: serverArchive.size, + }; +}; + +/** + * Checks if any of the archives are pending. + * @param {Archive[]} archives - The archives to check. + * @returns {boolean} Returns `true` if any archives are pending, else returns `false`. + */ +export const hasPending = (archives: Archive[]): boolean => + archives.some((archive) => archive.status === 'pending'); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/tests/data.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/tests/data.ts new file mode 100644 index 00000000..cc0e5949 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/tests/data.ts @@ -0,0 +1,110 @@ +import { Archive, ServerArchive } from '../model'; + +export const startedServerArchive: ServerArchive = { + id: 'dc91ede6-0d1a-4de6-90d8-692c2113b34a', + status: 'started', + name: '', + reason: '', + sessionId: '2_MX40Njk2OTE2NH5-MTcyNTI2ODA5Mjc2OH5FMk8vWlE1Wkp6alVNR2xoQ1VveTZzNk1-fn4', + applicationId: '46969164', + createdAt: 1725268594000, + size: 0, + duration: 0, + outputMode: 'composed', + streamMode: 'auto', + hasAudio: true, + hasVideo: true, + hasTranscription: false, + sha256sum: '', + password: '', + updatedAt: 1725268594000, + multiArchiveTag: '', + event: 'archive', + partnerId: 46969164, + projectId: 46969164, + resolution: '640x480', + url: null, +}; + +export const pendingArchive: Archive = { + createdAt: 1725268594000, + createdAtFormatted: 'Mon, Sep 2 5:16 AM', + id: 'dc91ede6-0d1a-4de6-90d8-692c2113b34a', + status: 'pending', + url: null, +}; + +export const availableServerArchive: ServerArchive = { + id: 'c32509e3-24a9-4d1f-98a0-66a0f0fdbca6', + status: 'available', + name: '', + reason: 'user initiated', + sessionId: '2_MX40Njk2OTE2NH5-MTcyNTI2ODA5Mjc2OH5FMk8vWlE1Wkp6alVNR2xoQ1VveTZzNk1-fn4', + applicationId: '46969164', + createdAt: 1725268141000, + size: 278545, + duration: 56, + outputMode: 'composed', + streamMode: 'auto', + hasAudio: true, + hasVideo: true, + hasTranscription: false, + sha256sum: 'fEzap6vpxmzvZj4l+aZ4PNDK1MOz9gxZ4eRmUpsPECk=', + password: '', + updatedAt: 1725268199000, + multiArchiveTag: '', + event: 'archive', + partnerId: 46969164, + projectId: 46969164, + resolution: '640x480', + url: 'https://example.com.com/tokbox.com.archive2.eu/46969164/c32509e3-24a9-4d1f-98a0-66a0f0fdbca6/archive.mp4', +}; +export const availableArchive: Archive = { + createdAt: 1725268141000, + createdAtFormatted: 'Mon, Sep 2 5:09 AM', + id: 'c32509e3-24a9-4d1f-98a0-66a0f0fdbca6', + status: 'available', + url: 'https://example.com.com/tokbox.com.archive2.eu/46969164/c32509e3-24a9-4d1f-98a0-66a0f0fdbca6/archive.mp4', +}; + +export const failedServerArchive: ServerArchive = { + id: '88417e46-6459-435b-b1a4-8524db79946c', + status: 'failed', + name: '', + reason: 'user initiated', + sessionId: '2_MX40Njk2OTE2NH5-MTcyNTI2ODA5Mjc2OH5FMk8vWlE1Wkp6alVNR2xoQ1VveTZzNk1-fn4', + applicationId: '46969164', + createdAt: 1725268111000, + size: 911104, + duration: 13, + outputMode: 'composed', + streamMode: 'auto', + hasAudio: true, + hasVideo: true, + hasTranscription: false, + sha256sum: 'W6t88jhGPfucqChZOAdM47U8wiY8eubDBS2BdqsfUeM=', + password: '', + updatedAt: 1725268127000, + multiArchiveTag: '', + event: 'archive', + partnerId: 46969164, + projectId: 46969164, + resolution: '640x480', + url: null, +}; + +export const failedArchive: Archive = { + createdAt: 1725268111000, + createdAtFormatted: 'Mon, Sep 2 5:08 AM', + id: '88417e46-6459-435b-b1a4-8524db79946c', + status: 'failed', + url: null, +}; + +export const archives: Archive[] = [pendingArchive, availableArchive, failedArchive]; + +export const serverArchives: ServerArchive[] = [ + startedServerArchive, + availableServerArchive, + failedServerArchive, +]; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/tests/index.spec.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/tests/index.spec.ts new file mode 100644 index 00000000..c9d3efc5 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/tests/index.spec.ts @@ -0,0 +1,76 @@ +import { describe, expect, it, vi } from 'vitest'; +import { serverArchives } from './data'; +import { getArchives } from '..'; +import type { ServerArchive } from '../model'; +import type { VideoClient } from '@core/services'; + +const mockSearchArchivesQuery = vi.fn((_args?: unknown) => + Promise.resolve({ items: [] as ServerArchive[] }) +); + +const mockVideoClient = { + searchArchives: (...args: unknown[]) => mockSearchArchivesQuery(...args), +} as unknown as VideoClient; + +describe('getArchives', () => { + it('it returns an object with array of Archives and hasPending flag', async () => { + mockSearchArchivesQuery.mockResolvedValue({ items: serverArchives }); + const archives = await getArchives({ + locale: 'en', + sessionKey: 'test-session-id', + videoClient: mockVideoClient, + }); + expect(archives).toEqual({ + archives: [ + { + createdAt: 1725268594000, + createdAtFormatted: 'Mon, Sep 2 5:16 AM', + duration: 0, + id: 'dc91ede6-0d1a-4de6-90d8-692c2113b34a', + size: 0, + status: 'pending', + url: null, + }, + { + createdAt: 1725268141000, + createdAtFormatted: 'Mon, Sep 2 5:09 AM', + duration: 56, + id: 'c32509e3-24a9-4d1f-98a0-66a0f0fdbca6', + size: 278545, + status: 'available', + url: 'https://example.com.com/tokbox.com.archive2.eu/46969164/c32509e3-24a9-4d1f-98a0-66a0f0fdbca6/archive.mp4', + }, + { + createdAt: 1725268111000, + createdAtFormatted: 'Mon, Sep 2 5:08 AM', + duration: 13, + id: '88417e46-6459-435b-b1a4-8524db79946c', + size: 911104, + status: 'failed', + url: null, + }, + ], + hasPending: true, + }); + }); + + it('it returns object with empty array when no archives', async () => { + mockSearchArchivesQuery.mockResolvedValue({ items: [] }); + const archives = await getArchives({ + locale: 'en', + sessionKey: 'test-session-id', + videoClient: mockVideoClient, + }); + expect(archives).toEqual({ + archives: [], + hasPending: false, + }); + }); + + it('it throws with error when api call throws', async () => { + mockSearchArchivesQuery.mockRejectedValue(new Error('Network Error')); + await expect( + getArchives({ locale: 'en', sessionKey: 'test-session-id', videoClient: mockVideoClient }) + ).rejects.toThrowError(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/tests/model.spec.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/tests/model.spec.ts new file mode 100644 index 00000000..e4e14a85 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/archiving/tests/model.spec.ts @@ -0,0 +1,99 @@ +import { describe, expect, it } from 'vitest'; +import { createArchiveFromServer, hasPending } from '../model'; +import { availableServerArchive, failedServerArchive, startedServerArchive } from './data'; + +describe('createArchiveFromServer', () => { + it('should convert fields to model fields', () => { + const archive = createArchiveFromServer('en', availableServerArchive); + expect(archive).toEqual({ + createdAt: 1725268141000, + createdAtFormatted: 'Mon, Sep 2 5:09 AM', + duration: 56, + id: 'c32509e3-24a9-4d1f-98a0-66a0f0fdbca6', + size: 278545, + status: 'available', + url: 'https://example.com.com/tokbox.com.archive2.eu/46969164/c32509e3-24a9-4d1f-98a0-66a0f0fdbca6/archive.mp4', + }); + }); + + it('should return status as failed for failed and expired archives', () => { + expect(createArchiveFromServer('en', failedServerArchive).status).toBe('failed'); + expect( + createArchiveFromServer('en', { ...failedServerArchive, status: 'expired' }).status + ).toBe('failed'); + }); + + it('should return available as failed for status available archives', () => { + expect(createArchiveFromServer('en', availableServerArchive).status).toBe('available'); + }); + + it('should return status as pending for started, stopped, uploaded, and paused archives', () => { + expect(createArchiveFromServer('en', startedServerArchive).status).toBe('pending'); + expect( + createArchiveFromServer('en', { ...startedServerArchive, status: 'stopped' }).status + ).toBe('pending'); + expect( + createArchiveFromServer('en', { ...startedServerArchive, status: 'uploaded' }).status + ).toBe('pending'); + expect( + createArchiveFromServer('en', { ...startedServerArchive, status: 'paused' }).status + ).toBe('pending'); + }); +}); + +describe('hasPending', () => { + it('should return true if any archive is pending', () => { + expect( + hasPending([ + { + id: '1', + url: 'example.com', + status: 'available', + createdAt: 1725268141000, + createdAtFormatted: 'Mon, Sep 2 5:09 AM', + }, + { + id: '1', + url: 'example.com', + status: 'pending', + createdAt: 1725268141000, + createdAtFormatted: 'Mon, Sep 2 5:09 AM', + }, + { + id: '1', + url: 'example.com', + status: 'available', + createdAt: 1725268141000, + createdAtFormatted: 'Mon, Sep 2 5:09 AM', + }, + ]) + ).toBe(true); + }); + it('should return false if no archives are pending', () => { + expect( + hasPending([ + { + id: '1', + url: 'example.com', + status: 'available', + createdAt: 1725268141000, + createdAtFormatted: 'Mon, Sep 2 5:09 AM', + }, + { + id: '1', + url: 'example.com', + status: 'failed', + createdAt: 1725268141000, + createdAtFormatted: 'Mon, Sep 2 5:09 AM', + }, + { + id: '1', + url: 'example.com', + status: 'available', + createdAt: 1725268141000, + createdAtFormatted: 'Mon, Sep 2 5:09 AM', + }, + ]) + ).toBe(false); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/fetchCredentials.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/fetchCredentials.ts new file mode 100644 index 00000000..7fe115cd --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/fetchCredentials.ts @@ -0,0 +1,21 @@ +import axios from 'axios'; +import { API_URL } from '../utils/constants'; +import type { Credential } from '@app-types/session'; + +/** + * @typedef CredentialsType + * @property {string} sessionId - the ID of the session (i.e., video call) to join + * @property {string} token - authenticates the user to the session (only users with valid tokens may join a session) + * @property {string} apiKey - your API key + */ + +/** + * Returns the credentials needed to enter video call + * See https://developer.vonage.com/en/video/guides/video-api-basics-overview#basic-vonage-video-api-functionality + * @param {string} roomName - the name of the meeting room + * @returns {Credential} the credentials needed to enter the meeting room + */ + +export default async (roomName: string) => { + return axios.get(`${API_URL}/session/${roomName}`); +}; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/reportFeedback.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/reportFeedback.ts new file mode 100644 index 00000000..f93f55f6 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/api/reportFeedback.ts @@ -0,0 +1,28 @@ +import axios from 'axios'; +import { API_URL } from '../utils/constants'; + +export type SubmissionData = { + title: string; + name: string; + issue: string; + attachment: string; +}; + +type ResponseType = { + message: string; + ticketUrl: string; +}; + +/** + * Posts a request to the server with feedback from the user. + * @param {SubmissionData} submissionData - The feedback information from the user. + * @returns {Promise>} The response from the server. + */ + +const reportIssue = async (submissionData: SubmissionData) => { + return axios.post<{ + feedbackData: ResponseType; + }>(`${API_URL}/feedback/report`, submissionData); +}; + +export default reportIssue; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettings/Dialog/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettings/Dialog/index.tsx new file mode 100644 index 00000000..3d759331 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettings/Dialog/index.tsx @@ -0,0 +1 @@ +export { AdvancedSettingsDialog as default } from '../../AdvancedSettingsDialog'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/AdvancedSettingsDialog.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/AdvancedSettingsDialog.spec.tsx new file mode 100644 index 00000000..bad02f1b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/AdvancedSettingsDialog.spec.tsx @@ -0,0 +1,74 @@ +import { render as renderBase, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import type { ReactElement } from 'react'; +import { beforeEach, afterEach, describe, expect, it } from 'vitest'; +import { MemoryRouter } from 'react-router-dom'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import AdvancedSettingsDialog from './AdvancedSettingsDialog'; + +describe('AdvancedSettingsDialog', () => { + beforeEach(() => { + advancedSettings$.setState((state) => ({ ...state, isOpen: true })); + }); + + afterEach(() => { + advancedSettings$.reset(); + }); + + it('renders dialog when open', async () => { + render(); + + await waitFor(() => { + expect(screen.getByRole('dialog')).toBeInTheDocument(); + }); + + expect(screen.getByText(/^settings$/i)).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /general/i })).toBeInTheDocument(); + }); + + it('switches to the video tab', async () => { + const user = userEvent.setup(); + render(); + + await user.click(screen.getByRole('button', { name: /video/i })); + + expect(screen.getByLabelText(/bitrate/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/codec/i)).toBeInTheDocument(); + }); + + it('switches to the audio tab', async () => { + const user = userEvent.setup(); + render(); + + await user.click(screen.getByRole('button', { name: /audio/i })); + + expect(screen.getByRole('heading', { name: /^audio$/i })).toBeInTheDocument(); + expect(screen.getByLabelText(/audio bitrate/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/enable opus dtx/i)).toBeInTheDocument(); + }); + + it('switches to the statistics tab', async () => { + const user = userEvent.setup(); + render(); + + await user.click(screen.getByRole('button', { name: /statistics/i })); + + expect(screen.getByRole('heading', { name: /^statistics$/i })).toBeInTheDocument(); + expect(screen.getByLabelText(/enable publisher bandwidth estimate/i)).toBeInTheDocument(); + expect(screen.getAllByText(/publisher/i).length).toBeGreaterThan(0); + }); + + it('closes the dialog through context on close', async () => { + render(); + + await userEvent.click(screen.getByLabelText(/close/i)); + + await waitFor(() => { + expect(screen.queryByRole('dialog')).not.toBeInTheDocument(); + }); + }); +}); + +function render(ui: ReactElement) { + return renderBase({ui}); +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/AdvancedSettingsDialog.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/AdvancedSettingsDialog.tsx new file mode 100644 index 00000000..025097b3 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/AdvancedSettingsDialog.tsx @@ -0,0 +1,67 @@ +import type { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import Dialog from '@mui/material/Dialog'; +import classNames from 'classnames'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import VividIcon from '@ui/VividIcon'; +import { AdvancedSettingsAudioTab } from './components/AdvancedSettingsAudioTab'; +import { AdvancedSettingsGeneralTab } from './components/AdvancedSettingsGeneralTab'; +import { AdvancedSettingsSidebar } from './components/AdvancedSettingsSidebar'; +import { AdvancedSettingsStatisticsTab } from './components/AdvancedSettingsStatisticsTab'; +import { AdvancedSettingsVideoTab } from './components/AdvancedSettingsVideoTab'; + +const AdvancedSettingsDialog = (): ReactElement => { + const { t } = useTranslation(); + const isOpen = advancedSettings$.use.select(({ isOpen }) => isOpen); + const selectedTab = advancedSettings$.use.select(({ selectedTab }) => selectedTab); + + const tabContent = (() => { + if (selectedTab === 'general') return ; + if (selectedTab === 'video') return ; + if (selectedTab === 'audio') return ; + return ; + })(); + + return ( + +
        +
        +

        + {t('advancedSettings.title')} +

        + +
        + +
        + + +
        {tabContent}
        +
        +
        +
        + ); +}; + +export default AdvancedSettingsDialog; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/AdvancedSettingsAudioTab.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/AdvancedSettingsAudioTab.spec.tsx new file mode 100644 index 00000000..bcf09aa6 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/AdvancedSettingsAudioTab.spec.tsx @@ -0,0 +1,69 @@ +import { render as renderBase, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import type { ReactElement } from 'react'; +import { afterEach, describe, expect, it } from 'vitest'; +import { MemoryRouter } from 'react-router-dom'; +import type { advancedSettings } from '@Context/AdvancedSettings'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import AdvancedSettingsAudioTab from './AdvancedSettingsAudioTab'; + +describe('AdvancedSettingsAudioTab', () => { + afterEach(() => { + advancedSettings$.reset(); + }); + + it('renders all audio controls with automatic bitrate selected by default', () => { + render(); + + expect(screen.getByRole('heading', { name: /^audio$/i })).toBeInTheDocument(); + expect(screen.getByLabelText(/audio bitrate/i)).toBeInTheDocument(); + expect(screen.getByRole('combobox')).toHaveValue('automatic'); + expect( + screen.queryByTestId('advanced-settings-custom-audio-bitrate-slider') + ).not.toBeInTheDocument(); + expect(screen.getByLabelText(/enable opus dtx/i)).toBeChecked(); + expect(screen.getByLabelText(/publisher audio fallback/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/subscriber audio fallback/i)).toBeInTheDocument(); + }); + + it('renders the custom audio bitrate slider when custom mode is selected', () => { + render(, { dialogState: { audioBitrateMode: 'custom' } }); + + expect(screen.getByTestId('advanced-settings-custom-audio-bitrate-slider')).toBeInTheDocument(); + expect(screen.getByText(/6 kbps/i)).toBeInTheDocument(); + expect(screen.getByText(/510 kbps/i)).toBeInTheDocument(); + expect(screen.getByText(/128 kbps/i)).toBeInTheDocument(); + }); + + it('shows custom slider after selecting custom bitrate mode', async () => { + const user = userEvent.setup(); + render(); + + await user.selectOptions(screen.getByRole('combobox'), 'custom'); + + expect(screen.getByTestId('advanced-settings-custom-audio-bitrate-slider')).toBeInTheDocument(); + }); + + it('toggles enable opus dtx checkbox', async () => { + const user = userEvent.setup(); + render(); + + await user.click(screen.getByRole('checkbox', { name: /enable opus dtx/i })); + + expect(screen.getByRole('checkbox', { name: /enable opus dtx/i })).not.toBeChecked(); + }); +}); +type RenderOptions = { + dialogState?: Partial; + initialPath?: string; +}; +function render( + ui: ReactElement, + { dialogState, initialPath = '/waiting-room' }: RenderOptions = {} +) { + if (dialogState) { + advancedSettings$.setState((state) => ({ ...state, ...dialogState })); + } + + return renderBase({ui}); +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/AdvancedSettingsAudioTab.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/AdvancedSettingsAudioTab.tsx new file mode 100644 index 00000000..7719c693 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/AdvancedSettingsAudioTab.tsx @@ -0,0 +1,127 @@ +import type { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import { useLocation } from 'react-router-dom'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import SelectField from '@ui/SelectField'; +import SwitchField from '@ui/SwitchField'; +import { ADVANCED_SETTINGS_AUDIO_BITRATE_MODE } from '../../types/types'; + +const { + setAudioBitrateMode, + setCustomAudioBitrate, + setEnableDtx, + setPublisherAudioFallbackEnabled, + setSubscriberAudioFallbackEnabled, +} = advancedSettings$.actions; + +const AdvancedSettingsAudioTab = (): ReactElement => { + const { t } = useTranslation(); + const { pathname } = useLocation(); + const isInWaitingRoom = pathname.startsWith('/waiting-room'); + const nextCallWarningKey = isInWaitingRoom + ? 'advancedSettings.audio.nextCallWarningWaitingRoom' + : 'advancedSettings.audio.nextCallWarningMeetingRoom'; + const audioBitrateMode = advancedSettings$.use.select(({ audioBitrateMode }) => audioBitrateMode); + const customAudioBitrate = advancedSettings$.use.select( + ({ customAudioBitrate }) => customAudioBitrate + ); + const enableDtx = advancedSettings$.use.select(({ enableDtx }) => enableDtx); + const publisherAudioFallbackEnabled = advancedSettings$.use.select( + ({ publisherAudioFallbackEnabled }) => publisherAudioFallbackEnabled + ); + const subscriberAudioFallbackEnabled = advancedSettings$.use.select( + ({ subscriberAudioFallbackEnabled }) => subscriberAudioFallbackEnabled + ); + + const audioBitrateOptions = [ + { + value: ADVANCED_SETTINGS_AUDIO_BITRATE_MODE.automatic, + label: t('advancedSettings.audio.bitrate.options.automatic'), + }, + { + value: ADVANCED_SETTINGS_AUDIO_BITRATE_MODE.custom, + label: t('advancedSettings.audio.bitrate.options.custom'), + }, + ]; + + return ( +
        +

        + {t('advancedSettings.tabs.audio')} +

        + +

        + {t(nextCallWarningKey)} +

        + +
        + + + {audioBitrateMode === ADVANCED_SETTINGS_AUDIO_BITRATE_MODE.custom && ( +
        +

        + {t('advancedSettings.audio.bitrate.customLabel')} +

        + +
        + { + setCustomAudioBitrate(Number(event.target.value)); + }} + data-testid="advanced-settings-custom-audio-bitrate-slider" + aria-label={t('advancedSettings.audio.bitrate.customLabel')} + /> +
        + {t('advancedSettings.audio.bitrate.minimum')} + + {t('advancedSettings.audio.bitrate.currentValue', { + value: customAudioBitrate, + })} + + {t('advancedSettings.audio.bitrate.maximum')} +
        +
        +
        + )} +
        + + + + + + +
        + ); +}; + +export default AdvancedSettingsAudioTab; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/index.tsx new file mode 100644 index 00000000..ce91d797 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsAudioTab } from './AdvancedSettingsAudioTab'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/AdvancedSettingsCodecPriorityField.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/AdvancedSettingsCodecPriorityField.spec.tsx new file mode 100644 index 00000000..6302e208 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/AdvancedSettingsCodecPriorityField.spec.tsx @@ -0,0 +1,40 @@ +import { fireEvent, render, screen, within } from '@testing-library/react'; +import { describe, expect, it, vi } from 'vitest'; +import AdvancedSettingsCodecPriorityField from './AdvancedSettingsCodecPriorityField'; + +describe('AdvancedSettingsCodecPriorityField', () => { + it('reorders codecs through drag and drop', () => { + const setCodecPriority = vi.fn(); + + render( + + ); + + const vp9Item = screen.getByTestId('advanced-settings-codec-priority-item-vp9'); + const h264Item = screen.getByTestId('advanced-settings-codec-priority-item-h264'); + + fireEvent.dragStart(vp9Item); + fireEvent.dragOver(h264Item); + fireEvent.drop(h264Item); + + expect(setCodecPriority).toHaveBeenCalledWith(['vp8', 'h264', 'vp9']); + }); + + it('renders the codec labels in SDK order by default', () => { + render( + + ); + + const codecItems = within(screen.getByTestId('advanced-settings-codec-priority-list')) + .getAllByRole('listitem') + .map((item) => item.textContent); + + expect(codecItems).toEqual(expect.arrayContaining(['1VP9', '2VP8', '3H.264'])); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/AdvancedSettingsCodecPriorityField.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/AdvancedSettingsCodecPriorityField.tsx new file mode 100644 index 00000000..3b221c3a --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/AdvancedSettingsCodecPriorityField.tsx @@ -0,0 +1,139 @@ +import { useState } from 'react'; +import type { DragEvent, ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import classNames from 'classnames'; +import type { + AdvancedSettingsManualCodecOrder, + AdvancedSettingsVideoCodec, +} from '../../types/types'; + +type AdvancedSettingsCodecPriorityFieldProps = { + codecPriority: AdvancedSettingsManualCodecOrder; + setCodecPriority: (value: AdvancedSettingsManualCodecOrder) => void; +}; + +const AdvancedSettingsCodecPriorityField = ({ + codecPriority, + setCodecPriority, +}: AdvancedSettingsCodecPriorityFieldProps): ReactElement => { + const { t } = useTranslation(); + const [draggedCodec, setDraggedCodec] = useState(null); + const [dropTargetCodec, setDropTargetCodec] = useState(null); + + const handleDragStart = (event: DragEvent, codec: AdvancedSettingsVideoCodec) => { + if (event.dataTransfer) { + event.dataTransfer.effectAllowed = 'move'; + event.dataTransfer.setData('text/plain', codec); + } + + setDraggedCodec(codec); + setDropTargetCodec(codec); + }; + + const handleDragEnd = () => { + setDraggedCodec(null); + setDropTargetCodec(null); + }; + + const handleDragOver = ( + event: DragEvent, + targetCodec: AdvancedSettingsVideoCodec + ) => { + event.preventDefault(); + + if (!draggedCodec || draggedCodec === targetCodec) return; + + setDropTargetCodec(targetCodec); + }; + + const handleDrop = (event: DragEvent, targetCodec: AdvancedSettingsVideoCodec) => { + event.preventDefault(); + + const draggedCodecFromEvent = event.dataTransfer?.getData('text/plain') as + | AdvancedSettingsVideoCodec + | undefined; + const activeDraggedCodec = draggedCodec ?? draggedCodecFromEvent; + + if (!activeDraggedCodec || activeDraggedCodec === targetCodec) { + handleDragEnd(); + return; + } + + const reorderedCodecs = reorderCodecPriority({ + codecPriority, + draggedCodec: activeDraggedCodec, + targetCodec, + }); + + setCodecPriority(reorderedCodecs); + handleDragEnd(); + }; + + return ( +
        +

        + {t('advancedSettings.video.codec.priority.label')} +

        + +

        + {t('advancedSettings.video.codec.priority.description')} +

        + +
          + {codecPriority.map((codec, index) => { + const isDraggedCodec = draggedCodec === codec; + const isDropTarget = dropTargetCodec === codec && draggedCodec !== codec; + + return ( +
        1. { + handleDragStart(event, codec); + }} + onDragEnd={handleDragEnd} + onDragOver={(event) => { + handleDragOver(event, codec); + }} + onDrop={(event) => { + handleDrop(event, codec); + }} + className={classNames( + 'flex cursor-grab items-center gap-3 rounded-vera-medium border bg-vera-surface px-4 py-3', + isDraggedCodec ? 'border-vera-primary opacity-60' : 'border-vera-border', + isDropTarget ? 'border-vera-primary' : null + )} + data-testid={`advanced-settings-codec-priority-item-${codec}`} + > + + {index + 1} + + + + {t(`advancedSettings.video.codec.priority.options.${codec}`)} + +
        2. + ); + })} +
        +
        + ); +}; + +function reorderCodecPriority(args: { + codecPriority: AdvancedSettingsManualCodecOrder; + draggedCodec: AdvancedSettingsVideoCodec; + targetCodec: AdvancedSettingsVideoCodec; +}): AdvancedSettingsManualCodecOrder { + const { codecPriority, draggedCodec, targetCodec } = args; + const reorderedCodecs = [...codecPriority]; + const draggedCodecIndex = reorderedCodecs.indexOf(draggedCodec); + const targetCodecIndex = reorderedCodecs.indexOf(targetCodec); + + reorderedCodecs.splice(draggedCodecIndex, 1); + reorderedCodecs.splice(targetCodecIndex, 0, draggedCodec); + + return reorderedCodecs as AdvancedSettingsManualCodecOrder; +} + +export default AdvancedSettingsCodecPriorityField; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/index.tsx new file mode 100644 index 00000000..488e84d7 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsCodecPriorityField } from './AdvancedSettingsCodecPriorityField'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/AdvancedSettingsCustomVideoBitrateField.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/AdvancedSettingsCustomVideoBitrateField.spec.tsx new file mode 100644 index 00000000..7034aa8f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/AdvancedSettingsCustomVideoBitrateField.spec.tsx @@ -0,0 +1,51 @@ +import { fireEvent, render as renderBase, screen } from '@testing-library/react'; +import type { ReactElement } from 'react'; +import { afterEach, describe, expect, it, vi } from 'vitest'; +import type { advancedSettings } from '@Context/AdvancedSettings'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import AdvancedSettingsCustomVideoBitrateField from './AdvancedSettingsCustomVideoBitrateField'; + +describe('AdvancedSettingsCustomVideoBitrateField', () => { + afterEach(() => { + advancedSettings$.reset(); + }); + + it('renders the current bitrate and range labels', () => { + render(); + + expect(screen.getByText(/custom bitrate/i)).toBeInTheDocument(); + expect(screen.getByTestId('advanced-settings-custom-video-bitrate-slider')).toHaveAttribute( + 'type', + 'range' + ); + expect(screen.getAllByText(/5 kbps/i).length).toBeGreaterThan(0); + expect(screen.getByText(/^10 Mbps$/i)).toBeInTheDocument(); + expect(screen.getByText(/^500 kbps$/i)).toBeInTheDocument(); + }); + + it('calls onChange with the clamped value when slider exceeds the maximum', () => { + const handleChange = vi.fn(); + + render(, { + dialogState: { customVideoBitrate: 9_995_000 }, + }); + + const slider = screen.getByTestId('advanced-settings-custom-video-bitrate-slider'); + + fireEvent.change(slider, { target: { value: '20000000' } }); + + expect(handleChange).toHaveBeenCalledWith(10_000_000); + }); +}); + +type RenderOptions = { + dialogState?: Partial; +}; + +function render(ui: ReactElement, { dialogState }: RenderOptions = {}) { + if (dialogState) { + advancedSettings$.setState((state) => ({ ...state, ...dialogState })); + } + + return renderBase(ui); +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/AdvancedSettingsCustomVideoBitrateField.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/AdvancedSettingsCustomVideoBitrateField.tsx new file mode 100644 index 00000000..ccdabcf1 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/AdvancedSettingsCustomVideoBitrateField.tsx @@ -0,0 +1,87 @@ +import type { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import { env } from '../../../../env'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import type { AdvancedSettingsCustomVideoBitrate } from '../../types/types'; + +const CUSTOM_VIDEO_BITRATE_STEP_BPS = 5_000; + +type Props = { + onChange: (value: AdvancedSettingsCustomVideoBitrate) => void; +}; + +const AdvancedSettingsCustomVideoBitrateField = ({ onChange }: Props): ReactElement => { + const { t } = useTranslation(); + const customVideoBitrate = advancedSettings$.use.select((state) => state.customVideoBitrate); + const currentCustomVideoBitrate = Number(customVideoBitrate); + + return ( +
        +

        + {t('advancedSettings.video.customBitrate.label')} +

        + +

        + {t('advancedSettings.video.customBitrate.description')} +

        + +
        + { + onChange(clampCustomVideoBitrate(Number(event.target.value))); + }} + className="w-full accent-vera-primary" + data-testid="advanced-settings-custom-video-bitrate-slider" + aria-label={t('advancedSettings.video.customBitrate.label')} + /> + +
        + {t('advancedSettings.video.customBitrate.minimum')} + + {formatVideoBitrateLabel({ + customVideoBitrate: currentCustomVideoBitrate, + lowerUnitLabel: t('advancedSettings.video.customBitrate.units.lower'), + higherUnitLabel: t('advancedSettings.video.customBitrate.units.higher'), + })} + + {t('advancedSettings.video.customBitrate.maximum')} +
        +
        +
        + ); +}; + +function clampCustomVideoBitrate(customVideoBitrate: number): number { + if (customVideoBitrate < env.MIN_CUSTOM_VIDEO_BITRATE_BPS) { + return Number(env.MIN_CUSTOM_VIDEO_BITRATE_BPS); + } + + if (customVideoBitrate > env.MAX_CUSTOM_VIDEO_BITRATE_BPS) { + return Number(env.MAX_CUSTOM_VIDEO_BITRATE_BPS); + } + + return customVideoBitrate; +} + +function formatVideoBitrateLabel({ + customVideoBitrate, + lowerUnitLabel, + higherUnitLabel, +}: { + customVideoBitrate: number; + lowerUnitLabel: string; + higherUnitLabel: string; +}): string { + if (customVideoBitrate >= 1_000_000) { + return `${customVideoBitrate / 1_000_000} ${higherUnitLabel}`; + } + + return `${Math.round(customVideoBitrate / 1_000)} ${lowerUnitLabel}`; +} + +export default AdvancedSettingsCustomVideoBitrateField; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/index.tsx new file mode 100644 index 00000000..d81b6d94 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsCustomVideoBitrateField } from './AdvancedSettingsCustomVideoBitrateField'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/AdvancedSettingsGeneralTab.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/AdvancedSettingsGeneralTab.spec.tsx new file mode 100644 index 00000000..e2264000 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/AdvancedSettingsGeneralTab.spec.tsx @@ -0,0 +1,13 @@ +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; +import AdvancedSettingsGeneralTab from './AdvancedSettingsGeneralTab'; + +describe('AdvancedSettingsGeneralTab', () => { + it('renders the general tab content', () => { + render(); + + expect(screen.getByRole('heading', { name: /general/i })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /reset default values/i })).toBeInTheDocument(); + expect(screen.getByText(/restore all settings to their default values/i)).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/AdvancedSettingsGeneralTab.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/AdvancedSettingsGeneralTab.tsx new file mode 100644 index 00000000..32a85788 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/AdvancedSettingsGeneralTab.tsx @@ -0,0 +1,27 @@ +import type { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; + +const AdvancedSettingsGeneralTab = (): ReactElement => { + const { t } = useTranslation(); + + return ( +
        +

        + {t('advancedSettings.tabs.general')} +

        +
        + +

        + {t('advancedSettings.general.resetDescription')} +

        +
        +
        + ); +}; + +export default AdvancedSettingsGeneralTab; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/index.tsx new file mode 100644 index 00000000..fce95ded --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsGeneralTab } from './AdvancedSettingsGeneralTab'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/AdvancedSettingsSidebar.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/AdvancedSettingsSidebar.spec.tsx new file mode 100644 index 00000000..3fa311b9 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/AdvancedSettingsSidebar.spec.tsx @@ -0,0 +1,29 @@ +import { render as renderBase, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import type { ReactElement } from 'react'; +import { describe, expect, it } from 'vitest'; +import AdvancedSettingsSidebar from './AdvancedSettingsSidebar'; + +describe('AdvancedSettingsSidebar', () => { + it('renders all tabs', () => { + render(); + + expect(screen.getByRole('button', { name: /general/i })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /video/i })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /audio/i })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /statistics/i })).toBeInTheDocument(); + }); + + it('updates selected tab when clicking another tab', async () => { + const user = userEvent.setup(); + render(); + + await user.click(screen.getByRole('button', { name: /statistics/i })); + + expect(screen.getByRole('button', { name: /statistics/i })).toHaveClass('bg-vera-surface'); + }); +}); + +function render(ui: ReactElement) { + return renderBase(ui); +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/AdvancedSettingsSidebar.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/AdvancedSettingsSidebar.tsx new file mode 100644 index 00000000..3d38f6aa --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/AdvancedSettingsSidebar.tsx @@ -0,0 +1,41 @@ +import type { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import classNames from 'classnames'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import type { AdvancedSettingsTab } from '../../types/types'; + +const tabs: AdvancedSettingsTab[] = ['general', 'video', 'audio', 'statistics']; +const { setSelectedTab } = advancedSettings$.actions; + +const AdvancedSettingsSidebar = (): ReactElement => { + const { t } = useTranslation(); + const selectedTab = advancedSettings$.use.select((state) => state.selectedTab); + + return ( +
        + {tabs.map((tab) => { + const isSelected = selectedTab === tab; + + return ( + + ); + })} +
        + ); +}; + +export default AdvancedSettingsSidebar; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/index.tsx new file mode 100644 index 00000000..d3f7c8b9 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsSidebar } from './AdvancedSettingsSidebar'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/AdvancedSettingsStatisticsGroup.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/AdvancedSettingsStatisticsGroup.spec.tsx new file mode 100644 index 00000000..cd1a5bad --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/AdvancedSettingsStatisticsGroup.spec.tsx @@ -0,0 +1,21 @@ +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; +import AdvancedSettingsStatisticsGroup from './AdvancedSettingsStatisticsGroup'; + +describe('AdvancedSettingsStatisticsGroup', () => { + it('renders only the statistics sections that have items', () => { + render( + + ); + + expect(screen.getAllByText(/publisher/i).length).toBeGreaterThan(0); + expect(screen.queryByRole('heading', { name: /audio/i })).not.toBeInTheDocument(); + expect(screen.getByRole('heading', { name: /video/i })).toBeInTheDocument(); + expect(screen.getByText(/bytes received/i)).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/AdvancedSettingsStatisticsGroup.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/AdvancedSettingsStatisticsGroup.tsx new file mode 100644 index 00000000..0cf5ac3a --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/AdvancedSettingsStatisticsGroup.tsx @@ -0,0 +1,89 @@ +import { useMemo, type ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import { Collapsible } from '@ui/components'; +import LabeledValueList from '@ui/LabeledValueList'; +import type { IMetricValue } from '@core/metrics'; +import type { Any } from '@common/types'; + +type AdvancedSettingsStatisticItem = { + label: string; + value: IMetricValue | string; +}; + +type AdvancedSettingsStatisticsGroupProps = { + title: string; + audioItems: AdvancedSettingsStatisticItem[]; + videoItems: AdvancedSettingsStatisticItem[]; + defaultExpanded?: boolean; +}; + +const AdvancedSettingsStatisticsGroup = ({ + title, + audioItems, + videoItems, + defaultExpanded = false, +}: AdvancedSettingsStatisticsGroupProps): ReactElement => { + const { t } = useTranslation(); + const hasStatistics = audioItems.length > 0 || videoItems.length > 0; + + const formattedAudioItems = useMemo( + () => + audioItems.map(({ label, value }) => ({ + label, + value: value.toString(), + })), + [audioItems] + ); + + const formattedVideoItems = useMemo( + () => + videoItems.map(({ label, value }) => ({ + label, + value: value.toString(), + })), + [videoItems] + ); + + return ( + + + + {title} + + + + + + + {hasStatistics && ( +
        + {audioItems.length > 0 && ( + + )} + + {videoItems.length > 0 && ( + + )} +
        + )} + + {!hasStatistics && ( +

        + {t('advancedSettings.statistics.empty')} +

        + )} +
        +
        + ); +}; + +export default AdvancedSettingsStatisticsGroup; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/index.tsx new file mode 100644 index 00000000..913d618f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsStatisticsGroup } from './AdvancedSettingsStatisticsGroup'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/AdvancedSettingsStatisticsTab.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/AdvancedSettingsStatisticsTab.spec.tsx new file mode 100644 index 00000000..8736f1c1 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/AdvancedSettingsStatisticsTab.spec.tsx @@ -0,0 +1,161 @@ +import { render as renderBase, screen, waitFor } from '@testing-library/react'; +import type { ReactElement } from 'react'; +import { describe, expect, it, vi } from 'vitest'; +import type { Publisher, Subscriber } from '@vonage/client-sdk-video'; +import type { SubscriberWrapper } from '@app-types/session'; +import AdvancedSettingsStatisticsTab from './AdvancedSettingsStatisticsTab'; +import makeTestProvider, { ProviderOptions, providers } from '@test/providers/makeTestProvider'; +import { DEVICE_ACCESS_STATUS } from '@utils/constants'; + +describe('AdvancedSettingsStatisticsTab', () => { + vi.mock('@hooks/usePermissions', () => ({ + default: () => ({ + accessStatus: DEVICE_ACCESS_STATUS.ACCEPTED, + setAccessStatus: vi.fn(), + }), + })); + + it('renders collection and an empty publisher statistics group', () => { + render(); + + expect(screen.getByRole('heading', { name: /^statistics$/i })).toBeInTheDocument(); + expect(screen.getByLabelText(/enable publisher bandwidth estimate/i)).toBeInTheDocument(); + expect(screen.getAllByText(/publisher/i).length).toBeGreaterThan(0); + expect(screen.getByText(/statistics/i)).toBeInTheDocument(); + }); + + it('renders live publisher stats when statistics are enabled', async () => { + const publisher = { + videoWidth: vi.fn(() => 1280), + videoHeight: vi.fn(() => 720), + getStats: vi.fn((callback) => { + callback(undefined, [ + { + stats: { + audio: { packetsSent: 10, packetsLost: 0, bytesSent: 1024 }, + video: { + packetsSent: 50, + packetsLost: 1, + bytesSent: 51200, + frameRate: 30, + bitrate: 3_000_000, + connectionEstimatedBandwidthBps: 3_000_000, + layers: [], + }, + mediaLink: { transport: { connectionEstimatedBandwidth: 3_000_000 } }, + }, + }, + ]); + }), + } as unknown as Publisher; + + render(, { + publisherContext: { + __interceptor: (context) => { + if (context) { + context.publisher = publisher; + } + }, + }, + }); + + await waitFor(() => { + expect(screen.getByText('30 fps')).toBeInTheDocument(); + expect(screen.getByText('1280x720')).toBeInTheDocument(); + // expect(screen.getByText('3.00 Mbps')).toBeInTheDocument(); + }); + }); + + it('renders subscriber group with codec, decoded frame rate and freeze count', async () => { + const subscriberWrapper: SubscriberWrapper = { + id: 'sub-1', + element: document.createElement('video'), + isScreenshare: false, + isPinned: false, + subscriber: { + stream: { name: 'Bob' }, + getStats: vi.fn((callback) => { + callback(undefined, { + audio: { packetsReceived: 10, packetsLost: 0, bytesReceived: 500 }, + video: { + packetsReceived: 40, + packetsLost: 0, + bytesReceived: 20000, + width: 640, + height: 480, + codec: 'VP9', + frameRate: 24, + decodedFrameRate: 23, + bitrate: 600_000, + freezeCount: 5, + totalFreezesDuration: 1200, + }, + mediaLink: { + transport: { connectionEstimatedBandwidth: 1_000_000 }, + remotePublisherTransport: { connectionEstimatedBandwidth: 900_000 }, + }, + }); + }), + } as unknown as Subscriber, + }; + + render(, { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.subscriberWrappers = [subscriberWrapper]; + } + }, + }, + }); + + await waitFor(() => { + expect(screen.getByText('Bob')).toBeInTheDocument(); + expect(screen.getByText('VP9')).toBeInTheDocument(); + expect(screen.getByText('5')).toBeInTheDocument(); + }); + }); +}); + +type RenderOptions = { + advancedSettingsContext?: ProviderOptions['AdvancedSettingsContext']; + userContext?: ProviderOptions['UserContext']; + publisherContext?: ProviderOptions['PublisherContext']; + previewPublisherContext?: ProviderOptions['PreviewPublisherContext']; + sessionContext?: ProviderOptions['SessionContext']; +}; + +function render( + ui: ReactElement, + { + advancedSettingsContext, + userContext, + publisherContext, + previewPublisherContext, + sessionContext, + }: RenderOptions = {} +) { + const { wrapper, ...context } = makeTestProvider( + [ + providers.advancedSettings, + providers.runtime, + providers.user, + providers.publisher, + providers.previewPublisher, + providers.session, + ], + { + advancedSettingsContext, + runtimeContext: undefined, + userContext, + sessionContext, + publisherContext, + previewPublisherContext, + } + ); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/AdvancedSettingsStatisticsTab.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/AdvancedSettingsStatisticsTab.tsx new file mode 100644 index 00000000..17cb5ad7 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/AdvancedSettingsStatisticsTab.tsx @@ -0,0 +1,55 @@ +import type { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import usePublisherContext from '@hooks/usePublisherContext'; +import SwitchField from '@ui/SwitchField'; +import PublisherStatistics from './components/PublisherStatistics'; +import usePreviewPublisherContext from '@hooks/usePreviewPublisherContext'; +import SubscriberStatistics from './components/SubscriberStatistics'; +import useSessionContext from '@hooks/useSessionContext'; + +const { setPublisherStatisticsEnabled } = advancedSettings$.actions; + +const AdvancedSettingsStatisticsTab = (): ReactElement => { + const { t } = useTranslation(); + const { publisher: meetingPublisher } = usePublisherContext(); + const { publisher: previewPublisher } = usePreviewPublisherContext(); + const { subscriberWrappers } = useSessionContext(); + + const publisher = meetingPublisher ?? previewPublisher; + + const publisherStatisticsEnabled = advancedSettings$.use.select( + (state) => state.publisherStatisticsEnabled + ); + + return ( +
        +

        + {t('advancedSettings.tabs.statistics')} +

        + + +
        + {publisher && } + + {subscriberWrappers.length > 0 && ( +

        + {t('advancedSettings.statistics.groups.subscribers')} +

        + )} + + {subscriberWrappers.map(({ subscriber }, index) => ( + + ))} +
        +
        + ); +}; + +export default AdvancedSettingsStatisticsTab; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/components/PublisherStatistics.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/components/PublisherStatistics.tsx new file mode 100644 index 00000000..382f105b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/components/PublisherStatistics.tsx @@ -0,0 +1,117 @@ +import { type ReactElement, useMemo } from 'react'; +import { usePublisherStats } from '@core/hooks'; +import { useTranslation } from 'react-i18next'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import { AdvancedSettingsStatisticsGroup } from '../../AdvancedSettingsStatisticsGroup'; +import { Publisher } from '@vonage/client-sdk-video'; +import { BitrateValue, FrameRateValue, optionalValue, ResolutionValue } from '@core/metrics'; + +interface PublisherStatisticsProps { + publisher: Publisher; +} + +const optionalValueArgs = { fallback: '–' }; + +const PublisherStatistics = ({ publisher }: PublisherStatisticsProps): ReactElement => { + const { t } = useTranslation(); + + const publisherStatisticsEnabled = advancedSettings$.use.select( + (state) => state.publisherStatisticsEnabled + ); + const fixedFrameRate = advancedSettings$.use.select((state) => state.frameRate); + + const { data } = usePublisherStats({ + publisher, + publisherStatisticsEnabled, + fixedFrameRate: fixedFrameRate ?? null, + }); + + const publisherAudioStatistics = useMemo(() => { + if (!data?.audio) { + return []; + } + + return [ + { + label: t('advancedSettings.statistics.metrics.packetsSent'), + value: data.audio.packetsSent, + }, + { + label: t('advancedSettings.statistics.metrics.packetsLostSent'), + value: data.audio.packetsLost, + }, + { + label: t('advancedSettings.statistics.metrics.bytesSent'), + value: data.audio.bytesSent, + }, + ]; + }, [data, t]); + + const publisherVideoStatistics = useMemo(() => { + if (!data?.video) { + return []; + } + + return [ + { + label: t('advancedSettings.statistics.metrics.resolution'), + value: data.resolution, + }, + { + label: t('advancedSettings.statistics.metrics.frameRate'), + value: data.frameRate, + }, + { + label: t('advancedSettings.statistics.metrics.bitrate'), + value: data.bitrateBps, + }, + { + label: t('advancedSettings.statistics.metrics.packetLoss'), + value: data.packetLossRatio, + }, + { + label: t('advancedSettings.statistics.metrics.packetsSent'), + value: data.video.packetsSent, + }, + { + label: t('advancedSettings.statistics.metrics.packetsLostSent'), + value: data.video.packetsLost, + }, + { + label: t('advancedSettings.statistics.metrics.bytesSent'), + value: data.video.bytesSent, + }, + { + label: t('advancedSettings.statistics.metrics.estimatedBandwidth'), + value: data.connectionEstimatedBandwidthBps, + }, + + ...(data.videoLayers ?? []).map((layer, index) => ({ + label: t('advancedSettings.statistics.metrics.videoLayer', { + index: index + 1, + codec: layer.codec, + }), + + value: [ + optionalValue(ResolutionValue, layer, optionalValueArgs), + optionalValue(FrameRateValue, layer.encodedFrameRate, optionalValueArgs), + optionalValue(BitrateValue, layer.bitrate, optionalValueArgs), + layer.qualityLimitationReason !== 'none' ? layer.qualityLimitationReason : null, + ] + .filter(Boolean) + .join(' · '), + })), + ]; + }, [data, t]); + + return ( + + ); +}; + +export default PublisherStatistics; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/components/SubscriberStatistics.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/components/SubscriberStatistics.tsx new file mode 100644 index 00000000..211aebbc --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/components/SubscriberStatistics.tsx @@ -0,0 +1,110 @@ +import { useMemo, type ReactElement } from 'react'; +import { useSubscriberStats } from '@core/hooks'; +import { useTranslation } from 'react-i18next'; +import { AdvancedSettingsStatisticsGroup } from '../../AdvancedSettingsStatisticsGroup'; +import { Subscriber } from '@vonage/client-sdk-video'; + +interface SubscriberStatisticsProps { + subscriber: Subscriber; +} + +const SubscriberStatistics = ({ subscriber }: SubscriberStatisticsProps): ReactElement => { + const { t } = useTranslation(); + + const { data } = useSubscriberStats({ subscriber }); + + const subscriberStatisticsGroups = useMemo(() => { + if (!data) { + return { + id: 'no-stats', + title: '...', + audioItems: [], + videoItems: [], + }; + } + + return { + id: data.id, + title: data?.title, + audioItems: [ + { + label: t('advancedSettings.statistics.metrics.packetsReceived'), + value: data.audio.packetsReceived, + }, + { + label: t('advancedSettings.statistics.metrics.packetsLostReceived'), + value: data.audio.packetsLost, + }, + { + label: t('advancedSettings.statistics.metrics.bytesReceived'), + value: data.audio.bytesReceived, + }, + ], + videoItems: [ + { + label: t('advancedSettings.statistics.metrics.resolution'), + value: data.video.resolution, + }, + { + label: t('advancedSettings.statistics.metrics.codec'), + value: data.video.codec ?? '–', + }, + { + label: t('advancedSettings.statistics.metrics.frameRate'), + value: data.video.frameRate, + }, + { + label: t('advancedSettings.statistics.metrics.decodedFrameRate'), + value: data.video.decodedFrameRate, + }, + { + label: t('advancedSettings.statistics.metrics.bitrate'), + value: data.video.bitrateBps, + }, + { + label: t('advancedSettings.statistics.metrics.packetLoss'), + value: data.packetLossRatio, + }, + { + label: t('advancedSettings.statistics.metrics.freezeCount'), + value: data.video.freezeCount, + }, + { + label: t('advancedSettings.statistics.metrics.totalFreezesDuration'), + value: data.video.totalFreezesDuration, + }, + { + label: t('advancedSettings.statistics.metrics.packetsReceived'), + value: data.video.packetsReceived, + }, + { + label: t('advancedSettings.statistics.metrics.packetsLostReceived'), + value: data.video.packetsLost, + }, + { + label: t('advancedSettings.statistics.metrics.bytesReceived'), + value: data.video.bytesReceived, + }, + { + label: t('advancedSettings.statistics.metrics.estimatedBandwidth'), + value: data.connectionEstimatedBandwidthBps, + }, + { + label: t('advancedSettings.statistics.metrics.remotePublisherEstimatedBandwidth'), + value: data.remotePublisherConnectionEstimatedBandwidthBps, + }, + ], + }; + }, [data, t]); + + return ( + + ); +}; + +export default SubscriberStatistics; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/index.tsx new file mode 100644 index 00000000..86d768f9 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsStatisticsTab } from './AdvancedSettingsStatisticsTab'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/AdvancedSettingsVideoTab.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/AdvancedSettingsVideoTab.spec.tsx new file mode 100644 index 00000000..2069b2d3 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/AdvancedSettingsVideoTab.spec.tsx @@ -0,0 +1,54 @@ +import { render as renderBase, screen } from '@testing-library/react'; +import type { ReactElement } from 'react'; +import { afterEach, describe, expect, it } from 'vitest'; +import type { advancedSettings } from '@Context/AdvancedSettings'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import AdvancedSettingsVideoTab from './AdvancedSettingsVideoTab'; + +type RenderOptions = { + dialogState?: Partial; +}; + +describe('AdvancedSettingsVideoTab', () => { + afterEach(() => { + advancedSettings$.reset(); + }); + + it('renders all video sections', () => { + render(); + + expect(screen.getByRole('heading', { name: /video/i })).toBeInTheDocument(); + expect(screen.getByLabelText(/bitrate/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/codec/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/frame rate/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/resolution/i)).toBeInTheDocument(); + }); + + it('renders codec priority drag and drop when codec mode is manual', () => { + render(, { + dialogState: { codecMode: 'manual', codecPriority: ['vp9', 'vp8', 'h264'] }, + }); + + expect(screen.getByText(/codec priority/i)).toBeInTheDocument(); + expect(screen.getByTestId('advanced-settings-codec-priority-item-vp9')).toBeInTheDocument(); + expect(screen.getByTestId('advanced-settings-codec-priority-item-vp8')).toBeInTheDocument(); + expect(screen.getByTestId('advanced-settings-codec-priority-item-h264')).toBeInTheDocument(); + }); + + it('renders custom video bitrate controls when bitrate mode is custom', () => { + render(, { dialogState: { bitrateMode: 'custom' } }); + + expect(screen.getByText(/custom bitrate/i)).toBeInTheDocument(); + expect(screen.getByTestId('advanced-settings-custom-video-bitrate-slider')).toBeInTheDocument(); + expect(screen.getAllByText(/5 kbps/i).length).toBeGreaterThan(0); + expect(screen.getByText(/^10 Mbps$/i)).toBeInTheDocument(); + }); +}); + +function render(ui: ReactElement, { dialogState }: RenderOptions = {}) { + if (dialogState) { + advancedSettings$.setState((state) => ({ ...state, ...dialogState })); + } + + return renderBase(ui); +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/AdvancedSettingsVideoTab.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/AdvancedSettingsVideoTab.tsx new file mode 100644 index 00000000..bbfab1dc --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/AdvancedSettingsVideoTab.tsx @@ -0,0 +1,135 @@ +import type { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import { env, RESOLUTIONS } from '../../../../env'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import SelectField from '@ui/SelectField'; +import { AdvancedSettingsCodecPriorityField } from '../AdvancedSettingsCodecPriorityField'; +import { AdvancedSettingsCustomVideoBitrateField } from '../AdvancedSettingsCustomVideoBitrateField'; +import type { + AdvancedSettingsFrameRate, + AdvancedSettingsResolution, + AdvancedSettingsSelectOption, +} from '../../types/types'; +import { ADVANCED_SETTINGS_BITRATE_MODE, ADVANCED_SETTINGS_CODEC_MODE } from '../../types/types'; +import useAdvancedSettingsVideoHandlers from './useAdvancedSettingsVideoHandlers'; + +const { setCodecMode, setCodecPriority } = advancedSettings$.actions; + +const AdvancedSettingsVideoTab = (): ReactElement => { + const { t } = useTranslation(); + const bitrateMode = advancedSettings$.use.select(({ bitrateMode }) => bitrateMode); + const codecMode = advancedSettings$.use.select(({ codecMode }) => codecMode); + const codecPriority = advancedSettings$.use.select(({ codecPriority }) => codecPriority); + const frameRate = advancedSettings$.use.select(({ frameRate }) => frameRate); + const resolution = advancedSettings$.use.select(({ resolution }) => resolution); + const customVideoBitrate = advancedSettings$.use.select( + ({ customVideoBitrate }) => customVideoBitrate + ); + + const { + handleFrameRateChange, + handleResolutionChange, + handleBitrateModeChange, + handleCustomVideoBitrateChange, + } = useAdvancedSettingsVideoHandlers({ bitrateMode, customVideoBitrate }); + + const bitrateOptions = [ + { + value: ADVANCED_SETTINGS_BITRATE_MODE.default, + label: t('advancedSettings.video.bitrate.options.default'), + }, + { + value: ADVANCED_SETTINGS_BITRATE_MODE.bwSaver, + label: t('advancedSettings.video.bitrate.options.bw_saver'), + }, + { + value: ADVANCED_SETTINGS_BITRATE_MODE.extraBwSaver, + label: t('advancedSettings.video.bitrate.options.extra_bw_saver'), + }, + { + value: ADVANCED_SETTINGS_BITRATE_MODE.custom, + label: t('advancedSettings.video.bitrate.options.custom'), + }, + ]; + + const codecOptions = [ + { + value: ADVANCED_SETTINGS_CODEC_MODE.automatic, + label: t('advancedSettings.video.codec.options.automatic'), + }, + { + value: ADVANCED_SETTINGS_CODEC_MODE.manual, + label: t('advancedSettings.video.codec.options.manual'), + }, + ]; + + const frameRateOptions: AdvancedSettingsSelectOption[] = ( + env.SUPPORTED_FRAME_RATES as AdvancedSettingsFrameRate[] + ).map((supportedFrameRate) => ({ + value: supportedFrameRate, + label: t(`advancedSettings.video.frameRate.options.${supportedFrameRate}`), + })); + + const resolutionOptions: AdvancedSettingsSelectOption[] = + RESOLUTIONS.map((supportedResolution) => ({ + value: supportedResolution, + label: supportedResolution, + })); + + return ( +
        +

        + {t('advancedSettings.tabs.video')} +

        + +
        + + + {bitrateMode === ADVANCED_SETTINGS_BITRATE_MODE.custom && ( + + )} + + + + {codecMode === ADVANCED_SETTINGS_CODEC_MODE.manual && ( + + )} + + + + +
        +
        + ); +}; + +export default AdvancedSettingsVideoTab; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/index.tsx new file mode 100644 index 00000000..5c01c3b9 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsVideoTab } from './AdvancedSettingsVideoTab'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/useAdvancedSettingsVideoHandlers.spec.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/useAdvancedSettingsVideoHandlers.spec.ts new file mode 100644 index 00000000..d06fdb14 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/useAdvancedSettingsVideoHandlers.spec.ts @@ -0,0 +1,283 @@ +import { act, renderHook, waitFor } from '@testing-library/react'; +import { afterEach, describe, expect, it, vi, beforeEach } from 'vitest'; +import type { Mock } from 'vitest'; +import type { Publisher } from '@vonage/client-sdk-video'; +import type { PublisherContextType } from '@Context/PublisherProvider'; +import type { PreviewPublisherContextType } from '@Context/PreviewPublisherProvider'; +import usePublisherContext from '@hooks/usePublisherContext'; +import usePreviewPublisherContext from '@hooks/usePreviewPublisherContext'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import { handleClientApplicationError } from '@ui/helpers'; +import useAdvancedSettingsVideoHandlers from './useAdvancedSettingsVideoHandlers'; + +vi.mock('@hooks/usePublisherContext'); +vi.mock('@hooks/usePreviewPublisherContext'); +vi.mock('@ui/helpers', () => ({ + handleClientApplicationError: vi.fn(), +})); + +const mockUsePublisherContext = usePublisherContext as Mock<[], PublisherContextType>; +const mockUsePreviewPublisherContext = usePreviewPublisherContext as Mock< + [], + PreviewPublisherContextType +>; +const mockHandleClientApplicationError = vi.mocked(handleClientApplicationError); + +const createMockPublisher = () => + ({ + getVideoSource: vi.fn().mockReturnValue({ track: {} }), + setPreferredFrameRate: vi.fn().mockResolvedValue(undefined), + setPreferredResolution: vi.fn().mockResolvedValue(undefined), + setMaxVideoBitrate: vi.fn().mockResolvedValue(undefined), + setVideoBitratePreset: vi.fn().mockResolvedValue(undefined), + }) as unknown as Publisher; + +describe('useAdvancedSettingsVideoHandlers', () => { + beforeEach(() => { + vi.restoreAllMocks(); + mockUsePublisherContext.mockReturnValue({ publisher: null } as PublisherContextType); + mockUsePreviewPublisherContext.mockReturnValue({ + publisher: null, + } as unknown as PreviewPublisherContextType); + }); + + afterEach(() => { + advancedSettings$.reset(); + }); + + describe('handleFrameRateChange', () => { + it('applies frame rate to publisher then updates store', async () => { + const publisher = createMockPublisher(); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleFrameRateChange(15); + }); + + await waitFor(() => { + expect(publisher.setPreferredFrameRate).toHaveBeenCalledWith(15); + expect(advancedSettings$.getState().frameRate).toBe(15); + }); + }); + + it('still updates store when no publisher is active', async () => { + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleFrameRateChange(7); + }); + + await waitFor(() => { + expect(advancedSettings$.getState().frameRate).toBe(7); + }); + }); + + it('does not update store when publisher call fails', async () => { + const publisher = createMockPublisher(); + (publisher.setPreferredFrameRate as Mock).mockRejectedValue(new Error('hardware error')); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + + const initialFrameRate = advancedSettings$.getState().frameRate; + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleFrameRateChange(15); + }); + + await waitFor(() => { + expect(publisher.setPreferredFrameRate).toHaveBeenCalledWith(15); + }); + + expect(advancedSettings$.getState().frameRate).toBe(initialFrameRate); + }); + + it('reports a notification after a failed frame rate update', async () => { + const publisher = createMockPublisher(); + (publisher.setPreferredFrameRate as Mock).mockRejectedValue(new Error('hardware error')); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleFrameRateChange(15); + }); + + await waitFor(() => { + expect(mockHandleClientApplicationError).toHaveBeenCalledTimes(1); + }); + }); + }); + + describe('handleResolutionChange', () => { + it('applies resolution to publisher then updates store', async () => { + const publisher = createMockPublisher(); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleResolutionChange('640x480'); + }); + + await waitFor(() => { + expect(publisher.setPreferredResolution).toHaveBeenCalledWith({ width: 640, height: 480 }); + expect(advancedSettings$.getState().resolution).toBe('640x480'); + }); + }); + + it('does not update store when resolution update fails', async () => { + const publisher = createMockPublisher(); + (publisher.setPreferredResolution as Mock).mockRejectedValue(new Error('unsupported')); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + const initialResolution = advancedSettings$.getState().resolution; + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleResolutionChange('640x480'); + }); + + await waitFor(() => { + expect(mockHandleClientApplicationError).toHaveBeenCalledTimes(1); + }); + + expect(advancedSettings$.getState().resolution).toBe(initialResolution); + }); + }); + + describe('handleBitrateModeChange', () => { + it('applies bitrate preset to publisher then updates store', async () => { + const publisher = createMockPublisher(); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleBitrateModeChange('bw_saver'); + }); + + await waitFor(() => { + expect(publisher.setVideoBitratePreset).toHaveBeenCalledWith('bw_saver'); + expect(advancedSettings$.getState().bitrateMode).toBe('bw_saver'); + }); + }); + + it('uses preview publisher when no meeting room publisher is active', async () => { + const previewPublisher = createMockPublisher(); + mockUsePreviewPublisherContext.mockReturnValue({ + publisher: previewPublisher, + } as unknown as PreviewPublisherContextType); + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleBitrateModeChange('bw_saver'); + }); + + await waitFor(() => { + expect(previewPublisher.setVideoBitratePreset).toHaveBeenCalledWith('bw_saver'); + }); + }); + + it('does not update store when bitrate preset update fails', async () => { + const publisher = createMockPublisher(); + (publisher.setVideoBitratePreset as Mock).mockRejectedValue(new Error('unsupported')); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + const initialBitrateMode = advancedSettings$.getState().bitrateMode; + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleBitrateModeChange('bw_saver'); + }); + + await waitFor(() => { + expect(mockHandleClientApplicationError).toHaveBeenCalledTimes(1); + }); + + expect(advancedSettings$.getState().bitrateMode).toBe(initialBitrateMode); + }); + }); + + describe('handleCustomVideoBitrateChange', () => { + it('applies custom bitrate to publisher then updates store when mode is custom', async () => { + const publisher = createMockPublisher(); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'custom', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleCustomVideoBitrateChange(750_000); + }); + + await waitFor(() => { + expect(publisher.setMaxVideoBitrate).toHaveBeenCalledWith(750_000); + expect(advancedSettings$.getState().customVideoBitrate).toBe(750_000); + }); + }); + + it('updates store without calling the publisher when mode is not custom', async () => { + const publisher = createMockPublisher(); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleCustomVideoBitrateChange(750_000); + }); + + await waitFor(() => { + expect(advancedSettings$.getState().customVideoBitrate).toBe(750_000); + }); + + expect(publisher.setMaxVideoBitrate).not.toHaveBeenCalled(); + expect(publisher.setVideoBitratePreset).not.toHaveBeenCalled(); + }); + + it('does not update store when custom bitrate update fails', async () => { + const publisher = createMockPublisher(); + (publisher.setMaxVideoBitrate as Mock).mockRejectedValue(new Error('unsupported')); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + const initialCustomVideoBitrate = advancedSettings$.getState().customVideoBitrate; + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'custom', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleCustomVideoBitrateChange(750_000); + }); + + await waitFor(() => { + expect(mockHandleClientApplicationError).toHaveBeenCalledTimes(1); + }); + + expect(advancedSettings$.getState().customVideoBitrate).toBe(initialCustomVideoBitrate); + }); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/useAdvancedSettingsVideoHandlers.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/useAdvancedSettingsVideoHandlers.ts new file mode 100644 index 00000000..a5a966a3 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/useAdvancedSettingsVideoHandlers.ts @@ -0,0 +1,89 @@ +import usePublisherContext from '@hooks/usePublisherContext'; +import usePreviewPublisherContext from '@hooks/usePreviewPublisherContext'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import { makeApplicationErrorMapper } from '@core/errors'; +import { handleClientApplicationError } from '@ui/helpers'; +import { + applyFrameRate, + applyResolution, + applyBitrate, +} from '@Context/PublisherProvider/useApplyAdvancedSettings'; +import { t } from 'i18next'; +import type { + AdvancedSettingsBitrateMode, + AdvancedSettingsCustomVideoBitrate, + AdvancedSettingsFrameRate, + AdvancedSettingsResolution, +} from '../../types/types'; +import { ADVANCED_SETTINGS_BITRATE_MODE } from '../../types/types'; + +const { setBitrateMode, setCustomVideoBitrate, setFrameRate, setResolution } = + advancedSettings$.actions; + +type UseAdvancedSettingsVideoHandlersArgs = { + bitrateMode: AdvancedSettingsBitrateMode; + customVideoBitrate: AdvancedSettingsCustomVideoBitrate; +}; + +type UseAdvancedSettingsVideoHandlers = { + handleFrameRateChange: (value: AdvancedSettingsFrameRate) => Promise; + handleResolutionChange: (value: AdvancedSettingsResolution) => Promise; + handleBitrateModeChange: (value: AdvancedSettingsBitrateMode) => Promise; + handleCustomVideoBitrateChange: (value: AdvancedSettingsCustomVideoBitrate) => Promise; +}; + +const useAdvancedSettingsVideoHandlers = ({ + bitrateMode, + customVideoBitrate, +}: UseAdvancedSettingsVideoHandlersArgs): UseAdvancedSettingsVideoHandlers => { + const { publisher: meetingRoomPublisher } = usePublisherContext(); + const { publisher: previewPublisher } = usePreviewPublisherContext(); + const publisher = meetingRoomPublisher ?? previewPublisher ?? null; + + const handleFrameRateChange = async (value: AdvancedSettingsFrameRate) => { + try { + await applyFrameRate(publisher, value); + setFrameRate(value); + } catch (error) { + handleClientApplicationError(makeApplicationErrorMapper(t('errors.unknown'))(error)); + } + }; + + const handleResolutionChange = async (value: AdvancedSettingsResolution) => { + try { + await applyResolution(publisher, value); + setResolution(value); + } catch (error) { + handleClientApplicationError(makeApplicationErrorMapper(t('errors.unknown'))(error)); + } + }; + + const handleBitrateModeChange = async (value: AdvancedSettingsBitrateMode) => { + try { + await applyBitrate(publisher, value, customVideoBitrate); + setBitrateMode(value); + } catch (error) { + handleClientApplicationError(makeApplicationErrorMapper(t('errors.unknown'))(error)); + } + }; + + const handleCustomVideoBitrateChange = async (value: AdvancedSettingsCustomVideoBitrate) => { + try { + if (bitrateMode === ADVANCED_SETTINGS_BITRATE_MODE.custom) { + await applyBitrate(publisher, bitrateMode, value); + } + setCustomVideoBitrate(value); + } catch (error) { + handleClientApplicationError(makeApplicationErrorMapper(t('errors.unknown'))(error)); + } + }; + + return { + handleFrameRateChange, + handleResolutionChange, + handleBitrateModeChange, + handleCustomVideoBitrateChange, + }; +}; + +export default useAdvancedSettingsVideoHandlers; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/index.tsx new file mode 100644 index 00000000..c24c46ba --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsDialog } from './AdvancedSettingsDialog'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/types/types.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/types/types.ts new file mode 100644 index 00000000..4859d66b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AdvancedSettingsDialog/types/types.ts @@ -0,0 +1,49 @@ +import type { Resolution } from '../../../env'; + +export type AdvancedSettingsTab = 'general' | 'video' | 'audio' | 'statistics'; + +export type AdvancedSettingsBitrateMode = 'default' | 'bw_saver' | 'extra_bw_saver' | 'custom'; + +export const ADVANCED_SETTINGS_BITRATE_MODE = { + default: 'default', + bwSaver: 'bw_saver', + extraBwSaver: 'extra_bw_saver', + custom: 'custom', +} as const satisfies Record; + +export type AdvancedSettingsCustomVideoBitrate = number; + +export type AdvancedSettingsCodecMode = 'automatic' | 'manual'; + +export const ADVANCED_SETTINGS_CODEC_MODE = { + automatic: 'automatic' as AdvancedSettingsCodecMode, + manual: 'manual' as AdvancedSettingsCodecMode, +}; + +export type AdvancedSettingsVideoCodec = 'vp8' | 'vp9' | 'h264'; + +export type AdvancedSettingsManualCodecOrder = [ + AdvancedSettingsVideoCodec, + AdvancedSettingsVideoCodec, + AdvancedSettingsVideoCodec, +]; + +export type AdvancedSettingsFrameRate = NonNullable< + import('@vonage/client-sdk-video').GetUserMediaProperties['frameRate'] +>; + +export type AdvancedSettingsResolution = Resolution; + +export type AdvancedSettingsAudioBitrateMode = 'automatic' | 'custom'; + +export const ADVANCED_SETTINGS_AUDIO_BITRATE_MODE = { + automatic: 'automatic' as AdvancedSettingsAudioBitrateMode, + custom: 'custom' as AdvancedSettingsAudioBitrateMode, +}; + +export type AdvancedSettingsCustomAudioBitrate = number; + +export type AdvancedSettingsSelectOption = { + value: TValue; + label: string; +}; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AvatarInitials/AvatarInitials.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AvatarInitials/AvatarInitials.spec.tsx new file mode 100644 index 00000000..b82ab413 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AvatarInitials/AvatarInitials.spec.tsx @@ -0,0 +1,23 @@ +import { afterEach, describe, expect, it } from 'vitest'; +import { cleanup, render, screen } from '@testing-library/react'; +import AvatarInitials from './AvatarInitials'; + +describe('AvatarInitials', () => { + afterEach(() => { + cleanup(); + }); + + it('should render initials when given', () => { + const initials = 'HI'; + render(); + + expect(screen.getByText(initials)).toBeVisible(); + expect(screen.queryByTestId('PersonIcon')).not.toBeInTheDocument(); + }); + + it('should render person avatar when no initials', () => { + render(); + + expect(screen.getByTestId('PersonIcon')).toBeVisible(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AvatarInitials/AvatarInitials.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AvatarInitials/AvatarInitials.tsx new file mode 100644 index 00000000..46240185 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AvatarInitials/AvatarInitials.tsx @@ -0,0 +1,56 @@ +import { ReactElement } from 'react'; +import Avatar from '@mui/material/Avatar'; +import type { SxProps } from '@mui/material'; +import getParticipantColor from '../../utils/getParticipantColor'; + +export type InitialsProps = { + initials?: string; + username?: string; + sx?: SxProps; + height?: number; + width?: number; + 'data-testid'?: string; +}; + +/** + * AvatarInitials Component + * + * This component returns the avatar for the given initials + * @param {InitialsProps} props - the props for the component. + * @property {string} initials - (optional) the initials for which the avatar is generated. + * @property {string} username - (optional) the username is used to determine the avatar color. + * @property {SxProps} sx - the styling properties of the parent component. + * @property {number} height - (optional) the height of the avatar. + * @property {number} width - (optional) the width of the avatar. + * @returns {ReactElement} The avatar initials component. + */ +const AvatarInitials = ({ + initials = '', + username = '', + sx = {}, + height = 80, + width = 80, + 'data-testid': dataTestId, +}: InitialsProps): ReactElement => { + const diameter = Math.min(height, width) * 0.5; + + return ( + + {initials} + + ); +}; + +export default AvatarInitials; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AvatarInitials/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AvatarInitials/index.tsx new file mode 100644 index 00000000..1576e2ec --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/AvatarInitials/index.tsx @@ -0,0 +1,3 @@ +import AvatarInitials from './AvatarInitials'; + +export default AvatarInitials; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/AddBackgroundEffect/AddBackgroundEffectLayout/AddBackgroundEffectLayout.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/AddBackgroundEffect/AddBackgroundEffectLayout/AddBackgroundEffectLayout.spec.tsx new file mode 100644 index 00000000..780bec74 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/AddBackgroundEffect/AddBackgroundEffectLayout/AddBackgroundEffectLayout.spec.tsx @@ -0,0 +1,87 @@ +import { render, screen, fireEvent, waitFor } from '@testing-library/react'; +import { vi, describe, it, expect, beforeAll } from 'vitest'; +import AddBackgroundEffectLayout from './AddBackgroundEffectLayout'; +import enTranslations from '../../../../locales/en.json'; + +vi.mock('react-i18next', () => ({ + useTranslation: () => ({ + t: (key: string, options?: Record) => { + const translations: Record = { + 'backgroundEffects.invalidFileType': enTranslations['backgroundEffects.invalidFileType'], + 'backgroundEffects.fileTooLarge': enTranslations['backgroundEffects.fileTooLarge'], + 'backgroundEffects.maxSize': enTranslations['backgroundEffects.maxSize'], + 'backgroundEffects.addBackground': enTranslations['backgroundEffects.addBackground'], + }; + + let translation = translations[key] || key; + + if (options && typeof translation === 'string') { + Object.keys(options).forEach((param) => { + translation = translation.replace(`{{${param}}}`, String(options[param])); + }); + } + + return translation; + }, + }), +})); + +vi.mock('@utils/useImageStorage/useImageStorage', () => ({ + __esModule: true, + default: () => ({ + storageError: '', + handleImageFromFile: vi.fn(() => ({ + dataUrl: 'data:image/png;base64,MOCKED', + })), + handleImageFromLink: vi.fn(() => ({ + dataUrl: 'data:image/png;base64,MOCKED_LINK', + })), + }), +})); + +describe('AddBackgroundEffectLayout', () => { + const cb = vi.fn(); + + beforeAll(() => { + vi.clearAllMocks(); + }); + + it('should render', () => { + render( + + ); + expect(screen.getByTestId('background-add-background')).toBeInTheDocument(); + expect(screen.getByTestId('vivid-icon-add-image-line')).toBeInTheDocument(); + }); + + it('shows error for invalid file type', async () => { + render( + + ); + const input = document.querySelector('input[type="file"]') as HTMLInputElement; + const file = new File(['dummy'], 'test.txt', { type: 'text/plain' }); + fireEvent.change(input, { target: { files: [file] } }); + expect( + await screen.findByText(/Only JPG, PNG, GIF, or BMP images are allowed/i) + ).toBeInTheDocument(); + }); + + it('shows error for file size too large', async () => { + render( + + ); + const input = document.querySelector('input[type="file"]') as HTMLInputElement; + const file = new File(['x'.repeat(3 * 1024 * 1024)], 'big.png', { type: 'image/png' }); + Object.defineProperty(file, 'size', { value: 3 * 1024 * 1024 }); + fireEvent.change(input, { target: { files: [file] } }); + expect(await screen.findByText(/Image must be less than 2MB/i)).toBeInTheDocument(); + }); + + it('handles valid image file upload', async () => { + render(); + const input = document.querySelector('input[type="file"]') as HTMLInputElement; + const file = new File(['dummy'], 'test.png', { type: 'image/png' }); + fireEvent.change(input, { target: { files: [file] } }); + await waitFor(() => expect(cb).toHaveBeenCalledWith('data:image/png;base64,MOCKED')); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/AddBackgroundEffect/AddBackgroundEffectLayout/AddBackgroundEffectLayout.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/AddBackgroundEffect/AddBackgroundEffectLayout/AddBackgroundEffectLayout.tsx new file mode 100644 index 00000000..164bd30e --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/AddBackgroundEffect/AddBackgroundEffectLayout/AddBackgroundEffectLayout.tsx @@ -0,0 +1,115 @@ +import { ChangeEvent, ReactElement, useState, useRef } from 'react'; +import { useTranslation } from 'react-i18next'; +import Box from '@mui/material/Box'; +import Snackbar from '@mui/material/Snackbar'; +import Alert from '@mui/material/Alert'; +import VividIcon from '@ui/VividIcon'; +import { env } from '../../../../env'; +import { ALLOWED_TYPES, MAX_SIZE_MB } from '../../../../utils/constants'; +import useImageStorage from '@utils/useImageStorage/useImageStorage'; +import SelectableOption from '@components/BackgroundEffects/SelectableOption'; + +export type AddBackgroundEffectLayoutProps = { + customBackgroundImageChange: (dataUrl: string) => void; + backgroundSelected: string; +}; + +/** + * AddBackgroundEffectLayout Component + * + * This component manages the UI for adding background effects via file upload. + * @param {AddBackgroundEffectLayoutProps} props - The props for the component. + * @property {Function} customBackgroundImageChange - Callback function to handle background image change. + * @property {string} backgroundSelected - The currently selected background effect key. + * @returns {ReactElement} The add background effect layout component. + */ +const AddBackgroundEffectLayout = ({ + customBackgroundImageChange, + backgroundSelected, +}: AddBackgroundEffectLayoutProps): ReactElement => { + const [fileError, setFileError] = useState(''); + const [showError, setShowError] = useState(false); + const { storageError, handleImageFromFile } = useImageStorage(); + const { t } = useTranslation(); + const fileInputRef = useRef(null); + + const handleFileChange = async (e: ChangeEvent) => { + const { files } = e.target; + if (!files || files.length === 0) { + return; + } + + const file = files[0]; + if (!file) { + return; + } + + if (!ALLOWED_TYPES.includes(file.type)) { + setFileError(t('backgroundEffects.invalidFileType')); + setShowError(true); + return; + } + + if (file.size > MAX_SIZE_MB * 1024 * 1024) { + setFileError(t('backgroundEffects.fileTooLarge', { maxSize: MAX_SIZE_MB })); + setShowError(true); + return; + } + + try { + const newImage = await handleImageFromFile(file); + if (newImage) { + setFileError(''); + setShowError(false); + customBackgroundImageChange(newImage.dataUrl); + } + } catch { + setFileError(t('backgroundEffects.processingError')); + setShowError(true); + } + }; + + const handleClick = () => { + fileInputRef.current?.click(); + }; + + const handleCloseError = () => { + setFileError(''); + setShowError(false); + }; + + const errorMessage = fileError || storageError; + + return ( + + + + } + /> + + + + {errorMessage} + + + + ); +}; + +export default AddBackgroundEffectLayout; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/AddBackgroundEffect/AddBackgroundEffectLayout/Index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/AddBackgroundEffect/AddBackgroundEffectLayout/Index.tsx new file mode 100644 index 00000000..ae8ccca1 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/AddBackgroundEffect/AddBackgroundEffectLayout/Index.tsx @@ -0,0 +1,3 @@ +import AddBackgroundEffectLayout from './AddBackgroundEffectLayout'; + +export default AddBackgroundEffectLayout; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/BackgroundEffectOptions.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/BackgroundEffectOptions.spec.tsx new file mode 100644 index 00000000..4ce68f1d --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/BackgroundEffectOptions.spec.tsx @@ -0,0 +1,60 @@ +import { render as renderBase, screen, waitFor } from '@testing-library/react'; +import { describe, it, expect, beforeEach, vi } from 'vitest'; +import { ReactElement } from 'react'; +import BackgroundEffectOptions from './BackgroundEffectOptions'; +import { makeTestProvider, providers } from '@test/providers'; +import { setupWindowNavigatorMock, makeMediaStreamMock } from '@web-test/fixtures'; + +describe('BackgroundEffectOptions', () => { + beforeEach(() => { + vi.clearAllMocks(); + + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + enumerateDevices: Promise.resolve([]), + getUserMedia: Promise.resolve( + makeMediaStreamMock({ + getVideoTracks: [], + getAudioTracks: [], + }) + ), + getDisplayMedia: Promise.resolve(makeMediaStreamMock({})), + getSupportedConstraints: vi.fn().mockReturnValue({}), + }, + }); + + const { permissions } = globalThis.navigator; + + vi.spyOn(permissions, 'query').mockResolvedValue({ state: 'granted' } as PermissionStatus); + }); + + it('renders background options grid with effects and gallery', async () => { + render(); + + await waitFor(() => { + expect(screen.getByTestId('vivid-icon-remove-line')).toBeInTheDocument(); + expect(screen.getByTestId('vivid-icon-blur-line')).toBeInTheDocument(); + + expect(screen.getByAltText('Bookshelf Room')).toBeInTheDocument(); + expect(screen.getByAltText('Busy Room')).toBeInTheDocument(); + }); + }); +}); + +function render(ui: ReactElement) { + const { wrapper, ...context } = makeTestProvider([ + providers.user, + providers.session, + providers.publisher, + providers.backgroundPublisher, + providers.runtime, + ]); + + return { + ...context, + ...renderBase(ui, { + wrapper, + }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/BackgroundEffectOptions.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/BackgroundEffectOptions.tsx new file mode 100644 index 00000000..870cfcaa --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/BackgroundEffectOptions.tsx @@ -0,0 +1,63 @@ +import { ReactElement } from 'react'; +import classNames from 'classnames'; +import Box from '@mui/material/Box'; +import EffectOptionButtons from '../EffectOptionButtons/EffectOptionButtons'; +import BackgroundGallery from '../BackgroundGallery/BackgroundGallery'; +import { DEFAULT_SELECTABLE_OPTION_WIDTH } from '@utils/constants'; + +type BackgroundEffectOptionsProps = { + mode: 'meeting' | 'waiting'; +}; + +/** + * BackgroundEffectOptions Component + * + * This component manages the tabs for background effects, including selecting existing backgrounds + * and adding new ones. + * @param {BackgroundEffectOptionsProps} props - The props for the component. + * @property {string} mode - The mode of the background effect ('meeting' or 'waiting'). + * @returns {ReactElement} The background effect tabs component. + */ +const BackgroundEffectOptions = ({ mode }: BackgroundEffectOptionsProps): ReactElement => { + return ( + + + + + + + + + ); +}; + +export default BackgroundEffectOptions; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/Index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/Index.tsx new file mode 100644 index 00000000..cee563bc --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/Index.tsx @@ -0,0 +1 @@ +export { default } from './BackgroundEffectOptions'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/BackgroundEffectsLayout.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/BackgroundEffectsLayout.spec.tsx new file mode 100644 index 00000000..e0585ac0 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/BackgroundEffectsLayout.spec.tsx @@ -0,0 +1,194 @@ +import { render as renderBase, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { ReactElement } from 'react'; +import { makeTestProvider, providers } from '@test/providers'; +import BackgroundEffectsLayout from './BackgroundEffectsLayout'; +import enTranslations from '../../../locales/en.json'; +import composeProviders from '@web/helpers/composeProviders'; +import SuspenseBoundary from '@web/components/SuspenseBoundary/SuspenseBoundary'; +import { setupWindowNavigatorMock, makeMediaStreamMock } from '@web-test/fixtures'; + +const applyBackgroundFilterMock = vi.fn(() => Promise.resolve()); + +vi.mock('../../../utils/backgroundFilter/applyBackgroundFilter/applyBackgroundFilter', () => ({ + default: () => applyBackgroundFilterMock(), +})); + +vi.mock('react-i18next', () => ({ + useTranslation: () => ({ + t: (key: string) => { + const translations: Record = { + 'backgroundEffects.title': enTranslations['backgroundEffects.title'], + 'button.cancel': enTranslations['button.cancel'], + 'button.apply': enTranslations['button.apply'], + }; + return translations[key] || key; + }, + }), +})); + +describe('BackgroundEffectsLayout (Meeting room)', () => { + const handleClose = vi.fn(); + + beforeEach(() => { + handleClose.mockClear(); + applyBackgroundFilterMock.mockClear(); + + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + enumerateDevices: Promise.resolve([]), + getUserMedia: Promise.resolve( + makeMediaStreamMock({ + getTracks: vi.fn().mockReturnValue([]), + getAudioTracks: vi.fn().mockReturnValue([]), + getVideoTracks: vi.fn().mockReturnValue([]), + }) + ), + }, + permissions: { + query: vi.fn().mockResolvedValue({ state: 'granted' } as PermissionStatus), + }, + }); + }); + + it('renders when open', async () => { + render(); + await waitFor(() => expect(screen.getByTestId('right-panel-title')).toBeInTheDocument()); + expect(screen.getByTestId('right-panel-title')).toHaveTextContent('Video effects'); + expect(screen.getByTestId('background-video-container')).toBeInTheDocument(); + expect(screen.getByTestId('background-none')).toBeInTheDocument(); + expect(screen.getByTestId('background-bg1')).toBeInTheDocument(); + expect(screen.getByTestId('background-effect-cancel-button')).toBeInTheDocument(); + expect(screen.getByTestId('background-effect-apply-button')).toBeInTheDocument(); + }); + + it('does not render when closed', async () => { + const { container } = render( + + ); + await waitFor(() => expect(container).toBeEmptyDOMElement()); + }); + + it('calls handleClose when Cancel is clicked', async () => { + render(); + await userEvent.click(screen.getByTestId('background-effect-cancel-button')); + expect(handleClose).toHaveBeenCalled(); + }); + + it('calls handleClose and changeBackground when Apply is clicked', async () => { + render(); + await userEvent.click(screen.getByTestId('background-effect-apply-button')); + expect(handleClose).toHaveBeenCalled(); + expect(applyBackgroundFilterMock).toHaveBeenCalled(); + }); + + it('calls setBackgroundSelected when effect option none is clicked', async () => { + render(); + await userEvent.click(screen.getByTestId('background-none')); + }); + + it('calls setBackgroundSelected when a background gallery option is clicked', async () => { + render(); + await userEvent.click(screen.getByTestId('background-bg8')); + }); + + it('displays correct English title, subtitle, cancel, and apply actions', async () => { + render(); + await waitFor(() => expect(screen.getByText('Cancel')).toBeInTheDocument()); + expect(screen.getByText('Apply')).toBeInTheDocument(); + }); +}); + +describe('BackgroundEffects (Waiting Room)', () => { + const handleClose = vi.fn(); + + beforeEach(() => { + handleClose.mockClear(); + applyBackgroundFilterMock.mockClear(); + + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + enumerateDevices: Promise.resolve([]), + getUserMedia: Promise.resolve( + makeMediaStreamMock({ + getVideoTracks: [], + getAudioTracks: [], + }) + ), + }, + permissions: { + query: vi.fn().mockResolvedValue({ state: 'granted' } as PermissionStatus), + }, + }); + }); + + it('renders when open', async () => { + render(); + await waitFor(() => + expect(screen.getByTestId('background-video-container')).toBeInTheDocument() + ); + expect(screen.getByTestId('background-none')).toBeInTheDocument(); + expect(screen.getByTestId('background-bg1')).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /Cancel/i })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /Apply/i })).toBeInTheDocument(); + }); + + it('does not render when closed', async () => { + const { container } = render( + + ); + await waitFor(() => expect(container).toBeEmptyDOMElement()); + }); + + it('calls handleClose when Cancel is clicked', async () => { + render(); + await userEvent.click(screen.getByTestId('background-effect-cancel-button')); + expect(handleClose).toHaveBeenCalled(); + }); + + it('calls handleClose and changeBackground when Apply is clicked', async () => { + render(); + await userEvent.click(screen.getByTestId('background-effect-apply-button')); + expect(handleClose).toHaveBeenCalled(); + expect(applyBackgroundFilterMock).toHaveBeenCalled(); + }); + + it('calls setBackgroundSelected when effect option none is clicked', async () => { + render(); + await userEvent.click(screen.getByTestId('background-none')); + }); + + it('calls setBackgroundSelected when a background gallery option is clicked', async () => { + render(); + await userEvent.click(screen.getByTestId('background-bg8')); + }); + + it('displays correct English title, subtitle, cancel, and apply actions', async () => { + render(); + await waitFor(() => expect(screen.getByText('Cancel')).toBeInTheDocument()); + expect(screen.getByText('Apply')).toBeInTheDocument(); + }); +}); + +function render(ui: ReactElement) { + const { wrapper: roomWrapper, ...context } = makeTestProvider([ + providers.user, + providers.session, + providers.publisher, + providers.backgroundPublisher, + providers.previewPublisher, + providers.runtime, + ]); + + const wrapper = composeProviders(SuspenseBoundary, roomWrapper); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/BackgroundEffectsLayout.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/BackgroundEffectsLayout.tsx new file mode 100644 index 00000000..75db6854 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/BackgroundEffectsLayout.tsx @@ -0,0 +1,165 @@ +import { ReactElement, useCallback, useEffect } from 'react'; +import { useTranslation } from 'react-i18next'; +import useMediaQuery from '@mui/material/useMediaQuery'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import usePublisherContext from '../../../hooks/usePublisherContext'; +import BackgroundVideoContainer from '../BackgroundVideoContainer'; +import BackgroundEffectOptions from '../BackgroundEffectOptions/BackgroundEffectOptions'; +import getInitialBackgroundFilter from '../../../utils/backgroundFilter/getInitialBackgroundFilter/getInitialBackgroundFilter'; +import useBackgroundPublisherContext from '../../../hooks/useBackgroundPublisherContext'; +import RightPanelTitle from '../../MeetingRoom/RightPanel/RightPanelTitle'; +import usePreviewPublisherContext from '../../../hooks/usePreviewPublisherContext'; + +export type BackgroundEffectsLayoutProps = { + isOpen: boolean; + handleClose: () => void; + mode: 'meeting' | 'waiting'; +}; + +/** + * BackgroundEffectsLayout Component + * + * This component provides a layout for managing background effects, including video preview, + * effect selection tabs, and action buttons. + * @param {BackgroundEffectsLayoutProps} props - The properties for the component. + * @property {boolean} isOpen - Whether the background effects layout is open. + * @property {Function} handleClose - Function to close the background effects layout. + * @property {string} mode - The mode of the background effects ('meeting' or 'waiting'). + * @returns {ReactElement | false} The background effects layout component or false if not open. + */ +const BackgroundEffectsLayout = ({ + isOpen, + handleClose, + mode, +}: BackgroundEffectsLayoutProps): ReactElement | false => { + const { t } = useTranslation(); + + const isShortScreen = useMediaQuery('(max-height:825px)'); + const publisherContext = usePublisherContext(); + const previewPublisherContext = usePreviewPublisherContext(); + + const { publisher, changeBackground, isVideoEnabled } = + mode === 'meeting' ? publisherContext : previewPublisherContext; + + const { + publisherVideoElement, + changeBackground: changeBackgroundPreview, + backgroundSelected, + setBackgroundSelected, + } = useBackgroundPublisherContext(); + + const handleApplyBackgroundSelect = () => { + void changeBackground(backgroundSelected); + handleClose(); + }; + + const setInitialBackgroundReplacement = useCallback(() => { + const selectedBackgroundOption = getInitialBackgroundFilter(publisher); + setBackgroundSelected(selectedBackgroundOption); + return selectedBackgroundOption; + }, [publisher, setBackgroundSelected]); + + useEffect(() => { + if (isOpen) { + const currentOption = setInitialBackgroundReplacement(); + void changeBackgroundPreview(currentOption); + } + }, [isOpen, publisher, changeBackgroundPreview, setInitialBackgroundReplacement]); + + const buttonGroup = ( + + + + + ); + + if (!isOpen) { + return false; + } + + // MeetingRoom layout + if (mode === 'meeting') { + return ( + + + + + + + + + + {buttonGroup} + + ); + } + + // WaitingRoom layout + return ( + <> + + + + + + + + + + {buttonGroup} + + ); +}; + +export default BackgroundEffectsLayout; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/index.tsx new file mode 100644 index 00000000..cdeb11f9 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/index.tsx @@ -0,0 +1,3 @@ +import BackgroundEffectsLayout from './BackgroundEffectsLayout'; + +export default BackgroundEffectsLayout; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundGallery/BackgroundGallery.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundGallery/BackgroundGallery.spec.tsx new file mode 100644 index 00000000..402c1295 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundGallery/BackgroundGallery.spec.tsx @@ -0,0 +1,210 @@ +import { describe, expect, it, vi, beforeEach } from 'vitest'; +import { render as renderBase, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import BackgroundGallery from './BackgroundGallery'; +import enTranslations from '../../../locales/en.json'; +import { makeTestProvider, providers, ProviderOptions } from '@test/providers'; +import { ReactElement } from 'react'; +import { + setupWindowNavigatorMock, + makeMediaStreamMock, + makeMediaDeviceInfos, +} from '@web-test/fixtures'; +import { mediaDevices$ } from '@core/stores'; + +const mockDevices = makeMediaDeviceInfos(); + +const customImages = [ + { id: 'custom1', dataUrl: 'data:image/png;base64,custom1' }, + { id: 'custom2', dataUrl: 'data:image/png;base64,custom2' }, +]; + +const backgrounds = [ + { + id: 'bg4', + file: 'hogwarts.jpg', + name: enTranslations['backgroundEffects.backgrounds.hogwarts'], + }, + { id: 'bg5', file: 'library.jpg', name: enTranslations['backgroundEffects.backgrounds.library'] }, + { + id: 'bg6', + file: 'new-york.jpg', + name: enTranslations['backgroundEffects.backgrounds.newYork'], + }, + { id: 'bg7', file: 'plane.jpg', name: enTranslations['backgroundEffects.backgrounds.plane'] }, +]; + +const mockDeleteImageFromStorage = vi.fn(); +const mockGetImagesFromStorage = vi.fn(() => customImages); +const mockDeleteCustomImage = vi.fn(); +const mockHandleBackgroundChange = vi.fn(); + +vi.mock('@utils/useImageStorage/useImageStorage', () => ({ + __esModule: true, + default: () => ({ + getImagesFromStorage: mockGetImagesFromStorage, + deleteImageFromStorage: mockDeleteImageFromStorage, + }), +})); + +describe('BackgroundGallery', () => { + beforeEach(() => { + vi.clearAllMocks(); + + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + enumerateDevices: Promise.resolve(mockDevices), + getUserMedia: Promise.resolve( + makeMediaStreamMock({ + getVideoTracks: [], + getAudioTracks: [], + }) + ), + }, + }); + + // Initialize the mediaDevices$ store with mock devices to prevent useSyncPublisherDevices from disabling video/audio + mediaDevices$.setState((state) => ({ + ...state, + mediaDeviceInfo: mockDevices, + })); + + const { permissions } = globalThis.navigator; + + vi.spyOn(permissions, 'query').mockResolvedValue({ state: 'granted' } as PermissionStatus); + }); + + it('renders all built-in backgrounds as selectable options', async () => { + render(); + await waitFor(() => { + backgrounds.forEach((bg) => { + expect(screen.getByTestId(`background-${bg.id}`)).toBeInTheDocument(); + }); + }); + }); + + it('renders custom images as selectable options', async () => { + render(); + await waitFor(() => { + customImages.forEach((img) => { + expect(screen.getByTestId(`background-${img.id}`)).toBeInTheDocument(); + }); + }); + }); + + it('sets the selected built-in background', async () => { + render(, { + backgroundPublisherContext: { + __interceptor: (context) => { + context.handleBackgroundChange = mockHandleBackgroundChange; + }, + }, + }); + const duneViewOption = screen.getByTestId('background-bg3'); + await userEvent.click(duneViewOption); + expect(mockHandleBackgroundChange).toHaveBeenCalledWith('dune-view.jpg'); + }); + + it('sets the selected custom image', async () => { + render(, { + backgroundPublisherContext: { + __interceptor: (context) => { + context.handleBackgroundChange = mockHandleBackgroundChange; + }, + }, + }); + const customOption = screen.getByTestId('background-custom1'); + await userEvent.click(customOption); + expect(mockHandleBackgroundChange).toHaveBeenCalledWith('data:image/png;base64,custom1'); + }); + + it('marks the built-in background as selected', async () => { + render(, { + backgroundPublisherContext: { + __onCreated: (context) => { + context.backgroundSelected = 'plane.jpg'; + }, + }, + }); + const planeOption = screen.getByTestId('background-bg7'); + await waitFor(() => { + expect(planeOption.getAttribute('aria-pressed')).toBe('true'); + }); + }); + + it('marks the custom image as selected', async () => { + render(, { + backgroundPublisherContext: { + __onCreated: (context) => { + context.backgroundSelected = 'data:image/png;base64,custom2'; + }, + }, + }); + const customOption = screen.getByTestId('background-custom2'); + + await waitFor(() => { + expect(customOption.getAttribute('aria-pressed')).toBe('true'); + }); + }); + + it('calls onDelete when deleting a custom image', async () => { + render(, { + backgroundPublisherContext: { + __interceptor: (context) => { + context.deleteCustomImage = mockDeleteCustomImage; + }, + }, + }); + const deleteButtons = screen.getAllByLabelText('Delete custom background'); + await userEvent.click(deleteButtons[0]); + expect(mockDeleteCustomImage).toHaveBeenCalledWith('custom1'); + }); + + it("doesn't delete custom image if it's selected", async () => { + render(, { + backgroundPublisherContext: { + __onCreated: (context) => { + context.backgroundSelected = 'data:image/png;base64,custom1'; + }, + }, + }); + const deleteButton = screen.getByTestId('background-delete-custom1'); + await userEvent.click(deleteButton); + expect(mockDeleteCustomImage).not.toHaveBeenCalled(); + }); +}); + +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; + sessionContext?: ProviderOptions['SessionContext']; + publisherContext?: ProviderOptions['PublisherContext']; + backgroundPublisherContext?: ProviderOptions['BackgroundPublisherContext']; +}; + +function render( + ui: ReactElement, + { userContext, sessionContext, publisherContext, backgroundPublisherContext }: RenderOptions = {} +) { + const { wrapper, ...context } = makeTestProvider( + [ + providers.user, + providers.session, + providers.publisher, + providers.backgroundPublisher, + providers.runtime, + ], + { + userContext, + sessionContext, + publisherContext, + backgroundPublisherContext, + runtimeContext: undefined, + } + ); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundGallery/BackgroundGallery.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundGallery/BackgroundGallery.tsx new file mode 100644 index 00000000..95d2f9fe --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundGallery/BackgroundGallery.tsx @@ -0,0 +1,118 @@ +import { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import classNames from 'classnames'; +import Box from '@mui/material/Box'; +import Tooltip from '@mui/material/Tooltip'; +import IconButton from '@mui/material/IconButton'; +import VividIcon from '@ui/VividIcon'; +import { BACKGROUNDS_PATH } from '@utils/constants'; +import SelectableOption from '../SelectableOption'; +import useBackgroundPublisherContext from '@hooks/useBackgroundPublisherContext'; + +/** + * Renders a group of selectable images for background replacement in a meeting room. + * + * Each button represents a different background image option. + * @returns {ReactElement} A horizontal stack of selectable option buttons. + */ +const BackgroundGallery = (): ReactElement => { + const { backgroundSelected, handleBackgroundChange, customImages, deleteCustomImage } = + useBackgroundPublisherContext(); + const { t } = useTranslation(); + + const backgrounds = [ + { + id: 'bg1', + file: 'bookshelf-room.jpg', + name: t('backgroundEffects.backgrounds.bookshelfRoom'), + }, + { id: 'bg2', file: 'busy-room.jpg', name: t('backgroundEffects.backgrounds.busyRoom') }, + { id: 'bg3', file: 'dune-view.jpg', name: t('backgroundEffects.backgrounds.duneView') }, + { id: 'bg4', file: 'hogwarts.jpg', name: t('backgroundEffects.backgrounds.hogwarts') }, + { id: 'bg5', file: 'library.jpg', name: t('backgroundEffects.backgrounds.library') }, + { id: 'bg6', file: 'new-york.jpg', name: t('backgroundEffects.backgrounds.newYork') }, + { id: 'bg7', file: 'plane.jpg', name: t('backgroundEffects.backgrounds.plane') }, + { id: 'bg8', file: 'white-room.jpg', name: t('backgroundEffects.backgrounds.whiteRoom') }, + ]; + + return ( + <> + {customImages.map(({ id, dataUrl }) => { + const isSelected = backgroundSelected === dataUrl; + return ( + + handleBackgroundChange(dataUrl)} + image={dataUrl} + > + + { + e.stopPropagation(); + if (!isSelected) { + deleteCustomImage(id); + } + }} + size="small" + className={classNames({ + 'text-vera-text-disabled bg-vera-disabled cursor-default': isSelected, + 'bg-vera-dark-grey-opacity! text-vera-on-dark-grey hover:bg-vera-dark-grey! cursor-pointer': + !isSelected, + })} + sx={{ + position: 'absolute', + top: -8, + right: -8, + zIndex: 10, + }} + > + + + + + + ); + })} + + {backgrounds.map((bg) => { + const path = `${BACKGROUNDS_PATH}/${bg.file}`; + return ( + handleBackgroundChange(bg.file)} + image={path} + /> + ); + })} + + ); +}; + +export default BackgroundGallery; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundGallery/Index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundGallery/Index.tsx new file mode 100644 index 00000000..e7a570f1 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundGallery/Index.tsx @@ -0,0 +1,3 @@ +import BackgroundGallery from './BackgroundGallery'; + +export default BackgroundGallery; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundVideoContainer/BackgroundVideoContainer.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundVideoContainer/BackgroundVideoContainer.spec.tsx new file mode 100644 index 00000000..4bfb886f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundVideoContainer/BackgroundVideoContainer.spec.tsx @@ -0,0 +1,36 @@ +import { act, render, screen, waitFor } from '@testing-library/react'; +import { describe, expect, it, vi } from 'vitest'; +import BackgroundVideoContainer from './BackgroundVideoContainer'; + +vi.mock('../../../utils/waitUntilPlaying', () => ({ + __esModule: true, + default: vi.fn(() => Promise.resolve()), +})); + +describe('BackgroundVideoContainer', () => { + it('shows message when video is not enabled', () => { + render(); + expect(screen.getByText(/Your camera is turned off/i)).toBeInTheDocument(); + }); + + it('renders video element when video is enabled', async () => { + const videoEl = document.createElement('video'); + act(() => { + render(); + }); + await waitFor(() => { + expect(videoEl.classList.contains('video__element')).toBe(true); + expect(videoEl.title).toBe('publisher-preview'); + }); + }); + + it('shows loading spinner while video is loading', async () => { + const videoEl = document.createElement('video'); + act(() => { + render(); + }); + await waitFor(() => { + expect(screen.getByRole('progressbar')).toBeInTheDocument(); + }); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundVideoContainer/BackgroundVideoContainer.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundVideoContainer/BackgroundVideoContainer.tsx new file mode 100644 index 00000000..a3867c54 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundVideoContainer/BackgroundVideoContainer.tsx @@ -0,0 +1,123 @@ +import { useRef, useState, useEffect, ReactElement } from 'react'; +import useMediaQuery from '@mui/material/useMediaQuery'; +import { useTranslation } from 'react-i18next'; +import CircularProgress from '@mui/material/CircularProgress'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import waitUntilPlaying from '../../../utils/waitUntilPlaying'; +import useIsTabletViewport from '../../../hooks/useIsTabletViewport'; + +export type BackgroundVideoContainerProps = { + isFixedWidth?: boolean; + publisherVideoElement?: HTMLObjectElement | HTMLVideoElement | undefined; + isParentVideoEnabled?: boolean; +}; + +/** + * Component to render the video element for the background replacement preview publisher. + * @param {BackgroundVideoContainerProps} props - The properties for the component + * @property {boolean} isFixedWidth - Whether to apply a fixed width to the video element + * @property {HTMLObjectElement | HTMLVideoElement} publisherVideoElement - The video element to display + * @property {boolean} isParentVideoEnabled - Whether the parent video is enabled + * @returns {ReactElement} The rendered video container element + */ +const BackgroundVideoContainer = ({ + isFixedWidth = false, + publisherVideoElement, + isParentVideoEnabled = false, +}: BackgroundVideoContainerProps): ReactElement => { + const { t } = useTranslation(); + const containerRef = useRef(null); + const [isVideoLoading, setIsVideoLoading] = useState(true); + const isSMViewport = useMediaQuery(`(max-width:500px)`); + const isMDViewport = useMediaQuery(`(max-width:768px)`); + const isTabletViewport = useIsTabletViewport(); + const isLGViewport = useMediaQuery(`(max-width:1199px)`); + + useEffect(() => { + if (publisherVideoElement && containerRef.current) { + containerRef.current.appendChild(publisherVideoElement); + const myVideoElement = publisherVideoElement as HTMLElement; + myVideoElement.classList.add('video__element', 'rounded-vera-large'); + + // eslint-disable-next-line react-hooks/immutability + myVideoElement.title = 'publisher-preview'; + + let width = '100%'; + if ( + (isFixedWidth && isTabletViewport) || + (!isFixedWidth && isMDViewport) || + (isLGViewport && isFixedWidth) + ) { + width = '95%'; + } + + Object.assign(myVideoElement.style, { + maxHeight: isTabletViewport ? '80%' : '450px', + width, + marginLeft: 'auto', + marginRight: 'auto', + marginBottom: '1px', + transform: 'scaleX(-1)', + objectFit: 'contain', + aspectRatio: '16 / 9', + }); + + void waitUntilPlaying(publisherVideoElement).then(() => { + setIsVideoLoading(false); + }); + } + }, [ + isTabletViewport, + isMDViewport, + isSMViewport, + publisherVideoElement, + isFixedWidth, + isParentVideoEnabled, + isLGViewport, + ]); + + let containerWidth = '100%'; + if (isFixedWidth) { + containerWidth = isTabletViewport ? '80%' : '95%'; + } else if (isMDViewport) { + containerWidth = '80%'; + } + + return ( + + {!isParentVideoEnabled && ( + + + {t('backgroundEffects.video.disabled')} + + + )} + {isParentVideoEnabled &&
        } + {isVideoLoading && isParentVideoEnabled && ( + + + + )} + + ); +}; + +export default BackgroundVideoContainer; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundVideoContainer/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundVideoContainer/index.tsx new file mode 100644 index 00000000..271cd2f1 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/BackgroundVideoContainer/index.tsx @@ -0,0 +1,3 @@ +import BackgroundVideoContainer from './BackgroundVideoContainer'; + +export default BackgroundVideoContainer; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/EffectOptionButtons/EffectOptionButtons.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/EffectOptionButtons/EffectOptionButtons.spec.tsx new file mode 100644 index 00000000..5e093583 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/EffectOptionButtons/EffectOptionButtons.spec.tsx @@ -0,0 +1,125 @@ +import { describe, expect, it, vi, beforeEach } from 'vitest'; +import { render as renderBase, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { ReactElement } from 'react'; +import EffectOptionButtons from './EffectOptionButtons'; +import { makeTestProvider, providers, type ProviderOptions } from '@test/providers'; +import { setupWindowNavigatorMock, makeMediaStreamMock } from '@web-test/fixtures'; + +describe('EffectOptionButtons', () => { + const mockHandleBackgroundChange = vi.fn(); + + beforeEach(() => { + vi.clearAllMocks(); + + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + enumerateDevices: Promise.resolve([]), + getUserMedia: Promise.resolve( + makeMediaStreamMock({ + getVideoTracks: [], + getAudioTracks: [], + }) + ), + }, + }); + + const { permissions } = globalThis.navigator; + + vi.spyOn(permissions, 'query').mockResolvedValue({ state: 'granted' } as PermissionStatus); + }); + + it('renders all effect options', async () => { + render(); + await waitFor(() => { + expect(screen.getByTestId('vivid-icon-remove-line')).toBeInTheDocument(); + expect(screen.getByTestId('vivid-icon-blur-line')).toBeInTheDocument(); + expect(screen.getByTestId('vivid-icon-blur-solid')).toBeInTheDocument(); + }); + }); + + it('marks the selected option as selected', async () => { + render(, { + backgroundPublisherContext: { + __onCreated: (context) => { + context.backgroundSelected = 'low-blur'; + }, + }, + }); + await waitFor(() => { + const selectedOption = screen.getByTestId('background-low-blur'); + expect(selectedOption).toBeInTheDocument(); + }); + }); + + it('sets the selected background', async () => { + render(, { + backgroundPublisherContext: { + __interceptor: (context) => { + context.handleBackgroundChange = mockHandleBackgroundChange; + }, + }, + }); + await waitFor(() => { + expect(screen.getByTestId('background-low-blur')).toBeInTheDocument(); + }); + const lowBlur = screen.getByTestId('background-low-blur'); + await userEvent.click(lowBlur); + await waitFor(() => { + expect(mockHandleBackgroundChange).toHaveBeenCalledWith('low-blur'); + }); + }); + + it('sets the selected background with high blur-sm', async () => { + render(, { + backgroundPublisherContext: { + __interceptor: (context) => { + context.handleBackgroundChange = mockHandleBackgroundChange; + }, + }, + }); + await waitFor(() => { + expect(screen.getByTestId('background-high-blur')).toBeInTheDocument(); + }); + const highBlur = screen.getByTestId('background-high-blur'); + await userEvent.click(highBlur); + await waitFor(() => { + expect(mockHandleBackgroundChange).toHaveBeenCalledWith('high-blur'); + }); + }); +}); + +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; + sessionContext?: ProviderOptions['SessionContext']; + publisherContext?: ProviderOptions['PublisherContext']; + backgroundPublisherContext?: ProviderOptions['BackgroundPublisherContext']; +}; + +function render( + ui: ReactElement, + { userContext, sessionContext, publisherContext, backgroundPublisherContext }: RenderOptions = {} +) { + const { wrapper, ...context } = makeTestProvider( + [ + providers.user, + providers.session, + providers.publisher, + providers.backgroundPublisher, + providers.runtime, + ], + { + userContext, + sessionContext, + publisherContext, + backgroundPublisherContext, + runtimeContext: undefined, + } + ); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/EffectOptionButtons/EffectOptionButtons.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/EffectOptionButtons/EffectOptionButtons.tsx new file mode 100644 index 00000000..c4e5a3b4 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/EffectOptionButtons/EffectOptionButtons.tsx @@ -0,0 +1,57 @@ +import { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import VividIcon from '@ui/VividIcon'; +import SelectableOption from '../SelectableOption'; +import AddBackgroundEffectLayout from '../AddBackgroundEffect/AddBackgroundEffectLayout/AddBackgroundEffectLayout'; +import useBackgroundPublisherContext from '@hooks/useBackgroundPublisherContext'; + +/** + * Renders a group of selectable buttons for background effects in a room. + * + * Each button represents a different background effect option. + * @returns {ReactElement} A horizontal stack of selectable option buttons. + */ +const EffectOptionButtons = (): ReactElement => { + const { backgroundSelected, handleBackgroundChange, handleAddCustomImage } = + useBackgroundPublisherContext(); + const { t } = useTranslation(); + const options = [ + { + key: 'none', + icon: , + name: t('backgroundEffects.removeBackground'), + }, + { + key: 'low-blur', + icon: , + name: t('backgroundEffects.slightBlur'), + }, + { + key: 'high-blur', + icon: , + name: t('backgroundEffects.strongBlur'), + }, + ]; + return ( + <> + {options.map(({ key, icon, name }) => ( + { + handleBackgroundChange(key); + }} + icon={icon} + /> + ))} + + + ); +}; + +export default EffectOptionButtons; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/EffectOptionButtons/Index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/EffectOptionButtons/Index.tsx new file mode 100644 index 00000000..15616c2f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/EffectOptionButtons/Index.tsx @@ -0,0 +1,3 @@ +import EffectOptionButtons from './EffectOptionButtons'; + +export default EffectOptionButtons; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/SelectableOption/SelectableOption.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/SelectableOption/SelectableOption.spec.tsx new file mode 100644 index 00000000..12b88bda --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/SelectableOption/SelectableOption.spec.tsx @@ -0,0 +1,83 @@ +import { describe, expect, it, vi } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import SelectableOption from './SelectableOption'; + +describe('SelectableOption', () => { + it('renders with icon when image is not provided', () => { + render( + {}} + id="icon-option" + icon={Icon} + /> + ); + expect(screen.getByTestId('background-icon-option')).toBeInTheDocument(); + expect(screen.getByTestId('test-icon')).toBeInTheDocument(); + }); + + it('renders with image when image is provided', () => { + render( + {}} + title="background" + id="img-option" + image="/test.jpg" + /> + ); + expect(screen.getByTestId('background-img-option')).toBeInTheDocument(); + expect(screen.getByAltText('background')).toHaveAttribute('src', '/test.jpg'); + }); + + it('calls onClick when clicked', async () => { + const handleClick = vi.fn(); + render( + Click} + /> + ); + await userEvent.click(screen.getByTestId('background-clickable')); + expect(handleClick).toHaveBeenCalled(); + }); + + it('shows selected aria-pressed when selected', () => { + render( + {}} id="selected" icon={Selected} /> + ); + const option = screen.getByTestId('background-selected'); + expect(option).toHaveAttribute('aria-pressed', 'true'); + }); + + it('shows the title in the tooltip', async () => { + render( + {}} + id="with-title" + icon={Icon} + title="My Tooltip Title" + /> + ); + await userEvent.hover(screen.getByTestId('background-with-title')); + expect(screen.getByLabelText('My Tooltip Title')).toBeInTheDocument(); + }); + + it('renders children inside the option', () => { + render( + {}} + id="with-children" + icon={Icon} + > + Child Content + + ); + expect(screen.getByTestId('child-content')).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/SelectableOption/SelectableOption.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/SelectableOption/SelectableOption.tsx new file mode 100644 index 00000000..1ee02b8e --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/SelectableOption/SelectableOption.tsx @@ -0,0 +1,104 @@ +import { ReactElement, ReactNode } from 'react'; +import classNames from 'classnames'; +import Box from '@mui/material/Box'; +import Tooltip from '@mui/material/Tooltip'; +import { DEFAULT_SELECTABLE_OPTION_WIDTH } from '../../../utils/constants'; + +export type SelectableOptionProps = { + isSelected: boolean; + onClick: () => void; + id: string; + icon?: ReactNode; + title?: string; + image?: string; + size?: number; + isDisabled?: boolean; + children?: ReactNode; +}; + +/** + * Renders a selectable option with an icon or image. + * + * The option can be selected or disabled, and has a hover effect. + * @param {SelectableOptionProps} props - The properties for the component + * @property {boolean} isSelected - Whether the option is selected + * @property {Function} onClick - Function to call when the option is clicked + * @property {string} id - Unique identifier for the option + * @property {ReactNode} icon - Icon to display in the option + * @property {string} title - Title to display in the option + * @property {string} image - Image URL to display in the option + * @property {number} size - Size of the option (default is DEFAULT_SELECTABLE_OPTION_WIDTH) + * @property {boolean} isDisabled - Whether the option is disabled + * @property {ReactNode} children - Additional content to render inside the option + * @returns {ReactElement} A selectable option element + */ +const SelectableOption = ({ + isSelected, + onClick, + id, + icon, + title, + image, + size = DEFAULT_SELECTABLE_OPTION_WIDTH, + children, + ...otherProps +}: SelectableOptionProps): ReactElement => { + return ( + + + + + {image ? ( + {title} + ) : ( + icon + )} + + + {children} + + + ); +}; + +export default SelectableOption; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/SelectableOption/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/SelectableOption/index.tsx new file mode 100644 index 00000000..62c1d319 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BackgroundEffects/SelectableOption/index.tsx @@ -0,0 +1,3 @@ +import SelectableOption from './SelectableOption'; + +export default SelectableOption; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Banner/Banner.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Banner/Banner.spec.tsx new file mode 100644 index 00000000..1d568444 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Banner/Banner.spec.tsx @@ -0,0 +1,17 @@ +import { describe, expect, it } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import MemoryRouter from '@test/RouterWrapper'; +import Banner from './Banner'; + +describe('Banner', () => { + it('renders the banner logo', () => { + render( + + + + ); + + const bannerLogo = screen.getByTestId('banner-logo'); + expect(bannerLogo).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Banner/Banner.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Banner/Banner.tsx new file mode 100644 index 00000000..d8814243 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Banner/Banner.tsx @@ -0,0 +1,34 @@ +import type { ReactElement } from 'react'; +import Header from '@ui/Header'; +import BannerLogo from '../BannerLogo'; +import BannerLanguage from '../BannerLanguage'; + +/** + * Banner Component + * + * This component returns a banner that includes a logo, current date/time, language selector, and some links. + * @returns {ReactElement} - the banner component. + */ +const Banner = (): ReactElement => { + return ( +
        +
        + +
        + +
        + +
        +
        + ); +}; + +export default Banner; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Banner/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Banner/index.tsx new file mode 100644 index 00000000..b0c13faa --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Banner/index.tsx @@ -0,0 +1,3 @@ +import Banner from './Banner'; + +export default Banner; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BannerLanguage/BannerLanguage.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BannerLanguage/BannerLanguage.spec.tsx new file mode 100644 index 00000000..56940b9c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BannerLanguage/BannerLanguage.spec.tsx @@ -0,0 +1,17 @@ +import { describe, expect, it } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import MemoryRouter from '@test/RouterWrapper'; +import BannerLanguage from './BannerLanguage'; + +describe('BannerLanguage', () => { + it('renders the banner language component', () => { + render( + + + + ); + + const bannerLanguage = screen.getByTestId('banner-language'); + expect(bannerLanguage).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BannerLanguage/BannerLanguage.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BannerLanguage/BannerLanguage.tsx new file mode 100644 index 00000000..c1280f5b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BannerLanguage/BannerLanguage.tsx @@ -0,0 +1,21 @@ +import Box from '@mui/material/Box'; +import LanguageSelector from '../LanguageSelector'; +import type { BoxProps } from '@mui/material'; + +type BannerLanguageProps = BoxProps; + +/** + * BannerLanguage Component + * + * This component provides a language selection feature for the banner. + * @returns {ReactElement} The BannerLanguage component. + */ +const BannerLanguage: React.FC = (props) => { + return ( + + + + ); +}; + +export default BannerLanguage; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BannerLanguage/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BannerLanguage/index.tsx new file mode 100644 index 00000000..4ceb444c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BannerLanguage/index.tsx @@ -0,0 +1,3 @@ +import BannerLanguage from './BannerLanguage'; + +export default BannerLanguage; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BannerLogo/BannerLogo.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BannerLogo/BannerLogo.spec.tsx new file mode 100644 index 00000000..8a0f1cb3 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BannerLogo/BannerLogo.spec.tsx @@ -0,0 +1,30 @@ +import { describe, expect, it } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import MemoryRouter from '@test/RouterWrapper'; +import BannerLogo from './BannerLogo'; + +describe('BannerLogo', () => { + it('renders the vonage desktop logo', () => { + render( + + + + ); + + const vonageLogo = screen.getByAltText('Vonage-desktop-logo'); + expect(vonageLogo).toBeInTheDocument(); + expect(vonageLogo.src).toContain('/images/vonage-logo-desktop.svg'); + }); + + it('renders clickable logo with cursor pointer', () => { + render( + + + + ); + + const logo = screen.getByTestId('banner-logo-image'); + expect(logo).toBeInTheDocument(); + expect(logo).toHaveStyle({ cursor: 'pointer' }); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BannerLogo/BannerLogo.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BannerLogo/BannerLogo.tsx new file mode 100644 index 00000000..d9ee766c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BannerLogo/BannerLogo.tsx @@ -0,0 +1,45 @@ +import { ReactElement } from 'react'; +import { useNavigate } from 'react-router-dom'; +import Box from '@mui/material/Box'; +import useIsTabletViewport from '@hooks/useIsTabletViewport'; + +/** + * BannerLogo 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 isTablet = useIsTabletViewport(); + const navigate = useNavigate(); + const handleClick = () => { + navigate('..'); + }; + + return ( + + { + if (e.key === 'Enter' || e.key === ' ') { + handleClick(); + } + }} + role="button" + tabIndex={0} + sx={{ + height: { xs: 40, md: 72 }, + display: 'block', + cursor: 'pointer', + }} + /> + + ); +}; + +export default BannerLogo; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BannerLogo/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BannerLogo/index.tsx new file mode 100644 index 00000000..cce7558f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/BannerLogo/index.tsx @@ -0,0 +1,3 @@ +import BannerLogo from './BannerLogo'; + +export default BannerLogo; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/DeviceAccessAlert/DeviceAccessAlert.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/DeviceAccessAlert/DeviceAccessAlert.spec.tsx new file mode 100644 index 00000000..531df2aa --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/DeviceAccessAlert/DeviceAccessAlert.spec.tsx @@ -0,0 +1,63 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect, vi, Mock } from 'vitest'; +import DeviceAccessAlert from './DeviceAccessAlert'; +import * as platform from '@web/platform'; +import { DEVICE_ACCESS_STATUS } from '../../utils/constants'; + +vi.mock('@web/platform', async () => { + const actual = await vi.importActual('@web/platform'); + return { + ...actual, + isWebKit: vi.fn(), + }; +}); + +describe('DeviceAccessAlert', () => { + it('should display the correct message and image when access status is PENDING', () => { + (platform.isWebKit as Mock).mockReturnValue(false); + render(); + + // Check that the correct message is displayed + expect( + screen.getByText( + 'To join the video room, your browser will request access to your camera and microphone.' + ) + ).toBeInTheDocument(); + + // Check that the correct image is displayed + const imgElement = screen.getByAltText('Access Dialog'); + expect(imgElement).toHaveAttribute('src', '/images/access-dialog-pending.png'); + }); + + it('should display the correct message and image when access status is DENIED', () => { + (platform.isWebKit as Mock).mockReturnValue(false); + render(); + + // Check that the correct message is displayed + expect( + screen.getByText( + "It seems your browser is blocked from accessing your camera and/or microphone. Reset the permission state through your browser's UI." + ) + ).toBeInTheDocument(); + + // Check that the correct image is displayed + const imgElement = screen.getByAltText('Access Dialog'); + expect(imgElement).toHaveAttribute('src', '/images/access-dialog-rejected.png'); + }); + + it('should not display anything when access status is set to null', () => { + (platform.isWebKit as Mock).mockReturnValue(false); + render(); + + // Check that there is no alert displayed + expect(screen.queryByRole('alert')).not.toBeInTheDocument(); + }); + + it('should not display anything when the user is using Safari', () => { + (platform.isWebKit as Mock).mockReturnValue(true); + render(); + + // Check that there is no alert displayed + expect(screen.queryByRole('alert')).not.toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/DeviceAccessAlert/DeviceAccessAlert.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/DeviceAccessAlert/DeviceAccessAlert.tsx new file mode 100644 index 00000000..064ec2c3 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/DeviceAccessAlert/DeviceAccessAlert.tsx @@ -0,0 +1,77 @@ +import { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import { DEVICE_ACCESS_STATUS } from '../../utils/constants'; +import { isWebKit } from '@web/platform'; +import Alert from '@mui/material/Alert'; +import Dialog from '@mui/material/Dialog'; +import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; +import AlertTitle from '@mui/material/AlertTitle'; + +export type DeviceAccessAlertProps = { + accessStatus: string | null; +}; + +/** + * A component that displays an alert message asking the user to grant permissions + * or informing them that they have declined the permissions. + * @param {DeviceAccessAlertProps} props - the props for the component. + * @property {string | null} accessStatus - the current access status. + * @returns {ReactElement | false} - The rendered DeviceAccessAlert component if not Safari + */ +const DeviceAccessAlert = ({ accessStatus }: DeviceAccessAlertProps): ReactElement | false => { + const { t } = useTranslation(); + const messageToDisplay = + accessStatus === DEVICE_ACCESS_STATUS.PENDING + ? t('deviceAccessAlert.askDeviceMessage') + : t('deviceAccessAlert.deniedDeviceMessage'); + const imgToDisplay = + accessStatus === DEVICE_ACCESS_STATUS.PENDING + ? '/images/access-dialog-pending.png' + : '/images/access-dialog-rejected.png'; + const severity = accessStatus === DEVICE_ACCESS_STATUS.PENDING ? 'success' : 'error'; + + return ( + !isWebKit() && ( + + {accessStatus && ( + + + {messageToDisplay} + + + + + + )} + + ) + ); +}; + +export default DeviceAccessAlert; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/DeviceAccessAlert/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/DeviceAccessAlert/index.tsx new file mode 100644 index 00000000..fb385f53 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/DeviceAccessAlert/index.tsx @@ -0,0 +1,3 @@ +import DeviceAccessAlert from './DeviceAccessAlert'; + +export default DeviceAccessAlert; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/EnvGuard/EnvGuard.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/EnvGuard/EnvGuard.tsx new file mode 100644 index 00000000..ff0382f3 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/EnvGuard/EnvGuard.tsx @@ -0,0 +1,16 @@ +import { envInitError } from '../../env'; + +/** + * Re-throws any error that occurred when initializing the `env` singleton so + * that a parent ErrorBoundary can catch it and show a proper fallback. + * Renders nothing when the env is healthy. + */ +const EnvGuard = () => { + if (envInitError) { + throw envInitError; + } + + return null; +}; + +export default EnvGuard; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/EnvGuard/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/EnvGuard/index.ts new file mode 100644 index 00000000..0dffe74d --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/EnvGuard/index.ts @@ -0,0 +1,3 @@ +import EnvGuard from './EnvGuard'; + +export default EnvGuard; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ErrorBoundary/ErrorBoundary.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ErrorBoundary/ErrorBoundary.tsx new file mode 100644 index 00000000..7d1b3767 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ErrorBoundary/ErrorBoundary.tsx @@ -0,0 +1,38 @@ +import { Component, type ErrorInfo, type ReactNode } from 'react'; + +type ErrorBoundaryProps = { + children: ReactNode; + fallback: (error: Error) => ReactNode; +}; + +type ErrorBoundaryState = { hasError: false } | { hasError: true; error: Error }; + +/** + * Generic React error boundary. Catches errors thrown during render inside its + * subtree and renders the provided fallback instead of a blank screen. + */ +class ErrorBoundary extends Component { + constructor(props: ErrorBoundaryProps) { + super(props); + this.state = { hasError: false }; + } + + static getDerivedStateFromError(error: unknown): ErrorBoundaryState { + const normalizedError = error instanceof Error ? error : new Error(String(error)); + return { hasError: true, error: normalizedError }; + } + + override componentDidCatch(error: Error, info: ErrorInfo) { + console.error('[ErrorBoundary] Caught error:', error, info); + } + + override render() { + if (this.state.hasError) { + return this.props.fallback(this.state.error); + } + + return this.props.children; + } +} + +export default ErrorBoundary; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ErrorBoundary/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ErrorBoundary/index.ts new file mode 100644 index 00000000..388e219f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ErrorBoundary/index.ts @@ -0,0 +1,3 @@ +import ErrorBoundary from './ErrorBoundary'; + +export default ErrorBoundary; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Footer/Footer.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Footer/Footer.spec.tsx new file mode 100644 index 00000000..0452a679 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/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 '@test/RouterWrapper'; +import Footer from './Footer'; + +describe('Footer', () => { + it('renders the footer content', () => { + render( + +
        + + ); + + const footerLinks = screen.getByTestId('footer-content'); + expect(footerLinks).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Footer/Footer.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Footer/Footer.tsx new file mode 100644 index 00000000..54b156a0 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Footer/Footer.tsx @@ -0,0 +1,25 @@ +import type { ReactElement } from 'react'; +import FooterLinks from '@components/FooterLinks'; + +/** + * Footer Component + * + * This component returns a footer displaying footer links. + * @returns {ReactElement} - the footer component. + */ +const Footer = (): ReactElement => { + return ( +
        +
        + +
        + +
        +
        + ); +}; + +export default Footer; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Footer/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Footer/index.tsx new file mode 100644 index 00000000..ced11e52 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Footer/index.tsx @@ -0,0 +1,3 @@ +import Footer from './Footer'; + +export default Footer; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/FooterLinks/FooterLinks.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/FooterLinks/FooterLinks.spec.tsx new file mode 100644 index 00000000..93c3d2dd --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/FooterLinks/FooterLinks.spec.tsx @@ -0,0 +1,29 @@ +import { describe, expect, it } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import MemoryRouter from '@test/RouterWrapper'; +import FooterLinks from './FooterLinks'; + +describe('FooterLinks', () => { + it('renders the footer links component', () => { + render( + + + + ); + + const footerLinks = screen.getByTestId('footer-links'); + expect(footerLinks).toBeInTheDocument(); + }); + + it('displays the app version', () => { + render( + + + + ); + + const versionElement = screen.getByTestId('app-version'); + expect(versionElement).toBeInTheDocument(); + expect(versionElement.textContent).toMatch(/^v\d+\.\d+\.\d+ \(SDK \d+\.\d+\.\d+\)$/); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/FooterLinks/FooterLinks.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/FooterLinks/FooterLinks.tsx new file mode 100644 index 00000000..c71747ba --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/FooterLinks/FooterLinks.tsx @@ -0,0 +1,34 @@ +import { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import GHRepoButton from '../GHRepoButton'; +import getAppVersion from '@utils/getAppVersion'; +import sdkPackageInfo from '@vonage/client-sdk-video/package.json'; + +const formatDisplayVersion = (version: string): string => version.replace(/^vera-/, 'v'); + +/** + * FooterLinks Component + * + * Component holding different icon-buttons. + * @returns {ReactElement} The FooterLinks component. + */ +const FooterLinks = (): ReactElement => { + const { t } = useTranslation(); + + return ( +
        + + + {t('footer.github.title')} + + + {formatDisplayVersion(getAppVersion())} (SDK {sdkPackageInfo.version}) + +
        + ); +}; + +export default FooterLinks; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/FooterLinks/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/FooterLinks/index.tsx new file mode 100644 index 00000000..0566b087 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/FooterLinks/index.tsx @@ -0,0 +1,3 @@ +import FooterLinks from './FooterLinks'; + +export default FooterLinks; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GHRepoButton/GHRepoButton.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GHRepoButton/GHRepoButton.spec.tsx new file mode 100644 index 00000000..c8774ca0 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GHRepoButton/GHRepoButton.spec.tsx @@ -0,0 +1,32 @@ +import { describe, expect, it } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import MemoryRouter from '@test/RouterWrapper'; +import userEvent from '@testing-library/user-event'; +import GHRepoButton from './GHRepoButton'; + +describe('GHRepoButton', () => { + it('renders a link to the GitHub repo', () => { + render( + + + + ); + const link = screen.getByRole('link'); + expect(link).toHaveAttribute('href', 'https://github.com/Vonage/vonage-video-react-app/'); + expect(link).toHaveAttribute('target', '_blank'); + }); + + it('renders a tooltip with the correct title', async () => { + render(); + const button = screen.getByRole('button'); + await userEvent.hover(button); + const tooltip = await screen.findByText('Visit our GitHub Repo'); + expect(tooltip).toBeInTheDocument(); + }); + + it('renders the GitHub icon', () => { + render(); + const icon = screen.getByTestId('vivid-icon-github-mono'); + expect(icon).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GHRepoButton/GHRepoButton.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GHRepoButton/GHRepoButton.tsx new file mode 100644 index 00000000..3ad372db --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GHRepoButton/GHRepoButton.tsx @@ -0,0 +1,32 @@ +import { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import Tooltip from '@mui/material/Tooltip'; +import Link from '@mui/material/Link'; +import IconButton from '@mui/material/IconButton'; +import VividIcon from '@ui/VividIcon'; + +/** + * GHRepoButton Component + * + * Displays a button with a link to the Vonage Video React App GitHub page. + * @returns {ReactElement} - The GHRepoButton component. + */ +const GHRepoButton = (): ReactElement => { + const { t } = useTranslation(); + + return ( + + + + + + + + ); +}; + +export default GHRepoButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GHRepoButton/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GHRepoButton/index.tsx new file mode 100644 index 00000000..536016b4 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GHRepoButton/index.tsx @@ -0,0 +1,3 @@ +import GHRepoButton from './GHRepoButton'; + +export default GHRepoButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/ArchiveList/ArchiveList.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/ArchiveList/ArchiveList.spec.tsx new file mode 100644 index 00000000..8ffbedee --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/ArchiveList/ArchiveList.spec.tsx @@ -0,0 +1,45 @@ +import { describe, expect, it } from 'vitest'; +import { render, screen, within } from '@testing-library/react'; +import ArchiveList from './ArchiveList'; +import { + availableArchive, + failedArchive, + pendingArchive, + archives as testArchives, +} from '../../../api/archiving/tests/data'; + +describe('ArchiveList', () => { + it('should display message if there are no archives', () => { + render(); + expect(screen.getByText("The meeting hasn't been recorded")).toBeVisible(); + }); + + it('should display message if there is an error fetching archives', () => { + render(); + expect( + screen.getByText('There was an error loading recordings for this meeting') + ).toBeVisible(); + }); + + it('should render a download button for available archives', () => { + render(); + const listItem = screen.getByTestId(`archive-list-item-${availableArchive.id}`); + expect(within(listItem).getByTestId('archive-download-button')).toBeVisible(); + expect(within(listItem).getByRole('link')).toHaveAttribute( + 'href', + 'https://example.com.com/tokbox.com.archive2.eu/46969164/c32509e3-24a9-4d1f-98a0-66a0f0fdbca6/archive.mp4' + ); + }); + + it('should render an error icon for failed archives', () => { + render(); + const listItem = screen.getByTestId(`archive-list-item-${failedArchive.id}`); + expect(within(listItem).getByTestId('archive-error-icon')).toBeVisible(); + }); + + it('should render a spinner for pending archives', () => { + render(); + const listItem = screen.getByTestId(`archive-list-item-${pendingArchive.id}`); + expect(within(listItem).getByTestId('archive-loading-spinner')).toBeVisible(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/ArchiveList/ArchiveList.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/ArchiveList/ArchiveList.tsx new file mode 100644 index 00000000..caa7b911 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/ArchiveList/ArchiveList.tsx @@ -0,0 +1,194 @@ +import { Fragment, ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import type { Archive, ArchiveStatus } from '../../../api/archiving/model'; + +import Box from '@mui/material/Box'; +import CircularProgress from '@mui/material/CircularProgress'; +import IconButton from '@mui/material/IconButton'; +import Link from '@mui/material/Link'; +import List from '@mui/material/List'; +import ListItem from '@mui/material/ListItem'; +import ListItemIcon from '@mui/material/ListItemIcon'; +import ListItemText from '@mui/material/ListItemText'; +import Tooltip from '@mui/material/Tooltip'; +import Typography from '@mui/material/Typography'; + +import Separator from '@components/Separator'; +import VividIcon from '@ui/VividIcon'; +import formatDuration from '@utils/formatDuration'; +import formatFileSize from '@utils/formatFileSize'; +import classNames from 'classnames'; +import { isString } from '@common/assertions'; + +const ArchiveErrorIcon = () => { + const { t } = useTranslation(); + + return ( + + + + ); +}; + +const ArchivingLoadingIcon = () => { + return ( + + ); +}; + +const ArchiveStatusContent = ({ status, url }: { status: ArchiveStatus; url: string | null }) => { + const { t } = useTranslation(); + + if (status === 'available') { + return ( + +
        + + + + + {t('archiveList.download')} + +
        + + ); + } + + if (status === 'pending') { + return ; + } + + return ; +}; + +export type ArchiveListProps = { + archives: Archive[] | 'error'; +}; + +/** + * ArchiveList + * + * This component displays any archives. + * @param {ArchiveListProps} props - The props for the component. + * @property {Archive[] | 'error'} archives - Array of archives, or 'error'. + * @returns {ReactElement} - The ArchiveList component. + */ +const ArchiveList = ({ archives }: ArchiveListProps): ReactElement => { + const { t } = useTranslation(); + + const isError = isString(archives); + if (isError) { + return ( + + + + {t('archiveList.error.text')} + + + ); + } + if (!archives.length) { + return ( + <> +
        + + + {t('archiveList.empty')} + +
        + + + ); + } + return ( + + + {archives.map((archive, index) => ( + + + + + + + + + {archive.status === 'pending' + ? t('archiveList.loading') + : t('archiveList.archive.index', { + index: archives.length - index, + })} + + } + secondary={ + (archive.status === 'available' || archive.status === 'pending') && ( + + {archive.status === 'pending' ? ( + t('archiveList.loading.subtitle') + ) : ( + <> + {archive.duration && formatDuration(archive.duration)} + {archive.size && ` • ${formatFileSize(archive.size)}`} + {` • ${t('archiveList.archive.createdAt', { + createdAt: archive.createdAtFormatted, + })}`} + + )} + + ) + } + /> + + + + + + + + + + ))} + + + ); +}; + +export default ArchiveList; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/ArchiveList/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/ArchiveList/index.tsx new file mode 100644 index 00000000..c43f01bd --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/ArchiveList/index.tsx @@ -0,0 +1,3 @@ +import ArchiveList from './ArchiveList'; + +export default ArchiveList; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/GoToLandingPageButton/GoToLandingPageButton.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/GoToLandingPageButton/GoToLandingPageButton.spec.tsx new file mode 100644 index 00000000..86339336 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/GoToLandingPageButton/GoToLandingPageButton.spec.tsx @@ -0,0 +1,20 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import userEvent from '@testing-library/user-event'; +import MemoryRouter from '@test/RouterWrapper'; +import GoToLandingPageButton from './index'; + +describe('GoToLandingPageButton', () => { + it('should display the correct go to landing page button', async () => { + render( + + + + ); + + const button = screen.getByTestId('go-to-landing-button'); + await userEvent.click(button); + + expect(screen.getByText('View Landing Page')).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/GoToLandingPageButton/GoToLandingPageButton.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/GoToLandingPageButton/GoToLandingPageButton.tsx new file mode 100644 index 00000000..c81bc273 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/GoToLandingPageButton/GoToLandingPageButton.tsx @@ -0,0 +1,26 @@ +import Button from '@mui/material/Button'; +import { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import { useNavigate } from 'react-router-dom'; + +/** + * GoToLandingPageButton Component + * + * This component returns a button that takes a user back to the landing page + * @returns {ReactElement} - the button to go back to the landing page. + */ +const GoToLandingPageButton = (): ReactElement => { + const { t } = useTranslation(); + const navigate = useNavigate(); + const handleLanding = () => { + navigate('/'); + }; + + return ( + + ); +}; + +export default GoToLandingPageButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/GoToLandingPageButton/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/GoToLandingPageButton/index.tsx new file mode 100644 index 00000000..8eab9ad1 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/GoToLandingPageButton/index.tsx @@ -0,0 +1,3 @@ +import GoToLandingPageButton from './GoToLandingPageButton'; + +export default GoToLandingPageButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/GoodbyeMessage/GoodbyeMessage.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/GoodbyeMessage/GoodbyeMessage.spec.tsx new file mode 100644 index 00000000..e2fe9381 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/GoodbyeMessage/GoodbyeMessage.spec.tsx @@ -0,0 +1,46 @@ +import { render, screen } from '@testing-library/react'; +import { useNavigate } from 'react-router-dom'; +import MemoryRouter from '@test/RouterWrapper'; +import { describe, expect, it, Mock, vi, beforeEach, afterAll } from 'vitest'; +import GoodByeMessage from './GoodbyeMessage'; + +vi.mock('react-router-dom', async () => { + const mod = await vi.importActual('react-router-dom'); + return { ...mod, useNavigate: vi.fn() }; +}); + +const mockNavigate = vi.fn(); +const headerMessage = 'This is a header message'; +const goodbyeMessage = 'This is a goodbye message'; + +describe('GoodbyeMessage', () => { + const originalMatchMedia = globalThis.matchMedia; + + beforeEach(() => { + (useNavigate as Mock).mockReturnValue(mockNavigate); + }); + + afterAll(() => { + globalThis.matchMedia = originalMatchMedia; + }); + + it('renders the header', () => { + render( + + + + ); + const header = screen.getByTestId('header-message'); + expect(header.textContent).toBe(headerMessage); + }); + + it('renders the goodbye message', () => { + render( + + + + ); + const goodbye = screen.getByTestId('goodbye-message'); + expect(goodbye.textContent).toBe(goodbyeMessage); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/GoodbyeMessage/GoodbyeMessage.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/GoodbyeMessage/GoodbyeMessage.tsx new file mode 100644 index 00000000..a3580080 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/GoodbyeMessage/GoodbyeMessage.tsx @@ -0,0 +1,54 @@ +import { ReactElement } from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; + +export type GoodByeMessageProps = { + header: string; + message: string; +}; + +/** + * GoodByeMessage Component + * Displays a goodbye message to the user along with two navigation buttons - one to the previously left room, and another for the landing page. + * @param {GoodByeMessageProps} props - The props for the component. + * @returns {ReactElement} The GoodByeMessage component. + */ +const GoodByeMessage = ({ header, message }: GoodByeMessageProps): ReactElement => { + return ( + + + {header} + + + {message} + + + ); +}; + +export default GoodByeMessage; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/GoodbyeMessage/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/GoodbyeMessage/index.tsx new file mode 100644 index 00000000..fe74d7d4 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/GoodbyeMessage/index.tsx @@ -0,0 +1,3 @@ +import GoodByeMessage from './GoodbyeMessage'; + +export default GoodByeMessage; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/ReenterRoomButton/ReenterRoomButton.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/ReenterRoomButton/ReenterRoomButton.spec.tsx new file mode 100644 index 00000000..04ae3970 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/ReenterRoomButton/ReenterRoomButton.spec.tsx @@ -0,0 +1,46 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect, vi } from 'vitest'; +import userEvent from '@testing-library/user-event'; +import MemoryRouter from '@test/RouterWrapper'; +import ReenterRoomButton from './index'; +import { AnyFunction } from '@common/types'; + +const mockUseParams = vi.fn(); + +vi.mock('react-router-dom', async () => { + const actual = await vi.importActual('react-router-dom'); + return { + ...actual, + useParams: () => mockUseParams() as AnyFunction, + }; +}); + +describe('ReenterRoomButton', () => { + it('should display the correct reenter room button', async () => { + mockUseParams.mockReturnValue({ roomIdentifier: 'test-room' }); + + render( + + + + ); + + const button = screen.getByTestId('reenterButton'); + await userEvent.click(button); + + expect(screen.getByText('Go back to meeting')).toBeInTheDocument(); + }); + + it('should not display the reenter room button', () => { + mockUseParams.mockReturnValue({}); + + render( + + + + ); + + expect(screen.queryByTestId('reenterButton')).not.toBeInTheDocument(); + expect(screen.queryByText('Go back to meeting')).not.toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/ReenterRoomButton/ReenterRoomButton.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/ReenterRoomButton/ReenterRoomButton.tsx new file mode 100644 index 00000000..d98c6040 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/ReenterRoomButton/ReenterRoomButton.tsx @@ -0,0 +1,43 @@ +import VividIcon from '@ui/VividIcon'; +import useSessionKeyParam from '@hooks/useSessionKeyParam'; +import Button from '@mui/material/Button'; +import { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import { useNavigate } from 'react-router-dom'; + +/** + * ReenterRoomButton Component + * + * This component returns a button that takes a user back to the meeting. + * @returns {ReactElement} - the re-enter room button or an empty string if the room does not exist. + */ +const ReenterRoomButton = (): ReactElement | string => { + const { t } = useTranslation(); + const navigate = useNavigate(); + const { sessionKey } = useSessionKeyParam(); + + const handleReenter = () => { + navigate(`/waiting-room/${sessionKey}`); + }; + return ( + sessionKey && ( + + ) + ); +}; + +export default ReenterRoomButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/ReenterRoomButton/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/ReenterRoomButton/index.tsx new file mode 100644 index 00000000..a8517c6e --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/GoodBye/ReenterRoomButton/index.tsx @@ -0,0 +1,3 @@ +import ReenterRoomButton from './ReenterRoomButton'; + +export default ReenterRoomButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/HiddenParticipantsTile/HiddenParticipantsTile.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/HiddenParticipantsTile/HiddenParticipantsTile.spec.tsx new file mode 100644 index 00000000..039febb3 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/HiddenParticipantsTile/HiddenParticipantsTile.spec.tsx @@ -0,0 +1,140 @@ +import { ReactElement } from 'react'; +import { fireEvent, render as renderBase } from '@testing-library/react'; +import { describe, it, expect, vi } from 'vitest'; +import userEvent from '@testing-library/user-event'; +import { Subscriber } from '@vonage/client-sdk-video'; +import { makeTestProvider, providers, ProviderOptions } from '@test/providers'; +import { SubscriberWrapper } from '@app-types/session'; +import HiddenParticipantsTile from './index'; +import { env } from '../../env'; + +describe('HiddenParticipantsTile', () => { + const box = { height: 100, width: 100, top: 0, left: 0 }; + const hiddenSubscribers = [ + { + element: document.createElement('video'), + subscriber: { + id: '1', + stream: { + name: 'John Doe', + streamId: '1', + initials: 'JD', + } as Partial, + getAudioVolume: vi.fn(() => 1), + getImgData: vi.fn(() => null), + getStats: vi.fn(), + getRtcStatsReport: vi.fn(() => Promise.resolve(new Map())), + } as Partial, + isScreenshare: false, + id: '1', + isPinned: false, + }, + ]; + + it('should display two hidden participants', async () => { + const currentHiddenSubscribers = [ + ...hiddenSubscribers, + { + element: document.createElement('video'), + subscriber: { + id: '2', + stream: { + name: 'Jane Smith', + streamId: '2', + initials: 'JS', + } as Partial, + getAudioVolume: vi.fn(() => 1), + getImgData: vi.fn(() => null), + getStats: vi.fn(), + getRtcStatsReport: vi.fn(() => Promise.resolve(new Map())), + } as Partial, + isScreenshare: false, + id: '2', + isPinned: false, + }, + ] as SubscriberWrapper[]; + + const { sessionContext, getByTestId, getByText } = render( + + ); + + const toggleParticipantListSpy = vi.mocked(sessionContext.current.toggleParticipantList); + + const button = getByTestId('hidden-participants'); + expect(button).toBeInTheDocument(); + await userEvent.click(button); + + fireEvent.mouseEnter(button); + fireEvent.mouseLeave(button); + + expect(getByText('JD')).toBeInTheDocument(); + expect(getByText('JS')).toBeInTheDocument(); + + expect(toggleParticipantListSpy).toHaveBeenCalled(); + }); + + it('should display one hidden participant because the other one is empty', async () => { + const currentHiddenSubscribers = [...hiddenSubscribers, {}] as SubscriberWrapper[]; + + const { sessionContext, getByText, getByTestId, queryByText } = render( + + ); + + const toggleParticipantListSpy = vi.mocked(sessionContext.current.toggleParticipantList); + + const button = getByTestId('hidden-participants'); + expect(button).toBeInTheDocument(); + await userEvent.click(button); + + expect(getByText('JD')).toBeInTheDocument(); + expect(queryByText('JS')).not.toBeInTheDocument(); + + expect(toggleParticipantListSpy).toHaveBeenCalled(); + }); + + it('does not toggle participant list when showParticipantList is disabled', async () => { + const currentHiddenSubscribers = [...hiddenSubscribers, {}] as SubscriberWrapper[]; + + env.partialUpdate({ + SHOW_PARTICIPANT_LIST: false, + }); + + const { sessionContext, getByTestId } = render( + + ); + + const toggleParticipantListSpy = vi.mocked(sessionContext.current.toggleParticipantList); + + const button = getByTestId('hidden-participants'); + expect(button).toBeInTheDocument(); + await userEvent.click(button); + + expect(toggleParticipantListSpy).not.toHaveBeenCalled(); + }); +}); + +type RenderOptions = { + sessionContext?: ProviderOptions['SessionContext']; + userContext?: ProviderOptions['UserContext']; +}; + +function render(ui: ReactElement, { sessionContext, userContext }: RenderOptions = {}) { + const { wrapper, ...context } = makeTestProvider( + [providers.user, providers.session, providers.runtime], + { + sessionContext: { + __onCreated: (ctx) => { + vi.spyOn(ctx, 'toggleParticipantList'); + }, + ...sessionContext, + }, + userContext, + runtimeContext: undefined, + } + ); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/HiddenParticipantsTile/HiddenParticipantsTile.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/HiddenParticipantsTile/HiddenParticipantsTile.tsx new file mode 100644 index 00000000..eb4032b7 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/HiddenParticipantsTile/HiddenParticipantsTile.tsx @@ -0,0 +1,78 @@ +import { ReactElement } from 'react'; +import classNames from 'classnames'; +import { Box } from 'opentok-layout-js'; +import { SubscriberWrapper } from '@app-types/session'; +import getBoxStyle from '@utils/helpers/getBoxStyle'; +import useSessionContext from '@hooks/useSessionContext'; +import AvatarInitials from '../AvatarInitials'; +import AvatarGroup from '@mui/material/AvatarGroup'; +import ButtonBase from '@mui/material/ButtonBase'; +import { env } from '../../env'; + +export type HiddenParticipantsTileProps = { + box: Box; + hiddenSubscribers: SubscriberWrapper[]; +}; +/** + * HiddenParticipantsTile Component + * A clickable tile matching VideoTile style to represent the Subscribers that are hidden from the call. + * Will show the initial Avatars of the first two hidden subscribers + * @param {HiddenParticipantsTileProps} props - the props for this component + * @property {Box} box - Box specifying position and size of tile + * @property {() => void} handleClick - click handler, e.g. open participant list + * @property {SubscriberWrapper[]} hiddenSubscribers - Array of hidden subscribers + * @returns {ReactElement} HiddenParticipantsTile instance + */ +const HiddenParticipantsTile = ({ + box, + hiddenSubscribers, +}: HiddenParticipantsTileProps): ReactElement => { + const { toggleParticipantList } = useSessionContext(); + + const { height, width } = box; + const diameter = Math.min(height, width) * 0.38; + return ( + {}} + type="button" + > + + {hiddenSubscribers.slice(0, 2).map((wrapper) => { + const { initials, streamId, name } = wrapper?.subscriber?.stream ?? {}; + const sx = { position: 'relative' }; + + return ; + })} + + + ); +}; + +export default HiddenParticipantsTile; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/HiddenParticipantsTile/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/HiddenParticipantsTile/index.tsx new file mode 100644 index 00000000..968923b8 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/HiddenParticipantsTile/index.tsx @@ -0,0 +1,3 @@ +import HiddenParticipantsTile from './HiddenParticipantsTile'; + +export default HiddenParticipantsTile; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Icons/PushPinOffIcon/PushPinOffIcon.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Icons/PushPinOffIcon/PushPinOffIcon.spec.tsx new file mode 100644 index 00000000..a7d88a73 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Icons/PushPinOffIcon/PushPinOffIcon.spec.tsx @@ -0,0 +1,11 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import PushPinOffIcon from './index'; + +describe('PushPinOffIcon', () => { + it('should display the correct PushPinOffIcon', () => { + render(); + + expect(screen.queryByTestId('PushPinOffIcon')).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Icons/PushPinOffIcon/PushPinOffIcon.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Icons/PushPinOffIcon/PushPinOffIcon.tsx new file mode 100644 index 00000000..3a535c3c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Icons/PushPinOffIcon/PushPinOffIcon.tsx @@ -0,0 +1,29 @@ +import type { SvgIconProps } from '@mui/material/SvgIcon'; +import SvgIcon from '@mui/material/SvgIcon'; +import { ReactElement } from 'react'; + +/** + * PushPinOffIcon Component + * + * This component renders a custom SVG icon representing a Push pin with a diagonal line across it. + * This follows the MUI 'Off' icon visual and naming convention. + * @param {SvgIconProps} props - the props to customize the SVG icon. + * @returns {ReactElement} - the blur icon. + */ +const PushPinOffIcon = (props: SvgIconProps): ReactElement => { + return ( + + + + + + ); +}; + +export default PushPinOffIcon; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Icons/PushPinOffIcon/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Icons/PushPinOffIcon/index.tsx new file mode 100644 index 00000000..4c06ee1c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Icons/PushPinOffIcon/index.tsx @@ -0,0 +1,3 @@ +import PushPinOffIcon from './PushPinOffIcon'; + +export default PushPinOffIcon; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinContainerSeparator/JoinContainerSeparator.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinContainerSeparator/JoinContainerSeparator.spec.tsx new file mode 100644 index 00000000..9dfe607a --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinContainerSeparator/JoinContainerSeparator.spec.tsx @@ -0,0 +1,14 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import JoinContainerSeparator from './JoinContainerSeparator'; + +describe('JoinContainerSeparator', () => { + it('renders the component with separators and text and applies correct styling', () => { + render(); + + expect(screen.getByText('or')).toBeInTheDocument(); + + const separators = screen.getAllByTestId('separator'); + expect(separators).toHaveLength(2); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinContainerSeparator/JoinContainerSeparator.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinContainerSeparator/JoinContainerSeparator.tsx new file mode 100644 index 00000000..ca83c6c3 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinContainerSeparator/JoinContainerSeparator.tsx @@ -0,0 +1,26 @@ +import { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import Typography from '@mui/material/Typography'; +import Separator from '../Separator'; + +/** + * JoinContainerSeparator Component + * + * Component used as a visual separator between two UI elements. + * @returns {ReactElement} The JoinContainerSeparator component. + */ +const JoinContainerSeparator = (): ReactElement => { + const { t } = useTranslation(); + + return ( +
        + + + {t('common.or')} + + +
        + ); +}; + +export default JoinContainerSeparator; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinContainerSeparator/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinContainerSeparator/index.tsx new file mode 100644 index 00000000..23922fcc --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinContainerSeparator/index.tsx @@ -0,0 +1,3 @@ +import JoinContainerSeparator from './JoinContainerSeparator'; + +export default JoinContainerSeparator; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinExistingRoom/JoinExistingRoom.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinExistingRoom/JoinExistingRoom.spec.tsx new file mode 100644 index 00000000..98a06c42 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinExistingRoom/JoinExistingRoom.spec.tsx @@ -0,0 +1,23 @@ +import { render as renderBase, screen } from '@testing-library/react'; +import { describe, it, expect, vi } from 'vitest'; +import { makeTestProvider, providers } from '@test/providers'; +import JoinExistingRoom from './index'; + +vi.mock('react-router-dom', async () => { + const mod = await vi.importActual('react-router-dom'); + return { + ...mod, + useNavigate: vi.fn(), + }; +}); + +describe('JoinExistingRoom', () => { + it('should display the correct JoinExistingRoom', () => { + const { wrapper } = makeTestProvider([providers.runtime]); + renderBase(, { wrapper }); + + expect(screen.getByTestId('JoinExistingRoom')).toBeInTheDocument(); + expect(screen.getByText('Join waiting room')).toBeInTheDocument(); + expect(screen.getAllByText(/Room name/i)[0]).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinExistingRoom/JoinExistingRoom.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinExistingRoom/JoinExistingRoom.tsx new file mode 100644 index 00000000..17a7fcfc --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinExistingRoom/JoinExistingRoom.tsx @@ -0,0 +1,29 @@ +import { ReactElement, useState } from 'react'; +import JoinWaitRoomButton from '../JoinWaitRoomButton'; +import RoomNameInput from '../RoomNameInput'; + +/** + * JoinExistingRoom Component + * + * Displays a text box and button to join the waiting room for a custom room. + * @returns {ReactElement} - The JoinExistingRoom component. + */ +const JoinExistingRoom = (): ReactElement => { + const [roomName, setRoomName] = useState(''); + const [hasError, setHasError] = useState(false); + + return ( +
        + + + +
        + ); +}; + +export default JoinExistingRoom; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinExistingRoom/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinExistingRoom/index.tsx new file mode 100644 index 00000000..4d0c9d3a --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinExistingRoom/index.tsx @@ -0,0 +1,3 @@ +import JoinExistingRoom from './JoinExistingRoom'; + +export default JoinExistingRoom; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinWaitRoomButton/JoinWaitRoomButton.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinWaitRoomButton/JoinWaitRoomButton.spec.tsx new file mode 100644 index 00000000..db1b8df2 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinWaitRoomButton/JoinWaitRoomButton.spec.tsx @@ -0,0 +1,67 @@ +import { render as renderBase, screen, fireEvent, waitFor } from '@testing-library/react'; +import { useNavigate } from 'react-router-dom'; +import MemoryRouter from '@test/RouterWrapper'; +import { describe, expect, it, Mock, vi, beforeEach } from 'vitest'; +import { makeTestProvider, providers } from '@test/providers'; +import type { VideoClient } from '@core/services'; +import JoinWaitRoomButton from './JoinWaitRoomButton'; + +const mockMutate = vi.fn(); + +const mockVideoClient = { + createSession: (...args: unknown[]): unknown => mockMutate(...args), +} as unknown as VideoClient; + +vi.mock('react-router-dom', async () => { + const mod = await vi.importActual('react-router-dom'); + return { + ...mod, + useNavigate: vi.fn(), + }; +}); + +const mockNavigate = vi.fn(); +const mockSetHasError = vi.fn(); + +describe('JoinWaitRoomButtonComponent', () => { + beforeEach(() => { + vi.clearAllMocks(); + mockMutate.mockResolvedValue({ sessionKey: 'resolved-session-key' }); + }); + + it('should navigate to the waiting room if the room name is valid', async () => { + (useNavigate as Mock).mockReturnValue(mockNavigate); + render( + + + + ); + + fireEvent.click(screen.getByRole('button')); + + await waitFor(() => { + expect(mockNavigate).toHaveBeenCalledWith('/waiting-room/resolved-session-key'); + }); + }); + + it('should not navigate and set error if the room name is empty', () => { + (useNavigate as Mock).mockReturnValue(mockNavigate); + render( + + + + ); + + fireEvent.click(screen.getByRole('button')); + + expect(mockNavigate).not.toHaveBeenCalled(); + expect(mockSetHasError).toHaveBeenCalledWith(true); + }); +}); + +function render(ui: React.ReactElement) { + const { wrapper } = makeTestProvider([providers.runtime], { + runtimeContext: { videoClient: mockVideoClient }, + }); + return renderBase(ui, { wrapper }); +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinWaitRoomButton/JoinWaitRoomButton.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinWaitRoomButton/JoinWaitRoomButton.tsx new file mode 100644 index 00000000..031f40a3 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinWaitRoomButton/JoinWaitRoomButton.tsx @@ -0,0 +1,55 @@ +import Button from '@mui/material/Button'; +import { Dispatch, MouseEvent, ReactElement, SetStateAction } from 'react'; +import { useTranslation } from 'react-i18next'; +import { useNavigate } from 'react-router-dom'; +import { runtime$ } from '@core/stores'; + +export type JoinWaitRoomButtonProps = { + roomName: string; + isDisabled: boolean; + setHasError: Dispatch>; +}; + +/** + * JoinWaitRoomButton Component + * + * This component returns a button that takes a user to the meeting. + * @param {JoinWaitRoomButtonProps} props - the props for this component. + * @property {string} roomName - the name of the room to join. + * @property {boolean} isDisabled - whether the button is disabled. + * @property {Dispatch>} setHasError - function to set the error state. + * @returns {ReactElement} - the join room button. + */ +const JoinWaitRoomButton = ({ + roomName, + isDisabled, + setHasError, +}: JoinWaitRoomButtonProps): ReactElement => { + const videoClient = runtime$.useVideoClient(); + const { t } = useTranslation(); + const navigate = useNavigate(); + + const handleJoin = async (event: MouseEvent) => { + event.preventDefault(); + if (roomName === '') { + setHasError(true); + return; + } + + /** + * [TODO] If the session already exists returns the session key, + * Right now the createSession endpoint has a patch to support the legacy roomName functionality + */ + const session = await videoClient.createSession({ roomName }); + + navigate(`/waiting-room/${session.sessionKey}`); + }; + + return ( + + ); +}; + +export default JoinWaitRoomButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinWaitRoomButton/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinWaitRoomButton/index.tsx new file mode 100644 index 00000000..c78bc852 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/JoinWaitRoomButton/index.tsx @@ -0,0 +1,3 @@ +import JoinWaitRoomButton from './JoinWaitRoomButton'; + +export default JoinWaitRoomButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LandingPageWelcome/LandingPageWelcome.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LandingPageWelcome/LandingPageWelcome.spec.tsx new file mode 100644 index 00000000..0495fcb0 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LandingPageWelcome/LandingPageWelcome.spec.tsx @@ -0,0 +1,14 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import LandingPageWelcome from './LandingPageWelcome'; + +describe('LandingPageWelcome', () => { + it('renders the welcome heading and applies correct styling', () => { + render(); + + const textHeading = screen.getByText( + 'Power your business with video that transforms customer satisfaction.' + ); + expect(textHeading).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LandingPageWelcome/LandingPageWelcome.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LandingPageWelcome/LandingPageWelcome.tsx new file mode 100644 index 00000000..b0adcb98 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LandingPageWelcome/LandingPageWelcome.tsx @@ -0,0 +1,79 @@ +import { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import classNames from 'classnames'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; + +/** + * LandingPageWelcome Component + * This component includes a welcome message to the users visiting the landing page. + * @returns {ReactElement} - the landing page component + */ +const LandingPageWelcome = (): ReactElement => { + const { t } = useTranslation(); + const primaryWord = t('landing.primary.word'); + + const renderTitle = (titleKey: string) => { + const text = t(titleKey); + const isPrimaryWord = text.toLowerCase().includes(primaryWord.toLowerCase()); + + return ( + + {text} + + ); + }; + + return ( + + + <> + {renderTitle('landing.welcome.title.1')} + {renderTitle('landing.welcome.title.2')} + {renderTitle('landing.welcome.title.3')} + + + + + {t('landing.welcome.subtitle')} + + + ); +}; + +export default LandingPageWelcome; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LandingPageWelcome/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LandingPageWelcome/index.tsx new file mode 100644 index 00000000..5dd4ac15 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LandingPageWelcome/index.tsx @@ -0,0 +1,3 @@ +import LandingPageWelcome from './LandingPageWelcome'; + +export default LandingPageWelcome; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LanguageSelector/LanguageSelector.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LanguageSelector/LanguageSelector.spec.tsx new file mode 100644 index 00000000..cb59d749 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LanguageSelector/LanguageSelector.spec.tsx @@ -0,0 +1,416 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; + +import { render, screen, fireEvent, waitFor } from '@testing-library/react'; +import LanguageSelector from './LanguageSelector'; +import { env } from '../../env'; + +// Mock VividIcon component +vi.mock('@ui/VividIcon', () => ({ + default: ({ name, customSize }: { name: string; customSize: number }) => ( +
        + {name} +
        + ), +})); + +// Mock react-i18next +const mockChangeLanguage = vi.fn(); +const mockT = vi.fn((key: string) => { + const translations: Record = { + 'languages.english': 'English', + 'languages.german': 'Deutsch', + 'languages.spanish': 'Español', + 'languages.spanishMX': 'Español (México)', + 'languages.italian': 'Italiano', + }; + return translations[key] || key; +}); + +const mockI18n: { + language: string | undefined | null; + changeLanguage: typeof mockChangeLanguage; + options: { + fallbackLng: string; + }; +} = { + language: 'en', + changeLanguage: mockChangeLanguage, + options: { + fallbackLng: 'en', + }, +}; + +vi.mock('react-i18next', () => ({ + useTranslation: () => ({ + t: mockT, + i18n: mockI18n, + }), +})); + +describe('LanguageSelector', () => { + beforeEach(() => { + vi.clearAllMocks(); + mockI18n.language = 'en'; + }); + + describe('Rendering', () => { + it('renders with default props', () => { + env.setSupportedLanguages('en|es|it|de'); + + render(); + + expect(screen.getByTestId('language-selector')).toBeInTheDocument(); + expect(screen.getByText('English')).toBeInTheDocument(); + expect(screen.getByTestId('vivid-icon-flag-united-kingdom')).toBeInTheDocument(); + }); + + it('renders without flags when showFlag is false', () => { + env.setSupportedLanguages('en|es'); + + render(); + + expect(screen.getByText('English')).toBeInTheDocument(); + expect(screen.queryByTestId('vivid-icon-flag-united-kingdom')).not.toBeInTheDocument(); + }); + + it('renders VividIcon with correct size in main display', () => { + env.setSupportedLanguages('en'); + + render(); + + const icon = screen.getByTestId('vivid-icon-flag-united-kingdom'); + expect(icon).toHaveAttribute('data-size', '-2'); + }); + }); + + describe('Supported Languages', () => { + it('shows only supported languages from environment variable', async () => { + env.setSupportedLanguages('en|es|de'); + + render(); + + const selectButton = screen.getByRole('combobox'); + fireEvent.mouseDown(selectButton); + + await waitFor(() => { + expect(screen.getByTestId('language-option-en')).toBeInTheDocument(); + expect(screen.getByTestId('language-option-es')).toBeInTheDocument(); + expect(screen.getByTestId('language-option-de')).toBeInTheDocument(); + expect(screen.queryByTestId('language-option-it')).not.toBeInTheDocument(); + expect(screen.queryByTestId('language-option-es-MX')).not.toBeInTheDocument(); + }); + }); + + it('shows all languages when all are supported', async () => { + env.setSupportedLanguages('en|es|es-MX|it|en-US|de'); + + render(); + + const selectButton = screen.getByRole('combobox'); + fireEvent.mouseDown(selectButton); + + await waitFor(() => { + expect(screen.getByTestId('language-option-en')).toBeInTheDocument(); + expect(screen.getByTestId('language-option-es')).toBeInTheDocument(); + expect(screen.getByTestId('language-option-es-MX')).toBeInTheDocument(); + expect(screen.getByTestId('language-option-it')).toBeInTheDocument(); + expect(screen.getByTestId('language-option-en-US')).toBeInTheDocument(); + expect(screen.getByTestId('language-option-de')).toBeInTheDocument(); + }); + }); + + it('falls back to en when no supported languages env var', async () => { + env.setSupportedLanguages(''); + + render(); + + const selectButton = screen.getByRole('combobox'); + fireEvent.mouseDown(selectButton); + + await waitFor(() => { + expect(screen.getByTestId('language-option-en')).toBeInTheDocument(); + expect(screen.queryByTestId('language-option-es')).not.toBeInTheDocument(); + }); + }); + }); + + describe('Language Selection', () => { + it('changes language when option is selected', async () => { + env.setSupportedLanguages('en|es|it'); + + render(); + + const selectButton = screen.getByRole('combobox'); + fireEvent.mouseDown(selectButton); + + await waitFor(() => { + expect(screen.getByTestId('language-option-es')).toBeInTheDocument(); + }); + + fireEvent.click(screen.getByTestId('language-option-es')); + + expect(mockChangeLanguage).toHaveBeenCalledWith('es'); + }); + + it('changes language to es-MX when selected', async () => { + env.setSupportedLanguages('en|es-MX'); + + render(); + + const selectButton = screen.getByRole('combobox'); + fireEvent.mouseDown(selectButton); + + await waitFor(() => { + expect(screen.getByTestId('language-option-es-MX')).toBeInTheDocument(); + }); + + fireEvent.click(screen.getByTestId('language-option-es-MX')); + + expect(mockChangeLanguage).toHaveBeenCalledWith('es-MX'); + }); + + it('changes language to en-US when selected', async () => { + env.setSupportedLanguages('en|en-US'); + + render(); + + const selectButton = screen.getByRole('combobox'); + fireEvent.mouseDown(selectButton); + + await waitFor(() => { + expect(screen.getByTestId('language-option-en-US')).toBeInTheDocument(); + }); + + fireEvent.click(screen.getByTestId('language-option-en-US')); + + expect(mockChangeLanguage).toHaveBeenCalledWith('en-US'); + }); + }); + + describe('Current Language Display', () => { + it('displays current language correctly with flag icon', () => { + env.setSupportedLanguages('en|es|it'); + mockI18n.language = 'es'; + + render(); + + expect(screen.getByText('Español')).toBeInTheDocument(); + expect(screen.getByTestId('vivid-icon-flag-spain')).toBeInTheDocument(); + }); + + it('displays Italian language correctly', () => { + env.setSupportedLanguages('en|es|it'); + mockI18n.language = 'it'; + + render(); + + expect(screen.getByText('Italiano')).toBeInTheDocument(); + expect(screen.getByTestId('vivid-icon-flag-italy')).toBeInTheDocument(); + }); + + it('displays Mexican Spanish correctly', () => { + env.setSupportedLanguages('en|es-MX'); + mockI18n.language = 'es-MX'; + + render(); + + expect(screen.getByText('Español (México)')).toBeInTheDocument(); + expect(screen.getByTestId('vivid-icon-flag-mexico')).toBeInTheDocument(); + }); + + it('displays US English correctly', () => { + env.setSupportedLanguages('en|en-US'); + mockI18n.language = 'en-US'; + + render(); + + expect(screen.getByText('English (US)')).toBeInTheDocument(); + expect(screen.getByTestId('vivid-icon-flag-united-states')).toBeInTheDocument(); + }); + + it('displays German correctly', () => { + env.setSupportedLanguages('en|de'); + mockI18n.language = 'de'; + + render(); + + expect(screen.getByText('Deutsch')).toBeInTheDocument(); + expect(screen.getByTestId('vivid-icon-flag-germany')).toBeInTheDocument(); + }); + + it('handles unsupported language gracefully', () => { + env.setSupportedLanguages('en|es'); + mockI18n.language = 'fr'; + + render(); + + expect(screen.getByDisplayValue('fr')).toBeInTheDocument(); + }); + }); + + describe('Fallback Language Handling', () => { + it('uses en as fallback when current language is empty', () => { + env.setSupportedLanguages('en|es'); + mockI18n.language = ''; + + render(); + + expect(screen.getByText('English')).toBeInTheDocument(); + expect(screen.getByTestId('vivid-icon-flag-united-kingdom')).toBeInTheDocument(); + }); + + it('uses en as fallback when current language is undefined', () => { + env.setSupportedLanguages('en|es'); + mockI18n.language = undefined; + + render(); + + expect(screen.getByText('English')).toBeInTheDocument(); + expect(screen.getByTestId('vivid-icon-flag-united-kingdom')).toBeInTheDocument(); + }); + + it('uses en as fallback when current language is null', () => { + env.setSupportedLanguages('en|es'); + mockI18n.language = null; + + render(); + + expect(screen.getByText('English')).toBeInTheDocument(); + expect(screen.getByTestId('vivid-icon-flag-united-kingdom')).toBeInTheDocument(); + }); + }); + + describe('Dropdown Behavior', () => { + it('shows language options when opened', async () => { + env.setSupportedLanguages('en|es|it'); + + render(); + + expect(screen.queryByTestId('language-option-es')).not.toBeInTheDocument(); + + const selectButton = screen.getByRole('combobox'); + fireEvent.mouseDown(selectButton); + + await waitFor(() => { + expect(screen.getByTestId('language-option-en')).toBeInTheDocument(); + expect(screen.getByTestId('language-option-es')).toBeInTheDocument(); + expect(screen.getByTestId('language-option-it')).toBeInTheDocument(); + }); + }); + + it('displays language names and flag icons in options', async () => { + env.setSupportedLanguages('en|es'); + + render(); + + const selectButton = screen.getByRole('combobox'); + fireEvent.mouseDown(selectButton); + + await waitFor(() => { + const englishOption = screen.getByTestId('language-option-en'); + expect(englishOption).toHaveTextContent('English'); + + const spanishOption = screen.getByTestId('language-option-es'); + expect(spanishOption).toHaveTextContent('Español'); + + const englishIcon = screen + .getAllByTestId('vivid-icon-flag-united-kingdom') + .find((icon) => icon.getAttribute('data-size') === '-2'); + const spanishIcon = screen + .getAllByTestId('vivid-icon-flag-spain') + .find((icon) => icon.getAttribute('data-size') === '-2'); + + expect(englishIcon).toBeInTheDocument(); + expect(spanishIcon).toBeInTheDocument(); + }); + }); + + it('hides flags in options when showFlag is false', async () => { + env.setSupportedLanguages('en|es'); + + render(); + + const selectButton = screen.getByRole('combobox'); + fireEvent.mouseDown(selectButton); + + await waitFor(() => { + const englishOption = screen.getByTestId('language-option-en'); + expect(englishOption).toHaveTextContent('English'); + expect(screen.queryByTestId('vivid-icon-flag-united-kingdom')).not.toBeInTheDocument(); + expect(screen.queryByTestId('vivid-icon-flag-spain')).not.toBeInTheDocument(); + }); + }); + + it('renders VividIcon with correct size in dropdown options', async () => { + env.setSupportedLanguages('en|es'); + + render(); + + const selectButton = screen.getByRole('combobox'); + fireEvent.mouseDown(selectButton); + + await waitFor(() => { + const dropdownIcon = screen + .getAllByTestId('vivid-icon-flag-united-kingdom') + .find((icon) => icon.getAttribute('data-size') === '-2'); + expect(dropdownIcon).toBeInTheDocument(); + }); + }); + }); + + describe('VividIcon Integration', () => { + it('uses different sizes for display vs dropdown', async () => { + env.setSupportedLanguages('en'); + + render(); + + const displayIcon = screen.getByTestId('vivid-icon-flag-united-kingdom'); + expect(displayIcon).toHaveAttribute('data-size', '-2'); + + const selectButton = screen.getByRole('combobox'); + fireEvent.mouseDown(selectButton); + + await waitFor(() => { + const dropdownIcons = screen.getAllByTestId('vivid-icon-flag-united-kingdom'); + const dropdownIcon = dropdownIcons.find((icon) => icon.getAttribute('data-size') === '-2'); + expect(dropdownIcon).toBeInTheDocument(); + }); + }); + }); + + describe('Accessibility', () => { + it('has proper test ids for testing', async () => { + env.setSupportedLanguages('en|es'); + + render(); + + expect(screen.getByTestId('language-selector')).toBeInTheDocument(); + + const selectButton = screen.getByRole('combobox'); + fireEvent.mouseDown(selectButton); + + await waitFor(() => { + expect(screen.getByTestId('language-option-en')).toBeInTheDocument(); + expect(screen.getByTestId('language-option-es')).toBeInTheDocument(); + }); + }); + + it('maintains MUI Select accessibility features', () => { + env.setSupportedLanguages('en'); + + render(); + + const selectButton = screen.getByRole('combobox'); + expect(selectButton).toBeInTheDocument(); + expect(selectButton).toHaveAttribute('aria-haspopup', 'listbox'); + }); + + it('VividIcon components have proper test ids', () => { + env.setSupportedLanguages('en'); + + render(); + + expect(screen.getByTestId('vivid-icon-flag-united-kingdom')).toBeInTheDocument(); + }); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LanguageSelector/LanguageSelector.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LanguageSelector/LanguageSelector.tsx new file mode 100644 index 00000000..795ab99a --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LanguageSelector/LanguageSelector.tsx @@ -0,0 +1,103 @@ +import { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import Box from '@mui/material/Box'; +import MenuItem from '@mui/material/MenuItem'; +import FormControl from '@mui/material/FormControl'; +import Select from '@mui/material/Select'; +import type { SelectChangeEvent } from '@mui/material/Select'; +import { LanguageOption, LanguageSelectorProps } from './LanguageSelector.types'; +import useIsSmallViewport from '../../hooks/useIsSmallViewport'; +import VividIcon from '@ui/VividIcon'; +import { env } from '../../env'; + +const languageOptions: LanguageOption[] = [ + { code: 'en', name: 'English', flag: 'flag-united-kingdom' }, + { code: 'en-US', name: 'English (US)', flag: 'flag-united-states' }, + { code: 'de', name: 'Deutsch', flag: 'flag-germany' }, + { code: 'it', name: 'Italiano', flag: 'flag-italy' }, + { code: 'es', name: 'Español', flag: 'flag-spain' }, + { code: 'es-MX', name: 'Español (México)', flag: 'flag-mexico' }, +]; + +const ChevronIcon = ({ className, ...props }: { className?: string } & Record) => ( + + + +); + +const SelectIconComponent = + (_iconClassName: string) => + (props: Record): ReactElement => ; + +/** + * LanguageSelector Component + * A dropdown component that allows users to select their preferred language. + * The available languages are determined by the 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. + * @returns {ReactElement} The rendered LanguageSelector component. + */ +const LanguageSelector = ({ showFlag = true }: LanguageSelectorProps): ReactElement => { + const { i18n } = useTranslation(); + const isSmallViewport = useIsSmallViewport(); + + const supportedLanguages = languageOptions.filter((option) => + env.I18N_SUPPORTED_LANGUAGES.includes(option.code) + ); + + const handleLanguageChange = (event: SelectChangeEvent) => { + const newLanguage = event.target.value; + void i18n.changeLanguage(newLanguage); + }; + + const currentLanguage = i18n.language || 'en'; + + return ( + + + + ); +}; + +export default LanguageSelector; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LanguageSelector/LanguageSelector.types.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LanguageSelector/LanguageSelector.types.tsx new file mode 100644 index 00000000..05469425 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LanguageSelector/LanguageSelector.types.tsx @@ -0,0 +1,11 @@ +import { Lang } from '../../env'; + +export type LanguageOption = { + code: Lang; + name: string; + flag: string; +}; + +export type LanguageSelectorProps = { + showFlag?: boolean; +}; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LanguageSelector/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LanguageSelector/index.tsx new file mode 100644 index 00000000..9e525056 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/LanguageSelector/index.tsx @@ -0,0 +1,3 @@ +import LanguageSelector from './LanguageSelector'; + +export default LanguageSelector; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/AdvancedSettingsButton/AdvancedSettingsButton.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/AdvancedSettingsButton/AdvancedSettingsButton.spec.tsx new file mode 100644 index 00000000..4685f251 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/AdvancedSettingsButton/AdvancedSettingsButton.spec.tsx @@ -0,0 +1,26 @@ +import { render as renderBase, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import type { ReactElement } from 'react'; +import { describe, expect, it } from 'vitest'; +import AdvancedSettingsButton from './AdvancedSettingsButton'; + +describe('AdvancedSettingsButton', () => { + it('renders the toolbar button', () => { + render(); + + expect(screen.getByTestId('advanced-settings-button')).toBeInTheDocument(); + }); + + it('toggles the button tooltip state through context', async () => { + const user = userEvent.setup(); + render(); + + await user.click(screen.getByTestId('advanced-settings-button')); + + expect(screen.getByTestId('advanced-settings-button')).toBeInTheDocument(); + }); +}); + +function render(ui: ReactElement) { + return renderBase(ui); +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/AdvancedSettingsButton/AdvancedSettingsButton.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/AdvancedSettingsButton/AdvancedSettingsButton.tsx new file mode 100644 index 00000000..52a395fc --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/AdvancedSettingsButton/AdvancedSettingsButton.tsx @@ -0,0 +1,54 @@ +import type { ReactElement } from 'react'; +import Tooltip from '@mui/material/Tooltip'; +import { useTranslation } from 'react-i18next'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import VividIcon from '@ui/VividIcon'; +import ToolbarButton from '../ToolbarButton'; + +export type AdvancedSettingsButtonProps = { + isOverflowButton?: boolean; +}; + +const AdvancedSettingsButton = ({ + isOverflowButton = false, +}: AdvancedSettingsButtonProps): ReactElement => { + const { t } = useTranslation(); + const [isOpen, { open, close }] = advancedSettings$.use(({ isOpen }) => isOpen); + + const handleClick = () => { + if (isOpen) { + close(); + return; + } + + open(); + }; + + return ( + + + } + isOverflowButton={isOverflowButton} + /> + + ); +}; + +export default AdvancedSettingsButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/AdvancedSettingsButton/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/AdvancedSettingsButton/index.tsx new file mode 100644 index 00000000..4a8f551b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/AdvancedSettingsButton/index.tsx @@ -0,0 +1,3 @@ +import AdvancedSettingsButton from './AdvancedSettingsButton'; + +export default AdvancedSettingsButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ArchivingButton/ArchivingButton.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ArchivingButton/ArchivingButton.spec.tsx new file mode 100644 index 00000000..8e61271d --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ArchivingButton/ArchivingButton.spec.tsx @@ -0,0 +1,134 @@ +import { describe, expect, it, vi, beforeEach, Mock } from 'vitest'; +import { render as renderBase, screen, act } from '@testing-library/react'; +import { ReactElement } from 'react'; +import useSessionContext from '@hooks/useSessionContext'; +import { SessionContextType } from '@Context/SessionProvider/session'; +import { makeTestProvider, providers } from '@test/providers'; +import ArchivingButton from './ArchivingButton'; +import { env } from '../../../env'; +import type { VideoClient } from '@core/services'; + +vi.mock('@hooks/useSessionContext'); + +const mockVideoClient: VideoClient = { + startArchive: vi.fn(), + stopArchive: vi.fn(), +} as unknown as VideoClient; + +describe('ArchivingButton', () => { + const mockHandleCloseMenu = vi.fn(); + const mockedSessionKey = 'test-session-key'; + let sessionContext: SessionContextType; + + const mockUseSessionContext = useSessionContext as Mock<[], SessionContextType>; + const testArchiveId = 'test-archive-id'; + + beforeEach(() => { + vi.clearAllMocks(); + sessionContext = { + subscriberWrappers: [], + archiveId: null, + markArchiveStartRequestedBySelf: vi.fn(), + resetArchiveStartRequestedBySelf: vi.fn(), + sessionKey: mockedSessionKey, + connected: true, + } as unknown as SessionContextType; + + mockUseSessionContext.mockReturnValue(sessionContext as unknown as SessionContextType); + }); + + it('renders the button correctly', () => { + render(); + expect(screen.getByTestId('archiving-button')).toBeInTheDocument(); + }); + + it('opens the modal when the button is clicked', () => { + render(); + act(() => screen.getByTestId('archiving-button').click()); + expect(screen.getByText('Start Recording?')).toBeInTheDocument(); + }); + + it('triggers the start archiving when button is pressed', async () => { + vi.useFakeTimers(); + (mockVideoClient.startArchive as Mock).mockResolvedValue({ data: { success: true } }); + render(); + + act(() => screen.getByTestId('archiving-button').click()); + expect(screen.getByText('Start Recording?')).toBeInTheDocument(); + + // click the button to start archiving + act(() => screen.getByTestId('popup-dialog-primary-button').click()); + + await act(async () => { + await vi.runAllTimersAsync(); + }); + + expect(mockVideoClient.startArchive).toHaveBeenCalledWith({ sessionKey: mockedSessionKey }); + + vi.useRealTimers(); + }); + + it('shows stop recording dialog when archiving is active', () => { + mockUseSessionContext.mockReturnValue({ + subscriberWrappers: [], + archiveId: 'test-archive-id', + markArchiveStartRequestedBySelf: vi.fn(), + resetArchiveStartRequestedBySelf: vi.fn(), + } as unknown as SessionContextType); + + render(); + act(() => screen.getByTestId('archiving-button').click()); + expect(screen.getByText('Stop Recording?')).toBeInTheDocument(); + }); + + it('triggers stop archiving when recording is active', async () => { + vi.useFakeTimers(); + mockUseSessionContext.mockReturnValue({ + subscriberWrappers: [], + archiveId: testArchiveId, + markArchiveStartRequestedBySelf: vi.fn(), + resetArchiveStartRequestedBySelf: vi.fn(), + sessionKey: mockedSessionKey, + connected: true, + } as unknown as SessionContextType); + + render(); + + act(() => screen.getByTestId('archiving-button').click()); + expect(screen.getByText('Stop Recording?')).toBeInTheDocument(); + + // click the button to stop archiving + act(() => screen.getByTestId('popup-dialog-primary-button').click()); + + await act(async () => { + await vi.runAllTimersAsync(); + }); + + expect(mockVideoClient.stopArchive).toHaveBeenCalledWith({ + sessionKey: mockedSessionKey, + archiveId: testArchiveId, + }); + + vi.useRealTimers(); + }); + + it('is not rendered when allowArchiving is disabled', () => { + env.partialUpdate({ + ALLOW_ARCHIVING: false, + }); + render(); + + expect(screen.queryByTestId('archiving-button')).not.toBeInTheDocument(); + }); +}); + +function render(ui: ReactElement) { + const { wrapper, ...context } = makeTestProvider([providers.runtime], { + runtimeContext: { videoClient: mockVideoClient }, + }); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ArchivingButton/ArchivingButton.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ArchivingButton/ArchivingButton.tsx new file mode 100644 index 00000000..8e3b896a --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ArchivingButton/ArchivingButton.tsx @@ -0,0 +1,134 @@ +import { ReactElement, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { runtime$ } from '@core/stores'; +import useSessionContext from '@hooks/useSessionContext'; +import ToolbarButton from '../ToolbarButton'; +import PopupDialog, { DialogTexts } from '../PopupDialog'; +import Tooltip from '@mui/material/Tooltip'; +import VividIcon from '@ui/VividIcon'; +import classNames from 'classnames'; +import { env } from '../../../env'; +import { RECORDING_START_DELAY } from '@utils/constants'; + +export type ArchivingButtonProps = { + isOverflowButton?: boolean; + handleClick?: () => void; +}; + +/** + * ArchivingButton Component + * + * Displays a button and handles the archiving functionality. If a meeting is currently being recorded, + * will confirm that a user wishes to stop the recording. If a meeting is not being recorded, prompts + * the user before starting the archive. + * @param {ArchivingButtonProps} props - the props for the component + * @property {boolean} isOverflowButton - (optional) whether the button is in the ToolbarOverflowMenu + * @property {(event?: MouseEvent | TouchEvent) => void} handleClick - (optional) click handler that closes the overflow menu in small viewports. + * @returns {ReactElement | false} - The ArchivingButton component. + */ +const ArchivingButton = ({ + isOverflowButton = false, + handleClick, +}: ArchivingButtonProps): ReactElement | false => { + const videoClient = runtime$.useVideoClient(); + const { t } = useTranslation(); + const { + archiveId, + markArchiveStartRequestedBySelf, + resetArchiveStartRequestedBySelf, + sessionKey, + connected, + } = useSessionContext(); + + const isRecording = !!archiveId; + const [isModalOpen, setIsModalOpen] = useState(false); + const title = isRecording ? t('recording.stop.title') : t('recording.start.title'); + const handleButtonClick = () => { + setIsModalOpen((prev) => !prev); + }; + + const startRecordingText: DialogTexts = { + title: t('recording.start.dialog.title'), + contents: t('recording.start.dialog.content'), + primaryActionText: t('recording.start.title'), + secondaryActionText: t('button.cancel'), + }; + + const stopRecordingText: DialogTexts = { + title: t('recording.stop.dialog.title'), + contents: t('recording.stop.dialog.content'), + primaryActionText: t('recording.stop.title'), + secondaryActionText: t('button.cancel'), + }; + + const actionText = isRecording ? stopRecordingText : startRecordingText; + + const handleClose = () => { + setIsModalOpen(false); + + // If the ArchivingButton is in the ToolbarOverflowMenu, we close the modal and the menu + if (isOverflowButton && handleClick) { + handleClick(); + } + }; + + const handleDialogClick = (action: 'start' | 'stop') => { + if (action === 'start') { + if (!archiveId && connected) { + markArchiveStartRequestedBySelf(); + setTimeout(async () => { + try { + await videoClient.startArchive({ sessionKey: sessionKey! }); + } catch (err) { + resetArchiveStartRequestedBySelf(); + console.log(err); + } + }, RECORDING_START_DELAY); + } + } else if (archiveId) { + void videoClient.stopArchive({ sessionKey: sessionKey!, archiveId }); + } + }; + + const handleActionClick = () => { + handleClose(); + void handleDialogClick(isRecording ? 'stop' : 'start'); + }; + + return ( + env.ALLOW_ARCHIVING && ( + <> + + + } + style={{ + marginTop: isOverflowButton ? '0px' : '4px', + backgroundColor: isRecording + ? 'color-mix(in srgb, var(--vera-on-secondary-light) 33%, transparent) !important' + : undefined, + }} + isOverflowButton={isOverflowButton} + /> + + + + ) + ); +}; +export default ArchivingButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ArchivingButton/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ArchivingButton/index.tsx new file mode 100644 index 00000000..43abe54c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ArchivingButton/index.tsx @@ -0,0 +1,3 @@ +import ArchivingButton from './ArchivingButton'; + +export default ArchivingButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/AudioIndicator/AudioIndicator.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/AudioIndicator/AudioIndicator.spec.tsx new file mode 100644 index 00000000..200bf099 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/AudioIndicator/AudioIndicator.spec.tsx @@ -0,0 +1,82 @@ +import { describe, expect, it, vi, beforeEach } from 'vitest'; +import { render as renderBase, screen } from '@testing-library/react'; +import { Stream } from '@vonage/client-sdk-video'; +import AudioIndicator, { AudioIndicatorProps } from './AudioIndicator'; +import { makeTestProvider, providers, type ProviderOptions } from '@test/providers'; +import { ReactElement } from 'react'; + +describe('AudioIndicator', () => { + const mockForceMute = vi.fn(); + const mockStream: Stream = { + connection: { connectionId: 'mock-connection-id', creationTime: Date.now(), data: 'mockData' }, + streamId: 'mock-stream-id', + creationTime: Date.now(), + hasAudio: true, + hasVideo: false, + name: 'John Doe', + videoDimensions: { width: 640, height: 480 }, + videoType: 'camera', + frameRate: 1, + initials: 'JD', + hasCaptions: false, + }; + + const defaultProps: AudioIndicatorProps = { + hasAudio: true, + stream: mockStream, + audioLevel: undefined, + }; + + beforeEach(() => { + vi.clearAllMocks(); + }); + + it('renders Mic icon when participant is unmuted but not speaking', () => { + render(, { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.forceMute = mockForceMute; + } + }, + }, + }); + const micIcon = screen.getByTestId('MicIcon'); + expect(micIcon).toBeInTheDocument(); + }); + + it('renders Mic off icon when participant is muted', () => { + render(, { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.forceMute = mockForceMute; + } + }, + }, + }); + const micOffIcon = screen.getByTestId('vivid-icon-mic-mute-solid'); + expect(micOffIcon).toBeInTheDocument(); + }); +}); + +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; + sessionContext?: ProviderOptions['SessionContext']; +}; + +function render(ui: ReactElement, { userContext, sessionContext }: RenderOptions = {}) { + const { wrapper, ...context } = makeTestProvider( + [providers.user, providers.session, providers.runtime], + { + userContext, + sessionContext, + runtimeContext: undefined, + } + ); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/AudioIndicator/AudioIndicator.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/AudioIndicator/AudioIndicator.tsx new file mode 100644 index 00000000..ba0793ac --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/AudioIndicator/AudioIndicator.tsx @@ -0,0 +1,120 @@ +import { ReactElement, useState } from 'react'; +import { Stream } from '@vonage/client-sdk-video'; +import { useTranslation } from 'react-i18next'; +import PopupDialog, { DialogTexts } from '../PopupDialog'; +import VoiceIndicatorIcon from '../VoiceIndicator/VoiceIndicator'; +import useSessionContext from '../../../hooks/useSessionContext'; +import IconButton from '@mui/material/IconButton'; +import Tooltip from '@mui/material/Tooltip'; +import VividIcon from '@ui/VividIcon'; +import Box from '@mui/material/Box'; +export type AudioIndicatorProps = { + hasAudio: boolean | undefined; + indicatorStyle?: React.CSSProperties; + indicatorColor?: string; + indicatorClassName?: string; + stream?: Stream; + audioLevel?: number; + participantName?: string; +}; + +/** + * AudioIndicator Component + * + * This component displays an icon based on the audio status and handles muting another user. + * @param {AudioIndicatorProps} hasAudio - Indicates whether the user has audio enabled. + * @property {boolean | undefined} audioLevel - (optional) Indicates the current audio level of the video tile. + * @property {React.CSSProperties} indicatorStyle - (optional) The MUI sx styling props for the component. + * @property {string} indicatorColor - (optional) The color of the audio indicator button. + * @property {Stream} stream - (optional) the stream that can be used to force mute a user. + * @property {string} participantName - (optional) the name of the participant that can be muted. + * @returns {ReactElement} The audio indicator component. + */ +const AudioIndicator = ({ + hasAudio, + indicatorStyle, + indicatorColor, + indicatorClassName, + stream, + audioLevel, + participantName, +}: AudioIndicatorProps): ReactElement => { + const { t } = useTranslation(); + const { forceMute } = useSessionContext(); + const [isModalOpen, setIsModalOpen] = useState(false); + + const muteParticipantText: DialogTexts = { + contents: t('participants.mute.dialog.content', { participantName }), + primaryActionText: t('button.mute'), + secondaryActionText: t('button.cancel'), + }; + const handleClick = () => { + setIsModalOpen(true); + }; + + const handleClose = () => { + setIsModalOpen(false); + }; + + const handleActionClick = () => { + if (forceMute && stream) { + void forceMute(stream); + handleClose(); + } + }; + + const styles = { + color: indicatorColor, + cursor: hasAudio ? 'pointer' : 'default', + transform: 'scale(0.8)', + }; + + if (audioLevel !== undefined) { + return ; + } + + return ( + + + + {hasAudio ? ( + + ) : ( + + )} + + + + + ); +}; + +export default AudioIndicator; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/AudioIndicator/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/AudioIndicator/index.tsx new file mode 100644 index 00000000..9c86d1ec --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/AudioIndicator/index.tsx @@ -0,0 +1,3 @@ +import AudioIndicator from './AudioIndicator'; + +export default AudioIndicator; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsBox/CaptionsBox.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsBox/CaptionsBox.spec.tsx new file mode 100644 index 00000000..b7af69e3 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsBox/CaptionsBox.spec.tsx @@ -0,0 +1,52 @@ +import { beforeEach, describe, expect, it, Mock, vi } from 'vitest'; +import { render } from '@testing-library/react'; +import { Subscriber } from '@vonage/client-sdk-video'; +import { SessionContextType } from '../../../../Context/SessionProvider/session'; +import useSessionContext from '../../../../hooks/useSessionContext'; +import CaptionsBox from './CaptionsBox'; +import { SubscriberWrapper } from '../../../../types/session'; + +vi.mock('../../../../hooks/useSessionContext'); + +const mockUseSessionContext = useSessionContext as Mock<[], SessionContextType>; + +describe('CaptionsBox', () => { + let sessionContext: SessionContextType; + + const createSubscriberWrapper = (id: string): SubscriberWrapper => { + const mockSubscriber = { + id, + on: vi.fn(), + off: vi.fn(), + videoWidth: () => 1280, + videoHeight: () => 720, + subscribeToVideo: () => {}, + stream: { + streamId: id, + }, + } as unknown as Subscriber; + return { + id, + element: document.createElement('video'), + isScreenshare: false, + isPinned: false, + subscriber: mockSubscriber, + }; + }; + + beforeEach(() => { + sessionContext = { + subscriberWrappers: [ + createSubscriberWrapper('subscriber-1'), + createSubscriberWrapper('subscriber-2'), + ], + } as unknown as SessionContextType; + mockUseSessionContext.mockReturnValue(sessionContext as unknown as SessionContextType); + }); + + it('renders the captions box correctly', () => { + sessionContext.connected = true; + const { getByTestId } = render(); + expect(getByTestId('captions-box')).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsBox/CaptionsBox.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsBox/CaptionsBox.tsx new file mode 100644 index 00000000..5df0a138 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsBox/CaptionsBox.tsx @@ -0,0 +1,59 @@ +import { ReactElement } from 'react'; +import Box from '@mui/material/Box'; +import UserCaption from './UserCaption'; +import useSessionContext from '../../../../hooks/useSessionContext'; +import useIsSmallViewport from '../../../../hooks/useIsSmallViewport'; + +/** + * CaptionsBox Component + * + * This component renders the captions of the speakers in the meeting room. + * @returns {ReactElement} The captions box component. + */ +const CaptionsBox = (): ReactElement => { + const { subscriberWrappers, ownCaptions } = useSessionContext(); + const isSmallViewPort = useIsSmallViewport(); + + const sxBox = { + position: 'absolute', + bottom: isSmallViewPort ? 100 : 80, + left: '50%', + transform: 'translateX(-50%)', + px: 2, + py: isSmallViewPort ? 1 : 1.5, + borderRadius: 2, + width: isSmallViewPort ? '90vw' : 600, + height: isSmallViewPort ? 150 : 200, + overflowY: 'auto', + display: 'flex', + flexDirection: 'column', + justifyContent: 'flex-start', + alignItems: 'flex-start', + }; + + return ( + + {ownCaptions && ( + + )} + {(subscriberWrappers ?? []).map((wrapper, idx) => ( + + ))} + + ); +}; + +export default CaptionsBox; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsBox/UserCaption/UserCaption.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsBox/UserCaption/UserCaption.spec.tsx new file mode 100644 index 00000000..378a1b6d --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsBox/UserCaption/UserCaption.spec.tsx @@ -0,0 +1,76 @@ +import { beforeEach, describe, expect, it, Mock, vi } from 'vitest'; +import { render } from '@testing-library/react'; +import { Subscriber } from '@vonage/client-sdk-video'; +import { SessionContextType } from '../../../../../Context/SessionProvider/session'; +import useSessionContext from '../../../../../hooks/useSessionContext'; +import UserCaption from './UserCaption'; +import { SubscriberWrapper } from '../../../../../types/session'; + +vi.mock('../../../../../hooks/useSessionContext'); +vi.mock('../../../../../hooks/useReceivingCaptions', () => ({ + default: () => ({ + captionText: '', + isReceivingCaptions: false, + }), +})); + +vi.useFakeTimers(); + +const mockUseSessionContext = useSessionContext as Mock<[], SessionContextType>; + +describe('UserCaption', () => { + let sessionContext: SessionContextType; + + const createSubscriberWrapper = (id: string): SubscriberWrapper => { + const mockSubscriber = { + id, + on: vi.fn(), + off: vi.fn(), + videoWidth: () => 1280, + videoHeight: () => 720, + subscribeToVideo: () => {}, + stream: { + streamId: id, + }, + } as unknown as Subscriber; + return { + id, + element: document.createElement('video'), + isScreenshare: false, + isPinned: false, + subscriber: mockSubscriber, + }; + }; + + beforeEach(() => { + sessionContext = { + subscriberWrappers: [], + currentCaptionsId: { + current: '1-2-3-4', + }, + } as unknown as SessionContextType; + mockUseSessionContext.mockReturnValue(sessionContext as unknown as SessionContextType); + }); + + it('renders the caption when receiving captions', () => { + const { getByText } = render( + + ); + expect(getByText('Test Caption')).toBeInTheDocument(); + }); + + it('does not render when no caption is provided', () => { + const { queryByText } = render( + + ); + expect(queryByText('Test Caption')).not.toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsBox/UserCaption/UserCaption.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsBox/UserCaption/UserCaption.tsx new file mode 100644 index 00000000..4ee6b6d7 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsBox/UserCaption/UserCaption.tsx @@ -0,0 +1,84 @@ +import { Subscriber } from '@vonage/client-sdk-video'; +import { ReactElement, useState, useRef, useEffect } from 'react'; +import Typography from '@mui/material/Typography'; +import { useTranslation } from 'react-i18next'; +import useReceivingCaptions from '../../../../../hooks/useReceivingCaptions'; +import { CAPTION_DISPLAY_DURATION_MS } from '../../../../../utils/constants'; + +export type UserCaptionProps = { + subscriber: Subscriber | null; + isSmallViewPort: boolean; + caption?: string; +}; + +/** + * UserCaption component to display captions for a specific user. + * @param {UserCaptionProps} props - The props for the component. + * @property {Subscriber} subscriber - The subscriber object for which to display captions. + * @property {boolean} isSmallViewPort - whether it is a small viewport (mobile view or small tab). + * @property {string} caption - (optional) the caption text to display. + * @returns {ReactElement | null} - The rendered caption or null if not receiving captions. + */ +const UserCaption = ({ + subscriber, + isSmallViewPort, + caption, +}: UserCaptionProps): ReactElement | null => { + const { t } = useTranslation(); + const { caption: captionText, isReceivingCaptions } = useReceivingCaptions({ + subscriber, + }); + + const displayCaption = caption ?? captionText; + const isActive = Boolean(caption ?? isReceivingCaptions); + + const [visible, setVisible] = useState(false); + const timeoutRef = useRef(null); + + useEffect(() => { + if (isActive && displayCaption) { + // eslint-disable-next-line react-hooks/set-state-in-effect + setVisible(true); + if (timeoutRef.current) { + clearTimeout(timeoutRef.current); + } + timeoutRef.current = window.setTimeout(() => setVisible(false), CAPTION_DISPLAY_DURATION_MS); + } else { + setVisible(false); + if (timeoutRef.current) { + clearTimeout(timeoutRef.current); + timeoutRef.current = null; + } + } + + return () => { + if (timeoutRef.current) { + clearTimeout(timeoutRef.current); + } + }; + }, [displayCaption, isActive]); + + if (!visible || !displayCaption) { + return null; + } + + return ( +
        + + {subscriber?.stream?.name ?? t('user.you')}: {displayCaption} + +
        + ); +}; + +export default UserCaption; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsBox/UserCaption/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsBox/UserCaption/index.tsx new file mode 100644 index 00000000..6dd78b05 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsBox/UserCaption/index.tsx @@ -0,0 +1,3 @@ +import UserCaption from './UserCaption'; + +export default UserCaption; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsBox/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsBox/index.tsx new file mode 100644 index 00000000..447d959f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsBox/index.tsx @@ -0,0 +1,3 @@ +import CaptionsBox from './CaptionsBox'; + +export default CaptionsBox; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsButton.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsButton.spec.tsx new file mode 100644 index 00000000..72648e3d --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsButton.spec.tsx @@ -0,0 +1,112 @@ +import { describe, expect, it, vi, beforeEach, Mock } from 'vitest'; +import { render as renderBase, screen, act, waitFor } from '@testing-library/react'; +import { Subscriber } from '@vonage/client-sdk-video'; +import { ReactElement } from 'react'; +import { SessionContextType } from '@Context/SessionProvider/session'; +import useSessionContext from '@hooks/useSessionContext'; +import { SubscriberWrapper } from '@app-types/session'; +import { makeTestProvider, providers } from '@test/providers'; +import CaptionsButton, { CaptionsState } from './CaptionsButton'; +import { env } from '../../../env'; +import type { VideoClient } from '@core/services'; + +vi.mock('@hooks/useSessionContext'); + +const mockVideoClient: VideoClient = { + ensureCaptionsEnabled: vi.fn(), + disableCaptions: vi.fn(), +} as unknown as VideoClient; + +const mockUseSessionContext = useSessionContext as Mock<[], SessionContextType>; + +describe('CaptionsButton', () => { + const mockHandleCloseMenu = vi.fn(); + const mockSetIsUserCaptionsEnabled = vi.fn(); + const mockSetCaptionsErrorResponse = vi.fn(); + + const mockCaptionsState = { + isUserCaptionsEnabled: false, + setIsUserCaptionsEnabled: mockSetIsUserCaptionsEnabled, + setCaptionsErrorResponse: mockSetCaptionsErrorResponse, + } as CaptionsState; + const mockedSessionKey = 'test-session-key'; + let sessionContext: SessionContextType; + + const createSubscriberWrapper = (id: string): SubscriberWrapper => { + const mockSubscriber = { + id, + on: vi.fn(), + off: vi.fn(), + videoWidth: () => 1280, + videoHeight: () => 720, + subscribeToVideo: () => {}, + stream: { + streamId: id, + }, + } as unknown as Subscriber; + return { + id, + element: document.createElement('video'), + isScreenshare: false, + isPinned: false, + subscriber: mockSubscriber, + }; + }; + + beforeEach(() => { + vi.clearAllMocks(); + (mockVideoClient.ensureCaptionsEnabled as Mock).mockResolvedValue({ captionsId: '1-2-3-4' }); + (mockVideoClient.disableCaptions as Mock).mockResolvedValue({}); + sessionContext = { + subscriberWrappers: [createSubscriberWrapper('subscriber-1')], + sessionKey: mockedSessionKey, + connected: true, + } as unknown as SessionContextType; + mockUseSessionContext.mockReturnValue(sessionContext as unknown as SessionContextType); + }); + + it('renders the button correctly', () => { + render( + + ); + expect(screen.getByTestId('captions-button')).toBeInTheDocument(); + }); + + it('turns the captions on when button is pressed', async () => { + env.partialUpdate({ + ALLOW_CAPTIONS: true, + }); + render(); + + act(() => screen.getByTestId('captions-button').click()); + + await waitFor(() => { + expect(mockVideoClient.ensureCaptionsEnabled).toHaveBeenCalledWith({ + sessionKey: mockedSessionKey, + }); + }); + }); + + it('is not rendered when allowCaptions is false', () => { + env.partialUpdate({ + ALLOW_CAPTIONS: false, + }); + render(); + + expect(screen.queryByTestId('captions-button')).not.toBeInTheDocument(); + }); +}); + +function render(ui: ReactElement) { + const { wrapper, ...context } = makeTestProvider([providers.runtime], { + runtimeContext: { videoClient: mockVideoClient }, + }); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsButton.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsButton.tsx new file mode 100644 index 00000000..1797004b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/CaptionsButton.tsx @@ -0,0 +1,124 @@ +import { Dispatch, ReactElement, SetStateAction } from 'react'; +import { AxiosError } from 'axios'; +import { useTranslation } from 'react-i18next'; +import useSessionContext from '@hooks/useSessionContext'; +import ToolbarButton from '../ToolbarButton'; +import Tooltip from '@mui/material/Tooltip'; +import VividIcon from '@ui/VividIcon'; +import { env } from '../../../env'; +import { runtime$ } from '@core/stores'; + +export type CaptionsState = { + isUserCaptionsEnabled: boolean; + setIsUserCaptionsEnabled: Dispatch>; + setCaptionsErrorResponse: Dispatch>; +}; + +export type CaptionsButtonProps = { + isOverflowButton?: boolean; + handleClick?: () => void; + captionsState: CaptionsState; +}; + +/** + * CaptionsButton Component + * + * Displays a button and handles the captioning functionality. + * @param {CaptionsButtonProps} props - the props for the component + * @property {boolean} isOverflowButton - (optional) whether the button is in the ToolbarOverflowMenu + * @property {(event?: MouseEvent | TouchEvent) => void} handleClick - (optional) click handler that closes the overflow menu in small viewports. + * @property {CaptionsState} captionsState - the state of the captions, including whether they are enabled and functions to set error messages + * @returns {ReactElement | false} - The CaptionsButton component. + */ +const CaptionsButton = ({ + isOverflowButton = false, + handleClick, + captionsState, +}: CaptionsButtonProps): ReactElement | false => { + const videoClient = runtime$.useVideoClient(); + const { t } = useTranslation(); + const { sessionKey } = useSessionContext(); + const { isUserCaptionsEnabled, setIsUserCaptionsEnabled, setCaptionsErrorResponse } = + captionsState; + const title = isUserCaptionsEnabled ? t('captions.disable') : t('captions.enable'); + + const handleClose = () => { + if (isOverflowButton && handleClick) { + handleClick(); + } + }; + + const handleCaptionsErrorResponse = (message: string | null) => { + setCaptionsErrorResponse(message || t('errors.unknown')); + + setIsUserCaptionsEnabled(false); + }; + + const handleCaptionsEnable = async () => { + try { + await videoClient.ensureCaptionsEnabled({ sessionKey: sessionKey! }); + + setIsUserCaptionsEnabled(true); + } catch (error) { + if (error instanceof AxiosError) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + handleCaptionsErrorResponse(error.response?.data.message); + } + } + }; + + const handleCaptionsDisable = () => { + try { + setIsUserCaptionsEnabled(false); + } catch (error) { + if (error instanceof AxiosError) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + handleCaptionsErrorResponse(error.response?.data.message); + } + } + }; + + const handleCaptions = async (action: 'enable' | 'disable') => { + if (action === 'enable') { + await handleCaptionsEnable(); + } else if (action === 'disable') { + handleCaptionsDisable(); + } + }; + + const handleActionClick = () => { + void handleCaptions(isUserCaptionsEnabled ? 'disable' : 'enable'); + handleClose(); + }; + + return ( + env.ALLOW_CAPTIONS && ( + + + ) : ( + + ) + } + sx={{ + marginTop: isOverflowButton ? '0px' : '4px', + }} + isOverflowButton={isOverflowButton} + /> + + ) + ); +}; +export default CaptionsButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/index.tsx new file mode 100644 index 00000000..380d0035 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsButton/index.tsx @@ -0,0 +1,3 @@ +import CaptionsButton from './CaptionsButton'; + +export default CaptionsButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsError/CaptionsError.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsError/CaptionsError.spec.tsx new file mode 100644 index 00000000..2b1c319f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsError/CaptionsError.spec.tsx @@ -0,0 +1,34 @@ +import { describe, expect, it, vi, beforeEach, afterAll } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import CaptionsError from './CaptionsError'; + +describe('CaptionsError', () => { + const mockSetCaptionsErrorResponse = vi.fn(); + beforeEach(() => { + vi.clearAllMocks(); + }); + + afterAll(() => { + vi.restoreAllMocks(); + }); + + it('renders nothing when captionsErrorResponse is null', () => { + render( + + ); + expect(screen.queryByText(/Captions error:/)).toBeNull(); + }); + + it('renders error message when there is an error in captions', () => { + render( + + ); + expect(screen.getByText(/Captions error: Failed to fetch captions/)).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsError/CaptionsError.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsError/CaptionsError.tsx new file mode 100644 index 00000000..f253423d --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsError/CaptionsError.tsx @@ -0,0 +1,49 @@ +import { Dispatch, ReactElement, SetStateAction } from 'react'; +import { useTranslation } from 'react-i18next'; +import { env } from '../../../env'; +import useIsSmallViewport from '../../../hooks/useIsSmallViewport'; +import Snackbar from '@mui/material/Snackbar'; +import Alert from '@mui/material/Alert'; + +export type CaptionsErrorProps = { + captionsErrorResponse: string | null; + setCaptionsErrorResponse: Dispatch>; +}; + +/** + * CaptionsError Component + * + * Displays an error message when there is an issue with the captions service. + * @param {CaptionsErrorProps} props - the props for the component + * @property {string | null} captionsErrorResponse - the error message to display + * @property {Dispatch>} setCaptionsErrorResponse - function to set the error message to null when the snackbar is closed + * @returns {ReactElement} - The CaptionsError component. + */ +const CaptionsError = ({ + captionsErrorResponse, + setCaptionsErrorResponse, +}: CaptionsErrorProps): ReactElement => { + const { t } = useTranslation(); + const isSmallViewport = useIsSmallViewport(); + return ( + setCaptionsErrorResponse(null)} + anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }} + sx={{ mb: isSmallViewport ? 10 : 6 }} + data-testid="captions-error" + className="bg-vera-surface!" + > + setCaptionsErrorResponse(null)} + severity="error" + sx={{ width: isSmallViewport ? '80%' : '100%' }} + > + {t('captions.errors', { captionsErrorResponse })} + + + ); +}; + +export default CaptionsError; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsError/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsError/index.tsx new file mode 100644 index 00000000..49c758bc --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/CaptionsError/index.tsx @@ -0,0 +1,3 @@ +import CaptionsError from './CaptionsError'; + +export default CaptionsError; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Chat/Chat.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Chat/Chat.spec.tsx new file mode 100644 index 00000000..9075ceba --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Chat/Chat.spec.tsx @@ -0,0 +1,80 @@ +import { afterEach, describe, expect, it } from 'vitest'; +import { cleanup, render as renderBase, screen, within } from '@testing-library/react'; +import { ReactElement } from 'react'; +import Chat from './Chat'; +import { ChatMessageType } from '../../../types/chat'; +import { makeTestProvider, providers, ProviderOptions } from '@test/providers'; +import { SessionContextType } from '../../../Context/SessionProvider/session'; + +const testMessages: ChatMessageType[] = [ + { + participantName: 'User One', + timestamp: 1726587657728, + message: 'Hello all', + }, + { + participantName: 'User Two', + timestamp: 1726587657729, + message: 'Good morning', + }, + { + participantName: 'User Three', + timestamp: 1726587657730, + message: 'Hi', + }, + { + participantName: 'User Four', + timestamp: 1726587657731, + message: 'Sup', + }, +]; + +describe('Chat', () => { + afterEach(() => { + cleanup(); + }); + + it('should display messages', () => { + render( {}} isOpen />, { + sessionContext: { + __interceptor: (context: SessionContextType) => { + if (context) { + context.messages = testMessages; + } + }, + }, + }); + + const chatMessages = screen.getAllByTestId('chat-message'); + expect(chatMessages.length).toBe(4); + + expect(within(chatMessages[0]).getByTestId('chat-msg-participant-name').textContent).toEqual( + 'User One' + ); + expect(within(chatMessages[0]).getByTestId('chat-msg-timestamp').textContent).toEqual( + '11:40 AM' + ); + expect(chatMessages[0].textContent).toMatch('Hello all'); + }); +}); + +type RenderOptions = { + sessionContext?: ProviderOptions['SessionContext']; + userContext?: ProviderOptions['UserContext']; +}; + +function render(ui: ReactElement, { sessionContext, userContext }: RenderOptions = {}) { + const { wrapper, ...context } = makeTestProvider( + [providers.user, providers.session, providers.runtime], + { + sessionContext, + userContext, + runtimeContext: undefined, + } + ); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Chat/Chat.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Chat/Chat.tsx new file mode 100644 index 00000000..81ead33c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Chat/Chat.tsx @@ -0,0 +1,72 @@ +import { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import getInitials from '../../../utils/getInitials'; +import getParticipantColor from '../../../utils/getParticipantColor'; +import ChatMessage from '../ChatMessage'; +import ChatInput from '../ChatInput'; +import useSessionContext from '../../../hooks/useSessionContext'; +import RightPanelTitle from '../RightPanel/RightPanelTitle'; +import List from '@mui/material/List'; +import Box from '@mui/material/Box'; + +export type ChatProps = { + handleClose: () => void; + isOpen: boolean; +}; + +/** + * Chat component + * Renders a scrollable chat container + * @param {ChatProps} props - props for this component + * @property {() => void} handleClose - close handler + * @property {boolean} isOpen - true if chat is open + * @returns {ReactElement | false} - Chat component + */ +const Chat = ({ handleClose, isOpen }: ChatProps): ReactElement | false => { + const { t } = useTranslation(); + const { messages } = useSessionContext(); + + return ( + isOpen && ( + <> + + + + {messages.map((msg) => { + return ( + + ); + })} + + + + + + + ) + ); +}; + +export default Chat; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Chat/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Chat/index.tsx new file mode 100644 index 00000000..19fedf94 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Chat/index.tsx @@ -0,0 +1,3 @@ +import Chat from './Chat'; + +export default Chat; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatButton/ChatButton.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatButton/ChatButton.spec.tsx new file mode 100644 index 00000000..b8d4bc8b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatButton/ChatButton.spec.tsx @@ -0,0 +1,76 @@ +import { render as renderBase, screen } from '@testing-library/react'; +import { describe, expect, it, vi } from 'vitest'; +import { ReactElement } from 'react'; +import { makeTestProvider, providers, ProviderOptions } from '@test/providers'; +import ChatButton from './ChatButton'; +import { env } from './../../../env'; + +describe('ChatButton', () => { + it('should show unread message number', () => { + render( {}} isOpen={false} />, { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.unreadCount = 10; + } + }, + }, + }); + expect(screen.getByTestId('chat-button-unread-count')).toBeVisible(); + expect(screen.getByTestId('chat-button-unread-count').textContent).toBe('10'); + }); + + it('should not show unread message number when number is 0', () => { + render( {}} isOpen={false} />, { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.unreadCount = 0; + } + }, + }, + }); + + const badge = screen.getByTestId('chat-button-unread-count'); + // Check badge is hidden: MUI hides badge by setting dimensions to 0x0 + expect(badge.offsetHeight).toBe(0); + expect(badge.offsetWidth).toBe(0); + }); + + it('should invoke callback on click', () => { + const handleClick = vi.fn(); + render(); + screen.getByRole('button').click(); + expect(handleClick).toHaveBeenCalled(); + }); + + it('is not rendered when allowChat is false', () => { + env.partialUpdate({ + ALLOW_CHAT: false, + }); + render( {}} isOpen />); + + expect(screen.queryByTestId('ChatIcon')).not.toBeInTheDocument(); + }); +}); + +type RenderOptions = { + sessionContext?: ProviderOptions['SessionContext']; + userContext?: ProviderOptions['UserContext']; +}; + +function render(ui: ReactElement, { sessionContext, userContext }: RenderOptions = {}) { + const { wrapper, ...context } = makeTestProvider( + [providers.user, providers.session, providers.runtime], + { + sessionContext, + userContext, + runtimeContext: undefined, + } + ); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatButton/ChatButton.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatButton/ChatButton.tsx new file mode 100644 index 00000000..a70a9e7d --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatButton/ChatButton.tsx @@ -0,0 +1,62 @@ +import { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import ToolbarButton from '../ToolbarButton'; +import UnreadMessagesBadge from '../UnreadMessagesBadge'; +import Tooltip from '@mui/material/Tooltip'; +import VividIcon from '@ui/VividIcon'; +import { env } from '../../../env'; + +export type ChatButtonProps = { + handleClick: () => void; + isOpen: boolean; + isOverflowButton?: boolean; +}; + +/** + * ChatButton Component + * + * Toolbar button to open and close the chat panel. + * Also displays an unread message count badge. + * @param {ChatButtonProps} props - the props for this component + * @property {() => void} handleClick - click handler to toggle open chat panel + * @property {boolean} isOpen - true if chat is currently open, false if not + * @property {boolean} isOverflowButton - (optional) whether the button is in the ToolbarOverflowMenu + * @returns {ReactElement | false} - ChatButton + */ +const ChatButton = ({ + handleClick, + isOpen, + isOverflowButton = false, +}: ChatButtonProps): ReactElement | false => { + const { t } = useTranslation(); + + return ( + env.ALLOW_CHAT && ( + + + + } + isOverflowButton={isOverflowButton} + /> + + + ) + ); +}; + +export default ChatButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatButton/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatButton/index.tsx new file mode 100644 index 00000000..6b39cbfa --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatButton/index.tsx @@ -0,0 +1,3 @@ +import ChatButton from './ChatButton'; + +export default ChatButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatInput/ChatInput.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatInput/ChatInput.spec.tsx new file mode 100644 index 00000000..fd0d9973 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatInput/ChatInput.spec.tsx @@ -0,0 +1,151 @@ +import { describe, expect, it, vi, afterEach } from 'vitest'; +import { render as renderBase, screen, fireEvent, cleanup } from '@testing-library/react'; +import { ReactElement } from 'react'; +import { makeTestProvider, providers, type ProviderOptions } from '@test/providers'; +import ChatInput from './ChatInput'; +import { ChatMessageType } from '../../../types/chat'; + +const testMessages: ChatMessageType[] = [ + { + participantName: 'User One', + timestamp: 1726587657728, + message: 'Hello all', + }, +]; + +const sendChatMessageMock = vi.fn(); + +describe('ChatInput', () => { + afterEach(() => { + cleanup(); + vi.clearAllMocks(); + }); + + it('renders the chat input field', () => { + render(, { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.sendChatMessage = sendChatMessageMock; + } + }, + }, + }); + const input = screen.getByPlaceholderText('Send a message'); + expect(input).toBeInTheDocument(); + }); + + it('does not send a message when composing', () => { + render(, { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.sendChatMessage = sendChatMessageMock; + } + }, + }, + }); + const input = screen.getByPlaceholderText('Send a message'); + + fireEvent.compositionStart(input); + fireEvent.keyDown(input, { key: 'Enter', shiftKey: false }); + expect(sendChatMessageMock).not.toHaveBeenCalled(); + + fireEvent.compositionEnd(input); + fireEvent.keyDown(input, { key: 'Enter', shiftKey: false }); + expect(sendChatMessageMock).not.toHaveBeenCalled(); + }); + + it('sends a message on Enter when not composing', () => { + render(, { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.sendChatMessage = sendChatMessageMock; + } + }, + }, + }); + const input = screen.getByPlaceholderText('Send a message'); + + fireEvent.change(input, { target: { value: testMessages[0].message } }); + fireEvent.keyDown(input, { key: 'Enter', shiftKey: false }); + + expect(sendChatMessageMock).toHaveBeenCalledWith(testMessages[0].message); + }); + + it('does not send a message on Enter if Shift is pressed', () => { + render(, { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.sendChatMessage = sendChatMessageMock; + } + }, + }, + }); + const input = screen.getByPlaceholderText('Send a message'); + + fireEvent.change(input, { target: { value: testMessages[0].message } }); + fireEvent.keyDown(input, { key: 'Enter', shiftKey: true }); + + expect(sendChatMessageMock).not.toHaveBeenCalled(); + }); + + it('trims whitespace before sending a message', () => { + render(, { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.sendChatMessage = sendChatMessageMock; + } + }, + }, + }); + const input = screen.getByPlaceholderText('Send a message'); + + fireEvent.change(input, { target: { value: ` ${testMessages[0].message} ` } }); + fireEvent.keyDown(input, { key: 'Enter', shiftKey: false }); + + expect(sendChatMessageMock).toHaveBeenCalledWith(`${testMessages[0].message}`); + }); + + it('does not send an empty message', () => { + render(, { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.sendChatMessage = sendChatMessageMock; + } + }, + }, + }); + const input = screen.getByPlaceholderText('Send a message'); + const sendButton = screen.getByRole('button'); + + fireEvent.change(input, { target: { value: ' ' } }); + fireEvent.click(sendButton); + expect(sendChatMessageMock).not.toHaveBeenCalled(); + }); +}); + +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; + sessionContext?: ProviderOptions['SessionContext']; +}; + +function render(ui: ReactElement, { userContext, sessionContext }: RenderOptions = {}) { + const { wrapper, ...context } = makeTestProvider( + [providers.user, providers.session, providers.runtime], + { + sessionContext, + userContext, + runtimeContext: undefined, + } + ); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatInput/ChatInput.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatInput/ChatInput.tsx new file mode 100644 index 00000000..d5e637e4 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatInput/ChatInput.tsx @@ -0,0 +1,94 @@ +import { KeyboardEvent, ReactElement, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import useSessionContext from '../../../hooks/useSessionContext'; +import IconButton from '@mui/material/IconButton'; +import InputAdornment from '@mui/material/InputAdornment'; +import TextField from '@mui/material/TextField'; +import VividIcon from '@ui/VividIcon'; + +/** + * ChatInput component + * + * Renders a text input with a send button + * and sends message via signaling on send. + * @returns {ReactElement} - ChatInput component + */ +const ChatInput = (): ReactElement => { + const { t } = useTranslation(); + const [text, setText] = useState(''); + const [isComposing, setIsComposing] = useState(false); + const { sendChatMessage } = useSessionContext(); + + const handleSendMessage = () => { + // Ensure composition has ended before sending the message + if (isComposing) { + return; + } + const trimmedText = text.trim(); + if (trimmedText.length) { + sendChatMessage(trimmedText); + } + setText(''); + }; + + const handleKeyDown = (e: KeyboardEvent) => { + // If enter press then send message unless shift also pressed to allow for multiline messages + if (e.key === 'Enter' && !e.shiftKey && !isComposing) { + e.preventDefault(); + handleSendMessage(); + } + }; + + const handleCompositionStart = () => { + setIsComposing(true); + }; + + const handleCompositionEnd = () => { + setIsComposing(false); + }; + + return ( + setText(e.target.value)} + onCompositionStart={handleCompositionStart} + onCompositionEnd={handleCompositionEnd} + value={text} + maxRows={5} + fullWidth + className="bg-vera-background" + sx={{ + margin: '16px', + minHeight: '48px', + borderRadius: '20px', + flexDirection: 'row', + '&.MuiTextField-root': { + paddingLeft: '24px', + }, + }} + slotProps={{ + input: { + endAdornment: ( + + + + + + ), + disableUnderline: true, + }, + }} + /> + ); +}; + +export default ChatInput; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatInput/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatInput/index.tsx new file mode 100644 index 00000000..294eb7bd --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatInput/index.tsx @@ -0,0 +1,3 @@ +import ChatInput from './ChatInput'; + +export default ChatInput; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatMessage/ChatMessage.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatMessage/ChatMessage.tsx new file mode 100644 index 00000000..219583cf --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatMessage/ChatMessage.tsx @@ -0,0 +1,92 @@ +import { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import { getFormattedTime } from '../../../utils/dateTime'; +import FormattedMessageBody from '../FormattedMessageBody'; +import ListItem from '@mui/material/ListItem'; +import ListItemText from '@mui/material/ListItemText'; +import Avatar from '@mui/material/Avatar'; +import Typography from '@mui/material/Typography'; + +export type ChatMessageProps = { + avatarColor: string; + initials: string; + message: string; + name: string; + timestamp: number; +}; +/** + * ChatMessage component + * + * Renders an MUI ListItem with a chat message. + * For each message, it renders an Avatar with initials, the sender name, a formatted time, and the message. + * @param {ChatMessageProps} props - props for the component + * @property {string} avatarColor - color for avatar + * @property {string} initials - initials for avatar + * @property {string} message - chat message contents + * @property {string} name - sender name + * @property {number} timestamp - message timestamp + * @returns {ReactElement} the ChatMessage Component + */ +const ChatMessage = ({ + avatarColor, + initials, + message, + name, + timestamp, +}: ChatMessageProps): ReactElement => { + const { i18n } = useTranslation(); + + return ( + + + {initials} + + + + {name} + + + {getFormattedTime(i18n.language, timestamp)} + + + } + secondary={ + + + + } + /> + + ); +}; + +export default ChatMessage; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatMessage/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatMessage/index.tsx new file mode 100644 index 00000000..768720a7 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ChatMessage/index.tsx @@ -0,0 +1,3 @@ +import ChatMessage from './ChatMessage'; + +export default ChatMessage; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DeviceControlButton/DeviceControlButton.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DeviceControlButton/DeviceControlButton.spec.tsx new file mode 100644 index 00000000..eb97f199 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DeviceControlButton/DeviceControlButton.spec.tsx @@ -0,0 +1,195 @@ +import { describe, it, expect, vi, beforeEach, Mock, afterEach } from 'vitest'; +import { fireEvent, screen, render as renderBase } from '@testing-library/react'; +import { Publisher } from '@vonage/client-sdk-video'; +import { EventEmitter } from 'stream'; +import { ReactElement } from 'react'; +import { PublisherContextType } from '@Context/PublisherProvider'; +import useSpeakingDetector from '@hooks/useSpeakingDetector'; +import usePublisherContext from '@hooks/usePublisherContext'; +import { defaultAudioDevice } from '@utils/mockData/device'; +import { makeTestProvider } from '@test/providers'; +import DeviceControlButton from './DeviceControlButton'; +import { env } from '../../../env'; +import enTranslations from '../../../locales/en.json'; +import { setupWindowNavigatorMock } from '@web-test/fixtures'; + +vi.mock('@hooks/usePublisherContext.tsx'); +vi.mock('@hooks/useSpeakingDetector.tsx'); +const toggleBackgroundVideoPublisherMock = vi.fn(); +vi.mock('@hooks/useBackgroundPublisherContext', () => { + return { + default: () => ({ + toggleVideo: toggleBackgroundVideoPublisherMock, + }), + }; +}); + +vi.mock('react-i18next', () => ({ + useTranslation: () => ({ + t: (key: string) => { + const translations: Record = { + 'devices.audio.microphone.full': enTranslations['devices.audio.microphone.full'], + 'devices.video.camera.full': enTranslations['devices.video.camera.full'], + 'devices.settings.ariaLabel': enTranslations['devices.settings.ariaLabel'], + 'devices.video.disabled': enTranslations['devices.video.disabled'], + 'devices.audio.disabled': enTranslations['devices.audio.disabled'], + 'mutedAlert.message.muted': enTranslations['mutedAlert.message.muted'], + }; + return translations[key] || key; + }, + }), +})); + +const mockUsePublisherContext = usePublisherContext as Mock<[], PublisherContextType>; +const mockUseSpeakingDetector = useSpeakingDetector as Mock<[], boolean>; +const mockHandleToggleBackgroundEffects = vi.fn(); + +describe('DeviceControlButton', () => { + let mockPublisher: Publisher; + let publisherContext: PublisherContextType; + + beforeEach(() => { + env.partialUpdate({ + ALLOW_MICROPHONE_CONTROL: true, + ALLOW_CAMERA_CONTROL: true, + }); + mockPublisher = Object.assign(new EventEmitter(), { + applyVideoFilter: vi.fn(), + clearVideoFilter: vi.fn(), + getAudioSource: () => defaultAudioDevice, + videoWidth: () => 1280, + videoHeight: () => 720, + }) as unknown as Publisher; + publisherContext = { + publisherContext: null, + isPublishing: true, + publish: vi.fn() as () => Promise, + initializeLocalPublisher: vi.fn(() => { + publisherContext.publisher = mockPublisher; + }) as unknown as () => void, + } as unknown as PublisherContextType; + mockUsePublisherContext.mockImplementation(() => publisherContext); + mockUseSpeakingDetector.mockReturnValue(false); + + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + enumerateDevices: Promise.resolve([]), + }, + }); + }); + + afterEach(() => { + vi.resetAllMocks(); + }); + + it('updates the main publisher and the background replacement publisher when clicked', () => { + const toggleVideoMock = vi.fn(); + mockUsePublisherContext.mockImplementation(() => ({ + ...publisherContext, + toggleAudio: vi.fn(), + toggleVideo: toggleVideoMock, + isAudioEnabled: true, + isVideoEnabled: true, + })); + render( + + ); + const cameraButton = screen.getByLabelText('Camera'); + cameraButton.click(); + expect(toggleVideoMock).toHaveBeenCalled(); + expect(toggleBackgroundVideoPublisherMock).toHaveBeenCalled(); + }); + + describe('audio DeviceControlButton', () => { + it('renders by default', () => { + render( + + ); + const micButton = screen.getByLabelText('Microphone'); + expect(micButton).toBeInTheDocument(); + expect(micButton).not.toBeDisabled(); + + expect(screen.getByTestId('vivid-icon-chevron-up-line')).toBeInTheDocument(); + }); + + it('renders the button as disabled with greyed out icon and correct tooltip when allowMicrophoneControl is false', async () => { + env.partialUpdate({ + ALLOW_MICROPHONE_CONTROL: false, + ALLOW_CAMERA_CONTROL: true, + }); + + render( + + ); + const micButton = screen.getByLabelText('Microphone'); + expect(micButton).toBeInTheDocument(); + expect(micButton).toBeDisabled(); + + const tooltip = screen.getByLabelText('device settings'); + fireEvent.mouseOver(tooltip); + expect( + await screen.findByText('Microphone control is disabled in this application') + ).toBeInTheDocument(); + }); + }); + + describe('video DeviceControlButton', () => { + it('is rendered when it is configured to be enabled', () => { + render( + + ); + + const videoButton = screen.getByLabelText('Camera'); + expect(videoButton).toBeInTheDocument(); + expect(videoButton).not.toBeDisabled(); + + expect(screen.getByTestId('vivid-icon-chevron-up-line')).toBeInTheDocument(); + }); + + it('renders the button as disabled with greyed out icon and correct tooltip when allowCameraControl is false', async () => { + env.partialUpdate({ + ALLOW_MICROPHONE_CONTROL: true, + ALLOW_CAMERA_CONTROL: false, + }); + + render( + + ); + + const videoButton = screen.getByLabelText('Camera'); + expect(videoButton).toBeInTheDocument(); + expect(videoButton).toBeDisabled(); + + const tooltip = screen.getByLabelText('device settings'); + fireEvent.mouseOver(tooltip); + expect( + await screen.findByText('Camera control is disabled in this application') + ).toBeInTheDocument(); + }); + }); +}); + +function render(ui: ReactElement) { + const { wrapper, ...context } = makeTestProvider([]); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DeviceControlButton/DeviceControlButton.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DeviceControlButton/DeviceControlButton.tsx new file mode 100644 index 00000000..d5a28d1e --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DeviceControlButton/DeviceControlButton.tsx @@ -0,0 +1,210 @@ +import { useState, useRef, useCallback, ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import usePublisherContext from '@hooks/usePublisherContext'; +import useBackgroundPublisherContext from '@hooks/useBackgroundPublisherContext'; +import getControlButtonTooltip from '@utils/getControlButtonTooltip'; +import DeviceSettingsMenu from '../DeviceSettingsMenu'; +import MutedAlert from '../../MutedAlert'; +import ButtonGroup from '@mui/material/ButtonGroup'; +import IconButton from '@mui/material/IconButton'; +import Tooltip from '@mui/material/Tooltip'; +import VividIcon from '@ui/VividIcon'; +import Box from '@mui/material/Box'; +import usePushToTalk from '@hooks/usePushToTalk'; +import { env } from '../../../env'; + +export type DeviceControlButtonProps = { + deviceType: 'audio' | 'video'; + toggleBackgroundEffects: () => void; +}; + +/** + * DeviceControlButton Component + * + * This component displays a current status of audio/video device (camera/microphone enabled/disabled) + * and shows a dropdown that displays available audio/video devices. + * @param {DeviceControlButtonProps} props - the props for the component. + * @property {boolean} deviceType - indicates the type of the device to control. + * @property {Function} toggleBackgroundEffects - function to toggle background effects for video devices. + * @returns {ReactElement} The DeviceControlButton component. + */ +const DeviceControlButton = ({ + deviceType, + toggleBackgroundEffects, +}: DeviceControlButtonProps): ReactElement => { + const { t } = useTranslation(); + const { isVideoEnabled, toggleAudio, toggleVideo, isAudioEnabled } = usePublisherContext(); + const { toggleVideo: toggleBackgroundVideoPublisher } = useBackgroundPublisherContext(); + + const isAudio = deviceType === 'audio'; + const [open, setOpen] = useState(false); + const anchorRef = useRef(null); + const isButtonDisabled = isAudio ? !env.ALLOW_MICROPHONE_CONTROL : !env.ALLOW_CAMERA_CONTROL; + + const tooltipTitle = getControlButtonTooltip({ + isAudio, + isAudioEnabled, + isVideoEnabled, + allowMicrophoneControl: env.ALLOW_MICROPHONE_CONTROL, + allowCameraControl: env.ALLOW_CAMERA_CONTROL, + t, + }); + + const handleToggle = () => { + setOpen((prevOpen) => !prevOpen); + }; + + const handleClose = useCallback((event: MouseEvent | TouchEvent) => { + if (anchorRef?.current?.contains(event.target as Node)) { + return; + } + setOpen(false); + }, []); + + const renderControlIcon = () => { + if (isAudio) { + if (!env.ALLOW_MICROPHONE_CONTROL) { + return ( + + ); + } + if (isAudioEnabled) { + return ( + + ); + } + return ( + + ); + } + + if (!env.ALLOW_CAMERA_CONTROL) { + return ( + + ); + } + if (isVideoEnabled) { + return ( + + ); + } + return ( + + ); + }; + + const handleDeviceStateChange = () => { + if (isAudio) { + toggleAudio(); + } else { + toggleVideo(); + toggleBackgroundVideoPublisher(); + } + }; + + usePushToTalk({ + enabled: isAudio && env.ALLOW_MICROPHONE_CONTROL, + isAudioEnabled, + toggleAudio, + }); + + return ( + <> + {isAudio && } + + + {open ? ( + + ) : ( + + )} + + + + {/* We add the Box here so that the tooltip is present if the button is disabled */} + + {renderControlIcon()} + + + + + + + ); +}; + +export default DeviceControlButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DeviceControlButton/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DeviceControlButton/index.tsx new file mode 100644 index 00000000..e86bc6d5 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DeviceControlButton/index.tsx @@ -0,0 +1,3 @@ +import DeviceControlButton from './DeviceControlButton'; + +export default DeviceControlButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DeviceSettingsMenu/DeviceSettingsMenu.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DeviceSettingsMenu/DeviceSettingsMenu.spec.tsx new file mode 100644 index 00000000..d332075c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DeviceSettingsMenu/DeviceSettingsMenu.spec.tsx @@ -0,0 +1,375 @@ +import { + act, + fireEvent, + queryByText, + screen, + waitFor, + render as renderBase, +} from '@testing-library/react'; +import { describe, beforeEach, it, vi, expect } from 'vitest'; +import { ReactElement, RefObject } from 'react'; +import { hasMediaProcessorSupport } from '@vonage/client-sdk-video'; +import type { MediaDeviceInfoJSON } from '@web/types'; +import { makeTestProvider } from '@test/providers'; +import { isSinkIdSupported } from '@web/platform'; +import { env } from '../../../env'; +import { + makeMediaDeviceInfos, + makeMediaStreamMock, + setupWindowNavigatorMock, +} from '@web-test/fixtures'; +import { mediaDevices$ } from '@core/stores'; +import DeviceSettingsMenuComponent from './DeviceSettingsMenu'; + +const { mockHasMediaProcessorSupport, mockGetActiveAudioOutputDevice, mockSetAudioOutputDevice } = + vi.hoisted(() => { + return { + mockHasMediaProcessorSupport: vi.fn().mockReturnValue(true), + mockGetActiveAudioOutputDevice: vi.fn(), + mockSetAudioOutputDevice: vi.fn(), + }; + }); + +vi.mock('@vonage/client-sdk-video', () => ({ + hasMediaProcessorSupport: mockHasMediaProcessorSupport, + getActiveAudioOutputDevice: mockGetActiveAudioOutputDevice, + setAudioOutputDevice: mockSetAudioOutputDevice, +})); + +vi.mock('@web/platform'); + +const someDevices = makeMediaDeviceInfos(); + +describe('DeviceSettingsMenu Component', () => { + const mockHandleToggle = vi.fn(); + const mockHandleToggleBackgroundEffects = vi.fn(); + const mockSetIsOpen = vi.fn(); + const mockAnchorRef = { + current: document.createElement('input'), + } as RefObject; + const mockHandleClose = vi.fn(); + + let defaultSpeakers: MediaDeviceInfoJSON; + let usbHeadsetSpeakers: MediaDeviceInfoJSON; + let bluetoothSpeakers: MediaDeviceInfoJSON; + + beforeEach(() => { + vi.mocked(isSinkIdSupported).mockReturnValue(true); + + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + enumerateDevices: Promise.resolve(someDevices), + getUserMedia: Promise.resolve( + makeMediaStreamMock({ + getVideoTracks: [], + getAudioTracks: [], + }) + ), + }, + }); + + // Mock HTMLAudioElement methods for SoundTest + vi.spyOn(HTMLAudioElement.prototype, 'pause').mockImplementation(vi.fn()); + vi.spyOn(HTMLAudioElement.prototype, 'play').mockResolvedValue(undefined); + + mediaDevices$.setState((state) => ({ + ...state, + mediaDeviceInfo: someDevices, + })); + + const audioOutputDevices = Object.values(mediaDevices$.mediaDevicesMap$.getState().audiooutput); + [defaultSpeakers, usbHeadsetSpeakers, bluetoothSpeakers] = audioOutputDevices; + + // Mock Vonage SDK audio output functions + mockGetActiveAudioOutputDevice.mockResolvedValue(defaultSpeakers); + mockSetAudioOutputDevice.mockImplementation(() => Promise.resolve()); + + vi.mocked(hasMediaProcessorSupport).mockReturnValue(false); + }); + + describe('renders the audio settings menu', () => { + const deviceType = 'audio'; + + it('and renders the output devices if the browser supports setting audioOutput device', async () => { + vi.mocked(isSinkIdSupported).mockReturnValue(true); + + const selectDeviceSpy = vi.spyOn(mediaDevices$.actions, 'selectDevice'); + + render( + + ); + + const outputDevicesElement = screen.getByTestId('output-devices'); + await waitFor(() => expect(outputDevicesElement.children).to.have.length(3)); + expect(outputDevicesElement.firstChild).toHaveTextContent(defaultSpeakers.label); + + expect( + (outputDevicesElement.children[1] as HTMLOptionElement).classList.contains('Mui-selected') + ).toBe(false); + + expect(outputDevicesElement.children[1]).toHaveTextContent(usbHeadsetSpeakers.label); + expect(outputDevicesElement.children[2]).toHaveTextContent(bluetoothSpeakers.label); + + // test will fail without the await act + // eslint-disable-next-line @typescript-eslint/require-await + await act(async () => { + fireEvent.click(outputDevicesElement.children[2]); + }); + + // Verify the store action was called + expect(selectDeviceSpy).toHaveBeenCalledWith('audiooutput', bluetoothSpeakers.deviceId); + }); + + it('and renders the default output device if the browser does not support setting audioOutput device', async () => { + vi.mocked(isSinkIdSupported).mockReturnValue(false); + + render( + + ); + + const outputDevicesElement = screen.getByTestId('output-devices'); + await waitFor(() => expect(outputDevicesElement.children).to.have.length(1)); + expect(outputDevicesElement.firstChild).toHaveTextContent('System Default'); + expect( + (outputDevicesElement.firstChild as HTMLOptionElement).classList.contains('Mui-selected') + ).toBe(true); + + act(() => { + fireEvent.click(outputDevicesElement.firstChild as HTMLOptionElement); + }); + + // Verify the Vonage SDK function was not called + expect(mockSetAudioOutputDevice).not.toHaveBeenCalled(); + expect( + (outputDevicesElement.firstChild as HTMLOptionElement).classList.contains('Mui-selected') + ).toBe(true); + }); + + it('and renders the speaker test if the browser supports audio output device selection', async () => { + vi.mocked(isSinkIdSupported).mockReturnValue(true); + + await act(() => + render( + + ) + ); + + const outputDevicesElement = screen.getByTestId('output-devices'); + expect(outputDevicesElement).toBeInTheDocument(); + }); + + it('and renders the speaker test devices if the browser does not support audio output device selection', async () => { + vi.mocked(isSinkIdSupported).mockReturnValue(false); + vi.mocked(isSinkIdSupported).mockReturnValue(false); + + await act(() => + render( + + ) + ); + + const soundTest = screen.queryByTestId('soundTest'); + expect(soundTest).toBeInTheDocument(); + }); + + it('and updates audio output device list if device is removed', async () => { + vi.mocked(isSinkIdSupported).mockReturnValue(true); + + const selectDeviceSpy = vi.spyOn(mediaDevices$.actions, 'selectDevice'); + + render( + + ); + + const outputDevicesElement = screen.getByTestId('output-devices'); + + // Check initial list is correct + await waitFor(() => expect(outputDevicesElement.children).to.have.length(3)); + expect(outputDevicesElement.firstChild).toHaveTextContent(defaultSpeakers.label); + expect(outputDevicesElement.children[1]).toHaveTextContent(usbHeadsetSpeakers.label); + expect(outputDevicesElement.children[2]).toHaveTextContent(bluetoothSpeakers.label); + + // select device 2 + // eslint-disable-next-line @typescript-eslint/require-await + await act(async () => { + fireEvent.click(outputDevicesElement.children[1] as HTMLOptionElement); + }); + + // Verify the store action was called + expect(selectDeviceSpy).toHaveBeenCalledWith('audiooutput', usbHeadsetSpeakers.deviceId); + + // Simulate device 2 removal - remove USB headset + const devicesWithoutUSB = someDevices.filter( + (d) => d.deviceId !== usbHeadsetSpeakers.deviceId + ); + + act(() => { + mediaDevices$.setState((state) => ({ + ...state, + mediaDeviceInfo: devicesWithoutUSB, + })); + }); + + await waitFor(() => expect(outputDevicesElement.children).to.have.length(2)); + expect(outputDevicesElement.firstChild).toHaveTextContent(defaultSpeakers.label); + // Note: After device removal, the first device (default) should be selected + // but the component doesn't automatically update currentAudioOutputDevice context + // It only updates when user explicitly selects a device or when reconciliation happens + expect(outputDevicesElement.children[1]).toHaveTextContent(bluetoothSpeakers.label); + const removedDevice = queryByText(outputDevicesElement, usbHeadsetSpeakers.label); + expect(removedDevice).not.toBeInTheDocument(); + }); + }); + + describe('renders the video effects menu', () => { + const deviceType = 'video'; + it('if prompted', async () => { + render( + + ); + + await waitFor(() => { + expect(screen.queryByTestId('video-settings-devices-dropdown')).toBeInTheDocument(); + }); + }); + + it('but does not render it if closed', async () => { + render( + + ); + await waitFor(() => { + expect(screen.queryByTestId('video-settings-devices-dropdown')).not.toBeInTheDocument(); + }); + }); + + it('and renders the dropdown separator and background effects option when media processor is supported', async () => { + vi.mocked(hasMediaProcessorSupport).mockReturnValue(true); + + render( + + ); + + await waitFor(() => { + expect(screen.queryByTestId('dropdown-separator')).toBeVisible(); + expect(screen.queryByText('Video effects')).toBeVisible(); + }); + }); + + it('and does not render the dropdown separator and video effects option when media processor is not supported', async () => { + render( + + ); + + await waitFor(() => { + expect(screen.queryByTestId('dropdown-separator')).not.toBeInTheDocument(); + expect(screen.queryByText('video effects')).not.toBeInTheDocument(); + }); + }); + + it('and does not render the dropdown separator and video effects option when allowBackgroundEffects is false', async () => { + env.partialUpdate({ + ALLOW_BACKGROUND_EFFECTS: false, + MEETING_ROOM_ALLOW_DEVICE_SELECTION: true, + }); + + render( + + ); + + await waitFor(() => { + expect(screen.queryByTestId('dropdown-separator')).not.toBeInTheDocument(); + expect(screen.queryByText('video effects')).not.toBeInTheDocument(); + }); + }); + }); +}); + +function render(ui: ReactElement) { + const { wrapper, ...context } = makeTestProvider([]); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DeviceSettingsMenu/DeviceSettingsMenu.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DeviceSettingsMenu/DeviceSettingsMenu.tsx new file mode 100644 index 00000000..3994059a --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DeviceSettingsMenu/DeviceSettingsMenu.tsx @@ -0,0 +1,139 @@ +import { ReactElement, RefObject, Dispatch, SetStateAction } from 'react'; +import { hasMediaProcessorSupport } from '@vonage/client-sdk-video'; +import InputDevices from '../InputAudioDevices'; +import OutputDevices from '../OutputAudioDevices'; +import ReduceNoiseTestSpeakers from '../ReduceNoiseTestSpeakers'; +import useDropdownResizeObserver from '../../../hooks/useDropdownResizeObserver'; +import VideoDevices from '../VideoDevices'; +import DropdownSeparator from '../DropdownSeparator'; +import VideoDevicesOptions from '../VideoDevicesOptions'; +import Popper from '@mui/material/Popper'; +import Grow from '@mui/material/Grow'; +import ClickAwayListener from '@mui/material/ClickAwayListener'; +import Paper from '@mui/material/Paper'; +import Box from '@mui/material/Box'; +import { env } from '../../../env'; + +export type DeviceSettingsMenuProps = { + deviceType: 'audio' | 'video'; + handleToggle: () => void; + toggleBackgroundEffects: () => void; + isOpen: boolean; + anchorRef: RefObject; + handleClose: (event: MouseEvent | TouchEvent) => void; + setIsOpen: Dispatch>; +}; + +/** + * DeviceSettingsMenu Component + * + * This component renders a pop up that includes options to: + * - select audio input and output devices + * - select video input device + * - on supported devices, an option to enable advanced noise suppression + * - on supported devices, an option to blur the video background + * @param {DeviceSettingsMenuProps} props - the props for this component. + * @property {boolean} deviceType - indicates the type of the device to control. + * @property {Function} handleToggle - the function that handles the toggle of video input device. + * @property {Function} toggleBackgroundEffects - the function that toggles background effects for video devices. + * @property {boolean} isOpen - the prop that shows whether the pop up needs to be opened. + * @property {RefObject} anchorRef - the anchor element to attach the pop up to. + * @property {Function} handleClose - the function that handles the closing of the pop up. + * @property {Function} setIsOpen - the function to set the open state of the pop up. + * @returns {ReactElement} - the DeviceSettingsMenu component. + */ +const DeviceSettingsMenu = ({ + deviceType, + handleToggle, + toggleBackgroundEffects, + isOpen, + anchorRef, + handleClose, + setIsOpen, +}: DeviceSettingsMenuProps): ReactElement | false => { + const isAudio = deviceType === 'audio'; + const shouldDisplayBackgroundEffects = + hasMediaProcessorSupport('both') && env.ALLOW_BACKGROUND_EFFECTS; + + const handleToggleBackgroundEffects = () => { + toggleBackgroundEffects(); + handleToggle(); + }; + + useDropdownResizeObserver({ setIsOpen, dropDownRefElement: anchorRef.current }); + + const renderSettingsMenu = () => { + if (isAudio) { + return ( + <> + + + + + ); + } + + return ( + <> + + {shouldDisplayBackgroundEffects && ( + <> + + + + )} + + ); + }; + + return ( + + {({ TransitionProps, placement }) => ( + + + + ({ + padding: { xs: 1, sm: 2 }, + borderRadius: 2, + zIndex: 1, + transform: isAudio + ? 'translateY(-2%) translateX(5%)' + : 'translateY(-5%) translateX(-15%)', + [t.breakpoints.down(741)]: { + transform: isAudio + ? 'translateY(-2%) translateX(-10%)' + : 'translateY(-5%) translateX(-40%)', + }, + [t.breakpoints.down(450)]: { + transform: isAudio + ? 'translateY(-2%) translateX(-5%)' + : 'translateY(-5%) translateX(-5%)', + }, + width: { xs: '90vw', sm: '100%' }, + maxWidth: 400, + position: 'relative', + })} + > + {renderSettingsMenu()} + + + + + )} + + ); +}; + +export default DeviceSettingsMenu; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DeviceSettingsMenu/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DeviceSettingsMenu/index.tsx new file mode 100644 index 00000000..978e6d40 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DeviceSettingsMenu/index.tsx @@ -0,0 +1,3 @@ +import DeviceSettingsMenu from './DeviceSettingsMenu'; + +export default DeviceSettingsMenu; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DropdownSeparator/DropdownSeparator.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DropdownSeparator/DropdownSeparator.tsx new file mode 100644 index 00000000..11c52fb6 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DropdownSeparator/DropdownSeparator.tsx @@ -0,0 +1,23 @@ +import { ReactElement } from 'react'; +import Box from '@mui/material/Box'; + +/** + * DropdownSeparator Component + * + * This component renders a horizontal separator line. + * @returns {ReactElement} The DropdownSeparator component. + */ +const DropdownSeparator = (): ReactElement => { + return ( + + ); +}; + +export default DropdownSeparator; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DropdownSeparator/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DropdownSeparator/index.tsx new file mode 100644 index 00000000..e4efe394 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/DropdownSeparator/index.tsx @@ -0,0 +1,3 @@ +import DropdownSeparator from './DropdownSeparator'; + +export default DropdownSeparator; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Emoji/Emoji.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Emoji/Emoji.spec.tsx new file mode 100644 index 00000000..607a5a8e --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Emoji/Emoji.spec.tsx @@ -0,0 +1,36 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import Emoji from './index'; +import { EMOJI_DISPLAY_DURATION } from '../../../utils/constants'; + +describe('Emoji component', () => { + const emojiWrapper = { + emoji: '😀', + name: 'Happy Face', + time: Date.now(), + }; + + it('renders emoji and name label correctly', () => { + render(); + + expect(screen.getByText(emojiWrapper.emoji)).toBeInTheDocument(); + expect(screen.getByText(emojiWrapper.name)).toBeInTheDocument(); + }); + + it('applies correct inline styles including animationDuration', () => { + render(); + + const container = screen.getByTestId('emoji-string-container'); + const expectedDuration = EMOJI_DISPLAY_DURATION + 100; + + expect(container).toHaveStyle({ + position: 'absolute', + animationName: 'moveEmoji', + animationDuration: `${expectedDuration}ms`, + animationTimingFunction: 'linear', + animationIterationCount: '1', + maxWidth: '35%', + zIndex: '1', + }); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Emoji/Emoji.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Emoji/Emoji.tsx new file mode 100644 index 00000000..2bf40c3b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Emoji/Emoji.tsx @@ -0,0 +1,57 @@ +import { CSSProperties, ReactElement } from 'react'; +import { EmojiWrapper } from '../../../hooks/useEmoji'; +import { EMOJI_DISPLAY_DURATION } from '../../../utils/constants'; +import Chip from '@mui/material/Chip'; +import Box from '@mui/material/Box'; +import useIsSmallViewport from '@hooks/useIsSmallViewport'; + +export type EmojiProps = { + emojiWrapper: EmojiWrapper; +}; + +const style: CSSProperties = { + position: 'absolute', + animationName: 'moveEmoji', + // Adding an extra 100 ms to ensure the emoji does not re-render at bottom of page on animation end + animationDuration: `${EMOJI_DISPLAY_DURATION + 100}ms`, + animationTimingFunction: 'linear', + animationIterationCount: 1, + maxWidth: '35%', + zIndex: 1, +}; + +/** + * Emoji Component + * + * Displays an emoji sent from a user in the meeting. + * @param {EmojiProps} props - The props for the component. + * @returns {ReactElement} - The Emoji Component. + */ +const Emoji = ({ emojiWrapper }: EmojiProps): ReactElement => { + const isSmallViewport = useIsSmallViewport(); + const { emoji, name } = emojiWrapper; + + return ( + + {emoji} + + + ); +}; + +export default Emoji; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Emoji/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Emoji/index.tsx new file mode 100644 index 00000000..29856719 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Emoji/index.tsx @@ -0,0 +1,3 @@ +import Emoji from './Emoji'; + +export default Emoji; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/EmojiGrid/EmojiGrid.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/EmojiGrid/EmojiGrid.spec.tsx new file mode 100644 index 00000000..579af668 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/EmojiGrid/EmojiGrid.spec.tsx @@ -0,0 +1,89 @@ +import { afterEach, beforeEach, describe, expect, it, Mock, vi } from 'vitest'; +import { render, screen, waitFor } from '@testing-library/react'; +import { ReactElement, useRef, useState } from 'react'; +import Button from '@mui/material/Button'; +import useMediaQuery from '@mui/material/useMediaQuery'; +import EmojiGrid from './EmojiGrid'; +import SendEmojiButton from '../SendEmojiButton'; + +vi.mock('@mui/material/useMediaQuery', () => ({ + default: vi.fn(), +})); +vi.mock('../SendEmojiButton'); +vi.mock('../../../utils/emojis', () => ({ + default: { FAVORITE: '🦧' }, +})); + +const mockSendEmojiButton = SendEmojiButton as Mock<[], ReactElement>; + +const FakeSendEmojiButton = + + + + ); +}; + +export default MutingDialog; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/MutingDialog/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/MutingDialog/index.tsx new file mode 100644 index 00000000..3e6d7297 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/MutingDialog/index.tsx @@ -0,0 +1,3 @@ +import MutingDialog from './MutingDialog'; + +export default MutingDialog; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/NameDisplay/NameDisplay.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/NameDisplay/NameDisplay.tsx new file mode 100644 index 00000000..1b0ee97c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/NameDisplay/NameDisplay.tsx @@ -0,0 +1,32 @@ +import type { ReactElement } from 'react'; + +export type NameDisplayProps = { + containerWidth: number; + name: string; +}; + +/** + * NameDisplay Component + * + * This component shows a truncated name within a specified container width. + * @param {NameDisplayProps} props - the props for the component. + * @property {number} containerWidth - the width of the container to determine the max width for truncation. + * @property {string} name - the name to be displayed. + * @returns {ReactElement} The NameDisplay component. + */ +const NameDisplay = ({ name, containerWidth }: NameDisplayProps): ReactElement => { + const safeMaxWidth = + typeof containerWidth === 'number' && Number.isFinite(containerWidth) ? containerWidth : 0; + return ( +
        + {name} +
        + ); +}; + +export default NameDisplay; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/NameDisplay/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/NameDisplay/index.tsx new file mode 100644 index 00000000..b7106703 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/NameDisplay/index.tsx @@ -0,0 +1,3 @@ +import NameDisplay from './NameDisplay'; + +export default NameDisplay; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/OutputAudioDevices/OutputAudioDevices.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/OutputAudioDevices/OutputAudioDevices.tsx new file mode 100644 index 00000000..51068fcd --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/OutputAudioDevices/OutputAudioDevices.tsx @@ -0,0 +1,152 @@ +import { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import type { MediaDeviceInfoJSON } from '@web/types'; +import classNames from 'classnames'; +import DropdownSeparator from '../DropdownSeparator'; +import Box from '@mui/material/Box'; +import MenuList from '@mui/material/MenuList'; +import MenuItem from '@mui/material/MenuItem'; +import VividIcon from '@ui/VividIcon'; +import { useDistinctLabelMediaDevices } from '@ui/hooks'; +import { isSinkIdSupported } from '@web/platform'; +import mediaDevices$ from '@core/stores/devices'; +import { Tooltip } from '@mui/material'; +import { env } from '../../../env'; +import useSelectDeviceHandler from '@hooks/useSelectDeviceHandler'; +import { makeApplicationErrorMapper } from '@core/errors'; +import { handleClientApplicationError } from '@ui/helpers'; + +export type OutputAudioDevicesProps = { + handleToggle: () => void; +}; + +/** + * OutputAudioDevices Component + * + * Displays and switches audio output devices. + * @param {OutputAudioDevicesProps} props - The props for the component. + * @property {() => void} handleToggle - Function to close the menu. + * @returns {ReactElement | false} - The OutputAudioDevices component. + */ +const OutputAudioDevices = ({ handleToggle }: OutputAudioDevicesProps): ReactElement | false => { + const { t } = useTranslation(); + const currentAudioOutputId = mediaDevices$.useDeviceId('audiooutput'); + + const availableDevices = useDistinctLabelMediaDevices('audiooutput', (devices) => + isSinkIdSupported() + ? devices.map((device) => + // Rename default audio output device to user-friendly label + device.deviceId === 'default' + ? { ...device, label: t('devices.audio.defaultLabel') } + : device + ) + : [{ deviceId: 'default', label: t('devices.audio.defaultLabel') } as MediaDeviceInfoJSON] + ); + + const { handleSelectDevice } = useSelectDeviceHandler(); + + const handleChangeAudioOutput = async (deviceId: string) => { + try { + handleToggle(); + + if (!isSinkIdSupported()) return; + + await handleSelectDevice({ + deviceId, + mediaDeviceKind: 'audiooutput', + }); + } catch (error) { + handleClientApplicationError(makeApplicationErrorMapper()(error)); + } + }; + + return ( + env.MEETING_ROOM_ALLOW_DEVICE_SELECTION && ( + <> + + + +

        + {t('devices.audio.speakers.full')} +

        +
        + + + {availableDevices?.map((device: MediaDeviceInfoJSON) => { + // If audio output device selection is not supported we show the default device as selected + const isSelected = + device.deviceId === currentAudioOutputId || availableDevices.length === 1; + + return ( + handleChangeAudioOutput(device.deviceId)} + className="[&.Mui-selected]:text-vera-on-background" + sx={{ + transition: 'background-color 160ms ease', + '&&.Mui-selected': { + backgroundColor: 'var(--vera-background)', + }, + '&&.Mui-selected:hover': { + backgroundColor: 'var(--vera-background)', + }, + '&&:hover': { + backgroundColor: 'var(--vera-background)', + }, + }} + > + + {isSelected ? ( + + + + ) : ( + + )} + + {device.label} + + + + ); + })} + + + ) + ); +}; + +export default OutputAudioDevices; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/OutputAudioDevices/OutputDevices.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/OutputAudioDevices/OutputDevices.spec.tsx new file mode 100644 index 00000000..7dae5fdf --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/OutputAudioDevices/OutputDevices.spec.tsx @@ -0,0 +1,157 @@ +import { + makeMediaDeviceInfos, + makeMediaStreamMock, + mockPlatformModule, + setupWindowNavigatorMock, +} from '@web-test/fixtures'; +import { describe, it, beforeEach, vi, expect } from 'vitest'; +import { render as renderBase, screen, fireEvent, waitFor } from '@testing-library/react'; +import { ReactElement } from 'react'; +import type { MediaDeviceInfoJSON } from '@web/types'; +import { makeTestProvider } from '@test/providers'; +import { isSinkIdSupported } from '@web/platform'; +import mediaDevices$ from '@core/stores/devices'; +import { env } from '../../../env'; +import OutputAudioDevices from './OutputAudioDevices'; + +vi.mock('@web/platform', async () => { + const actual = await vi.importActual('@web/platform'); + + return mockPlatformModule(actual, { + isSinkIdSupported: true, + }); +}); + +const someDevices = makeMediaDeviceInfos(); + +describe('OutputAudioDevices Component', () => { + const mockHandleToggle = vi.fn(); + + let defaultSpeakers: MediaDeviceInfoJSON; + let usbHeadsetSpeakers: MediaDeviceInfoJSON; + let bluetoothSpeakers: MediaDeviceInfoJSON; + + beforeEach(() => { + mediaDevices$.reset(); + mediaDevices$.setState((state) => ({ + ...state, + mediaDeviceInfo: someDevices, + })); + + const audioOutputDevices = Object.values(mediaDevices$.mediaDevicesMap$.getState().audiooutput); + [defaultSpeakers, usbHeadsetSpeakers, bluetoothSpeakers] = audioOutputDevices; + + // after initializing the store to avoid having to mock all the mediaDevices$ sync logic. + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + enumerateDevices: Promise.resolve(someDevices), + getUserMedia: Promise.resolve( + makeMediaStreamMock({ + getVideoTracks: [], + getAudioTracks: [], + }) + ), + }, + }); + }); + + it('renders all available audio output devices when supported', () => { + render(); + + expect(screen.getByText('Speakers')).toBeInTheDocument(); + expect(screen.getByTestId('output-devices')).toBeInTheDocument(); + + // Check that specific audio output devices are rendered + expect(screen.getByText(defaultSpeakers.label)).toBeInTheDocument(); + expect(screen.getByText(usbHeadsetSpeakers.label)).toBeInTheDocument(); + expect(screen.getByText(bluetoothSpeakers.label)).toBeInTheDocument(); + }); + + it('renders only default device when audio output is not supported', () => { + // Mock isSinkIdSupported to return false + vi.mocked(isSinkIdSupported).mockReturnValue(false); + + render(); + + expect(screen.getByText('Speakers')).toBeInTheDocument(); + expect(screen.getByText('System Default')).toBeInTheDocument(); + + // Should not render the actual audio output devices + expect(screen.queryByText(defaultSpeakers.label)).not.toBeInTheDocument(); + }); + + it('changes audio output device on menu item click when supported', async () => { + const selectDeviceSpy = vi.spyOn(mediaDevices$.actions, 'selectDevice'); + + render(); + + const speakerItem = screen.getByText(usbHeadsetSpeakers.label); + fireEvent.click(speakerItem); + + expect(mockHandleToggle).toHaveBeenCalledTimes(1); + expect(selectDeviceSpy).toHaveBeenCalledWith('audiooutput', usbHeadsetSpeakers.deviceId); + + await waitFor(() => { + expect(mediaDevices$.getState().audiooutput === usbHeadsetSpeakers.deviceId).toBeTruthy(); + }); + }); + + it('does not call selectDevice when audio output is not supported', () => { + vi.mocked(isSinkIdSupported).mockReturnValue(false); + + const selectDeviceSpy = vi.spyOn(mediaDevices$.actions, 'selectDevice'); + + render(); + + const defaultItem = screen.getByText('System Default'); + fireEvent.click(defaultItem); + + expect(mockHandleToggle).toHaveBeenCalledTimes(1); + expect(selectDeviceSpy).not.toHaveBeenCalled(); + }); + + it('shows selection state based on store', () => { + // Without selecting a device in the store, no device should be marked as selected + render(); + + // All menu items should be rendered but none marked as selected (no Mui-selected class) + const menuItems = screen.getAllByRole('menuitem'); + expect(menuItems).toHaveLength(3); + + // None should have the selected class since currentAudioOutputId is null + menuItems.forEach((item) => { + expect(item).not.toHaveClass('Mui-selected'); + }); + }); + + it('shows check icon for default device when only one device available', () => { + vi.mocked(isSinkIdSupported).mockReturnValue(false); + + render(); + + // When only default device is available (length === 1), it should be selected. + const checkIcon = screen.getByTestId('vivid-icon-check-line'); + expect(checkIcon).toBeInTheDocument(); + }); + + it('is not rendered when allowDeviceSelection is false', () => { + env.partialUpdate({ + MEETING_ROOM_ALLOW_DEVICE_SELECTION: false, + }); + + render(); + + expect(screen.queryByTestId('output-device-title')).not.toBeInTheDocument(); + expect(screen.queryByTestId('output-devices')).not.toBeInTheDocument(); + }); +}); + +function render(ui: ReactElement) { + const { wrapper, ...context } = makeTestProvider([]); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/OutputAudioDevices/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/OutputAudioDevices/index.tsx new file mode 100644 index 00000000..d224c178 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/OutputAudioDevices/index.tsx @@ -0,0 +1,3 @@ +import OutputDevices from './OutputAudioDevices'; + +export default OutputDevices; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantList/Index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantList/Index.tsx new file mode 100644 index 00000000..1cb98cd2 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantList/Index.tsx @@ -0,0 +1,3 @@ +import ParticipantList from './ParticipantList'; + +export default ParticipantList; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantList/ParticipantList.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantList/ParticipantList.spec.tsx new file mode 100644 index 00000000..b8726516 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantList/ParticipantList.spec.tsx @@ -0,0 +1,288 @@ +import { afterEach, beforeEach, describe, expect, it, Mock, vi } from 'vitest'; +import { + cleanup, + render as renderBase, + screen, + within, + fireEvent, + waitFor, +} from '@testing-library/react'; +import { ReactElement } from 'react'; +import { Subscriber as OTSubscriber } from '@vonage/client-sdk-video'; +import { useNavigate, useLocation } from 'react-router-dom'; +import { SubscriberWrapper } from '@app-types/session'; +import useRoomShareUrl from '@hooks/useRoomShareUrl'; +import { makeTestProvider, providers, ProviderOptions } from '@test/providers'; +import ParticipantList from './ParticipantList'; + +const mockedRoomName = { roomName: 'test-room-name' }; + +vi.mock('@hooks/useRoomShareUrl'); +vi.mock('react-router-dom', () => ({ + useNavigate: vi.fn(), + useLocation: vi.fn(), + useParams: () => mockedRoomName, +})); +const mockNavigate = vi.fn(); + +const createSubscriberWrapper = ( + name: string, + id: string, + isScreenshare: boolean = false +): SubscriberWrapper => { + const videoType = isScreenshare ? 'screen' : 'camera'; + return { + id, + element: document.createElement('video'), + isPinned: false, + isScreenshare, + subscriber: { + videoWidth: () => 1280, + videoHeight: () => 720, + subscribeToVideo: () => {}, + on: vi.fn(), + off: vi.fn(), + stream: { + streamId: id, + videoType, + name, + }, + } as unknown as OTSubscriber, + }; +}; + +const createTestSubscriberWrappers = () => { + return [ + createSubscriberWrapper('James Holden', 'sub1'), + // Screen share subscribers should be hidden in list + createSubscriberWrapper("James Holden's screen", 'sub1', true), + createSubscriberWrapper('Alex Kamal', 'sub2'), + createSubscriberWrapper('Chrisjen Avasarala', 'sub3'), + createSubscriberWrapper('Amos', 'sub4'), + createSubscriberWrapper('Naomi Nagata', 'sub5'), + createSubscriberWrapper('', 'sub6'), + ]; +}; + +describe('ParticipantList', () => { + let originalClipboard: Clipboard; + + beforeEach(() => { + originalClipboard = navigator.clipboard; + Object.assign(navigator, { + clipboard: { + writeText: vi.fn(), + }, + }); + }); + afterEach(() => { + Object.assign(navigator, { clipboard: originalClipboard }); + cleanup(); + }); + + it('does not render when closed', () => { + render( {}} />, { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.subscriberWrappers = createTestSubscriberWrappers(); + } + }, + }, + userContext: { + __interceptor: (context) => { + if (context) { + context.user.defaultSettings.name = 'Local Participant'; + } + }, + }, + }); + expect(screen.queryByText('Participants')).not.toBeInTheDocument(); + }); + + it('copies room share URL to clipboard', async () => { + (useRoomShareUrl as Mock).mockReturnValue('https://example.com/room123'); + + render( {}} />, { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.subscriberWrappers = createTestSubscriberWrappers(); + } + }, + }, + userContext: { + __interceptor: (context) => { + if (context) { + context.user.defaultSettings.name = 'Local Participant'; + } + }, + }, + }); + + const copyButton = screen.getByTestId('vivid-icon-copy-line'); + fireEvent.click(copyButton); + + await waitFor(() => { + expect(navigator.clipboard.writeText).toHaveBeenCalledWith('https://example.com/room123'); + expect(screen.getByTestId('vivid-icon-check-sent-line')).toBeInTheDocument(); + }); + }); + + it('should display remote participants in alphabetical order with local participant first', () => { + (useNavigate as Mock).mockReturnValue(mockNavigate); + (useLocation as Mock).mockReturnValue({ + state: mockedRoomName, + }); + render( {}} isOpen />, { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.subscriberWrappers = createTestSubscriberWrappers(); + } + }, + }, + userContext: { + __interceptor: (context) => { + if (context) { + context.user.defaultSettings.name = 'Local Participant'; + } + }, + }, + }); + + const namesInOrder = screen + .getAllByTestId('participant-list-item', { exact: false }) + .map((listItem) => { + return within(listItem).getByTestId('participant-list-name').textContent; + }); + expect(namesInOrder).toEqual([ + 'Local Participant (You)', + 'Alex Kamal', + 'Amos', + 'Chrisjen Avasarala', + 'James Holden', + 'Naomi Nagata', + '', // Edge case, empty names go at the bottom + ]); + }); + + it('filters list by query and hides You when not matching', () => { + render( {}} isOpen />, { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.subscriberWrappers = createTestSubscriberWrappers(); + } + }, + }, + userContext: { + __interceptor: (context) => { + if (context) { + context.user.defaultSettings.name = 'Local Participant'; + } + }, + }, + }); + + const input = screen.getByPlaceholderText('Search participants'); + fireEvent.change(input, { target: { value: 'alex' } }); + + const names = screen + .getAllByTestId('participant-list-item', { exact: false }) + .map((el) => within(el).getByTestId('participant-list-name').textContent); + + expect(names).toEqual(['Alex Kamal']); + expect(screen.queryByText('Local Participant (You)')).not.toBeInTheDocument(); + }); + + it('shows You when query matches local participant name (case-insensitive)', () => { + render( {}} isOpen />, { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.subscriberWrappers = createTestSubscriberWrappers(); + } + }, + }, + userContext: { + __interceptor: (context) => { + if (context) { + context.user.defaultSettings.name = 'Local Participant'; + } + }, + }, + }); + + const input = screen.getByPlaceholderText('Search participants'); + fireEvent.change(input, { target: { value: 'LOCAL' } }); + + const names = screen + .getAllByTestId('participant-list-item', { exact: false }) + .map((el) => within(el).getByTestId('participant-list-name').textContent); + + expect(names).toEqual(['Local Participant (You)']); + }); + + it('restores full list after clearing query', () => { + render( {}} isOpen />, { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.subscriberWrappers = createTestSubscriberWrappers(); + } + }, + }, + userContext: { + __interceptor: (context) => { + if (context) { + context.user.defaultSettings.name = 'Local Participant'; + } + }, + }, + }); + + const input = screen.getByPlaceholderText('Search participants'); + fireEvent.change(input, { target: { value: 'zzz' } }); + + expect(screen.queryAllByTestId('participant-list-item', { exact: false }).length).toBe(0); + + fireEvent.change(input, { target: { value: '' } }); + + const namesInOrder = screen + .getAllByTestId('participant-list-item', { exact: false }) + .map((listItem) => { + return within(listItem).getByTestId('participant-list-name').textContent; + }); + expect(namesInOrder).toEqual([ + 'Local Participant (You)', + 'Alex Kamal', + 'Amos', + 'Chrisjen Avasarala', + 'James Holden', + 'Naomi Nagata', + '', + ]); + }); +}); + +type RenderOptions = { + sessionContext?: ProviderOptions['SessionContext']; + userContext?: ProviderOptions['UserContext']; +}; + +function render(ui: ReactElement, { sessionContext, userContext }: RenderOptions = {}) { + const { wrapper, ...context } = makeTestProvider( + [providers.user, providers.session, providers.runtime], + { + sessionContext, + userContext, + runtimeContext: undefined, + } + ); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantList/ParticipantList.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantList/ParticipantList.tsx new file mode 100644 index 00000000..54ff7c9b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantList/ParticipantList.tsx @@ -0,0 +1,193 @@ +import { ReactElement, useMemo, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import useSessionContext from '@hooks/useSessionContext'; +import useUserContext from '@hooks/useUserContext'; +import useAudioLevels from '@hooks/useAudioLevels'; +import ParticipantListItem from '../ParticipantListItem'; +import getInitials from '@utils/getInitials'; +import getParticipantColor from '@utils/getParticipantColor'; +import useRoomShareUrl from '@hooks/useRoomShareUrl'; +import RightPanelTitle from '../RightPanel/RightPanelTitle'; +import usePublisherContext from '@hooks/usePublisherContext'; +import IconButton from '@mui/material/IconButton'; +import Tooltip from '@mui/material/Tooltip'; +import List from '@mui/material/List'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import VividIcon from '@ui/VividIcon'; +import TextField from '@mui/material/TextField'; +import InputAdornment from '@mui/material/InputAdornment'; + +import createNameMatcher from '@utils/participantList/createNameMatcher'; +import getFilteredSubscribers from '@utils/participantList/getFilteredSubscribers'; +import shouldShowUser from '@utils/participantList/shouldShowUser'; + +export type ParticipantListProps = { + handleClose: () => void; + isOpen: boolean; +}; + +/** + * ParticipantList Component + * + * This component shows a list of the participants that are currently in the meeting room. + * It also has a meeting URL link that can be copied to the clipboard. + * @param {ParticipantListProps} props - the props for the component. + * @property {Function} handleClose - a function that handles closing of the participant list. + * @property {boolean} isOpen - a variable that shows whether the participant list should be displayed. + * @returns {ReactElement} The participant list component. + */ +const ParticipantList = ({ handleClose, isOpen }: ParticipantListProps): ReactElement | false => { + const { t } = useTranslation(); + const { subscriberWrappers } = useSessionContext(); + const publisherAudio = useAudioLevels(); + const [isCopied, setIsCopied] = useState(false); + const [query, setQuery] = useState(''); + const { + user: { + defaultSettings: { name }, + }, + } = useUserContext(); + const roomShareUrl = useRoomShareUrl(); + const { isAudioEnabled } = usePublisherContext(); + + const { filteredSubscriberWrappers, isUserVisible, participantCount } = useMemo(() => { + const nameMatches = createNameMatcher(query); + const filteredSubscriberWrappersLocal = getFilteredSubscribers({ + subscriberWrappers, + nameMatches, + }); + const isUserVisibleLocal = shouldShowUser(nameMatches, name); + const participantCountLocal = + (isUserVisibleLocal ? 1 : 0) + filteredSubscriberWrappersLocal.length; + + return { + nameMatches, + filteredSubscriberWrappers: filteredSubscriberWrappersLocal, + isUserVisible: isUserVisibleLocal, + participantCount: participantCountLocal, + }; + }, [subscriberWrappers, query, name]); + + const copyUrl = () => { + void navigator.clipboard.writeText(roomShareUrl); + + setIsCopied(true); + + // reset the icon back after a brief timeout + setTimeout(() => { + setIsCopied(false); + }, 3000); + }; + return ( + isOpen && ( + <> + + +
        + {t('chat.meetingUrl')} + + {window.location.href} + +
        + + + {isCopied ? ( + + ) : ( + + )} + + +
        + + setQuery(e.target.value)} + slotProps={{ + input: { + startAdornment: ( + + + + ), + }, + }} + /> + + + {isUserVisible && ( + + )} + {filteredSubscriberWrappers.map((subscriberWrapper) => { + const { subscriber, id } = subscriberWrapper; + const hasAudio = !!subscriber.stream?.hasAudio; + const participantName: string = subscriber?.stream?.name ?? ''; + const participantStream = subscriber?.stream; + return ( + + ); + })} + + + ) + ); +}; + +export default ParticipantList; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListButton/ParticipantListButton.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListButton/ParticipantListButton.tsx new file mode 100644 index 00000000..4f6debc3 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListButton/ParticipantListButton.tsx @@ -0,0 +1,75 @@ +import { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import ToolbarButton from '../ToolbarButton'; +import Badge from '@mui/material/Badge'; +import Tooltip from '@mui/material/Tooltip'; +import VividIcon from '@ui/VividIcon'; +import { env } from '../../../env'; + +export type ParticipantListButtonProps = { + handleClick: () => void; + isOpen: boolean; + participantCount: number; + isOverflowButton?: boolean; +}; +/** + * ParticipantListButton Component + * + * Toolbar button to open and close participant list + * Also displays participant count badge + * @param {ParticipantListButtonProps} props - the props for this component + * @property {() => void} handleClick - click handler to toggle open participant list + * @property {boolean} isOpen - true if list is currently open, false if not + * @property {number} participantCount - number of current participants in call, to be displayed in badge + * @property {boolean} isOverflowButton - (optional) whether the button is in the ToolbarOverflowMenu + * @returns {ReactElement} - ParticipantListButton + */ +const ParticipantListButton = ({ + handleClick, + isOpen, + participantCount, + isOverflowButton = false, +}: ParticipantListButtonProps): ReactElement | false => { + const { t } = useTranslation(); + + return ( + env.SHOW_PARTICIPANT_LIST && ( + + + + } + isOverflowButton={isOverflowButton} + /> + + + ) + ); +}; + +export default ParticipantListButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListButton/ParticipantsListButton.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListButton/ParticipantsListButton.spec.tsx new file mode 100644 index 00000000..fc0e9f50 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListButton/ParticipantsListButton.spec.tsx @@ -0,0 +1,38 @@ +import { render as renderBase, screen } from '@testing-library/react'; +import { describe, expect, it, vi } from 'vitest'; +import { ReactElement } from 'react'; +import { makeTestProvider } from '@test/providers'; +import ParticipantListButton from './ParticipantListButton'; +import { env } from '../../../env'; + +describe('ParticipantListButton', () => { + it('should show participant number', () => { + render( {}} isOpen={false} participantCount={10} />); + expect(screen.getByText('10')).toBeVisible(); + }); + + it('should invoke callback on click', () => { + const handleClick = vi.fn(); + render(); + screen.getByRole('button').click(); + expect(handleClick).toHaveBeenCalled(); + }); + it('is not rendered when showParticipantList is false', () => { + env.partialUpdate({ + SHOW_PARTICIPANT_LIST: false, + }); + + render( {}} isOpen={false} participantCount={10} />); + + expect(screen.queryByTestId('participant-list-button')).not.toBeInTheDocument(); + }); +}); + +function render(ui: ReactElement) { + const { wrapper, ...context } = makeTestProvider([]); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListButton/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListButton/index.tsx new file mode 100644 index 00000000..edf31627 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListButton/index.tsx @@ -0,0 +1,3 @@ +import ParticipantListButton from './ParticipantListButton'; + +export default ParticipantListButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItem/ParticipantListItem.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItem/ParticipantListItem.spec.tsx new file mode 100644 index 00000000..2609a036 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItem/ParticipantListItem.spec.tsx @@ -0,0 +1,128 @@ +import { describe, expect, it, beforeEach, vi, Mock } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import { Stream } from '@vonage/client-sdk-video'; +import ParticipantListItem, { ParticipantListItemProps } from './ParticipantListItem'; +import useAudioLevels from '../../../hooks/useAudioLevels'; +import usePublisherContext from '../../../hooks/usePublisherContext'; +import { PublisherContextType } from '../../../Context/PublisherProvider'; + +vi.mock('../../../hooks/useAudioLevels'); +vi.mock('../../../hooks/usePublisherContext'); + +const mockUseAudioLevels = useAudioLevels as Mock<[], number | undefined>; +const mockUsePublisherContext = usePublisherContext as Mock<[], PublisherContextType>; + +describe('ParticipantListItem', () => { + const mockStream: Stream = { + connection: { connectionId: 'mock-connection-id', creationTime: Date.now(), data: 'mockData' }, + streamId: 'mock-stream-id', + creationTime: Date.now(), + hasAudio: true, + hasVideo: false, + name: 'John Doe', + videoDimensions: { width: 640, height: 480 }, + videoType: 'camera', + frameRate: 1, + initials: 'JD', + hasCaptions: false, + }; + const defaultProps: ParticipantListItemProps = { + audioLevel: 50, + avatarColor: 'rgb(0, 0, 255)', + initials: mockStream.initials, + hasAudio: true, + stream: mockStream, + name: 'John Doe', + dataTestId: 'participant-list-item', + }; + + it('renders the participant name', () => { + render(); + const nameElement = screen.getByTestId('participant-list-name'); + expect(nameElement).toHaveTextContent('John Doe'); + }); + + it('applies the correct avatar color', () => { + render(); + const avatarElement = screen.getByText('JD'); + expect(avatarElement).toHaveStyle(`background-color: ${defaultProps.avatarColor}`); + }); + + it('renders the initials in the Avatar', () => { + render(); + const avatarElement = screen.getByText('JD'); + expect(avatarElement).toBeInTheDocument(); + }); + + it('renders the ListItem with correct height and data-testid', () => { + render(); + const listItem = screen.getByTestId('participant-list-item'); + expect(listItem).toBeInTheDocument(); + expect(listItem).toHaveStyle({ height: '56px' }); + }); + + it('handles long participant names with noWrap styling', () => { + render( + + ); + const nameElement = screen.getByTestId('participant-list-name'); + expect(nameElement).toHaveTextContent('A very long participant name that should be truncated'); + expect(nameElement).toHaveStyle({ whiteSpace: 'nowrap' }); + }); + + it('uses the correct Avatar dimensions and font size', () => { + render(); + const avatarElement = screen.getByText('JD'); + expect(avatarElement).toHaveStyle({ + width: '32px', + height: '32px', + fontSize: '14px', + }); + }); + + describe('Publisher audio state handling', () => { + let publisherContext: PublisherContextType; + beforeEach(() => { + publisherContext = { + isAudioEnabled: true, + } as unknown as PublisherContextType; + mockUsePublisherContext.mockImplementation(() => publisherContext); + mockUseAudioLevels.mockReturnValue(50); + }); + + it('shows active audio state for publisher when microphone is enabled', () => { + mockUsePublisherContext.mockImplementation(() => ({ + ...publisherContext, + isAudioEnabled: true, + })); + mockUseAudioLevels.mockReturnValue(75); + + render(); + + const participantItem = screen.getByTestId('participant-list-item'); + expect(participantItem).toBeInTheDocument(); + + const audioIndicator = screen.getByTestId('audio-indicator'); + expect(audioIndicator).toBeInTheDocument(); + + const micIcon = screen.getByTestId('MicIcon'); + expect(micIcon).toBeInTheDocument(); + }); + + it('shows muted state when hasAudio is false', () => { + render(); + + const participantItem = screen.getByTestId('participant-list-item'); + expect(participantItem).toBeInTheDocument(); + + const audioIndicator = screen.getByTestId('audio-indicator'); + expect(audioIndicator).toBeInTheDocument(); + + const micOffIcon = screen.getByTestId('vivid-icon-mic-mute-solid'); + expect(micOffIcon).toBeInTheDocument(); + }); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItem/ParticipantListItem.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItem/ParticipantListItem.tsx new file mode 100644 index 00000000..be318759 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItem/ParticipantListItem.tsx @@ -0,0 +1,108 @@ +import { ReactElement } from 'react'; +import { Stream } from '@vonage/client-sdk-video'; +import AudioIndicator from '../AudioIndicator'; +import ParticipantListItemMenu from '../ParticipantListItemMenu'; +import { SubscriberWrapper } from '../../../types/session'; +import ListItem from '@mui/material/ListItem'; +import Avatar from '@mui/material/Avatar'; +import Typography from '@mui/material/Typography'; +import Badge from '@mui/material/Badge'; +import VividIcon from '@ui/VividIcon'; +import Box from '@mui/material/Box'; + +export type ParticipantListItemProps = { + stream?: Stream; + initials: string; + hasAudio?: boolean; + audioLevel?: number; + name: string; + dataTestId: string; + avatarColor: string; + subscriberWrapper?: SubscriberWrapper; +}; + +/** + * ParticipantListItem component + * List Item displaying a participant's Avatar, name, and audio enabled icon for the Participant List + * @param {ParticipantListItemProps} props - the props for this component + * @property {number} [audioLevel] - participants audio level + * @property {string} avatarColor - color for initials avatar + * @property {string} initials - participant initials + * @property {boolean} hasAudio - participant's audio enabled status + * @property {Stream} stream - participant's stream + * @property {string} name - participant name + * @property {string} dataTestId - ID for testing + * @returns {ReactElement} ParticipantListItem + */ +const ParticipantListItem = ({ + audioLevel, + avatarColor, + dataTestId, + hasAudio, + initials, + name, + stream, + subscriberWrapper, +}: ParticipantListItemProps): ReactElement => { + return ( + + + {subscriberWrapper && ( + + )} +
        + } + > + + } + > + + {initials} + + + + {name} + + + ); +}; + +export default ParticipantListItem; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItem/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItem/index.tsx new file mode 100644 index 00000000..b9af0037 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItem/index.tsx @@ -0,0 +1,3 @@ +import ParticipantListItem from './ParticipantListItem'; + +export default ParticipantListItem; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItemMenu/ParticipantListItemMenu.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItemMenu/ParticipantListItemMenu.spec.tsx new file mode 100644 index 00000000..1231f77f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItemMenu/ParticipantListItemMenu.spec.tsx @@ -0,0 +1,150 @@ +import { describe, expect, it, vi, afterEach } from 'vitest'; +import { act, cleanup, render as renderBase, screen } from '@testing-library/react'; +import { Subscriber } from '@vonage/client-sdk-video'; +import { SubscriberWrapper } from '../../../types/session'; +import ParticipantListItemMenu from '.'; +import { makeTestProvider, providers, type ProviderOptions } from '@test/providers'; +import { ReactElement } from 'react'; + +describe('ParticipantListItem', () => { + const mockSubscriberWrapper: SubscriberWrapper = { + id: 'subId', + isPinned: false, + isScreenshare: false, + subscriber: {} as Subscriber, + element: {} as HTMLVideoElement, + }; + const defaultProps = { + participantName: 'John Doe', + subscriberWrapper: mockSubscriberWrapper, + }; + + const mockPinSubscriber = vi.fn(); + + afterEach(() => { + cleanup(); + vi.clearAllMocks(); + }); + + it('closes menu after clicking menu item', () => { + render(, { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.isMaxPinned = false; + context.pinSubscriber = mockPinSubscriber; + } + }, + }, + }); + const menuButton = screen.getByRole('button'); + act(() => menuButton.click()); + expect(screen.getByTestId('pin-menu-item')).toBeVisible(); + const pinButton = screen.getByText('Pin John Doe'); + act(() => pinButton.click()); + expect(screen.queryByTestId('pin-menu-item')).not.toBeInTheDocument(); + }); + + it('can pin participant', () => { + render(, { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.isMaxPinned = false; + context.pinSubscriber = mockPinSubscriber; + } + }, + }, + }); + const menuButton = screen.getByRole('button'); + act(() => menuButton.click()); + const pinButton = screen.getByText('Pin John Doe'); + act(() => pinButton.click()); + expect(mockPinSubscriber).toHaveBeenCalledWith('subId'); + }); + + it('can unpin participant', () => { + render( + , + { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.isMaxPinned = false; + context.pinSubscriber = mockPinSubscriber; + } + }, + }, + } + ); + const menuButton = screen.getByRole('button'); + act(() => menuButton.click()); + const pinButton = screen.getByText('Unpin John Doe'); + act(() => pinButton.click()); + expect(mockPinSubscriber).toHaveBeenCalledWith('subId'); + }); + + it('cannot pin participant if maximum number of tiles are pinned', () => { + render(, { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.isMaxPinned = true; + context.pinSubscriber = mockPinSubscriber; + } + }, + }, + }); + const menuButton = screen.getByRole('button'); + act(() => menuButton.click()); + const pinButton = screen.getByText(/You can't pin any more tiles/); + act(() => pinButton.click()); + expect(mockPinSubscriber).not.toHaveBeenCalled(); + }); + + it('can still unpin participant if maximum number of tiles are pinned', () => { + render( + , + { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.isMaxPinned = true; + context.pinSubscriber = mockPinSubscriber; + } + }, + }, + } + ); + const menuButton = screen.getByRole('button'); + act(() => menuButton.click()); + const pinButton = screen.getByText('Unpin John Doe'); + act(() => pinButton.click()); + expect(mockPinSubscriber).toHaveBeenCalledWith('subId'); + }); +}); + +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; + sessionContext?: ProviderOptions['SessionContext']; +}; + +function render(ui: ReactElement, { userContext, sessionContext }: RenderOptions = {}) { + const { wrapper, ...context } = makeTestProvider( + [providers.user, providers.session, providers.runtime], + { + sessionContext, + userContext, + runtimeContext: undefined, + } + ); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItemMenu/ParticipantListItemMenu.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItemMenu/ParticipantListItemMenu.tsx new file mode 100644 index 00000000..f67e84af --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItemMenu/ParticipantListItemMenu.tsx @@ -0,0 +1,73 @@ +import { useState, MouseEvent } from 'react'; +import type { ReactElement } from 'react'; +import type { SubscriberWrapper } from '../../../types/session'; +import ParticipantPinMenuItem from './ParticipantPinMenuItem'; +import IconButton from '@mui/material/IconButton'; +import Popper from '@mui/material/Popper'; +import ClickAwayListener from '@mui/material/ClickAwayListener'; +import MenuList from '@mui/material/MenuList'; +import Paper from '@mui/material/Paper'; +import VividIcon from '@ui/VividIcon'; + +export type ParticipantListItemMenuProps = { + participantName: string; + subscriberWrapper: SubscriberWrapper; +}; +/** + * ParticipantListItemMenu + * renders a kebab menu button which opens a menu containing a + * button to pin the participant. + * @param {ParticipantListItemMenuProps} props - component props. + * @property {string} participantName - participant name. + * @property {SubscriberWrapper} subscriberWrapper - The SubscriberWrapper for the participant. + * @returns {ReactElement} - ParticipantListItemMenu + */ +const ParticipantListItemMenu = ({ + participantName, + subscriberWrapper, +}: ParticipantListItemMenuProps): ReactElement => { + const [anchorEl, setAnchorEl] = useState(null); + const isOpen = !!anchorEl; + const handleClick = (event: MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + const handleClose = () => { + setAnchorEl(null); + }; + + return ( + <> + + + + + + + + + + + + + + ); +}; + +export default ParticipantListItemMenu; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItemMenu/ParticipantPinMenuItem.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItemMenu/ParticipantPinMenuItem.tsx new file mode 100644 index 00000000..33e531c1 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItemMenu/ParticipantPinMenuItem.tsx @@ -0,0 +1,87 @@ +import type { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import type { SubscriberWrapper } from '../../../types/session'; +import useSessionContext from '../../../hooks/useSessionContext'; +import MenuItem from '@mui/material/MenuItem'; +import ListItemIcon from '@mui/material/ListItemIcon'; +import ListItemText from '@mui/material/ListItemText'; +import VividIcon from '@ui/VividIcon'; + +export type ParticipantPinMenuItemProps = { + handleClick: () => void; + participantName: string; + subscriberWrapper: SubscriberWrapper; +}; + +/** + * ParticipantPinMenuItem + * renders a MenuItem button to pin or unpin a participant + * @param {ParticipantPinMenuItemProps} props - component props. + * @property {Function} handleClick - click handler for item + * @property {string} participantName - participant name. + * @property {SubscriberWrapper} subscriberWrapper - The SubscriberWrapper for the participant. + * @returns {ReactElement} - ParticipantPinMenuItem + */ +const ParticipantPinMenuItem = ({ + handleClick, + participantName, + subscriberWrapper, +}: ParticipantPinMenuItemProps): ReactElement => { + const { t } = useTranslation(); + const { isPinned, id } = subscriberWrapper; + const { isMaxPinned, pinSubscriber } = useSessionContext(); + const isDisabled = !isPinned && isMaxPinned; + + const getText = () => { + if (isPinned) { + return t('participants.unpin', { participantName }); + } + if (isMaxPinned) { + return t('participants.maxPin'); + } + return t('participants.pin', { participantName }); + }; + const handlePinClick = () => { + if (!isDisabled) { + pinSubscriber(id); + } + handleClick(); + }; + return ( + + + {isPinned ? ( + + ) : ( + + )} + + + + {getText()} + + + ); +}; +export default ParticipantPinMenuItem; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItemMenu/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItemMenu/index.tsx new file mode 100644 index 00000000..6c9cc279 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ParticipantListItemMenu/index.tsx @@ -0,0 +1,3 @@ +import ParticipantListItemMenu from './ParticipantListItemMenu'; + +export default ParticipantListItemMenu; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PinButton/PinButton.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PinButton/PinButton.tsx new file mode 100644 index 00000000..49301dfd --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PinButton/PinButton.tsx @@ -0,0 +1,124 @@ +import { MouseEvent, ReactElement, useRef, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import classNames from 'classnames'; +import isMouseEventInsideBox from '../../../utils/isMouseEventInsideBox'; +import Tooltip from '@mui/material/Tooltip'; +import IconButton from '@mui/material/IconButton'; +import VividIcon from '@ui/VividIcon'; +import Box from '@mui/material/Box'; +import { ABSOLUTE_DISTANCE_THRESHOLD_REM_VALUE } from '@utils/constants'; +import toRemValue from '@common/helpers/toRemValue'; + +export type PinButtonProps = { + isMaxPinned: boolean; + isPinned: boolean; + isTileHovered: boolean; + participantName?: string; + handleClick: (clickEvent: MouseEvent) => void; +}; + +/** + * PinButton Component + * + * This component renders a button to pin and unpin a participants video, as well as displaying current pinned status. + * @param {PinButtonProps} pinButtonProps - component props + * @property {boolean} isMaxPinned - Indicates whether the maximum number of participants have already been pinned. + * @property {boolean} isPinned - Indicates whether this participant is pinned. + * @property {boolean} isTileHovered - Indicates whether the video tile is being hovered. + * @property {string | undefined} participantName - the name of the participant that can be muted. + * @property {Function} handleClick - click handler, used to toggle participant isPinned state. + * @returns {ReactElement | false} PinButton + */ +const PinButton = ({ + isMaxPinned, + isPinned, + isTileHovered, + participantName, + handleClick, +}: PinButtonProps): ReactElement | false => { + const { t } = useTranslation(); + const isDisabled = isMaxPinned && !isPinned; + const anchorRef = useRef(null); + const [isHoveringButton, setIsHoveringButton] = useState(false); + const iconStyle = { color: isDisabled ? 'var(--vera-disabled)' : 'var(--vera-accent)' }; + + const getTooltipText = () => { + if (isDisabled) { + return t('participants.maxPin'); + } + if (isPinned) { + return t('participants.unpin.video', { participantName }); + } + return t('participants.pin.video', { participantName }); + }; + + const onClick = (clickEvent: MouseEvent) => { + handleClick(clickEvent); + // We set hovering to false manually since onMouseLeave is not invoked when the DOM Element is moved. + setIsHoveringButton(false); + // In case the DOM Element didn't move, which can happen if pinning while viewing screenshare - + // we use setTimeout to let the new layout render, then check if the element is still under the click event location. + // If so we re-enable the hover state. + setTimeout(() => { + if (anchorRef.current) { + const divRect = anchorRef.current.getBoundingClientRect(); + if (isMouseEventInsideBox(clickEvent, divRect)) { + setIsHoveringButton(true); + } + } + }, 0); + }; + + const shouldShowIcon = isTileHovered || isPinned; + const pinButtonHorizontalOffsetRemValue = 0.3; + const pinButtonLeftOffsetRemValue = + ABSOLUTE_DISTANCE_THRESHOLD_REM_VALUE + pinButtonHorizontalOffsetRemValue; + + return ( + shouldShowIcon && ( + setIsHoveringButton(true)} + onPointerLeave={() => setIsHoveringButton(false)} + onBlur={() => setIsHoveringButton(false)} + > + + + {isTileHovered && isPinned ? ( + + ) : ( + + )} + + + + ) + ); +}; + +export default PinButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PinButton/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PinButton/index.tsx new file mode 100644 index 00000000..53448552 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PinButton/index.tsx @@ -0,0 +1,3 @@ +import PinButton from './PinButton'; + +export default PinButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PopupAlert/PopupAlert.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PopupAlert/PopupAlert.spec.tsx new file mode 100644 index 00000000..5c5438b3 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PopupAlert/PopupAlert.spec.tsx @@ -0,0 +1,45 @@ +import { afterEach, beforeEach, describe, expect, it, Mock, vi } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import useIsSmallViewport from '../../../hooks/useIsSmallViewport'; +import PopupAlert from './PopupAlert'; + +vi.mock('../../../hooks/useIsSmallViewport'); + +const mockUseIsSmallViewport = useIsSmallViewport as Mock<[], boolean>; + +describe('PopupAlert', () => { + beforeEach(() => { + mockUseIsSmallViewport.mockReturnValue(false); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + describe('rendering', () => { + it('renders the title and message', () => { + render(); + + expect(screen.getByText('Test Title')).toBeInTheDocument(); + expect(screen.getByText('Test message')).toBeInTheDocument(); + }); + + it.each(['warning', 'error', 'info'] as const)('renders with "%s" severity', (severity) => { + render(); + + expect(screen.getByRole('alert')).toBeInTheDocument(); + }); + + it('does not render a close button when closable is false', () => { + render(); + + expect(screen.queryByRole('button')).not.toBeInTheDocument(); + }); + + it('renders a close button when closable is true', () => { + render(); + + expect(screen.getByRole('button')).toBeInTheDocument(); + }); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PopupAlert/PopupAlert.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PopupAlert/PopupAlert.tsx new file mode 100644 index 00000000..14f7e8a9 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PopupAlert/PopupAlert.tsx @@ -0,0 +1,85 @@ +import Alert from '@mui/material/Alert'; +import AlertTitle from '@mui/material/AlertTitle'; +import type { SxProps } from '@mui/material'; +import { ReactElement, useState } from 'react'; +import useIsSmallViewport from '../../../hooks/useIsSmallViewport'; +import useOnMountEffect from '@web/hooks/useMountEffect'; + +export type PopupAlertProps = { + title: string; + message: string; + closable?: boolean; + severity: 'warning' | 'error' | 'info'; + timeout?: number; +}; + +/** + * PopupAlert Component + * An MUI Alert to display the title and message for connection issues. + * @param {PopupAlertProps} props - the props for this component + * @property {boolean} [closable] (optional) default false - whether alert should be closable + * @property {string} title - Alert title + * @property {string} message - Alert message body + * @property {'warning' | 'error' | 'info'} severity - MUI Severity, warning, error, or info. Determines color and icon of Alert + * @returns {ReactElement | false} PopupAlert Component + */ +const PopupAlert = ({ + closable = false, + title, + message, + severity, + timeout, +}: PopupAlertProps): ReactElement | false => { + const [closed, setClosed] = useState(false); + const isSmallViewport = useIsSmallViewport(); + + useOnMountEffect(() => { + if (timeout === undefined) return; + + const timer = setTimeout(() => { + setClosed(true); + }, timeout); + + return () => clearTimeout(timer); + }); + const sxProps: SxProps = isSmallViewport + ? { + left: '50%', + transform: 'translate(-50%, 0%)', + // We account for the SmallViewportHeader + top: '64px', + } + : { + left: '0.25rem', + top: '0.25rem', + }; + + return ( + !closed && ( + { + setClosed(true); + }, + } + : {})} + sx={{ + ...sxProps, + position: 'absolute', + width: '100%', + maxWidth: '320px', + }} + className="bg-vera-surface!" + > + {title} + {message} + + ) + ); +}; + +export default PopupAlert; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PopupAlert/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PopupAlert/index.tsx new file mode 100644 index 00000000..7b53a5b7 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PopupAlert/index.tsx @@ -0,0 +1,3 @@ +import PopupAlert from './PopupAlert'; + +export default PopupAlert; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PopupDialog/PopupDialog.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PopupDialog/PopupDialog.spec.tsx new file mode 100644 index 00000000..0e459d39 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PopupDialog/PopupDialog.spec.tsx @@ -0,0 +1,65 @@ +import { describe, expect, it, vi, afterEach } from 'vitest'; +import { fireEvent, render, screen } from '@testing-library/react'; +import PopupDialog, { DialogProps, DialogTexts } from './PopupDialog'; + +describe('PopupDialog', () => { + const mockHandleClose = vi.fn(); + const mockHandleActionClick = vi.fn(); + + const mockDialogText: DialogTexts = { + title: 'Confirmation', + contents: 'Are you sure you want to proceed?', + primaryActionText: 'Confirm', + secondaryActionText: 'Cancel', + }; + + const defaultProps: DialogProps = { + isOpen: true, + handleClose: mockHandleClose, + handleActionClick: mockHandleActionClick, + actionText: mockDialogText, + }; + + afterEach(() => { + vi.clearAllMocks(); + }); + + it('renders the dialog with the correct text', () => { + render(); + expect(screen.getByText('Confirmation')).toBeInTheDocument(); + expect(screen.getByText('Are you sure you want to proceed?')).toBeInTheDocument(); + expect(screen.getByText('Confirm')).toBeInTheDocument(); + expect(screen.getByText('Cancel')).toBeInTheDocument(); + }); + + it('does not render the dialog if it has not been opened', () => { + render(); + + expect(screen.queryByText('Confirmation')).not.toBeInTheDocument(); + }); + + it('auto-focuses the Confirm button', () => { + render(); + + const confirmButton = screen.getByText('Confirm'); + expect(confirmButton).toHaveFocus(); + }); + + it('closes the component when the Cancel button is clicked', () => { + render(); + + const cancelButton = screen.getByText('Cancel'); + fireEvent.click(cancelButton); + + expect(mockHandleClose).toHaveBeenCalledTimes(1); + }); + + it('executes the primary action when the Confirm button is clicked', () => { + render(); + + const confirmButton = screen.getByText('Confirm'); + fireEvent.click(confirmButton); + + expect(mockHandleActionClick).toHaveBeenCalledTimes(1); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PopupDialog/PopupDialog.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PopupDialog/PopupDialog.tsx new file mode 100644 index 00000000..a80456cb --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PopupDialog/PopupDialog.tsx @@ -0,0 +1,62 @@ +import Dialog from '@mui/material/Dialog'; +import DialogActions from '@mui/material/DialogActions'; +import DialogContent from '@mui/material/DialogContent'; +import DialogContentText from '@mui/material/DialogContentText'; +import DialogTitle from '@mui/material/DialogTitle'; +import Button from '@mui/material/Button'; +import { ReactElement } from 'react'; + +export type DialogTexts = { + title?: string; + contents: string; + primaryActionText: string; + secondaryActionText: string; +}; + +export type DialogProps = { + isOpen: boolean; + handleClose: () => void; + handleActionClick: () => void; + actionText: DialogTexts; +}; + +/** + * PopupDialog Component + * + * Reusable pop-up dialog component that opens when a certain action is performed such as starting/stopping an archive, + * or muting a participant. + * @param {DialogProps} props - The props for the component. + * @property {boolean} isOpen - Whether the pop-up dialog component is opened. + * @property {() => void} handleClose - Function to close the pop-up dialog component. + * @property {() => void} handleActionClick - Function that handles the action when the primary action button is clicked. + * @property {DialogTexts} actionText - The text that gets displayed in the pop-up component. + * @returns {ReactElement} - The PopupDialog component. + */ +const PopupDialog = ({ + isOpen, + handleClose, + handleActionClick, + actionText, +}: DialogProps): ReactElement => { + return ( + + {actionText.title} + + {actionText.contents} + + + + + + + ); +}; + +export default PopupDialog; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PopupDialog/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PopupDialog/index.tsx new file mode 100644 index 00000000..128cbf19 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/PopupDialog/index.tsx @@ -0,0 +1,4 @@ +import PopupDialog, { DialogTexts } from './PopupDialog'; + +export default PopupDialog; +export type { DialogTexts }; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RecordingIndicator/RecordingIndicator.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RecordingIndicator/RecordingIndicator.spec.tsx new file mode 100644 index 00000000..d42411a0 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RecordingIndicator/RecordingIndicator.spec.tsx @@ -0,0 +1,32 @@ +import { render as renderBase, screen } from '@testing-library/react'; +import type { ReactElement } from 'react'; +import { describe, expect, it } from 'vitest'; +import { makeTestProvider } from '@test/providers'; +import RecordingIndicator from './RecordingIndicator'; + +describe('RecordingIndicator', () => { + it('renders the root indicator, pulse, and dot', () => { + render(); + + expect(screen.getByTestId('recordingIndicator')).toBeInTheDocument(); + expect(screen.getByTestId('recordingIndicatorPulse')).toBeInTheDocument(); + expect(screen.getByTestId('recordingIndicatorDot')).toBeInTheDocument(); + }); + + it('uses the compact size when requested', () => { + render(); + + expect(screen.getByTestId('recordingIndicator')).toHaveClass('h-4', 'w-4'); + + expect(screen.getByTestId('recordingIndicatorDot')).toHaveClass('inset-1'); + }); +}); + +function render(ui: ReactElement) { + const { wrapper, ...context } = makeTestProvider([]); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RecordingIndicator/RecordingIndicator.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RecordingIndicator/RecordingIndicator.tsx new file mode 100644 index 00000000..1d7aedf9 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RecordingIndicator/RecordingIndicator.tsx @@ -0,0 +1,43 @@ +import Box from '@mui/material/Box'; +import classNames from 'classnames'; +import type { ReactElement } from 'react'; + +export type RecordingIndicatorProps = { + isCompact?: boolean; +}; + +const RecordingIndicator = ({ isCompact = false }: RecordingIndicatorProps): ReactElement => { + return ( + + + + + ); +}; + +export default RecordingIndicator; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RecordingIndicator/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RecordingIndicator/index.tsx new file mode 100644 index 00000000..302c60a5 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RecordingIndicator/index.tsx @@ -0,0 +1,3 @@ +import RecordingIndicator from './RecordingIndicator'; + +export default RecordingIndicator; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RecordingPopupIndicator/RecordingPopupIndicator.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RecordingPopupIndicator/RecordingPopupIndicator.spec.tsx new file mode 100644 index 00000000..30d313c4 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RecordingPopupIndicator/RecordingPopupIndicator.spec.tsx @@ -0,0 +1,125 @@ +import { ReactElement } from 'react'; +import { describe, expect, it, vi } from 'vitest'; +import { fireEvent, render as renderBase, screen, waitFor } from '@testing-library/react'; +import RecordingPopUpIndicator from './RecordingPopupIndicator'; +import { makeTestProvider, providers } from '@test/providers'; +import { setupWindowNavigatorMock } from '@web-test/fixtures'; +import jwt from 'jsonwebtoken'; + +const mockNavigate = vi.fn(); + +vi.mock('react-router-dom', async () => { + const mod = await vi.importActual('react-router-dom'); + return { + ...mod, + useNavigate: () => mockNavigate, + }; +}); + +const translationsByKey: Record = { + 'recording.consent.dialog.title': 'This meeting is being recorded', + 'recording.consent.dialog.content': + 'The host has started recording this meeting. Do you consent to being recorded?', + 'recording.consent.dialog.accept': 'I consent', + 'recording.consent.dialog.decline': 'I do not consent', + 'recording.consent.goodbye.header': 'Recording declined', + 'recording.consent.goodbye.message': + 'You chose not to consent to recording. Please rejoin when recording is stopped or ask the host to disable recording.', +}; + +vi.mock('react-i18next', () => { + return { + useTranslation: () => ({ + t: (key: string) => translationsByKey[key] ?? key, + }), + }; +}); + +const sessionId = '1_MX4xMjM0NTY3OH4-VGh1IEZlYiAyNyAwODozMjozNCBQU1QgMjAyMH4wLjI0NDYxMjE'; +const sessionKey = jwt.sign({ sessionId, roomName: 'test-room-name' }, 'test', { + algorithm: 'HS256', +}); + +describe('RecordingPopUpIndicator', () => { + beforeEach(() => { + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + enumerateDevices: Promise.resolve([]), + }, + permissions: { + query: Promise.resolve({ state: 'granted' } as PermissionStatus), + }, + }); + }); + + it('renders the consent dialog with translated text', () => { + render(); + + expect(screen.getByText(translationsByKey['recording.consent.dialog.title'])).toBeVisible(); + expect(screen.getByText(translationsByKey['recording.consent.dialog.content'])).toBeVisible(); + expect(screen.getByText(translationsByKey['recording.consent.dialog.accept'])).toBeVisible(); + expect(screen.getByText(translationsByKey['recording.consent.dialog.decline'])).toBeVisible(); + }); + + it('redirects to /goodbye when the user declines consent', () => { + render(); + + fireEvent.click(screen.getByText(translationsByKey['recording.consent.dialog.decline'])); + + expect(mockNavigate).toHaveBeenCalledWith( + `/goodbye/${sessionKey}`, + expect.objectContaining({ + state: { + header: translationsByKey['recording.consent.goodbye.header'], + caption: translationsByKey['recording.consent.goodbye.message'], + isSelfDeclinedRecording: true, + }, + }) + ); + }); + + it('closes the dialog without redirect when the user consents', async () => { + render(); + + fireEvent.click(screen.getByTestId('popup-dialog-primary-button')); + + await waitFor(() => { + expect( + screen.queryByText(translationsByKey['recording.consent.dialog.title']) + ).not.toBeInTheDocument(); + }); + + expect(mockNavigate).not.toHaveBeenCalled(); + }); +}); + +function render(component: ReactElement) { + const { wrapper, ...context } = makeTestProvider( + [ + providers.user, + providers.session, + providers.publisher, + providers.backgroundPublisher, + providers.runtime, + ], + { + sessionContext: { + initialValue: { + sessionKey, + }, + }, + userContext: undefined, + publisherContext: undefined, + backgroundPublisherContext: undefined, + runtimeContext: undefined, + } + ); + + return { + ...context, + ...renderBase(component, { + wrapper, + }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RecordingPopupIndicator/RecordingPopupIndicator.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RecordingPopupIndicator/RecordingPopupIndicator.tsx new file mode 100644 index 00000000..72e0b83c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RecordingPopupIndicator/RecordingPopupIndicator.tsx @@ -0,0 +1,70 @@ +import { ReactElement, useMemo, useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { useTranslation } from 'react-i18next'; +import PopupDialog, { type DialogTexts } from '../PopupDialog'; +import useSessionContext from '@hooks/useSessionContext'; + +type RecordingPopUpIndicatorProps = { + shouldPromptRecordingConsent?: boolean; + onNotified?: () => void; +}; + +/** + * RecordingPopUpIndicator component displays a popup dialog to prompt the user for recording consent. + * @param {RecordingPopUpIndicatorProps} props - The props for the component. + * @property {boolean} shouldPromptRecordingConsent - Flag indicating whether to prompt for recording consent. + * @returns ReactElement representing the recording consent popup dialog. + */ +const RecordingPopUpIndicator = ({ + shouldPromptRecordingConsent = false, + onNotified, +}: RecordingPopUpIndicatorProps): ReactElement => { + const { setRecordingAlreadyNotified, sessionKey } = useSessionContext(); + const { t } = useTranslation(); + const navigate = useNavigate(); + + const [hasBeenNotified, setHasBeenNotified] = useState(false); + + const actionText = useMemo(() => { + return { + title: t('recording.consent.dialog.title'), + contents: t('recording.consent.dialog.content'), + primaryActionText: t('recording.consent.dialog.accept'), + secondaryActionText: t('recording.consent.dialog.decline'), + }; + }, [t]); + + const redirectToGoodbye = () => { + navigate(`/goodbye/${sessionKey}`, { + state: { + header: t('recording.consent.goodbye.header'), + caption: t('recording.consent.goodbye.message'), + isSelfDeclinedRecording: true, + }, + }); + }; + + const handleDecline = () => { + setHasBeenNotified(true); + redirectToGoodbye(); + }; + + const handleActionClick = () => { + setHasBeenNotified(true); + setRecordingAlreadyNotified(true); + onNotified?.(); + }; + + const shouldOpenDialog = shouldPromptRecordingConsent && hasBeenNotified === false; + + return ( + + ); +}; + +export default RecordingPopUpIndicator; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RecordingPopupIndicator/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RecordingPopupIndicator/index.tsx new file mode 100644 index 00000000..6b88e9c4 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RecordingPopupIndicator/index.tsx @@ -0,0 +1,3 @@ +import RecordingPopUpIndicator from './RecordingPopupIndicator'; + +export default RecordingPopUpIndicator; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReduceNoiseTestSpeakers/ReduceNoiseTestSpeakers.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReduceNoiseTestSpeakers/ReduceNoiseTestSpeakers.spec.tsx new file mode 100644 index 00000000..27ca1669 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReduceNoiseTestSpeakers/ReduceNoiseTestSpeakers.spec.tsx @@ -0,0 +1,156 @@ +import { describe, expect, it, vi, afterEach, Mock, beforeEach } from 'vitest'; +import { fireEvent, render as renderBase, screen, waitFor } from '@testing-library/react'; +import { EventEmitter } from 'stream'; +import { Publisher } from '@vonage/client-sdk-video'; +import type { ReactElement } from 'react'; +import { defaultAudioDevice } from '@utils/mockData/device'; +import usePublisherContext from '@hooks/usePublisherContext'; +import { PublisherContextType } from '@Context/PublisherProvider'; +import { makeTestProvider } from '@test/providers'; +import { makeMediaDeviceInfos } from '@web-test/fixtures'; +import { mediaDevices$ } from '@core/stores'; +import ReduceNoiseTestSpeakers from './ReduceNoiseTestSpeakers'; +import { env } from '../../../env'; + +vi.mock('@hooks/usePublisherContext'); + +const mockUsePublisherContext = usePublisherContext as Mock<[], PublisherContextType>; + +const { mockHasMediaProcessorSupport } = vi.hoisted(() => { + return { mockHasMediaProcessorSupport: vi.fn().mockReturnValue(true) }; +}); +vi.mock('@vonage/client-sdk-video', () => ({ + hasMediaProcessorSupport: mockHasMediaProcessorSupport, +})); + +describe('ReduceNoiseTestSpeakers', () => { + let mockPublisher: Publisher; + let publisherContext: PublisherContextType; + + beforeEach(() => { + mediaDevices$.reset(); + + // Mock HTMLMediaElement methods used by SoundTest component + vi.spyOn(HTMLMediaElement.prototype, 'pause').mockImplementation(() => {}); + vi.spyOn(HTMLMediaElement.prototype, 'play').mockResolvedValue(undefined); + vi.spyOn(HTMLMediaElement.prototype, 'load').mockImplementation(() => {}); + + mockPublisher = Object.assign(new EventEmitter(), { + applyVideoFilter: vi.fn(), + clearVideoFilter: vi.fn(), + applyAudioFilter: vi.fn(), + clearAudioFilter: vi.fn(), + getAudioSource: () => defaultAudioDevice, + getAudioFilter: () => null, + videoWidth: () => 1280, + videoHeight: () => 720, + }) as unknown as Publisher; + publisherContext = { + publisher: mockPublisher, + isPublishing: true, + publish: vi.fn() as () => Promise, + initializeLocalPublisher: vi.fn(() => { + publisherContext.publisher = mockPublisher; + }) as unknown as () => void, + } as unknown as PublisherContextType; + + mockUsePublisherContext.mockImplementation(() => publisherContext); + }); + + afterEach(() => { + vi.resetAllMocks(); + }); + + it('renders the component with the correct elements', () => { + mockHasMediaProcessorSupport.mockReturnValue(true); + + render(); + + expect(screen.getByText('Advanced Noise Suppression')).toBeInTheDocument(); + expect(screen.getByLabelText('Advanced Noise Suppression')).not.toBeChecked(); + }); + + it('does not render the component if media processor is not supported', () => { + mockHasMediaProcessorSupport.mockReturnValue(false); + + render(); + + expect(screen.queryByText('Advanced Noise Suppression')).not.toBeInTheDocument(); + }); + + it('toggles the noise suppression state when clicked', async () => { + mockHasMediaProcessorSupport.mockReturnValue(true); + + render(); + + const toggleButton = screen.getByLabelText('Advanced Noise Suppression'); + fireEvent.click(toggleButton); + + await waitFor(() => expect(mockPublisher.applyAudioFilter).toHaveBeenCalledTimes(1)); + expect(mockPublisher.applyAudioFilter).toHaveBeenCalledWith({ + type: 'advancedNoiseSuppression', + }); + expect(toggleButton).toBeChecked(); + + fireEvent.click(toggleButton); + await waitFor(() => expect(mockPublisher.clearAudioFilter).toHaveBeenCalledTimes(1)); + expect(toggleButton).not.toBeChecked(); + }); + + it('should update the UI when toggling the button', async () => { + mockHasMediaProcessorSupport.mockReturnValue(true); + + render(); + + const toggleButton = screen.getByLabelText('Advanced Noise Suppression'); + + expect(toggleButton).not.toBeChecked(); + + fireEvent.click(toggleButton); + await waitFor(() => { + expect(toggleButton).toBeChecked(); + }); + + fireEvent.click(toggleButton); + await waitFor(() => { + expect(toggleButton).not.toBeChecked(); + }); + }); + + it('does not render the Advanced Noise Suppression option if allowAdvancedNoiseSuppression is false', () => { + env.partialUpdate({ + ALLOW_ADVANCED_NOISE_SUPPRESSION: false, + }); + + render(); + + expect(screen.queryByText('Advanced Noise Suppression')).not.toBeInTheDocument(); + }); + + it('does not render the SoundTest if no audiooutput devices are available', () => { + mediaDevices$.reset(); + + render(); + + expect(screen.queryByTestId('soundTest')).not.toBeInTheDocument(); + }); + + it('renders the SoundTest if audiooutput devices are available', () => { + const devices = makeMediaDeviceInfos(); + + mediaDevices$.setState((state) => ({ ...state, mediaDeviceInfo: devices })); + + render(); + + expect(screen.getByTestId('soundTest')).toBeInTheDocument(); + }); +}); + +function render(ui: ReactElement) { + const { wrapper, ...context } = makeTestProvider([]); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReduceNoiseTestSpeakers/ReduceNoiseTestSpeakers.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReduceNoiseTestSpeakers/ReduceNoiseTestSpeakers.tsx new file mode 100644 index 00000000..bcfc6754 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReduceNoiseTestSpeakers/ReduceNoiseTestSpeakers.tsx @@ -0,0 +1,104 @@ +import { useState, useEffect, type ReactElement } from 'react'; +import { hasMediaProcessorSupport } from '@vonage/client-sdk-video'; +import { useTranslation } from 'react-i18next'; +import usePublisherContext from '@hooks/usePublisherContext'; +import { setStorageItem, STORAGE_KEYS } from '@utils/storage'; +import { mediaDevices$ } from '@core/stores'; +import SwitchField from '@ui/SwitchField'; +import DropdownSeparator from '../DropdownSeparator'; +import SoundTest from '../../SoundTest'; +import MenuList from '@mui/material/MenuList'; +import MenuItem from '@mui/material/MenuItem'; +import VividIcon from '@ui/VividIcon'; +import Box from '@mui/material/Box'; +import { env } from '../../../env'; + +/** + * ReduceNoiseTestSpeakers Component + * + * This component displays options to enable advanced noise suppression + * and to test the speakers. + * @returns {ReactElement | false} Returns ReduceNoiseTestSpeakers component or false if the Vonage Media Processor is not supported. + */ +const ReduceNoiseTestSpeakers = (): ReactElement | false => { + const { t } = useTranslation(); + const { publisher, isPublishing } = usePublisherContext(); + + const [isToggled, setIsToggled] = useState(false); + const shouldDisplayANS = hasMediaProcessorSupport('both') && env.ALLOW_ADVANCED_NOISE_SUPPRESSION; + const hasSpeakerDevices = mediaDevices$.useMediaDevices( + 'audiooutput', + (devices) => Object.values(devices).length > 0 + ); + + const handleNoiseSuppressionChange = async (checked: boolean) => { + setIsToggled(checked); + setStorageItem(STORAGE_KEYS.NOISE_SUPPRESSION, JSON.stringify(checked)); + + if (checked) { + await publisher?.applyAudioFilter({ type: 'advancedNoiseSuppression' }); + return; + } + + await publisher?.clearAudioFilter(); + }; + + useEffect(() => { + if (isPublishing) { + const audioFilter = publisher?.getAudioFilter(); + + // eslint-disable-next-line react-hooks/set-state-in-effect + setIsToggled(audioFilter !== null); + } + }, [isPublishing, publisher]); + + return ( + <> + + + {shouldDisplayANS && ( + +
        + + + +
        + +
        +
        +
        + )} + {hasSpeakerDevices && ( + + + + + + )} +
        + + ); +}; + +export default ReduceNoiseTestSpeakers; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReduceNoiseTestSpeakers/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReduceNoiseTestSpeakers/index.tsx new file mode 100644 index 00000000..ab38b793 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReduceNoiseTestSpeakers/index.tsx @@ -0,0 +1,3 @@ +import ReduceNoiseTestSpeakers from './ReduceNoiseTestSpeakers'; + +export default ReduceNoiseTestSpeakers; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/FeedbackForm.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/FeedbackForm.spec.tsx new file mode 100644 index 00000000..5f75fecf --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/FeedbackForm.spec.tsx @@ -0,0 +1,260 @@ +import { render, screen } from '@testing-library/react'; +import { describe, expect, it, vi } from 'vitest'; +import FeedbackForm from './FeedbackForm'; +import { + REPORT_NAME_LIMIT, + REPORT_DESCRIPTION_LIMIT, + REPORT_TITLE_LIMIT, +} from '../../../../utils/constants'; + +describe('FeedbackForm', () => { + const mockHandleSubmit = vi.fn(); + const mockHandleChange = vi.fn(); + const mockFileSelect = vi.fn(); + const formData = { + title: '', + name: '', + issue: '', + }; + const errors = { + title: false, + name: false, + issue: false, + }; + + const defaultProps = { + handleSubmit: mockHandleSubmit, + formData, + errors, + handleChange: mockHandleChange, + loading: false, + onFileSelect: mockFileSelect, + }; + + it('renders form fields correctly', () => { + render(); + + // Check if the title input is rendered + expect(screen.queryByTestId('title-report-issue')).toBeInTheDocument(); + + // Check if the name input is rendered + expect(screen.queryByTestId('name-report-issue')).toBeInTheDocument(); + + // Check if the issue textarea is rendered + expect(screen.queryByTestId('description-report-issue')).toBeInTheDocument(); + + // Check if the button is rendered + expect(screen.getByRole('button', { name: /send/i })).toBeInTheDocument(); + }); + + it('shows required error messages when form inputs are empty', () => { + const errorMessages = { + title: true, + name: true, + issue: true, + }; + + const emptyFormProps = { + ...defaultProps, + errors: errorMessages, + }; + + render(); + + // Check if error messages are shown + expect( + screen.getByText(`Title is required and must be less than ${REPORT_TITLE_LIMIT} characters`) + ).toBeInTheDocument(); + expect( + screen.getByText( + `Your name is required and must be less than ${REPORT_NAME_LIMIT} characters` + ) + ).toBeInTheDocument(); + expect( + screen.getByText( + `Description is required and must be less than ${REPORT_DESCRIPTION_LIMIT} characters` + ) + ).toBeInTheDocument(); + }); + + it('displays a loading spinner when loading is true', () => { + const spinnerProps = { + ...defaultProps, + loading: true, + }; + render(); + + expect(screen.getByRole('progressbar')).toBeInTheDocument(); + }); + + it('displays helper text for character limit when exceeding limit for the form title', () => { + const charLimitProps = { + ...defaultProps, + formData: { + title: 'a'.repeat(REPORT_TITLE_LIMIT - 1), + name: '', + issue: '', + }, + errors: { + title: false, + name: false, + issue: false, + }, + }; + const { rerender } = render(); + const errorSpan = screen.getByTestId('title-error'); + // Tests that one-less than the max does not cause an error + expect(errorSpan).toBeEmptyDOMElement(); + rerender( + + ); + // Test that the max does cause an error + expect(errorSpan).toBeInTheDocument(); + expect(errorSpan).toHaveTextContent( + `Title is required and must be less than ${REPORT_TITLE_LIMIT} characters` + ); + rerender( + + ); + // Tests that changing the string to less than the max makes the previous error message go away + expect(errorSpan).toBeEmptyDOMElement(); + }); + + it('displays helper text for character limit when exceeding limit for the form name', () => { + const charLimitProps = { + ...defaultProps, + formData: { + title: '', + name: 'a'.repeat(REPORT_NAME_LIMIT - 1), + issue: '', + }, + errors: { + title: false, + name: false, + issue: false, + }, + }; + const { rerender } = render(); + const errorSpan = screen.getByTestId('name-error'); + // Tests that one-less than the max does not cause an error + expect(errorSpan).toBeEmptyDOMElement(); + rerender( + + ); + // Test that the max does cause an error + expect(errorSpan).toBeInTheDocument(); + expect(errorSpan).toHaveTextContent( + `Your name is required and must be less than ${REPORT_NAME_LIMIT} characters` + ); + rerender( + + ); + // Tests that changing the string to less than the max makes the previous error message go away + expect(errorSpan).toBeEmptyDOMElement(); + }); + + it('displays helper text for character limit when exceeding limit for the form description', () => { + const charLimitProps = { + ...defaultProps, + formData: { + title: '', + name: '', + issue: 'a'.repeat(REPORT_DESCRIPTION_LIMIT - 1), + }, + errors: { + title: false, + name: false, + issue: false, + }, + }; + const { rerender } = render(); + const errorSpan = screen.getByTestId('description-error'); + // Tests that one-less than the max does not cause an error + expect(errorSpan).toBeEmptyDOMElement(); + rerender( + + ); + // Test that the max does cause an error + expect(errorSpan).toBeInTheDocument(); + expect(errorSpan).toHaveTextContent( + `Description is required and must be less than ${REPORT_DESCRIPTION_LIMIT} characters` + ); + rerender( + + ); + // Tests that changing the string to less than the max makes the previous error message go away + expect(errorSpan).toBeEmptyDOMElement(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/FeedbackForm.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/FeedbackForm.tsx new file mode 100644 index 00000000..5357692c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/FeedbackForm.tsx @@ -0,0 +1,238 @@ +import { FormEvent, ChangeEvent, ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import FilePicker from './FilePicker'; +import { + REPORT_TITLE_LIMIT, + REPORT_DESCRIPTION_LIMIT, + REPORT_NAME_LIMIT, +} from '../../../../utils/constants'; +import HelperText from './HelperText'; +import useIsSmallViewport from '../../../../hooks/useIsSmallViewport'; +import Box from '@mui/material/Box'; +import TextField from '@mui/material/TextField'; +import Typography from '@mui/material/Typography'; +import Button from '@mui/material/Button'; +import CircularProgress from '@mui/material/CircularProgress'; + +export type FormType = { + title: string; + name: string; + issue: string; +}; + +export type ErrorFormType = { + title: boolean; + name: boolean; + issue: boolean; +}; + +export type FeedbackFormType = { + handleSubmit: (event: FormEvent) => Promise; + formData: FormType; + errors: ErrorFormType; + handleChange: (event: ChangeEvent) => void; + loading: boolean; + onFileSelect: (fileData: string) => void; +}; + +const getStyleTypography = () => { + return { + marginBottom: '4px', + textAlign: 'left', + }; +}; + +/** + * FeedbackForm Component + * + * This component contains a form that allows the user to add a title, their name, a short description of the issue + * as well as attach a screenshot for the issue they have encountered while using the application. + * @param {FeedbackFormType} props - the props for the component. + * @property {(event: FormEvent) => Promise} handleSubmit - the function that handles form submission. + * @property {FormType} formData - the field containing the values from the form. + * @property {ErrorFormType} errors - the field containing the errors while user puts in the values in the form. + * @property {(event: ChangeEvent) => void} handleChange - the function that handles validating users' input. + * @property {boolean} loading - indicates whether the form is currently loading. + * @property {(fileData: string) => void} onFileSelect - the function that handles storing the file value. + * @returns {ReactElement} The feedback form component. + */ +const FeedbackForm = ({ + handleSubmit, + formData, + errors, + handleChange, + loading, + onFileSelect, +}: FeedbackFormType): ReactElement => { + const { t } = useTranslation(); + const isSmallViewport = useIsSmallViewport(); + // 224px = 64px panel header + 96px toolbar if normal viewport + (40px submit button + 24px submit button margin) + // 208px = 64px panel header + 80px toolbar if small viewport + (40px submit button + 24px submit button margin) + const height = isSmallViewport ? 'calc(100dvh - 208px)' : 'calc(100dvh - 224px)'; + // For small viewports: width = 100dvw - 50px of margin + // For desktop viewports: 310px = 350px RightPanel - 50px margin + const width = isSmallViewport ? 'calc(100dvw - 50px)' : '300px'; + + const getColorStyle = (value: string, maxLength: number) => { + return value.length >= maxLength || value.length === 0 ? 'var(--vera-error)' : 'inherit'; + }; + + return loading ? ( + + + + ) : ( +
        + + + {t('feedbackForm.field.title.label')} + + + } + sx={{ + mb: '22px', + }} + slotProps={{ htmlInput: { maxLength: REPORT_TITLE_LIMIT } }} + /> + + {t('feedbackForm.field.name.label')} + + + } + sx={{ + mr: 4, + mb: 2, + }} + slotProps={{ htmlInput: { maxLength: REPORT_NAME_LIMIT } }} + /> + + + {t('feedbackForm.field.issue.label')} + + + + } + sx={{ + mr: 4, + mb: 1, + }} + slotProps={{ htmlInput: { maxLength: REPORT_DESCRIPTION_LIMIT } }} + /> + + + {t('feedbackForm.disclaiamer.label')} + + + {t('feedbackForm.disclaiamer.screenshot')} + + + + + +
        + ); +}; + +export default FeedbackForm; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/FilePicker/FilePicker.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/FilePicker/FilePicker.spec.tsx new file mode 100644 index 00000000..d17503d3 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/FilePicker/FilePicker.spec.tsx @@ -0,0 +1,127 @@ +import { render, screen, fireEvent } from '@testing-library/react'; +import { describe, expect, it, vi } from 'vitest'; +import FilePicker from './FilePicker'; +import { isMobile } from '@web/platform'; +import '@testing-library/jest-dom'; +import { setupWindowNavigatorMock } from '@web-test/fixtures'; + +vi.mock('@web/platform'); + +describe('FilePicker component', () => { + beforeEach(() => { + setupWindowNavigatorMock(); + }); + + const mockFileSelect = vi.fn(); + + it('renders the "Add screenshot" button initially', () => { + render(); + const addButton = screen.getByText(/add screenshot/i); + expect(addButton).toBeInTheDocument(); + }); + + describe('"Capture screenshot" button', () => { + it('is rendered on desktop devices', () => { + render(); + const addButton = screen.getByText(/capture screenshot/i); + expect(addButton).toBeInTheDocument(); + }); + + it('is not rendered on mobile devices', () => { + vi.mocked(isMobile).mockImplementation(() => true); + + const addButton = screen.queryByText(/capture screenshot/i); + expect(addButton).not.toBeInTheDocument(); + }); + }); + + it('uploads and previews a valid image file', async () => { + render(); + + const input = screen.getByLabelText(/add screenshot/i); // File input + + // Create a mock image file + const file = new File(['dummy content'], 'example.png', { type: 'image/png' }); + + // Simulate file upload + fireEvent.change(input, { target: { files: [file] } }); + + // Assert that the image preview appears + const image = await screen.findByAltText('screenshot'); + expect(image).toBeInTheDocument(); + expect(image).toHaveAttribute('src', expect.stringContaining('data:image/png')); // Check that the src is a data URL + + // Check that the parent component has been notified of changes + const imageSrc = image.getAttribute('src'); + expect(mockFileSelect).toHaveBeenCalledWith(imageSrc); + }); + + it('shows an error if the file is too large', async () => { + render(); + + const input = screen.getByLabelText(/add screenshot/i); // File input + + // Create a mock image file + const file = new File(['dummy content'], 'example.png', { type: 'image/png' }); + + // Mock the file's size to simulate an oversized file + Object.defineProperty(file, 'size', { value: 21 * 1024 * 1024 }); // 21MB + + // Simulate file upload + fireEvent.change(input, { target: { files: [file] } }); + + // Expect an error message to be displayed for a file too large + expect(await screen.findByText(/The maximum upload size is 20MB/i)).toBeInTheDocument(); + }); + + it('takes a screenshot when Capture screenshot button is clicked', async () => { + const MockMediaStream = vi.fn().mockImplementation(() => ({ + active: true, + getTracks: () => [], + })); + + const getDisplayMediaMock = vi.fn(); + vi.spyOn(navigator.mediaDevices, 'getDisplayMedia').mockImplementation(getDisplayMediaMock); + + const mockStream = new MockMediaStream(); + getDisplayMediaMock.mockResolvedValue(mockStream); + + // Mocking the play method + vi.spyOn(HTMLMediaElement.prototype, 'play').mockResolvedValue(undefined); + + // Mock canvas context and drawing operations + const mockContext = { + drawImage: vi.fn(), + }; + vi.spyOn(HTMLCanvasElement.prototype, 'getContext').mockReturnValue( + mockContext as unknown as CanvasRenderingContext2D + ); + + // Stub the toDataURL function of HTMLCanvasElement + vi.spyOn(HTMLCanvasElement.prototype, 'toDataURL').mockReturnValue( + 'data:image/png;base64,fakebase64data' + ); + + render(); + + const button = screen.getByRole('button', { name: /capture screenshot/i }); + fireEvent.click(button); + + const expectedDisplayMediaOptions = { + video: { + displaySurface: 'tab', + }, + audio: false, + preferCurrentTab: true, + }; + + expect(getDisplayMediaMock).toHaveBeenCalledWith(expectedDisplayMediaOptions); + + const image = await screen.findByAltText('screenshot'); + expect(image).toBeInTheDocument(); + expect(image).toHaveAttribute('src', expect.stringContaining('data:image/png')); + + const imageSrc = image.getAttribute('src'); + expect(mockFileSelect).toHaveBeenCalledWith(imageSrc); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/FilePicker/FilePicker.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/FilePicker/FilePicker.tsx new file mode 100644 index 00000000..73e534d7 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/FilePicker/FilePicker.tsx @@ -0,0 +1,182 @@ +import { ChangeEvent, useRef, useState, ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import Box from '@mui/material/Box'; +import captureScreenshot from '../../../../../utils/captureScreenshot'; +import { isMobile } from '@web/platform'; +import Button from '@mui/material/Button'; +import IconButton from '@mui/material/IconButton'; +import Tooltip from '@mui/material/Tooltip'; +import Typography from '@mui/material/Typography'; +import VividIcon from '@ui/VividIcon'; + +// Setting the maximum file size to 20MB +const maxFileSize = 2e7; + +/** + * FilePicker Component + * + * This component allows users to upload an image, preview it, and delete the uploaded image. + * The component validates file size, displays a preview for supported images, and includes a delete button. + * @param {(fileData: string) => void} onFileSelect - the function that handles storing the file value. + * @returns {ReactElement} The exit button component + */ +const FilePicker = ({ + onFileSelect, +}: { + onFileSelect: (fileData: string) => void; +}): ReactElement => { + const { t } = useTranslation(); + const [imageSrc, setImageSrc] = useState(''); + const imageRef = useRef(null); + const [maximumSizeError, setMaximumSizeError] = useState(false); + + const checkIfSizeAllowed = (file: File) => { + if (file.size > maxFileSize) { + setMaximumSizeError(true); + return false; + } + return true; + }; + + /** + * Clears the uploaded image preview by setting `imageSrc` to `null`. + */ + const handleDeleteFile = () => { + setImageSrc(''); + }; + + /** + * Handles file upload and validates the file type. + * If the file size is allowed, reads the file and sets it as the image preview. + * @param {ChangeEvent} event - The file input change event + */ + const handleFileUpload = (event: ChangeEvent) => { + const file = event.target.files?.[0] || null; + if (file && checkIfSizeAllowed(file)) { + setMaximumSizeError(false); + const reader = new FileReader(); + reader.onload = (e) => { + const fileData = e.target?.result as string; + setImageSrc(fileData); + onFileSelect(fileData); + }; + reader.readAsDataURL(file); + } + }; + + const processScreenshot = async () => { + try { + const screenshotData = await captureScreenshot(); + setImageSrc(screenshotData); + onFileSelect(screenshotData); + } catch (error: unknown) { + if (error instanceof Error) { + console.error(error.message); + } + } + }; + return ( + <> + {imageSrc && ( + + {t('filePicker.attachedScreenshot')} + + )} + + {maximumSizeError && ( + + {t('filePicker.sizeLimit')} + + )} + {!imageSrc ? ( + <> + {!isMobile() && ( + // The screenshot capture relies on the getDisplayMedia browser API which is unsupported on mobile devices + // See: https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getDisplayMedia#browser_compatibility + + )} + + + ) : ( + + + + + + + + + + + )} + + + ); +}; + +export default FilePicker; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/FilePicker/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/FilePicker/index.tsx new file mode 100644 index 00000000..e6a188ce --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/FilePicker/index.tsx @@ -0,0 +1,3 @@ +import FilePicker from './FilePicker'; + +export default FilePicker; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/HelperText/HelperText.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/HelperText/HelperText.spec.tsx new file mode 100644 index 00000000..e5857cf4 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/HelperText/HelperText.spec.tsx @@ -0,0 +1,54 @@ +import { beforeEach, describe, expect, it } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import HelperText from './HelperText'; + +describe('HelperText', () => { + let isError: boolean; + let errorType: 'Title' | 'Your name' | 'Description'; + let colorStyle: 'inherit' | 'red'; + let textLimit: number; + let formText: string; + let testId: string; + + beforeEach(() => { + isError = false; + errorType = 'Title'; + colorStyle = 'inherit'; + textLimit = 5; + formText = 'Your title is wrong and your feet smell :^)'; + testId = 'title-error'; + }); + + it('if there is no error, displays no error text', () => { + render( + + ); + + expect(screen.getByTestId(testId).innerHTML).toEqual(''); + }); + + it('if there is an error, displays error text', () => { + isError = true; + const expectedErrorText = `${errorType} is required and must be less than ${textLimit} characters`; + + render( + + ); + + expect(screen.getByTestId(testId).innerHTML).toEqual(expectedErrorText); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/HelperText/HelperText.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/HelperText/HelperText.tsx new file mode 100644 index 00000000..4d67309c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/HelperText/HelperText.tsx @@ -0,0 +1,64 @@ +import { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import Box from '@mui/material/Box'; + +export type HelperTextProps = { + isError: boolean; + errorType: string; + colorStyle: string; + textLimit: number; + formText: string; + testId: string; +}; + +/** + * HelperText Component + * + * Renders the helper text for a given field. If there is an error, displays instructions to + * rectify it. + * @param {HelperTextProps} props - The props for the component. + * @property {boolean} isError - Whether to display the error or not. + * @property {string} errorType - What kind of error this is. + * @property {string} colorStyle - Whether to use plain or red text. + * @property {number} textLimit - How many characters can exist for the form type. + * @property {string} formText - What is present in the form's field. + * @property {string} testId - The testId to assign to the error name + * @returns {ReactElement} The HelperText component + */ +const HelperText = ({ + errorType, + colorStyle, + isError, + textLimit, + formText, + testId, +}: HelperTextProps): ReactElement => { + const { t } = useTranslation(); + const errorName = (field: string, limit: number) => { + return t('feedbackForm.helperText.error', { field, limit }); + }; + + return ( + + + {isError ? errorName(errorType, textLimit) : ''} + + + {!isError ? `${formText.length}/${textLimit}` : ''} + + + ); +}; + +export default HelperText; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/HelperText/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/HelperText/index.tsx new file mode 100644 index 00000000..b68a3e6a --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/HelperText/index.tsx @@ -0,0 +1,3 @@ +import HelperText from './HelperText'; + +export default HelperText; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/index.tsx new file mode 100644 index 00000000..94b9ae2a --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FeedbackForm/index.tsx @@ -0,0 +1,3 @@ +import FeedbackForm from './FeedbackForm'; + +export default FeedbackForm; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FormSubmitted/FormSubmitted.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FormSubmitted/FormSubmitted.spec.tsx new file mode 100644 index 00000000..8ef8bd3b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FormSubmitted/FormSubmitted.spec.tsx @@ -0,0 +1,52 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect, vi } from 'vitest'; +import FormSubmitted from './FormSubmitted'; + +describe('FormSubmitted', () => { + it('should display a success message with the ticket number and track progress link', () => { + // Mock the handleCloseFormSubmitted function + const mockHandleClose = vi.fn(); + + const mockTicketResponse = { + message: 'Your issue has been submitted successfully!', + ticketUrl: 'http://example.com', + }; + + // Render the component with mock props + render( + + ); + + // Check if the success message and ticket number are displayed + expect(screen.queryByTestId('thank-you-text')).toBeInTheDocument(); + expect(screen.queryByTestId('track-progress-text')).toBeInTheDocument(); + + // Check if the link is correct + const link = screen.queryByTestId('track-progress-text'); + expect(link).toHaveAttribute('href', mockTicketResponse.ticketUrl); + }); + + it('should display an error message when there is no ticket number', () => { + // Mock the handleCloseFormSubmitted function + const mockHandleClose = vi.fn(); + + const mockTicketResponse = { + message: 'There was an error submitting your feedback.', + ticketUrl: '', + }; + + // Render the component with mock props + render( + + ); + + // Check if the error message is displayed + expect(screen.queryByTestId('error-text')).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FormSubmitted/FormSubmitted.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FormSubmitted/FormSubmitted.tsx new file mode 100644 index 00000000..a1937c9a --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FormSubmitted/FormSubmitted.tsx @@ -0,0 +1,124 @@ +import { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Typography from '@mui/material/Typography'; +import Link from '@mui/material/Link'; + +export type TicketResponseType = { + message: string; + ticketUrl: string; +}; + +export type FormSubmittedProps = { + handleCloseFormSubmitted: () => void; + ticketResponse: TicketResponseType; +}; + +/** + * FormSubmitted Component + * + * This component displays either a success message upon form submission, or an error if there was one encountered. + * @param {FormSubmittedProps} props - the props for the component. + * @property {() => void} handleCloseFormSubmitted - the function handling closing component upon form submission. + * @property {TicketResponseType} ticketResponse - the field containing response from the backend. + * @returns {ReactElement} The form submitted component. + */ + +const FormSubmitted = ({ + handleCloseFormSubmitted, + ticketResponse, +}: FormSubmittedProps): ReactElement => { + const { t } = useTranslation(); + + return ( + <> + + + {ticketResponse.ticketUrl ? ( + + + {t('feedbackForm.submitted.thanks')} + + + {t('feedbackForm.submitted.content')} + + + {ticketResponse.message} + + + {t('feedbackForm.submitted.track')} + + + ) : ( + + {t('feedbackForm.submitted.error')} + + )} + + + + + + + ); +}; + +export default FormSubmitted; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FormSubmitted/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FormSubmitted/index.tsx new file mode 100644 index 00000000..4231d272 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/FormSubmitted/index.tsx @@ -0,0 +1,3 @@ +import FormSubmitted from './FormSubmitted'; + +export default FormSubmitted; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/ReportIssue.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/ReportIssue.spec.tsx new file mode 100644 index 00000000..95c2fc79 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/ReportIssue.spec.tsx @@ -0,0 +1,83 @@ +import { render, screen, fireEvent } from '@testing-library/react'; +import { describe, it, beforeEach, vi, expect, Mock } from 'vitest'; +import ReportIssue from './ReportIssue'; + +import reportIssue from '../../../api/reportFeedback'; + +// Mock +vi.mock('../../../hooks/useCollectBrowserInformation', () => ({ + default: () => ({ browser: 'TestBrowser' }), +})); +vi.mock('../../../api/reportFeedback', () => ({ + default: vi.fn(), +})); + +const mockHandleClose = vi.fn(); + +describe('ReportIssue component', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it('renders nothing when isOpen is false', () => { + const { container } = render(); + expect(container).toBeEmptyDOMElement(); + }); + + it('renders form and submits data successfully', async () => { + (reportIssue as Mock).mockResolvedValue({ + data: { + feedbackData: { + message: 'It worked!', + ticketUrl: 'https://example.com', + }, + }, + }); + + render(); + + const input = screen.getByLabelText(/add screenshot/i); // File input + // Create a mock image file + const file = new File(['dummy content'], 'example.png', { type: 'image/png' }); + // Simulate file upload + fireEvent.change(input, { target: { files: [file] } }); + + fireEvent.change(screen.getByTestId('title-input').querySelector('input')!, { + target: { value: 'Trying to submit a form' }, + }); + fireEvent.change(screen.getByTestId('name-input').querySelector('input')!, { + target: { value: 'Jane Doe' }, + }); + fireEvent.change(screen.getByTestId('issue-input').querySelector('textarea')!, { + target: { value: 'App crashed after clicking submit' }, + }); + + fireEvent.click(screen.getByRole('button', { name: /Send/i })); + + const successMessage = await screen.findByText('Thank you for your feedback!'); + expect(successMessage).toBeInTheDocument(); + + fireEvent.click(screen.getByTestId('close-button-form-submitted')); + }); + + it('displays error message when submission fails', async () => { + (reportIssue as Mock).mockRejectedValue(new Error('Network error')); + + render(); + + fireEvent.change(screen.getByTestId('title-input').querySelector('input')!, { + target: { value: 'Trying to submit a form' }, + }); + fireEvent.change(screen.getByTestId('name-input').querySelector('input')!, { + target: { value: 'Jane Doe' }, + }); + fireEvent.change(screen.getByTestId('issue-input').querySelector('textarea')!, { + target: { value: 'App crashed after clicking submit' }, + }); + + fireEvent.click(screen.getByRole('button', { name: /Send/i })); + + const successMessage = await screen.findAllByTestId('error-text'); + expect(successMessage[0]).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/ReportIssue.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/ReportIssue.tsx new file mode 100644 index 00000000..4072b334 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/ReportIssue.tsx @@ -0,0 +1,176 @@ +import { ChangeEvent, ReactElement, useState, FormEvent } from 'react'; +import { AxiosError } from 'axios'; +import { useTranslation } from 'react-i18next'; +import RightPanelTitle from '../RightPanel/RightPanelTitle'; +import useCollectBrowserInformation from '../../../hooks/useCollectBrowserInformation'; +import FormSubmitted from './FormSubmitted'; +import FeedbackForm from './FeedbackForm'; +import reportIssue from '../../../api/reportFeedback'; +import { + REPORT_TITLE_LIMIT, + REPORT_NAME_LIMIT, + REPORT_DESCRIPTION_LIMIT, +} from '../../../utils/constants'; +import { ErrorFormType } from './FeedbackForm/FeedbackForm'; + +export type ReportIssueProps = { + handleClose: () => void; + isOpen: boolean; +}; + +type FormField = 'title' | 'name' | 'issue'; + +export type FormType = { + title: string; + name: string; + issue: string; + attachment: string; +}; + +type ResponseType = { + message: string; + ticketUrl: string; +}; + +/** + * ReportIssue Component + * + * This component allows users to provide feedback about any potential issue they encountered + * @param {ReportIssueProps} props - the props for the component. + * @property {() => void} handleClose - the function handling the closing of the component. + * @property {boolean} isOpen - indicates whether the report issue component is open or closed. + * @returns {ReactElement} The report issue component. + */ +const ReportIssue = ({ handleClose, isOpen }: ReportIssueProps): ReactElement | false => { + const { t } = useTranslation(); + const [formData, setFormData] = useState({ + title: '', + name: '', + issue: '', + attachment: '', + }); + + const [ticketResponse, setTicketResponse] = useState({ + message: '', + ticketUrl: '', + }); + const [isFormVisible, setIsFormVisible] = useState(true); + + const [loading, setLoading] = useState(false); + + const [errors, setErrors] = useState({ + title: false, + name: false, + issue: false, + }); + + const browserInfo = useCollectBrowserInformation(); + + const handleChange = (event: ChangeEvent) => { + const { name, value } = event.target; + + const formFields = name as FormField; + + const newErrors: ErrorFormType = { + title: value.length >= REPORT_TITLE_LIMIT, + name: value.length >= REPORT_NAME_LIMIT, + issue: value.length >= REPORT_DESCRIPTION_LIMIT, + }; + + setFormData((prevFormData) => ({ + ...prevFormData, + [formFields]: value, + })); + + setErrors((prevErrors) => ({ + ...prevErrors, + [name]: value.length === 0 || newErrors[formFields], + })); + }; + + const handleFileSelect = (attachment: string) => { + // we have to remove the data:image/png;base64, part + // because while it provides information about the file type + // it is not part of the actual binary content of the image + const data = attachment.replace(/^data:image\/\w+;base64,/, ''); + setFormData((prev) => ({ ...prev, attachment: data })); + }; + + const handleCloseFormSubmitted = () => { + setFormData({ + title: '', + name: '', + issue: '', + attachment: '', + }); + // this is needed to make the form available the next time it is opened + setIsFormVisible(true); + handleClose(); + }; + + const validateForm = () => { + const newErrors = { + title: formData.title === '', + name: formData.name === '', + issue: formData.issue === '', + }; + setErrors(newErrors); + return !newErrors.issue && !newErrors.title && !newErrors.name; + }; + + const handleSubmit = async (event: FormEvent) => { + event.preventDefault(); + + if (validateForm()) { + setLoading(true); + // Add-on the additional information to the issue field + const updatedIssueField = `${formData.issue}\n\nAdditional information:\n${JSON.stringify(browserInfo, null, 2)}`; + + const submissionData = { + ...formData, + issue: updatedIssueField, + }; + try { + // make the axios request + const response = await reportIssue(submissionData); + setTicketResponse(response.data.feedbackData); + setIsFormVisible(false); + setLoading(false); + } catch (error: unknown) { + const axiosError = error as AxiosError; + const errorResponse = { + message: axiosError.message, + ticketUrl: '', + }; + setTicketResponse(errorResponse); + setIsFormVisible(false); + setLoading(false); + } + } + }; + + return ( + isOpen && ( + <> + + {isFormVisible ? ( + + ) : ( + + )} + + ) + ); +}; + +export default ReportIssue; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/index.tsx new file mode 100644 index 00000000..72022d1d --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssue/index.tsx @@ -0,0 +1,3 @@ +import ReportIssue from './ReportIssue'; + +export default ReportIssue; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssueButton/ReportIssueButton.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssueButton/ReportIssueButton.spec.tsx new file mode 100644 index 00000000..caeb883e --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssueButton/ReportIssueButton.spec.tsx @@ -0,0 +1,27 @@ +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { describe, expect, it, vi } from 'vitest'; +import ReportIssueButton from './ReportIssueButton'; + +describe('ReportIssueButton', () => { + it('should invoke callback on click', () => { + const handleClick = vi.fn(); + render(); + screen.getByRole('button').click(); + expect(handleClick).toHaveBeenCalled(); + }); + it('should have a tooltip title that indicates that chat can be opened', async () => { + render( {}} isOpen={false} />); + const button = await screen.findByRole('button'); + await userEvent.hover(button); + const tooltip = await screen.findByRole('tooltip'); + expect(tooltip).toHaveTextContent('Open report issue form'); + }); + it('should have a tooltip title that indicates that chat can be closed', async () => { + render( {}} isOpen />); + const button = await screen.findByRole('button'); + await userEvent.hover(button); + const tooltip = await screen.findByRole('tooltip'); + expect(tooltip).toHaveTextContent('Close report issue form'); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssueButton/ReportIssueButton.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssueButton/ReportIssueButton.tsx new file mode 100644 index 00000000..85feaf92 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssueButton/ReportIssueButton.tsx @@ -0,0 +1,57 @@ +import Tooltip from '@mui/material/Tooltip'; +import { ReactElement, useRef } from 'react'; +import { useTranslation } from 'react-i18next'; +import ToolbarButton from '../ToolbarButton'; +import VividIcon from '@ui/VividIcon'; + +export type ReportIssueButtonProps = { + handleClick: () => void; + isOpen: boolean; + isOverflowButton?: boolean; +}; + +/** + * ReportIssueButton Component + * + * Displays a clickable button to open/close the ReportIssue panel. + * @param {ReportIssueButtonProps} props - The props for the component. + * @property {Function} handleClick - click handler to open the Report Issue panel + * @property {boolean} isOpen - whether the Report Issue panel is open + * @property {boolean} isOverflowButton - (optional) whether the button is in the ToolbarOverflowMenu + * @returns {ReactElement} The ReportIssueButton component. + */ +const ReportIssueButton = ({ + handleClick, + isOpen, + isOverflowButton = false, +}: ReportIssueButtonProps): ReactElement => { + const { t } = useTranslation(); + const anchorRef = useRef(null); + + return ( + + + } + ref={anchorRef} + isOverflowButton={isOverflowButton} + /> + + ); +}; + +export default ReportIssueButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssueButton/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssueButton/index.tsx new file mode 100644 index 00000000..3a9a2b2f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ReportIssueButton/index.tsx @@ -0,0 +1,3 @@ +import ReportIssueButton from './ReportIssueButton'; + +export default ReportIssueButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RightPanel/RightPanel.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RightPanel/RightPanel.tsx new file mode 100644 index 00000000..11630be2 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RightPanel/RightPanel.tsx @@ -0,0 +1,67 @@ +import { ReactElement } from 'react'; +import ParticipantList from '../ParticipantList/ParticipantList'; +import Chat from '../Chat'; +import ReportIssue from '../ReportIssue'; +import type { RightPanelActiveTab } from '../../../hooks/useRightPanel'; +import BackgroundEffectsLayout from '../../BackgroundEffects/BackgroundEffectsLayout'; +import Box from '@mui/material/Box'; +import type { BoxProps } from '@mui/material/Box'; +import classNames from 'classnames'; +import { twMerge } from 'tailwind-merge'; + +export type RightPanelProps = { + handleClose: () => void; + activeTab: RightPanelActiveTab; +} & BoxProps; + +/** + * RightPanel Component + * Renders a tab panel that enters from off screen on the right of the window. + * The panel displays participant list, chat tab, report issue and background effects. + * @param {RightPanelProps} props - props for the component + * @property {RightPanelActiveTab} activeTab - string indicating which tab to display, or 'closed' if closed + * @property {Function} handleClose - click handler to close the panel + * @returns {ReactElement} RightPanel Component + */ +const RightPanel = ({ + handleClose, + activeTab, + className, + ...boxProps +}: RightPanelProps): ReactElement => { + return ( + + + + + + + ); +}; + +export default RightPanel; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RightPanel/RightPanelTitle.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RightPanel/RightPanelTitle.tsx new file mode 100644 index 00000000..ef0554ea --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RightPanel/RightPanelTitle.tsx @@ -0,0 +1,51 @@ +import IconButton from '@mui/material/IconButton'; +import { ReactElement } from 'react'; +import VividIcon from '@ui/VividIcon'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; + +export type RightPanelTitleProps = { + handleClose: () => void; + title: string; +}; + +/** + * RightPanelTitle component + * Renders the title for the RightPanel component with a text title and an X icon to close the panel + * @param {RightPanelTitleProps} props - the Props + * @property {() => void} handleClose - click handler for X icon + * @property {string} title - Title to display + * } + * @returns {ReactElement} - RightPanelTitle component + */ +const RightPanelTitle = ({ handleClose, title }: RightPanelTitleProps): ReactElement => { + return ( + + + {title} + + + + + + ); +}; + +export default RightPanelTitle; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RightPanel/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RightPanel/index.tsx new file mode 100644 index 00000000..b2190ba0 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/RightPanel/index.tsx @@ -0,0 +1,3 @@ +import RightPanel from './RightPanel'; + +export default RightPanel; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ScreenSharePublisher/ScreenSharePublisher.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ScreenSharePublisher/ScreenSharePublisher.spec.tsx new file mode 100644 index 00000000..b50bba27 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ScreenSharePublisher/ScreenSharePublisher.spec.tsx @@ -0,0 +1,64 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect, vi } from 'vitest'; +import { Publisher } from '@vonage/client-sdk-video'; +import { EventEmitter } from 'stream'; +import ScreenSharePublisher from './ScreenSharePublisher'; +import { defaultAudioDevice } from '../../../utils/mockData/device'; + +describe('ScreenSharePublisher component', () => { + it('renders nothing if box is undefined', () => { + const { container } = render( + + ); + expect(container).toBeEmptyDOMElement(); + }); + + it('renders VideoTile with ScreenShareNameDisplay and appends element with classes', () => { + const box = { height: 100, width: 100, top: 0, left: 0 }; + const mockPublisher = Object.assign(new EventEmitter(), { + applyVideoFilter: vi.fn(), + clearVideoFilter: vi.fn(), + applyAudioFilter: vi.fn(), + clearAudioFilter: vi.fn(), + getAudioSource: () => defaultAudioDevice, + getAudioFilter: () => null, + videoWidth: () => 1280, + videoHeight: () => 720, + stream: { name: 'Test Stream' }, + }) as unknown as Publisher; + + // Create a dummy element to append (simulate HTMLElement) + const element = document.createElement('div'); + element.className = 'original-class'; + + render( + + ); + + expect(screen.getByText('Test Stream')).toBeInTheDocument(); + expect(element.style.width).toBe('100%'); + expect(element.style.position).toBe('absolute'); + expect(element.classList.contains('rounded-vera-large')).toBe(true); + expect(element.style.objectFit).toBe('contain'); + }); + + it('renders hidden message when entire screen is shared', () => { + const box = { height: 100, width: 100, top: 0, left: 0 }; + + render( + + ); + + expect(screen.getByText('You are sharing your screen.')).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ScreenSharePublisher/ScreenSharePublisher.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ScreenSharePublisher/ScreenSharePublisher.tsx new file mode 100644 index 00000000..b85ede97 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ScreenSharePublisher/ScreenSharePublisher.tsx @@ -0,0 +1,67 @@ +import { ReactElement, useEffect, useRef } from 'react'; +import { Box } from 'opentok-layout-js'; +import { Publisher } from '@vonage/client-sdk-video'; +import VideoTile from '../VideoTile'; +import ScreenShareNameDisplay from '../../ScreenShareNameDisplay'; +import { useTranslation } from 'react-i18next'; + +export type ScreenSharePublisherProps = { + box: Box | undefined; + element: HTMLElement | HTMLObjectElement | undefined; + publisher: Publisher | null; + isEntireScreen: boolean; +}; + +/** + * ScreenSharePublisher Component + * Video Tile for local screen share publisher + * @param {ScreenSharePublisherProps} props - the props for this component + * @property {Box} box - Box specifying position and size of Video Tile + * @property {HTMLElement | HTMLObjectElement | undefined} element - VideoElement + * @property {Publisher | null} publisher-- Publisher object for local screen share + * @property {boolean} isEntireScreen - Whether the local user is sharing the entire screen + * @returns {ReactElement | undefined} - ScreenSharePublisher Component + */ +const ScreenSharePublisher = ({ + box, + element, + publisher, + isEntireScreen, +}: ScreenSharePublisherProps): ReactElement | undefined => { + const containerRef = useRef(null); + const { t } = useTranslation(); + useEffect(() => { + if (element && containerRef.current) { + element.classList.add('rounded-vera-large'); + Object.assign(element.style, { + width: '100%', + position: 'absolute', + objectFit: 'contain', + }); + containerRef.current.appendChild(element); + } + }, [element]); + const streamName = publisher?.stream?.name ?? ''; + return ( + box && ( + + {isEntireScreen ? ( +
        + {t('screenSharing.dialog.hiddenMessage')} +
        + ) : ( + + )} +
        + ) + ); +}; + +export default ScreenSharePublisher; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ScreenSharePublisher/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ScreenSharePublisher/index.tsx new file mode 100644 index 00000000..24679407 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ScreenSharePublisher/index.tsx @@ -0,0 +1,3 @@ +import ScreenSharePublisher from './ScreenSharePublisher'; + +export default ScreenSharePublisher; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ScreenshareVideoTile/ScreenshareVideoTile.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ScreenshareVideoTile/ScreenshareVideoTile.spec.tsx new file mode 100644 index 00000000..59833b3e --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ScreenshareVideoTile/ScreenshareVideoTile.spec.tsx @@ -0,0 +1,423 @@ +import { render, screen, fireEvent } from '@testing-library/react'; +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import { Box } from 'opentok-layout-js'; +import { hasMediaProcessorSupport } from '@vonage/client-sdk-video'; +import ScreenshareVideoTile from './ScreenshareVideoTile'; + +vi.mock('../ZoomIndicator', () => ({ + default: ({ + resetZoom, + zoomLevel, + zoomIn, + zoomOut, + }: { + resetZoom: () => void; + zoomLevel: number; + zoomIn: () => void; + zoomOut: () => void; + }) => ( +
        + {zoomLevel} + + + +
        + ), +})); + +vi.mock('../../../utils/helpers/getBoxStyle', () => ({ + default: (box: Box | undefined) => ({ + width: box?.width || 100, + height: box?.height || 100, + top: box?.top || 0, + left: box?.left || 0, + }), +})); + +vi.mock('../../../utils/constants', () => ({ + MAX_ZOOM: 5, + MIN_ZOOM: 0.5, + ZOOM_STEP: 0.25, +})); + +vi.mock('@vonage/client-sdk-video', () => ({ + hasMediaProcessorSupport: vi.fn(() => true), +})); + +describe('ScreenshareVideoTile', () => { + const defaultProps = { + 'data-testid': 'screenshare-tile', + box: { width: 800, height: 600, top: 0, left: 0 } as Box, + children:
        Video Content
        , + id: 'screenshare-1', + }; + + it('renders with basic props', () => { + render(); + + expect(screen.getByTestId('screenshare-tile')).toBeInTheDocument(); + expect(screen.getByTestId('video-content')).toBeInTheDocument(); + expect(screen.getByTestId('zoom-indicator')).toBeInTheDocument(); + }); + + it('renders with custom className', () => { + render(); + + const tile = screen.getByTestId('screenshare-tile'); + expect(tile).toHaveClass('ml-2'); + }); + + it('calls onMouseEnter and onMouseLeave handlers', () => { + const onMouseEnter = vi.fn(); + const onMouseLeave = vi.fn(); + + render( + + ); + + const tile = screen.getByTestId('screenshare-tile'); + + fireEvent.mouseEnter(tile); + expect(onMouseEnter).toHaveBeenCalledTimes(1); + + fireEvent.mouseLeave(tile); + expect(onMouseLeave).toHaveBeenCalledTimes(1); + }); + + describe('Zoom functionality', () => { + it('increases zoom level on wheel up', () => { + render(); + + const tile = screen.getByTestId('screenshare-tile'); + const zoomLevel = screen.getByTestId('zoom-level'); + + expect(zoomLevel).toHaveTextContent('1'); + + fireEvent.wheel(tile, { deltaY: -100 }); + expect(zoomLevel).toHaveTextContent('1.25'); + }); + + it('decreases zoom level on wheel down', () => { + render(); + + const tile = screen.getByTestId('screenshare-tile'); + const zoomLevel = screen.getByTestId('zoom-level'); + + // First zoom in + fireEvent.wheel(tile, { deltaY: -100 }); + expect(zoomLevel).toHaveTextContent('1.25'); + + // Then zoom out + fireEvent.wheel(tile, { deltaY: 100 }); + expect(zoomLevel).toHaveTextContent('1'); + }); + + it('respects minimum zoom level (0.5)', () => { + render(); + + const tile = screen.getByTestId('screenshare-tile'); + const zoomLevel = screen.getByTestId('zoom-level'); + + fireEvent.wheel(tile, { deltaY: 100 }); + fireEvent.wheel(tile, { deltaY: 100 }); + fireEvent.wheel(tile, { deltaY: 100 }); + + expect(zoomLevel).toHaveTextContent('0.5'); + }); + + it('respects maximum zoom level (5)', () => { + render(); + + const tile = screen.getByTestId('screenshare-tile'); + const zoomLevel = screen.getByTestId('zoom-level'); + + for (let i = 0; i < 20; i++) { + fireEvent.wheel(tile, { deltaY: -100 }); + } + + expect(zoomLevel).toHaveTextContent('5'); + }); + + it('resets zoom when reset button is clicked', () => { + render(); + + const tile = screen.getByTestId('screenshare-tile'); + const zoomLevel = screen.getByTestId('zoom-level'); + const resetButton = screen.getByTestId('reset-zoom'); + + // Zoom in first + fireEvent.wheel(tile, { deltaY: -100 }); + expect(zoomLevel).toHaveTextContent('1.25'); + + // Reset zoom + fireEvent.click(resetButton); + expect(zoomLevel).toHaveTextContent('1'); + }); + + it('zooms in when zoom in button is clicked', () => { + render(); + + const zoomLevel = screen.getByTestId('zoom-level'); + const zoomInButton = screen.getByTestId('zoom-in'); + + expect(zoomLevel).toHaveTextContent('1'); + + fireEvent.click(zoomInButton); + expect(zoomLevel).toHaveTextContent('1.25'); + + fireEvent.click(zoomInButton); + expect(zoomLevel).toHaveTextContent('1.5'); + }); + + it('zooms out when zoom out button is clicked', () => { + render(); + + const tile = screen.getByTestId('screenshare-tile'); + const zoomLevel = screen.getByTestId('zoom-level'); + const zoomOutButton = screen.getByTestId('zoom-out'); + + fireEvent.wheel(tile, { deltaY: -100 }); + fireEvent.wheel(tile, { deltaY: -100 }); + expect(zoomLevel).toHaveTextContent('1.5'); + + fireEvent.click(zoomOutButton); + expect(zoomLevel).toHaveTextContent('1.25'); + + fireEvent.click(zoomOutButton); + expect(zoomLevel).toHaveTextContent('1'); + }); + + it('handles zoomIn function correctly at boundaries', () => { + render(); + + const zoomLevel = screen.getByTestId('zoom-level'); + const zoomInButton = screen.getByTestId('zoom-in'); + + for (let i = 0; i < 20; i++) { + fireEvent.click(zoomInButton); + } + + expect(zoomLevel).toHaveTextContent('5'); + }); + + it('handles zoomOut function correctly at boundaries', () => { + render(); + + const zoomLevel = screen.getByTestId('zoom-level'); + const zoomOutButton = screen.getByTestId('zoom-out'); + + for (let i = 0; i < 20; i++) { + fireEvent.click(zoomOutButton); + } + + expect(zoomLevel).toHaveTextContent('0.5'); + }); + + it('resets pan offset when zooming back to 1x', () => { + render(); + + const tile = screen.getByTestId('screenshare-tile'); + const zoomLevel = screen.getByTestId('zoom-level'); + const zoomOutButton = screen.getByTestId('zoom-out'); + + fireEvent.wheel(tile, { deltaY: -100 }); + fireEvent.mouseDown(tile, { clientX: 100, clientY: 100 }); + fireEvent.mouseMove(tile, { clientX: 150, clientY: 150 }); + fireEvent.mouseUp(tile); + + expect(zoomLevel).toHaveTextContent('1.25'); + + fireEvent.click(zoomOutButton); + expect(zoomLevel).toHaveTextContent('1'); + + fireEvent.wheel(tile, { deltaY: -100 }); + expect(zoomLevel).toHaveTextContent('1.25'); + }); + }); + + describe('Pan functionality', () => { + it('enables dragging when zoomed in', () => { + render(); + + const tile = screen.getByTestId('screenshare-tile'); + + fireEvent.wheel(tile, { deltaY: -100 }); + + fireEvent.mouseDown(tile, { clientX: 100, clientY: 100 }); + fireEvent.mouseMove(tile, { clientX: 150, clientY: 150 }); + fireEvent.mouseUp(tile); + + expect(tile).toBeInTheDocument(); + }); + + it('does not enable dragging when zoom level is 1', () => { + render(); + + const tile = screen.getByTestId('screenshare-tile'); + + fireEvent.mouseDown(tile, { clientX: 100, clientY: 100 }); + fireEvent.mouseMove(tile, { clientX: 150, clientY: 150 }); + fireEvent.mouseUp(tile); + + expect(tile).toBeInTheDocument(); + }); + + it('stops dragging on mouse leave', () => { + render(); + + const tile = screen.getByTestId('screenshare-tile'); + + fireEvent.wheel(tile, { deltaY: -100 }); + fireEvent.mouseDown(tile, { clientX: 100, clientY: 100 }); + + fireEvent.mouseLeave(tile); + + expect(tile).toBeInTheDocument(); + }); + }); + + describe('Box styling', () => { + it('renders with undefined box', () => { + render(); + + expect(screen.getByTestId('screenshare-tile')).toBeInTheDocument(); + }); + + it('applies box dimensions as styles', () => { + const customBox = { width: 400, height: 300, top: 50, left: 25 } as Box; + + render(); + + const tile = screen.getByTestId('screenshare-tile'); + expect(tile).toBeInTheDocument(); + }); + }); + + describe('Component structure', () => { + it('has correct CSS styles', () => { + render(); + + const tile = screen.getByTestId('screenshare-tile'); + expect(tile).toHaveStyle({ position: 'absolute' }); + expect(tile).toHaveStyle({ display: 'flex' }); + }); + + it('has correct id attribute', () => { + render(); + + const tile = screen.getByTestId('screenshare-tile'); + expect(tile).toHaveAttribute('id', 'screenshare-1'); + }); + + it('renders children content', () => { + const customChildren = ( +
        + Custom Video Element +
        + ); + + render({customChildren}); + + expect(screen.getByTestId('custom-content')).toBeInTheDocument(); + expect(screen.getByText('Custom Video Element')).toBeInTheDocument(); + }); + + it('renders ZoomIndicator with correct props', () => { + render(); + + expect(screen.getByTestId('zoom-indicator')).toBeInTheDocument(); + expect(screen.getByTestId('zoom-level')).toHaveTextContent('1'); + expect(screen.getByTestId('reset-zoom')).toBeInTheDocument(); + expect(screen.getByTestId('zoom-in')).toBeInTheDocument(); + expect(screen.getByTestId('zoom-out')).toBeInTheDocument(); + }); + }); + + describe('forwardRef functionality', () => { + it('forwards ref correctly', () => { + const ref = vi.fn(); + + render(); + + expect(ref).toHaveBeenCalled(); + }); + }); + + describe('Media processor support', () => { + it('renders ZoomIndicator when hasMediaProcessorSupport returns true', () => { + render(); + + expect(screen.getByTestId('zoom-indicator')).toBeInTheDocument(); + }); + + describe('when hasMediaProcessorSupport returns false', () => { + beforeEach(() => { + vi.mocked(hasMediaProcessorSupport).mockReturnValue(false); + }); + + afterEach(() => { + vi.mocked(hasMediaProcessorSupport).mockReturnValue(true); + }); + + it('does not render ZoomIndicator', () => { + render(); + + expect(screen.queryByTestId('zoom-indicator')).not.toBeInTheDocument(); + }); + + it('does not change zoom level on wheel events', () => { + const { rerender } = render(); + const tile = screen.getByTestId('screenshare-tile'); + + fireEvent.wheel(tile, { deltaY: -100 }); + fireEvent.wheel(tile, { deltaY: -100 }); + + // Re-enable support to expose ZoomIndicator and read the zoom level + vi.mocked(hasMediaProcessorSupport).mockReturnValue(true); + rerender(); + + expect(screen.getByTestId('zoom-level')).toHaveTextContent('1'); + }); + }); + }); + + describe('Zoom calculations', () => { + it('handles wheel events with precise zoom calculations', () => { + render(); + + const tile = screen.getByTestId('screenshare-tile'); + const zoomLevel = screen.getByTestId('zoom-level'); + + // Mock getBoundingClientRect for zoom calculation + Object.defineProperty(tile, 'getBoundingClientRect', { + writable: true, + value: vi.fn(() => ({ + width: 800, + height: 600, + left: 0, + top: 0, + })), + }); + + expect(zoomLevel).toHaveTextContent('1'); + + fireEvent.wheel(tile, { + deltaY: -100, + clientX: 400, // center X + clientY: 300, // center Y + }); + + expect(zoomLevel).toHaveTextContent('1.25'); + }); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ScreenshareVideoTile/ScreenshareVideoTile.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ScreenshareVideoTile/ScreenshareVideoTile.tsx new file mode 100644 index 00000000..9ecd988a --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ScreenshareVideoTile/ScreenshareVideoTile.tsx @@ -0,0 +1,232 @@ +import { Box } from 'opentok-layout-js'; +import { + ForwardedRef, + forwardRef, + ReactElement, + ReactNode, + WheelEvent, + useState, + MouseEvent, + useEffect, +} from 'react'; +import { hasMediaProcessorSupport } from '@vonage/client-sdk-video'; +import getBoxStyle from '../../../utils/helpers/getBoxStyle'; +import ZoomIndicator from '../ZoomIndicator'; +import { MAX_ZOOM, MIN_ZOOM, ZOOM_STEP } from '../../../utils/constants'; +import CustomBox from '@mui/material/Box'; + +export type ScreenshareVideoTileProps = { + 'data-testid': string; + box: Box | undefined; + children: ReactNode; + className?: string; + id: string; + onMouseLeave?: () => void; + onMouseEnter?: () => void; +}; + +/** + * ScreenshareVideoTile Component + * + * A specialized video tile component for screenshare content with zoom and pan capabilities. + * @param {ScreenshareVideoTileProps} props - The props for the component + * @returns {ReactElement} - The ScreenshareVideoTile component. + */ +const ScreenshareVideoTile = forwardRef( + ( + { + 'data-testid': dataTestId, + box, + children, + className, + id, + onMouseEnter, + onMouseLeave, + }: ScreenshareVideoTileProps, + ref: ForwardedRef + ): ReactElement => { + const isZoomSupported = hasMediaProcessorSupport('both'); + // Zoom state management + const [zoomLevel, setZoomLevel] = useState(1); + const [panOffset, setPanOffset] = useState<{ x: number; y: number }>({ + x: 0, + y: 0, + }); + const [isDragging, setIsDragging] = useState(false); + const [lastMousePosition, setLastMousePosition] = useState<{ x: number; y: number }>({ + x: 0, + y: 0, + }); + + // Auto re-center when zoom returns to 100% + useEffect(() => { + if (zoomLevel === 1) { + // eslint-disable-next-line react-hooks/set-state-in-effect + setPanOffset({ x: 0, y: 0 }); + setIsDragging(false); + } + }, [zoomLevel]); + + const onWheel = (event: WheelEvent) => { + if (!isZoomSupported) return; + + event.preventDefault(); + + const isWheelPositive = event.deltaY > 0; + const deltaZoom = isWheelPositive ? -ZOOM_STEP : ZOOM_STEP; + const newZoomLevel = Math.min(Math.max(zoomLevel + deltaZoom, MIN_ZOOM), MAX_ZOOM); + + // Get the container bounds and mouse position relative to container + const rect = event.currentTarget.getBoundingClientRect(); + const mouseX = event.clientX - rect.left; + const mouseY = event.clientY - rect.top; + + // Calculate the center of the container + const centerX = rect.width / 2; + const centerY = rect.height / 2; + + // Calculate the offset from center to mouse position + const offsetX = mouseX - centerX; + const offsetY = mouseY - centerY; + + // Calculate the new pan offset to keep the mouse position fixed during zoom + // We need to account for the zoom change and current pan offset + const zoomRatio = newZoomLevel / zoomLevel; + const newPanX = panOffset.x * zoomRatio + offsetX * (1 - zoomRatio); + const newPanY = panOffset.y * zoomRatio + offsetY * (1 - zoomRatio); + + setZoomLevel(newZoomLevel); + setPanOffset({ x: newPanX, y: newPanY }); + }; + + const handleMouseDown = (event: MouseEvent) => { + if (zoomLevel > 1) { + setIsDragging(true); + setLastMousePosition({ x: event.clientX, y: event.clientY }); + } + }; + + const handleMouseMove = (event: MouseEvent) => { + if (isDragging && zoomLevel > 1) { + const deltaX = event.clientX - lastMousePosition.x; + const deltaY = event.clientY - lastMousePosition.y; + + setPanOffset((prev) => ({ + x: prev.x + deltaX, + y: prev.y + deltaY, + })); + + setLastMousePosition({ x: event.clientX, y: event.clientY }); + } + }; + + const handleMouseUp = () => { + setIsDragging(false); + }; + + // Apply zoom transform style + const getTransformStyle = () => { + let cursor = 'default'; + if (zoomLevel > 1) { + cursor = isDragging ? 'grabbing' : 'grab'; + } + + return { + transform: `scale(${zoomLevel}) translate(${panOffset.x / zoomLevel}px, ${panOffset.y / zoomLevel}px)`, + transformOrigin: 'center', + transition: isDragging ? 'none' : 'transform 0.1s ease-out', + cursor, + }; + }; + + const resetZoom = () => { + setZoomLevel(1); + setPanOffset({ x: 0, y: 0 }); + setIsDragging(false); + }; + + const zoomIn = () => { + const newZoomLevel = Math.min(zoomLevel + ZOOM_STEP, MAX_ZOOM); + setZoomLevel(newZoomLevel); + // Reset pan offset when zooming in from 1x to maintain center position + if (zoomLevel === 1) { + setPanOffset({ x: 0, y: 0 }); + } + }; + + const zoomOut = () => { + const newZoomLevel = Math.max(zoomLevel - ZOOM_STEP, MIN_ZOOM); + setZoomLevel(newZoomLevel); + // Reset pan offset when zooming back to 1x + if (newZoomLevel === 1) { + setPanOffset({ x: 0, y: 0 }); + } + }; + + return ( + onMouseEnter?.()} + onMouseLeave={() => { + setIsDragging(false); + onMouseLeave?.(); + }} + onWheel={onWheel} + onMouseDown={handleMouseDown} + onMouseMove={handleMouseMove} + onMouseUp={handleMouseUp} + > + + + {children} + + {isZoomSupported && ( + + )} + + ); + } +); + +ScreenshareVideoTile.displayName = 'ScreenshareVideoTile'; + +export default ScreenshareVideoTile; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ScreenshareVideoTile/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ScreenshareVideoTile/index.tsx new file mode 100644 index 00000000..160d0640 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ScreenshareVideoTile/index.tsx @@ -0,0 +1,3 @@ +import ScreenshareVideoTile from './ScreenshareVideoTile'; + +export default ScreenshareVideoTile; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SendEmojiButton/SendEmojiButton.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SendEmojiButton/SendEmojiButton.tsx new file mode 100644 index 00000000..c448d9ec --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SendEmojiButton/SendEmojiButton.tsx @@ -0,0 +1,37 @@ +import { ReactElement } from 'react'; +import useSessionContext from '../../../hooks/useSessionContext'; +import useIsSmallViewport from '../../../hooks/useIsSmallViewport'; +import Button from '@mui/material/Button'; + +export type SendEmojiButtonProps = { + emoji: string; +}; + +/** + * SendEmojiButton Component + * + * Displays a clickable button to send emojis to all users in the meeting. + * @param {SendEmojiButtonProps} props - The props for the component. + * @returns {ReactElement} The SendEmojiButton component. + */ +const SendEmojiButton = ({ emoji }: SendEmojiButtonProps): ReactElement => { + const { sendEmoji } = useSessionContext(); + const isSmallViewport = useIsSmallViewport(); + const xs = isSmallViewport ? 2 : 3; + const size = isSmallViewport ? 'small' : 'large'; + + return ( +
        + +
        + ); +}; + +export default SendEmojiButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SendEmojiButton/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SendEmojiButton/index.tsx new file mode 100644 index 00000000..d0340283 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SendEmojiButton/index.tsx @@ -0,0 +1,3 @@ +import SendEmojiButton from './SendEmojiButton'; + +export default SendEmojiButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SmallViewportHeader/SmallViewportHeader.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SmallViewportHeader/SmallViewportHeader.spec.tsx new file mode 100644 index 00000000..c490c7c2 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SmallViewportHeader/SmallViewportHeader.spec.tsx @@ -0,0 +1,233 @@ +import { vi, describe, it, Mock, expect, beforeEach, beforeAll } from 'vitest'; +import { + makeMediaDeviceInfos, + makeMediaStreamMock, + setupWindowNavigatorMock, +} from '@web-test/fixtures'; +import { render as renderBase, screen, fireEvent, waitFor } from '@testing-library/react'; +import jwt from 'jsonwebtoken'; +import usePublisherContext from '@hooks/usePublisherContext'; +import { PublisherContextType } from '@Context/PublisherProvider'; +import mediaDevices$ from '@core/stores/devices'; +import { makeTestProvider, providers } from '@test/providers'; +import SmallViewportHeader from './SmallViewportHeader'; + +const { mockIsMobile } = vi.hoisted(() => ({ + mockIsMobile: vi.fn().mockReturnValue(false), +})); + +vi.mock('@hooks/usePublisherContext'); +vi.mock('@web/platform', async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + isMobile: mockIsMobile, + }; +}); + +const mockUsePublisherContext = usePublisherContext as Mock<[], PublisherContextType>; + +const devices = makeMediaDeviceInfos(); +const videoDevices = devices.filter((d) => d.kind === 'videoinput'); + +const mockSessionId = '1_MX4xMjM0NTY3OH4-VGh1IEZlYiAyNyAwODozMjozNCBQU1QgMjAyMH4wLjI0NDYxMjE'; +const mockedRoomName = 'test-room-name'; +const mockSessionKey: string = jwt.sign( + { sessionId: mockSessionId, roomName: mockedRoomName }, + 'test', + { + algorithm: 'HS256', + } +); + +describe('SmallViewportHeader component', () => { + let publisherContext: PublisherContextType; + + beforeAll(() => { + Object.assign(navigator, { + clipboard: { + writeText: vi.fn(), + }, + }); + + // Mock the native devices API + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + dispatchEvent: vi.fn().mockReturnValue(true), + enumerateDevices: Promise.resolve(devices), + getUserMedia: Promise.resolve( + makeMediaStreamMock({ + getVideoTracks: [], + getAudioTracks: [], + }) + ), + }, + }); + }); + + beforeEach(() => { + publisherContext = { + publisherContext: { cycleVideo: vi.fn() } as unknown as PublisherContextType['publisher'], + isVideoEnabled: true, + } as unknown as PublisherContextType; + + mockUsePublisherContext.mockReturnValue(publisherContext); + + // Initialize the store with video devices + mediaDevices$.setState((state) => ({ + ...state, + mediaDeviceInfo: devices, + })); + }); + + it('renders the room name', () => { + render(); + + expect(screen.getByText(mockedRoomName)).toBeInTheDocument(); + }); + + it('shows the recording icon if it is currently in progress', () => { + render(, { + initialValue: { archiveId: '123-456' }, + }); + + expect(screen.getByTestId('recordingIndicator')).toBeInTheDocument(); + }); + + it('does not show the recording icon if it there is not one happening', () => { + render(); + + expect(screen.queryByTestId('recordingIndicator')).not.toBeInTheDocument(); + }); + + it('copies room share URL to clipboard', async () => { + render(); + + const copyButton = screen.getByTestId('vivid-icon-copy-line'); + fireEvent.click(copyButton); + + await waitFor(() => { + expect(navigator.clipboard.writeText).toHaveBeenCalledWith( + expect.stringContaining(mockSessionKey) + ); + expect(screen.getByTestId('vivid-icon-check-sent-line')).toBeInTheDocument(); + }); + }); + + it('shows the camera switch button when video is enabled', () => { + mockUsePublisherContext.mockReturnValue({ + publisherContext: { cycleVideo: vi.fn() } as unknown as PublisherContextType['publisher'], + isVideoEnabled: true, + } as unknown as PublisherContextType); + + render(); + + expect(screen.getByTestId('vivid-icon-camera-switch-line')).toBeInTheDocument(); + }); + + it('does not show the camera switch button when video is disabled', () => { + mockUsePublisherContext.mockReturnValue({ + publisherContext: { cycleVideo: vi.fn() } as unknown as PublisherContextType['publisher'], + isVideoEnabled: false, + } as unknown as PublisherContextType); + + render(); + + expect(screen.queryByTestId('vivid-icon-camera-switch-line')).not.toBeInTheDocument(); + }); + + it('does not show the camera switch button when only one video input device is available', () => { + mockUsePublisherContext.mockReturnValue({ + publisherContext: { cycleVideo: vi.fn() } as unknown as PublisherContextType['publisher'], + isVideoEnabled: true, + } as unknown as PublisherContextType); + + // Set the store to have only one video device + const singleVideoDevice = videoDevices[0]; + + mediaDevices$.setState((state) => ({ + ...state, + mediaDeviceInfo: [...devices.filter((d) => d.kind !== 'videoinput'), singleVideoDevice], + })); + + render(); + + expect(screen.queryByTestId('vivid-icon-camera-switch-line')).not.toBeInTheDocument(); + + // Restore full device list for subsequent tests + mediaDevices$.setState((state) => ({ + ...state, + mediaDeviceInfo: devices, + })); + }); + + it('toggles to the opposite camera device when clicked', async () => { + const currentDeviceId = videoDevices[0].deviceId; + const targetDeviceId = videoDevices[1].deviceId; + + const mockTrack = { + getSettings: vi.fn(() => ({ deviceId: targetDeviceId })), + stop: vi.fn(), + } as unknown as MediaStreamTrack; + + const mockStream = makeMediaStreamMock({ + getVideoTracks: [mockTrack], + getTracks: [mockTrack], + }); + + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + dispatchEvent: vi.fn().mockReturnValue(true), + enumerateDevices: Promise.resolve(devices), + getUserMedia: Promise.resolve(mockStream), + }, + }); + + // Allow getFacingMode to run without throwing (requires mobile) + mockIsMobile.mockReturnValueOnce(true); + + const selectDeviceSpy = vi + .spyOn(mediaDevices$.actions, 'selectDevice') + .mockResolvedValue(undefined as never); + + mockUsePublisherContext.mockReturnValue({ + publisher: { + getVideoSource: vi.fn().mockReturnValue({ + track: { getSettings: () => ({ facingMode: 'user' }) } as unknown as MediaStreamTrack, + deviceId: currentDeviceId, + }), + } as unknown as PublisherContextType['publisher'], + isVideoEnabled: true, + } as unknown as PublisherContextType); + + render(); + + const cameraIcon = screen.getByTestId('vivid-icon-camera-switch-line'); + fireEvent.click(cameraIcon); + + await waitFor(() => { + expect(selectDeviceSpy).toHaveBeenCalledTimes(1); + expect(selectDeviceSpy).toHaveBeenCalledWith('videoinput', targetDeviceId); + }); + }); +}); + +function render( + component: React.ReactElement, + sessionContext?: { initialValue?: { sessionKey?: string; archiveId?: string | null } } +) { + const { wrapper } = makeTestProvider([providers.user, providers.session, providers.runtime], { + userContext: undefined, + sessionContext: { + initialValue: { + sessionKey: mockSessionKey, + ...sessionContext?.initialValue, + }, + }, + runtimeContext: undefined, + }); + + return renderBase(component, { wrapper }); +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SmallViewportHeader/SmallViewportHeader.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SmallViewportHeader/SmallViewportHeader.tsx new file mode 100644 index 00000000..b3e49280 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SmallViewportHeader/SmallViewportHeader.tsx @@ -0,0 +1,97 @@ +import { ReactElement, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import Box from '@mui/material/Box'; +import useSessionContext from '../../../hooks/useSessionContext'; +import useRoomShareUrl from '../../../hooks/useRoomShareUrl'; +import IconButton from '@mui/material/IconButton'; +import Tooltip from '@mui/material/Tooltip'; +import Fade from '@mui/material/Fade'; +import VividIcon from '@ui/VividIcon'; +import usePublisherContext from '@hooks/usePublisherContext'; +import RecordingIndicator from '../RecordingIndicator'; +import useDistinctLabelMediaDevices from '@ui/hooks/useDistinctLabelMediaDevices/useDistinctLabelMediaDevices'; +import { useSwitchCameraFacingModeHandler } from './hooks'; + +/** + * SmallViewportHeader Component + * + * This component shows a header bar in smaller viewport devices that consists of recording on/off indicator, + * meeting room name, and copy-to-clipboard button. + * @returns {ReactElement} The small viewport header component. + */ +const SmallViewportHeader = (): ReactElement => { + const { t } = useTranslation(); + const { archiveId, sessionDetails } = useSessionContext(); + const isRecording = !!archiveId; + + // Get preferred video input devices (cameras) + const videoInputDevices = useDistinctLabelMediaDevices('videoinput'); + + const roomShareUrl = useRoomShareUrl(); + const [isCopied, setIsCopied] = useState(false); + + const copyUrl = () => { + void navigator.clipboard.writeText(roomShareUrl); + + setIsCopied(true); + + // reset the icon back after a brief timeout + setTimeout(() => { + setIsCopied(false); + }, 3000); + }; + + const { isVideoEnabled } = usePublisherContext(); + + const { switchCameraFacingModeHandler } = useSwitchCameraFacingModeHandler(); + + return ( + + + {isRecording && } + + {sessionDetails?.roomName} + + + + {isVideoEnabled && videoInputDevices.length > 1 && ( + + + + + + )} + + + + + {isCopied ? ( + + ) : ( + + )} + + + + + + + ); +}; + +export default SmallViewportHeader; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SmallViewportHeader/hooks/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SmallViewportHeader/hooks/index.ts new file mode 100644 index 00000000..cbdb84c4 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SmallViewportHeader/hooks/index.ts @@ -0,0 +1 @@ +export { default as useSwitchCameraFacingModeHandler } from './useSwitchCameraFacingModeHandler'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SmallViewportHeader/hooks/useSwitchCameraFacingModeHandler.spec.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SmallViewportHeader/hooks/useSwitchCameraFacingModeHandler.spec.ts new file mode 100644 index 00000000..70e040cf --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SmallViewportHeader/hooks/useSwitchCameraFacingModeHandler.spec.ts @@ -0,0 +1,74 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { renderHook, act } from '@testing-library/react'; +import { mediaDevices$ } from '@core/stores'; +import { + makeMediaDeviceInfos, + makeMediaStreamMock, + setupWindowNavigatorMock, + frontCameraId, + rearCameraId, +} from '@web-test/fixtures'; +import useSwitchCameraFacingModeHandler from './useSwitchCameraFacingModeHandler'; + +const devices = makeMediaDeviceInfos(); + +const getUserMedia = vi.fn(() => + Promise.resolve( + makeMediaStreamMock({ + getVideoTracks: [ + { + getSettings: () => ({ deviceId: rearCameraId }), + } as unknown as MediaStreamTrack, + ], + getTracks: [{ stop: vi.fn() } as unknown as MediaStreamTrack], + }) + ) +); + +describe('useSwitchCameraFacingModeHandler', () => { + beforeEach(() => { + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + enumerateDevices: Promise.resolve(devices), + getUserMedia, + }, + }); + + mediaDevices$.reset(); + mediaDevices$.setState((state) => ({ + ...state, + videoinput: frontCameraId, // start with front camera selected + })); + }); + + it('switches camera to the target facing mode and updates selected videoinput', async () => { + expect.assertions(2); + + const { result } = renderHook(() => useSwitchCameraFacingModeHandler()); + + expect(mediaDevices$.getState().videoinput).toBe(frontCameraId); + + await act(async () => { + await result.current.switchCameraFacingModeHandler(); + }); + + expect(mediaDevices$.getState().videoinput).toBe(rearCameraId); + }); + + it('keeps current selection when target facing mode is unavailable', async () => { + expect.assertions(2); + + getUserMedia.mockRejectedValueOnce(new Error('OverconstrainedError')); + + const { result } = renderHook(() => useSwitchCameraFacingModeHandler()); + + expect(mediaDevices$.getState().videoinput).toBe(frontCameraId); + + await act(async () => { + await result.current.switchCameraFacingModeHandler(); + }); + + expect(mediaDevices$.getState().videoinput).toBe(frontCameraId); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SmallViewportHeader/hooks/useSwitchCameraFacingModeHandler.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SmallViewportHeader/hooks/useSwitchCameraFacingModeHandler.ts new file mode 100644 index 00000000..14607848 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SmallViewportHeader/hooks/useSwitchCameraFacingModeHandler.ts @@ -0,0 +1,120 @@ +import { attempt, tryCatch } from '@common/execution'; +import { FacingMode } from '@common/types'; +import { makeApplicationErrorMapper } from '@core/errors'; +import { mediaDevices$ } from '@core/stores'; +import useSelectDeviceHandler from '@hooks/useSelectDeviceHandler'; +import { handleClientApplicationError } from '@ui/helpers'; +import { useStableCallback } from '@web/hooks'; +import { t } from 'i18next'; + +/** + * Safely switch camera facing mode by attempting to get a new media stream with the desired facing mode constraint + */ +const useSwitchCameraFacingModeHandler = () => { + const { handleSelectDevice } = useSelectDeviceHandler(); + + const switchCameraFacingModeHandler = useStableCallback(async () => { + const { videoinput: currentDeviceId } = mediaDevices$.getState(); + const { videoinput: videoinputDevices } = mediaDevices$.mediaDevicesMap$.getState(); + + const { inferredFacingMode: currentFacingMode } = videoinputDevices[currentDeviceId!] || {}; + + const targetFacingMode = + currentFacingMode === FacingMode.user ? FacingMode.environment : FacingMode.user; + + try { + let { result: mediaStream, error } = await tryCatch(() => + navigator.mediaDevices.getUserMedia({ + video: { + facingMode: { + exact: targetFacingMode, + }, + }, + }) + ); + + let targetDeviceLabel: string = 'unknown'; + + if (!mediaStream) { + const videoInputDevices = Object.values(videoinputDevices); + + // try to get a stream by device id as fallback + const targetDevice = videoInputDevices.find( + ({ inferredFacingMode, deviceId }) => + inferredFacingMode === targetFacingMode && deviceId !== currentDeviceId + ); + + if (!targetDevice) { + throw makeApplicationErrorMapper( + t('devices.video.camera.noDeviceError', { + facingMode: targetFacingMode, + }) + )(null); + } + + targetDeviceLabel = targetDevice.label; + + ({ result: mediaStream, error } = await tryCatch(() => + navigator.mediaDevices.getUserMedia({ + video: { + deviceId: targetDevice.deviceId, + }, + }) + )); + } + + if (error || !mediaStream) { + const applicationError = makeApplicationErrorMapper( + t('devices.video.camera.accessError', { + facingMode: targetFacingMode, + }) + )(error); + + if (targetDeviceLabel) { + applicationError.add( + t('devices.video.camera.selectedDevice', { + deviceName: targetDeviceLabel, + }) + ); + } + + throw applicationError; + } + + const [track] = mediaStream.getVideoTracks(); + const deviceId = track?.getSettings().deviceId; + + attempt(() => mediaStream?.getTracks().forEach((track) => track.stop())); + + if (!deviceId) { + throw makeApplicationErrorMapper( + t('devices.video.camera.noTrackError', { + facingMode: targetFacingMode, + }) + )(null); + } + + await handleSelectDevice({ mediaDeviceKind: 'videoinput', deviceId }); + } catch (error) { + const facingModeLabel = + targetFacingMode === FacingMode.user + ? t('devices.video.camera.front') + : t('devices.video.camera.rear'); + + const fallbackMessage = t('devices.video.camera.switchError', { + facingMode: facingModeLabel, + }); + + handleClientApplicationError(fallbackMessage, error); + } + }); + + return { + /** + * Handler to switch camera facing mode. + */ + switchCameraFacingModeHandler, + }; +}; + +export default useSwitchCameraFacingModeHandler; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SmallViewportHeader/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SmallViewportHeader/index.tsx new file mode 100644 index 00000000..053afd7c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/SmallViewportHeader/index.tsx @@ -0,0 +1,3 @@ +import SmallViewportHeader from './SmallViewportHeader'; + +export default SmallViewportHeader; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/TimeRoomName/TimeRoomName.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/TimeRoomName/TimeRoomName.tsx new file mode 100644 index 00000000..697f87cc --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/TimeRoomName/TimeRoomName.tsx @@ -0,0 +1,32 @@ +import { ReactElement } from 'react'; +import useDateTime from '../../../hooks/useDateTime'; +import useSessionContext from '../../../hooks/useSessionContext'; +import Box from '@mui/material/Box'; + +/** + * TimeRoomName Component + * + * This component shows the current time and room name. + * @returns {ReactElement} - The Time and Room Name component. + */ +const TimeRoomName = (): ReactElement => { + const { time } = useDateTime(); + const { sessionDetails } = useSessionContext(); + + return ( + + {time} | {sessionDetails?.roomName} + + ); +}; + +export default TimeRoomName; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/TimeRoomName/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/TimeRoomName/index.tsx new file mode 100644 index 00000000..62c6901f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/TimeRoomName/index.tsx @@ -0,0 +1,3 @@ +import TimeRoomName from './TimeRoomName'; + +export default TimeRoomName; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Toolbar/Toolbar.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Toolbar/Toolbar.spec.tsx new file mode 100644 index 00000000..851184fc --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Toolbar/Toolbar.spec.tsx @@ -0,0 +1,140 @@ +import { describe, expect, it, vi, beforeEach, Mock, afterAll } from 'vitest'; +import { render as renderBase, screen } from '@testing-library/react'; +import { useLocation } from 'react-router-dom'; +import { ReactElement } from 'react'; +import useSpeakingDetector from '@hooks/useSpeakingDetector'; +import isReportIssueEnabled from '@utils/isReportIssueEnabled'; +import useToolbarButtons, { + UseToolbarButtons, + UseToolbarButtonsProps, +} from '@hooks/useToolbarButtons'; +import { RIGHT_PANEL_BUTTON_COUNT } from '@utils/constants'; +import { makeTestProvider, providers } from '@test/providers'; +import { env } from '../../../env'; +import Toolbar, { ToolbarProps, CaptionsState } from './Toolbar'; + +const mockedRoomName = { roomName: 'test-room-name' }; + +vi.mock('react-router-dom', () => ({ + useNavigate: vi.fn(), + useLocation: vi.fn(), + useParams: () => mockedRoomName, +})); + +vi.mock('@hooks/useSpeakingDetector'); +vi.mock('@utils/isReportIssueEnabled'); +vi.mock('@hooks/useToolbarButtons'); + +const mockUseSpeakingDetector = useSpeakingDetector as Mock<[], boolean>; +const mockIsReportIssueEnabled = isReportIssueEnabled as Mock<[], boolean>; +const mockUseToolbarButtons = useToolbarButtons as Mock< + [UseToolbarButtonsProps], + UseToolbarButtons +>; + +describe('Toolbar', () => { + beforeEach(() => { + env.reset(); + (useLocation as Mock).mockReturnValue({ + state: mockedRoomName, + }); + mockUseSpeakingDetector.mockReturnValue(false); + mockIsReportIssueEnabled.mockReturnValue(false); + mockUseToolbarButtons.mockImplementation( + ({ numberOfToolbarButtons }: UseToolbarButtonsProps) => { + const renderedToolbarButtons: UseToolbarButtons = { + displayTimeRoomName: true, + centerButtonLimit: numberOfToolbarButtons - RIGHT_PANEL_BUTTON_COUNT, + rightButtonLimit: numberOfToolbarButtons, + }; + return renderedToolbarButtons; + } + ); + }); + + afterAll(() => { + env.reset(); + vi.restoreAllMocks(); + vi.unstubAllEnvs(); + }); + + const defaultProps: ToolbarProps = { + toggleShareScreen: vi.fn(), + isSharingScreen: false, + rightPanelActiveTab: 'closed', + toggleParticipantList: vi.fn(), + toggleChat: vi.fn(), + toggleReportIssue: vi.fn(), + toggleBackgroundEffects: vi.fn(), + participantCount: 0, + captionsState: { + isUserCaptionsEnabled: false, + setIsUserCaptionsEnabled: vi.fn(), + setCaptionsErrorResponse: vi.fn(), + } as CaptionsState, + }; + + it('does not render the Report Issue button if it is configured to be disabled', () => { + render(); + expect(screen.queryByTestId('report-issue-button')).not.toBeInTheDocument(); + }); + + it('renders the Report Issue button if it is configured to be enabled', () => { + mockIsReportIssueEnabled.mockReturnValue(true); + render(); + expect(screen.getByTestId('report-issue-button')).toBeInTheDocument(); + }); + + it('on a small viewport, displays the ToolbarOverflowButton button', () => { + mockUseToolbarButtons.mockReturnValue({ + displayTimeRoomName: false, + centerButtonLimit: 0, + rightButtonLimit: 0, + }); + + render(); + + expect(screen.queryByTestId('hidden-toolbar-items')).toBeVisible(); + + expect(screen.queryByTestId('archiving-button')).not.toBeVisible(); + expect(screen.queryByTestId('screensharing-button')).not.toBeVisible(); + expect(screen.queryByTestId('archiving-button')).not.toBeVisible(); + expect(screen.queryByTestId('emoji-grid-button')).not.toBeVisible(); + }); + + it('on a normal viewport, displays all of the toolbar buttons', () => { + env.partialUpdate({ MEETING_ROOM_ALLOW_ADVANCED_SETTINGS: true }); + render( + + ); + expect(screen.queryByTestId('archiving-button')).toBeVisible(); + expect(screen.queryByTestId('advanced-settings-button')).toBeVisible(); + expect(screen.queryByTestId('screensharing-button')).toBeVisible(); + expect(screen.queryByTestId('emoji-grid-button')).toBeVisible(); + expect(screen.queryByTestId('captions-button')).toBeVisible(); + }); + + it('does not render advanced settings when the flag is disabled', () => { + env.partialUpdate({ MEETING_ROOM_ALLOW_ADVANCED_SETTINGS: false }); + render(); + + expect(screen.queryByTestId('advanced-settings-button')).not.toBeInTheDocument(); + }); +}); + +function render(ui: ReactElement) { + const { wrapper, ...context } = makeTestProvider([providers.runtime]); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Toolbar/Toolbar.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Toolbar/Toolbar.tsx new file mode 100644 index 00000000..fe934369 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Toolbar/Toolbar.tsx @@ -0,0 +1,231 @@ +import { Dispatch, ReactElement, SetStateAction, useCallback, useRef, useState } from 'react'; +import useSessionContext from '@hooks/useSessionContext'; +import { RightPanelActiveTab } from '@hooks/useRightPanel'; +import isReportIssueEnabled from '@utils/isReportIssueEnabled'; +import useToolbarButtons from '@hooks/useToolbarButtons'; +import useBackgroundPublisherContext from '@hooks/useBackgroundPublisherContext'; +import Box from '@mui/material/Box'; +import { env } from '../../../env'; +import ScreenSharingButton from '../../ScreenSharingButton'; +import TimeRoomNameMeetingRoom from '../TimeRoomName'; +import ExitButton from '../ExitButton'; +import LayoutButton from '../LayoutButton'; +import ParticipantListButton from '../ParticipantListButton'; +import ArchivingButton from '../ArchivingButton'; +import CaptionsButton from '../CaptionsButton'; +import ChatButton from '../ChatButton'; +import ReportIssueButton from '../ReportIssueButton'; +import AdvancedSettingsButton from '../AdvancedSettingsButton'; +import ToolbarOverflowButton from '../ToolbarOverflowButton'; +import EmojiGridButton from '../EmojiGridButton'; +import DeviceControlButton from '../DeviceControlButton'; + +export type CaptionsState = { + isUserCaptionsEnabled: boolean; + setIsUserCaptionsEnabled: Dispatch>; + setCaptionsErrorResponse: Dispatch>; +}; + +export type ToolbarProps = { + toggleShareScreen: () => void; + isSharingScreen: boolean; + rightPanelActiveTab: RightPanelActiveTab; + toggleParticipantList: () => void; + toggleBackgroundEffects: () => void; + toggleChat: () => void; + toggleReportIssue: () => void; + participantCount: number; + captionsState: CaptionsState; +}; + +/** + * Toolbar Component + * + * This component returns the UI for the toolbar that is displayed on the bottom of the meeting room. + * It displays the following items: + * - The current time and meeting room name + * - The microphone state with the ability to toggle it on/off and open a drop-down with some audio settings + * - The video state with the ability to toggle it on/off and open a dropdown with some video effects + * - Screensharing button (only on desktop devices) + * - Button to toggle current layout (grid or active speaker) + * - Button to express yourself (emojis) + * - Button to toggle captions on and off + * - Button to open a pop-up to start meeting recording (archiving) + * - Button containing hidden toolbar items when the viewport is narrow + * - Button to exit a meeting (redirects to the goodbye page) + * @param {ToolbarProps} props - the props for the component + * @property {() => void} toggleScreenShare - the prop to toggle the screen share on and off + * @property {boolean} isSharingScreen - the prop to check if the user is currently sharing a screen + * @property {boolean} isParticipantListOpen - the prop to check if the participant list is open + * @property {() => void} openParticipantList - the prop to open the participant list + * @property {CaptionsState} captionsState - the state of the captions, including whether they are enabled and a function to set an error message + * @returns {ReactElement} - the toolbar component + */ +const Toolbar = ({ + isSharingScreen, + toggleShareScreen, + rightPanelActiveTab, + toggleParticipantList, + toggleBackgroundEffects, + toggleChat, + toggleReportIssue, + participantCount, + captionsState, +}: ToolbarProps): ReactElement => { + const { disconnect, subscriberWrappers } = useSessionContext(); + const { destroyBackgroundPublisher } = useBackgroundPublisherContext(); + const isViewingScreenShare = subscriberWrappers.some((subWrapper) => subWrapper.isScreenshare); + const isScreenSharePresent = isViewingScreenShare || isSharingScreen; + const isPinningPresent = subscriberWrappers.some((subWrapper) => subWrapper.isPinned); + const handleLeave = useCallback(() => { + if (!disconnect) { + return; + } + disconnect(); + destroyBackgroundPublisher(); + }, [destroyBackgroundPublisher, disconnect]); + const [openEmojiGridDesktop, setOpenEmojiGridDesktop] = useState(false); + + // An array of buttons available for the toolbar. As the toolbar resizes, buttons may be hidden and moved to the + // ToolbarOverflowMenu to ensure a responsive layout without compromising usability. + const toolbarButtons: Array = [ + , + , + , + , + , + env.MEETING_ROOM_ALLOW_ADVANCED_SETTINGS && ( + + ), + isReportIssueEnabled() && ( + + ), + , + , + ]; + // We track the toolbar and the accompanying containers so we know which toolbar buttons to display, and whether the TimeRoomName should be displayed + const toolbarRef = useRef(null); + const timeRoomNameRef = useRef(null); + const mediaControlsRef = useRef(null); + const rightPanelControlsRef = useRef(null); + const overflowAndExitRef = useRef(null); + + const { displayTimeRoomName, centerButtonLimit, rightButtonLimit } = useToolbarButtons({ + timeRoomNameRef, + toolbarRef, + mediaControlsRef, + overflowAndExitRef, + rightPanelControlsRef, + numberOfToolbarButtons: toolbarButtons.length, + }); + + const toolbarButtonsDisplayed = rightButtonLimit; + // We display the overflow button when we don't have enough space to display all the toolbar buttons + const shouldShowOverflowButton = toolbarButtonsDisplayed < toolbarButtons.length; + const displayCenterToolbarButtons = (toolbarButton: ReactElement | false, index: number) => + index < centerButtonLimit && toolbarButton; + // Displays the right panel buttons - any additional buttons to be displayed that aren't in the center of the toolbar. + const displayRightPanelButtons = (toolbarButton: ReactElement | false, index: number) => + index >= centerButtonLimit && index < rightButtonLimit && toolbarButton; + // Array of `false` or right panel button ReactElements to display. + const rightPanelButtons = toolbarButtons.map(displayRightPanelButtons); + // We display the right panel if we have at least one right panel button to display. + const displayRightPanel = rightPanelButtons.some((rightPanelButton) => !!rightPanelButton); + + return ( + + + {displayTimeRoomName && } + + + + + + + {toolbarButtons.map(displayCenterToolbarButtons)} + + {shouldShowOverflowButton && ( + + )} + + + + + {rightPanelButtons} + + + ); +}; + +export default Toolbar; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Toolbar/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Toolbar/index.tsx new file mode 100644 index 00000000..e0203f05 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/Toolbar/index.tsx @@ -0,0 +1,3 @@ +import Toolbar from './Toolbar'; + +export default Toolbar; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ToolbarButton/ToolbarButton.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ToolbarButton/ToolbarButton.tsx new file mode 100644 index 00000000..8a2fc1ff --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ToolbarButton/ToolbarButton.tsx @@ -0,0 +1,51 @@ +import { ForwardedRef, forwardRef, ReactElement } from 'react'; +import classNames from 'classnames'; +import { IconButton, IconButtonProps } from '@mui/material'; +import { twMerge } from 'tailwind-merge'; + +export type ToolbarButtonProps = IconButtonProps & { + icon: ReactElement; + isOverflowButton?: boolean; +}; + +/** + * ToolbarButton Component + * A common component for toolbar buttons to share styling. + * @param {ToolbarButtonProps} props - props for the component + * @property {Function} onClick - on click handler + * @property {ReactElement} icon - MUI Icon for button + * @property {SxProps} sx - (optional) MUI style object + * @property {string} id - (optional) the data-testid used in unit tests + * @property {boolean} isOverflowButton - (optional) whether the button is in the ToolbarOverflowMenu + * @returns {ReactElement} + */ +const ToolbarButton = forwardRef(function ToolbarButton( + props: ToolbarButtonProps, + ref: ForwardedRef +) { + const { className, icon: Icon, sx = {}, isOverflowButton, ...rest } = props; + + return ( + + {Icon} + + ); +}); + +export default ToolbarButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ToolbarButton/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ToolbarButton/index.tsx new file mode 100644 index 00000000..02c8b171 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ToolbarButton/index.tsx @@ -0,0 +1,3 @@ +import ToolbarButton from './ToolbarButton'; + +export default ToolbarButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ToolbarOverflowButton/ToolbarOverflowButton.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ToolbarOverflowButton/ToolbarOverflowButton.spec.tsx new file mode 100644 index 00000000..3347e1ff --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ToolbarOverflowButton/ToolbarOverflowButton.spec.tsx @@ -0,0 +1,106 @@ +import { describe, expect, it, vi, afterEach } from 'vitest'; +import { act, render as renderBase, screen, cleanup } from '@testing-library/react'; +import { ReactElement } from 'react'; +import { makeTestProvider, providers, type ProviderOptions } from '@test/providers'; +import ToolbarOverflowButton from './ToolbarOverflowButton'; +import { + ToolbarOverflowMenuProps, + CaptionsState, +} from '../ToolbarOverflowMenu/ToolbarOverflowMenu'; + +vi.mock('@hooks/useRoomName'); +describe('ToolbarOverflowButton', () => { + const mockSetLayoutMode = vi.fn(); + afterEach(() => { + cleanup(); + vi.clearAllMocks(); + }); + const defaultProps: ToolbarOverflowMenuProps = { + toggleShareScreen: vi.fn(), + isSharingScreen: false, + toolbarButtonsCount: 0, + isEmojiGridOpen: false, + setIsEmojiGridOpen: vi.fn(), + closeMenu: vi.fn(), + isOpen: false, + captionsState: { + isUserCaptionsEnabled: false, + setIsUserCaptionsEnabled: vi.fn(), + setCaptionsErrorResponse: vi.fn(), + } as CaptionsState, + }; + it('renders', () => { + render(, { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.subscriberWrappers = []; + context.layoutMode = 'grid'; + context.setLayoutMode = mockSetLayoutMode; + context.unreadCount = 0; + } + }, + }, + }); + expect(screen.queryByTestId('hidden-toolbar-items')).toBeInTheDocument(); + }); + it('toggling shows and hides the toolbar buttons', () => { + render(, { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.subscriberWrappers = []; + context.layoutMode = 'grid'; + context.setLayoutMode = mockSetLayoutMode; + context.unreadCount = 0; + } + }, + }, + }); + expect(screen.queryByTestId('layout-button')).not.toBeVisible(); + expect(screen.queryByTestId('emoji-grid-button')).not.toBeVisible(); + expect(screen.queryByTestId('archiving-button')).not.toBeVisible(); + act(() => { + screen.getByTestId('hidden-toolbar-items').click(); + }); + expect(screen.queryByTestId('layout-button')).toBeVisible(); + expect(screen.queryByTestId('emoji-grid-button')).toBeVisible(); + expect(screen.queryByTestId('archiving-button')).toBeVisible(); + }); + it('should have the unread messages badge present', () => { + render(, { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.subscriberWrappers = []; + context.layoutMode = 'grid'; + context.setLayoutMode = mockSetLayoutMode; + context.unreadCount = 0; + } + }, + }, + }); + // We expect the ChatButton in the ToolbarOverflowMenu and the ToolbarOverflowButton to have an unread messages badge present + expect(screen.queryAllByTestId('chat-button-unread-count').length).toBe(2); + }); +}); +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; + sessionContext?: ProviderOptions['SessionContext']; +}; + +function render(ui: ReactElement, { userContext, sessionContext }: RenderOptions = {}) { + const { wrapper, ...context } = makeTestProvider( + [providers.user, providers.session, providers.runtime], + { + userContext, + sessionContext, + runtimeContext: undefined, + } + ); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ToolbarOverflowButton/ToolbarOverflowButton.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ToolbarOverflowButton/ToolbarOverflowButton.tsx new file mode 100644 index 00000000..2fa48785 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ToolbarOverflowButton/ToolbarOverflowButton.tsx @@ -0,0 +1,99 @@ +import { Dispatch, ReactElement, useState, SetStateAction } from 'react'; +import Tooltip from '@mui/material/Tooltip'; +import VividIcon from '@ui/VividIcon'; +import { useTranslation } from 'react-i18next'; +import ToolbarButton from '../ToolbarButton'; +import ToolbarOverflowMenu from '../ToolbarOverflowMenu'; +import UnreadMessagesBadge from '../UnreadMessagesBadge'; + +export type CaptionsState = { + isUserCaptionsEnabled: boolean; + setIsUserCaptionsEnabled: Dispatch>; + setCaptionsErrorResponse: Dispatch>; +}; + +export type ToolbarOverflowButtonProps = { + toggleShareScreen: () => void; + isSharingScreen: boolean; + toolbarButtonsCount: number; + captionsState: CaptionsState; +}; + +/** + * ToolbarOverflowButton Component + * + * Displays a clickable button that opens a grid of hidden toolbar buttons for smaller viewports. There + * is also an unread chat messages indicator that is shown when there are messages to be read. + * @param {ToolbarOverflowButtonProps} props - the props for the component + * @property {Function} toggleShareScreen - toggles the user's screenshare + * @property {boolean} isSharingScreen - whether the user is sharing their screen + * @property {number} toolbarButtonsCount - number of buttons displayed on the toolbar + * @property {CaptionsState} captionsState - the state of the captions, including whether they are enabled and functions to set error messages + * @returns {ReactElement} - The ToolbarOverflowButton Component. + */ +const ToolbarOverflowButton = ({ + toggleShareScreen, + isSharingScreen, + toolbarButtonsCount, + captionsState, +}: ToolbarOverflowButtonProps): ReactElement => { + const { t } = useTranslation(); + const [isToolbarOverflowMenuOpen, setIsToolbarOverflowMenuOpen] = useState(false); + const [openEmojiGridMobile, setOpenEmojiGridMobile] = useState(true); + + const handleButtonToggle = () => { + setIsToolbarOverflowMenuOpen((prevOpen) => !prevOpen); + }; + + const handleClickAway = (event?: MouseEvent | TouchEvent) => { + if (event) { + const target = event.target as HTMLElement; + if (target.closest('#hidden-toolbar-items')) { + return; + } + } + setIsToolbarOverflowMenuOpen(false); + }; + + return ( + <> + + + + } + sx={{ + marginRight: '0px', + width: '48px', + }} + /> + + + + + ); +}; + +export default ToolbarOverflowButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ToolbarOverflowButton/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ToolbarOverflowButton/index.tsx new file mode 100644 index 00000000..f323624f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ToolbarOverflowButton/index.tsx @@ -0,0 +1,3 @@ +import ToolbarOverflowButton from './ToolbarOverflowButton'; + +export default ToolbarOverflowButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ToolbarOverflowMenu/ToolbarOverflowMenu.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ToolbarOverflowMenu/ToolbarOverflowMenu.spec.tsx new file mode 100644 index 00000000..9395b869 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/MeetingRoom/ToolbarOverflowMenu/ToolbarOverflowMenu.spec.tsx @@ -0,0 +1,146 @@ +import { afterEach, beforeEach, describe, expect, it, Mock, vi } from 'vitest'; +import { render as renderBase, screen } from '@testing-library/react'; +import { ReactElement, useRef } from 'react'; +import userEvent from '@testing-library/user-event'; +import { isMobile } from '@web/platform'; +import isReportIssueEnabled from '@utils/isReportIssueEnabled'; +import { makeTestProvider, providers, ProviderOptions } from '@test/providers'; +import { env } from '../../../env'; +import ToolbarOverflowMenu, { CaptionsState } from './ToolbarOverflowMenu'; +import Button from '@mui/material/Button'; + +vi.mock('@hooks/useRoomName'); +vi.mock('@web/platform'); +vi.mock('@utils/isReportIssueEnabled'); + +const mockOpenEmojiGrid = vi.fn(); +const mockHandleClickAway = vi.fn(); +const mockIsReportIssueEnabled = isReportIssueEnabled as Mock<[], boolean>; + +const mockCaptionsState = { + isUserCaptionsEnabled: false, + setIsUserCaptionsEnabled: vi.fn(), + setCaptionsErrorResponse: vi.fn(), +} as CaptionsState; + +const TestComponent = ({ defaultOpen = false }: { defaultOpen?: boolean }) => { + const anchorRef = useRef(null); + + return ( + <> + + ); +}; + +export default NewRoomButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/NewRoomButton/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/NewRoomButton/index.tsx new file mode 100644 index 00000000..bce9415d --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/NewRoomButton/index.tsx @@ -0,0 +1,3 @@ +import NewRoomButton from './NewRoomButton'; + +export default NewRoomButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Publisher/Publisher.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Publisher/Publisher.tsx new file mode 100644 index 00000000..a5c3f0ab --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Publisher/Publisher.tsx @@ -0,0 +1,103 @@ +import { ReactElement, useEffect, useRef } from 'react'; +import { Box } from 'opentok-layout-js'; +import usePublisherContext from '../../hooks/usePublisherContext'; +import VoiceIndicatorIcon from '../MeetingRoom/VoiceIndicator'; +import useAudioLevels from '../../hooks/useAudioLevels'; +import AvatarInitials from '../AvatarInitials'; +import NameDisplay from '../MeetingRoom/NameDisplay'; +import AudioIndicator from '../MeetingRoom/AudioIndicator'; +import VideoTile from '../MeetingRoom/VideoTile'; +import { ABSOLUTE_DISTANCE_THRESHOLD_REM_VALUE } from '@utils/constants'; +import toRemValue from '@common/helpers/toRemValue'; + +export type PublisherProps = { + box: Box; +}; + +/** + * Publisher component + * + * This component renders a VideoTile with Publisher video and an overlay. + * It consists of a video stream, initials, a publisher speaking indicator, and the user's name. + * @param {PublisherProps} props - the props for the component + * @property {Box} box - the box in which the component is displayed + * @returns {ReactElement} The publisher component. + */ +const Publisher = ({ box }: PublisherProps): ReactElement => { + const { + publisherVideoElement: element, + isVideoEnabled, + publisher, + isAudioEnabled, + } = usePublisherContext(); + const audioLevel = useAudioLevels(); + // We store this in a ref to get a reference to the div so that we can append a video to it + const pubContainerRef = useRef(null); + useEffect(() => { + if (element && pubContainerRef.current) { + element.classList.add('video__element', 'rounded-vera-large'); + + // eslint-disable-next-line react-hooks/immutability + element.style.width = '100%'; + element.style.height = '100%'; + element.style.position = 'absolute'; + element.style.objectFit = 'contain'; + element.style.transformOrigin = '50% 50%'; // origin-[50%_50%] + element.style.transform = 'scaleX(-1)'; // -scale-x-100 (mirror the publisher) + + pubContainerRef.current.appendChild(element); + } + }, [element]); + + const initials = publisher?.stream?.initials; + const username = publisher?.stream?.name ?? ''; + const hasVideo = isVideoEnabled && !!element; + const audioIndicatorStyle: React.CSSProperties = { + position: 'absolute', + top: toRemValue(ABSOLUTE_DISTANCE_THRESHOLD_REM_VALUE), + right: toRemValue(ABSOLUTE_DISTANCE_THRESHOLD_REM_VALUE), + height: '1.5rem', + width: '1.5rem', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + margin: 'auto', + }; + + return ( + + {!hasVideo && ( + + )} + {isAudioEnabled ? ( + + ) : ( + + )} + + + ); +}; + +export default Publisher; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Publisher/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Publisher/index.tsx new file mode 100644 index 00000000..62f94ed5 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Publisher/index.tsx @@ -0,0 +1,3 @@ +import Publisher from './Publisher'; + +export default Publisher; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RedirectToUnsupportedBrowserPage/RedirectToUnsupportedBrowserPage.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RedirectToUnsupportedBrowserPage/RedirectToUnsupportedBrowserPage.spec.tsx new file mode 100644 index 00000000..570280a6 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RedirectToUnsupportedBrowserPage/RedirectToUnsupportedBrowserPage.spec.tsx @@ -0,0 +1,51 @@ +import { describe, it, expect, vi, Mock } from 'vitest'; +import { checkSystemRequirements } from '@vonage/client-sdk-video'; +import { render } from '@testing-library/react'; +import { Route, Routes } from 'react-router-dom'; +import MemoryRouter from '@test/RouterWrapper'; +import RedirectToUnsupportedBrowserPage from './RedirectToUnsupportedBrowserPage'; + +vi.mock('@vonage/client-sdk-video', () => ({ checkSystemRequirements: vi.fn() })); + +describe('RedirectToUnsupportedBrowserPage', () => { + const supportedText = 'You have arrived'; + const unsupportedText = 'Your browser is unsupported'; + const TestComponent = () =>
        {supportedText}
        ; + + it('for unsupported browsers, redirects to the unsupported browser page', () => { + // Mocking an unsupported browser + (checkSystemRequirements as Mock).mockReturnValue(0); + + const { getByText } = render( + + + {unsupportedText}
        } /> + + }> + } /> + + + + ); + + expect(getByText(unsupportedText)).toBeInTheDocument(); + }); + + it('for supported browsers, navigates to your destination', () => { + // Mocking a supported browser + (checkSystemRequirements as Mock).mockReturnValue(1); + + const { getByText } = render( + + + {unsupportedText}
        } /> + }> + } /> + + + + ); + + expect(getByText(supportedText)).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RedirectToUnsupportedBrowserPage/RedirectToUnsupportedBrowserPage.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RedirectToUnsupportedBrowserPage/RedirectToUnsupportedBrowserPage.tsx new file mode 100644 index 00000000..0ef79d30 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RedirectToUnsupportedBrowserPage/RedirectToUnsupportedBrowserPage.tsx @@ -0,0 +1,17 @@ +import { ReactElement } from 'react'; +import { Navigate, Outlet } from 'react-router-dom'; +import { checkSystemRequirements } from '@vonage/client-sdk-video'; + +/** + * This component checks whether the user's browser is supported by the Vonage Video API. + * If the browser is unsupported, users are redirected to the unsupported browser page. + * @param {RedirectToUnsupportedBrowserPageProps} props - The props for this component. + * @returns {ReactElement} - The redirect to unsupported browser page component. + */ +const RedirectToUnsupportedBrowserPage = (): ReactElement => { + const isSupportedBrowser = checkSystemRequirements() === 1; + + return isSupportedBrowser ? : ; +}; + +export default RedirectToUnsupportedBrowserPage; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RedirectToUnsupportedBrowserPage/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RedirectToUnsupportedBrowserPage/index.tsx new file mode 100644 index 00000000..c6ae1aef --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RedirectToUnsupportedBrowserPage/index.tsx @@ -0,0 +1,3 @@ +import RedirectToUnsupportedBrowserPage from './RedirectToUnsupportedBrowserPage'; + +export default RedirectToUnsupportedBrowserPage; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RedirectToWaitingRoom/RedirectToWaitingRoom.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RedirectToWaitingRoom/RedirectToWaitingRoom.spec.tsx new file mode 100644 index 00000000..4ba62789 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RedirectToWaitingRoom/RedirectToWaitingRoom.spec.tsx @@ -0,0 +1,108 @@ +import { describe, it, expect, vi } from 'vitest'; + +import { render } from '@testing-library/react'; +import { Route, Routes } from 'react-router-dom'; +import MemoryRouter from '@test/RouterWrapper'; +import { ReactElement } from 'react'; +import { env } from '../../env'; +import RedirectToWaitingRoom from './RedirectToWaitingRoom'; + +const mockedParams = { roomIdentifier: 'test-room-name' }; + +vi.mock('react-router-dom', async () => { + const mod = await vi.importActual('react-router-dom'); + return { + ...mod, + useParams: () => mockedParams, + }; +}); + +describe('RedirectToWaitingRoom Component', () => { + const TestComponent = (): ReactElement =>
        TestComponent
        ; + + it('navigates to the waiting room if the user does not have access', () => { + env.BYPASS_WAITING_ROOM = false; + + const { container } = render( + + + In waiting room
        } /> + + + + } + /> + + + ); + + expect(container.textContent).toBe('In waiting room'); + }); + + it('navigates to the waiting room if the user does not have access by setting bypass to false', () => { + env.BYPASS_WAITING_ROOM = false; + + const { container } = render( + + + In waiting room
        } /> + + + + } + /> + + + ); + + expect(container.textContent).toBe('In waiting room'); + }); + + it('renders the child component if the user set bypass to true', () => { + env.BYPASS_WAITING_ROOM = false; + + const { getByText } = render( + + + + + + ); + + expect(getByText('TestComponent')).toBeInTheDocument(); + }); + + it('renders the child component if the user set BYPASS_WAITING_ROOM to true', () => { + env.BYPASS_WAITING_ROOM = true; + + const { getByText } = render( + + + + + + ); + + expect(getByText('TestComponent')).toBeInTheDocument(); + }); + + it('renders the child component if the user has access', () => { + env.BYPASS_WAITING_ROOM = false; + + const { getByText } = render( + + + + + + ); + + expect(getByText('TestComponent')).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RedirectToWaitingRoom/RedirectToWaitingRoom.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RedirectToWaitingRoom/RedirectToWaitingRoom.tsx new file mode 100644 index 00000000..8f6207e5 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RedirectToWaitingRoom/RedirectToWaitingRoom.tsx @@ -0,0 +1,39 @@ +import { ReactElement } from 'react'; +import { Navigate, useLocation } from 'react-router-dom'; +import useSessionKeyParam from '../../hooks/useSessionKeyParam'; +import { env } from '../../env'; + +export type RedirectToWaitingRoomProps = { + children: ReactElement; +}; + +/** + * This component checks whether user should be redirected to the waiting room, or + * be taken directly to the meeting room. + * Users can bypass being redirected to the waiting room by adding ?bypass=true + * to the URL. Developers can bypass the waiting room by adding BYPASS_WAITING_ROOM=true in the frontend/.env file + * @param {RedirectToWaitingRoomProps} props - the props for this component. + * @property {ReactElement} children - the react elements to render if the user has access to the meeting room. + * @returns {ReactElement} - the redirect to waiting room component. + */ +const RedirectToWaitingRoom = ({ children }: RedirectToWaitingRoomProps): ReactElement => { + const location = useLocation(); + const { sessionKey } = useSessionKeyParam(); + const hasAccess = !!location.state?.hasAccess; + + const searchParams = new URLSearchParams(location.search); + const bypass = searchParams.get('bypass') === 'true' || env.BYPASS_WAITING_ROOM; + const mustEnterWaitingRoom = !hasAccess && !bypass; + + return mustEnterWaitingRoom ? ( + + ) : ( + children + ); +}; + +export default RedirectToWaitingRoom; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RedirectToWaitingRoom/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RedirectToWaitingRoom/index.tsx new file mode 100644 index 00000000..97e6a7bc --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RedirectToWaitingRoom/index.tsx @@ -0,0 +1,3 @@ +import RedirectToWaitingRoom from './RedirectToWaitingRoom'; + +export default RedirectToWaitingRoom; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RoomJoinContainer/RoomJoinContainer.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RoomJoinContainer/RoomJoinContainer.spec.tsx new file mode 100644 index 00000000..d5c2810d --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RoomJoinContainer/RoomJoinContainer.spec.tsx @@ -0,0 +1,73 @@ +import { render as renderBase, screen } from '@testing-library/react'; +import { beforeEach, describe, expect, it, Mock, vi } from 'vitest'; +import { useNavigate } from 'react-router-dom'; +import MemoryRouter from '@test/RouterWrapper'; +import { makeTestProvider, providers } from '@test/providers'; +import type { VideoClient } from '@core/services'; +import RoomJoinContainer from './index'; + +vi.mock('react-router-dom', async () => { + const mod = await vi.importActual('react-router-dom'); + return { + ...mod, + useNavigate: vi.fn(), + }; +}); +const mockNavigate = vi.fn(); + +vi.mock('../../utils/generateRoomName', () => ({ + __esModule: true, + default: () => 'mocked-room', +})); + +const mockCreateSessionMutate = vi.fn(); +const mockVideoClient = { + createSession: (...args: unknown[]) => mockCreateSessionMutate(...args) as unknown, +} as unknown as VideoClient; + +vi.mock('../JoinContainerSeparator', () => ({ + __esModule: true, + default: () =>
        , +})); +vi.mock('../JoinExistingRoom', () => ({ + __esModule: true, + default: () =>
        , +})); + +describe('RoomJoinContainer', () => { + beforeEach(() => { + (useNavigate as Mock).mockReturnValue(mockNavigate); + mockCreateSessionMutate.mockResolvedValue({ sessionKey: 'mock-session-key' }); + }); + + it('renders NewRoomButton, JoinContainerSeparator and JoinExistingRoom components', () => { + render( + + + + ); + expect(screen.getByTestId('new-room-button')).toBeInTheDocument(); + expect(screen.getByTestId('separator')).toBeInTheDocument(); + expect(screen.getByTestId('join-existing-room')).toBeInTheDocument(); + }); + + it('navigates to the waiting room when NewRoomButton is clicked', async () => { + render( + + + + ); + + screen.getByTestId('new-room-button').click(); + await vi.waitFor(() => { + expect(mockNavigate).toHaveBeenCalledWith('/waiting-room/mock-session-key'); + }); + }); +}); + +function render(ui: React.ReactElement) { + const { wrapper } = makeTestProvider([providers.runtime], { + runtimeContext: { videoClient: mockVideoClient }, + }); + return renderBase(ui, { wrapper }); +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RoomJoinContainer/RoomJoinContainer.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RoomJoinContainer/RoomJoinContainer.tsx new file mode 100644 index 00000000..f88c965e --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RoomJoinContainer/RoomJoinContainer.tsx @@ -0,0 +1,48 @@ +import { useNavigate } from 'react-router-dom'; +import { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import { runtime$ } from '@core/stores'; +import Card from '@ui/Card'; +import generateRoomName from '../../utils/generateRoomName'; +import NewRoomButton from '../NewRoomButton'; +import JoinContainerSeparator from '../JoinContainerSeparator'; +import JoinExistingRoom from '../JoinExistingRoom'; + +/** + * RoomJoinContainer Component + * + * This component renders UI elements for creating a new room or joining an existing one. + * @returns {ReactElement} The room join container component. + */ +const RoomJoinContainer = (): ReactElement => { + const videoClient = runtime$.useVideoClient(); + const { t } = useTranslation(); + const navigate = useNavigate(); + + const handleNewRoom = async () => { + const randomRoom = generateRoomName(); + + const { sessionKey } = await videoClient.createSession({ roomName: randomRoom }); + + navigate(`/waiting-room/${sessionKey}`); + }; + + return ( + +
        + {t('button.startNewRoom')} +
        + + + + +
        + {t('button.joinExistingMeeting')} +
        + + +
        + ); +}; + +export default RoomJoinContainer; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RoomJoinContainer/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RoomJoinContainer/index.tsx new file mode 100644 index 00000000..6b4d94ea --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RoomJoinContainer/index.tsx @@ -0,0 +1,3 @@ +import RoomJoinContainer from './RoomJoinContainer'; + +export default RoomJoinContainer; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RoomNameInput/RoomNameInput.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RoomNameInput/RoomNameInput.spec.tsx new file mode 100644 index 00000000..d8cc4eb3 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RoomNameInput/RoomNameInput.spec.tsx @@ -0,0 +1,126 @@ +import { render, screen, fireEvent } from '@testing-library/react'; +import { SetStateAction, Dispatch } from 'react'; +import { describe, expect, it, vi, beforeEach } from 'vitest'; +import RoomNameInput from './RoomNameInput'; + +describe('RoomNameInputComponent', () => { + let setRoomName: Dispatch>; + let setHasError: Dispatch>; + + beforeEach(() => { + setRoomName = vi.fn(); + setHasError = vi.fn(); + }); + + describe('should set the room name', () => { + const testCases = [ + { input: 'test_room' }, + { input: 'test+room' }, + { input: 'another-test_room' }, + { input: '123testroom' }, + ]; + + testCases.forEach(({ input }) => { + it('if the input is valid', () => { + render( + + ); + + const inputBox = screen.getByRole('textbox'); + fireEvent.change(inputBox, { target: { value: input } }); + + expect(setHasError).toHaveBeenCalledWith(false); + expect(setRoomName).toHaveBeenCalledWith(input); + }); + }); + }); + + describe('should reject the name', () => { + const testCases = [ + { input: 'test@room' }, + { input: 'invalid#name' }, + { input: 'invalid/room/name' }, + { input: 'invalid%room%name' }, + ]; + + testCases.forEach(({ input }) => { + it('if the input is invalid', () => { + render( + + ); + + const inputBox = screen.getByRole('textbox'); + fireEvent.change(inputBox, { target: { value: input } }); + + expect(setHasError).toHaveBeenCalledWith(true); + expect(setRoomName).not.toHaveBeenCalledWith(input); + }); + }); + }); + + it('should set the room name as lowercase even if the parameter is a mix of both lower and upper case', () => { + render( + + ); + + const input = screen.getByRole('textbox'); + const newRoomName = 'thisIsANewRoom'; + fireEvent.change(input, { target: { value: newRoomName } }); + + expect(setHasError).toHaveBeenCalledWith(false); + expect(setRoomName).toHaveBeenCalledWith(newRoomName.toLowerCase()); + }); + + it('should show an error if the input contains invalid characters', () => { + render( + + ); + + const input = screen.getByRole('textbox'); + fireEvent.change(input, { target: { value: '%20' } }); + + expect(setHasError).toHaveBeenCalledWith(true); + expect(setRoomName).not.toHaveBeenCalled(); + expect( + screen.getByText('Cannot be empty, contain spaces or special characters') + ).toBeInTheDocument(); + }); + + it('should not show an error if the user erased the input', () => { + render( + + ); + + const input = screen.getByRole('textbox'); + fireEvent.change(input, { target: { value: '' } }); + + expect(setHasError).toHaveBeenCalledWith(false); + // The room name gets set to its original state + expect(setRoomName).toHaveBeenCalledWith(''); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RoomNameInput/RoomNameInput.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RoomNameInput/RoomNameInput.tsx new file mode 100644 index 00000000..6fe6c20d --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RoomNameInput/RoomNameInput.tsx @@ -0,0 +1,66 @@ +import { SetStateAction, Dispatch, ReactElement, ChangeEvent } from 'react'; +import { useTranslation } from 'react-i18next'; +import TextField from '@mui/material/TextField'; +import { isValidRoomName } from '@common/assertions'; + +export type RoomNameInputProps = { + setRoomName: Dispatch>; + roomName: string; + hasError: boolean; + setHasError: Dispatch>; +}; + +/** + * RoomNameInput Component + * + * Input box for setting a custom room name. + * @param {RoomNameInputProps} props - The props for the component. + * @property {Dispatch>} setRoomName - Function to update the room name. + * @property {string} roomName - The room name set by the user. + * @property {boolean} hasError - The error state indicating whether user added an input with an error. + * @property {Dispatch>} setHasError - Function to update the error state. + * @returns {ReactElement} - The RoomNameInput component. + */ +const RoomNameInput = ({ + setRoomName, + roomName, + hasError, + setHasError, +}: RoomNameInputProps): ReactElement => { + const { t } = useTranslation(); + const handleChange = (textChangeEvent: ChangeEvent) => { + const newValue = textChangeEvent.target.value.toLowerCase(); + + if (newValue === '') { + // If the input is empty, reset the room name and clear the error + setRoomName(''); + setHasError(false); + return; + } + + if (isValidRoomName(newValue)) { + setHasError(false); + setRoomName(newValue); + } else { + setHasError(true); + } + }; + + return ( + + ); +}; + +export default RoomNameInput; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RoomNameInput/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RoomNameInput/index.tsx new file mode 100644 index 00000000..337a4ad0 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/RoomNameInput/index.tsx @@ -0,0 +1,3 @@ +import RoomNameInput from './RoomNameInput'; + +export default RoomNameInput; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ScreenShareNameDisplay/ScreenShareNameDisplay.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ScreenShareNameDisplay/ScreenShareNameDisplay.tsx new file mode 100644 index 00000000..10544c78 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ScreenShareNameDisplay/ScreenShareNameDisplay.tsx @@ -0,0 +1,32 @@ +import type { Box } from 'opentok-layout-js'; +import type { ReactElement } from 'react'; + +export type ScreenShareNameDisplayProps = { + name: string; + box: Box; +}; + +/** + * ScreenShareNameDisplay Component + * + * Displays the name of who's screen-sharing along with an identifier that it's a screen video tile. + * @param {ScreenShareNameDisplayProps} props - The props for the component. + * @returns {ReactElement} The ScreenShareNameDisplay component. + */ +const ScreenShareNameDisplay = ({ name, box }: ScreenShareNameDisplayProps): ReactElement => { + const safeMaxWidth = typeof box.width === 'number' && Number.isFinite(box.width) ? box.width : 0; + + return ( +
        + {name} +
        + ); +}; + +export default ScreenShareNameDisplay; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ScreenShareNameDisplay/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ScreenShareNameDisplay/index.tsx new file mode 100644 index 00000000..a7538cd2 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ScreenShareNameDisplay/index.tsx @@ -0,0 +1,3 @@ +import ScreenShareNameDisplay from './ScreenShareNameDisplay'; + +export default ScreenShareNameDisplay; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ScreenSharingButton/ScreenSharingButton.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ScreenSharingButton/ScreenSharingButton.spec.tsx new file mode 100644 index 00000000..d5d533da --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ScreenSharingButton/ScreenSharingButton.spec.tsx @@ -0,0 +1,66 @@ +import { describe, expect, it, vi } from 'vitest'; +import { fireEvent, render as renderBase, screen } from '@testing-library/react'; +import { ReactElement } from 'react'; +import { makeTestProvider } from '@test/providers'; +import ScreenSharingButton, { ScreenShareButtonProps } from './ScreenSharingButton'; +import { env } from '../../env'; + +describe('ScreenSharingButton', () => { + const mockToggleScreenShare = vi.fn(); + + const defaultProps: ScreenShareButtonProps = { + toggleScreenShare: mockToggleScreenShare, + isSharingScreen: false, + isViewingScreenShare: false, + }; + + it('renders the share screen button', () => { + render(); + expect(screen.getByTestId('ScreenShareIcon')).toBeInTheDocument(); + + const button = screen.getByRole('button'); + button.click(); + expect(mockToggleScreenShare).toHaveBeenCalled(); + }); + + it('renders the share screen off button', () => { + render(); + expect(screen.getByTestId('ScreenShareIcon')).toBeInTheDocument(); + + const button = screen.getByRole('button'); + button.click(); + expect(mockToggleScreenShare).toHaveBeenCalled(); + }); + + it('renders the pop up dialog to confirm that user wants to kick off another screenshare', () => { + render(); + const button = screen.getByRole('button'); + expect(button).toBeInTheDocument(); + + fireEvent.click(button); + expect( + screen.getByText( + 'Looks like there is someone else sharing their screen. If you continue, their screen is no longer going to be shared.' + ) + ).toBeInTheDocument(); + }); + + it('is not rendered when allowScreenShare is false', () => { + env.partialUpdate({ + ALLOW_SCREEN_SHARE: false, + }); + + render(); + + expect(screen.queryByTestId('ScreenShareIcon')).not.toBeInTheDocument(); + }); +}); + +function render(ui: ReactElement) { + const { wrapper, ...context } = makeTestProvider([]); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ScreenSharingButton/ScreenSharingButton.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ScreenSharingButton/ScreenSharingButton.tsx new file mode 100644 index 00000000..da16c94d --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ScreenSharingButton/ScreenSharingButton.tsx @@ -0,0 +1,108 @@ +import Tooltip from '@mui/material/Tooltip'; +import { ReactElement, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { isMobile } from '@web/platform'; +import ToolbarButton from '../MeetingRoom/ToolbarButton'; +import PopupDialog, { DialogTexts } from '../MeetingRoom/PopupDialog'; +import VividIcon from '@ui/VividIcon'; +import { env } from '../../env'; + +export type ScreenShareButtonProps = { + toggleScreenShare: () => void; + isSharingScreen: boolean; + isViewingScreenShare: boolean; + isOverflowButton?: boolean; +}; + +/** + * ScreenSharingButton Component + * + * Button to toggle on a user's screenshare and to display whether a user is sharing their screen. + * @param {ScreenShareButtonProps} props - The props for the component. + * @property {Function} toggleScreenShare - Function to toggle screenshare. + * @property {boolean} isSharingScreen - Whether the user is sharing their screen or not. + * @property {boolean} isViewingScreenShare - Indicates whether there is a screenshare currently in the session. + * @property {boolean} isOverflowButton - (optional) whether the button is in the ToolbarOverflowMenu + * @returns {ReactElement} - The ScreenSharingButton component + */ +const ScreenSharingButton = ({ + toggleScreenShare, + isSharingScreen, + isViewingScreenShare, + isOverflowButton = false, +}: ScreenShareButtonProps): ReactElement | false => { + const { t } = useTranslation(); + const title = isSharingScreen ? t('screenSharing.title.stop') : t('screenSharing.title.start'); + const [isModalOpen, setIsModalOpen] = useState(false); + + // Screensharing relies on the getDisplayMedia browser API which is unsupported on mobile devices + // See: https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getDisplayMedia#browser_compatibility + const shouldDisplayScreenShareButton = !isMobile() && env.ALLOW_SCREEN_SHARE; + + const handleButtonClick = () => + isViewingScreenShare ? setIsModalOpen((prev) => !prev) : toggleScreenShare(); + + const handleClose = () => { + setIsModalOpen(false); + }; + + const actionText: DialogTexts = { + title: t('screenSharing.dialog.title'), + contents: t('screenSharing.dialog.content'), + primaryActionText: t('screenSharing.dialog.action'), + secondaryActionText: t('button.cancel'), + }; + + const handleActionClick = () => { + toggleScreenShare(); + handleClose(); + }; + + return ( + shouldDisplayScreenShareButton && ( + <> + + + ) : ( + + ) + } + sx={{ + marginTop: isOverflowButton ? '0px' : '4px', + marginLeft: isOverflowButton ? '12px' : '0px', + backgroundColor: isSharingScreen + ? 'color-mix(in srgb, var(--vera-on-secondary-light) 33%, transparent) !important' + : undefined, + }} + isOverflowButton={isOverflowButton} + /> + + {isViewingScreenShare && ( + + )} + + ) + ); +}; + +export default ScreenSharingButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ScreenSharingButton/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ScreenSharingButton/index.tsx new file mode 100644 index 00000000..69dd10dc --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/ScreenSharingButton/index.tsx @@ -0,0 +1,3 @@ +import ScreenSharingButton from './ScreenSharingButton'; + +export default ScreenSharingButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Separator/Separator.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Separator/Separator.spec.tsx new file mode 100644 index 00000000..1946aa9f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Separator/Separator.spec.tsx @@ -0,0 +1,12 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import Separator from './Separator'; + +describe('Separator', () => { + it('renders the separator component and applies the correct class for default orientation', () => { + render(); + + const separator = screen.getByTestId('separator'); + expect(separator).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Separator/Separator.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Separator/Separator.tsx new file mode 100644 index 00000000..58a891f9 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Separator/Separator.tsx @@ -0,0 +1,32 @@ +import Box from '@mui/material/Box'; +import { ReactElement } from 'react'; + +export type SeparatorProps = { + orientation?: 'left' | 'right'; + width?: string; +}; + +/** + * Separator Component + * + * This component renders a horizontal line with customizable orientation that is set to left by default. + * @param {SeparatorProps} props - the props for the component. + * @property {'left' | 'right'} orientation - whether the separator is oriented to the left or right + * @property {string} width - the width of the separator. + * @returns {ReactElement} The separator component. + */ +const Separator = ({ orientation = 'left', width = '50%' }: SeparatorProps): ReactElement => { + return ( + + ); +}; + +export default Separator; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Separator/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Separator/index.tsx new file mode 100644 index 00000000..c8396515 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Separator/index.tsx @@ -0,0 +1,3 @@ +import Separator from './Separator'; + +export default Separator; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/SoundTest/SoundTest.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/SoundTest/SoundTest.spec.tsx new file mode 100644 index 00000000..2b26d8bf --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/SoundTest/SoundTest.spec.tsx @@ -0,0 +1,161 @@ +import { describe, it, expect, beforeEach, vi } from 'vitest'; +import { act, render as renderBase, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import VividIcon from '@ui/VividIcon'; +import SoundTest from './SoundTest'; +import { nativeDevices } from '../../utils/mockData/device'; +import { makeTestProvider } from '@test/providers'; +import { ReactElement } from 'react'; +import { setupWindowNavigatorMock } from '@web-test/fixtures'; + +describe('SoundTest', () => { + const playMock = vi.fn(); + const pauseMock = vi.fn(); + + beforeEach(() => { + vi.clearAllMocks(); + + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + enumerateDevices: new Promise((res) => { + res(nativeDevices); + }), + }, + }); + + global.Audio = vi.fn().mockImplementation(() => ({ + play: playMock, + pause: pauseMock, + currentTime: 9001, + setSinkId: vi.fn(), + })); + }); + + it('renders', () => { + render( + + + + ); + + const renderedSoundTest = screen.getByTestId('soundTest'); + + expect(renderedSoundTest).toBeInTheDocument(); + }); + + it('clicking the SoundTest toggles audio playing', () => { + render( + + + + ); + + const renderedSoundTest = screen.getByTestId('soundTest'); + act(() => { + renderedSoundTest.click(); + }); + + // First toggle should play the audio + expect(playMock).toHaveBeenCalledOnce(); + expect(pauseMock).not.toHaveBeenCalled(); + + // Reset the mock and click again + playMock.mockReset(); + act(() => { + renderedSoundTest.click(); + }); + + // Second toggle should pause the audio + expect(playMock).not.toHaveBeenCalledOnce(); + expect(pauseMock).toHaveBeenCalledOnce(); + }); + + it('displays `Test speakers` when audio is not playing', () => { + render( + + + + ); + + const displayedText = screen.getByText('Test speakers'); + expect(displayedText).toBeInTheDocument(); + }); + + it('displays `Stop testing` when audio is playing', () => { + render( + + + + ); + + const renderedSoundTest = screen.getByTestId('soundTest'); + act(() => { + renderedSoundTest.click(); + }); + + const displayedText = screen.getByText('Stop testing'); + expect(displayedText).toBeInTheDocument(); + }); + + it('applies custom label classes', () => { + render( + + + + ); + + expect(screen.getByTestId('soundTestLabel')).toHaveClass('text-vera-body-extended'); + }); + + it('does not throw if setSinkId is undefined', () => { + global.Audio = vi.fn().mockImplementation(() => ({ + play: playMock, + pause: pauseMock, + currentTime: 9001, + setSinkId: undefined, + })); + + render( + + + + ); + + const renderedSoundTest = screen.getByTestId('soundTest'); + act(() => { + renderedSoundTest.click(); + }); + + const displayedText = screen.getByText('Stop testing'); + expect(displayedText).toBeInTheDocument(); + }); + + it('stops playing the sound when user clicks away', async () => { + render( + + + + ); + + const renderedSoundTest = screen.getByTestId('soundTest'); + act(() => { + renderedSoundTest.click(); + }); + + expect(playMock).toHaveBeenCalledOnce(); + + await userEvent.click(document.body); + expect(pauseMock).toHaveBeenCalledOnce(); + }); +}); + +function render(ui: ReactElement) { + const { wrapper, ...context } = makeTestProvider([]); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/SoundTest/SoundTest.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/SoundTest/SoundTest.tsx new file mode 100644 index 00000000..85276c49 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/SoundTest/SoundTest.tsx @@ -0,0 +1,74 @@ +import { useCallback, useEffect, useMemo, useState } from 'react'; +import type { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import ClickAwayListener from '@mui/material/ClickAwayListener'; +import Box from '@mui/material/Box'; +import { mediaDevices$ } from '@core/stores'; +import { twMerge } from 'tailwind-merge'; + +export type SoundTestProps = { + children: ReactElement; + labelClassName?: string; +}; + +/** + * SoundTest + * + * Renders a clickable row to test the speakers by playing a sound through the active audio output device. + * @param {SoundTestProps} props - The props for the component. + * @property {ReactElement} children - The icon to be rendered for the sound test. + * @property {string} labelClassName - Additional Tailwind classes for the label. + * @returns {ReactElement} The SoundTest component + */ +const SoundTest = ({ children, labelClassName }: SoundTestProps): ReactElement => { + const { t } = useTranslation(); + const [audioIsPlaying, setAudioIsPlaying] = useState(false); + const audioElement = useMemo(() => new Audio('/assets/sound.mp3'), []); + const currentAudioOutputDevice = mediaDevices$.useDeviceId('audiooutput'); + + const stopAudio = useCallback(() => { + audioElement.pause(); + + // eslint-disable-next-line react-hooks/immutability + audioElement.currentTime = 0; + setAudioIsPlaying(false); + }, [audioElement]); + + useEffect(() => { + if (currentAudioOutputDevice) { + void audioElement.setSinkId?.(currentAudioOutputDevice); + } + }, [audioElement, currentAudioOutputDevice]); + + const handlePlayAudio = useCallback(() => { + if (!audioIsPlaying) { + void audioElement.play(); + setAudioIsPlaying(true); + } else { + // Stop playing the audio and reset the playback to the beginning of the track. + stopAudio(); + } + }, [audioElement, audioIsPlaying, stopAudio]); + + return ( + stopAudio()}> + + {children} + + {!audioIsPlaying ? t('soundTest.start') : t('soundTest.stop')} + + + + ); +}; + +export default SoundTest; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/SoundTest/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/SoundTest/index.tsx new file mode 100644 index 00000000..99a75c2e --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/SoundTest/index.tsx @@ -0,0 +1,3 @@ +import SoundTest from './SoundTest'; + +export default SoundTest; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Subscriber/Subscriber.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Subscriber/Subscriber.spec.tsx new file mode 100644 index 00000000..fb778f43 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Subscriber/Subscriber.spec.tsx @@ -0,0 +1,159 @@ +import { afterEach, describe, expect, it, vi } from 'vitest'; +import { act, cleanup, render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { Subscriber as OTSubscriber } from '@vonage/client-sdk-video'; +import { Box } from 'opentok-layout-js'; +import { SubscriberWrapper } from '../../types/session'; +import Subscriber from './Subscriber'; + +describe('Subscriber', () => { + afterEach(() => { + cleanup(); + }); + + const createSubscriberWrapper = ( + id: string, + isScreenshare: boolean, + isPinned: boolean = false + ): SubscriberWrapper => { + const videoType = isScreenshare ? 'screen' : 'camera'; + return { + id, + element: document.createElement('video'), + isScreenshare, + isPinned, + subscriber: { + on: vi.fn(), + off: vi.fn(), + videoWidth: () => 1280, + videoHeight: () => 720, + subscribeToVideo: () => {}, + stream: { + streamId: id, + videoType, + }, + } as unknown as OTSubscriber, + }; + }; + + const createMockBox = (height: number, left: number, top: number, width: number): Box => { + return { + height, + left, + top, + width, + }; + }; + + it('should contain an audio indicator component if it is not a screenshare', () => { + const mockedSubscriberId = '123'; + const subscriberWrapper = createSubscriberWrapper(mockedSubscriberId, false); + const mockedBox = createMockBox(10, 10, 10, 10); + + render( + + ); + + expect(screen.getByTestId(`subscriber-container-${mockedSubscriberId}`)).toBeVisible(); + expect(screen.getByTestId('audio-indicator')).toBeVisible(); + }); + + it('should not contain an audio indicator component if it is a screenshare', () => { + const mockedSubscriberId = '456'; + const subscriberWrapper = createSubscriberWrapper(mockedSubscriberId, true); + const mockedBox = createMockBox(10, 10, 10, 10); + + render( + + ); + + expect(screen.getByTestId(`subscriber-container-${mockedSubscriberId}`)).toBeVisible(); + expect(screen.queryByTestId('audio-indicator')).not.toBeInTheDocument(); + }); + + it('should render a pin icon if the subscriber is pinned', () => { + const mockedSubscriberId = 'OT_7a0a1bfd-2892-4f5e-90e0-33dafdc7c373'; + const subscriberWrapper = createSubscriberWrapper(mockedSubscriberId, false, true); + const mockedBox = createMockBox(10, 10, 10, 10); + + render( + + ); + + expect(screen.getByTestId(`subscriber-container-${mockedSubscriberId}`)).toBeVisible(); + expect(screen.queryByTestId('pin-button')).toBeVisible(); + }); + + it('should show pin icon when subscriber is hovered', async () => { + const mockedSubscriberId = 'OT_7a0a1bfd-2892-4f5e-90e0-33dafdc7c373'; + const subscriberWrapper = createSubscriberWrapper(mockedSubscriberId, false, false); + const mockedBox = createMockBox(10, 10, 10, 10); + + render( + + ); + + const subscriberContainer = screen.getByTestId(`subscriber-container-${mockedSubscriberId}`); + expect(screen.queryByTestId('pin-button')).not.toBeInTheDocument(); + await act(() => userEvent.hover(subscriberContainer)); + expect(screen.getByTestId('pin-button')).toBeVisible(); + }); + + it('should show unpin icon when subscriber is hovered', async () => { + const mockedSubscriberId = 'OT_7a0a1bfd-2892-4f5e-90e0-33dafdc7c373'; + const subscriberWrapper = createSubscriberWrapper(mockedSubscriberId, false, true); + const mockedBox = createMockBox(10, 10, 10, 10); + + render( + + ); + + const subscriberContainer = screen.getByTestId(`subscriber-container-${mockedSubscriberId}`); + expect(screen.getByTestId('vivid-icon-pin-2-solid')).toBeVisible(); + await act(() => userEvent.hover(subscriberContainer)); + expect(screen.getByTestId('vivid-icon-pin-2-off-solid')).toBeVisible(); + }); + + it('should not render pin icon when screenshare subscriber is hovered', () => { + const mockedSubscriberId = 'OT_7a0a1bfd-2892-4f5e-90e0-33dafdc7c373'; + const subscriberWrapper = createSubscriberWrapper(mockedSubscriberId, true); + const mockedBox = createMockBox(10, 10, 10, 10); + + render( + + ); + + expect(screen.getByTestId(`subscriber-container-${mockedSubscriberId}`)).toBeVisible(); + expect(screen.queryByTestId('pin-button')).not.toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Subscriber/Subscriber.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Subscriber/Subscriber.tsx new file mode 100644 index 00000000..0ed7a18e --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Subscriber/Subscriber.tsx @@ -0,0 +1,162 @@ +import { MouseEvent, ReactElement, useEffect, useRef, useState } from 'react'; +import { Box } from 'opentok-layout-js'; +import { SubscriberWrapper } from '../../types/session'; +import AudioIndicator from '../MeetingRoom/AudioIndicator'; +import useSubscriberTalking from '../../hooks/useSubscriberTalking'; +import AvatarInitials from '../AvatarInitials'; +import ScreenShareNameDisplay from '../ScreenShareNameDisplay'; +import NameDisplay from '../MeetingRoom/NameDisplay'; +import VideoTile from '../MeetingRoom/VideoTile'; +import PinButton from '../MeetingRoom/PinButton'; +import useSessionContext from '../../hooks/useSessionContext'; +import isMouseEventInsideBox from '../../utils/isMouseEventInsideBox'; +import ScreenshareVideoTile from '../MeetingRoom/ScreenshareVideoTile'; +import { ABSOLUTE_DISTANCE_THRESHOLD_REM_VALUE } from '@utils/constants'; +import toRemValue from '@common/helpers/toRemValue'; +import attempt from '@common/execution/attempt'; + +export type SubscriberProps = { + subscriberWrapper: SubscriberWrapper; + isHidden: boolean; + box: Box | undefined; + isActiveSpeaker: boolean; +}; + +/** + * Subscriber Component + * + * Displays the Subscriber with an accompanying name tag. An audio indicator is displayed for non-screenshare subscribers, notifying meeting participants when the subscriber is publishing audio. + * For each subscriber, the initials are displayed if `publishVideo` is off. + * @param {SubscriberProps} props - The props for the component. + * @property {SubscriberWrapper} subscriberWrapper - The SubscriberWrapper for the Subscriber. + * @property {boolean} isHidden - Whether the participant is hidden. + * @property {Box | undefined} box - The Box of the parent element. + * @property {boolean} isActiveSpeaker - Whether the participant is the active speaker. + * @returns {ReactElement} - The Subscriber component. + */ +const Subscriber = ({ + subscriberWrapper, + isHidden, + box, + isActiveSpeaker, +}: SubscriberProps): ReactElement => { + const { isMaxPinned, pinSubscriber } = useSessionContext(); + const { isPinned, subscriber } = subscriberWrapper; + const isScreenShare = subscriber?.stream?.videoType === 'screen'; + const subRef = useRef(null); + const isTalking = useSubscriberTalking({ subscriber, isActiveSpeaker }); + const [isTileHovered, setIsTileHovered] = useState(false); + + useEffect(() => { + // If hidden - Unsubscribe from video to save bandwidth and cpu + // If not hidden - re-subscribe to video + void attempt(() => { + subscriberWrapper.subscriber.subscribeToVideo(!isHidden); + }); + }, [isHidden, subscriberWrapper.subscriber]); + + useEffect(() => { + if (subscriberWrapper && subRef.current) { + const { element } = subscriberWrapper; + + // eslint-disable-next-line react-hooks/immutability + element.id = subscriberWrapper.id; + element.classList.add('video__element', 'rounded-vera-large'); + + element.style.width = '100%'; + element.style.height = '100%'; + element.style.position = 'absolute'; + element.style.objectFit = 'contain'; + + subRef.current.appendChild(element); + } + }, [subscriberWrapper, isScreenShare]); + + const handlePinClick = (clickEvent: MouseEvent) => { + pinSubscriber(subscriberWrapper.id); + // We set hovering to false manually since onMouseLeave is not invoked when the DOM Element is moved. + setIsTileHovered(false); + // In case the DOM Element didn't move, which can happen if pinning while viewing screenshare - + // we use setTimeout to let the new layout render, then check if the element is still under the click event location. + // If so we re-enable the hover state. + setTimeout(() => { + if (subRef.current) { + const divRect = subRef.current.getBoundingClientRect(); + if (isMouseEventInsideBox(clickEvent, divRect)) { + setIsTileHovered(true); + } + } + }, 0); + }; + + const hasVideo = subscriberWrapper.subscriber?.stream?.hasVideo; + const initials = subscriberWrapper.subscriber?.stream?.initials; + const username = subscriberWrapper.subscriber?.stream?.name ?? ''; + const hasAudio = subscriberWrapper.subscriber.stream?.hasAudio; + const audioIndicatorStyle: React.CSSProperties = { + position: 'absolute', + top: toRemValue(ABSOLUTE_DISTANCE_THRESHOLD_REM_VALUE), + right: toRemValue(ABSOLUTE_DISTANCE_THRESHOLD_REM_VALUE), + height: '1.5rem', + width: '1.5rem', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + margin: 'auto', + }; + + return isScreenShare ? ( + setIsTileHovered(true)} + onMouseLeave={() => setIsTileHovered(false)} + > + {box && } + + ) : ( + setIsTileHovered(true)} + onMouseLeave={() => setIsTileHovered(false)} + > + + + + {!hasVideo && ( + + )} + {box && } + + ); +}; + +export default Subscriber; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Subscriber/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Subscriber/index.tsx new file mode 100644 index 00000000..49ffbea7 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/Subscriber/index.tsx @@ -0,0 +1,3 @@ +import Subscriber from './Subscriber'; + +export default Subscriber; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/UnsupportedBrowser/SupportedBrowserListItem/SupportedBrowserListItem.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/UnsupportedBrowser/SupportedBrowserListItem/SupportedBrowserListItem.tsx new file mode 100644 index 00000000..e7c806ba --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/UnsupportedBrowser/SupportedBrowserListItem/SupportedBrowserListItem.tsx @@ -0,0 +1,60 @@ +import { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import ListItem from '@mui/material/ListItem'; +import Link from '@mui/material/Link'; +import IconButton from '@mui/material/IconButton'; +import ListItemText from '@mui/material/ListItemText'; +import VividIcon from '@ui/VividIcon'; +import { Typography } from '@mui/material'; +import Separator from '@components/Separator'; +import Box from '@mui/material/Box'; + +export type SupportedBrowserListItemProps = { + url: string; + browser: string; +}; + +/** + * Displays a list item for a specified browser, including a button to open its download URL. + * @param {SupportedBrowserListItemProps} props - The props for the component + * @returns {ReactElement} - The rendered component. + */ +const SupportedBrowserListItem = ({ + url, + browser, +}: SupportedBrowserListItemProps): ReactElement => { + const { t } = useTranslation(); + + return ( + + + + + + + {t('unsupportedBrowser.supported.visitPage')} + + + } + > + {browser}} /> + + + + ); +}; + +export default SupportedBrowserListItem; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/UnsupportedBrowser/SupportedBrowserListItem/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/UnsupportedBrowser/SupportedBrowserListItem/index.tsx new file mode 100644 index 00000000..3ecd0af8 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/UnsupportedBrowser/SupportedBrowserListItem/index.tsx @@ -0,0 +1,3 @@ +import SupportedBrowserListItem from './SupportedBrowserListItem'; + +export default SupportedBrowserListItem; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/UnsupportedBrowser/SupportedBrowsers/SupportedBrowsers.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/UnsupportedBrowser/SupportedBrowsers/SupportedBrowsers.tsx new file mode 100644 index 00000000..a3303f33 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/UnsupportedBrowser/SupportedBrowsers/SupportedBrowsers.tsx @@ -0,0 +1,43 @@ +import { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import List from '@mui/material/List'; +import Typography from '@mui/material/Typography'; +import { SUPPORTED_BROWSERS } from '../../../utils/constants'; +import SupportedBrowserListItem from '../SupportedBrowserListItem'; +import Card from '@ui/Card'; + +/** + * SupportedBrowsers Component + * + * This component delineates all of the supported browsers for the Vonage Video API Reference App. + * @returns {ReactElement} The SupportedBrowsers component. + */ +const SupportedBrowsers = (): ReactElement => { + const { t } = useTranslation(); + + return ( + + + {t('unsupportedBrowser.supported.title')} + + + {SUPPORTED_BROWSERS.map(({ browser, link }) => { + return ; + })} + + + ); +}; + +export default SupportedBrowsers; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/UnsupportedBrowser/SupportedBrowsers/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/UnsupportedBrowser/SupportedBrowsers/index.tsx new file mode 100644 index 00000000..a1752de0 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/UnsupportedBrowser/SupportedBrowsers/index.tsx @@ -0,0 +1,3 @@ +import SupportedBrowsers from './SupportedBrowsers'; + +export default SupportedBrowsers; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/UnsupportedBrowser/UnsupportedBrowserMessage/UnsupportedBrowserMessage.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/UnsupportedBrowser/UnsupportedBrowserMessage/UnsupportedBrowserMessage.tsx new file mode 100644 index 00000000..46fab4a7 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/UnsupportedBrowser/UnsupportedBrowserMessage/UnsupportedBrowserMessage.tsx @@ -0,0 +1,50 @@ +import { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; + +/** + * UnsupportedBrowserMessage Component + * + * This component warns users they are using a browser unsupported by the Vonage Video API Reference App. + * @returns {ReactElement} The UnsupportedBrowserMessage component. + */ +const UnsupportedBrowserMessage = (): ReactElement => { + const { t } = useTranslation(); + + return ( + + + {t('unsupportedBrowser.header')} + + + {t('unsupportedBrowser.message')} + + + ); +}; + +export default UnsupportedBrowserMessage; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/UnsupportedBrowser/UnsupportedBrowserMessage/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/UnsupportedBrowser/UnsupportedBrowserMessage/index.tsx new file mode 100644 index 00000000..fbaf1dbe --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/UnsupportedBrowser/UnsupportedBrowserMessage/index.tsx @@ -0,0 +1,3 @@ +import UnsupportedBrowserMessage from './UnsupportedBrowserMessage'; + +export default UnsupportedBrowserMessage; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/VividIcon/VividIcon.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/VividIcon/VividIcon.tsx new file mode 100644 index 00000000..ad3697ff --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/VividIcon/VividIcon.tsx @@ -0,0 +1,3 @@ +import VividIcon from '@ui/VividIcon'; + +export default VividIcon; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/BackgroundEffects/BackgroundEffectsButton/BackgroundEffectsButton.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/BackgroundEffects/BackgroundEffectsButton/BackgroundEffectsButton.spec.tsx new file mode 100644 index 00000000..a53a8f67 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/BackgroundEffects/BackgroundEffectsButton/BackgroundEffectsButton.spec.tsx @@ -0,0 +1,65 @@ +import { render as renderBase, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { describe, expect, it, vi } from 'vitest'; +import { ReactElement } from 'react'; +import { makeTestProvider } from '@test/providers'; +import BackgroundEffectsButton from './BackgroundEffectsButton'; +import { env } from '../../../../env'; + +const { mockHasMediaProcessorSupport } = vi.hoisted(() => { + return { + mockHasMediaProcessorSupport: vi.fn().mockReturnValue(true), + }; +}); +vi.mock('@vonage/client-sdk-video', () => ({ + hasMediaProcessorSupport: mockHasMediaProcessorSupport, +})); + +describe('BackgroundEffectsButton', () => { + const mockOnClick = vi.fn(); + beforeEach(() => { + vi.clearAllMocks(); + env.partialUpdate({ + ALLOW_BACKGROUND_EFFECTS: true, + }); + }); + + it('renders the button if media processor is supported', () => { + mockHasMediaProcessorSupport.mockReturnValue(true); + render(); + expect(screen.getByLabelText(/video effects/i)).toBeInTheDocument(); + expect(screen.getByRole('button')).toBeInTheDocument(); + }); + + it('does not render the button if media processor is not supported', () => { + mockHasMediaProcessorSupport.mockReturnValue(false); + const { container } = render(); + expect(container).toBeEmptyDOMElement(); + }); + + it('calls onClick when the button is clicked', async () => { + mockHasMediaProcessorSupport.mockReturnValue(true); + render(); + await userEvent.click(screen.getByRole('button')); + expect(mockOnClick).toHaveBeenCalled(); + }); + + it('is not rendered when background effects are not allowed', () => { + env.partialUpdate({ + ALLOW_BACKGROUND_EFFECTS: false, + }); + + render(); + + expect(screen.queryByLabelText(/video effects/i)).not.toBeInTheDocument(); + }); +}); + +function render(ui: ReactElement) { + const { wrapper, ...context } = makeTestProvider([]); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/BackgroundEffects/BackgroundEffectsButton/BackgroundEffectsButton.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/BackgroundEffects/BackgroundEffectsButton/BackgroundEffectsButton.tsx new file mode 100644 index 00000000..9bea7afe --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/BackgroundEffects/BackgroundEffectsButton/BackgroundEffectsButton.tsx @@ -0,0 +1,64 @@ +import { hasMediaProcessorSupport } from '@vonage/client-sdk-video'; +import { ReactElement } from 'react'; +import PortraitIcon from '@mui/icons-material/Portrait'; +import { useTranslation } from 'react-i18next'; +import Box from '@mui/material/Box'; +import Tooltip from '@mui/material/Tooltip'; +import { VIDEO_CONTAINER_BUTTON_SIZE_WR } from '@utils/constants'; +import VideoContainerButton from '../../VideoContainerButton'; +import { env } from '../../../../env'; + +export type BackgroundEffectsButtonProps = { + onClick: () => void; +}; + +/** + * BackgroundEffectsButton Component + * + * If the user's device supports the Vonage Media Processor, displays a button to modify background effects. + * @param {BackgroundEffectsButtonProps} props - The props for the component. + * @property {Function} onClick - Function to call when the button is clicked. + * @returns {ReactElement | false} - The BackgroundEffectsButton component. + */ +const BackgroundEffectsButton = ({ + onClick, +}: BackgroundEffectsButtonProps): ReactElement | false => { + const shouldDisplayBackgroundEffects = + hasMediaProcessorSupport('both') && env.ALLOW_BACKGROUND_EFFECTS; + const { t } = useTranslation(); + + return ( + shouldDisplayBackgroundEffects && ( + + + + } + /> + + + ) + ); +}; + +export default BackgroundEffectsButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/BackgroundEffects/BackgroundEffectsButton/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/BackgroundEffects/BackgroundEffectsButton/index.tsx new file mode 100644 index 00000000..d1cbe7ff --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/BackgroundEffects/BackgroundEffectsButton/index.tsx @@ -0,0 +1,3 @@ +import BackgroundEffectsButton from './BackgroundEffectsButton'; + +export default BackgroundEffectsButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/BackgroundEffects/BackgroundEffectsDialog/BackgroundEffectsDialog.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/BackgroundEffects/BackgroundEffectsDialog/BackgroundEffectsDialog.spec.tsx new file mode 100644 index 00000000..026a3505 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/BackgroundEffects/BackgroundEffectsDialog/BackgroundEffectsDialog.spec.tsx @@ -0,0 +1,107 @@ +import { render as renderBase, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import type { ReactElement } from 'react'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { makeTestProvider, providers } from '@test/providers'; +import type { ProviderOptions } from '@test/providers'; +import BackgroundEffectsDialog from './BackgroundEffectsDialog'; +import { setupWindowNavigatorMock, makeMediaStreamMock } from '@web-test/fixtures'; + +describe('BackgroundEffectsDialog', () => { + beforeEach(() => { + vi.clearAllMocks(); + + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + enumerateDevices: Promise.resolve([]), + getUserMedia: Promise.resolve(makeMediaStreamMock({})), + getDisplayMedia: Promise.resolve(makeMediaStreamMock({})), + getSupportedConstraints: vi.fn().mockReturnValue({}), + }, + }); + + const { permissions } = globalThis.navigator; + + vi.spyOn(permissions, 'query').mockResolvedValue({ state: 'granted' } as PermissionStatus); + }); + + it('renders dialog when open', async () => { + render( + {}} /> + ); + await waitFor(() => { + expect(screen.getByRole('dialog')).toBeInTheDocument(); + }); + expect(screen.getByText(/video effects/i)).toBeInTheDocument(); + }); + + it('does not render dialog when closed', async () => { + const { queryByRole } = render( + {}} + /> + ); + await waitFor(() => { + expect(queryByRole('dialog')).not.toBeInTheDocument(); + }); + }); + + it('calls setBackgroundEffectsOpen(false) on close', async () => { + const setBackgroundEffectsOpen = vi.fn(); + render( + + ); + const backdrop = document.querySelector('.MuiBackdrop-root'); + + if (!backdrop) { + throw new Error('Backdrop not found'); + } + + expect(backdrop).toBeTruthy(); + + await userEvent.click(backdrop); + + await waitFor(() => { + expect(setBackgroundEffectsOpen).toHaveBeenCalledWith(false); + }); + }); +}); + +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; + sessionContext?: ProviderOptions['SessionContext']; + publisherContext?: ProviderOptions['PublisherContext']; + backgroundPublisherContext?: ProviderOptions['BackgroundPublisherContext']; +}; + +function render( + ui: ReactElement, + { userContext, sessionContext, publisherContext, backgroundPublisherContext }: RenderOptions = {} +) { + const { wrapper, ...context } = makeTestProvider( + [ + providers.user, + providers.session, + providers.publisher, + providers.backgroundPublisher, + providers.runtime, + ], + { + userContext, + sessionContext, + publisherContext, + backgroundPublisherContext, + runtimeContext: undefined, + } + ); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/BackgroundEffects/BackgroundEffectsDialog/BackgroundEffectsDialog.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/BackgroundEffects/BackgroundEffectsDialog/BackgroundEffectsDialog.tsx new file mode 100644 index 00000000..a118482c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/BackgroundEffects/BackgroundEffectsDialog/BackgroundEffectsDialog.tsx @@ -0,0 +1,71 @@ +import { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import Dialog from '@mui/material/Dialog'; +import DialogTitle from '@mui/material/DialogTitle'; +import IconButton from '@mui/material/IconButton'; +import DialogContent from '@mui/material/DialogContent'; +import VividIcon from '@ui/VividIcon'; +import Typography from '@mui/material/Typography'; +import BackgroundEffectsLayout from '../../../BackgroundEffects/BackgroundEffectsLayout'; + +export type BackgroundEffectsDialogProps = { + isBackgroundEffectsOpen: boolean; + setIsBackgroundEffectsOpen: (open: boolean) => void; +}; + +/** + * BackgroundEffectsDialog Component + * + * This component renders a dialog for background effects in the waiting room. + * @param {BackgroundEffectsDialogProps} props - The props for the component. + * @property {boolean} isBackgroundEffectsOpen - Whether the dialog is open. + * @property {Function} setIsBackgroundEffectsOpen - Function to set the open state of the dialog. + * @returns {ReactElement} The background effects dialog component. + */ +const BackgroundEffectsDialog = ({ + isBackgroundEffectsOpen, + setIsBackgroundEffectsOpen, +}: BackgroundEffectsDialogProps): ReactElement | false => { + const handleClose = () => { + setIsBackgroundEffectsOpen(false); + }; + const { t } = useTranslation(); + + return ( + + + + {t('backgroundEffects.title')} + + + + + + + + + + ); +}; + +export default BackgroundEffectsDialog; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/BackgroundEffects/BackgroundEffectsDialog/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/BackgroundEffects/BackgroundEffectsDialog/index.tsx new file mode 100644 index 00000000..7d9a9efd --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/BackgroundEffects/BackgroundEffectsDialog/index.tsx @@ -0,0 +1,3 @@ +import BackgroundEffectsDialog from './BackgroundEffectsDialog'; + +export default BackgroundEffectsDialog; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/CameraButton/CameraButton.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/CameraButton/CameraButton.spec.tsx new file mode 100644 index 00000000..2ebb6914 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/CameraButton/CameraButton.spec.tsx @@ -0,0 +1,183 @@ +import { render as renderBase, screen, fireEvent, waitFor } from '@testing-library/react'; +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import type { ReactElement } from 'react'; +import { makeTestProvider, ProviderOptions, providers } from '@test/providers'; +import type { PreviewPublisherContextType } from '@Context/PreviewPublisherProvider'; +import type { BackgroundPublisherContextType } from '@Context/BackgroundPublisherProvider'; +import CameraButton from './CameraButton'; +import SuspenseBoundary from '@web/components/SuspenseBoundary/SuspenseBoundary'; +import composeProviders from '@web/helpers/composeProviders'; +import { + setupWindowNavigatorMock, + makeMediaStreamMock, + makeMediaDeviceInfos, +} from '@web-test/fixtures'; +import { mediaDevices$ } from '@core/stores'; +import { env } from '../../../env'; + +const mockDevices = makeMediaDeviceInfos(); + +type PreviewPublisherContextWithMock = PreviewPublisherContextType & { + _previewToggleMockApplied?: boolean; +}; + +type BackgroundPublisherContextWithMock = BackgroundPublisherContextType & { + _backgroundToggleMockApplied?: boolean; +}; + +describe('CameraButton', () => { + beforeEach(() => { + vi.clearAllMocks(); + env.partialUpdate({ + ALLOW_CAMERA_CONTROL: true, + }); + + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + enumerateDevices: Promise.resolve(mockDevices), + getUserMedia: Promise.resolve(makeMediaStreamMock({})), + }, + }); + + // Initialize the mediaDevices$ store with mock devices to prevent useSyncPublisherDevices from disabling video + mediaDevices$.setState((state) => ({ + ...state, + mediaDeviceInfo: mockDevices, + })); + + const { permissions } = globalThis.navigator; + + vi.spyOn(permissions, 'query').mockResolvedValue({ state: 'granted' } as PermissionStatus); + }); + + it('renders the video on icon when video is enabled', async () => { + render(, { + previewPublisherContext: { + __onCreated: (context) => { + context.isVideoEnabled = true; + }, + }, + }); + + await waitFor(() => { + expect(screen.getByTestId('vivid-icon-video-line')).toBeInTheDocument(); + }); + }); + + it('renders the video off icon when video is disabled', async () => { + render(, { + previewPublisherContext: { + __onCreated: (context) => { + context.isVideoEnabled = false; + }, + }, + }); + + await waitFor(() => { + expect(screen.getByTestId('vivid-icon-video-off-line')).toBeInTheDocument(); + }); + }); + + it('updates the main publisher and the background replacement publisher when clicked', async () => { + const previewToggleMock = vi.fn(); + const backgroundToggleMock = vi.fn(); + + render(, { + previewPublisherContext: { + __interceptor: (context) => { + const contextWithMock = context as PreviewPublisherContextWithMock; + if (!contextWithMock._previewToggleMockApplied) { + const originalToggle = context.toggleVideo.bind(context); + context.toggleVideo = () => { + previewToggleMock(); + return originalToggle(); + }; + contextWithMock._previewToggleMockApplied = true; + } + }, + }, + backgroundPublisherContext: { + __interceptor: (context) => { + const contextWithMock = context as BackgroundPublisherContextWithMock; + if (!contextWithMock._backgroundToggleMockApplied) { + const originalToggle = context.toggleVideo.bind(context); + context.toggleVideo = () => { + backgroundToggleMock(); + return originalToggle(); + }; + contextWithMock._backgroundToggleMockApplied = true; + } + }, + }, + }); + + await waitFor(() => { + expect(screen.getByRole('button')).toBeInTheDocument(); + }); + + fireEvent.click(screen.getByRole('button')); + + await waitFor(() => { + expect(previewToggleMock).toHaveBeenCalled(); + expect(backgroundToggleMock).toHaveBeenCalled(); + }); + }); + + it('is not rendered when allowCameraControl is false', async () => { + env.partialUpdate({ + ALLOW_CAMERA_CONTROL: false, + }); + + render(); + + await waitFor(() => { + expect(screen.queryByTestId('camera-button-wrapper')).not.toBeInTheDocument(); + }); + }); +}); + +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; + sessionContext?: ProviderOptions['SessionContext']; + publisherContext?: ProviderOptions['PublisherContext']; + backgroundPublisherContext?: ProviderOptions['BackgroundPublisherContext']; + previewPublisherContext?: ProviderOptions['PreviewPublisherContext']; +}; + +function render( + ui: ReactElement, + { + userContext, + sessionContext, + publisherContext, + backgroundPublisherContext, + previewPublisherContext, + }: RenderOptions = {} +) { + const { wrapper: ButtonWrapper, ...context } = makeTestProvider( + [ + providers.user, + providers.session, + providers.publisher, + providers.backgroundPublisher, + providers.previewPublisher, + providers.runtime, + ], + { + userContext, + sessionContext, + publisherContext, + backgroundPublisherContext, + previewPublisherContext, + runtimeContext: undefined, + } + ); + + const wrapper = composeProviders(SuspenseBoundary, ButtonWrapper); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/CameraButton/CameraButton.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/CameraButton/CameraButton.tsx new file mode 100644 index 00000000..86469157 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/CameraButton/CameraButton.tsx @@ -0,0 +1,90 @@ +import { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import classNames from 'classnames'; +import usePreviewPublisherContext from '@hooks/usePreviewPublisherContext'; +import useBackgroundPublisherContext from '@hooks/useBackgroundPublisherContext'; +import { VIDEO_CONTAINER_BUTTON_SIZE_WR } from '@utils/constants'; +import Tooltip from '@mui/material/Tooltip'; +import Box from '@mui/material/Box'; +import VividIcon from '@ui/VividIcon'; +import VideoContainerButton from '../VideoContainerButton'; +import { env } from '../../../env'; + +/** + * CameraButton Component + * + * Displays an overlay button to handle toggling video on and off for the preview publisher. + * @returns {ReactElement | false} - The CameraButton component. + */ +const CameraButton = (): ReactElement | false => { + const { t } = useTranslation(); + const { isVideoEnabled, toggleVideo } = usePreviewPublisherContext(); + const { toggleVideo: toggleBackgroundVideoPublisher } = useBackgroundPublisherContext(); + + const title = isVideoEnabled + ? t('devices.video.camera.state.off') + : t('devices.video.camera.state.on'); + + const handleToggleVideo = () => { + toggleVideo(); + toggleBackgroundVideoPublisher(); + }; + + return ( + env.ALLOW_CAMERA_CONTROL && ( + + + + ) : ( + + ) + } + /> + + + ) + ); +}; + +export default CameraButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/CameraButton/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/CameraButton/index.tsx new file mode 100644 index 00000000..cab488cc --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/CameraButton/index.tsx @@ -0,0 +1,3 @@ +import CameraButton from './CameraButton'; + +export default CameraButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/ControlPanel/ControlPanel.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/ControlPanel/ControlPanel.spec.tsx new file mode 100644 index 00000000..dc97132c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/ControlPanel/ControlPanel.spec.tsx @@ -0,0 +1,191 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import { cleanup, screen, render as renderBase } from '@testing-library/react'; +import { ReactElement } from 'react'; +import { makeTestProvider, providers, ProviderOptions } from '@test/providers'; +import backgroundEffectsDialog$ from '@Context/BackgroundEffectsDialog'; +import precallNetworkTestDialog$ from '@Context/PrecallNetworkTestDialog'; +import ControlPanel from '.'; +import composeProviders from '@web/helpers/composeProviders'; +import SuspenseBoundary from '@web/components/SuspenseBoundary'; +import { setupWindowNavigatorMock } from '@web-test/fixtures'; + +describe('ControlPanel', () => { + beforeEach(() => { + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + enumerateDevices: Promise.resolve([]), + }, + }); + + Object.defineProperty(global.navigator, 'permissions', { + writable: true, + value: { + query: vi.fn().mockResolvedValue({ state: 'granted' }), + }, + }); + }); + + afterEach(() => { + cleanup(); + vi.resetAllMocks(); + }); + + it('should render', () => { + render( + {}} + handleVideoInputOpen={() => {}} + handleAudioOutputOpen={() => {}} + handleClose={() => {}} + openAudioInput={false} + openVideoInput={false} + openAudioOutput={false} + anchorEl={null} + /> + ); + + expect(screen.getByTestId('ControlPanel')).toBeVisible(); + }); + + it('should display open audio input devices menu', () => { + const { rerender } = render( + {}} + handleVideoInputOpen={() => {}} + handleAudioOutputOpen={() => {}} + handleClose={() => {}} + openAudioInput={false} + openVideoInput={false} + openAudioOutput={false} + anchorEl={null} + /> + ); + + expect(screen.queryByTestId('audioinput-menu')).not.toBeInTheDocument(); + rerender( + {}} + handleVideoInputOpen={() => {}} + handleAudioOutputOpen={() => {}} + handleClose={() => {}} + openAudioInput + openVideoInput={false} + openAudioOutput={false} + anchorEl={null} + /> + ); + expect(screen.getByTestId('audioinput-menu')).toBeVisible(); + }); + + it('should open video input devices menu', () => { + const { rerender } = render( + {}} + handleVideoInputOpen={() => {}} + handleAudioOutputOpen={() => {}} + handleClose={() => {}} + openAudioInput={false} + openVideoInput={false} + openAudioOutput={false} + anchorEl={null} + /> + ); + + expect(screen.queryByTestId('videoinput-menu')).not.toBeInTheDocument(); + rerender( + {}} + handleVideoInputOpen={() => {}} + handleAudioOutputOpen={() => {}} + handleClose={() => {}} + openAudioInput={false} + openVideoInput + openAudioOutput={false} + anchorEl={null} + /> + ); + expect(screen.getByTestId('videoinput-menu')).toBeVisible(); + }); + + it('should open audio output devices menu', () => { + const { rerender } = render( + {}} + handleVideoInputOpen={() => {}} + handleAudioOutputOpen={() => {}} + handleClose={() => {}} + openAudioInput={false} + openVideoInput={false} + openAudioOutput={false} + anchorEl={null} + /> + ); + + expect(screen.queryByTestId('audiooutput-menu')).not.toBeInTheDocument(); + rerender( + {}} + handleVideoInputOpen={() => {}} + handleAudioOutputOpen={() => {}} + handleClose={() => {}} + openAudioInput={false} + openVideoInput={false} + openAudioOutput + anchorEl={null} + /> + ); + expect(screen.getByTestId('audiooutput-menu')).toBeVisible(); + }); +}); + +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; + sessionContext?: ProviderOptions['SessionContext']; + publisherContext?: ProviderOptions['PublisherContext']; + backgroundPublisherContext?: ProviderOptions['BackgroundPublisherContext']; + previewPublisherContext?: ProviderOptions['PreviewPublisherContext']; +}; + +function render( + ui: ReactElement, + { + userContext, + sessionContext, + publisherContext, + backgroundPublisherContext, + previewPublisherContext, + }: RenderOptions = {} +) { + const { wrapper: ControlPanelWrapper, ...context } = makeTestProvider( + [ + providers.user, + providers.session, + providers.publisher, + providers.backgroundPublisher, + providers.previewPublisher, + providers.runtime, + ], + { + userContext, + sessionContext, + publisherContext, + backgroundPublisherContext, + previewPublisherContext, + runtimeContext: undefined, + } + ); + + const wrapper = composeProviders( + SuspenseBoundary, + ControlPanelWrapper, + backgroundEffectsDialog$.Provider, + precallNetworkTestDialog$.Provider + ); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/ControlPanel/ControlPanel.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/ControlPanel/ControlPanel.tsx new file mode 100644 index 00000000..851a4276 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/ControlPanel/ControlPanel.tsx @@ -0,0 +1,187 @@ +import { ReactElement, MouseEvent, TouchEvent, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import useIsSmallViewport from '@hooks/useIsSmallViewport'; +import Box from '@mui/material/Box'; +import type { SxProps } from '@mui/material'; +import VividIcon from '@ui/VividIcon'; +import ButtonBase from '@mui/material/ButtonBase'; +import MenuDevices from '../MenuDevices'; +import MenuMoreOptions from '../MenuMoreOptions/MenuMoreOptions'; + +const textSx: SxProps = { + flex: '1 1 0', + minWidth: 0, + whiteSpace: 'nowrap', + overflow: 'hidden', + textOverflow: 'ellipsis', +}; + +export type ControlPanelProps = { + handleAudioInputOpen: ( + event: MouseEvent | TouchEvent + ) => void; + handleVideoInputOpen: ( + event: MouseEvent | TouchEvent + ) => void; + handleAudioOutputOpen: ( + event: MouseEvent | TouchEvent + ) => void; + handleClose: () => void; + openVideoInput: boolean; + openAudioInput: boolean; + openAudioOutput: boolean; + anchorEl: HTMLElement | null; +}; + +/** + * ControlPanel Component + * + * Displays drop-down menus to change the user's audio input, audio output, and video input devices. + * @param {ControlPanelProps} props - The props for the component. + * @property {Function} handleAudioInputOpen - Function to open the audio input menu. + * @property {Function} handleVideoInputOpen - Function to open the video input menu. + * @property {Function} handleAudioOutputOpen - Function to open the audio output menu. + * @property {() => void} handleClose - Function to close the menu. + * @property {boolean} openVideoInput - Whether the video input menu is open. + * @property {boolean} openAudioInput - Whether the audio input menu is open. + * @property {boolean} openAudioOutput- Whether the audio output menu is open. + * @property {HTMLElement | null} anchorEl - The reference element for the ControlPanel component. + * @returns {ReactElement} - The ControlPanel component. + */ +const ControlPanel = ({ + handleAudioInputOpen, + handleVideoInputOpen, + handleAudioOutputOpen, + handleClose, + openVideoInput, + openAudioInput, + openAudioOutput, + anchorEl, +}: ControlPanelProps): ReactElement | false => { + const [openMoreOptions, setOpenMoreOptions] = useState(false); + const [moreOptionsAnchorEl, setMoreOptionsAnchorEl] = useState(null); + const handleCloseMoreOptions = () => { + setOpenMoreOptions(false); + setMoreOptionsAnchorEl(null); + }; + const handleOpenMoreOptions = (event: MouseEvent) => { + setMoreOptionsAnchorEl(event.currentTarget); + setOpenMoreOptions(true); + }; + + const { t } = useTranslation(); + const isSmallViewport = useIsSmallViewport(); + + const buttonSx: SxProps = { + display: 'flex', + alignItems: 'center', + gap: 1.5, + }; + + return ( + + + + + + {isSmallViewport + ? t('devices.audio.microphone.short') + : t('devices.audio.microphone.full')} + + + + + + + + + + {t('button.camera')} + + + + + + + + + + {t('button.speaker')} + + + + + + + + + + + + + ); +}; + +export default ControlPanel; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/ControlPanel/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/ControlPanel/index.tsx new file mode 100644 index 00000000..8a8e39a9 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/ControlPanel/index.tsx @@ -0,0 +1,3 @@ +import ControlPanel from './ControlPanel'; + +export default ControlPanel; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MenuDevices/MenuDevices.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MenuDevices/MenuDevices.spec.tsx new file mode 100644 index 00000000..1fcd82b3 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MenuDevices/MenuDevices.spec.tsx @@ -0,0 +1,203 @@ +import { act, render, screen, waitFor } from '@testing-library/react'; +import { describe, it, vi, expect, beforeEach, afterEach } from 'vitest'; +import userEvent from '@testing-library/user-event'; +import { makeMediaDeviceInfos, setupWindowNavigatorMock } from '@web-test/fixtures'; + +import MenuDevices from './MenuDevices'; +import * as util from '@utils/util'; +import mediaDevices$ from '@core/stores/devices'; + +const someDevices = makeMediaDeviceInfos(); + +describe('MenuDevices Component', () => { + beforeEach(() => { + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + dispatchEvent: vi.fn().mockReturnValue(true), + enumerateDevices: Promise.resolve(someDevices), + removeEventListener: vi.fn(), + }, + permissions: { + query: Promise.resolve({ + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + state: 'granted', + } as unknown as PermissionStatus), + }, + }); + + mediaDevices$.reset(); + mediaDevices$.setState((state) => ({ + ...state, + mediaDeviceInfo: someDevices, + })); + }); + + afterEach(() => { + act(() => { + mediaDevices$.reset(); + mediaDevices$.setState((state) => ({ + ...state, + mediaDeviceInfo: someDevices, + })); + }); + }); + + it('calls selectDevice and onClose when device is clicked', async () => { + const user = userEvent.setup(); + const mockOnClose = vi.fn(); + const anchorEl = document.createElement('div'); + + const kind = 'audioinput'; + const audioInputDevices = someDevices.filter((d) => d.kind === kind); + const secondDevice = audioInputDevices[1]; + + const selectDeviceSpy = vi + .spyOn(mediaDevices$.actions, 'selectDevice') + .mockResolvedValue(undefined as never); + + render(); + + await user.click(screen.getByTestId(`${kind}-menu-item-${secondDevice.deviceId}`)); + + expect(selectDeviceSpy).toHaveBeenCalledWith(kind, secondDevice.deviceId); + expect(mockOnClose).toHaveBeenCalled(); + }); + + it('does not render audio output devices when browser does not support it', async () => { + vi.spyOn(util, 'isGetActiveAudioOutputDeviceSupported').mockReturnValue(false); + + const mockOnClose = vi.fn(); + const anchorEl = document.createElement('div'); + + const kind = 'audiooutput'; + const audioOutputDevices = someDevices.filter((d) => d.kind === kind); + const firstDevice = audioOutputDevices[0]; + const secondDevice = audioOutputDevices[1]; + + render(); + + await waitFor(() => { + expect( + screen.queryByTestId(`${kind}-menu-item-${firstDevice.deviceId}`) + ).not.toBeInTheDocument(); + expect( + screen.queryByTestId(`${kind}-menu-item-${secondDevice.deviceId}`) + ).not.toBeInTheDocument(); + }); + }); + + it('only renders devices of the specified kind', () => { + vi.spyOn(util, 'isGetActiveAudioOutputDeviceSupported').mockReturnValue(true); + + testDeviceKindRendering('audioinput'); + testDeviceKindRendering('audiooutput'); + testDeviceKindRendering('videoinput'); + }); + + it('renders SoundTest when audiooutput devices are available', async () => { + vi.spyOn(util, 'isGetActiveAudioOutputDeviceSupported').mockReturnValue(true); + + vi.spyOn(HTMLMediaElement.prototype, 'pause').mockImplementation(() => {}); + vi.spyOn(HTMLMediaElement.prototype, 'play').mockResolvedValue(undefined); + + const anchorEl = document.createElement('div'); + + render( + + ); + + await waitFor(() => { + expect(screen.getByTestId('soundTest')).toBeInTheDocument(); + }); + }); + + it('does not render SoundTest when no audiooutput devices are available', async () => { + vi.spyOn(util, 'isGetActiveAudioOutputDeviceSupported').mockReturnValue(true); + + act(() => { + mediaDevices$.setState((state) => ({ + ...state, + mediaDeviceInfo: someDevices.filter((d) => d.kind !== 'audiooutput'), + audiooutput: undefined, + })); + }); + + const anchorEl = document.createElement('div'); + + render( + + ); + + await waitFor(() => { + expect(screen.queryByTestId('soundTest')).not.toBeInTheDocument(); + }); + }); + + it('renders an empty state when no devices are available', async () => { + const mockOnClose = vi.fn(); + const anchorEl = document.createElement('div'); + + act(() => { + mediaDevices$.setState((state) => ({ + ...state, + mediaDeviceInfo: [], + audioinput: undefined, + })); + }); + + render( + + ); + + await waitFor(() => { + expect(screen.getByTestId('audioinput-menu-empty-state')).toBeInTheDocument(); + expect(screen.getByText('No devices found')).toBeInTheDocument(); + }); + }); +}); + +function testDeviceKindRendering(kind: MediaDeviceKind) { + const mockOnClose = vi.fn(); + const anchorEl = document.createElement('div'); + const devicesOfKind = someDevices.filter((d) => d.kind === kind); + const firstDevice = devicesOfKind[0]; + + // Set the first device as selected in the store for this kind + act(() => { + mediaDevices$.setState((state) => ({ + ...state, + [kind]: firstDevice.deviceId, + })); + }); + + const { unmount } = render( + + ); + + devicesOfKind.forEach((device) => { + const element = screen.getByTestId(`${kind}-menu-item-${device.deviceId}`); + expect(element).toBeInTheDocument(); + + const shouldBeSelected = device.deviceId === firstDevice.deviceId; + + if (shouldBeSelected) { + expect(element).toHaveClass('Mui-selected'); + } + + if (!shouldBeSelected) { + expect(element).not.toHaveClass('Mui-selected'); + } + }); + + someDevices + .filter((d) => d.kind !== kind) + .forEach((device) => { + expect( + screen.queryByTestId(`${device.kind}-menu-item-${device.deviceId}`) + ).not.toBeInTheDocument(); + }); + + unmount(); +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MenuDevices/MenuDevices.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MenuDevices/MenuDevices.tsx new file mode 100644 index 00000000..a10735d7 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MenuDevices/MenuDevices.tsx @@ -0,0 +1,105 @@ +import { ReactElement, useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; +import MenuItem from '@mui/material/MenuItem'; +import Menu from '@mui/material/Menu'; +import VividIcon from '@ui/VividIcon'; +import Box from '@mui/material/Box'; +import cleanAndDedupeDeviceLabels from '@utils/cleanAndDedupeDeviceLabels/cleanAndDedupeDeviceLabels'; +import SoundTest from '../../SoundTest'; +import { isGetActiveAudioOutputDeviceSupported } from '@utils/util'; +import mediaDevices$ from '@core/stores/devices'; +import useSelectDeviceHandler from '@hooks/useSelectDeviceHandler'; +import { MediaDeviceInfoJSON } from '@web/types'; +import { makeApplicationErrorMapper } from '@core/errors'; +import { handleClientApplicationError } from '@ui/helpers'; + +export type MenuDevicesWaitingRoomProps = { + onClose: () => void; + open: boolean; + mediaDeviceKind: MediaDeviceKind; + anchorEl: HTMLElement | null; +}; + +/** + * MenuDevices Component + * + * Displays a menu with the available media devices (audio input, audio output, video input) for the user to select + */ +const MenuDevices = ({ + mediaDeviceKind, + onClose, + open, + anchorEl, +}: MenuDevicesWaitingRoomProps): ReactElement => { + const { t } = useTranslation(); + + const devices = mediaDevices$.useMediaDevices( + mediaDeviceKind, + Object.values + ); + + const selectedDeviceId = mediaDevices$.useDeviceId(mediaDeviceKind); + + const processedDevices = useMemo(() => cleanAndDedupeDeviceLabels(devices), [devices]); + + const shouldDisplayDevices = + mediaDeviceKind !== 'audiooutput' || isGetActiveAudioOutputDeviceSupported(); + + const shouldDisplayEmptyState = shouldDisplayDevices && processedDevices.length === 0; + + const { handleSelectDevice } = useSelectDeviceHandler(); + + const applicationErrorMapper = makeApplicationErrorMapper(); + + return ( + + {shouldDisplayDevices && + processedDevices.map(({ deviceId, label }) => ( + { + try { + onClose(); + + await handleSelectDevice({ mediaDeviceKind, deviceId }); + } catch (error) { + handleClientApplicationError(applicationErrorMapper(error)); + } + }} + key={deviceId} + selected={deviceId === selectedDeviceId} + > + {label} + + ))} + + {shouldDisplayEmptyState && ( + + {t('waitingRoom.devices.noDevicesFound')} + + )} + + {mediaDeviceKind === 'audiooutput' && + (processedDevices.length > 0 ? ( + + + + + + ) : ( + + {t('waitingRoom.devices.noDevicesFound')} + + ))} + + ); +}; + +export default MenuDevices; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MenuDevices/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MenuDevices/index.tsx new file mode 100644 index 00000000..ae2cd7c0 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MenuDevices/index.tsx @@ -0,0 +1,3 @@ +import MenuDevices from './MenuDevices'; + +export default MenuDevices; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MenuMoreOptions/MenuMoreOptions.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MenuMoreOptions/MenuMoreOptions.spec.tsx new file mode 100644 index 00000000..74e7e47f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MenuMoreOptions/MenuMoreOptions.spec.tsx @@ -0,0 +1,162 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import { render as renderBase, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import type { ReactElement } from 'react'; +import * as clientSdkVideo from '@vonage/client-sdk-video'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import backgroundEffectsDialog$ from '@Context/BackgroundEffectsDialog'; +import precallNetworkTestDialog$ from '@Context/PrecallNetworkTestDialog'; +import composeProviders from '@web/helpers/composeProviders'; +import MenuMoreOptions from './MenuMoreOptions'; +import { env } from '../../../env'; + +describe('MenuMoreOptions', () => { + const mockOnClose = vi.fn(); + const mockAnchorEl = document.createElement('button'); + + beforeEach(() => { + env.reset(); + mockOnClose.mockReset(); + vi.spyOn(clientSdkVideo, 'hasMediaProcessorSupport').mockReturnValue(true); + }); + + afterEach(() => { + env.reset(); + }); + + it('should render when open is true', () => { + render(); + + expect(screen.getByTestId('menu-more-options')).toBeInTheDocument(); + }); + + it('should keep menu items as direct children of the menu list', () => { + render(); + + const menuListElement = screen.getByRole('menu'); + + expect(Array.from(menuListElement.children).every((child) => child.tagName === 'LI')).toBe( + true + ); + }); + + it('should not render menu items when open is false', () => { + render(); + + expect(screen.queryByText(/^settings$/i)).not.toBeInTheDocument(); + expect(screen.queryByText(/video effects/i)).not.toBeInTheDocument(); + }); + + it('should not display advanced settings option when the flag is disabled', () => { + env.partialUpdate({ WAITING_ROOM_ALLOW_ADVANCED_SETTINGS: false }); + render(); + + expect(screen.queryByText(/^settings$/i)).not.toBeInTheDocument(); + }); + + it('should display advanced settings option when the flag is enabled', () => { + env.partialUpdate({ WAITING_ROOM_ALLOW_ADVANCED_SETTINGS: true }); + render(); + + expect(screen.getByText(/^settings$/i)).toBeInTheDocument(); + }); + + it('should open advanced settings and close the menu when clicking the option', async () => { + const user = userEvent.setup(); + + env.partialUpdate({ WAITING_ROOM_ALLOW_ADVANCED_SETTINGS: true }); + render(); + + const advancedSettingsMenuItem = screen.getByText(/^settings$/i); + + await user.click(advancedSettingsMenuItem); + + expect(mockOnClose).toHaveBeenCalledTimes(1); + expect(advancedSettings$.getState().isOpen).toBe(true); + }); + + it('should display video effects option when media processor is supported', () => { + render(); + + expect(screen.getByText(/video effects/i)).toBeInTheDocument(); + }); + + it('should call onClose when clicking on video effects option', async () => { + const user = userEvent.setup(); + render(); + + const menuItem = screen.getByText(/video effects/i); + await user.click(menuItem); + + expect(mockOnClose).toHaveBeenCalledTimes(1); + }); + + it('should display icon for video effects', () => { + render(); + + expect(screen.getByTestId('vivid-icon-gallery-line')).toBeInTheDocument(); + }); + + it('should not display video effects option when media processor is not supported', () => { + vi.spyOn(clientSdkVideo, 'hasMediaProcessorSupport').mockReturnValue(false); + render(); + + expect(screen.getByText(/video effects/i).closest('li')).toHaveAttribute( + 'aria-disabled', + 'true' + ); + }); + + it('should not display video effects option when background effects are not allowed', () => { + env.partialUpdate({ ALLOW_BACKGROUND_EFFECTS: false }); + render(); + + expect(screen.getByText(/video effects/i).closest('li')).toHaveAttribute( + 'aria-disabled', + 'true' + ); + }); + + it('should still display precall network test when media processor is not supported', () => { + vi.spyOn(clientSdkVideo, 'hasMediaProcessorSupport').mockReturnValue(false); + render(); + + expect(screen.getByText(/pre-call network test/i)).toBeInTheDocument(); + expect(screen.getByText(/pre-call network test/i).closest('li')).toHaveAttribute( + 'aria-disabled', + 'true' + ); + }); + + it('shows an unsupported-feature tooltip for disabled menu items', async () => { + const user = userEvent.setup(); + + vi.spyOn(clientSdkVideo, 'hasMediaProcessorSupport').mockReturnValue(false); + render(); + + const videoEffectsMenuItem = screen.getByRole('menuitem', { name: /video effects/i }); + + await user.hover(videoEffectsMenuItem); + + expect( + await screen.findByText(/your browser does not support this feature/i) + ).toBeInTheDocument(); + }); + + it('does not show the unsupported-feature tooltip when the menu first opens', () => { + vi.spyOn(clientSdkVideo, 'hasMediaProcessorSupport').mockReturnValue(false); + render(); + + expect( + screen.queryByText(/your browser does not support this feature/i) + ).not.toBeInTheDocument(); + }); +}); + +function render(ui: ReactElement) { + const wrapper = composeProviders( + backgroundEffectsDialog$.Provider, + precallNetworkTestDialog$.Provider + ); + return renderBase(ui, { wrapper }); +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MenuMoreOptions/MenuMoreOptions.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MenuMoreOptions/MenuMoreOptions.tsx new file mode 100644 index 00000000..91a51f6f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MenuMoreOptions/MenuMoreOptions.tsx @@ -0,0 +1,173 @@ +import { useCallback, useState } from 'react'; +import type { FocusEvent, MouseEvent, ReactElement } from 'react'; +import { hasMediaProcessorSupport } from '@vonage/client-sdk-video'; +import MenuItem from '@mui/material/MenuItem'; +import type { MenuItemProps } from '@mui/material/MenuItem'; +import Menu from '@mui/material/Menu'; +import Paper from '@mui/material/Paper'; +import Popper from '@mui/material/Popper'; +import { useTranslation } from 'react-i18next'; +import VividIcon from '@ui/VividIcon'; +import backgroundEffectsDialog$ from '@Context/BackgroundEffectsDialog'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import precallNetworkTestDialog$ from '@Context/PrecallNetworkTestDialog'; +import useStableRef from '@web/hooks/useStableRef'; +import { env } from '../../../env'; + +export type MenuMoreOptionsWaitingRoomProps = { + onClose: () => void; + open: boolean; + anchorEl: HTMLElement | null; +}; + +const { open: openAdvancedSettings } = advancedSettings$.actions; + +/** + * MenuMoreOptions Component + * + * Displays a list of options in the waiting room. + * @param {MenuMoreOptionsWaitingRoomProps} props - The props for the component. + * @property {Function} onClose - Menu close handler. + * @property {boolean} open - Whether the menu is open or not. + * @property {HTMLElement | null} anchorEl - The anchor element. + * @returns {ReactElement} - The MenuMoreOptions component + */ +const MenuMoreOptions = ({ + onClose, + open, + anchorEl, +}: MenuMoreOptionsWaitingRoomProps): ReactElement => { + const { t } = useTranslation(); + const hasSupportedMediaProcessor = hasMediaProcessorSupport('both'); + const isBackgroundEffectsSupported = hasSupportedMediaProcessor && env.ALLOW_BACKGROUND_EFFECTS; + const isPrecallNetworkTestSupported = hasSupportedMediaProcessor; + const unsupportedFeatureTooltipTitle = t('waitingRoom.unsupportedFeature.tooltip'); + const [tooltipAnchorElement, setTooltipAnchorElement] = useState(null); + const menuAutoFocusGuard = useStableRef( + () => { + const guard = { active: false, timeoutId: -1 }; + + if (!open) { + return guard; + } + + guard.active = true; + guard.timeoutId = window.setTimeout(() => { + guard.active = false; + }, 0); + + return guard; + }, + ({ timeoutId }) => window.clearTimeout(timeoutId), + [open] + ); + + const { open: openBackgroundEffects } = backgroundEffectsDialog$.use.actions(); + const { open: openPrecallNetworkTest } = precallNetworkTestDialog$.use.actions(); + + const handleMenuClose = useCallback(() => { + setTooltipAnchorElement(null); + onClose(); + }, [onClose]); + + const handleClickAdvancedSettings = useCallback(() => { + openAdvancedSettings(); + handleMenuClose(); + }, [handleMenuClose]); + + const handleClickBackgroundEffects = useCallback(() => { + openBackgroundEffects(); + handleMenuClose(); + }, [handleMenuClose, openBackgroundEffects]); + + const handleClickNetworkTest = useCallback(() => { + openPrecallNetworkTest(); + handleMenuClose(); + }, [handleMenuClose, openPrecallNetworkTest]); + + const handleOpenUnsupportedTooltip = useCallback( + (event: FocusEvent | MouseEvent) => { + if (event.type === 'focus' && menuAutoFocusGuard.current.active) { + return; + } + + setTooltipAnchorElement(event.currentTarget); + }, + [menuAutoFocusGuard] + ); + + const handleCloseUnsupportedTooltip = useCallback(() => { + setTooltipAnchorElement(null); + }, []); + + const backgroundEffectsAvailabilityProps: MenuItemProps = isBackgroundEffectsSupported + ? { + onClick: handleClickBackgroundEffects, + } + : { + 'aria-disabled': true as const, + className: 'cursor-not-allowed opacity-50', + onBlur: handleCloseUnsupportedTooltip, + onFocus: handleOpenUnsupportedTooltip, + onMouseEnter: handleOpenUnsupportedTooltip, + onMouseLeave: handleCloseUnsupportedTooltip, + }; + + const precallNetworkTestAvailabilityProps: MenuItemProps = isPrecallNetworkTestSupported + ? { + onClick: handleClickNetworkTest, + } + : { + 'aria-disabled': true as const, + className: 'cursor-not-allowed opacity-50', + onBlur: handleCloseUnsupportedTooltip, + onFocus: handleOpenUnsupportedTooltip, + onMouseEnter: handleOpenUnsupportedTooltip, + onMouseLeave: handleCloseUnsupportedTooltip, + }; + + return ( + <> + + {env.WAITING_ROOM_ALLOW_ADVANCED_SETTINGS && ( + + + {t('advancedSettings.title')} + + )} + + + + {t('backgroundEffects.title')} + + + + {t('waitingRoom.precallNetworkTest.title')} + + + + + {unsupportedFeatureTooltipTitle} + + + + ); +}; + +export default MenuMoreOptions; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MenuMoreOptions/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MenuMoreOptions/index.tsx new file mode 100644 index 00000000..aae4ca14 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MenuMoreOptions/index.tsx @@ -0,0 +1,3 @@ +import MenuMoreOptions from './MenuMoreOptions'; + +export default MenuMoreOptions; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MicButton/MicButton.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MicButton/MicButton.spec.tsx new file mode 100644 index 00000000..5dca2262 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MicButton/MicButton.spec.tsx @@ -0,0 +1,128 @@ +import { render as renderBase, screen, fireEvent, waitFor } from '@testing-library/react'; +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { ReactElement } from 'react'; +import { makeTestProvider, providers, type ProviderOptions } from '@test/providers'; +import MicButton from './MicButton'; +import SuspenseBoundary from '@web/components/SuspenseBoundary/SuspenseBoundary'; +import composeProviders from '@web/helpers/composeProviders'; +import { env } from '../../../env'; +import { + setupWindowNavigatorMock, + makeMediaStreamMock, + makeMediaDeviceInfos, +} from '@web-test/fixtures'; +import { mediaDevices$ } from '@core/stores'; + +const mockDevices = makeMediaDeviceInfos(); + +describe('MicButton', () => { + beforeEach(() => { + vi.clearAllMocks(); + + env.partialUpdate({ + ALLOW_MICROPHONE_CONTROL: true, + }); + + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + enumerateDevices: Promise.resolve(mockDevices), + getUserMedia: Promise.resolve(makeMediaStreamMock({})), + }, + }); + + // Initialize the mediaDevices$ store with mock devices to prevent useSyncPublisherDevices from disabling audio + mediaDevices$.setState((state) => ({ + ...state, + mediaDeviceInfo: mockDevices, + })); + + const { permissions } = globalThis.navigator; + + vi.spyOn(permissions, 'query').mockResolvedValue({ state: 'granted' } as PermissionStatus); + }); + + it('renders the mic on icon when audio is enabled', async () => { + render(, { + previewPublisherContext: { + __onCreated: (context) => { + context.isAudioEnabled = true; + }, + }, + }); + + await waitFor(() => { + expect(screen.getByTestId('vivid-icon-microphone-line')).toBeInTheDocument(); + }); + }); + + it('renders the mic off icon when audio is disabled', async () => { + render(, { + previewPublisherContext: { + __onCreated: (context) => { + context.isAudioEnabled = false; + }, + }, + }); + + await waitFor(() => { + expect(screen.getByTestId('vivid-icon-mic-mute-line')).toBeInTheDocument(); + }); + }); + + it('calls toggleAudio when clicked', async () => { + const toggleAudioMock = vi.fn(); + render(, { + previewPublisherContext: { + __onCreated: (context) => { + context.isAudioEnabled = true; + const originalToggle = context.toggleAudio.bind(context); + context.toggleAudio = () => { + toggleAudioMock(); + return originalToggle(); + }; + }, + }, + }); + + fireEvent.click(screen.getByRole('button')); + + await waitFor(() => { + expect(toggleAudioMock).toHaveBeenCalled(); + }); + }); + + it('is not rendered when allowMicrophoneControl is false', async () => { + env.partialUpdate({ + ALLOW_MICROPHONE_CONTROL: false, + }); + + render(); + + await waitFor(() => { + expect(screen.queryByTestId('vivid-icon-microphone-line')).not.toBeInTheDocument(); + }); + }); +}); + +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; + previewPublisherContext?: ProviderOptions['PreviewPublisherContext']; +}; + +function render(ui: ReactElement, { userContext, previewPublisherContext }: RenderOptions = {}) { + const { wrapper: MainWrapper, ...context } = makeTestProvider( + [providers.user, providers.previewPublisher], + { + userContext, + previewPublisherContext, + } + ); + + const wrapper = composeProviders(SuspenseBoundary, MainWrapper); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MicButton/MicButton.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MicButton/MicButton.tsx new file mode 100644 index 00000000..047309d4 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MicButton/MicButton.tsx @@ -0,0 +1,84 @@ +import { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import classNames from 'classnames'; +import usePreviewPublisherContext from '@hooks/usePreviewPublisherContext'; +import Box from '@mui/material/Box'; +import Tooltip from '@mui/material/Tooltip'; +import VividIcon from '@ui/VividIcon'; +import { VIDEO_CONTAINER_BUTTON_SIZE_WR } from '@utils/constants'; +import VideoContainerButton from '../VideoContainerButton'; +import { env } from '../../../env'; + +/** + * MicButton Component + * + * Toggles the user's microphone (published audio) and updates the icon accordingly. + * @returns {ReactElement | false} - The MicButton component. + */ +const MicButton = (): ReactElement | false => { + const { t } = useTranslation(); + const { isAudioEnabled, toggleAudio } = usePreviewPublisherContext(); + + const title = isAudioEnabled + ? t('devices.audio.microphone.state.off') + : t('devices.audio.microphone.state.on'); + + return ( + env.ALLOW_MICROPHONE_CONTROL && ( + + + + ) : ( + + ) + } + /> + + + ) + ); +}; + +export default MicButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MicButton/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MicButton/index.tsx new file mode 100644 index 00000000..3f9abfe3 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/MicButton/index.tsx @@ -0,0 +1,3 @@ +import MicButton from './MicButton'; + +export default MicButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/DialogActionsRow/DialogActionsRow.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/DialogActionsRow/DialogActionsRow.spec.tsx new file mode 100644 index 00000000..4f5dcc38 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/DialogActionsRow/DialogActionsRow.spec.tsx @@ -0,0 +1,40 @@ +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { describe, expect, it, vi } from 'vitest'; +import DialogActionsRow from './DialogActionsRow'; + +describe('DialogActionsRow', () => { + it('renders close and primary buttons with provided labels', () => { + render( + {}} + actionButtonText="Retry" + onActionClick={() => {}} + /> + ); + + expect(screen.getByRole('button', { name: 'Close' })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Retry' })).toBeInTheDocument(); + }); + + it('calls handlers when buttons are clicked', async () => { + const onClose = vi.fn(); + const onActionClick = vi.fn(); + + render( + + ); + + await userEvent.click(screen.getByRole('button', { name: 'Close' })); + await userEvent.click(screen.getByRole('button', { name: 'Retry' })); + + expect(onClose).toHaveBeenCalledTimes(1); + expect(onActionClick).toHaveBeenCalledTimes(1); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/DialogActionsRow/DialogActionsRow.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/DialogActionsRow/DialogActionsRow.tsx new file mode 100644 index 00000000..22309d45 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/DialogActionsRow/DialogActionsRow.tsx @@ -0,0 +1,64 @@ +import { ReactElement } from 'react'; +import classNames from 'classnames'; +import { Box, Button } from '@mui/material'; + +export type DialogActionsRowProps = { + closeButtonText: string; + onClose: () => void; + actionButtonText: string; + onActionClick: () => void; + textColor?: string; + primaryTextColor?: string; +}; + +const DialogActionsRow = function DialogActionsRow({ + closeButtonText, + onClose, + actionButtonText, + onActionClick, + textColor, + primaryTextColor, +}: DialogActionsRowProps): ReactElement { + const resolvedTextColor = textColor; + const resolvedPrimaryTextColor = primaryTextColor; + + return ( + + + + + ); +}; + +export default DialogActionsRow; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/DialogActionsRow/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/DialogActionsRow/index.ts new file mode 100644 index 00000000..5d116cd4 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/DialogActionsRow/index.ts @@ -0,0 +1,2 @@ +export { default } from './DialogActionsRow'; +export type { DialogActionsRowProps } from './DialogActionsRow'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/PrecallNetworkTestDialog.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/PrecallNetworkTestDialog.spec.tsx new file mode 100644 index 00000000..6b958a0c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/PrecallNetworkTestDialog.spec.tsx @@ -0,0 +1,330 @@ +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { describe, expect, it, vi, beforeEach, afterAll, type Mock } from 'vitest'; +import type { QualityResults } from './hooks/useNetworkTest'; +import type CancelablePromise from 'easy-cancelable-promise/CancelablePromise'; +import PrecallNetworkTestDialog from './PrecallNetworkTestDialog'; + +type NetworkTestState = { + isTestingQuality: boolean; + connectivityResults: unknown; + qualityResults: QualityResults | null; + error: { name: string; message: string } | null; +}; + +type NetworkTestHook = { + state: NetworkTestState; + testQuality: Mock<[roomName: string], CancelablePromise>; + stopTest: Mock; + clearResults: Mock; +}; + +const mockRoomName = 'test-room'; + +vi.mock('react-router-dom', async () => { + const mod = await vi.importActual('react-router-dom'); + return { + ...mod, + useParams: () => ({ roomIdentifier: mockRoomName }), + }; +}); + +const mockUseNetworkTest = vi.fn<[], NetworkTestHook>(); + +vi.mock('./hooks/useNetworkTest', () => ({ + default: () => mockUseNetworkTest(), +})); + +function createNetworkTestHook(overrides?: Partial): NetworkTestHook { + return { + state: { + isTestingQuality: false, + connectivityResults: null, + qualityResults: null, + error: null, + ...overrides, + }, + testQuality: vi.fn(() => ({ + onProgress: vi.fn().mockReturnThis(), + })) as unknown as Mock<[roomName: string], CancelablePromise>, + stopTest: vi.fn(), + clearResults: vi.fn(), + }; +} + +describe('PrecallNetworkTestDialog', () => { + let networkTestHook: NetworkTestHook; + let unhandledRejectionHandler: ((reason: unknown) => void) | null = null; + + beforeEach(() => { + // Ignore "Promise canceled" errors from CancelablePromise cleanup + unhandledRejectionHandler = (reason: unknown) => { + if (reason instanceof Error && reason.message === 'Promise canceled') { + return; + } + throw reason; + }; + process.on('unhandledRejection', unhandledRejectionHandler); + + networkTestHook = createNetworkTestHook(); + mockUseNetworkTest.mockReturnValue(networkTestHook); + }); + + afterAll(() => { + if (unhandledRejectionHandler) { + process.off('unhandledRejection', unhandledRejectionHandler); + } + }); + + describe('Dialog visibility', () => { + it('renders dialog when open', () => { + render( + + ); + + expect(screen.getByRole('dialog')).toBeInTheDocument(); + expect(screen.getByText(/pre-call network test/i)).toBeInTheDocument(); + }); + + it('does not render when closed', () => { + render( + + ); + + expect(screen.queryByRole('dialog')).not.toBeInTheDocument(); + }); + + it('closes dialog when close button is clicked', async () => { + const setOpen = vi.fn(); + + render( + + ); + + const closeButton = screen.getByLabelText(/close/i); + await userEvent.click(closeButton); + + expect(networkTestHook.stopTest).toHaveBeenCalled(); + expect(networkTestHook.clearResults).toHaveBeenCalled(); + expect(setOpen).toHaveBeenCalledWith(false); + }); + }); + + describe('Testing state', () => { + it('shows loading spinner when test is running', () => { + networkTestHook = createNetworkTestHook({ isTestingQuality: true }); + mockUseNetworkTest.mockReturnValue(networkTestHook); + + render( + + ); + + expect(screen.getByRole('progressbar')).toBeInTheDocument(); + expect(screen.getByText(/stop test/i)).toBeInTheDocument(); + }); + + it('stops test when stop button is clicked', async () => { + networkTestHook = createNetworkTestHook({ isTestingQuality: true }); + mockUseNetworkTest.mockReturnValue(networkTestHook); + + render( + + ); + + await userEvent.click(screen.getByText(/stop test/i)); + + expect(networkTestHook.stopTest).toHaveBeenCalled(); + expect(networkTestHook.clearResults).toHaveBeenCalled(); + }); + + it('shows stopped state after user stops test', async () => { + networkTestHook = createNetworkTestHook({ isTestingQuality: true }); + mockUseNetworkTest.mockReturnValue(networkTestHook); + + const { rerender } = render( + + ); + + await userEvent.click(screen.getByText(/stop test/i)); + + networkTestHook = createNetworkTestHook({ isTestingQuality: false }); + mockUseNetworkTest.mockReturnValue(networkTestHook); + + rerender( + + ); + + expect(screen.getByText(/test stopped/i)).toBeInTheDocument(); + expect(screen.getByText(/retry test/i)).toBeInTheDocument(); + }); + }); + + describe('Results state', () => { + it('displays successful audio and video quality results', () => { + networkTestHook = createNetworkTestHook({ + qualityResults: { + audio: { mos: 4.2 }, + video: { mos: 3.75 }, + }, + }); + mockUseNetworkTest.mockReturnValue(networkTestHook); + + render( + + ); + + expect(screen.getByText(/audio/i)).toBeInTheDocument(); + expect(screen.getByText(/video/i)).toBeInTheDocument(); + expect(screen.getByText('4.20/5')).toBeInTheDocument(); + expect(screen.getByText('3.75/5')).toBeInTheDocument(); + expect(screen.getByTitle(/audio is supported/i)).toBeInTheDocument(); + expect(screen.getByTitle(/video is supported/i)).toBeInTheDocument(); + }); + + it('displays poor quality indicators for low scores', () => { + networkTestHook = createNetworkTestHook({ + qualityResults: { + audio: { mos: 2.5 }, + video: { mos: 1.8 }, + }, + }); + mockUseNetworkTest.mockReturnValue(networkTestHook); + + render( + + ); + + expect(screen.getByText('2.50/5')).toBeInTheDocument(); + expect(screen.getByText('1.80/5')).toBeInTheDocument(); + expect(screen.getByTitle(/audio is not supported/i)).toBeInTheDocument(); + expect(screen.getByTitle(/video is not supported/i)).toBeInTheDocument(); + }); + + it('displays error state when test fails', () => { + networkTestHook = createNetworkTestHook({ + error: { + name: 'NetworkError', + message: 'Connection failed', + }, + }); + mockUseNetworkTest.mockReturnValue(networkTestHook); + + render( + + ); + + expect(screen.getByText(/test failed/i)).toBeInTheDocument(); + expect(screen.getByText('Connection failed')).toBeInTheDocument(); + expect(screen.getByText(/retry test/i)).toBeInTheDocument(); + }); + }); + + describe('Retry functionality', () => { + it('clears results and starts new test when retry is clicked', async () => { + networkTestHook = createNetworkTestHook({ + qualityResults: { + audio: { mos: 4.2 }, + video: { mos: 3.75 }, + }, + }); + mockUseNetworkTest.mockReturnValue(networkTestHook); + + render( + + ); + + await userEvent.click(screen.getByText(/retry test/i)); + + expect(networkTestHook.clearResults).toHaveBeenCalled(); + expect(networkTestHook.testQuality).toHaveBeenCalledWith(mockRoomName); + }); + + it('retries test from stopped state', async () => { + networkTestHook = createNetworkTestHook({ isTestingQuality: true }); + mockUseNetworkTest.mockReturnValue(networkTestHook); + + const { rerender } = render( + + ); + + await userEvent.click(screen.getByText(/stop test/i)); + + networkTestHook = createNetworkTestHook({ isTestingQuality: false }); + mockUseNetworkTest.mockReturnValue(networkTestHook); + + rerender( + + ); + + await userEvent.click(screen.getByText(/retry test/i)); + + expect(networkTestHook.clearResults).toHaveBeenCalled(); + expect(networkTestHook.testQuality).toHaveBeenCalledWith(mockRoomName); + }); + + it('retries test from error state', async () => { + networkTestHook = createNetworkTestHook({ + error: { name: 'NetworkError', message: 'Failed' }, + }); + mockUseNetworkTest.mockReturnValue(networkTestHook); + + render( + + ); + + await userEvent.click(screen.getByText(/retry test/i)); + + expect(networkTestHook.clearResults).toHaveBeenCalled(); + expect(networkTestHook.testQuality).toHaveBeenCalledWith(mockRoomName); + }); + }); + + describe('Auto-start behavior', () => { + it('automatically starts test when dialog opens', () => { + const { rerender } = render( + + ); + + expect(networkTestHook.testQuality).not.toHaveBeenCalled(); + + rerender( + + ); + + expect(networkTestHook.testQuality).toHaveBeenCalledWith(mockRoomName); + }); + + it('does not auto-start if test is already running', () => { + networkTestHook = createNetworkTestHook({ isTestingQuality: true }); + mockUseNetworkTest.mockReturnValue(networkTestHook); + + render( + + ); + + expect(networkTestHook.testQuality).not.toHaveBeenCalled(); + }); + + it('does not auto-start if results already exist', () => { + networkTestHook = createNetworkTestHook({ + qualityResults: { + audio: { mos: 4.2 }, + video: { mos: 3.75 }, + }, + }); + mockUseNetworkTest.mockReturnValue(networkTestHook); + + render( + + ); + + expect(networkTestHook.testQuality).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/PrecallNetworkTestDialog.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/PrecallNetworkTestDialog.tsx new file mode 100644 index 00000000..a9bd00ff --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/PrecallNetworkTestDialog.tsx @@ -0,0 +1,289 @@ +import { ReactElement, useEffect, useCallback, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import Dialog from '@mui/material/Dialog'; +import DialogTitle from '@mui/material/DialogTitle'; +import IconButton from '@mui/material/IconButton'; +import DialogContent from '@mui/material/DialogContent'; +import VividIcon from '@ui/VividIcon'; +import Typography from '@mui/material/Typography'; +import Box from '@mui/material/Box'; +import CircularProgress from '@mui/material/CircularProgress'; +import useSessionKeyParam from '@hooks/useSessionKeyParam'; +import useDecodedSessionKey from '@hooks/useDecodedSessionKey'; +import tryCatch from '@common/execution/tryCatch'; +import PrecallNetworkTestQualityRow from './PrecallNetworkTestQualityRow'; +import DialogActionsRow from './DialogActionsRow'; +import useNetworkTest from './hooks/useNetworkTest'; + +export type PrecallNetworkTestDialogProps = { + isPrecallNetworkTestOpen: boolean; + setIsPrecallNetworkTestOpen: (open: boolean) => void; +}; + +/** + * PrecallNetworkTestDialog Component + * + * This component renders a dialog for pre-call network testing in the waiting room. + * @param {PrecallNetworkTestDialogProps} props - The props for the component. + * @property {boolean} isPrecallNetworkTestOpen - Whether the dialog is open. + * @property {Function} setIsPrecallNetworkTestOpen - Function to set the open state of the dialog. + * @returns {ReactElement} The pre-call network test dialog component. + */ +const PrecallNetworkTestDialog = ({ + isPrecallNetworkTestOpen, + setIsPrecallNetworkTestOpen, +}: PrecallNetworkTestDialogProps): ReactElement => { + const { t } = useTranslation(); + const { sessionKey, sessionKeyStatus } = useSessionKeyParam(); + const { roomName } = useDecodedSessionKey({ sessionKey, sessionKeyStatus }); + + const { state, testQuality, stopTest, clearResults } = useNetworkTest(); + + const [hasUserStoppedTest, setHasUserStoppedTest] = useState(false); + + const handleClose = useCallback(() => { + stopTest(); + clearResults(); + setHasUserStoppedTest(false); + setIsPrecallNetworkTestOpen(false); + }, [stopTest, clearResults, setIsPrecallNetworkTestOpen]); + + const handleStopTest = useCallback(() => { + stopTest(); + clearResults(); + setHasUserStoppedTest(true); + }, [stopTest, clearResults]); + + const handleStartTest = useCallback(async () => { + const { error } = await tryCatch(() => + testQuality(roomName).onProgress((_, stats) => { + console.log('Quality test stats update:', stats); + }) + ); + + if (error) { + console.error('Network test failed:', error); + } + }, [testQuality, roomName]); + + const handleRetry = useCallback(() => { + setHasUserStoppedTest(false); + clearResults(); + void handleStartTest(); + }, [clearResults, handleStartTest]); + + const getRoundedQualityScore = function getRoundedQualityScore( + score: number | undefined + ): number | null { + if (typeof score !== 'number') return null; + return Math.round(score * 100) / 100; + }; + const audioScore = getRoundedQualityScore(state.qualityResults?.audio?.mos); + const videoScore = getRoundedQualityScore(state.qualityResults?.video?.mos); + + const audioSupportTitle = (() => { + if (audioScore === null) return undefined; + + const translationKey = + audioScore >= 3 + ? 'waitingRoom.precallNetworkTest.audioSupported' + : 'waitingRoom.precallNetworkTest.audioNotSupported'; + + return t(translationKey); + })(); + + const videoSupportTitle = (() => { + if (videoScore === null) return undefined; + + const translationKey = + videoScore >= 3 + ? 'waitingRoom.precallNetworkTest.videoSupported' + : 'waitingRoom.precallNetworkTest.videoNotSupported'; + + return t(translationKey); + })(); + + const shouldShowTestingState = state.isTestingQuality && !hasUserStoppedTest; + const shouldShowResultsState = + !state.isTestingQuality && Boolean(state.qualityResults || state.error); + + const shouldShowStoppedState = hasUserStoppedTest && !state.qualityResults && !state.error; + + useEffect(() => { + if (!isPrecallNetworkTestOpen) return; + + if (hasUserStoppedTest) return; + + const hasExistingResultsOrError = Boolean(state.qualityResults || state.error); + if (state.isTestingQuality || hasExistingResultsOrError) return; + + void handleStartTest(); + }, [ + isPrecallNetworkTestOpen, + hasUserStoppedTest, + state.isTestingQuality, + state.qualityResults, + state.error, + handleStartTest, + ]); + + return ( + + + + {t('waitingRoom.precallNetworkTest.title')} + + + + + + + + + {t('waitingRoom.precallNetworkTest.subtitle')} + + + {shouldShowTestingState && ( + + + + + + + )} + + {shouldShowStoppedState && ( + + + + {t('waitingRoom.precallNetworkTest.stoppedTitle')} + + + {t('waitingRoom.precallNetworkTest.stoppedMessage')} + + + + + + )} + + {shouldShowResultsState && ( + + {state.error ? ( + + + + {t('waitingRoom.precallNetworkTest.error')} + + + {state.error.message} + + + ) : ( + + + + + )} + + + + )} + + + + ); +}; + +export default PrecallNetworkTestDialog; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/PrecallNetworkTestQualityRow/PrecallNetworkTestQualityRow.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/PrecallNetworkTestQualityRow/PrecallNetworkTestQualityRow.spec.tsx new file mode 100644 index 00000000..d33c19dd --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/PrecallNetworkTestQualityRow/PrecallNetworkTestQualityRow.spec.tsx @@ -0,0 +1,45 @@ +import { describe, it, expect, vi } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import PrecallNetworkTestQualityRow from './PrecallNetworkTestQualityRow'; + +vi.mock('react-i18next', () => ({ + useTranslation: () => ({ t: (key: string) => key }), +})); + +describe('PrecallNetworkTestQualityRow', () => { + it('renders the provided label and quality label text', () => { + render( + + ); + + expect(screen.getByText('Audio')).toBeInTheDocument(); + expect(screen.getByText('waitingRoom.precallNetworkTest.qualityLabel')).toBeInTheDocument(); + }); + + it('formats and displays the score with two decimals and /5', () => { + render(); + + expect(screen.getByText('3.14/5')).toBeInTheDocument(); + }); + + it('shows a check icon when score is >= 3', () => { + render(); + + expect(screen.getByTestId('vivid-icon-check-circle-line')).toBeInTheDocument(); + expect(screen.queryByTestId('vivid-icon-close-circle-line')).not.toBeInTheDocument(); + }); + + it('shows a close icon when score is below 3', () => { + render(); + + expect(screen.getByTestId('vivid-icon-close-circle-line')).toBeInTheDocument(); + expect(screen.queryByTestId('vivid-icon-check-circle-line')).not.toBeInTheDocument(); + expect(screen.getByText('2.99/5')).toBeInTheDocument(); + }); + + it('applies the supportTitle as a title attribute on the row', () => { + render(); + + expect(screen.getByTitle('Audio supported')).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/PrecallNetworkTestQualityRow/PrecallNetworkTestQualityRow.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/PrecallNetworkTestQualityRow/PrecallNetworkTestQualityRow.tsx new file mode 100644 index 00000000..656e2489 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/PrecallNetworkTestQualityRow/PrecallNetworkTestQualityRow.tsx @@ -0,0 +1,80 @@ +import { ReactElement, useMemo } from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import VividIcon from '@ui/VividIcon'; +import { useTranslation } from 'react-i18next'; + +export type PrecallNetworkTestQualityRowProps = { + label: string; + score: number | null; + supportTitle?: string; +}; + +const PrecallNetworkTestQualityRow = ({ + label, + score, + supportTitle, +}: PrecallNetworkTestQualityRowProps): ReactElement => { + const { t } = useTranslation(); + + const isSupported = useMemo(() => score !== null && score >= 3, [score]); + + const formattedScore = useMemo(() => { + if (score === null) return '—'; + return `${score.toFixed(2)}/5`; + }, [score]); + + return ( + + + {label} + + + {isSupported ? ( + + ) : ( + + )} + + + {t('waitingRoom.precallNetworkTest.qualityLabel')} + + + {formattedScore} + + + ); +}; + +export default PrecallNetworkTestQualityRow; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/PrecallNetworkTestQualityRow/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/PrecallNetworkTestQualityRow/index.ts new file mode 100644 index 00000000..ca128f21 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/PrecallNetworkTestQualityRow/index.ts @@ -0,0 +1 @@ +export { default } from './PrecallNetworkTestQualityRow'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/hooks/useNetworkTest.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/hooks/useNetworkTest.spec.tsx new file mode 100644 index 00000000..5ae7136c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/hooks/useNetworkTest.spec.tsx @@ -0,0 +1,245 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { renderHook, waitFor, act } from '@testing-library/react'; +import NetworkTestConstructor from '@vonage/video-client-network-test'; +import { makeTestProvider, providers } from '@test/providers'; +import type { VideoClient } from '@core/services'; + +const mockNetworkTest = vi.hoisted(() => ({ + testQuality: vi.fn(), + stop: vi.fn(), +})); + +vi.mock('@vonage/video-client-network-test', () => { + const MockNetworkTest = vi.fn(() => mockNetworkTest); + + return { + __esModule: true, + default: MockNetworkTest, + ErrorNames: { + UNSUPPORTED_BROWSER: 'UNSUPPORTED_BROWSER', + MISSING_DEVICE_LABELS: 'MISSING_DEVICE_LABELS', + }, + }; +}); + +vi.mock('@vonage/client-sdk-video', () => ({ + __esModule: true, + default: {}, +})); + +vi.mock('@api/fetchCredentials'); + +const mockCreateSessionAndJoinMutate = vi.fn(); + +const mockVideoClient = { + createSessionAndJoin: (...args: unknown[]) => mockCreateSessionAndJoinMutate(...args) as unknown, +} as unknown as VideoClient; + +const mockT = vi.fn((key: string) => key); +vi.mock('react-i18next', () => ({ + useTranslation: () => ({ + t: mockT, + }), +})); + +import useNetworkTest, { type QualityResults } from './useNetworkTest'; +import wait from '@common/execution/wait/wait'; +import CancelablePromise from 'easy-cancelable-promise'; + +const { wrapper } = makeTestProvider([providers.runtime], { + runtimeContext: { videoClient: mockVideoClient }, +}); + +function render(hook: () => T) { + return renderHook(hook, { wrapper }); +} + +describe('useNetworkTest', () => { + const mockCredentials = { + applicationId: 'test-api-key', + sessionId: 'test-session-id', + token: 'test-token', + }; + + const mockQualityResults: QualityResults = { + video: { + supported: true, + recommendedFrameRate: 30, + recommendedResolution: '1280x720', + bitrate: 1000, + frameRate: 30, + packetLossRatio: 0.01, + mos: 4.2, + }, + audio: { + supported: true, + bitrate: 128, + packetLossRatio: 0.005, + mos: 4.5, + }, + }; + + beforeEach(() => { + mockNetworkTest.testQuality.mockReset(); + mockNetworkTest.stop.mockReset(); + mockCreateSessionAndJoinMutate.mockResolvedValue(mockCredentials); + mockNetworkTest.testQuality.mockResolvedValue(mockQualityResults); + }); + + it('returns initial state correctly', () => { + const { result } = render(() => useNetworkTest()); + + expect(result.current).not.toBeNull(); + expect(result.current).toBeDefined(); + expect(result.current.state).toEqual({ + isTestingQuality: false, + connectivityResults: null, + qualityResults: null, + error: null, + }); + }); + + it('testQuality fetches credentials and creates NetworkTest instance', async () => { + const { result } = render(() => useNetworkTest()); + + await act(async () => { + await result.current.testQuality('test-room'); + }); + + expect(mockCreateSessionAndJoinMutate).toHaveBeenCalled(); + expect(NetworkTestConstructor).toHaveBeenCalledWith( + expect.anything(), + { + applicationId: 'test-api-key', + sessionId: 'test-session-id', + token: 'test-token', + }, + {} + ); + }); + + it('testQuality returns quality results', async () => { + const { result } = render(() => useNetworkTest()); + + let returnedResults: QualityResults | undefined; + await act(async () => { + returnedResults = await result.current.testQuality('test-room'); + }); + + expect(returnedResults).toEqual(mockQualityResults); + }); + + it('testQuality handles errors correctly', async () => { + const { result } = render(() => useNetworkTest()); + const mockError = new Error('Network test failed'); + mockError.name = 'NetworkError'; + mockNetworkTest.testQuality.mockRejectedValue(mockError); + + await act(async () => { + await expect(result.current.testQuality('test-room')).rejects.toThrow('Network test failed'); + }); + + expect(result.current.state.isTestingQuality).toBe(false); + expect(result.current.state.error).toEqual({ + message: 'Network test failed', + name: 'NetworkError', + }); + }); + + /** + * TODO: We need to find a way of tell vitest that the unhandled reject is actually expected here. + */ + it('stopTest stops the network test instance', async () => { + const { result } = render(() => useNetworkTest()); + let promise: CancelablePromise; + + vi.spyOn(mockNetworkTest, 'testQuality').mockImplementation(() => wait(10)); + + act(() => { + promise = result.current.testQuality('test-room'); + }); + + await waitFor(() => { + expect(result.current.state.isTestingQuality).toBe(true); + }); + + act(() => { + result.current.stopTest(); + }); + + void promise!.catch(() => {}); + + expect(promise!.status).toBe('canceled'); + expect(result.current.state.isTestingQuality).toBe(false); + }); + + it('stopTest does nothing when no test is running', () => { + const { result } = render(() => useNetworkTest()); + + act(() => { + result.current.stopTest(); + }); + + expect(mockNetworkTest.stop).not.toHaveBeenCalled(); + expect(result.current.state.isTestingQuality).toBe(false); + }); + + it('stopTest prevents late quality results from updating state', async () => { + const { result } = render(() => useNetworkTest()); + + let promise: CancelablePromise | null = null; + + let resolveQualityTest: ((value: QualityResults) => void) | null = null; + + mockNetworkTest.testQuality.mockImplementation(() => { + return new Promise((resolve) => { + resolveQualityTest = resolve; + }); + }); + + promise = result.current.testQuality('test-room'); + + await waitFor(() => { + expect(result.current.state.isTestingQuality).toBe(true); + }); + + act(() => { + result.current.stopTest(); + }); + + void promise?.catch(() => {}); + + await waitFor(() => { + expect(result.current.state.isTestingQuality).toBe(false); + }); + + act(() => { + resolveQualityTest?.(mockQualityResults); + }); + + await waitFor(() => { + expect(result.current.state.qualityResults).toBeNull(); + }); + }); + + it('clearResults resets state to initial values', async () => { + const { result } = render(() => useNetworkTest()); + + await act(async () => { + await result.current.testQuality('test-room'); + }); + + expect(result.current.state.qualityResults).not.toBeNull(); + + act(() => { + result.current.clearResults(); + }); + + expect(result.current.state).toEqual({ + isTestingQuality: false, + connectivityResults: null, + qualityResults: null, + error: null, + }); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/hooks/useNetworkTest.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/hooks/useNetworkTest.tsx new file mode 100644 index 00000000..65cf6270 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/hooks/useNetworkTest.tsx @@ -0,0 +1,235 @@ +import { useState, useCallback, useRef } from 'react'; +import { useTranslation } from 'react-i18next'; +import NetworkTest, { + type ErrorNames, + type QualityTestResults, +} from '@vonage/video-client-network-test'; +import OT from '@vonage/client-sdk-video'; +import CancelablePromise from 'easy-cancelable-promise/CancelablePromise'; +import attempt from '@common/execution/attempt'; +import useMountEffect from '@web/hooks/useMountEffect'; +import { runtime$ } from '@core/stores'; + +export type QualityResults = { + video?: { + supported?: boolean; + recommendedFrameRate?: number | null; + recommendedResolution?: string | null; + reason?: string; + qualityLimitationReason?: string | null; + bitrate?: number; + frameRate?: number; + packetLossRatio?: number; + mos?: number; + }; + audio?: { + supported?: boolean; + reason?: string; + bitrate?: number; + packetLossRatio?: number; + mos?: number; + }; +}; + +export type QualityUpdateStats = { + audio?: { + timestamp?: number; + bytesSent?: number; + bytesReceived?: number; + packetsReceived?: number; + packetsLost?: number; + }; + video?: { + timestamp?: number; + bytesReceived?: number; + bytesSent?: number; + frameRate?: number; + packetsReceived?: number; + packetsLost?: number; + }; + timestamp?: number; + phase?: string; +}; + +type ConnectivityResults = { + success: boolean; + failedTests?: Array<{ + type: string; + error: { + message: string; + name: string; + }; + }>; +}; + +type NetworkTestOptions = { + audioOnly?: boolean; + timeout?: number; + audioSource?: string; + videoSource?: string; +}; + +type NetworkTestError = { + message: string; + name: string; +}; + +type NetworkTestState = { + isTestingQuality: boolean; + connectivityResults: ConnectivityResults | null; + qualityResults: QualityResults | null; + error: NetworkTestError | null; +}; + +/** + * Hook for running Vonage Video API network connectivity and quality tests. + * Provides methods to test device access, connectivity to Vonage Video API servers, + * and audio/video quality with MOS estimates. + * @returns {NetworkTestHookType} Object containing test state and methods + */ +const useNetworkTest = () => { + const videoClient = runtime$.useVideoClient(); + const { t } = useTranslation(); + + const testPromiseRef = useRef | null>(null); + + const [state, setState] = useState({ + isTestingQuality: false, + connectivityResults: null, + qualityResults: null, + error: null, + }); + + // /** + // * The @vonage/video-client-network-test library `stop()` does not guarantee that an in-flight + // * `testQuality()` promise will never resolve afterwards (the library may wait for enough stats + // * before completing). To ensure the UI truly stops, we invalidate the active run so any late + // * callbacks/results are ignored and cannot update React state. + // */ + // const activeQualityTestRunIdentifierRef = useRef(0); + + // const isActiveQualityTestRun = useCallback((runIdentifier: number) => { + // return activeQualityTestRunIdentifierRef.current === runIdentifier; + // }, []); + + const clearResults = useCallback(() => { + setState({ + isTestingQuality: false, + connectivityResults: null, + qualityResults: null, + error: null, + }); + }, []); + + const stopTest = useCallback(() => { + void testPromiseRef.current?.cancel(); + }, []); + + const testQuality = useCallback( + (roomName: string, options: NetworkTestOptions = {}): CancelablePromise => { + const isPending = testPromiseRef.current?.status === 'pending'; + if (isPending) return testPromiseRef.current!; + + setState((prev) => ({ + ...prev, + isTestingQuality: true, + error: null, + })); + + return (testPromiseRef.current = new CancelablePromise( + async (resolve, reject, { isCanceled, reportProgress, onCancel }) => { + try { + const { applicationId, sessionId, token } = await videoClient.createSessionAndJoin(); + + if (isCanceled()) return; + + const networkTest = new NetworkTest( + OT, + { + applicationId, + sessionId, + token, + }, + options + ); + + onCancel(() => { + void attempt(() => { + networkTest.stop(); + }); + + setState((prev) => ({ + ...prev, + isTestingQuality: false, + })); + }); + + // timeout after 30s + + const qualityResults = await new Promise((res, rej) => { + const timeout = setTimeout( + () => rej(new Error('Network test timed out')), + options.timeout || 30000 + ); + + networkTest + .testQuality((qualityUpdateStats) => { + if (isCanceled()) return; + + reportProgress(-1, qualityUpdateStats); + }) + .then(res) + .catch(rej) + .finally(() => { + clearTimeout(timeout); + }); + }); + + if (isCanceled()) return; + + setState((prev) => ({ + ...prev, + qualityResults, + isTestingQuality: false, + })); + + return resolve(qualityResults); + } catch (error) { + if (isCanceled()) return; + + const networkError: NetworkTestError = { + message: + error instanceof Error ? error.message : t('waitingRoom.precallNetworkTest.error'), + name: (error as Error & { name?: string })?.name || 'NetworkTestError', + }; + + setState((prev) => ({ + ...prev, + error: networkError, + isTestingQuality: false, + })); + + reject(networkError); + } + } + )); + }, + [t, videoClient] + ); + + useMountEffect(() => { + return () => { + stopTest(); + }; + }); + + return { + state, + testQuality, + stopTest, + clearResults, + }; +}; + +export { ErrorNames }; +export default useNetworkTest; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/index.tsx new file mode 100644 index 00000000..9344b73c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PrecallNetworkTestDialog/index.tsx @@ -0,0 +1,3 @@ +import PrecallNetworkTestDialog from './PrecallNetworkTestDialog'; + +export default PrecallNetworkTestDialog; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PreviewAvatar/PreviewAvatar.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PreviewAvatar/PreviewAvatar.spec.tsx new file mode 100644 index 00000000..5b5a61f5 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PreviewAvatar/PreviewAvatar.spec.tsx @@ -0,0 +1,68 @@ +import { afterEach, describe, expect, it } from 'vitest'; +import { cleanup, render, screen } from '@testing-library/react'; +import { ReactNode } from 'react'; +import PreviewAvatar from './PreviewAvatar'; + +const TestComponent = ({ children }: { children: ReactNode }) => { + return
        {children}
        ; +}; + +describe('PreviewAvatar', () => { + afterEach(() => { + cleanup(); + }); + + it('should render initials when provided', () => { + render( + + ); + + expect(screen.getByText(/AZ/)).toBeVisible(); + }); + + it('should render avatar when no initials are provided', () => { + const { container } = render( + + ); + + const avatar = container.querySelector('[data-testid="PersonIcon"]'); + expect(avatar).toBeVisible(); + }); + + describe('should not be rendered', () => { + it('when loading', () => { + render( + + + + ); + + expect(screen.getByTestId('TestComponent')).toBeEmptyDOMElement(); + }); + + it('when publishing video is enabled', () => { + render( + + + + ); + + expect(screen.getByTestId('TestComponent')).toBeEmptyDOMElement(); + }); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PreviewAvatar/PreviewAvatar.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PreviewAvatar/PreviewAvatar.tsx new file mode 100644 index 00000000..a0c0d233 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PreviewAvatar/PreviewAvatar.tsx @@ -0,0 +1,66 @@ +import { ReactElement } from 'react'; +import Avatar from '@mui/material/Avatar'; +import useWindowWidth from '../../../hooks/useWindowWidth'; +import AvatarInitials from '../../AvatarInitials'; +import useIsSmallViewport from '../../../hooks/useIsSmallViewport'; + +export type PreviewAvatarProps = { + username: string; + initials: string; + isVideoEnabled: boolean; + isVideoLoading: boolean; +}; + +/** + * PreviewAvatar Component + * + * Displays the user's initials if initials are available, an empty avatar if initials are unavailable, or nothing if the user is publishing video or the publisher is initializing. + * @param {PreviewAvatarProps} props - The props for the component. + * @property {string} username - The user's username. + * @property {string} initials - The user's initials. + * @property {boolean} isVideoEnabled - Whether the user is publishing video. + * @property {boolean} isVideoLoading - Whether the preview publisher is initialized. + * @returns {ReactElement | null} - The PreviewAvatar component or `null`. + */ +const PreviewAvatar = ({ + initials, + username, + isVideoEnabled, + isVideoLoading, +}: PreviewAvatarProps): ReactElement | null => { + const smallDisplayDimensions = useWindowWidth() * 0.46; + const isSmallViewport = useIsSmallViewport(); + const height = isSmallViewport ? smallDisplayDimensions : 328; + const width = isSmallViewport ? smallDisplayDimensions : 584; + if (isVideoEnabled || isVideoLoading) { + return null; + } + + return initials ? ( + + ) : ( + + ); +}; + +export default PreviewAvatar; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PreviewAvatar/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PreviewAvatar/index.tsx new file mode 100644 index 00000000..24b61678 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/PreviewAvatar/index.tsx @@ -0,0 +1,3 @@ +import PreviewAvatar from './PreviewAvatar'; + +export default PreviewAvatar; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/UserNameInput/UserNameInput.skeleton.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/UserNameInput/UserNameInput.skeleton.spec.tsx new file mode 100644 index 00000000..5fa508ba --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/UserNameInput/UserNameInput.skeleton.spec.tsx @@ -0,0 +1,10 @@ +import { render } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import UsernameInputSkeleton from './UserNameInput.skeleton'; + +describe('UsernameInputSkeleton', () => { + it('should render without crashing', () => { + const { container } = render(); + expect(container.firstChild).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/UserNameInput/UserNameInput.skeleton.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/UserNameInput/UserNameInput.skeleton.tsx new file mode 100644 index 00000000..fa4ebb93 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/UserNameInput/UserNameInput.skeleton.tsx @@ -0,0 +1,37 @@ +import { FC } from 'react'; +import { Card, CardProps } from '@ui'; +import { Skeleton } from '@mui/material'; +import Separator from '@components/Separator'; +import { twMerge } from 'tailwind-merge'; + +type UsernameInputSkeletonProps = Omit, 'sx'>; + +const UsernameInputSkeleton: FC = ({ className, ...props }) => { + return ( + +
        + {/* title */} + + + {/* name input */} + + + + + {/* subtitle */} + + + {/* room name */} + + + +
        +
        + ); +}; + +export default UsernameInputSkeleton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/UserNameInput/UserNameInput.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/UserNameInput/UserNameInput.tsx new file mode 100644 index 00000000..5aed13f7 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/UserNameInput/UserNameInput.tsx @@ -0,0 +1,140 @@ +import React, { Dispatch, MouseEvent, ReactElement, SetStateAction, useState, useRef } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { useTranslation } from 'react-i18next'; +import TextField from '@mui/material/TextField'; +import Button from '@mui/material/Button'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import Card from '@ui/Card'; +import useUserContext from '@hooks/useUserContext'; +import { UserType } from '@Context/user'; +import isValidUserName from '@utils/isValidUserName'; +import { setStorageItem, STORAGE_KEYS } from '@utils/storage'; +import Separator from '@components/Separator'; +import { CardProps } from '@mui/material'; +import { twMerge } from 'tailwind-merge'; +import { isValidRoomName } from '@common/assertions'; + +export type UserNameInputProps = Omit & { + username: string; + roomName: string; + setUsername: Dispatch>; +}; + +/** + * UsernameInput Component + * + * Handles setting the username and navigating to the meeting room. + * @param {UserNameInputProps} props - The props for the component. + * @property {string} username - The user's name + * @property {Dispatch>} setUsername - Function to update the user's username. + * @returns {ReactElement} The UsernameInput component. + */ +const UsernameInput = ({ + roomName, + username, + setUsername, + className, + ...cardProps +}: UserNameInputProps): ReactElement => { + const { t } = useTranslation(); + const { setUser } = useUserContext(); + const navigate = useNavigate(); + + const [isUserNameInvalid, setIsUserNameInvalid] = useState(false); + const inputRef = useRef(null); + + const onChangeParticipantName = (e: React.ChangeEvent) => { + const inputUserName = e.target.value; + setIsUserNameInvalid(false); + setUsername(inputUserName); + }; + + const handleInputFocus = () => { + inputRef.current?.scrollIntoView({ behavior: 'smooth', block: 'center' }); + }; + + const validateForm = () => { + if (!isValidUserName(username)) { + setIsUserNameInvalid(true); + return false; + } + return true; + }; + + const handleJoinClick = (event: MouseEvent) => { + event.preventDefault(); + if (validateForm() && roomName) { + if (!isValidRoomName(roomName)) { + return; + } + setUser((prevUser: UserType) => ({ + ...prevUser, + defaultSettings: { + ...prevUser.defaultSettings, + name: username, + }, + })); + setStorageItem(STORAGE_KEYS.USERNAME, username); + // This takes the user to the meeting room and allows them to enter it + // Otherwise if they entered the room directly, they are going to be redirected back to the waiting room + // Setting hasAccess is required so that we are not redirected back to the waiting room + navigate(`/room/${roomName}`, { + state: { + hasAccess: true, + }, + }); + } + }; + + return ( + + + {t('waitingRoom.user.input.title')} + + + + + + + + + + {t('waitingRoom.title')} + + + + {roomName} + + + + + ); +}; + +export default UsernameInput; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/UserNameInput/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/UserNameInput/index.tsx new file mode 100644 index 00000000..178e6e5d --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/UserNameInput/index.tsx @@ -0,0 +1,3 @@ +import UserNameInput from './UserNameInput'; + +export default UserNameInput; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoContainer/VideoContainer.skeleton.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoContainer/VideoContainer.skeleton.spec.tsx new file mode 100644 index 00000000..60aec190 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoContainer/VideoContainer.skeleton.spec.tsx @@ -0,0 +1,10 @@ +import { render } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import VideoContainerSkeleton from './VideoContainer.skeleton'; + +describe('VideoContainerSkeleton', () => { + it('should render without crashing', () => { + const { container } = render(); + expect(container.firstChild).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoContainer/VideoContainer.skeleton.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoContainer/VideoContainer.skeleton.tsx new file mode 100644 index 00000000..6e40c36c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoContainer/VideoContainer.skeleton.tsx @@ -0,0 +1,43 @@ +import { ComponentProps, FC } from 'react'; +import classNames from 'classnames'; +import PreviewAvatar from '../PreviewAvatar'; +import VignetteEffect from '../VignetteEffect'; +import { twMerge } from 'tailwind-merge'; + +type VideoContainerSkeletonProps = ComponentProps<'div'>; + +const VideoContainerSkeleton: FC = ({ className, ...props }) => { + return ( +
        + + + +
        + ); +}; + +export default VideoContainerSkeleton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoContainer/VideoContainer.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoContainer/VideoContainer.tsx new file mode 100644 index 00000000..801680a9 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoContainer/VideoContainer.tsx @@ -0,0 +1,136 @@ +import { useRef, useEffect, ReactElement } from 'react'; +import { VIDEO_CONTAINER_HEIGHT_WR } from '@utils/constants'; +import MicButton from '../MicButton'; +import CameraButton from '../CameraButton'; +import VideoLoading from '../VideoLoading'; +import useUserContext from '../../../hooks/useUserContext'; +import usePreviewPublisherContext from '../../../hooks/usePreviewPublisherContext'; +import getInitials from '../../../utils/getInitials'; +import PreviewAvatar from '../PreviewAvatar'; +import VoiceIndicatorIcon from '../../MeetingRoom/VoiceIndicator/VoiceIndicator'; +import VignetteEffect from '../VignetteEffect'; +import BackgroundEffectsDialog from '../BackgroundEffects/BackgroundEffectsDialog'; +import BackgroundEffectsButton from '../BackgroundEffects/BackgroundEffectsButton'; +import AdvancedSettingsDialog from '@components/AdvancedSettings/Dialog'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import backgroundEffectsDialog$ from '@Context/BackgroundEffectsDialog'; +import PrecallNetworkTestDialog from '../PrecallNetworkTestDialog'; +import precallNetworkTestDialog$ from '@Context/PrecallNetworkTestDialog'; +import classNames from 'classnames'; +import { env } from '../../../env'; +import VideoStatsOverlay from '../VideoStatsOverlay'; + +export type VideoContainerProps = { + username: string; +}; + +/** + * VideoContainer Component + * + * Loads and displays the preview publisher, a representation of what participants would see in the meeting room. + * Overlaid onto the preview publisher are the audio input toggle button, video input toggle button, and the background replacement button (if supported). + * @param {VideoContainerProps} props - The props for the component. + * @property {string} username - The user's username. + * @returns {ReactElement} - The VideoContainer component. + */ +const VideoContainer = ({ username }: VideoContainerProps): ReactElement => { + const containerRef = useRef(null); + const isAdvancedSettingsOpen = advancedSettings$.use.select((state) => state.isOpen); + const [{ isOpen: isBackgroundEffectsOpen }, { open, close }] = backgroundEffectsDialog$.use(); + const [{ isOpen: isPrecallNetworkTestOpen }, { close: closePrecallTest }] = + precallNetworkTestDialog$.use(); + const { user } = useUserContext(); + const { publisherVideoElement, isVideoEnabled, isAudioEnabled, speechLevel, isVideoLoading } = + usePreviewPublisherContext(); + const initials = getInitials(username); + + useEffect(() => { + if (!publisherVideoElement) return; + + containerRef.current!.appendChild(publisherVideoElement); + }, [publisherVideoElement]); + + return ( +
        +
        + + + + {env.SHOW_VIDEO_STATS && isVideoEnabled && !isVideoLoading && ( +
        + +
        + )} + + {isVideoLoading && } + + + + {!isVideoLoading && ( +
        + {isAudioEnabled && ( +
        + +
        + )} +
        + + +
        +
        + + {isBackgroundEffectsOpen && ( + + )} + {isAdvancedSettingsOpen && } + {isPrecallNetworkTestOpen && ( + + )} +
        +
        + )} +
        + ); +}; + +export default VideoContainer; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoContainer/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoContainer/index.tsx new file mode 100644 index 00000000..39f45827 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoContainer/index.tsx @@ -0,0 +1,3 @@ +import VideoContainer from './VideoContainer'; + +export default VideoContainer; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoContainerButton/VideoContainerButton.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoContainerButton/VideoContainerButton.tsx new file mode 100644 index 00000000..071bca61 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoContainerButton/VideoContainerButton.tsx @@ -0,0 +1,41 @@ +import IconButton from '@mui/material/IconButton'; +import type { IconButtonProps } from '@mui/material/IconButton'; +import type { SxProps } from '@mui/material'; +import { ForwardedRef, forwardRef, ReactElement } from 'react'; +import classNames from 'classnames'; +import { twMerge } from 'tailwind-merge'; + +export type VideoContainerButtonProps = IconButtonProps & { + onClick: () => void; + icon: ReactElement; + sx?: SxProps; +}; + +/** + * VideoContainerButton Component + * + * An overlay button for the preview publisher. + * @param {VideoContainerButtonProps} props - The props for the component. + * @property {Function} onClick - The on-click handler for the button. + * @property {ReactElement} icon - The Icon element for the button. + * @property {SxProps} sx - The style properties for the component. + * @returns {ReactElement} The VideoContainerButton component. + */ +const VideoContainerButton = forwardRef(function VideoContainerButton( + props: VideoContainerButtonProps, + ref: ForwardedRef +): ReactElement { + const { icon: Icon, className, ...rest } = props; + return ( + + {Icon} + + ); +}); + +export default VideoContainerButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoContainerButton/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoContainerButton/index.tsx new file mode 100644 index 00000000..207bae81 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoContainerButton/index.tsx @@ -0,0 +1,3 @@ +import VideoContainerButton from './VideoContainerButton'; + +export default VideoContainerButton; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoLoading/VideoLoading.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoLoading/VideoLoading.spec.tsx new file mode 100644 index 00000000..3a83e346 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoLoading/VideoLoading.spec.tsx @@ -0,0 +1,15 @@ +import { afterEach, describe, expect, it } from 'vitest'; +import { cleanup, render, screen } from '@testing-library/react'; +import VideoLoading from './VideoLoading'; + +describe('VideoLoading', () => { + afterEach(() => { + cleanup(); + }); + + it('should render the VideoLoading component', () => { + render(); + + expect(screen.getByTestId('VideoLoading')).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoLoading/VideoLoading.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoLoading/VideoLoading.tsx new file mode 100644 index 00000000..b8bd1347 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoLoading/VideoLoading.tsx @@ -0,0 +1,35 @@ +import CircularProgress from '@mui/material/CircularProgress'; +import { FC } from 'react'; +import Box from '@mui/material/Box'; +import type { BoxProps } from '@mui/material/Box'; +import { twMerge } from 'tailwind-merge'; + +type VideoLoadingProps = { + className?: string; +} & BoxProps; + +/** + * VideoLoading Component + * + * Displays a video loading component while the Preview Publisher is being initialized. + * @returns {ReactElement} - The VideoLoading component + */ +const VideoLoading: FC = ({ className, ...props }) => { + return ( + + + + ); +}; + +export default VideoLoading; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoLoading/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoLoading/index.tsx new file mode 100644 index 00000000..c46dcd21 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoLoading/index.tsx @@ -0,0 +1,3 @@ +import VideoLoading from './VideoLoading'; + +export default VideoLoading; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoStatsOverlay/VideoStatsOverlay.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoStatsOverlay/VideoStatsOverlay.spec.tsx new file mode 100644 index 00000000..33f808c3 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoStatsOverlay/VideoStatsOverlay.spec.tsx @@ -0,0 +1,109 @@ +import { render as renderBase, screen } from '@testing-library/react'; +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import type { ReactElement } from 'react'; +import type { Publisher } from '@vonage/client-sdk-video'; +import { makeTestProvider, providers } from '@test/providers'; +import composeProviders from '@web/helpers/composeProviders'; +import SuspenseBoundary from '@web/components/SuspenseBoundary/SuspenseBoundary'; +import { + setupWindowNavigatorMock, + makeMediaStreamMock, + makeMediaDeviceInfos, +} from '@web-test/fixtures'; +import VideoStatsOverlay from './VideoStatsOverlay'; + +const mockDevices = makeMediaDeviceInfos(); + +const mockPublisher = { + videoWidth: vi.fn().mockReturnValue(1280), + videoHeight: vi.fn().mockReturnValue(720), + getVideoSource: vi.fn().mockReturnValue({ + track: { + getSettings: vi.fn().mockReturnValue({ frameRate: 30 }), + }, + }), +} as unknown as Publisher; + +describe('VideoStatsOverlay', () => { + beforeEach(() => { + vi.clearAllMocks(); + (mockPublisher.videoWidth as ReturnType).mockReturnValue(1280); + (mockPublisher.videoHeight as ReturnType).mockReturnValue(720); + (mockPublisher.getVideoSource as ReturnType).mockReturnValue({ + track: { + getSettings: vi.fn().mockReturnValue({ frameRate: 30 }), + }, + }); + + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + enumerateDevices: Promise.resolve(mockDevices), + getUserMedia: Promise.resolve(makeMediaStreamMock({})), + }, + }); + + vi.spyOn(globalThis.navigator.permissions, 'query').mockResolvedValue({ + state: 'granted', + } as PermissionStatus); + }); + + it('should render the stats badge with resolution and framerate', async () => { + render(); + + expect(await screen.findByTestId('video-stats-overlay')).toBeInTheDocument(); + expect(screen.getByText('720p 30fps')).toBeInTheDocument(); + }); + + it('should render only resolution when framerate is not available', async () => { + (mockPublisher.getVideoSource as ReturnType).mockReturnValue({ + track: null, + }); + + render(); + + expect(await screen.findByText('720p')).toBeInTheDocument(); + }); + + it('should display "–" when no stats are available', async () => { + (mockPublisher.videoWidth as ReturnType).mockReturnValue(undefined); + (mockPublisher.videoHeight as ReturnType).mockReturnValue(undefined); + (mockPublisher.getVideoSource as ReturnType).mockReturnValue({ + track: null, + }); + + render(); + + expect(await screen.findByText('–')).toBeInTheDocument(); + }); + + it('should display 1080p for full HD resolution', async () => { + (mockPublisher.videoWidth as ReturnType).mockReturnValue(1920); + (mockPublisher.videoHeight as ReturnType).mockReturnValue(1080); + + render(); + + expect(await screen.findByText(/1080p/)).toBeInTheDocument(); + }); +}); + +function render(ui: ReactElement) { + const { wrapper: roomWrapper, ...context } = makeTestProvider( + [providers.user, providers.previewPublisher], + { + userContext: undefined, + previewPublisherContext: { + __onCreated: (ctx) => { + ctx.publisher = mockPublisher; + }, + }, + } + ); + + const wrapper = composeProviders(SuspenseBoundary, roomWrapper); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoStatsOverlay/VideoStatsOverlay.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoStatsOverlay/VideoStatsOverlay.tsx new file mode 100644 index 00000000..97ada3eb --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoStatsOverlay/VideoStatsOverlay.tsx @@ -0,0 +1,30 @@ +import type { ReactElement } from 'react'; +import usePreviewPublisherContext from '../../../hooks/usePreviewPublisherContext'; +import useVideoStats, { formatResolution, formatFrameRate } from '@core/hooks/useVideoStats'; + +/** + * VideoStatsOverlay Component + * + * Displays the current video resolution and frame rate as a badge + * in the upper-left corner of the waiting room video preview. + * @returns {ReactElement} The VideoStatsOverlay component. + */ +const VideoStatsOverlay = (): ReactElement => { + const { publisher } = usePreviewPublisherContext(); + const { height, frameRate } = useVideoStats(publisher); + + const resolution = formatResolution(height); + const frameRateLabel = formatFrameRate(frameRate); + const label = [resolution, frameRateLabel].filter(Boolean).join(' ') || '–'; + + return ( +
        + {label} +
        + ); +}; + +export default VideoStatsOverlay; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoStatsOverlay/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoStatsOverlay/index.tsx new file mode 100644 index 00000000..e99e84cb --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VideoStatsOverlay/index.tsx @@ -0,0 +1 @@ +export { default } from './VideoStatsOverlay'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VignetteEffect/VignetteEffect.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VignetteEffect/VignetteEffect.tsx new file mode 100644 index 00000000..b0a70b56 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VignetteEffect/VignetteEffect.tsx @@ -0,0 +1,26 @@ +import { ReactElement } from 'react'; +import Box from '@mui/material/Box'; +import { VIDEO_CONTAINER_HEIGHT_WR } from '@utils/constants'; + +/** + * VignetteEffect Component + * + * Adds a vignetting effect to the publisher preview to draw the user's attention + * toward the center of the image. + * @returns {ReactElement} - The VignetteEffect component. + */ +const VignetteEffect = (): ReactElement => { + return ( + + ); +}; + +export default VignetteEffect; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VignetteEffect/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VignetteEffect/index.tsx new file mode 100644 index 00000000..7e7d61eb --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/WaitingRoom/VignetteEffect/index.tsx @@ -0,0 +1,3 @@ +import VignetteEffect from './VignetteEffect'; + +export default VignetteEffect; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/index.ts new file mode 100644 index 00000000..e054347c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/components/index.ts @@ -0,0 +1,29 @@ +export { AdvancedSettingsDialog } from './AdvancedSettingsDialog'; +export { default as AvatarInitials } from './AvatarInitials'; +export { default as Banner } from './Banner'; +export { default as BannerLanguage } from './BannerLanguage'; +export { default as BannerLogo } from './BannerLogo'; +export { default as DeviceAccessAlert } from './DeviceAccessAlert'; +export { default as EnvGuard } from './EnvGuard'; +export { default as ErrorBoundary } from './ErrorBoundary'; +export { default as Footer } from './Footer'; +export { default as FooterLinks } from './FooterLinks'; +export { default as GHRepoButton } from './GHRepoButton'; +export { default as HiddenParticipantsTile } from './HiddenParticipantsTile'; +export { default as JoinContainerSeparator } from './JoinContainerSeparator'; +export { default as JoinExistingRoom } from './JoinExistingRoom'; +export { default as JoinWaitRoomButton } from './JoinWaitRoomButton'; +export { default as LandingPageWelcome } from './LandingPageWelcome'; +export { default as LanguageSelector } from './LanguageSelector'; +export { default as MutedAlert } from './MutedAlert'; +export { default as NewRoomButton } from './NewRoomButton'; +export { default as Publisher } from './Publisher'; +export { default as RedirectToUnsupportedBrowserPage } from './RedirectToUnsupportedBrowserPage'; +export { default as RedirectToWaitingRoom } from './RedirectToWaitingRoom'; +export { default as RoomJoinContainer } from './RoomJoinContainer'; +export { default as RoomNameInput } from './RoomNameInput'; +export { default as ScreenShareNameDisplay } from './ScreenShareNameDisplay'; +export { default as ScreenSharingButton } from './ScreenSharingButton'; +export { default as Separator } from './Separator'; +export { default as SoundTest } from './SoundTest'; +export { default as Subscriber } from './Subscriber'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/css/App.css b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/css/App.css new file mode 100644 index 00000000..88268eb9 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/css/App.css @@ -0,0 +1,158 @@ +#root { + margin: 0 auto; + text-align: center; + height: 100dvh; + width: 100%; + box-sizing: border-box; +} + +body, +html { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +/* + This animation controls the bar height for the volume indicator of a publisher. + The bar starts at a minimal height of 25% and grows with the audio level + received from the participant. +*/ +@keyframes speech { + 0% { + height: 75%; + } + 100% { + height: 100%; + } +} + +/* + This animation moves an emoji from the bottom of the screen to the top. + The emoji starts with full opacity and fades out as it moves upwards. + As it moves up, the emoji scales down in size, changes its horizontal position, + and rotates side to side, creating a floating effect. +*/ +@keyframes moveEmoji { + 0% { + transform: translateX(0) rotate(0deg); + opacity: 1; + bottom: 0%; + } + + 20% { + transform: translateX(2rem) rotate(-8deg); + } + + 50% { + transform: translateX(4rem) rotate(16deg) scale(1); + opacity: 1; + } + + 75% { + transform: translateX(-2rem) rotate(-20deg) scale(0.5); + } + + 100% { + transform: translateX(0px) rotate(0deg) scale(0.2); + opacity: 0; + bottom: 100%; + } +} + +/* + HiddenParticipantsTile styles: + These rules style the avatar group shown when participants are hidden. + - The default border color is a dark gray. + - On hover, the border color becomes lighter to indicate interactivity. + - Smooth transition is applied to the border color for a subtle effect. +*/ +#hidden-participants .MuiAvatarGroup-root .MuiAvatar-root { + border-color: rgb(60, 64, 67); + transition-property: border-color; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +#hidden-participants:hover .MuiAvatarGroup-root .MuiAvatar-root { + border-color: rgb(76, 80, 82); +} + +.choose-background-effect-grid { + width: 100%; + max-height: 100%; + overflow-y: auto; + padding: 16px; + min-height: 0; +} + +.choose-background-effect-grid-waiting { + width: 100%; + overflow-y: auto; + padding: 8px; + max-height: 35vh; +} +@media (min-width: 899px) and (min-height: 920px) { + .choose-background-effect-grid-waiting { + max-height: 55vh; + } +} +@media (max-height: 875px) { + .choose-background-effect-grid-waiting { + max-height: 34vh; + } +} +@media (max-height: 750px) { + .choose-background-effect-grid-waiting { + max-height: 35vh; + } +} +@media (max-width: 600px) { + .choose-background-effect-grid-waiting { + max-height: 25vh; + } +} +@media (max-width: 425px) { + .choose-background-effect-grid-waiting { + max-height: 32vh; + } +} +@media (max-height: 680px) { + .choose-background-effect-grid-waiting { + max-height: 44vh; + } +} + +.add-background-effect-input .MuiInputBase-root { + color: #5f6368; +} + +.add-background-effect-input .MuiOutlinedInput-root .MuiOutlinedInput-notchedOutline { + border-color: #80868b; +} + +.add-background-effect-input .MuiOutlinedInput-root:hover .MuiOutlinedInput-notchedOutline { + border-color: #80868b; +} + +.add-background-effect-input .MuiOutlinedInput-root.Mui-focused .MuiOutlinedInput-notchedOutline { + border-color: #80868b; +} + +.add-background-effect-input input::placeholder { + color: #5f6368; + opacity: 1; +} + +.add-background-effect-input-icon { + color: #5f6368; +} + +.file-upload-drop-area-text { + font-size: 1rem; +} +@media (max-width: 375px) and (max-height: 667px) { + .file-upload-drop-area-text { + font-size: 0.9rem !important; + } +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/css/index.css b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/css/index.css new file mode 100644 index 00000000..ecbd2b99 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/css/index.css @@ -0,0 +1,38 @@ +@import 'tailwindcss'; + +/* Tailwind CSS v4 config directive */ +@config '../../tailwind.config.cjs'; + +/* Libs source - outside frontend, needs explicit @source */ +@source "../../../libs/ui/**/*.tsx"; + +@layer base { + /* + * The default border color has changed to `currentcolor` in Tailwind CSS v4, + * so we've added these compatibility styles to make sure everything still + * looks the same as it did with Tailwind CSS v3. + */ + *, + ::after, + ::before, + ::backdrop, + ::file-selector-button { + border-color: var(--color-gray-200, currentcolor); + } + + /* Default body text color to avoid black text on dark backgrounds */ + body { + color: var(--vera-text-secondary); + } + + /* + Backward compatibility after migrating from mui5 to mui9 + */ + .vera-dark-mode input:-webkit-autofill { + box-shadow: rgb(38, 103, 152) 0px 0px 0px 100px inset !important; + } + + .Mui-selected { + background-color: rgba(153, 65, 255, 0.08) !important; + } +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/env.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/env.ts new file mode 100644 index 00000000..2a35feb1 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/env.ts @@ -0,0 +1,247 @@ +import { z } from 'zod'; +import { LAYOUT_MODES, type LayoutMode } from './types/session'; + +declare const __APP_ENV__: Record; + +export type Lang = 'en' | 'it' | 'es' | 'es-MX' | 'en-US' | 'de'; + +export const RESOLUTIONS = [ + '1920x1080', + '1280x960', + '1280x720', + '640x480', + '640x360', + '320x240', + '320x180', +] as const; + +export type Resolution = (typeof RESOLUTIONS)[number]; + +export type Mode = 'development' | 'production' | 'test'; + +export type EnvArg = { + [key: string]: unknown; +}; + +const langValues = ['en', 'it', 'es', 'es-MX', 'en-US', 'de'] as const satisfies readonly Lang[]; +const langEnum = z.enum([...langValues] as [Lang, ...Lang[]]); + +const boolField = (defaultValue: boolean) => + z.preprocess((val) => { + if (val === undefined || val === null || val === '') return defaultValue; + if (typeof val === 'boolean') return val; + if (val === 'true') return true; + if (val === 'false') return false; + return val; + }, z.boolean()); + +const positiveIntField = (defaultValue: number) => + z.preprocess( + (val) => (val === undefined || val === null || val === '' ? defaultValue : Number(val)), + z.number().int().positive() + ); + +const intListField = (fallback: number[]) => + z.preprocess((val) => { + if (!val) return fallback; + if (typeof val !== 'string') throw new Error('Expected pipe-separated integer list'); + return val.split('|').map((v) => { + const n = Number(v.trim()); + if (!Number.isInteger(n) || n <= 0) throw new Error(`Invalid integer value in list: ${v}`); + return n; + }); + }, z.array(z.number().int().positive())); + +const optionalStringField = z.preprocess( + (val) => (val === undefined || val === null || val === '' ? undefined : val), + z.string().optional() +); + +const langListField = (fallback: Lang) => + z.preprocess((val) => { + if (!val) return [fallback]; + if (typeof val !== 'string') throw new Error('Invalid I18N_SUPPORTED_LANGUAGES'); + return val.split('|').map((l) => { + const lang = l.trim(); + if (!langValues.includes(lang as Lang)) + throw new Error(`Invalid supported language: ${lang}`); + return lang; + }); + }, z.array(langEnum)); + +const envSchema = z + .object({ + I18N_FALLBACK_LANGUAGE: z.preprocess( + (v) => (v === undefined || v === null || v === '' ? 'en' : v), + langEnum + ), + I18N_SUPPORTED_LANGUAGES: z.union([z.string(), z.null(), z.undefined()]).optional(), + ENABLE_REPORT_ISSUE: boolField(false), + ALLOW_BACKGROUND_EFFECTS: boolField(true), + ALLOW_CAMERA_CONTROL: boolField(true), + ALLOW_VIDEO_ON_JOIN: boolField(true), + DEFAULT_RESOLUTION: z.preprocess( + (v) => (v === undefined || v === null || v === '' ? undefined : v), + z.enum([...RESOLUTIONS] as [Resolution, ...Resolution[]]).optional() + ), + PUBLISHER_MAX_RESOLUTION: z.preprocess( + (v) => (v === undefined || v === null || v === '' ? '1920x1080' : v), + z.enum([...RESOLUTIONS] as [Resolution, ...Resolution[]]) + ), + NOTIFICATION_DURATION_MS: positiveIntField(4_000), + MIN_CUSTOM_VIDEO_BITRATE_BPS: positiveIntField(5_000), + MAX_CUSTOM_VIDEO_BITRATE_BPS: positiveIntField(10_000_000), + SUPPORTED_FRAME_RATES: intListField([30, 15, 7, 1]), + ALLOW_ADVANCED_NOISE_SUPPRESSION: boolField(true), + ALLOW_AUDIO_ON_JOIN: boolField(true), + ALLOW_MICROPHONE_CONTROL: boolField(true), + MEETING_ROOM_ALLOW_ADVANCED_SETTINGS: boolField(false), + WAITING_ROOM_ALLOW_ADVANCED_SETTINGS: boolField(false), + WAITING_ROOM_ALLOW_DEVICE_SELECTION: boolField(true), + ALLOW_ARCHIVING: boolField(true), + ALLOW_CAPTIONS: boolField(true), + ALLOW_CHAT: boolField(true), + MEETING_ROOM_ALLOW_DEVICE_SELECTION: boolField(true), + ALLOW_EMOJIS: boolField(true), + ALLOW_SCREEN_SHARE: boolField(true), + DEFAULT_LAYOUT_MODE: z.preprocess( + (v) => (v === undefined || v === null || v === '' ? 'active-speaker' : v), + z.enum([...LAYOUT_MODES] as [LayoutMode, ...LayoutMode[]]) + ), + SHOW_PARTICIPANT_LIST: boolField(true), + SHOW_VIDEO_STATS: boolField(false), + BYPASS_WAITING_ROOM: boolField(false), + API_URL: z.preprocess((v) => (v === undefined || v === null || v === '' ? '' : v), z.string()), + TUNNEL_DOMAIN: optionalStringField, + AVOID_FETCHING_APP_CONFIG: boolField(true), + MODE: z.preprocess( + (v) => v ?? 'development', + z.enum(['development', 'production', 'test'] as const) + ), + VONAGE_VIDEO_HOST: optionalStringField, + }) + .transform(({ I18N_FALLBACK_LANGUAGE, I18N_SUPPORTED_LANGUAGES, ...rest }) => ({ + ...rest, + I18N_FALLBACK_LANGUAGE, + I18N_SUPPORTED_LANGUAGES: langListField(I18N_FALLBACK_LANGUAGE).parse(I18N_SUPPORTED_LANGUAGES), + })); + +export class Env { + private raw: Partial; + private initialRaw: Partial; + + public ENABLE_REPORT_ISSUE!: boolean; + public I18N_FALLBACK_LANGUAGE!: Lang; + public I18N_SUPPORTED_LANGUAGES!: Lang[]; + + public ALLOW_BACKGROUND_EFFECTS!: boolean; + public ALLOW_CAMERA_CONTROL!: boolean; + public ALLOW_VIDEO_ON_JOIN!: boolean; + public DEFAULT_RESOLUTION!: Resolution | undefined; + public PUBLISHER_MAX_RESOLUTION!: Resolution; + public NOTIFICATION_DURATION_MS!: number; + public MIN_CUSTOM_VIDEO_BITRATE_BPS!: number; + public MAX_CUSTOM_VIDEO_BITRATE_BPS!: number; + public SUPPORTED_FRAME_RATES!: number[]; + public ALLOW_ADVANCED_NOISE_SUPPRESSION!: boolean; + public ALLOW_AUDIO_ON_JOIN!: boolean; + public ALLOW_MICROPHONE_CONTROL!: boolean; + public MEETING_ROOM_ALLOW_ADVANCED_SETTINGS!: boolean; + public WAITING_ROOM_ALLOW_ADVANCED_SETTINGS!: boolean; + public WAITING_ROOM_ALLOW_DEVICE_SELECTION!: boolean; + public ALLOW_ARCHIVING!: boolean; + public ALLOW_CAPTIONS!: boolean; + public ALLOW_CHAT!: boolean; + public MEETING_ROOM_ALLOW_DEVICE_SELECTION!: boolean; + public ALLOW_EMOJIS!: boolean; + public ALLOW_SCREEN_SHARE!: boolean; + public DEFAULT_LAYOUT_MODE!: LayoutMode; + public SHOW_PARTICIPANT_LIST!: boolean; + public SHOW_VIDEO_STATS!: boolean; + public BYPASS_WAITING_ROOM!: boolean; + public API_URL!: string; + public TUNNEL_DOMAIN!: string | undefined; + public AVOID_FETCHING_APP_CONFIG!: boolean; + public MODE!: Mode; + public VONAGE_VIDEO_HOST!: string | undefined; + + constructor(env: Record) { + this.raw = { ...env }; + this.initialRaw = { ...env }; + + const parsed = envSchema.parse(env); + Object.assign(this, parsed); + + this.setApiUrl(parsed.API_URL); + } + + /** + * Partially updates the environment variables at runtime. + * Useful for testing different configurations without reloading the page. + * @param {Partial} partial - An object containing the env variables to update. + */ + partialUpdate(partial: Partial) { + this.raw = { + ...this.raw, + ...partial, + }; + const next = new Env(this.raw); + const savedInitialRaw = this.initialRaw; + Object.assign(this, next); + this.initialRaw = savedInitialRaw; + } + + /** + * Resets all environment variables to their initial values when the Env instance was created. + * Useful for cleaning up after tests that call partialUpdate. + */ + reset() { + const next = new Env(this.initialRaw); + this.raw = { ...this.initialRaw }; + Object.assign(this, next); + } + + /** + * Sets API_URL based on the provided envUrl or defaults to window.location.origin. + * If envUrl is empty or undefined, it defaults to window.location.origin. + * If window.location.origin includes 'localhost', it defaults to 'http://localhost:3345' to account for typical local API setups. + * @param envUrl - The raw environment variable value for API_URL, which can be empty or undefined. + */ + setApiUrl(envUrl: string | undefined) { + const url = (() => { + if (!envUrl?.trim()) { + return window.location.origin.includes('localhost') + ? 'http://localhost:3345' + : window.location.origin; + } + + return envUrl; + })(); + + this.API_URL = url; + } + + /** + * Parses a '|'-separated string of language codes and updates I18N_SUPPORTED_LANGUAGES. + * Throws if any language code is not in the supported list. + * Falls back to I18N_FALLBACK_LANGUAGE when the value is empty or undefined. + * @param {unknown} value - Raw language string, e.g. "en|es|it". + */ + setSupportedLanguages(value: unknown) { + this.I18N_SUPPORTED_LANGUAGES = langListField(this.I18N_FALLBACK_LANGUAGE).parse(value); + } +} + +let env: Env; +let envInitError: Error | null = null; + +try { + env = new Env(__APP_ENV__); +} catch (error) { + envInitError = error instanceof Error ? error : new Error(String(error)); + // Provide a safe shell so that callers that import `env` at module level + // don't throw a second time on property access before EnvGuard re-throws. + env = {} as Env; +} + +export { env, envInitError }; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useAudioLevels.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useAudioLevels.spec.tsx new file mode 100644 index 00000000..484fe982 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useAudioLevels.spec.tsx @@ -0,0 +1,116 @@ +import { Mock, afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import { act, renderHook as renderHookBase, waitFor } from '@testing-library/react'; +import { Publisher } from '@vonage/client-sdk-video'; +import EventEmitter from 'events'; + +import { PublisherContextType } from '../../Context/PublisherProvider'; +import useAudioLevels from '../useAudioLevels'; +import usePublisherContext from '../usePublisherContext'; +import { makeTestProvider, ProviderOptions, providers } from '@test/providers'; + +vi.mock('../usePublisherContext.tsx'); + +const mockUsePublisherContext = usePublisherContext as Mock<[], PublisherContextType>; + +describe('usePublisherAudioLevels', () => { + let advanceDateNow: (ms: number) => void; + let mockPublisher: EventEmitter; + + beforeEach(() => { + let now = Date.now(); + + const dateNowSpy = vi.spyOn(global.Date, 'now').mockReturnValue(now); + advanceDateNow = (ms) => { + now += ms; + dateNowSpy.mockReturnValue(now); + }; + + mockPublisher = new EventEmitter(); + + const mockPublisherContext = { + publisher: mockPublisher as unknown as Publisher, + isPublishing: true, + } as PublisherContextType; + + mockUsePublisherContext.mockImplementation(() => mockPublisherContext); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + it('should set the audioLevel correctly', async () => { + const { result } = renderHook(() => useAudioLevels()); + // initially the audio level is set to 0 in the hook state + expect(result.current).toBe(0); + + act(() => { + mockPublisher.emit('audioLevelUpdated', { audioLevel: 0.11 }); + }); + advanceDateNow(50); + act(() => { + mockPublisher.emit('audioLevelUpdated', { audioLevel: 0.11 }); + }); + + // audio level should now not be 0 given we've received audio level events + await waitFor(() => expect(result.current).toBeGreaterThan(0)); + + advanceDateNow(51); + act(() => { + mockPublisher.emit('audioLevelUpdated', { audioLevel: 0.11 }); + }); + + await waitFor(() => expect(result.current).toBeGreaterThan(0)); + }); + + it('should throttle audio level updates', async () => { + const { result } = renderHook(() => useAudioLevels()); + expect(result.current).toBe(0); + + act(() => { + mockPublisher.emit('audioLevelUpdated', { audioLevel: 0.11 }); + }); + advanceDateNow(50); + act(() => { + mockPublisher.emit('audioLevelUpdated', { audioLevel: 0.12 }); + }); + + await waitFor(() => expect(result.current).toBeGreaterThan(0)); + + // Check if the throttling works + const initialLevel = result.current; + + advanceDateNow(20); + act(() => { + mockPublisher.emit('audioLevelUpdated', { audioLevel: 0.13 }); + }); + + // Since it's throttled, the level should not have changed yet + await waitFor(() => expect(result.current).toBe(initialLevel)); + + advanceDateNow(100); + act(() => { + mockPublisher.emit('audioLevelUpdated', { audioLevel: 0.14 }); + }); + + await waitFor(() => expect(result.current).toBeGreaterThan(initialLevel)); + }); +}); + +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; +}; + +function renderHook( + render: (initialProps: Props) => Result, + { userContext }: RenderOptions = {} +) { + const { wrapper, ...context } = makeTestProvider([providers.user], { + userContext, + }); + + return { + ...context, + ...renderHookBase(render, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useChat.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useChat.spec.tsx new file mode 100644 index 00000000..28bf0954 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useChat.spec.tsx @@ -0,0 +1,63 @@ +import { act, renderHook as renderHookBase } from '@testing-library/react'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import useChat from '../useChat'; +import { makeTestProvider, ProviderOptions, providers } from '@test/providers'; + +const mockSignal = vi.fn(); + +describe('useChat', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it('onChatMessage should parse message and update messages state', () => { + const { result } = renderHook(() => useChat({ signal: mockSignal })); + + act(() => { + result.current.onChatMessage('{"participantName":"Remote User","text":"Hello!"}'); + }); + + expect(result.current.messages[0]).toMatchObject({ + participantName: 'Remote User', + message: 'Hello!', + timestamp: expect.any(Number), + }); + }); + + it('sendChatMessage should send message via signal', () => { + const { result } = renderHook(() => useChat({ signal: mockSignal }), { + userContext: { + value: { + defaultSettings: { + name: 'Local User', + }, + }, + }, + }); + + result.current.sendChatMessage('Hello there!'); + + expect(mockSignal).toHaveBeenCalledWith({ + type: 'chat', + data: '{"participantName":"Local User","text":"Hello there!"}', + }); + }); +}); + +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; +}; + +function renderHook( + render: (initialProps: Props) => Result, + { userContext }: RenderOptions = {} +) { + const { wrapper, ...context } = makeTestProvider([providers.user], { + userContext, + }); + + return { + ...context, + ...renderHookBase(render, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useCollectBrowserInformation.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useCollectBrowserInformation.spec.tsx new file mode 100644 index 00000000..7ce79ea9 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useCollectBrowserInformation.spec.tsx @@ -0,0 +1,102 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import { renderHook as renderHookBase } from '@testing-library/react'; +import useCollectBrowserInformation from '../useCollectBrowserInformation'; +import { makeTestProvider, providers, ProviderOptions } from '@test/providers'; +import EventEmitter from 'events'; +import type VonageVideoClient from '@utils/VonageVideoClient'; + +describe('useCollectBrowserInformation', () => { + beforeEach(() => { + // Mock navigator properties + vi.spyOn(navigator, 'userAgent', 'get').mockReturnValue('FakeUserAgent'); + vi.spyOn(navigator, 'language', 'get').mockReturnValue('en-US'); + vi.spyOn(navigator, 'onLine', 'get').mockReturnValue(true); + vi.spyOn(navigator, 'cookieEnabled', 'get').mockReturnValue(true); + + // Mock window properties + vi.spyOn(window, 'innerWidth', 'get').mockReturnValue(1920); + vi.spyOn(window, 'innerHeight', 'get').mockReturnValue(1080); + vi.spyOn(window.screen, 'width', 'get').mockReturnValue(2560); + vi.spyOn(window.screen, 'height', 'get').mockReturnValue(1440); + + // Mock window.location with all required properties + const fakeUrl = { href: 'https://awesome-website.com' }; + vi.spyOn(window, 'location', 'get').mockReturnValue(fakeUrl as unknown as Location); + + // Mock document properties + vi.spyOn(document, 'referrer', 'get').mockReturnValue('https://awesome-referrer.com'); + + // Mock the date format + vi.spyOn(Intl.DateTimeFormat.prototype, 'resolvedOptions').mockReturnValue({ + timeZone: 'America/Chicago', + locale: 'en-US', + calendar: 'gregory', + numberingSystem: 'latn', + }); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + it('should collect all browser information correctly', () => { + const mockVonageVideoClient = Object.assign(new EventEmitter(), { + get sessionId() { + return 'someSessionId'; + }, + get connectionId() { + return 'yourConnectionId'; + }, + }) as VonageVideoClient; + + const { result } = render({ + sessionContext: { + __interceptor: (context) => { + if (context) { + context.vonageVideoClient = mockVonageVideoClient; + } + }, + }, + }); + + expect(result.current).toEqual({ + sessionId: 'someSessionId', + browser: 'FakeUserAgent', + screenResolution: '2560x1440', + referrer: 'https://awesome-referrer.com', + currentUrl: 'https://awesome-website.com', + timeZone: 'America/Chicago', + language: 'en-US', + isOnline: true, + cookiesEnabled: true, + windowSize: { + width: 1920, + height: 1080, + }, + connectionId: 'yourConnectionId', + }); + }); +}); + +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; + sessionContext?: ProviderOptions['SessionContext']; +}; + +function render({ sessionContext, userContext }: RenderOptions = {}) { + const { wrapper, ...context } = makeTestProvider( + [providers.user, providers.session, providers.runtime], + { + sessionContext, + userContext, + runtimeContext: undefined, + } + ); + + return { + ...context, + ...renderHookBase(() => useCollectBrowserInformation(), { + wrapper, + }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useDateTime.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useDateTime.spec.tsx new file mode 100644 index 00000000..6630935a --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useDateTime.spec.tsx @@ -0,0 +1,29 @@ +import { describe, it, expect, vi } from 'vitest'; +import { renderHook } from '@testing-library/react'; +import useDateTime from '../useDateTime'; + +describe('useDateTime', () => { + it('converts 21:12 to "9:12 PM"', () => { + const rawDate = new Date('June 27, 2024 21:12:00'); + vi.setSystemTime(rawDate); + const { result } = renderHook(() => useDateTime()); + + expect(result.current.time).toBe('9:12 PM'); + }); + + it('converts 0:15 to "12:15 AM"', () => { + const rawDate = new Date('June 27, 2024 0:15:00'); + vi.setSystemTime(rawDate); + const { result } = renderHook(() => useDateTime()); + + expect(result.current.time).toBe('12:15 AM'); + }); + + it('uses the correct date format', () => { + const rawDate = new Date('June 27, 2024 03:24:00'); + vi.setSystemTime(rawDate); + const { result } = renderHook(() => useDateTime()); + + expect(result.current.date).toBe('Thu, Jun 27'); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useDropdownResizeObserver.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useDropdownResizeObserver.spec.tsx new file mode 100644 index 00000000..24343ef9 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useDropdownResizeObserver.spec.tsx @@ -0,0 +1,66 @@ +import { describe, expect, it, vi } from 'vitest'; +import { renderHook } from '@testing-library/react'; +import { Dispatch, SetStateAction } from 'react'; +import ResizeObserver from 'resize-observer-polyfill'; +import useDropdownResizeObserver from '../useDropdownResizeObserver'; + +vi.mock('resize-observer-polyfill', () => ({ + default: vi.fn((cb: ResizeObserverCallback) => { + return { + observe: vi.fn().mockImplementation((target: HTMLElement) => { + const entry: ResizeObserverEntry = { + target, + contentRect: target.getBoundingClientRect(), + borderBoxSize: [{ inlineSize: target.clientWidth, blockSize: target.clientHeight }], + contentBoxSize: [{ inlineSize: target.clientWidth, blockSize: target.clientHeight }], + devicePixelContentBoxSize: [ + { inlineSize: target.clientWidth, blockSize: target.clientHeight }, + ], + }; + cb([entry], this as unknown as ResizeObserver); + }), + unobserve: vi.fn(), + disconnect: vi.fn(), + }; + }), +})); + +describe('useDropdownResizeObserver', () => { + const mockSetIsOpen = vi.fn() as Dispatch>; + let mockDropdownRefElement: HTMLElement; + + it('should initialize the resize observer', () => { + mockDropdownRefElement = document.createElement('div'); + + renderHook(() => + useDropdownResizeObserver({ + dropDownRefElement: mockDropdownRefElement, + setIsOpen: mockSetIsOpen, + }) + ); + expect(ResizeObserver).toHaveBeenCalled(); + }); + + it('should call the function to close the dropdown when the window is smaller than the dropdown', () => { + mockDropdownRefElement = document.createElement('div'); + Object.defineProperty(mockDropdownRefElement, 'offsetHeight', { + configurable: true, + writable: true, + value: 50, + }); + Object.defineProperty(window, 'innerHeight', { + configurable: true, + writable: true, + value: 500, + }); + + renderHook(() => + useDropdownResizeObserver({ + dropDownRefElement: mockDropdownRefElement, + setIsOpen: mockSetIsOpen, + }) + ); + + expect(mockSetIsOpen).toHaveBeenCalledWith(false); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useElementDimensions.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useElementDimensions.spec.tsx new file mode 100644 index 00000000..d5a5358f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useElementDimensions.spec.tsx @@ -0,0 +1,32 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import { renderHook } from '@testing-library/react'; +import { RefObject } from 'react'; +import useElementDimensions from '../useElementDimensions'; + +describe('useElementDimensions', () => { + let elementRef: RefObject; + + beforeEach(() => { + elementRef = { current: document.createElement('div') }; + Object.defineProperty(elementRef.current, 'offsetWidth', { + configurable: true, + writable: true, + value: 1, + }); + + Object.defineProperty(elementRef.current, 'offsetHeight', { + configurable: true, + writable: true, + value: 2, + }); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + it('initially returns dimensions as { width: 0, height: 0 }', () => { + const { result } = renderHook(() => useElementDimensions({ elementRef })); + expect(result.current).toEqual({ width: 0, height: 0 }); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useEmoji.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useEmoji.spec.tsx new file mode 100644 index 00000000..16f98d93 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useEmoji.spec.tsx @@ -0,0 +1,146 @@ +import { describe, it, expect, vi, afterEach, beforeEach } from 'vitest'; +import { renderHook, act, waitFor } from '@testing-library/react'; +import { Connection } from '@vonage/client-sdk-video'; +import useEmoji, { EmojiWrapper } from '../useEmoji'; +import { SignalEvent, SubscriberWrapper } from '../../types/session'; + +const mockSignal = vi.fn(); +const mockGetConnectionId = vi.fn(); +const mockConnection = { connectionId: '456' } as Connection; + +describe('useEmoji', () => { + beforeEach(() => { + mockGetConnectionId.mockReturnValue('123'); + }); + + afterEach(() => { + vi.useRealTimers(); + vi.resetAllMocks(); + }); + + describe('sendEmoji', () => { + it('calls Session.signal with the emoji and current time', () => { + vi.setSystemTime(12_000_000); + const { result } = renderHook(() => + useEmoji({ signal: mockSignal, getConnectionId: mockGetConnectionId }) + ); + + act(() => { + result.current.sendEmoji('❤️'); + }); + + expect(mockSignal).toBeCalledTimes(1); + expect(mockSignal).toBeCalledWith({ + type: 'emoji', + data: '{"emoji":"❤️","time":12000000}', + }); + }); + + it('when called multiple times, sendEmoji throttles calls to once every 500ms', () => { + vi.useFakeTimers(); + const { result } = renderHook(() => + useEmoji({ signal: mockSignal, getConnectionId: mockGetConnectionId }) + ); + + act(() => { + result.current.sendEmoji('❤️'); + result.current.sendEmoji('❤️'); + }); + + expect(mockSignal).toBeCalledTimes(1); + + vi.advanceTimersByTime(250); + expect(mockSignal).toBeCalledTimes(1); + + vi.advanceTimersByTime(251); + act(() => { + result.current.sendEmoji('❤️'); + }); + expect(mockSignal).toBeCalledTimes(2); + }); + }); + + it('adds emojis to the queue when a signal event is received and gets the correct sender name', async () => { + const { result } = renderHook(() => + useEmoji({ signal: mockSignal, getConnectionId: mockGetConnectionId }) + ); + + // Mock receiving a signal event from another user + act(() => { + const signalEvent: SignalEvent = { + type: 'signal:emoji', + data: JSON.stringify({ + emoji: '❤️', + time: Date.now(), + connectionId: mockConnection.connectionId, // Different from the session connection + }) as unknown as string, + from: { connectionId: '456', creationTime: 1, data: 'some-data' }, + }; + const subscriberWrapper: SubscriberWrapper = { + subscriber: { + stream: { + connection: { + connectionId: '456', + }, + name: 'John Doe', + }, + }, + } as unknown as SubscriberWrapper; + const subscriberWrappers = [subscriberWrapper]; + result.current.onEmoji(signalEvent, subscriberWrappers); + }); + + const expectedEmojiWrapper: EmojiWrapper = { + name: 'John Doe', // The mock connection user + emoji: '❤️', + time: expect.any(Number), + }; + + // Use waitFor to check if emojiQueue contains the expected emoji + await waitFor(() => { + expect(result.current.emojiQueue).toContainEqual(expectedEmojiWrapper); + }); + }); + + it('recognizes when a received signal event is from local user', async () => { + const { result } = renderHook(() => + useEmoji({ signal: mockSignal, getConnectionId: mockGetConnectionId }) + ); + + // Mock receiving a signal event from local user + act(() => { + const signalEvent: SignalEvent = { + type: 'signal:emoji', + data: JSON.stringify({ + emoji: '😲', + time: Date.now(), + connectionId: mockConnection.connectionId, // Different from the session connection + }) as unknown as string, + from: { connectionId: '123', creationTime: 1, data: 'some-data' }, + }; + const subscriberWrapper: SubscriberWrapper = { + subscriber: { + stream: { + connection: { + connectionId: '123', + }, + name: 'That be I', + }, + }, + } as unknown as SubscriberWrapper; + const subscriberWrappers = [subscriberWrapper]; + result.current.onEmoji(signalEvent, subscriberWrappers); + }); + + const expectedEmojiWrapper: EmojiWrapper = { + name: 'You', + emoji: '😲', + time: expect.any(Number), + }; + + // Use waitFor to check if emojiQueue contains the expected emoji + await waitFor(() => { + expect(result.current.emojiQueue).toContainEqual(expectedEmojiWrapper); + }); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useGoodByePage.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useGoodByePage.spec.tsx new file mode 100644 index 00000000..77c2d886 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useGoodByePage.spec.tsx @@ -0,0 +1,133 @@ +import { renderHook as renderHookBase, waitFor } from '@testing-library/react'; +import { describe, it, expect, vi, beforeEach, type Mock } from 'vitest'; +import { QueryClient } from '@tanstack/react-query'; +import useGoodByePage from '../useGoodByePage'; +import { useLocation, useParams } from 'react-router-dom'; +import { availableArchive } from '../../api/archiving/tests/data'; +import { makeTestProvider, providers, type ProviderOptions } from '@core-test/providers'; +import { makeVideoClientMock } from '@core-test/fixtures'; + +vi.mock('react-router-dom', async () => { + const actual = await vi.importActual('react-router-dom'); + return { + ...actual, + useLocation: vi.fn(() => ({ state: null, search: '', pathname: '/goodbye', hash: '' })), + useParams: vi.fn(() => ({ roomIdentifier: 'my-session-key' })), + }; +}); + +const mockUseParams = useParams as Mock; +const mockUseLocation = useLocation as Mock; + +type RenderOptions = { + runtimeContext?: ProviderOptions['RuntimeContext']; +}; + +function renderHook(render: () => Result, { runtimeContext }: RenderOptions = {}) { + const { wrapper, ...context } = makeTestProvider([providers.runtime], { + runtimeContext, + }); + + return { + ...context, + ...renderHookBase(render, { wrapper }), + }; +} + +describe('useGoodByePage', () => { + beforeEach(() => { + vi.clearAllMocks(); + mockUseParams.mockReturnValue({ roomIdentifier: 'my-session-key' }); + }); + + it('returns the sessionKey from URL params', () => { + const videoClient = makeVideoClientMock({ + searchArchives: Promise.resolve({ items: [], count: 0 }), + }); + const { result } = renderHook(() => useGoodByePage(), { runtimeContext: { videoClient } }); + expect(result.current.sessionKey).toBe('my-session-key'); + }); + + it('fetches archives from videoClient with sessionKey', async () => { + const videoClient = makeVideoClientMock({ + searchArchives: vi.fn().mockResolvedValue({ items: [], count: 0 }), + }); + + renderHook(() => useGoodByePage(), { runtimeContext: { videoClient } }); + + await waitFor(() => { + expect(videoClient.searchArchives).toHaveBeenCalled(); + }); + + expect(videoClient.searchArchives).toHaveBeenCalledWith({ + sessionKey: 'my-session-key', + count: undefined, + offset: undefined, + }); + }); + + it('forwards archives from videoClient', async () => { + const videoClient = makeVideoClientMock({ + searchArchives: Promise.resolve({ + items: [availableArchive], + count: 1, + } as unknown as ReturnType), + }); + const { result } = renderHook(() => useGoodByePage(), { runtimeContext: { videoClient } }); + + await waitFor(() => { + expect(result.current.archives).not.toBe('error'); + }); + + expect(result.current.archives).toEqual([availableArchive]); + }); + + it('forwards "error" from videoClient when archives fail to load', async () => { + const videoClient = makeVideoClientMock({ + searchArchives: vi.fn().mockRejectedValue(new Error('Failed')), + }); + const queryClient = new QueryClient({ defaultOptions: { queries: { retry: 0 } } }); + const { result } = renderHook(() => useGoodByePage(), { + runtimeContext: { videoClient, queryClient }, + }); + + await waitFor(() => { + expect(result.current.archives).toBe('Failed'); + }); + }); + + it('uses location.state header when provided', () => { + mockUseLocation.mockReturnValue({ + state: { header: 'Custom Header', caption: 'Custom Caption' }, + }); + + const videoClient = makeVideoClientMock({ + searchArchives: Promise.resolve({ items: [], count: 0 }), + }); + const { result } = renderHook(() => useGoodByePage(), { runtimeContext: { videoClient } }); + expect(result.current.header).toBe('Custom Header'); + expect(result.current.caption).toBe('Custom Caption'); + }); + + it('falls back to default i18n header when location.state is null', () => { + mockUseLocation.mockReturnValue({ state: null }); + + const videoClient = makeVideoClientMock({ + searchArchives: Promise.resolve({ items: [], count: 0 }), + }); + const { result } = renderHook(() => useGoodByePage(), { runtimeContext: { videoClient } }); + expect(typeof result.current.header).toBe('string'); + expect(result.current.header.length).toBeGreaterThan(0); + }); + + it('falls back to default i18n caption when location.state has no caption', () => { + mockUseLocation.mockReturnValue({ state: { header: 'Some Header' } }); + + const videoClient = makeVideoClientMock({ + searchArchives: Promise.resolve({ items: [], count: 0 }), + }); + const { result } = renderHook(() => useGoodByePage(), { runtimeContext: { videoClient } }); + expect(typeof result.current.caption).toBe('string'); + expect(result.current.caption.length).toBeGreaterThan(0); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useIsSmallViewport.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useIsSmallViewport.spec.tsx new file mode 100644 index 00000000..da0527e2 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useIsSmallViewport.spec.tsx @@ -0,0 +1,47 @@ +import { renderHook } from '@testing-library/react'; +import { describe, it, expect, beforeEach, vi, afterAll } from 'vitest'; +import useIsSmallViewport from '../useIsSmallViewport'; +import { SMALL_VIEWPORT } from '../../utils/constants'; + +const matchMediaCommon = { + onchange: null, + addListener: vi.fn(), + removeListener: vi.fn(), + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + dispatchEvent: vi.fn(), +}; + +describe('useIsSmallViewport', () => { + const originalMatchMedia = globalThis.matchMedia; + + beforeEach(() => { + globalThis.matchMedia = vi.fn((query) => ({ + matches: new RegExp(`\\(max-width:\\s*${SMALL_VIEWPORT + 1}px\\)`).test(query), + media: query, + ...matchMediaCommon, + })); + }); + + afterAll(() => { + globalThis.matchMedia = originalMatchMedia; + }); + + it('should return false when window width is greater than 768px', () => { + const { result } = renderHook(() => useIsSmallViewport()); + + expect(result.current).toBe(false); + }); + + it('should return true when window width is less than or equal to 768px', () => { + globalThis.matchMedia = vi.fn((query: string) => ({ + matches: new RegExp(`\\(max-width:\\s*${SMALL_VIEWPORT}px\\)`).test(query), + media: query, + ...matchMediaCommon, + })); + + const { result } = renderHook(() => useIsSmallViewport()); + + expect(result.current).toBe(true); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useIsTabletViewport.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useIsTabletViewport.spec.tsx new file mode 100644 index 00000000..b3c4648f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useIsTabletViewport.spec.tsx @@ -0,0 +1,46 @@ +import { renderHook } from '@testing-library/react'; +import { describe, it, expect, beforeEach, vi, afterAll } from 'vitest'; +import useIsTabletViewport from '../useIsTabletViewport'; +import { TABLET_VIEWPORT } from '../../utils/constants'; + +const matchMediaCommon = { + onchange: null, + addListener: vi.fn(), + removeListener: vi.fn(), + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + dispatchEvent: vi.fn(), +}; + +describe('useIsTabletViewport', () => { + const originalMatchMedia = globalThis.matchMedia; + + beforeEach(() => { + globalThis.matchMedia = vi.fn((query) => ({ + matches: new RegExp(`\\(max-width:\\s*${TABLET_VIEWPORT + 1}px\\)`).test(query), + media: query, + ...matchMediaCommon, + })); + }); + + afterAll(() => { + globalThis.matchMedia = originalMatchMedia; + }); + + it('should return false when globalThis width is greater than 899px', () => { + const { result } = renderHook(() => useIsTabletViewport()); + + expect(result.current).toBe(false); + }); + + it('should return true when globalThis width is less than or equal to 899px', () => { + globalThis.matchMedia = vi.fn((query: string) => ({ + matches: new RegExp(`\\(max-width:\\s*${TABLET_VIEWPORT}px\\)`).test(query), + media: query, + ...matchMediaCommon, + })); + const { result } = renderHook(() => useIsTabletViewport()); + + expect(result.current).toBe(true); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useLayoutManager.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useLayoutManager.spec.tsx new file mode 100644 index 00000000..d533c7db --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useLayoutManager.spec.tsx @@ -0,0 +1,44 @@ +import { describe, it, vi } from 'vitest'; +import type * as OpentokLayout from 'opentok-layout-js'; + +const layoutContainer: OpentokLayout.LayoutContainer = { + getLayout: vi.fn(), + layout: vi.fn(), + setOptions: vi.fn(), +}; + +vi.mock('opentok-layout-js', () => { + const OpenTokLayoutManager = vi.fn(() => layoutContainer); + + return { __esModule: true, default: OpenTokLayoutManager, Box: vi.fn(), Element: vi.fn() }; +}); + +import useLayoutManager from '../useLayoutManager'; +import { renderHook } from '@testing-library/react'; +import OpenTokLayoutManager from 'opentok-layout-js'; + +describe('useLayoutManager', () => { + it('returns a memoized getLayout function that delegates to OpenTokLayoutManager', () => { + const { result } = renderHook(() => useLayoutManager()); + + const elements = [{}, {}] as OpentokLayout.Element[]; + const containerDimensions = { height: 600, width: 800 }; + const shouldMakeLargeTilesLandscape = false; + + const layout = result.current(containerDimensions, elements, shouldMakeLargeTilesLandscape); + + expect(layoutContainer.getLayout).toHaveBeenCalledWith(elements); + expect(OpenTokLayoutManager).toHaveBeenCalledTimes(1); + + expect(OpenTokLayoutManager).toHaveBeenCalledWith( + expect.objectContaining({ + bigMaxRatio: 3 / 2, // hard code ratio when shouldMakeLargeTilesLandscape is false + containerWidth: containerDimensions.width, + containerHeight: containerDimensions.height, + }) + ); + + // make sure there is a return value + expect(layout).toBeDefined(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useMeetingRoom.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useMeetingRoom.spec.tsx new file mode 100644 index 00000000..a911674b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useMeetingRoom.spec.tsx @@ -0,0 +1,198 @@ +import { waitFor, renderHook as renderHookBase } from '@testing-library/react'; +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import useMeetingRoom from '../useMeetingRoom'; +import { makeTestProvider, ProviderOptions, providers } from '@test/providers'; +import MemoryRouter from '@test/RouterWrapper'; +import { DEVICE_ACCESS_STATUS } from '@utils/constants'; +import { env } from '../../env'; +import type { VideoClient } from '@core/services'; + +const mockSessionId = '1_MX4xMjM0NTY3OH4-VGh1IEZlYiAyNyAwODozMjozNCBQU1QgMjAyMH4wLjI0NDYxMjE'; +const validSessionKey = + 'eyJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uSWQiOiIxX01YNHhNak0wTlRZM09INC1WR2gxSUVabFlpQXlOeUF3T0Rvek1qb3pOQ0JRVTFRZ01qQXlNSDR3TGpJME5EWXhNakUiLCJyb29tTmFtZSI6IlRlc3RDb21wb25lbnRSb29tIn0.fakesig'; + +const { mockCreateSessionMutate, mockJoinSessionMutate, mockVideoClient } = vi.hoisted(() => { + const mockCreateSessionMutate = vi.fn(); + const mockJoinSessionMutate = vi.fn(); + const mockVideoClient = { + createSession: (...args: unknown[]) => mockCreateSessionMutate(...args) as unknown, + joinSession: (...args: unknown[]) => mockJoinSessionMutate(...args) as unknown, + }; + return { mockCreateSessionMutate, mockJoinSessionMutate, mockVideoClient }; +}); + +const mockNavigate = vi.fn(); +const mockLocation = { search: '' }; + +vi.mock('react-router-dom', async () => { + const actual = await vi.importActual('react-router-dom'); + return { + ...actual, + useNavigate: () => mockNavigate, + useLocation: () => mockLocation, + useParams: () => ({ roomIdentifier: 'test-room' }), + }; +}); + +vi.mock('../useIsSmallViewport', () => ({ + default: () => false, +})); + +vi.mock('../useScreenShare', () => ({ + default: () => ({ + isSharingScreen: false, + screensharingPublisher: null, + screenshareVideoElement: null, + toggleShareScreen: vi.fn(), + }), +})); + +vi.mock('../useBackgroundPublisherContext', () => ({ + default: () => ({ + initBackgroundLocalPublisher: vi.fn(), + publisher: null, + accessStatus: DEVICE_ACCESS_STATUS.ACCEPTED, + }), +})); + +describe('useMeetingRoom', () => { + beforeEach(() => { + vi.clearAllMocks(); + mockLocation.search = ''; + env.BYPASS_WAITING_ROOM = false; + mockCreateSessionMutate.mockResolvedValue({ sessionKey: validSessionKey }); + mockJoinSessionMutate.mockResolvedValue({ token: 'mock-token', sessionId: mockSessionId }); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + it('returns all expected fields', async () => { + const { result } = renderHook(() => useMeetingRoom()); + + await waitFor(() => { + expect(result.current).toMatchObject({ + isSharingScreen: false, + subscriberWrappers: [], + reconnecting: false, + isRecording: false, + isVideoEnabled: true, + }); + }); + }); + + it('isRecording is true when archiveId is set', async () => { + const { result } = renderHook(() => useMeetingRoom(), { + sessionContext: { initialValue: { archiveId: 'archive-123' } }, + }); + + await waitFor(() => { + expect(result.current.isRecording).toBe(true); + }); + }); + + it('navigates to waiting room when username is missing and bypass is false', async () => { + renderHook(() => useMeetingRoom(), { + userContext: { value: { defaultSettings: { name: '' } } }, + }); + + await waitFor(() => { + expect(mockNavigate).toHaveBeenCalledWith('/waiting-room/test-room'); + }); + }); + + it('does not navigate to waiting room when bypass is true', async () => { + mockLocation.search = '?bypass=true'; + const mockJoinRoom = vi.fn(); + + renderHook(() => useMeetingRoom(), { + userContext: { value: { defaultSettings: { name: '' } } }, + sessionContext: { + __interceptor: (ctx) => { + if (ctx) ctx.joinRoom = mockJoinRoom; + }, + }, + }); + + await waitFor(() => { + expect(mockJoinRoom).toHaveBeenCalledWith({ sessionKey: validSessionKey }); + }); + expect(mockNavigate).not.toHaveBeenCalledWith('/waiting-room/test-room'); + }); + + it('navigates to goodbye when publishingError is set and user is online', async () => { + vi.spyOn(navigator, 'onLine', 'get').mockReturnValue(true); + + renderHook(() => useMeetingRoom(), { + publisherContext: { + initialValue: { + publishingError: { header: 'Publisher error', caption: 'Could not publish' }, + }, + }, + }); + + await waitFor(() => { + expect(mockNavigate).toHaveBeenCalledWith( + '/goodbye/test-room', + expect.objectContaining({ + state: expect.objectContaining({ + header: 'Publisher error', + caption: 'Could not publish', + }), + }) + ); + }); + }); + + it('does not navigate to goodbye when reconnecting is true', async () => { + vi.spyOn(navigator, 'onLine', 'get').mockReturnValue(true); + + renderHook(() => useMeetingRoom(), { + publisherContext: { + initialValue: { + publishingError: { header: 'err', caption: 'desc' }, + }, + }, + sessionContext: { initialValue: { reconnecting: true } }, + }); + + await new Promise((r) => setTimeout(r, 50)); + expect(mockNavigate).not.toHaveBeenCalledWith('/goodbye/test-room', expect.anything()); + }); +}); + +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; + sessionContext?: ProviderOptions['SessionContext']; + publisherContext?: ProviderOptions['PublisherContext']; +}; + +function renderHook( + render: () => Result, + { userContext, sessionContext, publisherContext }: RenderOptions = {} +) { + const { wrapper: ProvidersWrapper, ...context } = makeTestProvider( + [providers.user, providers.session, providers.publisher, providers.runtime], + { + userContext: { + value: { defaultSettings: { name: 'Test User' } }, + ...userContext, + }, + sessionContext, + publisherContext, + runtimeContext: { videoClient: mockVideoClient as unknown as VideoClient }, + } + ); + + const RouterWrapper = ({ children }: { children: React.ReactNode }) => ( + + {children} + + ); + + return { + ...context, + ...renderHookBase(render, { wrapper: RouterWrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/usePushToTalk.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/usePushToTalk.spec.tsx new file mode 100644 index 00000000..558f0a28 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/usePushToTalk.spec.tsx @@ -0,0 +1,150 @@ +import { useState } from 'react'; +import { describe, it, expect, vi } from 'vitest'; +import { render, act } from '@testing-library/react'; +import usePushToTalk from '../usePushToTalk'; + +type FixtureProps = { enabled: boolean; onToggle: () => void; initialAudioEnabled?: boolean }; + +const PushToTalkFixture = ({ enabled, onToggle, initialAudioEnabled = false }: FixtureProps) => { + const [isAudioEnabled, setIsAudioEnabled] = useState(initialAudioEnabled); + + const toggleAudio = () => { + onToggle(); + setIsAudioEnabled((prev) => !prev); + }; + + usePushToTalk({ enabled, isAudioEnabled, toggleAudio }); + return null; +}; + +describe('usePushToTalk', () => { + it('does nothing when disabled', () => { + const onToggle = vi.fn(); + render(); + + act(() => { + globalThis.dispatchEvent( + new KeyboardEvent('keydown', { key: ' ', code: 'Space', bubbles: true }) + ); + globalThis.dispatchEvent( + new KeyboardEvent('keyup', { key: ' ', code: 'Space', bubbles: true }) + ); + }); + + expect(onToggle).not.toHaveBeenCalled(); + }); + + it('unmutes on Space down and mutes on Space up when enabled', () => { + const onToggle = vi.fn(); + render(); + + act(() => { + globalThis.dispatchEvent( + new KeyboardEvent('keydown', { key: ' ', code: 'Space', bubbles: true }) + ); + }); + expect(onToggle).toHaveBeenCalledTimes(1); + + act(() => { + globalThis.dispatchEvent( + new KeyboardEvent('keyup', { key: ' ', code: 'Space', bubbles: true }) + ); + }); + expect(onToggle).toHaveBeenCalledTimes(2); + }); + + it('ignores auto-repeat keydown while Space is held', () => { + const onToggle = vi.fn(); + render(); + + act(() => { + globalThis.dispatchEvent( + new KeyboardEvent('keydown', { key: ' ', code: 'Space', bubbles: true }) + ); + }); + expect(onToggle).toHaveBeenCalledTimes(1); + + act(() => { + globalThis.dispatchEvent( + new KeyboardEvent('keydown', { key: ' ', code: 'Space', bubbles: true, repeat: true }) + ); + }); + expect(onToggle).toHaveBeenCalledTimes(1); + + act(() => { + globalThis.dispatchEvent( + new KeyboardEvent('keyup', { key: ' ', code: 'Space', bubbles: true }) + ); + }); + expect(onToggle).toHaveBeenCalledTimes(2); + }); + + it('ignores Space events originating from text-entry elements', () => { + const onToggle = vi.fn(); + render(); + + const input = document.createElement('input'); + document.body.appendChild(input); + + try { + act(() => { + input.dispatchEvent( + new KeyboardEvent('keydown', { key: ' ', code: 'Space', bubbles: true }) + ); + input.dispatchEvent(new KeyboardEvent('keyup', { key: ' ', code: 'Space', bubbles: true })); + }); + + expect(onToggle).not.toHaveBeenCalled(); + } finally { + input.remove(); + } + }); + + it('does not mute on keyup if mic was already unmuted before Space press', () => { + const onToggle = vi.fn(); + render(); + + act(() => { + globalThis.dispatchEvent( + new KeyboardEvent('keydown', { key: ' ', code: 'Space', bubbles: true }) + ); + }); + expect(onToggle).toHaveBeenCalledTimes(0); + + act(() => { + globalThis.dispatchEvent( + new KeyboardEvent('keyup', { key: ' ', code: 'Space', bubbles: true }) + ); + }); + expect(onToggle).toHaveBeenCalledTimes(0); + }); + + it('resets state when disabled while holding Space', () => { + const onToggle = vi.fn(); + const { rerender } = render(); + + act(() => { + globalThis.dispatchEvent( + new KeyboardEvent('keydown', { key: ' ', code: 'Space', bubbles: true }) + ); + }); + expect(onToggle).toHaveBeenCalledTimes(1); + + rerender(); + rerender(); + + act(() => { + globalThis.dispatchEvent( + new KeyboardEvent('keyup', { key: ' ', code: 'Space', bubbles: true }) + ); + }); + expect(onToggle).toHaveBeenCalledTimes(1); + + act(() => { + globalThis.dispatchEvent( + new KeyboardEvent('keydown', { key: ' ', code: 'Space', bubbles: true }) + ); + }); + expect(onToggle).toHaveBeenCalledTimes(1); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useReceivingCaptions.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useReceivingCaptions.spec.tsx new file mode 100644 index 00000000..bd5590c3 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useReceivingCaptions.spec.tsx @@ -0,0 +1,84 @@ +import { renderHook, act } from '@testing-library/react'; +import { describe, it, expect, vi } from 'vitest'; +import { Subscriber } from '@vonage/client-sdk-video'; +import { EventEmitter } from 'events'; +import useReceivingCaptions from '../useReceivingCaptions'; +import { SubscriberWrapper } from '../../types/session'; + +type TestSubscriber = Subscriber & EventEmitter; + +describe('useReceivingCaptions', () => { + const createSubscriberWrapper = (id: string): SubscriberWrapper => { + const mockSubscriber = Object.assign(new EventEmitter(), { + id, + on: vi.fn((event, handler) => { + EventEmitter.prototype.on.call(mockSubscriber, event, handler); + }), + off: vi.fn((event, handler) => { + EventEmitter.prototype.off.call(mockSubscriber, event, handler); + }), + videoWidth: () => 1280, + videoHeight: () => 720, + subscribeToVideo: () => {}, + stream: { + streamId: id, + name: 'Test User', + }, + }) as unknown as TestSubscriber; + + return { + id, + element: document.createElement('video'), + isScreenshare: false, + isPinned: false, + subscriber: mockSubscriber, + }; + }; + + it('should return initial empty values when no subscriber is provided', () => { + const { result } = renderHook(() => useReceivingCaptions({ subscriber: undefined })); + + expect(result.current).toEqual({ + caption: '', + isReceivingCaptions: false, + }); + }); + + it('should subscribe to captionReceived events when there is a subscriber', () => { + const mockSubscriber = createSubscriberWrapper('subscriber-1').subscriber; + renderHook(() => useReceivingCaptions({ subscriber: mockSubscriber })); + + expect(mockSubscriber.on).toHaveBeenCalledTimes(1); + expect(mockSubscriber.on).toHaveBeenCalledWith('captionReceived', expect.any(Function)); + }); + + it('should unsubscribe from captionReceived events when the hook gets unmounted', () => { + const mockSubscriber = createSubscriberWrapper('subscriber-1').subscriber; + const { unmount } = renderHook(() => useReceivingCaptions({ subscriber: mockSubscriber })); + + unmount(); + + expect(mockSubscriber.off).toHaveBeenCalledTimes(1); + expect(mockSubscriber.off).toHaveBeenCalledWith('captionReceived', expect.any(Function)); + }); + + it('should update caption and isReceivingCaptions on captionReceived event', () => { + const mockSubscriber = createSubscriberWrapper('subscriber-1').subscriber; + + const { result } = renderHook(() => useReceivingCaptions({ subscriber: mockSubscriber })); + + expect(result.current.caption).toBe(''); + expect(result.current.isReceivingCaptions).toBe(false); + + act(() => { + (mockSubscriber as unknown as EventEmitter).emit('captionReceived', { + streamId: 'subscriber-1', + caption: 'Test Caption', + isFinal: true, + }); + }); + + expect(result.current.caption).toBe('Test Caption'); + expect(result.current.isReceivingCaptions).toBe(true); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useRightPannel.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useRightPannel.spec.tsx new file mode 100644 index 00000000..1f3df3aa --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useRightPannel.spec.tsx @@ -0,0 +1,93 @@ +import { describe, it, expect } from 'vitest'; +import { renderHook, act } from '@testing-library/react'; +import useRightPanel from '../useRightPanel'; + +describe('useRightPanel hook', () => { + it('should initialize with activeTab "closed" and unreadCount 0', () => { + const { result } = renderHook(() => useRightPanel()); + + expect(result.current.rightPanelState.activeTab).toBe('closed'); + expect(result.current.rightPanelState.unreadCount).toBe(0); + }); + + it('should toggle participant list visibility', () => { + const { result } = renderHook(() => useRightPanel()); + + act(() => { + result.current.toggleParticipantList(); + }); + + expect(result.current.rightPanelState.activeTab).toBe('participant-list'); + + act(() => { + result.current.toggleParticipantList(); + }); + + expect(result.current.rightPanelState.activeTab).toBe('closed'); + }); + + it('should toggle chat visibility and reset unreadCount', () => { + const { result } = renderHook(() => useRightPanel()); + + act(() => { + result.current.toggleChat(); + }); + + expect(result.current.rightPanelState.activeTab).toBe('chat'); + expect(result.current.rightPanelState.unreadCount).toBe(0); + + act(() => { + result.current.incrementUnreadCount(); + }); + + expect(result.current.rightPanelState.unreadCount).toBe(0); + }); + + it('should increment unreadCount when activeTab is not "chat"', () => { + const { result } = renderHook(() => useRightPanel()); + + act(() => { + result.current.incrementUnreadCount(); + }); + + expect(result.current.rightPanelState.unreadCount).toBe(1); + + act(() => { + result.current.incrementUnreadCount(); + }); + + expect(result.current.rightPanelState.unreadCount).toBe(2); + }); + + it('should close the right panel', () => { + const { result } = renderHook(() => useRightPanel()); + + act(() => { + result.current.toggleChat(); + }); + + expect(result.current.rightPanelState.activeTab).toBe('chat'); + + act(() => { + result.current.closeRightPanel(); + }); + + expect(result.current.rightPanelState.activeTab).toBe('closed'); + }); + + it('should toggle report issue tab visibility', () => { + const { result } = renderHook(() => useRightPanel()); + + act(() => { + result.current.toggleReportIssue(); + }); + + expect(result.current.rightPanelState.activeTab).toBe('issues'); + + act(() => { + result.current.toggleReportIssue(); + }); + + expect(result.current.rightPanelState.activeTab).toBe('closed'); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useRoomShareUrl.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useRoomShareUrl.spec.tsx new file mode 100644 index 00000000..8dd552a9 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useRoomShareUrl.spec.tsx @@ -0,0 +1,29 @@ +import { renderHook } from '@testing-library/react'; +import { beforeAll, describe, expect, it, vi } from 'vitest'; +import useRoomShareUrl from '../useRoomShareUrl'; +import { makeTestProvider, providers } from '@test/providers'; + +// A valid fake JWT containing sessionId: '1_MX4xMjM0NTY3OH4-VGh1IEZlYiAyNyAwODozMjozNCBQU1QgMjAyMH4wLjI0NDYxMjE' +const mockSessionKey = + 'eyJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uSWQiOiIxX01YNHhNak0wTlRZM09INC1WR2gxSUVabFlpQXlOeUF3T0Rvek1qb3pOQ0JRVTFRZ01qQXlNSDR3TGpJME5EWXhNakUiLCJyb29tTmFtZSI6IlRlc3RDb21wb25lbnRSb29tIn0.fakesig'; + +describe('useRoomShareUrl', () => { + beforeAll(() => { + vi.spyOn(window, 'location', 'get').mockReturnValue({ + origin: 'https://example.com', + } as unknown as Location); + }); + + it('should return link to waiting room', () => { + const { wrapper } = makeTestProvider([providers.user, providers.session, providers.runtime], { + sessionContext: { + initialValue: { sessionKey: mockSessionKey }, + }, + userContext: undefined, + runtimeContext: undefined, + }); + + const { result } = renderHook(() => useRoomShareUrl(), { wrapper }); + expect(result.current).toBe(`https://example.com/waiting-room/${mockSessionKey}`); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useScreenShare.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useScreenShare.spec.tsx new file mode 100644 index 00000000..b5a24a84 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useScreenShare.spec.tsx @@ -0,0 +1,314 @@ +import { beforeEach, afterEach, describe, expect, it, vi } from 'vitest'; +import { renderHook as renderHookBase, act } from '@testing-library/react'; +import { Publisher, initPublisher } from '@vonage/client-sdk-video'; +import useScreenShare from '../useScreenShare'; +import { makeTestProvider, providers, ProviderOptions } from '@test/providers'; +import EventEmitter from 'events'; +import type VonageVideoClient from '../../utils/VonageVideoClient'; +import { type UserContextType } from '../../Context/user'; + +// Mocking dependencies +vi.mock('@vonage/client-sdk-video', () => ({ + initPublisher: vi.fn(), +})); + +describe('useScreenSharing', () => { + let mockVonageVideoClient: Partial; + let mockPublisher: Partial; + let handlers: Record void>; + const mockPublish = vi.fn(); + const mockUnpublish = vi.fn(); + + beforeEach(() => { + handlers = {}; + mockVonageVideoClient = Object.assign(new EventEmitter(), { + on: vi.fn(), + off: vi.fn(), + }) as unknown as Partial as VonageVideoClient; + + mockPublisher = { + on: vi.fn((event, cb) => { + handlers[event] = cb; + }), + destroy: vi.fn(), + } as unknown as Partial; + + (initPublisher as ReturnType).mockReturnValue(mockPublisher as Publisher); + }); + + afterEach(() => { + vi.clearAllMocks(); + }); + + it('initializes screen sharing publisher and publishes', async () => { + const { result } = render({ + userContext: { + __interceptor: (context: UserContextType | null) => { + context!.user.defaultSettings.name = 'TestUser'; + }, + }, + sessionContext: { + __interceptor: (context) => { + if (context) { + context.vonageVideoClient = mockVonageVideoClient as unknown as VonageVideoClient; + context.publish = mockPublish; + context.unpublish = mockUnpublish; + } + }, + }, + }); + + await act(async () => { + // toggling screen share on + await result.current.toggleShareScreen(); + }); + + expect(initPublisher).toHaveBeenCalledWith( + undefined, + { + videoSource: 'screen', + insertDefaultUI: false, + videoContentHint: 'detail', + name: "TestUser's screen", + }, + expect.any(Function) + ); + expect(mockPublisher.on).toHaveBeenCalledWith('streamCreated', expect.any(Function)); + expect(mockPublisher.on).toHaveBeenCalledWith('streamDestroyed', expect.any(Function)); + expect(mockPublisher.on).toHaveBeenCalledWith('mediaStopped', expect.any(Function)); + }); + + it('unpublishes screen sharing when already sharing', async () => { + const { result } = render({ + userContext: { + __interceptor: (context: UserContextType | null) => { + context!.user.defaultSettings.name = 'TestUser'; + }, + }, + sessionContext: { + __interceptor: (context) => { + if (context) { + context.vonageVideoClient = mockVonageVideoClient as unknown as VonageVideoClient; + context.publish = mockPublish; + context.unpublish = mockUnpublish; + } + }, + }, + }); + + await act(async () => { + // toggling screen share on + await result.current.toggleShareScreen(); + // toggling screen share off + await result.current.toggleShareScreen(); + }); + + expect(result.current.isSharingScreen).toBe(false); + }); + + it('sets isEntireScreen to true when displaySurface is monitor', async () => { + const { result } = render({ + userContext: { + __interceptor: (context: UserContextType | null) => { + context!.user.defaultSettings.name = 'TestUser'; + }, + }, + sessionContext: { + __interceptor: (context) => { + if (context) { + context.vonageVideoClient = mockVonageVideoClient as unknown as VonageVideoClient; + context.publish = mockPublish; + context.unpublish = mockUnpublish; + } + }, + }, + }); + + await act(async () => { + await result.current.toggleShareScreen(); + }); + + const mockVideoEl = { + srcObject: { + getVideoTracks: () => [{ getSettings: () => ({ displaySurface: 'monitor' }) }], + }, + } as unknown as HTMLVideoElement; + + act(() => { + handlers['videoElementCreated']({ element: mockVideoEl }); + }); + + expect(result.current.isEntireScreen).toBe(true); + expect(result.current.screenshareVideoElement).toBe(mockVideoEl); + }); + + it('sets isEntireScreen to false when displaySurface is window', async () => { + const { result } = render({ + userContext: { + __interceptor: (context: UserContextType | null) => { + context!.user.defaultSettings.name = 'TestUser'; + }, + }, + sessionContext: { + __interceptor: (context) => { + if (context) { + context.vonageVideoClient = mockVonageVideoClient as unknown as VonageVideoClient; + context.publish = mockPublish; + context.unpublish = mockUnpublish; + } + }, + }, + }); + + await act(async () => { + await result.current.toggleShareScreen(); + }); + + const mockVideoEl = { + srcObject: { + getVideoTracks: () => [{ getSettings: () => ({ displaySurface: 'window' }) }], + }, + } as unknown as HTMLVideoElement; + + act(() => { + handlers['videoElementCreated']({ element: mockVideoEl }); + }); + + expect(result.current.isEntireScreen).toBe(false); + }); + + it('resets isEntireScreen when streamDestroyed fires', async () => { + const { result } = render({ + userContext: { + __interceptor: (context: UserContextType | null) => { + context!.user.defaultSettings.name = 'TestUser'; + }, + }, + sessionContext: { + __interceptor: (context) => { + if (context) { + context.vonageVideoClient = mockVonageVideoClient as unknown as VonageVideoClient; + context.publish = mockPublish; + context.unpublish = mockUnpublish; + } + }, + }, + }); + + await act(async () => { + await result.current.toggleShareScreen(); + }); + + const mockVideoEl = { + srcObject: { + getVideoTracks: () => [{ getSettings: () => ({ displaySurface: 'monitor' }) }], + }, + } as unknown as HTMLVideoElement; + + act(() => { + handlers['videoElementCreated']({ element: mockVideoEl }); + }); + + expect(result.current.screenshareVideoElement).toBe(mockVideoEl); + expect(result.current.isEntireScreen).toBe(true); + + act(() => { + handlers['streamDestroyed'](); + }); + + expect(result.current.isEntireScreen).toBe(false); + expect(result.current.isSharingScreen).toBe(false); + expect(result.current.screenshareVideoElement).toBe(undefined); + }); + + it('sets isEntireScreen to true when displaySurface is undefined but dimensions match the screen area', async () => { + const { result } = render({ + userContext: { + __interceptor: (context: UserContextType | null) => { + context!.user.defaultSettings.name = 'TestUser'; + }, + }, + sessionContext: { + __interceptor: (context) => { + if (context) { + context.vonageVideoClient = mockVonageVideoClient as unknown as VonageVideoClient; + context.publish = mockPublish; + context.unpublish = mockUnpublish; + } + }, + }, + }); + + await act(async () => { + await result.current.toggleShareScreen(); + }); + + const mockVideoEl = { + srcObject: { + getVideoTracks: () => [ + { + getSettings: () => ({ + displaySurface: undefined, + width: window.screen.width, + height: window.screen.height, + }), + }, + ], + }, + } as unknown as HTMLVideoElement; + + act(() => { + handlers['videoElementCreated']({ element: mockVideoEl }); + }); + + expect(result.current.isEntireScreen).toBe(true); + }); + + it('does not initialize publisher if session is null', async () => { + const { result } = render({ + userContext: { + __interceptor: (context: UserContextType | null) => { + context!.user.defaultSettings.name = 'TestUser'; + }, + }, + sessionContext: { + __interceptor: (context) => { + if (context) { + context.vonageVideoClient = null; + context.publish = mockPublish; + context.unpublish = mockUnpublish; + } + }, + }, + }); + + await act(async () => { + await result.current.toggleShareScreen(); + }); + + expect(initPublisher).not.toHaveBeenCalled(); + }); +}); + +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; + sessionContext?: ProviderOptions['SessionContext']; +}; + +function render({ userContext, sessionContext }: RenderOptions = {}) { + const { wrapper, ...context } = makeTestProvider( + [providers.user, providers.session, providers.runtime], + { + sessionContext, + userContext, + runtimeContext: undefined, + } + ); + + return { + ...context, + ...renderHookBase(() => useScreenShare(), { + wrapper, + }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useToolbarButtons.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useToolbarButtons.spec.tsx new file mode 100644 index 00000000..1df2c01f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useToolbarButtons.spec.tsx @@ -0,0 +1,187 @@ +import { afterEach, afterAll, beforeEach, describe, expect, it, vi } from 'vitest'; +import { renderHook } from '@testing-library/react'; +import { RefObject } from 'react'; +import useToolbarButtons from '../useToolbarButtons'; + +vi.mock('resize-observer-polyfill', () => ({ + default: vi.fn((cb: ResizeObserverCallback) => { + return { + observe: vi.fn().mockImplementation((target: HTMLElement) => { + const entry: ResizeObserverEntry = { + target, + contentRect: target.getBoundingClientRect(), + borderBoxSize: [{ inlineSize: target.clientWidth, blockSize: target.clientHeight }], + contentBoxSize: [{ inlineSize: target.clientWidth, blockSize: target.clientHeight }], + devicePixelContentBoxSize: [ + { inlineSize: target.clientWidth, blockSize: target.clientHeight }, + ], + }; + cb([entry], this as unknown as ResizeObserver); + }), + unobserve: vi.fn(), + disconnect: vi.fn(), + }; + }), +})); + +vi.mock('../../utils/constants', () => ({ + RIGHT_PANEL_BUTTON_COUNT: 2, +})); + +describe('useToolbarButtons', () => { + let toolbarRef: RefObject; + let mediaControlsRef: RefObject; + let overflowAndExitRef: RefObject; + let rightPanelControlsRef: RefObject; + let timeRoomNameRef: RefObject; + + const numberOfToolbarButtons = 5; + + beforeEach(() => { + toolbarRef = { current: document.createElement('div') }; + if (toolbarRef.current) { + toolbarRef.current.id = 'toolbar-ref'; + } + mediaControlsRef = { current: document.createElement('div') }; + overflowAndExitRef = { current: document.createElement('div') }; + rightPanelControlsRef = { current: document.createElement('div') }; + timeRoomNameRef = { current: document.createElement('div') }; + if (timeRoomNameRef.current) { + timeRoomNameRef.current.id = 'time-room-name'; + } + + Object.defineProperty(mediaControlsRef.current, 'clientWidth', { + configurable: true, + writable: true, + value: 214, + }); + Object.defineProperty(overflowAndExitRef.current, 'clientWidth', { + configurable: true, + writable: true, + value: 108, + }); + vi.spyOn(window, 'getComputedStyle').mockImplementation((elt: Element) => { + if (elt.id === 'toolbar-ref') { + return { + paddingLeft: '30px', + paddingRight: '30px', + } as CSSStyleDeclaration; + } + if (elt.id === 'time-room-name') { + return { + marginRight: '12px', + } as CSSStyleDeclaration; + } + return { + marginLeft: '12px', + } as CSSStyleDeclaration; + }); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + afterAll(() => { + vi.unstubAllGlobals(); + }); + + it('returns nothing when there is no space in the toolbar', () => { + Object.defineProperty(toolbarRef.current, 'clientWidth', { + configurable: true, + writable: true, + value: 412, + }); + + const { result } = renderHook(() => + useToolbarButtons({ + toolbarRef, + mediaControlsRef, + overflowAndExitRef, + rightPanelControlsRef, + numberOfToolbarButtons, + timeRoomNameRef, + }) + ); + + const { centerButtonLimit, rightButtonLimit, displayTimeRoomName } = result.current; + expect(centerButtonLimit).toBe(0); + expect(rightButtonLimit).toBe(0); + expect(displayTimeRoomName).toBe(false); + }); + + it('returns only the first button when there is space for one button in the toolbar', () => { + Object.defineProperty(toolbarRef.current, 'clientWidth', { + configurable: true, + writable: true, + value: 466, + }); + + const { result } = renderHook(() => + useToolbarButtons({ + toolbarRef, + mediaControlsRef, + overflowAndExitRef, + rightPanelControlsRef, + numberOfToolbarButtons, + timeRoomNameRef, + }) + ); + + const { centerButtonLimit, rightButtonLimit, displayTimeRoomName } = result.current; + + expect(centerButtonLimit).toBe(1); + expect(rightButtonLimit).toBe(1); + expect(displayTimeRoomName).toBe(false); + }); + + it('returns only the first three button when there is space for three button in the toolbar', () => { + Object.defineProperty(toolbarRef.current, 'clientWidth', { + configurable: true, + writable: true, + value: 586, + }); + + const { result } = renderHook(() => + useToolbarButtons({ + toolbarRef, + mediaControlsRef, + overflowAndExitRef, + rightPanelControlsRef, + numberOfToolbarButtons, + timeRoomNameRef, + }) + ); + + const { centerButtonLimit, rightButtonLimit, displayTimeRoomName } = result.current; + + expect(centerButtonLimit).toBe(3); + expect(rightButtonLimit).toBe(3); + expect(displayTimeRoomName).toBe(false); + }); + + it('displays the time and room name as well as all of the buttons', () => { + Object.defineProperty(toolbarRef.current, 'clientWidth', { + configurable: true, + writable: true, + value: 826, + }); + + const { result } = renderHook(() => + useToolbarButtons({ + toolbarRef, + mediaControlsRef, + overflowAndExitRef, + rightPanelControlsRef, + numberOfToolbarButtons, + timeRoomNameRef, + }) + ); + + const { centerButtonLimit, rightButtonLimit, displayTimeRoomName } = result.current; + + expect(centerButtonLimit).toBe(3); + expect(rightButtonLimit).toBe(5); + expect(displayTimeRoomName).toBe(true); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useWaitingRoom.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useWaitingRoom.spec.tsx new file mode 100644 index 00000000..0ec1f3dc --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useWaitingRoom.spec.tsx @@ -0,0 +1,216 @@ +import { act, renderHook as renderHookBase } from '@testing-library/react'; +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import useWaitingRoom from '../useWaitingRoom'; +import { makeTestProvider, ProviderOptions, providers } from '@test/providers'; +import { DEVICE_ACCESS_STATUS } from '@utils/constants'; +import { env } from '../../env'; +import { setupWindowNavigatorMock } from '@web-test/fixtures'; + +vi.mock('@vonage/client-sdk-video'); + +vi.mock('react-router-dom', async () => { + const actual = await vi.importActual('react-router-dom'); + return { + ...actual, + useParams: () => ({ roomIdentifier: 'test-room' }), + }; +}); + +vi.mock('../useBackgroundPublisherContext', () => ({ + default: () => ({ + initBackgroundLocalPublisher: vi.fn(), + publisher: null, + }), +})); + +describe('useWaitingRoom', () => { + beforeEach(() => { + vi.clearAllMocks(); + env.WAITING_ROOM_ALLOW_DEVICE_SELECTION = true; + + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + enumerateDevices: Promise.resolve([]), + }, + }); + + vi.spyOn(globalThis.navigator.permissions, 'query').mockResolvedValue({ + state: 'granted', + } as PermissionStatus); + }); + + it('returns all expected fields', () => { + const { result } = renderHook(() => useWaitingRoom()); + + expect(result.current).toMatchObject({ + anchorEl: null, + openAudioInput: false, + openVideoInput: false, + openAudioOutput: false, + username: expect.any(String), + setUsername: expect.any(Function), + accessStatus: DEVICE_ACCESS_STATUS.ACCEPTED, + isRoomReady: true, + handleAudioInputOpen: expect.any(Function), + handleVideoInputOpen: expect.any(Function), + handleAudioOutputOpen: expect.any(Function), + handleClose: expect.any(Function), + }); + }); + + it('isRoomReady is false when isVideoLoading is true', () => { + const { result } = renderHook(() => useWaitingRoom(), { + previewPublisherContext: { + __interceptor: (ctx) => { + if (ctx) ctx.isVideoLoading = true; + }, + }, + }); + expect(result.current.isRoomReady).toBe(false); + }); + + it('isRoomReady is false when accessStatus is not ACCEPTED', () => { + const { result } = renderHook(() => useWaitingRoom(), { + previewPublisherContext: { + __interceptor: (ctx) => { + if (ctx) ctx.accessStatus = DEVICE_ACCESS_STATUS.PENDING; + }, + }, + }); + + expect(result.current.isRoomReady).toBe(false); + }); + + it('isRoomReady is false when WAITING_ROOM_ALLOW_DEVICE_SELECTION is false', () => { + env.WAITING_ROOM_ALLOW_DEVICE_SELECTION = false; + + const { result } = renderHook(() => useWaitingRoom()); + expect(result.current.isRoomReady).toBe(false); + }); + + describe('audio input menu', () => { + it('handleAudioInputOpen sets anchorEl and opens the menu', () => { + const { result } = renderHook(() => useWaitingRoom()); + const fakeButton = document.createElement('button'); + + act(() => { + result.current.handleAudioInputOpen({ + currentTarget: fakeButton, + } as unknown as React.MouseEvent); + }); + + expect(result.current.openAudioInput).toBe(true); + expect(result.current.anchorEl).toBe(fakeButton); + }); + + it('handleClose closes the audio input menu', () => { + const { result } = renderHook(() => useWaitingRoom()); + const fakeButton = document.createElement('button'); + + act(() => { + result.current.handleAudioInputOpen({ + currentTarget: fakeButton, + } as unknown as React.MouseEvent); + }); + + act(() => { + result.current.handleClose(); + }); + + expect(result.current.openAudioInput).toBe(false); + expect(result.current.anchorEl).toBeNull(); + }); + }); + + describe('video input menu', () => { + it('handleVideoInputOpen sets anchorEl and opens the menu', () => { + const { result } = renderHook(() => useWaitingRoom()); + const fakeButton = document.createElement('button'); + + act(() => { + result.current.handleVideoInputOpen({ + currentTarget: fakeButton, + } as unknown as React.MouseEvent); + }); + + expect(result.current.openVideoInput).toBe(true); + expect(result.current.anchorEl).toBe(fakeButton); + }); + }); + + describe('audio output menu', () => { + it('handleAudioOutputOpen sets anchorEl and opens the menu', () => { + const { result } = renderHook(() => useWaitingRoom()); + const fakeButton = document.createElement('button'); + + act(() => { + result.current.handleAudioOutputOpen({ + currentTarget: fakeButton, + } as unknown as React.MouseEvent); + }); + + expect(result.current.openAudioOutput).toBe(true); + expect(result.current.anchorEl).toBe(fakeButton); + }); + }); + + it('handleClose resets all menus and anchorEl', () => { + const { result } = renderHook(() => useWaitingRoom()); + const fakeButton = document.createElement('button'); + + act(() => { + result.current.handleAudioOutputOpen({ + currentTarget: fakeButton, + } as unknown as React.MouseEvent); + }); + + act(() => { + result.current.handleClose(); + }); + + expect(result.current.anchorEl).toBeNull(); + expect(result.current.openAudioInput).toBe(false); + expect(result.current.openAudioOutput).toBe(false); + expect(result.current.openVideoInput).toBe(false); + }); + + it('setUsername updates the username value', () => { + const { result } = renderHook(() => useWaitingRoom()); + + act(() => { + result.current.setUsername('New Name'); + }); + + expect(result.current.username).toBe('New Name'); + }); +}); + +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; + previewPublisherContext?: ProviderOptions['PreviewPublisherContext']; +}; + +function renderHook( + render: () => Result, + { userContext, previewPublisherContext }: RenderOptions = {} +) { + const { wrapper, ...context } = makeTestProvider([providers.user, providers.previewPublisher], { + userContext, + previewPublisherContext: { + ...previewPublisherContext, + __interceptor: (ctx) => { + if (ctx) { + ctx.accessStatus = DEVICE_ACCESS_STATUS.ACCEPTED; + ctx.isVideoLoading = false; + } + previewPublisherContext?.__interceptor?.(ctx); + }, + }, + }); + + return { + ...context, + ...renderHookBase(render, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useWindowWidth.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useWindowWidth.spec.tsx new file mode 100644 index 00000000..cb32b4f0 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/tests/useWindowWidth.spec.tsx @@ -0,0 +1,41 @@ +import { afterAll, beforeEach, describe, expect, it } from 'vitest'; +import { act, renderHook } from '@testing-library/react'; +import useWindowWidth from '../useWindowWidth'; + +describe('useWindowWidth', () => { + const nativeWindowInnerWidth = window.innerWidth; + + beforeEach(() => { + Object.defineProperty(window, 'innerWidth', { + writable: true, + configurable: true, + value: 1024, + }); + }); + + afterAll(() => { + Object.defineProperty(window, 'innerWidth', { + writable: true, + configurable: true, + value: nativeWindowInnerWidth, + }); + }); + + it('should return the initial state', () => { + const { result } = renderHook(() => useWindowWidth()); + + expect(result.current).toBe(1024); + }); + + it('should update value on window resize', () => { + const newWidth = 768; + const { result } = renderHook(() => useWindowWidth()); + + act(() => { + window.innerWidth = newWidth; + window.dispatchEvent(new Event('resize')); + }); + + expect(result.current).toBe(newWidth); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useActiveSpeaker.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useActiveSpeaker.tsx new file mode 100644 index 00000000..275fbca8 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useActiveSpeaker.tsx @@ -0,0 +1,12 @@ +import useSessionContext from './useSessionContext'; + +/** + * Returns the subscriber ID for the current active speaker, or undefined if no participant is actively speaking. + * @returns {string | undefined} Returns the active speaker ID or undefined if there is no active speaker. + */ +const useActiveSpeaker = (): string | undefined => { + const { activeSpeakerId } = useSessionContext(); + return activeSpeakerId; +}; + +export default useActiveSpeaker; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useArchives.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useArchives.tsx new file mode 100644 index 00000000..35f9f889 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useArchives.tsx @@ -0,0 +1,56 @@ +import { useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; +import { useArchives as useArchivesBase } from '@core/hooks'; +import { createArchiveFromServer, ServerArchive } from '../api/archiving/model'; +import { SingleArchiveResponse } from '@vonage/video'; + +export type UseArchivesProps = { + sessionKey: string | undefined; +}; + +const pollingIntervalMs = 5000; + +/** + * Returns the archives from a session, or `error` if there is an error. + * @param { UseArchivesProps} props - The props for the hook. + * @returns {Archive[] | 'error'} An array of Archives, or the text, `error`. + */ +const useArchives = ({ sessionKey }: UseArchivesProps) => { + const { data, ...rest } = useArchivesBase({ + sessionKey, + queryOptions: { + enabled: !!sessionKey, + refetchInterval: (query) => { + const archives = query.state.data?.items; + + if (!archives || !hasPending(archives)) { + return false; + } + + return pollingIntervalMs; + }, + }, + }); + + const { i18n } = useTranslation(); + + return { + ...rest, + data: useMemo(() => { + if (!data) return undefined; + + return { + ...data, + items: data.items.map((archive) => { + return createArchiveFromServer(i18n.language, archive as ServerArchive); + }), + }; + }, [data, i18n.language]), + }; +}; + +function hasPending(archives: T[]): boolean { + return archives.some((archive) => !['available', 'failed'].includes(archive.status)); +} + +export default useArchives; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useAudioLevels.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useAudioLevels.tsx new file mode 100644 index 00000000..7e385522 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useAudioLevels.tsx @@ -0,0 +1,68 @@ +import { useState, useEffect, useMemo, Dispatch, SetStateAction } from 'react'; +import throttle from '@common/execution/throttle'; +import usePublisherContext from './usePublisherContext'; +import createMovingAvgAudioLevelTracker from '../utils/movingAverageAudioLevelTracker'; // Adjust import as needed + +/** + * Creates a function to handle audio level updates using a moving average tracker. + * @param {Dispatch>} setAudioLevel - Function to update the audio level state. + * @returns {(params: { audioLevel: number }) => void} A handler function that processes and sets the audio level. + */ +const createOnHandleAudioLevelUpdated = (setAudioLevel: Dispatch>) => { + // Initialize moving average audio level tracker + const getMovingAverageAudioLevel = createMovingAvgAudioLevelTracker(); + + // Throttled function to handle audio level updates + const throttledUpdateAudioLevel = throttle( + (audioLevel: number) => { + const { logMovingAvg } = getMovingAverageAudioLevel(audioLevel); + setAudioLevel(logMovingAvg * 100); // Set the audio level state + }, + 100, + { leading: true, trailing: true } + ); + + /** + * Handles the raw audio level and updates it using the throttled function. + * @param {number} audioLevel - The raw audio level to process. + */ + const handleAudioLevel = (audioLevel: number) => { + throttledUpdateAudioLevel(audioLevel); + }; + + return ({ audioLevel }: { audioLevel: number }) => { + handleAudioLevel(audioLevel); + }; +}; + +/** + * Custom hook to track and return the current audio level of the publisher. + * + * This hook listens to audio level updates from the publisher and processes them + * using a moving average to smooth out fluctuations. It returns the current audio level as a percentage. + * @returns {number} The current audio level as a percentage (0-100). + */ +const useAudioLevels = () => { + const { publisher, isPublishing } = usePublisherContext(); + const [audioLevel, setAudioLevel] = useState(0); + + const audioLevelUpdateHandler = useMemo( + () => createOnHandleAudioLevelUpdated(setAudioLevel), + [setAudioLevel] + ); + + useEffect(() => { + if (isPublishing && publisher) { + publisher.on('audioLevelUpdated', audioLevelUpdateHandler); + } + return () => { + if (isPublishing && publisher) { + publisher.off('audioLevelUpdated', audioLevelUpdateHandler); + } + }; + }, [isPublishing, publisher, audioLevelUpdateHandler]); + + return audioLevel; +}; + +export default useAudioLevels; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useBackgroundPublisherContext.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useBackgroundPublisherContext.tsx new file mode 100644 index 00000000..151cb737 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useBackgroundPublisherContext.tsx @@ -0,0 +1,16 @@ +import { useContext } from 'react'; +import { + BackgroundPublisherContext, + BackgroundPublisherContextType, +} from '../Context/BackgroundPublisherProvider'; + +/** + * React hook to access the background replacement publisher context containing selected publisher options. + * @returns {BackgroundPublisherContextType} - The current context value for the Background replacement Publisher Context. + */ +const useBackgroundPublisherContext = (): BackgroundPublisherContextType => { + const context = useContext(BackgroundPublisherContext); + return context; +}; + +export default useBackgroundPublisherContext; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useChat.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useChat.tsx new file mode 100644 index 00000000..92b85072 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useChat.tsx @@ -0,0 +1,77 @@ +import { useCallback, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import useUserContext from './useUserContext'; +import { ChatMessageType } from '../types/chat'; +import { SignalType } from '../types/session'; + +export type UseChatProps = { + signal: ((data: SignalType) => void) | undefined; +}; + +export type UseChat = { + messages: ChatMessageType[]; + onChatMessage: (data: string) => void; + sendChatMessage: (text: string) => void; +}; +/** + * React hook to store ChatMessage array in state and provider functions for sending and receiving chat messages + * @param {UseChatProps} props - props for the hook + * @property {((data: SignalType) => void) | undefined} signal - function to send signal to all participants + * @returns {UseChat} return object + * @property {ChatMessageType[]} messages - array of chat messages + * @property {(data: string) => void} onChatMessage - new message handler + * @property {(text: string) => void} sendChatMessage - function to send message + */ +const useChat = ({ signal }: UseChatProps): UseChat => { + const { t } = useTranslation(); + const [messages, setMessages] = useState([]); + const { + user: { + defaultSettings: { name: localParticipantName }, + }, + } = useUserContext(); + + const sendChatMessage = useCallback( + (text: string) => { + if (!signal) { + return; + } + + signal({ + type: 'chat', + data: JSON.stringify({ + participantName: localParticipantName, + text, + }), + }); + }, + [signal, localParticipantName] + ); + + const onChatMessage = useCallback( + (data: string) => { + if (data) { + try { + const { text, participantName } = JSON.parse(data); + const message: ChatMessageType = { + timestamp: Date.now(), + participantName: participantName || t('user.unknown'), + message: text, + }; + setMessages((prev) => [...prev, message]); + } catch (err) { + console.log(err); + } + } + }, + [t] + ); + + return { + messages, + onChatMessage, + sendChatMessage, + }; +}; + +export default useChat; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useCollectBrowserInformation.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useCollectBrowserInformation.tsx new file mode 100644 index 00000000..1d3c0321 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useCollectBrowserInformation.tsx @@ -0,0 +1,44 @@ +import useSessionContext from './useSessionContext'; + +export type BrowserInformationType = { + sessionId?: string; + browser: string; + screenResolution: string; + referrer: string; + currentUrl: string; + language: string; + isOnline: boolean; + timeZone: string; + cookiesEnabled: boolean; + windowSize: { + height: number; + width: number; + }; + connectionId?: string; +}; + +/** + * Collects browser and session data from the user. + * @returns {BrowserInformationType} The session and browser information from the user. + */ +const useCollectBrowserInformation = (): BrowserInformationType => { + const { vonageVideoClient } = useSessionContext(); + return { + sessionId: vonageVideoClient?.sessionId, + browser: navigator.userAgent, + screenResolution: `${window.screen.width}x${window.screen.height}`, + referrer: document.referrer || 'No referrer', + currentUrl: window.location.href, + language: navigator.language, + isOnline: navigator.onLine, + timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone, + cookiesEnabled: navigator.cookieEnabled, + windowSize: { + width: window.innerWidth, + height: window.innerHeight, + }, + connectionId: vonageVideoClient?.connectionId, + }; +}; + +export default useCollectBrowserInformation; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useDateTime.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useDateTime.tsx new file mode 100644 index 00000000..03293037 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useDateTime.tsx @@ -0,0 +1,55 @@ +import { useCallback, useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { getFormattedDate, getFormattedTime } from '../utils/dateTime'; +/** + * @typedef {object} UseDateTimeType + * @property {string} date - The condensed date (e.g., "Wed, Jun 26") + * @property {string} time - The (standard) time ("6:29 PM") + */ + +/** + * Hook for getting the date and time at the moment. The time is updated every second. + * @returns {UseDateTimeType} the date and time + */ +const useDateTime = () => { + const { i18n } = useTranslation(); + const [date, setDate] = useState('Wed, Jun 26'); + const [time, setTime] = useState('5:01 PM'); + /** + * Gets the current time and sets it in the format of "6:29 PM". + */ + const updateTime = useCallback(() => { + const formattedTime = getFormattedTime(i18n.language); + setTime(formattedTime); + }, [i18n.language]); + + /** + * Gets the current date and sets it in the format of "Wed, Jun 26". + */ + const updateDate = useCallback(() => { + const formattedDate = getFormattedDate(i18n.language); + setDate(formattedDate); + }, [i18n.language]); + + /** + * Re-sets the time every second. + */ + const changeTime = useCallback(() => { + const interval = setInterval(updateTime, 1_000); + return () => clearInterval(interval); + }, [updateTime]); + + useEffect(() => { + // eslint-disable-next-line react-hooks/set-state-in-effect + updateTime(); + updateDate(); + return changeTime(); + }, [changeTime, updateTime, updateDate]); + + return { + date, + time, + }; +}; + +export default useDateTime; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useDecodedSessionKey.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useDecodedSessionKey.ts new file mode 100644 index 00000000..36b5969b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useDecodedSessionKey.ts @@ -0,0 +1,34 @@ +import { useMemo } from 'react'; +import { decodeSessionKey } from '@common/helpers'; +import type { Prettify, VideoSessionDetails } from '@common/types'; + +type DecodedSessionKey = Prettify< + VideoSessionDetails & { + roomName: string; + } +>; + +/** + * Custom hook to decode the sessionKey + */ +const useDecodedSessionKey = ({ + sessionKey, + sessionKeyStatus, +}: { + sessionKey: string; + sessionKeyStatus: 'valid' | 'invalid' | 'legacy_hack'; +}): DecodedSessionKey => { + return useMemo(() => { + if (sessionKeyStatus === 'invalid') throw new Error(`Invalid sessionKey: ${sessionKey}`); + if (sessionKeyStatus === 'valid') return decodeSessionKey({ sessionKey }) as DecodedSessionKey; + + // [TODO]: We'll be removing this after updating the other apps. + // The intention of this changes is to keep the current and future refactor atomic as possible. + return { + sessionKey, + roomName: sessionKey, + } as DecodedSessionKey; + }, [sessionKey, sessionKeyStatus]); +}; + +export default useDecodedSessionKey; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useDropdownResizeObserver.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useDropdownResizeObserver.tsx new file mode 100644 index 00000000..0cb6539b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useDropdownResizeObserver.tsx @@ -0,0 +1,37 @@ +import { useEffect, Dispatch, SetStateAction } from 'react'; +import ResizeObserver from 'resize-observer-polyfill'; + +export type UseDropdownResizeObserverProps = { + setIsOpen: Dispatch>; + dropDownRefElement: HTMLElement | null; +}; + +/** + * Custom hook that observes the window height changes and closes the dropdown + * if the height falls below a certain threshold. + * @param {UseDropdownResizeObserverProps} props - The props for the hook. + * @property {Dispatch>} setIsOpen - Sets the state for the component. + * @property {HTMLElement | null} dropDownRefElement - The HTML element used to compare the height to the window height. + */ +const useDropdownResizeObserver = ({ + setIsOpen, + dropDownRefElement, +}: UseDropdownResizeObserverProps) => { + useEffect(() => { + const observer = new ResizeObserver(() => { + const dropDownHeight = dropDownRefElement?.offsetHeight ?? 0; + + // The 15 multiplier accounts for cases where the measured height is lower + // due to CSS transforms, dynamic rendering, etc. + if (window.innerHeight < dropDownHeight * 15) { + setIsOpen(false); + } + }); + + observer.observe(document.documentElement); + + return () => observer.disconnect(); + }, [setIsOpen, dropDownRefElement]); +}; + +export default useDropdownResizeObserver; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useElementDimensions.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useElementDimensions.tsx new file mode 100644 index 00000000..be8cc8f2 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useElementDimensions.tsx @@ -0,0 +1,42 @@ +import { Dimensions } from '@vonage/client-sdk-video'; +import throttle from '@common/execution/throttle'; +import { RefObject, useEffect, useRef, useState } from 'react'; + +export type UseElementDimensionsProps = { + elementRef: RefObject; +}; +/** + * Util hook to observe element resize changes and get element dimensions as react state. + * State changes are throttled for performance + * @param {UseElementDimensionsProps} props - the props for this hook + * @property {RefObject} elementRef - HTMLElement ref object + * @returns {Dimensions} - element dimensions + */ +const useElementDimensions = ({ elementRef }: UseElementDimensionsProps): Dimensions => { + const [elementDimensions, setElementDimensions] = useState({ width: 0, height: 0 }); + const resizeObserver = useRef(undefined); + + useEffect(() => { + const elementCurrent = elementRef.current; + if (elementCurrent && !resizeObserver.current) { + const throttledSetDimensions = throttle(() => { + setElementDimensions({ + height: elementCurrent.offsetHeight, + width: elementCurrent.offsetWidth, + }); + }, 20); + resizeObserver.current = new ResizeObserver(() => { + throttledSetDimensions(); + }); + resizeObserver.current?.observe(elementCurrent); + } + return () => { + if (elementCurrent) { + resizeObserver.current?.unobserve(elementCurrent); + } + }; + }, [elementRef]); + return elementDimensions; +}; + +export default useElementDimensions; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useEmoji.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useEmoji.tsx new file mode 100644 index 00000000..aaf6aeef --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useEmoji.tsx @@ -0,0 +1,130 @@ +import { useCallback, useMemo, useState } from 'react'; +import { Connection } from '@vonage/client-sdk-video'; +import throttle from '@common/execution/throttle'; +import { EMOJI_DISPLAY_DURATION } from '../utils/constants'; +import { SignalEvent, SignalType, SubscriberWrapper } from '../types/session'; + +type EmojiDataType = { + emoji: string; + time: number; +}; + +export type UseEmojiProps = { + signal: ((data: SignalType) => void) | undefined; + getConnectionId: () => string | undefined; +}; + +export type UseEmoji = { + sendEmoji: (emoji: string) => void; + emojiQueue: EmojiWrapper[]; + onEmoji: (event: SignalEvent, subscriberWrappers: SubscriberWrapper[]) => void; +}; + +export type EmojiWrapper = { + name: string; + emoji: string; + time: number; +}; + +/** + * React hook to queue emojis into an array for display and provides functions for sending and receiving emojis. + * @param {UseEmojiProps} props - props for the hook + * @property {((data: SignalType) => void) | undefined} signal - function to send signal to all participants + * @property {() => string | undefined} getConnectionId - get the connection ID of the current user + * @returns {UseEmoji} returned object + * @property {(emoji: string) => void} sendEmoji - function to send emojis + * @property {EmojiWrapper[]} emojiQueue - emojis to display + * @property {(event: SignalEvent, subscriberWrappers: SubscriberWrapper[]) => void} onEmoji - emoji handler + */ +const useEmoji = ({ signal, getConnectionId }: UseEmojiProps): UseEmoji => { + const [emojiQueue, setEmojiQueue] = useState([]); + + /** + * Sends an emoji to all participants in the room. + * @param {string} emoji - The emoji to be sent + */ + const sendEmoji = useMemo(() => { + // We limit emojis to being sent every 500ms. + const throttledFunc = throttle( + (emoji: string) => { + if (!signal) { + return; + } + + const data = JSON.stringify({ emoji, time: new Date().getTime() }); + signal({ type: 'emoji', data }); + }, + 500, + { leading: true, trailing: false } + ); + return throttledFunc; + }, [signal]); + + /** + * Checks if the given connection belongs to the current user. + * @param {Connection} sendingConnection - The connection of a user. + * @returns {boolean} - Returns `true` if the connection is the current user's, else `false`. + */ + const isOwnConnection = useCallback( + (sendingConnection: Connection): boolean => { + return sendingConnection.connectionId === getConnectionId?.(); + }, + [getConnectionId] + ); + /** + * Retrieves the user's name or `You` if you are the sender from a given Connection. + * @param {Connection} sendingConnection - The connection object to evaluate. + * @param {SubscriberWrapper[]} subscriberWrappers - all subscriber wrappers in the session + * @returns {string} The user's name, `You`, or an empty string. + */ + const getSenderName = useCallback( + ( + sendingConnection: Connection, + subscriberWrappers: SubscriberWrapper[] + ): string | undefined => { + const isYou = isOwnConnection(sendingConnection); + if (isYou) { + return 'You'; + } + + const sendingSubscriberWrapper = subscriberWrappers.find( + (subscriberWrapper) => + subscriberWrapper.subscriber.stream?.connection.connectionId === + sendingConnection?.connectionId && !subscriberWrapper.isScreenshare + ); + return sendingSubscriberWrapper?.subscriber.stream?.name; + }, + [isOwnConnection] + ); + + /** + * Manages signals sent by users in the room. Any emojis sent by the room's users + * are processed in a data queue to be rendered in the application. + * @param {SignalEvent} signalEvent - Signal event dispatched by the session. + * @param {SubscriberWrapper[]} subscriberWrappers - all subscriber wrappers in the session + */ + const onEmoji = useCallback( + ({ data, from: sendingConnection }: SignalEvent, subscriberWrappers: SubscriberWrapper[]) => { + if (data && sendingConnection) { + const senderName = getSenderName(sendingConnection, subscriberWrappers) ?? ''; + const { emoji, time }: EmojiDataType = JSON.parse(data); + + const emojiWrapper: EmojiWrapper = { + name: senderName, + emoji, + time, + }; + setEmojiQueue((previousEmojiQueue) => [...previousEmojiQueue, emojiWrapper]); + + setTimeout(() => { + setEmojiQueue((previousEmojiQueue) => previousEmojiQueue.slice(1)); + }, EMOJI_DISPLAY_DURATION); + } + }, + [getSenderName] + ); + + return { sendEmoji, emojiQueue, onEmoji }; +}; + +export default useEmoji; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useGoodByePage.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useGoodByePage.ts new file mode 100644 index 00000000..4d79d494 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useGoodByePage.ts @@ -0,0 +1,36 @@ +import { useLocation } from 'react-router-dom'; +import { useTranslation } from 'react-i18next'; +import type { Archive } from '../api/archiving/model'; +import useArchives from './useArchives'; +import useSessionKeyParam from './useSessionKeyParam'; +import { isErrorLike } from '@common/assertions'; + +type UseGoodByePageResult = { + sessionKey: string | null; + archives: Archive[] | 'error'; + header: string; + caption: string; + isSelfDeclinedRecording: boolean; +}; + +const useGoodByePage = (): UseGoodByePageResult => { + const { t } = useTranslation(); + const location = useLocation(); + const { sessionKey } = useSessionKeyParam(); + + const { data, error } = useArchives({ sessionKey }); + + const header: string = location.state?.header || t('goodbye.default.header'); + const caption: string = location.state?.caption || t('goodbye.default.message'); + const isSelfDeclinedRecording: boolean = location.state?.isSelfDeclinedRecording || false; + + return { + sessionKey, + archives: data ? data.items : ((isErrorLike(error) ? error.message : 'error') as 'error'), + header, + caption, + isSelfDeclinedRecording, + }; +}; + +export default useGoodByePage; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useIsSmallViewport.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useIsSmallViewport.tsx new file mode 100644 index 00000000..d1f8a45b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useIsSmallViewport.tsx @@ -0,0 +1,14 @@ +import useMediaQuery from '@mui/material/useMediaQuery'; +import { SMALL_VIEWPORT } from '../utils/constants'; + +/** + * useIsSmallViewport Hook + * + * A custom hook that checks if the viewport width is less than or equal to a defined small viewport width. + * @returns {boolean} True if the viewport is small, false otherwise. + */ +const useIsSmallViewport = (): boolean => { + return useMediaQuery(`(max-width:${SMALL_VIEWPORT}px)`); +}; + +export default useIsSmallViewport; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useIsTabletViewport.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useIsTabletViewport.tsx new file mode 100644 index 00000000..8a867a55 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useIsTabletViewport.tsx @@ -0,0 +1,14 @@ +import useMediaQuery from '@mui/material/useMediaQuery'; +import { TABLET_VIEWPORT } from '../utils/constants'; + +/** + * useIsTabletViewport Hook + * + * A custom hook that checks if the viewport width is less than or equal to a defined tablet viewport width. + * @returns {boolean} True if the viewport is tablet-sized, false otherwise. + */ +const useIsTabletViewport = (): boolean => { + return useMediaQuery(`(max-width:${TABLET_VIEWPORT}px)`); +}; + +export default useIsTabletViewport; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useLayoutManager.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useLayoutManager.tsx new file mode 100644 index 00000000..5f59ae6e --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useLayoutManager.tsx @@ -0,0 +1,20 @@ +import { useMemo } from 'react'; +import LayoutManager from '../utils/layoutManager'; + +export type GetLayout = InstanceType['getLayout']; +/** + * React hook to return a getLayout function as defined here: + * https://github.com/aullman/opentok-layout-js?tab=readme-ov-file#usage + * getLayout takes an array of Element objects and returns an array of Box objects + * which specify exact size and position of video tiles + * @returns {GetLayout} getLayout + */ +const useLayoutManager = (): GetLayout => { + return useMemo(() => { + const layoutManager = new LayoutManager(); + + return layoutManager.getLayout.bind(layoutManager); + }, []); +}; + +export default useLayoutManager; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useMeetingRoom.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useMeetingRoom.ts new file mode 100644 index 00000000..64ee8620 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useMeetingRoom.ts @@ -0,0 +1,290 @@ +import { useEffect, useState, useEffectEvent } from 'react'; +import { useNavigate, useLocation } from 'react-router-dom'; +import { useTranslation } from 'react-i18next'; +import usePublisherContext from './usePublisherContext'; +import useSessionContext from './useSessionContext'; +import useScreenShare from './useScreenShare'; +import useBackgroundPublisherContext from './useBackgroundPublisherContext'; +import { DEVICE_ACCESS_STATUS } from '../utils/constants'; +import type { PublishingErrorType } from '../Context/PublisherProvider/usePublisher/usePublisher'; +import useUserContext from './useUserContext'; +import { env } from '../env'; +import useMountEffect from '@web/hooks/useMountEffect'; +import { runtime$ } from '@core/stores'; +import useSessionKeyParam from './useSessionKeyParam'; + +const useMeetingRoom = () => { + const videoClient = runtime$.useVideoClient(); + + const { t } = useTranslation(); + const navigate = useNavigate(); + const location = useLocation(); + + const { + user: { + defaultSettings: { name }, + }, + } = useUserContext(); + const { + publisher, + publish, + quality, + initializeLocalPublisher, + publishingError, + isVideoEnabled, + publisherOptions, + } = usePublisherContext(); + + const { + initBackgroundLocalPublisher, + publisher: backgroundPublisher, + accessStatus, + } = useBackgroundPublisherContext(); + + const { sessionKey, sessionKeyStatus } = useSessionKeyParam(); + + const { + joinRoom, + subscriptionError, + subscriberWrappers, + connected, + disconnect, + reconnecting, + rightPanelActiveTab, + toggleChat, + toggleParticipantList, + toggleBackgroundEffects, + closeRightPanel, + toggleReportIssue, + archiveId, + recordingAlreadyNotified, + archiveIdStartedBySelf, + } = useSessionContext(); + + const { + isSharingScreen, + isEntireScreen, + screensharingPublisher, + screenshareVideoElement, + toggleShareScreen, + } = useScreenShare(); + + const [isUserCaptionsEnabled, setIsUserCaptionsEnabled] = useState(false); + const [captionsErrorResponse, setCaptionsErrorResponse] = useState(''); + + const [latestNotifiedArchiveId, setLatestNotifiedArchiveId] = useState(null); + const handleRecordingNotified = () => { + setLatestNotifiedArchiveId(archiveId); + }; + const shouldPromptRecordingConsent = + !!archiveId && (archiveIdStartedBySelf === null || archiveId !== archiveIdStartedBySelf); + + const hasValidUsername = name && name.trim() !== ''; + const searchParams = new URLSearchParams(location.search); + const bypass = searchParams.get('bypass') === 'true' || env.BYPASS_WAITING_ROOM; + + useMountEffect(() => { + if (!hasValidUsername && !bypass) { + navigate(`/waiting-room/${sessionKey}`); + } + }); + + useEffect(() => { + if (!hasValidUsername && !bypass) return; + if (!joinRoom || !sessionKey) return; + + /** + * [TODO]: Reconcile sessionKey if necessary. This is needed for legacy support where the url contains only a room name. + */ + const resolveAndJoin = async () => { + const resolvedSessionKey = await (async () => { + if (sessionKeyStatus === 'valid') return sessionKey; + if (sessionKeyStatus === 'invalid') throw new Error('Invalid session key'); + + /** + * [TODO]: This is a temporary solution to support legacy vera functionality without depending on the old routers + * If the roomName already exists, the backend will return the existing sessionKey, otherwise it will create a new session and return its sessionKey. + */ + const session = await videoClient.createSession({ roomName: sessionKey }); + + return session.sessionKey; + })(); + + await joinRoom({ sessionKey: resolvedSessionKey }); + }; + + void resolveAndJoin(); + + return () => { + disconnect?.(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [sessionKey, hasValidUsername, bypass]); + + useEffect(() => { + if (!publisherOptions) { + return; + } + + if (!publisher) { + initializeLocalPublisher(publisherOptions); + } + }, [initializeLocalPublisher, publisherOptions, publisher]); + + useEffect(() => { + if (connected && publisher && publish) { + void publish(); + } + }, [publisher, publish, connected]); + + useEffect(() => { + if (!backgroundPublisher) { + void initBackgroundLocalPublisher(); + } + }, [initBackgroundLocalPublisher, backgroundPublisher]); + + useEffect(() => { + if (accessStatus === DEVICE_ACCESS_STATUS.ACCESS_CHANGED) { + window.location.reload(); + } + }, [accessStatus]); + + useRedirectOnPublisherError({ + publishingError, + reconnecting, + sessionKey, + }); + useRedirectOnSubscriberError({ + subscriberError: subscriptionError, + reconnecting, + sessionKey, + }); + + const isRecording = !!archiveId; + const captionsState = { + isUserCaptionsEnabled, + setIsUserCaptionsEnabled, + setCaptionsErrorResponse, + }; + + return { + t, + isSharingScreen, + isEntireScreen, + screensharingPublisher, + screenshareVideoElement, + toggleShareScreen, + rightPanelActiveTab, + toggleChat, + toggleParticipantList, + toggleBackgroundEffects, + closeRightPanel, + toggleReportIssue, + subscriberWrappers, + reconnecting, + quality, + isVideoEnabled, + isRecording, + isUserCaptionsEnabled, + captionsErrorResponse, + setCaptionsErrorResponse, + captionsState, + recordingAlreadyNotified, + archiveIdStartedBySelf, + archiveId, + shouldPromptRecordingConsent, + handleRecordingNotified, + latestNotifiedArchiveId, + }; +}; + +/** + * If the user is unable to publish, we redirect them to the goodbye page. + * This prevents users from subscribing to other participants in the room, and being unable to communicate with them. + * @param {PublishingErrorType | null} publishingError - The publishing error object or null if no error. + */ +function useRedirectOnPublisherError({ + publishingError, + reconnecting, + sessionKey, +}: { + publishingError: PublishingErrorType | null; + reconnecting: boolean | null; + sessionKey: string | null; +}) { + const navigate = useNavigate(); + + const maybeRedirect = useEffectEvent(() => { + if (!publishingError) { + return; + } + + const isBrowserOnline = (() => { + if (typeof navigator === 'undefined') return true; + return navigator.onLine; + })(); + + if (reconnecting === true || isBrowserOnline === false) { + return; + } + + const { header, caption } = publishingError; + + navigate(`/goodbye/${sessionKey ?? ''}`, { + state: { + header, + caption, + }, + }); + }); + + useEffect(() => { + maybeRedirect(); + }, [publishingError, reconnecting]); +} + +/** + * If the user is unable to subscribe, we redirect them to the goodbye page. + * This prevents users from subscribing to other participants in the room, and being unable to communicate with them. + * @param {Error | null} subscriberError - The subscriber error object or null if no error. + */ +function useRedirectOnSubscriberError({ + subscriberError, + reconnecting, + sessionKey, +}: { + subscriberError: Error | null; + reconnecting: boolean | null; + sessionKey: string | null; +}) { + const navigate = useNavigate(); + const { t } = useTranslation(); + + const maybeRedirect = useEffectEvent(() => { + if (!subscriberError) { + return; + } + + const isBrowserOnline = (() => { + if (typeof navigator === 'undefined') return true; + return navigator.onLine; + })(); + + if (reconnecting === true || isBrowserOnline === false) { + return; + } + + navigate(`/goodbye/${sessionKey || ''}`, { + state: { + header: t('subscribingErrors.blocked.title'), + caption: t('subscribingErrors.blocked.message'), + }, + }); + }); + + useEffect(() => { + maybeRedirect(); + }, [subscriberError, reconnecting]); +} + +export default useMeetingRoom; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/usePermissions.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/usePermissions.tsx new file mode 100644 index 00000000..cbfe4e76 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/usePermissions.tsx @@ -0,0 +1,53 @@ +import { useEffect, useState } from 'react'; +import { DEVICE_ACCESS_STATUS } from '../utils/constants'; + +export type PermissionsHookType = { + accessStatus: string | null; + setAccessStatus: (status: string) => void; +}; + +/** + * Hook for checking and managing the user's permissions for accessing the microphone and camera. + * Queries the browser for permission status and provides the current status and a function to update it. + * @returns {PermissionsHookType} The current access status and a function to manually update it. + */ +const usePermissions = (): PermissionsHookType => { + const [accessStatus, setAccessStatus] = useState(null); + + useEffect(() => { + const permissionsToQuery: PermissionName[] = [ + 'microphone', + 'camera', + ] as unknown as PermissionName[]; + + const queryPromises = permissionsToQuery.map((name) => navigator.permissions.query({ name })); + + Promise.all(queryPromises) + .then((statuses) => { + statuses.forEach((status) => { + if (status.state === 'prompt') { + // Handle pending state + setAccessStatus(DEVICE_ACCESS_STATUS.PENDING); + } + }); + }) + .catch((error) => { + if ( + error?.message?.includes( + "value of 'name' member of PermissionDescriptor) is not a valid value for enumeration PermissionName." + ) + ) { + // Ignore Firefox error + return; + } + console.error('Error querying permissions:', error); + }); + }, []); + + return { + accessStatus, + setAccessStatus, + }; +}; + +export default usePermissions; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/usePreviewPublisherContext.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/usePreviewPublisherContext.tsx new file mode 100644 index 00000000..355a5dd3 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/usePreviewPublisherContext.tsx @@ -0,0 +1,16 @@ +import { useContext } from 'react'; +import { + PreviewPublisherContext, + PreviewPublisherContextType, +} from '../Context/PreviewPublisherProvider'; + +/** + * React hook to access the preview publisher context containing selected publisher options. + * @returns {PreviewPublisherContextType} - The current context value for the Preview Publisher Context. + */ +const usePreviewPublisherContext = (): PreviewPublisherContextType => { + const context = useContext(PreviewPublisherContext); + return context; +}; + +export default usePreviewPublisherContext; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/usePublisherContext.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/usePublisherContext.tsx new file mode 100644 index 00000000..61b27b02 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/usePublisherContext.tsx @@ -0,0 +1,13 @@ +import { useContext } from 'react'; +import { PublisherContext, PublisherContextType } from '../Context/PublisherProvider'; + +/** + * React hook to access the Publisher context containing Vonage Video API publisher data and functions. + * @returns {PublisherContextType} - The current context value for the Publisher Context. + */ +const usePublisherContext = (): PublisherContextType => { + const context = useContext(PublisherContext); + return context; +}; + +export default usePublisherContext; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/usePushToTalk.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/usePushToTalk.tsx new file mode 100644 index 00000000..d3bdf241 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/usePushToTalk.tsx @@ -0,0 +1,75 @@ +import { useEffect, useRef } from 'react'; + +export type UsePushToTalkArgs = { + enabled: boolean; + isAudioEnabled: boolean; + toggleAudio: () => void; +}; + +/** + * React hook to add push-to-talk functionality using the Space key. + * + * When enabled, pressing and holding the Space key will unmute audio, + * and releasing the Space key will mute audio again. + */ +const usePushToTalk = ({ enabled, isAudioEnabled, toggleAudio }: UsePushToTalkArgs): void => { + const didUnmuteOnSpaceRef = useRef(false); + const audioStateRef = useRef<{ isAudioEnabled: boolean; toggleAudio: () => void }>({ + isAudioEnabled, + toggleAudio, + }); + + audioStateRef.current.isAudioEnabled = isAudioEnabled; + audioStateRef.current.toggleAudio = toggleAudio; + + useEffect(() => { + if (!enabled) return; + + const isTextEntryTarget = (target: EventTarget | null): boolean => { + const node = target as HTMLElement | null; + if (!node) return false; + const tagName = node.tagName; + if (tagName === 'INPUT' || tagName === 'TEXTAREA') return true; + return node.isContentEditable === true; + }; + + const onKeyDown = (event: KeyboardEvent) => { + const isSpace = event.code === 'Space' || event.key === ' '; + if (!isSpace) return; + if (isTextEntryTarget(event.target)) return; + + event.preventDefault(); + if (event.repeat) return; + didUnmuteOnSpaceRef.current = false; + + // Only unmute on keydown if audio was muted. + if (!audioStateRef.current.isAudioEnabled) { + didUnmuteOnSpaceRef.current = true; + audioStateRef.current.toggleAudio(); + } + }; + + const onKeyUp = (event: KeyboardEvent) => { + const isSpace = event.code === 'Space' || event.key === ' '; + if (!isSpace) return; + if (isTextEntryTarget(event.target)) return; + + // Only re-mute on keyup if we unmuted on keydown. + if (didUnmuteOnSpaceRef.current) { + didUnmuteOnSpaceRef.current = false; + audioStateRef.current.toggleAudio(); + } + }; + + globalThis.addEventListener('keydown', onKeyDown); + globalThis.addEventListener('keyup', onKeyUp); + + return () => { + didUnmuteOnSpaceRef.current = false; + globalThis.removeEventListener('keydown', onKeyDown); + globalThis.removeEventListener('keyup', onKeyUp); + }; + }, [enabled]); +}; + +export default usePushToTalk; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useReceivingCaptions.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useReceivingCaptions.tsx new file mode 100644 index 00000000..8dc199a0 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useReceivingCaptions.tsx @@ -0,0 +1,63 @@ +import { Subscriber } from '@vonage/client-sdk-video'; +import { useState, useEffect, useMemo } from 'react'; + +/** + * @typedef CaptionsType + * @property {string} caption - The current caption text. + * @property {boolean} isReceivingCaptions - Indicates whether captions are currently being received + */ +export type CaptionsType = { + caption: string; + isReceivingCaptions: boolean; +}; + +/** + * @typedef ReceivingCaptionsProps + * @property {Subscriber | null} subscriber - The subscriber object from which to receive captions + */ +export type ReceivingCaptionsProps = { + subscriber?: Subscriber | null; +}; + +/** + * @typedef CaptionReceivedType + * @property {string} streamId - The ID of the stream from which the caption was received. + * @property {string} caption - The text of the caption received. + * @property {boolean} isFinal - Indicates whether the caption is final or still being processed + */ +export type CaptionReceivedType = { + streamId: string; + caption: string; + isFinal: boolean; +}; + +/** + * Hook to manage receiving captions from a speaker. + * @param {ReceivingCaptionsProps} props - The props for the hook. + * @property {Subscriber | null} subscriber - The subscriber object from which to receive captions. + * @returns {CaptionsType} - The current caption text and whether captions are being received. + */ +const useReceivingCaptions = ({ subscriber }: ReceivingCaptionsProps): CaptionsType => { + const [caption, setCaption] = useState(''); + const [isReceivingCaptions, setIsReceivingCaptions] = useState(false); + + const captionUpdateHandler = useMemo( + () => (event: CaptionReceivedType) => { + setIsReceivingCaptions(!!event.caption); + setCaption(event.caption); + }, + [] + ); + + useEffect(() => { + subscriber?.on('captionReceived', captionUpdateHandler); + + return () => { + subscriber?.off('captionReceived', captionUpdateHandler); + }; + }, [subscriber, captionUpdateHandler]); + + return { caption, isReceivingCaptions }; +}; + +export default useReceivingCaptions; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useRightPanel.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useRightPanel.tsx new file mode 100644 index 00000000..9a6646af --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useRightPanel.tsx @@ -0,0 +1,124 @@ +import { useCallback, useState } from 'react'; + +export type RightPanelActiveTab = + | 'chat' + | 'participant-list' + | 'background-effects' + | 'closed' + | 'issues'; + +export type RightPanelState = { + activeTab: RightPanelActiveTab; + unreadCount: number; +}; + +export type UseRightPanel = { + closeRightPanel: () => void; + incrementUnreadCount: () => void; + rightPanelState: RightPanelState; + toggleChat: () => void; + toggleParticipantList: () => void; + toggleBackgroundEffects: () => void; + toggleReportIssue: () => void; +}; + +/** + * React hook containing all the state and update methods for the RightPanel component + * @returns {UseRightPanel} - collection of state and update methods + */ +const useRightPanel = (): UseRightPanel => { + const [rightPanelState, setRightPanelState] = useState({ + activeTab: 'closed', + unreadCount: 0, + }); + + /** + * toggleParticipantList - util to toggle participant list visibility. + */ + const toggleParticipantList = useCallback(() => { + setRightPanelState((prev) => { + if (prev.activeTab === 'participant-list') { + return { ...prev, activeTab: 'closed' }; + } + return { ...prev, activeTab: 'participant-list' }; + }); + }, []); + + /** + * toggleBackgroundEffects - util to toggle background effects visibility. + */ + const toggleBackgroundEffects = useCallback(() => { + setRightPanelState((prev) => { + if (prev.activeTab === 'background-effects') { + return { ...prev, activeTab: 'closed' }; + } + return { ...prev, activeTab: 'background-effects' }; + }); + }, []); + + /** + * closeRightPanel - util to close right panel. + */ + const closeRightPanel = useCallback(() => { + setRightPanelState((prev) => ({ + ...prev, + activeTab: 'closed', + })); + }, []); + + /** + * toggleChat - util to toggle chat visibility, + * it also resets unread message counter. + */ + const toggleChat = useCallback(() => { + setRightPanelState((prev) => { + if (prev.activeTab === 'chat') { + return { + activeTab: 'closed', + unreadCount: 0, + }; + } + return { unreadCount: 0, activeTab: 'chat' }; + }); + }, []); + + const toggleReportIssue = useCallback(() => { + setRightPanelState((prev) => { + if (prev.activeTab === 'issues') { + return { + ...prev, + activeTab: 'closed', + }; + } + return { ...prev, activeTab: 'issues' }; + }); + }, []); + + /** + * incrementUnreadCount - util to increment unread message badge by one, + * it does not increment counter if chat is open. + */ + const incrementUnreadCount = useCallback(() => { + setRightPanelState((prev) => { + if (prev.activeTab !== 'chat') { + return { + ...prev, + unreadCount: prev.unreadCount + 1, + }; + } + return prev; + }); + }, []); + + return { + closeRightPanel, + rightPanelState, + toggleChat, + toggleParticipantList, + toggleBackgroundEffects, + incrementUnreadCount, + toggleReportIssue, + }; +}; + +export default useRightPanel; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useRoomShareUrl.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useRoomShareUrl.tsx new file mode 100644 index 00000000..b3347feb --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useRoomShareUrl.tsx @@ -0,0 +1,12 @@ +import useSessionContext from './useSessionContext'; +/** + * Creates a shareable link to the waiting room for the current meeting room. + * @returns {string} - The shareable link. + */ +const useRoomShareUrl = (): string => { + const { sessionKey } = useSessionContext(); + const { origin } = window.location; + return `${origin}/waiting-room/${sessionKey}`; +}; + +export default useRoomShareUrl; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useScreenShare.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useScreenShare.tsx new file mode 100644 index 00000000..e4210569 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useScreenShare.tsx @@ -0,0 +1,149 @@ +import { useState, useRef, useCallback } from 'react'; +import { Publisher, initPublisher } from '@vonage/client-sdk-video'; +import { useTranslation } from 'react-i18next'; +import useSessionContext from './useSessionContext'; +import useUserContext from './useUserContext'; + +/** + * @typedef {object} UseScreenShareType + * @property {() => void} toggleScreenShare - Function that starts and stop screen sharing + * @property {boolean} isSharingScreen - Indicates whether you are sharing your screen or not + */ +export type UseScreenShareType = { + toggleShareScreen: () => Promise; + isSharingScreen: boolean; + isEntireScreen: boolean; + screensharingPublisher: Publisher | null; + screenshareVideoElement: HTMLVideoElement | HTMLObjectElement | undefined; +}; + +/** + * Hook for toggling screen share and getting the current local screen share status (sharing / not sharing) + * @returns {UseScreenShareType} useScreenShare + */ +const useScreenShare = (): UseScreenShareType => { + const { t } = useTranslation(); + const { vonageVideoClient, unpublish, publish } = useSessionContext(); + const { user } = useUserContext(); + + // Using useRef to store the screen sharing publisher instance + const screenSharingPubRef = useRef(null); + + // State to track sharing status + const [isSharingScreen, setIsSharingScreen] = useState(false); + const [isEntireScreen, setIsEntireScreen] = useState(false); + const [screenshareVideoElement, setScreenshareVideoElement] = useState< + HTMLVideoElement | HTMLObjectElement + >(); + + const onScreenShareStopped = useCallback(() => { + setIsSharingScreen(false); + setIsEntireScreen(false); + setScreenshareVideoElement(undefined); + screenSharingPubRef.current = null; + }, []); + + const unpublishScreenshare = useCallback(() => { + if (screenSharingPubRef.current) { + unpublish(screenSharingPubRef.current); + setIsSharingScreen(false); + setIsEntireScreen(false); + } + }, [unpublish]); + + const handleStreamCreated = useCallback(() => { + unpublishScreenshare(); + }, [unpublishScreenshare]); + + // Using useCallback to memoize the function to avoid unnecessary re-renders + const toggleShareScreen = useCallback(async () => { + if (vonageVideoClient) { + if (!isSharingScreen) { + // Initializing the publisher for screen sharing + screenSharingPubRef.current = initPublisher( + undefined, + { + videoSource: 'screen', + insertDefaultUI: false, + videoContentHint: 'detail', + name: t('participants.screen', { participantName: user.defaultSettings.name }), + }, + (err) => { + if (err) { + onScreenShareStopped(); + } + } + ); + + // Adding class for screen sharing styling + screenSharingPubRef.current?.element?.classList.add('OT_big'); + + // Handling stream creation event + screenSharingPubRef.current?.on('streamCreated', () => { + setIsSharingScreen(true); + }); + + screenSharingPubRef.current?.on('videoElementCreated', (e) => { + const videoEl = e.element as HTMLVideoElement; + setScreenshareVideoElement(videoEl); + const mediaStream = videoEl.srcObject as MediaStream | null; + const track = mediaStream?.getVideoTracks?.()[0]; + const settings = track?.getSettings?.(); + const displaySurface = settings?.displaySurface; + + const width = settings?.width; + const height = settings?.height; + + const isMonitor = + displaySurface === 'monitor' || + (!displaySurface && + width !== undefined && + height !== undefined && + width * height >= window.screen.width * window.screen.height); + + setIsEntireScreen(isMonitor); + }); + + screenSharingPubRef.current?.on('streamDestroyed', () => { + onScreenShareStopped(); + }); + + // Handling media stopped event + screenSharingPubRef.current?.on('mediaStopped', () => { + onScreenShareStopped(); + }); + + // Publishing the screen sharing stream + await publish(screenSharingPubRef.current); + + vonageVideoClient?.on('screenshareStreamCreated', handleStreamCreated); + } else if (screenSharingPubRef.current) { + unpublishScreenshare(); + vonageVideoClient?.off('screenshareStreamCreated', handleStreamCreated); + } + } + }, [ + vonageVideoClient, + isSharingScreen, + user.defaultSettings.name, + handleStreamCreated, + unpublishScreenshare, + onScreenShareStopped, + publish, + t, + ]); + + return { + toggleShareScreen, + isSharingScreen, + isEntireScreen, + screenshareVideoElement, + /** + * On the first render this will return null + */ + + screensharingPublisher: screenSharingPubRef.current, + }; +}; + +export default useScreenShare; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSelectDeviceHandler/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSelectDeviceHandler/index.ts new file mode 100644 index 00000000..477799ab --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSelectDeviceHandler/index.ts @@ -0,0 +1 @@ +export { default } from './useSelectDeviceHandler'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSelectDeviceHandler/useSelectDeviceHandler.test.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSelectDeviceHandler/useSelectDeviceHandler.test.ts new file mode 100644 index 00000000..274dc43f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSelectDeviceHandler/useSelectDeviceHandler.test.ts @@ -0,0 +1,33 @@ +import { renderHook } from '@testing-library/react'; +import { ErrorCode } from '@core/errors'; +import { mediaDevices$ } from '@core/stores'; +import { t } from 'i18next'; +import { describe, expect, it, vi } from 'vitest'; +import useSelectDeviceHandler from './useSelectDeviceHandler'; + +describe('useSelectDeviceHandler', () => { + it('maps device access errors with a context-aware message', async () => { + const selectDeviceSpy = vi.spyOn(mediaDevices$.actions, 'selectDevice'); + + const { result } = renderHook(() => useSelectDeviceHandler()); + + selectDeviceSpy.mockRejectedValueOnce({ + type: ErrorCode.DeviceAccess, + message: 'Permission denied', + }); + + await expect( + result.current.handleSelectDevice({ + mediaDeviceKind: 'videoinput', + deviceId: 'camera-2', + }) + ).rejects.toMatchObject({ + type: ErrorCode.DeviceAccess, + fallbackMessage: t('devices.select.accessDenied', { + device: t('devices.video.camera.full'), + }), + }); + + expect(selectDeviceSpy).toHaveBeenCalledWith('videoinput', 'camera-2'); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSelectDeviceHandler/useSelectDeviceHandler.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSelectDeviceHandler/useSelectDeviceHandler.ts new file mode 100644 index 00000000..62defe50 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSelectDeviceHandler/useSelectDeviceHandler.ts @@ -0,0 +1,53 @@ +import { makeApplicationErrorMapper, ErrorCode } from '@core/errors'; +import { mediaDevices$ } from '@core/stores'; +import { t } from 'i18next'; +import { useCallback } from 'react'; + +/** + * Handler for selecting a media device. Adds custom error handling for device selection errors, mapping them to user-friendly messages and logging them appropriately. + */ +const useSelectDeviceHandler = () => { + const handleSelectDevice = useCallback( + async ({ + deviceId, + mediaDeviceKind, + }: { + deviceId: string; + mediaDeviceKind: MediaDeviceKind; + }) => { + try { + await mediaDevices$.actions.selectDevice(mediaDeviceKind, deviceId); + } catch (error) { + const targetDeviceLabel = + { + audioinput: t('devices.audio.microphone.full'), + videoinput: t('devices.video.camera.full'), + audiooutput: t('devices.audio.speakers.full'), + }[mediaDeviceKind] ?? t('devices.select.unknownDevice'); + + const fallbackMessage = t('devices.select.errorContext', { device: targetDeviceLabel }); + + const applicationError = makeApplicationErrorMapper(fallbackMessage)(error); + + if (applicationError.type === ErrorCode.DeviceAccess) { + applicationError.fallbackMessage = t('devices.select.accessDenied', { + device: targetDeviceLabel, + }); + } + + if (applicationError.type === ErrorCode.DevicesTrackUnavailable) { + applicationError.fallbackMessage = t('devices.select.trackUnavailable', { + device: targetDeviceLabel, + }); + } + + throw applicationError; + } + }, + [] + ); + + return { handleSelectDevice }; +}; + +export default useSelectDeviceHandler; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSessionContext.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSessionContext.tsx new file mode 100644 index 00000000..2993a5da --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSessionContext.tsx @@ -0,0 +1,13 @@ +import { useContext } from 'react'; +import { SessionContext, SessionContextType } from '../Context/SessionProvider/session'; + +/** + * React hook to access the session context containing Vonage Video API session data and functions. + * @returns {SessionContextType} - The current context value for the Session Context. + */ +const useSessionContext = (): SessionContextType => { + const context = useContext(SessionContext); + return context; +}; + +export default useSessionContext; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSessionKeyParam.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSessionKeyParam.ts new file mode 100644 index 00000000..2bf1bb03 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSessionKeyParam.ts @@ -0,0 +1,42 @@ +import { isValidRoomName } from '@common/assertions'; +import { useMemo } from 'react'; +import { useParams } from 'react-router-dom'; + +type SessionKeyParamResult = { + sessionKey: string; + sessionKeyStatus: 'valid' | 'invalid' | 'legacy_hack'; +}; + +/** + * Custom hook to get the sessionKey from the URL params and determine its validity. + * The sessionKey is used to identify the session/room that the user is trying to join. + * It checks if the sessionKey is a valid JWT or a valid room name (legacy support). + * @returns An object containing the sessionKey and its validity status. + */ +const useSessionKeyParam = (): SessionKeyParamResult => { + const { roomIdentifier = '' } = useParams<{ roomIdentifier: string }>(); + + return useMemo(() => { + const isJWT = isJsonWebTokenLike(roomIdentifier); + const isRoomNameValid = !isJWT && isValidRoomName(roomIdentifier); + + const sessionKeyStatus = ((): SessionKeyParamResult['sessionKeyStatus'] => { + if (isJWT) return 'valid'; + if (isRoomNameValid) return 'legacy_hack'; + + return 'invalid'; + })(); + + return { + sessionKey: roomIdentifier, + sessionKeyStatus, + }; + }, [roomIdentifier]); +}; + +function isJsonWebTokenLike(value: string): boolean { + const parts = value.split('.'); + return parts.length === 3 && parts.every(Boolean); +} + +export default useSessionKeyParam; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSpeakingDetector.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSpeakingDetector.tsx new file mode 100644 index 00000000..eef81e12 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSpeakingDetector.tsx @@ -0,0 +1,60 @@ +import { useState, useEffect, useRef } from 'react'; +import SpeakingDetector from '../utils/SpeakingDetector'; + +export type UseSpeakingDetectorOptions = { + selectedMicrophoneId: string | undefined; + isAudioEnabled: boolean; +}; +/** + * A react hook wrapper for the SpeakingDetector util + * @param {UseSpeakingDetectorOptions} props - the props for this component + * @property {boolean} isAudioEnabled - current publisher audio state + * @property {string | undefined} selectedMicrophoneId - current publisher microphone device id + * @returns {boolean} isSpeakingWhileMuted - boolean indicating whether speaking is detected while publisher is muted + */ +const useSpeakingDetector = ({ + selectedMicrophoneId, + isAudioEnabled, +}: UseSpeakingDetectorOptions): boolean => { + const [isSpeakingWhileMuted, setIsSpeakingWhileMuted] = useState(false); + const speakingDetectorRef = useRef(null); + + useEffect(() => { + if (isAudioEnabled) { + return undefined; + } + speakingDetectorRef.current = new SpeakingDetector({ + selectedMicrophoneId, + }); + void speakingDetectorRef.current.turnSpeakingDetectorOn(); + + const handleSpeakingWhileMuted = () => { + setIsSpeakingWhileMuted(true); + }; + + const handleMuteIndicationOff = () => { + setIsSpeakingWhileMuted(false); + }; + + const speakingDetector = speakingDetectorRef.current; + + // Subscribe to events + speakingDetector.on('isSpeakingWhileMuted', handleSpeakingWhileMuted); + speakingDetector.on('isSpeakingWhileMutedOff', handleMuteIndicationOff); + + return () => { + // Cleanup and unsubscribe from events + if (speakingDetectorRef.current) { + speakingDetectorRef.current.cleanup(); + speakingDetectorRef.current.off('isSpeakingWhileMuted', handleSpeakingWhileMuted); + speakingDetectorRef.current.off('isSpeakingWhileMutedOff', handleMuteIndicationOff); + speakingDetectorRef.current = null; + setIsSpeakingWhileMuted(false); + } + }; + }, [selectedMicrophoneId, isAudioEnabled]); + + return isSpeakingWhileMuted; +}; + +export default useSpeakingDetector; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSubscriberTalking.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSubscriberTalking.tsx new file mode 100644 index 00000000..d996b0de --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSubscriberTalking.tsx @@ -0,0 +1,67 @@ +import { Subscriber } from '@vonage/client-sdk-video'; +import { useState, useEffect, useMemo, Dispatch, SetStateAction } from 'react'; + +const speakingTimeThreshold = 100; +const notSpeakingTimeThreshold = 800; +const speakingVolume = 0.1; + +export type SubscriberTalkingProps = { + subscriber: Subscriber; + isActiveSpeaker: boolean; +}; + +const createOnHandleAudioLevelUpdated = (setIsTalking: Dispatch>) => { + let isTalking = false; + let timestamp = Date.now(); + + const handleAudioLevel = (audioLevel: number) => { + const now = Date.now(); + if (audioLevel > speakingVolume) { + if (!isTalking) { + isTalking = true; + timestamp = now; + } else if (now - timestamp > speakingTimeThreshold) { + isTalking = true; + timestamp = now; + setIsTalking(true); + } + } else if (isTalking && now - timestamp > notSpeakingTimeThreshold) { + isTalking = false; + setIsTalking(false); + } + }; + + return ({ audioLevel }: { audioLevel: number }) => handleAudioLevel(audioLevel); +}; + +/** + * Hook to determine whether or not the subscriber is talking. + * @param {SubscriberTalkingProps} props - The props for the hook. + * @returns {boolean} Whether the Subscriber is talking or not. + */ +const useSubscriberTalking = ({ subscriber, isActiveSpeaker }: SubscriberTalkingProps): boolean => { + const [isTalking, setIsTalking] = useState(false); + const audioLevelUpdateHandler = useMemo( + () => createOnHandleAudioLevelUpdated(setIsTalking), + [setIsTalking] + ); + + useEffect(() => { + if (subscriber && isActiveSpeaker) { + subscriber.on('audioLevelUpdated', audioLevelUpdateHandler); + } + + return () => { + if (subscriber) { + subscriber.off('audioLevelUpdated', audioLevelUpdateHandler); + } + if (isTalking) { + setIsTalking(false); + } + }; + }, [subscriber, audioLevelUpdateHandler, isActiveSpeaker, isTalking]); + + return isTalking; +}; + +export default useSubscriberTalking; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSubscribersInDisplayOrder.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSubscribersInDisplayOrder.tsx new file mode 100644 index 00000000..3da340b5 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useSubscribersInDisplayOrder.tsx @@ -0,0 +1,21 @@ +import getSubscribersInDisplayOrder from '../utils/helpers/getSubscribersInDisplayOrder'; +import { SubscriberWrapper } from '../types/session'; +import { useAccumulator } from '@web/hooks'; + +/** + * Hook to get SubscriberWrappers in display order. This hook keeps the state of previous subscribers on screen + * and uses this to determine how to display subscribers such that they maintain they're position on screen whilst + * finding the optimal position to place new subscribers. + * @param {SubscriberWrapper[]} subscribersOnScreen - an array of SubscriberWrappers that should be displayed + * @returns {SubscriberWrapper[]} subscribersInDisplayOrder - SubscriberWrappers to be displayed in display order + */ +const useSubscribersInDisplayOrder = (subscribersOnScreen: SubscriberWrapper[]) => { + return useAccumulator( + (previousDisplayOrder): SubscriberWrapper[] => { + return getSubscribersInDisplayOrder(subscribersOnScreen, previousDisplayOrder ?? []); + }, + [subscribersOnScreen] + ).current; +}; + +export default useSubscribersInDisplayOrder; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useToolbarButtons.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useToolbarButtons.tsx new file mode 100644 index 00000000..5758c068 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useToolbarButtons.tsx @@ -0,0 +1,131 @@ +import { RefObject, useEffect, useRef, useState } from 'react'; +import throttle from '@common/execution/throttle'; +import ResizeObserverPolyfill from 'resize-observer-polyfill'; +import { RIGHT_PANEL_BUTTON_COUNT } from '../utils/constants'; + +export type UseToolbarButtonsProps = { + timeRoomNameRef: RefObject; + toolbarRef: RefObject; + mediaControlsRef: RefObject; + overflowAndExitRef: RefObject; + rightPanelControlsRef: RefObject; + numberOfToolbarButtons: number; +}; + +export type UseToolbarButtons = { + displayTimeRoomName: boolean; + centerButtonLimit: number; + rightButtonLimit: number; +}; + +/** + * React hook to determine which buttons should be displayed on the toolbar. + * @param {UseToolbarButtonsProps} props - The props for the hook + * @property {RefObject} toolbarRef - The ref for the Toolbar + * @property {RefObject} mediaControlsRef - The ref for the audio and video controls + * @property {RefObject} overflowAndExitRef - The ref for the overflow and exit buttons + * @property {RefObject} rightPanelControlsRef - The ref for the right panel buttons + * @returns {UseToolbarButtons} The center and right toolbar buttons' limits, and whether to display the TimeRoomNameMeetingRoom component + */ +const useToolbarButtons = ({ + timeRoomNameRef, + toolbarRef, + mediaControlsRef, + overflowAndExitRef, + rightPanelControlsRef, + numberOfToolbarButtons, +}: UseToolbarButtonsProps): UseToolbarButtons => { + const observer = useRef(undefined); + const [displayTimeRoomName, setDisplayTimeRoomName] = useState(false); + + const [centerButtonLimit, setCenterButtonLimit] = useState(0); + const [rightButtonLimit, setRightButtonLimit] = useState(0); + const buttonWidth = 60; + + useEffect(() => { + if (toolbarRef.current && !observer.current) { + const throttledSetToolbarButtons = throttle( + () => { + if ( + !( + timeRoomNameRef.current && + toolbarRef.current && + mediaControlsRef.current && + overflowAndExitRef.current && + rightPanelControlsRef.current + ) + ) { + return; + } + + const toolbarStyle = window.getComputedStyle(toolbarRef.current); + const toolbarPadding = + parseFloat(toolbarStyle.paddingLeft) + parseFloat(toolbarStyle.paddingRight); + const rightPanelControlsStyle = window.getComputedStyle(rightPanelControlsRef.current); + const rightPanelMargin = parseFloat(rightPanelControlsStyle.marginLeft); + const timeRoomNameStyle = window.getComputedStyle(timeRoomNameRef.current); + const timeRoomNameMargin = parseFloat(timeRoomNameStyle.marginRight); + const necessaryComponentsWidth = + mediaControlsRef.current.clientWidth + + overflowAndExitRef.current.clientWidth + + toolbarPadding + + rightPanelMargin + + timeRoomNameMargin; + + const spaceForExtraButtons = Math.max( + 0, + toolbarRef.current.clientWidth - necessaryComponentsWidth + ); + const maxButtons = Math.floor(spaceForExtraButtons / buttonWidth); + + // We reserve a few buttons for the right panel + const maxButtonsForCenter = numberOfToolbarButtons - RIGHT_PANEL_BUTTON_COUNT; + // If there's more buttons able to be displayed, we only display the max for the center of the toolbar + const toolbarCenterLimit = + maxButtons > maxButtonsForCenter ? maxButtonsForCenter : maxButtons; + + setDisplayTimeRoomName(maxButtons > numberOfToolbarButtons + 1); + setCenterButtonLimit(toolbarCenterLimit); + setRightButtonLimit(Math.min(numberOfToolbarButtons, maxButtons)); + }, + 300, + { leading: true, trailing: false } + ); + + observer.current = new ResizeObserverPolyfill(() => { + throttledSetToolbarButtons(); + }); + } + + if (!(toolbarRef.current && observer.current)) { + return; + } + + // The cleanup function may not be pointing to the correct object/ref by the time it executes. + // We keep its reference so the cleanup function runs correctly. + const observedToolbar = toolbarRef.current; + + observer.current.observe(toolbarRef.current); + + return () => { + if (observedToolbar) { + observer.current?.unobserve(observedToolbar); + } + }; + }, [ + mediaControlsRef, + overflowAndExitRef, + rightPanelControlsRef, + numberOfToolbarButtons, + toolbarRef, + timeRoomNameRef, + ]); + + return { + displayTimeRoomName, + centerButtonLimit, + rightButtonLimit, + }; +}; + +export default useToolbarButtons; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useUserContext.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useUserContext.tsx new file mode 100644 index 00000000..a83511d7 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useUserContext.tsx @@ -0,0 +1,16 @@ +import { useContext } from 'react'; +import { UserContext, UserContextType } from '../Context/user'; + +/** + * React hook to access the User context containing user information. + * @returns {UserContextType} - The current context value for the User Context. + */ +const useUserContext = (): UserContextType => { + const context = useContext(UserContext); + if (!context) { + throw new Error('UserContext must be used within a UserProvider'); + } + return context; +}; + +export default useUserContext; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useWaitingRoom.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useWaitingRoom.ts new file mode 100644 index 00000000..dd8ed15c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useWaitingRoom.ts @@ -0,0 +1,104 @@ +import { useState, useEffect, useEffectEvent } from 'react'; +import type { MouseEvent, TouchEvent } from 'react'; +import usePreviewPublisherContext from './usePreviewPublisherContext'; +import useBackgroundPublisherContext from './useBackgroundPublisherContext'; +import useSessionKeyParam from './useSessionKeyParam'; +import useDecodedSessionKey from './useDecodedSessionKey'; +import { getStorageItem, STORAGE_KEYS } from '../utils/storage'; +import { DEVICE_ACCESS_STATUS } from '../utils/constants'; +import { env } from '../env'; + +const useWaitingRoom = () => { + const { sessionKey, sessionKeyStatus } = useSessionKeyParam(); + + const { roomName } = useDecodedSessionKey({ + sessionKey, + sessionKeyStatus, + }); + + const { initLocalPublisher, publisher, accessStatus, destroyPublisher, isVideoLoading } = + usePreviewPublisherContext(); + + const { initBackgroundLocalPublisher, publisher: backgroundPublisher } = + useBackgroundPublisherContext(); + + const [anchorEl, setAnchorEl] = useState(null); + const [openAudioInput, setOpenAudioInput] = useState(false); + const [openVideoInput, setOpenVideoInput] = useState(false); + const [openAudioOutput, setOpenAudioOutput] = useState(false); + const [username, setUsername] = useState(getStorageItem(STORAGE_KEYS.USERNAME) ?? ''); + + const stableInitLocalPublisher = useEffectEvent(() => { + if (!publisher) { + initLocalPublisher(); + } + + return () => { + if (publisher) { + destroyPublisher(); + } + }; + }); + + useEffect(() => { + return stableInitLocalPublisher(); + }, [publisher]); + + useEffect(() => { + if (!backgroundPublisher) { + initBackgroundLocalPublisher(); + } + }, [initBackgroundLocalPublisher, backgroundPublisher]); + + const handleAudioInputOpen = ( + event: MouseEvent | TouchEvent + ) => { + setAnchorEl(event.currentTarget); + setOpenAudioInput(true); + }; + + const handleVideoInputOpen = ( + event: MouseEvent | TouchEvent + ) => { + setAnchorEl(event.currentTarget); + setOpenVideoInput(true); + }; + + const handleAudioOutputOpen = ( + event: MouseEvent | TouchEvent + ) => { + setAnchorEl(event.currentTarget); + setOpenAudioOutput(true); + }; + + const handleClose = () => { + setAnchorEl(null); + setOpenAudioInput(false); + setOpenAudioOutput(false); + setOpenVideoInput(false); + }; + + const isRoomReady = + env.WAITING_ROOM_ALLOW_DEVICE_SELECTION && + accessStatus === DEVICE_ACCESS_STATUS.ACCEPTED && + !isVideoLoading; + + return { + anchorEl, + openAudioInput, + openVideoInput, + openAudioOutput, + username, + setUsername, + accessStatus, + isRoomReady, + roomName, + sessionKey, + handleAudioInputOpen, + handleVideoInputOpen, + handleAudioOutputOpen, + handleClose, + }; +}; + +export default useWaitingRoom; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useWindowWidth.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useWindowWidth.tsx new file mode 100644 index 00000000..ea6fb520 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/hooks/useWindowWidth.tsx @@ -0,0 +1,20 @@ +import { useEffect, useState } from 'react'; + +/** + * React hook to find the current window width. + * @returns {number} - How wide the current window is + */ +const useWindowWidth = () => { + const [width, setWidth] = useState(window.innerWidth); + + useEffect(() => { + const handleResize = () => setWidth(window.innerWidth); + window.addEventListener('resize', handleResize); + + return () => window.removeEventListener('resize', handleResize); + }, []); + + return width; +}; + +export default useWindowWidth; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/i18n.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/i18n.ts new file mode 100644 index 00000000..0494d947 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/i18n.ts @@ -0,0 +1,23 @@ +import i18n from 'i18next'; +import { initReactI18next } from 'react-i18next'; +import LanguageDetector from 'i18next-browser-languagedetector'; +import resources from './locales'; +import { env } from './env'; + +void i18n + // detect user language: https://github.com/i18next/i18next-browser-languageDetector + .use(LanguageDetector) + .use(initReactI18next) + // for all options read: https://www.i18next.com/overview/configuration-options + .init({ + fallbackLng: env.I18N_FALLBACK_LANGUAGE, + supportedLngs: env.I18N_SUPPORTED_LANGUAGES, + resources, + + /** + * Suppress the warning about using the fallback language when a translation key is missing in the current language. + */ + showSupportNotice: false, + }); + +export default i18n; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/index.d.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/index.d.ts new file mode 100644 index 00000000..9fde91e3 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/index.d.ts @@ -0,0 +1,33 @@ +/** + * Attributes available on the vera-room custom element. + * These map to the bridge attributes used for configuration. + */ +type VeraRoomAttributes = { + /** The entry point identifier for logging and session source tracking */ + 'entry-point'?: string; + + /** Session identifier to join an existing session directly */ + 'session-identifier'?: string; + + /** + * BCP-47 language tag for the UI locale (e.g. 'en', 'es', 'it'). + * Falls back to the browser's detected language when not provided. + */ + language?: string; +}; + +declare module 'react' { + namespace JSX { + interface IntrinsicElements { + /** + * Vera embeddable web component for video conferencing. + */ + 'vera-room': React.DetailedHTMLProps< + React.HTMLAttributes & VeraRoomAttributes, + HTMLElement + >; + } + } +} + +export {}; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/locales/de.json b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/locales/de.json new file mode 100644 index 00000000..13a768b4 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/locales/de.json @@ -0,0 +1,312 @@ +{ + "archiveList.archive.createdAt": "Erstellt: {{createdAt}}", + "archiveList.archive.index": "Aufzeichnung {{index}}", + "archiveList.download.tooltip": "Aufzeichnung {{id}} herunterladen", + "archiveList.download": "Herunterladen", + "archiveList.empty": "Das Meeting wurde nicht aufgezeichnet", + "archiveList.error.text": "Fehler beim Laden der Aufzeichnungen für dieses Meeting", + "archiveList.error.tooltip": "Diese Aufzeichnung ist fehlgeschlagen oder abgelaufen", + "archiveList.label": "Aufzeichnungen herunterladen", + "archiveList.loading": "Wir verarbeiten Ihre Aufzeichnung", + "archiveList.loading.subtitle": "Warten Sie einige Sekunden, um Ihre Aufzeichnung herunterzuladen", + "advancedSettings.title": "Einstellungen", + "advancedSettings.open": "Einstellungen öffnen", + "advancedSettings.close": "Einstellungen schließen", + "advancedSettings.ariaLabel": "Einstellungen öffnen", + "advancedSettings.tabs.general": "Allgemein", + "advancedSettings.tabs.video": "Video", + "advancedSettings.tabs.audio": "Audio", + "advancedSettings.tabs.statistics": "Statistiken", + "advancedSettings.general.resetButton": "Standardwerte zurücksetzen", + "advancedSettings.general.resetDescription": "Stellt alle Einstellungen auf ihre Standardwerte zurück", + "advancedSettings.video.bitrate.label": "Bitrate", + "advancedSettings.video.bitrate.options.default": "Standard", + "advancedSettings.video.bitrate.options.bw_saver": "Bandbreitensparend", + "advancedSettings.video.bitrate.options.extra_bw_saver": "Zusätzliche Bandbreitenersparnis", + "advancedSettings.video.bitrate.options.custom": "Benutzerdefiniert", + "advancedSettings.video.bitrate.description": "Mit der Vonage Video API können Sie Bitrate-Presets verwenden oder eine benutzerdefinierte maximale Video-Bitrate festlegen.", + "advancedSettings.video.customBitrate.label": "Benutzerdefinierte Bitrate", + "advancedSettings.video.customBitrate.description": "Legen Sie eine maximale Video-Bitrate zwischen 5 kbps und 10 Mbps fest.", + "advancedSettings.video.customBitrate.minimum": "5 kbps", + "advancedSettings.video.customBitrate.maximum": "10 Mbps", + "advancedSettings.video.customBitrate.units.lower": "kbps", + "advancedSettings.video.customBitrate.units.higher": "Mbps", + "advancedSettings.video.codec.label": "Codec", + "advancedSettings.video.codec.options.automatic": "Automatisch", + "advancedSettings.video.codec.options.manual": "Manuell", + "advancedSettings.video.codec.description": "Das SDK wählt automatisch den besten Codec basierend auf Netzwerkbedingungen und Teilnehmerfähigkeiten aus. Änderungen gelten ab dem nächsten Anruf.", + "advancedSettings.video.codec.priority.label": "Codec-Priorität", + "advancedSettings.video.codec.priority.description": "Ziehen Sie die Einträge, um die bevorzugte Codec-Reihenfolge vom ersten bis zum letzten festzulegen.", + "advancedSettings.video.codec.priority.options.vp9": "VP9", + "advancedSettings.video.codec.priority.options.vp8": "VP8", + "advancedSettings.video.codec.priority.options.h264": "H.264", + "advancedSettings.video.frameRate.label": "Bildrate", + "advancedSettings.video.frameRate.options.30": "30 FPS", + "advancedSettings.video.frameRate.options.15": "15 FPS", + "advancedSettings.video.frameRate.options.7": "7 FPS", + "advancedSettings.video.frameRate.options.1": "1 FPS", + "advancedSettings.video.resolution.label": "Auflösung", + "advancedSettings.video.error.resolutionNotSupported": "Die ausgewählte Auflösung wird von Ihrem Gerät nicht unterstützt.", + "advancedSettings.video.error.frameRateNotSupported": "Die ausgewählte Bildrate wird von Ihrem Gerät nicht unterstützt.", + "advancedSettings.video.error.bitrateNotSupported": "Die ausgewählte Bitrate konnte nicht angewendet werden.", + "advancedSettings.audio.bitrate.label": "Audio-Bitrate", + "advancedSettings.audio.bitrate.description": "Verwendet automatisch den Standardwert des SDK, oder wählen Sie Benutzerdefiniert, um die maximale Audio-Kodierungsbitrate für die Sitzung festzulegen.", + "advancedSettings.audio.bitrate.options.automatic": "Automatisch", + "advancedSettings.audio.bitrate.options.custom": "Benutzerdefiniert", + "advancedSettings.audio.bitrate.customLabel": "Benutzerdefinierte Audio-Bitrate", + "advancedSettings.audio.bitrate.minimum": "6 kbps", + "advancedSettings.audio.bitrate.maximum": "510 kbps", + "advancedSettings.audio.bitrate.currentValue": "{{value}} kbps", + "advancedSettings.audio.enableDtx.label": "Opus DTX aktivieren", + "advancedSettings.audio.enableDtx.description": "Wenn aktiviert, reduziert die diskontinuierliche Opus-Übertragung die Audio-Bandbreite während Sprechpausen.", + "advancedSettings.audio.publisherAudioFallback.label": "Audio-Fallback des Publishers", + "advancedSettings.audio.publisherAudioFallback.description": "Wenn aktiviert, wird Ihr Video bei schlechter Netzwerkqualität auf anderen Geräten nicht mehr gerendert, um das Audio zu erhalten.", + "advancedSettings.audio.subscriberAudioFallback.label": "Audio-Fallback des Subscribers", + "advancedSettings.audio.subscriberAudioFallback.description": "Wenn aktiviert, empfangen Sie bei schlechter Netzwerkqualität nur Audio von anderen Teilnehmern.", + "advancedSettings.audio.nextCallWarningWaitingRoom": "Änderungen werden wirksam, wenn Sie dem Anruf beitreten.", + "advancedSettings.audio.nextCallWarningMeetingRoom": "Änderungen werden beim nächsten Anruf oder nach dem Aktualisieren der Seite wirksam.", + "advancedSettings.statistics.collection.enablePublisher.label": "Bandbreitenschätzung des Publishers aktivieren", + "advancedSettings.statistics.collection.enablePublisher.description": "Wenn aktiviert, wird die geschätzte verfügbare ausgehende Bandbreite für den lokalen Publisher angezeigt.", + "advancedSettings.statistics.groups.publisher": "Publisher", + "advancedSettings.statistics.groups.subscribers": "Subscribers", + "advancedSettings.statistics.empty": "Es sind noch keine Statistiken verfügbar.", + "advancedSettings.statistics.sections.audio": "Audio", + "advancedSettings.statistics.sections.video": "Video", + "advancedSettings.statistics.metrics.packetsSent": "Gesendete Pakete", + "advancedSettings.statistics.metrics.packetsLostSent": "Verlorene Pakete (Senden)", + "advancedSettings.statistics.metrics.bytesSent": "Gesendete Bytes", + "advancedSettings.statistics.metrics.packetsReceived": "Empfangene Pakete", + "advancedSettings.statistics.metrics.packetsLostReceived": "Verlorene Pakete (Empfang)", + "advancedSettings.statistics.metrics.bytesReceived": "Empfangene Bytes", + "advancedSettings.statistics.metrics.estimatedBandwidth": "Geschätzte Bandbreite", + "advancedSettings.statistics.metrics.remotePublisherEstimatedBandwidth": "Geschätzte Bandbreite des Remote-Publishers", + "advancedSettings.statistics.metrics.resolution": "Auflösung", + "advancedSettings.statistics.metrics.frameRate": "Bildrate", + "advancedSettings.statistics.metrics.decodedFrameRate": "Dekodierte Bildrate", + "advancedSettings.statistics.metrics.bitrate": "Bitrate", + "advancedSettings.statistics.metrics.packetLoss": "Paketverlust", + "advancedSettings.statistics.metrics.freezeCount": "Anzahl der Einfrierungen", + "advancedSettings.statistics.metrics.totalFreezesDuration": "Gesamtdauer der Einfrierungen", + "advancedSettings.statistics.metrics.codec": "Codec", + "advancedSettings.statistics.metrics.videoLayer": "Schicht {{index}} ({{codec}})", + "backgroundEffects.limit": "Sie haben das Maximum für benutzerdefinierte Bilder erreicht", + "backgroundEffects.title": "Videoeffekte", + "backgroundEffects.addBackground": "Hintergrund ändern", + "backgroundEffects.video.disabled": "Ihre Kamera ist ausgeschaltet.", + "backgroundEffects.invalidFileType": "Nur JPG-, PNG-, GIF- oder BMP-Bilder sind zulässig.", + "backgroundEffects.fileTooLarge": "Bild muss kleiner als {{maxSize}}MB sein.", + "backgroundEffects.processingError": "Fehler beim Verarbeiten des hochgeladenen Bildes.", + "backgroundEffects.storageError": "Fehler beim Speichern des Bildes.", + "backgroundEffects.maxSize": "Max {{maxSize}}MB", + "backgroundEffects.removeBackground": "Hintergrund entfernen", + "backgroundEffects.slightBlur": "Leichte Hintergrundunschärfe", + "backgroundEffects.strongBlur": "Starke Hintergrundunschärfe", + "backgroundEffects.yourBackground": "Ihr Hintergrund", + "backgroundEffects.deleteTooltipInUse": "Sie können diesen Hintergrund nicht entfernen, während er verwendet wird", + "backgroundEffects.deleteTooltip": "Hintergrund löschen", + "backgroundEffects.deleteAriaLabel": "Benutzerdefinierten Hintergrund löschen", + "backgroundEffects.backgrounds.bookshelfRoom": "Bücherregal-Zimmer", + "backgroundEffects.backgrounds.busyRoom": "Belebtes Zimmer", + "backgroundEffects.backgrounds.duneView": "Dünenblick", + "backgroundEffects.backgrounds.hogwarts": "Hogwarts", + "backgroundEffects.backgrounds.library": "Bibliothek", + "backgroundEffects.backgrounds.newYork": "New York", + "backgroundEffects.backgrounds.plane": "Flugzeug", + "backgroundEffects.backgrounds.whiteRoom": "Weißes Zimmer", + "button.apply": "Anwenden", + "button.camera": "Kamera", + "button.cancel": "Abbrechen", + "button.close": "Schließen", + "button.createRoom": "Neuen Raum erstellen", + "button.startNewRoom": "Neues Videomeeting starten", + "button.joinExistingMeeting": "Bestehendem Meeting beitreten", + "button.joinWaitingRoom": "Warteraum betreten", + "button.join": "Meeting beitreten", + "button.mute": "Stummschalten", + "button.send": "Senden", + "button.speaker": "Lautsprecher", + "captions.ariaLabel": "Untertitel-Schaltfläche", + "captions.disable": "Untertitel deaktivieren", + "captions.enable": "Untertitel aktivieren", + "captions.errors": "Untertitelfehler: {{captionsErrorResponse}}", + "chat.ariaLabel": "Chat umschalten", + "chat.close": "Chat schließen", + "chat.copied": "Kopiert", + "chat.copy": "In Zwischenablage kopieren", + "chat.input.placeholder": "Nachricht senden", + "chat.meetingUrl": "Meeting-URL:", + "chat.open": "Chat öffnen", + "chat.title": "Chat", + "common.or": "oder", + "connectionAlert.quality.message": "Bitte überprüfen Sie Ihre Verbindung. Ihr Video kann deaktiviert werden, um das Benutzererlebnis zu verbessern", + "connectionAlert.quality.title": "Videoquadrat-Problem", + "connectionAlert.reconnecting.message": "Bitte überprüfen Sie Ihre Netzwerkverbindung", + "connectionAlert.reconnecting.title": "Verbindung unterbrochen", + "deviceAccessAlert.askDeviceMessage": "Um dem Videoraum beizutreten, verlangt Ihr Browser Zugriff auf Ihre Kamera und Ihr Mikrofon.", + "deviceAccessAlert.deniedDeviceMessage": "Es scheint, dass Ihr Browser keine Berechtigung für den Zugriff auf Ihre Kamera und/oder Ihr Mikrofon hat. Setzen Sie die Berechtigung über die Benutzeroberfläche des Browsers zurück.", + "deviceAccessAlert.imageAlt": "Zugriffsdialog", + "devices.audio.ariaLabel": "Audio-Geräte Dropdown", + "devices.audio.defaultLabel": "Systemstandard", + "devices.audio.disable": "Mikrofon deaktivieren", + "devices.audio.disabled": "Mikrofonsteuerung ist in dieser Anwendung deaktiviert", + "devices.audio.enable": "Mikrofon aktivieren oder Leertaste halten, um vorübergehend stummschaltung aufzuheben", + "devices.audio.microphone.ariaLabel": "Audio umschalten", + "devices.audio.microphone.full": "Mikrofon", + "devices.audio.microphone.short": "Mikro", + "devices.audio.microphone.state.on": "Mikrofon aktivieren", + "devices.audio.microphone.state.off": "Mikrofon deaktivieren", + "devices.audio.noiseSuppression": "Erweiterte Rauschunterdrückung", + "devices.audio.speakers.full": "Lautsprecher", + "devices.buttons.ariaLabel": "Geteilte Schaltfläche", + "devices.settings.ariaLabel": "Geräteeinstellungen", + "devices.select.unknownDevice": "Gerät", + "devices.select.errorContext": "{{device}} konnte nicht ausgewählt werden. Bitte überprüfen Sie die Geräteberechtigungen und versuchen Sie es erneut.", + "devices.select.accessDenied": "Der Zugriff auf {{device}} wurde verweigert. Bitte überprüfen Sie die Browserberechtigungen.", + "devices.select.trackUnavailable": "{{device}} ist derzeit nicht verfügbar. Bitte überprüfen Sie die Geräteverbindung.", + "devices.video.ariaLabel": "Videogeräte Dropdown", + "devices.video.blur.ariaLabel": "Hintergrundunschärfe umschalten", + "devices.video.blur.label": "Ihren Hintergrund unschärfen", + "devices.video.camera.ariaLabel": "Video umschalten", + "devices.video.camera.switch": "Kamera wechseln", + "devices.video.camera.state.on": "Kamera aktivieren", + "devices.video.camera.state.off": "Kamera deaktivieren", + "devices.video.camera.full": "Kamera", + "devices.video.camera.front": "vordere", + "devices.video.camera.rear": "hintere", + "devices.video.camera.switchError": "Die {{facingMode}} Kamera konnte nicht gewechselt werden", + "devices.video.camera.accessError": "Die {{facingMode}} Kamera konnte nicht verwendet werden. Überprüfen Sie Ihre Kameragerechte und versuchen Sie es erneut.", + "devices.video.camera.noTrackError": "Die {{facingMode}} Kamera ist nicht korrekt gestartet. Versuchen Sie eine andere Kamera.", + "devices.video.camera.noDeviceError": "Es wurde keine {{facingMode}} Kamera gefunden", + "devices.video.camera.noCurrentDeviceError": "Keine Kamera ausgewählt. Wählen Sie zuerst eine Kamera aus.", + "devices.video.camera.selectedDevice": "Ausgewählte Kamera: {{deviceName}}", + "devices.video.disable": "Video deaktivieren", + "devices.video.disabled": "Kamerasteuerung ist in dieser Anwendung deaktiviert", + "devices.video.enable": "Video aktivieren", + "emoji.ariaLabel": "Emoji-Menü öffnen", + "emoji.tooltip": "Drücken Sie sich aus", + "errors.unknown": "Unbekannter Fehler aufgetreten", + "feedbackForm.ariaLabel": "Problemmeldeformular umschalten", + "feedbackForm.close": "Problemmeldeformular schließen", + "feedbackForm.disclaiamer.label": "Bitte fügen Sie keine sensiblen Informationen ein.", + "feedbackForm.disclaiamer.screenshot": "Ein Screenshot hilft uns, das Problem besser zu verstehen. (optional)", + "feedbackForm.field.issue.label": "Beschreiben Sie Ihr Problem", + "feedbackForm.field.issue.type": "Beschreibung", + "feedbackForm.field.name.label": "Sagen Sie uns Ihren Namen", + "feedbackForm.field.name.type": "Ihr Name", + "feedbackForm.field.title.label": "Was haben Sie getan, als Sie dieses Problem bemerkt haben?", + "feedbackForm.field.title.type": "Titel", + "feedbackForm.helperText.error": "{{field}} ist erforderlich und muss weniger als {{limit}} Zeichen enthalten", + "feedbackForm.open": "Problemmeldeformular öffnen", + "feedbackForm.submitted.content": "Wir schätzen Ihre Eingabe sehr, da sie uns hilft, die App zu verbessern und Probleme zu beheben.", + "feedbackForm.submitted.error": "Etwas ist schief gelaufen. Bitte versuchen Sie es erneut.", + "feedbackForm.submitted.thanks": "Vielen Dank für Ihr Feedback!", + "feedbackForm.submitted.track": "Verfolgen Sie Ihren Fortschritt hier.", + "feedbackForm.title": "Problem melden", + "filePicker.addScreenshot": "Screenshot hinzufügen", + "filePicker.attachedScreenshot": "Screenshot angehängt", + "filePicker.capture": "Screenshot erfassen", + "filePicker.delete": "Screenshot löschen", + "filePicker.sizeLimit": "Die maximale Uploadgröße beträgt 20MB. Bitte laden Sie eine andere Datei hoch.", + "footer.github.title": "Vonage Video Referenzanwendung", + "imageStorage.imagesExceedSize": "Bilder sind zu groß zum Speichern (~4MB max).", + "imageStorage.storageFailure": "Fehler beim Speichern von Bildern in localStorage.", + "imageStorage.duplicateImage": "Dieses Bild wurde bereits hinzugefügt.", + "imageStorage.fileReadError": "Fehler beim Lesen der Bilddatei.", + "imageStorage.invalidExtension": "Ungültige Bilderweiterung.", + "imageStorage.invalidUrl": "Ungültige Bild-URL.", + "imageStorage.convertError": "Bild konnte nicht konvertiert werden.", + "imageStorage.loadError": "Bild konnte nicht geladen werden.", + "githubTooltip": "Besuchen Sie unser GitHub-Repository", + "goodBye.title": "Raum erneut beitreten", + "goodBye.back": "Landingpage ansehen", + "goodBye.reEnter": "Zurück zum Meeting", + "goodbye.default.header": "Sie haben das Meeting verlassen", + "goodbye.default.message": "Vielen Dank für Ihre Teilnahme!", + "landing.welcome.subtitle": "Nutzen Sie Video, um Ihr Business zu transformieren und die Kundenzufriedenheit zu steigern.", + "landing.welcome.title.1": "Verbessern", + "landing.welcome.title.2": "Sie Ihre", + "landing.welcome.title.3": "Videokommunikation", + "landing.primary.word": "Video", + "layout.tooltip.isPinningPresent": "Layout kann nicht gewechselt werden, während ein Teilnehmer angeheftet ist", + "layout.tooltip.isScreenSharePresent": "Layout kann nicht gewechselt werden, während Bildschirmfreigabe aktiv ist", + "layout.tooltip.switchToActiveSpeaker": "Zu Active Speaker Layout wechseln", + "layout.tooltip.switchToGrid": "Zu Rasterlayout wechseln", + "mutedAlert.message.forceMuted": "Sie wurden von einem anderen Teilnehmer stummgeschaltet. Klicken Sie auf das Mikrofon, um die Stummschaltung aufzuheben.", + "mutedAlert.message.muted": "Sprechen Sie? Ihr Mikrofon ist ausgeschaltet. Klicken Sie auf das Mikrofon, um es einzuschalten.", + "participants.list.ariaLabel": "Teilnehmerliste umschalten", + "participants.list.close": "Teilnehmerliste schließen", + "participants.list.open": "Teilnehmerliste öffnen", + "participants.maxPin": "Sie können keine weiteren Kacheln anheften", + "participants.mute.dialog.content": "{{participantName}} für alle im Anruf stummschalten? Nur {{participantName}} kann sich selbst unmute.", + "participants.mute.tooltip": "Mikrofon von {{participantName}} stummschalten", + "participants.pin": "{{participantName}} anheften", + "participants.pin.video": "Video von {{participantName}} anheften", + "participants.screen": "Bildschirm von {{participantName}}", + "participants.search": "Teilnehmer suchen", + "participants.title": "Teilnehmer", + "participants.unpin": "{{participantName}} losreißen", + "participants.unpin.video": "Video von {{participantName}} losreißen", + "publishingErrors.accessDenied.message": "Es scheint, dass Ihr Browser den Zugriff auf Ihr {{device}} blockiert. Setzen Sie den Genehmigungsstatus über die Benutzeroberfläche des Browsers zurück.", + "publishingErrors.accessDenied.title": "{{device}}-Zugriff verweigert", + "publishingErrors.blocked.message": "Wir haben Schwierigkeiten, Sie mit anderen im Meetingraum zu verbinden. Bitte überprüfen Sie Ihre Netzwerkverbindung und versuchen Sie es erneut.", + "publishingErrors.blocked.title": "Schwierigkeiten beim Beitreten zum Raum", + "subscribingErrors.blocked.message": "Wir haben Schwierigkeiten, Sie mit anderen im Meetingraum zu verbinden. Bitte überprüfen Sie Ihre Netzwerkverbindung und versuchen Sie es erneut.", + "subscribingErrors.blocked.title": "Schwierigkeiten beim Beitreten zum Raum", + "recording.start.dialog.content": "Stellen Sie sicher, dass alle bereit sind! Sie können die Aufzeichnung nach dem Verlassen des Raums von der Seite \"Auf Wiedersehen\" herunterladen.", + "recording.start.dialog.title": "Aufzeichnung starten?", + "recording.start.title": "Aufzeichnung starten", + "recording.stop.dialog.content": "Sie können die Aufzeichnung nach dem Verlassen des Raums von der Seite \"Auf Wiedersehen\" herunterladen.", + "recording.stop.dialog.title": "Aufzeichnung stoppen?", + "recording.stop.title": "Aufzeichnung stoppen", + "recording.tooltip.ariaLabel": "Videolayout", + "room.exit.ariaLabel": "Beenden", + "room.exit.tooltip": "Meeting verlassen", + "room.input.helper": "Kann nicht leer sein und darf keine Leerzeichen oder Sonderzeichen enthalten", + "room.input.label": "Raumname", + "screenSharing.dialog.action": "Starten Sie, Ihren Bildschirm zu teilen", + "screenSharing.dialog.content": "Es sieht so aus, als würde jemand anderes seinen Bildschirm teilen. Wenn Sie fortfahren, wird ihr Bildschirm nicht mehr geteilt.", + "screenSharing.dialog.title": "Möchten Sie Ihren Bildschirm teilen?", + "screenSharing.dialog.hiddenMessage": "Sie teilen gerade Ihren Bildschirm.", + "screenSharing.title.start": "Bildschirmfreigabe starten", + "screenSharing.title.stop": "Bildschirmfreigabe stoppen", + "screenSharing.tooltip.ariaLabel": "Bildschirmfreigabe starten oder stoppen", + "soundTest.start": "Lautsprecher testen", + "soundTest.stop": "Test stoppen", + "toolbar.tooltip.ariaLabel": "Menü für zusätzliche Symbolleistenelement öffnen", + "toolbar.tooltip.title": "Auf zusätzliche Symbolleistenelemente zugreifen", + "unsupportedBrowser.header": "Ihr Browser wird nicht unterstützt.", + "unsupportedBrowser.message": "Überprüfen Sie die Liste und wählen Sie einen unterstützten Browser.", + "unsupportedBrowser.supported.visitPage": "Seite besuchen", + "unsupportedBrowser.supported.title": "Unterstützte Browser:", + "unknown.device": "Unbekanntes Gerät", + "user.unknown": "unbekannter Benutzer", + "user.you": "Sie", + "waitingRoom.unsupportedFeature.tooltip": "Ihr Browser unterstützt diese Funktion nicht", + "waitingRoom.devices.noDevicesFound": "Keine Geräte gefunden", + "waitingRoom.title": "Vorbereitung zum Beitreten", + "waitingRoom.user.input.title": "Geben Sie Ihren Namen ein", + "waitingRoom.user.input.label": "Name", + "waitingRoom.precallNetworkTest.title": "Vor-Anruf-Netzwerktest", + "waitingRoom.precallNetworkTest.subtitle": "Testen Sie Ihren Gerätezugriff, Netzwerkkonnektivität und Anrufqualität, bevor Sie beitreten", + "waitingRoom.precallNetworkTest.stopTest": "Test stoppen", + "waitingRoom.precallNetworkTest.stoppedTitle": "Test gestoppt", + "waitingRoom.precallNetworkTest.stoppedMessage": "Sie haben den Netzwerktest gestoppt. Sie können es later erneut versuchen, wenn Sie bereit sind.", + "waitingRoom.precallNetworkTest.retryTest": "Test erneut versuchen", + "waitingRoom.precallNetworkTest.audio": "Audio", + "waitingRoom.precallNetworkTest.video": "Video", + "waitingRoom.precallNetworkTest.qualityLabel": "Qualität:", + "waitingRoom.precallNetworkTest.error": "Test fehlgeschlagen", + "waitingRoom.precallNetworkTest.audioSupported": "Audio wird unterstützt", + "waitingRoom.precallNetworkTest.audioNotSupported": "Audio wird nicht unterstützt", + "waitingRoom.precallNetworkTest.videoSupported": "Video wird unterstützt", + "waitingRoom.precallNetworkTest.videoNotSupported": "Video wird nicht unterstützt", + "waitingRoom.user.input.error": "Name kann nicht leer sein oder Sonderzeichen enthalten.", + "zoom.reset": "Zoom zurücksetzen", + "zoom.start": "Zoom starten", + "zoom.out": "Zoom heransfahren", + "zoom.in": "Zoom hinausfahren", + "zoom.current": "Aktueller Zoom", + "errorPage.title": "Etwas ist schiefgelaufen", + "errorPage.description": "Die Anwendung konnte nicht gestartet werden. Bitte laden Sie die Seite neu oder wenden Sie sich an den Support, wenn das Problem weiterhin besteht.", + "notification.dismiss": "Benachrichtigung schließen" +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/locales/en.json b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/locales/en.json new file mode 100644 index 00000000..665ab36b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/locales/en.json @@ -0,0 +1,320 @@ +{ + "archiveList.archive.createdAt": "Created: {{createdAt}}", + "archiveList.archive.index": "Recording {{index}}", + "archiveList.download.tooltip": "Download recording {{id}}", + "archiveList.download": "Download", + "archiveList.empty": "The meeting hasn't been recorded", + "archiveList.error.text": "There was an error loading recordings for this meeting", + "archiveList.error.tooltip": "This recording failed or is expired", + "archiveList.label": "Download recordings", + "archiveList.loading": "We are processing your recording", + "archiveList.loading.subtitle": "Wait a few seconds to download your recording", + "advancedSettings.title": "Settings", + "advancedSettings.open": "Open settings", + "advancedSettings.close": "Close settings", + "advancedSettings.ariaLabel": "open settings", + "advancedSettings.tabs.general": "General", + "advancedSettings.tabs.video": "Video", + "advancedSettings.tabs.audio": "Audio", + "advancedSettings.tabs.statistics": "Statistics", + "advancedSettings.general.resetButton": "Reset default values", + "advancedSettings.general.resetDescription": "Restore all settings to their default values", + "advancedSettings.video.bitrate.label": "Bitrate", + "advancedSettings.video.bitrate.options.default": "Default", + "advancedSettings.video.bitrate.options.bw_saver": "Bandwidth saver", + "advancedSettings.video.bitrate.options.extra_bw_saver": "Extra bandwidth saver", + "advancedSettings.video.bitrate.options.custom": "Custom", + "advancedSettings.video.bitrate.description": "Vonage Video API lets you use bitrate presets or define a custom maximum video bitrate.", + "advancedSettings.video.customBitrate.label": "Custom bitrate", + "advancedSettings.video.customBitrate.description": "Set a maximum video bitrate between 5 kbps and 10 Mbps.", + "advancedSettings.video.customBitrate.minimum": "5 kbps", + "advancedSettings.video.customBitrate.maximum": "10 Mbps", + "advancedSettings.video.customBitrate.units.lower": "kbps", + "advancedSettings.video.customBitrate.units.higher": "Mbps", + "advancedSettings.video.codec.label": "Codec", + "advancedSettings.video.codec.options.automatic": "Automatic", + "advancedSettings.video.codec.options.manual": "Manual", + "advancedSettings.video.codec.description": "The SDK automatically selects the best codec based on network conditions and participant capabilities. Changes apply on the next call.", + "advancedSettings.video.codec.priority.label": "Codec priority", + "advancedSettings.video.codec.priority.description": "Drag and drop to choose the preferred codec order from first to last.", + "advancedSettings.video.codec.priority.options.vp9": "VP9", + "advancedSettings.video.codec.priority.options.vp8": "VP8", + "advancedSettings.video.codec.priority.options.h264": "H.264", + "advancedSettings.video.frameRate.label": "Frame rate", + "advancedSettings.video.frameRate.options.30": "30 FPS", + "advancedSettings.video.frameRate.options.15": "15 FPS", + "advancedSettings.video.frameRate.options.7": "7 FPS", + "advancedSettings.video.frameRate.options.1": "1 FPS", + "advancedSettings.video.resolution.label": "Resolution", + "advancedSettings.video.error.resolutionNotSupported": "The selected resolution is not supported by your device.", + "advancedSettings.video.error.frameRateNotSupported": "The selected frame rate is not supported by your device.", + "advancedSettings.video.error.bitrateNotSupported": "The selected bitrate could not be applied.", + "advancedSettings.audio.bitrate.label": "Audio bitrate", + "advancedSettings.audio.bitrate.description": "Automatically uses the SDK default, or choose custom to define the maximum audio encoding bitrate sent to the session.", + "advancedSettings.audio.bitrate.options.automatic": "Automatic", + "advancedSettings.audio.bitrate.options.custom": "Custom", + "advancedSettings.audio.bitrate.customLabel": "Custom audio bitrate", + "advancedSettings.audio.bitrate.minimum": "6 kbps", + "advancedSettings.audio.bitrate.maximum": "510 kbps", + "advancedSettings.audio.bitrate.currentValue": "{{value}} kbps", + "advancedSettings.audio.enableDtx.label": "Enable Opus DTX", + "advancedSettings.audio.enableDtx.description": "When enabled, Opus discontinuous transmission reduces audio bandwidth during silence.", + "advancedSettings.audio.publisherAudioFallback.label": "Publisher audio fallback", + "advancedSettings.audio.publisherAudioFallback.description": "When enabled, your video stops rendering on other devices during poor network conditions to preserve audio.", + "advancedSettings.audio.subscriberAudioFallback.label": "Subscriber audio fallback", + "advancedSettings.audio.subscriberAudioFallback.description": "When enabled, you receive audio-only from other participants during poor network conditions.", + "advancedSettings.audio.nextCallWarningWaitingRoom": "Changes will take effect when you join the call.", + "advancedSettings.audio.nextCallWarningMeetingRoom": "Changes will take effect on your next call or after refreshing.", + "advancedSettings.statistics.collection.enablePublisher.label": "Enable publisher bandwidth estimate", + "advancedSettings.statistics.collection.enablePublisher.description": "When enabled, shows the estimated available outbound bandwidth for the local publisher.", + "advancedSettings.statistics.groups.publisher": "Publisher", + "advancedSettings.statistics.groups.subscribers": "Subscribers", + "advancedSettings.statistics.empty": "No statistics available yet.", + "advancedSettings.statistics.sections.audio": "Audio", + "advancedSettings.statistics.sections.video": "Video", + "advancedSettings.statistics.metrics.resolution": "Resolution", + "advancedSettings.statistics.metrics.frameRate": "Frame rate", + "advancedSettings.statistics.metrics.decodedFrameRate": "Decoded frame rate", + "advancedSettings.statistics.metrics.bitrate": "Bitrate", + "advancedSettings.statistics.metrics.packetLoss": "Packet loss", + "advancedSettings.statistics.metrics.freezeCount": "Freeze count", + "advancedSettings.statistics.metrics.totalFreezesDuration": "Total freezes duration", + "advancedSettings.statistics.metrics.codec": "Codec", + "advancedSettings.statistics.metrics.videoLayer": "Layer {{index}} ({{codec}})", + "advancedSettings.statistics.metrics.packetsSent": "Packets sent", + "advancedSettings.statistics.metrics.packetsLostSent": "Packets lost (send)", + "advancedSettings.statistics.metrics.bytesSent": "Bytes sent", + "advancedSettings.statistics.metrics.packetsReceived": "Packets received", + "advancedSettings.statistics.metrics.packetsLostReceived": "Packets lost (receive)", + "advancedSettings.statistics.metrics.bytesReceived": "Bytes received", + "advancedSettings.statistics.metrics.estimatedBandwidth": "Estimated bandwidth", + "advancedSettings.statistics.metrics.remotePublisherEstimatedBandwidth": "Remote publisher estimated bandwidth", + "backgroundEffects.limit": "You have reached the maximum custom images limit", + "backgroundEffects.title": "Video effects", + "backgroundEffects.addBackground": "Add Background", + "backgroundEffects.video.disabled": "Your camera is turned off.", + "backgroundEffects.invalidFileType": "Only JPG, PNG, GIF, or BMP images are allowed.", + "backgroundEffects.fileTooLarge": "Image must be less than {{maxSize}}MB.", + "backgroundEffects.processingError": "Failed to process uploaded image.", + "backgroundEffects.storageError": "Failed to store image.", + "backgroundEffects.maxSize": "Max {{maxSize}}MB", + "backgroundEffects.removeBackground": "Remove background", + "backgroundEffects.slightBlur": "Slight background blur", + "backgroundEffects.strongBlur": "Strong background blur", + "backgroundEffects.yourBackground": "Your Background", + "backgroundEffects.deleteTooltipInUse": "You can't remove this background while it's in use", + "backgroundEffects.deleteTooltip": "Delete background", + "backgroundEffects.deleteAriaLabel": "Delete custom background", + "backgroundEffects.backgrounds.bookshelfRoom": "Bookshelf Room", + "backgroundEffects.backgrounds.busyRoom": "Busy Room", + "backgroundEffects.backgrounds.duneView": "Dune View", + "backgroundEffects.backgrounds.hogwarts": "Hogwarts", + "backgroundEffects.backgrounds.library": "Library", + "backgroundEffects.backgrounds.newYork": "New York", + "backgroundEffects.backgrounds.plane": "Plane", + "backgroundEffects.backgrounds.whiteRoom": "White Room", + "button.apply": "Apply", + "button.camera": "Camera", + "button.cancel": "Cancel", + "button.close": "Close", + "button.createRoom": "Create a new room", + "button.startNewRoom": "Start a new video meeting", + "button.joinExistingMeeting": "Join existing meeting", + "button.joinWaitingRoom": "Join waiting room", + "button.join": "Join meeting", + "button.mute": "Mute", + "button.send": "Send", + "button.speaker": "Speaker", + "captions.ariaLabel": "captions button", + "captions.disable": "Disable captions", + "captions.enable": "Enable captions", + "captions.errors": "Captions error: {{captionsErrorResponse}}", + "chat.ariaLabel": "toggle chat", + "chat.close": "Close chat", + "chat.copied": "Copied", + "chat.copy": "Copy to clipboard", + "chat.input.placeholder": "Send a message", + "chat.meetingUrl": "Meeting URL:", + "chat.open": "Open chat", + "chat.title": "Chat", + "common.or": "or", + "connectionAlert.quality.message": "Please check your connectivity. Your video may be disabled to improve the user experience", + "connectionAlert.quality.title": "Video quality problem", + "connectionAlert.reconnecting.message": "Please verify your network connection", + "connectionAlert.reconnecting.title": "Lost connection", + "deviceAccessAlert.askDeviceMessage": "To join the video room, your browser will request access to your camera and microphone.", + "deviceAccessAlert.deniedDeviceMessage": "It seems your browser is blocked from accessing your camera and/or microphone. Reset the permission state through your browser's UI.", + "deviceAccessAlert.imageAlt": "Access Dialog", + "devices.audio.ariaLabel": "audio devices dropdown", + "devices.audio.defaultLabel": "System Default", + "devices.audio.disable": "Disable microphone", + "devices.audio.disabled": "Microphone control is disabled in this application", + "devices.audio.enable": "Enable microphone or hold Space to temporarily unmute", + "devices.audio.microphone.ariaLabel": "toggle audio", + "devices.audio.microphone.full": "Microphone", + "devices.audio.microphone.short": "Mic", + "devices.audio.microphone.state.on": "Enable microphone", + "devices.audio.microphone.state.off": "Disable microphone", + "devices.audio.noiseSuppression": "Advanced Noise Suppression", + "devices.audio.speakers.full": "Speakers", + "devices.buttons.ariaLabel": "split button", + "devices.settings.ariaLabel": "device settings", + "devices.select.unknownDevice": "device", + "devices.select.errorContext": "Unable to select {{device}}. Please check your device permissions and try again.", + "devices.select.accessDenied": "Access to the {{device}} was denied. Please check your browser permissions.", + "devices.select.trackUnavailable": "The {{device}} is currently unavailable. Please check your device connection.", + "devices.video.ariaLabel": "video devices dropdown", + "devices.video.blur.ariaLabel": "Toggle background blur", + "devices.video.blur.label": "Blur your background", + "devices.video.camera.ariaLabel": "toggle video", + "devices.video.camera.switch": "Switch camera", + "devices.video.camera.state.on": "Enable camera", + "devices.video.camera.state.off": "Disable camera", + "devices.video.camera.full": "Camera", + "devices.video.camera.front": "front", + "devices.video.camera.rear": "rear", + "devices.video.camera.switchError": "Could not switch to the {{facingMode}} camera", + "devices.video.camera.accessError": "Could not use the {{facingMode}} camera. Check your camera permissions and try again.", + "devices.video.camera.noTrackError": "The {{facingMode}} camera did not start correctly. Try another camera.", + "devices.video.camera.noDeviceError": "No {{facingMode}} camera was found", + "devices.video.camera.noCurrentDeviceError": "No camera is currently selected. Please select a camera first.", + "devices.video.camera.selectedDevice": "Selected camera: {{deviceName}}", + "devices.video.disable": "Disable video", + "devices.video.disabled": "Camera control is disabled in this application", + "devices.video.enable": "Enable video", + "emoji.ariaLabel": "open sendable emoji menu", + "emoji.tooltip": "Express yourself", + "errors.unknown": "Unknown error occurred", + "feedbackForm.ariaLabel": "toggle report issue form", + "feedbackForm.close": "Close report issue form", + "feedbackForm.disclaiamer.label": "Please do not include any sensitive information.", + "feedbackForm.disclaiamer.screenshot": "A screenshot will help us better understand the issue. (optional)", + "feedbackForm.field.issue.label": "Describe your issue", + "feedbackForm.field.issue.type": "Description", + "feedbackForm.field.name.label": "Tell us your name", + "feedbackForm.field.name.type": "Your name", + "feedbackForm.field.title.label": "When you noticed this issue, what were you trying to do?", + "feedbackForm.field.title.type": "Title", + "feedbackForm.helperText.error": "{{field}} is required and must be less than {{limit}} characters", + "feedbackForm.open": "Open report issue form", + "feedbackForm.submitted.content": "We greatly appreciate your input, as it helps us improve the app and address any issues.", + "feedbackForm.submitted.error": "Something went wrong. Please try again.", + "feedbackForm.submitted.thanks": "Thank you for your feedback!", + "feedbackForm.submitted.track": "Track your progress here.", + "feedbackForm.title": "Report Issue", + "filePicker.addScreenshot": "Add screenshot", + "filePicker.attachedScreenshot": "Attached screenshot", + "filePicker.capture": "Capture screenshot", + "filePicker.delete": "Delete screenshot", + "filePicker.sizeLimit": "The maximum upload size is 20MB. Please upload another file.", + "footer.github.title": "Vonage Video Reference Application", + "imageStorage.imagesExceedSize": "Images are too large to store (~4MB max).", + "imageStorage.storageFailure": "Failed to store images in localStorage.", + "imageStorage.duplicateImage": "This image is already added.", + "imageStorage.fileReadError": "Failed to read image file.", + "imageStorage.invalidExtension": "Invalid image extension.", + "imageStorage.invalidUrl": "Invalid image URL.", + "imageStorage.convertError": "Could not convert image.", + "imageStorage.loadError": "Could not load image.", + "githubTooltip": "Visit our GitHub Repo", + "goodBye.title": "Rejoining the room", + "goodBye.back": "View Landing Page", + "goodBye.reEnter": "Go back to meeting", + "goodbye.default.header": "You have left the meeting", + "goodbye.default.message": "Thank you for joining!", + "landing.welcome.subtitle": "Power your business with video that transforms customer satisfaction.", + "landing.welcome.title.1": "Upgrade", + "landing.welcome.title.2": "video", + "landing.welcome.title.3": "communication", + "landing.primary.word": "video", + "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", + "layout.tooltip.switchToGrid": "Switch to Grid layout", + "mutedAlert.message.forceMuted": "You have been muted by another participant. Click on the mic to unmute yourself.", + "mutedAlert.message.muted": "Are you talking? Your mic is off. Click on the mic to turn it on.", + "participants.list.ariaLabel": "toggle participant list", + "participants.list.close": "Close participant list", + "participants.list.open": "Open participant list", + "participants.maxPin": "You can't pin any more tiles", + "participants.mute.dialog.content": "Mute {{participantName}} for everyone in the call? Only {{participantName}} can unmute themselves.", + "participants.mute.tooltip": "Mute {{participantName}}'s microphone", + "participants.pin": "Pin {{participantName}}", + "participants.pin.video": "Pin {{participantName}}'s video", + "participants.screen": "{{participantName}}'s screen", + "participants.search": "Search participants", + "participants.title": "Participants", + "participants.unpin": "Unpin {{participantName}}", + "participants.unpin.video": "Unpin {{participantName}}'s video", + "publishingErrors.accessDenied.message": "It seems your browser is blocked from accessing your {{device}}. Reset the permission state through your browser's UI.", + "publishingErrors.accessDenied.title": "{{device}} access is denied", + "publishingErrors.blocked.message": "We're having trouble connecting you with others in the meeting room. Please check your network and try again.", + "publishingErrors.blocked.title": "Difficulties joining room", + "subscribingErrors.blocked.message": "We're having trouble connecting you with others in the meeting room. Please check your network and try again.", + "subscribingErrors.blocked.title": "Difficulties joining room", + "recording.start.dialog.content": "Make sure everyone is ready! You can download the recording from the \"Goodbye\" page after you leave the room.", + "recording.start.dialog.title": "Start Recording?", + "recording.start.title": "Start recording", + "recording.stop.dialog.content": "You can download the recording from the \"Goodbye\" page after you leave the room.", + "recording.stop.dialog.title": "Stop Recording?", + "recording.stop.title": "Stop recording", + "recording.consent.dialog.title": "This meeting is being recorded", + "recording.consent.dialog.content": "The host has started recording this meeting. Do you consent to being recorded?", + "recording.consent.dialog.accept": "I consent", + "recording.consent.dialog.decline": "I do not consent", + "recording.consent.goodbye.header": "Recording declined", + "recording.consent.goodbye.message": "You chose not to consent to recording. Please rejoin when recording is stopped or ask the host to disable recording.", + "recording.popup.title": "Recording", + "recording.popup.subtitle": "This meeting is being recorded", + "recording.tooltip.ariaLabel": "video layout", + "room.exit.ariaLabel": "exit", + "room.exit.tooltip": "Exit meeting", + "room.input.helper": "Cannot be empty, contain spaces or special characters", + "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?", + "screenSharing.dialog.hiddenMessage": "You are sharing your screen.", + "screenSharing.title.start": "Start screen share", + "screenSharing.title.stop": "Stop screen share", + "screenSharing.tooltip.ariaLabel": "Start or stop screen share", + "soundTest.start": "Test speakers", + "soundTest.stop": "Stop testing", + "toolbar.tooltip.ariaLabel": "open additional toolbar items menu", + "toolbar.tooltip.title": "Access additional toolbar items", + "unsupportedBrowser.header": "Your browser is not compatible.", + "unsupportedBrowser.message": "Check the list and choose a supported browser.", + "unsupportedBrowser.supported.visitPage": "Visit page", + "unsupportedBrowser.supported.title": "Supported browsers:", + "unknown.device": "Unknown Device", + "user.unknown": "unknown user", + "user.you": "You", + "waitingRoom.unsupportedFeature.tooltip": "Your browser does not support this feature", + "waitingRoom.devices.noDevicesFound": "No devices found", + "waitingRoom.title": "Prepare to join", + "waitingRoom.user.input.title": "Enter your name", + "waitingRoom.user.input.label": "Name", + "waitingRoom.precallNetworkTest.title": "Pre-call network test", + "waitingRoom.precallNetworkTest.subtitle": "Test your device access, network connectivity and call quality before joining", + "waitingRoom.precallNetworkTest.stopTest": "Stop test", + "waitingRoom.precallNetworkTest.stoppedTitle": "Test stopped", + "waitingRoom.precallNetworkTest.stoppedMessage": "You stopped the network test. You can retry when you're ready.", + "waitingRoom.precallNetworkTest.retryTest": "Retry test", + "waitingRoom.precallNetworkTest.audio": "Audio", + "waitingRoom.precallNetworkTest.video": "Video", + "waitingRoom.precallNetworkTest.qualityLabel": "Quality:", + "waitingRoom.precallNetworkTest.error": "Test failed", + "waitingRoom.precallNetworkTest.audioSupported": "Audio is supported", + "waitingRoom.precallNetworkTest.audioNotSupported": "Audio is not supported", + "waitingRoom.precallNetworkTest.videoSupported": "Video is supported", + "waitingRoom.precallNetworkTest.videoNotSupported": "Video is not supported", + "waitingRoom.user.input.error": "Name cannot be empty or contain special characters.", + "zoom.reset": "Reset Zoom", + "zoom.start": "Start Zooming", + "zoom.out": "Zoom out", + "zoom.in": "Zoom in", + "zoom.current": "Current zoom", + "errorPage.title": "Something went wrong", + "errorPage.description": "The application could not start. Please reload the page or contact support if the problem persists.", + "notification.dismiss": "Dismiss notification" +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/locales/es-MX.json b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/locales/es-MX.json new file mode 100644 index 00000000..a3451e9b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/locales/es-MX.json @@ -0,0 +1,318 @@ +{ + "archiveList.archive.createdAt": "Creada: {{createdAt}}", + "archiveList.archive.index": "Grabación {{index}}", + "archiveList.download.tooltip": "Descargar grabación {{id}}", + "archiveList.download": "Descargar", + "archiveList.empty": "La reunión no ha sido grabada", + "archiveList.error.text": "Ocurrió un error al cargar las grabaciones de esta reunión", + "archiveList.error.tooltip": "Esta grabación falló o ya expiró", + "archiveList.label": "Descargar grabaciones", + "archiveList.loading": "Estamos procesando tu grabación", + "archiveList.loading.subtitle": "Espera unos segundos para descargar tu grabación", + "advancedSettings.title": "Ajustes", + "advancedSettings.open": "Abrir ajustes", + "advancedSettings.close": "Cerrar ajustes", + "advancedSettings.ariaLabel": "abrir ajustes", + "advancedSettings.tabs.general": "General", + "advancedSettings.tabs.video": "Video", + "advancedSettings.tabs.audio": "Audio", + "advancedSettings.tabs.statistics": "Estadísticas", + "advancedSettings.general.resetButton": "Restablecer valores predeterminados", + "advancedSettings.general.resetDescription": "Restaura todos los ajustes a sus valores predeterminados", + "advancedSettings.video.bitrate.label": "Tasa de bits", + "advancedSettings.video.bitrate.options.default": "Predeterminada", + "advancedSettings.video.bitrate.options.bw_saver": "Ahorro de ancho de banda", + "advancedSettings.video.bitrate.options.extra_bw_saver": "Ahorro extra de ancho de banda", + "advancedSettings.video.bitrate.options.custom": "Personalizada", + "advancedSettings.video.bitrate.description": "Vonage Video API permite usar perfiles de tasa de bits o definir una tasa de bits máxima de video personalizada.", + "advancedSettings.video.customBitrate.label": "Tasa de bits personalizada", + "advancedSettings.video.customBitrate.description": "Define una tasa de bits máxima de video entre 5 kbps y 10 Mbps.", + "advancedSettings.video.customBitrate.minimum": "5 kbps", + "advancedSettings.video.customBitrate.maximum": "10 Mbps", + "advancedSettings.video.customBitrate.units.lower": "kbps", + "advancedSettings.video.customBitrate.units.higher": "Mbps", + "advancedSettings.video.codec.label": "Codec", + "advancedSettings.video.codec.options.automatic": "Automático", + "advancedSettings.video.codec.options.manual": "Manual", + "advancedSettings.video.codec.description": "El SDK selecciona automáticamente el mejor codec según las condiciones de red y las capacidades de los participantes. Los cambios se aplican en la próxima llamada.", + "advancedSettings.video.codec.priority.label": "Prioridad de codec", + "advancedSettings.video.codec.priority.description": "Arrastra y suelta para elegir el orden de preferencia de los codecs, de primero a último.", + "advancedSettings.video.codec.priority.options.vp9": "VP9", + "advancedSettings.video.codec.priority.options.vp8": "VP8", + "advancedSettings.video.codec.priority.options.h264": "H.264", + "advancedSettings.video.frameRate.label": "Fotogramas por segundo", + "advancedSettings.video.frameRate.options.30": "30 FPS", + "advancedSettings.video.frameRate.options.15": "15 FPS", + "advancedSettings.video.frameRate.options.7": "7 FPS", + "advancedSettings.video.frameRate.options.1": "1 FPS", + "advancedSettings.video.resolution.label": "Resolución", + "advancedSettings.video.error.resolutionNotSupported": "La resolución seleccionada no es compatible con tu dispositivo.", + "advancedSettings.video.error.frameRateNotSupported": "La tasa de fotogramas seleccionada no es compatible con tu dispositivo.", + "advancedSettings.video.error.bitrateNotSupported": "No se pudo aplicar la tasa de bits seleccionada.", + "advancedSettings.audio.bitrate.label": "Tasa de bits de audio", + "advancedSettings.audio.bitrate.description": "Elige automáticamente el valor predeterminado del SDK, o personalizada para definir la tasa de bits máxima de codificación de audio enviada a la sesión.", + "advancedSettings.audio.bitrate.options.automatic": "Automática", + "advancedSettings.audio.bitrate.options.custom": "Personalizada", + "advancedSettings.audio.bitrate.customLabel": "Tasa de bits de audio personalizada", + "advancedSettings.audio.bitrate.minimum": "6 kbps", + "advancedSettings.audio.bitrate.maximum": "510 kbps", + "advancedSettings.audio.bitrate.currentValue": "{{value}} kbps", + "advancedSettings.audio.enableDtx.label": "Activar Opus DTX", + "advancedSettings.audio.enableDtx.description": "Cuando está activado, la transmisión discontinua de Opus reduce el ancho de banda de audio durante los silencios.", + "advancedSettings.audio.publisherAudioFallback.label": "Audio de respaldo del publicador", + "advancedSettings.audio.publisherAudioFallback.description": "Cuando está habilitado, tu video deja de renderizarse en otros dispositivos durante condiciones de red deficientes para preservar el audio.", + "advancedSettings.audio.subscriberAudioFallback.label": "Audio de respaldo del suscriptor", + "advancedSettings.audio.subscriberAudioFallback.description": "Cuando está habilitado, recibes solo audio de otros participantes durante condiciones de red deficientes.", + "advancedSettings.audio.nextCallWarningWaitingRoom": "Los cambios se aplicarán al unirte a la llamada.", + "advancedSettings.audio.nextCallWarningMeetingRoom": "Los cambios se aplicarán en tu próxima llamada o al refrescar.", + "advancedSettings.statistics.collection.enablePublisher.label": "Habilitar estimación de ancho de banda del emisor", + "advancedSettings.statistics.collection.enablePublisher.description": "Cuando está habilitado, muestra el ancho de banda de salida estimado para el publicador local.", + "advancedSettings.statistics.groups.publisher": "Publicador", + "advancedSettings.statistics.groups.subscribers": "Suscriptores", + "advancedSettings.statistics.empty": "Todavía no hay estadísticas disponibles.", + "advancedSettings.statistics.sections.audio": "Audio", + "advancedSettings.statistics.sections.video": "Video", + "advancedSettings.statistics.metrics.resolution": "Resolución", + "advancedSettings.statistics.metrics.frameRate": "Frecuencia de cuadros", + "advancedSettings.statistics.metrics.decodedFrameRate": "Frecuencia de cuadros decodificada", + "advancedSettings.statistics.metrics.bitrate": "Tasa de bits", + "advancedSettings.statistics.metrics.packetLoss": "Pérdida de paquetes", + "advancedSettings.statistics.metrics.freezeCount": "Número de congelaciones", + "advancedSettings.statistics.metrics.totalFreezesDuration": "Duración total de congelaciones", + "advancedSettings.statistics.metrics.codec": "Codec", + "advancedSettings.statistics.metrics.videoLayer": "Capa {{index}} ({{codec}})", + "advancedSettings.statistics.metrics.packetsSent": "Paquetes enviados", + "advancedSettings.statistics.metrics.packetsLostSent": "Paquetes perdidos (envío)", + "advancedSettings.statistics.metrics.bytesSent": "Bytes enviados", + "advancedSettings.statistics.metrics.packetsReceived": "Paquetes recibidos", + "advancedSettings.statistics.metrics.packetsLostReceived": "Paquetes perdidos (recepción)", + "advancedSettings.statistics.metrics.bytesReceived": "Bytes recibidos", + "advancedSettings.statistics.metrics.estimatedBandwidth": "Ancho de banda estimado", + "advancedSettings.statistics.metrics.remotePublisherEstimatedBandwidth": "Ancho de banda estimado del publicador remoto", + "backgroundEffects.limit": "Llegaste al límite máximo de imágenes personalizadas", + "backgroundEffects.title": "Efectos de vídeo", + "backgroundEffects.addBackground": "Agregar fondo", + "backgroundEffects.video.disabled": "Tu cámara está apagada.", + "backgroundEffects.invalidFileType": "Solo se permiten imágenes JPG, PNG, GIF o BMP.", + "backgroundEffects.fileTooLarge": "La imagen debe pesar menos de {{maxSize}}MB.", + "backgroundEffects.processingError": "No se pudo procesar la imagen subida.", + "backgroundEffects.storageError": "No se pudo guardar la imagen.", + "backgroundEffects.maxSize": "Máx {{maxSize}}MB", + "backgroundEffects.removeBackground": "Quitar fondo", + "backgroundEffects.slightBlur": "Desenfoque ligero del fondo", + "backgroundEffects.strongBlur": "Desenfoque fuerte del fondo", + "backgroundEffects.yourBackground": "Tu fondo", + "backgroundEffects.deleteTooltipInUse": "No puedes eliminar este fondo mientras esté en uso", + "backgroundEffects.deleteTooltip": "Eliminar fondo", + "backgroundEffects.deleteAriaLabel": "Eliminar fondo personalizado", + "backgroundEffects.backgrounds.bookshelfRoom": "Cuarto con librero", + "backgroundEffects.backgrounds.busyRoom": "Sala ocupada", + "backgroundEffects.backgrounds.duneView": "Vista de dunas", + "backgroundEffects.backgrounds.hogwarts": "Hogwarts", + "backgroundEffects.backgrounds.library": "Biblioteca", + "backgroundEffects.backgrounds.newYork": "Nueva York", + "backgroundEffects.backgrounds.plane": "Avión", + "backgroundEffects.backgrounds.whiteRoom": "Cuarto blanco", + "button.apply": "Aplicar", + "button.camera": "Cámara", + "button.cancel": "Cancelar", + "button.close": "Cerrar", + "button.createRoom": "Crear una nueva sala", + "button.startNewRoom": "Iniciar una nueva videoconferencia", + "button.joinExistingMeeting": "Unirse a una reunión existente", + "button.joinWaitingRoom": "Unirse a la sala de espera", + "button.join": "Unirse a la reunión", + "button.mute": "Silenciar", + "button.send": "Enviar", + "button.speaker": "Altavoz", + "captions.ariaLabel": "botón de subtítulos", + "captions.disable": "Desactivar subtítulos", + "captions.enable": "Activar subtítulos", + "captions.errors": "Error en subtítulos: {{captionsErrorResponse}}", + "chat.ariaLabel": "abrir/cerrar chat", + "chat.close": "Cerrar chat", + "chat.copied": "Copiado", + "chat.copy": "Copiar al portapapeles", + "chat.input.placeholder": "Escribe un mensaje", + "chat.meetingUrl": "URL de la reunión:", + "chat.open": "Abrir chat", + "chat.title": "Chat", + "common.or": "o", + "connectionAlert.quality.message": "Revisa tu conexión. Tu video puede desactivarse para mejorar la experiencia.", + "connectionAlert.quality.title": "Problema de calidad de video", + "connectionAlert.reconnecting.message": "Revisa tu conexión de internet", + "connectionAlert.reconnecting.title": "Conexión perdida", + "deviceAccessAlert.askDeviceMessage": "Para entrar a la sala de video, tu navegador pedirá acceso a la cámara y el micrófono.", + "deviceAccessAlert.deniedDeviceMessage": "Parece que tu navegador tiene bloqueado el acceso a tu cámara o micrófono. Restablece los permisos desde la configuración del navegador.", + "deviceAccessAlert.imageAlt": "Diálogo de acceso", + "devices.audio.ariaLabel": "menú de dispositivos de audio", + "devices.audio.defaultLabel": "Predeterminado del sistema", + "devices.audio.disable": "Apagar micrófono", + "devices.audio.enable": "Encender micrófono o mantén presionada la barra espaciadora para activar temporalmente el micrófono", + "devices.audio.microphone.ariaLabel": "activar/desactivar audio", + "devices.audio.microphone.full": "Micrófono", + "devices.audio.microphone.short": "Mic", + "devices.audio.microphone.state.on": "Encender micrófono", + "devices.audio.microphone.state.off": "Apagar micrófono", + "devices.audio.noiseSuppression": "Supresión avanzada de ruido", + "devices.audio.speakers.full": "Bocinas", + "devices.buttons.ariaLabel": "botón dividido", + "devices.settings.ariaLabel": "configuración de dispositivos", + "devices.select.unknownDevice": "dispositivo", + "devices.select.errorContext": "No se puede seleccionar {{device}}. Verifica los permisos del dispositivo e inténtalo de nuevo.", + "devices.select.accessDenied": "Se negó el acceso al {{device}}. Verifica los permisos de tu navegador.", + "devices.select.trackUnavailable": "El {{device}} no está disponible en este momento. Verifica la conexión de tu dispositivo.", + "devices.video.ariaLabel": "menú de dispositivos de video", + "devices.video.blur.ariaLabel": "Activar/desactivar desenfoque de fondo", + "devices.video.blur.label": "Desenfocar fondo", + "devices.video.camera.ariaLabel": "activar/desactivar video", + "devices.video.camera.switch": "Cambiar cámara", + "devices.video.camera.state.on": "Encender cámara", + "devices.video.camera.state.off": "Apagar cámara", + "devices.video.camera.full": "Cámara", + "devices.video.camera.front": "frontal", + "devices.video.camera.rear": "trasera", + "devices.video.camera.switchError": "No se pudo cambiar a la cámara {{facingMode}}", + "devices.video.camera.accessError": "No se puede usar la cámara {{facingMode}}. Verifica tus permisos de cámara e intenta de nuevo.", + "devices.video.camera.noTrackError": "La cámara {{facingMode}} no se inició correctamente. Intenta con otra cámara.", + "devices.video.camera.noDeviceError": "No se encontró ninguna cámara {{facingMode}}", + "devices.video.camera.noCurrentDeviceError": "Ninguna cámara actualmente seleccionada. Selecciona una cámara primero.", + "devices.video.camera.selectedDevice": "Cámara seleccionada: {{deviceName}}", + "devices.video.disable": "Apagar video", + "devices.video.enable": "Encender video", + "emoji.ariaLabel": "abrir menú de emojis", + "emoji.tooltip": "Exprésate", + "errors.unknown": "Ocurrió un error desconocido", + "feedbackForm.ariaLabel": "abrir/cerrar formulario de reporte", + "feedbackForm.close": "Cerrar formulario", + "feedbackForm.disclaiamer.label": "Por favor no incluyas datos sensibles.", + "feedbackForm.disclaiamer.screenshot": "Una captura de pantalla nos ayuda a entender mejor el problema (opcional).", + "feedbackForm.field.issue.label": "Describe el problema", + "feedbackForm.field.issue.type": "Descripción", + "feedbackForm.field.name.label": "Tu nombre", + "feedbackForm.field.name.type": "Nombre", + "feedbackForm.field.title.label": "Cuando pasó el problema, ¿qué estabas haciendo?", + "feedbackForm.field.title.type": "Título", + "feedbackForm.helperText.error": "{{field}} es obligatorio y debe tener menos de {{limit}} caracteres", + "feedbackForm.open": "Abrir formulario de reporte", + "feedbackForm.submitted.content": "¡Gracias! Tu aporte nos ayuda a mejorar la aplicación y resolver problemas.", + "feedbackForm.submitted.error": "Algo salió mal. Intenta de nuevo.", + "feedbackForm.submitted.thanks": "¡Gracias por tus comentarios!", + "feedbackForm.submitted.track": "Puedes dar seguimiento aquí.", + "feedbackForm.title": "Reportar problema", + "filePicker.addScreenshot": "Agregar captura", + "filePicker.attachedScreenshot": "Captura adjunta", + "filePicker.capture": "Tomar captura de pantalla", + "filePicker.delete": "Eliminar captura", + "filePicker.sizeLimit": "El tamaño máximo es 20MB. Sube otro archivo.", + "footer.github.title": "Aplicación de referencia de video de Vonage", + "imageStorage.imagesExceedSize": "Las imágenes son muy grandes para guardar (~4MB máx).", + "imageStorage.storageFailure": "No se pudieron guardar las imágenes en el almacenamiento local.", + "imageStorage.duplicateImage": "Esta imagen ya fue agregada.", + "imageStorage.fileReadError": "No se pudo leer el archivo de imagen.", + "imageStorage.invalidExtension": "Extensión de imagen no válida.", + "imageStorage.invalidUrl": "URL de imagen no válida.", + "imageStorage.convertError": "No se pudo convertir la imagen.", + "imageStorage.loadError": "No se pudo cargar la imagen.", + "githubTooltip": "Visita nuestro repositorio en GitHub", + "goodBye.title": "Regresando a la sala", + "goodBye.back": "Ver página de inicio", + "goodBye.reEnter": "Volver a la reunión", + "goodbye.default.header": "Has salido de la reunión", + "goodbye.default.message": "¡Gracias por unirte!", + "landing.welcome.subtitle": "Impulsa tu negocio con videos que transforman la satisfacción del cliente.", + "landing.welcome.title.1": "Mejora", + "landing.welcome.title.2": "la comunicación", + "landing.welcome.title.3": "por video", + "landing.primary.word": "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", + "layout.tooltip.switchToGrid": "Cambiar a vista de cuadrícula", + "mutedAlert.message.forceMuted": "Otro participante te silenció. Haz clic en el micrófono para activarlo.", + "mutedAlert.message.muted": "¿Estás hablando? Tu micrófono está apagado. Haz clic en el micrófono para encenderlo.", + "participants.list.ariaLabel": "abrir/cerrar lista de participantes", + "participants.list.close": "Cerrar lista de participantes", + "participants.list.open": "Abrir lista de participantes", + "participants.maxPin": "No puedes fijar más mosaicos", + "participants.mute.dialog.content": "¿Silenciar a {{participantName}} para todos en la llamada? Solo {{participantName}} puede encenderse de nuevo.", + "participants.mute.tooltip": "Silenciar micrófono de {{participantName}}", + "participants.pin": "Fijar a {{participantName}}", + "participants.pin.video": "Fijar video de {{participantName}}", + "participants.screen": "Pantalla de {{participantName}}", + "participants.search": "Buscar participantes", + "participants.title": "Participantes", + "participants.unpin": "Quitar fijación de {{participantName}}", + "participants.unpin.video": "Quitar fijación de video de {{participantName}}", + "publishingErrors.accessDenied.message": "Parece que tu navegador bloqueó el acceso a tu {{device}}. Restablece los permisos desde la configuración.", + "publishingErrors.accessDenied.title": "Acceso a {{device}} denegado", + "publishingErrors.blocked.message": "No pudimos conectarte con la sala. Revisa tu conexión e inténtalo de nuevo.", + "publishingErrors.blocked.title": "Problemas para entrar a la sala", + "subscribingErrors.blocked.message": "No pudimos conectarte con la sala. Revisa tu conexión e inténtalo de nuevo.", + "subscribingErrors.blocked.title": "Problemas para entrar a la sala", + "recording.start.dialog.content": "¡Asegúrate que todos estén listos! Podrás descargar la grabación en la página de \"Despedida\" al salir.", + "recording.start.dialog.title": "¿Iniciar grabación?", + "recording.start.title": "Iniciar grabación", + "recording.stop.dialog.content": "Podrás descargar la grabación en la página de \"Despedida\" al salir.", + "recording.stop.dialog.title": "¿Detener grabación?", + "recording.stop.title": "Detener grabación", + "recording.consent.dialog.title": "Esta reunión se está grabando", + "recording.consent.dialog.content": "El anfitrión inició la grabación de esta reunión. ¿Das tu consentimiento para ser grabado?", + "recording.consent.dialog.accept": "Sí, doy mi consentimiento", + "recording.consent.dialog.decline": "No doy mi consentimiento", + "recording.consent.goodbye.header": "Grabación rechazada", + "recording.consent.goodbye.message": "Decidiste no dar tu consentimiento para la grabación. Vuelve a unirte cuando la grabación se detenga o pide al anfitrión que la desactive.", + "recording.popup.title": "Grabación", + "recording.popup.subtitle": "Esta reunión se está grabando", + "recording.tooltip.ariaLabel": "diseño de video", + "room.exit.ariaLabel": "salir", + "room.exit.tooltip": "Salir de la reunión", + "room.input.helper": "No se permite dejar el campo vacío, espacios ni caracteres especiales", + "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?", + "screenSharing.dialog.hiddenMessage": "Estás compartiendo tu pantalla.", + "screenSharing.title.start": "Iniciar compartir pantalla", + "screenSharing.title.stop": "Dejar de compartir pantalla", + "screenSharing.tooltip.ariaLabel": "Iniciar o detener compartir pantalla", + "soundTest.start": "Probar bocinas", + "soundTest.stop": "Detener prueba", + "toolbar.tooltip.ariaLabel": "abrir menú extra de la barra", + "toolbar.tooltip.title": "Acceder a opciones adicionales", + "unsupportedBrowser.header": "Tu navegador no es compatible", + "unsupportedBrowser.message": "Revisa la lista y elige un navegador compatible.", + "unsupportedBrowser.supported.visitPage": "Visitar la página", + "unsupportedBrowser.supported.title": "Navegadores compatibles:", + "unknown.device": "Dispositivo desconocido", + "user.unknown": "usuario desconocido", + "user.you": "Tú", + "waitingRoom.unsupportedFeature.tooltip": "Tu navegador no soporta esta funcionalidad", + "waitingRoom.devices.noDevicesFound": "No se han encontrado dispositivos", + "waitingRoom.title": "Prepárate para unirte", + "waitingRoom.user.input.title": "Escribe tu nombre", + "waitingRoom.user.input.label": "Nombre", + "waitingRoom.precallNetworkTest.title": "Prueba de red antes de la llamada", + "waitingRoom.precallNetworkTest.subtitle": "Prueba el acceso a tus dispositivos, la conectividad de red y la calidad de la llamada antes de unirte", + "waitingRoom.precallNetworkTest.stopTest": "Detener prueba", + "waitingRoom.precallNetworkTest.stoppedTitle": "Prueba detenida", + "waitingRoom.precallNetworkTest.stoppedMessage": "Has detenido la prueba de red. Puedes volver a intentarlo cuando estés listo.", + "waitingRoom.precallNetworkTest.retryTest": "Reintentar prueba", + "waitingRoom.precallNetworkTest.audio": "Audio", + "waitingRoom.precallNetworkTest.video": "Video", + "waitingRoom.precallNetworkTest.qualityLabel": "Calidad:", + "waitingRoom.precallNetworkTest.error": "La prueba falló", + "waitingRoom.precallNetworkTest.audioSupported": "El audio es compatible", + "waitingRoom.precallNetworkTest.audioNotSupported": "El audio no es compatible", + "waitingRoom.precallNetworkTest.videoSupported": "El video es compatible", + "waitingRoom.precallNetworkTest.videoNotSupported": "El video no es compatible", + "waitingRoom.user.input.error": "El nombre no puede estar vacío ni contener caracteres especiales.", + "zoom.reset": "Restablecer zoom", + "zoom.start": "Iniciar zoom", + "zoom.out": "Alejar zoom", + "zoom.in": "Acercar zoom", + "zoom.current": "Zoom actual", + "errorPage.title": "Algo salió mal", + "errorPage.description": "La aplicación no pudo iniciarse. Recarga la página o contacta con soporte si el problema persiste.", + "notification.dismiss": "Descartar notificación" +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/locales/es.json b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/locales/es.json new file mode 100644 index 00000000..272c3949 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/locales/es.json @@ -0,0 +1,318 @@ +{ + "archiveList.archive.createdAt": "Creada: {{createdAt}}", + "archiveList.archive.index": "Grabación {{index}}", + "archiveList.download.tooltip": "Descargar grabación {{id}}", + "archiveList.download": "Descargar", + "archiveList.empty": "La reunión no ha sido grabada", + "archiveList.error.text": "Hubo un error al cargar las grabaciones de esta reunión", + "archiveList.error.tooltip": "Esta grabación falló o ha caducado", + "archiveList.label": "Descargar grabaciones", + "archiveList.loading": "Estamos procesando tu grabación", + "archiveList.loading.subtitle": "Espera unos segundos para descargar tu grabación", + "advancedSettings.title": "Ajustes", + "advancedSettings.open": "Abrir ajustes", + "advancedSettings.close": "Cerrar ajustes", + "advancedSettings.ariaLabel": "abrir ajustes", + "advancedSettings.tabs.general": "General", + "advancedSettings.tabs.video": "Vídeo", + "advancedSettings.tabs.audio": "Audio", + "advancedSettings.tabs.statistics": "Estadísticas", + "advancedSettings.general.resetButton": "Restablecer valores predeterminados", + "advancedSettings.general.resetDescription": "Restaura todos los ajustes a sus valores predeterminados", + "advancedSettings.video.bitrate.label": "Tasa de bits", + "advancedSettings.video.bitrate.options.default": "Predeterminada", + "advancedSettings.video.bitrate.options.bw_saver": "Ahorro de ancho de banda", + "advancedSettings.video.bitrate.options.extra_bw_saver": "Ahorro extra de ancho de banda", + "advancedSettings.video.bitrate.options.custom": "Personalizada", + "advancedSettings.video.bitrate.description": "Vonage Video API permite usar perfiles de tasa de bits o definir una tasa de bits máxima de video personalizada.", + "advancedSettings.video.customBitrate.label": "Tasa de bits personalizada", + "advancedSettings.video.customBitrate.description": "Define una tasa de bits máxima de video entre 5 kbps y 10 Mbps.", + "advancedSettings.video.customBitrate.minimum": "5 kbps", + "advancedSettings.video.customBitrate.maximum": "10 Mbps", + "advancedSettings.video.customBitrate.units.lower": "kbps", + "advancedSettings.video.customBitrate.units.higher": "Mbps", + "advancedSettings.video.codec.label": "Codec", + "advancedSettings.video.codec.options.automatic": "Automático", + "advancedSettings.video.codec.options.manual": "Manual", + "advancedSettings.video.codec.description": "El SDK selecciona automáticamente el mejor codec según las condiciones de red y las capacidades de los participantes. Los cambios se aplican en la próxima llamada.", + "advancedSettings.video.codec.priority.label": "Prioridad de codec", + "advancedSettings.video.codec.priority.description": "Arrastra y suelta para elegir el orden de preferencia de los codecs, de primero a último.", + "advancedSettings.video.codec.priority.options.vp9": "VP9", + "advancedSettings.video.codec.priority.options.vp8": "VP8", + "advancedSettings.video.codec.priority.options.h264": "H.264", + "advancedSettings.video.frameRate.label": "Fotogramas por segundo", + "advancedSettings.video.frameRate.options.30": "30 FPS", + "advancedSettings.video.frameRate.options.15": "15 FPS", + "advancedSettings.video.frameRate.options.7": "7 FPS", + "advancedSettings.video.frameRate.options.1": "1 FPS", + "advancedSettings.video.resolution.label": "Resolución", + "advancedSettings.video.error.resolutionNotSupported": "La resolución seleccionada no es compatible con tu dispositivo.", + "advancedSettings.video.error.frameRateNotSupported": "La tasa de fotogramas seleccionada no es compatible con tu dispositivo.", + "advancedSettings.video.error.bitrateNotSupported": "No se pudo aplicar la tasa de bits seleccionada.", + "advancedSettings.audio.bitrate.label": "Tasa de bits de audio", + "advancedSettings.audio.bitrate.description": "Elige automáticamente el valor predeterminado del SDK, o personalizada para definir la tasa de bits máxima de codificación de audio enviada a la sesión.", + "advancedSettings.audio.bitrate.options.automatic": "Automática", + "advancedSettings.audio.bitrate.options.custom": "Personalizada", + "advancedSettings.audio.bitrate.customLabel": "Tasa de bits de audio personalizada", + "advancedSettings.audio.bitrate.minimum": "6 kbps", + "advancedSettings.audio.bitrate.maximum": "510 kbps", + "advancedSettings.audio.bitrate.currentValue": "{{value}} kbps", + "advancedSettings.audio.enableDtx.label": "Activar Opus DTX", + "advancedSettings.audio.enableDtx.description": "Cuando está activado, la transmisión discontinua de Opus reduce el ancho de banda de audio durante los silencios.", + "advancedSettings.audio.publisherAudioFallback.label": "Audio de respaldo del publicador", + "advancedSettings.audio.publisherAudioFallback.description": "Cuando está habilitado, tu video deja de renderizarse en otros dispositivos durante condiciones de red deficientes para preservar el audio.", + "advancedSettings.audio.subscriberAudioFallback.label": "Audio de respaldo del suscriptor", + "advancedSettings.audio.subscriberAudioFallback.description": "Cuando está habilitado, recibes solo audio de otros participantes durante condiciones de red deficientes.", + "advancedSettings.audio.nextCallWarningWaitingRoom": "Los cambios se aplicarán al unirte a la llamada.", + "advancedSettings.audio.nextCallWarningMeetingRoom": "Los cambios se aplicarán en tu próxima llamada o al refrescar.", + "advancedSettings.statistics.collection.enablePublisher.label": "Habilitar estimación de ancho de banda del emisor", + "advancedSettings.statistics.collection.enablePublisher.description": "Cuando está habilitado, muestra el ancho de banda de salida estimado para el publicador local.", + "advancedSettings.statistics.groups.publisher": "Publicador", + "advancedSettings.statistics.groups.subscribers": "Suscriptores", + "advancedSettings.statistics.empty": "Todavía no hay estadísticas disponibles.", + "advancedSettings.statistics.sections.audio": "Audio", + "advancedSettings.statistics.sections.video": "Vídeo", + "advancedSettings.statistics.metrics.resolution": "Resolución", + "advancedSettings.statistics.metrics.frameRate": "Frecuencia de cuadros", + "advancedSettings.statistics.metrics.decodedFrameRate": "Frecuencia de cuadros decodificada", + "advancedSettings.statistics.metrics.bitrate": "Tasa de bits", + "advancedSettings.statistics.metrics.packetLoss": "Pérdida de paquetes", + "advancedSettings.statistics.metrics.freezeCount": "Número de congelaciones", + "advancedSettings.statistics.metrics.totalFreezesDuration": "Duración total de congelaciones", + "advancedSettings.statistics.metrics.codec": "Codec", + "advancedSettings.statistics.metrics.videoLayer": "Capa {{index}} ({{codec}})", + "advancedSettings.statistics.metrics.packetsSent": "Paquetes enviados", + "advancedSettings.statistics.metrics.packetsLostSent": "Paquetes perdidos (envío)", + "advancedSettings.statistics.metrics.bytesSent": "Bytes enviados", + "advancedSettings.statistics.metrics.packetsReceived": "Paquetes recibidos", + "advancedSettings.statistics.metrics.packetsLostReceived": "Paquetes perdidos (recepción)", + "advancedSettings.statistics.metrics.bytesReceived": "Bytes recibidos", + "advancedSettings.statistics.metrics.estimatedBandwidth": "Ancho de banda estimado", + "advancedSettings.statistics.metrics.remotePublisherEstimatedBandwidth": "Ancho de banda estimado del publicador remoto", + "backgroundEffects.limit": "Has alcanzado el límite máximo de imágenes personalizadas", + "backgroundEffects.title": "Efectos de vídeo", + "backgroundEffects.addBackground": "Añadir fondo", + "backgroundEffects.video.disabled": "Tu cámara está apagada.", + "backgroundEffects.invalidFileType": "Solo se permiten imágenes JPG, PNG, GIF o BMP.", + "backgroundEffects.fileTooLarge": "La imagen debe ser menor a {{maxSize}}MB.", + "backgroundEffects.processingError": "Error al procesar la imagen subida.", + "backgroundEffects.storageError": "Error al guardar la imagen.", + "backgroundEffects.maxSize": "Máx {{maxSize}}MB", + "backgroundEffects.removeBackground": "Quitar fondo", + "backgroundEffects.slightBlur": "Desenfoque ligero del fondo", + "backgroundEffects.strongBlur": "Desenfoque fuerte del fondo", + "backgroundEffects.yourBackground": "Tu fondo", + "backgroundEffects.deleteTooltipInUse": "No puedes eliminar este fondo mientras esté en uso", + "backgroundEffects.deleteTooltip": "Eliminar fondo", + "backgroundEffects.deleteAriaLabel": "Eliminar fondo personalizado", + "backgroundEffects.backgrounds.bookshelfRoom": "Habitación con estantería", + "backgroundEffects.backgrounds.busyRoom": "Habitación ocupada", + "backgroundEffects.backgrounds.duneView": "Vista de dunas", + "backgroundEffects.backgrounds.hogwarts": "Hogwarts", + "backgroundEffects.backgrounds.library": "Biblioteca", + "backgroundEffects.backgrounds.newYork": "Nueva York", + "backgroundEffects.backgrounds.plane": "Avión", + "backgroundEffects.backgrounds.whiteRoom": "Habitación blanca", + "button.apply": "Aplicar", + "button.camera": "Cámara", + "button.cancel": "Cancelar", + "button.close": "Cerrar", + "button.createRoom": "Crear una nueva sala", + "button.startNewRoom": "Iniciar una nueva videoconferencia", + "button.joinExistingMeeting": "Unirse a una reunión existente", + "button.joinWaitingRoom": "Unirse a la sala de espera", + "button.join": "Unirse a la reunión", + "button.mute": "Silenciar", + "button.send": "Enviar", + "button.speaker": "Altavoz", + "captions.ariaLabel": "botón de subtítulos", + "captions.disable": "Desactivar subtítulos", + "captions.enable": "Activar subtítulos", + "captions.errors": "Error de subtítulos: {{captionsErrorResponse}}", + "chat.ariaLabel": "alternar chat", + "chat.close": "Cerrar chat", + "chat.copied": "Copiado", + "chat.copy": "Copiar al portapapeles", + "chat.input.placeholder": "Enviar un mensaje", + "chat.meetingUrl": "URL de la reunión:", + "chat.open": "Abrir chat", + "chat.title": "Chat", + "common.or": "o", + "connectionAlert.quality.message": "Por favor verifica tu conectividad. Tu video puede estar deshabilitado para mejorar la experiencia.", + "connectionAlert.quality.title": "Problema de calidad de video", + "connectionAlert.reconnecting.message": "Por favor verifica tu conexión de red", + "connectionAlert.reconnecting.title": "Conexión perdida", + "deviceAccessAlert.askDeviceMessage": "Para unirte a la sala de video, tu navegador solicitará acceso a tu cámara y micrófono.", + "deviceAccessAlert.deniedDeviceMessage": "Parece que tu navegador tiene bloqueado el acceso a tu cámara y/o micrófono. Restablece los permisos desde la interfaz del navegador.", + "deviceAccessAlert.imageAlt": "Diálogo de acceso", + "devices.audio.ariaLabel": "desplegable de dispositivos de audio", + "devices.audio.defaultLabel": "Predeterminado del sistema", + "devices.audio.disable": "Desactivar micrófono", + "devices.audio.enable": "Activar micrófono o mantén presionada la barra espaciadora para activar temporalmente el micrófono", + "devices.audio.microphone.ariaLabel": "alternar audio", + "devices.audio.microphone.full": "Micrófono", + "devices.audio.microphone.short": "Mic", + "devices.audio.microphone.state.on": "Activar micrófono", + "devices.audio.microphone.state.off": "Desactivar micrófono", + "devices.audio.noiseSuppression": "Supresión avanzada de ruido", + "devices.audio.speakers.full": "Altavoces", + "devices.buttons.ariaLabel": "botón dividido", + "devices.settings.ariaLabel": "configuración de dispositivos", + "devices.select.unknownDevice": "dispositivo", + "devices.select.errorContext": "No se puede seleccionar {{device}}. Comprueba los permisos del dispositivo e inténtalo de nuevo.", + "devices.select.accessDenied": "Se denegó el acceso al {{device}}. Comprueba los permisos de tu navegador.", + "devices.select.trackUnavailable": "El {{device}} no está disponible en este momento. Comprueba la conexión de tu dispositivo.", + "devices.video.ariaLabel": "desplegable de dispositivos de video", + "devices.video.blur.ariaLabel": "Alternar desenfoque de fondo", + "devices.video.blur.label": "Desenfoca tu fondo", + "devices.video.camera.ariaLabel": "alternar video", + "devices.video.camera.switch": "Cambiar cámara", + "devices.video.camera.state.on": "Activar cámara", + "devices.video.camera.state.off": "Desactivar cámara", + "devices.video.camera.full": "Cámara", + "devices.video.camera.front": "frontal", + "devices.video.camera.rear": "trasera", + "devices.video.camera.switchError": "No se pudo cambiar a la cámara {{facingMode}}", + "devices.video.camera.accessError": "No se puede usar la cámara {{facingMode}}. Verifica tus permisos de cámara e intenta de nuevo.", + "devices.video.camera.noTrackError": "La cámara {{facingMode}} no se inició correctamente. Intenta con otra cámara.", + "devices.video.camera.noDeviceError": "No se encontró ninguna cámara {{facingMode}}", + "devices.video.camera.noCurrentDeviceError": "Ninguna cámara actualmente seleccionada. Selecciona una cámara primero.", + "devices.video.camera.selectedDevice": "Cámara seleccionada: {{deviceName}}", + "devices.video.disable": "Desactivar video", + "devices.video.enable": "Activar video", + "emoji.ariaLabel": "abrir menú de emojis", + "emoji.tooltip": "Exprésate", + "errors.unknown": "Ocurrió un error desconocido", + "feedbackForm.ariaLabel": "alternar formulario de reporte", + "feedbackForm.close": "Cerrar formulario de reporte", + "feedbackForm.disclaiamer.label": "Por favor no incluyas información sensible.", + "feedbackForm.disclaiamer.screenshot": "Una captura de pantalla nos ayudará a entender mejor el problema. (opcional)", + "feedbackForm.field.issue.label": "Describe tu problema", + "feedbackForm.field.issue.type": "Descripción", + "feedbackForm.field.name.label": "Dinos tu nombre", + "feedbackForm.field.name.type": "Tu nombre", + "feedbackForm.field.title.label": "Cuando notaste este problema, ¿qué estabas intentando hacer?", + "feedbackForm.field.title.type": "Título", + "feedbackForm.helperText.error": "{{field}} es obligatorio y debe tener menos de {{limit}} caracteres", + "feedbackForm.open": "Abrir formulario de reporte", + "feedbackForm.submitted.content": "Agradecemos mucho tu aporte, nos ayuda a mejorar la aplicación y resolver problemas.", + "feedbackForm.submitted.error": "Algo salió mal. Por favor intenta de nuevo.", + "feedbackForm.submitted.thanks": "¡Gracias por tu feedback!", + "feedbackForm.submitted.track": "Sigue tu progreso aquí.", + "feedbackForm.title": "Reportar problema", + "filePicker.addScreenshot": "Agregar captura", + "filePicker.attachedScreenshot": "Captura adjunta", + "filePicker.capture": "Capturar pantalla", + "filePicker.delete": "Eliminar captura", + "filePicker.sizeLimit": "El tamaño máximo de carga es 20MB. Por favor sube otro archivo.", + "footer.github.title": "Aplicación de referencia de video de Vonage", + "imageStorage.imagesExceedSize": "Las imágenes son demasiado grandes para almacenar (~4MB máx).", + "imageStorage.storageFailure": "Error al guardar las imágenes en el almacenamiento local.", + "imageStorage.duplicateImage": "Esta imagen ya ha sido agregada.", + "imageStorage.fileReadError": "Error al leer el archivo de imagen.", + "imageStorage.invalidExtension": "Extensión de imagen no válida.", + "imageStorage.invalidUrl": "URL de imagen no válida.", + "imageStorage.convertError": "No se pudo convertir la imagen.", + "imageStorage.loadError": "No se pudo cargar la imagen.", + "githubTooltip": "Visita nuestro repositorio en GitHub", + "goodBye.title": "Volviendo a la sala", + "goodBye.back": "Ver página de inicio", + "goodBye.reEnter": "Volver a la reunión", + "goodbye.default.header": "Has salido de la reunión", + "goodbye.default.message": "¡Gracias por unirte!", + "landing.welcome.subtitle": "Impulsa tu negocio con vídeos que transforman la satisfacción del cliente.", + "landing.welcome.title.1": "Mejora", + "landing.welcome.title.2": "la comunicación", + "landing.welcome.title.3": "por vídeo", + "landing.primary.word": "vídeo", + "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", + "layout.tooltip.switchToGrid": "Cambiar al diseño de cuadrícula", + "mutedAlert.message.forceMuted": "Has sido silenciado por otro participante. Haz clic en el micrófono para activarlo.", + "mutedAlert.message.muted": "¿Estás hablando? Tu micrófono está apagado. Haz clic en el micrófono para encenderlo.", + "participants.list.ariaLabel": "alternar lista de participantes", + "participants.list.close": "Cerrar lista de participantes", + "participants.list.open": "Abrir lista de participantes", + "participants.maxPin": "No puedes fijar más mosaicos", + "participants.mute.dialog.content": "¿Silenciar a {{participantName}} para todos en la llamada? Solo {{participantName}} puede activarse de nuevo.", + "participants.mute.tooltip": "Silenciar el micrófono de {{participantName}}", + "participants.pin": "Fijar a {{participantName}}", + "participants.pin.video": "Fijar el video de {{participantName}}", + "participants.screen": "Pantalla de {{participantName}}", + "participants.search": "Buscar participantes", + "participants.title": "Participantes", + "participants.unpin": "Desfijar a {{participantName}}", + "participants.unpin.video": "Desfijar el video de {{participantName}}", + "publishingErrors.accessDenied.message": "Parece que tu navegador tiene bloqueado el acceso a tu {{device}}. Restablece los permisos desde la interfaz del navegador.", + "publishingErrors.accessDenied.title": "Acceso a {{device}} denegado", + "publishingErrors.blocked.message": "Tenemos problemas para conectarte con otros en la sala. Por favor revisa tu red e intenta de nuevo.", + "publishingErrors.blocked.title": "Dificultades para unirse a la sala", + "subscribingErrors.blocked.message": "Tenemos problemas para conectarte con otros en la sala. Por favor revisa tu red e intenta de nuevo.", + "subscribingErrors.blocked.title": "Dificultades para unirse a la sala", + "recording.start.dialog.content": "¡Asegúrate de que todos estén listos! Puedes descargar la grabación desde la página de \"Despedida\" después de salir de la sala.", + "recording.start.dialog.title": "¿Iniciar grabación?", + "recording.start.title": "Iniciar grabación", + "recording.stop.dialog.content": "Puedes descargar la grabación desde la página de \"Despedida\" después de salir de la sala.", + "recording.stop.dialog.title": "¿Detener grabación?", + "recording.stop.title": "Detener grabación", + "recording.consent.dialog.title": "Esta reunión se está grabando", + "recording.consent.dialog.content": "El anfitrión ha iniciado la grabación de esta reunión. ¿Consientes ser grabado?", + "recording.consent.dialog.accept": "Consiento", + "recording.consent.dialog.decline": "No consiento", + "recording.consent.goodbye.header": "Grabación rechazada", + "recording.consent.goodbye.message": "Has decidido no consentir la grabación. Vuelve a unirte cuando la grabación se haya detenido o pide al anfitrión que desactive la grabación.", + "recording.popup.title": "Grabación", + "recording.popup.subtitle": "Esta reunión se está grabando", + "recording.tooltip.ariaLabel": "diseño de video", + "room.exit.ariaLabel": "salir", + "room.exit.tooltip": "Salir de la reunión", + "room.input.helper": "No se permite dejar el campo vacío, espacios ni caracteres especiales", + "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?", + "screenSharing.dialog.hiddenMessage": "Estás compartiendo tu pantalla.", + "screenSharing.title.start": "Iniciar compartir pantalla", + "screenSharing.title.stop": "Detener compartir pantalla", + "screenSharing.tooltip.ariaLabel": "Iniciar o detener compartir pantalla", + "soundTest.start": "Probar altavoces", + "soundTest.stop": "Detener prueba", + "toolbar.tooltip.ariaLabel": "abrir menú de barra de herramientas adicional", + "toolbar.tooltip.title": "Acceder a elementos adicionales de la barra", + "unsupportedBrowser.header": "Tu navegador no es compatible", + "unsupportedBrowser.message": "Revisa la lista y elige un navegador compatible.", + "unsupportedBrowser.supported.visitPage": "Visitar la página", + "unsupportedBrowser.supported.title": "Navegadores compatibles:", + "unknown.device": "Dispositivo desconocido", + "user.unknown": "usuario desconocido", + "user.you": "Tú", + "waitingRoom.unsupportedFeature.tooltip": "Tu navegador no soporta esta funcionalidad", + "waitingRoom.devices.noDevicesFound": "No se han encontrado dispositivos", + "waitingRoom.title": "Prepararse para unirse", + "waitingRoom.user.input.title": "Ingresa tu nombre", + "waitingRoom.user.input.label": "Nombre", + "waitingRoom.precallNetworkTest.title": "Prueba de red previa a la llamada", + "waitingRoom.precallNetworkTest.subtitle": "Prueba tu acceso a dispositivos, conectividad de red y calidad de la llamada antes de unirte", + "waitingRoom.precallNetworkTest.stopTest": "Detener prueba", + "waitingRoom.precallNetworkTest.stoppedTitle": "Prueba detenida", + "waitingRoom.precallNetworkTest.stoppedMessage": "Has detenido la prueba de red. Puedes volver a intentarlo cuando estés listo.", + "waitingRoom.precallNetworkTest.retryTest": "Reintentar prueba", + "waitingRoom.precallNetworkTest.audio": "Audio", + "waitingRoom.precallNetworkTest.video": "Video", + "waitingRoom.precallNetworkTest.qualityLabel": "Calidad:", + "waitingRoom.precallNetworkTest.error": "La prueba falló", + "waitingRoom.precallNetworkTest.audioSupported": "El audio es compatible", + "waitingRoom.precallNetworkTest.audioNotSupported": "El audio no es compatible", + "waitingRoom.precallNetworkTest.videoSupported": "El video es compatible", + "waitingRoom.precallNetworkTest.videoNotSupported": "El video no es compatible", + "waitingRoom.user.input.error": "El nombre no puede estar vacío ni contener caracteres especiales.", + "zoom.reset": "Restablecer zoom", + "zoom.start": "Iniciar zoom", + "zoom.out": "Alejar zoom", + "zoom.in": "Acercar zoom", + "zoom.current": "Zoom actual", + "errorPage.title": "Algo salió mal", + "errorPage.description": "La aplicación no pudo iniciarse. Recarga la página o contacta con soporte si el problema persiste.", + "notification.dismiss": "Descartar notificación" +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/locales/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/locales/index.ts new file mode 100644 index 00000000..488beffe --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/locales/index.ts @@ -0,0 +1,35 @@ +import EN from './en.json'; +import DE from './de.json'; +import ES from './es.json'; +import IT from './it.json'; +import ES_MX from './es-MX.json'; + +export default { + en: { + translation: EN, + }, + 'en-US': { + translation: EN, + }, + de: { + translation: DE, + }, + 'de-DE': { + translation: DE, + }, + 'de-AT': { + translation: DE, + }, + 'de-CH': { + translation: DE, + }, + es: { + translation: ES, + }, + 'es-MX': { + translation: ES_MX, + }, + it: { + translation: IT, + }, +}; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/locales/it.json b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/locales/it.json new file mode 100644 index 00000000..933ac8a5 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/locales/it.json @@ -0,0 +1,318 @@ +{ + "archiveList.archive.createdAt": "Creata: {{createdAt}}", + "archiveList.archive.index": "Registrazione {{index}}", + "archiveList.download.tooltip": "Scarica registrazione {{id}}", + "archiveList.download": "Scarica", + "archiveList.empty": "La riunione non è stata registrata", + "archiveList.error.text": "Si è verificato un errore durante il caricamento delle registrazioni di questa riunione", + "archiveList.error.tooltip": "Questa registrazione è fallita o è scaduta", + "archiveList.label": "Scarica registrazioni", + "archiveList.loading": "Stiamo elaborando la tua registrazione", + "archiveList.loading.subtitle": "Attendere alcuni secondi per scaricare la registrazione", + "advancedSettings.title": "Impostazioni", + "advancedSettings.open": "Apri impostazioni", + "advancedSettings.close": "Chiudi impostazioni", + "advancedSettings.ariaLabel": "apri impostazioni", + "advancedSettings.tabs.general": "Generale", + "advancedSettings.tabs.video": "Video", + "advancedSettings.tabs.audio": "Audio", + "advancedSettings.tabs.statistics": "Statistiche", + "advancedSettings.general.resetButton": "Ripristina valori predefiniti", + "advancedSettings.general.resetDescription": "Ripristina tutte le impostazioni ai valori predefiniti", + "advancedSettings.video.bitrate.label": "Bitrate", + "advancedSettings.video.bitrate.options.default": "Predefinita", + "advancedSettings.video.bitrate.options.bw_saver": "Risparmio di banda", + "advancedSettings.video.bitrate.options.extra_bw_saver": "Risparmio extra di banda", + "advancedSettings.video.bitrate.options.custom": "Personalizzato", + "advancedSettings.video.bitrate.description": "Vonage Video API consente di usare preset bitrate o definire un bitrate video massimo personalizzato.", + "advancedSettings.video.customBitrate.label": "Bitrate personalizzato", + "advancedSettings.video.customBitrate.description": "Imposta un bitrate video massimo tra 5 kbps e 10 Mbps.", + "advancedSettings.video.customBitrate.minimum": "5 kbps", + "advancedSettings.video.customBitrate.maximum": "10 Mbps", + "advancedSettings.video.customBitrate.units.lower": "kbps", + "advancedSettings.video.customBitrate.units.higher": "Mbps", + "advancedSettings.video.codec.label": "Codec", + "advancedSettings.video.codec.options.automatic": "Automatico", + "advancedSettings.video.codec.options.manual": "Manuale", + "advancedSettings.video.codec.description": "L'SDK seleziona automaticamente il codec migliore in base alle condizioni di rete e alle capacità dei partecipanti. Le modifiche si applicano alla chiamata successiva.", + "advancedSettings.video.codec.priority.label": "Priorità codec", + "advancedSettings.video.codec.priority.description": "Trascina per scegliere l'ordine di preferenza dei codec, dal primo all'ultimo.", + "advancedSettings.video.codec.priority.options.vp9": "VP9", + "advancedSettings.video.codec.priority.options.vp8": "VP8", + "advancedSettings.video.codec.priority.options.h264": "H.264", + "advancedSettings.video.frameRate.label": "Frame rate", + "advancedSettings.video.frameRate.options.30": "30 FPS", + "advancedSettings.video.frameRate.options.15": "15 FPS", + "advancedSettings.video.frameRate.options.7": "7 FPS", + "advancedSettings.video.frameRate.options.1": "1 FPS", + "advancedSettings.video.resolution.label": "Risoluzione", + "advancedSettings.video.error.resolutionNotSupported": "La risoluzione selezionata non è supportata dal tuo dispositivo.", + "advancedSettings.video.error.frameRateNotSupported": "Il frame rate selezionato non è supportato dal tuo dispositivo.", + "advancedSettings.video.error.bitrateNotSupported": "Non è stato possibile applicare il bitrate selezionato.", + "advancedSettings.audio.bitrate.label": "Bitrate audio", + "advancedSettings.audio.bitrate.description": "Utilizza automaticamente il valore predefinito dell'SDK, oppure scegli personalizzato per definire il bitrate massimo di codifica audio inviato alla sessione.", + "advancedSettings.audio.bitrate.options.automatic": "Automatico", + "advancedSettings.audio.bitrate.options.custom": "Personalizzato", + "advancedSettings.audio.bitrate.customLabel": "Bitrate audio personalizzato", + "advancedSettings.audio.bitrate.minimum": "6 kbps", + "advancedSettings.audio.bitrate.maximum": "510 kbps", + "advancedSettings.audio.bitrate.currentValue": "{{value}} kbps", + "advancedSettings.audio.enableDtx.label": "Abilita Opus DTX", + "advancedSettings.audio.enableDtx.description": "Quando attivato, la trasmissione discontinua di Opus riduce la larghezza di banda audio durante i periodi di silenzio.", + "advancedSettings.audio.publisherAudioFallback.label": "Fallback audio del publisher", + "advancedSettings.audio.publisherAudioFallback.description": "Quando è abilitato, il tuo video smette di essere renderizzato su altri dispositivi durante condizioni di rete scarse per preservare l'audio.", + "advancedSettings.audio.subscriberAudioFallback.label": "Fallback audio del subscriber", + "advancedSettings.audio.subscriberAudioFallback.description": "Quando è abilitato, ricevi solo l'audio degli altri partecipanti durante condizioni di rete scarse.", + "advancedSettings.audio.nextCallWarningWaitingRoom": "Le modifiche avranno effetto quando entri nella chiamata.", + "advancedSettings.audio.nextCallWarningMeetingRoom": "Le modifiche avranno effetto nella prossima chiamata o dopo aver aggiornato la pagina.", + "advancedSettings.statistics.collection.enablePublisher.label": "Abilita stima della larghezza di banda del publisher", + "advancedSettings.statistics.collection.enablePublisher.description": "Quando è abilitato, mostra la larghezza di banda in uscita stimata per il publisher locale.", + "advancedSettings.statistics.groups.publisher": "Publisher", + "advancedSettings.statistics.groups.subscribers": "Subscribers", + "advancedSettings.statistics.empty": "Non ci sono ancora statistiche disponibili.", + "advancedSettings.statistics.sections.audio": "Audio", + "advancedSettings.statistics.sections.video": "Video", + "advancedSettings.statistics.metrics.packetsSent": "Pacchetti inviati", + "advancedSettings.statistics.metrics.packetsLostSent": "Pacchetti persi (invio)", + "advancedSettings.statistics.metrics.bytesSent": "Byte inviati", + "advancedSettings.statistics.metrics.packetsReceived": "Pacchetti ricevuti", + "advancedSettings.statistics.metrics.packetsLostReceived": "Pacchetti persi (ricezione)", + "advancedSettings.statistics.metrics.bytesReceived": "Byte ricevuti", + "advancedSettings.statistics.metrics.estimatedBandwidth": "Larghezza di banda stimata", + "advancedSettings.statistics.metrics.remotePublisherEstimatedBandwidth": "Larghezza di banda stimata del publisher remoto", + "advancedSettings.statistics.metrics.resolution": "Risoluzione", + "advancedSettings.statistics.metrics.frameRate": "Frequenza fotogrammi", + "advancedSettings.statistics.metrics.decodedFrameRate": "Frequenza fotogrammi decodificata", + "advancedSettings.statistics.metrics.bitrate": "Bitrate", + "advancedSettings.statistics.metrics.packetLoss": "Perdita di pacchetti", + "advancedSettings.statistics.metrics.freezeCount": "Numero di blocchi", + "advancedSettings.statistics.metrics.totalFreezesDuration": "Durata totale dei blocchi", + "advancedSettings.statistics.metrics.codec": "Codec", + "advancedSettings.statistics.metrics.videoLayer": "Livello {{index}} ({{codec}})", + "backgroundEffects.limit": "Hai raggiunto il limite massimo di immagini personalizzate", + "backgroundEffects.title": "Effetti video", + "backgroundEffects.addBackground": "Aggiungi sfondo", + "backgroundEffects.video.disabled": "La tua camera è spenta.", + "backgroundEffects.invalidFileType": "Sono consentite solo immagini JPG, PNG, GIF o BMP.", + "backgroundEffects.fileTooLarge": "L'immagine deve essere inferiore a {{maxSize}}MB.", + "backgroundEffects.processingError": "Errore nell'elaborazione dell'immagine caricata.", + "backgroundEffects.storageError": "Errore nel salvataggio dell'immagine.", + "backgroundEffects.maxSize": "Max {{maxSize}}MB", + "backgroundEffects.removeBackground": "Rimuovi sfondo", + "backgroundEffects.slightBlur": "Sfocatura leggera dello sfondo", + "backgroundEffects.strongBlur": "Sfocatura forte dello sfondo", + "backgroundEffects.yourBackground": "Il tuo sfondo", + "backgroundEffects.deleteTooltipInUse": "Non puoi rimuovere questo sfondo mentre è in uso", + "backgroundEffects.deleteTooltip": "Rimuovi sfondo", + "backgroundEffects.deleteAriaLabel": "Rimuovi sfondo personalizzato", + "backgroundEffects.backgrounds.bookshelfRoom": "Stanza con libreria", + "backgroundEffects.backgrounds.busyRoom": "Stanza occupata", + "backgroundEffects.backgrounds.duneView": "Vista delle dune", + "backgroundEffects.backgrounds.hogwarts": "Hogwarts", + "backgroundEffects.backgrounds.library": "Biblioteca", + "backgroundEffects.backgrounds.newYork": "New York", + "backgroundEffects.backgrounds.plane": "Aereo", + "backgroundEffects.backgrounds.whiteRoom": "Stanza bianca", + "button.apply": "Applica", + "button.camera": "Camera", + "button.cancel": "Annulla", + "button.close": "Chiudi", + "button.createRoom": "Crea una nuova stanza", + "button.startNewRoom": "Inizia una nuova videoconferenza", + "button.joinExistingMeeting": "Unisciti a una riunione esistente", + "button.joinWaitingRoom": "Unisciti alla sala d'attesa", + "button.join": "Partecipa alla riunione", + "button.mute": "Disattiva audio", + "button.send": "Invia", + "button.speaker": "Altoparlante", + "captions.ariaLabel": "pulsante sottotitoli", + "captions.disable": "Disattiva sottotitoli", + "captions.enable": "Attiva sottotitoli", + "captions.errors": "Errore sottotitoli: {{captionsErrorResponse}}", + "chat.ariaLabel": "attiva/disattiva chat", + "chat.close": "Chiudi chat", + "chat.copied": "Copiato", + "chat.copy": "Copia negli appunti", + "chat.input.placeholder": "Invia un messaggio", + "chat.meetingUrl": "URL riunione:", + "chat.open": "Apri chat", + "chat.title": "Chat", + "common.or": "o", + "connectionAlert.quality.message": "Controlla la tua connessione. Il video potrebbe essere disattivato per migliorare l'esperienza.", + "connectionAlert.quality.title": "Problema relativo alla qualità del video", + "connectionAlert.reconnecting.message": "Verifica la tua connessione di rete", + "connectionAlert.reconnecting.title": "Connessione persa", + "deviceAccessAlert.askDeviceMessage": "Per partecipare alla Riunione, il browser richiederà l'accesso a camera e microfono.", + "deviceAccessAlert.deniedDeviceMessage": "Sembra che il browser non possa accedere alla camera o al microfono. Reimposta i permessi tramite l'interfaccia del browser.", + "deviceAccessAlert.imageAlt": "Dialogo accesso", + "devices.audio.ariaLabel": "dispositivi audio", + "devices.audio.defaultLabel": "Predefinito sistema", + "devices.audio.disable": "Disattiva microfono", + "devices.audio.enable": "Attiva il microfono o tieni premuta la barra spaziatrice per attivarlo temporaneamente", + "devices.audio.microphone.ariaLabel": "attiva/disattiva audio", + "devices.audio.microphone.full": "Microfono", + "devices.audio.microphone.short": "Mic", + "devices.audio.microphone.state.on": "Attiva microfono", + "devices.audio.microphone.state.off": "Disattiva microfono", + "devices.audio.noiseSuppression": "Soppressione rumore avanzata", + "devices.audio.speakers.full": "Altoparlanti", + "devices.buttons.ariaLabel": "pulsante diviso", + "devices.settings.ariaLabel": "impostazioni dispositivi", + "devices.select.unknownDevice": "dispositivo", + "devices.select.errorContext": "Impossibile selezionare {{device}}. Controlla i permessi del dispositivo e riprova.", + "devices.select.accessDenied": "L'accesso a {{device}} è stato negato. Controlla i permessi del browser.", + "devices.select.trackUnavailable": "{{device}} non è attualmente disponibile. Controlla la connessione del dispositivo.", + "devices.video.ariaLabel": "dispositivi video", + "devices.video.blur.ariaLabel": "Attiva la sfocatura dello sfondo", + "devices.video.blur.label": "Sfoca lo sfondo", + "devices.video.camera.ariaLabel": "attiva/disattiva video", + "devices.video.camera.switch": "Cambia camera", + "devices.video.camera.state.on": "Attiva camera", + "devices.video.camera.state.off": "Disattiva camera", + "devices.video.camera.full": "Camera", + "devices.video.camera.front": "frontale", + "devices.video.camera.rear": "posteriore", + "devices.video.camera.switchError": "Impossibile passare alla fotocamera {{facingMode}}", + "devices.video.camera.accessError": "Impossibile utilizzare la fotocamera {{facingMode}}. Controlla i permessi della fotocamera e riprova.", + "devices.video.camera.noTrackError": "La fotocamera {{facingMode}} non si è avviata correttamente. Prova un'altra fotocamera.", + "devices.video.camera.noDeviceError": "Nessuna fotocamera {{facingMode}} trovata", + "devices.video.camera.noCurrentDeviceError": "Nessuna fotocamera attualmente selezionata. Seleziona una fotocamera per primo.", + "devices.video.camera.selectedDevice": "Fotocamera selezionata: {{deviceName}}", + "devices.video.disable": "Disattiva video", + "devices.video.enable": "Attiva video", + "emoji.ariaLabel": "apri menu emoji", + "emoji.tooltip": "Esprimiti", + "errors.unknown": "Errore sconosciuto", + "feedbackForm.ariaLabel": "attiva modulo segnalazione", + "feedbackForm.close": "Chiudi modulo segnalazione", + "feedbackForm.disclaiamer.label": "Non includere informazioni sensibili.", + "feedbackForm.disclaiamer.screenshot": "Uno screenshot ci aiuterà a capire meglio il problema. (opzionale)", + "feedbackForm.field.issue.label": "Descrivi il problema", + "feedbackForm.field.issue.type": "Descrizione", + "feedbackForm.field.name.label": "Indicaci il tuo nome", + "feedbackForm.field.name.type": "Il tuo nome", + "feedbackForm.field.title.label": "Quando hai notato questo problema, cosa stavi facendo?", + "feedbackForm.field.title.type": "Titolo", + "feedbackForm.helperText.error": "{{field}} è richiesto e deve essere inferiore a {{limit}} caratteri", + "feedbackForm.open": "Apri modulo segnalazione", + "feedbackForm.submitted.content": "Grazie per il tuo feedback, ci aiuta a migliorare l'app.", + "feedbackForm.submitted.error": "Si è verificato un errore. Riprova.", + "feedbackForm.submitted.thanks": "Grazie per il tuo feedback!", + "feedbackForm.submitted.track": "Segui i progressi qui.", + "feedbackForm.title": "Segnala problema", + "filePicker.addScreenshot": "Aggiungi screenshot", + "filePicker.attachedScreenshot": "Screenshot allegato", + "filePicker.capture": "Cattura screenshot", + "filePicker.delete": "Elimina screenshot", + "filePicker.sizeLimit": "La dimensione massima del file è 20MB. Carica un altro file.", + "footer.github.title": "Applicazione di riferimento video di Vonage", + "imageStorage.imagesExceedSize": "Le immagini sono troppo grandi per essere archiviate (~4MB max).", + "imageStorage.storageFailure": "Impossibile salvare le immagini nel localStorage.", + "imageStorage.duplicateImage": "Questa immagine è già stata aggiunta.", + "imageStorage.fileReadError": "Impossibile leggere il file immagine.", + "imageStorage.invalidExtension": "Estensione immagine non valida.", + "imageStorage.invalidUrl": "URL immagine non valido.", + "imageStorage.convertError": "Impossibile convertire l'immagine.", + "imageStorage.loadError": "Impossibile caricare l'immagine.", + "githubTooltip": "Visita il nostro GitHub", + "goodBye.title": "Rientro nella stanza", + "goodBye.back": "Visualizza pagina di destinazione", + "goodBye.reEnter": "Torna alla riunione", + "goodbye.default.header": "Hai lasciato la riunione", + "goodbye.default.message": "Grazie per aver partecipato!", + "landing.welcome.subtitle": "Potenzia la tua attività con video che trasformano la soddisfazione del cliente.", + "landing.welcome.title.1": "Migliora", + "landing.welcome.title.2": "la comunicazione", + "landing.welcome.title.3": "per video", + "landing.primary.word": "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", + "layout.tooltip.switchToGrid": "Passa al layout Griglia", + "mutedAlert.message.forceMuted": "Sei stato disattivato da un altro partecipante. Clicca sul microfono per riattivarlo.", + "mutedAlert.message.muted": "Stai parlando? Il tuo microfono è attualmente disattivato. Clicca sul microfono per attivarlo.", + "participants.list.ariaLabel": "attiva/disattiva la lista dei partecipanti", + "participants.list.close": "Chiudi la lista dei partecipanti", + "participants.list.open": "Apri la lista dei partecipanti", + "participants.maxPin": "Non puoi fissare altre tile", + "participants.mute.dialog.content": "Disattivare {{participantName}} per tutti nella chiamata? Solo {{participantName}} può riattivarsi.", + "participants.mute.tooltip": "Disattiva microfono di {{participantName}}", + "participants.pin": "Fissa {{participantName}}", + "participants.pin.video": "Fissa video di {{participantName}}", + "participants.screen": "Schermo di {{participantName}}", + "participants.search": "Cerca partecipanti", + "participants.title": "Partecipanti", + "participants.unpin": "Sblocca {{participantName}}", + "participants.unpin.video": "Sblocca video di {{participantName}}", + "publishingErrors.accessDenied.message": "Sembra che il browser non possa accedere al tuo {{device}}. Reimposta i permessi tramite il browser.", + "publishingErrors.accessDenied.title": "L'accesso a {{device}} è stato negato", + "publishingErrors.blocked.message": "Problemi di connessione con altri nella stanza. Controlla la rete e riprova.", + "publishingErrors.blocked.title": "Difficoltà a unirsi alla stanza", + "subscribingErrors.blocked.message": "Problemi di connessione con altri nella stanza. Controlla la rete e riprova.", + "subscribingErrors.blocked.title": "Difficoltà a unirsi alla stanza", + "recording.start.dialog.content": "Assicurati che tutti siano pronti! Puoi scaricare la registrazione dalla pagina \"Addio\" dopo aver lasciato la stanza.", + "recording.start.dialog.title": "Avvia registrazione?", + "recording.start.title": "Avvia registrazione", + "recording.stop.dialog.content": "Puoi scaricare la registrazione dalla pagina \"Addio\" dopo aver lasciato la stanza.", + "recording.stop.dialog.title": "Interrompere la registrazione?", + "recording.stop.title": "Interrompi registrazione", + "recording.consent.dialog.title": "Questa riunione è in registrazione", + "recording.consent.dialog.content": "L'organizzatore ha avviato la registrazione di questa riunione. Acconsenti a essere registrato?", + "recording.consent.dialog.accept": "Acconsento", + "recording.consent.dialog.decline": "Non acconsento", + "recording.consent.goodbye.header": "Registrazione rifiutata", + "recording.consent.goodbye.message": "Hai scelto di non acconsentire alla registrazione. Rientra quando la registrazione è stata interrotta o chiedi all'organizzatore di disattivarla.", + "recording.popup.title": "Registrazione", + "recording.popup.subtitle": "Questa riunione viene registrata", + "recording.tooltip.ariaLabel": "layout video", + "room.exit.ariaLabel": "esci", + "room.exit.tooltip": "Esci dalla riunione", + "room.input.helper": "Non può essere vuoto, contenere spazi o caratteri speciali", + "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?", + "screenSharing.dialog.hiddenMessage": "Stai condividendo il tuo schermo.", + "screenSharing.title.start": "Avvia condivisione schermo", + "screenSharing.title.stop": "Interrompi condivisione schermo", + "screenSharing.tooltip.ariaLabel": "Avvia o interrompi condivisione schermo", + "soundTest.start": "Test altoparlanti", + "soundTest.stop": "Interrompi test", + "toolbar.tooltip.ariaLabel": "apri menu strumenti aggiuntivi", + "toolbar.tooltip.title": "Accedi agli strumenti aggiuntivi", + "unsupportedBrowser.header": "Browser non supportato", + "unsupportedBrowser.message": "Controlla l'elenco e scegli un browser supportato.", + "unsupportedBrowser.supported.visitPage": "Visita la pagina", + "unsupportedBrowser.supported.title": "Browser supportati:", + "unknown.device": "Dispositivo sconosciuto", + "user.unknown": "utente sconosciuto", + "user.you": "Tu", + "waitingRoom.unsupportedFeature.tooltip": "Il tuo browser non supporta questa funzionalità", + "waitingRoom.devices.noDevicesFound": "Nessun dispositivo trovato", + "waitingRoom.title": "Preparati per unirti", + "waitingRoom.user.input.title": "Inserisci il tuo nome", + "waitingRoom.user.input.label": "Nome", + "waitingRoom.precallNetworkTest.title": "Test di rete pre-chiamata", + "waitingRoom.precallNetworkTest.subtitle": "Verifica l'accesso ai dispositivi, la connettività di rete e la qualità della chiamata prima di unirti", + "waitingRoom.precallNetworkTest.stopTest": "Interrompi test", + "waitingRoom.precallNetworkTest.stoppedTitle": "Test interrotto", + "waitingRoom.precallNetworkTest.stoppedMessage": "Hai interrotto il test di rete. Puoi riprovare quando vuoi.", + "waitingRoom.precallNetworkTest.retryTest": "Riprova test", + "waitingRoom.precallNetworkTest.audio": "Audio", + "waitingRoom.precallNetworkTest.video": "Video", + "waitingRoom.precallNetworkTest.qualityLabel": "Qualità:", + "waitingRoom.precallNetworkTest.error": "Test fallito", + "waitingRoom.precallNetworkTest.audioSupported": "L'audio è supportato", + "waitingRoom.precallNetworkTest.audioNotSupported": "L'audio non è supportato", + "waitingRoom.precallNetworkTest.videoSupported": "Il video è supportato", + "waitingRoom.precallNetworkTest.videoNotSupported": "Il video non è supportato", + "waitingRoom.user.input.error": "Il nome non può essere vuoto né contenere caratteri speciali.", + "zoom.reset": "Reimposta zoom", + "zoom.start": "Inizia zoom", + "zoom.out": "Zoom indietro", + "zoom.in": "Zoom avanti", + "zoom.current": "Zoom attuale", + "errorPage.title": "Qualcosa è andato storto", + "errorPage.description": "L'applicazione non è riuscita ad avviarsi. Ricarica la pagina o contatta il supporto se il problema persiste.", + "notification.dismiss": "Ignora notifica" +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/FrontendLogger.spec.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/FrontendLogger.spec.ts new file mode 100644 index 00000000..9228413b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/FrontendLogger.spec.ts @@ -0,0 +1,109 @@ +import { waitFor } from '@testing-library/dom'; +import { vi, describe, it, beforeEach, expect } from 'vitest'; +import { FrontendLogger } from './FrontendLogger'; +import type { LoggerProviderConfig } from '@common/logger'; + +describe('FrontendLogger', () => { + let provider: LoggerProviderConfig; + let logger: FrontendLogger; + + beforeEach(() => { + provider = { log: vi.fn(), reportError: vi.fn(), verbose: false }; + logger = new FrontendLogger(); + logger.setup(() => provider); + vi.clearAllMocks(); + }); + + it('forwards log and reportError calls to provider', async () => { + logger.log('EventName', { key: 'value' }); + logger.reportError(new Error('Err'), { context: 'test' }); + + await waitFor(() => { + expect(provider.log).toHaveBeenCalledWith( + 'EventName', + expect.objectContaining({ key: 'value' }) + ); + }); + await waitFor(() => { + expect(provider.reportError).toHaveBeenCalledWith( + expect.objectContaining({ message: 'Err' }), + { context: 'test' } + ); + }); + }); + + it('handles synchronous setup correctly', async () => { + const syncProvider: LoggerProviderConfig = { log: vi.fn(), reportError: vi.fn() }; + const syncLogger = new FrontendLogger(); + syncLogger.setup(() => syncProvider); + + syncLogger.log('SyncEvent', { id: '1' }); + syncLogger.reportError(new Error('Sync error'), { source: 'test' }); + + await waitFor(() => { + expect(syncProvider.log).toHaveBeenCalledWith( + 'SyncEvent', + expect.objectContaining({ id: '1' }) + ); + }); + await waitFor(() => { + expect(syncProvider.reportError).toHaveBeenCalledWith( + expect.objectContaining({ message: 'Sync error' }), + { source: 'test' } + ); + }); + }); + + it('reports initialization failure when setup promise rejects', async () => { + const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); + const badLogger = new FrontendLogger(); + + badLogger.setup(() => Promise.reject(new Error('Failed to load provider'))); + + await waitFor(() => { + expect(consoleErrorSpy).toHaveBeenCalledWith( + expect.stringContaining('Initialization failed'), + expect.any(Error) + ); + }); + }); + + it('logs to console when provider is verbose', async () => { + provider.verbose = true; + const consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(() => {}); + + logger.log('VerboseEvent', { test: 1 }); + logger.reportError(new Error('VerboseError'), { type: 'test' }); + + await waitFor(() => { + expect(consoleLogSpy).toHaveBeenCalled(); + }); + }); + + it.each([ + ['onCaughtError', 'caught', { componentStack: 'stack1' }, { componentStack: 'stack1' }], + ['onUncaughtError', 'uncaught', { componentStack: 'stack2' }, { componentStack: 'stack2' }], + ['onUncaughtError', 'uncaught', undefined, { componentStack: undefined }], + [ + 'onRecoverableError', + 'recoverable', + { componentStack: 'stack3' }, + { componentStack: 'stack3' }, + ], + ['onRecoverableError', 'recoverable', {}, { componentStack: undefined }], + ])('%s calls reportError with type "%s"', async (_method, type, errorInfoArg, expectedExtra) => { + const err = new Error('Test error'); + const loggerWithCallbacks = logger as unknown as Record< + string, + (e: unknown, info: unknown) => void + >; + loggerWithCallbacks[_method](err, errorInfoArg); + + await waitFor(() => { + expect(provider.reportError).toHaveBeenCalledWith( + expect.objectContaining({ message: 'Test error' }), + { type, ...expectedExtra } + ); + }); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/FrontendLogger.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/FrontendLogger.ts new file mode 100644 index 00000000..9633c1fc --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/FrontendLogger.ts @@ -0,0 +1,35 @@ +import { LoggerBase, type LoggerProviderConfig } from '@common/logger'; +import type { ErrorInfo } from 'react-dom/client'; + +export type FrontendLoggerProviderConfig = LoggerProviderConfig & { + onCaughtError?: (error: Error, errorInfo: { componentStack?: string }) => void; + onUncaughtError?: (error: Error, errorInfo: { componentStack?: string }) => void; + onRecoverableError?: (error: Error, errorInfo: ErrorInfo) => void; +}; + +/** + * FrontendLogger extends LoggerBase with React error callbacks (onCaughtError, onUncaughtError, onRecoverableError). + * Logs are sent via the configured provider (e.g. backend → Gollum); not to the console. + */ +export class FrontendLogger extends LoggerBase { + public onCaughtError = (error: unknown, errorInfo: { componentStack?: string }) => { + this.reportError(error, { + type: 'caught', + componentStack: errorInfo.componentStack, + }); + }; + + public onUncaughtError = (error: unknown, errorInfo: { componentStack?: string }) => { + this.reportError(error, { + type: 'uncaught', + componentStack: errorInfo?.componentStack, + }); + }; + + public onRecoverableError = (error: unknown, errorInfo: ErrorInfo) => { + this.reportError(error, { + type: 'recoverable', + componentStack: errorInfo?.componentStack, + }); + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/event/createClientEvent.spec.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/event/createClientEvent.spec.ts new file mode 100644 index 00000000..58b7a244 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/event/createClientEvent.spec.ts @@ -0,0 +1,121 @@ +import { vi, describe, it, expect } from 'vitest'; +import { createClientEvent } from './createClientEvent'; + +const { MOCK_VERSION } = vi.hoisted(() => ({ + MOCK_VERSION: 'vera-1.0.0-test', +})); + +vi.mock('@utils/getAppVersion', () => ({ + default: () => MOCK_VERSION, +})); + +describe('createClientEvent', () => { + it('returns a ClientLogEvent with required fields', () => { + const event = createClientEvent({ + level: 'info', + action: 'TestAction', + payload: { key: 'value' }, + sessionId: 'sid-1', + connectionId: 'conn-1', + timestamp: 1234567890, + partnerId: 'partner-123', + }); + + expect(event).toMatchObject({ + action: 'TestAction', + payload: { key: 'value' }, + sessionId: 'sid-1', + connectionId: 'conn-1', + clientSystemTime: 1234567890, + level: 'info', + }); + expect(event.guid).toBeDefined(); + expect(typeof event.guid).toBe('string'); + expect(event.userAgent).toBeDefined(); + expect(typeof event.userAgent).toBe('string'); + }); + + it('uses Date.now() when clientSystemTime is not provided', () => { + const before = Date.now(); + const event = createClientEvent({ + level: 'info', + action: 'A', + sessionId: 'sid-1', + connectionId: 'conn-1', + partnerId: 'partner-123', + }); + const after = Date.now(); + + expect(event.clientSystemTime).toBeGreaterThanOrEqual(before); + expect(event.clientSystemTime).toBeLessThanOrEqual(after); + }); + + it('sets clientVersion, source, name, componentId from app/env and partnerId from input', () => { + const event = createClientEvent({ + level: 'error', + action: 'Error', + payload: {}, + partnerId: 'partner-123', + sessionId: 'sid-1', + connectionId: 'conn-1', + }); + + expect(event.clientVersion).toBe(MOCK_VERSION); + expect(event.source).toBeDefined(); + expect(event.name).toBe('vera'); + expect(event.componentId).toBe('vera'); + expect(event.partnerId).toBe('partner-123'); + }); + + it('omits sessionId, connectionId, partnerId when not provided', () => { + const event = createClientEvent({ + level: 'info', + action: 'TestAction', + payload: { key: 'value' }, + }); + + expect(event).not.toHaveProperty('sessionId'); + expect(event).not.toHaveProperty('connectionId'); + expect(event).not.toHaveProperty('partnerId'); + expect(event).toMatchObject({ action: 'TestAction', payload: { key: 'value' } }); + }); + + it('includes userId in the event when provided', () => { + const event = createClientEvent({ + level: 'info', + action: 'TestAction', + userId: 'user-123', + }); + + expect(event).toHaveProperty('userId', 'user-123'); + }); + + it('omits userId when not provided', () => { + const event = createClientEvent({ + level: 'info', + action: 'TestAction', + }); + + expect(event).not.toHaveProperty('userId'); + }); + + it('uses the same guid for all events from the same module (same page load)', () => { + const event1 = createClientEvent({ + level: 'info', + action: 'Error', + sessionId: 'sid-1', + connectionId: 'conn-1', + partnerId: 'partner-123', + }); + const event2 = createClientEvent({ + level: 'info', + action: 'Error', + sessionId: 'sid-1', + connectionId: 'conn-1', + timestamp: 1234567890, + partnerId: 'partner-123', + }); + + expect(event1.guid).toBe(event2.guid); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/event/createClientEvent.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/event/createClientEvent.ts new file mode 100644 index 00000000..29b2b04a --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/event/createClientEvent.ts @@ -0,0 +1,55 @@ +import type { ClientLogEvent } from '@common/types'; +import getAppVersion from '@utils/getAppVersion'; +import OT from '@vonage/client-sdk-video'; +import uniqueId from 'react-global-state-hooks/uniqueId'; + +/** Correlation id: same for all events from this page load. Enables grouping in Kibana. */ +const correlationIdForPageLoad = uniqueId('page-load:'); + +type ClientEventInput = { + level: ClientLogEvent['level']; + action: string; + payload?: Record; + sessionId?: string; + connectionId?: string; + partnerId?: string; + userId?: string; + variation?: string; + logVersion?: string; + timestamp?: number; + name?: string; + componentId?: string; +}; + +const getPlatform = () => ({ + userAgent: typeof navigator === 'undefined' ? '' : navigator.userAgent, + source: + typeof window !== 'undefined' && window.location?.origin ? window.location.origin : 'unknown', +}); + +/** + * Builds a ClientLogEvent from input, filling in guid, userAgent, source, clientVersion, etc. + * Uses input.timestamp or Date.now() for clientSystemTime. + */ +export function createClientEvent(input: ClientEventInput): ClientLogEvent { + const { userAgent, source } = getPlatform(); + return { + action: input.action, + variation: input.variation, + logVersion: input.logVersion ?? '2', + payload: input.payload, + clientSystemTime: input.timestamp ?? Date.now(), + level: input.level, + guid: correlationIdForPageLoad, + clientVersion: getAppVersion(), + sdkId: (OT as { version?: string }).version ?? 'unknown', + source, + userAgent, + name: input.name ?? 'vera', + componentId: input.componentId ?? 'vera', + ...(input.sessionId != null && { sessionId: input.sessionId }), + ...(input.connectionId != null && { connectionId: input.connectionId }), + ...(input.partnerId != null && { partnerId: input.partnerId }), + ...(input.userId != null && { userId: input.userId }), + }; +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/event/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/event/index.ts new file mode 100644 index 00000000..a1d0a711 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/event/index.ts @@ -0,0 +1 @@ +export { createClientEvent } from './createClientEvent'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/index.ts new file mode 100644 index 00000000..20d4e974 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/index.ts @@ -0,0 +1,3 @@ +import { FrontendLogger } from './FrontendLogger'; + +export default new FrontendLogger(); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/providers/backendLoggingProvider.spec.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/providers/backendLoggingProvider.spec.ts new file mode 100644 index 00000000..065e018d --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/providers/backendLoggingProvider.spec.ts @@ -0,0 +1,103 @@ +import { vi, describe, it, beforeEach, expect, type MockInstance } from 'vitest'; +import { BackendLoggingProvider } from './backendLoggingProvider'; + +const { MOCK_API_URL, MOCK_VERSION } = vi.hoisted(() => ({ + MOCK_API_URL: 'https://api.test', + MOCK_VERSION: 'vera-1.0.0-test', +})); + +vi.mock('../../utils/constants', () => ({ + API_URL: MOCK_API_URL, +})); + +vi.mock('../../utils/getAppVersion', () => ({ + default: () => MOCK_VERSION, +})); + +describe('BackendLoggingProvider', () => { + let fetchSpy: MockInstance< + [input: string | URL | Request, init?: RequestInit], + Promise + >; + + beforeEach(() => { + fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue({ ok: true } as Response); + Object.defineProperty(navigator, 'sendBeacon', { value: undefined, configurable: true }); + }); + + it('log() sends POST with ClientLogEvent shape and does not throw', () => { + const provider = new BackendLoggingProvider(); + + expect(() => { + provider.log('vonageVideoClient.connect.success', { + sessionId: 's1', + connectionId: 'c1', + partnerId: 'apiKey', + custom: 'data', + }); + }).not.toThrow(); + + expect(fetchSpy).toHaveBeenCalledWith( + `${MOCK_API_URL}/client-logs`, + expect.objectContaining({ + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + keepalive: true, + }) + ); + + const body = JSON.parse((fetchSpy.mock.calls[0][1] as RequestInit).body as string); + expect(body).toMatchObject({ + action: 'vonageVideoClient.connect.success', + variation: 'Success', + level: 'info', + clientVersion: MOCK_VERSION, + name: 'vera', + componentId: 'vera', + sessionId: 's1', + connectionId: 'c1', + partnerId: 'apiKey', + }); + expect(body.payload).toMatchObject({ custom: 'data' }); + expect(body.guid).toBeDefined(); + expect(body.clientSystemTime).toBeDefined(); + expect(body.userAgent).toBeDefined(); + }); + + it('reportError() sends POST with error payload and variation from error.name', () => { + const provider = new BackendLoggingProvider(); + const err = new Error('Something broke'); + + expect(() => { + provider.reportError(err, { sessionId: 's2', context: 'test' }); + }).not.toThrow(); + + expect(fetchSpy).toHaveBeenCalledWith( + `${MOCK_API_URL}/client-logs`, + expect.objectContaining({ + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + }) + ); + + const body = JSON.parse((fetchSpy.mock.calls[0][1] as RequestInit).body as string); + expect(body).toMatchObject({ + action: 'Error', + variation: 'Error', + level: 'error', + clientVersion: MOCK_VERSION, + sessionId: 's2', + }); + expect(body.payload).toMatchObject({ context: 'test' }); + }); + + it('reportError() uses error.name as variation for non-Error objects with name', () => { + const provider = new BackendLoggingProvider(); + const custom = Object.assign(new Error('msg'), { name: 'CustomError' }); + + provider.reportError(custom, {}); + + const body = JSON.parse((fetchSpy.mock.calls[0][1] as RequestInit).body as string); + expect(body.variation).toBe('CustomError'); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/providers/backendLoggingProvider.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/providers/backendLoggingProvider.ts new file mode 100644 index 00000000..1b76285c --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/providers/backendLoggingProvider.ts @@ -0,0 +1,11 @@ +import type { LoggerProviderConfig } from '@common/logger'; +import { BackendLogTransport } from '../transport'; + +export class BackendLoggingProvider implements LoggerProviderConfig { + private readonly transport = new BackendLogTransport(); + + verbose = false; + log = (...args: Parameters) => this.transport.log(...args); + reportError = (...args: Parameters) => + this.transport.reportError(...args); +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/providers/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/providers/index.ts new file mode 100644 index 00000000..44ef1ef1 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/providers/index.ts @@ -0,0 +1 @@ +export { BackendLoggingProvider } from './backendLoggingProvider'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/transport/backendLogTransport.spec.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/transport/backendLogTransport.spec.ts new file mode 100644 index 00000000..ef0bc3b2 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/transport/backendLogTransport.spec.ts @@ -0,0 +1,70 @@ +import { vi, describe, it, beforeEach, expect, type MockInstance } from 'vitest'; +import { BackendLogTransport } from './index'; + +const MOCK_API_URL = vi.hoisted(() => 'https://api.test'); + +vi.mock('../../utils/constants', () => ({ + API_URL: MOCK_API_URL, +})); + +vi.mock('../../utils/getAppVersion', () => ({ + default: () => 'vera-1.0.0-test', +})); + +describe('BackendLogTransport', () => { + let fetchSpy!: MockInstance< + [input: string | URL | Request, init?: RequestInit], + Promise + >; + let sendBeaconSpy!: ReturnType; + + beforeEach(() => { + fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue({ ok: true } as Response); + sendBeaconSpy = vi.fn().mockReturnValue(true); + Object.defineProperty(navigator, 'sendBeacon', { value: sendBeaconSpy, configurable: true }); + }); + + it('log() uses sendBeacon when available', () => { + const transport = new BackendLogTransport(); + transport.log('Test', { sessionId: 's1', connectionId: 'c1', partnerId: 'p1' }); + + expect(sendBeaconSpy).toHaveBeenCalledWith(`${MOCK_API_URL}/client-logs`, expect.any(Blob)); + const blob = sendBeaconSpy.mock.calls[0][1] as Blob; + expect(blob.type).toBe('application/json'); + expect(blob.size).toBeGreaterThan(0); + expect(fetchSpy).not.toHaveBeenCalled(); + }); + + it('log() falls back to fetch when sendBeacon unavailable', () => { + Object.defineProperty(navigator, 'sendBeacon', { value: undefined, configurable: true }); + const transport = new BackendLogTransport(); + transport.log('Test', { sessionId: 's1', connectionId: 'c1', partnerId: 'p1' }); + + expect(fetchSpy).toHaveBeenCalledWith( + `${MOCK_API_URL}/client-logs`, + expect.objectContaining({ + method: 'POST', + body: expect.any(String), + keepalive: true, + headers: { 'Content-Type': 'application/json' }, + }) + ); + }); + + it('log() does not throw when sendBeacon returns false', () => { + sendBeaconSpy.mockReturnValue(false); + const transport = new BackendLogTransport(); + + expect(() => transport.log('Test', {})).not.toThrow(); + }); + + it('reportError() uses sendBeacon when available', () => { + const transport = new BackendLogTransport(); + transport.reportError(new Error('Test error'), { sessionId: 's1' }); + + expect(sendBeaconSpy).toHaveBeenCalledWith(`${MOCK_API_URL}/client-logs`, expect.any(Blob)); + const blob = sendBeaconSpy.mock.calls[0][1] as Blob; + expect(blob.type).toBe('application/json'); + expect(blob.size).toBeGreaterThan(0); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/transport/backendLogTransport.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/transport/backendLogTransport.ts new file mode 100644 index 00000000..71bdeda9 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/transport/backendLogTransport.ts @@ -0,0 +1,84 @@ +import { API_URL } from '../../utils/constants'; +import isErrorLike from '@common/assertions/isErrorLike'; +import type { ClientLogEvent } from '@common/types'; +import { formatToStore } from 'json-storage-formatter'; +import { createClientEvent } from '../event'; + +/** + * Transport that POSTs ClientLogEvent to the backend. + * Uses sendBeacon for fire-and-forget telemetry; falls back to fetch with keepalive if unavailable. + */ +export class BackendLogTransport { + private readonly endpoint = `${API_URL}/client-logs`; + + log(event: string, extra?: Record): void { + const { sessionId, connectionId, partnerId, userId, ...rest } = (extra ?? {}) as Record< + string, + string | undefined + >; + const clientEvent = { + ...createClientEvent({ + level: 'info', + action: event, + sessionId, + connectionId, + partnerId, + userId, + payload: rest, + }), + variation: 'Success', + }; + this.send(clientEvent); + } + + reportError(error: unknown, extra?: Record): void { + const { sessionId, connectionId, partnerId, userId, ...rest } = (extra ?? {}) as Record< + string, + string | undefined + >; + const errorPayload = { + error: isErrorLike(error) + ? { + message: (error as Error).message, + name: (error as Error).name, + stack: (error as Error).stack, + } + : error, + ...rest, + }; + const clientEvent = { + ...createClientEvent({ + level: 'error', + action: 'Error', + sessionId, + connectionId, + partnerId, + userId, + payload: errorPayload, + }), + variation: isErrorLike(error) ? ((error as Error).name ?? 'Error') : 'Failure', + }; + this.send(clientEvent); + } + + private send(event: ClientLogEvent): void { + let body: string; + try { + body = formatToStore(event); + } catch { + body = '{"error":"[unserializable]"}'; + } + + if (typeof navigator !== 'undefined' && navigator.sendBeacon) { + navigator.sendBeacon(this.endpoint, new Blob([body], { type: 'application/json' })); + return; + } + + fetch(this.endpoint, { + method: 'POST', + body, + keepalive: true, + headers: { 'Content-Type': 'application/json' }, + }).catch(() => {}); + } +} diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/transport/index.ts b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/transport/index.ts new file mode 100644 index 00000000..bc67ba29 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/logger/transport/index.ts @@ -0,0 +1 @@ +export { BackendLogTransport } from './backendLogTransport'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/main.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/main.tsx new file mode 100644 index 00000000..05353f3f --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/main.tsx @@ -0,0 +1,30 @@ +// runs interceptors before vonage sdk initialize resources (XHR, navigator.mediaDevices clones, etc) +import '@core/interceptors'; + +// executes application setup before anything else (e.g. overrides, mocks, etc) +import './setup'; + +import ReactDOM from 'react-dom/client'; +import { registerIcon } from '@vonage/vivid'; +import App, { loggerProvider } from './App.jsx'; +import './i18n.js'; +import Logger from './logger'; + +// Register Vivid icons for use throughout the application +registerIcon(); + +/** + * The root HTML element where the React application is rendered. + * This element must exist in the DOM for the application to mount correctly. + */ +const rootElement = document.getElementById('root')!; + +const { onUncaughtError, onRecoverableError, onCaughtError } = Logger; + +Logger.setup(() => loggerProvider); + +ReactDOM.createRoot(rootElement, { + onUncaughtError, + onRecoverableError, + onCaughtError, +}).render(); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/ErrorBoundary/ErrorPage.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/ErrorBoundary/ErrorPage.spec.tsx new file mode 100644 index 00000000..b14f656e --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/ErrorBoundary/ErrorPage.spec.tsx @@ -0,0 +1,16 @@ +import { describe, expect, it } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import BrowserRouter from '@test/RouterWrapper'; +import ErrorPage from './ErrorPage'; + +describe('ErrorPage', () => { + it('should render', () => { + render( + + + + ); + + expect(screen.getByTestId('error-page')).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/ErrorBoundary/ErrorPage.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/ErrorBoundary/ErrorPage.tsx new file mode 100644 index 00000000..40fa2ea9 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/ErrorBoundary/ErrorPage.tsx @@ -0,0 +1,41 @@ +import type { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; + +type ErrorPageProps = { + error: Error; +}; + +/** + * ErrorPage + * + * Displayed by the root ErrorBoundary when the application throws an + * unrecoverable error (e.g. an invalid environment variable in env.ts). + * + * IMPORTANT: intentionally self-contained — must NOT import any component + * that transitively reads `env`, because `env` may be the broken `{} as Env` + * shell when this page is rendered (e.g. Banner → BannerLanguage → LanguageSelector → env). + * @param {ErrorPageProps} props + * @returns {ReactElement} + */ +const ErrorPage = ({ error }: ErrorPageProps): ReactElement => { + const { t } = useTranslation(); + + return ( +
        +
        +

        {t('errorPage.title')}

        + +

        {t('errorPage.description')}

        + +
        +          {error.message}
        +        
        +
        +
        + ); +}; + +export default ErrorPage; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/ErrorBoundary/index.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/ErrorBoundary/index.tsx new file mode 100644 index 00000000..e91e3b7d --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/ErrorBoundary/index.tsx @@ -0,0 +1 @@ +export { default as ErrorPage } from './ErrorPage'; diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/GoodBye/GoodBye.spec.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/GoodBye/GoodBye.spec.tsx new file mode 100644 index 00000000..4881431b --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/GoodBye/GoodBye.spec.tsx @@ -0,0 +1,153 @@ +import { beforeEach, describe, expect, it, Mock, vi } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import BrowserRouter from '@test/RouterWrapper'; +import GoodBye from './index'; +import useArchives from '../../hooks/useArchives'; +import { availableArchive, failedArchive, pendingArchive } from '../../api/archiving/tests/data'; + +vi.mock('../../hooks/useArchives'); +const mockUseArchives = useArchives as Mock<[], ReturnType>; + +vi.mock('react-router-dom', async () => { + const mod = await vi.importActual('react-router-dom'); + return { + ...mod, + useLocation: () => ({}), + }; +}); + +describe('GoodBye', () => { + beforeEach(() => { + mockUseArchives.mockReturnValue({ + data: { + items: [], + count: 0, + }, + error: null, + } as unknown as ReturnType); + }); + + it('should render', () => { + render( + + + + ); + + expect(screen.getByText('You have left the meeting')).toBeVisible(); + expect(screen.getByText('Thank you for joining!')).toBeVisible(); + }); + + it('should fetch and display archives', () => { + mockUseArchives.mockReturnValue({ + data: { items: [availableArchive, failedArchive, pendingArchive] }, + error: null, + } as unknown as ReturnType); + render( + + + + ); + expect(screen.getByText('We are processing your recording')).toBeVisible(); + expect(screen.getByTestId('archive-loading-spinner')).toBeVisible(); + }); + + it('should display "Rejoining the room" button', () => { + render( + + + + ); + expect(screen.getByText('Rejoining the room')).toBeVisible(); + }); + + it('should display "Go to landing page" button', () => { + render( + + + + ); + expect(screen.getByText('View Landing Page')).toBeVisible(); + }); + + it('should display empty message when there are no archives', () => { + mockUseArchives.mockReturnValue({ data: { items: [] }, error: null } as unknown as ReturnType< + typeof useArchives + >); + render( + + + + ); + expect(screen.getByText("The meeting hasn't been recorded")).toBeVisible(); + }); + + it('should display error message when archives fail to load', () => { + mockUseArchives.mockReturnValue({ + data: null, + error: new Error('Failed'), + } as unknown as ReturnType); + render( + + + + ); + expect( + screen.getByText('There was an error loading recordings for this meeting') + ).toBeVisible(); + }); + + it('should display available archive with download button', () => { + mockUseArchives.mockReturnValue({ + data: { items: [availableArchive] }, + error: null, + } as unknown as ReturnType); + render( + + + + ); + const listItem = screen.getByTestId(`archive-list-item-${availableArchive.id}`); + expect(listItem).toBeVisible(); + expect(screen.getByTestId('archive-download-button')).toBeVisible(); + }); + + it('should display failed archive with error icon', () => { + mockUseArchives.mockReturnValue({ + data: { items: [failedArchive] }, + error: null, + } as unknown as ReturnType); + render( + + + + ); + expect(screen.getByTestId('archive-error-icon')).toBeVisible(); + }); + + it('should display pending archive with loading spinner', () => { + mockUseArchives.mockReturnValue({ + data: { items: [pendingArchive] }, + error: null, + } as unknown as ReturnType); + render( + + + + ); + expect(screen.getByTestId('archive-loading-spinner')).toBeVisible(); + }); + + it('should display recordings section title', () => { + mockUseArchives.mockReturnValue({ + data: { items: [availableArchive] }, + error: null, + } as unknown as ReturnType); + render( + + + + ); + expect(screen.getByText('Download recordings')).toBeVisible(); + }); +}); diff --git a/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/GoodBye/GoodBye.tsx b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/GoodBye/GoodBye.tsx new file mode 100644 index 00000000..bbdde562 --- /dev/null +++ b/tutorials/vonage_video_ios_app-theme-customization/project/frontend/src/pages/GoodBye/GoodBye.tsx @@ -0,0 +1,63 @@ +import { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import PageLayout from '@ui/PageLayout'; +import Banner from '@components/Banner'; +import Footer from '@components/Footer/Footer'; +import ArchiveList from '../../components/GoodBye/ArchiveList'; +import GoodByeMessage from '../../components/GoodBye/GoodbyeMessage'; +import ReenterRoomButton from '@components/GoodBye/ReenterRoomButton'; +import GoToLandingPageButton from '@components/GoodBye/GoToLandingPageButton'; +import Card from '@ui/Card'; +import useGoodByePage from '../../hooks/useGoodByePage'; + +/** + * GoodBye Component + * + * This component displays a goodbye message when a user leaves the meeting room. + * It shows a banner, a set of salutations, and two buttons: + * - One to re-enter the room + * - One to go back to the landing page + * It also shows a list of archives available for download (if applicable). + * @returns {ReactElement} - the goodbye page. + */ +const GoodBye = (): ReactElement => { + const { t } = useTranslation(); + const { archives, header, caption, isSelfDeclinedRecording } = useGoodByePage(); + + return ( + + + + + + + + +
        + +

        + {t('goodBye.title')} +

        +
        + +
        + +
        + {!isSelfDeclinedRecording && ( + +

        + {t('archiveList.label')} +

        + +
        + )} +
        +
        + +

        9{UY!%!0;=gga>A@dIwjCJ@$|wq}_ZIui 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