From 10c7a7f383327075f222018432e1f1b79553efb8 Mon Sep 17 00:00:00 2001 From: Ben Teichman Date: Tue, 14 Jan 2025 16:33:27 -0500 Subject: [PATCH 1/2] chore: remove new widget code (DSN-2676) --- .circleci/continue-config.yml | 5 - apps/documentation/.gitignore | 13 - apps/documentation/CHANGELOG.md | 665 --- apps/documentation/README.md | 11 - apps/documentation/next.config.mjs | 13 - apps/documentation/package.json | 31 - apps/documentation/public/favicon.ico | Bin 25931 -> 0 bytes .../public/fonts/UCityProWeb-Bold.woff | Bin 49504 -> 0 bytes .../public/fonts/UCityProWeb-Bold.woff2 | Bin 40752 -> 0 bytes .../public/fonts/UCityProWeb-Regular.woff | Bin 49264 -> 0 bytes .../public/fonts/UCityProWeb-Regular.woff2 | Bin 40292 -> 0 bytes .../public/fonts/UCityProWeb-Semibold.woff | Bin 47016 -> 0 bytes .../public/fonts/UCityProWeb-Semibold.woff2 | Bin 38264 -> 0 bytes .../src/components/ChatScript/embedded.tsx | 36 - .../src/components/ChatScript/index.tsx | 36 - .../src/components/ClientRenderer/index.tsx | 19 - .../src/components/StoryEmbed.tsx | 64 - apps/documentation/src/fonts/GeistMonoVF.woff | Bin 67864 -> 0 bytes apps/documentation/src/fonts/GeistVF.woff | Bin 66268 -> 0 bytes .../src/pages/ProactiveMessage.tsx | 33 - apps/documentation/src/pages/_app.tsx | 13 - apps/documentation/src/pages/_document.tsx | 15 - apps/documentation/src/pages/_meta.js | 11 - apps/documentation/src/pages/api/hello.ts | 10 - apps/documentation/src/pages/atomic/_meta.js | 5 - .../src/pages/atomic/agent-message.mdx | 41 - .../documentation/src/pages/atomic/avatar.mdx | 11 - .../src/pages/atomic/buttons.mdx | 38 - .../src/pages/atomic/carousel-button.mdx | 11 - .../src/pages/atomic/feedback-button.mdx | 11 - .../src/pages/atomic/launcher.mdx | 25 - .../src/pages/atomic/message-input.mdx | 16 - .../src/pages/atomic/send-button.mdx | 12 - .../src/pages/atomic/typing-indicator.mdx | 13 - .../src/pages/atomic/welcome-message.mdx | 12 - apps/documentation/src/pages/chat.tsx | 49 - .../src/pages/compositions/footer.mdx | 35 - .../src/pages/compositions/voice-widget.mdx | 33 - .../compositions/widget-page-component.tsx | 36 - .../src/pages/compositions/widget.mdx | 5 - apps/documentation/src/pages/index.mdx | 1 - .../src/pages/molecules/card.mdx | 31 - .../src/pages/molecules/carousel.mdx | 8 - .../src/pages/molecules/header.mdx | 23 - .../src/pages/molecules/link-preview.mdx | 35 - .../src/pages/molecules/prompt.mdx | 9 - apps/documentation/src/pages/theme/color.mdx | 7 - apps/documentation/src/scripts/import-chat.sh | 14 - apps/documentation/src/styles/Home.module.css | 168 - apps/documentation/src/styles/globals.css | 69 - apps/documentation/src/theme.config.tsx | 28 - apps/documentation/tsconfig.build.json | 8 - apps/documentation/tsconfig.json | 19 - examples/live-chat/CHANGELOG.md | 328 -- examples/live-chat/README.md | 61 - examples/live-chat/example_project.vf | 1518 ------- examples/live-chat/index.html | 14 - examples/live-chat/package.json | 35 - .../shared/live-agent-platform.enum.ts | 3 - .../live-chat/shared/socket-event.enum.ts | 9 - examples/live-chat/src/config.ts | 84 - examples/live-chat/src/context.tsx | 24 - examples/live-chat/src/main.tsx | 13 - .../live-chat/src/traces/LiveAgent.trace.ts | 11 - examples/live-chat/src/use-live-agent.hook.ts | 141 - examples/live-chat/tsconfig.json | 13 - examples/live-chat/types/env.d.ts | 13 - examples/live-chat/vite.config.ts | 14 - package.json | 4 +- packages/chat/.babelrc.json | 3 - packages/chat/.dependency-cruiser.mjs | 12 - packages/chat/.gitignore | 1 - .../assets/fonts/ABCMaxiRound-Light.woff | Bin 91136 -> 0 bytes .../assets/fonts/ABCMaxiRound-Light.woff2 | Bin 46284 -> 0 bytes .../assets/fonts/UCityProWeb-Bold.woff | Bin 49504 -> 0 bytes .../assets/fonts/UCityProWeb-Bold.woff2 | Bin 40752 -> 0 bytes .../assets/fonts/UCityProWeb-Regular.woff | Bin 49264 -> 0 bytes .../assets/fonts/UCityProWeb-Regular.woff2 | Bin 40292 -> 0 bytes .../assets/fonts/UCityProWeb-Semibold.woff | Bin 47016 -> 0 bytes .../assets/fonts/UCityProWeb-Semibold.woff2 | Bin 38264 -> 0 bytes .../chat/.storybook/assets/fonts/fonts.css | 37 - packages/chat/.storybook/main.ts | 44 - packages/chat/.storybook/preview-head.html | 11 - packages/chat/.storybook/preview.tsx | 18 - packages/chat/CHANGELOG.md | 888 ---- packages/chat/README.md | 9 - .../__mocks__/@voiceflow/stitches-react.ts | 8 - packages/chat/chromatic.config.json | 3 - packages/chat/config/test/setup.ts | 1 - packages/chat/e2e/embedded.html | 42 - packages/chat/e2e/embedded.spec.ts | 12 - packages/chat/e2e/extensions.html | 122 - packages/chat/e2e/extensions.spec.ts | 118 - packages/chat/e2e/overlay.html | 29 - packages/chat/e2e/overlay.spec.ts | 38 - packages/chat/e2e/proactive.html | 30 - packages/chat/e2e/proactive.spec.ts | 21 - packages/chat/e2e/utils.ts | 12 - packages/chat/examples/index.html | 43 - packages/chat/package.json | 158 - packages/chat/playwright.config.ts | 33 - packages/chat/sonar-project.properties | 8 - packages/chat/src/__fixtures__/colors.ts | 15 - .../__fixtures__/default-launcher-image.png | Bin 15352 -> 0 bytes .../chat/src/__fixtures__/empty-image.png | Bin 5164 -> 0 bytes .../__fixtures__/markdown/code-response.md | 15 - .../src/__fixtures__/markdown/inline-code.md | 38 - .../chat/src/__fixtures__/markdown/lists.md | 106 - .../markdown/tables-quotes-rules.md | 90 - .../__fixtures__/markdown/text-treatment.md | 39 - packages/chat/src/__fixtures__/messages.ts | 94 - .../chat/src/__fixtures__/mock-assistant.ts | 73 - packages/chat/src/__fixtures__/tiled-bg.png | Bin 208 -> 0 bytes packages/chat/src/assets/blank-image.png | Bin 34261 -> 0 bytes packages/chat/src/assets/message.png | Bin 9282 -> 0 bytes packages/chat/src/assets/svg/ai.svg | 6 - packages/chat/src/assets/svg/arrow-down.svg | 3 - packages/chat/src/assets/svg/arrow-right.svg | 5 - packages/chat/src/assets/svg/checkmark.svg | 3 - packages/chat/src/assets/svg/close.svg | 3 - packages/chat/src/assets/svg/closeV2.svg | 5 - packages/chat/src/assets/svg/copy.svg | 8 - packages/chat/src/assets/svg/document-pdf.svg | 5 - packages/chat/src/assets/svg/document-url.svg | 10 - packages/chat/src/assets/svg/end-call.svg | 3 - packages/chat/src/assets/svg/index.ts | 24 - .../chat/src/assets/svg/large-arrow-left.svg | 5 - packages/chat/src/assets/svg/microphone.svg | 4 - packages/chat/src/assets/svg/minus.svg | 7 - packages/chat/src/assets/svg/mute.svg | 5 - packages/chat/src/assets/svg/phone.svg | 3 - packages/chat/src/assets/svg/reset.svg | 3 - .../chat/src/assets/svg/small-arrow-up.svg | 17 - packages/chat/src/assets/svg/sound-off.svg | 7 - packages/chat/src/assets/svg/sound.svg | 7 - packages/chat/src/assets/svg/stop.svg | 3 - packages/chat/src/assets/svg/thumbs-up.svg | 8 - packages/chat/src/assets/svg/top-caret.svg | 31 - packages/chat/src/assets/svg/voice.svg | 3 - packages/chat/src/assets/svg/volume.svg | 3 - packages/chat/src/assets/vf_chat.png | Bin 19784 -> 0 bytes packages/chat/src/assets/vf_logo.png | Bin 5290 -> 0 bytes .../AgentMessage/AgentMessage.css.ts | 145 - .../AgentMessage/AgentMessage.story.tsx | 143 - .../AgentMessage/CopyButton/CopyButton.css.ts | 21 - .../AgentMessage/CopyButton/index.tsx | 32 - .../src/components/AgentMessage/code-theme.ts | 159 - .../src/components/AgentMessage/index.tsx | 128 - .../src/components/Avatar/Avatar.story.tsx | 34 - packages/chat/src/components/Avatar/index.tsx | 44 - .../chat/src/components/Avatar/styles.css.ts | 44 - .../src/components/Button/Button.story.tsx | 80 - .../src/components/Button/Button.test.tsx | 15 - .../Button/ButtonIcon/ButtonIcon.css.ts | 24 - .../components/Button/ButtonIcon/index.tsx | 14 - .../chat/src/components/Button/constants.ts | 5 - packages/chat/src/components/Button/index.tsx | 33 - .../chat/src/components/Button/reset.css.ts | 13 - .../chat/src/components/Button/styles.css.ts | 113 - .../SquareButton/SquareButton.component.tsx | 25 - .../components/Buttons/SquareButton/index.ts | 6 - .../SquareButton/styles/SquareButton.css.ts | 109 - .../styles/SquareButtonTheme.css.ts | 31 - .../components/Buttons/SquareButton/types.ts | 14 - .../chat/src/components/Card/Card.story.tsx | 80 - packages/chat/src/components/Card/index.tsx | 52 - .../chat/src/components/Card/styles.css.ts | 61 - packages/chat/src/components/Card/types.ts | 40 - .../components/Carousel/Carousel.story.tsx | 166 - .../Carousel/CarouselButton.story.tsx | 26 - .../components/Carousel/CarouselButton.tsx | 48 - .../Carousel/carouselButtonStyles.css.ts | 186 - .../chat/src/components/Carousel/hooks.ts | 57 - .../chat/src/components/Carousel/index.tsx | 90 - .../src/components/Carousel/styles.css.ts | 45 - .../ColorTheme/ColorTheme.component.tsx | 23 - .../components/ColorTheme/ColorTheme.css.ts | 33 - .../ColorTheme/ColorTheme.story.tsx | 27 - .../src/components/DebugMessage/index.tsx | 23 - .../src/components/DebugMessage/styled.css.ts | 38 - .../src/components/DebugMessage/styles.css.ts | 38 - .../CopyButtonIcon.component.tsx | 11 - .../FeedbackButton/FeedbackButton.css.ts | 116 - .../FeedbackButton.interface.ts | 19 - .../FeedbackButton/FeedbackButton.story.tsx | 34 - .../FeedbackButton/FeedbackButton.test.tsx | 15 - .../ThumbsDownIcon.component.tsx | 11 - .../FeedbackButton/ThumbsUpIcon.component.tsx | 11 - .../src/components/FeedbackButton/index.tsx | 88 - .../src/components/Header/Header.story.tsx | 59 - packages/chat/src/components/Header/index.tsx | 68 - .../chat/src/components/Header/styles.css.ts | 112 - .../chat/src/components/Icon/Icon.story.tsx | 28 - packages/chat/src/components/Icon/index.tsx | 34 - .../chat/src/components/Icon/styles.css.ts | 5 - .../chat/src/components/Image/Image.story.tsx | 26 - packages/chat/src/components/Image/index.tsx | 39 - .../chat/src/components/Image/styles.css.ts | 27 - .../src/components/Launcher/ChevronIcon.tsx | 11 - .../components/Launcher/Launcher.story.tsx | 89 - .../Launcher/LauncherWithLabel/index.tsx | 116 - .../Launcher/LauncherWithLabel/styles.css.ts | 262 -- .../src/components/Launcher/PhoneIcon.tsx | 12 - .../chat/src/components/Launcher/constant.ts | 1 - .../chat/src/components/Launcher/index.tsx | 134 - .../src/components/Launcher/styles.css.ts | 303 -- .../LinkPreview/LinkPreview.story.tsx | 85 - .../chat/src/components/LinkPreview/index.tsx | 41 - .../src/components/LinkPreview/styles.css.ts | 167 - .../chat/src/components/LinkPreview/utils.ts | 24 - .../LoadingSpinner/LoadingSpinner.tsx | 52 - .../components/LoadingSpinner/styles.css.ts | 121 - .../src/components/MessageContainer/index.tsx | 16 - .../components/MessageContainer/styles.css.ts | 17 - .../MessageInput/AudioInputButton.tsx | 38 - .../MessageInput/MessageInput.css.ts | 144 - .../MessageInput/MessageInput.story.tsx | 71 - .../MessageInputTestStyles.css.ts | 27 - .../chat/src/components/MessageInput/hooks.ts | 105 - .../src/components/MessageInput/index.tsx | 104 - .../ChatContainer/ChatContainer.component.tsx | 28 - .../ChatContainer/ChatContainer.css.tsx | 29 - .../src/components/NewChat/NewChat.css.ts | 82 - .../src/components/NewChat/NewChat.story.tsx | 340 -- .../chat/src/components/NewChat/index.tsx | 132 - .../NewFooter/BottomLinks/BottomLinks.css.ts | 88 - .../NewFooter/BottomLinks/index.tsx | 48 - .../src/components/NewFooter/NewFooter.css.ts | 70 - .../components/NewFooter/NewFooter.story.tsx | 104 - .../ScrollButton/ScrollButton.css.ts | 36 - .../NewFooter/ScrollButton/index.tsx | 13 - .../chat/src/components/NewFooter/index.tsx | 71 - .../chat/src/components/Proactive/index.tsx | 62 - .../src/components/Proactive/styles.css.ts | 92 - .../src/components/Prompt/Prompt.story.tsx | 45 - packages/chat/src/components/Prompt/index.tsx | 60 - .../chat/src/components/Prompt/styles.css.ts | 66 - .../src/components/ScrollToBottom/index.tsx | 81 - .../components/ScrollToBottom/styles.css.ts | 52 - .../SendButton/SendButton.story.tsx | 28 - .../src/components/SendButton/SendIcon.tsx | 12 - .../chat/src/components/SendButton/index.tsx | 21 - .../src/components/SendButton/styles.css.ts | 57 - .../components/Separator/Separator.story.tsx | 18 - .../chat/src/components/Separator/index.tsx | 9 - .../src/components/Separator/styles.css.ts | 28 - .../SystemResponse/ExtensionMessage.tsx | 41 - .../SystemResponse/Indicator/Indicator.css.ts | 7 - .../Indicator/Indicator.story.tsx | 26 - .../SystemResponse/Indicator/Indicator.tsx | 22 - .../SystemResponse/SystemMessage.tsx | 114 - .../SystemResponse/SystemResponse.story.tsx | 197 - .../components/SystemResponse/constants.ts | 10 - .../src/components/SystemResponse/hooks.ts | 106 - .../src/components/SystemResponse/index.tsx | 182 - .../components/SystemResponse/state/end.tsx | 16 - .../components/SystemResponse/styles.css.ts | 91 - .../src/components/SystemResponse/types.ts | 58 - .../src/components/Tooltip/Tooltip.story.tsx | 40 - .../chat/src/components/Tooltip/index.tsx | 30 - .../chat/src/components/Tooltip/styled.css.ts | 37 - .../chat/src/components/Tooltip/styles.css.ts | 37 - .../TypingIndicator/TypingIndicator.story.tsx | 53 - .../src/components/TypingIndicator/index.tsx | 18 - .../components/TypingIndicator/styles.css.ts | 56 - .../UserResponse/UserResponse.story.tsx | 57 - .../src/components/UserResponse/index.tsx | 67 - .../src/components/UserResponse/styles.css.ts | 50 - .../VoiceWidget/MockVoiceWidgetImage.tsx | 33 - .../VoiceWidget/MovingGradient.component.tsx | 133 - .../VoiceWidget/ShrinkingCircle.component.tsx | 53 - .../VoiceWidget/ShrinkingCircle.css.ts | 11 - .../components/VoiceWidget/VoiceWidget.css.ts | 236 - .../VoiceWidget/VoiceWidget.story.tsx | 99 - .../WaveformVisualizer.component.tsx | 92 - .../chat/src/components/VoiceWidget/index.tsx | 149 - .../VoiceWidget/use-microphone-amplitude.tsx | 60 - .../WelcomeMessage/WelcomeMessage.css.ts | 93 - .../WelcomeMessage/WelcomeMessage.story.tsx | 53 - .../src/components/WelcomeMessage/index.tsx | 52 - packages/chat/src/components/index.ts | 25 - packages/chat/src/constant/voice.constant.ts | 9 - packages/chat/src/constants.ts | 34 - .../chat/src/contexts/AutoScrollContext.tsx | 47 - .../RuntimeContext/audio-controller.ts | 40 - .../src/contexts/RuntimeContext/index.tsx | 25 - .../src/contexts/RuntimeContext/messages.ts | 106 - .../RuntimeContext/runtime.utils.test.ts | 54 - .../contexts/RuntimeContext/runtime.utils.ts | 27 - .../contexts/RuntimeContext/silent-audio.ts | 2 - .../traces/EffectExtensions.trace.ts | 29 - .../RuntimeContext/traces/NoReply.trace.ts | 25 - .../traces/ResponseExtensions.trace.ts | 22 - .../src/contexts/RuntimeContext/useNoReply.ts | 29 - .../contexts/RuntimeContext/useRuntimeAPI.ts | 86 - .../RuntimeContext/useRuntimeState.ts | 248 - packages/chat/src/contexts/index.ts | 2 - packages/chat/src/device.ts | 23 - .../chat/src/dtos/AssistantOptions.dto.ts | 40 - packages/chat/src/dtos/ChatConfig.dto.test.ts | 80 - packages/chat/src/dtos/ChatConfig.dto.ts | 122 - packages/chat/src/dtos/Extension.dto.ts | 34 - packages/chat/src/dtos/Palette.dto.ts | 20 - .../chat/src/dtos/RenderOptions.dto.test.ts | 40 - packages/chat/src/dtos/RenderOptions.dto.ts | 53 - .../chat/src/dtos/WidgetOverrides.dto.test.ts | 13 - packages/chat/src/dtos/WidgetOverrides.dto.ts | 100 - packages/chat/src/fixtures.ts | 5 - packages/chat/src/hooks/cache.hook.ts | 29 - packages/chat/src/hooks/index.ts | 6 - packages/chat/src/hooks/useAutoScroll.ts | 11 - packages/chat/src/hooks/useChatAPI.ts | 37 - packages/chat/src/hooks/useDidUpdateEffect.ts | 15 - packages/chat/src/hooks/usePalette.ts | 15 - packages/chat/src/hooks/useStateRef.ts | 27 - packages/chat/src/hooks/useStorage.ts | 65 - packages/chat/src/main.ts | 15 - packages/chat/src/stories.ts | 18 - packages/chat/src/storybook/decorators.tsx | 34 - packages/chat/src/styles.css | 345 -- .../chat/src/styles/animation-utils.css.ts | 13 - packages/chat/src/styles/animations.ts | 40 - packages/chat/src/styles/box-shadows.ts | 18 - packages/chat/src/styles/colors.css.ts | 9 - packages/chat/src/styles/colors.ts | 205 - packages/chat/src/styles/font.ts | 18 - packages/chat/src/styles/shadow.ts | 8 - packages/chat/src/styles/sizes.ts | 18 - packages/chat/src/styles/transitions.ts | 19 - packages/chat/src/types/index.ts | 15 - packages/chat/src/types/session.ts | 23 - packages/chat/src/types/settings.ts | 22 - packages/chat/src/types/trace.ts | 6 - packages/chat/src/types/turn.ts | 20 - packages/chat/src/types/util.ts | 1 - packages/chat/src/types/variants.ts | 10 - packages/chat/src/utils/actions.ts | 19 - packages/chat/src/utils/assistant.test.ts | 227 - packages/chat/src/utils/assistant.ts | 117 - packages/chat/src/utils/broadcast.ts | 46 - packages/chat/src/utils/chat.ts | 18 - packages/chat/src/utils/functional.ts | 7 - packages/chat/src/utils/isObject.ts | 3 - packages/chat/src/utils/session.ts | 65 - packages/chat/src/utils/stylesheet.ts | 45 - packages/chat/src/utils/url.ts | 34 - packages/chat/src/views/ChatEmbed/index.tsx | 37 - .../src/views/ChatWidget/ChatWidget.story.tsx | 110 - packages/chat/src/views/ChatWidget/index.tsx | 173 - .../chat/src/views/ChatWidget/styles.css.ts | 155 - packages/chat/src/views/ChatWindow/index.tsx | 131 - .../VoiceWidget/VoiceWidget.interface.ts | 3 - .../views/VoiceWidget/VoiceWidget.view.tsx | 47 - .../hooks/use-voice-service.hook.ts | 8 - .../VoiceWidget/services/audio.service.ts | 182 - .../VoiceWidget/services/recorder.service.ts | 85 - .../VoiceWidget/services/socket.service.ts | 143 - .../VoiceWidget/services/voice.service.ts | 131 - packages/chat/src/views/index.ts | 3 - packages/chat/src/widget.tsx | 79 - packages/chat/tsconfig.build.json | 5 - packages/chat/tsconfig.json | 14 - packages/chat/typings/env.d.ts | 2 - packages/chat/typings/global.d.ts | 33 - packages/chat/vite.package.config.ts | 47 - packages/chat/vite.widget.config.ts | 75 - packages/chat/vitest.config.ts | 17 - packages/react-chat/package.json | 2 +- packages/sdk-runtime/.dependency-cruiser.mjs | 3 - packages/sdk-runtime/CHANGELOG.md | 332 -- packages/sdk-runtime/package.json | 41 - packages/sdk-runtime/sonar-project.properties | 6 - packages/sdk-runtime/src/main.ts | 3 - packages/sdk-runtime/src/runtime/index.ts | 5 - .../src/runtime/runtime.interface.ts | 121 - .../src/runtime/runtime.service.auth.ts | 46 - .../src/runtime/runtime.service.prototype.ts | 52 - .../src/runtime/runtime.service.public.ts | 74 - .../src/runtime/runtime.service.ts | 66 - packages/sdk-runtime/src/sdk/index.ts | 2 - packages/sdk-runtime/src/sdk/sdk.interface.ts | 4 - packages/sdk-runtime/src/sdk/sdk.service.ts | 57 - .../src/trace/components/card.component.ts | 5 - .../src/trace/components/cardV2.component.ts | 5 - .../src/trace/components/choice.component.ts | 5 - .../src/trace/components/end.component.ts | 5 - .../sdk-runtime/src/trace/components/index.ts | 8 - .../src/trace/components/speak.component.ts | 5 - .../src/trace/components/stream.component.ts | 5 - .../src/trace/components/text.component.ts | 5 - .../src/trace/components/visual.component.ts | 9 - packages/sdk-runtime/src/trace/index.ts | 4 - .../sdk-runtime/src/trace/trace.component.ts | 21 - .../sdk-runtime/src/trace/trace.interface.ts | 21 - .../sdk-runtime/src/trace/trace.service.ts | 34 - packages/sdk-runtime/tsconfig.build.cjs.json | 8 - packages/sdk-runtime/tsconfig.build.esm.json | 11 - packages/sdk-runtime/tsconfig.build.json | 6 - packages/sdk-runtime/tsconfig.json | 15 - yarn.lock | 3971 +---------------- 400 files changed, 67 insertions(+), 24697 deletions(-) delete mode 100644 apps/documentation/.gitignore delete mode 100644 apps/documentation/CHANGELOG.md delete mode 100644 apps/documentation/README.md delete mode 100644 apps/documentation/next.config.mjs delete mode 100644 apps/documentation/package.json delete mode 100644 apps/documentation/public/favicon.ico delete mode 100644 apps/documentation/public/fonts/UCityProWeb-Bold.woff delete mode 100644 apps/documentation/public/fonts/UCityProWeb-Bold.woff2 delete mode 100644 apps/documentation/public/fonts/UCityProWeb-Regular.woff delete mode 100644 apps/documentation/public/fonts/UCityProWeb-Regular.woff2 delete mode 100644 apps/documentation/public/fonts/UCityProWeb-Semibold.woff delete mode 100644 apps/documentation/public/fonts/UCityProWeb-Semibold.woff2 delete mode 100644 apps/documentation/src/components/ChatScript/embedded.tsx delete mode 100644 apps/documentation/src/components/ChatScript/index.tsx delete mode 100644 apps/documentation/src/components/ClientRenderer/index.tsx delete mode 100644 apps/documentation/src/components/StoryEmbed.tsx delete mode 100644 apps/documentation/src/fonts/GeistMonoVF.woff delete mode 100644 apps/documentation/src/fonts/GeistVF.woff delete mode 100644 apps/documentation/src/pages/ProactiveMessage.tsx delete mode 100644 apps/documentation/src/pages/_app.tsx delete mode 100644 apps/documentation/src/pages/_document.tsx delete mode 100644 apps/documentation/src/pages/_meta.js delete mode 100644 apps/documentation/src/pages/api/hello.ts delete mode 100644 apps/documentation/src/pages/atomic/_meta.js delete mode 100644 apps/documentation/src/pages/atomic/agent-message.mdx delete mode 100644 apps/documentation/src/pages/atomic/avatar.mdx delete mode 100644 apps/documentation/src/pages/atomic/buttons.mdx delete mode 100644 apps/documentation/src/pages/atomic/carousel-button.mdx delete mode 100644 apps/documentation/src/pages/atomic/feedback-button.mdx delete mode 100644 apps/documentation/src/pages/atomic/launcher.mdx delete mode 100644 apps/documentation/src/pages/atomic/message-input.mdx delete mode 100644 apps/documentation/src/pages/atomic/send-button.mdx delete mode 100644 apps/documentation/src/pages/atomic/typing-indicator.mdx delete mode 100644 apps/documentation/src/pages/atomic/welcome-message.mdx delete mode 100644 apps/documentation/src/pages/chat.tsx delete mode 100644 apps/documentation/src/pages/compositions/footer.mdx delete mode 100644 apps/documentation/src/pages/compositions/voice-widget.mdx delete mode 100644 apps/documentation/src/pages/compositions/widget-page-component.tsx delete mode 100644 apps/documentation/src/pages/compositions/widget.mdx delete mode 100644 apps/documentation/src/pages/index.mdx delete mode 100644 apps/documentation/src/pages/molecules/card.mdx delete mode 100644 apps/documentation/src/pages/molecules/carousel.mdx delete mode 100644 apps/documentation/src/pages/molecules/header.mdx delete mode 100644 apps/documentation/src/pages/molecules/link-preview.mdx delete mode 100644 apps/documentation/src/pages/molecules/prompt.mdx delete mode 100644 apps/documentation/src/pages/theme/color.mdx delete mode 100755 apps/documentation/src/scripts/import-chat.sh delete mode 100644 apps/documentation/src/styles/Home.module.css delete mode 100644 apps/documentation/src/styles/globals.css delete mode 100644 apps/documentation/src/theme.config.tsx delete mode 100644 apps/documentation/tsconfig.build.json delete mode 100644 apps/documentation/tsconfig.json delete mode 100644 examples/live-chat/CHANGELOG.md delete mode 100644 examples/live-chat/README.md delete mode 100644 examples/live-chat/example_project.vf delete mode 100644 examples/live-chat/index.html delete mode 100644 examples/live-chat/package.json delete mode 100644 examples/live-chat/shared/live-agent-platform.enum.ts delete mode 100644 examples/live-chat/shared/socket-event.enum.ts delete mode 100644 examples/live-chat/src/config.ts delete mode 100644 examples/live-chat/src/context.tsx delete mode 100644 examples/live-chat/src/main.tsx delete mode 100644 examples/live-chat/src/traces/LiveAgent.trace.ts delete mode 100644 examples/live-chat/src/use-live-agent.hook.ts delete mode 100644 examples/live-chat/tsconfig.json delete mode 100644 examples/live-chat/types/env.d.ts delete mode 100644 examples/live-chat/vite.config.ts delete mode 100644 packages/chat/.babelrc.json delete mode 100644 packages/chat/.dependency-cruiser.mjs delete mode 100644 packages/chat/.gitignore delete mode 100644 packages/chat/.storybook/assets/fonts/ABCMaxiRound-Light.woff delete mode 100644 packages/chat/.storybook/assets/fonts/ABCMaxiRound-Light.woff2 delete mode 100644 packages/chat/.storybook/assets/fonts/UCityProWeb-Bold.woff delete mode 100644 packages/chat/.storybook/assets/fonts/UCityProWeb-Bold.woff2 delete mode 100644 packages/chat/.storybook/assets/fonts/UCityProWeb-Regular.woff delete mode 100644 packages/chat/.storybook/assets/fonts/UCityProWeb-Regular.woff2 delete mode 100644 packages/chat/.storybook/assets/fonts/UCityProWeb-Semibold.woff delete mode 100644 packages/chat/.storybook/assets/fonts/UCityProWeb-Semibold.woff2 delete mode 100644 packages/chat/.storybook/assets/fonts/fonts.css delete mode 100644 packages/chat/.storybook/main.ts delete mode 100644 packages/chat/.storybook/preview-head.html delete mode 100644 packages/chat/.storybook/preview.tsx delete mode 100644 packages/chat/CHANGELOG.md delete mode 100644 packages/chat/README.md delete mode 100644 packages/chat/__mocks__/@voiceflow/stitches-react.ts delete mode 100644 packages/chat/chromatic.config.json delete mode 100644 packages/chat/config/test/setup.ts delete mode 100644 packages/chat/e2e/embedded.html delete mode 100644 packages/chat/e2e/embedded.spec.ts delete mode 100644 packages/chat/e2e/extensions.html delete mode 100644 packages/chat/e2e/extensions.spec.ts delete mode 100644 packages/chat/e2e/overlay.html delete mode 100644 packages/chat/e2e/overlay.spec.ts delete mode 100644 packages/chat/e2e/proactive.html delete mode 100644 packages/chat/e2e/proactive.spec.ts delete mode 100644 packages/chat/e2e/utils.ts delete mode 100644 packages/chat/examples/index.html delete mode 100644 packages/chat/package.json delete mode 100644 packages/chat/playwright.config.ts delete mode 100644 packages/chat/sonar-project.properties delete mode 100644 packages/chat/src/__fixtures__/colors.ts delete mode 100644 packages/chat/src/__fixtures__/default-launcher-image.png delete mode 100644 packages/chat/src/__fixtures__/empty-image.png delete mode 100644 packages/chat/src/__fixtures__/markdown/code-response.md delete mode 100644 packages/chat/src/__fixtures__/markdown/inline-code.md delete mode 100644 packages/chat/src/__fixtures__/markdown/lists.md delete mode 100644 packages/chat/src/__fixtures__/markdown/tables-quotes-rules.md delete mode 100644 packages/chat/src/__fixtures__/markdown/text-treatment.md delete mode 100644 packages/chat/src/__fixtures__/messages.ts delete mode 100644 packages/chat/src/__fixtures__/mock-assistant.ts delete mode 100644 packages/chat/src/__fixtures__/tiled-bg.png delete mode 100644 packages/chat/src/assets/blank-image.png delete mode 100644 packages/chat/src/assets/message.png delete mode 100644 packages/chat/src/assets/svg/ai.svg delete mode 100644 packages/chat/src/assets/svg/arrow-down.svg delete mode 100644 packages/chat/src/assets/svg/arrow-right.svg delete mode 100644 packages/chat/src/assets/svg/checkmark.svg delete mode 100644 packages/chat/src/assets/svg/close.svg delete mode 100644 packages/chat/src/assets/svg/closeV2.svg delete mode 100644 packages/chat/src/assets/svg/copy.svg delete mode 100644 packages/chat/src/assets/svg/document-pdf.svg delete mode 100644 packages/chat/src/assets/svg/document-url.svg delete mode 100644 packages/chat/src/assets/svg/end-call.svg delete mode 100644 packages/chat/src/assets/svg/index.ts delete mode 100644 packages/chat/src/assets/svg/large-arrow-left.svg delete mode 100644 packages/chat/src/assets/svg/microphone.svg delete mode 100644 packages/chat/src/assets/svg/minus.svg delete mode 100644 packages/chat/src/assets/svg/mute.svg delete mode 100644 packages/chat/src/assets/svg/phone.svg delete mode 100644 packages/chat/src/assets/svg/reset.svg delete mode 100644 packages/chat/src/assets/svg/small-arrow-up.svg delete mode 100644 packages/chat/src/assets/svg/sound-off.svg delete mode 100644 packages/chat/src/assets/svg/sound.svg delete mode 100644 packages/chat/src/assets/svg/stop.svg delete mode 100644 packages/chat/src/assets/svg/thumbs-up.svg delete mode 100644 packages/chat/src/assets/svg/top-caret.svg delete mode 100644 packages/chat/src/assets/svg/voice.svg delete mode 100644 packages/chat/src/assets/svg/volume.svg delete mode 100644 packages/chat/src/assets/vf_chat.png delete mode 100644 packages/chat/src/assets/vf_logo.png delete mode 100644 packages/chat/src/components/AgentMessage/AgentMessage.css.ts delete mode 100644 packages/chat/src/components/AgentMessage/AgentMessage.story.tsx delete mode 100644 packages/chat/src/components/AgentMessage/CopyButton/CopyButton.css.ts delete mode 100644 packages/chat/src/components/AgentMessage/CopyButton/index.tsx delete mode 100644 packages/chat/src/components/AgentMessage/code-theme.ts delete mode 100644 packages/chat/src/components/AgentMessage/index.tsx delete mode 100644 packages/chat/src/components/Avatar/Avatar.story.tsx delete mode 100644 packages/chat/src/components/Avatar/index.tsx delete mode 100644 packages/chat/src/components/Avatar/styles.css.ts delete mode 100644 packages/chat/src/components/Button/Button.story.tsx delete mode 100644 packages/chat/src/components/Button/Button.test.tsx delete mode 100644 packages/chat/src/components/Button/ButtonIcon/ButtonIcon.css.ts delete mode 100644 packages/chat/src/components/Button/ButtonIcon/index.tsx delete mode 100644 packages/chat/src/components/Button/constants.ts delete mode 100644 packages/chat/src/components/Button/index.tsx delete mode 100644 packages/chat/src/components/Button/reset.css.ts delete mode 100644 packages/chat/src/components/Button/styles.css.ts delete mode 100644 packages/chat/src/components/Buttons/SquareButton/SquareButton.component.tsx delete mode 100644 packages/chat/src/components/Buttons/SquareButton/index.ts delete mode 100644 packages/chat/src/components/Buttons/SquareButton/styles/SquareButton.css.ts delete mode 100644 packages/chat/src/components/Buttons/SquareButton/styles/SquareButtonTheme.css.ts delete mode 100644 packages/chat/src/components/Buttons/SquareButton/types.ts delete mode 100644 packages/chat/src/components/Card/Card.story.tsx delete mode 100644 packages/chat/src/components/Card/index.tsx delete mode 100644 packages/chat/src/components/Card/styles.css.ts delete mode 100644 packages/chat/src/components/Card/types.ts delete mode 100644 packages/chat/src/components/Carousel/Carousel.story.tsx delete mode 100644 packages/chat/src/components/Carousel/CarouselButton.story.tsx delete mode 100644 packages/chat/src/components/Carousel/CarouselButton.tsx delete mode 100644 packages/chat/src/components/Carousel/carouselButtonStyles.css.ts delete mode 100644 packages/chat/src/components/Carousel/hooks.ts delete mode 100644 packages/chat/src/components/Carousel/index.tsx delete mode 100644 packages/chat/src/components/Carousel/styles.css.ts delete mode 100644 packages/chat/src/components/ColorTheme/ColorTheme.component.tsx delete mode 100644 packages/chat/src/components/ColorTheme/ColorTheme.css.ts delete mode 100644 packages/chat/src/components/ColorTheme/ColorTheme.story.tsx delete mode 100644 packages/chat/src/components/DebugMessage/index.tsx delete mode 100644 packages/chat/src/components/DebugMessage/styled.css.ts delete mode 100644 packages/chat/src/components/DebugMessage/styles.css.ts delete mode 100644 packages/chat/src/components/FeedbackButton/CopyButtonIcon.component.tsx delete mode 100644 packages/chat/src/components/FeedbackButton/FeedbackButton.css.ts delete mode 100644 packages/chat/src/components/FeedbackButton/FeedbackButton.interface.ts delete mode 100644 packages/chat/src/components/FeedbackButton/FeedbackButton.story.tsx delete mode 100644 packages/chat/src/components/FeedbackButton/FeedbackButton.test.tsx delete mode 100644 packages/chat/src/components/FeedbackButton/ThumbsDownIcon.component.tsx delete mode 100644 packages/chat/src/components/FeedbackButton/ThumbsUpIcon.component.tsx delete mode 100644 packages/chat/src/components/FeedbackButton/index.tsx delete mode 100644 packages/chat/src/components/Header/Header.story.tsx delete mode 100644 packages/chat/src/components/Header/index.tsx delete mode 100644 packages/chat/src/components/Header/styles.css.ts delete mode 100644 packages/chat/src/components/Icon/Icon.story.tsx delete mode 100644 packages/chat/src/components/Icon/index.tsx delete mode 100644 packages/chat/src/components/Icon/styles.css.ts delete mode 100644 packages/chat/src/components/Image/Image.story.tsx delete mode 100644 packages/chat/src/components/Image/index.tsx delete mode 100644 packages/chat/src/components/Image/styles.css.ts delete mode 100644 packages/chat/src/components/Launcher/ChevronIcon.tsx delete mode 100644 packages/chat/src/components/Launcher/Launcher.story.tsx delete mode 100644 packages/chat/src/components/Launcher/LauncherWithLabel/index.tsx delete mode 100644 packages/chat/src/components/Launcher/LauncherWithLabel/styles.css.ts delete mode 100644 packages/chat/src/components/Launcher/PhoneIcon.tsx delete mode 100644 packages/chat/src/components/Launcher/constant.ts delete mode 100644 packages/chat/src/components/Launcher/index.tsx delete mode 100644 packages/chat/src/components/Launcher/styles.css.ts delete mode 100644 packages/chat/src/components/LinkPreview/LinkPreview.story.tsx delete mode 100644 packages/chat/src/components/LinkPreview/index.tsx delete mode 100644 packages/chat/src/components/LinkPreview/styles.css.ts delete mode 100644 packages/chat/src/components/LinkPreview/utils.ts delete mode 100644 packages/chat/src/components/LoadingSpinner/LoadingSpinner.tsx delete mode 100644 packages/chat/src/components/LoadingSpinner/styles.css.ts delete mode 100644 packages/chat/src/components/MessageContainer/index.tsx delete mode 100644 packages/chat/src/components/MessageContainer/styles.css.ts delete mode 100644 packages/chat/src/components/MessageInput/AudioInputButton.tsx delete mode 100644 packages/chat/src/components/MessageInput/MessageInput.css.ts delete mode 100644 packages/chat/src/components/MessageInput/MessageInput.story.tsx delete mode 100644 packages/chat/src/components/MessageInput/MessageInputTestStyles.css.ts delete mode 100644 packages/chat/src/components/MessageInput/hooks.ts delete mode 100644 packages/chat/src/components/MessageInput/index.tsx delete mode 100644 packages/chat/src/components/NewChat/ChatContainer/ChatContainer.component.tsx delete mode 100644 packages/chat/src/components/NewChat/ChatContainer/ChatContainer.css.tsx delete mode 100644 packages/chat/src/components/NewChat/NewChat.css.ts delete mode 100644 packages/chat/src/components/NewChat/NewChat.story.tsx delete mode 100644 packages/chat/src/components/NewChat/index.tsx delete mode 100644 packages/chat/src/components/NewFooter/BottomLinks/BottomLinks.css.ts delete mode 100644 packages/chat/src/components/NewFooter/BottomLinks/index.tsx delete mode 100644 packages/chat/src/components/NewFooter/NewFooter.css.ts delete mode 100644 packages/chat/src/components/NewFooter/NewFooter.story.tsx delete mode 100644 packages/chat/src/components/NewFooter/ScrollButton/ScrollButton.css.ts delete mode 100644 packages/chat/src/components/NewFooter/ScrollButton/index.tsx delete mode 100644 packages/chat/src/components/NewFooter/index.tsx delete mode 100644 packages/chat/src/components/Proactive/index.tsx delete mode 100644 packages/chat/src/components/Proactive/styles.css.ts delete mode 100644 packages/chat/src/components/Prompt/Prompt.story.tsx delete mode 100644 packages/chat/src/components/Prompt/index.tsx delete mode 100644 packages/chat/src/components/Prompt/styles.css.ts delete mode 100644 packages/chat/src/components/ScrollToBottom/index.tsx delete mode 100644 packages/chat/src/components/ScrollToBottom/styles.css.ts delete mode 100644 packages/chat/src/components/SendButton/SendButton.story.tsx delete mode 100644 packages/chat/src/components/SendButton/SendIcon.tsx delete mode 100644 packages/chat/src/components/SendButton/index.tsx delete mode 100644 packages/chat/src/components/SendButton/styles.css.ts delete mode 100644 packages/chat/src/components/Separator/Separator.story.tsx delete mode 100644 packages/chat/src/components/Separator/index.tsx delete mode 100644 packages/chat/src/components/Separator/styles.css.ts delete mode 100644 packages/chat/src/components/SystemResponse/ExtensionMessage.tsx delete mode 100644 packages/chat/src/components/SystemResponse/Indicator/Indicator.css.ts delete mode 100644 packages/chat/src/components/SystemResponse/Indicator/Indicator.story.tsx delete mode 100644 packages/chat/src/components/SystemResponse/Indicator/Indicator.tsx delete mode 100644 packages/chat/src/components/SystemResponse/SystemMessage.tsx delete mode 100644 packages/chat/src/components/SystemResponse/SystemResponse.story.tsx delete mode 100644 packages/chat/src/components/SystemResponse/constants.ts delete mode 100644 packages/chat/src/components/SystemResponse/hooks.ts delete mode 100644 packages/chat/src/components/SystemResponse/index.tsx delete mode 100644 packages/chat/src/components/SystemResponse/state/end.tsx delete mode 100644 packages/chat/src/components/SystemResponse/styles.css.ts delete mode 100644 packages/chat/src/components/SystemResponse/types.ts delete mode 100644 packages/chat/src/components/Tooltip/Tooltip.story.tsx delete mode 100644 packages/chat/src/components/Tooltip/index.tsx delete mode 100644 packages/chat/src/components/Tooltip/styled.css.ts delete mode 100644 packages/chat/src/components/Tooltip/styles.css.ts delete mode 100644 packages/chat/src/components/TypingIndicator/TypingIndicator.story.tsx delete mode 100644 packages/chat/src/components/TypingIndicator/index.tsx delete mode 100644 packages/chat/src/components/TypingIndicator/styles.css.ts delete mode 100644 packages/chat/src/components/UserResponse/UserResponse.story.tsx delete mode 100644 packages/chat/src/components/UserResponse/index.tsx delete mode 100644 packages/chat/src/components/UserResponse/styles.css.ts delete mode 100644 packages/chat/src/components/VoiceWidget/MockVoiceWidgetImage.tsx delete mode 100644 packages/chat/src/components/VoiceWidget/MovingGradient.component.tsx delete mode 100644 packages/chat/src/components/VoiceWidget/ShrinkingCircle.component.tsx delete mode 100644 packages/chat/src/components/VoiceWidget/ShrinkingCircle.css.ts delete mode 100644 packages/chat/src/components/VoiceWidget/VoiceWidget.css.ts delete mode 100644 packages/chat/src/components/VoiceWidget/VoiceWidget.story.tsx delete mode 100644 packages/chat/src/components/VoiceWidget/WaveformVisualizer.component.tsx delete mode 100644 packages/chat/src/components/VoiceWidget/index.tsx delete mode 100644 packages/chat/src/components/VoiceWidget/use-microphone-amplitude.tsx delete mode 100644 packages/chat/src/components/WelcomeMessage/WelcomeMessage.css.ts delete mode 100644 packages/chat/src/components/WelcomeMessage/WelcomeMessage.story.tsx delete mode 100644 packages/chat/src/components/WelcomeMessage/index.tsx delete mode 100644 packages/chat/src/components/index.ts delete mode 100644 packages/chat/src/constant/voice.constant.ts delete mode 100644 packages/chat/src/constants.ts delete mode 100644 packages/chat/src/contexts/AutoScrollContext.tsx delete mode 100644 packages/chat/src/contexts/RuntimeContext/audio-controller.ts delete mode 100644 packages/chat/src/contexts/RuntimeContext/index.tsx delete mode 100644 packages/chat/src/contexts/RuntimeContext/messages.ts delete mode 100644 packages/chat/src/contexts/RuntimeContext/runtime.utils.test.ts delete mode 100644 packages/chat/src/contexts/RuntimeContext/runtime.utils.ts delete mode 100644 packages/chat/src/contexts/RuntimeContext/silent-audio.ts delete mode 100644 packages/chat/src/contexts/RuntimeContext/traces/EffectExtensions.trace.ts delete mode 100644 packages/chat/src/contexts/RuntimeContext/traces/NoReply.trace.ts delete mode 100644 packages/chat/src/contexts/RuntimeContext/traces/ResponseExtensions.trace.ts delete mode 100644 packages/chat/src/contexts/RuntimeContext/useNoReply.ts delete mode 100644 packages/chat/src/contexts/RuntimeContext/useRuntimeAPI.ts delete mode 100644 packages/chat/src/contexts/RuntimeContext/useRuntimeState.ts delete mode 100644 packages/chat/src/contexts/index.ts delete mode 100644 packages/chat/src/device.ts delete mode 100644 packages/chat/src/dtos/AssistantOptions.dto.ts delete mode 100644 packages/chat/src/dtos/ChatConfig.dto.test.ts delete mode 100644 packages/chat/src/dtos/ChatConfig.dto.ts delete mode 100644 packages/chat/src/dtos/Extension.dto.ts delete mode 100644 packages/chat/src/dtos/Palette.dto.ts delete mode 100644 packages/chat/src/dtos/RenderOptions.dto.test.ts delete mode 100644 packages/chat/src/dtos/RenderOptions.dto.ts delete mode 100644 packages/chat/src/dtos/WidgetOverrides.dto.test.ts delete mode 100644 packages/chat/src/dtos/WidgetOverrides.dto.ts delete mode 100644 packages/chat/src/fixtures.ts delete mode 100644 packages/chat/src/hooks/cache.hook.ts delete mode 100644 packages/chat/src/hooks/index.ts delete mode 100644 packages/chat/src/hooks/useAutoScroll.ts delete mode 100644 packages/chat/src/hooks/useChatAPI.ts delete mode 100644 packages/chat/src/hooks/useDidUpdateEffect.ts delete mode 100644 packages/chat/src/hooks/usePalette.ts delete mode 100644 packages/chat/src/hooks/useStateRef.ts delete mode 100644 packages/chat/src/hooks/useStorage.ts delete mode 100644 packages/chat/src/main.ts delete mode 100644 packages/chat/src/stories.ts delete mode 100644 packages/chat/src/storybook/decorators.tsx delete mode 100644 packages/chat/src/styles.css delete mode 100644 packages/chat/src/styles/animation-utils.css.ts delete mode 100644 packages/chat/src/styles/animations.ts delete mode 100644 packages/chat/src/styles/box-shadows.ts delete mode 100644 packages/chat/src/styles/colors.css.ts delete mode 100644 packages/chat/src/styles/colors.ts delete mode 100644 packages/chat/src/styles/font.ts delete mode 100644 packages/chat/src/styles/shadow.ts delete mode 100644 packages/chat/src/styles/sizes.ts delete mode 100644 packages/chat/src/styles/transitions.ts delete mode 100644 packages/chat/src/types/index.ts delete mode 100644 packages/chat/src/types/session.ts delete mode 100644 packages/chat/src/types/settings.ts delete mode 100644 packages/chat/src/types/trace.ts delete mode 100644 packages/chat/src/types/turn.ts delete mode 100644 packages/chat/src/types/util.ts delete mode 100644 packages/chat/src/types/variants.ts delete mode 100644 packages/chat/src/utils/actions.ts delete mode 100644 packages/chat/src/utils/assistant.test.ts delete mode 100644 packages/chat/src/utils/assistant.ts delete mode 100644 packages/chat/src/utils/broadcast.ts delete mode 100644 packages/chat/src/utils/chat.ts delete mode 100644 packages/chat/src/utils/functional.ts delete mode 100644 packages/chat/src/utils/isObject.ts delete mode 100644 packages/chat/src/utils/session.ts delete mode 100644 packages/chat/src/utils/stylesheet.ts delete mode 100644 packages/chat/src/utils/url.ts delete mode 100644 packages/chat/src/views/ChatEmbed/index.tsx delete mode 100644 packages/chat/src/views/ChatWidget/ChatWidget.story.tsx delete mode 100644 packages/chat/src/views/ChatWidget/index.tsx delete mode 100644 packages/chat/src/views/ChatWidget/styles.css.ts delete mode 100644 packages/chat/src/views/ChatWindow/index.tsx delete mode 100644 packages/chat/src/views/VoiceWidget/VoiceWidget.interface.ts delete mode 100644 packages/chat/src/views/VoiceWidget/VoiceWidget.view.tsx delete mode 100644 packages/chat/src/views/VoiceWidget/hooks/use-voice-service.hook.ts delete mode 100644 packages/chat/src/views/VoiceWidget/services/audio.service.ts delete mode 100644 packages/chat/src/views/VoiceWidget/services/recorder.service.ts delete mode 100644 packages/chat/src/views/VoiceWidget/services/socket.service.ts delete mode 100644 packages/chat/src/views/VoiceWidget/services/voice.service.ts delete mode 100644 packages/chat/src/views/index.ts delete mode 100644 packages/chat/src/widget.tsx delete mode 100644 packages/chat/tsconfig.build.json delete mode 100644 packages/chat/tsconfig.json delete mode 100644 packages/chat/typings/env.d.ts delete mode 100644 packages/chat/typings/global.d.ts delete mode 100644 packages/chat/vite.package.config.ts delete mode 100644 packages/chat/vite.widget.config.ts delete mode 100644 packages/chat/vitest.config.ts delete mode 100644 packages/sdk-runtime/.dependency-cruiser.mjs delete mode 100644 packages/sdk-runtime/CHANGELOG.md delete mode 100644 packages/sdk-runtime/package.json delete mode 100644 packages/sdk-runtime/sonar-project.properties delete mode 100644 packages/sdk-runtime/src/main.ts delete mode 100644 packages/sdk-runtime/src/runtime/index.ts delete mode 100644 packages/sdk-runtime/src/runtime/runtime.interface.ts delete mode 100644 packages/sdk-runtime/src/runtime/runtime.service.auth.ts delete mode 100644 packages/sdk-runtime/src/runtime/runtime.service.prototype.ts delete mode 100644 packages/sdk-runtime/src/runtime/runtime.service.public.ts delete mode 100644 packages/sdk-runtime/src/runtime/runtime.service.ts delete mode 100644 packages/sdk-runtime/src/sdk/index.ts delete mode 100644 packages/sdk-runtime/src/sdk/sdk.interface.ts delete mode 100644 packages/sdk-runtime/src/sdk/sdk.service.ts delete mode 100644 packages/sdk-runtime/src/trace/components/card.component.ts delete mode 100644 packages/sdk-runtime/src/trace/components/cardV2.component.ts delete mode 100644 packages/sdk-runtime/src/trace/components/choice.component.ts delete mode 100644 packages/sdk-runtime/src/trace/components/end.component.ts delete mode 100644 packages/sdk-runtime/src/trace/components/index.ts delete mode 100644 packages/sdk-runtime/src/trace/components/speak.component.ts delete mode 100644 packages/sdk-runtime/src/trace/components/stream.component.ts delete mode 100644 packages/sdk-runtime/src/trace/components/text.component.ts delete mode 100644 packages/sdk-runtime/src/trace/components/visual.component.ts delete mode 100644 packages/sdk-runtime/src/trace/index.ts delete mode 100644 packages/sdk-runtime/src/trace/trace.component.ts delete mode 100644 packages/sdk-runtime/src/trace/trace.interface.ts delete mode 100644 packages/sdk-runtime/src/trace/trace.service.ts delete mode 100644 packages/sdk-runtime/tsconfig.build.cjs.json delete mode 100644 packages/sdk-runtime/tsconfig.build.esm.json delete mode 100644 packages/sdk-runtime/tsconfig.build.json delete mode 100644 packages/sdk-runtime/tsconfig.json diff --git a/.circleci/continue-config.yml b/.circleci/continue-config.yml index dcc9db1c55..423267c19a 100644 --- a/.circleci/continue-config.yml +++ b/.circleci/continue-config.yml @@ -106,11 +106,6 @@ jobs: from: packages/react-chat/dist to: s3://cdn.voiceflow.com/widget clean_destination: false - - vfcommon/clone_s3_assets: - step_name: Uploading New React Chat to CDN - from: packages/chat/dist - to: s3://cdn.voiceflow.com/widget-next - clean_destination: false workflows: test-and-release: diff --git a/apps/documentation/.gitignore b/apps/documentation/.gitignore deleted file mode 100644 index 4d5b8ed843..0000000000 --- a/apps/documentation/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -# next.js -/out/ -.next - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts - -# Bundled chat package -public/bundle diff --git a/apps/documentation/CHANGELOG.md b/apps/documentation/CHANGELOG.md deleted file mode 100644 index d56429c161..0000000000 --- a/apps/documentation/CHANGELOG.md +++ /dev/null @@ -1,665 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [0.35.8](https://github.com/voiceflow/react-chat/compare/documentation@0.35.7...documentation@0.35.8) (2025-01-13) - -**Note:** Version bump only for package documentation - -## [0.35.7](https://github.com/voiceflow/react-chat/compare/documentation@0.35.6...documentation@0.35.7) (2025-01-10) - -### Bug Fixes - -* hide/show chat callbacks (DSN-2664) ([#514](https://github.com/voiceflow/react-chat/issues/514)) ([c183dad](https://github.com/voiceflow/react-chat/commit/c183dad69d9e91cf2aa15092da12d6f8269d66a9)) - -## [0.35.6](https://github.com/voiceflow/react-chat/compare/documentation@0.35.5...documentation@0.35.6) (2025-01-10) - -**Note:** Version bump only for package documentation - -## [0.35.5](https://github.com/voiceflow/react-chat/compare/documentation@0.35.4...documentation@0.35.5) (2025-01-10) - -**Note:** Version bump only for package documentation - -## [0.35.4](https://github.com/voiceflow/react-chat/compare/documentation@0.35.3...documentation@0.35.4) (2025-01-10) - -**Note:** Version bump only for package documentation - -## [0.35.3](https://github.com/voiceflow/react-chat/compare/documentation@0.35.2...documentation@0.35.3) (2025-01-08) - -**Note:** Version bump only for package documentation - -## [0.35.2](https://github.com/voiceflow/react-chat/compare/documentation@0.35.1...documentation@0.35.2) (2025-01-08) - -**Note:** Version bump only for package documentation - -## [0.35.1](https://github.com/voiceflow/react-chat/compare/documentation@0.35.0...documentation@0.35.1) (2025-01-08) - -**Note:** Version bump only for package documentation - -# [0.35.0](https://github.com/voiceflow/react-chat/compare/documentation@0.34.5...documentation@0.35.0) (2025-01-07) - -### Features - -* use new test-env (COR-0000) ([#494](https://github.com/voiceflow/react-chat/issues/494)) ([f3676ec](https://github.com/voiceflow/react-chat/commit/f3676ec3856cff82bc90f0ad70aa3c5ceba4f100)) - -## [0.34.5](https://github.com/voiceflow/react-chat/compare/documentation@0.34.4...documentation@0.34.5) (2025-01-07) - -**Note:** Version bump only for package documentation - -## [0.34.4](https://github.com/voiceflow/react-chat/compare/documentation@0.34.3...documentation@0.34.4) (2025-01-07) - -**Note:** Version bump only for package documentation - -## [0.34.3](https://github.com/voiceflow/react-chat/compare/documentation@0.34.2...documentation@0.34.3) (2025-01-07) - -**Note:** Version bump only for package documentation - -## [0.34.2](https://github.com/voiceflow/react-chat/compare/documentation@0.34.1...documentation@0.34.2) (2025-01-03) - -### Bug Fixes - -* carousel hitbox edges fix (COR-4364) ([#486](https://github.com/voiceflow/react-chat/issues/486)) ([eb119f0](https://github.com/voiceflow/react-chat/commit/eb119f0aaa94065196c130cb3da26299cc6fbdbd)) - -## [0.34.1](https://github.com/voiceflow/react-chat/compare/documentation@0.34.0...documentation@0.34.1) (2025-01-03) - -**Note:** Version bump only for package documentation - -# [0.34.0](https://github.com/voiceflow/react-chat/compare/documentation@0.33.18...documentation@0.34.0) (2024-12-18) - -### Features - -* add animations to proactive messages (COR-4271) ([#471](https://github.com/voiceflow/react-chat/issues/471)) ([04c0363](https://github.com/voiceflow/react-chat/commit/04c0363ac04ec34147941beef3443643e7e3ba6b)) - -## [0.33.18](https://github.com/voiceflow/react-chat/compare/documentation@0.33.17...documentation@0.33.18) (2024-12-18) - -**Note:** Version bump only for package documentation - -## [0.33.17](https://github.com/voiceflow/react-chat/compare/documentation@0.33.16...documentation@0.33.17) (2024-12-17) - -**Note:** Version bump only for package documentation - -## [0.33.16](https://github.com/voiceflow/react-chat/compare/documentation@0.33.15...documentation@0.33.16) (2024-12-16) - -**Note:** Version bump only for package documentation - -## [0.33.15](https://github.com/voiceflow/react-chat/compare/documentation@0.33.14...documentation@0.33.15) (2024-12-16) - -### Bug Fixes - -* Launcher with label only spacing (COR-4241) ([#464](https://github.com/voiceflow/react-chat/issues/464)) ([3e0ba57](https://github.com/voiceflow/react-chat/commit/3e0ba57c526086927936d3bde946b581df516d5f)) - -## [0.33.14](https://github.com/voiceflow/react-chat/compare/documentation@0.33.13...documentation@0.33.14) (2024-12-13) - -**Note:** Version bump only for package documentation - -## [0.33.13](https://github.com/voiceflow/react-chat/compare/documentation@0.33.12...documentation@0.33.13) (2024-12-13) - -### Bug Fixes - -* fixing the docs app (COR-4237) ([#460](https://github.com/voiceflow/react-chat/issues/460)) ([378e328](https://github.com/voiceflow/react-chat/commit/378e328b2a98c478ca44b68985b5c8714b10f314)) - -## [0.33.12](https://github.com/voiceflow/react-chat/compare/documentation@0.33.11...documentation@0.33.12) (2024-12-13) - -**Note:** Version bump only for package documentation - -## [0.33.11](https://github.com/voiceflow/react-chat/compare/documentation@0.33.10...documentation@0.33.11) (2024-12-12) - -**Note:** Version bump only for package documentation - -## [0.33.10](https://github.com/voiceflow/react-chat/compare/documentation@0.33.9...documentation@0.33.10) (2024-12-12) - -**Note:** Version bump only for package documentation - -## [0.33.9](https://github.com/voiceflow/react-chat/compare/documentation@0.33.8...documentation@0.33.9) (2024-12-12) - -**Note:** Version bump only for package documentation - -## [0.33.8](https://github.com/voiceflow/react-chat/compare/documentation@0.33.7...documentation@0.33.8) (2024-12-12) - -**Note:** Version bump only for package documentation - -## [0.33.7](https://github.com/voiceflow/react-chat/compare/documentation@0.33.6...documentation@0.33.7) (2024-12-12) - -**Note:** Version bump only for package documentation - -## [0.33.6](https://github.com/voiceflow/react-chat/compare/documentation@0.33.5...documentation@0.33.6) (2024-12-11) - -**Note:** Version bump only for package documentation - -## [0.33.5](https://github.com/voiceflow/react-chat/compare/documentation@0.33.4...documentation@0.33.5) (2024-12-11) - -**Note:** Version bump only for package documentation - -## [0.33.4](https://github.com/voiceflow/react-chat/compare/documentation@0.33.3...documentation@0.33.4) (2024-12-11) - -**Note:** Version bump only for package documentation - -## [0.33.3](https://github.com/voiceflow/react-chat/compare/documentation@0.33.2...documentation@0.33.3) (2024-12-09) - -**Note:** Version bump only for package documentation - -## [0.33.2](https://github.com/voiceflow/react-chat/compare/documentation@0.33.1...documentation@0.33.2) (2024-12-09) - -**Note:** Version bump only for package documentation - -## [0.33.1](https://github.com/voiceflow/react-chat/compare/documentation@0.33.0...documentation@0.33.1) (2024-12-09) - -**Note:** Version bump only for package documentation - -# [0.33.0](https://github.com/voiceflow/react-chat/compare/documentation@0.32.5...documentation@0.33.0) (2024-12-09) - -### Features - -* Improve Launcher w/ Label animations (DSN-2522) ([#424](https://github.com/voiceflow/react-chat/issues/424)) ([40e4512](https://github.com/voiceflow/react-chat/commit/40e451219eee93641a878ad2529fec9ef60d2b74)) - -## [0.32.5](https://github.com/voiceflow/react-chat/compare/documentation@0.32.4...documentation@0.32.5) (2024-12-06) - -**Note:** Version bump only for package documentation - -## [0.32.4](https://github.com/voiceflow/react-chat/compare/documentation@0.32.3...documentation@0.32.4) (2024-12-06) - -**Note:** Version bump only for package documentation - -## [0.32.3](https://github.com/voiceflow/react-chat/compare/documentation@0.32.2...documentation@0.32.3) (2024-12-06) - -**Note:** Version bump only for package documentation - -## [0.32.2](https://github.com/voiceflow/react-chat/compare/documentation@0.32.1...documentation@0.32.2) (2024-12-06) - -**Note:** Version bump only for package documentation - -## [0.32.1](https://github.com/voiceflow/react-chat/compare/documentation@0.32.0...documentation@0.32.1) (2024-12-06) - -**Note:** Version bump only for package documentation - -# [0.32.0](https://github.com/voiceflow/react-chat/compare/documentation@0.31.7...documentation@0.32.0) (2024-12-06) - -### Features - -* use test-env general-runtime url (COR-0000) ([#412](https://github.com/voiceflow/react-chat/issues/412)) ([ebd6d49](https://github.com/voiceflow/react-chat/commit/ebd6d4971cd6c020201fa255f7427f7c477f4314)) - -## [0.31.7](https://github.com/voiceflow/react-chat/compare/documentation@0.31.6...documentation@0.31.7) (2024-12-05) - -**Note:** Version bump only for package documentation - -## [0.31.6](https://github.com/voiceflow/react-chat/compare/documentation@0.31.5...documentation@0.31.6) (2024-12-05) - -**Note:** Version bump only for package documentation - -## [0.31.5](https://github.com/voiceflow/react-chat/compare/documentation@0.31.4...documentation@0.31.5) (2024-12-04) - -**Note:** Version bump only for package documentation - -## [0.31.4](https://github.com/voiceflow/react-chat/compare/documentation@0.31.3...documentation@0.31.4) (2024-12-04) - -**Note:** Version bump only for package documentation - -## [0.31.3](https://github.com/voiceflow/react-chat/compare/documentation@0.31.2...documentation@0.31.3) (2024-12-04) - -**Note:** Version bump only for package documentation - -## [0.31.2](https://github.com/voiceflow/react-chat/compare/documentation@0.31.1...documentation@0.31.2) (2024-12-03) - -**Note:** Version bump only for package documentation - -## [0.31.1](https://github.com/voiceflow/react-chat/compare/documentation@0.31.0...documentation@0.31.1) (2024-12-03) - -**Note:** Version bump only for package documentation - -# [0.31.0](https://github.com/voiceflow/react-chat/compare/documentation@0.30.24...documentation@0.31.0) (2024-12-03) - -### Features - -* use new WidgetSettings object for chat configuration ([#376](https://github.com/voiceflow/react-chat/issues/376)) ([43ebd19](https://github.com/voiceflow/react-chat/commit/43ebd19bf4e8d31fbddd8c39a05335d25056ad31)) - -## [0.30.24](https://github.com/voiceflow/react-chat/compare/documentation@0.30.23...documentation@0.30.24) (2024-12-03) - -**Note:** Version bump only for package documentation - -## [0.30.23](https://github.com/voiceflow/react-chat/compare/documentation@0.30.22...documentation@0.30.23) (2024-11-28) - -**Note:** Version bump only for package documentation - -## [0.30.22](https://github.com/voiceflow/react-chat/compare/documentation@0.30.21...documentation@0.30.22) (2024-11-28) - -**Note:** Version bump only for package documentation - -## [0.30.21](https://github.com/voiceflow/react-chat/compare/documentation@0.30.20...documentation@0.30.21) (2024-11-28) - -**Note:** Version bump only for package documentation - -## [0.30.20](https://github.com/voiceflow/react-chat/compare/documentation@0.30.19...documentation@0.30.20) (2024-11-27) - -**Note:** Version bump only for package documentation - -## [0.30.19](https://github.com/voiceflow/react-chat/compare/documentation@0.30.18...documentation@0.30.19) (2024-11-26) - -**Note:** Version bump only for package documentation - -## [0.30.18](https://github.com/voiceflow/react-chat/compare/documentation@0.30.17...documentation@0.30.18) (2024-11-26) - -**Note:** Version bump only for package documentation - -## [0.30.17](https://github.com/voiceflow/react-chat/compare/documentation@0.30.16...documentation@0.30.17) (2024-11-25) - -**Note:** Version bump only for package documentation - -## [0.30.16](https://github.com/voiceflow/react-chat/compare/documentation@0.30.15...documentation@0.30.16) (2024-11-25) - -**Note:** Version bump only for package documentation - -## [0.30.15](https://github.com/voiceflow/react-chat/compare/documentation@0.30.14...documentation@0.30.15) (2024-11-25) - -**Note:** Version bump only for package documentation - -## [0.30.14](https://github.com/voiceflow/react-chat/compare/documentation@0.30.13...documentation@0.30.14) (2024-11-25) - -**Note:** Version bump only for package documentation - -## [0.30.13](https://github.com/voiceflow/react-chat/compare/documentation@0.30.12...documentation@0.30.13) (2024-11-25) - -**Note:** Version bump only for package documentation - -## [0.30.12](https://github.com/voiceflow/react-chat/compare/documentation@0.30.11...documentation@0.30.12) (2024-11-25) - -**Note:** Version bump only for package documentation - -## [0.30.11](https://github.com/voiceflow/react-chat/compare/documentation@0.30.10...documentation@0.30.11) (2024-11-25) - -**Note:** Version bump only for package documentation - -## [0.30.10](https://github.com/voiceflow/react-chat/compare/documentation@0.30.9...documentation@0.30.10) (2024-11-25) - -**Note:** Version bump only for package documentation - -## [0.30.9](https://github.com/voiceflow/react-chat/compare/documentation@0.30.8...documentation@0.30.9) (2024-11-21) - -**Note:** Version bump only for package documentation - -## [0.30.8](https://github.com/voiceflow/react-chat/compare/documentation@0.30.7...documentation@0.30.8) (2024-11-20) - -**Note:** Version bump only for package documentation - -## [0.30.7](https://github.com/voiceflow/react-chat/compare/documentation@0.30.6...documentation@0.30.7) (2024-11-20) - -**Note:** Version bump only for package documentation - -## [0.30.6](https://github.com/voiceflow/react-chat/compare/documentation@0.30.5...documentation@0.30.6) (2024-11-19) - -**Note:** Version bump only for package documentation - -## [0.30.5](https://github.com/voiceflow/react-chat/compare/documentation@0.30.4...documentation@0.30.5) (2024-11-19) - -**Note:** Version bump only for package documentation - -## [0.30.4](https://github.com/voiceflow/react-chat/compare/documentation@0.30.3...documentation@0.30.4) (2024-11-19) - -**Note:** Version bump only for package documentation - -## [0.30.3](https://github.com/voiceflow/react-chat/compare/documentation@0.30.2...documentation@0.30.3) (2024-11-19) - -**Note:** Version bump only for package documentation - -## [0.30.2](https://github.com/voiceflow/react-chat/compare/documentation@0.30.1...documentation@0.30.2) (2024-11-19) - -**Note:** Version bump only for package documentation - -## [0.30.1](https://github.com/voiceflow/react-chat/compare/documentation@0.30.0...documentation@0.30.1) (2024-11-18) - -**Note:** Version bump only for package documentation - -# [0.30.0](https://github.com/voiceflow/react-chat/compare/documentation@0.29.9...documentation@0.30.0) (2024-11-18) - -### Features - -* release next react-chat library (DSN-2545) ([#316](https://github.com/voiceflow/react-chat/issues/316)) ([65722df](https://github.com/voiceflow/react-chat/commit/65722dfb438bc918bfb4fbb33aa0fc7c730eac38)) - -## [0.29.9](https://github.com/voiceflow/react-chat/compare/documentation@0.29.8...documentation@0.29.9) (2024-11-15) - -**Note:** Version bump only for package documentation - -## [0.29.8](https://github.com/voiceflow/react-chat/compare/documentation@0.29.7...documentation@0.29.8) (2024-11-15) - -### Bug Fixes - -* message container and feedback button fixes (COR-0000) ([#317](https://github.com/voiceflow/react-chat/issues/317)) ([bac51a5](https://github.com/voiceflow/react-chat/commit/bac51a550357092a5d2e40a1cda37b09d0fc2394)) - -## [0.29.7](https://github.com/voiceflow/react-chat/compare/documentation@0.29.6...documentation@0.29.7) (2024-11-14) - -### Bug Fixes - -* Random fixes (DSN-000) ([#309](https://github.com/voiceflow/react-chat/issues/309)) ([e8cdd6e](https://github.com/voiceflow/react-chat/commit/e8cdd6eeaba2075f28d8bd2443b85b3c98d0963e)) - -## [0.29.6](https://github.com/voiceflow/react-chat/compare/documentation@0.29.5...documentation@0.29.6) (2024-11-14) - -**Note:** Version bump only for package documentation - -## [0.29.5](https://github.com/voiceflow/react-chat/compare/documentation@0.29.4...documentation@0.29.5) (2024-11-14) - -**Note:** Version bump only for package documentation - -## [0.29.4](https://github.com/voiceflow/react-chat/compare/documentation@0.29.3...documentation@0.29.4) (2024-11-13) - -**Note:** Version bump only for package documentation - -## [0.29.3](https://github.com/voiceflow/react-chat/compare/documentation@0.29.2...documentation@0.29.3) (2024-11-13) - -**Note:** Version bump only for package documentation - -## [0.29.2](https://github.com/voiceflow/react-chat/compare/documentation@0.29.1...documentation@0.29.2) (2024-11-13) - -### Bug Fixes - -* docs dark mode (DSN-2542) ([#304](https://github.com/voiceflow/react-chat/issues/304)) ([1deeb5a](https://github.com/voiceflow/react-chat/commit/1deeb5aedaae2b38cc6f7c740148f8d845577d55)) - -## [0.29.1](https://github.com/voiceflow/react-chat/compare/documentation@0.29.0...documentation@0.29.1) (2024-11-12) - -**Note:** Version bump only for package documentation - -# [0.29.0](https://github.com/voiceflow/react-chat/compare/documentation@0.28.2...documentation@0.29.0) (2024-11-12) - -### Features - -* cross browser stuff (COR-3860) ([#301](https://github.com/voiceflow/react-chat/issues/301)) ([10587c3](https://github.com/voiceflow/react-chat/commit/10587c31a6c5e97687f0b0d0282bdf7c369bd785)) - -## [0.28.2](https://github.com/voiceflow/react-chat/compare/documentation@0.28.1...documentation@0.28.2) (2024-11-12) - -**Note:** Version bump only for package documentation - -## [0.28.1](https://github.com/voiceflow/react-chat/compare/documentation@0.28.0...documentation@0.28.1) (2024-11-12) - -**Note:** Version bump only for package documentation - -# [0.28.0](https://github.com/voiceflow/react-chat/compare/documentation@0.27.0...documentation@0.28.0) (2024-11-11) - -### Features - -* Feedback + Copy Button (DSN-2499) ([#290](https://github.com/voiceflow/react-chat/issues/290)) ([a0c4649](https://github.com/voiceflow/react-chat/commit/a0c4649eb0e8b53ef3321cb5f10b31ef593d31c3)) - -# [0.27.0](https://github.com/voiceflow/react-chat/compare/documentation@0.26.0...documentation@0.27.0) (2024-11-11) - -### Features - -* adjust chat to work in embedded mode as well (COR-3851) ([#293](https://github.com/voiceflow/react-chat/issues/293)) ([cdcaaf9](https://github.com/voiceflow/react-chat/commit/cdcaaf97b98851068af74672f3d38ab98f0c72c2)) - -# [0.26.0](https://github.com/voiceflow/react-chat/compare/documentation@0.25.1...documentation@0.26.0) (2024-11-11) - -### Features - -* import built chat instead of building ourselves (COR-0000) ([#291](https://github.com/voiceflow/react-chat/issues/291)) ([1fd9e37](https://github.com/voiceflow/react-chat/commit/1fd9e371a12fe02207660d3907b3a27dc5ca6b95)) - -## [0.25.1](https://github.com/voiceflow/react-chat/compare/documentation@0.25.0...documentation@0.25.1) (2024-11-08) - -### Bug Fixes - -* button wrapping behaviour (DSN-2510) ([#280](https://github.com/voiceflow/react-chat/issues/280)) ([9a74dc7](https://github.com/voiceflow/react-chat/commit/9a74dc79eebf3bdd2521b5922807eda9202c8bc5)) - -# [0.25.0](https://github.com/voiceflow/react-chat/compare/documentation@0.24.4...documentation@0.25.0) (2024-11-08) - -### Features - -* add TypingIndicator to the docs (COR-0000) ([#276](https://github.com/voiceflow/react-chat/issues/276)) ([205e910](https://github.com/voiceflow/react-chat/commit/205e910f3b5672a7598ffb2e0682e2178d059b16)) -* powered by Voiceflow is a link now (DSN-2505) ([#285](https://github.com/voiceflow/react-chat/issues/285)) ([7d4ea15](https://github.com/voiceflow/react-chat/commit/7d4ea15eefc9c5ce5c4c11c3aea8f3985df72ebc)) -* ui review for footer (COR-3751) ([#273](https://github.com/voiceflow/react-chat/issues/273)) ([235debb](https://github.com/voiceflow/react-chat/commit/235debb51219f196867b146adf1395603fa7128b)) - -## [0.24.4](https://github.com/voiceflow/react-chat/compare/documentation@0.24.3...documentation@0.24.4) (2024-11-08) - -**Note:** Version bump only for package documentation - -## [0.24.3](https://github.com/voiceflow/react-chat/compare/documentation@0.24.2...documentation@0.24.3) (2024-11-07) - -**Note:** Version bump only for package documentation - -## [0.24.2](https://github.com/voiceflow/react-chat/compare/documentation@0.24.1...documentation@0.24.2) (2024-11-07) - -### Bug Fixes - -* header actions (COR-3811) ([#278](https://github.com/voiceflow/react-chat/issues/278)) ([95cc945](https://github.com/voiceflow/react-chat/commit/95cc945f1f79c81da3932bbb0c1f8f2ad094b008)) - -## [0.24.1](https://github.com/voiceflow/react-chat/compare/documentation@0.24.0...documentation@0.24.1) (2024-11-06) - -### Bug Fixes - -* Agent Message and Chat Docs (DSN-000) ([#277](https://github.com/voiceflow/react-chat/issues/277)) ([4293ddf](https://github.com/voiceflow/react-chat/commit/4293ddfc0878beeeadbaf1fdb0283eafa487fe42)) - -# [0.24.0](https://github.com/voiceflow/react-chat/compare/documentation@0.23.1...documentation@0.24.0) (2024-11-04) - -### Features - -* ui review for carousel component (COR-0000) ([#275](https://github.com/voiceflow/react-chat/issues/275)) ([b310606](https://github.com/voiceflow/react-chat/commit/b3106063f4ede9ff57f3fe2398ad4ae5b89edc7e)) - -## [0.23.1](https://github.com/voiceflow/react-chat/compare/documentation@0.23.0...documentation@0.23.1) (2024-11-01) - -### Bug Fixes - -* ProjectID configurable Chat on Docs (DSN-000) ([#274](https://github.com/voiceflow/react-chat/issues/274)) ([d566fc4](https://github.com/voiceflow/react-chat/commit/d566fc449f9d8fca1bb08419c40f5729cea4378d)) - -# [0.23.0](https://github.com/voiceflow/react-chat/compare/documentation@0.22.0...documentation@0.23.0) (2024-11-01) - -### Features - -* a few more examples to look at (COR-0000) ([#270](https://github.com/voiceflow/react-chat/issues/270)) ([ee4c6d9](https://github.com/voiceflow/react-chat/commit/ee4c6d9d361fddb7dd0c0b74906c5ea5eda747b1)) - -# [0.22.0](https://github.com/voiceflow/react-chat/compare/documentation@0.21.2...documentation@0.22.0) (2024-10-31) - -### Features - -* Misc 💅 polish + fixes (DSN-000) ([#269](https://github.com/voiceflow/react-chat/issues/269)) ([0622974](https://github.com/voiceflow/react-chat/commit/0622974b43294fc477fd2899e5b2a861a406bc5b)) - -## [0.21.2](https://github.com/voiceflow/react-chat/compare/documentation@0.21.1...documentation@0.21.2) (2024-10-31) - -**Note:** Version bump only for package documentation - -## [0.21.1](https://github.com/voiceflow/react-chat/compare/documentation@0.21.0...documentation@0.21.1) (2024-10-31) - -### Bug Fixes - -* sorting out the docs pages (COR-0000) ([#267](https://github.com/voiceflow/react-chat/issues/267)) ([1c6d4b9](https://github.com/voiceflow/react-chat/commit/1c6d4b9b76094817d17a22663e9ca04ae4ba9af3)) - -# [0.21.0](https://github.com/voiceflow/react-chat/compare/documentation@0.20.5...documentation@0.21.0) (2024-10-31) - -### Features - -* Chat for review on documentation (DSN-000) ([#265](https://github.com/voiceflow/react-chat/issues/265)) ([bbc3d4f](https://github.com/voiceflow/react-chat/commit/bbc3d4f225f0d9edc18f4214f01d49f52be713ab)) - -## [0.20.5](https://github.com/voiceflow/react-chat/compare/documentation@0.20.4...documentation@0.20.5) (2024-10-31) - -**Note:** Version bump only for package documentation - -## [0.20.4](https://github.com/voiceflow/react-chat/compare/documentation@0.20.3...documentation@0.20.4) (2024-10-31) - -**Note:** Version bump only for package documentation - -## [0.20.3](https://github.com/voiceflow/react-chat/compare/documentation@0.20.2...documentation@0.20.3) (2024-10-30) - -**Note:** Version bump only for package documentation - -## [0.20.2](https://github.com/voiceflow/react-chat/compare/documentation@0.20.1...documentation@0.20.2) (2024-10-30) - -**Note:** Version bump only for package documentation - -## [0.20.1](https://github.com/voiceflow/react-chat/compare/documentation@0.20.0...documentation@0.20.1) (2024-10-29) - -**Note:** Version bump only for package documentation - -# [0.20.0](https://github.com/voiceflow/react-chat/compare/documentation@0.19.6...documentation@0.20.0) (2024-10-28) - -### Features - -* add Prompt to docs (COR-0000) ([#247](https://github.com/voiceflow/react-chat/issues/247)) ([9eaa655](https://github.com/voiceflow/react-chat/commit/9eaa6551d44f6328d7ba37a57a8ef3770c324a49)) - -## [0.19.6](https://github.com/voiceflow/react-chat/compare/documentation@0.19.5...documentation@0.19.6) (2024-10-28) - -**Note:** Version bump only for package documentation - -## [0.19.5](https://github.com/voiceflow/react-chat/compare/documentation@0.19.4...documentation@0.19.5) (2024-10-28) - -**Note:** Version bump only for package documentation - -## [0.19.4](https://github.com/voiceflow/react-chat/compare/documentation@0.19.3...documentation@0.19.4) (2024-10-28) - -**Note:** Version bump only for package documentation - -## [0.19.3](https://github.com/voiceflow/react-chat/compare/documentation@0.19.2...documentation@0.19.3) (2024-10-28) - -**Note:** Version bump only for package documentation - -## [0.19.2](https://github.com/voiceflow/react-chat/compare/documentation@0.19.1...documentation@0.19.2) (2024-10-25) - -**Note:** Version bump only for package documentation - -## [0.19.1](https://github.com/voiceflow/react-chat/compare/documentation@0.19.0...documentation@0.19.1) (2024-10-25) - -**Note:** Version bump only for package documentation - -# [0.19.0](https://github.com/voiceflow/react-chat/compare/documentation@0.18.0...documentation@0.19.0) (2024-10-24) - -### Features - -* add CarouselButton component (COR-3656) ([#228](https://github.com/voiceflow/react-chat/issues/228)) ([7d3a65e](https://github.com/voiceflow/react-chat/commit/7d3a65ea41a0ca5318ea6eccec5b3afe3abd8785)) - -# [0.18.0](https://github.com/voiceflow/react-chat/compare/documentation@0.17.0...documentation@0.18.0) (2024-10-24) - -### Features - -* Widget Composition (DSN-000) ([#231](https://github.com/voiceflow/react-chat/issues/231)) ([2966da3](https://github.com/voiceflow/react-chat/commit/2966da31b6105e221729bc84f11e10a39ddc648c)) - -# [0.17.0](https://github.com/voiceflow/react-chat/compare/documentation@0.16.0...documentation@0.17.0) (2024-10-22) - -### Features - -* add LinkPreview component (COR-3594) ([#222](https://github.com/voiceflow/react-chat/issues/222)) ([660b02f](https://github.com/voiceflow/react-chat/commit/660b02fea855e9c8a2e1c09c586c3bf8db8a8cc7)) -* add Primary/Secondary buttons to the docs for review (COR-3533) ([#226](https://github.com/voiceflow/react-chat/issues/226)) ([8df4f46](https://github.com/voiceflow/react-chat/commit/8df4f466a3bf418f2b96cddf9e64ebac5e1e4755)) - -# [0.16.0](https://github.com/voiceflow/react-chat/compare/documentation@0.15.0...documentation@0.16.0) (2024-10-17) - -### Features - -* touch ups for the launcher button (COR-0000) ([#221](https://github.com/voiceflow/react-chat/issues/221)) ([4175b8f](https://github.com/voiceflow/react-chat/commit/4175b8fd0fc20d86740c34635851ff6271a79fde)) - -# [0.15.0](https://github.com/voiceflow/react-chat/compare/documentation@0.14.0...documentation@0.15.0) (2024-10-17) - -### Features - -* add Card component (COR-2149) ([#223](https://github.com/voiceflow/react-chat/issues/223)) ([1a4e1b8](https://github.com/voiceflow/react-chat/commit/1a4e1b8bcabe539cc5d71bbaabbb8e92e6e25f14)) - -# [0.14.0](https://github.com/voiceflow/react-chat/compare/documentation@0.13.0...documentation@0.14.0) (2024-10-16) - -### Features - -* cleaning up (COR-0000) ([#218](https://github.com/voiceflow/react-chat/issues/218)) ([0fc8593](https://github.com/voiceflow/react-chat/commit/0fc8593d299dcffe6f0995b2d022f63b98ca403c)) - -# [0.13.0](https://github.com/voiceflow/react-chat/compare/documentation@0.12.0...documentation@0.13.0) (2024-10-15) - -### Features - -* UserMessage (DX-2138) ([#213](https://github.com/voiceflow/react-chat/issues/213)) ([97fcc7b](https://github.com/voiceflow/react-chat/commit/97fcc7b1d806cbb430daf29157d5610396935841)) - -# [0.12.0](https://github.com/voiceflow/react-chat/compare/documentation@0.11.0...documentation@0.12.0) (2024-10-15) - -### Features - -* WelcomeMessage (DX-2153) ([#214](https://github.com/voiceflow/react-chat/issues/214)) ([12d5b9d](https://github.com/voiceflow/react-chat/commit/12d5b9dfd8046bfe0d7f987674af39995a762ae0)) - -# [0.11.0](https://github.com/voiceflow/react-chat/compare/documentation@0.10.1...documentation@0.11.0) (2024-10-11) - -### Features - -* add Header component (COR-3545) ([#215](https://github.com/voiceflow/react-chat/issues/215)) ([0a893b6](https://github.com/voiceflow/react-chat/commit/0a893b65f7634d7ffca622c77bcc62af4514490c)) - -## [0.10.1](https://github.com/voiceflow/react-chat/compare/documentation@0.10.0...documentation@0.10.1) (2024-10-11) - -**Note:** Version bump only for package documentation - -# [0.10.0](https://github.com/voiceflow/react-chat/compare/documentation@0.9.1...documentation@0.10.0) (2024-10-11) - -### Features - -* Agent Message (DX-2415) ([#212](https://github.com/voiceflow/react-chat/issues/212)) ([9c599f6](https://github.com/voiceflow/react-chat/commit/9c599f618ade9aea29e866a5a0c9ee602ef78a8f)) - -## [0.9.1](https://github.com/voiceflow/react-chat/compare/documentation@0.9.0...documentation@0.9.1) (2024-10-11) - -### Bug Fixes - -* force light theme and show selector (COR-0000) ([#217](https://github.com/voiceflow/react-chat/issues/217)) ([90ca7d4](https://github.com/voiceflow/react-chat/commit/90ca7d4b4f85ef96557ca8b99f07eae90486c0d0)) - -# [0.9.0](https://github.com/voiceflow/react-chat/compare/documentation@0.8.1...documentation@0.9.0) (2024-10-07) - -### Features - -* add Launcher button to the mix (COR-3541) ([#211](https://github.com/voiceflow/react-chat/issues/211)) ([4c23a31](https://github.com/voiceflow/react-chat/commit/4c23a3168deb21e8e08dd26713aaca882f7a1184)) - -## [0.8.1](https://github.com/voiceflow/react-chat/compare/documentation@0.8.0...documentation@0.8.1) (2024-10-07) - -**Note:** Version bump only for package documentation - -# [0.8.0](https://github.com/voiceflow/react-chat/compare/documentation@0.7.1...documentation@0.8.0) (2024-10-04) - -### Features - -* add SendButton to docs (COR-0000) ([#207](https://github.com/voiceflow/react-chat/issues/207)) ([c952373](https://github.com/voiceflow/react-chat/commit/c952373e37458e0a17867b5f743cbaa434bac67a)) - -## [0.7.1](https://github.com/voiceflow/react-chat/compare/documentation@0.7.0...documentation@0.7.1) (2024-10-04) - -**Note:** Version bump only for package documentation - -# [0.7.0](https://github.com/voiceflow/react-chat/compare/documentation@0.6.1...documentation@0.7.0) (2024-10-04) - -### Features - -* add InlineButton to docs (COR-0000) ([#206](https://github.com/voiceflow/react-chat/issues/206)) ([a3f0596](https://github.com/voiceflow/react-chat/commit/a3f0596abb474252158ef13f6dfad80bc67b2fae)) - -### Reverts - -* Revert "chore(release): publish --skip-ci" ([9c2e101](https://github.com/voiceflow/react-chat/commit/9c2e101ed74959ea1db75f29fa0276e3ebbd35e8)) - -# [0.6.0](https://github.com/voiceflow/react-chat/compare/documentation@0.5.0...documentation@0.6.0) (2024-10-03) - -### Features - -* FeedbackButton (DX-2405) ([#200](https://github.com/voiceflow/react-chat/issues/200)) ([46752af](https://github.com/voiceflow/react-chat/commit/46752afca27a0b2b8388b3241cc9d2c130c84688)) - -# [0.5.0](https://github.com/voiceflow/react-chat/compare/documentation@0.4.0...documentation@0.5.0) (2024-10-02) - -### Features - -* add Avatar component to docs (COR-3369) ([#199](https://github.com/voiceflow/react-chat/issues/199)) ([6dd7c26](https://github.com/voiceflow/react-chat/commit/6dd7c262e3c8014405b2e380bb6c465487c36b20)) - -# [0.4.0](https://github.com/voiceflow/react-chat/compare/documentation@0.3.5...documentation@0.4.0) (2024-10-01) - -### Features - -* add nextra theme to docs app (COR-0000) ([#198](https://github.com/voiceflow/react-chat/issues/198)) ([4216a67](https://github.com/voiceflow/react-chat/commit/4216a678a3602aa8e0a83e141077ad0e62984338)) - -## [0.3.5](https://github.com/voiceflow/react-chat/compare/documentation@0.3.4...documentation@0.3.5) (2024-10-01) - -**Note:** Version bump only for package documentation - -## [0.3.4](https://github.com/voiceflow/react-chat/compare/documentation@0.3.3...documentation@0.3.4) (2024-10-01) - -**Note:** Version bump only for package documentation - -## [0.3.3](https://github.com/voiceflow/react-chat/compare/documentation@0.3.2...documentation@0.3.3) (2024-10-01) - -**Note:** Version bump only for package documentation - -## [0.3.2](https://github.com/voiceflow/react-chat/compare/documentation@0.3.1...documentation@0.3.2) (2024-10-01) - -**Note:** Version bump only for package documentation - -## [0.3.1](https://github.com/voiceflow/react-chat/compare/documentation@0.3.0...documentation@0.3.1) (2024-10-01) - -**Note:** Version bump only for package documentation - -# [0.3.0](https://github.com/voiceflow/react-chat/compare/documentation@0.2.0...documentation@0.3.0) (2024-10-01) - -### Features - -* UI export to docs (DX-000) ([#193](https://github.com/voiceflow/react-chat/issues/193)) ([83d3ef9](https://github.com/voiceflow/react-chat/commit/83d3ef93390ff8d98681c9dec129133f21a8e6bd)) - -# 0.2.0 (2024-09-30) - -### Features - -* Docs (DX-000) ([#192](https://github.com/voiceflow/react-chat/issues/192)) ([7fd2e96](https://github.com/voiceflow/react-chat/commit/7fd2e96de26ba42b7a243af8131a8f4ecfa02c60)) diff --git a/apps/documentation/README.md b/apps/documentation/README.md deleted file mode 100644 index 06114c138d..0000000000 --- a/apps/documentation/README.md +++ /dev/null @@ -1,11 +0,0 @@ -This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). - -## Getting Started - -First, run the development server: - -```bash -yarn dev -``` - -To update the ChatKit in app, copy the /dist directory from the chatkit into the /public directory of the app. diff --git a/apps/documentation/next.config.mjs b/apps/documentation/next.config.mjs deleted file mode 100644 index c96be73863..0000000000 --- a/apps/documentation/next.config.mjs +++ /dev/null @@ -1,13 +0,0 @@ -import nextra from 'nextra'; - -const nextConfig = { - reactStrictMode: false, - distDir: 'build', -}; - -const withNextra = nextra({ - theme: 'nextra-theme-docs', - themeConfig: './src/theme.config.tsx', -}); - -export default withNextra(nextConfig); diff --git a/apps/documentation/package.json b/apps/documentation/package.json deleted file mode 100644 index d3f975158e..0000000000 --- a/apps/documentation/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "documentation", - "version": "0.35.8", - "private": true, - "scripts": { - "build": "yarn g:turbo run build:cmd --filter=documentation...", - "build:chat": "./src/scripts/import-chat.sh", - "build:cmd": "next build", - "dev": "next dev", - "lint": "yarn g:run-p -c lint:eslint lint:prettier", - "lint:eslint": "yarn g:eslint", - "lint:fix": "yarn g:run-p -c \"lint:eslint --fix\" \"lint:prettier --write\"", - "lint:prettier": "yarn g:prettier --check", - "start": "next start" - }, - "dependencies": { - "@voiceflow/react-chat": "workspace:*", - "next": "14.2.13", - "react": "18.2.0", - "react-dom": "18.2.0", - "regenerator-runtime": "0.13.11" - }, - "devDependencies": { - "@types/node": "20.12.7", - "@types/react": "18.2.8", - "@types/react-dom": "18.2.4", - "@vanilla-extract/next-plugin": "^2.4.6", - "nextra": "^3.0.2", - "nextra-theme-docs": "^3.0.2" - } -} diff --git a/apps/documentation/public/favicon.ico b/apps/documentation/public/favicon.ico deleted file mode 100644 index 718d6fea4835ec2d246af9800eddb7ffb276240c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25931 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 LrJugUA?W`A8`#=m diff --git a/apps/documentation/public/fonts/UCityProWeb-Bold.woff b/apps/documentation/public/fonts/UCityProWeb-Bold.woff deleted file mode 100644 index 14bb0186504778e5edb6b02be8b8706859c77c4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49504 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 DA8R;T diff --git a/apps/documentation/public/fonts/UCityProWeb-Bold.woff2 b/apps/documentation/public/fonts/UCityProWeb-Bold.woff2 deleted file mode 100644 index a6bc5d124759b20d804a5b75d37ed25b0d8dcd8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40752 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

XlJ< zfsU2QsWJxA;h43^%1Eo1ksQLT# z&1orolYB&-7FwCdTWdV;N>b>VJ-Cr;!K3e^lW2NNONZz-nbimmSk+87#?xwu(k(Rk z4$&wns3m>z+4J!VT&v+6x!%z6wk-O$DMWs z2k{asyLW`dv>NQey(;a7p>w<;|GBW~7Te-P&Y*x!brDIcQS))R##6wG(WLvO1AJmS zn|t&iY|>+MSV+leWYCl0e0X4CV*Jrbp0kCv%PB2r5)0_bx`b|%jmbx~ELZzsN+-q{ zsXf%R=x!G{gt_IiZpo)*Lv=-c=UC`6Xdne1&%jZe1|dD*T??-8vm%V3wbDrJwZW*P zf8ECxTOGd)6qusr$5RfBk9Mq&Lsu6}*zzrBA(UHo^a^WB`|F>`>A0g&m{STfSwm+T zwOA#MKwD@YzAmuMvP+CGJD8S~;Zwq@=NH{3v_7+oR+N5_b`RR1p58!!vE-;RMB$ny zqiDcH*=ac#BItH6yK)F?TH_RUPaNF{u(Vm3M=6S%^f78tlO|sCXx`DE{H7Qh> zwS|7$?uG?6=Lynytcw~;%Ax?Qy#YL-^DrT2iM|LvCiPo1j+vFmK0-d>(B~Qe%LIpa z`(TY?bRsk``OEf%SugBhCOkzoZo34>vsKHUU>wI-lo!GgGma14Yczu5*}Uic+0Jbh zai}C`u&|DSTXpDGbQey1>DnCG^D==rf?e!3t;)VQOfO3)p~#u!ZmQeQpH&^mh&Jcq+u=b@@ z-*}H5MXjyFUUuUH(ziVy4{n*R5!|Zz;x9WspNx(blu2lKBc9 zUcQ71SX19C(f$0;brUL9q@V?*OW>R8aJ6=9ylHu!zUm33Qw88^nUB>`sFl z?EWN+51ebDr0AchNq$@JWfj^OSw% zD|XiA;5n@?`CuU&;%E8~nmX;Mxm8uRt=m2tHY82p+X7}adNeB?9J|#0e+;6pKZV-k zJ$7T`zN}74YDQ`E;w+X%|3Q2{~2WQ`_RO!4%3Qa=uC~G!-)i za_!;L0TA+qaIvtBn0iWifrga;J=R>r@{gHog9OSpQuNJHUbS`QRbNXH;c$6O$EFuP z$qe=qvaaV)i7*<4z$ve?WW;O^Ec2S3@bv@fwk8hAU$QEWaX1j|U2McpJ4P5BIUre* zb}32#G$4-$)tUU`9=HKvY|TZlV?HuS9V|3vM^irs$|NF7H&;)MTySfWqor)?*Q>rD z=K*64V|POYKFVgXQIY}V6T3xQoD`gyci$5iE{dbIx z&nEQTT`$zaSQcp8Ptmtd>(LU?vlORJ{gkdtJAG>#WHkfTzM1K|5-UHdUm-y0tOW5> z%h|i@S~2`{f(3SrE%DxtO893!ySMssvlw7oecl)WP23X%8H2Du{`k4bG(gE@^rG;5 zJchb02adFQZtiq=xPT)+#@Dr3Cf2VKBN4~K$Dt-|Ce>wdP18Dhdt=%r^y$8Gb7a;a zHT}eD!?5X=H>9mnN50YIXBOw&5WS|6w8*-1be0OR)y=8$OzX7CBFJ61#6?84F=Vq} zy59)uwNWrP4^H^&R0zNkKsjAOmdkyOrsk?P#^Y#GjQwVp6$H8{qdAWVvxW6zGiiNL z3$BG1;wr4ZXv+?Lf6ZlC1q?ExM#~P-)`dC8z!7h{bH=7*T~72^extAC|GDJw=k+zsh7ZexsT?*rlY*yy2Dx?y$lmoTVxyfD9 zDLCQUT&{yBZszqBJGl_AG%UbhoXo@{@yH=335U1l&zyNujDHn|Y?&IhR2*HVMxz1R zw{Xw48doXX9^!cdcQm%8 zn4_6hj^G(DDL#4nmunFhFfJY7 zYaA!#IK}&nOPJo>6%NKmGM&X!plvq78VuC)hqVIi&>RnRUSeX zt>JnK%&JnYN>$XEl?rH72+v?`kH2VShh)DR#{zd&Ip_woKHg?oLWuh5Sm(cqC?zj zJe~r-OZ213g!@4I=71)hm_Tf(eV0>Ur|Pc!n^G-W#mJI%;2;A1%cGydHkK^`+E`j~p*!Q9%^ z2=gFL4&~P?VU4w+5fY#oG(bq^pXU~n7gK2E8`i67oOLn zd{oyINoDT{hkP6sq~OYk%=h@16wP1)#8l4B&F^z@&4OUUcvJ|qzty)f-pRV(_yX|# zVM6ZWLQN%ykc_67Y8n!ofRqZ#x&hgH2r3IGJ(w+4438B7k@my&bFfx^T{;JA&bg$= zL)Qd+M9>Xa9Ws&X0uVB~Tea zMd!aBE)nFEYYS1c|Mu9cqG!#XJMzPlRtGyGUjgTWi3-CcDaR#IOp zRQ2``stBkdy|`FR73YZ-F+d!{s|%bjhxdgiBbs@>Pn3&pD^UYE1(X-i?5aeAIO~A` z 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 E0Q6i=J^%m! diff --git a/apps/documentation/public/fonts/UCityProWeb-Regular.woff b/apps/documentation/public/fonts/UCityProWeb-Regular.woff deleted file mode 100644 index 88f2a66c5acf4801e47214076b8485ce9ed5a677..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49264 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
UG$f3i%+ z@9pqfad79(oK{Lna6=#F0^MCCYeipd7ap2;Z;lhcd!I1oI68bX#~7-KbFkKH#`nx) z@$B;~L>Gem;`e}5F9A`;-9pIzD8v4s_px>c^krh^b1>8`WEtiW=lbU!_nQnxHBDA( z>#td-=DIYJIov+jGLq@XF}LF*OQP$w(8{?a$`xRrq3SdENqQk7JCs4LMQ{P?PR)FN z$=r|;g zg8Xh-u1xAOfh2)H3UA3DCAS^4b7qy^wyd0ydyT)IGUs2wJD@Z!qeGXrKM0de;t^`! z5{^mDDC61x*xm9M&`9!@+{rD|Flc;g5zqV`a zlRIY3 zgcQvh(?2h`K!h_6+CYJMbnEo#eBEHP^|X;%q~IiG%E}imSdrqwO}H_mp3L6Hs}lY# z*0qw1mmkG)q!YqCz}9mGkB#n^$L;Z4Rml%)?!Pf5NHJ)WsByX(n3Z_3mXQi(E~J@g za>Z4rdr!2Y*>4_tFlnTuP)sKbBWZkpo5E(x@GfY38cjL5oPeaWmzrDr%nRgpeJl`NC^w4)@r|pIRr{Dsd4beX5tkn~vf4 zLn1oo)a<7PH{Zx%)*6xxB-wQvcQGs}RE5%OpQ6*_Y)FocsX9F3bu9LrGmvHr*a6fZ zD4NYF(346fFf0YZs@@B_)ET8xv7mm7olN9G2PlxEAu{7d+aLbgSr$8_o;D_LYqy89 z&yRmWCrp5l>trD&ol-FQQ)sf8)2m8N!W*p1Yq-aG+gl%B9gqQ$T@Jj`rQb<~su6Ng z!&xm+hM=BqR)DSjwr53ZGt{z5=jLkN_y{<-hy4rqw zjXF|EC+eDq$|U75knvHfy1J5*PgXBCdq;YWOsQh30DH3td$muyg?#AEC%ccJBCcl= zSXvmqYnWF{c@`tbE_6z~28rJ(k^@Tq<)gV1X0 zq}9hfj@GrPG7pc$cqm!f_AJY|aF)6!+=@JmGTtXf3q0xwLaBR^wqyn5usa`EXWNJW#3HWd^1LZGxLKbT6sdLJ}T)51*0V|cu8+Bh^# zV;{~e^jA-L;>H^w1FXIBZwtwA^fk#a>cYI38b+8Vhd&_foJ5C%DwddV=Mp~ME=xt^ zbUA3DPO_8m-E?!ApEvNQCFv|JZX=^TJV9IDU56G-GIhuc@&7)={mZ4+y36$Qkj!$JW?pvTGi$kRyi6T4&yk^MjJqd5Y{&m`C;+4ffw&?j(6{jN5+l zpV~4`W|=?=*<*L|2<2_D&C0Xg==yJyWn+_EtvZu)%Xi8{?Rq@2itUpuXI>RyMm)^(7s4I|LJ~61?=q*vvIp*(8GM?k z*7qJU{9E4`K2uk<5%a16uGcEyIt-sZdqVJ*meggvlGoLzsG8YMll=wT&d;psw{_jn z%hWxQHjCCDX#=L6KgHZQ#KFYi1I3s|lYMsXB$-{aEX3Z^;>+wnLYkCB7-6U=Kuj@D zVe>c5wGyzX{uFABXq{WAFIWD|_*Z?N41Z=64C0lsgaI~;X_QWf^Bx$B|4oUfO2z?mTi_8grFQE<+byk6bnJ}qx$4%=W1T-^dwxQ6vBGg)@2#MC(CvBe;d|4H0FK3JF(>gRkloPRtojzPn$ z)H43fj~X-CY2fqAb32NW|hh8;pW6S2Okf7ziGrKLODnZnq! zSN9)`^5GoqExK3!*tof|f3obYSiauz#ia>892=jGDA`GCvCW@UR-_2#_c9y(W>v{HG03+Dec^Y6m_tXecw zGEPn5n$)ip!Ey+e=^I^oVSz~BO0$yL(!3ttY7aB>Bq=Y(Ys~t0CO^It=+tYDU)2#N z{>E!#h9~@PyB2pv{v`cg{n7u4;Uwfo0cTpkq!RKrivs!AK?6F$2ArC&!EL9U%f7+D{(>h7R4T>(uv@C}0=b-A znm|0-nk1ec6Ge(_h@?qRDr1?te9kKhWsYp*|=#Z8P>kq%&nJ zlH5?BjNfABxqE-b^36QHw(|6z<6go3b|k;)3U>B~^hNiq^8krS0dpzd zKnm&g{d6Pe&5dyV?j2uYBNV2|qF(4o^%;$TXpOpN{~?GY=-|UR^tu;WOSDyusjsxQ zJGHj<`h|Ae(u>^zl&>>+Tml8Q6ams=2AXGgW5sDp)r-L229-R;0`Si%-DZ320b_egE@O!N-+7gK^HPS&Y} zjhs(5PIebpJKO8Rp}#T|QC%)h5vRh;IVW!|`eUKq{DhZk?U`$L0Xr~tdzsry{pQTq zHy;6*z_(2PrjmDo{#Md6oA#FAS5^Bc{2{|XHv?4mJ+5(Wu9;@-xX|ggc7m%})4iE? zJ=v2`9;)fP#*xc@;EikxkD@$wic_jNv>LZ4j*#k^(5QH2{xVemkpD9FSHG&@3;P7Ux(O>|9-{EOG$-(>ZIEMw{x647=EQ#&KH zw_VE7st)UR4Z5Dk;@z*tc5PigSG3tpu%CmBDb#dqH!I-$UWpu7SnYZ-R_y9S0oH*!SI~vhIRUU^*00+H(Y8`53m1=gP%DE4Y zmx`~cl4%zwM8=o_tDMmw_NtX1qE$Sk zRal}`gQ{ieD{G3ikdYw2w8K@MtB^A{g@yd4RdKB#`_80-aAwF`C=N`=TS4|xl0Q51 zvE|4HMg!x2nEol8)m^w4o4lgowr_YyZFx`=AYr#ITldcnL|Nn9&I04q$pOEdv^#J4 z;#~^4k=?oNYFu~RP6Bpya`D_mD0rAVP>A|&k>ZRg;!H8(OgQ4qz+{g~a$H^mI=M~U z#SPrW2d`t>ws0l0f?yf@5}X*br4u41OF--G?P_q)Jt&@O-`!w=OSy8$$eI&DT~qW& zD#gC8g>*|2zUs`)O6=!;ys}tnP(px!E+Nm|fJJyB(V|$W=2o4bQp(|2l@Ogl-N0&Q1a|VG|jua1!__oFxHnv~wxP*07%Q@s$d6r9~-CT8tY%6o*rnEt;rqu=pQO^^% zYufcPZ-@HxnICUH6fN1K*9ShibBu-uh_Qj;ykT}<-;d(XbRrB4j4nbJW1JwwA{;Oz zjlRC(o4&qyxPwm4PznYdgWZp*zg4$8zxTi&*h2Mxz``yFIz{KD(*Y<6&;cCp@Dkr= zcx+?9vT-;t#CQ0!)}QoBxt9NLd)X3`!CTbQ;{0Bj;U?b+cBTyNn_moqcYa(yy+iV;Fw8Emhf?CN{mI(ss>xil!5eGLrX`s=?FMH zw9o0^_H??QpDq!)PHF3=uCKcKD?3x}(wk1LOIHq^JQ2KF! zmLGluNU@71qzFsp!t7>^0jM@Aic2e$-3*R9vj~|JYRjvmY!xxK${W!w(X{5)>vMtK zVEDna#%*nM1y*FHG&p?)37(pZ!<_);PPz>_|9||seS76GO)DW z5(GpyFrv@KfRS2r#!l`$(6O}ZkA)Rjz#rSp-GCuCmSn>|5+}*b^tt_J!wp zOVpqsDutZ1r!xjtv(Zk;Ww@-Af|ilWp-Rcch(HS&RImAf1{M|d^$Ijp3_(#>vVd_| z1A-uoF$dQCR<8M&`A1ddOrRm6;`z;koA!R)Kj58j8o%N(6^BsOv-bU7PM3%Mv zDAG?>v`kjZNRH(i&o87Z{!3N(qoN>kau1@>b4=&ACdq&iM4d<~#P5jirV}N{*`<9ON`POCDv^%;+e&(UX&+#`|55_A2fj zMLpZAbT$?IO3MNMf583AN&G7~dMi#!hPL`VKaX=wu{0E`i1<8eVK^NL z2qZD#oG9y%femb^fl(Q!qoi|qqveM8P3PIvnd|#?BhZuI{-(Q|bYnh?{)_XZ0s^PD zQT_wEaUqQ?< zS;V%<{ZTYP!5Izzui|aZti#6M3`)K?&-dPicoqQ+Ot(kU$8>bpXF(APV`(9!Aohwp z@wV>!$RLiSwDg3;1Orx#XJ|ALf|ueSm(d^oUGAtCYVV5(PxSlz+Yfqf=Pn1l&-uaL zOY#rq5)2T1Zu87e1o-0x%&T-o#RKKhBxDPcmH8_Jzde#cFb5!h%~01J9i^tMj{h95 zKHmJ-^$*KiODu5Y(ssI43)YFRmnv4Ev397MLe05R|K0e!WTNJowZ(1AL&X=E!cA7j z_jH{w7E$lssQiAiFldCH-N&wX0Zlo=Nw zY+(IIrSTtmy0EYtMQdA*S!=f9?Y`nelrrnSwg9h#E>$aJHAO7t)B!u?$ zdh5;f!|@JhO1D+Fk=NmQPvF7aXLAFOXY*U%!P@&Z*G*Svnm0m=Ek1sSo5{<1e<_#t z+`e`Q{tx{26dw|>s$DWdQp#hb4wSUf@uqa9YE89P-P-owx1d3V;F%wrpND|qKgv+@ zHQDZ8Av^E=hY_Fs7i94D$_sg&w}~^dQ!e_foSvqqkM_Y+uMb+Mo*4?bE?{7iBcq6j z#_|w3a=ik6m~(L$F_|-I9+U9a`@NL^LcDl$YyEz$s6uhGKD_6AF(aR7OZhAa!mQ7X zvKL|_epj_2m{>8>AH5}h&?AdUKL;=U%@^%qdVOL)a{kSSSR)XhKVmFxHX@~)#HSnL z!sf4FK2{df>VOY|Oyi?1m_RZ>{}r4O!`l|h{Wxwr>EXOyW*^e^Xg-M0py?>%geSuJ@d=kcg9#dVaB!3(`k3! z8RxBBu+L(@YE5XZMS!nCc*Z&Z#D~S(TJF7>UV6CJy5{-9x)F6?b^5Ws$!QVM+F4I#tjlKN$VRkktbBn$i&zlT47vy~z7~k9gg|dzrE` z0ur{kbtHty`A7I8S^sMaziKe3pIlug#X67{X~@vnBkVHTQv!Ge&3oMXowb zCQPDiv@5{tqZ-ntj-mzD2O0*RL>*oPC5G=W&fOl*T{ccn@m_46H%`K78L19yov*;y zP*66cOZ>xWBOrdeSlA;(HmtYMQ zw)~13x3J=#(@Iq1sDpvn(j+8Xm$(lWFWDwlk0bv_2*|mHrrg3hV&$>{w@HfwV^c?k zK@A_RTz=C|fziR?Gy&RRClowWr<{Wx+&OdO12Hlpyp?o5!?M9cyws>42vM#>Rn5aiyjm$B)kWJE$G~lt$lpA4Xz^sa^$l0n8F=SDEmu)8hi|~kPvDTJs z?^vRig_5l`i99-T<%nL9dJScFj9THWxg9KaLu;6J_wai~;cny)$QPn;} zmsu^Vk;pJ6w=#=<=&v=Db?w=o)uSbv)IqyQ45v^~3wSmY;=~Tv@`Dt}nxV>0kz|Yq zo8>N01k#y!Sv@^YT~ZLhCgju>zN+Q!ux^6q=DScZp#WkuXy~H&iWE?)lcS7JX+Miu3oN_s z3)~v2Z5!+g?0tzkpT{Y3mB46|WMh(OUvQfly-aKSnnnCgb{m*vivP9Mkp&8YiYhQx z^*o*P0mCYjFZriaA+{6mOY}+W!W|Te;0MJ65&+(@STHn5y}_c1iH#m#wo$Fyz3&JQ z?wg$Qu)X~)5pe>)WLtCqZdv8T(9R2RiNS-~Nb`(yjgFJ7PP#;rVcFD$=2wD%_;r=MWJkDP8d~0PMM6zPj>+9XEQ~+IaSeP9Xip-6+5sAo(5sf-v z_v*-43f*dghsWp17>7(&4`kdT3ej-EfQ8gpB<^FF>0mV{EUpnKf)wPzo_yq-l1r)_ z%1Bi#J<`Wh2n^8Q^PIGdPXWZyRVq5(vB=n+I*&tA_fY%WY)nF+(`wZ&gnjfF92a`O z6qZDpEuM6KAf_$N<8|A4djd`Lcfd=0jcu)Uj|LCdqu*kFT3w3in-*;Uf`Bx}rf*=J zuSUdixSJg_ssRi2niMTX=9;x5`A@h}qE$nLCUfF0^)fwbsLIXIN+@ZAmFn-#>G5UTA0Q7EatOI`V%zV${=WWGja4 zU2#tNH*q;Pd+Ax&EBOj7+f&tkRpVwZF0%wbEyNU`ht5IPoFgi^+UO1yU-(dj)EGcX zj4BviSXuy*VJV)>S$v}?;uXuVmt$6K04++|mX3t7O;}@;^OQD8Rx@e1rjr|!OR~m9 z@P58DIDDJzK9=0d&u3VLu28s9HG7pidF{sD4m9MYPoF?XdHW?37kF*0_cyI}dX)K+ zG+%t0LUnXssV;S+pFR`i>?O5q+?gil2QoUcYOyA2wW^Hs{vfqCzj=dVyTsgqs_Ij+ znH_6y9I;+j>*7mWFYR;TY7=d2JXP^72|t@}6VhX4$TvAwzn4%7&wn@vBGX)fd^YR|Q@=~*MKd?>&Af4+}wf?+sU7=6?qr{BHiqcNOtjv~! zukhkQ1Y5jrZVwI9FO`^gcyc6w?0qZk?dA+HkE(EMsbS`2c0kUiGX>rzo)KV zkeGnknbE2MyqdS!G)WamB=o2qbBw*8cA2f<-?ySa97Jc-uza}B=~aq3!l5;8c%i~a~!D# zc7NF)e|I$IMfR(iLxUo90xAJga&-_R5S=}Bt>n=0wlKw-(z$U-X-b`8b(2j~fn%k| z+tlv8Wjfrg-@GHGVtC!^W=Q&6zP{MlgQl1-W+-QWr+9l_!i`x3&kQHS*eJ_`y)j%u zXqdNL!=Ytzv3aEGO}W@_qc(gAm- zaUfX{dr{ph77i9CDmV@v4mSpt-2r?rf0;q+tF{Q-jhB~a3i!Lvjvkv>lOy*MO#+S+ zwB=y8U}a<}QNW-k!H*Jhv0L(XRfw=}AQ@m~9XXmJHq?Y!W-d&PB}X52tOvF5A~O>n zI|SoeK6dfqYJKkV#gXUYPC$Z&PG|MbKGx#aul|zxSUa8U=ZP178$gUc@yx2beV|?BzlJ4PAg;iZNq$&fO3cfKe zAVfSen4w&J*nqI!htMck#D*wp@E^^uT@Pu{1UeBy8x<*`)VtR1se}8}HSgo&yNs-H zd+e?98eCKEP=(`}v$Aw>AF@<*0jWcXoW3U!w{XDB&wBbZwglWzMpk+blstvt<>!bP zY5JhWL4tWuwLkvHmLRnCda9kA%R%Puw}kL zIxs#IBE>)X?>l!c;a_FG2a@fd%_7`cPFJSV?GWjmZHl`JHCD$5oP#j6lfQbp3tVE{Ea{l~cQqP81|C7c)s#L}Kr%l)fB`2pVkm zD4=?pi^l@n!&?8GR;#!*tGIODPw|%PqMC_NZ(fDilrm)yVNsf;2yz3=UI_H25^Reg zanFu2bmG(;Yn4$1CUFNuOx{GKJ!Kl)X0GLo2ovXZouAA5{CiQ& z8@#yD(CIqpdv&LoQ+;f7`6GW#9JpF3Sq+>lTu$-@0jb9l2Ux2EWG|? zP3~Jj06Q;!(Q~2vg)d;qTd$Fjf-a(l#>I!M=z*;G)b23Oi!QhHm8)FG!HCx=?4-gx zP&5o$)}B~4CSbsgj28b2FD3NVFzGy!G*^&V(C6dY(zT!2#@M!A5G}qFh-|g>h|9~} zQMvwRE*<&2wb+64D1QT^&r5u-$N6ebcvcVM&Z`qbQ!wK7gI2QagehvW7aoZreibXi zRHIm;i1qd}I*$l`T&VtpiMq>E?aBYKYV+$ z7iv97cH3bEV(&5*EMeBeUYdXh+lJQKk!5lH^1TJF_4>(v!*Vj~%x+_2*ja&4m#C0^ zBDB=N7mdiB*+elYw;&dq_em`ZQYs@OV=ZG%?336zO}I88joxKc+i*~5)AO#!*ZJK0 zP6)Vka;t6yd_3V}k9l80_=!{E^UQNmWUeaUUsnd55$K){o8Ce>^HSQSN1v_T7o_0% z=t>2ZKSnnsk;Ow-(6!k88oZ9ugGyIsl5dXCexZKEveDLRSlr^*G{$eFSJhwphh6)p z`FU8J>$5InJf=-=IZbOph+AEz7>}!5m(}qYllRN0!A?CMfNYyqVK5^Gv=KquSXJHC zY37H3$;h@LFHxkFy#l$GBn*I*LtmjJ7Dm4=4fRlave20+yTIA$9n7q@i!vn^&VvW6 z`B9r&qbRj4w`12h&>?WW$Bn91*^^aSI~k;Y&h}8v1FJQN05K*Hg&9ArL+c^~*emCZ zTv5@N452TLn=na0niqEd803N%v& r{vcZ+8sJ+W?gyd{2lfN1rO2rk5$&TvOs<^ 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 diff --git a/apps/documentation/public/fonts/UCityProWeb-Regular.woff2 b/apps/documentation/public/fonts/UCityProWeb-Regular.woff2 deleted file mode 100644 index 43f69dd5b7a0d5af3f2690d805b8852a78372c53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40292 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≧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 M?{bb^F0KIp0A@ApAOHXW diff --git a/apps/documentation/src/components/ChatScript/embedded.tsx b/apps/documentation/src/components/ChatScript/embedded.tsx deleted file mode 100644 index c7a57fcbed..0000000000 --- a/apps/documentation/src/components/ChatScript/embedded.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import Head from 'next/head'; - -export const ChatEmbedded = ({ projectID }: { projectID: string }) => { - if (!projectID) { - return null; - } - - const script = ` - (function (d, t) { - const v = d.createElement(t); - const s = d.getElementsByTagName(t)[0]; - v.onload = function () { - window.voiceflow.chat.load({ - verify: { projectID: "${projectID}" }, - assistant: { - stylesheet: '../../bundle/style.css', - } - }); - }; - v.src = '../../bundle/bundle.mjs'; - v.type = 'text/javascript'; - s.parentNode.insertBefore(v, s); - })(document, 'script'); - `; - - return ( - - - - diff --git a/examples/live-chat/package.json b/examples/live-chat/package.json deleted file mode 100644 index 39a6934868..0000000000 --- a/examples/live-chat/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "@voiceflow-example/live-chat", - "version": "0.5.8", - "private": true, - "license": "MIT", - "scripts": { - "dev": "yarn g:run-p dev:app dev:server", - "dev:app": "vite --force", - "dev:server": "cd ../live-agent/server && yarn dev", - "test:types": "yarn g:tsc --noEmit" - }, - "prettier": "@voiceflow/prettier-config", - "dependencies": { - "@voiceflow/exception": "1.4.0", - "@voiceflow/fetch": "1.5.2", - "@voiceflow/react-chat": "workspace:*", - "@voiceflow/slate-serializer": "1.4.2", - "nanoevents": "8.0.0", - "react": "18.2.0", - "react-calendar": "4.3.0", - "react-dom": "18.2.0", - "regenerator-runtime": "0.13.11", - "styled-components": "6.0.3", - "ts-pattern": "4.3.0" - }, - "devDependencies": { - "@types/node": "20.12.7", - "@types/react": "18.2.8", - "@types/react-dom": "18.2.4", - "vite": "4.3.9" - }, - "volta": { - "extends": "../../package.json" - } -} diff --git a/examples/live-chat/shared/live-agent-platform.enum.ts b/examples/live-chat/shared/live-agent-platform.enum.ts deleted file mode 100644 index 0fd2008aa0..0000000000 --- a/examples/live-chat/shared/live-agent-platform.enum.ts +++ /dev/null @@ -1,3 +0,0 @@ -export enum LiveAgentPlatform { - INTERCOM = 'intercom', -} diff --git a/examples/live-chat/shared/socket-event.enum.ts b/examples/live-chat/shared/socket-event.enum.ts deleted file mode 100644 index aebe8add44..0000000000 --- a/examples/live-chat/shared/socket-event.enum.ts +++ /dev/null @@ -1,9 +0,0 @@ -export enum SocketEvent { - // server-sent events - LIVE_AGENT_CONNECT = 'live_agent.connect', - LIVE_AGENT_DISCONNECT = 'live_agent.disconnect', - LIVE_AGENT_MESSAGE = 'live_agent.message', - - // client-sent events - USER_MESSAGE = 'user.message', -} diff --git a/examples/live-chat/src/config.ts b/examples/live-chat/src/config.ts deleted file mode 100644 index 8387c573d9..0000000000 --- a/examples/live-chat/src/config.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { ChatConfig } from '@voiceflow/react-chat'; -import type { ChatWidgetSettings } from '@voiceflow/react-chat/build/types'; - -export const ASSISTANT: ChatWidgetSettings = { - type: 'voice', - chat: { - voiceInput: true, - voiceOutput: true, - renderMode: 'widget', - headerImage: { - enabled: true, - }, - agentImage: { - enabled: true, - }, - banner: { - enabled: true, - title: 'Your AI agent', - description: 'How can I help you today?', - }, - placeholderText: 'Message...', - aiDisclaimer: { - enabled: true, - text: 'Generated by AI, double-check for accuracy.', - }, - handoffToAgentImageURL: '', - }, - common: { - fontFamily: 'UCity Pro', - launcher: { - text: 'Your text', - type: 'both', - }, - poweredBy: true, - footerLink: { - enabled: true, - }, - position: 'right', - sideSpacing: '20px', - bottomSpacing: '20px', - primaryColor: { - color: '#397DFF', - palette: { - 50: '#E7F5FD', - 100: '#C6E4FB', - 200: '#A2D2FA', - 300: '#87BFFB', - 400: '#659FFD', - 500: '#397DFF', - 600: '#2F68DB', - 700: '#264EB4', - 800: '#1C368E', - 900: '#0F1E61', - }, - }, - persistence: 'localStorage', - }, - voice: { - renderMode: 'full', - content: { - callToActionText: 'How can I help you?', - startButtonText: 'Start a call', - listeningText: 'Listening', - talkingText: 'Talk to interrupt', - endButtonText: 'End', - }, - }, - - stylesheet: '', - extensions: [], -}; - -export const CONFIG = ChatConfig.parse({ - url: import.meta.env.VF_RUNTIME_URL ?? undefined, - versionID: import.meta.env.VF_VERSION_ID, - verify: { - projectID: import.meta.env.VF_PROJECT_ID, - versionID: import.meta.env.VF_VERSION_ID, - }, - voice: { - url: import.meta.env.VF_RUNTIME_API_URL, - accessToken: import.meta.env.VF_ACCESS_TOKEN, - }, -}); diff --git a/examples/live-chat/src/context.tsx b/examples/live-chat/src/context.tsx deleted file mode 100644 index 9668585158..0000000000 --- a/examples/live-chat/src/context.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { RuntimeProvider as BaseProvider } from '@voiceflow/react-chat'; -import { createNanoEvents } from 'nanoevents'; -import { useMemo } from 'react'; - -import { ASSISTANT, CONFIG } from './config'; -import { LiveAgent } from './traces/LiveAgent.trace'; -import type { LiveAgentEvents } from './use-live-agent.hook'; -import { useLiveAgent } from './use-live-agent.hook'; - -export const RuntimeProvider: React.FC = ({ children }) => { - const emitter = useMemo(() => createNanoEvents(), []); - const liveAgent = useLiveAgent(emitter); - - return ( - emitter.emit('live_agent', platform))]} - extend={liveAgent.extend} - > - {children} - - ); -}; diff --git a/examples/live-chat/src/main.tsx b/examples/live-chat/src/main.tsx deleted file mode 100644 index ebe6cfa762..0000000000 --- a/examples/live-chat/src/main.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import 'regenerator-runtime/runtime'; -import '@voiceflow/react-chat/dist/style.css'; - -import { ChatWidget } from '@voiceflow/react-chat'; -import { createRoot } from 'react-dom/client'; - -import { RuntimeProvider } from './context'; - -createRoot(document.getElementById('root')!).render( - - - -); diff --git a/examples/live-chat/src/traces/LiveAgent.trace.ts b/examples/live-chat/src/traces/LiveAgent.trace.ts deleted file mode 100644 index 15d88eae0c..0000000000 --- a/examples/live-chat/src/traces/LiveAgent.trace.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { TraceHandler } from '@voiceflow/react-chat'; - -import type { LiveAgentPlatform } from '../../shared/live-agent-platform.enum'; - -export const LiveAgent = (handoff: (platform: LiveAgentPlatform) => void): TraceHandler => ({ - canHandle: ({ type }) => (type as string) === 'talk_to_agent', - handle: ({ context }, trace) => { - handoff(trace.payload.platform); - return context; - }, -}); diff --git a/examples/live-chat/src/use-live-agent.hook.ts b/examples/live-chat/src/use-live-agent.hook.ts deleted file mode 100644 index c37cdbbe30..0000000000 --- a/examples/live-chat/src/use-live-agent.hook.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { FetchClient } from '@voiceflow/fetch'; -import type { RuntimeState } from '@voiceflow/react-chat'; -import { TurnType } from '@voiceflow/react-chat'; -import { serializeToText } from '@voiceflow/slate-serializer/text'; -import type { Emitter } from 'nanoevents'; -import { useMemo } from 'react'; -import { match } from 'ts-pattern'; - -import type { LiveAgentPlatform } from '../shared/live-agent-platform.enum'; -import { SocketEvent } from '../shared/socket-event.enum'; - -const SESSION_USER_ID_KEY = 'session:user_id'; -const SESSION_CONVERSATION_ID_KEY = 'session:conversation_id'; - -export interface LiveAgentEvents { - live_agent: (platform: LiveAgentPlatform) => void; -} - -const createTurn = (type: Type) => ({ - type, - id: `${Math.random()}-${Date.now()}`, - timestamp: Date.now(), -}); - -const extractHistory = (api: RuntimeState['api']) => - api.getTurns().flatMap((turn) => - match(turn) - .with({ type: TurnType.USER }, (turn) => ({ author: 'user', text: turn.message })) - .with({ type: TurnType.SYSTEM }, (turn) => - turn.messages.flatMap((message) => - match(message) - .with({ type: 'text' }, (message) => ({ - author: 'bot', - text: typeof message.text === 'string' ? message.text : serializeToText(message.text), - })) - .otherwise(() => []) - ) - ) - .exhaustive() - ); - -export const useLiveAgent = (emitter: Emitter) => { - return useMemo(() => { - const client = new FetchClient({ baseURL: 'http://localhost:9099' }); - - let socket: WebSocket | null = null; - let isEnabled = false; - - return { - extend: (api: RuntimeState['api']): RuntimeState['api'] => { - const addSystemTurn = (message: string) => - api.addTurn({ - ...createTurn(TurnType.SYSTEM), - messages: [{ type: 'text', text: message }], - }); - - const addUserTurn = async (message: string) => { - api.addTurn({ ...createTurn(TurnType.USER), message }); - - socket?.send(JSON.stringify({ type: SocketEvent.USER_MESSAGE, data: { message } })); - }; - - const continueConversation = () => { - socket?.close(); - socket = null; - api.interact({ type: 'continue' }); - }; - - const subscribeToConversation = (platform: LiveAgentPlatform, userID: string, conversationID: string) => { - socket = new WebSocket( - `ws://localhost:9099/${platform}/user/${userID}/conversation/${conversationID}/socket` - ); - socket.onmessage = (message) => { - const event = JSON.parse(message.data); - - match(event) - .with({ type: SocketEvent.LIVE_AGENT_CONNECT }, () => - addSystemTurn(`connecting you with ${event.data.agent.name}`) - ) - .with({ type: SocketEvent.LIVE_AGENT_MESSAGE }, () => addSystemTurn(event.data.message)) - .with({ type: SocketEvent.LIVE_AGENT_DISCONNECT }, () => { - addSystemTurn(`${event.data.agent.name} has left the chat`); - talkToRobot(); - }) - .otherwise(() => console.error('unexpected event', event)); - }; - }; - - const talkToRobot = () => { - isEnabled = false; - addSystemTurn('Returning you to the Voiceflow bot...'); - continueConversation(); - }; - - const talkToHuman = async (platform: LiveAgentPlatform) => { - const isPlatformEnabled = await client - .head(`/${platform}`) - .then(() => true) - .catch(() => false); - - if (!isPlatformEnabled) { - addSystemTurn( - `Sorry, it appears that ${platform} has not been configured. Make sure to create a "./server/.env" file that contains the environment variable "${platform.toUpperCase()}_TOKEN" and that the value is a valid ${platform} API key. You also should run the server located in "./server" with the "yarn dev" command.` - ); - continueConversation(); - return; - } - - isEnabled = true; - - const history = extractHistory(api); - const prevUserID = sessionStorage.getItem(SESSION_USER_ID_KEY); - - const { userID, conversationID } = await client - .post(`/${platform}/conversation`, { - json: { userID: prevUserID, history }, - }) - .json(); - - sessionStorage.setItem(SESSION_USER_ID_KEY, userID); - sessionStorage.setItem(SESSION_CONVERSATION_ID_KEY, conversationID); - - subscribeToConversation(platform, userID, conversationID); - }; - - emitter.on('live_agent', talkToHuman); - - return { - ...api, - reply: (message) => { - if (isEnabled) { - return addUserTurn(message); - } - - return api.reply(message); - }, - }; - }, - }; - }, []); -}; diff --git a/examples/live-chat/tsconfig.json b/examples/live-chat/tsconfig.json deleted file mode 100644 index 7f19d575f3..0000000000 --- a/examples/live-chat/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "compilerOptions": { - "target": "esnext", - "module": "esnext", - "moduleResolution": "node", - "lib": ["dom"], - "jsx": "react-jsx", - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "strict": true, - "skipLibCheck": true - } -} diff --git a/examples/live-chat/types/env.d.ts b/examples/live-chat/types/env.d.ts deleted file mode 100644 index bf6c2cdba4..0000000000 --- a/examples/live-chat/types/env.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -/// - -interface ImportMetaEnv { - readonly VF_PROJECT_ID: string; - readonly VF_RUNTIME_URL: string; - readonly VF_VERSION_ID: string; - readonly VF_ACCESS_TOKEN: string; - readonly VF_RUNTIME_API_URL: string; -} - -interface ImportMeta { - readonly env: ImportMetaEnv; -} diff --git a/examples/live-chat/vite.config.ts b/examples/live-chat/vite.config.ts deleted file mode 100644 index f1e18bc803..0000000000 --- a/examples/live-chat/vite.config.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { defineConfig } from 'vite'; - -export default defineConfig({ - build: { - outDir: 'build', - }, - define: { - 'import.meta.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV), - }, - envPrefix: 'VF_', - server: { - port: 3006, - }, -}); diff --git a/package.json b/package.json index e38eaae5b3..acbac0e93f 100644 --- a/package.json +++ b/package.json @@ -14,15 +14,13 @@ "workspaces": [ "packages/*", "examples/*", - "examples/live-agent/server", - "apps/documentation" + "examples/live-agent/server" ], "scripts": { "build": "turbo run build:cmd", "build:all": "yarn build", "clean": "turbo run clean && rimraf node_modules", "dev": "turbo run dev --no-cache --parallel --continue", - "dev:chat": "NODE_ENV=development turbo run dev --no-cache --parallel --continue --filter=!react-chat --filter=!live-agent", "lint": "run-p -c lint:eslint lint:prettier", "local": "cd packages/react-chat; yarn local", "lint:eslint": "yarn g:eslint", diff --git a/packages/chat/.babelrc.json b/packages/chat/.babelrc.json deleted file mode 100644 index f406f678e7..0000000000 --- a/packages/chat/.babelrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["@babel/preset-env", "@babel/preset-react", "@babel/preset-typescript"] -} diff --git a/packages/chat/.dependency-cruiser.mjs b/packages/chat/.dependency-cruiser.mjs deleted file mode 100644 index 60fb4aa01b..0000000000 --- a/packages/chat/.dependency-cruiser.mjs +++ /dev/null @@ -1,12 +0,0 @@ -import { createConfig } from '@voiceflow/dependency-cruiser-config'; - -export default createConfig({ - allowTypeCycles: true, - orphans: { - ignore: [ - 'src/components/VoiceWidget/WaveformVisualizer.component.tsx', - 'src/components/VoiceWidget/MovingGradient.component.tsx', - 'src/components/VoiceWidget/MockVoiceWidgetImage.tsx', - ], - }, -}); diff --git a/packages/chat/.gitignore b/packages/chat/.gitignore deleted file mode 100644 index 12b46b848a..0000000000 --- a/packages/chat/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/test-results/ diff --git a/packages/chat/.storybook/assets/fonts/ABCMaxiRound-Light.woff b/packages/chat/.storybook/assets/fonts/ABCMaxiRound-Light.woff deleted file mode 100644 index 2384891e15ded7f39771f7159526b8aae5a8a022..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91136 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

isSgNG zexr2mH=d=}AbcChpXharjxMF5gUBj67%=D6Q4njKrdZAa%mka+#0i3X{0gohr))gS z1XV7)f#zS~@SK+!j4piRPxP_3wK___OaCA`kdb{;Z=*ZuF7{iwVg`Nzr+3uNm}3BM zK#;!zQ(zJOUil~WNc^f_WGoQmEZ__CjU`#Sv-A(;pQO7=Q}CPAru-(ebI20_pH=o} zhBhOghZ&1niPeJ^bC%5{Sw32BKW{iaksBS&{mrMBKE8S3{mvS2<1G8t&=} zYfKZLi1r&m!oH75*!Qq$;yrwtK%WBq-U~{f_(V|_{_@no{GdvoRw@2pD0f5MIeJ66 z5AOr-l-?w4)m7N-1WnT+{f;o9qR z*V2RZVCgQ#lgI-&~59FZtB7&wlFQH?O$jn+N$^O#Y=&8;mP_igW|vX21rfZoTyq{yes% z(%BgP;2eaTfU%fF+>5IYOX#EAiWURct#HJ;vj29=E$5wwO4{i*wSFd{-lvmmMI6^q z3xE#L6iWn;dI7xdg@%MD|NLND_&KkmqsS0R9`6P|k?DRFyZ19?x^H51|7;!Im3H-fEDPj@ zGLQm*=EMp?ZU)(3W&ZRyYF->Kir%H?>l6a03aI1n#itLUj=xQL7@^624Ic(&E3N1Y zSIJ|KXJi*dolIqN6jv2^2lQJE27|?5ae;|5fV88~N9Gs_>%dkCDOcfP9S9e^i&Fhw zr5k#>b+Kr#=?DM?N`%i9c7;9n-BS7%b_5lNn-9?=rLUn*KSG|T*U%sUgzJ|ztjFCN z(O@n}uPJ?o7N5@$?qlcA2*P6w$9R5I6K&j7`Y7G?d`5XjxO?Sigu73_LAY9eCI&eB z#F@{-GXa+EwZU_k2vm>1_leS_^yW)=pJzcEdo_J6@YZ9NTL1n^*WSgheO~LD@JV*< z3w76Sf#<#h>a8GrX(yiF1m{n&^Dl3}b7kFF0KHQ_2MKgN3Bx(_IO6v#f5+YQBIXnC z;;SIISj)se+2W0PqfGF7E8ej}A?vF?y{59>d}ZaMFs532zP@@LdYnE;|BCs$Oa_+CBN%61BgZWj3*ugtYD^T5PYV8`tE%U(YEvN3j~UwP)4pZpwN z944#^{VZ#)T=s590R(h5_&z_{%7xFXJbMovLm1n;eW%euoI{RHB^Uqg66g>&ckqi3xnZm?)wD0ayNrP zLcV3D=?zGrP-P|p?I(<{o3cl8e}b3raOvl?t@Lxg7ll0!yzxWQC!}Q_OqY2Ou9Huf zafFQ%-nNWz-YT|8h*lCHX;LKT6!-akf>9Ts z788shY8DqHs@LgX%gp^7a5tsdgnOfvy*oT|h%a6OYiEW+!SRuyVrES;7EFf*TY~5z z4SDUxZtkv^JmH+2X#(cKtS6hnH9NV&Rk=bJ2f(GOF~^oBKQKHpkZEZtX0~n16kA#{ z10%VYxK#CnmQ>i?LWS zcKS~Kj^7}?#{d`K7CK2MjPA+en4RjxKu@Qq73@+2ScT#O(4V`nCb zve=$D?rp>sRSfJZ_#{+%eNr4FzG@ix^6()13lEO1Uq3de`uz87KMwzUL-}%l|Dfu# zKBc+|;Sot3Xz(N8$2J&qF|w{W7Y+$}1E!gfjIRZGFWz95GmoFNU|jHF6J;@_dcClO z`}o4bmafhYf1A(cmEH4fKNE19i*X$&s1>SYb(|K2Q6@)!^wE!gH1p(>Bl|L$eIuEV zmfp2xa&ikDof{dM6K*Q~qV$Gs+tSoahjtI=b`8;O+kU@UN4>huW2N72FqWP(Z7gs( zl$X~eqF4dkNJWX_hN9!Rn7|T?gf^S7s@;;At@z`5+!6r^Vb}sHcPP-)-GxgGtt~DG zE_dUSG>Ouv4Qs)L3{ubr?i^U98pH~@vzf;U|C^3Z2b+}17?DDm`E zFi^G}Qm)hle9ycF7={El#ez}xAL9;u=rbs|^RiclWkF$12}v?|AyaZ5_^Q6 zw#%;cM+Lin-SGAJjRU^9>KcDU=z(t@&-4fBTw5p;Y`?9r0ZwjXpGyxHHk9XP`ZHF` zs#u)l>oHCi9bgry&nOvmn6VzYoG+irk!)M4?A9^*s{^5a>`IE1P*E6$M%n>F2qZRtr zhB+sSYs}POF$%cSc^p&{krgyOjvJJfcxcA8{&whDpuN|hgy(!gd2z`Gg468*+;QGz z{9B$)+eBZxf{IWAFZpn@I^TfHbUZzT#s zy|}%rGvsOsfmz{pnhiMQK;}Wm?Ls&VQv>4&WK`siAbso}e^7VnrH1^jp)P8hDgACK zx83yIbEfUNC3>^)hPKIYW^hY?=^to5GoQ_5=NWHeJ;iS5TME6WD&AChaMF6^2o^C2D-ohdtv$E-U~p!YnU5I|6Eir-6%h ztoikt9mq}?K>KL1DizYq$3So>&&Z9!gAf0k}-!1B7uI7Aie%hM~eX zAb`yq4t8}Y3$Lvf02%8PQ3Sebj8K$^tXvV+U-b$18A~s`?Y{f&%RKPF18*(;K>|vc zjWk4qMzhH%d;(5N{|X(y;|@5`ZpmVijKyalydO|9y_zRYb_K z^WXbWKA7SB2#XJFNeHKGcsL zQIQXBwsS$)XZZQM<>B-0pBqd@qs8?5e>d8UC>u=1($i(x5HK07lEG5?IvubW(AIt7 z%nS4d0pnJ}Ptl@A6q7igt(S#su{dou7x z=h7efNctnJJ=zNG%`N8_qv+eZ8+}`}m96uq$Yu0>^k>iq!+ko87oivz8Rub=^t#Zk zw}x+hcj(>k4!@iJEOaZp!3liDbntGnmfkJ2uo$HdGF}|PdXrSd00gidbm))PflaiC zl}ipY`*3?DUu-!Z$ygJQ!;-tdK-Ul58se3DIeMTHhC0q za2xX-aPK-xE&+HKn0FmfbetY7y@w|0cgMb( z`Rdq5*}VgB?_1@2_3YlLN3Zup2jJc(XcF$9hg&~7_Eo^^D4C#t4YJVyQi-klU~Dan zv5j?n=3`D2{;O_4?I`=@a1jni=}$)P%G@<_L+OVgRWa_FzI_#K^4=lI($MA)Xc(Jh z&At@cykX?7(jPLM2PS}Sos2I>in+>|GEx|1k{gVRXw_&@NrtWE@Hh*@zscAE z_^%8$1VbKgPa}^Aod5;=l>+kby$XKM4Z83+xv+QwE58dm0>*@B6shqPG3yO_v*8qx zOcs-5IR#IkHy#FwmFmr+{vjpMrAJpgw&03<*N1WAA-fWwaf z2m%KXph%H|NQvS{Bqd9tMEN6Au}#zCC>}Xh;!hkpv0Xd18)q8Jo_y@MvFkK-T-VIr%5|b9Hn-g)-g|gZ|@ESKuT89bS5o_0CsQh_IBUC_jcdD z&)OG=-R@X)QHR~Jr>l#QuA#0$U_trbbTSc*z&nE8sN#(_K@&k7jT@%fI=T2;t0vqa zCZ4gBw)8j2U2Q={t*EJz)85^#CpWxGC$rg5S1MU34erQgB0)X%+(s91yt>Kf>7Ud0 zLR&}qUVFI)A~0!LYal?a!h-2%Az1ftc}wpgsvvMTK6>VEcsFeD=QnN|v~4SSkbVc+ zX6STqv#P4oIgC1;IYXxt1Mvg+!go~dkLjHco>2L|;eGT0n2&8F!TS}&P(a4{vNutx zTcZFmwQzeLex{gLNr(z89v&RL@y5XiVKwsVkA6fuF;4TTx7ZH)67iF;z9SP=I@()Z zGL@_re)v0sDa!&7v!Yf1ilMk!#*B5r*h{h!09Z2C6@Xg&rIwOt10hv3U6A0#)syZ0 zW#XrNgUsfOCa56^vK=#}ZSNap^V?Dr)s(i9pmK4973T}|x`g&tZj==c6zB^xWAmd& zE5(%gtNlQwa-wjcxV5Ogl_(r6==(Ai@+ShG!5ttyAm2_^b{4zZWDE950S>Ori3jhx~lS&1Hgrv%;l9~(l1e1{vRMQcU#vRZxQjHsvFr&xtT~j}N6SStN z?lgs}OG6QI>?8Ygx&8eE3vKNS1N}z2y=`GYdv&iY?=3}#6=gU|Kfr%V{1R);?<*Ac z^8P|pqZiD9~Eg)iA zp*NyoH(}bNcmS8(9|>ir`#-|JPpa7vd$@lZepdJOPZPtZitsZ&8GTa1Jg(2b%=1qP zh|1wpZq@_saG;%-g*G6!6__hWZ@!wa1yQpMIPOzW!}lfi5R(q6Cr=93sOmd63)kp& zcWy36dvTA)ApuTOuAtD@Cun1Mpx(w1=CD+_1^egs3TR=CJ5XN1Ft`qC8e`gB9-sA_ z-?sWZ^yo?Y5`9VaHH%K|gm$M>Z1!h-0|BG;ELps_D*gIaML6yTE%rlOIKwidT6kpK-yw$`*) z)&2kLP*mTY?r&+>aesUI>K)sTZqxs_ECmJ@hd=X^c~zY+6!Yuvx|94ZE#4xfMJJ zBoA(P>I-%H3H7Uq?QN<$GdMUyU(kxd4(*4)uU;RTn;Qb+i~^kgjmKaQlU~5YN%Aq> zKdBc(?AdJ+9&Ab$QA>j{yO5m!aHd6_z)6vi|OcN_1o- z3vxkA%gE%&#P-qbaCS?n80n2B%(w!;QJIZ13o3Z{Mg^sk=PdhnKTsgijm*W8qg-7*CS@z~sO1)c61c5!&zuQ{8qZ zIjQWB*hrpXTYtM;0o%`T40S9rE*w z^B10XXlnn|zTLCg$t;Y*mcfQG@WL1n6ZCO&FdE^^Y=%$>&^{A4uMG(ns!6ji8iOJk zgS7gewWDJU1p6u&{e$k5p=BYwJYnUyK{*7W2+$jIk1pvD3a)J2=#h1BL^q zeNMlUh(r?l9hlNinxj`8Mc~O@?lKs-|wVi-J5sk3*TXt}G2}ru$ht zl-bumM?MI3Zig~iFB59ZPC}h8;6a^w8QbVN=ejzFpzK~==2};lg|biZvZi%q1LP?E zG@FI8=2MOD%R|{Gd6}E8Z_80=3zm5{Xy;u}mVmMrkmY&Vrt10Ye=w6^zScUik~H4vi(+k34w{DbXvajra6RZBk?YL>Bl%YI7r&_8?mJyo8wnI zj#lCTT6s?$tsJcEm-$-ZH$eU~V}4JY?{|y&2^)Rc;SxpJrYUlhO&lAI$G0UC+wj{T ziTLqDTQ|5U$g-W?(`1!gl6`f#$x0uIk0#=9<7hlF8lR8w!(RN6)n9FR8S&nP7w&9j z$rPC$8+ucT(B1nc5t}E&^+6!OB*MMUo|p3{qMXr4pm{_-q7{FwwahOX9$R z>FK^c+z~r)NIQ(0E z?6<(?D>s7i^LAY?LOMk)IAs^MtVLsE?cF4z!{7Ja~1<1!6$`d^QN05Ju=aUEZefkg5AMkw7 z1mcf1-sQ)g=Cm`R;^M_$h`#JhY3fYN`Y4cF! zfKHpg(M0xpM4j<6NaXOTqfYbUnWz8ev&Ji67Yhxcbjp)1e`ZIuV4x(_4vxt&h? z7KPp*JDu((hoeb5!pnpvw_V@2Pn>#&{fv15W~oXdp!>RTM?ZlGH?OthLcDi(G!;&w z_QJx?5HdaRc@&Q|g*Jkbe%1ho2`aA7Hb6B{1*8sRhm6|nm!VM7+k|!$DiZ;Ivj9Ij zWx`MQy#o@uVoj}bA@0!Z4pchKQgTyc;lfizC8lr>z%p$$_rEZdq6tObh1AAiqCZkJ zgen!#Qb1co4I)An@eO#vhuE_^zInLy8bhB$gdh6J9|v?(j13}>9^9nL0IL=Ndh`=o zZUhFx%r0>_v1eCbSp%c?GL7jL00?4)*DiSPUM3mvVpVu?Yd|#ozk>TWbH~yP5l$Rl zMyYU9W8oUMQ9sr9&~%Mh*n}JJ3(IW`7$zy&hjl>8&GcSgxLU=x7~tD$Yxu@Zk9i}w zhiXGhOnk$&v{((Fz@r?Q1gjfR(5pDUv5*cZNiqS2zsypPa0pjP(utb4X#(hVj??R& zCxQV+s{~5~Dv)E)s2gi`9Z|E!36_`Am5quy%7r<~#m#M2BvTWRybo0TGrI|<`y5Tp z048WWT~X)`ySqtSm7AL#^j<_q0IRHhnCt#?d@L5*hRA`RolsDPMZ$xQMdolV3 z_rrs6$-%gA|6{)Uy9=;{P4a^nO&jwV+GcxEb3$nXb#%bIHEmX*k7*ClM^t(o(~qm# zIVQh*3i{Iubw(=PAUM$}s1jB_jha6%_vWC9GSrwTv!7`%DsQZQie2)C@?%K82`#SY zRTAQ}V73uEs^BxF28@end1w z3V9HIF{q&o{I(3d<4r|-5t?;?UA+3~H=^2$G#7|5%b+>hL+v=iUw{$T zbrfrKu?OH(PZvp&W3RJ20f*0_jdan+pF_IXYi-2+87SMw>0ku`zgB}%I1Ye zx-g#;VHRqni?gtgZ&=LHfd>~CA3Sn|f6LVrd?T>(@a5(HUUm|wwAm%m%B&j%IS8ZU zrZ?>M3beB2@4q|vUG3o0Pd{yVSOUJ#tge^n;~PT5OkyGmWQf{PI+2%a|4 zCE8po#N`xS&g+Sjh)#071zk@>La%RfSn;Ud8;KsobBV~XN?#zdEG`mJ7WWV`vSpwI zbr*Y6@o2P|)Xff>ZQbc`f}0%p75=M-?evA~W98NcRYg;MKdCV>V-NRt_4oI`3Lp3# zyu<7M54zxKYxA@vi^b&e_Z!Jz+sNv}$@V}z9_UD%;C~NX(cIqVp`Ne#JuUu1JWRNzv3*$$u}f{3;s z77Jg8phKKsnakw}$qnTOOGT(58%`wSB^kBpM&Rb^LcD;s-c^N-Zb0kfrM$Q<8rr|! zbMT5wuFCJuW_RcBFK?N;etP#G?A~+FC67OT)nkV*xc_i=bhLo+MA_^)ADd&BT$2XT zVmht;R6KWrZM$;E+#L&S-z{_Md7oQkOAnlE#-~P1FL&R20dDb~AuY53%szH7grEP%kSfQNNT@T| z-rC}Bc9A4aI;7TgL5EM-gwh%|n8D)=mFC(}N4mO8E1z2^Wit7~xdUJM%GSLzgA?67 zYEO4(XLrxnNA~U=q4908*tWQOpwPcR&~c91e;}Wm9U7WTb$4}zdUDBbP0Q^W9^TF6 znYf{!bn{qN!1GaK2TS)AJP%m!mKEp$wO#;2AMq)kI6oHH>ZuMeOi>--lvZ1`uaiO zgRXn;3reCYcz-3vAh9~UZA{7IYiEnP^%sF z!WJvW{8>TY5++gr46HcpqO|O!c4D>ItxFDy3;hL$vBMycJ=rY6CA&F0P*l@B$wWLB zRcc`4GGMc|^BgzWOTDtVWD}7o`}BAbbtmp#cWi9z*p40iyMz||rG7N)@1OUzZ0#S2 z^&W_1$NhefyRFU5zBP8`_U%`W>EGIx@_FU*`K8kNWk|ddl`lSY=9d?c#>9md?=~B8s-xo@SQauSJ zTnmSH_k~M%st4uP?n9jxGcLMz^W@~_$;&dC?r!*;9vzO-JCR0CJg48-ozZE%n_kL( z$iB`aa1T`m7!tTeB9>*CRjEYn(h|WQVn8I}utT&$T9_Le#PhQiZ!CtNh!b5L%=3O) z%^)NwyqUbG8u8lL@({S+fe|rAp~nDlX^+e0!QbSj=H^Z463c&I@-;8e$U?I($*u~g z)8Xe_EiJC+FohBKFx>oe-N|J4bC}Y8LFHy&JPxV1cuZmX0_}lubr3%p;5dFJzeOHf z&+mkJpc-!(akkcMvvx$@KRH<{!6%$bg~O?Ih`wM3?alRu!kJ7s)Vtmflbfpm-=&99S0gv*e3!S@NiMxQ_BCbz8lbLvqj5~e>V22i*~RZj{JW53t# z)uSB{vKH-tGwuXi^D*V#VEk!SrBn3SJNqa|p`;V$fR95ReiE*9RU@x1nNbsg-+RM~ z7lcb5AiC;BQad*)U+Zi=dX&3^Tz)zH&^vhg?z{QV>PK}yRd~;*xE~AmvBFS8800}j zV|rr8H}Zfpc6-7;n@)ve_|jN7B1_$AfAzJVjT^A$#-jYS-juoq8O>VY7wBwl0 z9MXt|9E5@RDd!I{(hvM{wleLYBJfAM2$P|mNCJ|H&1P)3LW}usE6mP%aGE&GjGG6_ zrFeh5n9anZp{@=*Qx7?U6Js|vaDNp4t7*KUUY2S%4RZ(bVJ;`GHbnv9jT9KEDxyeBoDOpd1@@lXzM z3H^8e0s5YYmGqv&-*=9LyiwEM)HOEqt`O ztJx>LFJH4L{o9dijg=;@Mn^9hxcX{(Van&zz9*l*y>>my><=}}0XQcvRxU_V8_b7J zk-~vJ2)xo7HYxsvd?mZzLunxwOy z2=p28tmcCE!(5PxUOaSo;w-0w#+X5Txhh5SSx$4P-ovz z!!I1jFD&Sfp!=io7%4iZs+#z7qde~M>{Cvv_usGHci%~<>iOpln{<;WaGN}sjzqK+ z6_zB*>_)Bp7(ZTXjVlf33A$TrwR#MA@@sene+j(id6hnaFVc3Y`utZbXWcUWXbKNw zg^5pOOge@OUIBWG;+7~;5o08xneV0CnDfIRJk0iEu4Xn-}t=+AvN;IF3 zo=H->RE;Wln_9ysG0ypTWz35<{=3$T>5N$yQC><`qxveA*?gW5j9XsrhsXQEiJp34 zoof#CV?{RNh^Ik=pWJisy@$15`8sSLceS;-K9THShY1~VeY=5uYyTgf!xpb50v+*qM=)MbJ1Q9=GnJ_(YNI|X+SqTfPf;ikQWz-=Z!SYE z`EVk=Zl3}NwO^ke&e(ajjt1^i$9uxr;pO2>-{glIy6%p}cvsl$-rM)Ei$1VZjg2&2 zHuRpMO7q?kHg?r`W7pI1K!Ae_eVRcg$5=}W%!+IB@scSYFKsLz$D)K}dZPJQ4jzmY z!*NqS4%f@arru#qJZ_MV%XH_KnVBs&7x(oo@1^6~Giy29;MCOM?fA7O9(V4)s45-5 zy8j}2!S-TtJAOD%e;U@vPXgWwz_4y7`nZm>7J4&V;p=9VubUGX^MaBE9$shBDp*k4 zc{VF%wI;n34!8P4A^)@CkiQkutVPfJL;7zk?i<6q$#d+J=r6|Ke8#gg8sBz#JQfVb z0HIsrfnY2a48-|-G7d}rUxJL|A?>`*CcYPnAu$s%Ga!<8O-E*EduAm`lpON4l4z5i zc6OI6%aTpLRdPCPHv4JnHTOaN;cC66-nXibJ7#yvHc`4(c0m0SbJ}e-hf}&$wn^{? z1O5Wce^{?VI(f}4H6ccm{-h6A?!5E074ue?)?FDlUv(|M_};o4YhHWxt#u87oY6;# zKEh)e1$aw%EEzq9>ZX_n_se-N{YpHaWk{K#sJ#6|#S@JCoGxD?*j!=HKH&)}4o585 zjP+3s>U(UhKD}o+7{2IQeTjmG8m~Y*hJq=s7H|Rf#CTF2%4Ubu%6KJ>le@m9UVQ46of{#uOAwSgyQ>j7xq(kj(;ZS>f$iO%H0DFc6ejA^o z0O>%VqloEq)MB1^v4O|Y>n)CCYd{@L^%Nv)yN@TCFt3I?D`VNA-kyM8Pw_V8=rMML zxJ-Yc8toPziaAOoD{)b$0JAh7Tk|wJ4u(aC+wFJ@zgP~92=K%EdMZj@C7VbKc@XQJ zezXOa7+t_>iRB8SdoEno7>znG{iql2>V&&2H=W_8O=nTnyVSCr=xW%jfH^)xF;{bS^ja18S z(@+pSPTWADbb$~HRu(HjC`plk1~xQBP$7_zDzTv~>^P4KCyrt#CHw^vhy`mtj}$6`d`dtmTc0 z{2WI3?(uo-1g|~buHcKf6%0Mzso+bsli-8LyXe-xIn0Ewge{K)Tni69uHka{#^X9J zgt^Bdu7^vHwxuA~(g|XWsTJV{o{^5oPk8z$ zDC^R)Py0UUZSqfeo6yR1A{>#<$lpYh+yOG4s1mCXXP(S{!FNi{CSHjzsF%yn9%XHv zhv;CRbimW5Rv-6qm)Y(!N=m(yD5hkOe49^)8XcVh?hz-CN&p;Jb6bM3P? zJ#uq(!z7laWjx@t&BIXD+w@}I7wTC;i=XdYeH&T9NVzt^B$1!*lyRJ`#awC{3+0}v zSD7;1Y>Dm0DnhFHm3$}kQdWGsNjSS~otfLjiK5I&vww8lZAVG{DWyYg$W-#4e4A!T z53#awU3Pn(h@VoP%WF^hxgEDJ#m&z4E!AY)w#TxyTnEw^Yo@C&q0r7(=iAfl#=cvR z{<2&DzlE(o#6Qxs7k)yScJQTitv9EBk5)I`bthJm1JQ`z=&}AsX0&tDpQw&`CDuxJ zsDF`6^RV8gHkBX3Kk4=W004NLV_;?gga2C@j2N&004%}*>Hq)%00IC101tSaCB(rA zgHRX*;d%S-@fp&GRR|tz!K)QmSV$3KD_+w=TyQ=Z8qj$XZ-y{qm?_K}<_hx*^AES) zdj4r&q)i*vp(8(a;u`9e&o!f3YRUK7(GA@84;^@%?41XE6~+4ZXXd0p8YLvuK-&ojrSm6hiojiSl8g>eX-3S_Hh-uGbqPkMQ8Q&{~-D6-1`m&psL| zYSgXWI#krF+ltR7jcY#}Dq1&f-Xv5!->P}jP|>lqIs01cR*geNFQ=|_w#wPMoUMnm z^>nsg&eq%6W^%Tfh0m)m^>{hb{8*A&WadpwFg`&hBjwB$nKKdf{HdAjuN8>2Jnevw?yPdM@ zgs-fw56gx6G}LT^nhkO%`@8fODB1u;+f-M55E^!>(|QlO9iZIku9!ece#)Z?2Z=(p{%nr`1m$UV+at_-?dY3aY)5bcv zSI4Ms`W&S1|*RLAq#92#73d$$~{kE)h@lgdvYO0Czk)CN6Ec*50la5c`M zH4a**2oLBp+>Eo5@5T`qG@ONoV}=jHOZC;G)m&&j$o3F8436m0!lnAKH;-ET`6kud zjNoQ(-sr*^dOU6A=+=cZmO}&ap)%>yTVxRu8|c6&U(zR3ACZlt`RMT&Z6(rHqT0`~ z1K^;Jg@RZph=qb!6{pV|3x|R@ea30cpO!As(kWUBlHNXRru~@ z`|nG8QNmj-1y0|>6TY3s?vJSnU_bi@^l679H%H@P_Y8;OuKNg7M?!TZR7XN}B;0n+ zr*TdiPV(8Eak)R08ZCU(1mTx#k6!J0^O?S+J)NV&IXZ%)!#O$v-(`9qEy}C$aB%|L z1tJuGHC!zNhUx=)cv7hfl!~EL1*g;qN{w(zJ?OUX#-~cOd$;{OWG&+mdK!z49zaK9 z@mHrsCNy{p*0F-K%Q*Y9TxNZ%vEZXJ9*gv}XLnL+7k0iIKeLB=rnM-_ujgnaN7qwl zJv^RgI86+aa-m!-BjplFDY;ZGlgs5!xl8Vrd*ogjBV%Q}@>9VoR5ex2RZG=Mbx~ba zH`P=1QGL}w^|tz44Ob)8C^bfnQ{&awYMPo(+?uE6t3@hGMXRN18BuJ#+MqTO$+oE- zYQH+54ieK2EA&^LR%aAGMO}4uarG9;6=9;I>kZcdG@=mMM50d6r}Z)H`95Fp`MzIz zw?1~?Egax8UZ2YNh=`r;?IF`r2HQBD(caT-aj8b1MX+9N->2@9-{tjieOMI4qC)kL zdZk{*vD|ti?`^i#6CzZ2BmWq^LLb*7@sD1@pE~pLuN9o0kLvgAb}d?cdm8VWTMvdm zHzbvTnsdO)d#)x$kh-8Qk|(xvwRgSb>g0Oa)tOB3RV=EjtGla*tGBC2wAvlJ z?cwS{ncmp22R-!Rcwbjv+Uf7=&)EU=W-{PM?A*c=ud`5OlZ)gc;fL>8B7E>Z(INm3 zv{d-xfp&`Qc%fZna=Ybjkp)i_BeJUYssqubqk2gMt4^vD`<+#1krSWPMTDqV)GH#t z>Y;jw0;;#_ZK4iw$3yi~{Y+FLrUm1#-lpUrHHeb$sCOv&nfgrRRYTQKa)@DS7}0cu z8X8i$v%ve-cH64Lqba(5`FT zsw1(tl(~@lh;!U>fjRSorD#91-Fqp2CdIdl_u2bl-iMr#9n@>^jq9Q4xcfVpZ>{+F zE%i3q&+SRyx9ctUM@h=o?@lxHFDbt5x1Z;U%=lnNb&M?iUV5En-p>9iJ&#ttCcEEZ z^x=lq=w*6qvKo7w?IJz*W*pKJ^`ulSpMw_jK5{SgICY2IawINk&u09{%NeKsHR+6_ zQ+ku}!G>nN`KG-wFNsN~w?o9pHHy!5T2Ipo6p_NtP85P-l@!A^|E8Xhk1E&drfJ(_en?Goy$DH-j3=6$o)8TUi0le zEOZF6+sXddsY<4i%jkX7{EoTqd+6#}9mSCk^+#!xTgiK=-8*Tu;{fI3^jO|;df08K zyOF=7xja1^POUX!oHlyH4-nohlbdr{y^*zD1^6 z?u7NMBU2nK=xi&bC~3GAdN+OF`^);(DE&#&_oL3}9eX3nABGb#`ct+a*|LlEue{eM zYs5d@*5{`9Ha*>PZeEN?aqtE&DyArTIN6y8{Ibz!{Y?+$SVks$B(urH%@MTjYk0vi zJk)BU<&GP1{SK|qPVsF~y5&w=&lY{l@%NnVYG~XD74P0nuMg^lrL9Rx#eKE*%bm-l zD4)WLjQ>s@M{ZktXVTtOJ?-9lzPHzd@{j4XewMiCM3Riog&ypT-OdO$KiC#C{=!fF zsrbn&4rhGp><1FD0_5_No&* zoz<(tQ@yTU7nxO8)l>MW-l`vG2dZ~Op!!UGD{`vu)ok&wnycoDs%pOaNmNsd)FSbS zid2!JrixNOi&|>6S}Pi;_3DUdETn2L{vm?xy*`=wH1|m561hcA_RL*3B}HN3EAogi z_B}c8VeVvdUYTvlJa?c!yT~Dmh+@La&fyf_Gm(81a`toB{Xh{Uii+aqt|)u&l=*Is z-`F=1x&-jD_aC_Qkkxq$k?ZsV`|s=kylt2YnX)thW~^`@X*y$Q0bH)ZVV zO%A(ysyL#weF?__X7%EpkS3gRcRl-Mv z%2CBwX^zQ3=R_${!(>8u?sdfVo#fOp_j`Tr?q7P9UQYgcRBzX7^s)43!hbp)58$4K z4EFq&tbbYgZXiqA%HC1;wS0Z$KezT~uC?il5Ay2kUH5$HukSNi?>qmT{`Dd~j~Uqt z9jWIUN!w$)QkA))Pmr5l(&zPFxF65^w7!7Volft%>Rt5vE4^+YKbr{es}!mcznBSqYGdzM6PGy){>?Hi?e=yCcBH-*x(s-b`FL>~2+GzD@ZDbpHXq|FXNSj9hWGbLpV|V(w*qf_^XEPj-XPOwb32Ugz#{J>@*~-iNi~xzFQc?Ro(Af7c_{i8sc3x2t%J zFY#7OhtuxW)w_&djP`>2icH2MMB2 z_r9_Uy^J>J5KYaM;2pN_1N6Apa^1PYWUo7?y6%YetS0Urw^weDI~>1LtI?fyx3d%4GZAN4ahUOeRHd%bF#qP5GsDh4LCp}-!K(Bsr_m!&bc{C}OI2VgvZLoTE7@xE&b(=Rz-(Am1-!l{q z$s4xlC3=P3Kj4lo(B$@eaY)_VQ?Z+fwJjs9XS83ZOd9>#xPL$KcO|@E;J$uq$95E{ z9Ci0d|GSw{nH>2*@;e9Z`jE-5ennne@R&!O{OUG2)C0?}E+@?q?qMw=dGEAv9 z)7`Ntvmoa>QVfxLow;N6?)!caFP&&VGtet@<4efV+>?BVRTHxFWSNw`Kg!-ub}vym zS$%WWYlU8C_jfz@f+gyMw_6vmdS&{(58F!7?=I}+itYEn9r{%wn_MWD3n6#Py~4-* zZb@XZ*QB#4Pvt4HtIR612vokxPvlSmDvJnKfhthsQb8(MQhuJIYA@+)T342Aon7yJNY_F&X*(>UW z>=pI=_KJFTdqq8$y`o;yUQy3!uc#NcSJVUT74LtoIM@RIwp1-eQPm1==Cj<)X1SRSZnguyLW%$p zC~}CxqBx(GL}lR;wMBi7H4rU1(wcV;@r-CAN{Y6kqbMl4@h&8~i{7G?=qui&=38Qr zC@tO*AJXDvF^%%kVuh5w1#le8wk0ZNu$Y-8iH!(jZV)crhJF}yrs=KOkXKtV-)wr1?@x#RX5w`p_7S_=z+dV!Ug(@Ts zSZSbN^JTb@`{LnDE!nYN7HBJ`Gg-4cfdR6fj4O@{#WQIup8fJ=2ccPzrmFP z=c=pZz5Uj6f2uMS=l1Lfq>02vF`Vb3H|6A%#sj;DqhW4f;oOL?8dPu93J_X3!*=)i zl?%b=8pu9X#Q<#_XkDCF?GuZ}*$I=9GshAQ|ul`$Ob}M6(=_PkjXEp0YDnMg4>9cGk_e z7L3EDX{4%iXvJqgeL{Bq63rs_@Pnc|va#n@^9h8NN0FE3(WY2UUtN>SRHMx20-OH= zyM&-9j3DPP=r>+B?y0!x<+|w^xann_|Li>f$+F_~yzJz;+KlGd;g+~kljE`0oHXwC zm4PIzip4ZxNPkVwTQ6+f@l_wThOS1CkB?8rEBU&7e`a-0Kdz0CIk$}u&l9-lG~iNl zL^$PQU|=BLdFs)8@3m%|y+m58Z;;mM;*oayG45Ub$aOigx#c}|_3`^vrL-zT#^N;n zWGkb4>Q3^IB?Hg=PrB!~!-$MD%a4h&q$y|tRUeDz@yCce?LW6sQ&4#xTPEH1zC%wA zxBPpW{k5frwmq6}o7Z?JoD+_1TMRv{AA}zvZ-(&0XwyvjioHvqx?q#$u)``mvPEBW z8WAR0IM0&var+LOQ-@Oomu}kz_g7PRx!ljz^Nu!?sfZPm_=pakDJ};*sSd|-FAbj= zLcSwu=lVMYI*LkSyp>Puh76*=R7}T;M3mbs_CEs?OzKsC8|YWW{HVHm>YszFrR}W! zCW6vK`a4n#-Lplimh_Y1#y8sOLfjkU-F+r6au6Nu_YFEgrAoct;I{xR zNB#1f$yp=;ja!L_&^76A0EVOTTgt9W6cJ5Av)BY`ZA!WdDMOW()==GuahS{@z#{%EjWKpAGN3GtG1n}{DAgCO9o@J4p5mbRznE%l~@)@1A6kN!YO7VU^Au{xnLYbWcYr?*!}C05 zD3tHPvj{atfrDr1SYeVaB^NM$R185cD+SOR@bbZPUFf12m5Q0 z=gHwjW}J;c&vVNmEPX>u`O5AyCb*8BZGD+}Y^tk{-=ed`m@9p4^XNjQ4q!>gckMJy zgNg{**Jm_IQILK6q%{}txvo1!!DqPptUmR*SgMdkVsEngt4HhPHwmMI^;-Q!a!bSo zZu8l?!?%v9)fnqX*A5&4o$q{eC&7~x9aTQf6K8~u(U%$}uc^7U_ivp?<+-e0lNW6* zN2R&EUVqM#x)i$w7GA{eJWHmo1Xy3P&s-{|9DTc9Uhb>sTP3!5e39>OPdIC~5zY^75OuRW_dfx7EZh75q zaK?41pI4V{;l63?_i{p|;LM-oO#7pIyRUa_b$g%Zt$cFt=aFsM@;|Ng*+aYIzO8N( z1_MX`*+z!?^uD_4v)nX%5za;46_k3~9)vZJ*?T5o#C%I5HvO(QMXUMQNIQO zW>gpA$}0(6bJEGFwco}yvlleQgQzJPU<75&9QtpQyq7A$@d>4eQg>`#`%=x7H3`<=Sd$N033{Dq`Ak zJU4$=)Wx#Da`4N=BpU{8PdoU zPD*GWR1yej$s6M`n>;uv$SF8BcjoZu+HxaRBQee36!g0WJZdTNF1g1lK6`97S3)nl zPQrzqXidrA|hbiG~wX>(uoKa z=pMf;*xRw4w{5u1&xGBHEC50j6c?^WBl*UQuCHY3T9^q@%4(}O&d03ds6IB%TE^ur zWGFSd+mB<*WO`p30wbx|pCiYR>~v@nZTu--62m5%U_o5sOd4l21P14__}O!J-eo=> z7rx*XzFgUZ`Fbzr6mWsUulDQoq=^LzSck$;{ugA9kbmr9D#fT0u*tkG^7pzI9PnE~EE}v~zxJa_}Ag zbF2Z`mg#FkE~Vh&*a6cjfp8Yt{gg8TTWr||ERT*t;ijfn&ex#(=svGOBYxAmTxKm~ zR+RXWapM5wD@af+Im~zrGw>B*VrqoQfWmxiY9!LS3n)9hpdlf$X>2x7d12OR{3Z~3 zVcV-%!q5Z6ftyfc&w;v5V3j7Oua4NMoCsrhKs8zt%`3(et`B%Of#I$UXB z%C@DIA*4pIVJ~hS<{R8%;Jp#}a@9~Iy%FF;#m=;Y;2eavkD(6l9Mro{ppFPX|6I5w ztk?J(1U}?YuM@xOukAdO`&QD}3)pX{Kbx&#SMR7-zvI|f25}GwWib@UvsZC=p3cm| zdj!i_$yu}r^lHW>`FT~{L4y**55qMCo)drB2N5R5-Y-^gXz^S=gnYh}#_8t}#8n0P zahlUWye5**#I&k|Zch{HhGD4-_9HN{Nf|DAQT0I7jtFXJS|!w8TL~!{8spAP8$}H) zMHoW~Lk)aE7?JG(MG0*l3xn|iOwVU0zMz{o9?2;R{&3{I_8*7xVim6 z!{~@+#VxJ}L6mQ>z2-C`;dje5@H>buAx9yEL|pS9PG-lk*PkWLEh{Om_Z&D z$q~k7B1nl~=HpSVmObiE3hb$$RNLy54T2HOau%-`x!blaTLF%J?$dAlPoQ$3s(s%_ zCqY>6?2AWVoe zkgFk-WW+kJViw*nNdvn>m0~hVBb|K|D-zh>#S$x~5i73E4sTj$3ql<&A03EtjjrNCIYA?xg%%@E zO7fEs%Y^YC?9aowvSgV#=Div2-jDZ!7stTcgecRjzAc9?=-lMoYvD4carTy;wVn)@%axu^0Tin4_G@* zo}1FYXR*(JhO*}go>{&4cz!#R`sBBzf7E#S+*&!0A&}S!V3%aP2G!al~+vsd?LtkBa@`8UHFA*r{fR1 z!(rpmjHx(=V65GS8Q0aRWBKF!XHmwBt)bdmHf>>U>#RNW<8KV39=^gMtDoUKzrKD8 zWBC+i6Q*vKsYO9fkXE3I%2t5lPE?jNN4Lch7ng_!dNu{W*eD66oI8;u8wTHKQEx#m zgpD9jCF1x=TRb6V>^QRwNSlSik06vW7gj_c*RhhiI7$#4Wt!5n3?!I^k^wv7ar`7D zu%#t_#(%xSYv^?x2E$5(oTP%!9xPvqhg2Yg*E?1EbIrNnulg=1-JBLa>wTcoC4Vqe zR=?s~S<+pl!|i??OBrVc_%wf9ZM*>C0dx7D?(!X5GR*0Fy6WCTUg@FP!=Q=_3pPE%C9&XcVZZCl!Mj#$@EggYwoYQ}xRyTw?@P>b^o|-oO%)^YE z*=5$@qijFfE9CWk06Ek)1wIj{)12Rh{Fy*HVGHl1bp+(c%B-K+=<`Ys=4{HlYb4HG zY=RWjvhLKIAr2y2n`1G*rdQh_HvEIWtE+ zjLm^S2`98*WmPB?A@)L#CNvih0~4d4i9y|%nI+7pI)?NL?rxevzJoqAwB3YI7OP}! za>h*epX6aQD7|lK`e013GF38nil}bWeTwWd{YmXIQMlWF(N^t~V6~X)>BviRf!`gR zGvrTgXtE~FmcZC}fzTeH`Acx0N~~MEFz8KLExB=J(wJBCM+F0^Ru==Iif`ZAxg&ZA za2*;130*~Z`49T@JcCj0sH>Pq2Tz1v%_QmkeJG5xD@J$Crrm2inO7p3MXGB(0PFX_ z^6#YO-*Z|Q@3+4uuA4krXmJ$5=60mNwevkEb9+J!UM^=K>%28@*iN;8AH%$u^!;;1 zPqdmk-oPF#l>I;tu#|vgsqBaOFUl~iR~8V4;AWqDy~DV;;yV&|;hOv6FmE{@$FhqX z{oo{Fb4ZSu?LPotR~>6~4mxiO=xNp2$hC)_M!8!c5*-;*x?xWCL7*U7o8>$!X||-s z$=#jH>!d}mjARPZ8?Irwp#^i5Pf%u{9uLv$B%lQ^VCk*uRjRBeH1&6%Cj1UU&?md^ zl+!zw&w31I09qTg)O)s#IF0drpz-^X)3PhR8$p=(6zh0FhRIT?(sradA5`gf*A} zj{dqBCOa~@J7bMa&E$Ro8DpZ7x;T|(Nt$a+dPE4vVBu{_3dsClR(%2J^ZRJ#=H

XlJ< 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 z z9py|!O5}-Lkv5V=E8d?Gbyv&Y+@e1GQ?T4$?k~;pskFM^ruF8I_t)~hk-eI|#(f^s z^x@fmX20%0^l3eqJ$P~O?=W!rpM6YNvB0IG2O$_iF@mIMhUIuclw?KKbi=wNjj^4J z(==Uf_SK)9znKAO@V#wa_u;CP3|8XMsDtxaQf}R|Q+>cJ&8OXsAbrj%!%v)0{xJaK ze}B2w5qG%QXro43_uoq)tx}Ltply;B(m+*w6;^oc66|Hokq5^L#^)& zvRxf+LuZlg?noOuhhR)@5ISpv5TOl1q&5g9Z4jcgL5S7{Ax0a7SZxsEbP^*ucO0IF zUKufpgB#Zn?oN(G=)OWwP~P1Ojah~ zDqMziES4J4EI!bN2AkC6rZlx_O}~cGH-A~f&1_b)o73Eg4vg{ljY4XUX2dzlI!@gx z+`}{7tfy#4RV3Sx@&8|fp{0xkpZFn&EdfgmHSJmH{1#MEWeZ!>;+9m^(w4P6&oiBF zhM8tXjE;h(n3=h=u@dJ!t1A29i}{jtsbd}QL?=7d>CSYvbJK1Z&dMQqF+0IWR)d=U zhf*#oIBFsi>BU8IvrRDw$d9n%eei1JLojg5FZDfZhiUS{47I}E?`#{)JrB$if{Nmt zL&?vPR>tT3rfW)R_}madL?R)QB7?Km|Bmy}fx#X+;9&!Aolgz%-KIF!tqUSoM8CXY z5}uOen{2fs?rIAodGx@FbJx>I%iG$a&f&ZsHV8wI_FTew9{IX}!&&99b@>N+e3mYE zUysMsIH|NnLu;K|)*VAlCbMGjkSp21Ekwuqh#x4sg~- z;QmZ_1grB3cn~S1=ox((5c_D26F9n?g5rzG%$8BR4h?foMx~fu!?9@MvwNz>Mq}Cr z%O>8h=havdIooR4?DB44PS%XYZdo;t`c>MTY%i9DVA<@tlzdJ$mOQ0q*~BX}tFdPC zmb7IP?`6BH#)GI~SW$I8Zd1FBdS@e1mP3*}ayDfk?l%OgzHu$6Jspvw@Z^BAb-$E^ znhxR(L5LA@Ad8VGix`eMTUC*Ibt2OdSK-Y4f!N%ZwzjS9?PzDa+O4Pr2*^sX+uuQC zd)nK+_IIF~4tA)+9ogf{#g$G@r(Hz@Yv2Fu=>^>I$=z9Czc1!PycNFacYp^Zu5?AwQby{ETBEC$BbPhU4U6RiBd+h+i2^#*4V)T`5jI}n| z%>_mw(Zpe|Io-aDvf5#aM#h_xq?>- z25;PJq#e^yrr-fOoSXWXiN zG&4`})M!8W+;tkj+*fq&?#Zm1CP07=Ij_=6F+|4R(U*B^VA1pSbYrTSua3c^d*(0} z>AJqcU#*J_1#%VY-6(ceRF9!m`_DXCbs_XJ?FMZL^Ucj}V&%r@YI4QAHLC>Xs?2Fj zb>izZPKsoy`dD?HG`70_e{E|lu-R@q?Xb%UM;&)erK@V)aMK;PL=WH zUwrk$H$VLgAr4|8CSoH+h|)@J9rBJJD|WeYWXDUBGF9pWcHE zSdWYHta!^x@UnEz%kZK!t##2-s#kUOwoD)E>AlbO)m|T;>g`Nw8~m|R2h{8A|Dx4r z&R%2gY}My#Y0RUXq^Twv8@;KAwz_*=Hy`TttD1b&CE}}En z1Ae6tT4_w|{rZ^O(QPMX(A@?f#YvLh{zH24E%N>M$aIb7L*7>Z5x13b`LDWR=qzos zaSnV2A{!4NupB%DN_pGEV9r(YaA>v5=g%AoBTQ4yp|bf=sI|TbW}kONlJ1Wjl@;P< zXJCnUql{k4y-SXeKBO0pUR}~H&B9=MlU&QdyKyTGj%UmSF@OuUMXv|PMzJ^BXeHj> zAgb>})2E`za)Nvq9h}qRM@*UC^q+3??#(MZZo@32zU4zwMOYfve3hQ!V(5h#W)j{q z86xYYY!knU`AsR2m3ZWs3-g^h>&YJXL zu_)1W7&&Vkq_oCSTZ75{O_NYUUGZNodieMB6-8-6atm`pUgb zSkQtqsNB^i3DWC~cPuHvX0o#x!NO8@?01z4m^6kA?0+dqMctf@BNaCKIbu-Igfs{_uVw98@;Iol#p9w9I?(0%nEVjtnUG)7J6wi(>>i7m(%d+-gDI(zMiELj*tW_sM)X& z>m1ck8I@24h*%Z^uqptn0kAp%YXGn&0BZrTHb8eD>WWqvq-VUWkwNsxN7dRznZD!h z8-jt<$4&5zAkAdcE-MeMcekIYG>Qkt)!bFngV%0Xi&3bOw|vdHTg_)>4t1Kz{=ErA<)LSR_FU&#rb|G!OuN7e zmAOS$s~HHJ%)ZzC%Q2ZKikqfbK15+yda_TidDZ~Vw@U%R7m}uKO}aJ-Ti@#YBy~N# z5*wteT^$fIg^X7f-`+%Vyp6kJ`(&wEi&Q7GDFhR7Qy*r2nl{bI)@J*%AQ_sf2+J!& zva*Ux2rJE9$=#i0_UvL3qOxiAGNYcD!uXqTc-$;cF~p3>a*#mcaseu3vX8cR) zPECCFCePLkeq{$zg$}dsp=XEJi6{A|07Iz2z@AKiP$Q27AI4Ulxj|RLD3VFCLmZi( z#=M@uPz&a*=~6{uS*LprQUuIaJ2O>s8?J2M-Xlz{0n?|r7U#{t`i)kX+B)>sy62Se zyDpmf_*cbjXZ}b>U@gqj&R`?GTu{F-AbYbK$ks9x&ox}An`&kBzCw}$Y;ew@rcSLr zqH_DEnKqU9GY59dl{r<_!-U|BKDUIpzNw?azA zFAhPyz6aDB0J=*Lst*CwCxGy3g`A4N9fJCK52#-N^phS`{{pD&y#RE-#&6>PZ?lot z2GQcz@xPdtcPWK+)E<0qzVkoo{ay$l=ojPL%>DZM>(4>|4bJj6!1;fIbXCj$@t zEm-?T2jRD{f!q@5WqG9!^qnYd5bdM%e8$nlu^XgYOC4%WmQW>Tc0)1pBDlZ0wRF0) zL74u=WRPFbUa)5KX+*RLLbt62%k8~k_ z5ywX0_46%ar-5=lKTy%WnTXVYvQo^I_C$Tq4Z0@bbP~Men)1Y$7(QdyHKz)>>;RV< zLp{$hV^G8<-#PO0W3A4n(RuXsOI|Ocdm5d+-m&N9J$i#;T_k$86-FfC`ZOcD3W z52nh*Ih*Zm4l8t#7p5YgUK73Ov_kefiVwb@ER^zmKJ86)Rg=rof+^aC$qWm-nu0i zrg#Qfa?a0Z{7h+sE>@`|b;&D+d6V}lG%$;*=lXetY%bGclsa_IaagXWo!2eN8~bFs zN}nd*#n!ogqHhrI>J5OitEZOxkWQQRtaI7!5B?rEW_?qA|Cla%>x|J4a}24r7zu2} zR84UF#%EPYx|(1uOb}s!yyK}52sv#^fF|UKoye_aj+f3 z9#9UmD@B)TMfp`3DuiRS-^GwAtABALLIQUHOrLroFp{Liv$2nhhG$(pW&AiCY&Y2P zR%yPR;gK~Q$sWaDvZ00o9;N!2M6l)_3(9$(!7`51{D_0#T%+Z~aH{x#K^pq)QcQKg zCn1nQAvXFQE`^tko#;*ocSeA-hq{$a;28Ds+f+xf^UCw&|#SP?c zc|V}QQPakx`WofiEtjp(L;lPV-Bkj9r_`XeLM}4)6#E;9HCr>Yb*g@D8fDhV<2Q@o zLp&pC&!LVZo7vlv!o6{d`OhCOUJ9rH2rv{J>Gzyn&SbxN#-faE-DL!PTt(!^w(20C zQX-^kT4d4i=#Y#w1#*ogx!fSu1KH88L3(2*nWM<0+H(cRctbfpr(A21%(Vt*E&A$Z z=A1xKzhdBH?O+&Q+`q$xdUr(_#XSyq-ORw+Ra*^Fdrd7^BbTi{F~N$J;sgP7xERG@ ziWN%ukX238=DudZ=_VZ+)M0RI@YXO1m^j*UoneZ3sZq$<2xNpMH2thrwBrLXMj0M) z-OMmSGV#_s)#Ou%N7;kF*zQ{ zrcFrk0%1g^06@B`vSt;#{MF@i^iXJ^?J*%hINcv!gnS{Joi7}1V>RMoO-4L~zpILl z8`wQH-F?&i#XnS3IK&JJK-#15k)E1R5B{R~0d679RT?97pLy(=PH_&oQ~$h``M`N+ zrZb^~@@KQ-k|kKPD^1c=Tx2W~HzlvGjDsXON2r{DllCDKF(idmb@&8V(f1P9zHZ{2 z{aTv^f2H8)?CKlL|K{!7Ls{Fix8XI%ew4kRz5kCb*}?=f2Ia>)Zuq{JdC4f^l#!o* zb9d|lcJJC+;j(oHdrdnTJ3q8^D@i8TC~JZ4oBn)BZv`?*AFnV&iz}cYT9y#>^r~B) z3Owy6WAh@LuRgp10NJ%LG7taIV%4#2l;pl~`E@5Yr5?%e8%UEHY@oFTiaki>{G0tq zIxoLfOnbf`_P4{DHaWW6s6)7&Q+~@e4+cR=8q2vWqC_%4gn`<3WI{k(;K~X%9$0rI z*D!4&AO+c&LCt+2rW0XRtpA0%Z*;U?4s4Wt4|5b@c-Skc>1rfq3*H*&5{y*lnHT_K=fW23s+{5B1e&J8yfilVX{u%$_g|7P9CP;X>!{x^4+h<@uZkff}?i>gc<8PXyZ_*|HbjOKBc zdvb}!L4$UPrT!j{JvE0rRzu*NB^DkVCAltfHu=cUjL8yXwUz?h(YU^$;%U7LE;HHU zahftmtds%aKK6>q^b?u^4Q4}AHT5ogZbxMsyOfZzXmrT?)9%_}N+&jtzz5e7`7#J^ z?424D4~xbaIiL)#)iawEqh`@zugz9@S;F73UwIyBHoDzRh8?T0Wt@1bqfDidqUfigQk6AI>emh{k*WD)vFjZT|dAKq12p8@6Vwbcro}xzOB56D-iz0L?7EahgRI58?cSwrc zkO}IL0jGjs1l1k{0}P8W7*Tgr0wuN&wS7N+7fY>IBe_EOLsNyh>XJ3rC}<+<&3WHM|?)#3^cB;ym!r6 zb4w0BPm6zgZB%~Vb0&QtHbLeYBeme^GWsUAHXFmGYYO`t(#+zRUzL|XFdNSZ6Y07# z{+P^zraPVBPCJEa&)T}G^O&kUtqJ3!Rqy8N#)8Uvaqk2zQXtX(j8r782@Hs>9t)1T zyO*|qauMyFhL4<@4`1nyQcVAik-*edywztld+!aB7vA?AQ8+*a8^Pvn@Cd`UEd^}F zxV_r(fsh3Et7Sq7zl-wd(P1aL%_mI)fpuu%G+Al>blT_1k*Dt%2El%#-*l9V-yW?xe*at6M))=G3kbP*$+;Oz<7AknP+0+V#3H31W$1US zG|4(D;d2fGEE>1asNS`0-g>a+?2AJVlNcFWgEw9WY?M~$3*1^6TFv8@|4jTe!Na@2 zHQa?1|YPU$WS*Eo&;%|@Nb=`;=> zGD7vU5IZmhK=FFVSh-DDlsoj-Qn-iP>TT1K;aGT>MxkBgsiQeCpUVrBRaRmLYPXQ> zhlc-q|5p|$KYv;OP(upQ>n=G?yNEsKIF8~6aF47hv$U9}5Jx}rNH0(Us&;_Gk~_+M zxhmog=|(mtoWTD<wW}%YSP%yppU+{kgtltZcT+SwTTYv?7@0 z5?dh)Yxm`DtOa<;ENhGXN7F7H#+$+1ASTR7{F5?l1r10KN(Q!*8PLn{-@Iv0eOfb*U@t$A2xGGx3(^6u> zhw@vJ6Qy3ByCANBj|5R&ouCwPuAhOU7k2xGDR*P%g1UO^JZgn+xl6^VaGqT#S2PUU zpg8QcyP(X$Ast@aS8b?aDxz`6?u#CTH1_lQ+@ezXOseg!I`Y#cJMa8Gnx<*8l2Y%g z1pz|SG#Qo6Q{1<}kfJeZUUsbTmB2!bPv1Des|eG_;^GHjvf`DS$kCogyRyUku_Tjp z=1q8*250%N9?4LtFU$~{OjD7=wNH_hUy75(g$ywMwg(3dz(PN~_F=}ucQHn(e3Ly! z$b@2zERdiGH|ROUWp3+|pDJ-|)58or9iBO&NZU!fB^-ER_Gks60T_-igxhtTot&Z= z@{I#3$}Ff_Xuz2z$wkmT%gUw90^LU?i814$uLWQZP*q(y|$bx1{*fHYSrq3YmLe#k0OtBwh2IuL?how z0+GHh41$fDusRomRzj9yi6IP&Jd6>Bn5W1w)YmHr+46G&Lr_QGunA#^|+ zIu3=yWa0t=W@3q zpU9~_;dIrUI&O2-kDFA@>cd}II1->%#Bl)y_A`HSyHW1YM_8w3jKTwI{wVm2K5aje^}+_BtX#n|s8IP}K78YeMhnAo7c zEurvID_7|_URQI%<*Ge(qRw4DDzh}ae&l&^w$-T<^4$QyciM#@rw|*Rf*x${vU7QK zLMSL>BZ3P-4>l=?alE6x*bw^DGrqycJTsP?hZep^@YD%f!@f*4ur|E9wtJ5t>VxG* zQzssz!J)5Ds!wHoxiI;8w*AVgC%;V2&Nwf7|AT$C{gLW7hjRt_PKl)Nun9$CX`DkK z?u6_opS3$3c+XCUlYXacPUo{WK82jO;Skc;Cxv}lwX&@rF!sL{lvE4kA}$A(3c9`` z7ZXZ2t|ikIJMxbNNdD@+!JF6JDZdT!hN0~jU?Rlxzi1EO5Lwfi4>hU76Mz% zR@G}O*03{H#&b~@h>&TVRo7aI7dCb}oy;BA2Con}^F!Ro$BDP+<;%X2p#Uy5!)*}g zhZWKepF*7jXYON+jNE|~9CrU5l%EShY&Hz#dLD%jH_JL;h1}l`sam>Q6SRSS{}H$n zC66ywa#S6Ybf?bTZx6C7id0@$+M!f{?QM`kpUs=|;M-X_S>2P=5FFwABv;9QQZ3#E?CK4Ht`{N1kA6Tz)>}7{VxK`{5}XSEN7412z)v5 zfo%m@1c-T5{Rba$SMJjVgLxv6F8Akv_JY%hEl!L-lC6m{(7+L%Y_fHNZ+3uc5e9Vm!}&JY#@rsc`aVh2-kD+OZi-?!Lf$h zN1zbaxma?{&@hA`OLDRY80$Bo@z)8M|458V`nQvBmd7hM%Li>vML#5m`&_lqCJ0*q z&Tp!ztlCt4b~QD~-~XpkTWQ@?BR|n_`xfuGeb>e2%?p#toSl0I4WLf*Hi`&QQLn!H zV&dLxud_`iSGNj9E-4>hT4FVd&2sG6_dk9ZJvIt#K&TuXHFd*TH!@jY ztt$#W%jrI3z8+qz;{pJSB?ou_;wW>+Yh!()TPMH?gn~AixJ?Nw{JpSVRn@0b^DwC! zu{V~YMPtA2@B)va{2w)Q zg;oKDtkwO*E6WoCbzMSZVW&W96Xx;Ce$tV(lzg$Zm8bMGz;Z0K&{9kDrzZu)-iWic_%A>-|Wn6(f~BGmkCel1rZT0S*!t8DkIdD zWHa?7i8of>=ciGdDUAky?lHZquNha_i#~ES6uql*?o7&G_mR(u$D3}vF_lKBrMv|^D4HR5?DY#Y>bAU_jXFYp z37B0|@gp*BO1h$GUfZ&y`itA#awX3K5UQlMSw2?|R-@=6u)usZhulqL7Y+Izy>%)b{oF&C9;L%6xp^Kp&NQYjXMC14V|>Z};9J z{nY-mw4#DtQxj8bg_~~lbAr!Ky@ndEWS;ftr&e${^WsQ&iuTQf_%?TU;*kmYRY9AI`%4oDz?L}Jeg5^@xt zZCP2JXjIplV;hQ14Q=H&I+DJY*zbxY@V5%o}9s;IWzmG z_d9HtF%C>080KV74SELAd5Z54fwOOD${pBCH-GeVZ{3H z@%|INz88FFdeJ-o^Bw5*pNwxm-iw;Q!}x(6k8~hdK)Fe09N4X{DhrerPnXve@0+xg zajnRPQEBm`UaZD{x7ByQ*WY&cuFv0f+tzx@1qu2Z^bjL-{gg>kH4(YOCm_IzLeehE?0DE}Dx*o{`5;h(PLoj#-CiX%_v)}6H5 zZ6{CI9FB2^?S#XQKR6;2tKG6mZ!q9JQKNDEjL>Pf8Vhszwbl6oV|8Jr_tTZ4T;D^ z=C#zM_ODpS=Q;>d%^$vK%@rTD{(m*oxYX%Gs2pkL{73{{y`NK@qH}al$jy#JZMh8? zUi*+12{KwE{%@*w2O`&OF;W+kh;7Xx#Y(-=C|~C^#csMMpWQdNSw)%H*(`!r>5W!- zn>uhh-1+S0pXdymVDH~>jJh)1T^tVw+L4=o`!ijayD?B@i%>_Xz%}k9fma3!TkDm; z8ddjpDp>YQ`Sm$O0cJk%gArLJGl|w>%4dZ1*Izv|aX3Qn0HtzA{~C4M^HRooY2#r2 zHWmQbTlwHyb>r>Vq{i!wUXl9UXBzpJ+?NJ|1DD;Gx&3D(-~Wos$iSzk<1>)!h~v!^ zt&YrK^c@rpgD!ux(MdA`Sy}q>_hLF)tO1$(Kd^LM#?Qq);ng&ZudK_g%uj+*!kL?- z|EKqG!B|yqUs}JWYaR@2dlHPcuIE}vttkk}*H z1Paac@eI_Wt+XnNP%PYu-G z5OYkwi#^5;mW(Z(xl?)i^rwPV+i;A-Ge(LP`ubdB{_%(E2b;W2^ZZpk-7P^2``B%A znUXEYWhR@l$}89v!te<0u)(I_cjxx(Joo%7w&LIT|JqtfaOi^UrL%j#D{)m7;gg0L z0tNqz#l1cQZKoN1ur+s4X9))~9oRa1n%NIKg%@|1aA4E^`vzi?>L}~6d;U|l$gUiw z;3p}UBb{$#Td70TlJhqB-B{OMyfI#|eC!waQY%^HcznC}i}Rg!fk@4jT(L$Z_9Z5aWo6 z+pPK2$}Ae|5El-)*6`O|{14fUHC^xIUnLgpcSEo62%A^#xf*(5NsC37`$|=n1bzn} z$SOs%tWKf-{_N}%-|P-`*0?)zoWQ>H;W5?P(jwGJ7xcjL3whR40)8B4)xKY?<~B*J z;qxU5N7N%ivB)cYPW$b~$jdg}n~rfH$X=dm58p=qhBVT4+GGKltX4+Hkge)BRBaoq zkH1)S6!w4+k1q$=Oc3PrWDsl3Bp%%5 z2!bhis4Ei1I*gtZJ_}S`YF>Md#sb64nW(lzyIu2dA+JTG-F8JD z?#B|^=qKVgi6`e($$;o?3#r%jv2}v)VP4o)exv#KBz<8s-V?J?`Wze5j zv2t`Z4%h$mw3L-k0<$OLrSdu!4@{ovLuW1?vCRykcQ1DL&uq?v+jAU;k-{Jehs zPpRw`#>i$&BVk>9NP=D6dU3huND@xmuTAs8r8?9WXoz48Qyk(w!BNG4`Z0-XN9Dl?85K zmd8hu3-s-k*+Rbnbbs{dg&H&i;7}<46{fFVBRG#h(EG|h0_ISFN+LL8Zqm)BApc5V z2gas>uRV3DGMz|dab`v_GT1N;d-e46tJoKM$L@@O#b|lqeoJi5r?~2ch@>=_8it$H6ApTOs~uhUFTpQ z6CZWprEq7iUM2y@L?xeAIKvNdvRHGD5WPNwlk3cUnmQ*Q+$8Z7m&=-^5@}O~MdFnr za-_k5(z1$y66uV+7GPIddFlMWLSUwjaOvrx{^O?|o2Mp`**hj$AwDczbMsjdHj9!u zb>?|!icnwMA_SDpdBW;^4zAE**7H@IxY0W5!mBJsHX3z2kF}M>wxE&s zsM7a>g)_u@pHHCDH00)%Fc}>EFU))$PY70c*btl$7dP!*uYK4)xo6U78v65v@2rp4 z+T5nu4F_9IbU!I)GedTEKcn~jb~xHO=rLB^EEKq;fUL1ys)dX_aw(l6moQnNkWL4s ztcb&g>iv5@JTv(!w8C#vG|J^lPdA`a^~e<-fLa@^nDzB2kG&6z&z{Pt}947;gsi^NheEU2wtFRwuu@*N z%2z7G)!lngjMxHW%n1zE7fmhqyxmE@sUG5 z;a8cCeeqgj&I#1|ch7Gd*chGiJ$vMv5rcpgyQXM7|KjB|p~TwAk&0^k?$fB}gX@+u zHt#_-G@MjQUTA!wB3RK^7nh!peERBgraUaeF|Il?bDfO@tBG`4cadNUWn53AS5KJO zbtN!Sb(svSb7&7Wk`)f}I+~`63xP^adzzN||FjfK+`st6|B-1c(iCA?j)`f{xX4Ov z4xK)SkQFp4S*5<|l(ft}yY9YJ>AXc&YLr8x)Xx@H3{FT(3(NXL`O2wTqfzQZID%xl z4IPQ&Hwy+FZb>fyhbEpJ*;Cx5&(L>e#P8I%Z*B zd~MFMt?D(+)u^Z(PPvrK`ej{X=u7OLgIE8dbDpx8pp+}-9cE5E7|V)j|8g_D-X{}z ztHEtOkWOXo+Zds*UWwtUgk5)@!P`iVGp;dC^?m2$J!2U=pnoN{R)`_4-m2=o2{y7! z95YTt`x*KCodN<)mXkGl%-pfj*aWPyrU`OrGCiIlKE_PXV5Fupk?Bmt%RiWYV6mbw z+P~S%AF*fdR<>A*`~Q0?Ew1ud%vG%=gjTGLSK<>^54IqaN(+TaZ>Pn^PeUYcp*8N@ zuRs&%5L$_$^5jbT+S#5As&lP5DcKv=>Zk6GCx}rd6mm~|Y^?+0tkg5xT*`vbSY*bj zSO5A4#j6CM7sA)A{P@TtzzkSgERWwT+FrelwS8@j@+3yq@g@oJDkAy)ROF8x=#SSI z-*be>3ZpuYFssEg{ljaQgr!S50P$3C|B&1q%DGm;Et$*d$@pieJHSG8R2_Uh6J=MU zIC=}n%6R=?6BT7wX43Kqzon)vCMEx#n)-Y4>XAc;)VcWh3kbx8_`Jm-0~VQezWvxQ zz~@)NK6(gZ>1E{|Jrw2=5u~GB7ChPBLhQ0y;})(j9dfSElNA z;BY%J%&%N1MS0P#FW=7Ch(Z511@{PZb|bAoPiHWY&$_><#uD>bdOF$2bnomkF(^hR zgI-{wvCX9pT|)SOmVMaN7dN=F6^ncH@`Y>=1-vg^^=7tS3gL_KWM;g!RQs3vCoi_d z6+!y^qpMon6*TG!4s#WCx{spQ(r7$9%BEKo>kCU{S&(y)pMl1vMlu4lbdsL2Y*TD? z&xU==ieOm&$bA|47@58@6LJ^2zj52#sMx|~87jBJSRmJ}um+{PDuf&hq}w+S z3{G#k*xMM~@5cH4zHukzgzV2XE+R4Ye;~RsVhECl+*gpN)6>4lxD>8SOJ{}*gYYZY zsv;EZgfGylENJnakFmIqF}n0)*YeK}&)E}tdh^r z(J2PHrn2=67Bl0pyC%*ScRa%3UhnxBSGj2B#@BI4^h<+OL)F#gDKK>(x(`#CEFFVv zVD>8a_vf@t-Kd`JK{uxVE^qzL7>-viVp}1FVG@Zo|7FUmfiF@K<1y@C-LICg zv$=W^Y*-H6b$eonlw>MLx0jWac~g(C&nji1#jr#)D5bdv)Y`WyO83SknUdLz2>_gG)ec3 z0@y2^&y?azj~$#Z%PAv@*V&y*?2L1k<9&)6;;clk6(ugfC#uo?5-+)|w?tk_j)aU|tBXmYZ_JU(Ec*d?jie zyYTqeTwaj(E%#!08gJ97Z_Soq_EhwLBdES$!!=7e@E@M|F)(7(6@QqGdn6O7c=`Ki z@`jBv%`J-$)JS=`1*>lSEtV^g)D8+N2NSE)oM9;ZpH?O%76I`!vjI&&LIYd|D^Tz)46q~fa&m`+zh!4)FkJU4rTwL znyo0P2egh5w2B?^Z#B{zHM;$aqy00A-8B0A6y8^Na^}-z;XJ*73VKF$JGOC zmJBDZ5ApxEDaj`Wnjv`9_lZ@Rvfzoc{EZy;E?)b~71)zL_>SB%C9*UQ)AidTB2 zT4avJj>ew}##PaC;t%oK4}Zw`tfJUe5^Lx-S`e>s8BIV5@7=?llr7_?`j)wJ>j|&d zdi;2Ki>#z7GHpVkYwMJ@*f9e~{>mXdyNt3KqiaWORw60rA>}*l0vM|EoL-4bhieAI zoM8}m+*w~6-NxUN81?6zw>2?-1%X)1tQ7^NMjQib7E4-`u-wxn)p;L6aux%WvpJxQ z!IlGDvv}#xs$7#)+V&HHpmgYp!+&xrxLifGyX+pwK!juZRExz+Z6iPF38Y1JMklVZ z(gsv1>s}ZwTi)hP53k!Xv+wE3AXz}KeUuv^Z<}m8vM+95)3M4|UklurxPENUXQu^6 z|M<-MA>jI=yP%N8P$}$k0s+A=5I-&+#~pvz(ri%R7DI7uILK#i*(g_$swTR`OOwH8 zIL|)W^Zc3pTvi0JEHN<}AXNUVpWE~#FnVltKCNBpeJX2A`a3OK4(C=|0v1DHrs4b+x{AT&6qJ#3e}6K*3_pN1c3M!?NJ_*3*0cp3 zdWo-HYH)N|lQp{@{)=H;4_j%X(C3~?JdqN zrn2;`f)^?w^S*z-Ei)@4BQq2BZx~GByj9}ByXP+i^le!P-C2-7&tC?^lKtd4V*1q8 z(|0QR9n&UTX4+pNNfScaiT8$+QEKnzt__i`!x~&<-x!rPL|e_7$yNpNLEt@M_+4q= zaBYJrS*{w@B`RCW3!+LHM|u7Lh?hqs`Giup90Kco0yq))MwTu>9h!L(!ydq(H?vzV zT~Z5~*@)os*d#BmLpBUS$)*G!jRqjhWVKy#GJ{aDb2oA)02ukhrH zRVg2=;)oSPSUz{Gx3`Z>T~(LkaG;<6@rQn}ewBQxOmgry=eav#AEGhO*_bcw`<)6l zk7=F7r7YooS!IJQSkvVf94uQXbJ<*+9@1D5Q&npC?Tg=Z<;||zb?zJ|*I9S@+uy`^ zl|bUQ>SD#-0)?@*(;`ftUk*R=HpfAk zHdUQUs2WzOVhke%U_A^%u3kYwi!h}w#U5NcBXo&EmT~zFS4FGmVjdYRH~$~T7Uo&X zYiA`$>tE;IP^R$RUu9HpdOs?r|G@7l3o8`Aq3IbYl{$Rj2};wev1S)uOs|N%9c}T# z7kAKdk&9fYC1yDYA37Dw-u67MU=&fiZfANtQ~(fhc#IGgJyEi>3?ZZ#&&Mb-PHWZ|4g0 zwqr=!7G0=>dmm0ou!)M3XL%K=A%BTmzLd(h7A2(@&W6Q~SpRsXE@wrR1mX-8IcnGK zCPbNRS5!R51(n(gKtQ_-SfCxP4q=hASnU2ro^>x*7nL4+!*zf8^ogVdknPn zyjo8M!Pw%G6I%R1yK!ngh=K=ACUr8~5U|8eW6_dx9=yE0r*@I;#+uo$$E;VZ7hUJ; z9x60_CM&*OE$^-y&KqI#w9a^^|280Kok!ZO?3<5%jC;Y$Y&S3^c4zfVw-i6#y(uyK zO@&#n&a&^o^6nigzDp8Q;;_0jokxZT*x#G&+(*eW$aSjCFo)3El$L4&tZf}y>MYdaMWmDjFF`DJwpA{Xk;(M4v6|%ylUA=>rD%H9W!PvA!!;Z0!N6dcxJ7&9yK%KU- zFONs6#FEz-iygNOz``@I3`}>ADrnky|9kElaGts}#pnmYJ7JN(hqcm99i{&(I|HCS zvefB$`#zBYX!z+w8Bwh8< zSHFxg*f^t&O%E|s<_(Mn(0{VPP1Mq_S9uQF4&wtu2re-R200by?S|<4bX>Onf8PCS z;aq^>BYbIvy@dkj*lo%2zAUg1>9eEidkIHdm<*A8qfXc2Uu-HM8BRZojR6#N4WAmiJI*z2S&w zitpEd+^ST)csiOm8@%uT!-S3f_y2grwQ<6|&H9hvjo$%J zeI5U6!dJoWS$}@}JDOzu^JDhQ3%(7oJmsmtxj=Vq0|8jhxCQHUxUb!D-WRuFn))15 z;IE#}^mBM%1oPjP3+a%1b4PHeIyFz-MyC%$9!4+Jp+lE;nJ#_OekxzSF9q|Hsb${8 zl~*k=Czgf;^JmNQN=0ogRY$|bthE{j%P)K%S`N^O`w)>#PV&lo8v{cmH%ghf+G{YA?(M>Q8lf_%Z~fbv{!JtM4|UuwGGc@8R`d>Bgo=nh|C0&~W*pYATP$0e72{w-`zpo?JKfTPV#@Y>LO zUUcV^51wl_h~pk?8M`M z<D;YsawJWi%DcL%)z!Py z-qlsDPJVVrRP?dsJibvwk!$QFrJfO{>($8Ymc zAB12p&=`2cW701|pbGoGCdyxcTx zP0~)0lHoAee(C!s7%LoXeOO;~y+(-E2js%V^0$AYe?M;p8|TppUIfh9791wGo(`;W zGYt~gWcZ}o*$(fIAEtFy$2538dwyWnd2ssT(LVYadYoMJQRTkR6(Mv#g5IwvExI7$ z#7F$*(M9waO_*Qm4hwhCG-Z-FPbDxyL#*V(To4R^5{^wJDq)_-r)*KRPIT9*wWB-9 zeLjA^WqRjb8WaL^Sr5d#I4X}d9Sa}RG(^Ia@fni7u=EhtYpednWAyH?Z+F4j#uF-P z?w}X){F5Q=^YjEQ4sP^b0MV*5TWG(jc%Vq%w@u@HpVtxrkgbx= z&WR1enLh|g+df)p2sP@mWdd7QC?Gz%keD-!HK7fpMH)KiEUs(g!+CgGTTh-2Emx!y zN+llwR7I%FhKVu@6dYn5%sO5*q;)WMqSWC_@i;Hv&$sR2wocI$E50$qZ$7@8GoOtq z8nE|idG5!?!E+pC>?!9Ia)nj<$(`gspFUqGW{@fV#UrWj%I=eg_v!m&YU39a67O8D z!NSb9bWrIbY1oJmN>Eyaz2P=S9*@yxYoa~0KvM}@6APX$2xkm2v^dk=CYdSDTv@wz zi^g`p(dllZdav*=F%B>8gfHhA&9_u(Z>A16+#_-@THftA$OCO4dYn&~U+NAEchH2P z70y!y+~h-Sg2^5p!ss6X({e?4vSTV$U=a!rMaD zdqbd15O+fs7+f~4=A=2ti4AKhI>lXyj&?;;&;>T0m<(6Epk~|G?aoDp03jOCLD0vq zM!~8TnJUr|Bv2b6KC7T9Y_^mN>g;#1h$N9b5zaXvlTghAPR8JSluHKblWx9&B( z56fat?*vs+d(imZK+sRQfN)+8K#)jVa+M-MUpE4X5-OJxuTVxcH13z6C5=m|nbkwy z72KB=`}?s!aK5%id)PHZqHK!qQ8?;w-%y>I)`9d)?@3U8FehNCO^;ZRJ~YIi8Vm!T zQ0vjYWX2X@ct*CXg)AK-{cxvmD1TuPic%)rH?u^JQES@Z?M-{OPGGizYtFxc6sncB zuF5=(C=N8m&U-npDBDGCKr&|&BlZcGbVNp;Vdi@lU|?K+7Y z;E@ZIoK6~4)Z580GDPO9@XYX;p^-;}+3cHgl=l~~z-hd?40rWiFKU3Q>>1cnrr(_`u|-na#>B3$(Y(n&;Xmfk5i@j}-+ z;%n|qEw7S99dhs{!3I_}4xT3s8wWT8q+fJF&mn9&dFcZ4$hz$}+j3*dX`*ckldFIj z>Y8PhMI-|X%6>A$Pv{IZl*U$1&l)gHSk;0d&F=`i?f*$_{Dv%I|4Hk7 zSV$Kkp8+GJDJV?G(t87ANUe(591OIvKC|FR*J+L5X@1gvDcc=x=hT|2G>H`E9oY={ zmUuEAIPSphio)7?|1I9lqYk6MQ9>{cQ7Su}#(TJQPIv62xbnhsc$`nXU(b#Ycl0!M zS|cBBc%%9`)VK z4FZQOZwE}I1MnyvFYGy==Y00p7A@I2_p+k9$VkTFx{S5rQ{mQjYOyr4GNHPVYhEx` z{t*zO`p~vLnxLjcbS%L@bWJQ6XJ>s&h^YlgL=1`YXg2S7C^bK$i%c4>~E&*uLwUI>`ITSQtzsT zzmyIewok%u9}wQu1v9_4(cJ80Nzv372+-L}HnA>&I2{M2!*>unJ~%;vz+^Awf{z1_ zD{uhe+&Fnax+vWU{E^ApI-b+NP2?)6*nw^;+UASOF0$ z1nLCQBn7&%BOluic+O2NX^S=u&9NmfjPyWzl5-J)$ha!f8FmDVw0)Ubf7@wl$#4^Q zaE$QBzH5d&hJgI2=MMk^za=!6h=t7%=(M92IbYv*VOuLTYKd{TxK<+nMezct#p_U^8CR9V_X9!u{OJ)f9d9n%%X*nc!3vJ} z{soWs3m|BWnofYZ$zo-5Bkk!}{GjJFJI&6t`P3+x+{P0%m0*Luz@(h&x$aCl&Sd#J zKscd8<}Ht>Oi%NDtR3u3Cp*KFX$P!P^>x2p&y(sni-=dJSCAM7;M&WrJ98%Ux962p zu!aTRf(s&ydv(`nA`K%ciE_1>Jrpl-F73)zh&25bg6}quEp2ier8)pknPybRmk#ET zB?pm=dj8k+KlRa=)JgH!n!5Pwb9hZ7S zNPM;N$Yq43yfnajqX<{4Fri0W^mQdFvqbh{r;!mKYq%^13jL?xoU}7ua3-Ls*}Oqu zopGrcx5P+0WYy>jVEh7mTaQuY+7jnEXSO7NjwhOq$QTVESuoI-MfX%IVYN6N)^jJO z*I?~uLL=JJu5C>UUcSB9hdt40O|2+zj%`1N78f5uzJ2~&PdGivK-vvZC_(#y0zUfg zM_)}T`8xp3ZX0ZH5U4?+&=cO{h+N@}HJx!fpPoqf9`y8PBc%Gt(^2^*&;f|RATA;}HIGJ`d2zi$giS@2~ zcr?s)pBcL5D6gIAeq_9v?rt%CR|YI)eWfD3=Dkl6xA@1LMlm(&@R0341yJ9CbxbJJZF;?YK||2dp%)U%nWXV`(00r5gJxN1 z?RP~OlU;6w1Fxm*X6c9Y7~z=MiBMQR6i?9v_$BRtaJwfmgDj`cE{K2+vE)qOZ@s1i zRrF6@mvSl!x5=T_c!eKM!Y5~=<;9cBaTFfreZ^w}Q*&QLcEx~7B+7^6Ihqi^v>g)e zkO(@o#08KIy!+U@J0jOhCjiOVKt0gVNl?0v@$#a=>0K|l5Se+E1nh*DfV7F0{ z@aQfH9h69PMYUXms)%W=nNze;aE`DS)1HD3!jR~Mq4JEM};P_*{g%je%ba(28z zLBcKlHGjaPo(v2fM@4n&EI`x+Qa_Ch;l1?dVgn>3yM_u+o@Bl2W0C4kF9u=562Gbg z{G|n9{fR!Io^CmEc*YeIMA_0Hg2P=(#|!F)RbP~}IU3nK%~jvRvj%Tg6pmF+RJgU= zerR!E@{>A%!vq!eRd#Ofh8=wQFI~QTf~u|R>p=a2UfaC&-TQKTCc$ipo->%fQ#o?( zx5kYH$b@jN%f5Q*tQEE#fB4%jow2&uiaN5xc@%EFOIXjSk&ze3tbojAPZLKK(xAuW zN-R&$1Kzv|BN~coTjd-5$)rYjO!WoJ@d`ZbSda)9)eE#I4{XT`tCOJPe*Rnz2d}f= zZ~42;d@4iDVJQ<0B{JRV$l1^&p>TgTAP*=8gL))Ua2ar(D||rhucxSWageB~YrCKyd7Klof6nA_!J$ zq=+gVj8YAp(5W+Lc(>i#m!5-BJD#xK{+<1zfKT-@)bBCAPm_xg#YaTv8U%W@G0BX5f?eiCRV;{B@tCY2MH zl-l7b%%-Q~cD?w?>*P{>@JKEShete?A)-qEicN*dUGwy>*Dkd*bv$_{jJrE34a?Be zL+NT)*EL(mS{vfSrSTiPkj<`F5~K+htwIbfjqdix1x-4rdqs;JsJxzIb*%q8B`O7m>(fYKuGC)C9C%Xl_qcK*vvP! z;3T%Tr`9bynQeFK!>jFzSp*wZB}{EcFx$NK9W=42BW0B;zWrsuX<4*KPn6|gjw9AO zAdXE*4zv(ak6ctn?~MVNNc|$T=ArI-BM6mqeaAcZ?3~c+Wlrb?6k5(G>AUG5f(yav$?vl5O%ib$T15lik=Si2~1&e*^68h!`)-esbQfM>;TwhD_U~POqSd}RPl#1h9W77|R}@P67JcQo3(I99=ETJK z?p1mGy&3Q_I@l`2&tXPnyb8$F8VKIqPIe7iJ@+LJ#{w$Y4zG_fxofS6_jK}04FqNcN3WYWk{+G7h4{$zwTA`*^Z*V9#0%@NkF8lTabm4oFj@^5~xE z<AaM2w$7-EL8~h9O{IjK^jN|#t{B5UG!CD>pBHz422f?RMcq!U_o512H5_kjSn zkkf1huMi1gkuAXq13}nMEk-ApwegTKsW*%3v8tfme`{fWlCEr!kgq)eoyoNh!YOvC z*4i+q~oriENoHdaT;Z6-IRLNZR4!*vr{(DOxW4!8F@5OU0q*t+PYlMQEsbJ zv~GQpa9~y^l6H|x9Ip$y?{OzHbsRSC}Q6jB4zo}3B>9g+j==Z z{5Sz9N#NSmZUMa($8-+xzQVuTUB_WxgTspQUdC(qEx#8>3TVjl4Ow1LTp9t6v^N^~ zcfo|1t|dT*HxHq#mqWpDXc~pmdTIbh^bb+EIJQ?lAUti8aEKHei!1Xim^xmOFD=;gvu|Kg z*q<~pT`1(iIg!a_i$H-s!_5Bk;-f~v`6vCF%KI`)8Q2I9xd-s`DGxFJr=Yc!A{}iF zzz>aNQwhi0E#ie-;{2y2)MNKk7;q)t^OGSATJVZ%AvgVDK~tP+EA?j2NA*7Zw+5P1V`M65x3GPCc%jVF*>IkugOhhW-17 zsW0p1O;}p>P9MuoskS2z^xN4BZHLskYpQJRvl3goXfuI{WbwjnOO^GxqoBtuvr2E{ zOhZWfI(bXPvr-t~^KSKT!>l_lFwzUFLk>f`*y)%waILBdF^?7{Z9*71lSEo}^PbCR zLG66SwzjuF**IuO+L#rmm!@@yl=id5#FN%T*q;)3HjYy}{>7t;Zlv?VR1jrCpZ=>g ziwQSjUTeI(U@g346|0v6hMGU`(G+X~U?c~SQ@n7$ImUYB6bS=Y7I13i%F%if1QUD$ zAZX$hfmGE+_3cK-UoLgRet>poVyVU15&`G3+g&7xBr&&bWx8ovHW2?M8Iuy#dva0~ z4P>oJxgNW-PoXkprga?36W|tOsg!0#9b1l(EGyTZF)a(8QrQ(ygHuh5MsM`a8mCX{ z+IiU{JMWj89a^e%j^PyXCK(PF7yuMjT=hv(d(XMHw278m6jHxEA6Y3HZYr7Z6o!bE z&2kq9*63bt+Q?0tuvObFx-?c7wP+N0#r=u&qTZ2we6^{UJ?30+!PW~EkNk$cw&W5q zuF)+x!~v&5F|Mt|9>)a(sy7)?lw;5fzcugxr#b~BWG`Frq#CeB-4TqZbHLq}DuA1% zFb>i|hAp^756Pn~l?#rvrY;G2WcIX@IKCS3J1si>S0IbLsU(?1S?fzF*_A?*kbB;a zWx2H%$tX=BYE>Gl0!n<@t{6*2V^}1)a?E>Kxb`*y%Vkls>n(+)(Axp+RQ-Ma!Wftc zwa6HKserpR$_*|hsTEY1oKy-kIMAS;iCCi^<!>N z@`tGpT=EFB5$ud}TC3E3=K0hi=GuEThCx$;{4u6JngMo z2J~`-nSV(C9mx{T!5G`~lpI?NBd0yS=KN0on+|$bYaUKfVT-zky`~@>Ij1`_1lw)nsF3j*fHwl< z?1m$haS~FI5Ac@u`-3afFMFn-%U=bR3%IiWajt-b4xr0gM1`Y0rlb^GoodbB2-ij3r3BkiHH z%N~QRZ9E1t0DCf`mEip9_-&E#O+Q3%W(M0LqORQU=i{C!Y3mId4uz?QqSeV z?6W@v3r1dC*pEm@P9+yCXDfU$aLyw02(c8Hn&RQ$6oj#zB{Kb2_bny$FIO&a+rhRR zykbAI={7yh-NL^iSOL!-FyS+sY99a80Wp{~%Nr!0WcM7H44j*aSvt<2R`g-EQrM~3 z5^Tbapff=6f;v7d|6H8Uqg=X$3!3r@GdC4YvUb}7)Odd1b+Dz_-e4PpDPbc+w+t+w z2yd?&eXy(~XTFA!HZTolArY;bJh?*8A_TSVs}4~DrDs4B{A3WR9~L{pS&4C=YV!^3 zhP##;TfYtck|>CbwQ}0{VP&0dv8|McK7&OEGViq8HOS+1A?-;@1VCTWhXn| z?3S~fCkyj|87s%Wh79DW=|t1Fz2b@Juw6}G@PeX-)d3KNA*vu;-F_aF`r+GKb(u72 zLlhT-U`MINSr+iqr@=dmAwzS_%)iUY9%$!6?k}o}_<6e32H0AC3;rUmdr1 zIt*L2QdKdGzm&5|;wil!&b`U`=N6Q~dZwy^hXVQO6{NzPVh_jJGSGK5U~9Pcr8ls% zxXFi5FabSR!1PiCo0Tkg1)=rpZ7XbJp$}e{l+_)shA3eK{GYIXRg!YThx*B}rT{13 zgU?`G4&GKau8G`{8oj8Y;5Fe7`k@WfS-?u{=ukSzpHep&MpnDD&e5iT`Y3d#=*OlC zA1~LRCgLCmZd=q)m5vr@xZ5@mOLSqPAh;lSM_x#IY79SBA35kY+_+jO9Oi?KVqyzQ z;prSVlMG?wq#>xN$x-x_f7Moz3A`8L4TH7mDl@Z64e)iL;KT{r{*HIBkVKa?8F=(#8JaWrlZ_- zIv4p1K``W$@3EQOrD_uoOWheFby)~N`mQrUQzuP~yiB=P`mar=gqsS+H6*l8{C)m0%UazV~V;k~K`y71+br4fj$}Ui)0p=#E{#7}=_7 zoT@BLIy&&&&zmg^il#oq=7p$4ADB={NbsZg_gGu-k`wt9CYVASy_uq~?hR-kEM8)p ziOYchW0c6!mmCmhUoYxdD>zPL+A+T-e01U&ym+Ssp*-GJ(B@BQa5Ilt?$1BjAN{Zv}Y&AP_MRikxfdMXf%o@$oz^|F6OQ(NB?k3fPfLxduKcS+l=TxjO7*JcdtvE z_;wAC{PR6PH)P$nRzn!D_w9i{%`~*uc?f90pG+%7s%p&rCR<>?0<*jYz~jLD6>?@V z&(Ab_WLX^oC$yxy!Y`q+dGJo+U1J_pXgQ^@FKuDaYy`v=4$V7lTsB6u*F>hfsg()5 zX~vl~U>-&>F7@n8!;!PmapJTZQDgP@nwUy3d*1*2$DL;w@aa>=DyI0V?PTf?%BIn( zm4%IrzSwX^g*D;GzS33?-pjpx6cdG3Z0ijZubFbC0YZQjqd7q%bw!K{#PGrK{YUL{W={VHQ5n~KK@c%MV@m$i#@!}8=F z__^F!88dTqnKxI9EUE*|Myr8OvoY_9=aE#{VnAEfJsid+u{+G6br4*|L;6LDzwi)A z;>r3;;y5ZQ;F zUVV6~lZ4FW>@yyIf%3KwUN0$oS)lwaf#V<_i9!XAOb+De!T!RZP$nR%JL1tkQFda}$pLdU9i`jU#E6M?M0( zk=NACe8+6XfOhk6OoiT8A!FL=c(h0ONG$UpEX-lYa=MwQ^+^8+Lp{hz_TQ**s$Q}l zq}U~u0kyDO#RK(HH4sFjzcf6mrAi@qH0Cqc@&gIX3m%2d32PXfWG0hf3Ld}fBC)Ut z)l5(d=oxsH`czQYacE)4J%<^ta_#EA=l^79Ff?1tVoPL~!aVbILo?$eyMW7ZOkGu- z9$XC6JejB=K(JP(H^}ilYW#&0oinGruC__#M|(Rf#&wQ${opdDp*bD1e%yUcf_=v$ zt_;aZ>*2DQMh1CaO*o1FpMX3l3Gf4RVJyzo*xjy^OJo_*zPpV}B~+hJe98E0B=aH) zgKcA_ww9y>Q?Rrd`J1m0tSity=5gLY}rB4zwj;r ze+0C$06bjuyB0)Ye+$NRqlI8}zlCHdwuMF!yM<1Zu7x3|rWPh{w^~@_ebB<;*%N{L zie31*xVVvA%I;|Rz`5vtpm?~2V3uBVkC zg_14g)b7mttB;Ipi7+0j=EfmOcYaj+URC?SUyjV&GK0;Ypm`O1&+mnFDAHt_Wa^|( z`YeAsn3KY6U}On2-`Al4BpZfk4a_;&>ZsPsvgl9Wb>eV(tsU{vWr@(lZtERIphDVd zIja(V9wk=hRfle(eVrKPN{!r-^(P&y*FiXpI=Tfs>PUP+F%4FfcH>Z+3`w+YZS~+;Sr?Tc9<)7|6Na1M79~=2a5uC;%&%}U z9f-mAC^J9e&V|_cE78|IwMqBqNXPs{TKbBz=n4uV zpgiR=v}2DJifq5&TBi`MOub!$hQHlnfJCnc=CW??isy}EJexj94F&*gJ_Zxh=E?Wk zz!7Lh9Hr^n4S@W`7J$`jg6j^i#AX$2LP6b~8h==7M+Ni7;pGOpm>!aQOj{+0A&L)@ zTafuN=nX`|p6QX*zuf|ii5;TD_{CI+*td**SsW@PwP7x0zOZJTYOQpgVg{EdrE88Q zs0zS_!J%)Vc4s+b<0e9i%bF`ICfua2g05QkX@g2zswgOVqY)({My(?xql?doDFHmH zhXslZxi|@oaVbcc%v|gtZ*uIWgE+D3h5ru1EE4&}keXO$Mrt zG!ql1K*V%u5O$iQ4S~gT;@AKO+9Zsy{41c8pl;NPLKr$LW<;2BB=#ka4km`x3-gt1 zoI@qM#6p)dJw*HHdc_R5P`8Nf9e1+R=r2K>QvlC$l`w*PQVY_=&};~65d*j~GR+z} zwkVtuYDk!mYGO_%wQDuf zrjvyPHXv$@GOnnNGRd`*%^P-iAO>IEo(KAaUD1BZG+5cslW^a{y~$ZM*`sV}LG7%_ z?)rmcMI=2yWw890OL+a;i(sERK(p`#Y*LH$r#%vYQupV>w$5aslcby*AUBq?(a&kg z?-CQU@k!IVWE7avx`4B+jNcm}>uf+_4S{;f1zbDf`wJaWG;oIyq093|M)6CqjZI6A z;Lp5HH8M#H5OAq_4D`rsnpYyUr3ik`*|f>b&miwM0WNMRHVsCHsG;g<*`5WYwVR2v zst~$5g(xVl;#> ziUiBgf{&|RjR5O;xGB;PiVkqyZRqfgyRAl%m(9FVpIMTS~B`Mb$oItv7s zIdXYuQgcJK8~U98Q0q#(NrxfCgF0x^H{9ZqrMQd@Vq|iz#LnFguI$?Gb#lVAVy_L_ zf!X1H&FlmTUrn!cF^XZ=bp!W6f@xs)4{97OY&!kh*00km0evIGABKH-fY``pxu5 znY0@KqM(pi*oMr?^l7t&yjID6#5U4V?>)~6YfA+G@Mjx0iYC)On&C#!PlzJx zu51mX#!$?)rGr_50;v4yQiL7&Y-p7UVIM-9?PTH8~GZguJk@=(*Y3ml{8uAVoQ{MBeT)3)pY7g+~h z*VAO_Mt0vg!<x<=UM?8Vu;L2MfAQHqzvF zMyndpxR5zb?Cz)_{8%0QdxC#gafn&79aQ^Qg53@@1RxwEBGQ+vK_}-6lP)qL^SefI zuTJ-{pz+xO(2TN#won*@2%$l566He`-~vgnOfn}9;YoxrJyT4kpom)JSUxtbv6*==ry7B1jh zUlDBB(YyAw@0h$8)7tjV01BftMlJ#;Dp< z+d|h^@TnGB@}=ZshiMy_uvay0mf)^WE?9^)i(XorFvMvXImgaj3-y-w)zQ&k z)D9S#Pyd>GuaB$7cJuU^)!gN!r;nUgld@&#%eHlS_^PsPS#Ct2b%I6IKV4t;GPalMBGoz?(MD=r(@26FaeJjXcP z$j?v)vr=dq1mbRV^i#(eT}h)l(b=3$2VTbj}?hfQmza4Ja&E zDwKoVCj3#_Rc1sxFWW=`#6pvv!XVU$#)+N{BGJG5j4*;;AlRWt7!Uc%F*(~6t|1$$ z0*TB*Cofgn9F$2D-MA%)A1TO^VQP*bII%RA8S{n>?g%6Xx)98JUgq0wZpwmVY+%{0 zx_scyF#f2RiG%2@1;rv`$GFA28YVLfCbP~@ZGQ(h%WYOVDoVxva3I0T#))QdT7#wC z90W1O95Km`F$f*g5iq`m@s~^n4vrj>7VOR;Ofy1|S?!n;Q8vBqAc`5a;f}tLsPKym zRhz($QlkP7CLB>f(;8uM<9jE3o>%ouA;#QwZf?YS#6SoTlRMwxeOVal+a4I$Om7sa zeB7U2C}XTsbp{;F;UPEFV4!e3lQj^=`_vnS2HwuWsjyO`kMss)|J7;l210Yl2lGLyQ1kZ})7i$49xVf zCet%dVUSvetR>4kPNyo`=s|_-%WjHL{Cxqc(&e!?2~FM=Zt zYU&!AuoGe@-Zx0c$QbzI@VSMh6?wo*pTQKARMa%IbnGDq3z-xFhEOvTloVs!?FbDu zBHL-Vz4i;muS9NqBgCiXL_j182iJSW7iZE2I_vFs01M9|9~|+K#sVhMoN1jf1se_B z43nL+LoCW6ht)Xfq6<#h=Ctkf=9&`=X2%8w>BX&AVY+0qnWnRPr6LZzj*BS7gXZ{9 zSvCHv-&L38*k!le5=tzo#)9QDj<(5}|0{1;o=wY1`B~FqwAX#AY zAa5KmA%zzurc$ItsbT{ROr0ieI%`WW3?AZN85uIR0@~j7l@Bwd!b}xq&QftDe%7n9 z%D=_WpmJp%)i-OERaIS0wbfx?$ez6RyVo3FOo zJ+G_|e;QF&-Srr6qDdyyTOYDQx3`W#D=0517Kob)HgCV&$C}h@^uPJd(%_jV>O6&7 znBk1G2ns}E#q8O(h;g1xL9I@HNQQjn`tx?_&ySxl>X;424|U}l83BM1@|v&UUjaOh zYx##GkSH_;i^CUn=pg|O7KVz6uwX?FR#HnN!$KRw;s83w%JQPD>ZV;WF5FnGyjR0G z&C7bT-R%#SEG~7vJbC);xho5qt;3|t0-D$lKRG=+zZgk<6U*z>`sViT{^7;TSFacF zFWmS22WXNG+k7VU^tkbXB|at1WjpM~kDoq&`I?0(yyL(XSgo-?2Rd@HDoN2~wA$Lt zdL%4$Occz|K=ZgL()DvI9p>?*0ok9P9WPv;hXt48?MpR1YXpDM%mQRs4x5>j&iL(T zsd9m|CY~?mb;8_MNvmB5|NXpp8l;3gDKp5W>jjMpzrc!%h*?mJm<9D#f1Fqmj%NhS zd2h_ulXqR8((~@VTq$E>&-gT_r8S&R8O|u|5kFiAq+Uo*3Ddj2dTdl9DW3Oc*)J|2 zs}ZbemK1fpeCk-YE|^_=vt$p3YBeH+M|Jr#s_D%^fT8 z&buj0^$y-e-Gi$rIO@<3)DjP!fJDU)8d6`ry1lIMuPmUx5?ccnB2;*&SPcvr0fgda zE4-zlI(0StrVgWFF%9kN!dBn;lK(r&wVUnOHz1*ZiJz$c*LOq>)j*Pd&wMphdPI|9 zM7rRf9>b%?7n8VcIzeOt&NX=*ZxVqqv{x*2^dd#H2QY?f!X`iPQy!4ZjnoFGG>Dr- zb^10{apcYT-TO{;(8{2e;yF|3n4wFD)A~)}6ww8ySR$tI)lbDywBi!3pVx_PbV=L=pN$-B#(}+vpWlzTJydw%OyDI45*u1PuyKh@h0C zZ#1J&AGj5@YtqGd5P*-7>Uyr?Cj1=QTGW8*% zKBOQ%i7_Iih~#=1g<7Qjg0fkN&93<1Iv7%1=w1h^+j zH}Ps<0gMD5DC8c%5Fku}fdZdE@NL_sj0_gQNZ^4&?g0z|!W0-N@CgLCmp0;)qF9f$ zSc_sk)?+Ph;|coS_0+VE<)BulM;>i>0Ta=aL}kU+U}u~^UKz;G2?mCKyl%+j$sO(z zLCgKm{e1XYIA-l!pWR1+^o^77@?(qF9=@h!1!`zO&M>yo6`t#{tV)Ef|H$Ceho**n z%AaObE=0t{VYd+k`C)$dL(@aYn8KA)p#=N0AWUemIbyhwvqIAi(+bZn17SiL7gA}u zVOm9QH5U*jv{=I2Vz`jA5=}Qut5^!1siKt9rMd{IG~F<*BKOh+TCR2G2&pvPu*$72 z)&u|m0000p^ z)Z`LnjcIb+E`C2^(rzH-cwj0Igp8_>-okUJUEK~d6|MS6eyuWf5-qT3Z|dn(}~dYzW)LG`5*e<^t#^l z|J!l*JL+HP*DIPo{)_bV-b-ibhfgn zw?F=$V)JTz)jjp_se2$}x)7d{|6CLK3^VxavCNC}?;ZWSS$u@QzkU|Jb&T!bSr!9u z&eiYNtIPagJr(}@-~RX+3#T{)fBp>;H}EmMDZUl&OYi;gzuT@6FZvj>_*1`USjwjW E0Q6i=J^%m! diff --git a/packages/chat/.storybook/assets/fonts/UCityProWeb-Regular.woff b/packages/chat/.storybook/assets/fonts/UCityProWeb-Regular.woff deleted file mode 100644 index 88f2a66c5acf4801e47214076b8485ce9ed5a677..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49264 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
UG$f3i%+ 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 r{vcZ+8sJ+W?gyd{2lfN1rO2rk5$&TvOs<^ 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 diff --git a/packages/chat/.storybook/assets/fonts/UCityProWeb-Regular.woff2 b/packages/chat/.storybook/assets/fonts/UCityProWeb-Regular.woff2 deleted file mode 100644 index 43f69dd5b7a0d5af3f2690d805b8852a78372c53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40292 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≧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 M?{bb^F0KIp0A@ApAOHXW diff --git a/packages/chat/.storybook/assets/fonts/fonts.css b/packages/chat/.storybook/assets/fonts/fonts.css deleted file mode 100644 index 6c69fd0ca0..0000000000 --- a/packages/chat/.storybook/assets/fonts/fonts.css +++ /dev/null @@ -1,37 +0,0 @@ -@import url('https://fonts.googleapis.com/css2?family=Fira+Code:wght@450&display=swap'); - -@font-face { - font-family: 'UCityProWeb'; - src: - local('UCityProWeb'), - url('./UCityProWeb-Regular.woff') format('woff'), - url('./UCityProWeb-Regular.woff2') format('woff2'); - font-weight: 400; -} - -@font-face { - font-family: 'UCityProWeb'; - src: - local('UCityProWeb'), - url('./UCityProWeb-Semibold.woff') format('woff'), - url('./UCityProWeb-Semibold.woff2') format('woff2'); - font-weight: 600; -} - -@font-face { - font-family: 'UCityProWeb'; - src: - local('UCityProWeb'), - url('./UCityProWeb-Bold.woff') format('woff'), - url('./UCityProWeb-Bold.woff2') format('woff2'); - font-weight: 700; -} - -@font-face { - font-family: 'ABCMaxiRound'; - src: - local('ABCMaxiRound-Light'), - url('./ABCMaxiRound-Light.woff') format('woff'), - url('./ABCMaxiRound-Light.woff') format('woff2'); - font-weight: 700; -} diff --git a/packages/chat/.storybook/main.ts b/packages/chat/.storybook/main.ts deleted file mode 100644 index b5bcf33b71..0000000000 --- a/packages/chat/.storybook/main.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* eslint-disable sonarjs/prefer-single-boolean-return */ -import type { StorybookConfig } from '@storybook/react-vite'; -import { mergeConfig } from 'vite'; -import svgr from 'vite-plugin-svgr'; - -import { createPlugins } from '../vite.widget.config'; - -const config: StorybookConfig = { - stories: ['../src/**/*.story.@(js|jsx|ts|tsx)'], - addons: [ - '@storybook/addon-links', - '@storybook/addon-essentials', - '@storybook/addon-interactions', - 'storybook-dark-mode', - ], - framework: '@storybook/react-vite', - core: { - builder: '@storybook/builder-vite', - }, - typescript: { - check: true, - reactDocgen: 'react-docgen-typescript', - reactDocgenTypescriptOptions: { - shouldExtractLiteralValuesFromEnum: true, - propFilter: (prop: { name: string; parent?: { fileName: string } }): boolean => { - if (['ref', 'css'].includes(prop.name)) return false; - if (prop.parent && /node_modules/.test(prop.parent.fileName)) return false; - - return true; - }, - }, - }, - - viteFinal: (config) => { - return mergeConfig(config, { - plugins: [...createPlugins(), svgr()], - define: { - __USE_SHADOW_ROOT__: false, - }, - }); - }, -}; - -export default config; diff --git a/packages/chat/.storybook/preview-head.html b/packages/chat/.storybook/preview-head.html deleted file mode 100644 index a73317e951..0000000000 --- a/packages/chat/.storybook/preview-head.html +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/packages/chat/.storybook/preview.tsx b/packages/chat/.storybook/preview.tsx deleted file mode 100644 index e9307c3088..0000000000 --- a/packages/chat/.storybook/preview.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import 'regenerator-runtime/runtime'; -import './assets/fonts/fonts.css'; - -import type { Preview } from '@storybook/react'; - -const preview: Preview = { - parameters: { - controls: { - matchers: { - color: /(background|color)$/i, - date: /Date$/, - fontFamily: 'sans-serif', - }, - }, - }, -}; - -export default preview; diff --git a/packages/chat/CHANGELOG.md b/packages/chat/CHANGELOG.md deleted file mode 100644 index f109f0e97f..0000000000 --- a/packages/chat/CHANGELOG.md +++ /dev/null @@ -1,888 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -# [2.31.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.30.2...@voiceflow/react-chat@2.31.0) (2025-01-13) - -### Features - -* add loading state to launcher with label (COR-4435) ([#523](https://github.com/voiceflow/react-chat/issues/523)) ([08fd1b2](https://github.com/voiceflow/react-chat/commit/08fd1b2a67b2e776fe1c9ffe16fdd315cc6dad65)) -* expose voice api (COR-4463) ([#524](https://github.com/voiceflow/react-chat/issues/524)) ([ed0befc](https://github.com/voiceflow/react-chat/commit/ed0befc1da00ba0fdc0e69531b5e9821c0493719)) - -## [2.30.2](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.30.1...@voiceflow/react-chat@2.30.2) (2025-01-10) - -### Bug Fixes - -* hide/show chat callbacks (DSN-2664) ([#514](https://github.com/voiceflow/react-chat/issues/514)) ([c183dad](https://github.com/voiceflow/react-chat/commit/c183dad69d9e91cf2aa15092da12d6f8269d66a9)) - -## [2.30.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.30.0...@voiceflow/react-chat@2.30.1) (2025-01-10) - -### Bug Fixes - -* fix loading indicator when chat ends (COR-4425) ([#512](https://github.com/voiceflow/react-chat/issues/512)) ([6ea3505](https://github.com/voiceflow/react-chat/commit/6ea35057d0d3aec9c6e8aee5d667d7ad8b2659d7)) - -# [2.30.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.29.1...@voiceflow/react-chat@2.30.0) (2025-01-10) - -### Features - -* bump dtos interact (COR-4422) ([#510](https://github.com/voiceflow/react-chat/issues/510)) ([6d10023](https://github.com/voiceflow/react-chat/commit/6d10023aa764c2d905fc7ccee5397b1782e11cd2)) - -## [2.29.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.29.0...@voiceflow/react-chat@2.29.1) (2025-01-10) - -### Bug Fixes - -* change header image background (COR-4419) ([#508](https://github.com/voiceflow/react-chat/issues/508)) ([e19d970](https://github.com/voiceflow/react-chat/commit/e19d97058e8d216d5e7ccd6d5c1ddfa5a335a22b)) - -# [2.29.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.28.0...@voiceflow/react-chat@2.29.0) (2025-01-08) - -### Features - -* add disabled and loading states to launcher (COR-4421) ([#503](https://github.com/voiceflow/react-chat/issues/503)) ([af83dbf](https://github.com/voiceflow/react-chat/commit/af83dbf6249a320f69cd365b09a1e037770acfdb)) - -# [2.28.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.27.0...@voiceflow/react-chat@2.28.0) (2025-01-08) - -### Features - -* unsubscribe from all services on end conversation (COR-4408) ([#500](https://github.com/voiceflow/react-chat/issues/500)) ([faf691f](https://github.com/voiceflow/react-chat/commit/faf691f5b53cd95e56a9a51811f6518a4b9db4c9)) - -# [2.27.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.26.0...@voiceflow/react-chat@2.27.0) (2025-01-08) - -### Features - -* expose widget settings type (COR-4405) ([#498](https://github.com/voiceflow/react-chat/issues/498)) ([51b719d](https://github.com/voiceflow/react-chat/commit/51b719d49e4827dd1c122787bfe513c803d95761)) - -# [2.26.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.25.1...@voiceflow/react-chat@2.26.0) (2025-01-07) - -### Features - -* update voice widget (COR-4323) ([#482](https://github.com/voiceflow/react-chat/issues/482)) ([cfc70e5](https://github.com/voiceflow/react-chat/commit/cfc70e52061ad764017d7fe19fbadb8044fed0c1)) - -## [2.25.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.25.0...@voiceflow/react-chat@2.25.1) (2025-01-07) - -### Bug Fixes - -* really minor ui issues (COR-4380, COR-4177) ([#490](https://github.com/voiceflow/react-chat/issues/490)) ([795f259](https://github.com/voiceflow/react-chat/commit/795f259b08ba15a02e756659d2c64ee8b843b3be)) - -# [2.25.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.24.1...@voiceflow/react-chat@2.25.0) (2025-01-07) - -### Features - -* bump dto interact (COR-4274) ([#478](https://github.com/voiceflow/react-chat/issues/478)) ([8ac190d](https://github.com/voiceflow/react-chat/commit/8ac190d1f45df9c9f84e5df3eb9759ad75c21b25)) - -## [2.24.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.24.0...@voiceflow/react-chat@2.24.1) (2025-01-03) - -### Bug Fixes - -* carousel hitbox edges fix (COR-4364) ([#486](https://github.com/voiceflow/react-chat/issues/486)) ([eb119f0](https://github.com/voiceflow/react-chat/commit/eb119f0aaa94065196c130cb3da26299cc6fbdbd)) - -# [2.24.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.23.0...@voiceflow/react-chat@2.24.0) (2025-01-03) - -### Features - -* change padding on welcome banner (COR-4248) ([#479](https://github.com/voiceflow/react-chat/issues/479)) ([f186c2e](https://github.com/voiceflow/react-chat/commit/f186c2e6f08d188772f81c364b57fd3bd8f8865e)) -* make launcher image undraggable (COR-4295) ([#480](https://github.com/voiceflow/react-chat/issues/480)) ([4327a42](https://github.com/voiceflow/react-chat/commit/4327a42c5587a743708b0227734c63fa73407eb5)) - -# [2.23.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.22.2...@voiceflow/react-chat@2.23.0) (2024-12-18) - -### Features - -* add animations to proactive messages (COR-4271) ([#471](https://github.com/voiceflow/react-chat/issues/471)) ([04c0363](https://github.com/voiceflow/react-chat/commit/04c0363ac04ec34147941beef3443643e7e3ba6b)) - -## [2.22.2](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.22.1...@voiceflow/react-chat@2.22.2) (2024-12-18) - -### Bug Fixes - -* launcher spacing to chat (COR-4256) ([#472](https://github.com/voiceflow/react-chat/issues/472)) ([7cd52c4](https://github.com/voiceflow/react-chat/commit/7cd52c457ec0756b0a22ff808b1fa8aef2c55af6)) - -## [2.22.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.22.0...@voiceflow/react-chat@2.22.1) (2024-12-17) - -**Note:** Version bump only for package @voiceflow/react-chat - -# [2.22.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.21.2...@voiceflow/react-chat@2.22.0) (2024-12-16) - -### Features - -* show default banner image (COR-4235) ([#466](https://github.com/voiceflow/react-chat/issues/466)) ([ed42b9c](https://github.com/voiceflow/react-chat/commit/ed42b9c1a68ea6b8dd5a8105f4d3f6b42c3c8ea4)) - -## [2.21.2](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.21.1...@voiceflow/react-chat@2.21.2) (2024-12-16) - -### Bug Fixes - -* Launcher with label only spacing (COR-4241) ([#464](https://github.com/voiceflow/react-chat/issues/464)) ([3e0ba57](https://github.com/voiceflow/react-chat/commit/3e0ba57c526086927936d3bde946b581df516d5f)) - -## [2.21.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.21.0...@voiceflow/react-chat@2.21.1) (2024-12-13) - -### Bug Fixes - -* actually pass in the disclaimer props (COR-4228) ([#462](https://github.com/voiceflow/react-chat/issues/462)) ([120ea01](https://github.com/voiceflow/react-chat/commit/120ea01aac0745b65989409cd8e33f908a898312)) - -# [2.21.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.20.0...@voiceflow/react-chat@2.21.0) (2024-12-13) - -### Features - -* sync some missing settings (COR-4228) ([#458](https://github.com/voiceflow/react-chat/issues/458)) ([9dc48da](https://github.com/voiceflow/react-chat/commit/9dc48daa887280fe49b577eef1dc43ee5294a586)) - -# [2.20.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.19.0...@voiceflow/react-chat@2.20.0) (2024-12-12) - -### Features - -* update widget when settings are updated (COR-4159) ([#456](https://github.com/voiceflow/react-chat/issues/456)) ([690b0f1](https://github.com/voiceflow/react-chat/commit/690b0f103f2aa56f2d24eb76119d006699c0aaa0)) - -# [2.19.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.18.0...@voiceflow/react-chat@2.19.0) (2024-12-12) - -### Features - -* mobile & responsiveness adjustments (COR-4185) ([#448](https://github.com/voiceflow/react-chat/issues/448)) ([392bee9](https://github.com/voiceflow/react-chat/commit/392bee9a9cdf4720274bedadb60d4e69cd568c34)) - -# [2.18.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.17.2...@voiceflow/react-chat@2.18.0) (2024-12-12) - -### Features - -* Google Font Support (DSN-2621) ([#447](https://github.com/voiceflow/react-chat/issues/447)) ([eb94f97](https://github.com/voiceflow/react-chat/commit/eb94f97c0e876de2263b563f93719f20693b06d0)) - -## [2.17.2](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.17.1...@voiceflow/react-chat@2.17.2) (2024-12-12) - -### Bug Fixes - -* Launcher spacing, icon (DSN-2616) ([#442](https://github.com/voiceflow/react-chat/issues/442)) ([71c68c4](https://github.com/voiceflow/react-chat/commit/71c68c434a04bf5da226898d3aafb0aee5630835)) - -## [2.17.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.17.0...@voiceflow/react-chat@2.17.1) (2024-12-12) - -### Bug Fixes - -* make footer link optionally just text (DSN-2613) ([#434](https://github.com/voiceflow/react-chat/issues/434)) ([d1b80d9](https://github.com/voiceflow/react-chat/commit/d1b80d98c156b3fba81ded4de529a0f79bdce3ef)) - -# [2.17.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.16.2...@voiceflow/react-chat@2.17.0) (2024-12-11) - -### Features - -* adjust popover height by content (COR-4186) ([#436](https://github.com/voiceflow/react-chat/issues/436)) ([98c12c4](https://github.com/voiceflow/react-chat/commit/98c12c434c1654402dbbd99a373fd6ff22eb4bf7)) -* default launcher icon (COR-4181) ([#439](https://github.com/voiceflow/react-chat/issues/439)) ([e162f16](https://github.com/voiceflow/react-chat/commit/e162f167cc1cd505a1e883604530c4463cd2cff1)) - -## [2.16.2](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.16.1...@voiceflow/react-chat@2.16.2) (2024-12-11) - -### Bug Fixes - -* adjust placeholder font size (COR-4169) ([#437](https://github.com/voiceflow/react-chat/issues/437)) ([182ab0c](https://github.com/voiceflow/react-chat/commit/182ab0c401ac39853aafa13a4c4a50471b1fe4d4)) - -## [2.16.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.16.0...@voiceflow/react-chat@2.16.1) (2024-12-11) - -### Bug Fixes - -* adjust feedback buttons (COR-4173) ([#438](https://github.com/voiceflow/react-chat/issues/438)) ([364795f](https://github.com/voiceflow/react-chat/commit/364795fd4daaa4b9d76ee46c21ee6b2524dd2455)) - -# [2.16.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.15.1...@voiceflow/react-chat@2.16.0) (2024-12-09) - -### Features - -* remove audio output widget from header (DSN-000) ([#432](https://github.com/voiceflow/react-chat/issues/432)) ([5c31e5e](https://github.com/voiceflow/react-chat/commit/5c31e5e4c3b81d39a9d0c339021690ed55048222)) - -## [2.15.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.15.0...@voiceflow/react-chat@2.15.1) (2024-12-09) - -### Bug Fixes - -* animation timing consistency (DSN-2598) ([#429](https://github.com/voiceflow/react-chat/issues/429)) ([6f93399](https://github.com/voiceflow/react-chat/commit/6f9339969c03c59901ff0dfc0a0429383bf75a9f)) - -# [2.15.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.14.0...@voiceflow/react-chat@2.15.0) (2024-12-09) - -### Features - -* show feedback buttons on last text message (COR-4153) ([#428](https://github.com/voiceflow/react-chat/issues/428)) ([a7b5b1e](https://github.com/voiceflow/react-chat/commit/a7b5b1ea9703628870f71219a52660c4f024f888)) - -# [2.14.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.13.1...@voiceflow/react-chat@2.14.0) (2024-12-09) - -### Bug Fixes - -* spacing for cards with only buttons (COR-2603) ([#425](https://github.com/voiceflow/react-chat/issues/425)) ([4418099](https://github.com/voiceflow/react-chat/commit/4418099a926c7d541f05712a688539420b400311)) - -### Features - -* Improve Launcher w/ Label animations (DSN-2522) ([#424](https://github.com/voiceflow/react-chat/issues/424)) ([40e4512](https://github.com/voiceflow/react-chat/commit/40e451219eee93641a878ad2529fec9ef60d2b74)) - -## [2.13.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.13.0...@voiceflow/react-chat@2.13.1) (2024-12-06) - -### Bug Fixes - -* limit footer link space (COR-4140) ([#422](https://github.com/voiceflow/react-chat/issues/422)) ([926d9b3](https://github.com/voiceflow/react-chat/commit/926d9b3da3f65afdb7a748949059f60a1bb5319d)) - -# [2.13.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.12.4...@voiceflow/react-chat@2.13.0) (2024-12-06) - -### Features - -* show default avatar from cdn (COR-0000) ([#411](https://github.com/voiceflow/react-chat/issues/411)) ([ced7ce8](https://github.com/voiceflow/react-chat/commit/ced7ce8f41b05e691448edebbd69db8182f4d109)) - -## [2.12.4](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.12.3...@voiceflow/react-chat@2.12.4) (2024-12-06) - -### Bug Fixes - -* apply launcher settings (COR-0000) ([#419](https://github.com/voiceflow/react-chat/issues/419)) ([ff55766](https://github.com/voiceflow/react-chat/commit/ff55766cd677673c8b4346432e1d1135dc9808e3)) - -## [2.12.3](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.12.2...@voiceflow/react-chat@2.12.3) (2024-12-06) - -### Bug Fixes - -* change entry animation (DSN-2521) ([#414](https://github.com/voiceflow/react-chat/issues/414)) ([0bf6f73](https://github.com/voiceflow/react-chat/commit/0bf6f73c6879fed18c569baef0e379758adc2393)) - -## [2.12.2](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.12.1...@voiceflow/react-chat@2.12.2) (2024-12-06) - -### Bug Fixes - -* spacing of widget depending on launcher style (DSN-2597) ([#415](https://github.com/voiceflow/react-chat/issues/415)) ([d909a5e](https://github.com/voiceflow/react-chat/commit/d909a5ef541aa085c7b00c5d469edd49a1e5cf83)) - -## [2.12.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.12.0...@voiceflow/react-chat@2.12.1) (2024-12-05) - -### Bug Fixes - -* pass ai generated message to message component (DSN-000) ([#406](https://github.com/voiceflow/react-chat/issues/406)) ([499d3b2](https://github.com/voiceflow/react-chat/commit/499d3b29ae87148f6dcc016629aba4dc99d6b57a)) - -# [2.12.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.11.2...@voiceflow/react-chat@2.12.0) (2024-12-05) - -### Features - -* deploy image asset to cdn (COR-0000) ([#407](https://github.com/voiceflow/react-chat/issues/407)) ([1990586](https://github.com/voiceflow/react-chat/commit/1990586446f481e1ea9ee963caa31df897c93d05)) - -## [2.11.2](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.11.1...@voiceflow/react-chat@2.11.2) (2024-12-04) - -### Bug Fixes - -* embedded view is always open (COR-0000) ([#404](https://github.com/voiceflow/react-chat/issues/404)) ([6871dfb](https://github.com/voiceflow/react-chat/commit/6871dfbcd2451ec930c06dc47e27a186ab884061)) - -## [2.11.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.11.0...@voiceflow/react-chat@2.11.1) (2024-12-04) - -### Bug Fixes - -* Mobile height/width issues (DSN-2417) ([#394](https://github.com/voiceflow/react-chat/issues/394)) ([1c81dd7](https://github.com/voiceflow/react-chat/commit/1c81dd7b035b99e468107a234cf5e2cf3012a07f)) - -# [2.11.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.10.0...@voiceflow/react-chat@2.11.0) (2024-12-04) - -### Features - -* styling proactive messages (COR-0000) ([#397](https://github.com/voiceflow/react-chat/issues/397)) ([c2ab9a0](https://github.com/voiceflow/react-chat/commit/c2ab9a09d92779082e9ca63f0800aa668ea54688)) - -# [2.10.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.9.1...@voiceflow/react-chat@2.10.0) (2024-12-03) - -### Features - -* add popover modality (COR-0000) ([#398](https://github.com/voiceflow/react-chat/issues/398)) ([c2a225d](https://github.com/voiceflow/react-chat/commit/c2a225d7137620612fbe97f4a02ffe139ff56234)) - -## [2.9.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.9.0...@voiceflow/react-chat@2.9.1) (2024-12-03) - -### Bug Fixes - -* pass hasEnded prop to footer (COR-0000) ([#399](https://github.com/voiceflow/react-chat/issues/399)) ([41dbcc7](https://github.com/voiceflow/react-chat/commit/41dbcc71a5c6bfb00e8f5298955264769de479e6)) - -# [2.9.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.8.1...@voiceflow/react-chat@2.9.0) (2024-12-03) - -### Bug Fixes - -* remove margin from first/last p elements (COR-0000) ([#387](https://github.com/voiceflow/react-chat/issues/387)) ([d77433f](https://github.com/voiceflow/react-chat/commit/d77433f66ecb8cd88ae7b5cf89b501e6e78fb95a)) - -### Features - -* use new WidgetSettings object for chat configuration ([#376](https://github.com/voiceflow/react-chat/issues/376)) ([43ebd19](https://github.com/voiceflow/react-chat/commit/43ebd19bf4e8d31fbddd8c39a05335d25056ad31)) - -## [2.8.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.8.0...@voiceflow/react-chat@2.8.1) (2024-12-03) - -### Bug Fixes - -* move feedback buttons with carousel (COR-4091) ([#386](https://github.com/voiceflow/react-chat/issues/386)) ([4fe7b4f](https://github.com/voiceflow/react-chat/commit/4fe7b4f4bafccb02c9ac348b4bad014da61218d6)) -* scroll down button position on chat end (COR-4092) ([#388](https://github.com/voiceflow/react-chat/issues/388)) ([b3c0154](https://github.com/voiceflow/react-chat/commit/b3c01542df29f2b5904ae96d098bdd3f5dfdc3bb)) - -# [2.8.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.7.2...@voiceflow/react-chat@2.8.0) (2024-11-28) - -### Bug Fixes - -* copy icon transitions when clicked (DSN-2583) ([#374](https://github.com/voiceflow/react-chat/issues/374)) ([761f7b3](https://github.com/voiceflow/react-chat/commit/761f7b37b71df1550639ffadfb108b83a4217a27)) -* paragraph spacing (DSN-2582) ([#377](https://github.com/voiceflow/react-chat/issues/377)) ([1ed7cfb](https://github.com/voiceflow/react-chat/commit/1ed7cfb0a7d999a86ebb262b88b37abd0b4058ae)) - -### Features - -* Audio input button transition (DSN-2581) ([#375](https://github.com/voiceflow/react-chat/issues/375)) ([19c6207](https://github.com/voiceflow/react-chat/commit/19c6207801822c146320c335a938a60f143b4ad8)) - -## [2.7.2](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.7.1...@voiceflow/react-chat@2.7.2) (2024-11-28) - -### Bug Fixes - -* Launcher hitbox and entry animation (DSN-2523) ([#373](https://github.com/voiceflow/react-chat/issues/373)) ([a873882](https://github.com/voiceflow/react-chat/commit/a873882e22867bb6bdfb79d298ab309838d6e004)) - -## [2.7.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.7.0...@voiceflow/react-chat@2.7.1) (2024-11-28) - -### Bug Fixes - -* Entry Animation (DSN-2566) ([#372](https://github.com/voiceflow/react-chat/issues/372)) ([c8d1c9e](https://github.com/voiceflow/react-chat/commit/c8d1c9e77df6aaa2b480af5a284fd4ea48b7b8d7)) - -# [2.7.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.6.4...@voiceflow/react-chat@2.7.0) (2024-11-27) - -### Features - -* expose chat container (DX-000) ([#352](https://github.com/voiceflow/react-chat/issues/352)) ([8863615](https://github.com/voiceflow/react-chat/commit/88636157292c4cf28b8047a9da68c31a82d65b30)) - -## [2.6.4](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.6.3...@voiceflow/react-chat@2.6.4) (2024-11-26) - -### Bug Fixes - -* limit the width of user messages (COR-0000) ([#367](https://github.com/voiceflow/react-chat/issues/367)) ([461ea70](https://github.com/voiceflow/react-chat/commit/461ea7028af9537fdd56e7219e60b0b35cd86e6a)) - -## [2.6.3](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.6.2...@voiceflow/react-chat@2.6.3) (2024-11-26) - -### Bug Fixes - -* animation synced up (DSN-2567) ([#363](https://github.com/voiceflow/react-chat/issues/363)) ([4c40948](https://github.com/voiceflow/react-chat/commit/4c409481d2372af8e11f3859cf8a5f635fa2cf95)) - -## [2.6.2](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.6.1...@voiceflow/react-chat@2.6.2) (2024-11-25) - -### Bug Fixes - -* dont jank when user starts new chat (COR-4010) ([#362](https://github.com/voiceflow/react-chat/issues/362)) ([dfab0ce](https://github.com/voiceflow/react-chat/commit/dfab0cea6baf283e9a52595fe1d816aad17b89bc)) - -## [2.6.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.6.0...@voiceflow/react-chat@2.6.1) (2024-11-25) - -### Bug Fixes - -* glitches with MessageInput behavior (COR-4014) ([#359](https://github.com/voiceflow/react-chat/issues/359)) ([a66e842](https://github.com/voiceflow/react-chat/commit/a66e8426d12990a5bf156af28a40e10ffb08cf27)) - -# [2.6.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.5.2...@voiceflow/react-chat@2.6.0) (2024-11-25) - -### Features - -* no bottom margin if list element is last in message (DSN-2562) ([#360](https://github.com/voiceflow/react-chat/issues/360)) ([625f7bf](https://github.com/voiceflow/react-chat/commit/625f7bf2c950b75b99c98df8be68ff71782aac48)) - -## [2.5.2](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.5.1...@voiceflow/react-chat@2.5.2) (2024-11-25) - -### Bug Fixes - -* review updates (COR-0000) ([#350](https://github.com/voiceflow/react-chat/issues/350)) ([4856dd4](https://github.com/voiceflow/react-chat/commit/4856dd471d39cdb7391989be66788f803bf3281d)) - -## [2.5.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.5.0...@voiceflow/react-chat@2.5.1) (2024-11-25) - -### Bug Fixes - -* appearence behaviour of feedback (DSN-2527) ([#354](https://github.com/voiceflow/react-chat/issues/354)) ([4efbbcb](https://github.com/voiceflow/react-chat/commit/4efbbcbecf4656ce0f3af591faf4d535a168f9e1)) - -# [2.5.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.4.1...@voiceflow/react-chat@2.5.0) (2024-11-25) - -### Features - -* Copy improvements (DSN-2559) ([#347](https://github.com/voiceflow/react-chat/issues/347)) ([4eceddc](https://github.com/voiceflow/react-chat/commit/4eceddc13f8b31777430b449d9014366376e71fd)) - -## [2.4.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.4.0...@voiceflow/react-chat@2.4.1) (2024-11-25) - -### Bug Fixes - -* avatar moves with Carousel cards (COR-0000) ([#349](https://github.com/voiceflow/react-chat/issues/349)) ([bb82258](https://github.com/voiceflow/react-chat/commit/bb822589699dbd0627be66c96581b1fc18782b3e)) - -# [2.4.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.3.1...@voiceflow/react-chat@2.4.0) (2024-11-25) - -### Features - -* pass chat window prop to chat widget component to render custom chat window ([#348](https://github.com/voiceflow/react-chat/issues/348)) ([41f00ed](https://github.com/voiceflow/react-chat/commit/41f00ed7c0ce17d896d89edcd3c33a9e94fa1a6e)) - -## [2.3.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.3.0...@voiceflow/react-chat@2.3.1) (2024-11-21) - -### Bug Fixes - -* Animation + Spacing improvements (DSN-000) ([#345](https://github.com/voiceflow/react-chat/issues/345)) ([1a69699](https://github.com/voiceflow/react-chat/commit/1a69699df1a0512306ed6f50cfaa759d04057449)) - -# [2.3.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.2.5...@voiceflow/react-chat@2.3.0) (2024-11-20) - -### Features - -* Launcher revisions (DSN-2520) ([#303](https://github.com/voiceflow/react-chat/issues/303)) ([6f19cb5](https://github.com/voiceflow/react-chat/commit/6f19cb5e2d35b76768adc7f0f89cad76148e3684)) -* New Widget launch animation (DSN-2521) ([#322](https://github.com/voiceflow/react-chat/issues/322)) ([03fb0d9](https://github.com/voiceflow/react-chat/commit/03fb0d98a7a5b653f2af3100ae002192eea0a202)) - -## [2.2.5](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.2.4...@voiceflow/react-chat@2.2.5) (2024-11-20) - -### Bug Fixes - -* show Prompt over scroll down button (COR-3947) ([#337](https://github.com/voiceflow/react-chat/issues/337)) ([87d829d](https://github.com/voiceflow/react-chat/commit/87d829dc4462028c670721e71179be5c942843f0)) - -## [2.2.4](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.2.3...@voiceflow/react-chat@2.2.4) (2024-11-19) - -### Bug Fixes - -* adjust bottom spacer of chat messages (COR-3977) ([#338](https://github.com/voiceflow/react-chat/issues/338)) ([356f0e7](https://github.com/voiceflow/react-chat/commit/356f0e76cfb4d183d9085a97a0625b9a3f3bf83e)) - -## [2.2.3](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.2.2...@voiceflow/react-chat@2.2.3) (2024-11-19) - -### Bug Fixes - -* Audio Input appearing and submission (DSN-2553) ([#332](https://github.com/voiceflow/react-chat/issues/332)) ([af233c8](https://github.com/voiceflow/react-chat/commit/af233c8274bdb773a9549d3030c0bbdc17916a20)) -* Message animation speed + checkmark colour (DSN-2555) ([#325](https://github.com/voiceflow/react-chat/issues/325)) ([eba9f80](https://github.com/voiceflow/react-chat/commit/eba9f809ac1afad2de9f013fc4899cc65d505ce5)) -* minor UI issues ([#326](https://github.com/voiceflow/react-chat/issues/326)) ([5be3f51](https://github.com/voiceflow/react-chat/commit/5be3f51e85fb16e4107690509a4dc90e3f993860)) - -## [2.2.2](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.2.1...@voiceflow/react-chat@2.2.2) (2024-11-19) - -### Bug Fixes - -* carousel background against avatar (DSN-2538) ([#328](https://github.com/voiceflow/react-chat/issues/328)) ([9e601bc](https://github.com/voiceflow/react-chat/commit/9e601bc1647eea2ed39376b9f77a418ca53b757a)) - -## [2.2.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.2.0...@voiceflow/react-chat@2.2.1) (2024-11-19) - -### Bug Fixes - -* wrap typing indicator with MessageContainer (COR-3952) ([#327](https://github.com/voiceflow/react-chat/issues/327)) ([d371598](https://github.com/voiceflow/react-chat/commit/d3715981abdc94dcefd203f2ce2862a51e350590)) - -# [2.2.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.1.1...@voiceflow/react-chat@2.2.0) (2024-11-19) - -### Features - -* expose user response component (DX-000) ([#329](https://github.com/voiceflow/react-chat/issues/329)) ([9ec5685](https://github.com/voiceflow/react-chat/commit/9ec56853ff27efc592b3fef9b7acfe8922b4a203)) - -## [2.1.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@2.1.0...@voiceflow/react-chat@2.1.1) (2024-11-18) - -### Bug Fixes - -* Chat Ended Spacing (DSN-2543) ([#323](https://github.com/voiceflow/react-chat/issues/323)) ([e975fd2](https://github.com/voiceflow/react-chat/commit/e975fd23fc84ff520fff9eb7900c5bad6f516708)) - -# [2.1.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/react-chat@1.65.2...@voiceflow/react-chat@2.1.0) (2024-11-18) - -### Bug Fixes - -* add top margin to the loading state (DSN-2511) ([#284](https://github.com/voiceflow/react-chat/issues/284)) ([da6c2ce](https://github.com/voiceflow/react-chat/commit/da6c2ce19859a504b1825aaf8799a3e90c90a0bb)) -* add white background to carousel (DSN-2538) ([#308](https://github.com/voiceflow/react-chat/issues/308)) ([be4aa7c](https://github.com/voiceflow/react-chat/commit/be4aa7c30aa25a88abf05f4cae84f57c18ef737c)) -* Agent Message and Chat Docs (DSN-000) ([#277](https://github.com/voiceflow/react-chat/issues/277)) ([4293ddf](https://github.com/voiceflow/react-chat/commit/4293ddfc0878beeeadbaf1fdb0283eafa487fe42)) -* button reveal animation (DSN-2529) ([#315](https://github.com/voiceflow/react-chat/issues/315)) ([035d9c8](https://github.com/voiceflow/react-chat/commit/035d9c8face3f4ec716b8504c1d5c27dcccdb3f8)) -* button wrapping behaviour (DSN-2510) ([#280](https://github.com/voiceflow/react-chat/issues/280)) ([9a74dc7](https://github.com/voiceflow/react-chat/commit/9a74dc79eebf3bdd2521b5922807eda9202c8bc5)) -* conditionally executed hook (DSN-000) ([#298](https://github.com/voiceflow/react-chat/issues/298)) ([fc60962](https://github.com/voiceflow/react-chat/commit/fc609626ed167c937323040291c2d5cbc0a7c664)) -* default message for AI generated message (DSN-2504) ([#282](https://github.com/voiceflow/react-chat/issues/282)) ([fea80ca](https://github.com/voiceflow/react-chat/commit/fea80caefd6635e63153ba6389997612fca8992f)) -* Feedback fixes (DSN-2527) ([#306](https://github.com/voiceflow/react-chat/issues/306)) ([8626fa1](https://github.com/voiceflow/react-chat/commit/8626fa1316954486d7a24fa04bae9c3535873367)) -* fix inline buttons class and minor styling (COR-0000) ([#255](https://github.com/voiceflow/react-chat/issues/255)) ([38b1c1a](https://github.com/voiceflow/react-chat/commit/38b1c1a63af90bec1163491a5beeadd95ace4e9b)) -* font weight of headers should be 600 (DSN-2507) ([#283](https://github.com/voiceflow/react-chat/issues/283)) ([366b859](https://github.com/voiceflow/react-chat/commit/366b8598f52cd881054bf2d0f17300f13e24012c)) -* header actions (COR-3811) ([#278](https://github.com/voiceflow/react-chat/issues/278)) ([95cc945](https://github.com/voiceflow/react-chat/commit/95cc945f1f79c81da3932bbb0c1f8f2ad094b008)) -* lots of ui fixes ([#305](https://github.com/voiceflow/react-chat/issues/305)) ([ca192d2](https://github.com/voiceflow/react-chat/commit/ca192d2bb2c337641ac1a9d8ea7c3e405b662f0e)) -* message container and feedback button fixes (COR-0000) ([#317](https://github.com/voiceflow/react-chat/issues/317)) ([bac51a5](https://github.com/voiceflow/react-chat/commit/bac51a550357092a5d2e40a1cda37b09d0fc2394)) -* Mic button active state + dynamic border radius (DSN-2518) ([#302](https://github.com/voiceflow/react-chat/issues/302)) ([f902868](https://github.com/voiceflow/react-chat/commit/f9028689b6bb83b6658b1f9c489ff06c97a6fd64)) -* minor inline-buttons adjustment (COR-0000) ([#258](https://github.com/voiceflow/react-chat/issues/258)) ([ac3e92d](https://github.com/voiceflow/react-chat/commit/ac3e92d492743f91d582ac5bee95415f68608dfc)) -* place Scroll to bottom button in footer component (COR-3827) ([#288](https://github.com/voiceflow/react-chat/issues/288)) ([f583dac](https://github.com/voiceflow/react-chat/commit/f583dac07cecfcfb9b0200f1958967807dfe4d6b)) -* Random fixes (DSN-000) ([#309](https://github.com/voiceflow/react-chat/issues/309)) ([e8cdd6e](https://github.com/voiceflow/react-chat/commit/e8cdd6eeaba2075f28d8bd2443b85b3c98d0963e)) -* scroll to bottom button (COR-3903) ([#310](https://github.com/voiceflow/react-chat/issues/310)) ([67c14e4](https://github.com/voiceflow/react-chat/commit/67c14e46bcbc8c4c2783702139370b08ebe95396)) -* themed link on footer (DSN-2536) ([#307](https://github.com/voiceflow/react-chat/issues/307)) ([4aaa0b8](https://github.com/voiceflow/react-chat/commit/4aaa0b83c2ccb17356c01fab1d3a0752c01dd55c)) -* ui glitch (COR-0000) ([#311](https://github.com/voiceflow/react-chat/issues/311)) ([6d69cb9](https://github.com/voiceflow/react-chat/commit/6d69cb91ca925e624ee1b6aa555012ca72046d9d)) -* User Message Gap + Bottom Padding (DSN-2502) ([#289](https://github.com/voiceflow/react-chat/issues/289)) ([48d9906](https://github.com/voiceflow/react-chat/commit/48d990699e5a420ae163d95397107ce39f5229be)) -* user message text colour should be themed (DSN-2512) ([#279](https://github.com/voiceflow/react-chat/issues/279)) ([fbfbb41](https://github.com/voiceflow/react-chat/commit/fbfbb4125a113e6eb455150ab88b2d0dc13aea06)) -* widget width (DSN-2509) ([#281](https://github.com/voiceflow/react-chat/issues/281)) ([431b81c](https://github.com/voiceflow/react-chat/commit/431b81c654db39bc15d95942b1da5f0645f4d390)) - -### Features - -* a few more examples to look at (COR-0000) ([#270](https://github.com/voiceflow/react-chat/issues/270)) ([ee4c6d9](https://github.com/voiceflow/react-chat/commit/ee4c6d9d361fddb7dd0c0b74906c5ea5eda747b1)) -* add 'Start new chat' button (COR-0000) ([#257](https://github.com/voiceflow/react-chat/issues/257)) ([d5e8c0e](https://github.com/voiceflow/react-chat/commit/d5e8c0e0b02c76592250528ba2c9f9c81c986cef)) -* add CarouselButton component (COR-3656) ([#228](https://github.com/voiceflow/react-chat/issues/228)) ([7d3a65e](https://github.com/voiceflow/react-chat/commit/7d3a65ea41a0ca5318ea6eccec5b3afe3abd8785)) -* add TypingIndicator to the docs (COR-0000) ([#276](https://github.com/voiceflow/react-chat/issues/276)) ([205e910](https://github.com/voiceflow/react-chat/commit/205e910f3b5672a7598ffb2e0682e2178d059b16)) -* adjust chat to work in embedded mode as well (COR-3851) ([#293](https://github.com/voiceflow/react-chat/issues/293)) ([cdcaaf9](https://github.com/voiceflow/react-chat/commit/cdcaaf97b98851068af74672f3d38ab98f0c72c2)) -* Animate in widget components (DSN-2530) ([#312](https://github.com/voiceflow/react-chat/issues/312)) ([d06153e](https://github.com/voiceflow/react-chat/commit/d06153eeb2588596a5479baa5743c09e87c761fb)) -* Chat for review on documentation (DSN-000) ([#265](https://github.com/voiceflow/react-chat/issues/265)) ([bbc3d4f](https://github.com/voiceflow/react-chat/commit/bbc3d4f225f0d9edc18f4214f01d49f52be713ab)) -* convert ChatWidget to vanilla-extract (COR-0000) ([#254](https://github.com/voiceflow/react-chat/issues/254)) ([277a914](https://github.com/voiceflow/react-chat/commit/277a914f92f90fbafa82d6b903b85eb02ac2d88f)) -* convert Image component to vanilla-extract (COR-0000) ([#245](https://github.com/voiceflow/react-chat/issues/245)) ([e8836c6](https://github.com/voiceflow/react-chat/commit/e8836c6f76b50eb117345abac6a2f95e0e83b661)) -* convert Proactive component (COR-3710) ([#249](https://github.com/voiceflow/react-chat/issues/249)) ([5616d10](https://github.com/voiceflow/react-chat/commit/5616d100885778604600f0a63b3b9356736055c9)) -* convert Prompt component (COR-0000) ([#246](https://github.com/voiceflow/react-chat/issues/246)) ([5d70e21](https://github.com/voiceflow/react-chat/commit/5d70e21b3d04e65090dc43caa91b845a48e4a448)) -* cross browser stuff (COR-3860) ([#301](https://github.com/voiceflow/react-chat/issues/301)) ([10587c3](https://github.com/voiceflow/react-chat/commit/10587c31a6c5e97687f0b0d0282bdf7c369bd785)) -* extract ScrollToBottom component (COR-0000) ([#251](https://github.com/voiceflow/react-chat/issues/251)) ([06dacbc](https://github.com/voiceflow/react-chat/commit/06dacbcac246d066d14304f2a9641b3f2b45cfad)) -* Feedback + Copy Button (DSN-2499) ([#290](https://github.com/voiceflow/react-chat/issues/290)) ([a0c4649](https://github.com/voiceflow/react-chat/commit/a0c4649eb0e8b53ef3321cb5f10b31ef593d31c3)) -* goodbye stitches, we'll always have react-chat (COR-0000) ([#264](https://github.com/voiceflow/react-chat/issues/264)) ([f866cb3](https://github.com/voiceflow/react-chat/commit/f866cb3a2da470d8a025458237664a5e9b528bf8)) -* Misc 💅 polish + fixes (DSN-000) ([#269](https://github.com/voiceflow/react-chat/issues/269)) ([0622974](https://github.com/voiceflow/react-chat/commit/0622974b43294fc477fd2899e5b2a861a406bc5b)) -* powered by Voiceflow is a link now (DSN-2505) ([#285](https://github.com/voiceflow/react-chat/issues/285)) ([7d4ea15](https://github.com/voiceflow/react-chat/commit/7d4ea15eefc9c5ce5c4c11c3aea8f3985df72ebc)) -* release next react-chat library (DSN-2545) ([#316](https://github.com/voiceflow/react-chat/issues/316)) ([65722df](https://github.com/voiceflow/react-chat/commit/65722dfb438bc918bfb4fbb33aa0fc7c730eac38)) -* Removing a lot of react-stitches usages (DSN-000) ([#263](https://github.com/voiceflow/react-chat/issues/263)) ([265124e](https://github.com/voiceflow/react-chat/commit/265124eef53e59fd79ea7001400c3c75191dedaf)) -* ui review for carousel component (COR-0000) ([#275](https://github.com/voiceflow/react-chat/issues/275)) ([b310606](https://github.com/voiceflow/react-chat/commit/b3106063f4ede9ff57f3fe2398ad4ae5b89edc7e)) -* ui review for footer (COR-3751) ([#273](https://github.com/voiceflow/react-chat/issues/273)) ([235debb](https://github.com/voiceflow/react-chat/commit/235debb51219f196867b146adf1395603fa7128b)) -* Widget Composition (DSN-000) ([#231](https://github.com/voiceflow/react-chat/issues/231)) ([2966da3](https://github.com/voiceflow/react-chat/commit/2966da31b6105e221729bc84f11e10a39ddc648c)) -* working on UserResponse component (COR-0000) ([#253](https://github.com/voiceflow/react-chat/issues/253)) ([5026d2f](https://github.com/voiceflow/react-chat/commit/5026d2f7aff2325f4af59093f34df89662c475c8)) - -## [0.42.3](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.42.2...@voiceflow/chat@0.42.3) (2024-11-15) - -### Bug Fixes - -* button reveal animation (DSN-2529) ([#315](https://github.com/voiceflow/react-chat/issues/315)) ([035d9c8](https://github.com/voiceflow/react-chat/commit/035d9c8face3f4ec716b8504c1d5c27dcccdb3f8)) - -## [0.42.2](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.42.1...@voiceflow/chat@0.42.2) (2024-11-15) - -### Bug Fixes - -* message container and feedback button fixes (COR-0000) ([#317](https://github.com/voiceflow/react-chat/issues/317)) ([bac51a5](https://github.com/voiceflow/react-chat/commit/bac51a550357092a5d2e40a1cda37b09d0fc2394)) - -## [0.42.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.42.0...@voiceflow/chat@0.42.1) (2024-11-14) - -### Bug Fixes - -* Random fixes (DSN-000) ([#309](https://github.com/voiceflow/react-chat/issues/309)) ([e8cdd6e](https://github.com/voiceflow/react-chat/commit/e8cdd6eeaba2075f28d8bd2443b85b3c98d0963e)) - -# [0.42.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.41.4...@voiceflow/chat@0.42.0) (2024-11-14) - -### Bug Fixes - -* scroll to bottom button (COR-3903) ([#310](https://github.com/voiceflow/react-chat/issues/310)) ([67c14e4](https://github.com/voiceflow/react-chat/commit/67c14e46bcbc8c4c2783702139370b08ebe95396)) - -### Features - -* Animate in widget components (DSN-2530) ([#312](https://github.com/voiceflow/react-chat/issues/312)) ([d06153e](https://github.com/voiceflow/react-chat/commit/d06153eeb2588596a5479baa5743c09e87c761fb)) - -## [0.41.4](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.41.3...@voiceflow/chat@0.41.4) (2024-11-14) - -### Bug Fixes - -* ui glitch (COR-0000) ([#311](https://github.com/voiceflow/react-chat/issues/311)) ([6d69cb9](https://github.com/voiceflow/react-chat/commit/6d69cb91ca925e624ee1b6aa555012ca72046d9d)) - -## [0.41.3](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.41.2...@voiceflow/chat@0.41.3) (2024-11-13) - -### Bug Fixes - -* add white background to carousel (DSN-2538) ([#308](https://github.com/voiceflow/react-chat/issues/308)) ([be4aa7c](https://github.com/voiceflow/react-chat/commit/be4aa7c30aa25a88abf05f4cae84f57c18ef737c)) -* Feedback fixes (DSN-2527) ([#306](https://github.com/voiceflow/react-chat/issues/306)) ([8626fa1](https://github.com/voiceflow/react-chat/commit/8626fa1316954486d7a24fa04bae9c3535873367)) -* themed link on footer (DSN-2536) ([#307](https://github.com/voiceflow/react-chat/issues/307)) ([4aaa0b8](https://github.com/voiceflow/react-chat/commit/4aaa0b83c2ccb17356c01fab1d3a0752c01dd55c)) - -## [0.41.2](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.41.1...@voiceflow/chat@0.41.2) (2024-11-13) - -### Bug Fixes - -* lots of ui fixes ([#305](https://github.com/voiceflow/react-chat/issues/305)) ([ca192d2](https://github.com/voiceflow/react-chat/commit/ca192d2bb2c337641ac1a9d8ea7c3e405b662f0e)) - -## [0.41.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.41.0...@voiceflow/chat@0.41.1) (2024-11-12) - -### Bug Fixes - -* Mic button active state + dynamic border radius (DSN-2518) ([#302](https://github.com/voiceflow/react-chat/issues/302)) ([f902868](https://github.com/voiceflow/react-chat/commit/f9028689b6bb83b6658b1f9c489ff06c97a6fd64)) - -# [0.41.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.40.2...@voiceflow/chat@0.41.0) (2024-11-12) - -### Features - -* cross browser stuff (COR-3860) ([#301](https://github.com/voiceflow/react-chat/issues/301)) ([10587c3](https://github.com/voiceflow/react-chat/commit/10587c31a6c5e97687f0b0d0282bdf7c369bd785)) - -## [0.40.2](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.40.1...@voiceflow/chat@0.40.2) (2024-11-12) - -### Bug Fixes - -* User Message Gap + Bottom Padding (DSN-2502) ([#289](https://github.com/voiceflow/react-chat/issues/289)) ([48d9906](https://github.com/voiceflow/react-chat/commit/48d990699e5a420ae163d95397107ce39f5229be)) - -## [0.40.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.40.0...@voiceflow/chat@0.40.1) (2024-11-12) - -### Bug Fixes - -* conditionally executed hook (DSN-000) ([#298](https://github.com/voiceflow/react-chat/issues/298)) ([fc60962](https://github.com/voiceflow/react-chat/commit/fc609626ed167c937323040291c2d5cbc0a7c664)) - -# [0.40.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.39.0...@voiceflow/chat@0.40.0) (2024-11-11) - -### Features - -* Feedback + Copy Button (DSN-2499) ([#290](https://github.com/voiceflow/react-chat/issues/290)) ([a0c4649](https://github.com/voiceflow/react-chat/commit/a0c4649eb0e8b53ef3321cb5f10b31ef593d31c3)) - -# [0.39.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.38.1...@voiceflow/chat@0.39.0) (2024-11-11) - -### Features - -* adjust chat to work in embedded mode as well (COR-3851) ([#293](https://github.com/voiceflow/react-chat/issues/293)) ([cdcaaf9](https://github.com/voiceflow/react-chat/commit/cdcaaf97b98851068af74672f3d38ab98f0c72c2)) - -## [0.38.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.38.0...@voiceflow/chat@0.38.1) (2024-11-08) - -### Bug Fixes - -* button wrapping behaviour (DSN-2510) ([#280](https://github.com/voiceflow/react-chat/issues/280)) ([9a74dc7](https://github.com/voiceflow/react-chat/commit/9a74dc79eebf3bdd2521b5922807eda9202c8bc5)) -* place Scroll to bottom button in footer component (COR-3827) ([#288](https://github.com/voiceflow/react-chat/issues/288)) ([f583dac](https://github.com/voiceflow/react-chat/commit/f583dac07cecfcfb9b0200f1958967807dfe4d6b)) - -# [0.38.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.37.4...@voiceflow/chat@0.38.0) (2024-11-08) - -### Features - -* add TypingIndicator to the docs (COR-0000) ([#276](https://github.com/voiceflow/react-chat/issues/276)) ([205e910](https://github.com/voiceflow/react-chat/commit/205e910f3b5672a7598ffb2e0682e2178d059b16)) -* powered by Voiceflow is a link now (DSN-2505) ([#285](https://github.com/voiceflow/react-chat/issues/285)) ([7d4ea15](https://github.com/voiceflow/react-chat/commit/7d4ea15eefc9c5ce5c4c11c3aea8f3985df72ebc)) -* ui review for footer (COR-3751) ([#273](https://github.com/voiceflow/react-chat/issues/273)) ([235debb](https://github.com/voiceflow/react-chat/commit/235debb51219f196867b146adf1395603fa7128b)) - -## [0.37.4](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.37.3...@voiceflow/chat@0.37.4) (2024-11-08) - -### Bug Fixes - -* user message text colour should be themed (DSN-2512) ([#279](https://github.com/voiceflow/react-chat/issues/279)) ([fbfbb41](https://github.com/voiceflow/react-chat/commit/fbfbb4125a113e6eb455150ab88b2d0dc13aea06)) - -## [0.37.3](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.37.2...@voiceflow/chat@0.37.3) (2024-11-07) - -### Bug Fixes - -* add top margin to the loading state (DSN-2511) ([#284](https://github.com/voiceflow/react-chat/issues/284)) ([da6c2ce](https://github.com/voiceflow/react-chat/commit/da6c2ce19859a504b1825aaf8799a3e90c90a0bb)) -* default message for AI generated message (DSN-2504) ([#282](https://github.com/voiceflow/react-chat/issues/282)) ([fea80ca](https://github.com/voiceflow/react-chat/commit/fea80caefd6635e63153ba6389997612fca8992f)) -* font weight of headers should be 600 (DSN-2507) ([#283](https://github.com/voiceflow/react-chat/issues/283)) ([366b859](https://github.com/voiceflow/react-chat/commit/366b8598f52cd881054bf2d0f17300f13e24012c)) -* widget width (DSN-2509) ([#281](https://github.com/voiceflow/react-chat/issues/281)) ([431b81c](https://github.com/voiceflow/react-chat/commit/431b81c654db39bc15d95942b1da5f0645f4d390)) - -## [0.37.2](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.37.1...@voiceflow/chat@0.37.2) (2024-11-07) - -### Bug Fixes - -* header actions (COR-3811) ([#278](https://github.com/voiceflow/react-chat/issues/278)) ([95cc945](https://github.com/voiceflow/react-chat/commit/95cc945f1f79c81da3932bbb0c1f8f2ad094b008)) - -## [0.37.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.37.0...@voiceflow/chat@0.37.1) (2024-11-06) - -### Bug Fixes - -* Agent Message and Chat Docs (DSN-000) ([#277](https://github.com/voiceflow/react-chat/issues/277)) ([4293ddf](https://github.com/voiceflow/react-chat/commit/4293ddfc0878beeeadbaf1fdb0283eafa487fe42)) - -# [0.37.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.36.0...@voiceflow/chat@0.37.0) (2024-11-04) - -### Features - -* ui review for carousel component (COR-0000) ([#275](https://github.com/voiceflow/react-chat/issues/275)) ([b310606](https://github.com/voiceflow/react-chat/commit/b3106063f4ede9ff57f3fe2398ad4ae5b89edc7e)) - -# [0.36.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.35.0...@voiceflow/chat@0.36.0) (2024-11-01) - -### Features - -* a few more examples to look at (COR-0000) ([#270](https://github.com/voiceflow/react-chat/issues/270)) ([ee4c6d9](https://github.com/voiceflow/react-chat/commit/ee4c6d9d361fddb7dd0c0b74906c5ea5eda747b1)) - -# [0.35.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.34.1...@voiceflow/chat@0.35.0) (2024-10-31) - -### Features - -* Misc 💅 polish + fixes (DSN-000) ([#269](https://github.com/voiceflow/react-chat/issues/269)) ([0622974](https://github.com/voiceflow/react-chat/commit/0622974b43294fc477fd2899e5b2a861a406bc5b)) - -## [0.34.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.34.0...@voiceflow/chat@0.34.1) (2024-10-31) - -**Note:** Version bump only for package @voiceflow/chat - -# [0.34.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.33.1...@voiceflow/chat@0.34.0) (2024-10-31) - -### Features - -* Chat for review on documentation (DSN-000) ([#265](https://github.com/voiceflow/react-chat/issues/265)) ([bbc3d4f](https://github.com/voiceflow/react-chat/commit/bbc3d4f225f0d9edc18f4214f01d49f52be713ab)) - -## [0.33.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.33.0...@voiceflow/chat@0.33.1) (2024-10-31) - -**Note:** Version bump only for package @voiceflow/chat - -# [0.33.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.32.0...@voiceflow/chat@0.33.0) (2024-10-31) - -### Features - -* goodbye stitches, we'll always have react-chat (COR-0000) ([#264](https://github.com/voiceflow/react-chat/issues/264)) ([f866cb3](https://github.com/voiceflow/react-chat/commit/f866cb3a2da470d8a025458237664a5e9b528bf8)) - -# [0.32.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.31.1...@voiceflow/chat@0.32.0) (2024-10-30) - -### Features - -* Removing a lot of react-stitches usages (DSN-000) ([#263](https://github.com/voiceflow/react-chat/issues/263)) ([265124e](https://github.com/voiceflow/react-chat/commit/265124eef53e59fd79ea7001400c3c75191dedaf)) - -## [0.31.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.31.0...@voiceflow/chat@0.31.1) (2024-10-30) - -### Bug Fixes - -* minor inline-buttons adjustment (COR-0000) ([#258](https://github.com/voiceflow/react-chat/issues/258)) ([ac3e92d](https://github.com/voiceflow/react-chat/commit/ac3e92d492743f91d582ac5bee95415f68608dfc)) - -# [0.31.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.30.0...@voiceflow/chat@0.31.0) (2024-10-29) - -### Features - -* add 'Start new chat' button (COR-0000) ([#257](https://github.com/voiceflow/react-chat/issues/257)) ([d5e8c0e](https://github.com/voiceflow/react-chat/commit/d5e8c0e0b02c76592250528ba2c9f9c81c986cef)) - -# [0.30.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.29.0...@voiceflow/chat@0.30.0) (2024-10-28) - -### Bug Fixes - -* fix inline buttons class and minor styling (COR-0000) ([#255](https://github.com/voiceflow/react-chat/issues/255)) ([38b1c1a](https://github.com/voiceflow/react-chat/commit/38b1c1a63af90bec1163491a5beeadd95ace4e9b)) - -### Features - -* convert Proactive component (COR-3710) ([#249](https://github.com/voiceflow/react-chat/issues/249)) ([5616d10](https://github.com/voiceflow/react-chat/commit/5616d100885778604600f0a63b3b9356736055c9)) - -# [0.29.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.28.0...@voiceflow/chat@0.29.0) (2024-10-28) - -### Features - -* convert ChatWidget to vanilla-extract (COR-0000) ([#254](https://github.com/voiceflow/react-chat/issues/254)) ([277a914](https://github.com/voiceflow/react-chat/commit/277a914f92f90fbafa82d6b903b85eb02ac2d88f)) - -# [0.28.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.27.0...@voiceflow/chat@0.28.0) (2024-10-28) - -### Features - -* working on UserResponse component (COR-0000) ([#253](https://github.com/voiceflow/react-chat/issues/253)) ([5026d2f](https://github.com/voiceflow/react-chat/commit/5026d2f7aff2325f4af59093f34df89662c475c8)) - -# [0.27.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.26.1...@voiceflow/chat@0.27.0) (2024-10-28) - -### Features - -* extract ScrollToBottom component (COR-0000) ([#251](https://github.com/voiceflow/react-chat/issues/251)) ([06dacbc](https://github.com/voiceflow/react-chat/commit/06dacbcac246d066d14304f2a9641b3f2b45cfad)) - -## [0.26.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.26.0...@voiceflow/chat@0.26.1) (2024-10-28) - -**Note:** Version bump only for package @voiceflow/chat - -# [0.26.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.25.1...@voiceflow/chat@0.26.0) (2024-10-25) - -### Features - -* convert Image component to vanilla-extract (COR-0000) ([#245](https://github.com/voiceflow/react-chat/issues/245)) ([e8836c6](https://github.com/voiceflow/react-chat/commit/e8836c6f76b50eb117345abac6a2f95e0e83b661)) -* convert Prompt component (COR-0000) ([#246](https://github.com/voiceflow/react-chat/issues/246)) ([5d70e21](https://github.com/voiceflow/react-chat/commit/5d70e21b3d04e65090dc43caa91b845a48e4a448)) - -## [0.25.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.25.0...@voiceflow/chat@0.25.1) (2024-10-25) - -**Note:** Version bump only for package @voiceflow/chat - -# [0.25.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.24.0...@voiceflow/chat@0.25.0) (2024-10-24) - -### Features - -* add CarouselButton component (COR-3656) ([#228](https://github.com/voiceflow/react-chat/issues/228)) ([7d3a65e](https://github.com/voiceflow/react-chat/commit/7d3a65ea41a0ca5318ea6eccec5b3afe3abd8785)) - -# [0.24.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.23.0...@voiceflow/chat@0.24.0) (2024-10-24) - -### Features - -* Widget Composition (DSN-000) ([#231](https://github.com/voiceflow/react-chat/issues/231)) ([2966da3](https://github.com/voiceflow/react-chat/commit/2966da31b6105e221729bc84f11e10a39ddc648c)) - -# [0.23.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.22.0...@voiceflow/chat@0.23.0) (2024-10-22) - -### Features - -* add LinkPreview component (COR-3594) ([#222](https://github.com/voiceflow/react-chat/issues/222)) ([660b02f](https://github.com/voiceflow/react-chat/commit/660b02fea855e9c8a2e1c09c586c3bf8db8a8cc7)) -* add Primary/Secondary buttons to the docs for review (COR-3533) ([#226](https://github.com/voiceflow/react-chat/issues/226)) ([8df4f46](https://github.com/voiceflow/react-chat/commit/8df4f466a3bf418f2b96cddf9e64ebac5e1e4755)) -* aligning theme colors across components (COR-0000) ([#233](https://github.com/voiceflow/react-chat/issues/233)) ([ccf9dbb](https://github.com/voiceflow/react-chat/commit/ccf9dbb646a4dba8583e3c15b97567852750794b)) - -# [0.22.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.21.0...@voiceflow/chat@0.22.0) (2024-10-17) - -### Features - -* touch ups for the launcher button (COR-0000) ([#221](https://github.com/voiceflow/react-chat/issues/221)) ([4175b8f](https://github.com/voiceflow/react-chat/commit/4175b8fd0fc20d86740c34635851ff6271a79fde)) - -# [0.21.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.20.0...@voiceflow/chat@0.21.0) (2024-10-17) - -### Features - -* add Card component (COR-2149) ([#223](https://github.com/voiceflow/react-chat/issues/223)) ([1a4e1b8](https://github.com/voiceflow/react-chat/commit/1a4e1b8bcabe539cc5d71bbaabbb8e92e6e25f14)) - -# [0.20.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.19.0...@voiceflow/chat@0.20.0) (2024-10-16) - -### Features - -* cleaning up (COR-0000) ([#218](https://github.com/voiceflow/react-chat/issues/218)) ([0fc8593](https://github.com/voiceflow/react-chat/commit/0fc8593d299dcffe6f0995b2d022f63b98ca403c)) - -# [0.19.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.18.0...@voiceflow/chat@0.19.0) (2024-10-15) - -### Features - -* UserMessage (DX-2138) ([#213](https://github.com/voiceflow/react-chat/issues/213)) ([97fcc7b](https://github.com/voiceflow/react-chat/commit/97fcc7b1d806cbb430daf29157d5610396935841)) - -# [0.18.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.17.0...@voiceflow/chat@0.18.0) (2024-10-15) - -### Features - -* WelcomeMessage (DX-2153) ([#214](https://github.com/voiceflow/react-chat/issues/214)) ([12d5b9d](https://github.com/voiceflow/react-chat/commit/12d5b9dfd8046bfe0d7f987674af39995a762ae0)) - -# [0.17.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.16.1...@voiceflow/chat@0.17.0) (2024-10-11) - -### Features - -* add Header component (COR-3545) ([#215](https://github.com/voiceflow/react-chat/issues/215)) ([0a893b6](https://github.com/voiceflow/react-chat/commit/0a893b65f7634d7ffca622c77bcc62af4514490c)) - -## [0.16.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.16.0...@voiceflow/chat@0.16.1) (2024-10-11) - -### Bug Fixes - -* lots o UI fixes (COR-0000) ([#216](https://github.com/voiceflow/react-chat/issues/216)) ([a267a7c](https://github.com/voiceflow/react-chat/commit/a267a7c5cfc899e5a79cb47f265f5b6b1eeeb7a0)) - -# [0.16.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.15.0...@voiceflow/chat@0.16.0) (2024-10-11) - -### Features - -* Agent Message (DX-2415) ([#212](https://github.com/voiceflow/react-chat/issues/212)) ([9c599f6](https://github.com/voiceflow/react-chat/commit/9c599f618ade9aea29e866a5a0c9ee602ef78a8f)) - -# [0.15.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.14.0...@voiceflow/chat@0.15.0) (2024-10-07) - -### Features - -* add Launcher button to the mix (COR-3541) ([#211](https://github.com/voiceflow/react-chat/issues/211)) ([4c23a31](https://github.com/voiceflow/react-chat/commit/4c23a3168deb21e8e08dd26713aaca882f7a1184)) - -# [0.14.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.13.0...@voiceflow/chat@0.14.0) (2024-10-07) - -### Features - -* add Primary/Secondary buttons (COR-3533) ([#210](https://github.com/voiceflow/react-chat/issues/210)) ([d8ff4ff](https://github.com/voiceflow/react-chat/commit/d8ff4ff8bb3383e13d9aebec47e8e597efde6b61)) - -# [0.13.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.12.0...@voiceflow/chat@0.13.0) (2024-10-04) - -### Features - -* add SendButton to docs (COR-0000) ([#207](https://github.com/voiceflow/react-chat/issues/207)) ([c952373](https://github.com/voiceflow/react-chat/commit/c952373e37458e0a17867b5f743cbaa434bac67a)) - -# [0.12.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.11.0...@voiceflow/chat@0.12.0) (2024-10-04) - -### Features - -* adjust palette colors (COR-0000) ([#209](https://github.com/voiceflow/react-chat/issues/209)) ([16a443e](https://github.com/voiceflow/react-chat/commit/16a443e1b0cc7fb3308f81fbfd6098b2b0f10ead)) - -# [0.11.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.10.0...@voiceflow/chat@0.11.0) (2024-10-04) - -### Features - -* add InlineButton to docs (COR-0000) ([#206](https://github.com/voiceflow/react-chat/issues/206)) ([a3f0596](https://github.com/voiceflow/react-chat/commit/a3f0596abb474252158ef13f6dfad80bc67b2fae)) - -### Reverts - -* Revert "chore(release): publish --skip-ci" ([9c2e101](https://github.com/voiceflow/react-chat/commit/9c2e101ed74959ea1db75f29fa0276e3ebbd35e8)) - -# [0.9.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.8.0...@voiceflow/chat@0.9.0) (2024-10-03) - -### Features - -* FeedbackButton (DX-2405) ([#200](https://github.com/voiceflow/react-chat/issues/200)) ([46752af](https://github.com/voiceflow/react-chat/commit/46752afca27a0b2b8388b3241cc9d2c130c84688)) - -# [0.8.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.7.1...@voiceflow/chat@0.8.0) (2024-10-02) - -### Features - -* add Avatar component to docs (COR-3369) ([#199](https://github.com/voiceflow/react-chat/issues/199)) ([6dd7c26](https://github.com/voiceflow/react-chat/commit/6dd7c262e3c8014405b2e380bb6c465487c36b20)) - -## [0.7.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.7.0...@voiceflow/chat@0.7.1) (2024-10-01) - -### Bug Fixes - -* export dist css file ([#196](https://github.com/voiceflow/react-chat/issues/196)) ([f3433b9](https://github.com/voiceflow/react-chat/commit/f3433b9db1e31fa531813f67ce52852cc6e032b0)) - -# [0.7.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.6.0...@voiceflow/chat@0.7.0) (2024-10-01) - -### Features - -* add InlineButton component (COR-2143) ([#189](https://github.com/voiceflow/react-chat/issues/189)) ([6f9cf01](https://github.com/voiceflow/react-chat/commit/6f9cf0139a52c9f3c8efdba4232003b4d75c5e75)) -* rewrite Avatar component (COR-3369) ([#188](https://github.com/voiceflow/react-chat/issues/188)) ([b831ee8](https://github.com/voiceflow/react-chat/commit/b831ee84d244e79dafc7a26eebc6db81f91922f6)) - -# [0.6.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.5.1...@voiceflow/chat@0.6.0) (2024-10-01) - -### Features - -* add Storybook configuration for chat package ([#185](https://github.com/voiceflow/react-chat/issues/185)) ([79a809c](https://github.com/voiceflow/react-chat/commit/79a809c5ca7596003701ff3f4bfc9a3536745c88)) - -## [0.5.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.5.0...@voiceflow/chat@0.5.1) (2024-10-01) - -**Note:** Version bump only for package @voiceflow/chat - -# [0.5.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.4.0...@voiceflow/chat@0.5.0) (2024-10-01) - -### Features - -* add vanilla-extract to the new chat package (COR-3282) ([#183](https://github.com/voiceflow/react-chat/issues/183)) ([0816086](https://github.com/voiceflow/react-chat/commit/081608647896bdfdf832e61e580bcfcc25a3b93e)) - -# [0.4.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.3.0...@voiceflow/chat@0.4.0) (2024-10-01) - -### Features - -* UI export to docs (DX-000) ([#193](https://github.com/voiceflow/react-chat/issues/193)) ([83d3ef9](https://github.com/voiceflow/react-chat/commit/83d3ef93390ff8d98681c9dec129133f21a8e6bd)) - -# [0.3.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.2.0...@voiceflow/chat@0.3.0) (2024-09-27) - -### Features - -* add setOpen to the api (COR-000) ([#190](https://github.com/voiceflow/react-chat/issues/190)) ([a509a96](https://github.com/voiceflow/react-chat/commit/a509a96a132d9f0f2644293eb0d6cb9ebb40d6c1)) - -# [0.2.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.1.1...@voiceflow/chat@0.2.0) (2024-09-25) - -### Features - -* add live-chat for the new chat package (COR-0000) ([#177](https://github.com/voiceflow/react-chat/issues/177)) ([ed3c0a9](https://github.com/voiceflow/react-chat/commit/ed3c0a9ab4a9b65b6473299f0dbaa3c2e4e1f41e)) - -## [0.1.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/chat@0.1.0...@voiceflow/chat@0.1.1) (2024-09-24) - -### Bug Fixes - -* fix lock file (COR-000) ([#180](https://github.com/voiceflow/react-chat/issues/180)) ([80cadc1](https://github.com/voiceflow/react-chat/commit/80cadc151df41a8dfdbb2d926e4135c9c1fdc75d)) - -# 0.1.0 (2024-09-20) - -### Features - -* new voiceflow chat - initial commit ([#176](https://github.com/voiceflow/react-chat/issues/176)) ([9198d6b](https://github.com/voiceflow/react-chat/commit/9198d6be30a54ad7efc5513ef83b91b1a169550c)) diff --git a/packages/chat/README.md b/packages/chat/README.md deleted file mode 100644 index ecdd3b7485..0000000000 --- a/packages/chat/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# chat - -## 🚧 WIP - Under Construction 🚧 - -This is going to be a totally redesigned and renewed version of the `react-chat` package. -It is definitely not ready to be used for any use-case. -Do not use this. - -More details will come... diff --git a/packages/chat/__mocks__/@voiceflow/stitches-react.ts b/packages/chat/__mocks__/@voiceflow/stitches-react.ts deleted file mode 100644 index 60f9d10ef4..0000000000 --- a/packages/chat/__mocks__/@voiceflow/stitches-react.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { vi } from 'vitest'; - -export const createStitches = vi.fn().mockReturnValue({ - styled: vi.fn().mockImplementation((el) => el), - keyframes: vi.fn(), -}); - -export const keyframes = vi.fn(); diff --git a/packages/chat/chromatic.config.json b/packages/chat/chromatic.config.json deleted file mode 100644 index e7b7ba637b..0000000000 --- a/packages/chat/chromatic.config.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "outputDir": "./storybook-static" -} diff --git a/packages/chat/config/test/setup.ts b/packages/chat/config/test/setup.ts deleted file mode 100644 index bb02c60cd0..0000000000 --- a/packages/chat/config/test/setup.ts +++ /dev/null @@ -1 +0,0 @@ -import '@testing-library/jest-dom/vitest'; diff --git a/packages/chat/e2e/embedded.html b/packages/chat/e2e/embedded.html deleted file mode 100644 index b744c60881..0000000000 --- a/packages/chat/e2e/embedded.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - Embedded Mode - - - - -
- - - - diff --git a/packages/chat/e2e/embedded.spec.ts b/packages/chat/e2e/embedded.spec.ts deleted file mode 100644 index 6a0b38b066..0000000000 --- a/packages/chat/e2e/embedded.spec.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { expect, test } from '@playwright/test'; - -test('renders embedded webchat and starts automatically', async ({ page }) => { - await page.goto('embedded'); - - const chat = page.locator('.vfrc-chat'); - await chat.waitFor({ state: 'visible' }); - expect(chat).toBeInViewport(); - page.locator('.vfrc-footer .vfrc-button').click(); - - await page.locator('.vfrc-chat-input').waitFor({ state: 'visible' }); -}); diff --git a/packages/chat/e2e/extensions.html b/packages/chat/e2e/extensions.html deleted file mode 100644 index 1e5710ec1c..0000000000 --- a/packages/chat/e2e/extensions.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - Embedded Mode - - - - - -
- - - - - diff --git a/packages/chat/e2e/extensions.spec.ts b/packages/chat/e2e/extensions.spec.ts deleted file mode 100644 index ee3a9a6347..0000000000 --- a/packages/chat/e2e/extensions.spec.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { expect, test } from '@playwright/test'; - -import { slateMessage } from './utils'; - -const RUNTIME_URL = 'https://general-runtime.voiceflow.com/public/projectID/state/user/*/interact'; - -test('trigger effect extension on incoming trace', async ({ page }) => { - const systemMessages = [ - 'Welcome to the pizza palace!', - 'What kind of pizza do you want?', - 'One cheese pizza coming right up', - ]; - const userMessages = ['I want to order a pizza', 'Cheese please']; - const traceType = 'update_order_status'; - let count = 0; - - // eslint-disable-next-line consistent-return - await page.route(RUNTIME_URL, async (route) => { - count++; - - switch (count) { - case 1: - return route.fulfill({ - json: { - trace: [{ type: traceType, payload: 'idle' }, slateMessage(systemMessages[0])], - }, - }); - - case 2: - return route.fulfill({ - json: { - trace: [{ type: traceType, payload: 'in progress' }, slateMessage(systemMessages[1])], - }, - }); - - case 3: - return route.fulfill({ - json: { - trace: [{ type: traceType, payload: 'ordered' }, slateMessage(systemMessages[2])], - }, - }); - - default: - } - }); - - await page.goto('extensions'); - - const chat = page.locator('.vfrc-chat'); - await chat.waitFor({ state: 'visible' }); - expect(chat).toBeInViewport(); - - await page.locator('[data-testid="status"]', { hasText: 'idle' }).waitFor({ state: 'visible' }); - await page.locator('.vfrc-message', { hasText: systemMessages[0] }).waitFor({ state: 'visible' }); - - const input = page.locator('.vfrc-chat-input textarea'); - await input.waitFor({ state: 'visible' }); - await input.fill(userMessages[0]); - - const submit = page.locator('.vfrc-chat-input .vfrc-bubble'); - await submit.click(); - - await page.locator('.vfrc-message', { hasText: userMessages[0] }).waitFor({ state: 'visible' }); - await page.locator('.vfrc-message', { hasText: systemMessages[1] }).waitFor({ state: 'visible' }); - await page.locator('[data-testid="status"]', { hasText: 'in progress' }).waitFor({ state: 'visible' }); - - await input.fill(userMessages[1]); - await submit.click(); - - await page.locator('.vfrc-message', { hasText: userMessages[1] }).waitFor({ state: 'visible' }); - await page.locator('.vfrc-message', { hasText: systemMessages[2] }).waitFor({ state: 'visible' }); - await page.locator('[data-testid="status"]', { hasText: 'ordered' }).waitFor({ state: 'visible' }); -}); - -test('render response extension from incoming trace', async ({ page }) => { - let count = 0; - - await page.route(RUNTIME_URL, (route) => { - count++; - - switch (count) { - case 1: - return route.fulfill({ - json: { - trace: [slateMessage("Welcome to Sal's Salon! Tell me about yourself."), { type: 'onboarding' }], - }, - }); - case 2: - default: - expect(route.request().postDataJSON()).toEqual({ - action: { - type: 'submit', - payload: { name: 'Alex', hair: 'curly' }, - }, - }); - - return route.fulfill({ json: { trace: [] } }); - } - }); - - await page.goto('extensions'); - - const chat = page.locator('.vfrc-chat'); - await chat.waitFor({ state: 'visible' }); - expect(chat).toBeInViewport(); - - await page.locator('.vfrc-message').waitFor({ state: 'visible' }); - - const extensionMessage = page.locator('.vfrc-message--extension-onboarding_form'); - await extensionMessage.waitFor({ state: 'visible' }); - - await extensionMessage.locator('[name="name"]').fill('Alex'); - await extensionMessage.locator('[name="hair"][id="curly"]').click(); - await extensionMessage.getByRole('button').click(); - await page - .locator('.vfrc-message--extension-onboarding_form', { hasText: 'submitted ✅' }) - .waitFor({ state: 'visible' }); -}); diff --git a/packages/chat/e2e/overlay.html b/packages/chat/e2e/overlay.html deleted file mode 100644 index e8bbeb3c94..0000000000 --- a/packages/chat/e2e/overlay.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - Overlay mode - - - - - - - diff --git a/packages/chat/e2e/overlay.spec.ts b/packages/chat/e2e/overlay.spec.ts deleted file mode 100644 index da293c0903..0000000000 --- a/packages/chat/e2e/overlay.spec.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { expect, test } from '@playwright/test'; - -test('renders launcher and widget appears on click', async ({ page }) => { - await page.goto('overlay'); - - const launcher = page.locator('.vfrc-launcher'); - await launcher.waitFor({ state: 'visible' }); - await launcher.click(); - const chat = page.locator('.vfrc-chat'); - - await chat.waitFor({ state: 'visible' }); - await page.locator('.vfrc-chat-input').waitFor({ state: 'visible' }); -}); - -test('control widget visibility and open state', async ({ page }) => { - await page.goto('overlay'); - - const launcher = page.locator('.vfrc-launcher'); - const chat = page.locator('.vfrc-chat'); - - await launcher.waitFor({ state: 'visible' }); - - await page.evaluate(() => window.voiceflow?.chat?.open()); - - await chat.waitFor({ state: 'visible' }); - - await page.evaluate(() => window.voiceflow?.chat?.close()); - - expect(chat).not.toBeInViewport(); - - await page.evaluate(() => window.voiceflow?.chat?.hide()); - - await launcher.waitFor({ state: 'hidden' }); - - await page.evaluate(() => window.voiceflow?.chat?.show()); - - await launcher.waitFor({ state: 'visible' }); -}); diff --git a/packages/chat/e2e/proactive.html b/packages/chat/e2e/proactive.html deleted file mode 100644 index 60cd68a723..0000000000 --- a/packages/chat/e2e/proactive.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - Overlay mode - proactive messages - - - - - - - diff --git a/packages/chat/e2e/proactive.spec.ts b/packages/chat/e2e/proactive.spec.ts deleted file mode 100644 index bd94491263..0000000000 --- a/packages/chat/e2e/proactive.spec.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { test } from '@playwright/test'; -import type { Trace } from '@voiceflow/base-types'; - -test('renders launcher and widget appears on click', async ({ page }) => { - const message = 'Welcome to our chat'; - - await page.goto('proactive'); - - await page.locator('.vfrc-launcher').waitFor({ state: 'visible' }); - - await page.evaluate( - ([message]) => - window.voiceflow?.chat?.proactive.push({ - type: 'text' as Trace.TraceType.TEXT, - payload: { slate: { id: '', content: [] }, message }, - }), - [message] - ); - - await page.waitForSelector(`text=${message}`); -}); diff --git a/packages/chat/e2e/utils.ts b/packages/chat/e2e/utils.ts deleted file mode 100644 index 2308dc7bff..0000000000 --- a/packages/chat/e2e/utils.ts +++ /dev/null @@ -1,12 +0,0 @@ -export const slateMessage = (text: string) => ({ - type: 'text', - payload: { - slate: { - id: text, - content: [{ children: [{ text }] }], - messageDelayMilliseconds: 100, - }, - message: text, - delay: 100, - }, -}); diff --git a/packages/chat/examples/index.html b/packages/chat/examples/index.html deleted file mode 100644 index 7df86a8c9f..0000000000 --- a/packages/chat/examples/index.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - Example Page - - - - -
-
- - - - - diff --git a/packages/chat/package.json b/packages/chat/package.json deleted file mode 100644 index f9e1f0e0e2..0000000000 --- a/packages/chat/package.json +++ /dev/null @@ -1,158 +0,0 @@ -{ - "name": "@voiceflow/react-chat", - "version": "2.31.0", - "description": "voiceflow chat ui", - "keywords": [ - "chat", - "chat widget", - "ai chat bot", - "voiceflow" - ], - "homepage": "https://github.com/voiceflow/react-chat#readme", - "bugs": { - "url": "https://github.com/voiceflow/react-chat/issues" - }, - "license": "MIT", - "author": "Ben Teichman, Tyler Han", - "type": "module", - "exports": { - ".": { - "import": "./build/main.es.js", - "require": "./build/main.cjs.js", - "types": "./build/main.d.ts" - }, - "./ui": { - "import": "./build/ui.es.js", - "require": "./build/ui.cjs.js", - "types": "./build/ui.d.ts" - }, - "./stories": { - "import": "./build/stories.es.js", - "require": "./build/stories.cjs.js", - "types": "./build/stories.d.ts" - }, - "./dist/*.css": { - "import": "./dist/*.css", - "require": "./dist/*.css" - } - }, - "main": "build/main.es.js", - "types": "build/main.d.ts", - "typesVersions": { - "*": { - "ui": [ - "./build/ui.d.ts" - ], - "stories": [ - "./build/stories.d.ts" - ] - } - }, - "files": [ - "build", - "dist" - ], - "scripts": { - "build": "yarn g:turbo run build:cmd --filter=@voiceflow/react-chat...", - "build:cmd": "yarn g:run-p build:package build:widget", - "build:package": "NODE_ENV=production vite --config vite.package.config.ts build && yarn g:tsc-alias -p tsconfig.build.json", - "build:storybook": "storybook build -o docs", - "build:widget": "NODE_ENV=production vite --config vite.widget.config.ts build", - "chromatic:publish": "npx chromatic --project-token $CHROMATIC_PROJECT_TOKEN --build-script-name build:storybook", - "clean": "yarn g:rimraf build dist", - "dev": "storybook dev -p 6006", - "lint": "yarn g:run-p -c lint:eslint lint:prettier", - "lint:eslint": "yarn g:eslint", - "lint:fix": "yarn g:run-p -c \"lint:eslint --fix\" \"lint:prettier --write\"", - "lint:prettier": "yarn g:prettier --check", - "local": "NODE_ENV=development vite", - "start:e2e": "http-server -o e2e", - "tdd": "yarn g:vitest", - "test": "yarn g:run-p -c test:dependencies test:types test:unit", - "test:dependencies": "yarn g:depcruise", - "test:e2e": "yarn playwright test", - "test:types": "yarn g:tsc --noEmit", - "test:unit": "yarn g:vitest run --coverage" - }, - "dependencies": { - "@vanilla-extract/css": "1.16.1", - "@vanilla-extract/recipes": "0.5.5", - "@voiceflow/base-types": "2.113.1", - "@voiceflow/dtos-interact": "1.12.0", - "@voiceflow/sdk-runtime": "workspace:*", - "@voiceflow/slate-serializer": "1.5.5", - "@voiceflow/voiceflow-types": "3.32.1", - "bowser": "2.11.0", - "chroma-js": "2.4.2", - "clsx": "1.2.1", - "cuid": "2.1.8", - "react": "18.2.0", - "react-dom": "18.2.0", - "react-markdown": "9.0.0", - "react-speech-recognition": "3.10.0", - "react-syntax-highlighter": "15.5.0", - "react-textarea-autosize": "8.5.3", - "regenerator-runtime": "0.13.11", - "remark-gfm": "4.0.0", - "slate": "0.94.1", - "ts-pattern": "4.3.0", - "zod": "3.22.4" - }, - "devDependencies": { - "@babel/core": "7.18.10", - "@babel/preset-env": "7.24.1", - "@babel/preset-react": "7.24.1", - "@babel/preset-typescript": "7.24.1", - "@emotion/core": "10.1.1", - "@playwright/test": "1.43.1", - "@storybook/addon-actions": "8.0.2", - "@storybook/addon-essentials": "8.0.2", - "@storybook/addon-interactions": "8.0.2", - "@storybook/addon-links": "8.0.2", - "@storybook/builder-vite": "8.0.2", - "@storybook/eslint-config-storybook": "3.1.2", - "@storybook/react": "8.0.2", - "@storybook/react-vite": "8.0.2", - "@storybook/testing-library": "0.0.13", - "@testing-library/jest-dom": "6.4.2", - "@testing-library/react": "15.0.2", - "@types/chroma-js": "2.1.4", - "@types/node": "20.12.7", - "@types/react": "18.2.8", - "@types/react-dom": "18.2.4", - "@types/react-speech-recognition": "^3.9.5", - "@types/react-syntax-highlighter": "15.5.13", - "@vanilla-extract/dynamic": "2.1.2", - "@vanilla-extract/vite-plugin": "4.0.18", - "@vitejs/plugin-react": "4.2.1", - "@voiceflow/test-common": "1.10.3", - "chromatic": "11.2.0", - "eslint-plugin-mdx": "3.1.5", - "eslint-plugin-storybook": "0.8.0", - "happy-dom": "14.7.1", - "http-server": "14.1.1", - "react": "18.2.0", - "react-dom": "18.2.0", - "storybook": "8.0.2", - "storybook-dark-mode": "1.1.0", - "tsc-alias": "1.8.8", - "type-fest": "2.18.1", - "unplugin-fonts": "^1.3.1", - "vite": "5.2.9", - "vite-plugin-dts": "3.8.3", - "vite-plugin-html": "3.2.2", - "vite-plugin-static-copy": "^2.2.0", - "vite-plugin-svgr": "4.2.0", - "vite-tsconfig-paths": "4.3.2" - }, - "peerDependencies": { - "react": "^18", - "react-dom": "^18" - }, - "volta": { - "extends": "../../package.json" - }, - "publishConfig": { - "tag": "next" - } -} diff --git a/packages/chat/playwright.config.ts b/packages/chat/playwright.config.ts deleted file mode 100644 index 61470cf0db..0000000000 --- a/packages/chat/playwright.config.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { cpus } from 'node:os'; - -import { defineConfig, devices } from '@playwright/test'; - -export default defineConfig({ - testDir: './e2e', - fullyParallel: true, - forbidOnly: !!process.env.CI, - retries: 0, - workers: process.env.CI ? 1 : cpus().length - 1, - reporter: [['junit', { outputFile: 'e2e.report.xml' }]], - timeout: 5000, - use: { - baseURL: 'http://127.0.0.1:8080/e2e/', - - trace: 'retain-on-failure', - screenshot: 'only-on-failure', - video: 'on', - }, - - projects: [ - { - name: 'chromium', - use: { ...devices['Desktop Chrome'] }, - }, - ], - - webServer: { - command: 'yarn start:e2e', - url: 'http://127.0.0.1:8080', - reuseExistingServer: !process.env.CI, - }, -}); diff --git a/packages/chat/sonar-project.properties b/packages/chat/sonar-project.properties deleted file mode 100644 index 6b99d146f3..0000000000 --- a/packages/chat/sonar-project.properties +++ /dev/null @@ -1,8 +0,0 @@ -sonar.projectName=chat -sonar.sources=src/ -sonar.tests=src/ -sonar.exclusions=src/**/*.test.*,src/**/*.story.tsx -sonar.test.inclusions=src/**/*.test.* -sonar.cpd.exclusions=src/**/*.test.*,src/**/*.story.tsx -sonar.typescript.tsconfigPath=tsconfig.json -sonar.javascript.lcov.reportPaths=sonar/coverage/lcov.info diff --git a/packages/chat/src/__fixtures__/colors.ts b/packages/chat/src/__fixtures__/colors.ts deleted file mode 100644 index e8ac877c3b..0000000000 --- a/packages/chat/src/__fixtures__/colors.ts +++ /dev/null @@ -1,15 +0,0 @@ -export const COLOR_FIXTURE = [ - 'orange', - '#397DFF', - '#A3E4D7', - 'red', - '#F1948A', - '#0000FF', - '#85C1E9', - '#F7DC6F', - '#BB8FCE', - 'green', - 'black', - 'yellow', - 'purple', -]; diff --git a/packages/chat/src/__fixtures__/default-launcher-image.png b/packages/chat/src/__fixtures__/default-launcher-image.png deleted file mode 100644 index 617fd6538c584bcc7c4b30e5d4d39138f09ef2a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15352 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

evD%W9t3m%P zkAVwd!+Ko5c5#6=vN*-1{6|^7cy_N&_OY!6^xX~<;#%!lT2*Rd&`@*dn&lQnq3m`M2V+)Z5X+XPMra!8wl${&CS&mJ z)EI;i(4lDt5VT43)W_YUR`S{UyR=|8{@X$6XwG}|1N z(4?5@k*BOH(e&;2N=URkuuR7vIXDtP@C?bzb6(^QI$up>7)r!BEWX}vQK*0~YgFNH z#{ru2rC2tfwXfC1W1r#$8xqS2{+0oOhk}x@{xVXpbdR#~ulrWot(*&RJ=eTTLhT94 zB5UXv{mFrn0=gTZem-2oJ|K62+4KC7swDu2az$w>{#bwW2poOvD;@5J{$Y*@2r>Hr zh7lMO5QfLB(}p5NQab)z2o7l^gz^D7yY+jfp^pT8OM4TV%bPnV8~ zmqJV2mcQvYMx@nf^*!HX;$Kn#MM$<*!O!xhwSzr=jRXo`AQ=&0-~B06Fx}ry4XM{U|HWHx9Ra#CvPt6r--<#zZCv@)0%YCMw)u>^mOgICd}32C zJG2wmo^8sYf3X$uxQ%z^t(3nbu*KmNyU`5fD4dWv|6Ba=Kv$X%MqEHuhU{%ZSqBGn z2x=y9@^_}$A>F20d#9Yu**c(%bfzrS5{rV->zTe9xBeX-(mte zwlwr!RYh0ciV{-Mh`a3YxlN!eSfwj!az`N7fdHC=cNJZPNoUXvo7PLT|B9qi6-`=h zBbN5YVM;avARft73WDYvWVm4z?BouKB9191T80;%W#WktXO zbkD*Ch=;I)+kj!Q1Q3y|p31-)k>q&$OvDS>($n5mF(8*_fYc)OsyAC(%MJ#GxMpUC zPW(v^izcv=KZi7NL#d4cu@Ki2yi~DQ85>R9?gy5`KR&KpcCV=n!+#3_xI`4tq+=P~ zul4Q|ujjV=%@g5Q7y3^D(No}T2G%1SQiI`z@=U{kT#XTb`D*GBUa)4T)l4(pX#uAN zSJ!cFeJ0U5derLE^)fdML5%~D!#o-_T{NN}vHcKf8{GVM5}vD}k)O~dku3srWv*ts zjJ%leUy{;4v&r7`^jBpT|J&+;ant}jrF1o#ut}5sxtq4=u(o4Rch4CxbY&>aIpe{*3NR=}_V+W8` zeCcK=$;;tOGS3uVQ;(1W9W2*zM*S;d_?N-yVoWNvX(*>ZpjnfS^0nNYIo? z;c9V0%naS^TG8m2@vDNdTLDiAd8+@gN*e%aup3{#Wq^?4+^Y-O8QhrMQAC_q*gaAO zczEdu5Lgs!$W^EiaL7_g1?{bD`MR*cu(W&b)EXa)j_D0BDEz=|!N1Z|!G(Ll zhP6P-Im!@u^jg#R_j6$X0LUBcw2y3nqbJ9uZ{{UhYriD@atG$suSAv1|9RK{J(~2k zCl20XeN$iGRBEo{+%d69bl4!E6$$~Ej~1CA$b4&Pzp1@qgppR6orM#dhga*g#O}VE zjbZM!xs5V?W7!lt9Pso1Ig$w20)T!0j~@P?>fw*n^1~zXK$*J*qi_G6(FMs%D@j#I H82kS(*(wGt@Na#idIeZ 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 I$B>l217oxUKmY&$ diff --git a/packages/chat/src/__fixtures__/markdown/code-response.md b/packages/chat/src/__fixtures__/markdown/code-response.md deleted file mode 100644 index 2aeb634e46..0000000000 --- a/packages/chat/src/__fixtures__/markdown/code-response.md +++ /dev/null @@ -1,15 +0,0 @@ -```javascript - -``` diff --git a/packages/chat/src/__fixtures__/markdown/inline-code.md b/packages/chat/src/__fixtures__/markdown/inline-code.md deleted file mode 100644 index 755538f3b5..0000000000 --- a/packages/chat/src/__fixtures__/markdown/inline-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Code and Syntax Highlighting - -```javascript - -``` - -```css -@font-face { - font-family: Chunkfive; - src: url('Chunkfive.otf'); -} - -body, -.usertext { - color: #f0f0f0; - background: #600; - font-family: Chunkfive, sans; -} - -@import url(print.css); -@media print { - a[href^='http']::after { - content: attr(href); - } -} -``` diff --git a/packages/chat/src/__fixtures__/markdown/lists.md b/packages/chat/src/__fixtures__/markdown/lists.md deleted file mode 100644 index 9595672060..0000000000 --- a/packages/chat/src/__fixtures__/markdown/lists.md +++ /dev/null @@ -1,106 +0,0 @@ -# Lists - -1. First ordered list item -2. Another item -3. Actual numbers don't matter, just that it's a number -4. And another item. - -- Unordered list can use asterisks - -* Or minuses - -- Or pluses - -1. Make my changes - 1. Fix bug - 2. Improve formatting - - Make the headings bigger -2. Push my commits to GitHub -3. Open a pull request - - Describe my changes - - Mention all the members of my team - - Ask for feedback - ---- - -# Task lists - -- [x] Finish my changes -- [ ] Push my commits to GitHub -- [ ] Open a pull request -- [x] @mentions, #refs, [links](), **formatting**, and tags supported -- [x] list syntax required (any unordered or ordered list supported) -- [ ] this is a complete item -- [ ] this is an incomplete item - ---- - -# Ignoring Markdown formatting - -You can tell GitHub to ignore (or escape) Markdown formatting by using \ before the Markdown character. - -Let's rename \*our-new-project\* to \*our-old-project\*. - ---- - -# Links - -[I'm an inline-style link](https://www.google.com) - -[I'm an inline-style link with title](https://www.google.com "Google's Homepage") - -[I'm a reference-style link][Arbitrary case-insensitive reference text] - -[I'm a relative reference to a repository file](../blob/master/LICENSE) - -[You can use numbers for reference-style link definitions][1] - -Or leave it empty and use the [link text itself]. - -URLs and URLs in angle brackets will automatically get turned into links. -http://www.example.com or and sometimes -example.com (but not on Github, for example). - -Some text to show that the reference links can follow later. - -[arbitrary case-insensitive reference text]: https://www.mozilla.org -[1]: http://slashdot.org -[link text itself]: http://www.reddit.com - -# Images - -Here's our logo (hover to see the title text): - -Inline-style: -![alt text](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png 'Logo Title Text 1') - -Reference-style: -![alt text][logo] - -[logo]: https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png 'Logo Title Text 2' - -Like links, Images also have a footnote style syntax - -![Alt text][id] - -With a reference later in the document defining the URL location: - ---- - -# [Footnotes](https://github.com/markdown-it/markdown-it-footnote) - -Footnote 1 link[^first]. - -Footnote 2 link[^second]. - -Inline footnote^[Text of inline footnote] definition. - -Duplicated footnote reference[^second]. - -[^first]: Footnote **can have markup** - - and multiple paragraphs. - -[^second]: Footnote text. - ---- diff --git a/packages/chat/src/__fixtures__/markdown/tables-quotes-rules.md b/packages/chat/src/__fixtures__/markdown/tables-quotes-rules.md deleted file mode 100644 index cf9222ccd4..0000000000 --- a/packages/chat/src/__fixtures__/markdown/tables-quotes-rules.md +++ /dev/null @@ -1,90 +0,0 @@ -# Tables - -Colons can be used to align columns. - -| Tables | Are | Cool | -| ------------- | :-----------: | ----: | -| col 3 is | right-aligned | $1600 | -| col 2 is | centered | $12 | -| zebra stripes | are neat | $1 | - -There must be at least 3 dashes separating each header cell. -The outer pipes (|) are optional, and you don't need to make the -raw Markdown line up prettily. You can also use inline Markdown. - -| Markdown | Less | Pretty | -| -------- | --------- | ---------- | -| _Still_ | `renders` | **nicely** | -| 1 | 2 | 3 | - -| First Header | Second Header | -| ------------ | ------------- | -| Content Cell | Content Cell | -| Content Cell | Content Cell | - -| Command | Description | -| ---------- | ---------------------------------------------- | -| git status | List all new or modified files | -| git diff | Show file differences that haven't been staged | - -| Command | Description | -| ------------ | -------------------------------------------------- | -| `git status` | List all _new or modified_ files | -| `git diff` | Show file differences that **haven't been** staged | - -| Left-aligned | Center-aligned | Right-aligned | -| :----------- | :------------: | ------------: | -| git status | git status | git status | -| git diff | git diff | git diff | - -| Name | Character | -| -------- | --------- | -| Backtick | ` | -| Pipe | \| | - ---- - -# Blockquotes - -> Blockquotes are very handy in email to emulate reply text. -> This line is part of the same quote. -> Quote break. - -> This is a very long line that will still be quoted properly when it wraps. Oh boy let's keep writing to make sure this is long enough to actually wrap for everyone. Oh, you can _put_ **Markdown** into a blockquote. -> Blockquotes can also be nested... -> -> > ...by using additional greater-than signs right next to each other... -> > -> > > ...or with spaces between arrows. - ---- - -# Inline HTML - -

-
Definition list
-
Is something people use sometimes.
- -
Markdown in HTML
-
Does *not* work **very** well. Use HTML tags.
-
- ---- - -# Horizontal Rules - -Three or more... - ---- - -Hyphens - ---- - -Asterisks - ---- - -Underscores - ---- diff --git a/packages/chat/src/__fixtures__/markdown/text-treatment.md b/packages/chat/src/__fixtures__/markdown/text-treatment.md deleted file mode 100644 index 579656e02b..0000000000 --- a/packages/chat/src/__fixtures__/markdown/text-treatment.md +++ /dev/null @@ -1,39 +0,0 @@ -# Howdy! - -# h1 Voiceflow - -## h2 Voiceflow - -### h3 Voiceflow - -#### h4 Voiceflow - -##### h5 Voiceflow - -###### h6 Voiceflow - -# Alt-H1 - -## Alt-H2 - ---- - -What does a really long block of text look like? Well, it looks like this. And there's even more of it than you could ever imagine. We want to see how this wraps and displays line height properly. So we're going to keep going. What does a really long block of text look like? Well, it looks like this. And there's even more of it than you could ever imagine. We want to see how this wraps and displays line height properly. So we're going to keep going. - -What does a really long block of text look like? Well, it looks like this. And there's even more of it than you could ever imagine. We want to see how this wraps and displays line height properly. So we're going to keep going. What does a really long block of text look like? Well, it looks like this. And there's even more of it than you could ever imagine. We want to see how this wraps and displays line height properly. So we're going to keep going. - ---- - -# Emphasis - -Emphasis, aka italics, with _asterisks_ or _underscores_. - -Strong emphasis, aka bold, with **asterisks** or **underscores**. - -Combined emphasis with **asterisks and _underscores_**. - -**This is bold text** - -_This is italic text_ - -~~Strikethrough~~ diff --git a/packages/chat/src/__fixtures__/messages.ts b/packages/chat/src/__fixtures__/messages.ts deleted file mode 100644 index 77e2deb8d3..0000000000 --- a/packages/chat/src/__fixtures__/messages.ts +++ /dev/null @@ -1,94 +0,0 @@ -import type { Text, Trace } from '@voiceflow/base-types'; - -import CODE_RESPONSE_FIXTURE from '@/__fixtures__/markdown/code-response.md?raw'; -import type { MessageProps } from '@/components/SystemResponse'; -import { MessageType } from '@/components/SystemResponse/constants'; -import { ExtensionType, type ResponseExtension } from '@/dtos/Extension.dto'; - -// Example text content for Text.SlateTextValue -export const SAMPLE_SLATE_TEXT: Text.SlateTextValue = [{ type: 'paragraph', children: [{ text: 'Hello, world!' }] }]; -const sampleTrace: Trace.AnyTrace = { type: 'speak', payload: { message: 'End of conversation.' } } as Trace.AnyTrace; -const sampleExtension: ResponseExtension = { - name: 'SampleExtension', - type: ExtensionType.RESPONSE, - match(): boolean { - throw new Error('Function not implemented.'); - }, -}; - -export const textMessageFixture: MessageProps[] = [ - { - type: MessageType.TEXT, - text: SAMPLE_SLATE_TEXT, - delay: 500, - ai: true, - }, -]; - -export const codeMessageFixture: MessageProps[] = [ - { - type: MessageType.TEXT, - text: CODE_RESPONSE_FIXTURE, - delay: 500, - ai: true, - }, -]; - -export const imageMessageFixture: MessageProps = { - type: MessageType.IMAGE, - url: 'https://example.com/image.png', - delay: 200, - ai: false, -}; - -export const cardMessageFixture: MessageProps = { - type: MessageType.CARD, - title: 'Sample Card Title', - description: 'Sample Subtitle', - image: 'https://example.com/card-image.png', - delay: 300, - ai: true, -}; - -export const carouselMessageFixture: MessageProps = { - type: MessageType.CAROUSEL, - cards: [ - { - title: 'Card 1', - description: 'First Card in Carousel', - image: 'https://example.com/card1.png', - }, - { - title: 'Card 2', - description: 'Second Card in Carousel', - image: 'https://example.com/card2.png', - }, - ], - delay: 400, - ai: false, -}; - -export const endMessageFixture: MessageProps = { - type: MessageType.END, - delay: 100, - ai: true, -}; - -export const extensionMessageFixture: MessageProps = { - type: MessageType.EXTENSION, - payload: { - trace: sampleTrace, - extension: sampleExtension, - }, - delay: 500, - ai: true, -}; - -export const customMessageFixture: MessageProps = { - type: 'custom_greeting', - payload: { - greeting: 'Hello, custom world!', - }, - delay: 600, - ai: true, -}; diff --git a/packages/chat/src/__fixtures__/mock-assistant.ts b/packages/chat/src/__fixtures__/mock-assistant.ts deleted file mode 100644 index 3493b78c6a..0000000000 --- a/packages/chat/src/__fixtures__/mock-assistant.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { - WIDGET_SETTINGS_DEFAULT_MAIN_COLOR, - WIDGET_SETTINGS_DEFAULT_PALETTE, - WidgetSettingsChatRenderMode, - WidgetSettingsLauncherType, - WidgetSettingsVoiceRenderMode, - WidgetSettingsWidgetPosition, - WidgetSettingsWidgetType, -} from '@voiceflow/dtos-interact'; -import { ChatPersistence } from '@voiceflow/voiceflow-types/build/cjs/version'; - -import type { ChatWidgetSettings } from '@/types/settings'; - -export const DEFAULT_WIDGET_SETTINGS: ChatWidgetSettings = { - type: WidgetSettingsWidgetType.CHAT, - - chat: { - voiceInput: true, - voiceOutput: true, - - renderMode: WidgetSettingsChatRenderMode.WIDGET, - - headerImage: { - enabled: true, - }, - agentImage: { - enabled: true, - }, - banner: { - enabled: true, - title: 'Your AI agent', - description: 'How can I help you today?', - }, - placeholderText: 'Message...', - aiDisclaimer: { - enabled: true, - text: 'Generated by AI, double-check for accuracy.', - }, - handoffToAgentImageURL: '', - }, - voice: { - renderMode: WidgetSettingsVoiceRenderMode.FULL, - content: { - callToActionText: 'How can I help you?', - startButtonText: 'Start a call', - listeningText: 'Listening', - talkingText: 'Talk to interrupt', - endButtonText: 'End', - }, - }, - common: { - fontFamily: 'UCity Pro', - launcher: { - text: 'Your text', - type: WidgetSettingsLauncherType.ICON, - }, - poweredBy: true, - footerLink: { - enabled: true, - text: 'Privacy', - }, - position: WidgetSettingsWidgetPosition.RIGHT, - sideSpacing: '20', - bottomSpacing: '20', - primaryColor: { - color: WIDGET_SETTINGS_DEFAULT_MAIN_COLOR, - palette: WIDGET_SETTINGS_DEFAULT_PALETTE, - }, - persistence: ChatPersistence.LOCAL_STORAGE, - }, - stylesheet: '', - extensions: [], -}; diff --git a/packages/chat/src/__fixtures__/tiled-bg.png b/packages/chat/src/__fixtures__/tiled-bg.png deleted file mode 100644 index d643f272e29ad39aa2308febdcf370f1d9598140..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG zH9B-2Yb8U?)aJDG`*Db%->=j7l)G#Gx%*BoI0g9FlldKGFQk~Sk*PN zQ}4HDOsiRQ7VF2~lBYx+dZa(_tUbVW=K!}Rv&zn0zK?eREoAU?^>bP0l+XkK8s9`9 diff --git a/packages/chat/src/assets/blank-image.png b/packages/chat/src/assets/blank-image.png deleted file mode 100644 index bade0cbac162a14b403bce9fe3721982e888738c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34261 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 AGXMYp diff --git a/packages/chat/src/assets/message.png b/packages/chat/src/assets/message.png deleted file mode 100644 index b9d2eb42bc2da4aa4e1c1d0fe922b9405d8178c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9282 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 - - - - - diff --git a/packages/chat/src/assets/svg/arrow-down.svg b/packages/chat/src/assets/svg/arrow-down.svg deleted file mode 100644 index fd5babb74a..0000000000 --- a/packages/chat/src/assets/svg/arrow-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/packages/chat/src/assets/svg/arrow-right.svg b/packages/chat/src/assets/svg/arrow-right.svg deleted file mode 100644 index bb29943bac..0000000000 --- a/packages/chat/src/assets/svg/arrow-right.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/packages/chat/src/assets/svg/checkmark.svg b/packages/chat/src/assets/svg/checkmark.svg deleted file mode 100644 index cdc69daa9b..0000000000 --- a/packages/chat/src/assets/svg/checkmark.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/packages/chat/src/assets/svg/close.svg b/packages/chat/src/assets/svg/close.svg deleted file mode 100644 index ef01b1522c..0000000000 --- a/packages/chat/src/assets/svg/close.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/packages/chat/src/assets/svg/closeV2.svg b/packages/chat/src/assets/svg/closeV2.svg deleted file mode 100644 index 6793e0e907..0000000000 --- a/packages/chat/src/assets/svg/closeV2.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - \ No newline at end of file diff --git a/packages/chat/src/assets/svg/copy.svg b/packages/chat/src/assets/svg/copy.svg deleted file mode 100644 index 30ab2591f3..0000000000 --- a/packages/chat/src/assets/svg/copy.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - \ No newline at end of file diff --git a/packages/chat/src/assets/svg/document-pdf.svg b/packages/chat/src/assets/svg/document-pdf.svg deleted file mode 100644 index a4849397a9..0000000000 --- a/packages/chat/src/assets/svg/document-pdf.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/packages/chat/src/assets/svg/document-url.svg b/packages/chat/src/assets/svg/document-url.svg deleted file mode 100644 index c18197d560..0000000000 --- a/packages/chat/src/assets/svg/document-url.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/packages/chat/src/assets/svg/end-call.svg b/packages/chat/src/assets/svg/end-call.svg deleted file mode 100644 index 31f5364454..0000000000 --- a/packages/chat/src/assets/svg/end-call.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/packages/chat/src/assets/svg/index.ts b/packages/chat/src/assets/svg/index.ts deleted file mode 100644 index 711f41f0ef..0000000000 --- a/packages/chat/src/assets/svg/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -export { default as ai } from './ai.svg?react'; -export { default as arrowDown } from './arrow-down.svg?react'; -export { default as arrowRight } from './arrow-right.svg?react'; -export { default as checkmark } from './checkmark.svg?react'; -export { default as close } from './close.svg?react'; -export { default as closeV2 } from './closeV2.svg?react'; -export { default as copy } from './copy.svg?react'; -export { default as documentPdf } from './document-pdf.svg?react'; -export { default as documentUrl } from './document-url.svg?react'; -export { default as endCall } from './end-call.svg?react'; -export { default as largeArrowLeft } from './large-arrow-left.svg?react'; -export { default as microphone } from './microphone.svg?react'; -export { default as minus } from './minus.svg?react'; -export { default as mute } from './mute.svg?react'; -export { default as phone } from './phone.svg?react'; -export { default as reset } from './reset.svg?react'; -export { default as smallArrowUp } from './small-arrow-up.svg?react'; -export { default as sound } from './sound.svg?react'; -export { default as soundOff } from './sound-off.svg?react'; -export { default as stop } from './stop.svg?react'; -export { default as thumbsUp } from './thumbs-up.svg?react'; -export { default as topCaret } from './top-caret.svg?react'; -export { default as voice } from './voice.svg?react'; -export { default as volume } from './volume.svg?react'; diff --git a/packages/chat/src/assets/svg/large-arrow-left.svg b/packages/chat/src/assets/svg/large-arrow-left.svg deleted file mode 100644 index 426a7f1123..0000000000 --- a/packages/chat/src/assets/svg/large-arrow-left.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/packages/chat/src/assets/svg/microphone.svg b/packages/chat/src/assets/svg/microphone.svg deleted file mode 100644 index 0fd21b925c..0000000000 --- a/packages/chat/src/assets/svg/microphone.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/packages/chat/src/assets/svg/minus.svg b/packages/chat/src/assets/svg/minus.svg deleted file mode 100644 index 02d44e18e5..0000000000 --- a/packages/chat/src/assets/svg/minus.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/packages/chat/src/assets/svg/mute.svg b/packages/chat/src/assets/svg/mute.svg deleted file mode 100644 index c4512d0ebc..0000000000 --- a/packages/chat/src/assets/svg/mute.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/packages/chat/src/assets/svg/phone.svg b/packages/chat/src/assets/svg/phone.svg deleted file mode 100644 index 66b7a69310..0000000000 --- a/packages/chat/src/assets/svg/phone.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/packages/chat/src/assets/svg/reset.svg b/packages/chat/src/assets/svg/reset.svg deleted file mode 100644 index 593cf57f48..0000000000 --- a/packages/chat/src/assets/svg/reset.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/packages/chat/src/assets/svg/small-arrow-up.svg b/packages/chat/src/assets/svg/small-arrow-up.svg deleted file mode 100644 index 5ad300f687..0000000000 --- a/packages/chat/src/assets/svg/small-arrow-up.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/packages/chat/src/assets/svg/sound-off.svg b/packages/chat/src/assets/svg/sound-off.svg deleted file mode 100644 index bbeecb19b1..0000000000 --- a/packages/chat/src/assets/svg/sound-off.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/packages/chat/src/assets/svg/sound.svg b/packages/chat/src/assets/svg/sound.svg deleted file mode 100644 index fb3e50c34a..0000000000 --- a/packages/chat/src/assets/svg/sound.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/packages/chat/src/assets/svg/stop.svg b/packages/chat/src/assets/svg/stop.svg deleted file mode 100644 index 7b0c4ba0f3..0000000000 --- a/packages/chat/src/assets/svg/stop.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/packages/chat/src/assets/svg/thumbs-up.svg b/packages/chat/src/assets/svg/thumbs-up.svg deleted file mode 100644 index 38ae1b2276..0000000000 --- a/packages/chat/src/assets/svg/thumbs-up.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/packages/chat/src/assets/svg/top-caret.svg b/packages/chat/src/assets/svg/top-caret.svg deleted file mode 100644 index 11a25a6b8e..0000000000 --- a/packages/chat/src/assets/svg/top-caret.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/chat/src/assets/svg/voice.svg b/packages/chat/src/assets/svg/voice.svg deleted file mode 100644 index 531dc78c58..0000000000 --- a/packages/chat/src/assets/svg/voice.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/packages/chat/src/assets/svg/volume.svg b/packages/chat/src/assets/svg/volume.svg deleted file mode 100644 index c674024423..0000000000 --- a/packages/chat/src/assets/svg/volume.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/packages/chat/src/assets/vf_chat.png b/packages/chat/src/assets/vf_chat.png deleted file mode 100644 index 2c3c7a1c0db9fc70a5860d40a7281de59d4cef8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19784 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

aK?=hDJwp&_-3_K@O`6V`xS|w8x`$+ z+JIZXKV7+eoXxylea@yU0nS-x;-h6aCIby*;mzb*fBxZ?v-2|-wtqhD%)Rnsv0PCB zqt6uZc5zFash3Z_e0}F#fYU1A9`bgepqTk8yY+9%ozr4!`B$Fps-4d|1DJo8DWnCy z4t;COz4DOe>#Nr%Xw3m{PFJnvUb&Iu2=C0^45zGkF+sD3S01t$*fMGP1l~E2_y5z} zx$EVQPV9B&TAurFPIIJ(NtJK1;KS9+B*z~Iu5(Bc zt~1jW6O`Nc{^7a2<0(g2Zz(Tu;+{3(*3wsjTMQrD6sC6>XKq~h_hR4P^}sV6J_nh* zShR+5thg{~$Hvm7RaZi~+N!kt!iyHvGHHnv0O!wM=AH5NzQ0E^ zw`)Sx6Y2iz@iXOaEvgpa&-xh2dP{wQlj7N4%fnj#mt|R9nP&I&=;5fg_H8pvd*3U| zU9(x?Xc->j5SZ@1_RH+NeQR&+ecc8+hhTMX^!Bja&b_|#t6o{Ja`E1>Q{dR1*XvFA zbC>(=jk{ZXzA?<6`{M)&?(L5fd4ap6T2&SmiNp(rfJPy=7C%p4o!L3N@XXcJxqqdF zLU)~>TlKd0*XrK(Z7XKj0XN^sT~d$)o(+-N^lDpf^lD&UT=(qRy16%aZ=Ic?H}jfv zbV!ze-@mXz%`}s+GRcUh8=C|vP?%#HlKlh_$M1Dl?`5>DqXV34CtrvTf%Jq|T#RbNVPlIbr zyJu|6nYl7;d;a>gw6s_I?}3ip_;-`ThMW8SwW*574fA|vJN{eLV6}~7n*P!2zZYwM zd?0qWHTU+qRrcJy+`ug@_3ehIiW0v(J;<}m-JzAQOM0D|t+V-iMV_kDX2A^J86TOa zr~*$3*?8fRXHf3HNQPKN*kL0sv(>9JA*X|AoZu>MI1N0M1bU>%Gq-nUz3e;YG;lFE zXu%E^0UlWLb=_WmQ1t{pf2hGp?-sLYLL`&c0i#tplHsj!Rkr^&gVU!M*~Y=Q1jYI5}oCKoDtrG=+dp fJA&noKmTtX{K8U@G0zitLK=gotDnm{r-UW|V2M7_ diff --git a/packages/chat/src/assets/vf_logo.png b/packages/chat/src/assets/vf_logo.png deleted file mode 100644 index 9273a59602edb120aeb7b8507b06fd30c3d1017e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5290 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 Cw5h-V diff --git a/packages/chat/src/components/AgentMessage/AgentMessage.css.ts b/packages/chat/src/components/AgentMessage/AgentMessage.css.ts deleted file mode 100644 index 0ab5a1dcbf..0000000000 --- a/packages/chat/src/components/AgentMessage/AgentMessage.css.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { style } from '@vanilla-extract/css'; -import { recipe } from '@vanilla-extract/recipes'; - -import { COLORS } from '@/styles/colors'; -import { THEME } from '@/styles/colors.css'; -import { BREAKPOINTS, SIZES } from '@/styles/sizes'; -import { transition } from '@/styles/transitions'; - -import { messageContainer } from '../MessageContainer/styles.css'; -import { systemMessageContainer } from '../SystemResponse/styles.css'; - -export const agentMessageContainer = style({ - backgroundColor: COLORS.NEUTRAL_LIGHT[50], - color: COLORS.NEUTRAL_DARK[900], - fontFamily: THEME.fontFamily, - position: 'relative', - fontSize: '14px', - lineHeight: '20px', - borderRadius: SIZES.radius.sm, - width: 'fit-content', -}); - -export const contentStyle = recipe({ - base: { - whiteSpace: 'normal', - }, - variants: { - isCodeBlock: { - true: { - padding: 0, - }, - false: { - padding: '11px 16px 10px', - }, - }, - }, -}); - -export const embeddedContent = style({ - padding: '0 16px 12px', - display: 'flex', - flexDirection: 'column', - gap: '6px', -}); - -export const generatedChin = style({ - display: 'flex', - alignItems: 'center', - padding: '10px 16px 9px', - backgroundColor: COLORS.NEUTRAL_LIGHT[100], - left: 0, - right: 0, - bottom: 0, - color: COLORS.NEUTRAL_DARK[200], - fontFamily: THEME.fontFamily, - fontSize: '12px', - whiteSpace: 'nowrap', - lineHeight: '17px', - gap: '10px', - fontWeight: 600, - borderRadius: '0 0 10px 10px', -}); - -export const generatedChinContent = style({ - '@media': { - [`screen and (max-width: ${BREAKPOINTS.mobile})`]: { - maxWidth: '233px', - overflow: 'hidden', - textOverflow: 'ellipsis', - whiteSpace: 'nowrap', - }, - }, -}); - -export const aiIconModifier = style({ - color: COLORS.NEUTRAL_DARK[100], - height: '16px', -}); - -export const codeBlockContainer = style({ - position: 'relative', -}); - -export const copyButton = style({ - position: 'absolute', - right: '12px', - top: '12px', - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - transition: transition(['opacity', 'background-color', 'color']), - zIndex: 2, - opacity: 0, - selectors: { - [`${codeBlockContainer}:hover &`]: { - opacity: 1, - }, - '&:hover': { - backgroundColor: COLORS.NEUTRAL_DARK[200], - color: COLORS.NEUTRAL_LIGHT[50], - }, - '&:active': {}, - }, -}); - -export const feedbackButtonContainer = style({ - opacity: 0, - position: 'absolute', - right: '-6px', - bottom: '-14px', - transition: transition(['opacity']), - zIndex: 10, - selectors: { - [`${systemMessageContainer}:hover &`]: { - opacity: 1, - }, - [`${messageContainer()}:hover &`]: { - opacity: 1, - }, - }, -}); - -export const lastListItem = style({ - marginBottom: 0, -}); - -export const lastPElement = style({ - ':last-child': { - marginBottom: 0, - }, -}); - -export const markdownParagraph = recipe({ - base: { - marginBottom: '8px', - marginTop: '8px', - }, - variants: { - first: { - true: { - marginTop: 0, - }, - }, - }, -}); diff --git a/packages/chat/src/components/AgentMessage/AgentMessage.story.tsx b/packages/chat/src/components/AgentMessage/AgentMessage.story.tsx deleted file mode 100644 index 1fa1b3b0b3..0000000000 --- a/packages/chat/src/components/AgentMessage/AgentMessage.story.tsx +++ /dev/null @@ -1,143 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; -import { useEffect, useState } from 'react'; - -import CODE_RESPONSE_FIXTURE from '@/__fixtures__/markdown/code-response.md?raw'; -import CODE_SNIPPET_FIXTURE from '@/__fixtures__/markdown/inline-code.md?raw'; -import LISTS_FIXTURE from '@/__fixtures__/markdown/lists.md?raw'; -import TABLES_QUOTES_RULES from '@/__fixtures__/markdown/tables-quotes-rules.md?raw'; -import TEXT_TREATMENT_MARKDOWN from '@/__fixtures__/markdown/text-treatment.md?raw'; -import { SAMPLE_SLATE_TEXT } from '@/__fixtures__/messages'; - -import tiledBg from '../../__fixtures__/tiled-bg.png'; -import { LinkPreview } from '../LinkPreview'; -import { AgentMessage } from '.'; - -type Story = StoryObj; - -const shortMessage = 'Howdy folks how yall doing out there?'; - -const meta: Meta = { - title: 'Core/AgentMessage', - component: AgentMessage, -}; -export default meta; - -export const Small: Story = { - args: { - text: SAMPLE_SLATE_TEXT, - }, -}; - -export const AIGenerated: Story = { - args: { - text: SAMPLE_SLATE_TEXT as unknown as string, - ai: true, - disclaimerMessage: 'Generated by AI, double-check for accuracy.', - }, -}; - -export const WithLink: Story = { - args: { - text: SAMPLE_SLATE_TEXT, - ai: true, - disclaimerMessage: 'Generated by AI, double-check for accuracy.', - children: ( - <> - - - - - ), - }, -}; - -export const Markdown: Story = { - args: { - text: TEXT_TREATMENT_MARKDOWN, - }, -}; - -export const InlineCode: Story = { - args: { - text: CODE_SNIPPET_FIXTURE, - }, -}; - -export const CodeResponse: Story = { - args: { - text: CODE_RESPONSE_FIXTURE, - }, - render: ({ children, ...rest }) => { - return ( -

- -
- ); - }, -}; - -export const Tables: Story = { - args: { - text: TABLES_QUOTES_RULES, - }, -}; - -export const Lists: Story = { - args: { - text: LISTS_FIXTURE, - }, -}; - -const StreamingExample = ({ message }: { message: string }) => { - const [text, setText] = useState(''); - - useEffect(() => { - let index = 0; - const interval = setInterval(() => { - setText(message.slice(0, index + 1)); - index++; - if (index === message.length) { - clearInterval(interval); - } - }, 5); - - return () => clearInterval(interval); - }, [message]); - - return ; -}; - -export const Streaming: Story = { - render: () => , - parameters: { - chromatic: { disableSnapshot: true }, - }, -}; - -export const StreamingFullMarkdown: Story = { - render: () => , - parameters: { - chromatic: { disableSnapshot: true }, - }, -}; diff --git a/packages/chat/src/components/AgentMessage/CopyButton/CopyButton.css.ts b/packages/chat/src/components/AgentMessage/CopyButton/CopyButton.css.ts deleted file mode 100644 index 41692ac152..0000000000 --- a/packages/chat/src/components/AgentMessage/CopyButton/CopyButton.css.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { style } from '@vanilla-extract/css'; - -import { COLORS } from '@/styles/colors'; -import { SIZES } from '@/styles/sizes'; - -export const copyButton = style({ - width: 36, - height: 36, - borderRadius: SIZES.radius.xs, - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - color: COLORS.NEUTRAL_LIGHT[300], - backgroundColor: COLORS.NEUTRAL_DARK[400], - right: 12, - top: 12, - outline: 'none', - border: 'none', - cursor: 'pointer', - zIndex: 2, -}); diff --git a/packages/chat/src/components/AgentMessage/CopyButton/index.tsx b/packages/chat/src/components/AgentMessage/CopyButton/index.tsx deleted file mode 100644 index cc472c7828..0000000000 --- a/packages/chat/src/components/AgentMessage/CopyButton/index.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import clsx from 'clsx'; -import { useState } from 'react'; - -import { Icon } from '@/components/Icon'; - -import { copyButton } from './CopyButton.css'; - -export const CopyButton = ({ value = '', className }: { value: React.ReactNode; className: string }) => { - const [isCopied, setIsCopied] = useState(false); - const handleClick = () => { - if (value) { - navigator.clipboard.writeText(value.toString()).catch((err) => { - console.error('Failed to copy text: ', err); - }); - } - }; - - const handleMouseDown = () => { - setIsCopied(true); - }; - - return ( - - ); -}; diff --git a/packages/chat/src/components/AgentMessage/code-theme.ts b/packages/chat/src/components/AgentMessage/code-theme.ts deleted file mode 100644 index b65f45ea2c..0000000000 --- a/packages/chat/src/components/AgentMessage/code-theme.ts +++ /dev/null @@ -1,159 +0,0 @@ -import { COLORS } from '@/styles/colors'; - -export default { - 'code[class*="language-"]': { - color: '#F1F2F2', - textShadow: '0 1px rgba(0, 0, 0, 0.3)', - fontFamily: 'Fira Code, monospace', - fontSize: '12px', - direction: 'ltr', - textAlign: 'left', - whiteSpace: 'pre', - wordSpacing: 'normal', - wordBreak: 'normal', - lineHeight: '1.5', - MozTabSize: '4', - OTabSize: '4', - tabSize: '4', - WebkitHyphens: 'none', - MozHyphens: 'none', - msHyphens: 'none', - hyphens: 'none', - }, - 'pre[class*="language-"]': { - color: '#F1F2F2', - textShadow: '0 1px rgba(0, 0, 0, 0.3)', - fontFamily: 'Fira Code, monospace', - direction: 'ltr', - textAlign: 'left', - whiteSpace: 'pre', - wordSpacing: 'normal', - wordBreak: 'normal', - lineHeight: '1.5', - fontSize: '12px', - MozTabSize: '4', - OTabSize: '4', - tabSize: '4', - WebkitHyphens: 'none', - MozHyphens: 'none', - msHyphens: 'none', - hyphens: 'none', - padding: '1em', - margin: '.5em 0', - overflow: 'auto', - borderRadius: '10px', - background: COLORS.NEUTRAL_DARK[600], - }, - ':not(pre) > code[class*="language-"]': { - background: '#1d1f21', - padding: '.1em', - borderRadius: '10px', - }, - comment: { - color: '#F1F2F2', - }, - prolog: { - color: '#F1F2F2', - }, - doctype: { - color: '#F1F2F2', - }, - cdata: { - color: '#F1F2F2', - }, - punctuation: { - color: '#c5c8c6', - }, - '.namespace': { - Opacity: '.7', - }, - property: { - color: '#F1F2F2', - }, - keyword: { - color: '#96CBFE', - }, - tag: { - color: '#96CBFE', - }, - 'class-name': { - color: '#FFFFB6', - textDecoration: 'underline', - }, - boolean: { - color: '#99CC99', - }, - constant: { - color: '#99CC99', - }, - symbol: { - color: '#f92672', - }, - deleted: { - color: '#f92672', - }, - number: { - color: '#FF73FD', - }, - selector: { - color: '#A8FF60', - }, - 'attr-name': { - color: '#A8FF60', - }, - string: { - color: '#B4D6E4', - }, - char: { - color: '#A8FF60', - }, - builtin: { - color: '#A8FF60', - }, - inserted: { - color: '#A8FF60', - }, - variable: { - color: '#C6C5FE', - }, - operator: { - color: '#EDEDED', - }, - entity: { - color: '#FFFFB6', - cursor: 'help', - }, - url: { - color: '#96CBFE', - }, - '.language-css .token.string': { - color: '#87C38A', - }, - '.style .token.string': { - color: '#87C38A', - }, - atrule: { - color: '#F9EE98', - }, - 'attr-value': { - color: '#F9EE98', - }, - function: { - color: '#8ACD6F', - }, - regex: { - color: '#E9C062', - }, - important: { - color: '#fd971f', - fontWeight: 'bold', - }, - bold: { - fontWeight: 'bold', - }, - italic: { - fontStyle: 'italic', - }, -} as { - [key: string]: React.CSSProperties; -}; diff --git a/packages/chat/src/components/AgentMessage/index.tsx b/packages/chat/src/components/AgentMessage/index.tsx deleted file mode 100644 index 972cd4db9c..0000000000 --- a/packages/chat/src/components/AgentMessage/index.tsx +++ /dev/null @@ -1,128 +0,0 @@ -import '../../styles.css'; - -import type { Text } from '@voiceflow/base-types'; -import { serializeToMarkdown } from '@voiceflow/slate-serializer/markdown'; -import clsx from 'clsx'; -import Markdown from 'react-markdown'; -import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'; -import remarkGfm from 'remark-gfm'; - -import { FeedbackButton } from '../FeedbackButton'; -import { FeedbackButtonVariant, type IFeedbackButton } from '../FeedbackButton/FeedbackButton.interface'; -import { Icon } from '../Icon'; -import { - agentMessageContainer, - aiIconModifier, - codeBlockContainer, - contentStyle, - copyButton, - embeddedContent, - feedbackButtonContainer, - generatedChin, - generatedChinContent, - lastListItem, - lastPElement, - markdownParagraph, -} from './AgentMessage.css'; -import codeTheme from './code-theme'; -import { CopyButton } from './CopyButton'; - -interface IAgentMessage { - text: string | Text.SlateTextValue; - children?: React.ReactNode; - ai?: boolean; - disclaimerMessage?: string; - - isLast?: boolean; - feedback?: IFeedbackButton | undefined; - - debug?: boolean; - textContent?: string; -} - -export const AgentMessage: React.FC = ({ - text, - children, - ai, - disclaimerMessage = 'Generated by AI, double-check for accuracy.', - isLast, - feedback, - textContent, -}) => { - const content = typeof text === 'string' ? text : serializeToMarkdown(text); - - const isCodeBlock = content?.startsWith('```javascript'); - - return ( -
- - - - - ) : ( -
- {children} -
- ); - }, - li: ({ children, ...props }) => { - // NOTE: this accounts for when the last item in a response is a li and we remove the bottom margin from that. - const position = props.node?.position; - if (position && position.end.offset === text.length - 1) { - return ( -
  • - {children} -
  • - ); - } - return
  • {children}
  • ; - }, - p: ({ children, ...props }) => { - const position = props.node?.position; - const isFirst = position && position.start.offset === 0; - const isLast = position && position.end.offset === text.length - 1; - return ( -

    - {children} -

    - ); - }, - }} - /> - {children &&
    {children}
    } - {ai && ( -
    - - {disclaimerMessage} -
    - )} - {feedback && !isLast && ( -
    - -
    - )} -
    - ); -}; diff --git a/packages/chat/src/components/Avatar/Avatar.story.tsx b/packages/chat/src/components/Avatar/Avatar.story.tsx deleted file mode 100644 index 8ffc2710e1..0000000000 --- a/packages/chat/src/components/Avatar/Avatar.story.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; - -import EMPTY_IMAGE from '../../__fixtures__/empty-image.png'; -import { Avatar } from '.'; - -type Story = StoryObj; - -const meta: Meta = { - title: 'Core/Avatar', - component: Avatar, - argTypes: { - size: { - options: ['small', 'large'], - control: { type: 'radio' }, - defaultValue: 'small', - }, - }, - args: { - avatar: EMPTY_IMAGE, - }, -}; -export default meta; - -export const Small: Story = { - args: { - size: 'small', - }, -}; - -export const Large: Story = { - args: { - size: 'large', - }, -}; diff --git a/packages/chat/src/components/Avatar/index.tsx b/packages/chat/src/components/Avatar/index.tsx deleted file mode 100644 index 55bb9497c5..0000000000 --- a/packages/chat/src/components/Avatar/index.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import type { RecipeVariants } from '@vanilla-extract/recipes'; -import clsx from 'clsx'; - -import { ClassName } from '@/constants'; - -import { avatarStyles } from './styles.css'; - -type AvatarVariants = NonNullable>; - -export interface AvatarProps { - /** - * An image URL which will be rendered as the background. - */ - avatar: string; - - /** - * Pre-defined size variants. - * - * @default 'small' - */ - size?: AvatarVariants['size']; - - /** - * Class name to pass into the Avatar component. - */ - className?: string; - - /** - * Flag to remove the background from the Avatar. - */ - withoutBackground?: boolean; -} - -/** - * Displays an image in a circular frame. - * - * @see {@link https://voiceflow.github.io/react-chat/?path=/story/core-avatar--small} - */ -export const Avatar: React.FC = ({ avatar, size, className, withoutBackground = false }) => ( -
    -); diff --git a/packages/chat/src/components/Avatar/styles.css.ts b/packages/chat/src/components/Avatar/styles.css.ts deleted file mode 100644 index c6408f6392..0000000000 --- a/packages/chat/src/components/Avatar/styles.css.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { recipe } from '@vanilla-extract/recipes'; - -import { COLORS } from '@/styles/colors'; -import { SIZES } from '@/styles/sizes'; - -export const SMALL_AVATAR_SIZE = parseInt(SIZES.sm, 10); - -export const avatarStyles = recipe({ - base: { - flexShrink: 0, - borderRadius: SIZES.radius.round, - backgroundColor: COLORS.white, - backgroundPosition: 'center', - backgroundRepeat: 'no-repeat', - backgroundSize: 'cover', - }, - - variants: { - size: { - small: { - height: SMALL_AVATAR_SIZE, - width: SMALL_AVATAR_SIZE, - }, - - large: { - height: SIZES.xxl, - width: SIZES.xxl, - boxSizing: 'border-box', - boxShadow: - '0px 0px 0px 1px rgba(22, 26, 30, 0.06), 0px 1px 1px 0px rgba(22, 26, 30, 0.01), 0px 4px 8px -18px rgba(22, 26, 30, 0.04), 0px 8px 12px -18px rgba(22, 26, 30, 0.04), 0px 10px 16px -18px rgba(22, 26, 30, 0.08), 0px 12px 20px -18px rgba(22, 26, 30, 0.08), 0px 16px 28px -18px rgba(22, 26, 30, 0.12), 0px 20px 44px -18px rgba(22, 26, 30, 0.12)', - }, - }, - - withoutBackground: { - true: { - backgroundColor: 'transparent', - }, - }, - }, - - defaultVariants: { - size: 'small', - }, -}); diff --git a/packages/chat/src/components/Button/Button.story.tsx b/packages/chat/src/components/Button/Button.story.tsx deleted file mode 100644 index c8eca82294..0000000000 --- a/packages/chat/src/components/Button/Button.story.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; - -import { WithDefaultPalette } from '@/storybook/decorators'; - -import { Button } from '.'; -import { ButtonVariant } from './constants'; - -const TEST_ID = 'test-id'; - -type Story = StoryObj; -const meta: Meta = { - title: 'Core/Button', - component: Button, - argTypes: { - variant: { - options: Object.values(ButtonVariant), - control: { type: 'radio' }, - defaultValue: ButtonVariant.PRIMARY, - }, - }, - args: { - children: 'Button label', - round: false, - onClick: () => { - alert('Button clicked'); - }, - testID: TEST_ID, - }, - decorators: [WithDefaultPalette], -}; - -export default meta; - -export const Primary: Story = { - args: { - variant: ButtonVariant.PRIMARY, - }, -}; - -export const PrimaryLarge: Story = { - args: { - variant: ButtonVariant.PRIMARY, - large: 'true', - }, -}; - -export const Secondary: Story = { - args: { - variant: ButtonVariant.SECONDARY, - }, -}; - -export const SecondaryLarge: Story = { - args: { - variant: ButtonVariant.SECONDARY, - large: 'true', - }, -}; - -export const Inline: Story = { - args: { - variant: ButtonVariant.INLINE, - }, -}; - -export const InlineWrapped: Story = { - args: { - variant: ButtonVariant.INLINE, - children: 'Button label that is very long and should wrap. Button label that is very long and should wrap.', - }, - render: () => { - return ( -
    - -
    - ); - }, -}; diff --git a/packages/chat/src/components/Button/Button.test.tsx b/packages/chat/src/components/Button/Button.test.tsx deleted file mode 100644 index 48404a1aa0..0000000000 --- a/packages/chat/src/components/Button/Button.test.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { render, screen } from '@testing-library/react'; -import { describe, expect, it } from 'vitest'; - -import { Button } from '.'; - -describe('Button', () => { - it('should render a button with a label', async () => { - const label = 'Button Label'; - - render(); - - expect(screen.getByText(label)).toBeInTheDocument(); - expect(screen.getByRole('button')).toBeInTheDocument(); - }); -}); diff --git a/packages/chat/src/components/Button/ButtonIcon/ButtonIcon.css.ts b/packages/chat/src/components/Button/ButtonIcon/ButtonIcon.css.ts deleted file mode 100644 index 1a7698fa76..0000000000 --- a/packages/chat/src/components/Button/ButtonIcon/ButtonIcon.css.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { style } from '@vanilla-extract/css'; - -import { COLORS } from '@/styles/colors'; -import { transition } from '@/styles/transitions'; - -import { buttonStyles } from '../styles.css'; - -const PRIMARY_BUTTON = buttonStyles.classNames.variants.type.primary; -const SECONDARY_BUTTON = buttonStyles.classNames.variants.type.secondary; - -export const buttonIconStyles = style({ - transition: transition(['color']), - selectors: { - [`${PRIMARY_BUTTON} &`]: { - color: COLORS.ACCENT[50], - }, - [`${SECONDARY_BUTTON} &`]: { - color: COLORS.NEUTRAL_DARK[400], - }, - [`${SECONDARY_BUTTON}:active &`]: { - color: COLORS.NEUTRAL_DARK[800], - }, - }, -}); diff --git a/packages/chat/src/components/Button/ButtonIcon/index.tsx b/packages/chat/src/components/Button/ButtonIcon/index.tsx deleted file mode 100644 index 9c5de5a3c0..0000000000 --- a/packages/chat/src/components/Button/ButtonIcon/index.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import clsx from 'clsx'; - -import type { IconProps } from '../../Icon'; -import { Icon } from '../../Icon'; -import { buttonIconStyles } from './ButtonIcon.css'; - -interface IButtonIcon { - svg: IconProps['svg']; - className?: string; -} - -export const ButtonIcon: React.FC = ({ svg, className, ...props }) => { - return ; -}; diff --git a/packages/chat/src/components/Button/constants.ts b/packages/chat/src/components/Button/constants.ts deleted file mode 100644 index 415c32a361..0000000000 --- a/packages/chat/src/components/Button/constants.ts +++ /dev/null @@ -1,5 +0,0 @@ -export enum ButtonVariant { - PRIMARY = 'primary', - SECONDARY = 'secondary', - INLINE = 'inline', -} diff --git a/packages/chat/src/components/Button/index.tsx b/packages/chat/src/components/Button/index.tsx deleted file mode 100644 index 7b75e0bbb3..0000000000 --- a/packages/chat/src/components/Button/index.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import clsx from 'clsx'; -import { type ComponentPropsWithRef, forwardRef, type PropsWithChildren } from 'react'; - -import { ClassName } from '@/constants'; - -import { ButtonVariant } from './constants'; -import { buttonStyles } from './styles.css'; - -interface ButtonProps extends ComponentPropsWithRef<'button'> { - variant?: ButtonVariant; - large?: 'true'; - round?: boolean; - testID?: string; - className?: string; -} - -export const Button = forwardRef>(({ children, ...props }, ref) => { - const { variant: type, large, round } = props; - - return ( - - ); -}); diff --git a/packages/chat/src/components/Button/reset.css.ts b/packages/chat/src/components/Button/reset.css.ts deleted file mode 100644 index 6ae66b51dd..0000000000 --- a/packages/chat/src/components/Button/reset.css.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { style } from '@vanilla-extract/css'; - -export const buttonReset = style({ - border: 0, - padding: 0, - outline: 'transparent 0px', - ':focus': { - outline: 0, - }, - ':hover': { - cursor: 'pointer', - }, -}); diff --git a/packages/chat/src/components/Button/styles.css.ts b/packages/chat/src/components/Button/styles.css.ts deleted file mode 100644 index be0dfb3b59..0000000000 --- a/packages/chat/src/components/Button/styles.css.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { recipe } from '@vanilla-extract/recipes'; - -import { COLORS } from '@/styles/colors'; -import { THEME } from '@/styles/colors.css'; -import { hideTextOverflow } from '@/styles/font'; -import { SIZES } from '@/styles/sizes'; -import { transition } from '@/styles/transitions'; - -import { cardContainer } from '../Card/styles.css'; -import { buttonReset } from './reset.css'; - -export const buttonStyles = recipe({ - base: [ - buttonReset, - { - fontFamily: THEME.fontFamily, - fontSize: '14px', - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - padding: '0 14px', - transition: transition(['background-color', 'color']), - borderRadius: SIZES.radius.sm, - fontWeight: '400', - overflowWrap: 'anywhere', - ...hideTextOverflow(), - }, - ], - - variants: { - type: { - inline: { - borderRadius: SIZES.radius.xs, - color: THEME.colors[500], - backgroundColor: THEME.colors[50], - lineHeight: '20px', - padding: '7px 12px 6px 12px', - whiteSpace: 'normal', - wordBreak: 'break-word', - textAlign: 'left', - height: 'fit-content', - ':hover': { - color: THEME.colors[700], - backgroundColor: THEME.colors[100], - }, - ':active': { - color: THEME.colors[800], - backgroundColor: THEME.colors[200], - }, - }, - primary: { - paddingTop: 2, - color: COLORS.white, - backgroundColor: THEME.colors[500], - borderRadius: SIZES.radius.xxs, - height: SIZES.sm, - fontWeight: 600, - display: 'block', - width: '100%', - ':hover': { - backgroundColor: THEME.colors[600], - }, - ':active': { - backgroundColor: THEME.colors[700], - }, - }, - secondary: { - paddingTop: 2, - color: COLORS.NEUTRAL_DARK[500], - backgroundColor: COLORS.NEUTRAL_DARK[9008], - borderRadius: SIZES.radius.xxs, - height: SIZES.sm, - fontWeight: 600, - display: 'block', - width: '100%', - ':hover': { - color: COLORS.NEUTRAL_DARK[700], - backgroundColor: COLORS.NEUTRAL_DARK[90012], - }, - ':active': { - color: COLORS.NEUTRAL_DARK[900], - backgroundColor: COLORS.NEUTRAL_DARK[90020], - }, - - selectors: { - // Specific styles for buttons inside the Card component - [`.${cardContainer} &`]: { - display: 'block', - width: '100%', - }, - }, - }, - }, - - large: { - true: { - borderRadius: SIZES.radius.xs, - padding: '11px 16px 9px 16px', - height: 'auto', - display: 'flex', - alignItems: 'center', - lineHeight: '20px', - justifyContent: 'center', - }, - }, - - round: { - true: { - borderRadius: 9999, - }, - }, - }, -}); diff --git a/packages/chat/src/components/Buttons/SquareButton/SquareButton.component.tsx b/packages/chat/src/components/Buttons/SquareButton/SquareButton.component.tsx deleted file mode 100644 index bfd01935e0..0000000000 --- a/packages/chat/src/components/Buttons/SquareButton/SquareButton.component.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import clsx from 'clsx'; - -import * as SVGs from '@/assets/svg'; - -import { squareButtonStyles } from './styles/SquareButton.css'; -import * as SquareButtonTheme from './styles/SquareButtonTheme.css'; -import type { ISquareButton } from './types'; - -export const SquareButton: React.FC = ({ - size = 'small', - variant = 'light', - iconName, - isLoading, - isActive, - iconClassName, - className, - ...props -}) => { - const icon = SVGs[iconName]; - return ( - - ); -}; diff --git a/packages/chat/src/components/Buttons/SquareButton/index.ts b/packages/chat/src/components/Buttons/SquareButton/index.ts deleted file mode 100644 index 8eb169aef2..0000000000 --- a/packages/chat/src/components/Buttons/SquareButton/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { SquareButton as SquareButtonComponent } from './SquareButton.component'; -import * as css from './styles/SquareButton.css'; - -export type { ISquareButton } from './types'; - -export const SquareButton = Object.assign(SquareButtonComponent, { css }); diff --git a/packages/chat/src/components/Buttons/SquareButton/styles/SquareButton.css.ts b/packages/chat/src/components/Buttons/SquareButton/styles/SquareButton.css.ts deleted file mode 100644 index 402a4a5c39..0000000000 --- a/packages/chat/src/components/Buttons/SquareButton/styles/SquareButton.css.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { style, styleVariants } from '@vanilla-extract/css'; -import { recipe } from '@vanilla-extract/recipes'; - -import { transition } from '@/styles/transitions'; - -import * as SquareButtonTheme from './SquareButtonTheme.css'; - -const xLargeSize = '40px'; -const largeSize = '36px'; -const mediumSize = '32px'; -const smallSize = '24px'; - -const hoveringStyles = { - backgroundColor: SquareButtonTheme.contract.backgroundColor.hover, - color: SquareButtonTheme.contract.color.hover, -}; - -const activeStyles = { - backgroundColor: SquareButtonTheme.contract.backgroundColor.active, - color: SquareButtonTheme.contract.color.active, -}; - -const baseSquareButtonStyles = style({ - border: '0', - transition: transition(['background-color', 'color']), - cursor: 'pointer', - background: 'transparent', - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - color: SquareButtonTheme.contract.color.default, - - selectors: { - '&:enabled:hover:not(:active)': hoveringStyles, - - '&:enabled:active:hover': { - backgroundColor: SquareButtonTheme.contract.backgroundColor.active, - color: SquareButtonTheme.contract.color.active, - }, - - '&:enabled:active': { - backgroundColor: SquareButtonTheme.contract.backgroundColor.active, - color: SquareButtonTheme.contract.color.active, - }, - '&:disabled': { - backgroundColor: SquareButtonTheme.contract.backgroundColor.disabled, - color: SquareButtonTheme.contract.color.disabled, - cursor: 'not-allowed', - }, - }, -}); - -export const squareButtonSizeVariants = styleVariants({ - xlarge: { - height: xLargeSize, - width: xLargeSize, - borderRadius: '10px', - padding: '8px', - }, - large: { - height: largeSize, - width: largeSize, - borderRadius: '8px', - padding: '6px', - }, - medium: { - height: mediumSize, - width: mediumSize, - borderRadius: '7px', - padding: '4px', - }, - small: { - height: smallSize, - width: smallSize, - borderRadius: '6px', - padding: '0', - }, -}); - -export const squareButtonStyles = recipe({ - base: baseSquareButtonStyles, - variants: { - size: squareButtonSizeVariants, - isHovering: { - true: { - selectors: { - '&:enabled': hoveringStyles, - }, - }, - }, - isActive: { - true: { - selectors: { - '&:enabled': activeStyles, - '&:enabled:hover': activeStyles, - '&:enabled:hover:not(:active)': { - backgroundColor: SquareButtonTheme.contract.backgroundColor.active, - color: SquareButtonTheme.contract.color.active, - }, - }, - }, - }, - }, -}); - -export const loadingSpinnerStyles = style({ - // top: 1.5, - position: 'relative', -}); diff --git a/packages/chat/src/components/Buttons/SquareButton/styles/SquareButtonTheme.css.ts b/packages/chat/src/components/Buttons/SquareButton/styles/SquareButtonTheme.css.ts deleted file mode 100644 index bd517ee2a9..0000000000 --- a/packages/chat/src/components/Buttons/SquareButton/styles/SquareButtonTheme.css.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { createTheme } from '@vanilla-extract/css'; - -import { COLORS } from '@/styles/colors'; - -export const [light, contract] = createTheme({ - color: { - default: COLORS.NEUTRAL_DARK[100], - hover: COLORS.NEUTRAL_DARK[600], - active: COLORS.NEUTRAL_DARK[800], - disabled: COLORS.NEUTRAL_LIGHT[600], - }, - backgroundColor: { - hover: COLORS.NEUTRAL_DARK[900_6], - active: COLORS.NEUTRAL_DARK[900_12], - disabled: COLORS.white[100], - }, -}); - -export const dark = createTheme(contract, { - color: { - default: COLORS.NEUTRAL_LIGHT[600], - hover: COLORS.NEUTRAL_LIGHT[300], - active: COLORS.NEUTRAL_LIGHT[50], - disabled: COLORS.NEUTRAL_DARK[200], - }, - backgroundColor: { - hover: COLORS.NEUTRAL_DARK[400], - active: COLORS.NEUTRAL_DARK[200], - disabled: COLORS.NEUTRAL_DARK[600], - }, -}); diff --git a/packages/chat/src/components/Buttons/SquareButton/types.ts b/packages/chat/src/components/Buttons/SquareButton/types.ts deleted file mode 100644 index 061590efc4..0000000000 --- a/packages/chat/src/components/Buttons/SquareButton/types.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { SVG } from '@/components/Icon'; - -export interface ISquareButton { - iconName: SVG; - disabled?: boolean; - size: 'small' | 'medium' | 'large'; - isLoading?: boolean; - onClick: () => void; - iconClassName?: string; - isActive?: boolean; - className?: string; - variant?: 'light' | 'dark'; - ref?: React.Ref; -} diff --git a/packages/chat/src/components/Card/Card.story.tsx b/packages/chat/src/components/Card/Card.story.tsx deleted file mode 100644 index cc23394dcc..0000000000 --- a/packages/chat/src/components/Card/Card.story.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; - -import tiledBg from '../../__fixtures__/tiled-bg.png'; -import { Card } from '.'; - -type Story = StoryObj; - -const meta: Meta = { - title: 'Components/Card', - component: Card, - args: { - title: 'Title', - image: '', - description: 'Description.', - actions: [], - }, -}; -export default meta; - -export const Simple: Story = {}; - -export const OnlyTitle: Story = { - args: { - description: undefined, - }, -}; - -export const OnlyDescription: Story = { - args: { - title: undefined, - }, -}; - -export const WithImage: Story = { - args: { - image: tiledBg, - }, -}; - -export const Actionable: Story = { - args: { - ...WithImage.args, - actions: [ - { request: {} as any, name: 'Label' }, - { request: {} as any, name: 'Label' }, - { request: {} as any, name: 'Label' }, - ], - }, -}; - -export const OnlyActions: Story = { - args: { - title: undefined, - description: undefined, - actions: [ - { request: {} as any, name: 'Label' }, - { request: {} as any, name: 'Label' }, - { request: {} as any, name: 'Label' }, - ], - }, -}; - -export const WithLongLabels: Story = { - args: { - ...WithImage.args, - actions: [ - { request: {} as any, name: 'First Button with a very long long long wrapping label' }, - { request: {} as any, name: 'Second Button with a shorter text' }, - { request: {} as any, name: 'Third button, also with a shorter text' }, - ], - }, -}; - -export const WithLongTitle: Story = { - args: { - ...WithImage.args, - title: 'Long card title to wrap inside the card. Some more text to test the growth of card.', - actions: [{ request: {} as any, name: 'First Button' }], - }, -}; diff --git a/packages/chat/src/components/Card/index.tsx b/packages/chat/src/components/Card/index.tsx deleted file mode 100644 index d29d0fa932..0000000000 --- a/packages/chat/src/components/Card/index.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import clsx from 'clsx'; -import { useContext, useMemo } from 'react'; - -import { ClassName } from '@/constants'; -import { RuntimeStateAPIContext } from '@/contexts'; -import { fadeInAndUp } from '@/styles/animation-utils.css'; - -import { Button } from '../Button'; -import { ButtonVariant } from '../Button/constants'; -import { - buttonSpacer, - cardActions, - cardContainer, - cardContent, - cardDescription, - cardImage, - cardTitle, -} from './styles.css'; -import type { CardProps } from './types'; - -/** - * A titled card with content and optional controls. - * - * @see {@link https://voiceflow.github.io/react-chat/?path=/story/components-card--simple} - */ -export const Card: React.FC = ({ title, description, image, actions = [], className = '' }) => { - const runtime = useContext(RuntimeStateAPIContext); - - const buttons = useMemo(() => actions.filter(({ name }) => !!name), [actions]); - - return ( -
    - {!!image && } - {(title || description) && ( -
    - {title &&
    {title}
    } - {description &&
    {description}
    } -
    - )} - {!title && !description && !!buttons?.length &&
    } - {!!buttons?.length && ( -
    - {buttons.map(({ request, name }, index) => ( - - ))} -
    - )} -
    - ); -}; diff --git a/packages/chat/src/components/Card/styles.css.ts b/packages/chat/src/components/Card/styles.css.ts deleted file mode 100644 index bd8c5f2a18..0000000000 --- a/packages/chat/src/components/Card/styles.css.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { style } from '@vanilla-extract/css'; - -import { COLORS } from '@/styles/colors'; -import { THEME } from '@/styles/colors.css'; -import { SIZES } from '@/styles/sizes'; - -export const CARD_WIDTH = 256; - -export const cardContainer = style({ - display: 'inline-flex', - flexDirection: 'column', - width: CARD_WIDTH, - minWidth: CARD_WIDTH, - boxSizing: 'content-box', - overflow: 'hidden', - borderRadius: SIZES.radius.sm, - backgroundColor: COLORS.NEUTRAL_LIGHT[50], -}); - -export const cardImage = style({ - display: 'inline-block', - width: '100%', -}); - -export const cardContent = style({ - display: 'flex', - flexDirection: 'column', - gap: 4, - fontFamily: THEME.fontFamily, - lineHeight: '20px', - padding: '11px 16px 10px 16px', -}); - -export const cardActions = style({ - display: 'flex', - flexDirection: 'column', - padding: '0 16px 15px 16px', - gap: 4, - ':only-child': { - marginTop: 16, - }, -}); - -export const cardTitle = style({ - fontSize: '14px', - fontWeight: 600, - color: COLORS.NEUTRAL_DARK[900], - whiteSpace: 'normal', -}); - -export const cardDescription = style({ - fontSize: '14px', - fontWeight: 400, - color: COLORS.NEUTRAL_DARK[400], - whiteSpace: 'normal', -}); - -export const buttonSpacer = style({ - height: 16, - width: '100%', -}); diff --git a/packages/chat/src/components/Card/types.ts b/packages/chat/src/components/Card/types.ts deleted file mode 100644 index 9a0e88e080..0000000000 --- a/packages/chat/src/components/Card/types.ts +++ /dev/null @@ -1,40 +0,0 @@ -import type { RuntimeAction } from '@voiceflow/sdk-runtime'; - -export interface CardActionProps { - /** - * The label that will appear on the button. - */ - name: string; - - /** - * the request that will be sent by the runtime when the button is clicked. - */ - request: RuntimeAction; -} - -export interface CardProps { - /** - * The title of the card. - */ - title: string; - - /** - * Text content of the card. - */ - description: string; - - /** - * An image URL that will render at the top of the card if provided. - */ - image?: string | undefined | null; - - /** - * A list of actions that will appear as button controls at the bottom of the card. - */ - actions?: CardActionProps[] | undefined; - - /** - * Extra className to add to this component. - */ - className?: string; -} diff --git a/packages/chat/src/components/Carousel/Carousel.story.tsx b/packages/chat/src/components/Carousel/Carousel.story.tsx deleted file mode 100644 index 55948668fa..0000000000 --- a/packages/chat/src/components/Carousel/Carousel.story.tsx +++ /dev/null @@ -1,166 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; - -import { DEFAULT_WIDGET_SETTINGS } from '@/__fixtures__/mock-assistant'; -import { RuntimeProvider } from '@/contexts'; -import { MOCK_IMAGE } from '@/fixtures'; -import { DEFAULT_AVATAR, RenderMode } from '@/main'; -import { WithDefaultPalette } from '@/storybook/decorators'; -import { widgetContainer } from '@/views/ChatWidget/styles.css'; - -import { NewChat } from '../NewChat'; -import { MessageType } from '../SystemResponse/constants'; -import { SystemMessage } from '../SystemResponse/SystemMessage'; -import { Carousel } from '.'; - -const meta: Meta = { - component: Carousel, - title: 'Components/Carousel', - decorators: [ - (Story) => ( - -
    - Promise.resolve(), - placeholder: 'Message...', - }, - }} - isLoading={false} - hasEnded={false} - > - {Story()} - -
    -
    - ), - WithDefaultPalette, - ], -}; -type Story = StoryObj; - -export default meta; - -const IMAGE = MOCK_IMAGE; -const FIRST_CARD = { - title: 'First Card', - description: 'Lorem ipsum dolor sit amet', - image: IMAGE, - actions: [ - { request: {} as any, name: 'First Button' }, - { request: {} as any, name: 'Second Button' }, - { request: {} as any, name: 'Third Button' }, - ], -}; - -const MULTIPLE_CARDS = [ - FIRST_CARD, - { - title: 'Second Card', - description: - 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Exercitationem voluptas perspiciatis est quis dolores!', - image: IMAGE, - }, - { - title: 'Third Card with a long title that wraps', - description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit.', - actions: [ - { request: {} as any, name: 'Fourth Button with a long label that wraps' }, - { request: {} as any, name: 'Fifth Button' }, - ], - }, -]; - -export const Default: Story = { - render: () => ( - <> - - - - ), -}; - -export const SingleCard: Story = { - render: () => ( - <> - - - - ), -}; - -export const MultipleCards: Story = { - render: () => ( - <> - - - - ), -}; diff --git a/packages/chat/src/components/Carousel/CarouselButton.story.tsx b/packages/chat/src/components/Carousel/CarouselButton.story.tsx deleted file mode 100644 index 0466cc677a..0000000000 --- a/packages/chat/src/components/Carousel/CarouselButton.story.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; - -import { CarouselButton } from './CarouselButton'; - -type Story = StoryObj; -const meta: Meta = { - title: 'Core/Carousel Button', - component: CarouselButton, - args: { - visible: true, - }, -}; - -export default meta; - -export const Right: Story = { - args: { - direction: 'right', - }, -}; - -export const Left: Story = { - args: { - direction: 'left', - }, -}; diff --git a/packages/chat/src/components/Carousel/CarouselButton.tsx b/packages/chat/src/components/Carousel/CarouselButton.tsx deleted file mode 100644 index f938deb7c2..0000000000 --- a/packages/chat/src/components/Carousel/CarouselButton.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import clsx from 'clsx'; -import type { MouseEventHandler } from 'react'; -import { forwardRef } from 'react'; - -import { Icon } from '@/components/Icon'; - -import { buttonReset } from '../Button/reset.css'; -import { buttonWrapper, carouselButton, rotate180 } from './carouselButtonStyles.css'; - -export interface CarouselButtonProps { - /** - * If true then the button will be visible, otherwise hidden. - */ - visible: boolean; - - /** - * Which direction the button should point. - */ - direction: 'right' | 'left'; - - /** - * If true, it means the user doesn't want to show the agent's avatar - * so we need to move the buttons accordingly. - */ - noAvatar: boolean; - - /** - * A click handler for the button. - */ - onClick?: MouseEventHandler; -} - -/** - * A button used to scroll to the previous or next Card in a Carousel. - */ -export const CarouselButton = forwardRef( - ({ onClick, visible, direction, noAvatar }, ref) => ( - - ) -); diff --git a/packages/chat/src/components/Carousel/carouselButtonStyles.css.ts b/packages/chat/src/components/Carousel/carouselButtonStyles.css.ts deleted file mode 100644 index 1d0a936cb6..0000000000 --- a/packages/chat/src/components/Carousel/carouselButtonStyles.css.ts +++ /dev/null @@ -1,186 +0,0 @@ -import { keyframes, style } from '@vanilla-extract/css'; -import { recipe } from '@vanilla-extract/recipes'; - -import { COLORS } from '@/styles/colors'; -import { transition } from '@/styles/transitions'; - -import { SMALL_AVATAR_SIZE } from '../Avatar/styles.css'; -import { buttonStyles } from '../Button/styles.css'; -import { CARD_WIDTH } from '../Card/styles.css'; -import { MESSAGE_PADDING } from '../SystemResponse/styles.css'; -import { BUTTON_SIZE, carouselContainer } from './styles.css'; - -const xOrigin = 'translateX(0)'; -const fadeInFromLeft = keyframes({ - from: { - opacity: 0, - transform: 'translateX(-10px)', - }, - to: { - opacity: 1, - transform: xOrigin, - }, -}); - -const fadeOutToLeft = keyframes({ - from: { - opacity: 1, - transform: xOrigin, - }, - to: { - opacity: 0, - transform: 'translateX(-10px)', - }, -}); - -const fadeInFromRight = keyframes({ - from: { - opacity: 0, - transform: 'translateX(10px)', - }, - to: { - opacity: 1, - transform: xOrigin, - }, -}); - -const fadeOutToRight = keyframes({ - from: { - opacity: 1, - transform: xOrigin, - }, - to: { - opacity: 0, - transform: 'translateX(10px)', - }, -}); - -export const buttonWrapper = recipe({ - base: { - backgroundColor: 'transparent', - height: BUTTON_SIZE + 6, - width: BUTTON_SIZE + 6, - padding: 2, - position: 'absolute', - top: '64px', - }, - - variants: { - direction: { - right: { - [`.${carouselContainer} &`]: { - left: `${SMALL_AVATAR_SIZE + MESSAGE_PADDING + (CARD_WIDTH - BUTTON_SIZE / 2) - 2}px`, - }, - }, - left: { - [`.${carouselContainer} &`]: { - left: `${-(BUTTON_SIZE / 2) + SMALL_AVATAR_SIZE + MESSAGE_PADDING - 2}px`, - }, - }, - }, - visible: { - true: { - opacity: 1, - pointerEvents: 'auto', - }, - false: { - opacity: 0, - pointerEvents: 'none', - }, - }, - withAvatar: { - false: {}, - }, - }, - compoundVariants: [ - { - variants: { - visible: true, - direction: 'left', - }, - style: { - opacity: 1, - animation: `${fadeInFromLeft} .15s ease-in`, - }, - }, - { - variants: { - direction: 'left', - withAvatar: false, - }, - style: { - [`.${carouselContainer} &`]: { - left: `${-(BUTTON_SIZE / 2) - 2}px`, - }, - }, - }, - { - variants: { - visible: false, - direction: 'left', - }, - style: { - opacity: 0, - animation: `${fadeOutToLeft} .15s ease-in`, - }, - }, - - { - variants: { - visible: true, - direction: 'right', - }, - style: { - opacity: 1, - animation: `${fadeInFromRight} .15s ease-in`, - }, - }, - { - variants: { - direction: 'right', - withAvatar: false, - }, - style: { - [`.${carouselContainer} &`]: { - left: `${CARD_WIDTH - BUTTON_SIZE / 2 - 2}px`, - }, - }, - }, - { - variants: { - visible: false, - direction: 'right', - }, - style: { - opacity: 0, - animation: `${fadeOutToRight} .15s ease-in`, - }, - }, - ], -}); - -export const carouselButton = recipe({ - base: [ - buttonStyles({ round: true }), - { - borderRadius: '50%', - color: COLORS.NEUTRAL_DARK[100], - border: `solid 1px ${COLORS.NEUTRAL_LIGHT[100]}`, - backgroundColor: COLORS.white, - boxShadow: '0px 3px 4px 0px rgba(0, 0, 0, 0.02), 0px 8px 42px -16px rgba(0, 0, 0, 0.06)', - transition: transition(['opacity', 'color', 'transform']), - ':hover': { - color: COLORS.NEUTRAL_DARK[600], - transform: 'scale(1.15)', - }, - ':active': { - color: COLORS.NEUTRAL_DARK[800], - transform: 'scale(0.8)', - }, - }, - ], -}); - -export const rotate180 = style({ - transform: 'rotate(180deg)', -}); diff --git a/packages/chat/src/components/Carousel/hooks.ts b/packages/chat/src/components/Carousel/hooks.ts deleted file mode 100644 index c8184c85ab..0000000000 --- a/packages/chat/src/components/Carousel/hooks.ts +++ /dev/null @@ -1,57 +0,0 @@ -import type { RefObject } from 'react'; -import { useEffect, useState } from 'react'; - -import { CARD_WIDTH } from '../Card/styles.css'; -import type { CardProps } from '../Card/types'; -import { GUTTER_WIDTH } from './styles.css'; - -export const useScrollTo = - (ref: RefObject | undefined, getNextIndex: (el: T) => number) => - () => { - const el = ref?.current; - if (!el) return; - - const index = getNextIndex(el); - - el.scrollTo({ - left: index && index * (CARD_WIDTH + GUTTER_WIDTH), - behavior: 'smooth', - }); - }; - -export const useScrollObserver = (containerRef: RefObject | undefined, cards: CardProps[]) => { - const [showPreviousButton, setShowPreviousButton] = useState(false); - const [showNextButton, setShowNextButton] = useState(false); - const hasMultipleCards = cards.length > 1; - - useEffect(() => { - if (!hasMultipleCards) return; - - setShowNextButton(true); - }, []); - - useEffect(() => { - const containerEl = containerRef?.current; - if (!containerEl || !hasMultipleCards) return undefined; - - const trackWidth = (CARD_WIDTH + GUTTER_WIDTH) * cards.length - GUTTER_WIDTH; - - const handleScroll = (): void => { - const { scrollLeft } = containerEl; - - setShowPreviousButton(scrollLeft >= CARD_WIDTH); - setShowNextButton(scrollLeft <= trackWidth - (CARD_WIDTH + GUTTER_WIDTH)); - }; - - containerEl.addEventListener('scroll', handleScroll); - - return () => { - containerEl.removeEventListener('scroll', handleScroll); - }; - }, []); - - return { - showPreviousButton, - showNextButton, - }; -}; diff --git a/packages/chat/src/components/Carousel/index.tsx b/packages/chat/src/components/Carousel/index.tsx deleted file mode 100644 index 45a33eb94d..0000000000 --- a/packages/chat/src/components/Carousel/index.tsx +++ /dev/null @@ -1,90 +0,0 @@ -import clsx from 'clsx'; -import { useRef } from 'react'; - -import { ClassName } from '@/constants'; -import { fadeInAndUp } from '@/styles/animation-utils.css'; - -import { Avatar } from '../Avatar'; -import { Card } from '../Card'; -import { CARD_WIDTH } from '../Card/styles.css'; -import type { CardProps } from '../Card/types'; -import { FeedbackButton } from '../FeedbackButton'; -import { FeedbackButtonVariant, type IFeedbackButton } from '../FeedbackButton/FeedbackButton.interface'; -import { feedbackContainer, hide, responseAvatar } from '../SystemResponse/styles.css'; -import { CarouselButton } from './CarouselButton'; -import { useScrollObserver, useScrollTo } from './hooks'; -import { - avatarStyle, - cardsContainer, - cardsInnerContainer, - carouselContainer, - firstCard, - GUTTER_WIDTH, - lastCardSpacer, -} from './styles.css'; - -const CARD_WITH_GUTTER = CARD_WIDTH + GUTTER_WIDTH; - -export interface CarouselProps { - /** - * A list of props objects which will be passed to {@link Card} components. - */ - cards: CardProps[]; - - /** - * An image URL for an avatar to associate this message with. - */ - avatar?: string; - - /** - * If true, renders an avatar next to the message. - */ - withImage: boolean; - - /** - * If provided, will display {@link FeedbackButton} component. - * @default false - */ - feedback?: IFeedbackButton | undefined; -} - -/** - * A carousel of {@link Card} components that can be scrolled natively or with buttons. - * - * @see {@link https://voiceflow.github.io/react-chat/?path=/story/components-carousel--single-card} - */ -export const Carousel: React.FC = ({ cards, avatar, withImage, feedback }) => { - const scrollContainerRef = useRef(null); - const { showPreviousButton, showNextButton } = useScrollObserver(scrollContainerRef, cards); - const scrollToPrevious = useScrollTo(scrollContainerRef, (el) => Math.ceil(el.scrollLeft / CARD_WITH_GUTTER) - 1); - const scrollToNext = useScrollTo(scrollContainerRef, (el) => Math.floor(el.scrollLeft / CARD_WITH_GUTTER) + 1); - - return ( -
    -
    -
    - {avatar && } - {cards.map((card, i) => ( -
    - -
    - ))} -
    -
    - {feedback && ( -
    - -
    - )} -
    - - -
    - ); -}; diff --git a/packages/chat/src/components/Carousel/styles.css.ts b/packages/chat/src/components/Carousel/styles.css.ts deleted file mode 100644 index 55fd7e1205..0000000000 --- a/packages/chat/src/components/Carousel/styles.css.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { style } from '@vanilla-extract/css'; - -import { DIALOG_PADDING } from '../NewChat/NewChat.css'; - -export const BUTTON_SIZE = 42; -export const GUTTER_WIDTH = 10; - -export const avatarStyle = style({ - alignSelf: 'flex-end', -}); - -export const cardsContainer = style({ - position: 'relative', - whiteSpace: 'nowrap', - overflow: 'hidden', - marginLeft: `-${DIALOG_PADDING}px`, - paddingLeft: `${DIALOG_PADDING}px`, - marginRight: `-${DIALOG_PADDING}px`, - paddingRight: `${DIALOG_PADDING}px`, -}); - -export const firstCard = style({ - marginLeft: 2, -}); - -export const cardsInnerContainer = style({ - display: 'flex', - alignItems: 'start', - gap: `${GUTTER_WIDTH}px`, -}); - -export const carouselContainer = style({ - position: 'relative', - width: '100%', - display: 'flex', -}); - -export const lastCardSpacer = style({ - display: 'inline-flex', - height: 1, - // This is larger than the 'space' at the end, but is ok - // since we need it to be good for popover mode as well. - width: 600, - minWidth: 600, -}); diff --git a/packages/chat/src/components/ColorTheme/ColorTheme.component.tsx b/packages/chat/src/components/ColorTheme/ColorTheme.component.tsx deleted file mode 100644 index 019dee283d..0000000000 --- a/packages/chat/src/components/ColorTheme/ColorTheme.component.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { createPalette } from '@/styles/colors'; - -import { container, derivativeColor, derivativeColorContainer, primaryColorBlock } from './ColorTheme.css'; - -export const ColorTheme = ({ color }: { color: string }) => { - const palette = createPalette(color); - return ( -
    -
    -

    500

    - {color} -
    -
    - {Object.entries(palette).map(([key, value]) => ( -
    -

    {key}

    - {value} -
    - ))} -
    -
    - ); -}; diff --git a/packages/chat/src/components/ColorTheme/ColorTheme.css.ts b/packages/chat/src/components/ColorTheme/ColorTheme.css.ts deleted file mode 100644 index 5b0c6a80cf..0000000000 --- a/packages/chat/src/components/ColorTheme/ColorTheme.css.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { style } from '@vanilla-extract/css'; - -export const container = style({ - display: 'inline-flex', - flexDirection: 'row', - gap: '1rem', -}); - -export const primaryColorBlock = style({ - width: '250px', - height: '250px', - color: 'white', - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - flexDirection: 'column', - gap: '1rem', -}); - -export const derivativeColorContainer = style({ - display: 'flex', - gap: '1rem', -}); - -export const derivativeColor = style({ - display: 'flex', - gap: '1rem', - flexDirection: 'column', - color: 'white', - padding: '1rem', - justifyContent: 'center', - alignItems: 'center', -}); diff --git a/packages/chat/src/components/ColorTheme/ColorTheme.story.tsx b/packages/chat/src/components/ColorTheme/ColorTheme.story.tsx deleted file mode 100644 index 2758db25df..0000000000 --- a/packages/chat/src/components/ColorTheme/ColorTheme.story.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; - -import { COLOR_FIXTURE } from '@/__fixtures__/colors'; - -import { ColorTheme } from './ColorTheme.component'; - -type Story = StoryObj; -const meta: Meta = { - title: 'Theme/Colors', - component: ColorTheme, -}; - -export default meta; - -export const Primary: Story = { - render: () => { - return ( -
    - {COLOR_FIXTURE.map((color, index) => ( -
    - -
    - ))} -
    - ); - }, -}; diff --git a/packages/chat/src/components/DebugMessage/index.tsx b/packages/chat/src/components/DebugMessage/index.tsx deleted file mode 100644 index a5d2deaa90..0000000000 --- a/packages/chat/src/components/DebugMessage/index.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import clsx from 'clsx'; - -import { topCaret as TopCaret } from '@/assets/svg'; - -import { caretStyles, debugContainerStyles } from './styles.css'; - -export interface DebugMessageProps extends React.PropsWithChildren { - /** - * The end of the message where the arrow is rendered. - * - * @default 'left' - */ - orientation?: 'left' | 'right'; -} - -export const DebugMessage: React.FC = ({ children, orientation = 'left' }) => { - return ( -
    - - {children} -
    - ); -}; diff --git a/packages/chat/src/components/DebugMessage/styled.css.ts b/packages/chat/src/components/DebugMessage/styled.css.ts deleted file mode 100644 index 06b252bcad..0000000000 --- a/packages/chat/src/components/DebugMessage/styled.css.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { style } from '@vanilla-extract/css'; -import { recipe } from '@vanilla-extract/recipes'; - -import { COLORS } from '@/styles/colors'; - -const CARET_HEIGHT = 6; -const OFFSET = 32; - -export const debugContainerStyles = style({ - position: 'relative', - marginTop: CARET_HEIGHT, - border: '1px solid #dfdfdf', - padding: '10px 14px', - backgroundColor: COLORS.white, - boxShadow: '0 1px 2px rgba(0,0,0,0.02)', -}); - -export const caretStyles = recipe({ - base: { - position: 'absolute', - top: -CARET_HEIGHT, - }, - variants: { - orientation: { - left: { - left: OFFSET, - right: 'unset', - }, - right: { - right: OFFSET, - left: 'unset', - }, - }, - }, - defaultVariants: { - orientation: 'left', - }, -}); diff --git a/packages/chat/src/components/DebugMessage/styles.css.ts b/packages/chat/src/components/DebugMessage/styles.css.ts deleted file mode 100644 index 06b252bcad..0000000000 --- a/packages/chat/src/components/DebugMessage/styles.css.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { style } from '@vanilla-extract/css'; -import { recipe } from '@vanilla-extract/recipes'; - -import { COLORS } from '@/styles/colors'; - -const CARET_HEIGHT = 6; -const OFFSET = 32; - -export const debugContainerStyles = style({ - position: 'relative', - marginTop: CARET_HEIGHT, - border: '1px solid #dfdfdf', - padding: '10px 14px', - backgroundColor: COLORS.white, - boxShadow: '0 1px 2px rgba(0,0,0,0.02)', -}); - -export const caretStyles = recipe({ - base: { - position: 'absolute', - top: -CARET_HEIGHT, - }, - variants: { - orientation: { - left: { - left: OFFSET, - right: 'unset', - }, - right: { - right: OFFSET, - left: 'unset', - }, - }, - }, - defaultVariants: { - orientation: 'left', - }, -}); diff --git a/packages/chat/src/components/FeedbackButton/CopyButtonIcon.component.tsx b/packages/chat/src/components/FeedbackButton/CopyButtonIcon.component.tsx deleted file mode 100644 index ee11ef201d..0000000000 --- a/packages/chat/src/components/FeedbackButton/CopyButtonIcon.component.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import type { SVGProps } from 'react'; -export const CopyButtonIcon = (props: SVGProps) => ( - - - -); diff --git a/packages/chat/src/components/FeedbackButton/FeedbackButton.css.ts b/packages/chat/src/components/FeedbackButton/FeedbackButton.css.ts deleted file mode 100644 index 419ee305dc..0000000000 --- a/packages/chat/src/components/FeedbackButton/FeedbackButton.css.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { createVar, style } from '@vanilla-extract/css'; -import { recipe } from '@vanilla-extract/recipes'; - -import { SHADOWS } from '@/styles/box-shadows'; -import { COLORS } from '@/styles/colors'; -import { THEME } from '@/styles/colors.css'; -import { transition } from '@/styles/transitions'; - -export const activeBackground = createVar(); -export const activeIconColor = createVar(); - -export const feedbackContainer = recipe({ - base: { - display: 'flex', - flexDirection: 'row', - gap: '4px', - borderRadius: '7px', - padding: '2px', - boxShadow: SHADOWS.Z1_Light, - width: 'fit-content', - }, - variants: { - previousResponse: { - true: { - backgroundColor: COLORS.white, - }, - false: { - backgroundColor: 'transparent', - boxShadow: 'none', - gap: '6px', - }, - }, - }, -}); - -export const feedbackButtonStyles = recipe({ - base: { - borderRadius: '5px', - height: '24px', - width: '24px', - cursor: 'pointer', - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - border: 'none', - position: 'relative', - backgroundColor: 'transparent', - transition: transition(['background-color', 'color']), - color: COLORS.NEUTRAL_DARK[100], - outline: 'transparent 0px', - selectors: { - '&:hover': { - backgroundColor: COLORS.NEUTRAL_DARK[9006], - color: COLORS.NEUTRAL_DARK[600], - }, - '&:active': { - backgroundColor: COLORS.NEUTRAL_DARK[90012], - color: COLORS.NEUTRAL_DARK[800], - }, - }, - }, - variants: { - isSelected: { - true: { - color: THEME.colors[500], - selectors: { - '&:hover': { - backgroundColor: 'transparent', - color: THEME.colors[500], - }, - '&:active': { - backgroundColor: 'transparent', - color: THEME.colors[500], - }, - }, - }, - }, - isCopied: { - true: { - selectors: { - '&:hover': { - backgroundColor: 'transparent', - color: COLORS.NEUTRAL_DARK[100], - }, - }, - }, - }, - }, -}); - -export const iconStyle = style({ - flex: 'none', -}); - -export const checkedIcon = style({ - color: THEME.colors[500], -}); - -export const copyButtonStyles = recipe({ - base: { - position: 'absolute', - top: '0', - right: '0', - transition: transition(['opacity']), - }, - variants: { - isVisible: { - true: { - opacity: 1, - }, - false: { - opacity: 0, - }, - }, - }, -}); diff --git a/packages/chat/src/components/FeedbackButton/FeedbackButton.interface.ts b/packages/chat/src/components/FeedbackButton/FeedbackButton.interface.ts deleted file mode 100644 index 582a9d77a1..0000000000 --- a/packages/chat/src/components/FeedbackButton/FeedbackButton.interface.ts +++ /dev/null @@ -1,19 +0,0 @@ -import type { FeedbackName } from '@/contexts/RuntimeContext/useRuntimeAPI'; - -/** - * Feedback buttons look different if they're on the last response from the agent - * or if they're on a previous response from the agent, so we need this to - * distinguish between them. - */ -export enum FeedbackButtonVariant { - LAST_RESPONSE = 'last_response', - PREVIOUS_RESPONSE = 'previous_response', -} - -export interface IFeedbackButton { - onClick: (feedback: FeedbackName) => void; - variant?: FeedbackButtonVariant; - active?: boolean; - textContent?: string; - testID?: string; -} diff --git a/packages/chat/src/components/FeedbackButton/FeedbackButton.story.tsx b/packages/chat/src/components/FeedbackButton/FeedbackButton.story.tsx deleted file mode 100644 index 342e30b411..0000000000 --- a/packages/chat/src/components/FeedbackButton/FeedbackButton.story.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; -import { assignInlineVars } from '@vanilla-extract/dynamic'; - -import { createPalette } from '@/styles/colors'; -import { THEME } from '@/styles/colors.css'; -import { FAMILY } from '@/styles/font'; - -import { FeedbackButton } from '.'; -import { FeedbackButtonVariant } from './FeedbackButton.interface'; - -const meta: Meta = { - title: 'Button/FeedbackButton', - component: FeedbackButton, - args: {}, -}; - -export default meta; -type Story = StoryObj; - -export const PreviousResponse: Story = { - render: () => ( -
    - null} variant={FeedbackButtonVariant.PREVIOUS_RESPONSE} /> -
    - ), -}; - -export const LastResponse: Story = { - render: () => ( -
    - null} variant={FeedbackButtonVariant.LAST_RESPONSE} /> -
    - ), -}; diff --git a/packages/chat/src/components/FeedbackButton/FeedbackButton.test.tsx b/packages/chat/src/components/FeedbackButton/FeedbackButton.test.tsx deleted file mode 100644 index 6fdc90e996..0000000000 --- a/packages/chat/src/components/FeedbackButton/FeedbackButton.test.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { render, screen } from '@testing-library/react'; -import { describe, expect, it, vi } from 'vitest'; - -import { FeedbackButton } from '.'; - -describe('Button', () => { - it('onClick callback fires properly', async () => { - const onClick = vi.fn(); - const testID = 'button'; - render(); - screen.getByTestId(`${testID}--positive`).click(); - - expect(onClick).toHaveBeenCalledTimes(1); - }); -}); diff --git a/packages/chat/src/components/FeedbackButton/ThumbsDownIcon.component.tsx b/packages/chat/src/components/FeedbackButton/ThumbsDownIcon.component.tsx deleted file mode 100644 index 0fdf34943f..0000000000 --- a/packages/chat/src/components/FeedbackButton/ThumbsDownIcon.component.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import type { SVGProps } from 'react'; -export const ThumbsDownIcon = (props: SVGProps) => ( - - - -); diff --git a/packages/chat/src/components/FeedbackButton/ThumbsUpIcon.component.tsx b/packages/chat/src/components/FeedbackButton/ThumbsUpIcon.component.tsx deleted file mode 100644 index ae5ff329c1..0000000000 --- a/packages/chat/src/components/FeedbackButton/ThumbsUpIcon.component.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import type { SVGProps } from 'react'; -export const ThumbsUpIcon = (props: SVGProps) => ( - - - -); diff --git a/packages/chat/src/components/FeedbackButton/index.tsx b/packages/chat/src/components/FeedbackButton/index.tsx deleted file mode 100644 index d34d7fc58b..0000000000 --- a/packages/chat/src/components/FeedbackButton/index.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import { assignInlineVars } from '@vanilla-extract/dynamic'; -import clsx from 'clsx'; -import { useEffect, useState } from 'react'; - -import { ClassName } from '@/constants'; -import { FeedbackName } from '@/contexts/RuntimeContext/useRuntimeAPI'; -import { THEME } from '@/styles/colors.css'; - -import { Icon } from '../Icon'; -import { CopyButtonIcon } from './CopyButtonIcon.component'; -import { - activeBackground, - activeIconColor, - checkedIcon, - copyButtonStyles, - feedbackButtonStyles, - feedbackContainer, - iconStyle, -} from './FeedbackButton.css'; -import { FeedbackButtonVariant, type IFeedbackButton } from './FeedbackButton.interface'; -import { ThumbsDownIcon } from './ThumbsDownIcon.component'; -import { ThumbsUpIcon } from './ThumbsUpIcon.component'; - -export const FeedbackButton: React.FC = ({ variant, onClick, testID, textContent }) => { - const buttonActiveColor = THEME.colors[500]; - const iconActiveColor = THEME.colors[50]; - const [hasCopied, setHasCopied] = useState(false); - const [isPositiveOrNegativeSelected, setIsPositiveOrNegativeSelected] = useState(null); - - const onCopyClick = () => { - setHasCopied(true); - if (!textContent) return; - navigator.clipboard.writeText(textContent); - }; - - const handleOnClick = (type: FeedbackName) => { - onClick(type); - setIsPositiveOrNegativeSelected(type); - }; - - // eslint-disable-next-line consistent-return - useEffect(() => { - if (hasCopied) { - const timeout = setTimeout(() => { - setHasCopied(false); - }, 1000); - return () => clearTimeout(timeout); - } - }, [hasCopied]); - - return ( -
    - {textContent && ( - - )} - - -
    - ); -}; diff --git a/packages/chat/src/components/Header/Header.story.tsx b/packages/chat/src/components/Header/Header.story.tsx deleted file mode 100644 index aba3a92fc4..0000000000 --- a/packages/chat/src/components/Header/Header.story.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; - -import EMPTY_IMAGE from '@/__fixtures__/empty-image.png'; -import { WithDefaultPalette } from '@/storybook/decorators'; - -import { Header } from '.'; - -const meta: Meta = { - title: 'Components/Chat/Header', - component: Header, - args: { - title: 'Agent name', - image: EMPTY_IMAGE, - actions: [], - showImage: true, - }, - render: (args) =>
    , - decorators: [WithDefaultPalette], -}; - -export default meta; - -type Story = StoryObj; - -export const Base: Story = {}; - -export const Actionable: Story = { - args: { - actions: [{ svg: 'volume' }, { svg: 'reset' }], - }, -}; - -export const Muted: Story = { - args: { - actions: [{ svg: 'mute' }, { svg: 'reset' }], - }, -}; - -export const Themed: Story = { - args: { - actions: [{ svg: 'volume' }, { svg: 'reset' }], - }, - decorators: [WithDefaultPalette], -}; - -export const NoImage: Story = { - args: { - actions: [{ svg: 'volume' }, { svg: 'reset' }], - image: undefined, - }, - decorators: [WithDefaultPalette], -}; - -export const Mobile: Story = { - args: { - actions: [{ svg: 'volume' }, { svg: 'reset' }, { svg: 'close' }], - }, - decorators: [WithDefaultPalette], -}; diff --git a/packages/chat/src/components/Header/index.tsx b/packages/chat/src/components/Header/index.tsx deleted file mode 100644 index f4692b0212..0000000000 --- a/packages/chat/src/components/Header/index.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import clsx from 'clsx'; - -import { Avatar } from '@/components/Avatar'; -import { ClassName } from '@/constants'; -import { DEFAULT_CHAT_AVATAR } from '@/dtos/AssistantOptions.dto'; - -import { Button } from '../Button'; -import { Icon, type IconProps } from '../Icon'; -import { headerActionButton, headerActions, headerContainer, headerInnerContainer, headerTitle } from './styles.css'; - -export interface HeaderActionProps { - /** - * The name of the SVG icon that will be used for the button or a React component. - * - * @see {@link https://github.com/voiceflow/react-chat/tree/master/packages/react-chat/src/assets/svg the available icons} - */ - svg: IconProps['svg']; - - /** - * A callback that is executed when the button is clicked. - */ - onClick?: React.MouseEventHandler | undefined; -} - -export interface HeaderProps { - /** - * The name of your assistant or title of the conversation. - */ - title: string; - - /** - * Should we show the image in the header. - */ - showImage: boolean; - - /** - * An image URL that will be rendered as a small {@link Avatar}. - */ - image?: string; - - /** - * A list of actions that will appear as icon buttons. - */ - actions?: HeaderActionProps[]; -} - -/** - * Header for the chat widget with image, title and controls. - * - * @see {@link https://voiceflow.github.io/react-chat/?path=/docs/components-chat-header--simple} - */ -export const Header: React.FC = ({ title, showImage, image, actions = [] }) => { - return ( -
    - {showImage && } -
    -
    {title}
    -
    - {actions.map(({ svg, onClick }, index) => ( - - ))} -
    -
    -
    - ); -}; diff --git a/packages/chat/src/components/Header/styles.css.ts b/packages/chat/src/components/Header/styles.css.ts deleted file mode 100644 index f62a4ca683..0000000000 --- a/packages/chat/src/components/Header/styles.css.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { keyframes, style } from '@vanilla-extract/css'; -import { recipe } from '@vanilla-extract/recipes'; - -import { timingFunction } from '@/styles/animations'; -import { COLORS } from '@/styles/colors'; -import { THEME } from '@/styles/colors.css'; -import { hideTextOverflow } from '@/styles/font'; -import { SIZES } from '@/styles/sizes'; -import { transition } from '@/styles/transitions'; -import { chatIsClosed, chatIsOpen } from '@/views/ChatWidget/styles.css'; - -import { buttonReset } from '../Button/reset.css'; -export const fadeIn = keyframes({ - from: { - opacity: 0, - transform: 'translateY(-10px)', - }, - to: { - opacity: 1, - transform: 'translateY(0)', - }, -}); - -export const fadeOut = keyframes({ - from: { - opacity: 1, - transform: 'translateY(0)', - }, - to: { - opacity: 0, - transform: 'translateY(-10px)', - }, -}); - -export const headerContainer = style({ - display: 'flex', - alignItems: 'center', - backgroundColor: THEME.colors[500], - padding: '12px 16px 12px 20px', - height: parseInt(SIZES.sm, 10) + 24, // Add the top and bottom padding - opacity: 0, - selectors: { - [`.${chatIsOpen} &`]: { - animation: `${fadeIn} .4s ${timingFunction.gentle} forwards`, - animationDelay: '.2s', - }, - [`.${chatIsClosed} &`]: { - animation: `${fadeOut} .3s ${timingFunction.gentle} forwards`, - }, - }, -}); - -export const headerInnerContainer = style({ - display: 'flex', - alignItems: 'center', - flexGrow: 1, - justifyContent: 'space-between', - minWidth: 0, -}); - -export const headerTitle = recipe({ - base: { - fontFamily: THEME.fontFamily, - fontSize: 16, - color: COLORS.white, - fontWeight: 700, - lineHeight: '23px', - margin: '0 12px', - minWidth: 0, - ...hideTextOverflow(), - }, - - variants: { - hasAvatar: { - false: { - marginLeft: 0, - }, - }, - }, -}); - -export const headerActions = style({ - display: 'flex', - gap: '6px', - flexShrink: 0, - minWidth: 0, -}); - -export const headerActionButton = recipe({ - base: [ - buttonReset, - { - justifyContent: 'center', - alignItems: 'center', - width: 32, - height: 32, - borderRadius: SIZES.radius.xs, - padding: 4, - color: '#ffffffcc', - backgroundColor: 'transparent', - transition: transition(['color', 'background-color']), - ':hover': { - color: COLORS.white, - backgroundColor: '#ffffff29', - }, - ':active': { - color: COLORS.white, - backgroundColor: '#ffffff52', - }, - }, - ], -}); diff --git a/packages/chat/src/components/Icon/Icon.story.tsx b/packages/chat/src/components/Icon/Icon.story.tsx deleted file mode 100644 index 1af0da380a..0000000000 --- a/packages/chat/src/components/Icon/Icon.story.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; - -import * as SVGs from '@/assets/svg'; - -import { Icon } from '.'; - -type Story = StoryObj; - -const meta: Meta = { - title: 'Core/Icon', - component: Icon, - argTypes: { - svg: { - options: Object.keys(SVGs).filter((svg) => svg !== 'topCaret'), - control: { type: 'radio' }, - }, - }, - parameters: { - controls: { include: ['svg'] }, - }, -}; - -export default meta; -export const Default: Story = { - args: { - svg: 'close', - }, -}; diff --git a/packages/chat/src/components/Icon/index.tsx b/packages/chat/src/components/Icon/index.tsx deleted file mode 100644 index ed76115c2c..0000000000 --- a/packages/chat/src/components/Icon/index.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import clsx from 'clsx'; - -import * as SVGs from '@/assets/svg'; -import { ClassName } from '@/constants'; - -import { iconClassName } from './styles.css'; - -export type SVG = keyof typeof SVGs; - -export interface IconProps extends React.ComponentPropsWithoutRef<'div'> { - /** - * The name of the SVG icon to be rendered or a React component. - * - * @see {@link https://github.com/voiceflow/react-chat/tree/master/packages/react-chat/src/assets/svg the available icons} - */ - svg: SVG | React.ComponentType; - - className?: string; -} - -/** - * A component for rendering a pre-packaged SVG icon. - * - * @see {@link https://voiceflow.github.io/react-chat/?path=/story/core-icon--default} - */ -export const Icon: React.FC = ({ svg, className, ...props }) => { - const SVG = typeof svg === 'string' ? SVGs[svg] : svg; - - return ( -
    - -
    - ); -}; diff --git a/packages/chat/src/components/Icon/styles.css.ts b/packages/chat/src/components/Icon/styles.css.ts deleted file mode 100644 index 563e2e859e..0000000000 --- a/packages/chat/src/components/Icon/styles.css.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { style } from '@vanilla-extract/css'; - -export const iconClassName = style({ - display: 'flex', -}); diff --git a/packages/chat/src/components/Image/Image.story.tsx b/packages/chat/src/components/Image/Image.story.tsx deleted file mode 100644 index 0367345674..0000000000 --- a/packages/chat/src/components/Image/Image.story.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; - -import { MOCK_IMAGE } from '@/fixtures'; - -import { Image } from '.'; - -type Story = StoryObj; - -const meta: Meta = { - title: 'Core/Image', - component: Image, - args: { - image: MOCK_IMAGE, - isRounded: true, - }, -}; - -export default meta; - -export const RoundCorners: Story = {}; - -export const StraightCorners: Story = { - args: { - isRounded: false, - }, -}; diff --git a/packages/chat/src/components/Image/index.tsx b/packages/chat/src/components/Image/index.tsx deleted file mode 100644 index 50657c6f92..0000000000 --- a/packages/chat/src/components/Image/index.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import clsx from 'clsx'; - -import { ClassName } from '@/constants'; -import type { RenderMode } from '@/main'; - -import { imageStyles } from './styles.css'; - -export interface DefaultImageProps { - /** - * A URL for the image to render. - */ - image: string | null; - - /** - * The mode which we're rendering the chat widget. - * This effects the way we show images. - */ - mode?: RenderMode; - - /** - * If true, rounds the corners of the image border. - * - * @default true - */ - isRounded?: boolean; -} - -/** - * An image rendered as the `src` of an ``. - * - * @see {@link https://voiceflow.github.io/react-chat/?path=/story/core-image--round-corners} - */ -export const Image: React.FC = ({ image, ...props }) => ( - -); diff --git a/packages/chat/src/components/Image/styles.css.ts b/packages/chat/src/components/Image/styles.css.ts deleted file mode 100644 index 75aa4dfe7c..0000000000 --- a/packages/chat/src/components/Image/styles.css.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { recipe } from '@vanilla-extract/recipes'; - -import { SIZES } from '@/styles/sizes'; - -export const imageStyles = recipe({ - base: [], - variants: { - rounded: { - true: { - borderRadius: SIZES.radius.sm, - }, - }, - mode: { - overlay: { - width: 248, - }, - embedded: { - width: '100%', - maxWidth: 512, - }, - }, - }, - defaultVariants: { - rounded: true, - mode: 'overlay', - }, -}); diff --git a/packages/chat/src/components/Launcher/ChevronIcon.tsx b/packages/chat/src/components/Launcher/ChevronIcon.tsx deleted file mode 100644 index ceeb073618..0000000000 --- a/packages/chat/src/components/Launcher/ChevronIcon.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import type { SVGProps } from 'react'; -export const ChevronIcon = (props: SVGProps) => ( - - - -); diff --git a/packages/chat/src/components/Launcher/Launcher.story.tsx b/packages/chat/src/components/Launcher/Launcher.story.tsx deleted file mode 100644 index 9cf30667ef..0000000000 --- a/packages/chat/src/components/Launcher/Launcher.story.tsx +++ /dev/null @@ -1,89 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; -import { useState } from 'react'; - -import { WithDefaultPalette } from '@/storybook/decorators'; - -import defaultLauncherImage from '../../__fixtures__/default-launcher-image.png'; -import tiledBg from '../../__fixtures__/tiled-bg.png'; -import { Launcher } from '.'; - -type Story = StoryObj; - -const meta: Meta = { - title: 'Components/Launcher', - component: Launcher, - parameters: { - controls: { hideNoControlsWarning: true }, - }, - decorators: [WithDefaultPalette], -}; - -export default meta; - -const CollapsableLauncher = (props: any) => { - const [isOpen, setIsOpen] = useState(false); - const [counter, setCounter] = useState(0); - const [isDisabled, setIsDisabled] = useState(false); - - return ( - { - setIsOpen((prev) => !prev); - - setCounter((prev) => prev + 1); - - if (counter % 3 === 0) return; - - setIsDisabled(!isDisabled); - }} - /> - ); -}; - -export const Base: Story = { - render: () => , -}; - -export const WithDefaultImage: Story = { - render: () => , -}; - -export const WithCustomIcon: Story = { render: () => }; - -export const Disabled: Story = { render: () => }; - -export const Loading: Story = { render: () => }; - -export const DisabledAndLoading: Story = { - render: () => { - return ; - }, -}; - -export const WithLabel: Story = { - render: () => ( -
    - -
    - ), -}; - -export const WithLabelAndIcon: Story = { - render: () => ( -
    - -
    - ), -}; - -export const WithLabelOnRight: Story = { - render: () => ( -
    - -
    - ), -}; diff --git a/packages/chat/src/components/Launcher/LauncherWithLabel/index.tsx b/packages/chat/src/components/Launcher/LauncherWithLabel/index.tsx deleted file mode 100644 index b3705591cb..0000000000 --- a/packages/chat/src/components/Launcher/LauncherWithLabel/index.tsx +++ /dev/null @@ -1,116 +0,0 @@ -import clsx from 'clsx'; -import type { MouseEventHandler } from 'react'; -import React from 'react'; - -import { Button } from '@/components/Button'; -import { ClassName } from '@/constants'; - -import { LoadingSpinner } from '../../LoadingSpinner/LoadingSpinner'; -import { ChevronIcon } from '../ChevronIcon'; -import { DEFAULT_ICON } from '../constant'; -import { PhoneIcon } from '../PhoneIcon'; -import { - closeChevron, - containerLoaderStyles, - imageIconStyle, - imageIconWrapper, - launcherLabelStyles, - launcherStyles, - loadingSpinnerStyles, -} from './styles.css'; - -export interface LauncherProps { - /** - * An image URL to be rendered as the icon. - * Defaults to the "launch" SVG if not provided. - */ - image?: string | undefined; - - /** - * A label that will be displayed on the launcher button. - * If empty or undefined then the user will only see the icon. - */ - label?: string | undefined; - - /** - * Is the Chat widget opened ? - * If it's opened then we only show the close icon. - */ - isOpen: boolean; - - /** - * A callback that will be executed when the button is clicked. - */ - onClick: MouseEventHandler; - - /** - * Flag to use the default phone icon. - */ - isVoice?: boolean; - - /** - * Flag to use image. - */ - withIcon?: boolean; - - /** - * Flag to show loader in the launcher. - */ - isLoading?: boolean; - - /** - * Flag to disable the launcher. - */ - isDisabled?: boolean; -} - -/** - * A floating action button used to launch the chat widget. - * - * @see {@link https://voiceflow.github.io/react-chat/?path=/story/components-launcher--default} - */ -export const LauncherWithLabel: React.FC = ({ - isVoice, - withIcon, - image, - isOpen, - label, - onClick, - isLoading, - isDisabled, -}) => { - const showDefaultPhoneIcon = !image && isVoice; - - const loader = ( -
    - -
    - ); - - return ( - - ); -}; diff --git a/packages/chat/src/components/Launcher/LauncherWithLabel/styles.css.ts b/packages/chat/src/components/Launcher/LauncherWithLabel/styles.css.ts deleted file mode 100644 index d0dcf3b7c3..0000000000 --- a/packages/chat/src/components/Launcher/LauncherWithLabel/styles.css.ts +++ /dev/null @@ -1,262 +0,0 @@ -import { keyframes, style, styleVariants } from '@vanilla-extract/css'; -import { recipe } from '@vanilla-extract/recipes'; - -import { fadeInSlideUp } from '@/components/UserResponse/styles.css'; -import { duration } from '@/styles/animations'; -import { THEME } from '@/styles/colors.css'; -import { transition } from '@/styles/transitions'; - -const LAUNCHER_WITH_LABEL_SIZE = 40; -const BEZIER = 'cubic-bezier(0.4, 0, 0.2, 1)'; - -const loadingVariant = styleVariants({ - true: {}, -}); - -const noImageVariant = styleVariants({ - true: {}, -}); - -export const launcherStyles = recipe({ - base: { - borderRadius: '9999px', - transition: `all ${duration.mid} ${BEZIER}`, - overflow: 'hidden', - whiteSpace: 'nowrap', - textOverflow: 'ellipsis', - color: THEME.colors[50], - willChange: 'max-width, transform', - height: LAUNCHER_WITH_LABEL_SIZE, - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - gap: '6px', - fontFamily: THEME.fontFamily, - fontSize: '14px', - lineHeight: '20px', - animation: `${fadeInSlideUp} ${duration.fast} ease-out`, - - boxShadow: - '0px 1px 0px 0px rgba(22, 26, 30, 0.02), 0px 0px 0px 1px rgba(22, 26, 30, 0.04), 0px 1px 5px -4px rgba(22, 26, 30, 0.08), 0px 4px 8px -6px rgba(22, 26, 30, 0.08), 0px 1px 3px 1px rgba(22, 26, 30, 0.01)', - fontWeight: '600', - overflowWrap: 'anywhere', - backgroundColor: THEME.colors[500], - maxWidth: '500px', - ':hover': { - transform: 'scale(1.1)', - backgroundColor: THEME.colors[600], - }, - ':active': { - transform: 'scale(0.8)', - backgroundColor: THEME.colors[700], - }, - - '::before': { - content: '""', - top: '-4px', - position: 'absolute', - bottom: '-4px', - left: '-4px', - right: '-4px', - borderRadius: 'inherit', - backgroundColor: 'transparent', - zIndex: -1, - }, - }, - variants: { - isOpen: { - true: { - maxWidth: LAUNCHER_WITH_LABEL_SIZE, - filter: 'drop-shadow(rgba(0, 0, 0, 0.06) 0px 1px 6px) drop-shadow(rgba(0, 0, 0, 0.16) 0px 2px 32px)', - gap: 0, - padding: '8px', - }, - false: { - maxWidth: '500px', - padding: '8px 16px 8px 12px', - }, - }, - isDisabled: { - true: { - backgroundColor: THEME.colors[300], - - ':hover': { - transform: 'none', - backgroundColor: THEME.colors[300], - }, - ':active': { - transform: 'none', - backgroundColor: THEME.colors[300], - }, - }, - }, - - noImage: noImageVariant, - isLoading: loadingVariant, - }, - compoundVariants: [ - { - variants: { - isOpen: false, - noImage: true, - }, - style: { - paddingLeft: '10px', - }, - }, - ], -}); - -export const launcherLabelStyles = style({ - overflow: 'hidden', - whiteSpace: 'nowrap', - textOverflow: 'ellipsis', - textAlign: 'left', - padding: '3px 0 1px 0', - transition: `all ${duration.mid} ${BEZIER}`, - - selectors: { - [`${loadingVariant.true}${noImageVariant.true} &`]: { - opacity: 0, - }, - }, -}); - -export const twistInAnimation = keyframes({ - '0%': { - opacity: 0, - transform: 'rotate(-45deg)', - }, - '100%': { - opacity: 1, - transform: 'rotate(0deg)', - }, -}); - -export const twistOutAnimation = keyframes({ - '0%': { - transform: 'rotate(0deg)', - }, - '100%': { - opacity: 0, - transform: 'rotate(-45deg)', - }, -}); - -export const closeChevron = recipe({ - base: { - transform: 'rotate(0deg)', - transition: transition(['width', 'opacity']), - position: 'absolute', - width: '32px', - height: '32px', - left: 0, - opacity: 0, - - selectors: { - [`${loadingVariant.true} &`]: { - opacity: '0 !important', - }, - }, - }, - variants: { - isOpen: { - true: { - animation: `${twistInAnimation} 0.2s ease-in-out forwards`, - animationDelay: '0.2s', - }, - false: { - animation: `${twistOutAnimation} 0.2s ease-in-out forwards`, - pointerEvents: 'none', - }, - }, - }, -}); - -export const imageIconStyle = recipe({ - base: { - height: '24px', - width: '24px', - position: 'absolute', - borderRadius: 2, - left: 0, - pointerEvents: 'none', - - flexShrink: 0, - transition: transition(['opacity']), - - selectors: { - [`${loadingVariant.true} &`]: { - opacity: 0, - }, - }, - }, - variants: { - isOpen: { - true: { - opacity: 0, - transitionDelay: '0.2s', - }, - false: { - opacity: 1, - }, - }, - }, -}); - -export const imageIconWrapper = recipe({ - base: { - position: 'relative', - transition: transition(['min-width', 'min-height']), - }, - variants: { - noImage: { true: {}, false: {} }, - isOpen: { - true: { - transitionDelay: '0.2s', - minWidth: '32px', - minHeight: '32px', - }, - false: { - minWidth: '24px', - minHeight: '24px', - }, - }, - }, - compoundVariants: [ - { - variants: { - noImage: true, - isOpen: false, - }, - style: { - minWidth: '0 !important', - }, - }, - { - variants: { - noImage: true, - isOpen: true, - }, - style: { - minWidth: '32px', - }, - }, - ], -}); - -export const loadingSpinnerStyles = style({ - color: 'white', - height: '24px', - width: '24px', -}); - -export const containerLoaderStyles = style({ - position: 'absolute', - top: '50%', - left: '50%', - - height: '24px', - - transform: 'translate(-50%, -50%)', -}); diff --git a/packages/chat/src/components/Launcher/PhoneIcon.tsx b/packages/chat/src/components/Launcher/PhoneIcon.tsx deleted file mode 100644 index 720ccb2b34..0000000000 --- a/packages/chat/src/components/Launcher/PhoneIcon.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import type { SVGProps } from 'react'; - -export const PhoneIcon = (props: SVGProps) => ( - - - -); diff --git a/packages/chat/src/components/Launcher/constant.ts b/packages/chat/src/components/Launcher/constant.ts deleted file mode 100644 index 5be15c9a1d..0000000000 --- a/packages/chat/src/components/Launcher/constant.ts +++ /dev/null @@ -1 +0,0 @@ -export const DEFAULT_ICON = 'https://cdn.voiceflow.com/widget-next/message.png'; diff --git a/packages/chat/src/components/Launcher/index.tsx b/packages/chat/src/components/Launcher/index.tsx deleted file mode 100644 index 2c3c4716cd..0000000000 --- a/packages/chat/src/components/Launcher/index.tsx +++ /dev/null @@ -1,134 +0,0 @@ -import type { WidgetSettingsLauncherType } from '@voiceflow/dtos-interact'; -import clsx from 'clsx'; -import type { MouseEventHandler } from 'react'; -import React from 'react'; - -import { ClassName } from '@/constants'; - -import { Button } from '../Button'; -import { LoadingSpinner } from '../LoadingSpinner/LoadingSpinner'; -import { ChevronIcon } from './ChevronIcon'; -import { DEFAULT_ICON } from './constant'; -import { LauncherWithLabel } from './LauncherWithLabel'; -import { PhoneIcon } from './PhoneIcon'; -import { - closeChevron, - closeIconStyles, - iconContainer, - imageStyles, - launcherContainer, - launcherIconStyles, - launcherStyles, - loadingSpinnerStyles, -} from './styles.css'; - -export { DEFAULT_ICON }; - -export interface LauncherProps { - /** - * The type of launcher we show. - */ - type: WidgetSettingsLauncherType; - - /** - * An image URL to be rendered as the icon. - * Defaults to the "launch" SVG if not provided. - */ - image?: string | undefined; - - /** - * A label that will be displayed on the launcher button. - * If empty or undefined then the user will only see the icon. - */ - label?: string | undefined; - - /** - * Is the Chat widget opened ? - * If it's opened then we only show the close icon. - */ - isOpen: boolean; - - /** - * A callback that will be executed when the button is clicked. - */ - onClick: MouseEventHandler; - - /** - * Flag to use the default phone icon. - */ - isVoice?: boolean; - - /** - * Flag to show loader in the launcher. - */ - isLoading?: boolean; - - /** - * Flag to disable the launcher. - */ - isDisabled?: boolean; -} - -/** - * A floating action button used to launch the chat widget. - * - * @see {@link https://voiceflow.github.io/react-chat/?path=/story/components-launcher--default} - */ -export const Launcher: React.FC = ({ - image, - type, - isVoice, - isOpen, - label, - onClick, - isLoading = false, - isDisabled = false, -}) => { - const withIcon = type !== 'label'; - const withLabel = type !== 'icon' && !!label?.length; - - if (withLabel) { - return ( - - ); - } - - const showDefaultPhoneIcon = !image && isVoice; - - return ( -
    - -
    - ); -}; diff --git a/packages/chat/src/components/Launcher/styles.css.ts b/packages/chat/src/components/Launcher/styles.css.ts deleted file mode 100644 index 83fd5130b0..0000000000 --- a/packages/chat/src/components/Launcher/styles.css.ts +++ /dev/null @@ -1,303 +0,0 @@ -import { keyframes, style } from '@vanilla-extract/css'; -import { recipe } from '@vanilla-extract/recipes'; - -import { duration } from '@/styles/animations'; -import { THEME } from '@/styles/colors.css'; -import { transition } from '@/styles/transitions'; - -import { buttonStyles } from '../Button/styles.css'; -import { fadeInSlideUp } from '../UserResponse/styles.css'; - -export const LAUNCHER_SIZE = 48; -export const LAUNCHER_WITH_LABEL_SIZE = 40; - -export const launcherContainer = style({ - width: 'fit-content', -}); - -export const launcherStyles = recipe({ - base: [ - buttonStyles({ round: true }), - { - display: 'flex', - height: LAUNCHER_SIZE, - minWidth: '48px', - backgroundColor: THEME.colors[500], - position: 'relative', // Establish positioning context - transition: 'all 0.15s ease-in-out', - boxShadow: - '0px 1px 0px 0px rgba(22, 26, 30, 0.02), 0px 0px 0px 1px rgba(22, 26, 30, 0.04), 0px 1px 5px -4px rgba(22, 26, 30, 0.08), 0px 4px 8px -6px rgba(22, 26, 30, 0.08), 0px 1px 3px 1px rgba(22, 26, 30, 0.01)', - - animation: `${fadeInSlideUp} ${duration.fast} ease-out`, - width: LAUNCHER_SIZE, - padding: '8px', - ':hover': { - transform: 'scale(1.1)', - backgroundColor: THEME.colors[600], - }, - ':active': { - transform: 'scale(0.8)', - backgroundColor: THEME.colors[700], - }, - - '::before': { - content: '""', - top: '-4px', - position: 'absolute', - bottom: '-4px', - left: '-4px', - right: '-4px', - borderRadius: 'inherit', - backgroundColor: 'transparent', - zIndex: -1, - }, - }, - ], - - variants: { - isOpen: { - true: { - filter: 'drop-shadow(rgba(0, 0, 0, 0.06) 0px 1px 6px) drop-shadow(rgba(0, 0, 0, 0.16) 0px 2px 32px)', - overflow: 'initial', - height: '48px', - width: '48px', - }, - }, - - isDisabled: { - true: { - backgroundColor: THEME.colors[300], - - ':hover': { - transform: 'none', - backgroundColor: THEME.colors[300], - }, - ':active': { - transform: 'none', - backgroundColor: THEME.colors[300], - }, - }, - }, - - isLoading: { - true: {}, - }, - }, -}); - -export const loadingSpinnerStyles = style({ - color: 'white', - height: '24px', - width: '24px', -}); - -export const iconContainer = recipe({ - base: { - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - position: 'relative', - width: '32px', - height: '32px', - }, - variants: { - isOpen: { - true: {}, - false: { - width: '24px', - height: '24px', - }, - }, - withIcon: { false: {} }, - }, - compoundVariants: [ - { - variants: { - withIcon: false, - isOpen: false, - }, - style: { - width: 0, - height: 0, - }, - }, - ], -}); - -export const launcherLabelStyles = recipe({ - base: { - fontSize: '14px', - fontWeight: 600, - color: THEME.colors[50], - lineHeight: '20px', - marginLeft: '6px', - paddingTop: 1, - opacity: 1, - width: 'fit-content', - transition: 'opacity 50ms, max-width 100ms, margin-left 300ms', - }, - variants: { - isOpen: { - true: { - opacity: 0, - maxWidth: 0, - width: 0, - marginLeft: 0, - }, - false: { - opacity: 1, - maxWidth: 'fit-content', - width: 'fit-content', - }, - }, - }, -}); - -export const closeIconStyles = recipe({ - base: { - color: THEME.colors[50], - width: 32, - height: 32, - borderRadius: 2, - flexShrink: 0, - }, - variants: { - withLabel: { - true: { - width: 24, - height: 24, - }, - }, - }, -}); - -export const launcherIconStyles = recipe({ - base: { - width: 32, - height: 32, - borderRadius: 2, - position: 'absolute', - flexShrink: 0, - transition: transition(['opacity']), - animationDelay: '0.1s', - }, - variants: { - isOpen: { - true: { - opacity: 0, - }, - false: { - opacity: 1, - }, - }, - }, -}); - -export const twistInAnimation = keyframes({ - '0%': { - opacity: 0, - transform: 'rotate(-45deg)', - }, - '100%': { - opacity: 1, - transform: 'rotate(0deg)', - }, -}); - -export const twistOutAnimation = keyframes({ - '0%': { - transform: 'rotate(0deg)', - }, - '100%': { - opacity: 0, - transform: 'rotate(-45deg)', - }, -}); - -export const closeChevron = recipe({ - base: { - transform: 'rotate(0deg)', - transition: transition(['width', 'opacity']), - position: 'absolute', - width: '32px', - opacity: 0, - }, - variants: { - isOpen: { - true: {}, - false: {}, - }, - - isLoading: { - true: {}, - }, - }, - - compoundVariants: [ - { - variants: { - isOpen: true, - isLoading: false, - }, - style: { - animation: `${twistInAnimation} 0.2s ease-in-out`, - opacity: 1, - }, - }, - { - variants: { - isOpen: false, - isLoading: false, - }, - style: { - animation: `${twistOutAnimation} 0.2s ease-in-out`, - opacity: 0, - pointerEvents: 'none', - }, - }, - { - variants: { - isLoading: true, - isOpen: true, - }, - style: { - opacity: 0, - }, - }, - { - variants: { - isLoading: true, - isOpen: false, - }, - style: { - opacity: 0, - }, - }, - ], -}); - -export const imageStyles = recipe({ - base: { - transition: transition(['opacity', 'width']), - height: '32px', - width: '32px', - minWidth: '32px', - pointerEvents: 'none', - }, - variants: { - isOpen: { - true: { - opacity: 0, - width: 0, - }, - false: { - opacity: 1, - }, - }, - isLoading: { - true: { - opacity: 0, - }, - }, - }, -}); diff --git a/packages/chat/src/components/LinkPreview/LinkPreview.story.tsx b/packages/chat/src/components/LinkPreview/LinkPreview.story.tsx deleted file mode 100644 index 7d6ff755c3..0000000000 --- a/packages/chat/src/components/LinkPreview/LinkPreview.story.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; - -import tiledBg from '../../__fixtures__/tiled-bg.png'; -import { LinkPreview } from '.'; -type Story = StoryObj; - -const meta: Meta = { - title: 'Components/LinkPreview', - component: LinkPreview, - parameters: { - controls: { hideNoControlsWarning: true }, - }, -}; - -export default meta; - -export const Default: Story = { - args: { - image: tiledBg, - title: - 'Lorem ipsum dolor sit amet consectetur. Quis risus nibh tincidunt platea. A donec amet gravida aliquam sed eget aliquet sollicitudin turpis.', - link: 'websiteexample.com', - }, -}; - -export const Loading: Story = { - args: { - title: - 'Lorem ipsum dolor sit amet consectetur. Quis risus nibh tincidunt platea. A donec amet gravida aliquam sed eget aliquet sollicitudin turpis.', - link: 'websiteexample.com', - }, -}; - -export const DocumentUrl: Story = { - args: { - title: - 'Lorem ipsum dolor sit amet consectetur. Quis risus nibh tincidunt platea. A donec amet gravida aliquam sed eget aliquet sollicitudin turpis.', - link: 'https://google.com', - }, -}; - -export const DocumentPdf: Story = { - args: { - title: - 'Lorem ipsum dolor sit amet consectetur. Quis risus nibh tincidunt platea. A donec amet gravida aliquam sed eget aliquet sollicitudin turpis.', - link: 'some_guide.pdf', - }, -}; - -export const Inline: Story = { - args: { - inline: true, - image: tiledBg, - title: - 'Lorem ipsum dolor sit amet consectetur. Quis risus nibh tincidunt platea. A donec amet gravida aliquam sed eget aliquet sollicitudin turpis.', - link: 'websiteexample.com', - }, -}; - -export const LoadingInline: Story = { - args: { - inline: true, - title: - 'Lorem ipsum dolor sit amet consectetur. Quis risus nibh tincidunt platea. A donec amet gravida aliquam sed eget aliquet sollicitudin turpis.', - link: 'websiteexample.com', - }, -}; - -export const InlineDocumentUrl: Story = { - args: { - inline: true, - title: - 'Lorem ipsum dolor sit amet consectetur. Quis risus nibh tincidunt platea. A donec amet gravida aliquam sed eget aliquet sollicitudin turpis.', - link: 'https://google.com', - }, -}; - -export const InlineDocumentPdf: Story = { - args: { - inline: true, - title: - 'Lorem ipsum dolor sit amet consectetur. Quis risus nibh tincidunt platea. A donec amet gravida aliquam sed eget aliquet sollicitudin turpis.', - link: 'some_guide.pdf', - }, -}; diff --git a/packages/chat/src/components/LinkPreview/index.tsx b/packages/chat/src/components/LinkPreview/index.tsx deleted file mode 100644 index 9ad0781aa2..0000000000 --- a/packages/chat/src/components/LinkPreview/index.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { forwardRef, type PropsWithRef } from 'react'; - -import { Icon } from '../Icon'; -import { LoadingSpinner } from '../LoadingSpinner/LoadingSpinner'; -import { - linkPreviewContainer, - linkPreviewDetails, - linkPreviewImage, - linkPreviewImageContainer, - linkPreviewTitle, - linkPreviewUrl, -} from './styles.css'; -import { getImageTypeFromUrl } from './utils'; - -interface ILinkPreviewProps { - image?: string; - title: string; - link: string; - inline?: boolean; -} - -export const LinkPreview = forwardRef>((props: any, ref) => { - const { image, title, link, inline } = props; - const linkType = getImageTypeFromUrl(link); - const shadow = linkType === 'custom' && !image; - - return ( -
    -
    - {linkType === 'pdf' && } - {linkType === 'url' && } - {linkType === 'custom' && !image && } - {linkType === 'custom' && image && } -
    -
    -
    {title}
    -
    {link}
    -
    -
    - ); -}); diff --git a/packages/chat/src/components/LinkPreview/styles.css.ts b/packages/chat/src/components/LinkPreview/styles.css.ts deleted file mode 100644 index 9ccd801be3..0000000000 --- a/packages/chat/src/components/LinkPreview/styles.css.ts +++ /dev/null @@ -1,167 +0,0 @@ -import { style } from '@vanilla-extract/css'; -import { recipe } from '@vanilla-extract/recipes'; - -import { COLORS } from '@/styles/colors'; -import { THEME } from '@/styles/colors.css'; -import { hideTextOverflow, lineClamp } from '@/styles/font'; -import { SIZES } from '@/styles/sizes'; -import { transition } from '@/styles/transitions'; - -export const linkPreviewContainer = recipe({ - base: [ - { - display: 'flex', - borderRadius: SIZES.radius.sm, - padding: '6px 8px 6px 6px', - backgroundColor: COLORS.NEUTRAL_LIGHT[50], - fontFamily: THEME.fontFamily, - transition: transition(['color', 'background-color']), - ':hover': { - cursor: 'pointer', - backgroundColor: COLORS.NEUTRAL_LIGHT[100], - }, - ':active': { - backgroundColor: COLORS.NEUTRAL_LIGHT[200], - }, - }, - ], - - variants: { - inline: { - true: { - padding: '4px 8px 4px 4px', - borderRadius: SIZES.radius.xs, - backgroundColor: COLORS.NEUTRAL_LIGHT[100], - ':hover': { - backgroundColor: COLORS.NEUTRAL_LIGHT[200], - }, - ':active': { - backgroundColor: COLORS.NEUTRAL_LIGHT[300], - }, - }, - }, - }, -}); - -export const linkPreviewImageContainer = recipe({ - base: { - position: 'relative', - width: 52, - height: 52, - flexShrink: 0, - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - borderRadius: SIZES.radius.xxxs, - marginRight: 8, - backgroundColor: COLORS.NEUTRAL_DARK[9006], - overflow: 'hidden', - ':hover': { - backgroundColor: COLORS.NEUTRAL_DARK[9008], - }, - ':active': { - backgroundColor: COLORS.NEUTRAL_DARK[90012], - }, - }, - - variants: { - inline: { - true: { - width: 35, - height: 35, - color: COLORS.NEUTRAL_DARK[300], - backgroundColor: COLORS.NEUTRAL_DARK[9008], - ':hover': { - color: COLORS.NEUTRAL_DARK[500], - backgroundColor: COLORS.NEUTRAL_DARK[90012], - }, - ':active': { - color: COLORS.NEUTRAL_DARK[700], - backgroundColor: COLORS.NEUTRAL_DARK[90016], - }, - }, - }, - shadow: { - true: { - boxShadow: 'none', - }, - false: { - // Creates an inset box-shadow over an image - '::after': { - content: '', - position: 'absolute', - height: '100%', - width: '100%', - top: 0, - right: 0, - display: 'block', - boxShadow: '0px -1px 0px 0px rgba(0, 0, 0, 0.08) inset', - }, - }, - }, - }, -}); - -export const linkPreviewImage = style({ - width: '100%', -}); - -export const linkPreviewDetails = style({ - fontSize: '12px', - fontWeight: 600, - lineHeight: '17px', - overflow: 'hidden', -}); - -export const linkPreviewTitle = recipe({ - base: { - flexGrow: 1, - color: COLORS.NEUTRAL_DARK[900], - maxHeight: '34px', - ...lineClamp(2), - }, - variants: { - inline: { - true: { - display: 'block', - maxHeight: '17px', - ...hideTextOverflow(), - }, - }, - }, -}); - -export const linkPreviewUrl = recipe({ - base: { - flexShrink: 0, - color: COLORS.NEUTRAL_DARK[100], - ':hover': { - color: COLORS.NEUTRAL_DARK[200], - }, - ':active': { - color: COLORS.NEUTRAL_DARK[200], - }, - }, - variants: { - loading: { - true: { - ':hover': { - color: COLORS.NEUTRAL_DARK[100], - }, - ':active': { - color: COLORS.NEUTRAL_DARK[100], - }, - }, - }, - inline: { - true: { - ':hover': { - color: COLORS.NEUTRAL_DARK[100], - }, - ':active': { - color: COLORS.NEUTRAL_DARK[100], - }, - }, - }, - }, -}); diff --git a/packages/chat/src/components/LinkPreview/utils.ts b/packages/chat/src/components/LinkPreview/utils.ts deleted file mode 100644 index dc474d3f0b..0000000000 --- a/packages/chat/src/components/LinkPreview/utils.ts +++ /dev/null @@ -1,24 +0,0 @@ -type LinkType = 'pdf' | 'url' | 'custom'; - -const isValidHttpUrl = (value: string) => { - let url; - - try { - url = new URL(value); - } catch (_) { - return false; - } - return url.protocol === 'http:' || url.protocol === 'https:'; -}; - -export const getImageTypeFromUrl = (value: string): LinkType => { - if (value.endsWith('.pdf')) { - return 'pdf'; - } - - if (isValidHttpUrl(value)) { - return 'url'; - } - - return 'custom'; -}; diff --git a/packages/chat/src/components/LoadingSpinner/LoadingSpinner.tsx b/packages/chat/src/components/LoadingSpinner/LoadingSpinner.tsx deleted file mode 100644 index 5043b895c4..0000000000 --- a/packages/chat/src/components/LoadingSpinner/LoadingSpinner.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import clsx from 'clsx'; - -import type { VariantProps } from '@/types/variants'; - -import { rectStyles, spinnerRecipe, spinnerStyle } from './styles.css'; - -export interface ILoadingSpinner extends VariantProps { - testID?: string; - className?: string; -} - -export const LoadingSpinner: React.FC = ({ className, testID, size = 'medium', variant = 'dark' }) => { - const isLarge = size === 'large'; - const height = isLarge ? 6 : 4; - - const smallCoordinates: Array<{ x?: number; y?: number; transform?: string }> = [ - { x: 7.25 }, - { x: 13.1265, y: 1.81281, transform: 'rotate(45 13.1265 1.81281)' }, - { x: 16, y: 7.25, transform: 'rotate(90 16 7.25)' }, - { x: 14.1873, y: 13.1265, transform: 'rotate(135 14.1873 13.1265)' }, - { x: 8.75, y: 16, transform: 'rotate(180 8.75 16)' }, - { x: 2.87354, y: 14.1872, transform: 'rotate(-135 2.87354 14.1872)' }, - { y: 8.75, transform: 'rotate(-90 0 8.75)' }, - { x: 1.8, y: 2.873, transform: 'rotate(-45 1.81274 2.87347)' }, - ]; - - const largeCoordinates: Array<{ x?: number; y?: number; transform?: string }> = [ - { x: 11.25, y: 2 }, - { x: 18.54, y: 4.39, transform: 'rotate(45 18.5408 4.39862)' }, - { x: 22, y: 11.25, transform: 'rotate(90 22 11.25)' }, - { x: 19.61, y: 18.54, transform: 'rotate(135 19.61 18.54)' }, - { x: 12.75, y: 22, transform: 'rotate(180 12.75 22)' }, - { x: 5.46, y: 19.61, transform: 'rotate(-135 5.46 19.6)' }, - { x: 2, y: 12.75, transform: 'rotate(-90 2 12.75)' }, - { x: 4.39, y: 5.46, transform: 'rotate(-45 4.39 5.45)' }, - ]; - - return ( - - {(isLarge ? largeCoordinates : smallCoordinates).map((args, index) => ( - - ))} - - ); -}; diff --git a/packages/chat/src/components/LoadingSpinner/styles.css.ts b/packages/chat/src/components/LoadingSpinner/styles.css.ts deleted file mode 100644 index 8fd4b01702..0000000000 --- a/packages/chat/src/components/LoadingSpinner/styles.css.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { keyframes, style, styleVariants } from '@vanilla-extract/css'; -import { recipe } from '@vanilla-extract/recipes'; - -import { COLORS } from '@/styles/colors'; - -const spinnerScaleAnimation = keyframes({ - '0%': { - transform: 'scale(0.4, 0.4) rotate(0)', - opacity: 0, - }, - '100%': { - transform: 'scale(1.4, 1.4) rotate(0)', - opacity: 1, - }, -}); - -const spinnerAnimation = keyframes({ - '0%': { - transform: 'rotate(0)', - }, - '100%': { - transform: 'rotate(360deg)', - }, -}); - -const fadeAnimation = keyframes({ - '0%': { - opacity: '0', - }, - '100%': { - opacity: '1', - }, -}); - -export const spinnerStyle = style({ - height: '16px', - animation: `${spinnerScaleAnimation} .75s linear forwards, ${spinnerAnimation} 1.25s linear forwards`, -}); - -const RECT_ANIMATION_PROPERTIES = [ - { - opacity: '1.12', - animationDelay: '-0.96s', - }, - { - opacity: '1', - animationDelay: '-0.84s', - }, - { - opacity: '0.88', - animationDelay: '-0.72s', - }, - { - opacity: '0.76', - animationDelay: '-0.6s', - }, - { - opacity: '0.64', - animationDelay: '-0.48s', - }, - { - opacity: '0.52', - animationDelay: '-0.36s', - }, - { - opacity: '0.4', - animationDelay: '-0.24s', - }, - { - opacity: '0.28', - animationDelay: '-0.12s', - }, - { - opacity: '0.16', - animationDelay: '0s', - }, -]; - -const produceSpinnerAnimationSelectors = () => { - return RECT_ANIMATION_PROPERTIES.reduce((accum, element, index) => { - return { - ...accum, - [`${spinnerStyle} &:nth-child(${index + 1})`]: { - animation: `${fadeAnimation} 1s linear infinite`, - animationDelay: element.animationDelay, - opacity: element.opacity, - }, - }; - }, {}); -}; - -export const rectStyles = style({ - selectors: produceSpinnerAnimationSelectors(), -}); - -export const spinnerSizeVariants = styleVariants({ - large: { - height: '24px', - width: 'auto', - }, - medium: { - height: '16px', - width: 'auto', - }, -}); - -export const spinnerThemeVariants = styleVariants({ - light: { - color: COLORS.white, - }, - dark: { - color: COLORS.NEUTRAL_DARK[900], - }, -}); - -export const spinnerRecipe = recipe({ - variants: { - size: spinnerSizeVariants, - variant: spinnerThemeVariants, - }, -}); diff --git a/packages/chat/src/components/MessageContainer/index.tsx b/packages/chat/src/components/MessageContainer/index.tsx deleted file mode 100644 index 775532c168..0000000000 --- a/packages/chat/src/components/MessageContainer/index.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import clsx from 'clsx'; -import React, { type PropsWithChildren } from 'react'; - -import { messageContainer } from './styles.css'; - -/** - * Used to wrap a `SystemResponse` or a `UserResponse` object. - * A `SystemResponse` can have multiple messages in it. - */ -export const MessageContainer: React.FC> = ({ - children, - className, - isLast, -}) => { - return
    {children}
    ; -}; diff --git a/packages/chat/src/components/MessageContainer/styles.css.ts b/packages/chat/src/components/MessageContainer/styles.css.ts deleted file mode 100644 index 49acf7dad0..0000000000 --- a/packages/chat/src/components/MessageContainer/styles.css.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { recipe } from '@vanilla-extract/recipes'; - -export const messageContainer = recipe({ - base: { - position: 'relative', - - width: '100%', - margin: '16px 0', - }, - variants: { - isLast: { - true: { - marginBottom: 0, - }, - }, - }, -}); diff --git a/packages/chat/src/components/MessageInput/AudioInputButton.tsx b/packages/chat/src/components/MessageInput/AudioInputButton.tsx deleted file mode 100644 index e73ff2f117..0000000000 --- a/packages/chat/src/components/MessageInput/AudioInputButton.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import clsx from 'clsx'; - -import { squareButtonStyles } from '../Buttons/SquareButton/styles/SquareButton.css'; -import * as SquareButtonTheme from '../Buttons/SquareButton/styles/SquareButtonTheme.css'; -import { Icon } from '../Icon'; -import { audioInputButton } from './MessageInput.css'; - -interface AudioInputButtonProps { - onStop?: () => void; - onStart?: () => void; - listening?: boolean; - processing?: boolean; - initializing?: boolean; - showButton?: boolean; -} - -export const AudioInputButton: React.FC = ({ - onStop, - onStart, - listening, - processing, - initializing, - showButton, -}) => { - return ( - - ); -}; diff --git a/packages/chat/src/components/MessageInput/MessageInput.css.ts b/packages/chat/src/components/MessageInput/MessageInput.css.ts deleted file mode 100644 index 5a0800baa6..0000000000 --- a/packages/chat/src/components/MessageInput/MessageInput.css.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { createVar, style } from '@vanilla-extract/css'; -import { recipe } from '@vanilla-extract/recipes'; - -import { COLORS } from '@/styles/colors'; -import { THEME } from '@/styles/colors.css'; -import { BREAKPOINTS } from '@/styles/sizes'; -import { transition } from '@/styles/transitions'; - -export const themedFocusRing = createVar(); - -export const inputContainer = recipe({ - base: { - position: 'relative', - borderRadius: '25px', - display: 'flex', - zIndex: 1, - justifyContent: 'space-between', - padding: '7px 7px 7px 20px', - boxSizing: 'border-box', - border: `1px solid ${COLORS.NEUTRAL_LIGHT[100]}`, - backgroundColor: COLORS.white, - boxShadow: '0px 3px 4px 0px rgba(0, 0, 0, 0.02), 0px 8px 42px -16px rgba(0, 0, 0, 0.08)', - transition: transition(['border', 'box-shadow', 'border-radius', 'opacity']), - selectors: { - '&:hover': { - cursor: 'text', - border: `1px solid ${COLORS.NEUTRAL_LIGHT[200]}`, - }, - }, - }, - variants: { - multiline: { - true: { - borderRadius: '20px', - }, - }, - hasEnded: { - true: { - opacity: 0, - }, - }, - }, -}); - -export const mockFocusRing = recipe({ - base: { - position: 'absolute', - top: '-1px', - left: '-1px', - right: '-1px', - bottom: '-1px', - borderRadius: '25px', - pointerEvents: 'none', - opacity: 0, - boxShadow: `inset 0 0 0 0px ${THEME.colors[500]}`, - transition: transition(['opacity', 'box-shadow', 'border-radius']), - selectors: { - [`${inputContainer()}:focus-within &`]: { - opacity: 1, - boxShadow: `inset 0 0 0 2px ${THEME.colors[500]}`, - }, - }, - }, - variants: { - multiline: { - true: { - borderRadius: '20px', - }, - }, - }, -}); - -export const input = style({ - width: '100%', - scrollbarWidth: 'none', - borderColor: 'transparent', - resize: 'none', - fontFamily: THEME.fontFamily, - fontSize: '14px', - boxSizing: 'border-box', - outline: 'transparent 0px', - - padding: '0', - lineHeight: '20px', - paddingTop: '2px', - color: COLORS.NEUTRAL_DARK[900], - selectors: { - '&::placeholder': { - color: COLORS.NEUTRAL_DARK[100], - fontSize: '14px', - }, - }, - '@media': { - [`screen and (max-width: ${BREAKPOINTS.mobile})`]: { - fontSize: '16px', - }, - }, -}); - -export const multilineInput = style({ - borderRadius: '25px', -}); - -export const inputBlock = style({ - width: '100%', - display: 'flex', - flexDirection: 'column', - alignItems: 'center', - margin: 'auto', - marginRight: '8px', -}); - -export const buttonContainer = style({ - display: 'flex', - alignItems: 'flex-start', - justifyContent: 'center', - gap: '8px', - height: '100%', -}); - -export const audioInputButton = recipe({ - base: { - display: 'flex', - borderRadius: 100, - overflow: 'hidden', - transition: transition(['opacity', 'width', 'background-color', 'color']), - }, - variants: { - disabled: { - true: { - cursor: 'not-allowed', - }, - }, - hidden: { - true: { - opacity: 0, - width: 0, - }, - false: { - opacity: 1, - }, - }, - }, -}); diff --git a/packages/chat/src/components/MessageInput/MessageInput.story.tsx b/packages/chat/src/components/MessageInput/MessageInput.story.tsx deleted file mode 100644 index 7ccf38f8fc..0000000000 --- a/packages/chat/src/components/MessageInput/MessageInput.story.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; -import { useState } from 'react'; - -import { WithDefaultPalette } from '@/storybook/decorators'; - -import { MessageInput } from '.'; -import { chatContainer } from './MessageInputTestStyles.css'; - -type Story = StoryObj; - -const meta: Meta = { - title: 'Core/MessageInput', - component: MessageInput, - decorators: [ - WithDefaultPalette, - (Story) => ( -
    - -
    - ), - ], -}; - -export default meta; - -const MockComponent = () => { - return ( -
    - Promise.resolve()} /> -
    - ); -}; - -export const Base: Story = { - render: () => , -}; - -export const WithAudioInput: Story = { - render: () => ( -
    - Promise.resolve()} - /> -
    - ), -}; - -const AnimationTestsComponent = () => { - const [isOpen, setIsOpen] = useState(false); - return ( - <> -
    - Promise.resolve()} - /> -
    - - - ); -}; -export const AnimationTest: Story = { - render: () => , -}; diff --git a/packages/chat/src/components/MessageInput/MessageInputTestStyles.css.ts b/packages/chat/src/components/MessageInput/MessageInputTestStyles.css.ts deleted file mode 100644 index 8061e06641..0000000000 --- a/packages/chat/src/components/MessageInput/MessageInputTestStyles.css.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { recipe } from '@vanilla-extract/recipes'; - -export const chatContainer = recipe({ - base: { - maxHeight: 400, - pointerEvents: 'auto', - opacity: 0, - width: 0, - transition: 'opacity 300ms cubic-bezier(0.85, 0, 0.6, 1), width 300ms cubic-bezier(0.85, 0, 0.6, 1)', - transformOrigin: 'right center', - position: 'absolute', - }, - variants: { - isOpen: { - true: { - opacity: 1, - pointerEvents: 'auto', - width: 400, - }, - false: { - opacity: 0, - pointerEvents: 'none', - width: 0, - }, - }, - }, -}); diff --git a/packages/chat/src/components/MessageInput/hooks.ts b/packages/chat/src/components/MessageInput/hooks.ts deleted file mode 100644 index e623a6252b..0000000000 --- a/packages/chat/src/components/MessageInput/hooks.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { useEffect, useLayoutEffect, useRef, useState } from 'react'; -import ReactSpeechRecognition, { useSpeechRecognition as useReactSpeechRecognition } from 'react-speech-recognition'; - -import { isChrome } from '@/device'; -import type { ChatSpeechRecognitionConfig, ChatSpeechRecognitionState } from '@/dtos/ChatConfig.dto'; - -export const useSpeechRecognition = ({ - onValueChange, - customSpeechRecognition, -}: { - onValueChange: (value: string) => void; - customSpeechRecognition?: ChatSpeechRecognitionConfig; -}) => { - const textareaRef = useRef(null); - const reactSpeechRecognition = useReactSpeechRecognition({ clearTranscriptOnListen: true }); - - const browserSupportsSpeechRecognition = reactSpeechRecognition.browserSupportsSpeechRecognition && isChrome(); - const customSpeechRecognitionEnabled = - !!customSpeechRecognition && (customSpeechRecognition.overrideNative || !browserSupportsSpeechRecognition); - - const prevListening = useRef( - customSpeechRecognitionEnabled ? customSpeechRecognition.initialState.listening : reactSpeechRecognition.listening - ); - const prevProcessing = useRef( - customSpeechRecognitionEnabled ? customSpeechRecognition.initialState.processing : false - ); - - const [customSpeechRecognitionState, setCustomSpeechRecognitionState] = useState( - customSpeechRecognitionEnabled - ? customSpeechRecognition.initialState - : { - listening: reactSpeechRecognition.listening, - transcript: reactSpeechRecognition.transcript, - processing: false, - initializing: false, - microphoneAvailable: reactSpeechRecognition.isMicrophoneAvailable, - } - ); - - const onStartListening = (): void => { - if (customSpeechRecognitionEnabled) { - customSpeechRecognition.resetTranscript(); - customSpeechRecognition.startListening(); - } else { - reactSpeechRecognition.resetTranscript(); - ReactSpeechRecognition.startListening({ continuous: true }); - } - }; - - const onStopListening = (): void => { - if (customSpeechRecognitionEnabled) { - customSpeechRecognition.stopListening(); - } else { - ReactSpeechRecognition.stopListening(); - } - }; - - useLayoutEffect(() => { - if (customSpeechRecognitionEnabled || !reactSpeechRecognition.listening) return; - - onValueChange(reactSpeechRecognition.transcript); - }, [customSpeechRecognitionEnabled, reactSpeechRecognition.transcript]); - - useEffect(() => { - if (customSpeechRecognitionEnabled) { - if (prevProcessing.current && !customSpeechRecognitionState.processing) { - customSpeechRecognition.resetTranscript(); - textareaRef.current?.focus(); - } - - prevProcessing.current = customSpeechRecognitionState.processing; - } else { - if (prevListening.current && !reactSpeechRecognition.listening) { - reactSpeechRecognition.resetTranscript(); - textareaRef.current?.focus(); - } - - prevListening.current = reactSpeechRecognition.listening; - } - }, [customSpeechRecognitionEnabled, reactSpeechRecognition.listening, customSpeechRecognitionState.processing]); - - useEffect(() => { - if (!customSpeechRecognitionEnabled) return undefined; - - return customSpeechRecognition.onStateChange((nextState) => { - onValueChange(nextState.transcript); - setCustomSpeechRecognitionState(nextState); - }); - }, [customSpeechRecognitionEnabled]); - - return { - available: customSpeechRecognitionEnabled || browserSupportsSpeechRecognition, - listening: customSpeechRecognitionEnabled - ? customSpeechRecognitionState.listening - : reactSpeechRecognition.listening, - processing: customSpeechRecognitionEnabled ? customSpeechRecognitionState.processing : false, - textareaRef, - initializing: customSpeechRecognitionEnabled ? customSpeechRecognitionState.initializing : false, - stopListening: onStopListening, - startListening: onStartListening, - microphoneAvailable: customSpeechRecognitionEnabled - ? customSpeechRecognitionState.microphoneAvailable - : reactSpeechRecognition.isMicrophoneAvailable, - }; -}; diff --git a/packages/chat/src/components/MessageInput/index.tsx b/packages/chat/src/components/MessageInput/index.tsx deleted file mode 100644 index 54941bbee0..0000000000 --- a/packages/chat/src/components/MessageInput/index.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import { useRef, useState } from 'react'; -import TextareaAutosize from 'react-textarea-autosize'; - -import type { ChatSpeechRecognitionConfig } from '@/main'; - -import { SendButton } from '../SendButton'; -import { AudioInputButton } from './AudioInputButton'; -import { useSpeechRecognition } from './hooks'; -import { buttonContainer, input, inputBlock, inputContainer, mockFocusRing } from './MessageInput.css'; - -export interface IMessageInput { - onDictationClick?: () => void; - placeholder?: string; - onSubmit?: (message: string) => Promise; - disableSend?: boolean | undefined; - audioInterface?: boolean | undefined; - speechRecognition?: ChatSpeechRecognitionConfig; - hasEnded?: boolean; -} - -export const MessageInput: React.FC = ({ - onSubmit, - disableSend, - audioInterface, - placeholder = 'Message...', - speechRecognition: customSpeechRecognition, - hasEnded, -}) => { - const [message, setMessage] = useState(''); - const [isMultiLine, setIsMultiLine] = useState(false); - const containerRef = useRef(null); - - const speechRecognition = useSpeechRecognition({ - onValueChange: setMessage, - customSpeechRecognition, - }); - const withSendButton = !!message?.length && !disableSend && !speechRecognition.listening; - const withAudioInput = - audioInterface && speechRecognition.available && speechRecognition.microphoneAvailable && !withSendButton; - - const handleContainerClick = () => { - speechRecognition.textareaRef.current?.focus(); - }; - - const sendMessage = async () => { - if (!message || disableSend) return; - - speechRecognition.stopListening(); - setMessage(''); - await onSubmit?.(message); - }; - - const handleKeyPress = (event: React.KeyboardEvent) => { - event.stopPropagation(); - - const { shiftKey } = event; - - if (event.key !== 'Enter') return; - if (event.key === 'Enter' && !shiftKey) { - event.preventDefault(); - sendMessage(); - } - }; - - const onHeightChange = (height: number) => { - setIsMultiLine(height > 24); - }; - - return ( -
    -
    -
    - setMessage(event.target.value)} - /> -
    -
    - - - -
    -
    - ); -}; diff --git a/packages/chat/src/components/NewChat/ChatContainer/ChatContainer.component.tsx b/packages/chat/src/components/NewChat/ChatContainer/ChatContainer.component.tsx deleted file mode 100644 index a0830336b0..0000000000 --- a/packages/chat/src/components/NewChat/ChatContainer/ChatContainer.component.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { assignInlineVars } from '@vanilla-extract/dynamic'; -import type { WidgetSettingsColorPalette } from '@voiceflow/dtos-interact'; -import clsx from 'clsx'; - -import { THEME } from '@/styles/colors.css'; -import { FAMILY } from '@/styles/font'; -import { chatIsOpen } from '@/views/ChatWidget/styles.css'; - -import { chatWindowStyle } from './ChatContainer.css'; - -export interface IChatContainer { - palette: WidgetSettingsColorPalette; - fontFamily?: string; - children?: React.ReactNode; - embedded?: boolean; - isPopover?: boolean; -} - -export const ChatContainer: React.FC = ({ palette, fontFamily, children, embedded, isPopover }) => { - return ( -
    - {children} -
    - ); -}; diff --git a/packages/chat/src/components/NewChat/ChatContainer/ChatContainer.css.tsx b/packages/chat/src/components/NewChat/ChatContainer/ChatContainer.css.tsx deleted file mode 100644 index 0f7fde7756..0000000000 --- a/packages/chat/src/components/NewChat/ChatContainer/ChatContainer.css.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { recipe } from '@vanilla-extract/recipes'; - -import { BREAKPOINTS } from '@/styles/sizes'; - -export const chatWindowStyle = recipe({ - base: { - height: '100%', - maxHeight: '800px', - - '@media': { - [`(max-width: ${BREAKPOINTS.mobile})`]: { - height: '100%', - maxHeight: '100vh', - }, - }, - }, - - variants: { - popover: { - true: { - height: 'auto', - minHeight: '400px', - maxHeight: '100%', - boxSizing: 'border-box', - pointerEvents: 'all', - }, - }, - }, -}); diff --git a/packages/chat/src/components/NewChat/NewChat.css.ts b/packages/chat/src/components/NewChat/NewChat.css.ts deleted file mode 100644 index 82f452124d..0000000000 --- a/packages/chat/src/components/NewChat/NewChat.css.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { globalStyle, style } from '@vanilla-extract/css'; -import { recipe } from '@vanilla-extract/recipes'; - -import { duration, timingFunction } from '@/styles/animations'; -import { COLORS } from '@/styles/colors'; -import { BREAKPOINTS } from '@/styles/sizes'; -import { transition } from '@/styles/transitions'; -import { chatIsClosed, chatIsOpen } from '@/views/ChatWidget/styles.css'; - -import { fadeIn, fadeOut } from '../Header/styles.css'; - -export const DIALOG_PADDING = 20; - -export const chatContainer = style({ - height: '100%', - display: 'flex', - flexDirection: 'column', - borderRadius: '16px', - backgroundColor: COLORS.white, - position: 'relative', - boxShadow: '0 0 0 1px rgb(22 26 30 / 6%), rgba(22, 26, 30, 0.16) 0px 8px 80px', - overflow: 'hidden', - - '@media': { - [`(max-width: ${BREAKPOINTS.mobile})`]: { - borderRadius: 0, - }, - }, -}); - -globalStyle(`${chatContainer} *`, { - boxSizing: 'border-box', -}); - -export const dialogContainer = style({ - position: 'relative', - padding: `0 ${DIALOG_PADDING}px ${DIALOG_PADDING}px ${DIALOG_PADDING}px`, - marginBottom: `-${DIALOG_PADDING}px`, - overflow: 'hidden', - scrollbarWidth: 'none', - flexGrow: 1, - overflowY: 'auto', - width: '100%', -}); - -export const bottomSpacer = recipe({ - base: { - display: 'block', - width: '100%', - transition: transition(['height']), - }, - variants: { - hasEnded: { - true: { - height: '0px', - }, - false: { - height: '20px', - }, - }, - }, -}); - -export const chatEndedContainer = style({ - padding: '4px 0', -}); - -export const chatContentWrapper = style({ - opacity: 0, - width: '100%', - selectors: { - [`.${chatIsOpen} &`]: { - animation: `${fadeIn} ${duration.slow} ${timingFunction.gentle} forwards`, - animationDelay: '.6s', - pointerEvents: 'auto', - }, - [`.${chatIsClosed} &`]: { - animation: `${fadeOut} ${duration.slow} ease-out`, - pointerEvents: 'none', - }, - }, -}); diff --git a/packages/chat/src/components/NewChat/NewChat.story.tsx b/packages/chat/src/components/NewChat/NewChat.story.tsx deleted file mode 100644 index d6d00318cf..0000000000 --- a/packages/chat/src/components/NewChat/NewChat.story.tsx +++ /dev/null @@ -1,340 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; -import { assignInlineVars } from '@vanilla-extract/dynamic'; -import { useState } from 'react'; - -import EMPTY_IMAGE from '@/__fixtures__/empty-image.png'; -import { SystemResponse } from '@/components'; -import { WithDefaultPalette, WithRuntimeProvider } from '@/storybook/decorators'; -import { createPalette } from '@/styles/colors'; -import { THEME } from '@/styles/colors.css'; - -import Indicator from '../SystemResponse/Indicator/Indicator'; -import { UserResponse } from '../UserResponse'; -import { NewChat } from '.'; - -const meta: Meta = { - title: 'Widget', - - parameters: { - layout: 'centered', - }, - decorators: [WithRuntimeProvider, WithDefaultPalette], -}; - -type Story = StoryObj; - -export default meta; - -const AgentSays = (messages: string[]) => ( - ({ type: 'text', text: m }))} - /> -); -const UserSays = (text: string) => ; - -const MockBaseComponent = ({ isLoading }: { isLoading?: boolean }) => { - const [messages, setMessages] = useState([ - { type: 'User', text: 'Cool, great weather ☀️' }, - { - type: 'User', - text: 'How bout you? What about Bob? How has he been. Is he ok. Should I separate these messages?', - }, - { type: 'Agent', text: 'Howdy, great to meet you!' }, - { type: 'Agent', text: 'What up' }, - { type: 'User', text: 'How bout you?' }, - { type: 'Agent', text: 'Howdy, great to meet you!' }, - { type: 'Agent', text: 'What up' }, - { type: 'User', text: 'How bout you?' }, - { type: 'Agent', text: 'Howdy, great to meet you!' }, - { type: 'Agent', text: 'What up' }, - { type: 'User', text: 'How bout you? Hows it going does this hit the loading state at the bottom of the chat?' }, - ]); - - const agentResponses = [ - 'How are you today?', - 'Nice to hear from you!', - 'I’m here to help!', - 'What can I do for you?', - 'Good to see you!', - ]; - - const handleSubmit = async (userText: string): Promise => { - if (!userText) return; - - // Add the new User message - const newMessages = [...messages]; - - // Add a random Agent response - const randomResponse = agentResponses[Math.floor(Math.random() * agentResponses.length)]; - newMessages.push({ type: 'Agent', text: randomResponse }); - - setMessages(newMessages); - }; - - return ( - handleSubmit(text), - placeholder: 'Message...', - }, - }} - isLoading={false} - hasEnded={false} - > - {messages.map((msg) => (msg.type === 'Agent' ? AgentSays([msg.text]) : UserSays(msg.text)))} - {isLoading && } - - ); -}; - -export const Base = { - render: () => , -}; - -export const BaseThemed = { - render: () => ( -
    - -
    - ), -}; - -export const LoadingState = { - render: () => , -}; - -export const Themed: Story = { - render: () => ( -
    -
    - Promise.resolve(), - placeholder: 'Message...', - }, - }} - isLoading={false} - hasEnded={false} - /> -
    - -
    - Promise.resolve(), - placeholder: 'Message...', - }, - }} - isLoading={false} - hasEnded={false} - /> -
    - -
    - Promise.resolve(), - placeholder: 'Message...', - }, - }} - isLoading={false} - hasEnded={false} - /> -
    -
    - ), -}; - -export const NoPoweredBy = { - render: () => ( - Promise.resolve(), - placeholder: 'Message...', - }, - }} - isLoading={false} - hasEnded={false} - /> - ), -}; - -export const OnlyPoweredBy = { - render: () => ( - Promise.resolve(), - placeholder: 'Message...', - }, - }} - isLoading={false} - hasEnded={false} - /> - ), -}; - -export const NoFooterLinks = { - render: () => ( - Promise.resolve(), - placeholder: 'Message...', - }, - }} - isLoading={false} - hasEnded={false} - > - {AgentSays(['👋🏻 Good morning!', 'How are you today?', 'How can I help you ?'])} - {UserSays('How bout you?')} - {AgentSays(['Thanks for asking', 'here are some cool emojis:', '😝 ✌️ ☎️ 🤦🏼‍♀️ 🤯'])} - {AgentSays(['Anything else I can do to help you today?'])} - {UserSays('Dont think so. Everything else is amazing!')} - {AgentSays(['ok, so bye for now'])} - - ), -}; - -export const ChatEnded = { - render: () => ( - Promise.resolve(), - placeholder: 'Message...', - }, - }} - isLoading={false} - hasEnded={true} - > - {AgentSays(['👋🏻 Good morning!', 'How are you today?', 'How can I help you ?'])} - {UserSays('How bout you?')} - {AgentSays(['Thanks for asking', 'here are some cool emojis:', '😝 ✌️ ☎️ 🤦🏼‍♀️ 🤯'])} - {UserSays('Cool, I *LOVE* emojis!')} - {AgentSays(["I know.\nThat's why I sent you some."])} - {UserSays('🤯')} - {AgentSays(['Anything else I can do to help you today?'])} - {UserSays('Dont think so. Everything else is amazing!')} - {AgentSays(['ok, so bye for now'])} - - ), -}; diff --git a/packages/chat/src/components/NewChat/index.tsx b/packages/chat/src/components/NewChat/index.tsx deleted file mode 100644 index 4f0f959e50..0000000000 --- a/packages/chat/src/components/NewChat/index.tsx +++ /dev/null @@ -1,132 +0,0 @@ -import clsx from 'clsx'; -import { useContext, useMemo, useRef, useState } from 'react'; - -import { ClassName } from '@/constants'; -import { AutoScrollProvider, RuntimeStateAPIContext, RuntimeStateContext } from '@/contexts'; -import type { Nullish } from '@/types'; -import { chain } from '@/utils/functional'; - -import { Header, type HeaderActionProps, type HeaderProps } from '../Header'; -import { type INewFooter, NewFooter } from '../NewFooter'; -import { Prompt } from '../Prompt'; -import { Separator } from '../Separator'; -import { type IWelcomeMessage, WelcomeMessage } from '../WelcomeMessage'; -import { ChatContainer } from './ChatContainer/ChatContainer.component'; -import { bottomSpacer, chatContainer, chatContentWrapper, chatEndedContainer, dialogContainer } from './NewChat.css'; - -export interface INewChat extends React.PropsWithChildren { - welcomeMessageProps: IWelcomeMessage; - headerProps: HeaderProps; - footerProps: Omit; - - /** - * If true, shows a loading indicator. - */ - isLoading: boolean; - - /** - * If true, shows audio interface controls. - */ - audioInterface?: boolean; - - /** - * If true, the user is using a mobile device. - */ - isMobile?: boolean; - - /** - * A unix timestamp indicating the start of the conversation. - */ - startTime?: Nullish; - - /** - * A callback that is executed when the chat widget is minimized. - */ - onMinimize?: React.MouseEventHandler; - - /** - * A callback that is executed when the conversation ends. - */ - onEnd?: React.MouseEventHandler; - - /** - * If true, the conversation was ended by the agent. - */ - hasEnded: boolean; - - /** - * A callback to start a new conversation. - */ - onStart?: (() => Promise) | undefined; -} - -const Chat: React.FC = ({ - headerProps, - welcomeMessageProps, - footerProps, - hasEnded, - onStart, - onMinimize, - onEnd, - children, - audioInterface, - isMobile, -}) => { - const [hasAlert, setAlert] = useState(false); - - const { config } = useContext(RuntimeStateAPIContext); - const state = useContext(RuntimeStateContext); - - const handleClose = (event: React.MouseEvent): void => { - if (hasEnded) { - onEnd?.(event); - } else { - setAlert(true); - } - }; - - const handleResume = (_: any): void => setAlert(false); - - const headerActions = useMemo(() => { - const items: HeaderActionProps[] = [{ svg: 'reset', onClick: handleClose }]; - if (isMobile) { - items.push({ svg: 'close', onClick: onMinimize }); - } - - return items; - }, [config.render, handleClose, onMinimize, state.audioOutput, audioInterface]); - - const scrollableAreaRef = useRef(null); - - return ( -
    -
    - -
    - -
    - {children} - - {hasEnded && !!state.session.turns.length && ( -
    - -
    - )} -
    -
    -
    - - - -
    - ); -}; - -export const NewChat = Object.assign(Chat, { - Container: ChatContainer, -}); diff --git a/packages/chat/src/components/NewFooter/BottomLinks/BottomLinks.css.ts b/packages/chat/src/components/NewFooter/BottomLinks/BottomLinks.css.ts deleted file mode 100644 index d1aa3a78dd..0000000000 --- a/packages/chat/src/components/NewFooter/BottomLinks/BottomLinks.css.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { style } from '@vanilla-extract/css'; -import { recipe } from '@vanilla-extract/recipes'; - -import { COLORS } from '@/styles/colors'; -import { THEME } from '@/styles/colors.css'; -import { hideTextOverflow } from '@/styles/font'; -import { SIZES } from '@/styles/sizes'; -import { transition } from '@/styles/transitions'; - -export const smallStyle = style({}); - -export const footerLinksContainer = recipe({ - base: { - color: COLORS.NEUTRAL_DARK[100], - fontFamily: THEME.fontFamily, - width: '100%', - padding: '10px 0', - fontSize: '12px', - lineHeight: '17px', - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - gap: '8px', - }, - variants: { - small: { - true: { - fontSize: '11px', - lineHeight: '15px', - }, - false: {}, - }, - }, -}); - -export const separator = style({ - height: '2px', - width: '2px', - borderRadius: SIZES.radius.round, - backgroundColor: COLORS.NEUTRAL_LIGHT[500], -}); - -export const extraLinkStyles = style({ - color: COLORS.NEUTRAL_DARK[100], - fontFamily: THEME.fontFamily, - fontSize: 'inherit', - lineHeight: 'inherit', - textDecorationColor: 'transparent', - transition: transition(['color', 'text-decoration-color']), - selectors: { - '&:hover': { - textDecoration: 'underline', - color: THEME.colors[500], - textDecorationColor: THEME.colors[500], - }, - '&:active': { - color: THEME.colors[600], - textDecorationColor: THEME.colors[600], - }, - }, -}); - -export const voiceflowLink = style({ - color: COLORS.NEUTRAL_DARK[100], - textDecoration: 'underline', - textDecorationColor: 'transparent', - transition: transition(['color', 'text-decoration-color']), - selectors: { - '&:hover': { - color: THEME.colors[500], - textDecorationColor: THEME.colors[500], - }, - '&:active': { - color: THEME.colors[600], - textDecorationColor: 'transparent', - }, - }, -}); - -export const footerNote = style({ - color: COLORS.NEUTRAL_DARK[100], - fontFamily: THEME.fontFamily, - fontSize: 'inherit', - lineHeight: 'inherit', - textDecorationColor: 'transparent', - transition: transition(['color', 'text-decoration-color']), - ...hideTextOverflow(), -}); diff --git a/packages/chat/src/components/NewFooter/BottomLinks/index.tsx b/packages/chat/src/components/NewFooter/BottomLinks/index.tsx deleted file mode 100644 index 5b21ec447e..0000000000 --- a/packages/chat/src/components/NewFooter/BottomLinks/index.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import clsx from 'clsx'; - -import { extraLinkStyles, footerLinksContainer, footerNote, separator, voiceflowLink } from './BottomLinks.css'; - -const VOICEFLOW_URL = 'https://www.voiceflow.com/'; - -interface IBottomLinks { - isSmall?: boolean; - className?: string; - extraLinkUrl?: string; - showPoweredBy?: boolean; - extraLinkText?: string; -} - -export const BottomLinks: React.FC = ({ - isSmall = false, - className, - extraLinkUrl, - extraLinkText, - showPoweredBy, -}) => { - const showExtraLink = !!extraLinkText && !!extraLinkUrl; - const showExtraText = !!extraLinkText && !extraLinkUrl; - - const showSeparator = showPoweredBy && (showExtraLink || showExtraText); - - return ( -
    - {showPoweredBy && ( - - )} - - {showSeparator && - ); -}; diff --git a/packages/chat/src/components/NewFooter/NewFooter.css.ts b/packages/chat/src/components/NewFooter/NewFooter.css.ts deleted file mode 100644 index 42ddacd131..0000000000 --- a/packages/chat/src/components/NewFooter/NewFooter.css.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { keyframes, style } from '@vanilla-extract/css'; -import { recipe } from '@vanilla-extract/recipes'; - -import { duration, timingFunction } from '@/styles/animations'; -import { chatIsClosed, chatIsOpen } from '@/views/ChatWidget/styles.css'; - -const BUTTON_ROW_MARGIN = 10; - -const fadeInAndSlideUp = keyframes({ - from: { - opacity: 0, - transform: 'translateY(40px)', - }, - to: { - opacity: 1, - transform: 'translateY(0)', - }, -}); - -const fadeOutSlideDown = keyframes({ - from: { - opacity: 1, - transform: 'translateY(0)', - }, - to: { - opacity: 0, - transform: 'translateY(40px)', - }, -}); - -export const footerContainer = style({ - width: '100%', - selectors: { - [`.${chatIsOpen} &`]: { - animation: `${fadeInAndSlideUp} .6s ${timingFunction.gentle} forwards`, - }, - [`.${chatIsClosed} &`]: { - animationDelay: duration.slow, - animation: `${fadeOutSlideDown} 300ms ${timingFunction.gentle} forwards`, - }, - }, -}); - -export const buttonsContainer = style({ - display: 'flex', - gap: '8px', - flexWrap: 'nowrap', - marginBottom: `${BUTTON_ROW_MARGIN}px`, - overflow: 'hidden', - overflowX: 'scroll', - scrollbarWidth: 'none', - padding: '0 20px', -}); - -export const inputContainer = style({ - padding: '0 20px', -}); - -export const messageContainer = recipe({ - base: { - padding: '0 20px', - position: 'relative', - background: - 'linear-gradient(180deg, rgba(255, 255, 255, 0.00) 0%, rgba(255, 255, 255, 0.00) 29.49%, #FFF 29.5%, #F8F8F8 100%)', - }, -}); - -export const hasEnded = style({ - top: '-24px', -}); diff --git a/packages/chat/src/components/NewFooter/NewFooter.story.tsx b/packages/chat/src/components/NewFooter/NewFooter.story.tsx deleted file mode 100644 index de2b564c19..0000000000 --- a/packages/chat/src/components/NewFooter/NewFooter.story.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; - -import { WithDefaultPalette } from '@/storybook/decorators'; -import { widgetContainer } from '@/views/ChatWidget/styles.css'; - -import type { INewFooter } from '.'; -import { NewFooter } from '.'; - -type Story = StoryObj; - -const buttons = [ - { - label: 'Label', - onClick: () => alert('Button 1 clicked'), - }, - { - label: 'Label', - onClick: () => alert('Button 2 clicked'), - }, - { - label: 'Label', - onClick: () => alert('Button 3 clicked'), - }, - { - label: 'Label', - onClick: () => alert('Button 4 clicked'), - }, - { - label: 'Label', - onClick: () => alert('Button 5 clicked'), - }, - { - label: 'Label', - onClick: () => alert('Button 6 clicked'), - }, - { - label: 'Label', - onClick: () => alert('Button 6 clicked'), - }, -]; - -const meta: Meta = { - title: 'Components/Chat/NewFooter', - component: NewFooter, - decorators: [ - WithDefaultPalette, - (Story) => ( -
    - -
    - ), - ], -}; - -export default meta; - -const MockComponent = (props: Omit) => { - return ; -}; - -export const Default: Story = { - args: { - buttons: [], - showPoweredBy: false, - }, - render: (args) => , -}; - -export const Everything: Story = { - ...Default, - args: { - buttons, - showPoweredBy: true, - }, -}; - -export const WithScrollButton: Story = { - ...Default, - args: {}, -}; - -export const WithButtons: Story = { - ...Default, - args: { - buttons, - }, -}; - -export const WithPoweredByAndText: Story = { - ...Default, - args: { - showPoweredBy: true, - extraLinkText: 'Extra Link', - }, -}; - -export const WithPoweredByAndLink: Story = { - ...Default, - args: { - showPoweredBy: true, - extraLinkText: 'Extra Link', - extraLinkUrl: 'https://voiceflow.com', - }, -}; diff --git a/packages/chat/src/components/NewFooter/ScrollButton/ScrollButton.css.ts b/packages/chat/src/components/NewFooter/ScrollButton/ScrollButton.css.ts deleted file mode 100644 index 18aff37d6b..0000000000 --- a/packages/chat/src/components/NewFooter/ScrollButton/ScrollButton.css.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { style } from '@vanilla-extract/css'; - -import { COLORS } from '@/styles/colors'; -import { transition } from '@/styles/transitions'; - -export const BUTTON_SIZE = 32; - -export const scrollButton = style({ - width: BUTTON_SIZE, - height: BUTTON_SIZE, - borderRadius: '50%', - display: 'flex', - flex: 'none', - alignItems: 'center', - justifyContent: 'center', - border: `1px solid ${COLORS.NEUTRAL_LIGHT[100]}`, - background: COLORS.white, - color: COLORS.NEUTRAL_DARK[100], - transition: transition(['color', 'scale']), - cursor: 'pointer', - selectors: { - '&:hover': { - color: COLORS.NEUTRAL_DARK[600], - scale: 1.1, - }, - '&:active': { - color: COLORS.NEUTRAL_DARK[800], - scale: 0.8, - }, - }, -}); - -export const scrollIcon = style({ - width: BUTTON_SIZE, - height: BUTTON_SIZE, -}); diff --git a/packages/chat/src/components/NewFooter/ScrollButton/index.tsx b/packages/chat/src/components/NewFooter/ScrollButton/index.tsx deleted file mode 100644 index 0fb9cb5e76..0000000000 --- a/packages/chat/src/components/NewFooter/ScrollButton/index.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import clsx from 'clsx'; - -import { arrowDown } from '@/assets/svg'; - -import { scrollButton, scrollIcon } from './ScrollButton.css'; - -export const ScrollButton = ({ onClick, className }: { onClick?: () => void; className?: string }) => { - return ( - - ); -}; diff --git a/packages/chat/src/components/NewFooter/index.tsx b/packages/chat/src/components/NewFooter/index.tsx deleted file mode 100644 index 64f81f2e64..0000000000 --- a/packages/chat/src/components/NewFooter/index.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import clsx from 'clsx'; -import type { RefObject } from 'react'; - -import { ClassName } from '@/constants'; - -import { Button } from '../Button'; -import { ButtonVariant } from '../Button/constants'; -import type { IMessageInput } from '../MessageInput'; -import { MessageInput } from '../MessageInput'; -import { promptContainer } from '../Prompt/styles.css'; -import { ScrollToBottom } from '../ScrollToBottom'; -import { BottomLinks } from './BottomLinks'; -import { buttonsContainer, footerContainer, hasEnded, messageContainer } from './NewFooter.css'; - -export interface INewFooter { - buttons?: { label: string; onClick: () => void }[]; - showPoweredBy?: boolean; - messageInputProps: IMessageInput; - extraLinkText?: string; - extraLinkUrl?: string; - scrollableAreaRef: RefObject; - - /** - * A callback to submit a user response. - */ - onSend?: ((message: string) => Promise) | undefined; - - /** - * A callback to start a new conversation. - */ - onStart?: (() => Promise) | undefined; -} - -export const NewFooter: React.FC = ({ - buttons, - showPoweredBy, - messageInputProps, - extraLinkText, - extraLinkUrl, - scrollableAreaRef, - onStart, -}) => { - return ( -
    -
    - -
    - - {(buttons?.length ?? 0) > 0 && ( -
    - {buttons?.map((button) => ( - - ))} -
    - )} - -
    - - - -
    -
    - ); -}; diff --git a/packages/chat/src/components/Proactive/index.tsx b/packages/chat/src/components/Proactive/index.tsx deleted file mode 100644 index 5294aee4d1..0000000000 --- a/packages/chat/src/components/Proactive/index.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import { Trace } from '@voiceflow/base-types'; -import type { WidgetSettingsWidgetPosition } from '@voiceflow/dtos-interact'; -import clsx from 'clsx'; -import { useEffect, useMemo, useState } from 'react'; -import { match } from 'ts-pattern'; - -import { ClassName } from '@/constants'; -import { fadeInAndUp } from '@/styles/animation-utils.css'; - -import { Button } from '../Button'; -import { Icon } from '../Icon'; -import { - closeButton, - closeButtonIcon, - closed, - messageContainer, - proactiveContainer, - singleMessage, -} from './styles.css'; - -interface ProactiveQueueProps { - side: WidgetSettingsWidgetPosition; - messages: Trace.AnyTrace[]; -} - -export const Proactive: React.FC = ({ side, messages }) => { - const [isClosed, setIsClosed] = useState(false); - - const queue = useMemo( - () => - messages.map((message, index) => - match(message) - .with({ type: Trace.TraceType.TEXT }, ({ payload }) => ( -
    - {String(payload.message)} -
    - )) - .otherwise(() => null) - ), - [messages] - ); - - useEffect(() => { - if (!queue.length) return; - setIsClosed(false); - }, [queue]); - - const close = () => { - setIsClosed(true); - }; - - if (!queue.length) return null; - - return ( -
    - -
    {queue}
    -
    - ); -}; diff --git a/packages/chat/src/components/Proactive/styles.css.ts b/packages/chat/src/components/Proactive/styles.css.ts deleted file mode 100644 index de6a47fea7..0000000000 --- a/packages/chat/src/components/Proactive/styles.css.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { style } from '@vanilla-extract/css'; -import { recipe } from '@vanilla-extract/recipes'; - -import { COLORS } from '@/styles/colors'; -import { THEME } from '@/styles/colors.css'; -import { SIZES } from '@/styles/sizes'; -import { transition } from '@/styles/transitions'; - -export const proactiveContainer = recipe({ - base: { - position: 'absolute', - bottom: '100%', - width: 256, - display: 'flex', - flexDirection: 'column', - transition: transition(['opacity']), - }, - - variants: { - side: { - right: { - right: 0, - alignItems: 'end', - }, - left: { - left: 0, - alignItems: 'start', - }, - }, - }, -}); - -export const singleMessage = style({ - padding: '11px 16px 10px 16px', - maxWidth: 256, - color: COLORS.NEUTRAL_DARK[900], - boxShadow: - '0px 1px 0px 0px rgba(22, 26, 30, 0.02), 0px 0px 0px 1px rgba(22, 26, 30, 0.04), 0px 1px 5px -4px rgba(22, 26, 30, 0.08), 0px 4px 8px -6px rgba(22, 26, 30, 0.08), 0px 1px 3px 1px rgba(22, 26, 30, 0.01)', - borderRadius: SIZES.radius.xs, - backgroundColor: COLORS.white, - fontSize: 14, - lineHeight: '20px', - fontFamily: THEME.fontFamily, - opacity: 0, - transition: transition(['opacity']), -}); - -export const messageContainer = style({ - display: 'flex', - flexDirection: 'column', - gap: 8, - margin: '16px 0', - alignItems: 'inherit', -}); - -export const closeButton = style({ - width: SIZES.sm, - height: SIZES.sm, - borderRadius: SIZES.radius.round, - borderWidth: 1, - borderStyle: 'solid', - borderColor: COLORS.NEUTRAL_LIGHT[100], - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - color: '#656D75', - cursor: 'pointer', - backgroundColor: COLORS.white, - boxShadow: '0px 3px 4px 0px rgba(0, 0, 0, 0.02), 0px 8px 42px -16px rgba(0, 0, 0, 0.06)', - transition: transition(['opacity', 'color', 'transform']), - ':hover': { - backgroundColor: COLORS.white, - color: COLORS.NEUTRAL_DARK[600], - transform: 'scale(1.15)', - }, - ':active': { - backgroundColor: COLORS.white, - color: COLORS.NEUTRAL_DARK[800], - transform: 'scale(0.8)', - }, -}); - -export const closeButtonIcon = style({ - width: 10, - height: 10, - marginBottom: 2, -}); - -export const closed = style({ - opacity: 0, - pointerEvents: 'none', -}); diff --git a/packages/chat/src/components/Prompt/Prompt.story.tsx b/packages/chat/src/components/Prompt/Prompt.story.tsx deleted file mode 100644 index 1d3a90ed55..0000000000 --- a/packages/chat/src/components/Prompt/Prompt.story.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; -import { useState } from 'react'; - -import { WithDefaultPalette } from '@/storybook/decorators'; - -import { Prompt } from '.'; - -type Story = StoryObj; - -const InteractiveMock = (args: any) => { - const [visible, setVisible] = useState(true); - return ( - <> -
    - - - - ); -}; - -const meta: Meta = { - title: 'Components/Chat/Prompt', - component: Prompt, - args: { - cancel: { label: 'Cancel' }, - }, - render: (args) => , - decorators: [WithDefaultPalette], -}; - -export default meta; - -export const Base: Story = { - args: { - visible: true, - accept: { label: 'Primary Action' }, - }, -}; - -export const Dangerous: Story = { - args: { - visible: true, - accept: { label: 'Dangerous Action' }, - }, -}; diff --git a/packages/chat/src/components/Prompt/index.tsx b/packages/chat/src/components/Prompt/index.tsx deleted file mode 100644 index 1b42883a2e..0000000000 --- a/packages/chat/src/components/Prompt/index.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import clsx from 'clsx'; - -import { Button } from '@/components/Button'; -import { ClassName } from '@/constants'; - -import { ButtonVariant } from '../Button/constants'; -import { chatOverlay, promptContainer } from './styles.css'; - -export interface PromptOptionProps extends React.ComponentProps { - /** - * The label that will appear on the action button. - */ - label: string; -} - -export interface PromptProps { - /** - * Is the prompt visible. - */ - visible: boolean; - - /** - * Should we show an overlay over the dialog area. - */ - showOverlay: boolean; - - /** - * Configuration for the "accept" action. - */ - accept: PromptOptionProps; - - /** - * Configuration for the "cancel" action. - */ - cancel: PromptOptionProps; -} - -/** - * A popup that prompts the user with cancel and accept actions. - * - * @see {@link https://voiceflow.github.io/react-chat/?path=/story/components-chat-prompt--default} - */ -export const Prompt: React.FC = ({ visible, showOverlay, accept, cancel }) => { - return ( - <> -
    cancel?.onClick?.(e)} - >
    -
    - - -
    - - ); -}; diff --git a/packages/chat/src/components/Prompt/styles.css.ts b/packages/chat/src/components/Prompt/styles.css.ts deleted file mode 100644 index 19180637f9..0000000000 --- a/packages/chat/src/components/Prompt/styles.css.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { recipe } from '@vanilla-extract/recipes'; - -import { componentAnimations, timingFunction } from '@/styles/animations'; -import { COLORS } from '@/styles/colors'; -import { SIZES } from '@/styles/sizes'; -import { transition } from '@/styles/transitions'; - -export const promptContainer = recipe({ - base: { - position: 'absolute', - bottom: 0, - width: '100%', - boxSizing: 'border-box', - transition: `transform ${componentAnimations.endChat.transform} ${timingFunction.gentle}, box-shadow ${componentAnimations.endChat.boxShadow} ease, opacity ${componentAnimations.endChat.opacity} ease`, - transform: 'translateY(130px)', - padding: '12px 12px 30px 12px', - borderRadius: SIZES.radius.lg, - backgroundColor: COLORS.white, - boxShadow: '0px 0px 0px 1px rgba(0, 0, 0, 0.06), 0px 0px 32px 0px rgba(0, 0, 0, 0.08)', - display: 'flex', - flexDirection: 'column', - gap: 8, - zIndex: 300, - opacity: 0, - pointerEvents: 'none', - }, - - variants: { - visible: { - true: { - transform: 'translateY(18px)', - opacity: 1, - pointerEvents: 'auto', - }, - false: { - transform: 'translateY(130px)', - transition: `all 0.25s ${timingFunction.gentle}`, - opacity: 0, - }, - }, - }, -}); - -export const chatOverlay = recipe({ - base: { - position: 'absolute', - top: 0, - bottom: 0, - left: 0, - right: 0, - backgroundColor: 'rgba(0,0,0,0.16)', - opacity: 0, - transition: transition(['opacity']), - pointerEvents: 'none', - }, - variants: { - visible: { - true: { - display: 'block', - opacity: 1, - zIndex: 200, - pointerEvents: 'auto', - }, - }, - }, -}); diff --git a/packages/chat/src/components/ScrollToBottom/index.tsx b/packages/chat/src/components/ScrollToBottom/index.tsx deleted file mode 100644 index 9e6ae5930a..0000000000 --- a/packages/chat/src/components/ScrollToBottom/index.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import clsx from 'clsx'; -import { type RefObject, useContext, useEffect, useRef, useState } from 'react'; - -import { IsAutoScrollingContext } from '@/contexts'; - -import { ScrollButton } from '../NewFooter/ScrollButton'; -import { scrollToBottomButton, scrollToButtonContainer } from './styles.css'; - -interface ScrollToBottomProps { - scrollableAreaRef: RefObject; - className?: string; -} - -export const ScrollToBottom: React.FC = ({ scrollableAreaRef, className }) => { - const autoScrolling = useContext(IsAutoScrollingContext); - const [atBottom, setAtBottom] = useState(true); - const prevScrollPosition = useRef(); - const pauseCheck = useRef(false); - - useEffect(() => { - const currentRef = scrollableAreaRef?.current; - if (currentRef) { - currentRef.addEventListener('scroll', handleScroll); - } - return () => { - if (currentRef) { - currentRef.removeEventListener('scroll', handleScroll); - } - }; - }, []); - - useEffect(() => { - // If it's auto scrolling, then immediately hide the button and pause checking - // for a bit. - pauseCheck.current = autoScrolling; - if (autoScrolling) setAtBottom(true); - }, [autoScrolling]); - - const handleScroll = () => { - if (!scrollableAreaRef?.current || !prevScrollPosition) return; - if (pauseCheck.current) { - return; - } - - const { scrollTop, scrollHeight, clientHeight } = scrollableAreaRef.current; - - const buffer = 10; - const isAboveBottom = scrollTop + clientHeight < scrollHeight - buffer; - - setAtBottom(!isAboveBottom); - prevScrollPosition.current = scrollTop; - }; - - const scrollToBottom = () => { - if (!scrollableAreaRef?.current) return; - - // We know that it will reach the bottom, so we call `setAtBottom(true)` cause we want - // to immediately hide the button while it scrolls down. - // ...and there's no reliable way of knowing when the scroll action finished, so we - // just use a timer. - setAtBottom(true); - pauseCheck.current = true; - setTimeout(() => { - pauseCheck.current = false; - }, 700); - - scrollableAreaRef.current.scrollTo({ - top: scrollableAreaRef.current.scrollHeight, - behavior: 'smooth', - }); - }; - - return ( -
    - -
    - ); -}; diff --git a/packages/chat/src/components/ScrollToBottom/styles.css.ts b/packages/chat/src/components/ScrollToBottom/styles.css.ts deleted file mode 100644 index 0d72f572ca..0000000000 --- a/packages/chat/src/components/ScrollToBottom/styles.css.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { keyframes, style } from '@vanilla-extract/css'; -import { recipe } from '@vanilla-extract/recipes'; - -import { BUTTON_SIZE } from '../NewFooter/ScrollButton/ScrollButton.css'; - -const fadeIn = keyframes({ - from: { - opacity: 0, - transform: 'translateY(10px)', - }, - to: { - opacity: 1, - transform: 'translateY(0)', - }, -}); - -const fadeOut = keyframes({ - from: { - opacity: 1, - transform: 'translateY(0)', - }, - to: { - opacity: 0, - transform: 'translateY(10px)', - }, -}); - -export const scrollToButtonContainer = style({ - height: 0, - width: '100%', - position: 'relative', - zIndex: 12, -}); - -export const scrollToBottomButton = recipe({ - base: { - opacity: 1, - position: 'absolute', - left: `calc(50% - ${BUTTON_SIZE / 2}px)`, - top: `-${BUTTON_SIZE + 12}px`, - animation: `${fadeIn} .15s ease-in`, - outline: 'none', - }, - variants: { - hidden: { - true: { - opacity: 0, - animation: `${fadeOut} .15s ease-in`, - }, - }, - }, -}); diff --git a/packages/chat/src/components/SendButton/SendButton.story.tsx b/packages/chat/src/components/SendButton/SendButton.story.tsx deleted file mode 100644 index 0f1c4b7bc6..0000000000 --- a/packages/chat/src/components/SendButton/SendButton.story.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; - -import { WithDefaultPalette } from '@/storybook/decorators'; - -import { SendButton } from '.'; - -type Story = StoryObj; - -const meta: Meta = { - title: 'Core/Send Button', - component: SendButton, - decorators: [WithDefaultPalette], -}; -export default meta; - -export const Default: Story = { - args: { - disabled: false, - color: '#387dff', - }, -}; - -export const Disabled: Story = { - args: { - disabled: true, - color: '#387dff', - }, -}; diff --git a/packages/chat/src/components/SendButton/SendIcon.tsx b/packages/chat/src/components/SendButton/SendIcon.tsx deleted file mode 100644 index b58a83b1bd..0000000000 --- a/packages/chat/src/components/SendButton/SendIcon.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import type { SVGProps } from 'react'; - -export const SendIcon = (props: SVGProps) => ( - - - -); diff --git a/packages/chat/src/components/SendButton/index.tsx b/packages/chat/src/components/SendButton/index.tsx deleted file mode 100644 index 7c87008a25..0000000000 --- a/packages/chat/src/components/SendButton/index.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import clsx from 'clsx'; -import { type ComponentPropsWithRef, forwardRef } from 'react'; - -import { ClassName } from '@/constants'; - -import { Button } from '../Button'; -import { SendIcon } from './SendIcon'; -import { sendButtonStyle, sendIconStyle } from './styles.css'; - -interface SendButtonProps extends ComponentPropsWithRef<'button'> { - disabled?: boolean; - testID?: string; -} - -export const SendButton: React.FC = forwardRef( - ({ disabled, testID, ...props }, ref) => ( - - ) -); diff --git a/packages/chat/src/components/SendButton/styles.css.ts b/packages/chat/src/components/SendButton/styles.css.ts deleted file mode 100644 index f69ab21a98..0000000000 --- a/packages/chat/src/components/SendButton/styles.css.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { recipe } from '@vanilla-extract/recipes'; - -import { COLORS } from '@/styles/colors'; -import { THEME } from '@/styles/colors.css'; -import { transition } from '@/styles/transitions'; - -import { buttonStyles } from '../Button/styles.css'; - -export const sendButtonStyle = recipe({ - base: [ - buttonStyles({ round: true }), - { - display: 'flex', - height: 32, - width: 32, - padding: 0, - boxShadow: '0px -1px 0px 0px rgba(0, 0, 0, 0.16) inset', - transition: transition(['color', 'background-color', 'transform']), - }, - ], - variants: { - disabled: { - true: { - boxShadow: 'none', - backgroundColor: COLORS.NEUTRAL_LIGHT[50], - ':hover': { - cursor: 'not-allowed', - backgroundColor: COLORS.NEUTRAL_LIGHT[50], - }, - }, - false: { - backgroundColor: THEME.colors[500], - ':hover': { - transform: 'scale(1.15)', - backgroundColor: THEME.colors[600], - }, - ':active': { - transform: 'scale(1)', - backgroundColor: THEME.colors[700], - }, - }, - }, - }, -}); - -export const sendIconStyle = recipe({ - variants: { - disabled: { - true: { - color: COLORS.NEUTRAL_DARK[100], - }, - false: { - color: THEME.colors[50], - }, - }, - }, -}); diff --git a/packages/chat/src/components/Separator/Separator.story.tsx b/packages/chat/src/components/Separator/Separator.story.tsx deleted file mode 100644 index f286b6260a..0000000000 --- a/packages/chat/src/components/Separator/Separator.story.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; - -import { Separator } from '.'; - -type Story = StoryObj; - -const meta: Meta = { - title: 'Components/Chat/Separator', - component: Separator, -}; - -export default meta; - -export const Default: Story = { - args: { - text: 'Chat has ended', - }, -}; diff --git a/packages/chat/src/components/Separator/index.tsx b/packages/chat/src/components/Separator/index.tsx deleted file mode 100644 index a86f5e507b..0000000000 --- a/packages/chat/src/components/Separator/index.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { line, separatorContainer, separatorText } from './styles.css'; - -export const Separator = ({ text }: { text: string }) => ( -
    -
    -
    {text}
    -
    -
    -); diff --git a/packages/chat/src/components/Separator/styles.css.ts b/packages/chat/src/components/Separator/styles.css.ts deleted file mode 100644 index 95ce8bf287..0000000000 --- a/packages/chat/src/components/Separator/styles.css.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { style } from '@vanilla-extract/css'; - -import { COLORS } from '@/styles/colors'; -import { THEME } from '@/styles/colors.css'; - -export const separatorContainer = style({ - height: 17, - display: 'flex', - gap: 12, - alignItems: 'center', - padding: '4px 0', -}); - -export const line = style({ - backgroundColor: COLORS.NEUTRAL_LIGHT[50], - height: 1, - flexGrow: 1, -}); - -export const separatorText = style({ - backgroundColor: COLORS.white, - color: COLORS.NEUTRAL_DARK[200], - fontFamily: THEME.fontFamily, - fontSize: '12px', - lineHeight: '17px', - fontWeight: 600, - flexShrink: 0, -}); diff --git a/packages/chat/src/components/SystemResponse/ExtensionMessage.tsx b/packages/chat/src/components/SystemResponse/ExtensionMessage.tsx deleted file mode 100644 index b973eaef67..0000000000 --- a/packages/chat/src/components/SystemResponse/ExtensionMessage.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import type { Trace } from '@voiceflow/base-types'; -import clsx from 'clsx'; -import { useEffect, useRef } from 'react'; - -import { ClassName } from '@/constants'; -import type { ResponseExtension } from '@/dtos/Extension.dto'; - -import { extensionMessageContainer } from './styles.css'; - -export interface ExtensionMessageProps { - extension: ResponseExtension; - trace: Trace.AnyTrace; -} - -export const ExtensionMessage: React.FC = ({ extension, trace }) => { - const ref = useRef(null); - - useEffect(() => { - try { - const unmount = extension.render?.({ trace, element: ref.current as HTMLElement }); - if (!unmount) return undefined; - - return () => { - try { - unmount?.(); - } catch (e) { - console.error(`Extension '${extension.name}' threw an error while unmounting: ${e}`); - } - }; - } catch (e) { - console.error(`Extension '${extension.name}' threw an error while mounting: ${e}`); - return undefined; - } - }, []); - - return ( -
    - -
    - ); -}; diff --git a/packages/chat/src/components/SystemResponse/Indicator/Indicator.css.ts b/packages/chat/src/components/SystemResponse/Indicator/Indicator.css.ts deleted file mode 100644 index a18ae0dd52..0000000000 --- a/packages/chat/src/components/SystemResponse/Indicator/Indicator.css.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { style } from '@vanilla-extract/css'; - -export const indicatorContainer = style({ - display: 'flex', - alignItems: 'center', - gap: '12px', -}); diff --git a/packages/chat/src/components/SystemResponse/Indicator/Indicator.story.tsx b/packages/chat/src/components/SystemResponse/Indicator/Indicator.story.tsx deleted file mode 100644 index bfcd5fe5f9..0000000000 --- a/packages/chat/src/components/SystemResponse/Indicator/Indicator.story.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; - -import EMPTY_IMAGE from '@/__fixtures__/empty-image.png'; - -import Indicator from './Indicator'; - -type Story = StoryObj; - -const meta: Meta = { - title: 'Components/Chat/Indicator', - component: Indicator, - args: { - avatar: EMPTY_IMAGE, - }, - argTypes: {}, - excludeStories: ['RawTemplate'], - render: (args) => , -}; - -export default meta; - -export const SimpleText: Story = { - args: { - avatar: EMPTY_IMAGE, - }, -}; diff --git a/packages/chat/src/components/SystemResponse/Indicator/Indicator.tsx b/packages/chat/src/components/SystemResponse/Indicator/Indicator.tsx deleted file mode 100644 index 00f9975ee9..0000000000 --- a/packages/chat/src/components/SystemResponse/Indicator/Indicator.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import clsx from 'clsx'; - -import { Avatar } from '@/components/Avatar'; -import { MessageContainer } from '@/components/MessageContainer'; -import { TypingIndicator } from '@/components/TypingIndicator'; - -import { indicatorContainer } from './Indicator.css'; - -export interface IndicatorProps { - avatar?: string; - isLast?: boolean; - className?: string; -} - -const Indicator: React.FC = ({ avatar, isLast, className }) => ( - - {avatar && } - - -); - -export default Indicator; diff --git a/packages/chat/src/components/SystemResponse/SystemMessage.tsx b/packages/chat/src/components/SystemResponse/SystemMessage.tsx deleted file mode 100644 index 5b3dd38ea1..0000000000 --- a/packages/chat/src/components/SystemResponse/SystemMessage.tsx +++ /dev/null @@ -1,114 +0,0 @@ -import clsx from 'clsx'; -import { useContext } from 'react'; -import * as R from 'remeda'; -import { match } from 'ts-pattern'; - -import { ClassName } from '@/constants'; -import { RuntimeStateAPIContext } from '@/contexts'; - -import { AgentMessage } from '../AgentMessage'; -import { Avatar } from '../Avatar'; -import { Card } from '../Card'; -import { Carousel } from '../Carousel'; -import { FeedbackButton } from '../FeedbackButton'; -import { type IFeedbackButton } from '../FeedbackButton/FeedbackButton.interface'; -import { Image } from '../Image'; -import { MessageType } from './constants'; -import { ExtensionMessage } from './ExtensionMessage'; -import { hide, messageContainer, responseAvatar, systemMessageContainer } from './styles.css'; -import type { MessageProps } from './types'; - -export interface AIDisclaimerProps { - enabled?: boolean; - text?: string; -} - -export interface SystemMessageProps { - /** - * An image URL for an avatar to associate this message with. - */ - avatar?: string; - - /** - * A unix timestamp indicating when this message was sent. - */ - timestamp?: number; - - /** - * A single message to render. - */ - message?: MessageProps; - - /** - * If true, renders an avatar next to the message. - */ - withImage: boolean; - - /** - * If provided, will display {@link FeedbackButton} component. - * @default false - */ - feedback?: IFeedbackButton | undefined; - - /** - * If this is the last message recieved - */ - isLast?: boolean; - - /** - * The entire text content of a response over a number of responses - */ - textContent?: string; - - aiDisclaimer?: AIDisclaimerProps; -} - -/** - * An individual message within a system response - */ -export const SystemMessage: React.FC = ({ - avatar, - message, - feedback, - isLast, - withImage, - textContent, - aiDisclaimer, -}) => { - const { config } = useContext(RuntimeStateAPIContext); - - return ( -
    - {match(message) - // We check for `MessageType.CAROUSEL` before all the others, because a Carousel will take care - // of rendering the Avatar itself - .with({ type: MessageType.CAROUSEL }, (props) => ( - - )) - .otherwise((message) => ( - <> - {avatar && } -
    - {match(message) - .with({ type: MessageType.TEXT }, ({ text, ai }) => ( - - )) - .with({ type: MessageType.IMAGE }, ({ url }) => ) - .with({ type: MessageType.CARD }, (props) => ) - .with({ type: MessageType.EXTENSION }, ({ payload }) => ( - - )) - .otherwise(() => null)} -
    - - ))} -
    - ); -}; diff --git a/packages/chat/src/components/SystemResponse/SystemResponse.story.tsx b/packages/chat/src/components/SystemResponse/SystemResponse.story.tsx deleted file mode 100644 index 190c590f13..0000000000 --- a/packages/chat/src/components/SystemResponse/SystemResponse.story.tsx +++ /dev/null @@ -1,197 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; - -import EMPTY_IMAGE from '@/__fixtures__/empty-image.png'; -import CODE_RESPONSE_FIXTURE from '@/__fixtures__/markdown/code-response.md?raw'; -import { MOCK_IMAGE, VF_ICON } from '@/fixtures'; - -import { FeedbackButtonVariant } from '../FeedbackButton/FeedbackButton.interface'; -import type { MessageProps } from '.'; -import { SystemResponse } from '.'; - -type Story = StoryObj; - -const CARD_IMAGE = MOCK_IMAGE; -const TEXT_MESSAGE: MessageProps = { - type: 'text', - text: 'Lorem ipsum dolor sit amet consectetur voluptas perspiciatis est quis dolores', -}; -const CARD: MessageProps = { - type: 'card', - title: 'Card Message', - description: - 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Exercitationem voluptas perspiciatis est quis dolores!', - image: CARD_IMAGE, -}; - -const meta: Meta = { - title: 'Components/Chat/SystemResponse', - component: SystemResponse, - args: { - timestamp: Date.now(), - avatar: VF_ICON, - isLast: true, - }, - argTypes: { - timestamp: { - control: { type: 'date' }, - }, - }, - excludeStories: ['RawTemplate'], - render: (args) => , -}; - -export default meta; - -export const SimpleText: Story = { - args: { - avatar: EMPTY_IMAGE, - messages: [{ type: 'text', text: 'Lorem ipsum dolor' }], - }, -}; - -export const SimpleTextWithoutAvatar: Story = { - args: { - messages: [{ type: 'text', text: 'Lorem ipsum dolor' }], - }, -}; - -export const TypingState: Story = { - args: { - avatar: EMPTY_IMAGE, - messages: [{ type: 'text', text: 'Lorem ipsum dolor', delay: 10000 }], - isLast: true, - }, -}; - -export const WrappingText: Story = { - args: { - messages: [{ type: 'text', text: 'consecteturaconsecteturaconsecteturaconsecteturaconsecteturaconsectetura' }], - }, -}; - -export const CodeResponse: Story = { - args: { - avatar: EMPTY_IMAGE, - messages: [{ type: 'text', text: CODE_RESPONSE_FIXTURE }], - }, -}; - -export const MultilineText: Story = { - args: { - messages: [TEXT_MESSAGE], - }, -}; - -export const ActionableText: Story = { - args: { - messages: [TEXT_MESSAGE, TEXT_MESSAGE, TEXT_MESSAGE], - isLast: true, - actions: [ - { request: {} as any, name: 'Button One' }, - { request: {} as any, name: 'Button Two' }, - { request: {} as any, name: 'Button Three' }, - ], - }, -}; - -export const Image: Story = { - args: { - messages: [{ type: 'image', url: CARD_IMAGE }], - }, -}; - -export const Card: Story = { - args: { - messages: [CARD], - }, -}; - -export const ActionableCard: Story = { - args: { - messages: [ - { - ...CARD, - actions: [ - { request: {} as any, name: 'First Button' }, - { request: {} as any, name: 'Second Button' }, - { request: {} as any, name: 'Third Button' }, - ], - }, - ], - }, -}; - -export const Carousel: Story = { - args: { - avatar: EMPTY_IMAGE, - messages: [ - { - type: 'carousel', - cards: [ - { - title: 'First Card', - description: - 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Exercitationem voluptas perspiciatis est quis dolores!', - image: CARD_IMAGE, - actions: [ - { request: {} as any, name: 'First Button' }, - { request: {} as any, name: 'Second Button' }, - { request: {} as any, name: 'Third Button' }, - ], - }, - { - title: 'Second Card', - description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit.', - image: CARD_IMAGE, - actions: [ - { request: {} as any, name: 'First Button' }, - { request: {} as any, name: 'Second Button' }, - ], - }, - { - title: 'Third Card', - description: 'Lorem ipsum dolor sit amet', - image: CARD_IMAGE, - }, - ], - }, - ], - }, -}; - -export const Multiple: Story = { - args: { - messages: [CARD, TEXT_MESSAGE], - }, -}; - -export const MultipleWithFeedback: Story = { - args: { - feedback: { - onClick: () => null, - }, - isLast: true, - messages: [CARD, TEXT_MESSAGE], - }, -}; - -export const MultipleWithFeedbackAI: Story = { - args: { - feedback: { - onClick: () => null, - }, - isLast: true, - messages: [CARD, { ...TEXT_MESSAGE, ai: true }], - }, -}; - -export const PreviousMultipleWithFeedback: Story = { - args: { - feedback: { - onClick: () => null, - variant: FeedbackButtonVariant.PREVIOUS_RESPONSE, - }, - isLast: false, - messages: [CARD, TEXT_MESSAGE], - }, -}; diff --git a/packages/chat/src/components/SystemResponse/constants.ts b/packages/chat/src/components/SystemResponse/constants.ts deleted file mode 100644 index 35e496fd94..0000000000 --- a/packages/chat/src/components/SystemResponse/constants.ts +++ /dev/null @@ -1,10 +0,0 @@ -export enum MessageType { - TEXT = 'text', - IMAGE = 'image', - CARD = 'card', - CAROUSEL = 'carousel', - END = 'END', - EXTENSION = 'EXTENSION', -} - -export const DEFAULT_MESSAGE_DELAY = 1000; diff --git a/packages/chat/src/components/SystemResponse/hooks.ts b/packages/chat/src/components/SystemResponse/hooks.ts deleted file mode 100644 index cfdf121d06..0000000000 --- a/packages/chat/src/components/SystemResponse/hooks.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { useCallback, useEffect, useRef, useState } from 'react'; -import { match } from 'ts-pattern'; - -import { useDidUpdateEffect } from '@/hooks/useDidUpdateEffect'; - -import { DEFAULT_MESSAGE_DELAY, MessageType } from './constants'; -import type { MessageProps } from './types'; - -export * from './types'; - -enum AnimationType { - MESSAGE = 'message', - INDICATOR = 'indicator', -} - -type Animation = { - [AnimationType.MESSAGE]: { type: AnimationType.MESSAGE; message: MessageProps }; - [AnimationType.INDICATOR]: { type: AnimationType.INDICATOR; messageDelay: number }; -}[T]; - -const createAnimateIndicator = (messageDelay: number = DEFAULT_MESSAGE_DELAY): Animation => ({ - type: AnimationType.INDICATOR, - messageDelay, -}); - -export const useAnimatedMessages = ({ - messages, - isLast, -}: { - messages: MessageProps[]; - isLast: boolean | undefined; -}) => { - const shouldAnimate = useRef(isLast && !!messages.length); - const [complete, setComplete] = useState(!shouldAnimate.current); - const [showIndicator, setShowIndicator] = useState(shouldAnimate.current); - const [visibleMessages, setVisibleMessages] = useState(shouldAnimate.current ? [] : messages); - - const endAnimation = useCallback(() => { - setComplete(true); - setShowIndicator(false); - }, []); - - useEffect(() => { - if (!shouldAnimate) return undefined; - - const animations = messages.flatMap((message) => - message.type === MessageType.END - ? [{ type: AnimationType.MESSAGE, message }] - : [createAnimateIndicator(message.delay), { type: AnimationType.MESSAGE, message }] - ); - - let timer: NodeJS.Timeout; - const setTimer = (callback: VoidFunction, messageDelay: number) => { - if (messageDelay === 0) { - callback(); - return; - } - - timer = setTimeout(() => { - callback(); - }, messageDelay); - }; - - const animate = () => { - if (!shouldAnimate.current) return; - - const next = animations.shift(); - if (!next) { - endAnimation(); - return; - } - - match(next) - .with({ type: AnimationType.MESSAGE }, ({ message }) => { - setShowIndicator(false); - setVisibleMessages((prev) => [...prev, message]); - setTimer(animate, DEFAULT_MESSAGE_DELAY); - }) - .with({ type: AnimationType.INDICATOR }, ({ messageDelay = DEFAULT_MESSAGE_DELAY }) => { - setShowIndicator(true); - setTimer(animate, messageDelay); - }) - .exhaustive(); - }; - - animate(); - - return () => { - clearTimeout(timer); - }; - }, []); - - useDidUpdateEffect(() => { - if (!isLast) { - shouldAnimate.current = false; - endAnimation(); - setVisibleMessages(messages); - } - }, [isLast]); - - return { - complete, - showIndicator, - visibleMessages, - }; -}; diff --git a/packages/chat/src/components/SystemResponse/index.tsx b/packages/chat/src/components/SystemResponse/index.tsx deleted file mode 100644 index 8cfaf49302..0000000000 --- a/packages/chat/src/components/SystemResponse/index.tsx +++ /dev/null @@ -1,182 +0,0 @@ -import type { RuntimeAction } from '@voiceflow/sdk-runtime'; -import { serializeToText } from '@voiceflow/slate-serializer/text'; -import { useContext } from 'react'; - -import { RuntimeStateAPIContext } from '@/contexts'; -import { useAutoScroll } from '@/hooks/useAutoScroll'; -import { fadeInAndUp } from '@/styles/animation-utils.css'; - -import { Button } from '../Button'; -import { ButtonVariant } from '../Button/constants'; -import { FeedbackButton } from '../FeedbackButton'; -import { FeedbackButtonVariant, type IFeedbackButton } from '../FeedbackButton/FeedbackButton.interface'; -import { MessageContainer } from '../MessageContainer'; -import { MessageType } from './constants'; -import { useAnimatedMessages } from './hooks'; -import Indicator from './Indicator/Indicator'; -import EndState from './state/end'; -import { actionsContainer, feedbackContainer } from './styles.css'; -import type { AIDisclaimerProps, SystemMessageProps } from './SystemMessage'; -import { SystemMessage } from './SystemMessage'; -import type { MessageProps } from './types'; - -export * from './types'; - -export interface ResponseActionProps { - name: string; - request: RuntimeAction; -} - -export interface SystemResponseProps { - /** - * An image URL for an avatar to associate the messages with. - * If we don't have an avatar here or got `undefined` it means that - * this setting is disabled. If it wasn't disabled we would have an - * avatar here given by the user, or the default avatar. - */ - avatar?: string; - - /** - * A unix timestamp indicating when the messages were sent. - */ - timestamp: number; - - /** - * A list of messages that will be rendered as {@link SystemMessage} components. - */ - messages: MessageProps[]; - - /** - * A list of actions that will be rendered as buttons. - */ - actions?: ResponseActionProps[]; - - /** - * If true, allows actions to appear after this message. - * Only the last system message in a row can show actions. - */ - isLast?: boolean; - - /** - * If true, the system message is the first in a chat. - */ - isFirst?: boolean; - - /** - * If provided, will display {@link FeedbackButton} component under the last message. - * @default false - */ - feedback?: IFeedbackButton | undefined; - - aiDisclaimer?: AIDisclaimerProps; - - /** - * Override the rendering of individual messages. - */ - Message?: React.ComponentType; -} - -/** - * A dynamic component capable of displaying all standard system responses. - * - * @see {@link https://voiceflow.github.io/react-chat/?path=/story/components-chat-systemresponse--simple-text} - */ -export const SystemResponse: React.FC = ({ - feedback, - avatar, - timestamp, - messages, - actions = [], - isLast, - aiDisclaimer, - Message = SystemMessage, -}) => { - const runtime = useContext(RuntimeStateAPIContext); - - const { showIndicator, visibleMessages, complete } = useAnimatedMessages({ - messages, - isLast, - }); - - useAutoScroll([showIndicator, complete, visibleMessages.length]); - - if (!messages.length && !actions.length) return null; - - const getLastTextMessageIndex = (messages: MessageProps[]) => { - for (let i = messages.length - 1; i >= 0; i--) { - if (messages[i].type === MessageType.TEXT) return i; - } - return -1; - }; - const lastTextMessageIndex = getLastTextMessageIndex(visibleMessages); - - const allTextContentForMessage = visibleMessages.reduce((acc, message) => { - if (message.type === MessageType.TEXT) { - return ( - acc + (acc ? '\n' : '') + (typeof message.text !== 'string' ? serializeToText(message.text) : message.text) - ); - } - return acc; - }, ''); - - return ( - - {visibleMessages.map((message, index) => { - const endConversation = message?.type === MessageType.END; - if (endConversation) { - return ; - } - - const lastMessageInGroup = index === visibleMessages.length - 1; - - // Showing feedback on previous messages that were in the chat - const showFeedback = index === lastTextMessageIndex; // lastMessageInGroup && message.type === MessageType.TEXT; - - // Showing feedback on the most recent system message of the chat - const addFeedback = feedback && isLast && complete && lastMessageInGroup; - - return ( - <> - - {addFeedback && message.type !== MessageType.CAROUSEL && ( -
    - -
    - )} - - ); - })} - {isLast && complete && !!actions.length && ( -
    - {actions.map(({ request, name }, index) => ( -
    - -
    - ))} -
    - )} - {showIndicator && } -
    - ); -}; diff --git a/packages/chat/src/components/SystemResponse/state/end.tsx b/packages/chat/src/components/SystemResponse/state/end.tsx deleted file mode 100644 index d8ddd45c3c..0000000000 --- a/packages/chat/src/components/SystemResponse/state/end.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { useContext, useEffect } from 'react'; - -import { RuntimeStateAPIContext } from '@/contexts'; -import { SessionStatus } from '@/types'; - -const EndState: React.FC = () => { - const runtime = useContext(RuntimeStateAPIContext); - - useEffect(() => { - runtime.setStatus(SessionStatus.ENDED); - }, []); - - return null; -}; - -export default EndState; diff --git a/packages/chat/src/components/SystemResponse/styles.css.ts b/packages/chat/src/components/SystemResponse/styles.css.ts deleted file mode 100644 index 7910877e2f..0000000000 --- a/packages/chat/src/components/SystemResponse/styles.css.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { keyframes, style } from '@vanilla-extract/css'; -import { recipe } from '@vanilla-extract/recipes'; - -import { duration } from '@/styles/animations'; -import { SIZES } from '@/styles/sizes'; - -import { SMALL_AVATAR_SIZE } from '../Avatar/styles.css'; - -export const MESSAGE_PADDING = 12; - -export const hide = style({ - visibility: 'hidden', -}); - -const fadeInSlideUp = keyframes({ - from: { - opacity: 0, - transform: 'translateY(5px)', - }, - to: { - opacity: 1, - transform: 'translateY(0)', - }, -}); - -export const systemMessageContainer = style({ - display: 'flex', - alignItems: 'flex-end', - marginBottom: 4, - animation: `${fadeInSlideUp} ${duration.fast} ease-in`, -}); - -export const responseAvatar = style({ - marginBottom: 4, -}); - -export const messageContainer = recipe({ - base: { - width: `calc(100% - ${MESSAGE_PADDING + SMALL_AVATAR_SIZE}px)`, - marginLeft: MESSAGE_PADDING, - }, - variants: { - withAvatar: { - false: { - marginLeft: 0, - }, - }, - }, -}); - -export const actionsContainer = recipe({ - base: { - display: 'flex', - flexWrap: 'wrap', - gap: 8, - margin: '16px 0 8px 0', - paddingLeft: 44, - }, - variants: { - withAvatar: { - false: { - paddingLeft: 0, - }, - }, - }, -}); - -export const extensionMessageContainer = style({ - display: 'inline-block', - boxSizing: 'border-box', - padding: '10px 14px', - borderRadius: SIZES.radius.sm, - overflowWrap: 'anywhere', - color: '#000', - backgroundColor: '#f4f4f4', -}); - -export const feedbackContainer = recipe({ - base: { - marginTop: 6, - zIndex: 1, - marginLeft: MESSAGE_PADDING + SMALL_AVATAR_SIZE - 6, - }, - variants: { - withAvatar: { - false: { - marginLeft: -6, - }, - }, - }, -}); diff --git a/packages/chat/src/components/SystemResponse/types.ts b/packages/chat/src/components/SystemResponse/types.ts deleted file mode 100644 index faad5a2ee8..0000000000 --- a/packages/chat/src/components/SystemResponse/types.ts +++ /dev/null @@ -1,58 +0,0 @@ -import type { Text, Trace } from '@voiceflow/base-types'; - -import type { CardProps } from '@/components/Card/types'; -import type { ResponseExtension } from '@/dtos/Extension.dto'; -import type { StringifiedEnum } from '@/types/util'; - -import type { MessageType } from './constants'; - -export interface BaseMessageProps { - delay?: number | undefined; - ai?: boolean; -} - -export interface TextMessageProps extends BaseMessageProps { - type: StringifiedEnum; - text: string | Text.SlateTextValue; - audio?: { src: string }; -} - -export interface ImageMessageProps extends BaseMessageProps { - type: StringifiedEnum; - url: string | null; -} - -export interface CardMessageProps extends CardProps, BaseMessageProps { - type: StringifiedEnum; -} - -export interface CarouselMessageProps extends BaseMessageProps { - type: StringifiedEnum; - cards: CardProps[]; -} - -export interface EndMessage extends BaseMessageProps { - type: StringifiedEnum; -} - -export interface ExtensionMessage extends BaseMessageProps { - type: StringifiedEnum; - payload: { - trace: Trace.AnyTrace; - extension: ResponseExtension; - }; -} - -export interface CustomMessage extends BaseMessageProps { - type: `custom_${string}`; - payload: any; -} - -export type MessageProps = - | TextMessageProps - | ImageMessageProps - | CardMessageProps - | CarouselMessageProps - | EndMessage - | ExtensionMessage - | CustomMessage; diff --git a/packages/chat/src/components/Tooltip/Tooltip.story.tsx b/packages/chat/src/components/Tooltip/Tooltip.story.tsx deleted file mode 100644 index 4fb51a5aa7..0000000000 --- a/packages/chat/src/components/Tooltip/Tooltip.story.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; - -import { Tooltip } from '.'; - -type Story = StoryObj; -const meta: Meta = { - title: 'Components/Tooltip', - component: Tooltip, - argTypes: { - onClick: { table: { disable: true } }, - orientation: { - options: ['left', 'right'], - control: { type: 'radio' }, - defaultValue: 'left', - }, - }, - args: { - children: 'Lorem ipsum dolor sit amet consectetur adipisicing elit.', - }, -}; - -export default meta; - -export const LeftOrientation: Story = { - args: { - orientation: 'left', - }, -}; - -export const RightOrientation: Story = { - args: { - orientation: 'right', - }, -}; - -export const Actionable: Story = { - args: { - label: 'Action Label', - }, -}; diff --git a/packages/chat/src/components/Tooltip/index.tsx b/packages/chat/src/components/Tooltip/index.tsx deleted file mode 100644 index 7f7ec31223..0000000000 --- a/packages/chat/src/components/Tooltip/index.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { DebugMessage, type DebugMessageProps } from '../DebugMessage'; -import { buttonStyle, containerStyle } from './styles.css'; - -export interface ActionMessageProps extends DebugMessageProps { - /** - * If provided, this will render an action button within the tooltip. - */ - label?: string | undefined; - - /** - * A callback handler for the action button. - */ - onClick?: React.MouseEventHandler | undefined; -} - -/** - * Renders a tooltip, optionally with an action button attached to it. - * - * @see {@link https://voiceflow.github.io/react-chat/?path=/story/components-tooltip--left-orientation} - */ -export const Tooltip: React.FC = ({ label, onClick, children, ...props }) => ( -
    - {children} - {label && ( - - )} -
    -); diff --git a/packages/chat/src/components/Tooltip/styled.css.ts b/packages/chat/src/components/Tooltip/styled.css.ts deleted file mode 100644 index 2c8a3a0721..0000000000 --- a/packages/chat/src/components/Tooltip/styled.css.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { style, styleVariants } from '@vanilla-extract/css'; -import { recipe } from '@vanilla-extract/recipes'; - -import { THEME } from '@/styles/colors.css'; -import { SIZES } from '@/styles/sizes'; - -export const buttonStyle = style({ - height: SIZES.m, - border: '1px solid #dfdfdf', - borderTopColor: 'rgba(223,223,223,0.5)', - borderRadius: SIZES.radius.xs, - borderTopLeftRadius: 0, - borderTopRightRadius: 0, - fontWeight: 600, - color: THEME.colors[500], - backgroundColor: '#fbfbfb', -}); - -export const withActionVariant = styleVariants({ - true: { - boxShadow: '0 1px 2px rgba(0,0,0,0.02)', - borderBottomLeftRadius: 0, - borderBottomRightRadius: 0, - }, -}); - -export const containerStyle = recipe({ - base: { - fontFamily: THEME.fontFamily, - fontSize: '12px', - display: 'inline-flex', - flexDirection: 'column', - }, - variants: { - withActionVariant, - }, -}); diff --git a/packages/chat/src/components/Tooltip/styles.css.ts b/packages/chat/src/components/Tooltip/styles.css.ts deleted file mode 100644 index 2c8a3a0721..0000000000 --- a/packages/chat/src/components/Tooltip/styles.css.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { style, styleVariants } from '@vanilla-extract/css'; -import { recipe } from '@vanilla-extract/recipes'; - -import { THEME } from '@/styles/colors.css'; -import { SIZES } from '@/styles/sizes'; - -export const buttonStyle = style({ - height: SIZES.m, - border: '1px solid #dfdfdf', - borderTopColor: 'rgba(223,223,223,0.5)', - borderRadius: SIZES.radius.xs, - borderTopLeftRadius: 0, - borderTopRightRadius: 0, - fontWeight: 600, - color: THEME.colors[500], - backgroundColor: '#fbfbfb', -}); - -export const withActionVariant = styleVariants({ - true: { - boxShadow: '0 1px 2px rgba(0,0,0,0.02)', - borderBottomLeftRadius: 0, - borderBottomRightRadius: 0, - }, -}); - -export const containerStyle = recipe({ - base: { - fontFamily: THEME.fontFamily, - fontSize: '12px', - display: 'inline-flex', - flexDirection: 'column', - }, - variants: { - withActionVariant, - }, -}); diff --git a/packages/chat/src/components/TypingIndicator/TypingIndicator.story.tsx b/packages/chat/src/components/TypingIndicator/TypingIndicator.story.tsx deleted file mode 100644 index 7e7ba68d2b..0000000000 --- a/packages/chat/src/components/TypingIndicator/TypingIndicator.story.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; - -import { DEFAULT_AVATAR, NewChat } from '@/main'; -import { WithDefaultPalette, WithRuntimeProvider } from '@/storybook/decorators'; - -import Indicator from '../SystemResponse/Indicator/Indicator'; -import { SystemMessage } from '../SystemResponse/SystemMessage'; -import { TypingIndicator } from '.'; - -type Story = StoryObj; -const meta: Meta = { - title: 'Components/TypingIndicator', - component: TypingIndicator, - decorators: [WithRuntimeProvider, WithDefaultPalette], -}; - -export default meta; - -export const Default: Story = { - args: {}, -}; - -export const InsideChat: Story = { - render: () => ( -
    - Promise.resolve(), - placeholder: 'Message...', - }, - }} - isLoading={false} - hasEnded={false} - > - - - -
    - ), -}; diff --git a/packages/chat/src/components/TypingIndicator/index.tsx b/packages/chat/src/components/TypingIndicator/index.tsx deleted file mode 100644 index a3ff66cf9a..0000000000 --- a/packages/chat/src/components/TypingIndicator/index.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import clsx from 'clsx'; - -import { ClassName } from '@/constants'; - -import { dot, indicatorContainer } from './styles.css'; - -/** - * An animated indicator to show that the system is preparing a response. - * - * @see {@link https://voiceflow.github.io/react-chat/?path=/docs/components-typingindicator--default} - */ -export const TypingIndicator: React.FC = () => ( - - - - - -); diff --git a/packages/chat/src/components/TypingIndicator/styles.css.ts b/packages/chat/src/components/TypingIndicator/styles.css.ts deleted file mode 100644 index 46b3c3940e..0000000000 --- a/packages/chat/src/components/TypingIndicator/styles.css.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { keyframes, style } from '@vanilla-extract/css'; -import { recipe } from '@vanilla-extract/recipes'; - -import { COLORS } from '@/styles/colors'; -import { SIZES } from '@/styles/sizes'; -import { transition } from '@/styles/transitions'; - -const ANIMATION_DURATION = 1000; - -const pulseAnimation = keyframes({ - '25%': { - backgroundColor: COLORS.NEUTRAL_LIGHT[900], - scale: 1.2, - }, - '50%': { - scale: 1, - backgroundColor: COLORS.NEUTRAL_LIGHT[600], - }, - '75%': { - backgroundColor: COLORS.NEUTRAL_LIGHT[300], - }, - '100%': { - backgroundColor: COLORS.NEUTRAL_LIGHT[600], - }, -}); - -export const indicatorContainer = style({ - display: 'inline-flex', - gap: '5px', -}); - -export const dot = recipe({ - base: { - width: 7, - height: 7, - borderRadius: SIZES.radius.round, - transition: transition(['background-color', 'scale']), - backgroundColor: COLORS.NEUTRAL_LIGHT[600], - animation: `${pulseAnimation} ${ANIMATION_DURATION}ms`, - animationIterationCount: 'infinite', - }, - - variants: { - dot: { - first: { - animationDelay: '333ms', - }, - second: { - animationDelay: '666ms', - }, - third: { - animationDelay: '999ms', - }, - }, - }, -}); diff --git a/packages/chat/src/components/UserResponse/UserResponse.story.tsx b/packages/chat/src/components/UserResponse/UserResponse.story.tsx deleted file mode 100644 index 9aacdd2eee..0000000000 --- a/packages/chat/src/components/UserResponse/UserResponse.story.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; - -import { UserResponse } from '.'; - -type Story = StoryObj; -const meta: Meta = { - title: 'Components/Chat/UserResponse', - component: UserResponse, - args: { - timestamp: Date.now(), - }, - render: (args) => , -}; - -export default meta; - -export const PlainText: Story = { - args: { - message: 'Lorem ipsum dolor', - }, -}; - -export const Wrapping: Story = { - args: { - message: - 'consecteturaconse cteturaconsecteturaconsecteturaconsecteturaconsectetura consecteturaconsecteturaconsecteturaconsecteturaconsecteturaconsectetura', - }, -}; - -export const Debug: Story = { - args: { - message: 'Lorem ipsum dolor', - debug: { - message: 'Intent Name (97%)', - }, - }, -}; - -export const DebugReason: Story = { - args: { - message: 'Lorem ipsum dolor', - debug: { - message: 'Intent Name (97%)', - reason: 'Voluptatum quae, accusamus excepturi inventore ex quos veritatis eaque ab non?', - }, - }, -}; - -export const ActionableDebugReason: Story = { - args: { - ...DebugReason.args, - debug: { - message: 'Intent Name (97%)', - action: { label: 'Add Missing Utterance' }, - }, - }, -}; diff --git a/packages/chat/src/components/UserResponse/index.tsx b/packages/chat/src/components/UserResponse/index.tsx deleted file mode 100644 index 206de764ed..0000000000 --- a/packages/chat/src/components/UserResponse/index.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import clsx from 'clsx'; - -import { ClassName } from '@/constants'; -import { useAutoScroll } from '@/hooks/useAutoScroll'; - -import { MessageContainer } from '../MessageContainer'; -import { Tooltip } from '../Tooltip'; -import { debugMessage, messageContainer, userResponse } from './styles.css'; - -export interface DebugActionProps { - label: string; - onClick?: React.MouseEventHandler; -} - -export interface DebugResponseProps { - message: string; - reason?: string; - action?: DebugActionProps; -} - -export interface UserResponseProps { - /** - * The message text to display. - */ - message: string; - - /** - * A unix timestamp indicating when this response was sent. - */ - timestamp: number; - - /** - * If provided, adds a caption and optional "debug" message with an action. - */ - debug?: DebugResponseProps; - - /** - * If true, this is the last message in the chat. - */ - isLast?: boolean; -} - -/** - * A user-sent text response. - * - * @see {@link https://voiceflow.github.io/react-chat/?path=/story/components-chat-userresponse--simple} - */ - -export const UserResponse: React.FC = ({ message, debug, isLast }) => { - useAutoScroll(); - - return ( - -
    {message}
    - {debug && ( - <> - - {debug.reason && ( - - {debug.reason} - - )} - - )} -
    - ); -}; diff --git a/packages/chat/src/components/UserResponse/styles.css.ts b/packages/chat/src/components/UserResponse/styles.css.ts deleted file mode 100644 index 637808424f..0000000000 --- a/packages/chat/src/components/UserResponse/styles.css.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { keyframes, style } from '@vanilla-extract/css'; - -import { duration } from '@/styles/animations'; -import { COLORS } from '@/styles/colors'; -import { THEME } from '@/styles/colors.css'; -import { SIZES } from '@/styles/sizes'; - -import { SMALL_AVATAR_SIZE } from '../Avatar/styles.css'; - -const LEFT_MARGIN = SMALL_AVATAR_SIZE + 12; - -export const fadeInSlideUp = keyframes({ - from: { - opacity: 0, - transform: 'translateY(10px)', - }, - to: { - opacity: 1, - transform: 'translateY(0)', - }, -}); - -export const messageContainer = style({ - backgroundColor: THEME.colors[500], - color: THEME.colors[50], - padding: '11px 16px 10px', - fontFamily: THEME.fontFamily, - position: 'relative', - fontSize: '14px', - lineHeight: '20px', - justifySelf: 'flex-end', - width: 'fit-content', - maxWidth: `calc(100% - ${LEFT_MARGIN}px)`, - wordWrap: 'break-word', - borderRadius: SIZES.radius.sm, - marginLeft: LEFT_MARGIN, - animation: `${fadeInSlideUp} ${duration.fast} ease-out`, -}); - -export const userResponse = style({ - display: 'flex', - justifyContent: 'flex-end', -}); - -export const debugMessage = style({ - fontSize: '12px', - lineHeight: '17px', - color: COLORS.NEUTRAL_DARK[200], - marginTop: SIZES.m, -}); diff --git a/packages/chat/src/components/VoiceWidget/MockVoiceWidgetImage.tsx b/packages/chat/src/components/VoiceWidget/MockVoiceWidgetImage.tsx deleted file mode 100644 index c306db57f4..0000000000 --- a/packages/chat/src/components/VoiceWidget/MockVoiceWidgetImage.tsx +++ /dev/null @@ -1,33 +0,0 @@ -/* eslint-disable no-secrets/no-secrets */ -export const MockImage = () => { - return ( - - - - - - - - - - - - - - - - - ); -}; diff --git a/packages/chat/src/components/VoiceWidget/MovingGradient.component.tsx b/packages/chat/src/components/VoiceWidget/MovingGradient.component.tsx deleted file mode 100644 index 27cc0bfa96..0000000000 --- a/packages/chat/src/components/VoiceWidget/MovingGradient.component.tsx +++ /dev/null @@ -1,133 +0,0 @@ -import React from 'react'; - -const randomizeDuration = (base: number) => `${(Math.random() * 2 + base).toFixed(1)}s`; - -export const MovingGradient = ({ speedVector = 1 }) => { - // Calculate animation durations based on the speed vector - const duration1 = randomizeDuration(6 * speedVector); - const duration2 = randomizeDuration(8 * speedVector); - const duration3 = randomizeDuration(7 * speedVector); - - return ( - - - - - - - - - - - - - - - - - - - - {/* - - */} - {/* */} - - - - - {/* Circle 1 */} - - - - - - - {/* Circle 2 */} - - - - - - - - {/* Circle 3 */} - - - - - - - - ); -}; diff --git a/packages/chat/src/components/VoiceWidget/ShrinkingCircle.component.tsx b/packages/chat/src/components/VoiceWidget/ShrinkingCircle.component.tsx deleted file mode 100644 index 79a3dae3ce..0000000000 --- a/packages/chat/src/components/VoiceWidget/ShrinkingCircle.component.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { useEffect, useRef, useState } from 'react'; - -import { shrinkingCircle } from './ShrinkingCircle.css'; - -export const ShrinkingCircle = () => { - const [radius, setRadius] = useState(54); - const audioContextRef = useRef(null); - const analyserRef = useRef(null); - - useEffect(() => { - const initAudio = async () => { - if (audioContextRef.current) return; - - audioContextRef.current = new AudioContext(); - const analyser = audioContextRef.current.createAnalyser(); - analyser.fftSize = 256; - analyserRef.current = analyser; - - const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); - const source = audioContextRef.current.createMediaStreamSource(stream); - source.connect(analyser); - - const bufferLength = analyser.frequencyBinCount; - const dataArray = new Uint8Array(bufferLength); - - const animate = () => { - if (!analyserRef.current) return; - - analyserRef.current.getByteFrequencyData(dataArray); - const avgVolume = dataArray.reduce((sum, value) => sum + value, 0) / bufferLength; - - const newRadius = Math.min(avgVolume, 54); - setRadius(newRadius); - - requestAnimationFrame(animate); - }; - - animate(); - }; - - initAudio(); - - return () => { - audioContextRef.current?.close(); - }; - }, []); - - return ( -
    -
    -
    - ); -}; diff --git a/packages/chat/src/components/VoiceWidget/ShrinkingCircle.css.ts b/packages/chat/src/components/VoiceWidget/ShrinkingCircle.css.ts deleted file mode 100644 index 55bbe54cd0..0000000000 --- a/packages/chat/src/components/VoiceWidget/ShrinkingCircle.css.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { style } from '@vanilla-extract/css'; - -export const shrinkingCircle = style({ - height: '54px', - width: '54px', - minWidth: '54px', - minHeight: '54px', - background: 'blue', - borderRadius: '50%', - transition: 'transform 0.2s', -}); diff --git a/packages/chat/src/components/VoiceWidget/VoiceWidget.css.ts b/packages/chat/src/components/VoiceWidget/VoiceWidget.css.ts deleted file mode 100644 index 075af3bec5..0000000000 --- a/packages/chat/src/components/VoiceWidget/VoiceWidget.css.ts +++ /dev/null @@ -1,236 +0,0 @@ -import { style, styleVariants } from '@vanilla-extract/css'; -import { recipe } from '@vanilla-extract/recipes'; - -import { SHADOWS } from '@/styles/box-shadows'; -import { COLORS } from '@/styles/colors'; -import { THEME } from '@/styles/colors.css'; -import { transition } from '@/styles/transitions'; - -export const voiceWrapper = style({ - display: 'flex', - // justifyContent: 'center', - alignItems: 'center', - flexDirection: 'column', - width: 'fit-content', -}); - -const loadingVariant = styleVariants({ - true: {}, -}); - -export const voiceWidgetContainer = recipe({ - base: { - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - padding: '16px 20px', - background: 'white', - borderRadius: '16px', - boxShadow: SHADOWS.Z32_Light, - overflow: 'hidden', - width: 'fit-content', - position: 'relative', - zIndex: 1, - userSelect: 'none', - }, - variants: { - type: { - full: {}, - expand: { - boxShadow: SHADOWS.Z64_Light, - flexDirection: 'column', - padding: '32px 24px 24px 24px', - }, - compact: { - borderRadius: '100px', - boxShadow: SHADOWS.Z16_Light, - gap: '8px', - padding: '8px', - }, - }, - - isLoading: loadingVariant, - }, -}); - -export const controlSection = recipe({ - base: { - display: 'flex', - flexDirection: 'column', - alignItems: 'flex-start', - gap: '8px', - width: '100%', - }, - variants: { - type: { - full: { - gap: '6px', - }, - expand: { - alignItems: 'center', - paddingTop: '12px', - gap: '12px', - }, - compact: { - gap: '4px', - }, - }, - }, -}); - -export const titleStyle = style({ - fontFamily: THEME.fontFamily, - fontSize: '14px', - fontWeight: 400, - - lineHeight: '20px', - color: COLORS.NEUTRAL_DARK[900], - textAlign: 'center', -}); - -export const buttonModifier = recipe({ - base: { - width: '158px', - position: 'relative', - borderRadius: '8px', - padding: '16px 4px', - - selectors: { - [`${loadingVariant.true} &`]: { - cursor: 'default', - backgroundColor: THEME.colors[300], - }, - [`${loadingVariant.true} &:active`]: { - backgroundColor: THEME.colors[300], - }, - [`${loadingVariant.true} &:hover`]: { - backgroundColor: THEME.colors[300], - }, - }, - }, - variants: { - type: { - full: {}, - expand: { - width: '182px', - }, - compact: { - borderRadius: '100px', - width: '194px', - }, - }, - }, -}); - -export const circle = recipe({ - base: { - borderRadius: '50%', - height: '54px', - width: '54px', - minWidth: '54px', - minHeight: '54px', - background: 'rgba(0, 0, 0, 0.06)', - }, - variants: { - type: { - full: { - height: '58px', - width: '58px', - minWidth: '58px', - minHeight: '58px', - marginRight: '16px', - }, - expand: { - height: '80px', - width: '80px', - minWidth: '80px', - minHeight: '80px', - marginBottom: '8px', - }, - compact: { - height: '32px', - width: '32px', - minWidth: '32px', - minHeight: '32px', - }, - }, - }, -}); - -export const imageStyles = style({ - borderRadius: '50%', - height: '100%', - width: '100%', - objectFit: 'cover', - transition: 'transform .5s', -}); - -export const buttonContent = recipe({ - base: { - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - borderRadius: '8px', - top: '50%', - left: '50%', - fontFamily: THEME.fontFamily, - - transform: 'translate(-50%, -50%)', - - position: 'absolute', - gap: '6px', - lineHeight: '20px', - transition: transition(['opacity']), - - selectors: { - [`${loadingVariant.true} &`]: { - opacity: 0, - }, - }, - }, - variants: { - isVisible: { - true: { - opacity: 1, - }, - false: { - opacity: 0, - }, - }, - }, -}); - -export const buttonText = style({ - paddingTop: '2px', - fontFamily: THEME.fontFamily, -}); - -export const linkSectionModifier = style({ - paddingBottom: '0 !important', -}); - -export const loaderStyles = style({ - color: 'white', - height: '20px', - width: '20px', -}); - -export const containerLoaderStyles = style({ - position: 'absolute', - top: '50%', - left: '50%', - - width: '20px', - height: '20px', - - transform: 'translate(-50%, -50%)', - transition: transition(['opacity']), - - opacity: 0, - - selectors: { - [`${loadingVariant.true} &`]: { - opacity: 1, - }, - }, -}); diff --git a/packages/chat/src/components/VoiceWidget/VoiceWidget.story.tsx b/packages/chat/src/components/VoiceWidget/VoiceWidget.story.tsx deleted file mode 100644 index 403ce04fc4..0000000000 --- a/packages/chat/src/components/VoiceWidget/VoiceWidget.story.tsx +++ /dev/null @@ -1,99 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; -import { useState } from 'react'; - -import { WithDefaultPalette } from '@/storybook/decorators'; - -import logo from '../../assets/vf_logo.png'; -import { VoiceWidget } from '.'; - -type Story = StoryObj; -const meta: Meta = { - title: 'Components/VoiceWidget', - component: VoiceWidget, - - decorators: [WithDefaultPalette], -}; - -export default meta; - -const CustomVoiceWidget = (args: React.ComponentProps) => { - const [isLoading, setIsLoading] = useState(false); - - return setIsLoading((prev) => !prev)} />; -}; - -export const Base: Story = { - args: { - state: 'listening', - settings: { - content: { - talkingText: '', - endButtonText: '', - listeningText: '', - startButtonText: '', - callToActionText: '', - imageURL: logo, - }, - renderMode: 'full', - }, - footer: { - text: 'Privacy', - url: 'https://www.google.com', - enabled: true, - }, - }, - - render: CustomVoiceWidget, -}; - -export const Listening: Story = { - args: { - ...Base.args, - state: 'LISTENING', - }, - render: CustomVoiceWidget, -}; - -export const Talking: Story = { - args: { - ...Base.args, - state: 'TALKING', - }, - render: CustomVoiceWidget, -}; - -export const Compact: Story = { - args: { - ...Base.args, - settings: { - content: { - talkingText: '', - endButtonText: '', - listeningText: '', - startButtonText: '', - callToActionText: '', - }, - renderMode: 'compact', - }, - state: 'IDLE', - }, - render: CustomVoiceWidget, -}; - -export const Expand: Story = { - args: { - ...Base.args, - settings: { - content: { - talkingText: '', - endButtonText: '', - listeningText: '', - startButtonText: '', - callToActionText: '', - }, - renderMode: 'expand', - }, - state: 'IDLE', - }, - render: CustomVoiceWidget, -}; diff --git a/packages/chat/src/components/VoiceWidget/WaveformVisualizer.component.tsx b/packages/chat/src/components/VoiceWidget/WaveformVisualizer.component.tsx deleted file mode 100644 index daad0db558..0000000000 --- a/packages/chat/src/components/VoiceWidget/WaveformVisualizer.component.tsx +++ /dev/null @@ -1,92 +0,0 @@ -import { useEffect, useRef } from 'react'; - -export const WaveFormVisualizer = () => { - const canvasRef = useRef(null); - const audioContextRef = useRef(null); - const analyserRef = useRef(null); - const dataArrayRef = useRef(null); - - useEffect(() => { - const startAudio = async () => { - audioContextRef.current = new AudioContext(); - const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); - const source = audioContextRef.current.createMediaStreamSource(stream); - analyserRef.current = audioContextRef.current.createAnalyser(); - analyserRef.current.fftSize = 1024; - - const bufferLength = analyserRef.current.frequencyBinCount; - dataArrayRef.current = new Uint8Array(bufferLength); - - source.connect(analyserRef.current); - - let previousTimestamp = 0; - const smoothingFactor = 0.1; - - const draw = (timestamp: number) => { - if (!canvasRef.current || !analyserRef.current || !dataArrayRef.current) return; - - const canvas = canvasRef.current; - const canvasCtx = canvas.getContext('2d'); - const { width, height } = canvas; - const centerX = width / 2; - const centerY = height / 2; - const radius = Math.min(width, height) / 2; - - analyserRef.current.getByteTimeDomainData(dataArrayRef.current); - - // Time-based smoothing - const deltaTime = timestamp - previousTimestamp; - previousTimestamp = timestamp; - const smoothing = Math.min(1, deltaTime * smoothingFactor); - - if (canvasCtx) { - canvasCtx.clearRect(0, 0, width, height); - - // Draw the circle - canvasCtx.beginPath(); - canvasCtx.arc(centerX, centerY, radius, 0, 2 * Math.PI); - canvasCtx.fillStyle = 'white'; - canvasCtx.fill(); - canvasCtx.lineWidth = 6; - canvasCtx.strokeStyle = '#0099cc'; - canvasCtx.stroke(); - - // Draw the smoothed waveform - canvasCtx.beginPath(); - dataArrayRef.current.forEach((value, i) => { - const angle = (i / (dataArrayRef?.current?.length || 1)) * 2 * Math.PI; - const amplitude = (value / 128.0 - 1) * 40; - - // Apply smoothing to amplitude - const smoothedAmplitude = amplitude * smoothing; - - const x = centerX + (radius + smoothedAmplitude) * Math.cos(angle); - const y = centerY + (radius + smoothedAmplitude) * Math.sin(angle); - - if (i === 0) { - canvasCtx.moveTo(x, y); - } else { - canvasCtx.lineTo(x, y); - } - }); - - // Close the path and stroke the waveform - canvasCtx.closePath(); - canvasCtx.stroke(); - } - - requestAnimationFrame(draw); - }; - - requestAnimationFrame(draw); - }; - - startAudio(); - - return () => { - audioContextRef.current?.close(); - }; - }, []); - - return ; -}; diff --git a/packages/chat/src/components/VoiceWidget/index.tsx b/packages/chat/src/components/VoiceWidget/index.tsx deleted file mode 100644 index 2f6c336c9a..0000000000 --- a/packages/chat/src/components/VoiceWidget/index.tsx +++ /dev/null @@ -1,149 +0,0 @@ -import type { WidgetSettingsCommonSettingsFooterLink, WidgetSettingsVoiceSettings } from '@voiceflow/dtos-interact'; -import { WidgetSettingsVoiceRenderMode } from '@voiceflow/dtos-interact'; - -import type { VoiceState } from '@/constant/voice.constant'; -import { VOICE_STATE } from '@/constant/voice.constant'; -import { DEFAULT_CHAT_AVATAR } from '@/dtos/AssistantOptions.dto'; - -import { Button } from '../Button'; -import { ButtonIcon } from '../Button/ButtonIcon'; -import { ButtonVariant } from '../Button/constants'; -import { LoadingSpinner } from '../LoadingSpinner/LoadingSpinner'; -import { BottomLinks } from '../NewFooter/BottomLinks'; -import useMicrophoneAmplitude from './use-microphone-amplitude'; -import { - buttonContent, - buttonModifier, - buttonText, - circle, - containerLoaderStyles, - controlSection, - imageStyles, - linkSectionModifier, - loaderStyles, - titleStyle, - voiceWidgetContainer, - voiceWrapper, -} from './VoiceWidget.css'; - -interface IVoiceWidget { - state: VoiceState; - footer?: WidgetSettingsCommonSettingsFooterLink; - settings?: WidgetSettingsVoiceSettings; - poweredBy?: boolean; - isLoading: boolean; - onStartCall?: () => void; - onEndCall?: () => void; -} - -export const VoiceWidget: React.FC = ({ - state, - settings, - footer, - onEndCall, - poweredBy, - isLoading, - onStartCall, -}) => { - const { content, renderMode = WidgetSettingsVoiceRenderMode.FULL } = settings ?? {}; - - const startCall = () => { - onStartCall?.(); - }; - - const endCall = () => { - onEndCall?.(); - }; - - const isIdle = state === VOICE_STATE.IDLE; - const isEnded = state === VOICE_STATE.ENDED; - const isTalking = state === VOICE_STATE.TALKING; - const isListening = state === VOICE_STATE.LISTENING; - const isInitializing = state === VOICE_STATE.INITIALIZING; - const isCalling = isTalking || isListening || isInitializing; - - const handleButtonClick = () => { - if (isLoading) return; - - if (isCalling) { - endCall(); - } else { - startCall(); - } - }; - - const getTitle = () => { - if (isIdle || isEnded) { - return content?.callToActionText ?? 'How can I help you?'; - } - - if (isInitializing) { - return 'Connecting...'; - } - - if (isListening) { - return content?.listeningText ?? 'Listening...'; - } - - return content?.talkingText ?? 'Talk to interrupt'; - }; - - const amplitude = useMicrophoneAmplitude(); - - const isCompact = renderMode === WidgetSettingsVoiceRenderMode.COMPACT; - const isExpanded = renderMode === WidgetSettingsVoiceRenderMode.EXPAND; - - const bottomLinks = ( - - ); - - return ( -
    -
    -
    - agent brand image -
    - -
    - {!isCompact &&
    {getTitle()}
    } - - -
    - - {isExpanded && bottomLinks} -
    - - {!isExpanded && bottomLinks} -
    - ); -}; diff --git a/packages/chat/src/components/VoiceWidget/use-microphone-amplitude.tsx b/packages/chat/src/components/VoiceWidget/use-microphone-amplitude.tsx deleted file mode 100644 index ab1d302d19..0000000000 --- a/packages/chat/src/components/VoiceWidget/use-microphone-amplitude.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { useEffect, useState } from 'react'; - -const useMicrophoneAmplitude = (): number => { - const [amplitude, setAmplitude] = useState(0); - const [_, setAudioContext] = useState(null); - - useEffect(() => { - let audioContext: AudioContext; - let analyser: AnalyserNode; - let dataArray: Uint8Array; - let microphone: MediaStreamAudioSourceNode | null = null; - - const initMicrophone = async () => { - try { - // Request access to the user's microphone - const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); - - // Set up the Audio Context and Analyser - audioContext = new window.AudioContext(); - setAudioContext(audioContext); - - analyser = audioContext.createAnalyser(); - analyser.fftSize = 256; - dataArray = new Uint8Array(analyser.frequencyBinCount); - - microphone = audioContext.createMediaStreamSource(stream); - microphone.connect(analyser); - - const updateAmplitude = () => { - analyser.getByteTimeDomainData(dataArray); - const amplitudeValue = dataArray.reduce((acc, val) => acc + Math.abs(val - 128), 0) / dataArray.length; - - // Calculate scale based on instantaneous amplitude - const baseScale = 1; // when silent - const scaleFactor = 0.1; // Controls how much it shrinks with loudness - - const amplitude = amplitudeValue > 2 ? Math.max(0.66, baseScale - amplitudeValue * scaleFactor) : baseScale; - - setAmplitude(amplitude); - requestAnimationFrame(updateAmplitude); - }; - - updateAmplitude(); - } catch (error) { - console.error('Error accessing the microphone:', error); - } - }; - - initMicrophone(); - - return () => { - if (microphone) microphone.disconnect(); - if (audioContext) audioContext.close(); - }; - }, []); - - return amplitude; -}; - -export default useMicrophoneAmplitude; diff --git a/packages/chat/src/components/WelcomeMessage/WelcomeMessage.css.ts b/packages/chat/src/components/WelcomeMessage/WelcomeMessage.css.ts deleted file mode 100644 index 3d997aaa0a..0000000000 --- a/packages/chat/src/components/WelcomeMessage/WelcomeMessage.css.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { keyframes, style } from '@vanilla-extract/css'; - -import { componentAnimations, timingFunction } from '@/styles/animations'; -import { COLORS } from '@/styles/colors'; -import { THEME } from '@/styles/colors.css'; -import { widgetContainer } from '@/views/ChatWidget/styles.css'; - -export const fadeIn = keyframes({ - '0%': { - opacity: 0, - transform: 'translateY(-10px)', - }, - '100%': { - opacity: 1, - transform: 'translateY(0)', - }, -}); - -export const fadeOut = keyframes({ - '0%': { - opacity: 1, - transform: 'translateY(0)', - }, - '100%': { - opacity: 0, - transform: 'translateY(-10px)', - }, -}); - -export const welcomeMessageContainer = style({ - display: 'flex', - flexDirection: 'column', - alignItems: 'center', - fontFamily: THEME.fontFamily, - padding: '48px 20px 28px 20px', - textAlign: 'center', -}); - -export const avatarContainer = style({ - marginBottom: '16px', - opacity: 0, - selectors: { - [`.${widgetContainer.classNames.variants.withChat.true} &`]: { - animation: `${fadeIn} ${componentAnimations.welcomeMessage.duration} ${timingFunction.gentle} forwards`, - animationDelay: componentAnimations.welcomeMessage.delays.avatar, - }, - [`.${widgetContainer.classNames.variants.withChat.false} &`]: { - animation: `${fadeOut} 0.4s ${timingFunction.gentle} forwards`, - }, - }, -}); - -export const welcomeMessageTitle = style({ - marginBottom: '3px', - fontSize: '22px', - fontWeight: 700, - color: COLORS.NEUTRAL_DARK[900], - display: '-webkit-box', - WebkitLineClamp: 2, - WebkitBoxOrient: 'vertical', - overflow: 'hidden', - opacity: 0, - selectors: { - [`.${widgetContainer.classNames.variants.withChat.true} &`]: { - animation: `${fadeIn} ${componentAnimations.welcomeMessage.duration} ${timingFunction.gentle} forwards`, - animationDelay: componentAnimations.welcomeMessage.delays.title, - }, - [`.${widgetContainer.classNames.variants.withChat.false} &`]: { - animation: `${fadeOut} ${componentAnimations.welcomeMessage.duration} ${timingFunction.gentle} forwards`, - }, - }, -}); - -export const welcomeMessageDescription = style({ - margin: 0, - fontSize: '14px', - fontWeight: 400, - color: COLORS.NEUTRAL_DARK[100], - display: '-webkit-box', - WebkitLineClamp: 3, - WebkitBoxOrient: 'vertical', - overflow: 'hidden', - opacity: 0, - selectors: { - [`.${widgetContainer.classNames.variants.withChat.true} &`]: { - animation: `${fadeIn} ${componentAnimations.welcomeMessage.duration} ${timingFunction.gentle} forwards`, - animationDelay: componentAnimations.welcomeMessage.delays.description, - }, - [`.${widgetContainer.classNames.variants.withChat.false} &`]: { - animation: `${fadeOut} 0.4s ${timingFunction.gentle} forwards`, - }, - }, -}); diff --git a/packages/chat/src/components/WelcomeMessage/WelcomeMessage.story.tsx b/packages/chat/src/components/WelcomeMessage/WelcomeMessage.story.tsx deleted file mode 100644 index 32339f8134..0000000000 --- a/packages/chat/src/components/WelcomeMessage/WelcomeMessage.story.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; - -import EMPTY_IMAGE from '@/__fixtures__/empty-image.png'; -import { widgetContainer } from '@/views/ChatWidget/styles.css'; - -import { WelcomeMessage } from '.'; - -type Story = StoryObj; - -const meta: Meta = { - title: 'Core/WelcomeMessage', - component: WelcomeMessage, - args: { - avatar: EMPTY_IMAGE, - }, - parameters: { - layout: 'centered', - }, - decorators: [ - (Story) => ( -
    - -
    - ), - ], -}; -export default meta; - -export const Base: Story = { - args: { - avatar: EMPTY_IMAGE, - title: 'Agent name', - description: 'Agent description.', - }, -}; - -export const LongContent: Story = { - args: { - avatar: EMPTY_IMAGE, - title: - 'Hello, I am your #1 favourite AI assistant, meant to help you out in all sorts of ways. Hello, I am your #1 favourite AI assistant, meant to help you out in all sorts of ways. Hello, I am your #1 favourite AI assistant, meant to help you out in all sorts of ways. Hello, I am your #1 favourite AI assistant, meant to help you out in all sorts of ways. Hello, I am your #1 favourite AI assistant, meant to help you out in all sorts of ways.', - description: - 'I can do tons of stuff, like help you with your account, answer questions, and even tell you a joke or two. Just ask me anything! I can do tons of stuff, like help you with your account, answer questions, and even tell you a joke or two. Just ask me anything! I can do tons of stuff, like help you with your account, answer questions, and even tell you a joke or two. Just ask me anything!I can do tons of stuff, like help you with your account, answer questions, and even tell you a joke or two. Just ask me anything! I can do tons of stuff, like help you with your account, answer questions, and even tell you a joke or two. Just ask me anything! I can do tons of stuff, like help you with your account, answer questions, and even tell you a joke or two. Just ask me anything!', - }, - render: (args) => ( -
    - Mock container -
    - -
    -
    - ), -}; diff --git a/packages/chat/src/components/WelcomeMessage/index.tsx b/packages/chat/src/components/WelcomeMessage/index.tsx deleted file mode 100644 index e001fff95d..0000000000 --- a/packages/chat/src/components/WelcomeMessage/index.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import clsx from 'clsx'; - -import { ClassName } from '@/constants'; -import { DEFAULT_CHAT_AVATAR } from '@/dtos/AssistantOptions.dto'; - -import { Avatar } from '../Avatar'; -import { - avatarContainer, - welcomeMessageContainer, - welcomeMessageDescription, - welcomeMessageTitle, -} from './WelcomeMessage.css'; - -export interface IWelcomeMessage { - /** - * Should we show the welcome message - */ - enabled: boolean; - - /** - * The title of the assistant. - */ - title: string; - - /** - * A short description of the assistant to help frame the conversation. - */ - description: string; - - /** - * An image URL that identifies the assistant, such as a brand icon. - */ - avatar?: string; -} - -export const WelcomeMessage: React.FC = ({ enabled, title, description, avatar }) => { - if (!enabled) return null; - - return ( -
    -
    - -
    -
    - {title} -
    -
    - {description} -
    -
    - ); -}; diff --git a/packages/chat/src/components/index.ts b/packages/chat/src/components/index.ts deleted file mode 100644 index 2f3e66ab2a..0000000000 --- a/packages/chat/src/components/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -export { AgentMessage } from './AgentMessage'; -export { Avatar } from './Avatar'; -export { Button } from './Button'; -export { Card } from './Card'; -export { Carousel } from './Carousel'; -export { ColorTheme } from './ColorTheme/ColorTheme.component'; -export { DebugMessage } from './DebugMessage'; -export { FeedbackButton } from './FeedbackButton'; -export { Header } from './Header'; -export { Icon } from './Icon'; -export { Image } from './Image'; -export { Launcher } from './Launcher'; -export { LinkPreview } from './LinkPreview'; -export { MessageInput } from './MessageInput'; -export { NewChat } from './NewChat'; -export { NewFooter } from './NewFooter'; -export { Proactive } from './Proactive'; -export { Prompt } from './Prompt'; -export { SendButton } from './SendButton'; -export { SystemResponse } from './SystemResponse'; -export { Tooltip } from './Tooltip'; -export { TypingIndicator } from './TypingIndicator'; -export { UserResponse } from './UserResponse'; -export { VoiceWidget } from './VoiceWidget'; -export { WelcomeMessage } from './WelcomeMessage'; diff --git a/packages/chat/src/constant/voice.constant.ts b/packages/chat/src/constant/voice.constant.ts deleted file mode 100644 index d0629eec35..0000000000 --- a/packages/chat/src/constant/voice.constant.ts +++ /dev/null @@ -1,9 +0,0 @@ -export const VOICE_STATE = { - IDLE: 'IDLE', - INITIALIZING: 'INITIALIZING', - LISTENING: 'LISTENING', - TALKING: 'TALKING', - ENDED: 'ENDED', -}; - -export type VoiceState = (typeof VOICE_STATE)[keyof typeof VOICE_STATE]; diff --git a/packages/chat/src/constants.ts b/packages/chat/src/constants.ts deleted file mode 100644 index 9d74937aed..0000000000 --- a/packages/chat/src/constants.ts +++ /dev/null @@ -1,34 +0,0 @@ -import Bowser from 'bowser'; - -export enum ClassName { - ASSISTANT_INFO = 'vfrc-assistant-info', - AVATAR = 'vfrc-avatar', - BUBBLE = 'vfrc-bubble', // Not in use anymore - BUTTON = 'vfrc-button', - CARD = 'vfrc-card', - CAROUSEL = 'vfrc-carousel', - CHAT = 'vfrc-chat', - CHAT_INPUT = 'vfrc-chat-input', - FEEDBACK = 'vfrc-feedback', - FOOTER = 'vfrc-footer', - HEADER = 'vfrc-header', - ICON = 'vfrc-icon', - IMAGE = 'vfrc-image', - INPUT = 'vfrc-input', - LAUNCHER = 'vfrc-launcher', - LOADER = 'vfrc-loader', - MESSAGE = 'vfrc-message', - PROMPT = 'vfrc-prompt', - SYSTEM_RESPONSE = 'vfrc-system-response', - TIMESTAMP = 'vfrc-timestamp', - TOOLTIP = 'vfrc-tooltip', - TYPING_INDICATOR = 'vfrc-typing-indicator', - USER_RESPONSE = 'vfrc-user-response', - WIDGET = 'vfrc-widget', - - PROACTIVE_CLOSE = 'vfrc-proactive-close', - PROACTIVE_MESSAGE = 'vfrc-proactive-message', - PROACTIVE = 'vfrc-proactive', -} - -export const DEVICE_INFO = Bowser.parse(window.navigator.userAgent); diff --git a/packages/chat/src/contexts/AutoScrollContext.tsx b/packages/chat/src/contexts/AutoScrollContext.tsx deleted file mode 100644 index 8d82251945..0000000000 --- a/packages/chat/src/contexts/AutoScrollContext.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import React, { createContext, useCallback, useMemo, useState } from 'react'; - -export interface AutoScrollContext { - scrollToBottom: () => void; -} - -export const AutoScrollContext = createContext({ - scrollToBottom: () => undefined, -}); - -export const IsAutoScrollingContext = createContext(false); - -export const { Consumer: AutoScrollConsumer } = AutoScrollContext; - -export interface AutoScrollProviderProps extends React.PropsWithChildren { - target: React.RefObject; -} - -export const AutoScrollProvider = ({ target, children }: AutoScrollProviderProps) => { - const [autoScrolling, setAutoScrolling] = useState(false); - - const scrollToBottom = useCallback(() => { - setAutoScrolling(true); - setTimeout(() => { - setAutoScrolling(false); - }, 700); - - requestAnimationFrame(() => { - const el = target.current; - if (!el) return; - - const { scrollTop, scrollHeight, clientHeight } = el; - const hiddenHeight = scrollHeight - clientHeight; - if (hiddenHeight === scrollTop) return; - - el.scrollTo({ top: hiddenHeight, behavior: 'smooth' }); - }); - }, []); - - const context = useMemo(() => ({ scrollToBottom }), [scrollToBottom]); - - return ( - - {children} - - ); -}; diff --git a/packages/chat/src/contexts/RuntimeContext/audio-controller.ts b/packages/chat/src/contexts/RuntimeContext/audio-controller.ts deleted file mode 100644 index 02df7e3d58..0000000000 --- a/packages/chat/src/contexts/RuntimeContext/audio-controller.ts +++ /dev/null @@ -1,40 +0,0 @@ -export class AudioController { - public audio = new Audio(); - - private reject: (() => void) | null = null; - - public pause(): void { - this.audio.pause(); - } - - public continue(): void { - this.audio.play(); - } - - public async play(src: undefined | null | string): Promise { - this.stop(); - - if (!src) return Promise.resolve(); - - return new Promise((resolve, reject) => { - this.reject = reject; - - this.audio.onended = () => resolve(); - this.audio.onerror = () => reject(); - - this.audio.src = src; - this.audio.currentTime = 0; - - this.audio.play(); - }); - } - - public stop(): void { - this.reject?.(); - this.audio.pause(); - - this.audio.onended = null; - this.audio.onerror = null; - this.audio.currentTime = 0; - } -} diff --git a/packages/chat/src/contexts/RuntimeContext/index.tsx b/packages/chat/src/contexts/RuntimeContext/index.tsx deleted file mode 100644 index f25e79cedf..0000000000 --- a/packages/chat/src/contexts/RuntimeContext/index.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import React, { createContext, useMemo } from 'react'; - -import type { RuntimeState, Settings } from './useRuntimeState'; -import { useRuntimeState } from './useRuntimeState'; - -// split up API and state to prevent unnecessary re-renders -export const RuntimeStateAPIContext = createContext({} as any); -export const RuntimeStateContext = createContext({} as any); - -interface RuntimeProviderProps extends React.PropsWithChildren, Settings { - extend?: (runtime: RuntimeState['api']) => RuntimeState['api']; -} - -export const RuntimeProvider = ({ children, extend, ...settings }: RuntimeProviderProps) => { - const store = useRuntimeState(settings); - - // api is a static object, so we can use useMemo to prevent unnecessary re-renders - const api = useMemo(() => extend?.(store.api) ?? store.api, [settings]); - - return ( - - {children} - - ); -}; diff --git a/packages/chat/src/contexts/RuntimeContext/messages.ts b/packages/chat/src/contexts/RuntimeContext/messages.ts deleted file mode 100644 index 9555123d65..0000000000 --- a/packages/chat/src/contexts/RuntimeContext/messages.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { CardTraceDTO, CarouselTraceDTO, ChoiceTraceDTO, TextTraceDTO, VisualTraceDTO } from '@voiceflow/dtos-interact'; -import type { RuntimeAction, TraceDeclaration } from '@voiceflow/sdk-runtime'; -import { - CardV2TraceComponent, - ChoiceTraceComponent, - TextTraceComponent, - Trace, - VisualTraceComponent, -} from '@voiceflow/sdk-runtime'; - -import type { CardProps } from '@/components/Card/types'; -import type { SystemResponseProps } from '@/components/SystemResponse'; -import { MessageType } from '@/components/SystemResponse/constants'; - -export interface RuntimeMessage extends Pick {} - -const isValidCard = (card: CardProps) => { - return !!card.title || !!card.description || !!card.image || !!card.actions?.filter(({ name }) => !!name).length; -}; - -export const MESSAGE_TRACES: TraceDeclaration[] = [ - TextTraceComponent(({ context }, trace) => { - if (!TextTraceDTO.safeParse(trace).success) return context; - - const { slate, message, ai, delay } = trace.payload; - - context.messages.push({ - type: MessageType.TEXT, - text: slate?.content || message, - delay, - ...(ai ? { ai } : {}), - }); - - return context; - }), - VisualTraceComponent(({ context }, trace) => { - if (!VisualTraceDTO.safeParse(trace).success) return context; - - context.messages.push({ type: MessageType.IMAGE, url: trace.payload.image }); - return context; - }), - ChoiceTraceComponent(({ context }, trace) => { - if (!ChoiceTraceDTO.safeParse(trace).success) return context; - - const { - payload: { buttons }, - } = trace; - context.actions = (buttons as { name: string; request: RuntimeAction }[]).map(({ name, request }) => ({ - name, - request, - })); - return context; - }), - CardV2TraceComponent(({ context }, trace) => { - if (!CardTraceDTO.safeParse(trace).success) return context; - - const { - payload: { title, imageUrl, description, buttons }, - } = trace; - const card: CardProps = { - title, - description: description.text, - image: imageUrl, - actions: buttons.map(({ name, request }) => ({ name, request })), - }; - - if (isValidCard(card)) { - context.messages.push({ - type: 'card', - ...card, - }); - } - return context; - }), - { - canHandle: ({ type }) => type === Trace.TraceType.CAROUSEL, - handle: ({ context }, trace: Trace.Carousel) => { - if (!CarouselTraceDTO.safeParse(trace).success) return context; - - const cards: CardProps[] = trace.payload.cards - .map(({ title, description, imageUrl, buttons }) => ({ - title, - description: description.text, - image: imageUrl, - actions: buttons.map(({ name, request }) => ({ name, request })), - })) - .filter(isValidCard); - - if (cards.length) { - context.messages.push({ - type: MessageType.CAROUSEL, - cards, - }); - } - - return context; - }, - }, - { - canHandle: ({ type }) => type === Trace.TraceType.END, - handle: ({ context }) => { - context.messages.push({ type: MessageType.END }); - return context; - }, - }, -]; diff --git a/packages/chat/src/contexts/RuntimeContext/runtime.utils.test.ts b/packages/chat/src/contexts/RuntimeContext/runtime.utils.test.ts deleted file mode 100644 index ebf20f126b..0000000000 --- a/packages/chat/src/contexts/RuntimeContext/runtime.utils.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { describe, expect, it } from 'vitest'; - -import { TurnType } from '@/types'; - -import { getLastSystemTurn, resolveAction } from './runtime.utils'; - -describe('getLastSystemTurn', () => { - it('should return the last SYSTEM turn', () => { - const mockTurns1 = [{ type: TurnType.USER }, { type: TurnType.SYSTEM }] as any[]; - expect(getLastSystemTurn(mockTurns1)).toBe(mockTurns1[1]); - - const mockTurns2 = [{ type: TurnType.SYSTEM }, { type: TurnType.USER }] as any[]; - expect(getLastSystemTurn(mockTurns2)).toBe(mockTurns2[0]); - }); - - it('should return null if no SYSTEM turn is present', () => { - expect(getLastSystemTurn([])).toBeNull(); - expect(getLastSystemTurn([{ type: TurnType.USER }] as any)).toBeNull(); - }); -}); - -describe('resolveAction', () => { - it('should return the matched action if user text request matches system action name', () => { - const mockTurns = [ - // wrong system turn: - { type: TurnType.SYSTEM, actions: [{ name: 'action1', request: 'request0' }] }, - // right system turn: - { type: TurnType.SYSTEM, actions: [{ name: 'action1', request: 'request1' }] }, - { type: TurnType.USER, actions: [] }, - ] as any[]; - - const result = resolveAction({ type: 'text', payload: 'action1' }, mockTurns); - expect(result).toEqual('request1'); - }); - - it('should return the original action if no matching system action is found', () => { - const mockTurns = [ - { type: TurnType.USER, actions: [] }, - { type: TurnType.SYSTEM, actions: [{ name: 'action1', request: 'request1' }] }, - ] as any[]; - - const action = { type: 'text', payload: 'non-existent' }; - const result = resolveAction(action, mockTurns); - expect(result).toEqual(action); - }); - - it('should return the original action if action is not a text request', () => { - const mockTurns = [{ type: TurnType.SYSTEM, actions: [{ name: 'action1', request: 'request1' }] }] as any[]; - - const action = { type: 'not-text', payload: 'action1' }; - const result = resolveAction(action, mockTurns); - expect(result).toEqual(action); - }); -}); diff --git a/packages/chat/src/contexts/RuntimeContext/runtime.utils.ts b/packages/chat/src/contexts/RuntimeContext/runtime.utils.ts deleted file mode 100644 index b4601da6a1..0000000000 --- a/packages/chat/src/contexts/RuntimeContext/runtime.utils.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { type BaseRequest, isTextRequest } from '@voiceflow/dtos-interact'; - -import type { SystemTurnProps, TurnProps } from '@/types'; -import { TurnType } from '@/types'; - -export const getLastSystemTurn = (turns: TurnProps[]): SystemTurnProps | null => { - for (let i = turns.length - 1; i >= 0; i--) { - const turn = turns[i]; - if (turn.type === TurnType.SYSTEM) return turn; - } - - return null; -}; - -const stringFuzzyEquals = (a: string, b: string) => a.trim().toLowerCase() === b.trim().toLowerCase(); - -// resolve the action that the user should take, based on pass turns as input -export const resolveAction = (action: BaseRequest, turns: TurnProps[]): BaseRequest => { - if (isTextRequest(action)) { - /// if the system has suggested actions, match action name against the user text request - const systemTurn = getLastSystemTurn(turns); - const matchedAction = systemTurn?.actions?.find((a) => stringFuzzyEquals(a.name, action.payload))?.request; - if (matchedAction) return matchedAction; - } - - return action; -}; diff --git a/packages/chat/src/contexts/RuntimeContext/silent-audio.ts b/packages/chat/src/contexts/RuntimeContext/silent-audio.ts deleted file mode 100644 index 665922eb05..0000000000 --- a/packages/chat/src/contexts/RuntimeContext/silent-audio.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const silentAudio = - 'data:audio/mpeg;base64,SUQzBAAAAAACPFRYWFgAAAAXAAADVFNTAEdhcmFnZUJhbmQgMTAuMy4zAFRYWFgAAABlAAADaVR1bk5PUk0AIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwAFRYWFgAAAB/AAADaVR1blNNUEIAIDAwMDAwMDAwIDAwMDAwMjEwIDAwMDAwODU4IDAwMDAwMDAwMDAwNDA5OTggMDAwMDAwMDAgMDAwMEI2REMgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAAVFNTRQAAAA8AAANMYXZmNTguMjkuMTAwAAAAAAAAAAAAAAD/+5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJbmZvAAAADwAAACgAAELvAAwMEhIYGBgfHyUlJSsrMTExODg+Pj5EREpKSlFRV1dXXV1jY2NqanBwcHZ2fHx8g4OJiYmPj5WVlZycoqKiqKiurq61tbu7u8HBx8fHzs7U1NTa2uDg4Ofn7e3t8/P5+fn//wAAAABMYXZjNTguNTQAAAAAAAAAAAAAAAAkBXwAAAAAAABC78H9CuUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+5BkAA/wAABpAAAACAAADSAAAAEAAAGkAAAAIAAANIAAAARMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+5JkQI/wAABpAAAACAAADSAAAAEAAAGkAAAAIAAANIAAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uSZECP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7kmRAj/AAAGkAAAAIAAANIAAAAQAAAaQAAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+5JkQI/wAABpAAAACAAADSAAAAEAAAGkAAAAIAAANIAAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uSZECP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7kmRAj/AAAGkAAAAIAAANIAAAAQAAAaQAAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+5JkQI/wAABpAAAACAAADSAAAAEAAAGkAAAAIAAANIAAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uSZECP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7kmRAj/AAAGkAAAAIAAANIAAAAQAAAaQAAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+5JkQI/wAABpAAAACAAADSAAAAEAAAGkAAAAIAAANIAAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uSZECP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7kmRAj/AAAGkAAAAIAAANIAAAAQAAAaQAAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+5JkQI/wAABpAAAACAAADSAAAAEAAAGkAAAAIAAANIAAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uSZECP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7kmRAj/AAAGkAAAAIAAANIAAAAQAAAaQAAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+5JkQI/wAABpAAAACAAADSAAAAEAAAGkAAAAIAAANIAAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uSZECP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7kmRAj/AAAGkAAAAIAAANIAAAAQAAAaQAAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+5JkQI/wAABpAAAACAAADSAAAAEAAAGkAAAAIAAANIAAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uSZECP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7kmRAj/AAAGkAAAAIAAANIAAAAQAAAaQAAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+5JkQI/wAABpAAAACAAADSAAAAEAAAGkAAAAIAAANIAAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uSZECP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7kmRAj/AAAGkAAAAIAAANIAAAAQAAAaQAAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+5BkQQ/wAABpAAAACAAADSAAAAEAAAGkAAAAIAAANIAAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+5JkQI/wAABpAAAACAAADSAAAAEAAAGkAAAAIAAANIAAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uSZECP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7kmRAj/AAAGkAAAAIAAANIAAAAQAAAaQAAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+5JkQI/wAABpAAAACAAADSAAAAEAAAGkAAAAIAAANIAAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uSZECP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7kmRAj/AAAGkAAAAIAAANIAAAAQAAAaQAAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+5JkQI/wAABpAAAACAAADSAAAAEAAAGkAAAAIAAANIAAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uSZECP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7kmRAj/AAAGkAAAAIAAANIAAAAQAAAaQAAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+5JkQI/wAABpAAAACAAADSAAAAEAAAGkAAAAIAAANIAAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uSZECP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7kmRAj/AAAGkAAAAIAAANIAAAAQAAAaQAAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+5JkQI/wAABpAAAACAAADSAAAAEAAAGkAAAAIAAANIAAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uSZECP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ=='; diff --git a/packages/chat/src/contexts/RuntimeContext/traces/EffectExtensions.trace.ts b/packages/chat/src/contexts/RuntimeContext/traces/EffectExtensions.trace.ts deleted file mode 100644 index 0ba61c02a8..0000000000 --- a/packages/chat/src/contexts/RuntimeContext/traces/EffectExtensions.trace.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { Trace } from '@voiceflow/base-types'; -import type { TraceDeclaration } from '@voiceflow/sdk-runtime'; - -import type { AnyExtension, EffectExtension } from '@/dtos/Extension.dto'; -import { ExtensionType } from '@/dtos/Extension.dto'; - -import type { RuntimeMessage } from '../messages'; - -export const EffectExtensions = (extensions: AnyExtension[]): TraceDeclaration[] => { - return extensions - .filter((extension): extension is EffectExtension => extension.type === ExtensionType.EFFECT) - .map((extension) => ({ - canHandle: (trace) => extension.match({ trace }), - - handle: ({ context }, trace) => { - // NOTE: this promise is intentionally left unhandled - // we just want to capture and raise any errors thrown - (async () => { - try { - await extension.effect?.({ trace }); - } catch (e) { - console.error(`Extension '${extension.name}' threw an error: ${e}`); - } - })(); - - return context; - }, - })); -}; diff --git a/packages/chat/src/contexts/RuntimeContext/traces/NoReply.trace.ts b/packages/chat/src/contexts/RuntimeContext/traces/NoReply.trace.ts deleted file mode 100644 index 7040d83463..0000000000 --- a/packages/chat/src/contexts/RuntimeContext/traces/NoReply.trace.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { Trace } from '@voiceflow/base-types'; -import type { TraceDeclaration } from '@voiceflow/sdk-runtime'; -import { ActionType } from '@voiceflow/sdk-runtime'; - -import { DEFAULT_MESSAGE_DELAY } from '@/components/SystemResponse/constants'; - -import type { RuntimeMessage } from '../messages'; - -export const NoReply = (callback: (timeout: number) => void): TraceDeclaration => ({ - canHandle: ({ type }) => type === ActionType.NO_REPLY, - handle: ({ context }, trace: Trace.NoReplyTrace) => { - if (trace.payload?.timeout) { - // messages take 1 second to animate in, on top of the delay - const messageDelays = context.messages.reduce( - (acc, message) => acc + (message.delay ?? 1000) + DEFAULT_MESSAGE_DELAY, - 0 - ); - const timeout = trace.payload.timeout * 1000 + messageDelays; - - // eslint-disable-next-line callback-return - callback(timeout); - } - return context; - }, -}); diff --git a/packages/chat/src/contexts/RuntimeContext/traces/ResponseExtensions.trace.ts b/packages/chat/src/contexts/RuntimeContext/traces/ResponseExtensions.trace.ts deleted file mode 100644 index a2c9cefecb..0000000000 --- a/packages/chat/src/contexts/RuntimeContext/traces/ResponseExtensions.trace.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { Trace } from '@voiceflow/base-types'; -import type { TraceDeclaration } from '@voiceflow/sdk-runtime'; - -import { MessageType } from '@/components/SystemResponse/constants'; -import type { AnyExtension, ResponseExtension } from '@/dtos/Extension.dto'; -import { ExtensionType } from '@/dtos/Extension.dto'; - -import type { RuntimeMessage } from '../messages'; - -export const ResponseExtensions = (extensions: AnyExtension[]): TraceDeclaration[] => { - return extensions - .filter((extension): extension is ResponseExtension => extension.type === ExtensionType.RESPONSE) - .map((extension) => ({ - canHandle: (trace) => extension.match({ trace }), - - handle: ({ context }, trace) => { - context.messages.push({ type: MessageType.EXTENSION, payload: { trace, extension } }); - - return context; - }, - })); -}; diff --git a/packages/chat/src/contexts/RuntimeContext/useNoReply.ts b/packages/chat/src/contexts/RuntimeContext/useNoReply.ts deleted file mode 100644 index f06d492077..0000000000 --- a/packages/chat/src/contexts/RuntimeContext/useNoReply.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { BaseRequest } from '@voiceflow/base-types'; -import { useCallback, useRef } from 'react'; - -import { SessionStatus } from '@/types'; - -import type { RuntimeState } from './useRuntimeState'; - -export const useNoReply = (api: () => Pick) => { - const noReplyTimeout = useRef(null); - - const clearNoReplyTimeout = useCallback(() => { - if (!noReplyTimeout.current) return; - - clearTimeout(noReplyTimeout.current); - noReplyTimeout.current = null; - }, []); - - const setNoReplyTimeout = useCallback((timeout: number) => { - clearNoReplyTimeout(); - noReplyTimeout.current = setTimeout(() => { - // Trigger no reply action - if (!api().isStatus(SessionStatus.ACTIVE)) return; - - api().interact({ type: BaseRequest.RequestType.NO_REPLY, payload: null }); - }, timeout); - }, []); - - return { setNoReplyTimeout, clearNoReplyTimeout }; -}; diff --git a/packages/chat/src/contexts/RuntimeContext/useRuntimeAPI.ts b/packages/chat/src/contexts/RuntimeContext/useRuntimeAPI.ts deleted file mode 100644 index 65036596a0..0000000000 --- a/packages/chat/src/contexts/RuntimeContext/useRuntimeAPI.ts +++ /dev/null @@ -1,86 +0,0 @@ -import type { RuntimeAction } from '@voiceflow/sdk-runtime'; -import { VoiceflowRuntime } from '@voiceflow/sdk-runtime'; -import { serializeToText } from '@voiceflow/slate-serializer/text'; -import { useMemo } from 'react'; - -import type { MessageProps } from '@/components/SystemResponse'; -import { MessageType } from '@/components/SystemResponse/constants'; -import { DEVICE_INFO } from '@/constants'; -import type { ChatConfig } from '@/dtos/ChatConfig.dto'; -import type { SessionOptions, UserTurnProps } from '@/types'; - -import type { RuntimeMessage } from './messages'; -import { MESSAGE_TRACES } from './messages'; - -export enum FeedbackName { - POSITIVE = 'Thumbs up', - NEGATIVE = 'Thumbs down', -} - -export const createContext = (): RuntimeMessage => ({ - messages: [], -}); - -export const useRuntimeAPI = ({ - url, - user, - userID, - verify, - versionID, - traceHandlers = [], -}: ChatConfig & Pick & { traceHandlers?: typeof MESSAGE_TRACES }) => { - const runtime: VoiceflowRuntime = useMemo( - () => - new VoiceflowRuntime({ - verify, - url, - traces: [...MESSAGE_TRACES, ...traceHandlers], - }), - [] - ); - - const interact = async (action: RuntimeAction, config?: any) => - runtime.interact(createContext(), { - sessionID: userID, - action, - config, - ...(versionID && { versionID }), - }); - - const saveFeedback = async (name: FeedbackName, lastTurnMessages: MessageProps[], userTurn: UserTurnProps | null) => { - const aiMessages: string[] = []; - - lastTurnMessages.forEach((message) => { - if (!message.ai) return; - if (message.type !== MessageType.TEXT) return; - const text = typeof message.text === 'string' ? message.text : serializeToText(message.text); - - aiMessages.push(text); - }); - - await runtime.feedback({ - sessionID: userID, - name, - text: aiMessages, - lastUserTurn: userTurn, - ...(versionID && { versionID }), - }); - }; - - const saveTranscript = async () => { - const { - browser: { name: browser }, - os: { name: os }, - platform: { type: device }, - } = DEVICE_INFO; - - await runtime.createTranscript(userID, { - ...(os && { os }), - ...(browser && { browser }), - ...(device && { device }), - ...(user && { user: user as { name: string } }), - }); - }; - - return { interact, saveFeedback, saveTranscript }; -}; diff --git a/packages/chat/src/contexts/RuntimeContext/useRuntimeState.ts b/packages/chat/src/contexts/RuntimeContext/useRuntimeState.ts deleted file mode 100644 index e57c24fe2a..0000000000 --- a/packages/chat/src/contexts/RuntimeContext/useRuntimeState.ts +++ /dev/null @@ -1,248 +0,0 @@ -import type { BaseRequest } from '@voiceflow/dtos-interact'; -import { isTextRequest, RequestType } from '@voiceflow/dtos-interact'; -import type { TraceDeclaration } from '@voiceflow/sdk-runtime'; -import cuid from 'cuid'; -import { useEffect, useRef, useState } from 'react'; - -import { DEFAULT_MESSAGE_DELAY, MessageType } from '@/components/SystemResponse/constants'; -import { isIOS } from '@/device'; -import type { ChatConfig } from '@/dtos/ChatConfig.dto'; -import { useStateRef } from '@/hooks/useStateRef'; -import { useLocalStorageState } from '@/hooks/useStorage'; -import type { ChatPersistence, ChatWidgetSettings, SendMessage, SessionOptions, TurnProps } from '@/types'; -import { SessionStatus, TurnType } from '@/types'; -import { handleActions } from '@/utils/actions'; -import { broadcast, BroadcastType } from '@/utils/broadcast'; -import { getSession, saveSession } from '@/utils/session'; - -import { AudioController } from './audio-controller'; -import type { RuntimeMessage } from './messages'; -import { resolveAction } from './runtime.utils'; -import { silentAudio } from './silent-audio'; -import { EffectExtensions } from './traces/EffectExtensions.trace'; -import { NoReply } from './traces/NoReply.trace'; -import { ResponseExtensions } from './traces/ResponseExtensions.trace'; -import { useNoReply } from './useNoReply'; -import { createContext, useRuntimeAPI } from './useRuntimeAPI'; - -export interface Settings { - assistant: ChatWidgetSettings; - config: ChatConfig; - traceHandlers?: TraceDeclaration[]; -} - -const DEFAULT_SESSION_PARAMS = { - turns: [], - startTime: Date.now(), -}; - -export const useRuntimeState = ({ assistant, config, traceHandlers }: Settings) => { - const [audio] = useState(() => new AudioController()); - const playAudiosStack = useRef([]); - const [isOpen, setOpen] = useState(false); - const [audioOutput, setAudioOutput, audioOutputRef] = useLocalStorageState( - 'audio-output', - assistant.chat.voiceOutput ?? false - ); - - const [session, setSession, sessionRef] = useStateRef>(() => ({ - ...DEFAULT_SESSION_PARAMS, - status: config.autostart ? SessionStatus.IDLE : SessionStatus.ENDED, - // retrieve stored session - ...getSession(assistant.common.persistence as ChatPersistence, config.verify.projectID, config.userID), - ...{ userID: config.userID || cuid() }, - })); - - const [indicator, setIndicator] = useState(false); - const { clearNoReplyTimeout, setNoReplyTimeout } = useNoReply(() => ({ interact, isStatus })); - - const runtime = useRuntimeAPI({ - ...config, - ...session, - traceHandlers: [ - NoReply(setNoReplyTimeout), - ...EffectExtensions(assistant.extensions), - ...ResponseExtensions(assistant.extensions), - ...(traceHandlers ?? []), - ], - }); - - const isAudioOutputEnabled = () => assistant.chat.voiceOutput && audioOutputRef.current; - - // status management - const setStatus = (status: SessionStatus) => { - setSession((prev) => (prev.status === status ? prev : { ...prev, status })); - }; - const isStatus = (status: SessionStatus) => { - return sessionRef.current.status === status; - }; - - // turn management - const setTurns = (action: (turns: TurnProps[]) => TurnProps[]) => { - setSession((prev) => ({ ...prev, turns: action(prev.turns) })); - }; - - const addTurn = (turn: TurnProps) => setTurns((prev) => [...prev, turn]); - - const reset = () => setTurns(() => []); - - const interact: SendMessage = async (action: BaseRequest, message?: string) => { - clearNoReplyTimeout(); - - if (sessionRef.current.status === SessionStatus.ENDED) return; - - // create a transcript on the first turn, do this async - if (sessionRef.current.turns.length === 1) runtime.saveTranscript(); - - handleActions(action); - - const userMessage = message || (isTextRequest(action) ? action.payload : null); - if (userMessage) { - addTurn({ - id: cuid(), - type: TurnType.USER, - message: userMessage, - timestamp: Date.now(), - }); - } - - const userAction = resolveAction(action, getTurns()); - - setIndicator(true); - const context = await runtime.interact(userAction, { tts: isAudioOutputEnabled() }).catch((error) => { - // TODO: better define error condition - console.error(error); - return createContext(); - }); - setIndicator(false); - - addTurn({ - id: cuid(), - type: TurnType.SYSTEM, - timestamp: Date.now(), - ...context, - }); - - const shouldPlay = isAudioOutputEnabled() && playAudiosStack.current.length === 0; - - if (isAudioOutputEnabled()) { - context.messages.forEach((message) => { - if (message.type === MessageType.TEXT && message.audio?.src) { - playAudiosStack.current.push(message.audio.src); - } - }); - } - - if (shouldPlay) { - // eslint-disable-next-line no-promise-executor-return - await new Promise((resolve) => setTimeout(resolve, DEFAULT_MESSAGE_DELAY)); - - playAudioCircle(); - } - - broadcast({ type: BroadcastType.INTERACT, payload: { session: sessionRef.current, action: userAction } }); - saveSession(assistant.common.persistence as ChatPersistence, config.verify.projectID, sessionRef.current); - }; - - const launch = async (): Promise => { - playAudiosStack.current = []; - - // we need to play a silent audio on user interaction to enable async audio playback - if (isIOS() && isAudioOutputEnabled()) { - audio.play(silentAudio); - } - - if (sessionRef.current.turns.length) reset(); - - setStatus(SessionStatus.ACTIVE); - await interact(config.launch?.event ?? { type: RequestType.LAUNCH }); - }; - - const reply = async (message: string): Promise => { - stopAudios(); - - interact({ type: RequestType.TEXT, payload: message }); - }; - - const open = async () => { - broadcast({ type: BroadcastType.OPEN }); - setOpen(true); - - if (isStatus(SessionStatus.IDLE)) { - await launch(); - } - }; - - const stopChat = () => { - stopAudios(); - - broadcast({ type: BroadcastType.CLOSE }); - saveSession(assistant.common.persistence as ChatPersistence, config.verify.projectID, sessionRef.current); - }; - - const close = () => { - stopChat(); - setOpen(false); - }; - - const getTurns = () => sessionRef.current.turns; - - const stopAudios = () => { - playAudiosStack.current = []; - audio.stop(); - }; - - const playAudioCircle = async () => { - if (!isAudioOutputEnabled() || !playAudiosStack.current.length) return; - - await audio.play(playAudiosStack.current.shift()); - - playAudioCircle(); - }; - - const toggleAudioOutput = () => { - stopAudios(); - setAudioOutput((prev) => !prev); - }; - - useEffect(() => { - if (!isOpen) return undefined; - - return () => { - stopAudios(); - }; - }, [isOpen]); - - return { - state: { - session, - isOpen, - indicator, - audioOutput, - }, - api: { - launch, - reply, - open, - interact, - close, - stopChat, - addTurn, - feedback: runtime.saveFeedback, - setStatus, - setOpen, - isStatus, - reset, - getTurns, - setIndicator, - setAudioOutput, - toggleAudioOutput, - - // these are meant to be static, so bundling them with the API - assistant, - config, - }, - }; -}; - -export type RuntimeState = ReturnType; diff --git a/packages/chat/src/contexts/index.ts b/packages/chat/src/contexts/index.ts deleted file mode 100644 index d4203dc2c1..0000000000 --- a/packages/chat/src/contexts/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './AutoScrollContext'; -export * from './RuntimeContext'; diff --git a/packages/chat/src/device.ts b/packages/chat/src/device.ts deleted file mode 100644 index 49b1b10235..0000000000 --- a/packages/chat/src/device.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { DEVICE_INFO } from '@/constants'; - -export const isIOS = () => DEVICE_INFO.os.name === 'iOS'; - -export const isBrave = () => { - const browserNavigator = globalThis.navigator as Navigator & { brave?: { isBrave: () => boolean } }; - - if (!browserNavigator) return false; - - if (browserNavigator.brave !== undefined) { - return browserNavigator.brave.isBrave.name === 'isBrave'; - } - - return false; -}; - -export const isArc = () => !!getComputedStyle(document.documentElement).getPropertyValue('--arc-palette-title'); -export const isEdge = () => DEVICE_INFO.browser.name === 'Microsoft Edge'; -export const isOpera = () => DEVICE_INFO.browser.name === 'Opera'; -export const isChrome = () => !isBrave() && !isArc() && DEVICE_INFO.browser.name === 'Chrome'; -export const isSafari = () => DEVICE_INFO.browser.name === 'Safari'; -export const isFirefox = () => DEVICE_INFO.browser.name === 'Firefox'; -export const isChromium = () => isEdge() || isChrome() || isBrave() || isArc() || isOpera(); diff --git a/packages/chat/src/dtos/AssistantOptions.dto.ts b/packages/chat/src/dtos/AssistantOptions.dto.ts deleted file mode 100644 index 9f39e4ecd9..0000000000 --- a/packages/chat/src/dtos/AssistantOptions.dto.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { z } from 'zod'; - -import { DEFAULT_PRIMARY } from '@/styles/colors'; -import { ChatPersistence, ChatPosition } from '@/types'; - -import { AnyExtension } from './Extension.dto'; - -export const DEFAULT_AVATAR = 'https://cdn.voiceflow.com/assets/logo.png'; - -export const DEFAULT_CHAT_AVATAR = 'https://cdn.voiceflow.com/widget-next/vf_chat.png'; - -export type AssistantOptions = z.infer; -export type RawAssistantOptions = z.input; - -export const AssistantOptions = z - .object({ - title: z.string().default('Voiceflow Assistant'), - color: z.string().default(DEFAULT_PRIMARY), - image: z.string().default(DEFAULT_AVATAR), - avatar: z.string().default(DEFAULT_AVATAR), - launcher: z.string().optional(), - watermark: z.boolean().default(true), - feedback: z.boolean().default(false), - stylesheet: z.union([z.string(), z.string().array()]).optional(), - description: z.string().default(''), - position: z.nativeEnum(ChatPosition).default(ChatPosition.RIGHT), - persistence: z.nativeEnum(ChatPersistence).default(ChatPersistence.LOCAL_STORAGE), - audioInterface: z.boolean().default(false), - defaultAudioOutput: z.boolean().optional(), - - spacing: z - .object({ - side: z.number().default(30), - bottom: z.number().default(30), - }) - .default({}), - - extensions: AnyExtension.array().default([]), - }) - .default({}); diff --git a/packages/chat/src/dtos/ChatConfig.dto.test.ts b/packages/chat/src/dtos/ChatConfig.dto.test.ts deleted file mode 100644 index a515a753e9..0000000000 --- a/packages/chat/src/dtos/ChatConfig.dto.test.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { describe, expect, it } from 'vitest'; - -import { ChatConfig, RUNTIME_URL } from './ChatConfig.dto'; -import { RenderMode } from './RenderOptions.dto'; - -describe('ChatConfig', () => { - describe('parse()', () => { - it('should accept a minimal configuration', () => { - const projectID = 'projectID'; - - const result = ChatConfig.parse({ - verify: { projectID }, - }); - - expect(result).toEqual({ - autostart: true, - allowDangerousHTML: true, - url: RUNTIME_URL, - verify: { projectID }, - render: { mode: RenderMode.OVERLAY }, - }); - }); - - it('should accept all configuration options', () => { - const localOptions = { - autostart: true, - allowDangerousHTML: false, - - url: 'local', - userID: 'local', - versionID: 'local', - - verify: { projectID: 'local' }, - user: { name: 'local', image: 'local' }, - render: { mode: RenderMode.OVERLAY }, - launch: { event: { type: 'local' } }, - }; - - const result = ChatConfig.parse(localOptions); - - expect(result).toEqual(localOptions); - }); - - it('should accept a numeric userID', () => { - const projectID = 'projectID'; - - const result = ChatConfig.parse({ - verify: { projectID }, - userID: 123, - }); - - expect(result).toEqual({ - autostart: true, - allowDangerousHTML: true, - url: RUNTIME_URL, - verify: { projectID }, - render: { mode: RenderMode.OVERLAY }, - userID: '123', - }); - }); - - it('should accept and decode a string userID', () => { - const projectID = 'projectID'; - - const result = ChatConfig.parse({ - verify: { projectID }, - userID: 'foo%20bar', - }); - - expect(result).toEqual({ - autostart: true, - allowDangerousHTML: true, - url: RUNTIME_URL, - verify: { projectID }, - render: { mode: RenderMode.OVERLAY }, - userID: 'foo bar', - }); - }); - }); -}); diff --git a/packages/chat/src/dtos/ChatConfig.dto.ts b/packages/chat/src/dtos/ChatConfig.dto.ts deleted file mode 100644 index 460b6e383e..0000000000 --- a/packages/chat/src/dtos/ChatConfig.dto.ts +++ /dev/null @@ -1,122 +0,0 @@ -import type { BaseRequest } from '@voiceflow/dtos-interact'; -import type { PrototypeVerify, PublicVerify, RuntimeOptions as SDKRuntimeOptions } from '@voiceflow/sdk-runtime'; -import { z } from 'zod'; - -import { RenderMode, RenderOptions } from './RenderOptions.dto'; -import type { WidgetOverrides } from './WidgetOverrides.dto'; - -export const RUNTIME_URL = 'https://general-runtime.voiceflow.com'; - -const tryDecodeURIComponent = (str: string) => { - try { - return decodeURIComponent(str); - } catch { - return str; - } -}; - -export type VerifyOptions = z.infer; -export type UserOptions = z.infer; -export type LaunchOptions = z.infer; - -export const VerifyOptions = z.union([ - z.object({ projectID: z.string() }), - z.object({ projectID: z.string(), versionID: z.string(), prototype: z.literal(true) }), -]); - -export const LaunchOptions = z - .object({ - event: z - .object({ type: z.string() }) - .passthrough() - .transform((x) => x as unknown as BaseRequest), - }) - .partial(); - -export const UserOptions = z - .object({ - name: z.string(), - image: z.string(), - }) - .partial(); - -type Config> = T; - -export interface ChatConfig extends Config> {} - -export interface LoadConfig extends Omit { - url?: ChatConfig['url']; - assistant?: WidgetOverrides; -} - -export const ChatSpeechRecognitionState = z.object({ - listening: z.boolean(), - transcript: z.string(), - processing: z.boolean(), - initializing: z.boolean(), - microphoneAvailable: z.boolean().describe('If false, the user has not given permission for their microphone.'), -}); - -export type ChatSpeechRecognitionState = z.infer; - -export const ChatSpeechRecognitionConfig = z.object({ - overrideNative: z - .boolean() - .optional() - .default(false) - .describe( - 'If true, uses the custom speech recognition implementation even if the native (browsers) one is available.' - ), - initialState: ChatSpeechRecognitionState, - onStateChange: z - .function() - .args(z.function().args(ChatSpeechRecognitionState).returns(z.void())) - .returns(z.function().returns(z.void())), - stopListening: z.function().returns(z.void()), - startListening: z - .function() - .returns(z.void()) - .describe( - `Starts listening for speech input. - User has to give permission for their microphone to be used before listening can begin. - If the user has not given permission, needs to update microphoneAvailable: false state.` - ), - resetTranscript: z.function().returns(z.void()), -}); - -export type ChatSpeechRecognitionConfig = z.infer; - -export const ChatConfig = z - .object({ - autostart: z.boolean().optional(), - // default to true during migration period, turn off later - allowDangerousHTML: z.boolean().default(true), - - url: z.string().default(RUNTIME_URL), - userID: z - .union([z.number(), z.string()]) - .transform((x) => { - if (typeof x === 'number') return String(x); - return tryDecodeURIComponent(x); - }) - .optional(), - versionID: z.string().optional(), - - verify: VerifyOptions, - user: UserOptions.optional(), - render: RenderOptions, - launch: LaunchOptions.optional(), - - voice: z - .object({ - url: z.string(), - accessToken: z.string(), - }) - .optional(), - }) - .transform((config) => ({ - ...config, - - // if not configured default to enabling autostart during overlay mode and disabling it otherwise - autostart: config.autostart ?? config.render.mode === RenderMode.OVERLAY, - })); diff --git a/packages/chat/src/dtos/Extension.dto.ts b/packages/chat/src/dtos/Extension.dto.ts deleted file mode 100644 index 762b774846..0000000000 --- a/packages/chat/src/dtos/Extension.dto.ts +++ /dev/null @@ -1,34 +0,0 @@ -import type { Trace } from '@voiceflow/base-types'; -import { z } from 'zod'; - -export enum ExtensionType { - EFFECT = 'effect', - RESPONSE = 'response', -} - -export type EffectExtension = z.infer; -export type ResponseExtension = z.infer; -export type AnyExtension = z.infer; - -const Extension = (type: Type) => - z.object({ - name: z.string(), - type: z.literal(type), - match: z.function().transform((f) => f as (context: { trace: Trace.AnyTrace }) => boolean), - }); - -export const EffectExtension = Extension(ExtensionType.EFFECT).extend({ - effect: z - .function() - .transform((f) => f as (context: { trace: Trace.AnyTrace }) => Promise | void) - .optional(), -}); - -export const ResponseExtension = Extension(ExtensionType.RESPONSE).extend({ - render: z - .function() - .transform((f) => f as (context: { trace: Trace.AnyTrace; element: HTMLElement }) => (() => void) | void) - .optional(), -}); - -export const AnyExtension = z.discriminatedUnion('type', [EffectExtension, ResponseExtension]); diff --git a/packages/chat/src/dtos/Palette.dto.ts b/packages/chat/src/dtos/Palette.dto.ts deleted file mode 100644 index bde405a6cb..0000000000 --- a/packages/chat/src/dtos/Palette.dto.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { z } from 'zod'; - -import { createPalette } from '@/styles/colors'; - -export const Palette = z - .object({ - 50: z.string(), - 100: z.string(), - 200: z.string(), - 300: z.string(), - 400: z.string(), - 500: z.string(), - 600: z.string(), - 700: z.string(), - 800: z.string(), - 900: z.string(), - }) - .default(createPalette()); - -export type Palette = z.infer; diff --git a/packages/chat/src/dtos/RenderOptions.dto.test.ts b/packages/chat/src/dtos/RenderOptions.dto.test.ts deleted file mode 100644 index 06b129a974..0000000000 --- a/packages/chat/src/dtos/RenderOptions.dto.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { describe, expect, it, vi } from 'vitest'; - -import { EMBEDDED_TARGET, RenderMode, RenderOptions } from './RenderOptions.dto'; - -describe('RenderOptions', () => { - describe('parse()', () => { - it('should render in overlay mode by default', () => { - const result = RenderOptions.parse(undefined); - - expect(result).toEqual({ mode: RenderMode.OVERLAY }); - }); - - it('should render in embedded mode', () => { - const renderOptions = { - mode: RenderMode.EMBEDDED, - target: Object.create(HTMLElement.prototype), - }; - - const result = RenderOptions.parse(renderOptions); - - expect(result).toEqual(renderOptions); - }); - - it('should try to find a target with a known name when in embedded mode', () => { - const target = Object.create(HTMLElement.prototype); - const getElementById = vi.spyOn(document, 'getElementById').mockImplementation(() => target); - - const result = RenderOptions.parse({ mode: RenderMode.EMBEDDED }); - - expect(result).toEqual({ mode: RenderMode.EMBEDDED, target }); - expect(getElementById).toBeCalledWith(EMBEDDED_TARGET); - }); - - it('should fallback to overlay mode when a target is not provided', () => { - const result = RenderOptions.parse({ mode: RenderMode.EMBEDDED }); - - expect(result).toEqual({ mode: RenderMode.OVERLAY }); - }); - }); -}); diff --git a/packages/chat/src/dtos/RenderOptions.dto.ts b/packages/chat/src/dtos/RenderOptions.dto.ts deleted file mode 100644 index 9c9bc87b1c..0000000000 --- a/packages/chat/src/dtos/RenderOptions.dto.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { z } from 'zod'; - -export const EMBEDDED_TARGET = 'voiceflow-chat-frame'; - -export enum RenderMode { - /** - * Embed the chat window into a specific container in the screen. - * This won't show the Launcher button because the chat will be - * opened by default. - */ - EMBEDDED = 'embedded', - - /** - * Shows the launcher button in the bottom corder of the screen, - * and the user needs to push it to open/minimize the chat window. - */ - OVERLAY = 'overlay', - - /** - * Shows the chat as popover dialog in the center of the screen. - */ - POPOVER = 'popover', -} - -export type RenderOptions = z.infer; - -export const RenderOptions = z - .object({ - mode: z.nativeEnum(RenderMode).default(RenderMode.OVERLAY), - target: z - .instanceof(HTMLElement) - .optional() - .transform((x) => x ?? document.getElementById(EMBEDDED_TARGET) ?? undefined), - }) - .optional() - .transform((render) => { - if (render?.target && render.mode !== RenderMode.EMBEDDED) { - console.warn(`render.target has no effect in ${render.mode} mode.`); - } - - if (render?.mode === RenderMode.EMBEDDED) { - if (render.target) { - return { - mode: RenderMode.EMBEDDED as const, - target: render.target, - }; - } - - console.error('No valid target found for embedded mode. Defaulting to overlay mode.'); - } - - return { mode: RenderMode.OVERLAY as const }; - }); diff --git a/packages/chat/src/dtos/WidgetOverrides.dto.test.ts b/packages/chat/src/dtos/WidgetOverrides.dto.test.ts deleted file mode 100644 index ca6ea7abbb..0000000000 --- a/packages/chat/src/dtos/WidgetOverrides.dto.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { describe, expect, it } from 'vitest'; - -import { WidgetOverrides } from './WidgetOverrides.dto'; - -describe('WidgetOverrides', () => { - describe('parse()', () => { - // WidgetOverrides comes from the user, so it should be totally optional - it('should create default, empty settings object', () => { - const result = WidgetOverrides.parse({}); - expect(result).toEqual({}); - }); - }); -}); diff --git a/packages/chat/src/dtos/WidgetOverrides.dto.ts b/packages/chat/src/dtos/WidgetOverrides.dto.ts deleted file mode 100644 index 935cf70ae5..0000000000 --- a/packages/chat/src/dtos/WidgetOverrides.dto.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { - WidgetSettingsChatRenderMode, - WidgetSettingsLauncherType, - WidgetSettingsWidgetType, -} from '@voiceflow/dtos-interact'; -import { ChatPersistence, ChatPosition } from '@voiceflow/voiceflow-types/build/cjs/version'; -import { z } from 'zod'; - -import { AnyExtension } from './Extension.dto'; -import { Palette } from './Palette.dto'; - -export const WidgetOverrides = z.object({ - type: z.nativeEnum(WidgetSettingsWidgetType).optional(), - renderMode: z.nativeEnum(WidgetSettingsChatRenderMode).optional(), - - // Widget header - header: z - .object({ - hideImage: z.boolean().optional(), - imageUrl: z.string().optional(), - title: z.string().optional(), - }) - .optional(), - - // Welcome message - banner: z - .object({ - hide: z.boolean().optional(), - title: z.string().optional(), - description: z.string().optional(), - imageUrl: z.string().optional(), - }) - .optional(), - - // Agent avatar - avatar: z - .object({ - hide: z.boolean().optional(), - imageUrl: z.string().optional(), - }) - .optional(), - - // input - inputPlaceholder: z.string().optional(), - - // voice within chat - enableVoiceInput: z.boolean().optional(), - enableVoiceOutput: z.boolean().optional(), - - // launcher - launcher: z - .object({ - type: z.nativeEnum(WidgetSettingsLauncherType).optional(), - label: z.string().optional(), - imageUrl: z.string().optional(), - }) - .optional(), - - // footer - footer: z - .object({ - hide: z.boolean().optional(), - linkText: z.string().optional(), - linkUrl: z.string().optional(), - }) - .optional(), - - // palette - color: z.string().optional(), - palette: Palette.optional(), - - // fonts - fontFamily: z.string().optional(), - - // position - side: z.nativeEnum(ChatPosition).optional(), - spacing: z - .object({ - side: z.string().optional(), - bottom: z.string().optional(), - }) - .optional(), - - // ai disclaimer - aiDisclaimer: z - .object({ - hide: z.boolean().optional(), - text: z.string().optional(), - }) - .optional(), - - // misc - persistence: z.nativeEnum(ChatPersistence).optional(), - - // external additions - stylesheet: z.string().optional(), - extensions: AnyExtension.array().optional(), -}); - -export type WidgetOverrides = z.infer; diff --git a/packages/chat/src/fixtures.ts b/packages/chat/src/fixtures.ts deleted file mode 100644 index b383940cfd..0000000000 --- a/packages/chat/src/fixtures.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const VF_ICON = - // eslint-disable-next-line no-secrets/no-secrets - 'https://s3-alpha-sig.figma.com/img/a055/7f08/d7a7d2188b07379a4b08bd7e495c7831?Expires=1729468800&Key-Pair-Id=APKAQ4GOSFWCVNEHN3O4&Signature=k9k0pTEQfKvUYDDyy5u6XhceRS~CAgifNUHCA7xB8nXcVmtCAljvmt96ooVIL4PxZhzk40ThyaKfd4SaXXmiCCpzA4xVMB995srb2d6ds-oc2x4x76Gd24quVTU2uWeVhv6jgM77ZFW9a-tWPkzP5ie9KK2v4PFjiI8MODI27AaRNoFtNnKC16QrR2KVp8Jjf0GBCWXotOAol2emacH5grLUFLEKOwvroO9~QrRq2Xiwb30qYY3NnI8vm6ZCDpajvi6BOKOWa6oz1URRWt-TV19xqlVkyKpI5F9rtQxp5l5lUx-IdRDjVUNIDcLOBEzqmTn6fjw4VibvtSAoZGu7ug__'; - -export const MOCK_IMAGE = 'https://picsum.photos/seed/9/300/200'; diff --git a/packages/chat/src/hooks/cache.hook.ts b/packages/chat/src/hooks/cache.hook.ts deleted file mode 100644 index ea167405b0..0000000000 --- a/packages/chat/src/hooks/cache.hook.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { useRef } from 'react'; - -export const useCachedValue = (value: T): React.MutableRefObject => { - const ref = useRef(value); - - ref.current = value; - - return ref; -}; - -export const useConst = (value: T): T => { - const ref = useRef(); - - if (ref.current === undefined) { - ref.current = value; - } - - return ref.current; -}; - -export const useCreateConst = (creator: () => T): T => { - const ref = useRef(); - - if (ref.current === undefined) { - ref.current = creator(); - } - - return ref.current; -}; diff --git a/packages/chat/src/hooks/index.ts b/packages/chat/src/hooks/index.ts deleted file mode 100644 index 48ac790ec4..0000000000 --- a/packages/chat/src/hooks/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from './useAutoScroll'; -export * from './useChatAPI'; -export * from './useDidUpdateEffect'; -export * from './usePalette'; -export * from './useStateRef'; -export * from './useStorage'; diff --git a/packages/chat/src/hooks/useAutoScroll.ts b/packages/chat/src/hooks/useAutoScroll.ts deleted file mode 100644 index 9148abaacd..0000000000 --- a/packages/chat/src/hooks/useAutoScroll.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { useContext, useLayoutEffect } from 'react'; - -import { AutoScrollContext } from '@/contexts'; - -export const useAutoScroll = (dependencies: any[] = []): void => { - const { scrollToBottom } = useContext(AutoScrollContext); - - useLayoutEffect(() => { - scrollToBottom(); - }, dependencies); -}; diff --git a/packages/chat/src/hooks/useChatAPI.ts b/packages/chat/src/hooks/useChatAPI.ts deleted file mode 100644 index e844f1d387..0000000000 --- a/packages/chat/src/hooks/useChatAPI.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { useEffect } from 'react'; -import type { PartialDeep } from 'type-fest'; - -import { createPlaceholderMethods } from '@/utils/chat'; -import { isObject } from '@/utils/isObject'; - -export const useChatAPI = ( - target: Record | undefined, - factory: () => PartialDeep, - onReady?: () => void -) => - useEffect(() => { - if (!isObject(target)) return undefined; - - const placeholders = createPlaceholderMethods((method) => `Method '${method}' has no effect in this mode.`); - const methods = factory(); - - Object.assign(target, { - ...placeholders, - ...methods, - proactive: { - ...placeholders.proactive, - ...methods.proactive, - }, - }); - - onReady?.(); - - return () => { - const methods = createPlaceholderMethods( - (method) => - `Method '${method}' has no effect after 'destroy' has been called. Call 'load' to render the chat and restore this method.` - ); - - Object.assign(target, methods); - }; - }, []); diff --git a/packages/chat/src/hooks/useDidUpdateEffect.ts b/packages/chat/src/hooks/useDidUpdateEffect.ts deleted file mode 100644 index cb91dde79b..0000000000 --- a/packages/chat/src/hooks/useDidUpdateEffect.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { useEffect, useRef } from 'react'; - -export const useDidUpdateEffect = (callback: () => void | VoidFunction, dependencies: unknown[] = []): void => { - const didMount = useRef(false); - - useEffect(() => { - if (didMount.current) { - return callback(); - } - - didMount.current = true; - - return undefined; - }, dependencies); -}; diff --git a/packages/chat/src/hooks/usePalette.ts b/packages/chat/src/hooks/usePalette.ts deleted file mode 100644 index 00073df9f7..0000000000 --- a/packages/chat/src/hooks/usePalette.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { useEffect, useState } from 'react'; - -import type { Palette } from '@/dtos/Palette.dto'; -import type { ChatWidgetSettings } from '@/types'; - -export const usePalette = (assistant?: ChatWidgetSettings) => { - const [palette, setPalette] = useState(); - useEffect(() => { - if (assistant?.common.primaryColor?.palette) { - setPalette(assistant.common.primaryColor.palette); - } - }, [assistant?.common.primaryColor]); - - return palette; -}; diff --git a/packages/chat/src/hooks/useStateRef.ts b/packages/chat/src/hooks/useStateRef.ts deleted file mode 100644 index bd1243b92b..0000000000 --- a/packages/chat/src/hooks/useStateRef.ts +++ /dev/null @@ -1,27 +0,0 @@ -import type { Dispatch, SetStateAction } from 'react'; -import { useCallback, useRef, useState } from 'react'; - -const isFunction = (setStateAction: SetStateAction): setStateAction is (prevState: S) => S => - typeof setStateAction === 'function'; - -interface ReadOnlyRefObject { - readonly current: T; -} - -interface UseStateRef { - (initialState: S | (() => S)): [S, Dispatch>, ReadOnlyRefObject]; - (): [S | undefined, Dispatch>, ReadOnlyRefObject]; -} - -export const useStateRef: UseStateRef = (initialState?: S | (() => S)) => { - const [state, setState] = useState(initialState); - const ref = useRef(state); - - const dispatch: typeof setState = useCallback((setStateAction: any) => { - ref.current = isFunction(setStateAction) ? setStateAction(ref.current) : setStateAction; - - setState(ref.current); - }, []); - - return [state, dispatch, ref]; -}; diff --git a/packages/chat/src/hooks/useStorage.ts b/packages/chat/src/hooks/useStorage.ts deleted file mode 100644 index 35ccf5603a..0000000000 --- a/packages/chat/src/hooks/useStorage.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { useCallback, useMemo, useRef, useState } from 'react'; - -interface Storage { - getItem: (key: string) => string | null; - setItem: (key: string, value: string) => void; - removeItem: (key: string) => void; -} - -const createUseStorageHook = - (storage: S) => - (name: string, defaultValue: T) => - useMemo(() => { - const storageName = `voiceflow-chat-widget:${name}`; - - return { - get: (): T => { - try { - const item = storage.getItem(storageName); - - return item === null ? defaultValue : JSON.parse(item); - } catch { - return defaultValue; - } - }, - - set: (value: T) => storage.setItem(storageName, JSON.stringify(value)), - - clear: () => storage.removeItem(storageName), - }; - }, []); - -const createUseStorageStateHook = (storage: S) => { - const useStorage = createUseStorageHook(storage); - - return (name: string, initialState: T) => { - const storage = useStorage(name, initialState); - const [value, setValue] = useState(storage.get); - const ref = useRef(value); - - const setStorageValue = useCallback>>((value) => { - setValue((prevState) => { - let nextValue: T; - - if (typeof value === 'function') { - nextValue = (value as (prevState: T) => T)(prevState); - } else { - nextValue = value; - } - - storage.set(nextValue); - ref.current = nextValue; - - return nextValue; - }); - }, []); - - return [value, setStorageValue, ref] as const; - }; -}; - -export const useLocalStorage = createUseStorageHook(globalThis.localStorage); -export const useSessionStorage = createUseStorageHook(globalThis.localStorage); - -export const useLocalStorageState = createUseStorageStateHook(globalThis.localStorage); -export const useSessionStorageState = createUseStorageStateHook(globalThis.sessionStorage); diff --git a/packages/chat/src/main.ts b/packages/chat/src/main.ts deleted file mode 100644 index 11eb274cb9..0000000000 --- a/packages/chat/src/main.ts +++ /dev/null @@ -1,15 +0,0 @@ -export * from './components'; -export * from './contexts'; -export type { RuntimeState } from './contexts/RuntimeContext/useRuntimeState'; -export * from './dtos/AssistantOptions.dto'; -export * from './dtos/ChatConfig.dto'; -export * from './dtos/Extension.dto'; -export * from './dtos/RenderOptions.dto'; -export * from './hooks'; -export * from './types/session'; -export * from './types/settings'; -export * from './types/trace'; -export * from './types/turn'; -export * from './utils/functional'; -export * from './views'; -export type { VoiceAPI } from './views/VoiceWidget/VoiceWidget.interface'; diff --git a/packages/chat/src/stories.ts b/packages/chat/src/stories.ts deleted file mode 100644 index 20aefff05d..0000000000 --- a/packages/chat/src/stories.ts +++ /dev/null @@ -1,18 +0,0 @@ -export * as AgentMessage from './components/AgentMessage/AgentMessage.story'; -export * as Avatar from './components/Avatar/Avatar.story'; -export * as Button from './components/Button/Button.story'; -export * as Card from './components/Card/Card.story'; -export * as Carousel from './components/Carousel/Carousel.story'; -export * as CarouselButton from './components/Carousel/CarouselButton.story'; -export * as ColorTheme from './components/ColorTheme/ColorTheme.story'; -export * as FeedbackButton from './components/FeedbackButton/FeedbackButton.story'; -export * as Header from './components/Header/Header.story'; -export * as Launcher from './components/Launcher/Launcher.story'; -export * as LinkPreview from './components/LinkPreview/LinkPreview.story'; -export * as MessageInput from './components/MessageInput/MessageInput.story'; -export * as NewChat from './components/NewChat/NewChat.story'; -export * as Prompt from './components/Prompt/Prompt.story'; -export * as SendButton from './components/SendButton/SendButton.story'; -export * as TypingIndicator from './components/TypingIndicator/TypingIndicator.story'; -export * as VoiceWidget from './components/VoiceWidget/VoiceWidget.story'; -export * as WelcomeMessage from './components/WelcomeMessage/WelcomeMessage.story'; diff --git a/packages/chat/src/storybook/decorators.tsx b/packages/chat/src/storybook/decorators.tsx deleted file mode 100644 index 4357ad2239..0000000000 --- a/packages/chat/src/storybook/decorators.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { assignInlineVars } from '@vanilla-extract/dynamic'; - -import { DEFAULT_WIDGET_SETTINGS } from '@/__fixtures__/mock-assistant'; -import { RuntimeProvider } from '@/contexts'; -import { RenderMode } from '@/dtos/RenderOptions.dto'; -import { createPalette } from '@/styles/colors'; -import { THEME } from '@/styles/colors.css'; - -export const WithDefaultPalette = (Story: any, { args }: { args: any }) => { - return ( -
    - -
    - ); -}; - -export const WithRuntimeProvider = (Story: any) => ( - - {Story()} - -); diff --git a/packages/chat/src/styles.css b/packages/chat/src/styles.css deleted file mode 100644 index 2c052ecd53..0000000000 --- a/packages/chat/src/styles.css +++ /dev/null @@ -1,345 +0,0 @@ -/* use this file to override default styles when forking this repository */ - -/* - PAGE CONTENTS - - Customize the page that the chat bubble lives on -*/ - -/* .voiceflow-chat {} */ - -/* .vfrc-launcher {} */ - -/* .vfrc-chat--overlay {} */ - -/* .vfrc-prompt {} */ - -/* - CHAT WIDGET HEADER - - Customize the content, controls and styling included in your chat widget header, including the Assistant Information. - Note that changes to the assistant information here will be shared across other elements that consume this styling. -*/ - -/* .vfrc-header {} */ - -/* .vfrc-assistant-info {} */ - -/* .vfrc-assistant-info--title {} */ - -/* .vfrc-assistant-info--description {} */ - -/* .vfrc-avatar {} */ - -/* .vfrc-icon {} */ - -/* - CHAT MESSAGE BODY - - Customize the layout and display of the chat body, and the conversation's metadata -*/ - -/* .vfrc-chat {} */ - -/* .vfrc-chat--dialog {} */ - -/* .vfrc-chat--spacer {} */ - -/* .vfrc-chat--session-time {} */ - -/* .vfrc-chat--status {} */ - -/* .vfrc-message {} */ - -/* .vfrc-timestamp {} */ - -/* - ASSISTANT RESPONSES - - Customize the style and layout of assistant response messages. -*/ - -/* .vfrc-system-response--indicator {} */ - -/* .vfrc-system-response {} */ - -/* .vfrc-system-response--controls {} */ - -/* .vfrc-system-response--list {} */ - -/* .vfrc-system-response--actions {} */ - -/* .vfrc-button {} */ - -/* .vfrc-image {} */ - -/* .vfrc-image--background {} */ - -/* .vfrc-card--content {} */ - -/* .vfrc-card--header {} */ - -/* .vfrc-card--description {} */ - -/* .vfrc-carousel {} */ - -/* .vfrc-carousel--button {} */ - -/* Targeted styling for just the Assistant messages. */ -/* .vfrc-system-response .vfrc-message {} */ - -/* Targeted styling for just the Assistant buttons. */ -/* .vfrc-system-response .vfrc-button {} */ - -/* - USER RESPONSES - - Customize the style and layout of users response messages. -*/ - -/* .vfrc-user-response {} */ - -/* Targeted styling for just the User messages */ -/* .vfrc-user-response .vfrc-message {} */ - -/* - FOOTER - - Customize the layout and appearance of the message input field and the VF Branding -*/ - -/* .vf-footer {} */ - -/* .vfrc-input {} */ - -/* .vfrc-chat-input--button {} */ - -/* .vfrc-footer--watermark {} */ -/* use this file to override default styles when forking this repository */ - -/* - PAGE CONTENTS - - Customize the page that the chat bubble lives on -*/ - -/* .voiceflow-chat {} */ - -/* .vfrc-launcher {} */ - -/* .vfrc-chat--overlay {} */ - -/* .vfrc-prompt {} */ - -/* - CHAT WIDGET HEADER - - Customize the content, controls and styling included in your chat widget header, including the Assistant Information. - Note that changes to the assistant information here will be shared across other elements that consume this styling. -*/ - -/* .vfrc-header {} */ - -/* .vfrc-assistant-info {} */ - -/* .vfrc-assistant-info--title {} */ - -/* .vfrc-assistant-info--description {} */ - -/* .vfrc-avatar {} */ - -/* .vfrc-icon {} */ - -/* - CHAT MESSAGE BODY - - Customize the layout and display of the chat body, and the conversation's metadata -*/ - -/* .vfrc-chat {} */ - -/* .vfrc-chat--dialog {} */ - -/* .vfrc-chat--spacer {} */ - -/* .vfrc-chat--session-time {} */ - -/* .vfrc-chat--status {} */ - -/* .vfrc-message {} */ - -/* .vfrc-timestamp {} */ - -/* - ASSISTANT RESPONSES - - Customize the style and layout of assistant response messages. -*/ - -/* .vfrc-system-response--indicator {} */ - -/* .vfrc-system-response {} */ - -/* .vfrc-system-response--controls {} */ - -/* .vfrc-system-response--list {} */ - -/* .vfrc-system-response--actions {} */ - -/* .vfrc-button {} */ - -/* .vfrc-image {} */ - -/* .vfrc-image--background {} */ - -/* .vfrc-card--content {} */ - -/* .vfrc-card--header {} */ - -/* .vfrc-card--description {} */ - -/* .vfrc-carousel {} */ - -/* .vfrc-carousel--button {} */ - -/* Targeted styling for just the Assistant messages. */ -/* .vfrc-system-response .vfrc-message {} */ - -/* Targeted styling for just the Assistant buttons. */ -/* .vfrc-system-response .vfrc-button {} */ - -/* - USER RESPONSES - - Customize the style and layout of users response messages. -*/ - -/* .vfrc-user-response {} */ - -/* Targeted styling for just the User messages */ -/* .vfrc-user-response .vfrc-message {} */ - -/* - FOOTER - - Customize the layout and appearance of the message input field and the VF Branding -*/ - -/* .vf-footer {} */ - -/* .vfrc-input {} */ - -/* .vfrc-chat-input--button {} */ - -/* .vfrc-footer--watermark {} */ -/* Heading styles */ -.markdown h1, -.markdown h2, -.markdown h3, -.markdown h4, -.markdown h5, -.markdown h6 { - margin-bottom: 8px; - margin-top: 8px; - font-size: 16px; - font-weight: 700; -} - -.markdown h2, -.markdown h3, -.markdown h4, -.markdown h5, -.markdown h6 { - font-size: 14px; -} - -/* Horizontal rule style */ -.markdown hr { - margin-top: 8px; - margin-bottom: 8px; -} - -/* Ordered list styles */ -.markdown ol { - display: block; - list-style-type: decimal; - margin-block-start: 0px; - margin-block-end: 0px; - margin-inline-start: 0px; - margin-inline-end: 0px; - padding-inline-start: 20px; - unicode-bidi: isolate; -} - -/* Unordered list styles */ -.markdown ul { - list-style-type: disc; - padding-inline-start: 27px; - margin-block-start: 0px; - margin-block-end: 0px; - margin-inline-start: 0px; - margin-inline-end: 0px; - unicode-bidi: isolate; - position: relative; -} - -/* Custom list marker styles */ -.markdown ul li::marker { - content: ''; -} - -.markdown ul li::before { - content: ''; - height: 4px; - width: 4px; - background-color: #1a1e23; /* colors.neutralDark.neutralsDark900 */ - border-radius: 50%; - position: absolute; - transform: translate(-14px, 7px); -} - -/* Task list item */ -.markdown .task-list-item { - display: flex; - align-items: flex-start; -} - -/* Checkbox styling */ -.markdown input[type='checkbox'] { - transform: translateY(3px); - margin-right: 8px; -} - -/* List item styles */ -.markdown li { - margin: 8px 0; - position: relative; -} - -.markdown ol { - margin-left: 8px; -} - -/* Paragraphs within list items */ -.markdown li p { - line-height: 1.5; -} - -/* Anchor link styles */ -.markdown a { - transition: - color 0.3s ease, - text-decoration-color 0.3s ease; - color: #397dff; - text-decoration: underline; - text-decoration-color: transparent; -} - -.markdown a:hover { - text-decoration-color: #397dff; -} - -.markdown a:active { - color: #2f68db; /* colors.accent.accent600 */ - text-decoration-color: transparent; -} diff --git a/packages/chat/src/styles/animation-utils.css.ts b/packages/chat/src/styles/animation-utils.css.ts deleted file mode 100644 index 0d0a7a5372..0000000000 --- a/packages/chat/src/styles/animation-utils.css.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { keyframes, style } from '@vanilla-extract/css'; - -import { duration } from './animations'; - -const fadeIn = keyframes({ - '0%': { opacity: 0, transform: 'translateY(20px)' }, - '100%': { opacity: 1, transform: 'translateY(0)' }, -}); - -export const fadeInAndUp = style({ - opacity: 0, - animation: `${fadeIn} ${duration.slow} ease-out forwards`, -}); diff --git a/packages/chat/src/styles/animations.ts b/packages/chat/src/styles/animations.ts deleted file mode 100644 index 4817788770..0000000000 --- a/packages/chat/src/styles/animations.ts +++ /dev/null @@ -1,40 +0,0 @@ -export const duration = { - slow: '0.5s', - mid: '0.3s', - default: '0.15s', - fast: '0.08s', - fastest: '0.05s', -}; - -export const timingFunction = { - default: 'ease', - easeOut: 'ease-out', - easeIn: 'ease-in', - linear: 'linear', - gentle: 'cubic-bezier(0.25, 1, 0.5, 1)', -}; - -export const delay = { - initial: 0.04, - increment: 0.03, -}; - -export const componentAnimations = { - widgetAppearance: { - transform: '0.3s', - opacity: duration.default, - }, - endChat: { - transform: '0.25s', - opacity: duration.fast, - boxShadow: duration.slow, - }, - welcomeMessage: { - duration: '0.6s', - delays: { - avatar: '0.25s', - title: '0.35s', - description: '0.45s', - }, - }, -}; diff --git a/packages/chat/src/styles/box-shadows.ts b/packages/chat/src/styles/box-shadows.ts deleted file mode 100644 index 59ef3adf8f..0000000000 --- a/packages/chat/src/styles/box-shadows.ts +++ /dev/null @@ -1,18 +0,0 @@ -const Z1_Light = - '0px 1px 0px 0px rgba(22, 26, 30, 0.02), 0px 0px 0px 1px rgba(22, 26, 30, 0.04), 0px 1px 5px -4px rgba(22, 26, 30, 0.08), 0px 4px 8px -6px rgba(22, 26, 30, 0.08), 0px 1px 3px 1px rgba(22, 26, 30, 0.01)'; - -const Z64_Light = - '0px 0px 0px 1px rgba(22, 26, 30, 0.06), 0px 48px 88px -40px rgba(22, 26, 30, 0.16), 0px 36px 56px -40px rgba(22, 26, 30, 0.12), 0px 24px 40px -40px rgba(22, 26, 30, 0.08), 0px 20px 32px -40px rgba(22, 26, 30, 0.06), 0px 16px 28px -40px rgba(22, 26, 30, 0.06), 0px 12px 20px -40px rgba(22, 26, 30, 0.04), 0px 1px 2px 0px rgba(22, 26, 30, 0.03)'; - -const Z16_Light = - '0px 0px 0px 1px rgba(22, 26, 30, 0.06), 0px 1px 1px 0px rgba(22, 26, 30, 0.01), 0px 4px 8px -18px rgba(22, 26, 30, 0.04), 0px 8px 12px -18px rgba(22, 26, 30, 0.04), 0px 10px 16px -18px rgba(22, 26, 30, 0.08), 0px 12px 20px -18px rgba(22, 26, 30, 0.08), 0px 16px 28px -18px rgba(22, 26, 30, 0.12), 0px 20px 44px -18px rgba(22, 26, 30, 0.12)'; - -const Z32_Light = - '0px 0px 0px 1px rgba(22, 26, 30, 0.06), 0px 1px 1px 0px rgba(22, 26, 30, 0.04), 0px 4px 8px -32px rgba(22, 26, 30, 0.04), 0px 10px 16px -32px rgba(22, 26, 30, 0.06), 0px 16px 20px -32px rgba(22, 26, 30, 0.08), 0px 24px 32px -32px rgba(22, 26, 30, 0.08), 0px 32px 40px -32px rgba(22, 26, 30, 0.10), 0px 40px 64px -32px rgba(22, 26, 30, 0.12)'; - -export const SHADOWS = { - Z1_Light, - Z16_Light, - Z32_Light, - Z64_Light, -}; diff --git a/packages/chat/src/styles/colors.css.ts b/packages/chat/src/styles/colors.css.ts deleted file mode 100644 index 203f385b2d..0000000000 --- a/packages/chat/src/styles/colors.css.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { createThemeContract } from '@vanilla-extract/css'; - -import { createPalette } from './colors'; -import { FAMILY } from './font'; - -export const THEME = createThemeContract({ - colors: createPalette(), - fontFamily: FAMILY, -}); diff --git a/packages/chat/src/styles/colors.ts b/packages/chat/src/styles/colors.ts deleted file mode 100644 index 751681baf2..0000000000 --- a/packages/chat/src/styles/colors.ts +++ /dev/null @@ -1,205 +0,0 @@ -import chroma from 'chroma-js'; - -export const DEFAULT_PRIMARY = '#387dff'; - -export const createPalette = (baseColor: string = DEFAULT_PRIMARY) => { - const [h, s] = chroma(baseColor).hsl(); - - const shades = []; - - for (let i = 10; i >= 0; i--) { - const newL = 10 * i === 100 ? 95 : 10 * i || 5; - shades.push(chroma.hsl(h, s, newL / 100).hex()); - } - - return { - 50: shades[0], - 100: shades[1], - 200: shades[2], - 300: shades[3], - 400: shades[4], - 500: baseColor, - 600: shades[6], - 700: shades[7], - 800: shades[8], - 900: shades[9], - }; -}; - -const NEUTRAL_DARK = { - 50: '#30373F', - 100: '#656D75', - 300: '#3E4852', - 400: '#38414A', - 500: '#30373F', - 200: '#515A63', - 600: '#2B3239', - 700: '#252B31', - 800: '#1F2429', - 900: '#1A1E23', - 9006: '#191D220F', - 9008: '#191d2214', - 90012: '#1A1E231F', - 90016: '#1A1E2329', - 90020: '#1A1E2333', -}; - -const FERN = { - 50: '#E0F0E3', - 100: '#CFE9D4', - 200: '#B2DCB9', - 300: '#9CD2A5', - 400: '#70BF7D', - 500: '#56B365', - 600: '#4A9B57', - 700: '#387642', - 800: '#27542E', - 900: '#17341C', - // with opacity - 900_80: '#17341CCC', - 900_12: '#17341C1F', - 900_8: '#17341C14', -}; - -const COPPER = { - 50: '#F8EBE8', - 100: '#F5E0DC', - 200: '#F0CDC7', - 300: '#ECBFB7', - 400: '#E4A398', - 500: '#DC8879', - 600: '#BE7466', - 700: '#92564B', - 800: '#683A31', - 900: '#431F19', - // with opacity - 900_80: '#431F19CC', - 900_12: '#431F191F', - 900_8: '#431F1914', -}; - -const CYCLAMEN = { - 50: '#FCE5F0', - 100: '#FBDAEA', - 200: '#FAC7DF', - 300: '#F8ACD0', - 400: '#F587BB', - 500: '#F263A7', - 600: '#D6528A', - 700: '#B63A65', - 800: '#922240', - 900: '#630B19', - // with opacity - 900_80: '#630B19CC', - 900_12: '#630B191F', - 900_8: '#630B1914', -}; - -const HAVELOCK = { - 50: '#E3EFF8', - 100: '#D3E5F4', - 200: '#C3DCF0', - 300: '#A8CCE9', - 400: '#81B5E0', - 500: '#5B9FD7', - 600: '#4E8BBD', - 700: '#3A6B93', - 800: '#284D6C', - 900: '#152F45', - // with opacity - 900_80: '#152F45CC', - 900_12: '#152F451F', - 900_8: '#152F4514', -}; - -const HIBISCUS = { - 50: '#FEE7EC', - 100: '#FCD4DE', - 200: '#F8B9C8', - 300: '#F39BB0', - 400: '#E08097', - 500: '#CB627B', - 600: '#BD425F', - 700: '#9F324C', - 800: '#7B2338', - 900: '#561524', - // with opacity - 900_80: '#561524CC', - 900_12: '#5615241F', - 900_8: '#56152414', -}; - -const NEUTRAL_LIGHT = { - 50: '#F1F2F2', - 100: '#E2E4E5', - 200: '#D4D7D7', - 300: '#C5C9CA', - 400: '#B7BCBD', - 500: '#A8AFB0', - 600: '#9AA1A3', - 700: '#8B9495', - 800: '#7D8688', - 900: '#6E797B', -}; - -const ACCENT = { - 50: '#E7F5FD', - 100: '#C6E4FB', - 200: '#A2D2FA', - 300: '#87BFFB', - 400: '#659FFD', - 500: '#397DFF', - 600: '#2F68DB', - 700: '#264EB4', - 800: '#1C368E', - 900: '#0F1E61', -}; - -const ALERT = { - 50: '#FCEBEF', - 100: '#FAE0E5', - 200: '#F7CED7', - 300: '#F1ABB9', - 400: '#EC889C', - 500: '#E6657F', - 600: '#DD4160', - 700: '#C62445', - 800: '#A01C37', - 900: '#741528', -}; - -const SUCCESS = { - 50: '#E7F6E2', - 100: '#CAE9BE', - 200: '#A8DB94', - 300: '#8ACD6F', - 400: '#68BE46', - 500: '#50A82E', - 600: '#449127', - 700: '#38751F', - 800: '#285417', - 900: '#1A390F', -}; - -const SHADES = { - 50: '#F2F7F7', - 100: '#EEF3F3', - 200: '#E8ECEC', - 300: '#E2E6E6', - 400: '#DBDEDE', -}; - -export const COLORS = { - white: '#fff', - NEUTRAL_DARK, - FERN, - COPPER, - CYCLAMEN, - HAVELOCK, - HIBISCUS, - NEUTRAL_LIGHT, - ACCENT, - ALERT, - SUCCESS, - SHADES, -}; diff --git a/packages/chat/src/styles/font.ts b/packages/chat/src/styles/font.ts deleted file mode 100644 index df7521b58f..0000000000 --- a/packages/chat/src/styles/font.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { ComplexStyleRule } from '@vanilla-extract/css'; - -export const FAMILY = "'UCityProWeb', 'Open Sans', 'Arial', 'sans-serif'"; - -export const hideTextOverflow = () => ({ - overflow: 'hidden', - textOverflow: 'ellipsis', - whiteSpace: 'nowrap', -}); - -export const lineClamp = (lines: number) => - ({ - WebkitLineClamp: lines, - WebkitBoxOrient: 'vertical', - display: '-webkit-box', - overflow: 'hidden', - textOverflow: 'ellipsis', - }) as ComplexStyleRule; diff --git a/packages/chat/src/styles/shadow.ts b/packages/chat/src/styles/shadow.ts deleted file mode 100644 index 4ab2370fed..0000000000 --- a/packages/chat/src/styles/shadow.ts +++ /dev/null @@ -1,8 +0,0 @@ -// create shadow dom -export const VOICEFLOW_ID = 'voiceflow-chat'; - -const rootEl = document.createElement('div'); -rootEl.id = VOICEFLOW_ID; - -document.body.appendChild(rootEl); -export const shadowRoot = rootEl.attachShadow({ mode: 'open' }); diff --git a/packages/chat/src/styles/sizes.ts b/packages/chat/src/styles/sizes.ts deleted file mode 100644 index e63ba7ca20..0000000000 --- a/packages/chat/src/styles/sizes.ts +++ /dev/null @@ -1,18 +0,0 @@ -export const SIZES = { - sm: '32px', - m: '40px', - xxl: '72px', - - radius: { - xxxs: '4px', - xxs: '6px', - xs: '8px', - sm: '10px', - lg: '16px', - round: '50%', - }, -}; - -export const BREAKPOINTS = { - mobile: '768px', -}; diff --git a/packages/chat/src/styles/transitions.ts b/packages/chat/src/styles/transitions.ts deleted file mode 100644 index a31b9c2171..0000000000 --- a/packages/chat/src/styles/transitions.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { duration, timingFunction } from './animations'; - -export interface TransitionOptions { - duration: string; - timingFunction: string; -} - -export const createTransition = - ({ duration: defaultDuration, timingFunction: defaultTimingFunction }: TransitionOptions) => - ( - properties: ReadonlyArray, - { duration = defaultDuration, timingFunction = defaultTimingFunction }: Partial = {} - ) => - properties.map((prop) => `${prop} ${duration} ${timingFunction}`).join(', '); - -export const transition = createTransition({ - duration: duration.default, - timingFunction: timingFunction.default, -}); diff --git a/packages/chat/src/types/index.ts b/packages/chat/src/types/index.ts deleted file mode 100644 index 26e6175b15..0000000000 --- a/packages/chat/src/types/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { $$StyledComponentProps } from '@voiceflow/stitches-react/types/styled-component'; -export * from './session'; -export * from './settings'; -export * from './trace'; -export * from './turn'; -export * from './util'; -export * from './variants'; -export { ChatPersistence, ChatPosition } from '@voiceflow/voiceflow-types/build/cjs/version/chat'; - -export type Nullish = T | null | undefined; - -export type VariantProp< - Component extends { [key: symbol | string]: any }, - Key extends keyof Component[$$StyledComponentProps], -> = Component[$$StyledComponentProps][Key]; diff --git a/packages/chat/src/types/session.ts b/packages/chat/src/types/session.ts deleted file mode 100644 index 4e79f980a8..0000000000 --- a/packages/chat/src/types/session.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { BaseRequest } from '@voiceflow/dtos-interact'; -import type { RuntimeAction } from '@voiceflow/sdk-runtime'; -import { ChatPersistence, ChatPosition } from '@voiceflow/voiceflow-types/build/cjs/version/chat'; - -import type { TurnProps } from './turn'; - -export { ChatPersistence, ChatPosition }; -export type { RuntimeAction }; - -export type SendMessage = (action: BaseRequest, message?: string) => Promise; - -export enum SessionStatus { - IDLE = 'IDLE', - ACTIVE = 'ACTIVE', - ENDED = 'ENDED', -} - -export interface SessionOptions { - userID: string; - turns?: TurnProps[]; - startTime?: number; - status?: SessionStatus; -} diff --git a/packages/chat/src/types/settings.ts b/packages/chat/src/types/settings.ts deleted file mode 100644 index 53425c9137..0000000000 --- a/packages/chat/src/types/settings.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { - WidgetSettings, - WidgetSettingsChatSettingsDTO, - WidgetSettingsCommonSettingsDTO, - WidgetSettingsDTO, - WidgetSettingsVoiceSettingsDTO, -} from '@voiceflow/dtos-interact'; -import type { z } from 'zod'; - -import type { AnyExtension } from '@/main'; - -export type RawWidgetSettings = z.input; -export type RawWidgetSettingsChatSettings = z.input; -export type RawWidgetSettingsVoiceSettings = z.input; -export type RawWidgetSettingsCommonSettings = z.input; - -export interface WidgetLocalSettings { - stylesheet: string; - extensions: AnyExtension[]; -} - -export interface ChatWidgetSettings extends WidgetSettings, WidgetLocalSettings {} diff --git a/packages/chat/src/types/trace.ts b/packages/chat/src/types/trace.ts deleted file mode 100644 index 733e630b5c..0000000000 --- a/packages/chat/src/types/trace.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { Trace } from '@voiceflow/base-types'; -import type { TraceDeclaration } from '@voiceflow/sdk-runtime'; - -import type { RuntimeMessage } from '../contexts/RuntimeContext/messages'; - -export type TraceHandler = TraceDeclaration; diff --git a/packages/chat/src/types/turn.ts b/packages/chat/src/types/turn.ts deleted file mode 100644 index 8e1ff154c8..0000000000 --- a/packages/chat/src/types/turn.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { SystemResponseProps } from '@/components/SystemResponse'; -import type { UserResponseProps } from '@/components/UserResponse'; - -export enum TurnType { - USER = 'user', - SYSTEM = 'system', -} - -export interface UserTurnProps extends UserResponseProps { - id: string; - type: TurnType.USER; -} - -export interface SystemTurnProps extends Omit { - id: string; - type: TurnType.SYSTEM; - timestamp: number; -} - -export type TurnProps = UserTurnProps | SystemTurnProps; diff --git a/packages/chat/src/types/util.ts b/packages/chat/src/types/util.ts deleted file mode 100644 index fa2a98dcf5..0000000000 --- a/packages/chat/src/types/util.ts +++ /dev/null @@ -1 +0,0 @@ -export type StringifiedEnum = T | `${T}`; diff --git a/packages/chat/src/types/variants.ts b/packages/chat/src/types/variants.ts deleted file mode 100644 index 2650561685..0000000000 --- a/packages/chat/src/types/variants.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { ComplexStyleRule } from '@vanilla-extract/css'; -import type { RecipeVariants, RuntimeFn } from '@vanilla-extract/recipes'; -import type { Simplify } from 'type-fest'; - -export type VariantStyleRules = Record>; - -export type VariantProps> = Exclude< - Simplify>, - undefined | null ->; diff --git a/packages/chat/src/utils/actions.ts b/packages/chat/src/utils/actions.ts deleted file mode 100644 index 97ce6274b2..0000000000 --- a/packages/chat/src/utils/actions.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { BaseRequest } from '@voiceflow/base-types'; -import type { RuntimeAction } from '@voiceflow/sdk-runtime'; - -import { openURLInANewTab } from '@/utils/url'; - -const hasActions = (action: RuntimeAction): action is BaseRequest.ActionRequest => - !!action.payload && - typeof action.payload === 'object' && - Array.isArray((action.payload as Record).actions); - -export const handleActions = (action: RuntimeAction) => { - if (hasActions(action)) { - action.payload?.actions?.forEach((action) => { - if (BaseRequest.Action.isOpenURLAction(action) && action.payload.url) { - openURLInANewTab(action.payload.url); - } - }); - } -}; diff --git a/packages/chat/src/utils/assistant.test.ts b/packages/chat/src/utils/assistant.test.ts deleted file mode 100644 index 3666b98e37..0000000000 --- a/packages/chat/src/utils/assistant.test.ts +++ /dev/null @@ -1,227 +0,0 @@ -import type { WidgetSettings } from '@voiceflow/dtos-interact'; -import { VoiceflowRuntime } from '@voiceflow/sdk-runtime'; -import { createMock } from '@voiceflow/test-common/vitest'; -import { ChatPersistence, ChatPosition } from '@voiceflow/voiceflow-types/build/cjs/version'; -import type { Mock } from 'vitest'; -import { describe, expect, it, vi } from 'vitest'; - -import type { ChatConfig } from '@/dtos/ChatConfig.dto'; -import { ExtensionType } from '@/dtos/Extension.dto'; -import type { WidgetOverrides } from '@/dtos/WidgetOverrides.dto'; -import { createPalette } from '@/styles/colors'; - -import { mergeAssistantOptions } from './assistant'; - -vi.mock('@voiceflow/sdk-runtime', () => ({ VoiceflowRuntime: vi.fn() })); - -describe('assistant utils', () => { - const mockGetPublishing = (): Mock< - Parameters['getPublishing']>, - ReturnType['getPublishing']> - > => { - const getPublishing = vi.fn().mockResolvedValue({}); - - vi.mocked(VoiceflowRuntime).mockImplementation(() => createMock>({ getPublishing })); - - return getPublishing; - }; - - describe('mergeAssistantOptions()', () => { - const config = {} as ChatConfig; - const remoteOptions: WidgetSettings = { - type: 'chat', - chat: { - voiceInput: true, - voiceOutput: true, - renderMode: 'widget', - headerImage: { - enabled: true, - url: 'remote_header_image', - }, - agentImage: { - enabled: true, - url: 'remote_agent_image', - }, - banner: { - title: 'remote title', - description: 'remote_description', - enabled: true, - imageURL: 'remote_banner_image', - }, - placeholderText: 'remote_placeholder_text', - aiDisclaimer: { - text: 'remote ai disclaimer', - enabled: true, - }, - handoffToAgentImageURL: undefined, - }, - voice: { - renderMode: 'full', - content: { - imageURL: 'remote_voice_image', - talkingText: 'remote_talking_text', - endButtonText: 'remote_end_button_text', - listeningText: 'remote_listening_text', - startButtonText: 'remote_start_button_text', - callToActionText: 'remote_call_to_action', - }, - }, - common: { - sideSpacing: '30px', - bottomSpacing: '30px', - position: 'right', - fontFamily: 'remote_font', - primaryColor: { - color: 'blue', - palette: createPalette('blue'), - }, - poweredBy: true, - launcher: { - type: 'icon', - text: undefined, - imageURL: 'remote_launcher_image', - }, - footerLink: { - enabled: true, - text: 'Remote Privacy', - url: 'remote_privacy_link', - }, - persistence: 'LOCAL_STORAGE', - }, - }; - - it('should use remote values pulled from publishing configuration', async () => { - mockGetPublishing().mockResolvedValue(remoteOptions); - - const merged = await mergeAssistantOptions(config, undefined); - - expect(merged).toEqual({ - ...remoteOptions, - extensions: [], - stylesheet: '', - }); - }); - - it('should prioritize local options over remote options', async () => { - const localOptions: WidgetOverrides = { - type: 'voice', - renderMode: 'popover', - header: { - hideImage: true, - }, - banner: { - title: 'overridden', - description: 'overridden description', - imageUrl: 'overridden image', - }, - inputPlaceholder: 'overridden placeholder', - enableVoiceInput: false, - enableVoiceOutput: false, - footer: { - hide: true, - }, - color: 'green', - palette: { - 50: '50', - 100: '100', - 200: '200', - 300: '300', - 400: '400', - 500: '500', - 600: '600', - 700: '700', - 800: '800', - 900: '900', - }, - fontFamily: 'Helvetica', - side: ChatPosition.LEFT, - spacing: { - side: '40px', - bottom: '50px', - }, - aiDisclaimer: { hide: false, text: 'new disclaimer' }, - persistence: ChatPersistence.MEMORY, - stylesheet: 'overridden_styles', - extensions: [{ type: ExtensionType.EFFECT, name: 'remote_extension', match: () => true }], - }; - mockGetPublishing().mockResolvedValue(remoteOptions); - - const merged = await mergeAssistantOptions(config, localOptions); - - expect(merged).toEqual({ - type: 'voice', - chat: { - voiceInput: false, - voiceOutput: false, - renderMode: 'popover', - headerImage: { - enabled: false, - url: 'remote_header_image', - }, - agentImage: { - enabled: true, - url: 'remote_agent_image', - }, - banner: { - title: 'overridden', - description: 'overridden description', - enabled: true, - imageURL: 'overridden image', - }, - placeholderText: 'overridden placeholder', - aiDisclaimer: { - text: 'new disclaimer', - enabled: true, - }, - handoffToAgentImageURL: undefined, - }, - voice: { - renderMode: 'full', - content: { - imageURL: 'remote_voice_image', - talkingText: 'remote_talking_text', - endButtonText: 'remote_end_button_text', - listeningText: 'remote_listening_text', - startButtonText: 'remote_start_button_text', - callToActionText: 'remote_call_to_action', - }, - }, - common: { - sideSpacing: '40px', - bottomSpacing: '50px', - position: 'left', - fontFamily: 'Helvetica', - primaryColor: { - color: 'green', - palette: { - 50: '50', - 100: '100', - 200: '200', - 300: '300', - 400: '400', - 500: '500', - 600: '600', - 700: '700', - 800: '800', - 900: '900', - }, - }, - poweredBy: true, - launcher: { - type: 'icon', - text: undefined, - imageURL: 'remote_launcher_image', - }, - footerLink: { - enabled: false, - text: 'Remote Privacy', - url: 'remote_privacy_link', - }, - persistence: 'memory', - }, - stylesheet: 'overridden_styles', - extensions: [expect.objectContaining({ name: 'remote_extension', type: ExtensionType.EFFECT })], - }); - }); - }); -}); diff --git a/packages/chat/src/utils/assistant.ts b/packages/chat/src/utils/assistant.ts deleted file mode 100644 index 04a6abd724..0000000000 --- a/packages/chat/src/utils/assistant.ts +++ /dev/null @@ -1,117 +0,0 @@ -import type { WidgetSettings } from '@voiceflow/dtos-interact'; -import { WIDGET_SETTINGS_DEFAULT_SETTINGS, WidgetSettingsChatRenderMode } from '@voiceflow/dtos-interact'; -import { VoiceflowRuntime } from '@voiceflow/sdk-runtime'; -import { ChatPersistence } from '@voiceflow/voiceflow-types/build/cjs/version'; - -import type { ChatConfig } from '@/dtos/ChatConfig.dto'; -import type { WidgetOverrides } from '@/dtos/WidgetOverrides.dto'; -import { createPalette, DEFAULT_PRIMARY } from '@/styles/colors'; -import type { ChatWidgetSettings } from '@/types/settings'; - -export const mergeAssistantOptions = async ( - config: ChatConfig, // general chat configurations - overrides?: WidgetOverrides // user's snippet assistant configurations to override -): Promise => { - const { versionID } = config; - - // fetch remote publishing config - const runtime = new VoiceflowRuntime(config); - const publishing = await runtime - // chatVersion: 2 - will return the new WidgetSettings object - .getPublishing({ ...(versionID && { versionID }), chatVersion: 2 }) - .catch((error: any) => { - console.error(error); - return null; - }); - - if (!publishing) - return { - ...WIDGET_SETTINGS_DEFAULT_SETTINGS, - stylesheet: overrides?.stylesheet ?? '', - extensions: overrides?.extensions ?? [], - }; - - return { - type: overrides?.type ?? publishing?.type ?? 'chat', - chat: mergeChatSettings(publishing, overrides), - voice: mergeVoiceSettings(publishing, overrides), - common: mergeCommonSettings(publishing, overrides), - - stylesheet: overrides?.stylesheet ?? '', - extensions: overrides?.extensions ?? [], - }; -}; - -const mergeChatSettings = (publishedSettings: WidgetSettings, overrides?: WidgetOverrides) => { - return { - voiceInput: overrides?.enableVoiceInput ?? publishedSettings.chat.voiceInput ?? false, - voiceOutput: overrides?.enableVoiceOutput ?? publishedSettings.chat.voiceOutput ?? false, - - renderMode: overrides?.renderMode ?? publishedSettings?.chat?.renderMode ?? WidgetSettingsChatRenderMode.WIDGET, - headerImage: { - enabled: overrides?.header?.hideImage ? false : (publishedSettings?.chat?.headerImage?.enabled ?? true), - url: overrides?.header?.imageUrl ?? publishedSettings?.chat?.headerImage?.url, - }, - agentImage: { - enabled: overrides?.avatar?.hide ?? publishedSettings?.chat?.agentImage?.enabled ?? true, - url: overrides?.avatar?.imageUrl ?? publishedSettings?.chat?.agentImage?.url, - }, - banner: mergeBannerSettings(publishedSettings, overrides), - placeholderText: overrides?.inputPlaceholder ?? publishedSettings?.chat?.placeholderText ?? '', - aiDisclaimer: { - text: overrides?.aiDisclaimer?.text ?? publishedSettings?.chat?.aiDisclaimer?.text ?? '', - enabled: overrides?.aiDisclaimer?.hide ? false : (publishedSettings?.chat?.aiDisclaimer?.enabled ?? true), - }, - - // TODO: This isn't implemented yet in the chat - handoffToAgentImageURL: undefined, - }; -}; - -const mergeBannerSettings = (publishedSettings: WidgetSettings, overrides?: WidgetOverrides) => { - return { - title: overrides?.banner?.title ?? publishedSettings?.chat?.banner?.title ?? '', - description: overrides?.banner?.description ?? publishedSettings?.chat?.banner?.description ?? '', - enabled: overrides?.banner?.hide ? false : (publishedSettings?.chat?.banner?.enabled ?? true), - imageURL: overrides?.banner?.imageUrl ?? publishedSettings?.chat?.banner?.imageURL, - }; -}; - -const mergeVoiceSettings = (publishedSettings: WidgetSettings, _?: WidgetOverrides) => { - // TODO: These settings aren't implemented yet.. - return { - renderMode: publishedSettings?.voice?.renderMode ?? 'compact', - content: { - ...publishedSettings?.voice?.content, - }, - }; -}; - -const mergeCommonSettings = (publishedSettings: WidgetSettings, overrides?: WidgetOverrides) => { - const color = overrides?.color ?? publishedSettings?.common?.primaryColor?.color ?? DEFAULT_PRIMARY; - const palette = overrides?.palette ?? publishedSettings.common?.primaryColor?.palette ?? createPalette(color); - - return { - sideSpacing: overrides?.spacing?.side ?? publishedSettings?.common?.sideSpacing ?? '30px', - bottomSpacing: overrides?.spacing?.bottom ?? publishedSettings?.common?.bottomSpacing ?? '30px', - position: overrides?.side ?? publishedSettings?.common?.position ?? 'right', - fontFamily: overrides?.fontFamily ?? publishedSettings?.common?.fontFamily ?? '', - primaryColor: { color, palette }, - poweredBy: publishedSettings?.common?.poweredBy, // This can't be overriden by user! - launcher: mergeLauncherSettings(publishedSettings, overrides), - footerLink: { - enabled: overrides?.footer?.hide ? false : (publishedSettings?.common?.footerLink?.enabled ?? false), - text: overrides?.footer?.linkText ?? publishedSettings?.common?.footerLink?.text, - url: overrides?.footer?.linkUrl ?? publishedSettings?.common?.footerLink?.url, - }, - persistence: overrides?.persistence ?? publishedSettings?.common?.persistence ?? ChatPersistence.LOCAL_STORAGE, - }; -}; - -const mergeLauncherSettings = (publishedSettings: WidgetSettings, overrides?: WidgetOverrides) => { - return { - type: overrides?.launcher?.type ?? publishedSettings?.common?.launcher?.type ?? 'icon', - text: overrides?.launcher?.label ?? publishedSettings?.common?.launcher?.text, - imageURL: overrides?.launcher?.imageUrl ?? publishedSettings?.common?.launcher?.imageURL, - }; -}; diff --git a/packages/chat/src/utils/broadcast.ts b/packages/chat/src/utils/broadcast.ts deleted file mode 100644 index ff7eb0ec8b..0000000000 --- a/packages/chat/src/utils/broadcast.ts +++ /dev/null @@ -1,46 +0,0 @@ -import type { BaseRequest } from '@voiceflow/dtos-interact'; - -import type { SessionOptions } from '@/types'; - -export enum BroadcastType { - SAVE_SESSION = 'voiceflow:save_session', - - INTERACT = 'voiceflow:interact', - - OPEN = 'voiceflow:open', - CLOSE = 'voiceflow:close', -} - -export interface BroadcastMessage { - type: BroadcastType; - payload?: unknown; -} - -export interface SaveSession extends BroadcastMessage { - type: BroadcastType.SAVE_SESSION; - payload: SessionOptions; -} - -export interface Interact extends BroadcastMessage { - type: BroadcastType.INTERACT; - payload: { - session: SessionOptions; - action: BaseRequest; - }; -} - -export interface Open extends BroadcastMessage { - type: BroadcastType.OPEN; -} -export interface Close extends BroadcastMessage { - type: BroadcastType.CLOSE; -} - -export type AnyMessage = SaveSession | Interact | Open | Close; - -// send messages so that other scripts can listen to them -// https://docs.voiceflow.com/docs/web-chat-api#events -export const broadcast = (message: AnyMessage) => { - const encodedMessage = JSON.stringify(message); - window.postMessage(encodedMessage); -}; diff --git a/packages/chat/src/utils/chat.ts b/packages/chat/src/utils/chat.ts deleted file mode 100644 index ddd2a91344..0000000000 --- a/packages/chat/src/utils/chat.ts +++ /dev/null @@ -1,18 +0,0 @@ -export const createPlaceholderMethods = ( - createMessage: (method: string) => string -): Omit => { - const noopWarn = (method: string) => (): any => console.warn(createMessage(method)); - - return { - open: noopWarn('open'), - hide: noopWarn('hide'), - show: noopWarn('show'), - close: noopWarn('close'), - interact: noopWarn('interact'), - - proactive: { - clear: noopWarn('proactive.clear'), - push: noopWarn('proactive.push'), - }, - }; -}; diff --git a/packages/chat/src/utils/functional.ts b/packages/chat/src/utils/functional.ts deleted file mode 100644 index 0961ef68a7..0000000000 --- a/packages/chat/src/utils/functional.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const chain = - (...fns: Array<((...args: Args) => void) | undefined>) => - (...args: Args) => - fns.forEach((fn) => fn?.(...args)); - -// eslint-disable-next-line no-empty-function -export const noop = () => {}; diff --git a/packages/chat/src/utils/isObject.ts b/packages/chat/src/utils/isObject.ts deleted file mode 100644 index 3abbf80e91..0000000000 --- a/packages/chat/src/utils/isObject.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const isObject = (data: any): data is object => { - return !!data && !Array.isArray(data) && typeof data === 'object'; -}; diff --git a/packages/chat/src/utils/session.ts b/packages/chat/src/utils/session.ts deleted file mode 100644 index 67089b12d1..0000000000 --- a/packages/chat/src/utils/session.ts +++ /dev/null @@ -1,65 +0,0 @@ -import cuid from 'cuid'; - -import type { SessionOptions } from '@/types'; -import { ChatPersistence } from '@/types'; - -import { broadcast, BroadcastType } from './broadcast'; - -const VOICEFLOW_SESSION_KEY = 'voiceflow-session'; - -const getSessionKey = (projectID: string) => `${VOICEFLOW_SESSION_KEY}-${projectID}`; - -const getStorageSession = (storage: Storage, projectID: string): SessionOptions | null => { - try { - return JSON.parse(storage.getItem(getSessionKey(projectID))!); - } catch { - return null; - } -}; - -const setStorageSession = (storage: Storage, projectID: string, options: SessionOptions) => { - storage.setItem(getSessionKey(projectID), JSON.stringify(options)); - - return options; -}; - -// we can't use function default param `userID = cuid()`, cause it'll break sessions for anonymous users (when the userID is not provided by app) -export const resolveSession = (storage: Storage, projectID: string, userID?: string) => { - const session = getStorageSession(storage, projectID); - - if (!session || (userID && session.userID !== userID)) { - return setStorageSession(storage, projectID, { userID: userID || cuid() }); - } - - return session; -}; - -// we can't use function default param `userID = cuid()`, cause it'll break sessions for anonymous users (when the userID is not provided by app) -export const getSession = (persistence: ChatPersistence, projectID: string, userID?: string): SessionOptions => { - switch (persistence) { - case ChatPersistence.MEMORY: - return { userID: userID || cuid() }; - case ChatPersistence.LOCAL_STORAGE: - return resolveSession(localStorage, projectID, userID); - case ChatPersistence.SESSION_STORAGE: - default: - return resolveSession(sessionStorage, projectID, userID); - } -}; - -export const saveSession = (persistence: ChatPersistence, projectID: string, session: SessionOptions): void => { - broadcast({ type: BroadcastType.SAVE_SESSION, payload: session }); - - if (persistence === ChatPersistence.LOCAL_STORAGE) { - setStorageSession(localStorage, projectID, session); - } else if (persistence === ChatPersistence.SESSION_STORAGE) { - setStorageSession(sessionStorage, projectID, session); - } - - if (persistence !== ChatPersistence.LOCAL_STORAGE) { - localStorage.removeItem(getSessionKey(projectID)); - } - if (persistence !== ChatPersistence.SESSION_STORAGE) { - sessionStorage.removeItem(getSessionKey(projectID)); - } -}; diff --git a/packages/chat/src/utils/stylesheet.ts b/packages/chat/src/utils/stylesheet.ts deleted file mode 100644 index 0ee0c8783e..0000000000 --- a/packages/chat/src/utils/stylesheet.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { useEffect, useState } from 'react'; - -import type { ChatWidgetSettings } from '@/types/settings'; - -// used to add stylesheets dynamically, resolves when loaded -export const addStyleSheetURL = async (url: string, root: Node) => { - const link = document.createElement('link'); - const load = new Promise((resolve, reject) => { - link.onload = resolve; - link.onerror = reject; - }); - - link.rel = 'stylesheet'; - link.href = url; - root.appendChild(link); - - await load; -}; - -// do not load until stylesheet is resolved -export const useResolveAssistantStyleSheet = (assistant?: ChatWidgetSettings, shadowRoot?: ShadowRoot): boolean => { - const [isStyleSheetResolved, setStyleSheetResolved] = useState(false); - - useEffect(() => { - if (!assistant || isStyleSheetResolved) return; - - if (!assistant.stylesheet) { - setStyleSheetResolved(true); - return; - } - - const stylesheet = Array.isArray(assistant.stylesheet) ? assistant.stylesheet[0] : assistant.stylesheet; - - // inject stylesheet url - (async () => { - await addStyleSheetURL(stylesheet, shadowRoot ?? document.head).catch((error) => { - console.error(`failed to load stylesheet: ${assistant.stylesheet}`); - console.error(error); - }); - setStyleSheetResolved(true); - })(); - }, [assistant]); - - return isStyleSheetResolved; -}; diff --git a/packages/chat/src/utils/url.ts b/packages/chat/src/utils/url.ts deleted file mode 100644 index 1aa5093968..0000000000 --- a/packages/chat/src/utils/url.ts +++ /dev/null @@ -1,34 +0,0 @@ -export const LINK_ABOUT_ONLY_REGEX = /^about:[\w#%+.:=@~-]{2,256}\b([\w#%&+./:=?@~-]*)$/; -export const LINK_BITCOIN_ONLY_REGEX = /^bitcoin:[\dA-Za-z]{26,35}([\w#%&+./:=?@~-]*)$/; -export const LINK_CALLTO_ONLY_REGEX = /^callto:[+\d-\s()]+$/; -export const LINK_TEL_ONLY_REGEX = /^tel:[+\d-\s()]+$/; -export const LINK_SMS_ONLY_REGEX = /^sms:[+\d-\s()]+$/; -export const LINK_MAILTO_ONLY_REGEX = /^mailto:([^\s?]+)\b([\w#%&+./:=?@~-]*)$/; -export const LINK_IM_ONLY_REGEX = /^im:([^\s?]+)\b([\w#%&+./:=?@~-]*)$/; -export const LINK_FACETIME_ONLY_REGEX = /^facetime(-(audio|group))?:([^\s?]+|([+\d-()]+))$/; -export const LINK_SKYPE_ONLY_REGEX = /^skype:(\S+)\b$/; -export const LINK_WEBCALL_ONLY_REGEX = /^webcal:(\S+)\b$/; - -export const STRICT_LINKS_REGEXS = [ - LINK_ABOUT_ONLY_REGEX, - LINK_BITCOIN_ONLY_REGEX, - LINK_CALLTO_ONLY_REGEX, - LINK_TEL_ONLY_REGEX, - LINK_SMS_ONLY_REGEX, - LINK_MAILTO_ONLY_REGEX, - LINK_IM_ONLY_REGEX, - LINK_FACETIME_ONLY_REGEX, - LINK_SKYPE_ONLY_REGEX, - LINK_WEBCALL_ONLY_REGEX, -]; - -export const isAnyStrictLink = (str: string): boolean => !!STRICT_LINKS_REGEXS.some((regexp) => str.match(regexp)); - -export const getValidHref = (href: string): string => - href.startsWith('//') || href.includes('://') || isAnyStrictLink(href) ? href : `//${href}`; - -/** - * opens url in anew tab, noopener and noreferrer is set to true by default - */ -export const openURLInANewTab = (url: string, features = 'noopener=true,noreferrer=true'): void => - window.open(getValidHref(url), '_blank', features)?.focus(); diff --git a/packages/chat/src/views/ChatEmbed/index.tsx b/packages/chat/src/views/ChatEmbed/index.tsx deleted file mode 100644 index d02695800e..0000000000 --- a/packages/chat/src/views/ChatEmbed/index.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { useContext, useEffect } from 'react'; - -import { RuntimeStateAPIContext } from '@/contexts'; -import { useChatAPI } from '@/hooks/useChatAPI'; -import { useResolveAssistantStyleSheet } from '@/utils/stylesheet'; - -import { ChatWindow } from '../ChatWindow'; - -interface ChatEmbedProps extends React.PropsWithChildren { - shadowRoot: ShadowRoot; - chatAPI: VoiceflowChat | undefined; - ready?: () => void; -} - -export const ChatEmbed: React.FC = ({ shadowRoot, chatAPI, ready }) => { - const { assistant, interact, open } = useContext(RuntimeStateAPIContext); - - const isStyleSheetResolved = useResolveAssistantStyleSheet(assistant, shadowRoot); - - useChatAPI( - chatAPI, - () => { - console.info('Methods open, close, hide, show, proactive.clear, proactive.push have no effect in this mode.'); - - return { interact }; - }, - ready - ); - - useEffect(() => { - // "open" the embedded chat window to trigger launch - open(); - }, []); - - if (!isStyleSheetResolved) return null; - return ; -}; diff --git a/packages/chat/src/views/ChatWidget/ChatWidget.story.tsx b/packages/chat/src/views/ChatWidget/ChatWidget.story.tsx deleted file mode 100644 index e592509c34..0000000000 --- a/packages/chat/src/views/ChatWidget/ChatWidget.story.tsx +++ /dev/null @@ -1,110 +0,0 @@ -import type { Meta } from '@storybook/react'; - -import { RuntimeProvider } from '@/contexts'; -import { RenderMode } from '@/main'; -import { WithDefaultPalette } from '@/storybook/decorators'; - -import { ChatWidget } from './index'; - -const meta: Meta = { - title: 'Views/ChatWidget', - component: ChatWidget, - - decorators: [WithDefaultPalette], -}; - -export default meta; - -export const Base = { - args: { - config: { - type: 'voice', - chat: { - voiceInput: true, - voiceOutput: true, - renderMode: 'widget', - headerImage: { - enabled: true, - }, - agentImage: { - enabled: true, - }, - banner: { - enabled: true, - title: 'Your AI agent', - description: 'How can I help you today?', - }, - placeholderText: 'Message...', - aiDisclaimer: { - enabled: true, - text: 'Generated by AI, double-check for accuracy.', - }, - handoffToAgentImageURL: '', - }, - common: { - fontFamily: 'UCity Pro', - launcher: { - text: 'Your text', - type: 'both', - }, - poweredBy: true, - footerLink: { - enabled: true, - }, - position: 'right', - sideSpacing: '20', - bottomSpacing: '20', - primaryColor: { - color: '#397DFF', - palette: { - 50: '#E7F5FD', - 100: '#C6E4FB', - 200: '#A2D2FA', - 300: '#87BFFB', - 400: '#659FFD', - 500: '#397DFF', - 600: '#2F68DB', - 700: '#264EB4', - 800: '#1C368E', - 900: '#0F1E61', - }, - }, - persistence: 'localStorage', - }, - voice: { - renderMode: 'full', - content: { - callToActionText: 'How can I help you?', - startButtonText: 'Start a call', - listeningText: 'Listening', - talkingText: 'Talk to interrupt', - endButtonText: 'End', - }, - }, - }, - }, - render: (props: any) => ( - - - - ), -}; diff --git a/packages/chat/src/views/ChatWidget/index.tsx b/packages/chat/src/views/ChatWidget/index.tsx deleted file mode 100644 index d2bb9b2f4e..0000000000 --- a/packages/chat/src/views/ChatWidget/index.tsx +++ /dev/null @@ -1,173 +0,0 @@ -import { assignInlineVars } from '@vanilla-extract/dynamic'; -import type { Trace } from '@voiceflow/base-types'; -import { - WidgetSettingsChatRenderMode, - WidgetSettingsVoiceRenderMode, - WidgetSettingsWidgetType, -} from '@voiceflow/dtos-interact'; -import clsx from 'clsx'; -import { useContext, useEffect, useLayoutEffect, useState } from 'react'; - -import { Launcher } from '@/components/Launcher'; -import { LAUNCHER_SIZE, LAUNCHER_WITH_LABEL_SIZE } from '@/components/Launcher/styles.css'; -import { Proactive } from '@/components/Proactive'; -import { ClassName } from '@/constants'; -import { RuntimeStateAPIContext, RuntimeStateContext } from '@/contexts'; -import { useChatAPI } from '@/hooks/useChatAPI'; -import { usePalette } from '@/hooks/usePalette'; -import { THEME } from '@/styles/colors.css'; -import { FAMILY } from '@/styles/font'; -import { BREAKPOINTS } from '@/styles/sizes'; -import { useResolveAssistantStyleSheet } from '@/utils/stylesheet'; -import { ChatWindow } from '@/views/ChatWindow'; -import type { VoiceAPI } from '@/views/VoiceWidget/VoiceWidget.interface'; -import { VoiceWidget } from '@/views/VoiceWidget/VoiceWidget.view'; - -import { chatContainer, LAUNCHER_MARGIN, launcherContainer, popoverBackdrop, widgetContainer } from './styles.css'; - -interface ChatWidgetProps extends React.PropsWithChildren { - ready?: () => void; - chatAPI: VoiceflowChat | undefined; - shadowRoot?: ShadowRoot; - chatWindow?: React.ReactNode; - voiceApiRef?: React.MutableRefObject; - isLauncherLoading?: boolean; - isLauncherDisabled?: boolean; - onVoiceCallOverride?: () => void; -} - -export const ChatWidget: React.FC = ({ - shadowRoot, - chatAPI, - ready, - voiceApiRef, - isLauncherLoading, - isLauncherDisabled, - onVoiceCallOverride, -}) => { - const { assistant, open, close, interact } = useContext(RuntimeStateAPIContext); - const { isOpen } = useContext(RuntimeStateContext); - /** initialization */ - const [isHidden, setHidden] = useState(false); - const [proactiveMessages, setProactiveMessages] = useState([]); - - const checkMobile = () => window.matchMedia(`(max-width: ${BREAKPOINTS.mobile})`).matches; - const [isMobile, setIsMobile] = useState(checkMobile()); - - const isVoice = assistant.type === WidgetSettingsWidgetType.VOICE; - const isPopover = assistant.chat.renderMode === WidgetSettingsChatRenderMode.POPOVER; - const isVoiceWithoutLauncher = - isVoice && - (assistant.voice.renderMode === WidgetSettingsVoiceRenderMode.COMPACT || - assistant.voice.renderMode === WidgetSettingsVoiceRenderMode.FULL); - - useLayoutEffect(() => { - if (isVoiceWithoutLauncher) { - open(); - } - - setIsMobile(checkMobile()); - }, [isVoiceWithoutLauncher]); - - const palette = usePalette(assistant); - - const onHideChat = () => { - setHidden(true); - close(); - }; - - const toggleChat = () => { - if (isOpen) { - close(); - } else { - open(); - } - }; - - useChatAPI( - chatAPI, - () => ({ - open, - close, - hide: () => onHideChat(), - show: () => setHidden(false), - interact, - proactive: { - clear: () => setProactiveMessages([]), - push: (...messages: Trace.AnyTrace[]) => setProactiveMessages((prev) => [...prev, ...messages]), - }, - }), - ready - ); - - const side = assistant.common.position; - const position = { bottom: `${assistant.common.bottomSpacing}px`, [side]: `${assistant.common.sideSpacing}px` }; - const launcherButtonSize = assistant.common.launcher.type === 'icon' ? LAUNCHER_SIZE : LAUNCHER_WITH_LABEL_SIZE; - const chatHeight = `calc(100% - ${launcherButtonSize + LAUNCHER_MARGIN + parseInt(assistant.common.bottomSpacing, 10) + 20}px)`; - - const widgetPosition = { - [side]: position[side], - bottom: isVoiceWithoutLauncher - ? position.bottom - : `${parseInt(position.bottom, 10) + launcherButtonSize + LAUNCHER_MARGIN}px`, - height: isVoice ? 'auto' : chatHeight, - }; - - const chatContainerPosition = isMobile || isPopover ? {} : widgetPosition; - const isStyleSheetResolved = useResolveAssistantStyleSheet(assistant, shadowRoot); - const customFontFamily = assistant.common.fontFamily; - const isDefaultFont = customFontFamily === 'UCity Pro'; - - useEffect(() => { - if (isDefaultFont) return; - - const link = document.createElement('link'); - - const fontFamilyNameForImport = customFontFamily.replace(/ /g, '+'); - link.href = `https://fonts.googleapis.com/css2?family=${fontFamilyNameForImport}&display=swap`; - link.rel = 'stylesheet'; - document.head.appendChild(link); - }, [customFontFamily]); - - if (!isStyleSheetResolved) return null; - if (!palette) return null; - - return ( - <> -
    - {!isVoiceWithoutLauncher && ( -
    - - - -
    - )} - -
    close()} /> - -
    - {isVoice ? ( - - ) : ( - - )} -
    -
    - - ); -}; diff --git a/packages/chat/src/views/ChatWidget/styles.css.ts b/packages/chat/src/views/ChatWidget/styles.css.ts deleted file mode 100644 index a08de76807..0000000000 --- a/packages/chat/src/views/ChatWidget/styles.css.ts +++ /dev/null @@ -1,155 +0,0 @@ -import { style } from '@vanilla-extract/css'; -import { recipe } from '@vanilla-extract/recipes'; - -import { componentAnimations } from '@/styles/animations'; -import { BREAKPOINTS } from '@/styles/sizes'; - -export const CHAT_WIDTH = 400; -const MAX_CHAT_HEIGHT = 800; - -const POPOVER_WIDTH = 750; -const POPOVER_MIN_HEIGHT = 400; -export const POPOVER_SPACING = 42; - -export const LAUNCHER_MARGIN = 16; - -const WIDGET_Z_INDEX = 10000; - -export const widgetContainer = recipe({ - base: { - position: 'fixed', - inset: 0, - pointerEvents: 'none', - zIndex: WIDGET_Z_INDEX, - }, - variants: { - withChat: { - true: {}, - false: {}, - }, - }, -}); - -export const chatIsOpen = widgetContainer.classNames.variants.withChat.true; -export const chatIsClosed = widgetContainer.classNames.variants.withChat.false; - -export const chatContainer = recipe({ - base: { - width: CHAT_WIDTH, - maxHeight: MAX_CHAT_HEIGHT, - pointerEvents: 'auto', - - // vanilla-extract places all @media directives at the end of the CSS file - // so it will take precedence over all other stylings. - '@media': { - [`(max-width: ${BREAKPOINTS.mobile})`]: { - width: '100%', - height: '100%', - maxHeight: 'none', - top: 0, - bottom: 0, - right: 0, - left: 0, - borderRadius: 0, - margin: 0, - }, - }, - - selectors: { - [`${widgetContainer.classNames.base} &`]: { - position: 'absolute', - }, - - [`.${widgetContainer.classNames.variants.withChat.true} &`]: { - opacity: 1, - pointerEvents: 'all', - transform: 'translateY(0%)', - transition: `transform ${componentAnimations.widgetAppearance.transform} cubic-bezier(0, 0.95, 0.1, 1), opacity ${componentAnimations.widgetAppearance.opacity} linear`, - }, - [`.${widgetContainer.classNames.variants.withChat.false} &`]: { - opacity: 0, - pointerEvents: 'none', - transform: 'translateY(100%)', - transition: `transform ${componentAnimations.widgetAppearance.transform} cubic-bezier(0.85, 0, 0.6, 1), opacity ${componentAnimations.widgetAppearance.opacity} linear`, - }, - }, - }, - - variants: { - popover: { - true: { - display: 'flex', - flexDirection: 'column', - minHeight: POPOVER_MIN_HEIGHT, - maxHeight: '100%', - width: POPOVER_WIDTH, - left: `calc(50% - ${POPOVER_WIDTH / 2}px)`, - top: 0, - bottom: 0, - margin: `${POPOVER_SPACING}px 0`, - selectors: { - [`.${widgetContainer.classNames.variants.withChat.true} &`]: { - pointerEvents: 'none', - }, - }, - }, - }, - - voice: { - true: { - width: 'auto', - height: 'auto', - }, - }, - }, -}); - -export const popoverBackdrop = recipe({ - base: { - display: 'none', - }, - variants: { - visible: { - true: { - display: 'block', - top: 0, - bottom: 0, - left: 0, - right: 0, - width: '100%', - height: '100%', - backdropFilter: 'blur(4px)', - filter: 'blur(4px)', - backgroundColor: 'rgba(0, 0, 0, 0.16)', - zIndex: 10, - pointerEvents: 'all', - }, - }, - }, -}); - -export const launcherContainer = recipe({ - base: { - pointerEvents: 'auto', - selectors: { - [`${widgetContainer.classNames.base} &`]: { - position: 'absolute', - }, - }, - }, - variants: { - isHidden: { - true: { - display: 'none', - }, - }, - }, -}); - -export const fauxWidgetBackground = style({ - width: '100%', - height: '100%', - borderRadius: '16px', - boxShadow: - '0px 0px 0px 1px rgba(22, 26, 30, 0.06), 0px 1px 1px 0px rgba(22, 26, 30, 0.04), 0px 4px 8px -32px rgba(22, 26, 30, 0.04), 0px 10px 16px -32px rgba(22, 26, 30, 0.06), 0px 16px 20px -32px rgba(22, 26, 30, 0.08), 0px 24px 32px -32px rgba(22, 26, 30, 0.08), 0px 32px 40px -32px rgba(22, 26, 30, 0.10), 0px 40px 64px -32px rgba(22, 26, 30, 0.12)', -}); diff --git a/packages/chat/src/views/ChatWindow/index.tsx b/packages/chat/src/views/ChatWindow/index.tsx deleted file mode 100644 index d9e0d719d4..0000000000 --- a/packages/chat/src/views/ChatWindow/index.tsx +++ /dev/null @@ -1,131 +0,0 @@ -import '../../styles.css'; - -import React, { useCallback, useContext } from 'react'; -import * as R from 'remeda'; -import { match } from 'ts-pattern'; - -import { NewChat } from '@/components/NewChat'; -import { chatContentWrapper } from '@/components/NewChat/NewChat.css'; -import { SystemResponse } from '@/components/SystemResponse'; -import Indicator from '@/components/SystemResponse/Indicator/Indicator'; -import { UserResponse } from '@/components/UserResponse'; -import { RuntimeStateAPIContext, RuntimeStateContext } from '@/contexts/RuntimeContext'; -import type { FeedbackName } from '@/contexts/RuntimeContext/useRuntimeAPI'; -import { DEFAULT_CHAT_AVATAR } from '@/dtos/AssistantOptions.dto'; -import { RenderMode } from '@/dtos/RenderOptions.dto'; -import { usePalette } from '@/hooks/usePalette'; -import { FAMILY } from '@/styles/font'; -import type { UserTurnProps } from '@/types'; -import { SessionStatus, TurnType } from '@/types'; - -export interface ChatWindowProps { - className?: string; - isMobile?: boolean; - isPopover?: boolean; -} - -export const ChatWindow: React.FC = ({ isMobile, isPopover }) => { - const runtime = useContext(RuntimeStateAPIContext); - const state = useContext(RuntimeStateContext); - const { assistant, config } = runtime; - const palette = usePalette(assistant); - - // emitters - const restartChat = useCallback((): void => { - runtime.setStatus(SessionStatus.ENDED); - runtime.stopChat(); - }, []); - - const getPreviousUserTurn = useCallback( - (turnIndex: number): UserTurnProps | null => { - const turn = state.session.turns[turnIndex - 1]; - return turn?.type === TurnType.USER ? turn : null; - }, - [state.session.turns] - ); - - if (!palette) return null; - - const AGENT_AVATAR = assistant.chat.agentImage.enabled - ? (assistant.chat.agentImage.url ?? DEFAULT_CHAT_AVATAR) - : undefined; - - const hasEnded = runtime.isStatus(SessionStatus.ENDED); - - return ( - - - {state.session.turns.map((turn, turnIndex) => { - return match(turn) - .with({ type: TurnType.USER }, ({ id, ...props }) => { - return ( - - ); - }) - .with({ type: TurnType.SYSTEM }, ({ id, ...props }) => ( - { - runtime.feedback(feedback, props.messages, getPreviousUserTurn(turnIndex)); - }, - }} - isLast={turnIndex === state.session.turns.length - 1} - aiDisclaimer={assistant.chat.aiDisclaimer} - /> - )) - .exhaustive(); - })} - {state.indicator && ( -
    - -
    - )} -
    -
    - ); -}; diff --git a/packages/chat/src/views/VoiceWidget/VoiceWidget.interface.ts b/packages/chat/src/views/VoiceWidget/VoiceWidget.interface.ts deleted file mode 100644 index 63316ea145..0000000000 --- a/packages/chat/src/views/VoiceWidget/VoiceWidget.interface.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { VoiceService } from './services/voice.service'; - -export interface VoiceAPI extends Pick {} diff --git a/packages/chat/src/views/VoiceWidget/VoiceWidget.view.tsx b/packages/chat/src/views/VoiceWidget/VoiceWidget.view.tsx deleted file mode 100644 index d90ab6f43a..0000000000 --- a/packages/chat/src/views/VoiceWidget/VoiceWidget.view.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { useContext, useEffect, useImperativeHandle, useState } from 'react'; - -import { VoiceWidget as VoiceView } from '@/components/VoiceWidget'; -import type { VoiceState } from '@/constant/voice.constant'; -import { VOICE_STATE } from '@/constant/voice.constant'; -import { RuntimeStateAPIContext } from '@/contexts'; - -import { useVoiceService } from './hooks/use-voice-service.hook'; -import type { VoiceAPI } from './VoiceWidget.interface'; - -export interface IVoiceWidget { - apiRef?: React.MutableRefObject; - isLoading?: boolean; - onCallOverride?: () => void; -} - -export const VoiceWidget = ({ apiRef, isLoading = false, onCallOverride }: IVoiceWidget) => { - const { assistant, config } = useContext(RuntimeStateAPIContext); - const [state, setState] = useState(VOICE_STATE.IDLE); - - if (config.voice === undefined) { - throw new Error('Voice is not configured in the config'); - } - - const voiceService = useVoiceService({ - url: config.voice.url, - userID: config.userID, - assistantID: config.verify.projectID, - accessToken: config.voice.accessToken, - }); - - useImperativeHandle(apiRef, () => voiceService, [voiceService]); - - useEffect(() => voiceService.onStateUpdate((state) => setState(state)), [voiceService]); - - return ( - - ); -}; diff --git a/packages/chat/src/views/VoiceWidget/hooks/use-voice-service.hook.ts b/packages/chat/src/views/VoiceWidget/hooks/use-voice-service.hook.ts deleted file mode 100644 index 2c4c3ee5a4..0000000000 --- a/packages/chat/src/views/VoiceWidget/hooks/use-voice-service.hook.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { useCreateConst } from '@/hooks/cache.hook'; - -import type { VoiceServiceOptions } from '../services/voice.service'; -import { VoiceService } from '../services/voice.service'; - -interface IUserVoiceService extends VoiceServiceOptions {} - -export const useVoiceService = (options: IUserVoiceService) => useCreateConst(() => new VoiceService(options)); diff --git a/packages/chat/src/views/VoiceWidget/services/audio.service.ts b/packages/chat/src/views/VoiceWidget/services/audio.service.ts deleted file mode 100644 index 1c91651425..0000000000 --- a/packages/chat/src/views/VoiceWidget/services/audio.service.ts +++ /dev/null @@ -1,182 +0,0 @@ -interface QueueItem { - markIndex: number; - arrayBuffer: ArrayBuffer; -} - -export class AudioService { - private audio: HTMLAudioElement; - - private stopped = false; - - private mediaSource: MediaSource | null = null; - - private lastMarkIndex = 0; - - private lastSentMarkIndex = 0; - - private onMark: (markIndex: number) => void; - - private onTalking: () => void; - - private onListening: () => void; - - private queue: QueueItem[] = []; - - private activeItem: QueueItem | null = null; - - private sourceBuffer: SourceBuffer | null = null; - - constructor(options: { onMark: (markIndex: number) => void; onListening: () => void; onTalking: () => void }) { - this.onMark = options.onMark; - this.onTalking = options.onTalking; - this.onListening = options.onListening; - - this.audio = new Audio(); - this.audio.addEventListener('ended', this.onAudioEnded); - this.audio.addEventListener('waiting', this.onAudioWaiting); - this.audio.addEventListener('stalled', this.onAudioStalled); - this.audio.addEventListener('playing', this.onAudioPlaying); - } - - private onAudioWaiting = () => { - this.sendMark(); - this.onListening(); - }; - - private onAudioStalled = () => { - this.sendMark(); - this.onListening(); - }; - - private onAudioPlaying = () => { - this.onTalking(); - }; - - private onAudioEnded = () => { - this.onListening(); - }; - - private sendMark() { - if (this.lastMarkIndex === this.lastSentMarkIndex) return; - - this.lastSentMarkIndex = this.lastMarkIndex; - - this.onMark(this.lastMarkIndex); - } - - private base64ToArrayBuffer(base64: string) { - const binaryString = window.atob(base64); - const len = binaryString.length; - const bytes = new Uint8Array(len); - - for (let i = 0; i < len; i++) { - bytes[i] = binaryString.charCodeAt(i); - } - - return bytes.buffer; - } - - private onBufferUpdated(markIndex: number) { - this.activeItem = null; - - if (markIndex > this.lastMarkIndex) { - this.lastMarkIndex = markIndex; - } - - if (this.queue.length) { - this.playQueue(); - } else { - this.sendMark(); - } - } - - private async updateSourceBuffer(markIndex: number, arrayBuffer: ArrayBuffer) { - await this.startAudio(); - - this.sourceBuffer?.addEventListener('error', () => this.onBufferUpdated(markIndex), { once: true }); - this.sourceBuffer?.addEventListener('updateend', () => this.onBufferUpdated(markIndex), { once: true }); - - this.sourceBuffer?.appendBuffer(arrayBuffer); - } - - private async playQueue() { - if (this.stopped || this.activeItem || !this.queue.length) return; - - this.activeItem = this.queue.shift()!; - - this.updateSourceBuffer(this.activeItem.markIndex, this.activeItem.arrayBuffer); - } - - addChunk(base64Chunk: string, markIndex: number) { - if (this.stopped) return; - - const arrayBuffer = this.base64ToArrayBuffer(base64Chunk); - - this.queue.push({ markIndex, arrayBuffer }); - this.playQueue(); - } - - private stopAudio() { - if (this.stopped) return; - - this.sourceBuffer?.abort(); - this.sourceBuffer = null; - - if (this.mediaSource?.readyState === 'open') { - this.mediaSource?.endOfStream(); - } - this.mediaSource = null; - - URL.revokeObjectURL(this.audio.src); - - this.audio.pause(); - this.audio.currentTime = 0; - this.audio.src = ''; - } - - private startAudio() { - if (this.stopped || this.mediaSource) return Promise.resolve(); - - return new Promise((resolve) => { - const mediaSource = new MediaSource(); - - mediaSource.addEventListener( - 'sourceopen', - () => { - this.sourceBuffer = mediaSource.addSourceBuffer('audio/mpeg'); - - resolve(); - }, - { once: true } - ); - - this.audio.src = URL.createObjectURL(mediaSource); - - this.audio.play(); - this.mediaSource = mediaSource; - }); - } - - interrupt() { - if (this.stopped) return; - - this.queue = []; - this.activeItem = null; - - this.stopAudio(); - - this.sendMark(); - - this.startAudio(); - } - - stop() { - this.stopAudio(); - - this.queue = []; - this.stopped = true; - this.activeItem = null; - this.lastMarkIndex = 0; - this.lastSentMarkIndex = 0; - } -} diff --git a/packages/chat/src/views/VoiceWidget/services/recorder.service.ts b/packages/chat/src/views/VoiceWidget/services/recorder.service.ts deleted file mode 100644 index adba208fcc..0000000000 --- a/packages/chat/src/views/VoiceWidget/services/recorder.service.ts +++ /dev/null @@ -1,85 +0,0 @@ -export class RecorderService { - private mediaRecorder: MediaRecorder | null = null; - - private inputAudioStream: MediaStream | null = null; - - private createAudioStreamPromise: Promise | null = null; - - constructor(private readonly onDataAvailable: (data: Blob) => void) {} - - private createAudioStream() { - if (this.createAudioStreamPromise) { - console.info('Returning existing input audio stream promise.'); - - return this.createAudioStreamPromise; - } - - if (this.inputAudioStream) { - return Promise.resolve(this.inputAudioStream); - } - - this.createAudioStreamPromise = navigator.mediaDevices - .getUserMedia({ audio: true }) - .catch((err) => { - console.error('Microphone access denied.', err); - - throw err; - }) - .finally(() => { - this.createAudioStreamPromise = null; - }); - - return this.createAudioStreamPromise; - } - - private onMediaRecorderError = (event: Event) => { - console.error('MediaRecorder error:', (event as ErrorEvent).error); - }; - - private onMediaRecorderDataAvailable = (event: BlobEvent) => { - console.info('Got data:', event.data); - - if (event.data.size > 0) { - this.onDataAvailable(event.data); - } - }; - - async start() { - if (this.inputAudioStream) { - console.info('Audio stream already exists, reusing.'); - - return; - } - - this.inputAudioStream = await this.createAudioStream(); - - console.info('Got audio stream:', this.inputAudioStream); - - this.mediaRecorder = new MediaRecorder(this.inputAudioStream); - - console.info('Got media recorder:', this.mediaRecorder); - - this.mediaRecorder.addEventListener('error', this.onMediaRecorderError); - this.mediaRecorder.addEventListener('dataavailable', this.onMediaRecorderDataAvailable); - - this.mediaRecorder?.start(1000); - - console.info('Started audio streaming...'); - } - - stop() { - if (this.mediaRecorder?.state !== 'inactive') { - this.mediaRecorder?.stop(); - } - - this.inputAudioStream?.getTracks().forEach((track) => track.stop()); - - this.mediaRecorder?.removeEventListener('error', this.onMediaRecorderError); - this.mediaRecorder?.removeEventListener('dataavailable', this.onMediaRecorderDataAvailable); - - this.mediaRecorder = null; - this.inputAudioStream = null; - - console.info('Stopped audio streaming.'); - } -} diff --git a/packages/chat/src/views/VoiceWidget/services/socket.service.ts b/packages/chat/src/views/VoiceWidget/services/socket.service.ts deleted file mode 100644 index df65b9daf0..0000000000 --- a/packages/chat/src/views/VoiceWidget/services/socket.service.ts +++ /dev/null @@ -1,143 +0,0 @@ -interface SocketAudioInputMessage { - type: 'audio'; - payload: { audio: string; markIndex: number }; -} - -interface SocketEndInputMessage { - type: 'end'; -} - -interface SocketInterruptInputMessage { - type: 'interrupt'; -} - -export type SocketInputMessage = SocketAudioInputMessage | SocketEndInputMessage | SocketInterruptInputMessage; - -interface SocketMarkOutputMessage { - type: 'mark'; - payload: { markIndex: number }; -} - -interface SocketStartOutputMessage { - type: 'start'; - payload: { userID: string; assistantID: string; authorization: string }; -} - -export type SocketOutputMessage = Blob | SocketMarkOutputMessage | SocketStartOutputMessage; - -export class SocketService { - private url: string; - - private socket: WebSocket | null = null; - - private onError: (error: unknown) => void; - - private onMessage: (message: SocketInputMessage) => void; - - private connectionPromise: Promise | null = null; - - constructor(options: { - url: string; - onError: (error: unknown) => void; - onMessage: (message: SocketInputMessage) => void; - }) { - this.url = options.url; - this.onError = options.onError; - this.onMessage = options.onMessage; - } - - private createSocket() { - if (this.connectionPromise) { - return this.connectionPromise; - } - - if (this.socket) { - return Promise.resolve(this.socket); - } - - this.connectionPromise = new Promise((resolve, reject) => { - const socket = new WebSocket(this.url); - - const onOpen = () => { - console.info('Socket connection established.'); - - removeListeners(); - resolve(socket); - }; - - const onError = (error: unknown) => { - console.error('Socket connection error.', error); - - removeListeners(); - reject(error); - }; - - socket.addEventListener('open', onOpen); - socket.addEventListener('error', onError); - - const removeListeners = () => { - socket?.removeEventListener('open', onOpen); - socket?.removeEventListener('error', onError); - }; - }).finally(() => { - this.connectionPromise = null; - }); - - return this.connectionPromise; - } - - private onSocketError = (event: Event) => { - console.error('socket error:', event); - - this.onError(event); - this.stop(); - }; - - private onSocketMessage = (event: MessageEvent) => { - const message = JSON.parse(event.data); - - console.info('socket message:', message); - - this.onMessage(message); - }; - - async start() { - if (this.socket) { - console.info('Socket already exists, reusing.'); - - return; - } - - this.socket = await this.createSocket(); - - this.socket.addEventListener('error', this.onSocketError); - this.socket.addEventListener('message', this.onSocketMessage); - } - - stop() { - if (this.socket?.readyState !== WebSocket.CLOSED && this.socket?.readyState !== WebSocket.CLOSING) { - this.socket?.close(); - } - - this.socket?.removeEventListener('error', this.onSocketError); - this.socket?.removeEventListener('message', this.onSocketMessage); - - this.socket = null; - } - - send(message: SocketOutputMessage) { - if (!this.socket) { - console.warn('Socket is not open, cannot send message.'); - - return; - } - - if (this.socket.readyState !== WebSocket.OPEN) { - console.warn('Socket is not open, cannot send message.'); - - return; - } - - this.socket.send(message instanceof Blob ? message : JSON.stringify(message)); - } -} diff --git a/packages/chat/src/views/VoiceWidget/services/voice.service.ts b/packages/chat/src/views/VoiceWidget/services/voice.service.ts deleted file mode 100644 index 4989e3dd59..0000000000 --- a/packages/chat/src/views/VoiceWidget/services/voice.service.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { VOICE_STATE, VoiceState } from '@/constant/voice.constant'; - -import { AudioService } from './audio.service'; -import { RecorderService } from './recorder.service'; -import { SocketInputMessage, SocketService } from './socket.service'; - -export interface VoiceServiceOptions { - url: string; - userID?: string; - accessToken: string; - assistantID: string; -} - -export class VoiceService { - private state: string = VOICE_STATE.IDLE; - - private userID: string; - - private listeners: Array<(state: VoiceState) => void> = []; - - private accessToken: string; - - private assistantID: string; - - private audio: AudioService | null = null; - - private socket: SocketService; - - private recorder: RecorderService; - - constructor({ url, userID, accessToken, assistantID }: VoiceServiceOptions) { - this.userID = userID ?? 'test'; - this.assistantID = assistantID; - this.accessToken = accessToken; - - this.socket = new SocketService({ - url: `${url}/voice/socket`, - onError: this.onSocketError, - onMessage: this.onSocketMessage, - }); - this.recorder = new RecorderService(this.onRecorderDataAvailable); - } - - private onAudioMark = (markIndex: number) => { - this.socket?.send({ type: 'mark', payload: { markIndex } }); - }; - - private onAudioTalking = () => { - this.updateState(VOICE_STATE.TALKING); - }; - - private onAudioListening = () => { - this.updateState(VOICE_STATE.LISTENING); - }; - - private onRecorderDataAvailable = (data: Blob) => { - this.socket.send(data); - }; - - private onSocketError = () => { - // TODO: Handle socket error - }; - - private onSocketMessage = (message: SocketInputMessage) => { - if (message.type === 'audio') { - this.audio?.addChunk(message.payload.audio, message.payload.markIndex); - } else if (message.type === 'interrupt') { - this.audio?.interrupt(); - } else if (message.type === 'end') { - console.info('Conversation ended by server.', 'system'); - this.stop(); - } - }; - - private async start() { - this.updateState(VOICE_STATE.INITIALIZING); - - this.audio = new AudioService({ - onMark: this.onAudioMark, - onTalking: this.onAudioTalking, - onListening: this.onAudioListening, - }); - - await this.socket.start(); - - this.socket.send({ - type: 'start', - payload: { - userID: this.userID, - assistantID: this.assistantID, - authorization: this.accessToken, - }, - }); - - await this.recorder.start(); - - this.updateState(VOICE_STATE.LISTENING); - - console.info('listening...'); - } - - private stop() { - this.recorder.stop(); - this.socket.stop(); - this.audio?.stop(); - - this.updateState(VOICE_STATE.ENDED); - } - - private updateState = (state: VoiceState) => { - if (this.state === state) return; - - this.state = state; - - this.listeners.forEach((listener) => listener(state)); - }; - - startConversation = () => this.start(); - - endConversation = () => this.stop(); - - onStateUpdate = (cb: (state: VoiceState) => void) => { - this.listeners.push(cb); - - // Returns an unsubscribe function that removes this callback from listeners - // when called, preventing memory leaks and unwanted updates - return () => { - this.listeners = this.listeners.filter((listener) => listener !== cb); - }; - }; -} diff --git a/packages/chat/src/views/index.ts b/packages/chat/src/views/index.ts deleted file mode 100644 index 6d8f2fdd04..0000000000 --- a/packages/chat/src/views/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { ChatEmbed } from './ChatEmbed'; -export { ChatWidget } from './ChatWidget'; -export { ChatWindow } from './ChatWindow'; diff --git a/packages/chat/src/widget.tsx b/packages/chat/src/widget.tsx deleted file mode 100644 index 9dc52399fc..0000000000 --- a/packages/chat/src/widget.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import 'regenerator-runtime/runtime'; - -import type { Root } from 'react-dom/client'; -import { createRoot } from 'react-dom/client'; - -import { RuntimeProvider } from './contexts'; -import type { LoadConfig } from './dtos/ChatConfig.dto'; -import { ChatConfig } from './dtos/ChatConfig.dto'; -import { RenderMode } from './dtos/RenderOptions.dto'; -import { WidgetOverrides } from './dtos/WidgetOverrides.dto'; -import { shadowRoot } from './styles/shadow'; -import { mergeAssistantOptions } from './utils/assistant'; -import { createPlaceholderMethods } from './utils/chat'; -import { addStyleSheetURL } from './utils/stylesheet'; -import { ChatEmbed } from './views/ChatEmbed'; -import { ChatWidget } from './views/ChatWidget'; - -let reactRoot: Root; - -const initOverlayMode = () => { - reactRoot = createRoot(shadowRoot); - - return { shadowRoot, reactRoot }; -}; - -const initEmbeddedMode = (rootEl: HTMLElement) => { - try { - const shadowRoot = rootEl.attachShadow({ mode: 'open' }); - reactRoot = createRoot(shadowRoot); - - return { shadowRoot, reactRoot }; - } catch (e) { - console.error(`${e}. \nTarget:`, rootEl); - throw new Error('Failed to attach embedded chat to the provided target.'); - } -}; - -const createChatRoot = (config: ChatConfig) => { - if (config.render.mode === RenderMode.EMBEDDED) { - return initEmbeddedMode(config.render.target); - } - - return initOverlayMode(); -}; - -const methods = createPlaceholderMethods( - (method: string) => `Method '${method}' will have no effect until 'load' has been called.` -); - -window.voiceflow ??= {}; -window.voiceflow.chat ??= { - ...methods, - proactive: { ...methods.proactive }, - - load: async (loadConfig: LoadConfig) => { - const config = ChatConfig.parse(loadConfig); - const assistant = await mergeAssistantOptions(config, WidgetOverrides.parse(loadConfig.assistant ?? {})); - - const { reactRoot, shadowRoot } = createChatRoot(config); - - await addStyleSheetURL(__STYLES_URL__, shadowRoot ?? document.head); - - // set root here - await new Promise((resolve) => { - reactRoot.render( - - {config.render.mode === RenderMode.EMBEDDED && ( - - )} - {config.render.mode === RenderMode.OVERLAY && ( - - )} - - ); - }); - }, - - destroy: () => reactRoot.render(null), -}; diff --git a/packages/chat/tsconfig.build.json b/packages/chat/tsconfig.build.json deleted file mode 100644 index 3e87ddfb33..0000000000 --- a/packages/chat/tsconfig.build.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "extends": "./tsconfig.json", - "include": ["src", "typings"], - "exclude": ["**/*.test.*", "**/*.story.tsx"] -} diff --git a/packages/chat/tsconfig.json b/packages/chat/tsconfig.json deleted file mode 100644 index 505ca2330a..0000000000 --- a/packages/chat/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "@voiceflow/tsconfig", - "compilerOptions": { - "lib": ["dom", "es2019"], - "jsx": "react-jsx", - "baseUrl": ".", - "outDir": "build", - "paths": { - "@/*": ["src/*"] - }, - "types": ["node"] - }, - "exclude": ["node_modules", "build", "dist", "docs"] -} diff --git a/packages/chat/typings/env.d.ts b/packages/chat/typings/env.d.ts deleted file mode 100644 index ee9857a625..0000000000 --- a/packages/chat/typings/env.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -/// -/// diff --git a/packages/chat/typings/global.d.ts b/packages/chat/typings/global.d.ts deleted file mode 100644 index 2f5f3abbc8..0000000000 --- a/packages/chat/typings/global.d.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { Trace } from '@voiceflow/base-types'; -import type { RuntimeAction } from '@voiceflow/sdk-runtime'; - -import type { LoadConfig } from '@/dtos/ChatConfig.dto'; - -declare global { - export const __STYLES_URL__: string; - export const __USE_SHADOW_ROOT__: boolean; - - interface VoiceflowChat { - load: (config: LoadConfig) => Promise; - destroy: () => void; - - interact: (action: RuntimeAction) => Promise; - - /* overlay mode controls */ - open: VoidFunction; - close: VoidFunction; - hide: VoidFunction; - show: VoidFunction; - - proactive: { - clear: () => void; - push: (...messages: Trace.AnyTrace[]) => void; - }; - } - - interface Window { - voiceflow?: { - chat?: VoiceflowChat; - }; - } -} diff --git a/packages/chat/vite.package.config.ts b/packages/chat/vite.package.config.ts deleted file mode 100644 index 1e54a995d3..0000000000 --- a/packages/chat/vite.package.config.ts +++ /dev/null @@ -1,47 +0,0 @@ -import react from '@vitejs/plugin-react'; -import path from 'path'; -import { defineConfig } from 'vite'; -import dts from 'vite-plugin-dts'; -import { viteStaticCopy } from 'vite-plugin-static-copy'; - -import { createPlugins } from './vite.widget.config'; - -export default defineConfig({ - define: { - __USE_SHADOW_ROOT__: false, - __STYLES_URL__: JSON.stringify('https://cdn.voiceflow.com/widget-next/style.css'), - 'process.env': {}, - }, - build: { - outDir: path.resolve(__dirname, 'build'), - lib: { - entry: { - main: path.resolve(__dirname, './src/main.ts'), - stories: path.resolve(__dirname, './src/stories.ts'), - }, - name: 'voiceflow-chat', - fileName: (format, entry) => `${entry}.${format}.js`, - formats: ['es', 'cjs'], - }, - rollupOptions: { - external: ['react', 'react-dom'], - output: { - globals: { - react: 'React', - 'react-dom': 'ReactDOM', - }, - }, - }, - }, - plugins: [ - react(), - dts({ tsconfigPath: 'tsconfig.build.json' }), - ...createPlugins(), - viteStaticCopy({ - targets: [ - { src: 'src/assets/vf_chat.png', dest: '' }, - { src: 'src/assets/message.png', dest: '' }, - ], - }), - ], -}); diff --git a/packages/chat/vite.widget.config.ts b/packages/chat/vite.widget.config.ts deleted file mode 100644 index 3e0bfa32aa..0000000000 --- a/packages/chat/vite.widget.config.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin'; -import react from '@vitejs/plugin-react'; -import path from 'path'; -import Unfonts from 'unplugin-fonts/vite'; -import type { PluginOption } from 'vite'; -import { defineConfig, loadEnv } from 'vite'; -import { createHtmlPlugin } from 'vite-plugin-html'; -import { viteStaticCopy } from 'vite-plugin-static-copy'; -import svgr from 'vite-plugin-svgr'; -import tsconfigPaths from 'vite-tsconfig-paths'; - -export const createPlugins = (): PluginOption[] => [ - vanillaExtractPlugin(), - tsconfigPaths(), - svgr(), - Unfonts({ - google: { - families: [ - { - name: 'Open Sans', - styles: 'wght@400;600', - defer: true, - }, - ], - }, - }), -]; - -export default defineConfig(({ mode }) => { - const env = loadEnv(mode, process.cwd()); - - return { - server: { - port: 3006, - open: '/examples/index.html', - }, - define: { - __USE_SHADOW_ROOT__: true, - __STYLES_URL__: JSON.stringify(env.VF_STYLES_URL ?? 'https://cdn.voiceflow.com/widget-next/style.css'), - 'process.env': {}, - }, - build: { - lib: { - entry: path.resolve(__dirname, 'src', 'widget.tsx'), - name: 'voiceflow-chat', - fileName: 'bundle', - formats: ['iife'], - }, - rollupOptions: { - output: { - extend: true, - entryFileNames: 'bundle.mjs', - }, - }, - }, - plugins: [ - react(), - ...(mode === 'development' - ? [ - createHtmlPlugin({ - template: 'examples/index.html', - inject: { data: env }, - }), - ] - : []), - ...createPlugins(), - viteStaticCopy({ - targets: [ - { src: 'src/assets/vf_chat.png', dest: '' }, - { src: 'src/assets/message.png', dest: '' }, - ], - }), - ], - }; -}); diff --git a/packages/chat/vitest.config.ts b/packages/chat/vitest.config.ts deleted file mode 100644 index e563fa7bfe..0000000000 --- a/packages/chat/vitest.config.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin'; -import react from '@vitejs/plugin-react'; -import baseConfig from '@voiceflow/vitest-config'; -import type { UserConfig } from 'vitest/config'; -import { mergeConfig } from 'vitest/config'; - -export default mergeConfig(baseConfig, { - define: { - __USE_SHADOW_ROOT__: true, - }, - plugins: [react(), vanillaExtractPlugin()], - test: { - globals: true, - environment: 'happy-dom', - setupFiles: ['./config/test/setup.ts'], - }, -}); diff --git a/packages/react-chat/package.json b/packages/react-chat/package.json index 1fee6e9ba6..99e0c84390 100644 --- a/packages/react-chat/package.json +++ b/packages/react-chat/package.json @@ -46,7 +46,7 @@ "dependencies": { "@voiceflow/base-types": "2.113.1", "@voiceflow/dtos-interact": "1.1.0", - "@voiceflow/sdk-runtime": "workspace:*", + "@voiceflow/sdk-runtime": "1.10.0", "@voiceflow/slate-serializer": "1.5.5", "@voiceflow/stitches-react": "2.3.1", "@voiceflow/voiceflow-types": "3.32.1", diff --git a/packages/sdk-runtime/.dependency-cruiser.mjs b/packages/sdk-runtime/.dependency-cruiser.mjs deleted file mode 100644 index 971c45328d..0000000000 --- a/packages/sdk-runtime/.dependency-cruiser.mjs +++ /dev/null @@ -1,3 +0,0 @@ -import { createConfig } from '@voiceflow/dependency-cruiser-config'; - -export default createConfig(); diff --git a/packages/sdk-runtime/CHANGELOG.md b/packages/sdk-runtime/CHANGELOG.md deleted file mode 100644 index a4d0c74e6d..0000000000 --- a/packages/sdk-runtime/CHANGELOG.md +++ /dev/null @@ -1,332 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -# [1.11.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/sdk-runtime@1.10.0...@voiceflow/sdk-runtime@1.11.0) (2024-12-03) - -### Features - -* use new WidgetSettings object for chat configuration ([#376](https://github.com/voiceflow/react-chat/issues/376)) ([43ebd19](https://github.com/voiceflow/react-chat/commit/43ebd19bf4e8d31fbddd8c39a05335d25056ad31)) - -# [1.10.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/sdk-runtime@1.9.0...@voiceflow/sdk-runtime@1.10.0) (2024-09-24) - -### Features - -* add audio interface support (COR-000) ([#178](https://github.com/voiceflow/react-chat/issues/178)) ([f1954c1](https://github.com/voiceflow/react-chat/commit/f1954c1d3590814dffe1e99ab5e510334414ee8b)) - -# [1.9.0](https://github.com/voiceflow/react-chat/compare/@voiceflow/sdk-runtime@1.8.2...@voiceflow/sdk-runtime@1.9.0) (2024-09-17) - -### Features - -* prototype runtime (COR-000) ([#171](https://github.com/voiceflow/react-chat/issues/171)) ([1ad51a1](https://github.com/voiceflow/react-chat/commit/1ad51a1459fd76e16bc9ea7a796d08663d04cbd3)) - -## [1.8.2](https://github.com/voiceflow/react-chat/compare/@voiceflow/sdk-runtime@1.8.1...@voiceflow/sdk-runtime@1.8.2) (2024-09-17) - -### Bug Fixes - -* encode sessionID (DX-2369) ([#173](https://github.com/voiceflow/react-chat/issues/173)) ([4eedf91](https://github.com/voiceflow/react-chat/commit/4eedf91630f64a7af06e3b75634e7b739ab10a7c)) - -## [1.8.1](https://github.com/voiceflow/react-chat/compare/@voiceflow/sdk-runtime@1.8.0...@voiceflow/sdk-runtime@1.8.1) (2024-09-12) - -### Bug Fixes - -* use ESM-friendly version of @voiceflow/common (DX-2358) ([#169](https://github.com/voiceflow/react-chat/issues/169)) ([ea7dc8b](https://github.com/voiceflow/react-chat/commit/ea7dc8b042e5dd8e998ea8768da9c3f3d41cff6d)) - -# 1.8.0 (2024-09-11) - -### Features - -* ensure package works in ESM context (DX-2058) ([#166](https://github.com/voiceflow/react-chat/issues/166)) ([6919d71](https://github.com/voiceflow/react-chat/commit/6919d711aec66ad284298ac50e4b469e051e2e76)) - -# [1.7.0](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.28...@voiceflow/sdk-runtime@1.7.0) (2023-06-06) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.81.12 (vf-000) ([#87](https://github.com/voiceflow/adapters/issues/87)) ([5b8aa56](https://github.com/voiceflow/adapters/commit/5b8aa56b3269673c8e137a422cc6fd21e2295323)) -* **deps:** update dependency @voiceflow/base-types to v2.81.13 (vf-000) ([#88](https://github.com/voiceflow/adapters/issues/88)) ([381e145](https://github.com/voiceflow/adapters/commit/381e14536e56168f71839cc738d593d43a44968e)) -* **deps:** update dependency @voiceflow/base-types to v2.81.14 (vf-000) ([#89](https://github.com/voiceflow/adapters/issues/89)) ([ceec206](https://github.com/voiceflow/adapters/commit/ceec206fbd6dd0a9dec05b48e840a275b2a7c668)) -* **deps:** update dependency @voiceflow/base-types to v2.81.7 (vf-000) ([#84](https://github.com/voiceflow/adapters/issues/84)) ([9689b5a](https://github.com/voiceflow/adapters/commit/9689b5adf8b02d75123eafa8a1646af89a3164a9)) -* **deps:** update dependency @voiceflow/base-types to v2.81.9 (vf-000) ([#85](https://github.com/voiceflow/adapters/issues/85)) ([309ec41](https://github.com/voiceflow/adapters/commit/309ec4186373e8458b092a762c17692e4633a6f4)) -* **deps:** update dependency @voiceflow/base-types to v2.82.0 (vf-000) ([#90](https://github.com/voiceflow/adapters/issues/90)) ([96d8397](https://github.com/voiceflow/adapters/commit/96d8397ef4423b46581c184cf1bfc4c084425ad3)) -* **deps:** update dependency @voiceflow/base-types to v2.83.1 (vf-000) ([#91](https://github.com/voiceflow/adapters/issues/91)) ([2c72e11](https://github.com/voiceflow/adapters/commit/2c72e11e4e0926092fc6238963596d47109f89e0)) -* **deps:** update dependency @voiceflow/base-types to v2.83.2 (vf-000) ([#92](https://github.com/voiceflow/adapters/issues/92)) ([d6ce499](https://github.com/voiceflow/adapters/commit/d6ce499f892a6bb59f5a1bda914c71ea8751ce78)) -* **deps:** update dependency @voiceflow/base-types to v2.83.3 (vf-000) ([#93](https://github.com/voiceflow/adapters/issues/93)) ([15efa08](https://github.com/voiceflow/adapters/commit/15efa08659aa8cccef10acb9d1966e4f90987cca)) -* **deps:** update dependency @voiceflow/base-types to v2.84.0 (vf-000) ([#94](https://github.com/voiceflow/adapters/issues/94)) ([0cabe66](https://github.com/voiceflow/adapters/commit/0cabe6615d1c3be28ea28461510330101ea0f123)) -* **deps:** update dependency @voiceflow/base-types to v2.84.3 (vf-000) ([#95](https://github.com/voiceflow/adapters/issues/95)) ([83d4914](https://github.com/voiceflow/adapters/commit/83d491413d220b2c8c9ba2ed190c85dff449e334)) -* **deps:** update voiceflow dependencies (automerge) (vf-000) ([#86](https://github.com/voiceflow/adapters/issues/86)) ([727444f](https://github.com/voiceflow/adapters/commit/727444f96430378109dc42ec3c76cec449774a9a)) - -### Features - -* implement new public feedback endpoint (CT-2052) ([#96](https://github.com/voiceflow/adapters/issues/96)) ([78184e7](https://github.com/voiceflow/adapters/commit/78184e741fa9f8609911f305db065a68162eb8bb)) - -# [1.6.0](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.28...@voiceflow/sdk-runtime@1.6.0) (2023-06-06) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.81.12 (vf-000) ([#87](https://github.com/voiceflow/adapters/issues/87)) ([5b8aa56](https://github.com/voiceflow/adapters/commit/5b8aa56b3269673c8e137a422cc6fd21e2295323)) -* **deps:** update dependency @voiceflow/base-types to v2.81.13 (vf-000) ([#88](https://github.com/voiceflow/adapters/issues/88)) ([381e145](https://github.com/voiceflow/adapters/commit/381e14536e56168f71839cc738d593d43a44968e)) -* **deps:** update dependency @voiceflow/base-types to v2.81.14 (vf-000) ([#89](https://github.com/voiceflow/adapters/issues/89)) ([ceec206](https://github.com/voiceflow/adapters/commit/ceec206fbd6dd0a9dec05b48e840a275b2a7c668)) -* **deps:** update dependency @voiceflow/base-types to v2.81.7 (vf-000) ([#84](https://github.com/voiceflow/adapters/issues/84)) ([9689b5a](https://github.com/voiceflow/adapters/commit/9689b5adf8b02d75123eafa8a1646af89a3164a9)) -* **deps:** update dependency @voiceflow/base-types to v2.81.9 (vf-000) ([#85](https://github.com/voiceflow/adapters/issues/85)) ([309ec41](https://github.com/voiceflow/adapters/commit/309ec4186373e8458b092a762c17692e4633a6f4)) -* **deps:** update dependency @voiceflow/base-types to v2.82.0 (vf-000) ([#90](https://github.com/voiceflow/adapters/issues/90)) ([96d8397](https://github.com/voiceflow/adapters/commit/96d8397ef4423b46581c184cf1bfc4c084425ad3)) -* **deps:** update dependency @voiceflow/base-types to v2.83.1 (vf-000) ([#91](https://github.com/voiceflow/adapters/issues/91)) ([2c72e11](https://github.com/voiceflow/adapters/commit/2c72e11e4e0926092fc6238963596d47109f89e0)) -* **deps:** update dependency @voiceflow/base-types to v2.83.2 (vf-000) ([#92](https://github.com/voiceflow/adapters/issues/92)) ([d6ce499](https://github.com/voiceflow/adapters/commit/d6ce499f892a6bb59f5a1bda914c71ea8751ce78)) -* **deps:** update dependency @voiceflow/base-types to v2.83.3 (vf-000) ([#93](https://github.com/voiceflow/adapters/issues/93)) ([15efa08](https://github.com/voiceflow/adapters/commit/15efa08659aa8cccef10acb9d1966e4f90987cca)) -* **deps:** update dependency @voiceflow/base-types to v2.84.0 (vf-000) ([#94](https://github.com/voiceflow/adapters/issues/94)) ([0cabe66](https://github.com/voiceflow/adapters/commit/0cabe6615d1c3be28ea28461510330101ea0f123)) -* **deps:** update dependency @voiceflow/base-types to v2.84.3 (vf-000) ([#95](https://github.com/voiceflow/adapters/issues/95)) ([83d4914](https://github.com/voiceflow/adapters/commit/83d491413d220b2c8c9ba2ed190c85dff449e334)) -* **deps:** update voiceflow dependencies (automerge) (vf-000) ([#86](https://github.com/voiceflow/adapters/issues/86)) ([727444f](https://github.com/voiceflow/adapters/commit/727444f96430378109dc42ec3c76cec449774a9a)) - -### Features - -* implement new public feedback endpoint (CT-2052) ([#96](https://github.com/voiceflow/adapters/issues/96)) ([78184e7](https://github.com/voiceflow/adapters/commit/78184e741fa9f8609911f305db065a68162eb8bb)) - -## [1.5.28](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.27...@voiceflow/sdk-runtime@1.5.28) (2023-04-03) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.81.6 (vf-000) ([#83](https://github.com/voiceflow/adapters/issues/83)) ([f370c27](https://github.com/voiceflow/adapters/commit/f370c27e2c67af571f6fe41dac7ee0a4ae5cc3b1)) - -## [1.5.27](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.26...@voiceflow/sdk-runtime@1.5.27) (2023-03-31) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.81.5 (vf-000) ([#82](https://github.com/voiceflow/adapters/issues/82)) ([9b51f1d](https://github.com/voiceflow/adapters/commit/9b51f1d745e44d29708e40e2d9eae2add0351c98)) - -## [1.5.26](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.25...@voiceflow/sdk-runtime@1.5.26) (2023-03-29) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.81.4 (vf-000) ([#81](https://github.com/voiceflow/adapters/issues/81)) ([487ff68](https://github.com/voiceflow/adapters/commit/487ff68af3b2a1afcfc04c4f77b3e8e41d766c96)) - -## [1.5.25](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.24...@voiceflow/sdk-runtime@1.5.25) (2023-03-27) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.81.3 (vf-000) ([#80](https://github.com/voiceflow/adapters/issues/80)) ([391615d](https://github.com/voiceflow/adapters/commit/391615d92bfff98b495997c6ae38ad3af4140174)) - -## [1.5.24](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.23...@voiceflow/sdk-runtime@1.5.24) (2023-03-17) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.81.2 (vf-000) ([#79](https://github.com/voiceflow/adapters/issues/79)) ([d1e8adc](https://github.com/voiceflow/adapters/commit/d1e8adcba1998df89ea668ffe3eae274c2ea8209)) - -## [1.5.23](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.22...@voiceflow/sdk-runtime@1.5.23) (2023-03-16) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.81.1 (vf-000) ([#78](https://github.com/voiceflow/adapters/issues/78)) ([ca38f97](https://github.com/voiceflow/adapters/commit/ca38f975b9437be06878131150bf05c1a5f91f85)) - -## [1.5.22](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.21...@voiceflow/sdk-runtime@1.5.22) (2023-03-06) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.81.0 (vf-000) ([#77](https://github.com/voiceflow/adapters/issues/77)) ([8e7b2bd](https://github.com/voiceflow/adapters/commit/8e7b2bd636da8da926ad2ccceb239ccca8f8d481)) - -## [1.5.21](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.20...@voiceflow/sdk-runtime@1.5.21) (2023-02-16) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.80.3 (vf-000) ([#74](https://github.com/voiceflow/adapters/issues/74)) ([e2eddf6](https://github.com/voiceflow/adapters/commit/e2eddf623b8936f381668ac83eae1f26791b0c21)) - -## [1.5.20](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.19...@voiceflow/sdk-runtime@1.5.20) (2023-02-15) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.80.2 (vf-000) ([#73](https://github.com/voiceflow/adapters/issues/73)) ([f85229f](https://github.com/voiceflow/adapters/commit/f85229f9cebeec8fefe1d92469a332f013d220c4)) - -## [1.5.19](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.18...@voiceflow/sdk-runtime@1.5.19) (2023-02-14) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.80.1 (vf-000) ([#72](https://github.com/voiceflow/adapters/issues/72)) ([52b9b87](https://github.com/voiceflow/adapters/commit/52b9b87f4cee4d8338f38b24e95fd47f1343e0c7)) - -## [1.5.18](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.17...@voiceflow/sdk-runtime@1.5.18) (2023-02-07) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.80.0 (vf-000) ([#71](https://github.com/voiceflow/adapters/issues/71)) ([48c723c](https://github.com/voiceflow/adapters/commit/48c723ca74c8d0829aa8f3c954f5c8de59e3667f)) - -## [1.5.17](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.16...@voiceflow/sdk-runtime@1.5.17) (2023-02-06) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.79.1 (vf-000) ([#70](https://github.com/voiceflow/adapters/issues/70)) ([b8cc525](https://github.com/voiceflow/adapters/commit/b8cc525ab89fac880a0d96b754811c23a880b1ca)) - -## [1.5.16](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.15...@voiceflow/sdk-runtime@1.5.16) (2023-02-06) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.79.0 (vf-000) ([#69](https://github.com/voiceflow/adapters/issues/69)) ([8f290a2](https://github.com/voiceflow/adapters/commit/8f290a2ee0df8a58091eb6bf0a5ea52741f29984)) - -## [1.5.15](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.14...@voiceflow/sdk-runtime@1.5.15) (2023-01-23) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.78.1 (vf-000) ([#67](https://github.com/voiceflow/adapters/issues/67)) ([3d61448](https://github.com/voiceflow/adapters/commit/3d61448e1789f974f3eb9c93a207673289759584)) - -## [1.5.14](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.13...@voiceflow/sdk-runtime@1.5.14) (2023-01-14) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.78.0 (vf-000) ([#66](https://github.com/voiceflow/adapters/issues/66)) ([f3808f9](https://github.com/voiceflow/adapters/commit/f3808f9f95d7b0c8d6881984fcea272ba8d55867)) - -## [1.5.13](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.12...@voiceflow/sdk-runtime@1.5.13) (2023-01-10) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.77.2 (vf-000) ([#65](https://github.com/voiceflow/adapters/issues/65)) ([a12e773](https://github.com/voiceflow/adapters/commit/a12e773c042e84caf68923b41e4eb98b244289c0)) - -## [1.5.12](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.11...@voiceflow/sdk-runtime@1.5.12) (2023-01-02) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.77.1 (vf-000) ([#63](https://github.com/voiceflow/adapters/issues/63)) ([0265cd5](https://github.com/voiceflow/adapters/commit/0265cd57929bdb758eb75f9840590e1c56e0d657)) - -## [1.5.11](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.10...@voiceflow/sdk-runtime@1.5.11) (2022-12-23) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.77.0 (vf-000) ([#62](https://github.com/voiceflow/adapters/issues/62)) ([91f07ed](https://github.com/voiceflow/adapters/commit/91f07edf8b26eb87f6d15c0b3f7a8446b2a5076f)) - -## [1.5.10](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.9...@voiceflow/sdk-runtime@1.5.10) (2022-12-19) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.76.0 (vf-000) ([#61](https://github.com/voiceflow/adapters/issues/61)) ([c3dc448](https://github.com/voiceflow/adapters/commit/c3dc4489d26613f434c441ebbe1a11b76ec0736f)) - -## [1.5.9](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.8...@voiceflow/sdk-runtime@1.5.9) (2022-12-13) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.75.2 (vf-000) ([#60](https://github.com/voiceflow/adapters/issues/60)) ([d59ed33](https://github.com/voiceflow/adapters/commit/d59ed33e445b024562c941c9faa86c740fb01fa8)) - -## [1.5.8](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.7...@voiceflow/sdk-runtime@1.5.8) (2022-12-12) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.75.1 (vf-000) ([#59](https://github.com/voiceflow/adapters/issues/59)) ([9c84bb8](https://github.com/voiceflow/adapters/commit/9c84bb8cb30a0044057d7d1f17443758473e9416)) - -## [1.5.7](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.6...@voiceflow/sdk-runtime@1.5.7) (2022-12-09) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.75.0 (vf-000) ([#58](https://github.com/voiceflow/adapters/issues/58)) ([347fb4d](https://github.com/voiceflow/adapters/commit/347fb4d57d530a38a88e564ef24cfd697aad4fd4)) - -## [1.5.6](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.5...@voiceflow/sdk-runtime@1.5.6) (2022-11-29) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.74.0 (vf-000) ([#57](https://github.com/voiceflow/adapters/issues/57)) ([e17bbe3](https://github.com/voiceflow/adapters/commit/e17bbe3ba9662ca95eb586b71ecb5f7030153740)) - -## [1.5.5](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.4...@voiceflow/sdk-runtime@1.5.5) (2022-11-18) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.73.1 (vf-000) ([#56](https://github.com/voiceflow/adapters/issues/56)) ([09748c8](https://github.com/voiceflow/adapters/commit/09748c8899cef71636c9f808c9cb0efadc0096a3)) - -## [1.5.4](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.3...@voiceflow/sdk-runtime@1.5.4) (2022-11-12) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.72.0 (vf-000) ([#55](https://github.com/voiceflow/adapters/issues/55)) ([feca725](https://github.com/voiceflow/adapters/commit/feca725c5479896c0f33214d328a7aaafcf3e14b)) - -## [1.5.3](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.2...@voiceflow/sdk-runtime@1.5.3) (2022-11-01) - -### Bug Fixes - -* transcript users argument (CT-1050) ([#52](https://github.com/voiceflow/adapters/issues/52)) ([6969897](https://github.com/voiceflow/adapters/commit/69698974494263eccfe0f0e83d69fa5ada78a186)) - -## [1.5.2](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.1...@voiceflow/sdk-runtime@1.5.2) (2022-10-29) - -### Bug Fixes - -* session id headers (CT-000) ([#51](https://github.com/voiceflow/adapters/issues/51)) ([49923da](https://github.com/voiceflow/adapters/commit/49923da1e022793e6c6a250922e1848cdb3efec7)) - -## [1.5.1](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.5.0...@voiceflow/sdk-runtime@1.5.1) (2022-10-26) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.71.3 (vf-000) ([#49](https://github.com/voiceflow/adapters/issues/49)) ([5c1871b](https://github.com/voiceflow/adapters/commit/5c1871bb04c78cc042250977bda44e88d1512d8c)) - -# [1.5.0](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.4.1...@voiceflow/sdk-runtime@1.5.0) (2022-10-24) - -### Features - -* create transcripts (CT-1050) ([#48](https://github.com/voiceflow/adapters/issues/48)) ([457a228](https://github.com/voiceflow/adapters/commit/457a2285328bb75d355ed8a24e746020e5538aa6)) - -## [1.4.1](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.4.0...@voiceflow/sdk-runtime@1.4.1) (2022-10-21) - -### Bug Fixes - -* **deps:** update dependency @voiceflow/base-types to v2.71.1 (vf-000) ([#47](https://github.com/voiceflow/adapters/issues/47)) ([e984f2d](https://github.com/voiceflow/adapters/commit/e984f2dac58507a31eda1b2c05f3bdeddf3c9ef9)) - -# [1.4.0](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.3.4...@voiceflow/sdk-runtime@1.4.0) (2022-10-17) - -### Features - -* add publishing field (CT-000) ([#45](https://github.com/voiceflow/adapters/issues/45)) ([53e7d89](https://github.com/voiceflow/adapters/commit/53e7d8942c5a511ad29c0b14c3808dc117ae6066)) - -## [1.3.4](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.3.3...@voiceflow/sdk-runtime@1.3.4) (2022-10-06) - -### Bug Fixes - -* update trace types (PL-000) ([#44](https://github.com/voiceflow/adapters/issues/44)) ([ce13855](https://github.com/voiceflow/adapters/commit/ce13855668f639e710fe1781bb68f40fabcd558c)) - -## [1.3.3](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.3.2...@voiceflow/sdk-runtime@1.3.3) (2022-10-04) - -### Bug Fixes - -* update dependencies (CT-000) ([#43](https://github.com/voiceflow/adapters/issues/43)) ([792f1a0](https://github.com/voiceflow/adapters/commit/792f1a0c905924c9844e3c16cd3008c71c0185fd)) - -## [1.3.2](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.3.1...@voiceflow/sdk-runtime@1.3.2) (2022-10-04) - -### Bug Fixes - -* definitive action types (CT-1048) ([#42](https://github.com/voiceflow/adapters/issues/42)) ([8ecfa82](https://github.com/voiceflow/adapters/commit/8ecfa82efddb7652af4af4794224a83484a279c1)), closes [/github.com/voiceflow/creator-app/blob/729ff17e2d558fc43ce7140497ca0716656df33f/packages/creator-app/src/pages/Prototype/components/PrototypeDialog/utils.ts#L52-L60](https://github.com//github.com/voiceflow/creator-app/blob/729ff17e2d558fc43ce7140497ca0716656df33f/packages/creator-app/src/pages/Prototype/components/PrototypeDialog/utils.ts/issues/L52-L60) - -## [1.3.1](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.3.0...@voiceflow/sdk-runtime@1.3.1) (2022-10-03) - -### Bug Fixes - -* more lenient typing for sample use case (CT-1046) ([861de03](https://github.com/voiceflow/adapters/commit/861de03c9e05d56c0e1439c5355bb057e7f7381b)) - -# [1.3.0](https://github.com/voiceflow/adapters/compare/@voiceflow/sdk-runtime@1.2.1...@voiceflow/sdk-runtime@1.3.0) (2022-10-03) - -### Features - -* public interaction endpoint (CT-1046) ([#41](https://github.com/voiceflow/adapters/issues/41)) ([2f33365](https://github.com/voiceflow/adapters/commit/2f33365796386b4389d0400c9f9d729174e4e2f9)) - -## 1.2.1 (2022-09-06) - -**Note:** Version bump only for package @voiceflow/sdk-runtime - -# [1.2.0](https://github.com/voiceflow/adapters/compare/@voiceflow/runtime-sdk@1.1.0...@voiceflow/runtime-sdk@1.2.0) (2022-09-06) - -### Features - -* replace undici with global fetch (DX-80) ([#38](https://github.com/voiceflow/adapters/issues/38)) ([eb485d0](https://github.com/voiceflow/adapters/commit/eb485d01534640f9f25518f8395c3daf53d7b064)) - -# 1.1.0 (2022-08-08) - -### Bug Fixes - -* add missing export ([9f7e1fb](https://github.com/voiceflow/adapters/commit/9f7e1fbeee74b90a9b2d25275257ee81a8de8b1c)) -* card component ([b458f58](https://github.com/voiceflow/adapters/commit/b458f588a482195c46967d387af3df3b1a15b3d7)) -* card trace handler typings ([cf443ef](https://github.com/voiceflow/adapters/commit/cf443ef5bcbc6093823c12da788d068f0d0bb0b8)) -* choice typings ([6d28cf5](https://github.com/voiceflow/adapters/commit/6d28cf50aac781576c102168f4678205eb5b8536)) -* remove content-type header ([a27552c](https://github.com/voiceflow/adapters/commit/a27552cf0f2aaa484d9a3be78dbc83487bb74319)) -* return meta context (VF-000) ([5d20d37](https://github.com/voiceflow/adapters/commit/5d20d3787ed897d2628cfc7aa2981d005cbf84ea)) -* typings fixes ([17bd78e](https://github.com/voiceflow/adapters/commit/17bd78ebcecd75c09068a5930dd6b26bc61883ad)) - -### Features - -* add choice step component and choice handler ([6ec0d2d](https://github.com/voiceflow/adapters/commit/6ec0d2da42055d92d7d174c1eb59630911783534)) -* add choice/audio/speak steps for google adapter (VF-3675) ([#13](https://github.com/voiceflow/adapters/issues/13)) ([2e6adad](https://github.com/voiceflow/adapters/commit/2e6adad1c39229aabb03c273482ae4ef095b3e43)) -* add EndComponent to runtime-sdk ([cd60e27](https://github.com/voiceflow/adapters/commit/cd60e2703dffdc7294002b5175b3e8cfb84aa697)) -* add stream step support for google assistant (VF-3675) ([b656436](https://github.com/voiceflow/adapters/commit/b6564360e60c3b18a9b920744de633923dc9ee73)) -* improve steps, fix injection, steps, errors ([#6](https://github.com/voiceflow/adapters/issues/6)) ([067a8b0](https://github.com/voiceflow/adapters/commit/067a8b0c8cc5c7df5cebdcdf0b1c7126a59db4ca)) -* paylaod component ([9e0799e](https://github.com/voiceflow/adapters/commit/9e0799e48fae3750fa8f9f76b8111534a2757d4e)) -* setup repo, patterns (VF-000) ([#3](https://github.com/voiceflow/adapters/issues/3)) ([bbe6ab1](https://github.com/voiceflow/adapters/commit/bbe6ab1f1cac8ac1e4e62220b3ee3d222ee37004)), closes [#2](https://github.com/voiceflow/adapters/issues/2) -* typebox schemas & validator, route versioning (VF-000) ([#18](https://github.com/voiceflow/adapters/issues/18)) ([fc88193](https://github.com/voiceflow/adapters/commit/fc88193c6d74ab3f9d93c7f1d3ad17cb96e102a3)) -* zod validation pipe (VF-000) ([#11](https://github.com/voiceflow/adapters/issues/11)) ([5374d5f](https://github.com/voiceflow/adapters/commit/5374d5fc997d9215eaf0e5f0affabbe19dfc3c4b)) diff --git a/packages/sdk-runtime/package.json b/packages/sdk-runtime/package.json deleted file mode 100644 index 4916daf78c..0000000000 --- a/packages/sdk-runtime/package.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "@voiceflow/sdk-runtime", - "version": "1.11.0", - "exports": { - ".": { - "import": "./build/esm/main.js", - "default": "./build/cjs/main.js" - } - }, - "main": "build/cjs/main.js", - "types": "build/esm/main.d.ts", - "files": [ - "build" - ], - "scripts": { - "build": "yarn g:turbo run build:cmd --filter=@voiceflow/sdk-runtime...", - "build:cjs": "yarn g:build:pkg cjs", - "build:cmd": "yarn g:run-p build:cjs build:esm", - "build:esm": "yarn g:build:pkg esm", - "lint": "yarn g:run-p -c lint:eslint lint:prettier", - "lint:eslint": "yarn g:eslint", - "lint:fix": "yarn g:run-p -c \"lint:eslint --fix\" \"lint:prettier --write\"", - "lint:prettier": "yarn g:prettier --check", - "test": "yarn g:run-p -c test:dependencies test:types", - "test:dependencies": "yarn g:depcruise", - "test:types": "yarn g:tsc --noEmit" - }, - "dependencies": { - "@voiceflow/base-types": "2.113.1", - "http-errors": "2.0.0" - }, - "devDependencies": { - "@types/http-errors": "^1.8.2" - }, - "volta": { - "extends": "../../package.json" - }, - "publishConfig": { - "access": "public" - } -} diff --git a/packages/sdk-runtime/sonar-project.properties b/packages/sdk-runtime/sonar-project.properties deleted file mode 100644 index d14dc38a15..0000000000 --- a/packages/sdk-runtime/sonar-project.properties +++ /dev/null @@ -1,6 +0,0 @@ -sonar.projectName=react-chat-sdk-runtime -sonar.sources=src -sonar.eslint.reportPaths=sonar/report.json -sonar.typescript.tsconfigPath=./tsconfig.json -sonar.coverage.exclusions=**/** -#sonar.javascript.lcov.reportPaths=nyc_coverage_unit/lcov.info diff --git a/packages/sdk-runtime/src/main.ts b/packages/sdk-runtime/src/main.ts deleted file mode 100644 index 68c113d19d..0000000000 --- a/packages/sdk-runtime/src/main.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './runtime'; -export * from './sdk'; -export * from './trace'; diff --git a/packages/sdk-runtime/src/runtime/index.ts b/packages/sdk-runtime/src/runtime/index.ts deleted file mode 100644 index c971f5a9ad..0000000000 --- a/packages/sdk-runtime/src/runtime/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from './runtime.interface'; -export * from './runtime.service'; -export * from './runtime.service.auth'; -export * from './runtime.service.prototype'; -export * from './runtime.service.public'; diff --git a/packages/sdk-runtime/src/runtime/runtime.interface.ts b/packages/sdk-runtime/src/runtime/runtime.interface.ts deleted file mode 100644 index 776b1d499f..0000000000 --- a/packages/sdk-runtime/src/runtime/runtime.interface.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { BaseRequest, Trace } from '@voiceflow/base-types'; - -export { Trace } from '@voiceflow/base-types'; - -// Super broad type so that differing fetch types (ex. builtin, node-fetch, etc.) don't conflict with it -type FetchFn = (...parameters: any[]) => Promise; - -export interface RuntimeOptions { - url: string; - verify: V; - - /** - * A ponyfill to use for `fetch()`. - * Defaults to the global `fetch()`. - */ - fetchPonyfill?: FetchFn; -} - -export interface AuthVerify { - authorization: string; -} - -export interface PublicVerify { - projectID: string; - chatVersion?: number; -} - -export interface PrototypeVerify { - projectID: string; - versionID: string; - prototype: true; -} - -export type AnyVerify = Partial; - -export const isAuthRuntimeOptions = (options: RuntimeOptions): options is RuntimeOptions => { - return !!options?.verify?.authorization; -}; - -export const isPublicRuntimeOptions = (options: RuntimeOptions): options is RuntimeOptions => { - return typeof options?.verify?.projectID === 'string'; -}; - -export const isPrototypeRuntimeOptions = ( - options: RuntimeOptions -): options is RuntimeOptions => { - return ( - options?.verify?.prototype === true && - typeof options?.verify?.versionID === 'string' && - typeof options?.verify?.projectID === 'string' - ); -}; - -export interface RuntimeInteractRequest { - action: RuntimeAction; - sessionID: string; - versionID?: string; - config?: any; -} - -export interface RuntimeFeedbackRequest { - name: string; - sessionID: string; - versionID?: string; - - [key: string]: any; -} - -export interface RuntimeInteractResponse { - state: RuntimeState; - request: RuntimeAction; - trace: Trace.AnyTrace[]; -} - -export type RuntimeAction = - | BaseRequest.TextRequest - | BaseRequest.LaunchRequest - | BaseRequest.IntentRequest - | BaseRequest.ActionRequest - | BaseRequest.GeneralRequest - | BaseRequest.BaseRequest; - -export const isRuntimeAction = (value: unknown): value is RuntimeAction => - typeof value === 'object' && Object.prototype.hasOwnProperty.call(value, 'type'); - -export interface IntentActionPayload { - query: string; - intent: { name: string }; - entities: { name: string; value: string }[]; - confidence?: number; -} - -export type IntentAction = BaseRequest.IntentRequest; -export type ActionType = BaseRequest.RequestType; -export const ActionType = BaseRequest.RequestType; - -export const createIntentAction = (payload: BaseRequest.IntentRequestPayload): BaseRequest.IntentRequest => ({ - type: ActionType.INTENT, - payload, -}); - -export interface RuntimeState { - turn: Record; - storage: Record; - variables: Record; -} - -export const isRuntimeTraceType = (value: unknown): value is Trace.TraceType => - typeof value === 'string' && Object.values(Trace.TraceType).includes(value); - -export const isRuntimeTrace = (value: unknown): value is Trace.BaseTraceFrame => - typeof value === 'object' && - Object.prototype.hasOwnProperty.call(value, 'type') && - isRuntimeTraceType((value as any).type); - -export interface RuntimeHttpRequest { - method?: string; - params?: URLSearchParams; - body?: any; - headers?: HeadersInit; -} diff --git a/packages/sdk-runtime/src/runtime/runtime.service.auth.ts b/packages/sdk-runtime/src/runtime/runtime.service.auth.ts deleted file mode 100644 index e07eb5800c..0000000000 --- a/packages/sdk-runtime/src/runtime/runtime.service.auth.ts +++ /dev/null @@ -1,46 +0,0 @@ -import type { - AuthVerify, - RuntimeInteractRequest, - RuntimeInteractResponse, - RuntimeOptions, -} from '@/runtime/runtime.interface'; -import { RuntimeService } from '@/runtime/runtime.service'; - -export class AuthRuntimeService extends RuntimeService { - private readonly authorization: string; - - public constructor(options: RuntimeOptions) { - super(options); - - this.authorization = options.verify.authorization; - } - - public async interact(request: RuntimeInteractRequest): Promise { - const { action, config, sessionID, versionID } = request; - - return this.send(`state/user/${encodeURIComponent(sessionID)}/interact`, { - method: 'POST', - body: { action, config }, - headers: { - authorization: this.authorization, - sessionID, - ...(versionID ? { versionID } : {}), - }, - params: new URLSearchParams({ verbose: 'true' }), - }); - } - - public async feedback() { - return Promise.reject(new Error('not implemented')); - } - - // TODO: expose authenticated publishing - public getPublishing() { - return Promise.reject(new Error('not implemented')); - } - - // TODO: expose authenticated createTranscript - public createTranscript() { - return Promise.reject(new Error('not implemented')); - } -} diff --git a/packages/sdk-runtime/src/runtime/runtime.service.prototype.ts b/packages/sdk-runtime/src/runtime/runtime.service.prototype.ts deleted file mode 100644 index af17c394c5..0000000000 --- a/packages/sdk-runtime/src/runtime/runtime.service.prototype.ts +++ /dev/null @@ -1,52 +0,0 @@ -import type { - PrototypeVerify, - RuntimeInteractRequest, - RuntimeInteractResponse, - RuntimeOptions, - RuntimeState, -} from '@/runtime/runtime.interface'; -import { RuntimeService } from '@/runtime/runtime.service'; - -export class PrototypeRuntimeService extends RuntimeService { - private state: RuntimeState = { - turn: {}, - storage: {}, - variables: {}, - }; - - private readonly versionID: string; - - public constructor(options: RuntimeOptions) { - super(options); - - this.versionID = options.verify.versionID; - } - - public async interact(request: RuntimeInteractRequest): Promise { - const { action, config, sessionID } = request; - - const result = await this.send(`interact/${this.versionID}`, { - body: { state: this.state, request: action, config }, - method: 'POST', - headers: { sessionID, platform: 'chat-prototype' }, - }); - - this.state = result.state; - - return result; - } - - public async feedback() { - return Promise.reject(new Error('not implemented')); - } - - // TODO: expose authenticated publishing - public getPublishing() { - return Promise.reject(new Error('not implemented')); - } - - // TODO: expose authenticated createTranscript - public createTranscript() { - return Promise.reject(new Error('not implemented')); - } -} diff --git a/packages/sdk-runtime/src/runtime/runtime.service.public.ts b/packages/sdk-runtime/src/runtime/runtime.service.public.ts deleted file mode 100644 index add81f045f..0000000000 --- a/packages/sdk-runtime/src/runtime/runtime.service.public.ts +++ /dev/null @@ -1,74 +0,0 @@ -import type { BaseModels } from '@voiceflow/base-types'; - -import type { - PublicVerify, - RuntimeFeedbackRequest, - RuntimeInteractRequest, - RuntimeInteractResponse, - RuntimeOptions, -} from '@/runtime/runtime.interface'; -import { RuntimeService } from '@/runtime/runtime.service'; - -export class PublicRuntimeService extends RuntimeService { - private readonly projectID: string; - - private readonly chatVersion: number | undefined; - - public constructor(options: RuntimeOptions) { - super(options); - - this.projectID = options.verify.projectID; - this.chatVersion = options.verify.chatVersion; - } - - public async interact(request: RuntimeInteractRequest): Promise> { - const { action, config, sessionID, versionID } = request; - - return this.send>( - `public/${this.projectID}/state/user/${encodeURIComponent(sessionID)}/interact`, - { - method: 'POST', - body: { action, config }, - headers: { - ...(versionID && { versionID }), - }, - } - ); - } - - public async feedback(request: RuntimeFeedbackRequest): Promise { - const { versionID, sessionID, ...body } = request; - - await this.send(`feedback/${this.projectID}/user/${encodeURIComponent(sessionID)}`, { - method: 'POST', - body, - headers: { - ...(versionID && { versionID }), - }, - }); - } - - public async getPublishing>(request: { - versionID?: string; - chatVersion?: number; - }): Promise { - const { versionID, chatVersion } = request; - - const settingsUrl = - chatVersion === 2 ? `v2/public/${this.projectID}/settings/widget` : `public/${this.projectID}/publishing`; - - return this.send(settingsUrl, { - method: 'GET', - headers: { - ...(versionID ? { versionID } : {}), - }, - }); - } - - public async createTranscript(sessionID: string, metadata: { os?: string; device?: string; browser?: string }) { - return this.send(`public/${this.projectID}/transcripts`, { - method: 'POST', - body: { ...metadata, sessionID }, - }); - } -} diff --git a/packages/sdk-runtime/src/runtime/runtime.service.ts b/packages/sdk-runtime/src/runtime/runtime.service.ts deleted file mode 100644 index d96dc3dd5c..0000000000 --- a/packages/sdk-runtime/src/runtime/runtime.service.ts +++ /dev/null @@ -1,66 +0,0 @@ -import type { BaseModels } from '@voiceflow/base-types'; -import createHTTPError from 'http-errors'; - -import type { - RuntimeFeedbackRequest, - RuntimeHttpRequest, - RuntimeInteractRequest, - RuntimeInteractResponse, - RuntimeOptions, -} from './runtime.interface'; - -export abstract class RuntimeService { - private readonly fetch: typeof globalThis.fetch; - - public constructor(private readonly options: RuntimeOptions) { - this.fetch = options.fetchPonyfill ?? globalThis.fetch?.bind(globalThis); - if (!this.fetch) { - throw new TypeError('fetch implementation was not provided and a global fetch was not available'); - } - } - - public abstract getPublishing>(request: { - versionID?: string; - chatVersion?: number; - }): Promise; - - public abstract createTranscript( - sessionID: string, - metadata: { - os?: string; - user?: { - name?: string; - image?: string; - }; - device?: string; - browser?: string; - } - ): Promise; - - public abstract interact( - request: RuntimeInteractRequest - ): Promise & Pick>; - - public abstract feedback(request: RuntimeFeedbackRequest): Promise; - - protected async send(path: string, args: RuntimeHttpRequest = {}): Promise { - const url = new URL(path, this.options.url); - if (args.params) url.search = args.params.toString(); - - const result = await this.fetch(url, { - method: args.method ?? 'GET', - body: args.body ? JSON.stringify(args.body) : undefined, - headers: { - 'content-type': 'application/json', - ...(args.headers ?? {}), - }, - }); - - const json = (await result.json().catch(() => null)) as any; - if (!result.ok) { - throw createHTTPError(result.status, result.statusText, json); - } - - return json; - } -} diff --git a/packages/sdk-runtime/src/sdk/index.ts b/packages/sdk-runtime/src/sdk/index.ts deleted file mode 100644 index df1e88e380..0000000000 --- a/packages/sdk-runtime/src/sdk/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './sdk.interface'; -export * from './sdk.service'; diff --git a/packages/sdk-runtime/src/sdk/sdk.interface.ts b/packages/sdk-runtime/src/sdk/sdk.interface.ts deleted file mode 100644 index 46177e8eff..0000000000 --- a/packages/sdk-runtime/src/sdk/sdk.interface.ts +++ /dev/null @@ -1,4 +0,0 @@ -import type { RuntimeOptions } from '@/runtime/runtime.interface'; -import type { TraceOptions } from '@/trace/trace.interface'; - -export type VoiceflowRuntimeOptions = RuntimeOptions & TraceOptions; diff --git a/packages/sdk-runtime/src/sdk/sdk.service.ts b/packages/sdk-runtime/src/sdk/sdk.service.ts deleted file mode 100644 index 9a039b3a4f..0000000000 --- a/packages/sdk-runtime/src/sdk/sdk.service.ts +++ /dev/null @@ -1,57 +0,0 @@ -import type { RuntimeFeedbackRequest, RuntimeInteractRequest, RuntimeService } from '@/runtime'; -import { - AuthRuntimeService, - isAuthRuntimeOptions, - isPrototypeRuntimeOptions, - isPublicRuntimeOptions, - PrototypeRuntimeService, - PublicRuntimeService, -} from '@/runtime'; -import type { TraceDeclaration } from '@/trace/trace.interface'; -import { TraceService } from '@/trace/trace.service'; - -import type { VoiceflowRuntimeOptions } from './sdk.interface'; - -export class VoiceflowRuntime { - private readonly runtime: RuntimeService; - - private readonly trace: TraceService; - - public constructor(options: VoiceflowRuntimeOptions) { - this.trace = new TraceService(options); - - if (isPrototypeRuntimeOptions(options)) { - this.runtime = new PrototypeRuntimeService(options); - } else if (isAuthRuntimeOptions(options)) { - this.runtime = new AuthRuntimeService(options); - } else if (isPublicRuntimeOptions(options)) { - this.runtime = new PublicRuntimeService(options); - } else { - throw new Error('invalid runtime options'); - } - } - - public registerStep(step: TraceDeclaration) { - this.trace.registerTrace(step); - return this; - } - - public async interact(context: T, request: RuntimeInteractRequest): Promise { - const response = await this.runtime.interact(request); - return this.trace.processTrace(context, response); - } - - public async feedback(request: RuntimeFeedbackRequest) { - return this.runtime.feedback(request); - } - - public async getPublishing>( - ...options: Parameters - ) { - return this.runtime.getPublishing(...options); - } - - public async createTranscript(...options: Parameters) { - return this.runtime.createTranscript(...options); - } -} diff --git a/packages/sdk-runtime/src/trace/components/card.component.ts b/packages/sdk-runtime/src/trace/components/card.component.ts deleted file mode 100644 index 7a57b0d050..0000000000 --- a/packages/sdk-runtime/src/trace/components/card.component.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { BaseNode } from '@voiceflow/base-types'; - -import { createTraceComponent } from '../trace.component'; - -export const CardTraceComponent = createTraceComponent<{ type: 'card'; payload: { card: BaseNode.Card.Card } }>('card'); diff --git a/packages/sdk-runtime/src/trace/components/cardV2.component.ts b/packages/sdk-runtime/src/trace/components/cardV2.component.ts deleted file mode 100644 index 2d51a10a0c..0000000000 --- a/packages/sdk-runtime/src/trace/components/cardV2.component.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Trace } from '@/runtime/runtime.interface'; - -import { createTraceComponent } from '../trace.component'; - -export const CardV2TraceComponent = createTraceComponent(Trace.TraceType.CARD_V2); diff --git a/packages/sdk-runtime/src/trace/components/choice.component.ts b/packages/sdk-runtime/src/trace/components/choice.component.ts deleted file mode 100644 index 02abd16d0b..0000000000 --- a/packages/sdk-runtime/src/trace/components/choice.component.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Trace } from '@/runtime/runtime.interface'; - -import { createTraceComponent } from '../trace.component'; - -export const ChoiceTraceComponent = createTraceComponent(Trace.TraceType.CHOICE); diff --git a/packages/sdk-runtime/src/trace/components/end.component.ts b/packages/sdk-runtime/src/trace/components/end.component.ts deleted file mode 100644 index 2c126e8dc1..0000000000 --- a/packages/sdk-runtime/src/trace/components/end.component.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Trace } from '@/runtime/runtime.interface'; - -import { createTraceComponent } from '../trace.component'; - -export const EndTraceComponent = createTraceComponent(Trace.TraceType.END); diff --git a/packages/sdk-runtime/src/trace/components/index.ts b/packages/sdk-runtime/src/trace/components/index.ts deleted file mode 100644 index f7072eda90..0000000000 --- a/packages/sdk-runtime/src/trace/components/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * from './card.component'; -export * from './cardV2.component'; -export * from './choice.component'; -export * from './end.component'; -export * from './speak.component'; -export * from './stream.component'; -export * from './text.component'; -export * from './visual.component'; diff --git a/packages/sdk-runtime/src/trace/components/speak.component.ts b/packages/sdk-runtime/src/trace/components/speak.component.ts deleted file mode 100644 index 026e071c3f..0000000000 --- a/packages/sdk-runtime/src/trace/components/speak.component.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Trace } from '@/runtime/runtime.interface'; - -import { createTraceComponent } from '../trace.component'; - -export const SpeakTraceComponent = createTraceComponent(Trace.TraceType.SPEAK); diff --git a/packages/sdk-runtime/src/trace/components/stream.component.ts b/packages/sdk-runtime/src/trace/components/stream.component.ts deleted file mode 100644 index 4a90816c04..0000000000 --- a/packages/sdk-runtime/src/trace/components/stream.component.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Trace } from '@/runtime/runtime.interface'; - -import { createTraceComponent } from '../trace.component'; - -export const StreamTraceComponent = createTraceComponent(Trace.TraceType.STREAM); diff --git a/packages/sdk-runtime/src/trace/components/text.component.ts b/packages/sdk-runtime/src/trace/components/text.component.ts deleted file mode 100644 index 10a3bcbbdb..0000000000 --- a/packages/sdk-runtime/src/trace/components/text.component.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Trace } from '@/runtime/runtime.interface'; - -import { createTraceComponent } from '../trace.component'; - -export const TextTraceComponent = createTraceComponent(Trace.TraceType.TEXT); diff --git a/packages/sdk-runtime/src/trace/components/visual.component.ts b/packages/sdk-runtime/src/trace/components/visual.component.ts deleted file mode 100644 index 14c34dee99..0000000000 --- a/packages/sdk-runtime/src/trace/components/visual.component.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { BaseNode } from '@voiceflow/base-types'; - -import { Trace } from '@/runtime/runtime.interface'; - -import { createTraceComponent } from '../trace.component'; - -export const VisualTraceComponent = createTraceComponent( - Trace.TraceType.VISUAL -); diff --git a/packages/sdk-runtime/src/trace/index.ts b/packages/sdk-runtime/src/trace/index.ts deleted file mode 100644 index 564f3fa191..0000000000 --- a/packages/sdk-runtime/src/trace/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './components'; -export * from './trace.component'; -export * from './trace.interface'; -export * from './trace.service'; diff --git a/packages/sdk-runtime/src/trace/trace.component.ts b/packages/sdk-runtime/src/trace/trace.component.ts deleted file mode 100644 index d0f611510b..0000000000 --- a/packages/sdk-runtime/src/trace/trace.component.ts +++ /dev/null @@ -1,21 +0,0 @@ -import type { Trace } from '@/runtime/runtime.interface'; - -import type { TraceAccumulator, TraceDeclaration } from './trace.interface'; - -export interface TraceComponentOverload { - (declaration: TraceDeclaration): Required>; - (handle: TraceAccumulator): Required>; -} - -export const createTraceComponent = - (type: T['type']): TraceComponentOverload => - (handle: TraceDeclaration | TraceAccumulator): TraceDeclaration => { - if (typeof handle === 'function') { - return { - canHandle: (trace) => trace.type === type, - handle, - }; - } - - return handle; - }; diff --git a/packages/sdk-runtime/src/trace/trace.interface.ts b/packages/sdk-runtime/src/trace/trace.interface.ts deleted file mode 100644 index a036f095dc..0000000000 --- a/packages/sdk-runtime/src/trace/trace.interface.ts +++ /dev/null @@ -1,21 +0,0 @@ -import type { Trace } from '@/runtime/runtime.interface'; - -export interface TraceOptions { - traces?: TraceDeclaration[]; -} - -export interface TraceDeclaration { - canHandle: TraceCanHandle; - handle: TraceAccumulator; -} - -export type TraceCanHandle = (trace: T) => boolean; - -export interface TraceHandlerMeta { - context: Context; -} - -export type TraceAccumulator = ( - meta: TraceHandlerMeta, - trace: T -) => Context; diff --git a/packages/sdk-runtime/src/trace/trace.service.ts b/packages/sdk-runtime/src/trace/trace.service.ts deleted file mode 100644 index 1eb510f863..0000000000 --- a/packages/sdk-runtime/src/trace/trace.service.ts +++ /dev/null @@ -1,34 +0,0 @@ -import type { RuntimeInteractResponse } from '@/runtime/runtime.interface'; - -import type { TraceDeclaration, TraceHandlerMeta, TraceOptions } from './trace.interface'; - -export class TraceService { - private readonly traces: TraceDeclaration[] = []; - - public constructor(options: TraceOptions = {}) { - this.registerTraces(options.traces ?? []); - } - - public registerTrace(step: TraceDeclaration): this { - this.traces.push(step); - return this; - } - - public registerTraces(steps: TraceDeclaration[]): this { - steps.forEach((step) => this.registerTrace(step)); - return this; - } - - public async processTrace(context: T, response: Pick): Promise { - const meta: TraceHandlerMeta = { context }; - - for (const trace of response.trace) { - const step = this.traces.find((step) => step.canHandle(trace)); - if (step) { - // eslint-disable-next-line no-await-in-loop - meta.context = await step.handle(meta, trace); - } - } - return meta.context; - } -} diff --git a/packages/sdk-runtime/tsconfig.build.cjs.json b/packages/sdk-runtime/tsconfig.build.cjs.json deleted file mode 100644 index d7ccec6d85..0000000000 --- a/packages/sdk-runtime/tsconfig.build.cjs.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "extends": "./tsconfig.build.json", - "compilerOptions": { - "module": "commonjs", - "outDir": "build/cjs" - } -} diff --git a/packages/sdk-runtime/tsconfig.build.esm.json b/packages/sdk-runtime/tsconfig.build.esm.json deleted file mode 100644 index bff926ea0a..0000000000 --- a/packages/sdk-runtime/tsconfig.build.esm.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "extends": "./tsconfig.build.json", - "compilerOptions": { - "module": "esnext", - "outDir": "build/esm" - }, - "tsc-alias": { - "resolveFullPaths": true - } -} diff --git a/packages/sdk-runtime/tsconfig.build.json b/packages/sdk-runtime/tsconfig.build.json deleted file mode 100644 index 468375d3e1..0000000000 --- a/packages/sdk-runtime/tsconfig.build.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "extends": "./tsconfig.json", - "include": ["src"], - "exclude": ["**/*.test.ts"] -} diff --git a/packages/sdk-runtime/tsconfig.json b/packages/sdk-runtime/tsconfig.json deleted file mode 100644 index b8c1c2e023..0000000000 --- a/packages/sdk-runtime/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "extends": "@voiceflow/tsconfig", - "compilerOptions": { - "baseUrl": ".", - "isolatedModules": false, - "experimentalDecorators": true, - "emitDecoratorMetadata": true, - "types": [], - "paths": { - "@/*": ["src/*"] - } - }, - "exclude": ["node_modules", "build"] -} diff --git a/yarn.lock b/yarn.lock index b5de68b400..55feb526ac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -39,23 +39,6 @@ __metadata: languageName: node linkType: hard -"@antfu/install-pkg@npm:^0.4.0": - version: 0.4.1 - resolution: "@antfu/install-pkg@npm:0.4.1" - dependencies: - package-manager-detector: ^0.2.0 - tinyexec: ^0.3.0 - checksum: 3ffd59fa5a21dcb4951a037f5c91dfbfc152adfef9e7ba231a968f108aa28c1cd22213c437a8d34f2bfea8c2b9a6df20447eb04be15b534a8e9e21a9dcf203c0 - languageName: node - linkType: hard - -"@antfu/utils@npm:^0.7.10": - version: 0.7.10 - resolution: "@antfu/utils@npm:0.7.10" - checksum: b93dd9e2c7e96ae6dca8a07c1fc5e7165ea9c7a89e78ecb75959bc9a8e769d3f565aea1b5c43db7374dd1f405cc277b6d14d85f884886f9d424dd6144d9203f2 - languageName: node - linkType: hard - "@assemblyscript/loader@npm:0.19.22": version: 0.19.22 resolution: "@assemblyscript/loader@npm:0.19.22" @@ -516,13 +499,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-plugin-utils@npm:7.24.8" - checksum: 73b1a83ba8bcee21dc94de2eb7323207391715e4369fd55844bb15cf13e3df6f3d13a40786d990e6370bf0f571d94fc31f70dec96c1d1002058258c35ca3767a - languageName: node - linkType: hard - "@babel/helper-remap-async-to-generator@npm:^7.22.20": version: 7.22.20 resolution: "@babel/helper-remap-async-to-generator@npm:7.22.20" @@ -1054,17 +1030,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.23.3": - version: 7.25.4 - resolution: "@babel/plugin-syntax-typescript@npm:7.25.4" - dependencies: - "@babel/helper-plugin-utils": ^7.24.8 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 9b89b8930cd5983f64251d75c9fcdc17a8dc73837d6de12220ff972888ecff4054a6467cf0c423cad242aa96c0f0564a39a0823073728cc02239b80d13f02230 - languageName: node - linkType: hard - "@babel/plugin-syntax-typescript@npm:^7.24.1": version: 7.24.1 resolution: "@babel/plugin-syntax-typescript@npm:7.24.1" @@ -2083,15 +2048,6 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.3.1": - version: 7.25.7 - resolution: "@babel/runtime@npm:7.25.7" - dependencies: - regenerator-runtime: ^0.14.0 - checksum: 1d6133ed1cf1de1533cfe84a4a8f94525271a0d93f6af4f2cdae14884ec3c8a7148664ddf7fd2a14f82cc4485904a1761821a55875ad241c8b4034e95e7134b2 - languageName: node - linkType: hard - "@babel/runtime@npm:^7.9.2": version: 7.19.0 resolution: "@babel/runtime@npm:7.19.0" @@ -2206,55 +2162,6 @@ __metadata: languageName: node linkType: hard -"@braintree/sanitize-url@npm:^7.0.1": - version: 7.1.0 - resolution: "@braintree/sanitize-url@npm:7.1.0" - checksum: d17dcebc759278f4bc7ffbc13d6b7915133ea6fcdea023a1536f80c0b56f7afcd696a7c24781d078babc0da8afd3ed2871798b8067b0e1c90c2d8bd7843134cf - languageName: node - linkType: hard - -"@chevrotain/cst-dts-gen@npm:11.0.3": - version: 11.0.3 - resolution: "@chevrotain/cst-dts-gen@npm:11.0.3" - dependencies: - "@chevrotain/gast": 11.0.3 - "@chevrotain/types": 11.0.3 - lodash-es: 4.17.21 - checksum: 414229a827e06b4564e271ca3a02ed6f475d400a184dc5ae05308bbc6e966959b84a40a063dacf7debd8f9a1dba5bf8785a891e7b588eafd9f821b43ec16b109 - languageName: node - linkType: hard - -"@chevrotain/gast@npm:11.0.3": - version: 11.0.3 - resolution: "@chevrotain/gast@npm:11.0.3" - dependencies: - "@chevrotain/types": 11.0.3 - lodash-es: 4.17.21 - checksum: 5190ba3a3f03f6f58331dbd108c36172b90314f60675b88dfefca25f704549164577796a1127fa407dd546aefa9f221d6c043e5b95298a0852ffd060b4fff117 - languageName: node - linkType: hard - -"@chevrotain/regexp-to-ast@npm:11.0.3": - version: 11.0.3 - resolution: "@chevrotain/regexp-to-ast@npm:11.0.3" - checksum: 5d665b3340493e302f245c9bbcd73de9b973ca79d0e59c4fbed6cc733b665998b41a2b8a5963bc2e90c763c8b4ba30f6e53736325c40f3fccef0ad3de2095ff2 - languageName: node - linkType: hard - -"@chevrotain/types@npm:11.0.3": - version: 11.0.3 - resolution: "@chevrotain/types@npm:11.0.3" - checksum: 4496bf1955f1db2b08c188f508db23d9f1cbecdf0bfa7f23f8d8dcd3f9ca450529b71acc83a941c59c0f8188b54c0f5687f6e203dcd7dca622ac4ea6291df316 - languageName: node - linkType: hard - -"@chevrotain/utils@npm:11.0.3": - version: 11.0.3 - resolution: "@chevrotain/utils@npm:11.0.3" - checksum: 099f0aa65ff82a7d49ffefd7a90182efcc1518b89b88d516d2125ca730eaa38d61e36ee40fad6c21f7896b6e8393b1e6810b6a69122fabff283f0522ee49eaa5 - languageName: node - linkType: hard - "@colors/colors@npm:1.5.0": version: 1.5.0 resolution: "@colors/colors@npm:1.5.0" @@ -2507,13 +2414,6 @@ __metadata: languageName: node linkType: hard -"@emotion/hash@npm:^0.9.0": - version: 0.9.2 - resolution: "@emotion/hash@npm:0.9.2" - checksum: 379bde2830ccb0328c2617ec009642321c0e009a46aa383dfbe75b679c6aea977ca698c832d225a893901f29d7b3eef0e38cf341f560f6b2b56f1ff23c172387 - languageName: node - linkType: hard - "@emotion/is-prop-valid@npm:^1.2.1": version: 1.2.2 resolution: "@emotion/is-prop-valid@npm:1.2.2" @@ -2626,20 +2526,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/aix-ppc64@npm:0.21.5" - conditions: os=aix & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/aix-ppc64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/aix-ppc64@npm:0.23.1" - conditions: os=aix & cpu=ppc64 - languageName: node - linkType: hard - "@esbuild/android-arm64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/android-arm64@npm:0.17.19" @@ -2661,20 +2547,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/android-arm64@npm:0.21.5" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/android-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/android-arm64@npm:0.23.1" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/android-arm@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/android-arm@npm:0.17.19" @@ -2696,20 +2568,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/android-arm@npm:0.21.5" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@esbuild/android-arm@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/android-arm@npm:0.23.1" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - "@esbuild/android-x64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/android-x64@npm:0.17.19" @@ -2731,20 +2589,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/android-x64@npm:0.21.5" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/android-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/android-x64@npm:0.23.1" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - "@esbuild/darwin-arm64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/darwin-arm64@npm:0.17.19" @@ -2766,20 +2610,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/darwin-arm64@npm:0.21.5" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/darwin-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/darwin-arm64@npm:0.23.1" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/darwin-x64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/darwin-x64@npm:0.17.19" @@ -2801,20 +2631,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/darwin-x64@npm:0.21.5" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/darwin-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/darwin-x64@npm:0.23.1" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - "@esbuild/freebsd-arm64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/freebsd-arm64@npm:0.17.19" @@ -2836,20 +2652,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/freebsd-arm64@npm:0.21.5" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/freebsd-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/freebsd-arm64@npm:0.23.1" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/freebsd-x64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/freebsd-x64@npm:0.17.19" @@ -2871,20 +2673,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/freebsd-x64@npm:0.21.5" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/freebsd-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/freebsd-x64@npm:0.23.1" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/linux-arm64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-arm64@npm:0.17.19" @@ -2906,20 +2694,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-arm64@npm:0.21.5" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/linux-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-arm64@npm:0.23.1" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/linux-arm@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-arm@npm:0.17.19" @@ -2941,20 +2715,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-arm@npm:0.21.5" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@esbuild/linux-arm@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-arm@npm:0.23.1" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - "@esbuild/linux-ia32@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-ia32@npm:0.17.19" @@ -2976,20 +2736,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-ia32@npm:0.21.5" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/linux-ia32@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-ia32@npm:0.23.1" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - "@esbuild/linux-loong64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-loong64@npm:0.17.19" @@ -3011,20 +2757,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-loong64@npm:0.21.5" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - -"@esbuild/linux-loong64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-loong64@npm:0.23.1" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - "@esbuild/linux-mips64el@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-mips64el@npm:0.17.19" @@ -3046,20 +2778,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-mips64el@npm:0.21.5" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - -"@esbuild/linux-mips64el@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-mips64el@npm:0.23.1" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - "@esbuild/linux-ppc64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-ppc64@npm:0.17.19" @@ -3081,20 +2799,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-ppc64@npm:0.21.5" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/linux-ppc64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-ppc64@npm:0.23.1" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - "@esbuild/linux-riscv64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-riscv64@npm:0.17.19" @@ -3116,20 +2820,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-riscv64@npm:0.21.5" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - -"@esbuild/linux-riscv64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-riscv64@npm:0.23.1" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - "@esbuild/linux-s390x@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-s390x@npm:0.17.19" @@ -3151,20 +2841,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-s390x@npm:0.21.5" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - -"@esbuild/linux-s390x@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-s390x@npm:0.23.1" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - "@esbuild/linux-x64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-x64@npm:0.17.19" @@ -3186,20 +2862,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-x64@npm:0.21.5" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/linux-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/linux-x64@npm:0.23.1" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - "@esbuild/netbsd-x64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/netbsd-x64@npm:0.17.19" @@ -3221,27 +2883,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/netbsd-x64@npm:0.21.5" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/netbsd-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/netbsd-x64@npm:0.23.1" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openbsd-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/openbsd-arm64@npm:0.23.1" - conditions: os=openbsd & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/openbsd-x64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/openbsd-x64@npm:0.17.19" @@ -3263,20 +2904,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/openbsd-x64@npm:0.21.5" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openbsd-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/openbsd-x64@npm:0.23.1" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/sunos-x64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/sunos-x64@npm:0.17.19" @@ -3298,20 +2925,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/sunos-x64@npm:0.21.5" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/sunos-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/sunos-x64@npm:0.23.1" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - "@esbuild/win32-arm64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/win32-arm64@npm:0.17.19" @@ -3333,20 +2946,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/win32-arm64@npm:0.21.5" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/win32-arm64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/win32-arm64@npm:0.23.1" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/win32-ia32@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/win32-ia32@npm:0.17.19" @@ -3368,20 +2967,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/win32-ia32@npm:0.21.5" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/win32-ia32@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/win32-ia32@npm:0.23.1" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - "@esbuild/win32-x64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/win32-x64@npm:0.17.19" @@ -3403,20 +2988,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/win32-x64@npm:0.21.5" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/win32-x64@npm:0.23.1": - version: 0.23.1 - resolution: "@esbuild/win32-x64@npm:0.23.1" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" @@ -3483,95 +3054,28 @@ __metadata: languageName: node linkType: hard -"@floating-ui/core@npm:^1.6.0": - version: 1.6.8 - resolution: "@floating-ui/core@npm:1.6.8" - dependencies: - "@floating-ui/utils": ^0.2.8 - checksum: 82faa6ea9d57e466779324e51308d6d49c098fb9d184a08d9bb7f4fad83f08cc070fc491f8d56f0cad44a16215fb43f9f829524288413e6c33afcb17303698de +"@gar/promisify@npm:^1.1.3": + version: 1.1.3 + resolution: "@gar/promisify@npm:1.1.3" + checksum: 4059f790e2d07bf3c3ff3e0fec0daa8144fe35c1f6e0111c9921bd32106adaa97a4ab096ad7dab1e28ee6a9060083c4d1a4ada42a7f5f3f7a96b8812e2b757c1 languageName: node linkType: hard -"@floating-ui/dom@npm:^1.0.0": - version: 1.6.11 - resolution: "@floating-ui/dom@npm:1.6.11" +"@humanwhocodes/config-array@npm:^0.12.3": + version: 0.12.3 + resolution: "@humanwhocodes/config-array@npm:0.12.3" dependencies: - "@floating-ui/core": ^1.6.0 - "@floating-ui/utils": ^0.2.8 - checksum: d6413759abd06a541edfad829c45313f930310fe76a3322e74a00eb655e283db33fe3e65b5265c4072eb54db7447e11225acd355a9a02cabd1d1b0d5fc8fc21d + "@humanwhocodes/object-schema": ^2.0.3 + debug: ^4.3.1 + minimatch: ^3.0.5 + checksum: 4212cf12567538675f45f09dae9715978fac805fbc6f194ce31e62dbbe01ca286b87478463c042883bf4451998be737012dd0882530f55ad0c0e901d963b5123 languageName: node linkType: hard -"@floating-ui/react-dom@npm:^2.1.2": - version: 2.1.2 - resolution: "@floating-ui/react-dom@npm:2.1.2" - dependencies: - "@floating-ui/dom": ^1.0.0 - peerDependencies: - react: ">=16.8.0" - react-dom: ">=16.8.0" - checksum: 25bb031686e23062ed4222a8946e76b3f9021d40a48437bd747233c4964a766204b8a55f34fa8b259839af96e60db7c6e3714d81f1de06914294f90e86ffbc48 - languageName: node - linkType: hard - -"@floating-ui/react@npm:^0.26.16": - version: 0.26.24 - resolution: "@floating-ui/react@npm:0.26.24" - dependencies: - "@floating-ui/react-dom": ^2.1.2 - "@floating-ui/utils": ^0.2.8 - tabbable: ^6.0.0 - peerDependencies: - react: ">=16.8.0" - react-dom: ">=16.8.0" - checksum: c49fc0040d0a75608dc8f9b259027fbaebc8b04bc791b4ec38c680b551fffeaa19dac945ac5d10f75570862159353f0aab78451e1ecc59e0abea6f07251d4504 - languageName: node - linkType: hard - -"@floating-ui/utils@npm:^0.2.8": - version: 0.2.8 - resolution: "@floating-ui/utils@npm:0.2.8" - checksum: deb98bba017c4e073c7ad5740d4dec33a4d3e0942d412e677ac0504f3dade15a68fc6fd164d43c93c0bb0bcc5dc5015c1f4080dfb1a6161140fe660624f7c875 - languageName: node - linkType: hard - -"@gar/promisify@npm:^1.1.3": - version: 1.1.3 - resolution: "@gar/promisify@npm:1.1.3" - checksum: 4059f790e2d07bf3c3ff3e0fec0daa8144fe35c1f6e0111c9921bd32106adaa97a4ab096ad7dab1e28ee6a9060083c4d1a4ada42a7f5f3f7a96b8812e2b757c1 - languageName: node - linkType: hard - -"@headlessui/react@npm:^2.1.2": - version: 2.1.8 - resolution: "@headlessui/react@npm:2.1.8" - dependencies: - "@floating-ui/react": ^0.26.16 - "@react-aria/focus": ^3.17.1 - "@react-aria/interactions": ^3.21.3 - "@tanstack/react-virtual": ^3.8.1 - peerDependencies: - react: ^18 - react-dom: ^18 - checksum: 44b2552b95ed8952c47664a7717183404ab56e14c208c8338b512e7da6707d9d1e5a71424b558aa5d257d685655caf0c6f835655f295b0eaf245674a0bd312fe - languageName: node - linkType: hard - -"@humanwhocodes/config-array@npm:^0.12.3": - version: 0.12.3 - resolution: "@humanwhocodes/config-array@npm:0.12.3" - dependencies: - "@humanwhocodes/object-schema": ^2.0.3 - debug: ^4.3.1 - minimatch: ^3.0.5 - checksum: 4212cf12567538675f45f09dae9715978fac805fbc6f194ce31e62dbbe01ca286b87478463c042883bf4451998be737012dd0882530f55ad0c0e901d963b5123 - languageName: node - linkType: hard - -"@humanwhocodes/module-importer@npm:^1.0.1": - version: 1.0.1 - resolution: "@humanwhocodes/module-importer@npm:1.0.1" - checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 languageName: node linkType: hard @@ -3582,28 +3086,6 @@ __metadata: languageName: node linkType: hard -"@iconify/types@npm:^2.0.0": - version: 2.0.0 - resolution: "@iconify/types@npm:2.0.0" - checksum: 029f58542c160e9d4a746869cf2e475b603424d3adf3994c5cc8d0406c47e6e04a3b898b2707840c1c5b9bd5563a1660a34b110d89fce43923baca5222f4e597 - languageName: node - linkType: hard - -"@iconify/utils@npm:^2.1.32": - version: 2.1.33 - resolution: "@iconify/utils@npm:2.1.33" - dependencies: - "@antfu/install-pkg": ^0.4.0 - "@antfu/utils": ^0.7.10 - "@iconify/types": ^2.0.0 - debug: ^4.3.6 - kolorist: ^1.8.0 - local-pkg: ^0.5.0 - mlly: ^1.7.1 - checksum: 2d8bed71aa350954ea6f6c23e3c02263d3058c270ab5c71cae5cbc7c9c0ceb1ba986378696f5854b00a94fbfd5cd9afdd0ba8ae360efe352560a14ecc46a9649 - languageName: node - linkType: hard - "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -3756,37 +3238,6 @@ __metadata: languageName: node linkType: hard -"@mdx-js/mdx@npm:^3.0.0": - version: 3.0.1 - resolution: "@mdx-js/mdx@npm:3.0.1" - dependencies: - "@types/estree": ^1.0.0 - "@types/estree-jsx": ^1.0.0 - "@types/hast": ^3.0.0 - "@types/mdx": ^2.0.0 - collapse-white-space: ^2.0.0 - devlop: ^1.0.0 - estree-util-build-jsx: ^3.0.0 - estree-util-is-identifier-name: ^3.0.0 - estree-util-to-js: ^2.0.0 - estree-walker: ^3.0.0 - hast-util-to-estree: ^3.0.0 - hast-util-to-jsx-runtime: ^2.0.0 - markdown-extensions: ^2.0.0 - periscopic: ^3.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 - checksum: 82221662279c39a755b88f63b031a30b9bc04365e5bfc3e45590f4fa7bf6bff12364f4caee31c768ae588145eed74fda10c327d53f9272b1a2cffbc8bd537ce6 - languageName: node - linkType: hard - "@mdx-js/react@npm:^3.0.0": version: 3.0.1 resolution: "@mdx-js/react@npm:3.0.1" @@ -3799,15 +3250,6 @@ __metadata: languageName: node linkType: hard -"@mermaid-js/parser@npm:^0.3.0": - version: 0.3.0 - resolution: "@mermaid-js/parser@npm:0.3.0" - dependencies: - langium: 3.0.0 - checksum: 7c92d69b74a1aaa3d2352c9a21a913cb4dd8f4212b22130359ef98ced4509fdb709ac9942dc78d3c2f75360f27a2917fbdb1ef2c7ac0057078d935666a1afe1d - languageName: node - linkType: hard - "@microsoft/api-extractor-model@npm:7.28.13": version: 7.28.13 resolution: "@microsoft/api-extractor-model@npm:7.28.13" @@ -3861,155 +3303,6 @@ __metadata: languageName: node linkType: hard -"@napi-rs/simple-git-android-arm-eabi@npm:0.1.19": - version: 0.1.19 - resolution: "@napi-rs/simple-git-android-arm-eabi@npm:0.1.19" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@napi-rs/simple-git-android-arm64@npm:0.1.19": - version: 0.1.19 - resolution: "@napi-rs/simple-git-android-arm64@npm:0.1.19" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@napi-rs/simple-git-darwin-arm64@npm:0.1.19": - version: 0.1.19 - resolution: "@napi-rs/simple-git-darwin-arm64@npm:0.1.19" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@napi-rs/simple-git-darwin-x64@npm:0.1.19": - version: 0.1.19 - resolution: "@napi-rs/simple-git-darwin-x64@npm:0.1.19" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@napi-rs/simple-git-freebsd-x64@npm:0.1.19": - version: 0.1.19 - resolution: "@napi-rs/simple-git-freebsd-x64@npm:0.1.19" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@napi-rs/simple-git-linux-arm-gnueabihf@npm:0.1.19": - version: 0.1.19 - resolution: "@napi-rs/simple-git-linux-arm-gnueabihf@npm:0.1.19" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@napi-rs/simple-git-linux-arm64-gnu@npm:0.1.19": - version: 0.1.19 - resolution: "@napi-rs/simple-git-linux-arm64-gnu@npm:0.1.19" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@napi-rs/simple-git-linux-arm64-musl@npm:0.1.19": - version: 0.1.19 - resolution: "@napi-rs/simple-git-linux-arm64-musl@npm:0.1.19" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@napi-rs/simple-git-linux-powerpc64le-gnu@npm:0.1.19": - version: 0.1.19 - resolution: "@napi-rs/simple-git-linux-powerpc64le-gnu@npm:0.1.19" - conditions: os=linux & cpu=powerpc64le & libc=glibc - languageName: node - linkType: hard - -"@napi-rs/simple-git-linux-s390x-gnu@npm:0.1.19": - version: 0.1.19 - resolution: "@napi-rs/simple-git-linux-s390x-gnu@npm:0.1.19" - conditions: os=linux & cpu=s390x & libc=glibc - languageName: node - linkType: hard - -"@napi-rs/simple-git-linux-x64-gnu@npm:0.1.19": - version: 0.1.19 - resolution: "@napi-rs/simple-git-linux-x64-gnu@npm:0.1.19" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@napi-rs/simple-git-linux-x64-musl@npm:0.1.19": - version: 0.1.19 - resolution: "@napi-rs/simple-git-linux-x64-musl@npm:0.1.19" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@napi-rs/simple-git-win32-arm64-msvc@npm:0.1.19": - version: 0.1.19 - resolution: "@napi-rs/simple-git-win32-arm64-msvc@npm:0.1.19" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@napi-rs/simple-git-win32-x64-msvc@npm:0.1.19": - version: 0.1.19 - resolution: "@napi-rs/simple-git-win32-x64-msvc@npm:0.1.19" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@napi-rs/simple-git@npm:^0.1.9": - version: 0.1.19 - resolution: "@napi-rs/simple-git@npm:0.1.19" - dependencies: - "@napi-rs/simple-git-android-arm-eabi": 0.1.19 - "@napi-rs/simple-git-android-arm64": 0.1.19 - "@napi-rs/simple-git-darwin-arm64": 0.1.19 - "@napi-rs/simple-git-darwin-x64": 0.1.19 - "@napi-rs/simple-git-freebsd-x64": 0.1.19 - "@napi-rs/simple-git-linux-arm-gnueabihf": 0.1.19 - "@napi-rs/simple-git-linux-arm64-gnu": 0.1.19 - "@napi-rs/simple-git-linux-arm64-musl": 0.1.19 - "@napi-rs/simple-git-linux-powerpc64le-gnu": 0.1.19 - "@napi-rs/simple-git-linux-s390x-gnu": 0.1.19 - "@napi-rs/simple-git-linux-x64-gnu": 0.1.19 - "@napi-rs/simple-git-linux-x64-musl": 0.1.19 - "@napi-rs/simple-git-win32-arm64-msvc": 0.1.19 - "@napi-rs/simple-git-win32-x64-msvc": 0.1.19 - dependenciesMeta: - "@napi-rs/simple-git-android-arm-eabi": - optional: true - "@napi-rs/simple-git-android-arm64": - optional: true - "@napi-rs/simple-git-darwin-arm64": - optional: true - "@napi-rs/simple-git-darwin-x64": - optional: true - "@napi-rs/simple-git-freebsd-x64": - optional: true - "@napi-rs/simple-git-linux-arm-gnueabihf": - optional: true - "@napi-rs/simple-git-linux-arm64-gnu": - optional: true - "@napi-rs/simple-git-linux-arm64-musl": - optional: true - "@napi-rs/simple-git-linux-powerpc64le-gnu": - optional: true - "@napi-rs/simple-git-linux-s390x-gnu": - optional: true - "@napi-rs/simple-git-linux-x64-gnu": - optional: true - "@napi-rs/simple-git-linux-x64-musl": - optional: true - "@napi-rs/simple-git-win32-arm64-msvc": - optional: true - "@napi-rs/simple-git-win32-x64-msvc": - optional: true - checksum: ced13e14e78dd6311a2cee56bfa97f086f6794d40b96569835bc44e656e13b001ca8e528663a0d49f9e1318efad3ae63194f0dabe63930d6b44caaab16a26a57 - languageName: node - linkType: hard - "@ndelangen/get-tarball@npm:^3.0.7": version: 3.0.9 resolution: "@ndelangen/get-tarball@npm:3.0.9" @@ -4021,76 +3314,6 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:14.2.13": - version: 14.2.13 - resolution: "@next/env@npm:14.2.13" - checksum: aee5edf338d7f570f701772c8787d74f04bbe475ca274b7e67ec4a3370b3418399faf6c5f94c221f7c832255f83746af2a08abd373f5466b340a5b1ff4d47376 - languageName: node - linkType: hard - -"@next/swc-darwin-arm64@npm:14.2.13": - version: 14.2.13 - resolution: "@next/swc-darwin-arm64@npm:14.2.13" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@next/swc-darwin-x64@npm:14.2.13": - version: 14.2.13 - resolution: "@next/swc-darwin-x64@npm:14.2.13" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@next/swc-linux-arm64-gnu@npm:14.2.13": - version: 14.2.13 - resolution: "@next/swc-linux-arm64-gnu@npm:14.2.13" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@next/swc-linux-arm64-musl@npm:14.2.13": - version: 14.2.13 - resolution: "@next/swc-linux-arm64-musl@npm:14.2.13" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@next/swc-linux-x64-gnu@npm:14.2.13": - version: 14.2.13 - resolution: "@next/swc-linux-x64-gnu@npm:14.2.13" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@next/swc-linux-x64-musl@npm:14.2.13": - version: 14.2.13 - resolution: "@next/swc-linux-x64-musl@npm:14.2.13" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@next/swc-win32-arm64-msvc@npm:14.2.13": - version: 14.2.13 - resolution: "@next/swc-win32-arm64-msvc@npm:14.2.13" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@next/swc-win32-ia32-msvc@npm:14.2.13": - version: 14.2.13 - resolution: "@next/swc-win32-ia32-msvc@npm:14.2.13" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@next/swc-win32-x64-msvc@npm:14.2.13": - version: 14.2.13 - resolution: "@next/swc-win32-x64-msvc@npm:14.2.13" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@nicolo-ribaudo/chokidar-2@npm:2.1.8-no-fsevents.3": version: 2.1.8-no-fsevents.3 resolution: "@nicolo-ribaudo/chokidar-2@npm:2.1.8-no-fsevents.3" @@ -4236,81 +3459,6 @@ __metadata: languageName: node linkType: hard -"@react-aria/focus@npm:^3.17.1": - version: 3.18.3 - resolution: "@react-aria/focus@npm:3.18.3" - dependencies: - "@react-aria/interactions": ^3.22.3 - "@react-aria/utils": ^3.25.3 - "@react-types/shared": ^3.25.0 - "@swc/helpers": ^0.5.0 - clsx: ^2.0.0 - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 3050a6addfd29053e538ee08f72f6af688e3e624a77e5d2a69c8cc3ff815778797b63aca98009ae86402e2f700e461bc30675dd3367dde418c2a61e1aac1a21f - languageName: node - linkType: hard - -"@react-aria/interactions@npm:^3.21.3, @react-aria/interactions@npm:^3.22.3": - version: 3.22.3 - resolution: "@react-aria/interactions@npm:3.22.3" - dependencies: - "@react-aria/ssr": ^3.9.6 - "@react-aria/utils": ^3.25.3 - "@react-types/shared": ^3.25.0 - "@swc/helpers": ^0.5.0 - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 6e0be760268a9a7ff688dbb216a812327164476500730974719f561c6080af91bbfe7dd360558d63d45fa54140b378632f787d57d6b1f1d663ce4a56e0d0a1b3 - languageName: node - linkType: hard - -"@react-aria/ssr@npm:^3.9.6": - version: 3.9.6 - resolution: "@react-aria/ssr@npm:3.9.6" - dependencies: - "@swc/helpers": ^0.5.0 - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 90645c0da673de555cc1221286980c713d79d5a9328e43adf19121be03a1ba8ebb11e87a3564cd1e1034e00674ee5f95db3d3db263a0109239502d093ebe6862 - languageName: node - linkType: hard - -"@react-aria/utils@npm:^3.25.3": - version: 3.25.3 - resolution: "@react-aria/utils@npm:3.25.3" - dependencies: - "@react-aria/ssr": ^3.9.6 - "@react-stately/utils": ^3.10.4 - "@react-types/shared": ^3.25.0 - "@swc/helpers": ^0.5.0 - clsx: ^2.0.0 - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: dfb0dc06c8941cb959f021fbd6287ab12e20d958a9ba52307cade8e0586df12472664ca5574086a8f96501128db5cbdd5c9a625b0bc378e43a92165f920824bf - languageName: node - linkType: hard - -"@react-stately/utils@npm:^3.10.4": - version: 3.10.4 - resolution: "@react-stately/utils@npm:3.10.4" - dependencies: - "@swc/helpers": ^0.5.0 - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: dd00776f1d0e858c62de2f18551faffe91a53547ea4fe0a0ae2e5ff0ca9dac289b68bf06db09e978dab72e9b10a41160ab195186fb07fd7843aecbf60fba801d - languageName: node - linkType: hard - -"@react-types/shared@npm:^3.25.0": - version: 3.25.0 - resolution: "@react-types/shared@npm:3.25.0" - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - checksum: 3fb971b74d913bf4dc933e78f5d5c418574fca7313198ef7b0e77c528f8a2e5f76324fb8a5a2be52b5ed997018a6819457e70f964eb1c80dc62941eb8b678710 - languageName: node - linkType: hard - "@rollup/pluginutils@npm:^4.2.0": version: 4.2.1 resolution: "@rollup/pluginutils@npm:4.2.1" @@ -4344,13 +3492,6 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.22.5" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - "@rollup/rollup-android-arm64@npm:4.14.3": version: 4.14.3 resolution: "@rollup/rollup-android-arm64@npm:4.14.3" @@ -4358,13 +3499,6 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-android-arm64@npm:4.22.5" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - "@rollup/rollup-darwin-arm64@npm:4.14.3": version: 4.14.3 resolution: "@rollup/rollup-darwin-arm64@npm:4.14.3" @@ -4372,13 +3506,6 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-darwin-arm64@npm:4.22.5" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - "@rollup/rollup-darwin-x64@npm:4.14.3": version: 4.14.3 resolution: "@rollup/rollup-darwin-x64@npm:4.14.3" @@ -4386,13 +3513,6 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-darwin-x64@npm:4.22.5" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - "@rollup/rollup-linux-arm-gnueabihf@npm:4.14.3": version: 4.14.3 resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.14.3" @@ -4400,13 +3520,6 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.22.5" - conditions: os=linux & cpu=arm & libc=glibc - languageName: node - linkType: hard - "@rollup/rollup-linux-arm-musleabihf@npm:4.14.3": version: 4.14.3 resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.14.3" @@ -4414,13 +3527,6 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.22.5" - conditions: os=linux & cpu=arm & libc=musl - languageName: node - linkType: hard - "@rollup/rollup-linux-arm64-gnu@npm:4.14.3": version: 4.14.3 resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.14.3" @@ -4428,13 +3534,6 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.22.5" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - "@rollup/rollup-linux-arm64-musl@npm:4.14.3": version: 4.14.3 resolution: "@rollup/rollup-linux-arm64-musl@npm:4.14.3" @@ -4442,13 +3541,6 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.22.5" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - "@rollup/rollup-linux-powerpc64le-gnu@npm:4.14.3": version: 4.14.3 resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.14.3" @@ -4456,13 +3548,6 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.22.5" - conditions: os=linux & cpu=ppc64 & libc=glibc - languageName: node - linkType: hard - "@rollup/rollup-linux-riscv64-gnu@npm:4.14.3": version: 4.14.3 resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.14.3" @@ -4470,13 +3555,6 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.22.5" - conditions: os=linux & cpu=riscv64 & libc=glibc - languageName: node - linkType: hard - "@rollup/rollup-linux-s390x-gnu@npm:4.14.3": version: 4.14.3 resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.14.3" @@ -4484,13 +3562,6 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.22.5" - conditions: os=linux & cpu=s390x & libc=glibc - languageName: node - linkType: hard - "@rollup/rollup-linux-x64-gnu@npm:4.14.3": version: 4.14.3 resolution: "@rollup/rollup-linux-x64-gnu@npm:4.14.3" @@ -4498,13 +3569,6 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.22.5" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - "@rollup/rollup-linux-x64-musl@npm:4.14.3": version: 4.14.3 resolution: "@rollup/rollup-linux-x64-musl@npm:4.14.3" @@ -4512,13 +3576,6 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.22.5" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - "@rollup/rollup-win32-arm64-msvc@npm:4.14.3": version: 4.14.3 resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.14.3" @@ -4526,13 +3583,6 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.22.5" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - "@rollup/rollup-win32-ia32-msvc@npm:4.14.3": version: 4.14.3 resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.14.3" @@ -4540,13 +3590,6 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.22.5" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - "@rollup/rollup-win32-x64-msvc@npm:4.14.3": version: 4.14.3 resolution: "@rollup/rollup-win32-x64-msvc@npm:4.14.3" @@ -4554,13 +3597,6 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.22.5" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@rushstack/node-core-library@npm:4.0.2": version: 4.0.2 resolution: "@rushstack/node-core-library@npm:4.0.2" @@ -4617,69 +3653,6 @@ __metadata: languageName: node linkType: hard -"@shikijs/core@npm:1.21.0": - version: 1.21.0 - resolution: "@shikijs/core@npm:1.21.0" - dependencies: - "@shikijs/engine-javascript": 1.21.0 - "@shikijs/engine-oniguruma": 1.21.0 - "@shikijs/types": 1.21.0 - "@shikijs/vscode-textmate": ^9.2.2 - "@types/hast": ^3.0.4 - hast-util-to-html: ^9.0.3 - checksum: d48fe21006f1fa9ce4316539bbb6bd065c8634f0870a52048504132eb78d46d05cd10f2fc036e7fd09467245648efb5c92eaf4ac5cdc6303c5e096f7532500e9 - languageName: node - linkType: hard - -"@shikijs/engine-javascript@npm:1.21.0": - version: 1.21.0 - resolution: "@shikijs/engine-javascript@npm:1.21.0" - dependencies: - "@shikijs/types": 1.21.0 - "@shikijs/vscode-textmate": ^9.2.2 - oniguruma-to-js: 0.4.3 - checksum: c20b8b325a48bf0ba9b3ae3945c9ecb58e986594615be8a5e2640ab10517477374af2ad6ad4a1f6202ccd66d8eddcc4a67c61d95d4299e8f6a165e9e03cefb09 - languageName: node - linkType: hard - -"@shikijs/engine-oniguruma@npm:1.21.0": - version: 1.21.0 - resolution: "@shikijs/engine-oniguruma@npm:1.21.0" - dependencies: - "@shikijs/types": 1.21.0 - "@shikijs/vscode-textmate": ^9.2.2 - checksum: 7bb69bd422c365488f2147cd559efba985e3b9caaecc4503e1dc50f96964d5fb3a82b419ea04e16d8cc011d3c1eedfc79274f294fedd0a042447f4289b1c4f7a - languageName: node - linkType: hard - -"@shikijs/twoslash@npm:^1.0.0": - version: 1.21.0 - resolution: "@shikijs/twoslash@npm:1.21.0" - dependencies: - "@shikijs/core": 1.21.0 - "@shikijs/types": 1.21.0 - twoslash: ^0.2.12 - checksum: 2d498e8d88f6622b0772b8c146ac154056f43964033ddc5464c2800e1dcef7c2455f8d383fc4d28e7f23773aa02b19f0cd11c6e8046432cd7f46e723439bc2a1 - languageName: node - linkType: hard - -"@shikijs/types@npm:1.21.0": - version: 1.21.0 - resolution: "@shikijs/types@npm:1.21.0" - dependencies: - "@shikijs/vscode-textmate": ^9.2.2 - "@types/hast": ^3.0.4 - checksum: ba3f84a56345a034b13fc5ef5b1e9c6abbf9c7f8455d5cec90ce9f473fea42d5156820891db604238a95bf3aa1ee12540ba67abbfbf713a9c43bd7bf24e55d1a - languageName: node - linkType: hard - -"@shikijs/vscode-textmate@npm:^9.2.2": - version: 9.2.2 - resolution: "@shikijs/vscode-textmate@npm:9.2.2" - checksum: d47db82e3ab76df68fb5bba8152b9516281d2292eb54ac52ccfaef63968456d8539255f57e3b7c995f7346d436075a9bc089436bf9b032c4c39d6cd166a325ae - languageName: node - linkType: hard - "@sinclair/typebox@npm:^0.27.8": version: 0.27.8 resolution: "@sinclair/typebox@npm:0.27.8" @@ -5766,67 +4739,22 @@ __metadata: resolution: "@svgr/hast-util-to-babel-ast@npm:8.0.0" dependencies: "@babel/types": ^7.21.3 - entities: ^4.4.0 - checksum: 88401281a38bbc7527e65ff5437970414391a86158ef4b4046c89764c156d2d39ecd7cce77be8a51994c9fb3249170cb1eb8b9128b62faaa81743ef6ed3534ab - languageName: node - linkType: hard - -"@svgr/plugin-jsx@npm:^8.1.0": - version: 8.1.0 - resolution: "@svgr/plugin-jsx@npm:8.1.0" - dependencies: - "@babel/core": ^7.21.3 - "@svgr/babel-preset": 8.1.0 - "@svgr/hast-util-to-babel-ast": 8.0.0 - svg-parser: ^2.0.4 - peerDependencies: - "@svgr/core": "*" - checksum: 0418a9780753d3544912ee2dad5d2cf8d12e1ba74df8053651b3886aeda54d5f0f7d2dece0af5e0d838332c4f139a57f0dabaa3ca1afa4d1a765efce6a7656f2 - languageName: node - linkType: hard - -"@swc/counter@npm:^0.1.3": - version: 0.1.3 - resolution: "@swc/counter@npm:0.1.3" - checksum: df8f9cfba9904d3d60f511664c70d23bb323b3a0803ec9890f60133954173047ba9bdeabce28cd70ba89ccd3fd6c71c7b0bd58be85f611e1ffbe5d5c18616598 - languageName: node - linkType: hard - -"@swc/helpers@npm:0.5.5": - version: 0.5.5 - resolution: "@swc/helpers@npm:0.5.5" - dependencies: - "@swc/counter": ^0.1.3 - tslib: ^2.4.0 - checksum: d4f207b191e54b29460804ddf2984ba6ece1d679a0b2f6a9c765dcf27bba92c5769e7965668a4546fb9f1021eaf0ff9be4bf5c235ce12adcd65acdfe77187d11 - languageName: node - linkType: hard - -"@swc/helpers@npm:^0.5.0": - version: 0.5.13 - resolution: "@swc/helpers@npm:0.5.13" - dependencies: - tslib: ^2.4.0 - checksum: d50c2c10da6ef940af423c6b03ad9c3c94cf9de59314b1e921a7d1bcc081a6074481c9d67b655fc8fe66a73288f98b25950743792a63882bfb5793b362494fc0 + entities: ^4.4.0 + checksum: 88401281a38bbc7527e65ff5437970414391a86158ef4b4046c89764c156d2d39ecd7cce77be8a51994c9fb3249170cb1eb8b9128b62faaa81743ef6ed3534ab languageName: node linkType: hard -"@tanstack/react-virtual@npm:^3.8.1": - version: 3.10.8 - resolution: "@tanstack/react-virtual@npm:3.10.8" +"@svgr/plugin-jsx@npm:^8.1.0": + version: 8.1.0 + resolution: "@svgr/plugin-jsx@npm:8.1.0" dependencies: - "@tanstack/virtual-core": 3.10.8 + "@babel/core": ^7.21.3 + "@svgr/babel-preset": 8.1.0 + "@svgr/hast-util-to-babel-ast": 8.0.0 + svg-parser: ^2.0.4 peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 40a5d6089908096634fec2aa0cd646ca47c044c745e1b0d190ecbf9905ad2e6266ccd56c2550ed92f47349954dc11eb6930beac1354441ce7c98af81c5454d3f - languageName: node - linkType: hard - -"@tanstack/virtual-core@npm:3.10.8": - version: 3.10.8 - resolution: "@tanstack/virtual-core@npm:3.10.8" - checksum: 1c5307b534bb963094acc4a2691fcc331364a865d8513abe9f5ca6be577d7bb4b2821e8dddbf259c60ee65afb2f4e5d6debab1af897b0c464ec1bd18906ecbe9 + "@svgr/core": "*" + checksum: 0418a9780753d3544912ee2dad5d2cf8d12e1ba74df8053651b3886aeda54d5f0f7d2dece0af5e0d838332c4f139a57f0dabaa3ca1afa4d1a765efce6a7656f2 languageName: node linkType: hard @@ -5961,28 +4889,6 @@ __metadata: languageName: node linkType: hard -"@theguild/remark-mermaid@npm:^0.1.2": - version: 0.1.3 - resolution: "@theguild/remark-mermaid@npm:0.1.3" - dependencies: - mermaid: ^11.0.0 - unist-util-visit: ^5.0.0 - peerDependencies: - react: ^18.2.0 - checksum: 5048c51cbb245f9a0a5684fa4631f754f879a074411f6ddf3c180e84195d5682dfdb859fc76da8d229564b29e9eb55dae8378d8113dc7679c7b9dc71a352e1c8 - languageName: node - linkType: hard - -"@theguild/remark-npm2yarn@npm:^0.3.2": - version: 0.3.2 - resolution: "@theguild/remark-npm2yarn@npm:0.3.2" - dependencies: - npm-to-yarn: ^3.0.0 - unist-util-visit: ^5.0.0 - checksum: 38af89449971e0e3c4c887be1f7355825c3c87fab34838cfc7d508454bc6e4a48d7e227527a1be20f25e68e6c8f04f41253c6d995e2cd224a182eee12140bcaf - languageName: node - linkType: hard - "@tootallnate/once@npm:2": version: 2.0.0 resolution: "@tootallnate/once@npm:2.0.0" @@ -6211,13 +5117,6 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:1.0.6": - version: 1.0.6 - resolution: "@types/estree@npm:1.0.6" - checksum: 8825d6e729e16445d9a1dd2fb1db2edc5ed400799064cd4d028150701031af012ba30d6d03fe9df40f4d7a437d0de6d2b256020152b7b09bde9f2e420afdffd9 - languageName: node - linkType: hard - "@types/estree@npm:^0.0.51": version: 0.0.51 resolution: "@types/estree@npm:0.0.51" @@ -6289,15 +5188,6 @@ __metadata: languageName: node linkType: hard -"@types/hast@npm:^2.0.0": - version: 2.3.10 - resolution: "@types/hast@npm:2.3.10" - dependencies: - "@types/unist": ^2 - checksum: 41531b7fbf590b02452996fc63272479c20a07269e370bd6514982cbcd1819b4b84d3ea620f2410d1b9541a23d08ce2eeb0a592145d05e00e249c3d56700d460 - languageName: node - linkType: hard - "@types/hast@npm:^3.0.0": version: 3.0.3 resolution: "@types/hast@npm:3.0.3" @@ -6307,15 +5197,6 @@ __metadata: languageName: node linkType: hard -"@types/hast@npm:^3.0.4": - version: 3.0.4 - resolution: "@types/hast@npm:3.0.4" - dependencies: - "@types/unist": "*" - checksum: 7a973e8d16fcdf3936090fa2280f408fb2b6a4f13b42edeb5fbd614efe042b82eac68e298e556d50f6b4ad585a3a93c353e9c826feccdc77af59de8dd400d044 - languageName: node - linkType: hard - "@types/http-errors@npm:*": version: 2.0.4 resolution: "@types/http-errors@npm:2.0.4" @@ -6323,13 +5204,6 @@ __metadata: languageName: node linkType: hard -"@types/http-errors@npm:^1.8.2": - version: 1.8.2 - resolution: "@types/http-errors@npm:1.8.2" - checksum: ecc365eea98d7eca650d593e742571acc3003742f0dd0fbbb15b8fce286e0f7421644b4140fb9bf701bbb7f1b744aea3967ebe025f0f0811aa5ab2c3d40fe111 - languageName: node - linkType: hard - "@types/is-empty@npm:^1.0.0": version: 1.2.3 resolution: "@types/is-empty@npm:1.2.3" @@ -6372,13 +5246,6 @@ __metadata: languageName: node linkType: hard -"@types/katex@npm:^0.16.0": - version: 0.16.7 - resolution: "@types/katex@npm:0.16.7" - checksum: 4fd15d93553be97c02c064e16be18d7ccbabf66ec72a9dc7fd5bfa47f0c7581da2f942f693c7cb59499de4c843c2189796e49c9647d336cbd52b777b6722a95a - languageName: node - linkType: hard - "@types/lodash-es@npm:^4.17.8": version: 4.17.12 resolution: "@types/lodash-es@npm:4.17.12" @@ -6464,15 +5331,6 @@ __metadata: languageName: node linkType: hard -"@types/nlcst@npm:^2.0.0": - version: 2.0.3 - resolution: "@types/nlcst@npm:2.0.3" - dependencies: - "@types/unist": "*" - checksum: 8f4172da36e60645bf2392ccd42bd2a950ec677b8e79f49cc2c5d1f2c673ea106ae7004a559eb3084a07dbf6cc1e01d10f536eb990558ff5f52d1af69b9c557c - languageName: node - linkType: hard - "@types/node@npm:*": version: 18.7.6 resolution: "@types/node@npm:18.7.6" @@ -6583,15 +5441,6 @@ __metadata: languageName: node linkType: hard -"@types/react-syntax-highlighter@npm:15.5.13": - version: 15.5.13 - resolution: "@types/react-syntax-highlighter@npm:15.5.13" - dependencies: - "@types/react": "*" - checksum: 55f751c140eb6641b16a5644af3b6fc25223957141085758ae6898948e70eaca33d8276e86e75d5d60939aff63af1d20278aba0d3a25483266f9deee1eb468e3 - languageName: node - linkType: hard - "@types/react@npm:*": version: 18.0.17 resolution: "@types/react@npm:18.0.17" @@ -6695,13 +5544,6 @@ __metadata: languageName: node linkType: hard -"@types/unist@npm:^2": - version: 2.0.11 - resolution: "@types/unist@npm:2.0.11" - checksum: 6d436e832bc35c6dde9f056ac515ebf2b3384a1d7f63679d12358766f9b313368077402e9c1126a14d827f10370a5485e628bf61aa91117cf4fc882423191a4e - languageName: node - linkType: hard - "@types/unist@npm:^3.0.0": version: 3.0.2 resolution: "@types/unist@npm:3.0.2" @@ -7027,17 +5869,6 @@ __metadata: languageName: node linkType: hard -"@typescript/vfs@npm:^1.6.0": - version: 1.6.0 - resolution: "@typescript/vfs@npm:1.6.0" - dependencies: - debug: ^4.1.1 - peerDependencies: - typescript: "*" - checksum: bedc58a712689b8a130518720c8738d2c555053a5b5f0c4889eaaaaef331c650eb652a99875c62cc25c01dc228205ed0e84f5c8d3a3ff6f25f42aa509e33e38f - languageName: node - linkType: hard - "@ungap/structured-clone@npm:^1.0.0, @ungap/structured-clone@npm:^1.2.0": version: 1.2.0 resolution: "@ungap/structured-clone@npm:1.2.0" @@ -7045,156 +5876,6 @@ __metadata: languageName: node linkType: hard -"@vanilla-extract/babel-plugin-debug-ids@npm:^1.1.0": - version: 1.1.0 - resolution: "@vanilla-extract/babel-plugin-debug-ids@npm:1.1.0" - dependencies: - "@babel/core": ^7.23.9 - checksum: b2feec9016ba2dd6740c2ce002d814123f38bf8fc01a6d771eff74ed8108abefdc9d6507e2045587d2a73d8a538ece867e4bfef8c5ccc2b13095a2c825160e7a - languageName: node - linkType: hard - -"@vanilla-extract/css@npm:1.16.1, @vanilla-extract/css@npm:^1.16.1": - version: 1.16.1 - resolution: "@vanilla-extract/css@npm:1.16.1" - dependencies: - "@emotion/hash": ^0.9.0 - "@vanilla-extract/private": ^1.0.6 - css-what: ^6.1.0 - cssesc: ^3.0.0 - csstype: ^3.0.7 - dedent: ^1.5.3 - deep-object-diff: ^1.1.9 - deepmerge: ^4.2.2 - lru-cache: ^10.4.3 - media-query-parser: ^2.0.2 - modern-ahocorasick: ^1.0.0 - picocolors: ^1.0.0 - checksum: ff58f32778cbc15458aff951ad771ba46f772d78633ff99f849f590b83a22ce67e017af28351c68c32edcdaae4454146dd90f369842a627ee79dc9c3ab434e1e - languageName: node - linkType: hard - -"@vanilla-extract/css@npm:^1.16.0": - version: 1.16.0 - resolution: "@vanilla-extract/css@npm:1.16.0" - dependencies: - "@emotion/hash": ^0.9.0 - "@vanilla-extract/private": ^1.0.6 - css-what: ^6.1.0 - cssesc: ^3.0.0 - csstype: ^3.0.7 - dedent: ^1.5.3 - deep-object-diff: ^1.1.9 - deepmerge: ^4.2.2 - lru-cache: ^10.4.3 - media-query-parser: ^2.0.2 - modern-ahocorasick: ^1.0.0 - picocolors: ^1.0.0 - checksum: 2a0c32105be0a7de62d9271e91dcf53e937b0d72ac0f9f7d6ee6144dc07abe00758ffeafb8f5de21e45cd9ed8e94eb1d0463f6679fdc9385043fa821b81cf574 - languageName: node - linkType: hard - -"@vanilla-extract/dynamic@npm:2.1.2": - version: 2.1.2 - resolution: "@vanilla-extract/dynamic@npm:2.1.2" - dependencies: - "@vanilla-extract/private": ^1.0.6 - checksum: ec6ec9b02c7ec8a9d60aebf63225fd3f930c06ad824321f03f683f1948eb6d4e554d934303da140b3230b4af2fa15bab494c6da2a3b9a172e4118c245b4f942a - languageName: node - linkType: hard - -"@vanilla-extract/integration@npm:^7.1.10": - version: 7.1.10 - resolution: "@vanilla-extract/integration@npm:7.1.10" - dependencies: - "@babel/core": ^7.23.9 - "@babel/plugin-syntax-typescript": ^7.23.3 - "@vanilla-extract/babel-plugin-debug-ids": ^1.1.0 - "@vanilla-extract/css": ^1.16.0 - dedent: ^1.5.3 - esbuild: "npm:esbuild@>=0.17.6 <0.24.0" - eval: 0.1.8 - find-up: ^5.0.0 - javascript-stringify: ^2.0.1 - mlly: ^1.4.2 - vite: ^5.0.11 - vite-node: ^1.2.0 - checksum: cbf3cc21b59057f2528bf47f1d0c3ec23cdbc3c84c92debb9f39557f9db0f9c1dea269dbc3cff54456084d55fe9fd6ee184fd203d7d8b83f4e276aff7c1b29dd - languageName: node - linkType: hard - -"@vanilla-extract/integration@npm:^7.1.11": - version: 7.1.11 - resolution: "@vanilla-extract/integration@npm:7.1.11" - dependencies: - "@babel/core": ^7.23.9 - "@babel/plugin-syntax-typescript": ^7.23.3 - "@vanilla-extract/babel-plugin-debug-ids": ^1.1.0 - "@vanilla-extract/css": ^1.16.1 - dedent: ^1.5.3 - esbuild: "npm:esbuild@>=0.17.6 <0.24.0" - eval: 0.1.8 - find-up: ^5.0.0 - javascript-stringify: ^2.0.1 - mlly: ^1.4.2 - vite: ^5.0.11 - vite-node: ^1.2.0 - checksum: 23196f388045c0cdaa35bf26cf484ca4423e336026770b743017056aed7704c74c2134b425571eee9c6859ed1a1553a435e4d0c502ff5a78f8dc2c02db00707a - languageName: node - linkType: hard - -"@vanilla-extract/next-plugin@npm:^2.4.6": - version: 2.4.6 - resolution: "@vanilla-extract/next-plugin@npm:2.4.6" - dependencies: - "@vanilla-extract/webpack-plugin": ^2.3.14 - peerDependencies: - next: ">=12.1.7" - checksum: 48acc8bcade876560149857ad487f61dbffbaa4414c5ee69fac82fb76a8cb99cfb79008826393b9c0bf4e1d2df9b44bb4615413e6b05d4a20a2cf3b2c3641b7e - languageName: node - linkType: hard - -"@vanilla-extract/private@npm:^1.0.6": - version: 1.0.6 - resolution: "@vanilla-extract/private@npm:1.0.6" - checksum: 2265b02af29d8cd40f6ddeeed197fb2df1a7695f5a9821d5e3597677179be8b83bcd8fe4df4a6178544f89123d745a3c6a13599d4fe4e5873b065a8ad329f690 - languageName: node - linkType: hard - -"@vanilla-extract/recipes@npm:0.5.5": - version: 0.5.5 - resolution: "@vanilla-extract/recipes@npm:0.5.5" - peerDependencies: - "@vanilla-extract/css": ^1.0.0 - checksum: 8d2b4f8163369424226ec9a47e754002b8a095bcf86c1a60a91b2183f59508519bd31ed41baefc950ad7ca225d75b3184c3b84d3c741c5c60d91618dd70452aa - languageName: node - linkType: hard - -"@vanilla-extract/vite-plugin@npm:4.0.18": - version: 4.0.18 - resolution: "@vanilla-extract/vite-plugin@npm:4.0.18" - dependencies: - "@vanilla-extract/integration": ^7.1.11 - peerDependencies: - vite: ^4.0.3 || ^5.0.0 - checksum: 99f816370e93153a77be9882206eda948626305bd7d18d7121f849024ab194266b7ae0823f2f2f69a7cfb76e027b21d0a6c99f02c56aa495b04993fd9aa9816d - languageName: node - linkType: hard - -"@vanilla-extract/webpack-plugin@npm:^2.3.14": - version: 2.3.14 - resolution: "@vanilla-extract/webpack-plugin@npm:2.3.14" - dependencies: - "@vanilla-extract/integration": ^7.1.10 - debug: ^4.3.1 - loader-utils: ^2.0.0 - picocolors: ^1.0.0 - peerDependencies: - webpack: ^4.30.0 || ^5.20.2 - checksum: fce78d63e7859456cb877642313a9680f69bedf0f1250bbd2f0d9472a938a1c8e6886959c630646dc89e6fb322d23c5491f705814b766046324d744ad0d5cfe1 - languageName: node - linkType: hard - "@vitejs/plugin-react@npm:4.2.1": version: 4.2.1 resolution: "@vitejs/plugin-react@npm:4.2.1" @@ -7383,28 +6064,6 @@ __metadata: languageName: unknown linkType: soft -"@voiceflow-example/live-chat@workspace:examples/live-chat": - version: 0.0.0-use.local - resolution: "@voiceflow-example/live-chat@workspace:examples/live-chat" - dependencies: - "@types/node": 20.12.7 - "@types/react": 18.2.8 - "@types/react-dom": 18.2.4 - "@voiceflow/exception": 1.4.0 - "@voiceflow/fetch": 1.5.2 - "@voiceflow/react-chat": "workspace:*" - "@voiceflow/slate-serializer": 1.4.2 - nanoevents: 8.0.0 - react: 18.2.0 - react-calendar: 4.3.0 - react-dom: 18.2.0 - regenerator-runtime: 0.13.11 - styled-components: 6.0.3 - ts-pattern: 4.3.0 - vite: 4.3.9 - languageName: unknown - linkType: soft - "@voiceflow/base-types@npm:2.113.1": version: 2.113.1 resolution: "@voiceflow/base-types@npm:2.113.1" @@ -7471,15 +6130,6 @@ __metadata: languageName: node linkType: hard -"@voiceflow/dtos-interact@npm:1.12.0": - version: 1.12.0 - resolution: "@voiceflow/dtos-interact@npm:1.12.0" - peerDependencies: - zod: ^3 - checksum: e0a75fe66af27cf16cad274d0cd0090e39c57bd2a305547190bcbdfce05c3ea0f9bcebfb866fe17dbaf37b2a338abcb3b6db4660526c16e45fc7d87cca2e5a9d - languageName: node - linkType: hard - "@voiceflow/eslint-config@npm:7.5.0": version: 7.5.0 resolution: "@voiceflow/eslint-config@npm:7.5.0" @@ -7573,7 +6223,7 @@ __metadata: "@vitejs/plugin-react": 4.2.1 "@voiceflow/base-types": 2.113.1 "@voiceflow/dtos-interact": 1.1.0 - "@voiceflow/sdk-runtime": "workspace:*" + "@voiceflow/sdk-runtime": 1.10.0 "@voiceflow/slate-serializer": 1.5.5 "@voiceflow/stitches-react": 2.3.1 "@voiceflow/test-common": 1.10.3 @@ -7618,90 +6268,15 @@ __metadata: languageName: unknown linkType: soft -"@voiceflow/react-chat@workspace:*, @voiceflow/react-chat@workspace:packages/chat": - version: 0.0.0-use.local - resolution: "@voiceflow/react-chat@workspace:packages/chat" - dependencies: - "@babel/core": 7.18.10 - "@babel/preset-env": 7.24.1 - "@babel/preset-react": 7.24.1 - "@babel/preset-typescript": 7.24.1 - "@emotion/core": 10.1.1 - "@playwright/test": 1.43.1 - "@storybook/addon-actions": 8.0.2 - "@storybook/addon-essentials": 8.0.2 - "@storybook/addon-interactions": 8.0.2 - "@storybook/addon-links": 8.0.2 - "@storybook/builder-vite": 8.0.2 - "@storybook/eslint-config-storybook": 3.1.2 - "@storybook/react": 8.0.2 - "@storybook/react-vite": 8.0.2 - "@storybook/testing-library": 0.0.13 - "@testing-library/jest-dom": 6.4.2 - "@testing-library/react": 15.0.2 - "@types/chroma-js": 2.1.4 - "@types/node": 20.12.7 - "@types/react": 18.2.8 - "@types/react-dom": 18.2.4 - "@types/react-speech-recognition": ^3.9.5 - "@types/react-syntax-highlighter": 15.5.13 - "@vanilla-extract/css": 1.16.1 - "@vanilla-extract/dynamic": 2.1.2 - "@vanilla-extract/recipes": 0.5.5 - "@vanilla-extract/vite-plugin": 4.0.18 - "@vitejs/plugin-react": 4.2.1 - "@voiceflow/base-types": 2.113.1 - "@voiceflow/dtos-interact": 1.12.0 - "@voiceflow/sdk-runtime": "workspace:*" - "@voiceflow/slate-serializer": 1.5.5 - "@voiceflow/test-common": 1.10.3 - "@voiceflow/voiceflow-types": 3.32.1 - bowser: 2.11.0 - chroma-js: 2.4.2 - chromatic: 11.2.0 - clsx: 1.2.1 - cuid: 2.1.8 - eslint-plugin-mdx: 3.1.5 - eslint-plugin-storybook: 0.8.0 - happy-dom: 14.7.1 - http-server: 14.1.1 - react: 18.2.0 - react-dom: 18.2.0 - react-markdown: 9.0.0 - react-speech-recognition: 3.10.0 - react-syntax-highlighter: 15.5.0 - react-textarea-autosize: 8.5.3 - regenerator-runtime: 0.13.11 - remark-gfm: 4.0.0 - slate: 0.94.1 - storybook: 8.0.2 - storybook-dark-mode: 1.1.0 - ts-pattern: 4.3.0 - tsc-alias: 1.8.8 - type-fest: 2.18.1 - unplugin-fonts: ^1.3.1 - vite: 5.2.9 - vite-plugin-dts: 3.8.3 - vite-plugin-html: 3.2.2 - vite-plugin-static-copy: ^2.2.0 - vite-plugin-svgr: 4.2.0 - vite-tsconfig-paths: 4.3.2 - zod: 3.22.4 - peerDependencies: - react: ^18 - react-dom: ^18 - languageName: unknown - linkType: soft - -"@voiceflow/sdk-runtime@workspace:*, @voiceflow/sdk-runtime@workspace:packages/sdk-runtime": - version: 0.0.0-use.local - resolution: "@voiceflow/sdk-runtime@workspace:packages/sdk-runtime" +"@voiceflow/sdk-runtime@npm:1.10.0": + version: 1.10.0 + resolution: "@voiceflow/sdk-runtime@npm:1.10.0" dependencies: - "@types/http-errors": ^1.8.2 "@voiceflow/base-types": 2.113.1 http-errors: 2.0.0 - languageName: unknown - linkType: soft + checksum: efeea04e11cedb31e6760944fe2fa165a0d3d1eb297db29d0d75795235425a1c637ee79c870563dac9bc6337d67fa55193368b96a8a51cbb38c92e0c60462c72 + languageName: node + linkType: hard "@voiceflow/slate-serializer@npm:1.4.2": version: 1.4.2 @@ -8005,15 +6580,6 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.14.0": - version: 8.14.0 - resolution: "acorn@npm:8.14.0" - bin: - acorn: bin/acorn - checksum: 8755074ba55fff94e84e81c72f1013c2d9c78e973c31231c8ae505a5f966859baf654bddd75046bffd73ce816b149298977fff5077a3033dedba0ae2aad152d4 - languageName: node - linkType: hard - "acorn@npm:^8.8.2": version: 8.11.2 resolution: "acorn@npm:8.11.2" @@ -8117,7 +6683,7 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^3.1.0, ansi-styles@npm:^3.2.1": +"ansi-styles@npm:^3.2.1": version: 3.2.1 resolution: "ansi-styles@npm:3.2.1" dependencies: @@ -8180,13 +6746,6 @@ __metadata: languageName: node linkType: hard -"arch@npm:^2.1.0": - version: 2.2.0 - resolution: "arch@npm:2.2.0" - checksum: e21b7635029fe8e9cdd5a026f9a6c659103e63fff423834323cdf836a1bb240a72d0c39ca8c470f84643385cf581bd8eda2cad8bf493e27e54bd9783abe9101f - languageName: node - linkType: hard - "are-docs-informative@npm:^0.0.2": version: 0.0.2 resolution: "are-docs-informative@npm:0.0.2" @@ -8204,13 +6763,6 @@ __metadata: languageName: node linkType: hard -"arg@npm:1.0.0": - version: 1.0.0 - resolution: "arg@npm:1.0.0" - checksum: 0a35939e3cb59d4f18207884563e00b0f71647becccec932348e9c5bdecfe6ca41b2ed854bbb267a2e87f97f605ed3ca936f2f0b3313bf88be6d7cdbb2d0a4b1 - languageName: node - linkType: hard - "argparse@npm:^1.0.7, argparse@npm:~1.0.9": version: 1.0.10 resolution: "argparse@npm:1.0.10" @@ -8326,13 +6878,6 @@ __metadata: languageName: node linkType: hard -"array-iterate@npm:^2.0.0": - version: 2.0.1 - resolution: "array-iterate@npm:2.0.1" - checksum: 932ddaab031ccec1a67a66d7663b1fa31828607fd673d5a00d61746610a290d3f13874c1ccc206c506ad17e47f477436914f9fd3cd311574b8b0a635d0ad31c9 - languageName: node - linkType: hard - "array-union@npm:^2.1.0": version: 2.1.0 resolution: "array-union@npm:2.1.0" @@ -8454,15 +6999,6 @@ __metadata: languageName: node linkType: hard -"astring@npm:^1.8.0": - version: 1.9.0 - resolution: "astring@npm:1.9.0" - bin: - astring: bin/astring - checksum: 69ffde3643f5280c6846231a995af878a94d3eab41d1a19a86b8c15f456453f63a7982cf5dd72d270b9f50dd26763a3e1e48377c961b7df16f550132b6dba805 - languageName: node - linkType: hard - "async@npm:^2.6.4": version: 2.6.4 resolution: "async@npm:2.6.4" @@ -8659,21 +7195,10 @@ __metadata: "better-opn@npm:^3.0.2": version: 3.0.2 - resolution: "better-opn@npm:3.0.2" - dependencies: - open: ^8.0.4 - checksum: 1471552fa7f733561e7f49e812be074b421153006ca744de985fb6d38939807959fc5fe9cb819cf09f864782e294704fd3b31711ea14c115baf3330a2f1135de - languageName: node - linkType: hard - -"better-react-mathjax@npm:^2.0.3": - version: 2.0.3 - resolution: "better-react-mathjax@npm:2.0.3" + resolution: "better-opn@npm:3.0.2" dependencies: - mathjax-full: ^3.2.2 - peerDependencies: - react: ">=16.8" - checksum: 35e525fecfde2f8ed2787ddebe4d67ded8de89a7afb648a87f0247b1c42bff5d0d962849aee602af8f471ff7c241fe8d60c79c3d8cbc0f2d6d63ddad1c8c4feb + open: ^8.0.4 + checksum: 1471552fa7f733561e7f49e812be074b421153006ca744de985fb6d38939807959fc5fe9cb819cf09f864782e294704fd3b31711ea14c115baf3330a2f1135de languageName: node linkType: hard @@ -8684,13 +7209,6 @@ __metadata: languageName: node linkType: hard -"big.js@npm:^5.2.2": - version: 5.2.2 - resolution: "big.js@npm:5.2.2" - checksum: b89b6e8419b097a8fb4ed2399a1931a68c612bce3cfd5ca8c214b2d017531191070f990598de2fc6f3f993d91c0f08aa82697717f6b3b8732c9731866d233c9e - languageName: node - linkType: hard - "binary-extensions@npm:^2.0.0": version: 2.2.0 resolution: "binary-extensions@npm:2.2.0" @@ -8865,15 +7383,6 @@ __metadata: languageName: node linkType: hard -"busboy@npm:1.6.0": - version: 1.6.0 - resolution: "busboy@npm:1.6.0" - dependencies: - streamsearch: ^1.1.0 - checksum: 32801e2c0164e12106bf236291a00795c3c4e4b709ae02132883fe8478ba2ae23743b11c5735a0aae8afe65ac4b6ca4568b91f0d9fed1fdbc32ede824a73746e - languageName: node - linkType: hard - "bytes@npm:3.0.0": version: 3.0.0 resolution: "bytes@npm:3.0.0" @@ -8989,13 +7498,6 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001579": - version: 1.0.30001664 - resolution: "caniuse-lite@npm:1.0.30001664" - checksum: cee25b4ea8a84779b7c9a60c1f9e304f6d99b79ef622b25fbc7873b4e55e8722a1091dd6c8b77bd7723e9f26a84b4a820a50a864989dd477e7ee51dc30461dca - languageName: node - linkType: hard - "caniuse-lite@npm:^1.0.30001587": version: 1.0.30001599 resolution: "caniuse-lite@npm:1.0.30001599" @@ -9025,17 +7527,6 @@ __metadata: languageName: node linkType: hard -"chalk@npm:2.3.0": - version: 2.3.0 - resolution: "chalk@npm:2.3.0" - dependencies: - ansi-styles: ^3.1.0 - escape-string-regexp: ^1.0.5 - supports-color: ^4.0.0 - checksum: d348fc0f4f8d27c068a6ac492e708fa35a75e273d5f0004da61ea694e958981658c96693790f4d23e7b3712f9e3e4ca0988136cb0403876de5459a4c0d13078f - languageName: node - linkType: hard - "chalk@npm:5.3.0, chalk@npm:^5.3.0": version: 5.3.0 resolution: "chalk@npm:5.3.0" @@ -9132,31 +7623,6 @@ __metadata: languageName: node linkType: hard -"chevrotain-allstar@npm:~0.3.0": - version: 0.3.1 - resolution: "chevrotain-allstar@npm:0.3.1" - dependencies: - lodash-es: ^4.17.21 - peerDependencies: - chevrotain: ^11.0.0 - checksum: 5f5213693886d03ca04ffacc57f7424b5c8015e7a62de3c193c3bc94ae7472f113e9fab7f4e92ce0553c181483950a170576897d7b695aac6196ce32b988475e - languageName: node - linkType: hard - -"chevrotain@npm:~11.0.3": - version: 11.0.3 - resolution: "chevrotain@npm:11.0.3" - dependencies: - "@chevrotain/cst-dts-gen": 11.0.3 - "@chevrotain/gast": 11.0.3 - "@chevrotain/regexp-to-ast": 11.0.3 - "@chevrotain/types": 11.0.3 - "@chevrotain/utils": 11.0.3 - lodash-es: 4.17.21 - checksum: 43abce4ef2be2ae499027066ad5bfb2dd6b838423108adc69839133655b925a4d86212b97125d8deef9f84dc173b34457eedf59a2d178b6d0b2a0d2e2a7762a4 - languageName: node - linkType: hard - "chokidar@npm:^3.0.0, chokidar@npm:^3.5.3": version: 3.5.3 resolution: "chokidar@npm:3.5.3" @@ -9324,23 +7790,6 @@ __metadata: languageName: node linkType: hard -"client-only@npm:0.0.1": - version: 0.0.1 - resolution: "client-only@npm:0.0.1" - checksum: 0c16bf660dadb90610553c1d8946a7fdfb81d624adea073b8440b7d795d5b5b08beb3c950c6a2cf16279365a3265158a236876d92bce16423c485c322d7dfaf8 - languageName: node - linkType: hard - -"clipboardy@npm:1.2.2": - version: 1.2.2 - resolution: "clipboardy@npm:1.2.2" - dependencies: - arch: ^2.1.0 - execa: ^0.8.0 - checksum: 7744a95e014e5945f17554b426fe78c6e1329ead85a61fa589dd4c3f4a596a037d45cad0bfaa3e60bdf77717f0dfda67c35454216f4dbb7832ec0eba42ba8a06 - languageName: node - linkType: hard - "cliui@npm:^7.0.2": version: 7.0.4 resolution: "cliui@npm:7.0.4" @@ -9377,13 +7826,6 @@ __metadata: languageName: node linkType: hard -"clsx@npm:^2.0.0": - version: 2.1.1 - resolution: "clsx@npm:2.1.1" - checksum: acd3e1ab9d8a433ecb3cc2f6a05ab95fe50b4a3cfc5ba47abb6cbf3754585fcb87b84e90c822a1f256c4198e3b41c7f6c391577ffc8678ad587fc0976b24fd57 - languageName: node - linkType: hard - "co@npm:3.1.0": version: 3.1.0 resolution: "co@npm:3.1.0" @@ -9407,13 +7849,6 @@ __metadata: languageName: node linkType: hard -"collapse-white-space@npm:^2.0.0": - version: 2.1.0 - resolution: "collapse-white-space@npm:2.1.0" - checksum: c8978b1f4e7d68bf846cfdba6c6689ce8910511df7d331eb6e6757e51ceffb52768d59a28db26186c91dcf9594955b59be9f8ccd473c485790f5d8b90dc6726f - languageName: node - linkType: hard - "color-convert@npm:^1.9.0": version: 1.9.3 resolution: "color-convert@npm:1.9.3" @@ -9478,13 +7913,6 @@ __metadata: languageName: node linkType: hard -"comma-separated-tokens@npm:^1.0.0": - version: 1.0.8 - resolution: "comma-separated-tokens@npm:1.0.8" - checksum: 0adcb07174fa4d08cf0f5c8e3aec40a36b5ff0c2c720e5e23f50fe02e6789d1d00a67036c80e0c1e1539f41d3e7f0101b074039dd833b4e4a59031b659d6ca0d - languageName: node - linkType: hard - "comma-separated-tokens@npm:^2.0.0": version: 2.0.3 resolution: "comma-separated-tokens@npm:2.0.3" @@ -9506,20 +7934,6 @@ __metadata: languageName: node linkType: hard -"commander@npm:7": - version: 7.2.0 - resolution: "commander@npm:7.2.0" - checksum: 53501cbeee61d5157546c0bef0fedb6cdfc763a882136284bed9a07225f09a14b82d2a84e7637edfd1a679fb35ed9502fd58ef1d091e6287f60d790147f68ddc - languageName: node - linkType: hard - -"commander@npm:9.2.0": - version: 9.2.0 - resolution: "commander@npm:9.2.0" - checksum: 7c82e4cd969712aa6d7c055b8351807a7230f9f31ef7ec7881e11a1147511de85adf5d6ccfd200240a118eecf693b220caf6865b8efbcea558a70d35aa9ed711 - languageName: node - linkType: hard - "commander@npm:^2.20.0, commander@npm:^2.20.3": version: 2.20.3 resolution: "commander@npm:2.20.3" @@ -9603,13 +8017,6 @@ __metadata: languageName: node linkType: hard -"compute-scroll-into-view@npm:^3.0.2": - version: 3.1.0 - resolution: "compute-scroll-into-view@npm:3.1.0" - checksum: 224549d6dd1d40342230de5c6d69cac5c3ed5c2f6a4437310f959aadc8db1d20b03da44a6e0de14d9419c6f9130ce51ec99a91b11bde55d4640f10551c89c213 - languageName: node - linkType: hard - "computeds@npm:^0.0.1": version: 0.0.1 resolution: "computeds@npm:0.0.1" @@ -9636,13 +8043,6 @@ __metadata: languageName: node linkType: hard -"confbox@npm:^0.1.7": - version: 0.1.7 - resolution: "confbox@npm:0.1.7" - checksum: bde836c26f5154a348b0c0a757f8a0138929e5737e0553be3c4f07a056abca618b861aa63ac3b22d344789b56be99a1382928933e08cd500df00213bf4d8fb43 - languageName: node - linkType: hard - "confusing-browser-globals@npm:^1.0.10": version: 1.0.10 resolution: "confusing-browser-globals@npm:1.0.10" @@ -9826,24 +8226,6 @@ __metadata: languageName: node linkType: hard -"cose-base@npm:^1.0.0": - version: 1.0.3 - resolution: "cose-base@npm:1.0.3" - dependencies: - layout-base: ^1.0.0 - checksum: 3f3d592316df74adb215ca91e430f1c22b6e890bc0025b32ae1f6464c73fdb9614816cb40a8d38b40c6a3e9e7b8c64eda90d53fb9a4a6948abec17dad496f30b - languageName: node - linkType: hard - -"cose-base@npm:^2.2.0": - version: 2.2.0 - resolution: "cose-base@npm:2.2.0" - dependencies: - layout-base: ^2.0.0 - checksum: 2e694f340bf216c71fc126d237578a4168e138720011d0b48c88bf9bfc7fd45f912eff2c603ef3d1307d6e3ce6f465ed382285a764a3a6620db590c5457d2557 - languageName: node - linkType: hard - "cosmiconfig-typescript-loader@npm:^5.0.0": version: 5.0.0 resolution: "cosmiconfig-typescript-loader@npm:5.0.0" @@ -9984,7 +8366,7 @@ __metadata: languageName: node linkType: hard -"css-what@npm:^6.0.1, css-what@npm:^6.1.0": +"css-what@npm:^6.0.1": version: 6.1.0 resolution: "css-what@npm:6.1.0" checksum: b975e547e1e90b79625918f84e67db5d33d896e6de846c9b584094e529f0c63e2ab85ee33b9daffd05bff3a146a1916bec664e18bb76dd5f66cbff9fc13b2bbe @@ -9998,15 +8380,6 @@ __metadata: languageName: node linkType: hard -"cssesc@npm:^3.0.0": - version: 3.0.0 - resolution: "cssesc@npm:3.0.0" - bin: - cssesc: bin/cssesc - checksum: f8c4ababffbc5e2ddf2fa9957dda1ee4af6048e22aeda1869d0d00843223c1b13ad3f5d88b51caa46c994225eacb636b764eb807a8883e2fb6f99b4f4e8c48b2 - languageName: node - linkType: hard - "csstype@npm:3.1.0, csstype@npm:^3.0.2": version: 3.1.0 resolution: "csstype@npm:3.1.0" @@ -10028,7 +8401,7 @@ __metadata: languageName: node linkType: hard -"csstype@npm:^3.0.7, csstype@npm:^3.1.2": +"csstype@npm:^3.1.2": version: 3.1.3 resolution: "csstype@npm:3.1.3" checksum: 8db785cc92d259102725b3c694ec0c823f5619a84741b5c7991b8ad135dfaa66093038a1cc63e03361a6cd28d122be48f2106ae72334e067dd619a51f49eddf7 @@ -10053,398 +8426,6 @@ __metadata: languageName: node linkType: hard -"cytoscape-cose-bilkent@npm:^4.1.0": - version: 4.1.0 - resolution: "cytoscape-cose-bilkent@npm:4.1.0" - dependencies: - cose-base: ^1.0.0 - peerDependencies: - cytoscape: ^3.2.0 - checksum: bea6aa139e21bf4135b01b99f8778eed061e074d1a1689771597e8164a999d66f4075d46be584b0a88a5447f9321f38c90c8821df6a9322faaf5afebf4848d97 - languageName: node - linkType: hard - -"cytoscape-fcose@npm:^2.2.0": - version: 2.2.0 - resolution: "cytoscape-fcose@npm:2.2.0" - dependencies: - cose-base: ^2.2.0 - peerDependencies: - cytoscape: ^3.2.0 - checksum: 94ffe6f131f9c08c2a0a7a6ce1c6c5e523a395bf8d84eba6d4a5f85e23f33788ea3ff807540861a5f78a6914a27729e06a7e6f66784f4f28ea1c030acf500121 - languageName: node - linkType: hard - -"cytoscape@npm:^3.29.2": - version: 3.30.2 - resolution: "cytoscape@npm:3.30.2" - checksum: 45ec8f256b6bb59d505bf92f937d86d2547c62cd45e02e7e873320f321d39bb57261aad0dad06d0903f2af50decb367aa0a05193043da5332dc6feb37dce888c - languageName: node - linkType: hard - -"d3-array@npm:1 - 2": - version: 2.12.1 - resolution: "d3-array@npm:2.12.1" - dependencies: - internmap: ^1.0.0 - checksum: 97853b7b523aded17078f37c67742f45d81e88dda2107ae9994c31b9e36c5fa5556c4c4cf39650436f247813602dfe31bf7ad067ff80f127a16903827f10c6eb - languageName: node - linkType: hard - -"d3-array@npm:2 - 3, d3-array@npm:2.10.0 - 3, d3-array@npm:2.5.0 - 3, d3-array@npm:3, d3-array@npm:^3.2.0": - version: 3.2.4 - resolution: "d3-array@npm:3.2.4" - dependencies: - internmap: 1 - 2 - checksum: a5976a6d6205f69208478bb44920dd7ce3e788c9dceb86b304dbe401a4bfb42ecc8b04c20facde486e9adcb488b5d1800d49393a3f81a23902b68158e12cddd0 - languageName: node - linkType: hard - -"d3-axis@npm:3": - version: 3.0.0 - resolution: "d3-axis@npm:3.0.0" - checksum: 227ddaa6d4bad083539c1ec245e2228b4620cca941997a8a650cb0af239375dc20271993127eedac66f0543f331027aca09385e1e16eed023f93eac937cddf0b - languageName: node - linkType: hard - -"d3-brush@npm:3": - version: 3.0.0 - resolution: "d3-brush@npm:3.0.0" - dependencies: - d3-dispatch: 1 - 3 - d3-drag: 2 - 3 - d3-interpolate: 1 - 3 - d3-selection: 3 - d3-transition: 3 - checksum: 1d042167769a02ac76271c71e90376d7184206e489552b7022a8ec2860209fe269db55e0a3430f3dcbe13b6fec2ff65b1adeaccba3218991b38e022390df72e3 - languageName: node - linkType: hard - -"d3-chord@npm:3": - version: 3.0.1 - resolution: "d3-chord@npm:3.0.1" - dependencies: - d3-path: 1 - 3 - checksum: ddf35d41675e0f8738600a8a2f05bf0858def413438c12cba357c5802ecc1014c80a658acbbee63cbad2a8c747912efb2358455d93e59906fe37469f1dc6b78b - languageName: node - linkType: hard - -"d3-color@npm:1 - 3, d3-color@npm:3": - version: 3.1.0 - resolution: "d3-color@npm:3.1.0" - checksum: 4931fbfda5d7c4b5cfa283a13c91a954f86e3b69d75ce588d06cde6c3628cebfc3af2069ccf225e982e8987c612aa7948b3932163ce15eb3c11cd7c003f3ee3b - languageName: node - linkType: hard - -"d3-contour@npm:4": - version: 4.0.2 - resolution: "d3-contour@npm:4.0.2" - dependencies: - d3-array: ^3.2.0 - checksum: 56aa082c1acf62a45b61c8d29fdd307041785aa17d9a07de7d1d848633769887a33fb6823888afa383f31c460d0f21d24756593e84e334ddb92d774214d32f1b - languageName: node - linkType: hard - -"d3-delaunay@npm:6": - version: 6.0.4 - resolution: "d3-delaunay@npm:6.0.4" - dependencies: - delaunator: 5 - checksum: ce6d267d5ef21a8aeadfe4606329fc80a22ab6e7748d47bc220bcc396ee8be84b77a5473033954c5ac4aa522d265ddc45d4165d30fe4787dd60a15ea66b9bbb4 - languageName: node - linkType: hard - -"d3-dispatch@npm:1 - 3, d3-dispatch@npm:3": - version: 3.0.1 - resolution: "d3-dispatch@npm:3.0.1" - checksum: fdfd4a230f46463e28e5b22a45dd76d03be9345b605e1b5dc7d18bd7ebf504e6c00ae123fd6d03e23d9e2711e01f0e14ea89cd0632545b9f0c00b924ba4be223 - languageName: node - linkType: hard - -"d3-drag@npm:2 - 3, d3-drag@npm:3": - version: 3.0.0 - resolution: "d3-drag@npm:3.0.0" - dependencies: - d3-dispatch: 1 - 3 - d3-selection: 3 - checksum: d297231e60ecd633b0d076a63b4052b436ddeb48b5a3a11ff68c7e41a6774565473a6b064c5e9256e88eca6439a917ab9cea76032c52d944ddbf4fd289e31111 - languageName: node - linkType: hard - -"d3-dsv@npm:1 - 3, d3-dsv@npm:3": - version: 3.0.1 - resolution: "d3-dsv@npm:3.0.1" - dependencies: - commander: 7 - iconv-lite: 0.6 - rw: 1 - bin: - csv2json: bin/dsv2json.js - csv2tsv: bin/dsv2dsv.js - dsv2dsv: bin/dsv2dsv.js - dsv2json: bin/dsv2json.js - json2csv: bin/json2dsv.js - json2dsv: bin/json2dsv.js - json2tsv: bin/json2dsv.js - tsv2csv: bin/dsv2dsv.js - tsv2json: bin/dsv2json.js - checksum: 5fc0723647269d5dccd181d74f2265920ab368a2868b0b4f55ffa2fecdfb7814390ea28622cd61ee5d9594ab262879509059544e9f815c54fe76fbfb4ffa4c8a - languageName: node - linkType: hard - -"d3-ease@npm:1 - 3, d3-ease@npm:3": - version: 3.0.1 - resolution: "d3-ease@npm:3.0.1" - checksum: 06e2ee5326d1e3545eab4e2c0f84046a123dcd3b612e68858219aa034da1160333d9ce3da20a1d3486d98cb5c2a06f7d233eee1bc19ce42d1533458bd85dedcd - languageName: node - linkType: hard - -"d3-fetch@npm:3": - version: 3.0.1 - resolution: "d3-fetch@npm:3.0.1" - dependencies: - d3-dsv: 1 - 3 - checksum: 382dcea06549ef82c8d0b719e5dc1d96286352579e3b51b20f71437f5800323315b09cf7dcfd4e1f60a41e1204deb01758470cea257d2285a7abd9dcec806984 - languageName: node - linkType: hard - -"d3-force@npm:3": - version: 3.0.0 - resolution: "d3-force@npm:3.0.0" - dependencies: - d3-dispatch: 1 - 3 - d3-quadtree: 1 - 3 - d3-timer: 1 - 3 - checksum: 6c7e96438cab62fa32aeadb0ade3297b62b51f81b1b38b0a60a5ec9fd627d74090c1189654d92df2250775f31b06812342f089f1d5947de9960a635ee3581def - languageName: node - linkType: hard - -"d3-format@npm:1 - 3, d3-format@npm:3": - version: 3.1.0 - resolution: "d3-format@npm:3.1.0" - checksum: f345ec3b8ad3cab19bff5dead395bd9f5590628eb97a389b1dd89f0b204c7c4fc1d9520f13231c2c7cf14b7c9a8cf10f8ef15bde2befbab41454a569bd706ca2 - languageName: node - linkType: hard - -"d3-geo@npm:3": - version: 3.1.1 - resolution: "d3-geo@npm:3.1.1" - dependencies: - d3-array: 2.5.0 - 3 - checksum: 3cc4bb50af5d2d4858d2df1729a1777b7fd361854079d9faab1166186c988d2cba0d11911da0c4598d5e22fae91d79113ed262a9f98cabdbc6dbf7c30e5c0363 - languageName: node - linkType: hard - -"d3-hierarchy@npm:3": - version: 3.1.2 - resolution: "d3-hierarchy@npm:3.1.2" - checksum: 0fd946a8c5fd4686d43d3e11bbfc2037a145fda29d2261ccd0e36f70b66af6d7638e2c0c7112124d63fc3d3127197a00a6aecf676bd5bd392a94d7235a214263 - languageName: node - linkType: hard - -"d3-interpolate@npm:1 - 3, d3-interpolate@npm:1.2.0 - 3, d3-interpolate@npm:3": - version: 3.0.1 - resolution: "d3-interpolate@npm:3.0.1" - dependencies: - d3-color: 1 - 3 - checksum: a42ba314e295e95e5365eff0f604834e67e4a3b3c7102458781c477bd67e9b24b6bb9d8e41ff5521050a3f2c7c0c4bbbb6e187fd586daa3980943095b267e78b - languageName: node - linkType: hard - -"d3-path@npm:1": - version: 1.0.9 - resolution: "d3-path@npm:1.0.9" - checksum: d4382573baf9509a143f40944baeff9fead136926aed6872f7ead5b3555d68925f8a37935841dd51f1d70b65a294fe35c065b0906fb6e42109295f6598fc16d0 - languageName: node - linkType: hard - -"d3-path@npm:1 - 3, d3-path@npm:3, d3-path@npm:^3.1.0": - version: 3.1.0 - resolution: "d3-path@npm:3.1.0" - checksum: 2306f1bd9191e1eac895ec13e3064f732a85f243d6e627d242a313f9777756838a2215ea11562f0c7630c7c3b16a19ec1fe0948b1c82f3317fac55882f6ee5d8 - languageName: node - linkType: hard - -"d3-polygon@npm:3": - version: 3.0.1 - resolution: "d3-polygon@npm:3.0.1" - checksum: 0b85c532517895544683849768a2c377cee3801ef8ccf3fa9693c8871dd21a0c1a2a0fc75ff54192f0ba2c562b0da2bc27f5bf959dfafc7fa23573b574865d2c - languageName: node - linkType: hard - -"d3-quadtree@npm:1 - 3, d3-quadtree@npm:3": - version: 3.0.1 - resolution: "d3-quadtree@npm:3.0.1" - checksum: 5469d462763811475f34a7294d984f3eb100515b0585ca5b249656f6b1a6e99b20056a2d2e463cc9944b888896d2b1d07859c50f9c0cf23438df9cd2e3146066 - languageName: node - linkType: hard - -"d3-random@npm:3": - version: 3.0.1 - resolution: "d3-random@npm:3.0.1" - checksum: a70ad8d1cabe399ebeb2e482703121ac8946a3b336830b518da6848b9fdd48a111990fc041dc716f16885a72176ffa2898f2a250ca3d363ecdba5ef92b18e131 - languageName: node - linkType: hard - -"d3-sankey@npm:^0.12.3": - version: 0.12.3 - resolution: "d3-sankey@npm:0.12.3" - dependencies: - d3-array: 1 - 2 - d3-shape: ^1.2.0 - checksum: df1cb9c9d02dd8fd14040e89f112f0da58c03bd7529fa001572a6925a51496d1d82ff25d9fedb6c429a91645fbd2476c19891e535ac90c8bc28337c33ee21c87 - languageName: node - linkType: hard - -"d3-scale-chromatic@npm:3": - version: 3.1.0 - resolution: "d3-scale-chromatic@npm:3.1.0" - dependencies: - d3-color: 1 - 3 - d3-interpolate: 1 - 3 - checksum: ab6324bd8e1f708e731e02ab44e09741efda2b174cea1d8ca21e4a87546295e99856bc44e2fd3890f228849c96bccfbcf922328f95be6a7df117453eb5cf22c9 - languageName: node - linkType: hard - -"d3-scale@npm:4": - version: 4.0.2 - resolution: "d3-scale@npm:4.0.2" - dependencies: - d3-array: 2.10.0 - 3 - d3-format: 1 - 3 - d3-interpolate: 1.2.0 - 3 - d3-time: 2.1.1 - 3 - d3-time-format: 2 - 4 - checksum: a9c770d283162c3bd11477c3d9d485d07f8db2071665f1a4ad23eec3e515e2cefbd369059ec677c9ac849877d1a765494e90e92051d4f21111aa56791c98729e - languageName: node - linkType: hard - -"d3-selection@npm:2 - 3, d3-selection@npm:3": - version: 3.0.0 - resolution: "d3-selection@npm:3.0.0" - checksum: f4e60e133309115b99f5b36a79ae0a19d71ee6e2d5e3c7216ef3e75ebd2cb1e778c2ed2fa4c01bef35e0dcbd96c5428f5bd6ca2184fe2957ed582fde6841cbc5 - languageName: node - linkType: hard - -"d3-shape@npm:3": - version: 3.2.0 - resolution: "d3-shape@npm:3.2.0" - dependencies: - d3-path: ^3.1.0 - checksum: de2af5fc9a93036a7b68581ca0bfc4aca2d5a328aa7ba7064c11aedd44d24f310c20c40157cb654359d4c15c3ef369f95ee53d71221017276e34172c7b719cfa - languageName: node - linkType: hard - -"d3-shape@npm:^1.2.0": - version: 1.3.7 - resolution: "d3-shape@npm:1.3.7" - dependencies: - d3-path: 1 - checksum: 46566a3ab64a25023653bf59d64e81e9e6c987e95be985d81c5cedabae5838bd55f4a201a6b69069ca862eb63594cd263cac9034afc2b0e5664dfe286c866129 - languageName: node - linkType: hard - -"d3-time-format@npm:2 - 4, d3-time-format@npm:4": - version: 4.1.0 - resolution: "d3-time-format@npm:4.1.0" - dependencies: - d3-time: 1 - 3 - checksum: 7342bce28355378152bbd4db4e275405439cabba082d9cd01946d40581140481c8328456d91740b0fe513c51ec4a467f4471ffa390c7e0e30ea30e9ec98fcdf4 - languageName: node - linkType: hard - -"d3-time@npm:1 - 3, d3-time@npm:2.1.1 - 3, d3-time@npm:3": - version: 3.1.0 - resolution: "d3-time@npm:3.1.0" - dependencies: - d3-array: 2 - 3 - checksum: 613b435352a78d9f31b7f68540788186d8c331b63feca60ad21c88e9db1989fe888f97f242322ebd6365e45ec3fb206a4324cd4ca0dfffa1d9b5feb856ba00a7 - languageName: node - linkType: hard - -"d3-timer@npm:1 - 3, d3-timer@npm:3": - version: 3.0.1 - resolution: "d3-timer@npm:3.0.1" - checksum: 1cfddf86d7bca22f73f2c427f52dfa35c49f50d64e187eb788dcad6e927625c636aa18ae4edd44d084eb9d1f81d8ca4ec305dae7f733c15846a824575b789d73 - languageName: node - linkType: hard - -"d3-transition@npm:2 - 3, d3-transition@npm:3": - version: 3.0.1 - resolution: "d3-transition@npm:3.0.1" - dependencies: - d3-color: 1 - 3 - d3-dispatch: 1 - 3 - d3-ease: 1 - 3 - d3-interpolate: 1 - 3 - d3-timer: 1 - 3 - peerDependencies: - d3-selection: 2 - 3 - checksum: cb1e6e018c3abf0502fe9ff7b631ad058efb197b5e14b973a410d3935aead6e3c07c67d726cfab258e4936ef2667c2c3d1cd2037feb0765f0b4e1d3b8788c0ea - languageName: node - linkType: hard - -"d3-zoom@npm:3": - version: 3.0.0 - resolution: "d3-zoom@npm:3.0.0" - dependencies: - d3-dispatch: 1 - 3 - d3-drag: 2 - 3 - d3-interpolate: 1 - 3 - d3-selection: 2 - 3 - d3-transition: 2 - 3 - checksum: 8056e3527281cfd1ccbcbc458408f86973b0583e9dac00e51204026d1d36803ca437f970b5736f02fafed9f2b78f145f72a5dbc66397e02d4d95d4c594b8ff54 - languageName: node - linkType: hard - -"d3@npm:^7.8.2, d3@npm:^7.9.0": - version: 7.9.0 - resolution: "d3@npm:7.9.0" - dependencies: - d3-array: 3 - d3-axis: 3 - d3-brush: 3 - d3-chord: 3 - d3-color: 3 - d3-contour: 4 - d3-delaunay: 6 - d3-dispatch: 3 - d3-drag: 3 - d3-dsv: 3 - d3-ease: 3 - d3-fetch: 3 - d3-force: 3 - d3-format: 3 - d3-geo: 3 - d3-hierarchy: 3 - d3-interpolate: 3 - d3-path: 3 - d3-polygon: 3 - d3-quadtree: 3 - d3-random: 3 - d3-scale: 4 - d3-scale-chromatic: 3 - d3-selection: 3 - d3-shape: 3 - d3-time: 3 - d3-time-format: 4 - d3-timer: 3 - d3-transition: 3 - d3-zoom: 3 - checksum: 1c0e9135f1fb78aa32b187fafc8b56ae6346102bd0e4e5e5a5339611a51e6038adbaa293fae373994228100eddd87320e930b1be922baeadc07c9fd43d26d99b - languageName: node - linkType: hard - -"dagre-d3-es@npm:7.0.10": - version: 7.0.10 - resolution: "dagre-d3-es@npm:7.0.10" - dependencies: - d3: ^7.8.2 - lodash-es: ^4.17.21 - checksum: 25194e80dfad48db0dc2e0a273a7c9fcbfdc4cf993b219eaa1e0e0ce0cbb8c63be42fa2aa0c5f9bf9b324c34b8b2e300bb2a1606d5ae35c2de00f9c4ac317d8e - languageName: node - linkType: hard - "damerau-levenshtein@npm:^1.0.8": version: 1.0.8 resolution: "damerau-levenshtein@npm:1.0.8" @@ -10506,13 +8487,6 @@ __metadata: languageName: node linkType: hard -"dayjs@npm:^1.11.10": - version: 1.11.13 - resolution: "dayjs@npm:1.11.13" - checksum: f388db88a6aa93956c1f6121644e783391c7b738b73dbc54485578736565c8931bdfba4bb94e9b1535c6e509c97d5deb918bbe1ae6b34358d994de735055cca9 - languageName: node - linkType: hard - "de-indent@npm:^1.0.2": version: 1.0.2 resolution: "de-indent@npm:1.0.2" @@ -10562,18 +8536,6 @@ __metadata: languageName: node linkType: hard -"debug@npm:^4.3.6": - version: 4.3.7 - resolution: "debug@npm:4.3.7" - dependencies: - ms: ^2.1.3 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 822d74e209cd910ef0802d261b150314bbcf36c582ccdbb3e70f0894823c17e49a50d3e66d96b633524263975ca16b6a833f3e3b7e030c157169a5fabac63160 - languageName: node - linkType: hard - "decode-named-character-reference@npm:^1.0.0": version: 1.0.2 resolution: "decode-named-character-reference@npm:1.0.2" @@ -10583,18 +8545,6 @@ __metadata: languageName: node linkType: hard -"dedent@npm:^1.5.3": - version: 1.5.3 - resolution: "dedent@npm:1.5.3" - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - checksum: 045b595557b2a8ea2eb9b0b4623d764e9a87326486fe2b61191b4342ed93dc01245644d8a09f3108a50c0ee7965f1eedd92e4a3a503ed89ea8e810566ea27f9a - languageName: node - linkType: hard - "deep-eql@npm:^4.1.3": version: 4.1.3 resolution: "deep-eql@npm:4.1.3" @@ -10637,20 +8587,6 @@ __metadata: languageName: node linkType: hard -"deep-object-diff@npm:^1.1.9": - version: 1.1.9 - resolution: "deep-object-diff@npm:1.1.9" - checksum: ecd42455e4773f653595d28070295e7aaa8402db5f8ab21d0bec115a7cb4de5e207a5665514767da5f025c96597f1d3a0a4888aeb4dd49e03c996871a3aa05ef - languageName: node - linkType: hard - -"deepmerge@npm:^4.2.2": - version: 4.3.1 - resolution: "deepmerge@npm:4.3.1" - checksum: 2024c6a980a1b7128084170c4cf56b0fd58a63f2da1660dcfe977415f27b17dbe5888668b59d0b063753f3220719d5e400b7f113609489c90160bb9a5518d052 - languageName: node - linkType: hard - "default-browser-id@npm:3.0.0": version: 3.0.0 resolution: "default-browser-id@npm:3.0.0" @@ -10741,15 +8677,6 @@ __metadata: languageName: node linkType: hard -"delaunator@npm:5": - version: 5.0.1 - resolution: "delaunator@npm:5.0.1" - dependencies: - robust-predicates: ^3.0.2 - checksum: 69ee43ec649b4a13b7f33c8a027fb3e8dfcb09266af324286118da757e04d3d39df619b905dca41421405c311317ccf632ecfa93db44519bacec3303c57c5a0b - languageName: node - linkType: hard - "delayed-stream@npm:~1.0.0": version: 1.0.0 resolution: "delayed-stream@npm:1.0.0" @@ -10934,24 +8861,6 @@ __metadata: languageName: node linkType: hard -"documentation@workspace:apps/documentation": - version: 0.0.0-use.local - resolution: "documentation@workspace:apps/documentation" - dependencies: - "@types/node": 20.12.7 - "@types/react": 18.2.8 - "@types/react-dom": 18.2.4 - "@vanilla-extract/next-plugin": ^2.4.6 - "@voiceflow/react-chat": "workspace:*" - next: 14.2.13 - nextra: ^3.0.2 - nextra-theme-docs: ^3.0.2 - react: 18.2.0 - react-dom: 18.2.0 - regenerator-runtime: 0.13.11 - languageName: unknown - linkType: soft - "dom-accessibility-api@npm:^0.5.9": version: 0.5.14 resolution: "dom-accessibility-api@npm:0.5.14" @@ -11000,13 +8909,6 @@ __metadata: languageName: node linkType: hard -"dompurify@npm:^3.0.11": - version: 3.1.7 - resolution: "dompurify@npm:3.1.7" - checksum: 0a9b811bbc94f3dba60cf6486962362b0f1a5b4ab789f5e1cbd4749b6ba1a1fad190a677a962dc8850ce28764424765fe425e9d6508e4e93ba648ef15d54bc24 - languageName: node - linkType: hard - "domutils@npm:^2.8.0": version: 2.8.0 resolution: "domutils@npm:2.8.0" @@ -11130,13 +9032,6 @@ __metadata: languageName: node linkType: hard -"emojis-list@npm:^3.0.0": - version: 3.0.0 - resolution: "emojis-list@npm:3.0.0" - checksum: ddaaa02542e1e9436c03970eeed445f4ed29a5337dfba0fe0c38dfdd2af5da2429c2a0821304e8a8d1cadf27fdd5b22ff793571fa803ae16852a6975c65e8e70 - languageName: node - linkType: hard - "encodeurl@npm:~1.0.2": version: 1.0.2 resolution: "encodeurl@npm:1.0.2" @@ -11600,169 +9495,6 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.21.3": - version: 0.21.5 - resolution: "esbuild@npm:0.21.5" - dependencies: - "@esbuild/aix-ppc64": 0.21.5 - "@esbuild/android-arm": 0.21.5 - "@esbuild/android-arm64": 0.21.5 - "@esbuild/android-x64": 0.21.5 - "@esbuild/darwin-arm64": 0.21.5 - "@esbuild/darwin-x64": 0.21.5 - "@esbuild/freebsd-arm64": 0.21.5 - "@esbuild/freebsd-x64": 0.21.5 - "@esbuild/linux-arm": 0.21.5 - "@esbuild/linux-arm64": 0.21.5 - "@esbuild/linux-ia32": 0.21.5 - "@esbuild/linux-loong64": 0.21.5 - "@esbuild/linux-mips64el": 0.21.5 - "@esbuild/linux-ppc64": 0.21.5 - "@esbuild/linux-riscv64": 0.21.5 - "@esbuild/linux-s390x": 0.21.5 - "@esbuild/linux-x64": 0.21.5 - "@esbuild/netbsd-x64": 0.21.5 - "@esbuild/openbsd-x64": 0.21.5 - "@esbuild/sunos-x64": 0.21.5 - "@esbuild/win32-arm64": 0.21.5 - "@esbuild/win32-ia32": 0.21.5 - "@esbuild/win32-x64": 0.21.5 - dependenciesMeta: - "@esbuild/aix-ppc64": - optional: true - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 2911c7b50b23a9df59a7d6d4cdd3a4f85855787f374dce751148dbb13305e0ce7e880dde1608c2ab7a927fc6cec3587b80995f7fc87a64b455f8b70b55fd8ec1 - languageName: node - linkType: hard - -"esbuild@npm:esbuild@>=0.17.6 <0.24.0": - version: 0.23.1 - resolution: "esbuild@npm:0.23.1" - dependencies: - "@esbuild/aix-ppc64": 0.23.1 - "@esbuild/android-arm": 0.23.1 - "@esbuild/android-arm64": 0.23.1 - "@esbuild/android-x64": 0.23.1 - "@esbuild/darwin-arm64": 0.23.1 - "@esbuild/darwin-x64": 0.23.1 - "@esbuild/freebsd-arm64": 0.23.1 - "@esbuild/freebsd-x64": 0.23.1 - "@esbuild/linux-arm": 0.23.1 - "@esbuild/linux-arm64": 0.23.1 - "@esbuild/linux-ia32": 0.23.1 - "@esbuild/linux-loong64": 0.23.1 - "@esbuild/linux-mips64el": 0.23.1 - "@esbuild/linux-ppc64": 0.23.1 - "@esbuild/linux-riscv64": 0.23.1 - "@esbuild/linux-s390x": 0.23.1 - "@esbuild/linux-x64": 0.23.1 - "@esbuild/netbsd-x64": 0.23.1 - "@esbuild/openbsd-arm64": 0.23.1 - "@esbuild/openbsd-x64": 0.23.1 - "@esbuild/sunos-x64": 0.23.1 - "@esbuild/win32-arm64": 0.23.1 - "@esbuild/win32-ia32": 0.23.1 - "@esbuild/win32-x64": 0.23.1 - dependenciesMeta: - "@esbuild/aix-ppc64": - optional: true - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-arm64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 0413c3b9257327fb598427688b7186ea335bf1693746fe5713cc93c95854d6388b8ed4ad643fddf5b5ace093f7dcd9038dd58e087bf2da1f04dfb4c5571660af - languageName: node - linkType: hard - "esbuild@npm:~0.19.10": version: 0.19.12 resolution: "esbuild@npm:0.19.12" @@ -12533,13 +10265,6 @@ __metadata: languageName: node linkType: hard -"esm@npm:^3.2.25": - version: 3.2.25 - resolution: "esm@npm:3.2.25" - checksum: 978aabe2de83541c105605a6d60a26ed8e627ef6bb0a7605fe15a95bbdea6b8348bd045255cb22219c054dd09a81a94823df00843d9e97f42419c92015ce3a64 - languageName: node - linkType: hard - "espree@npm:^10.0.1": version: 10.0.1 resolution: "espree@npm:10.0.1" @@ -12611,34 +10336,6 @@ __metadata: languageName: node linkType: hard -"estree-util-attach-comments@npm:^3.0.0": - version: 3.0.0 - resolution: "estree-util-attach-comments@npm:3.0.0" - dependencies: - "@types/estree": ^1.0.0 - checksum: 56254eaef39659e6351919ebc2ae53a37a09290a14571c19e373e9d5fad343a3403d9ad0c23ae465d6e7d08c3e572fd56fb8c793efe6434a261bf1489932dbd5 - languageName: node - linkType: hard - -"estree-util-build-jsx@npm:^3.0.0": - version: 3.0.1 - resolution: "estree-util-build-jsx@npm:3.0.1" - dependencies: - "@types/estree-jsx": ^1.0.0 - devlop: ^1.0.0 - estree-util-is-identifier-name: ^3.0.0 - estree-walker: ^3.0.0 - checksum: 185eff060eda2ba32cecd15904db4f5ba0681159fbdf54f0f6586cd9411e77e733861a833d0aee3415e1d1fd4b17edf08bc9e9872cee98e6ec7b0800e1a85064 - languageName: node - linkType: hard - -"estree-util-is-identifier-name@npm:^2.0.0": - version: 2.1.0 - resolution: "estree-util-is-identifier-name@npm:2.1.0" - checksum: cab317a071fafb99cf83b57df7924bccd2e6ab4e252688739e49f00b16cefd168e279c171442b0557c80a1c80ffaa927d670dadea65bb3c9b151efb8e772e89d - languageName: node - linkType: hard - "estree-util-is-identifier-name@npm:^3.0.0": version: 3.0.0 resolution: "estree-util-is-identifier-name@npm:3.0.0" @@ -12646,35 +10343,6 @@ __metadata: languageName: node linkType: hard -"estree-util-to-js@npm:^2.0.0": - version: 2.0.0 - resolution: "estree-util-to-js@npm:2.0.0" - dependencies: - "@types/estree-jsx": ^1.0.0 - astring: ^1.8.0 - source-map: ^0.7.0 - checksum: 833edc94ab9978e0918f90261e0a3361bf4564fec4901f326d2237a9235d3f5fc6482da3be5acc545e702c8c7cb8bc5de5c7c71ba3b080eb1975bcfdf3923d79 - languageName: node - linkType: hard - -"estree-util-value-to-estree@npm:^1.3.0": - version: 1.3.0 - resolution: "estree-util-value-to-estree@npm:1.3.0" - dependencies: - is-plain-obj: ^3.0.0 - checksum: a13c65f0712f32897ecae128d30dedafc439e39ab3722b0a4e51c455a6a0f506fcf2cd4f4c5cce35dafb738f1f55a933a3a44ce277e2140d4a4133968b2becb3 - languageName: node - linkType: hard - -"estree-util-value-to-estree@npm:^3.0.1": - version: 3.1.2 - resolution: "estree-util-value-to-estree@npm:3.1.2" - dependencies: - "@types/estree": ^1.0.0 - checksum: 31c4b9f3a2e64119b994a86d70070325b6ec238a21842669e79b0d6a7190150293616c8f38fee1c369c18bbef405064d883aa38c05311db5d0a211a30e9924d6 - languageName: node - linkType: hard - "estree-util-visit@npm:^2.0.0": version: 2.0.0 resolution: "estree-util-visit@npm:2.0.0" @@ -12692,7 +10360,7 @@ __metadata: languageName: node linkType: hard -"estree-walker@npm:^3.0.0, estree-walker@npm:^3.0.3": +"estree-walker@npm:^3.0.3": version: 3.0.3 resolution: "estree-walker@npm:3.0.3" dependencies: @@ -12715,16 +10383,6 @@ __metadata: languageName: node linkType: hard -"eval@npm:0.1.8": - version: 0.1.8 - resolution: "eval@npm:0.1.8" - dependencies: - "@types/node": "*" - require-like: ">= 0.1.1" - checksum: d005567f394cfbe60948e34982e4637d2665030f9aa7dcac581ea6f9ec6eceb87133ed3dc0ae21764aa362485c242a731dbb6371f1f1a86807c58676431e9d1a - languageName: node - linkType: hard - "eventemitter3@npm:^4.0.0": version: 4.0.7 resolution: "eventemitter3@npm:4.0.7" @@ -12771,21 +10429,6 @@ __metadata: languageName: node linkType: hard -"execa@npm:^0.8.0": - version: 0.8.0 - resolution: "execa@npm:0.8.0" - dependencies: - cross-spawn: ^5.0.1 - get-stream: ^3.0.0 - is-stream: ^1.1.0 - npm-run-path: ^2.0.0 - p-finally: ^1.0.0 - signal-exit: ^3.0.0 - strip-eof: ^1.0.0 - checksum: c2a4bf6e051737e46bee61a93ec286cb71a05f16650a1918c8d6262ba9f0bac031472252411baa8c78b7f432f10cb4c601349403774d69be2ebd864e9b1eca60 - languageName: node - linkType: hard - "execa@npm:^5.0.0, execa@npm:^5.1.1": version: 5.1.1 resolution: "execa@npm:5.1.1" @@ -12892,15 +10535,6 @@ __metadata: languageName: node linkType: hard -"extend-shallow@npm:^2.0.1": - version: 2.0.1 - resolution: "extend-shallow@npm:2.0.1" - dependencies: - is-extendable: ^0.1.0 - checksum: 8fb58d9d7a511f4baf78d383e637bd7d2e80843bd9cd0853649108ea835208fb614da502a553acc30208e1325240bb7cc4a68473021612496bb89725483656d8 - languageName: node - linkType: hard - "extend@npm:^3.0.0": version: 3.0.2 resolution: "extend@npm:3.0.2" @@ -12935,7 +10569,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.1, fast-glob@npm:^3.3.2": +"fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.1": version: 3.3.2 resolution: "fast-glob@npm:3.3.2" dependencies: @@ -12980,15 +10614,6 @@ __metadata: languageName: node linkType: hard -"fault@npm:^2.0.0": - version: 2.0.1 - resolution: "fault@npm:2.0.1" - dependencies: - format: ^0.2.0 - checksum: c9b30f47d95769177130a9409976a899ed31eb598450fbad5b0d39f2f5f56d5f4a9ff9257e0bee8407cb0fc3ce37165657888c6aa6d78472e403893104329b72 - languageName: node - linkType: hard - "fetch-retry@npm:^5.0.2": version: 5.0.6 resolution: "fetch-retry@npm:5.0.6" @@ -13159,13 +10784,6 @@ __metadata: languageName: node linkType: hard -"flexsearch@npm:^0.7.43": - version: 0.7.43 - resolution: "flexsearch@npm:0.7.43" - checksum: 6ed78060ab530de52bda02ba736cb93f37fdf8ad33d1cc88c2b15cdf575eec33873485dc81ca693d1dee31160d3d1bf33fe2c7656db56a579bb3f33ea8664d29 - languageName: node - linkType: hard - "flow-parser@npm:0.*": version: 0.231.0 resolution: "flow-parser@npm:0.231.0" @@ -13841,13 +11459,6 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.2.11": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 - languageName: node - linkType: hard - "graphemer@npm:^1.4.0": version: 1.4.0 resolution: "graphemer@npm:1.4.0" @@ -13855,18 +11466,6 @@ __metadata: languageName: node linkType: hard -"gray-matter@npm:^4.0.3": - version: 4.0.3 - resolution: "gray-matter@npm:4.0.3" - dependencies: - js-yaml: ^3.13.1 - kind-of: ^6.0.2 - section-matter: ^1.0.0 - strip-bom-string: ^1.0.0 - checksum: 37717bd424344487d655392251ce8d8878a1275ee087003e61208fba3bfd59cbb73a85b2159abf742ae95e23db04964813fdc33ae18b074208428b2528205222 - languageName: node - linkType: hard - "gunzip-maybe@npm:^1.4.2": version: 1.4.2 resolution: "gunzip-maybe@npm:1.4.2" @@ -13883,13 +11482,6 @@ __metadata: languageName: node linkType: hard -"hachure-fill@npm:^0.5.2": - version: 0.5.2 - resolution: "hachure-fill@npm:0.5.2" - checksum: 01cf2ac6b787ec73ced3d6eb393a0f989d55f32431d1e8a1c1c864769d1b8763c9cb6aa1d45fb1c237a065de90167491c6a46193690b688ea6c25f575f84586c - languageName: node - linkType: hard - "handlebars@npm:^4.7.7": version: 4.7.7 resolution: "handlebars@npm:4.7.7" @@ -13933,13 +11525,6 @@ __metadata: languageName: node linkType: hard -"has-flag@npm:^2.0.0": - version: 2.0.0 - resolution: "has-flag@npm:2.0.0" - checksum: 7d060d142ef6740c79991cb99afe5962b267e6e95538bf8b607026b9b1e7451288927bc8e7b4a9484a8b99935c0af023070f91ee49faef791ecd401dc58b2e8d - languageName: node - linkType: hard - "has-flag@npm:^3.0.0": version: 3.0.0 resolution: "has-flag@npm:3.0.0" @@ -14029,47 +11614,10 @@ __metadata: "hasown@npm:^2.0.0, hasown@npm:^2.0.1, hasown@npm:^2.0.2": version: 2.0.2 - resolution: "hasown@npm:2.0.2" - dependencies: - function-bind: ^1.1.2 - checksum: e8516f776a15149ca6c6ed2ae3110c417a00b62260e222590e54aa367cbcd6ed99122020b37b7fbdf05748df57b265e70095d7bf35a47660587619b15ffb93db - languageName: node - linkType: hard - -"hast-util-from-dom@npm:^5.0.0": - version: 5.0.0 - resolution: "hast-util-from-dom@npm:5.0.0" - dependencies: - "@types/hast": ^3.0.0 - hastscript: ^8.0.0 - web-namespaces: ^2.0.0 - checksum: bf8f96c480a598b42156227be2210bbb7a08da519ae4d57814385c8560b01e2b6b5fbde2afce808ce7ba7c5cd172822d4285b8f5edde2d13089bc9c3177c0d09 - languageName: node - linkType: hard - -"hast-util-from-html-isomorphic@npm:^2.0.0": - version: 2.0.0 - resolution: "hast-util-from-html-isomorphic@npm:2.0.0" - dependencies: - "@types/hast": ^3.0.0 - hast-util-from-dom: ^5.0.0 - hast-util-from-html: ^2.0.0 - unist-util-remove-position: ^5.0.0 - checksum: a98d02890bd1b5a804a1b2aaacd0332a6563f2a8df620450e38ab8962728cda0485cd29435824840621d1e653943776864e912d78d24cce6a7f484011ee7cef0 - languageName: node - linkType: hard - -"hast-util-from-html@npm:^2.0.0": - version: 2.0.3 - resolution: "hast-util-from-html@npm:2.0.3" + resolution: "hasown@npm:2.0.2" 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 - checksum: 50f589f25a82868d611668421ff1d7997778743b34fbde77cd74d152350162b5045090c65ee3c3e2b4d51568f35426a0fc851ee1965723e1abf466f7f9d0bd83 + function-bind: ^1.1.2 + checksum: e8516f776a15149ca6c6ed2ae3110c417a00b62260e222590e54aa367cbcd6ed99122020b37b7fbdf05748df57b265e70095d7bf35a47660587619b15ffb93db languageName: node linkType: hard @@ -14107,13 +11655,6 @@ __metadata: languageName: node linkType: hard -"hast-util-parse-selector@npm:^2.0.0": - version: 2.2.5 - resolution: "hast-util-parse-selector@npm:2.2.5" - checksum: 22ee4afbd11754562144cb3c4f3ec52524dafba4d90ee52512902d17cf11066d83b38f7bdf6ca571bbc2541f07ba30db0d234657b6ecb8ca4631587466459605 - languageName: node - linkType: hard - "hast-util-parse-selector@npm:^4.0.0": version: 4.0.0 resolution: "hast-util-parse-selector@npm:4.0.0" @@ -14155,49 +11696,6 @@ __metadata: languageName: node linkType: hard -"hast-util-to-estree@npm:^3.0.0, hast-util-to-estree@npm:^3.1.0": - version: 3.1.0 - resolution: "hast-util-to-estree@npm:3.1.0" - 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: ^6.0.0 - space-separated-tokens: ^2.0.0 - style-to-object: ^0.4.0 - unist-util-position: ^5.0.0 - zwitch: ^2.0.0 - checksum: 61272f7c18c9d2a5e34df7cfd2c97cbf12f6e9d05114d60e4dedd64e5576565eb1e35c78b9213c909bb8f984f0f8e9c49b568f04bdb444b83d0bca9159e14f3c - languageName: node - linkType: hard - -"hast-util-to-html@npm:^9.0.3": - version: 9.0.3 - resolution: "hast-util-to-html@npm:9.0.3" - 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: ^6.0.0 - space-separated-tokens: ^2.0.0 - stringify-entities: ^4.0.0 - zwitch: ^2.0.4 - checksum: e0b6f6fdba5f0075a593a0b1f0807c11a24ccfcb8403caea7d71eaffd7a958c995917e69fccc9055fbfa05a8b9d6b1cab306200bb82ad143530fdf4f33dcc311 - languageName: node - linkType: hard - "hast-util-to-jsx-runtime@npm:^2.0.0": version: 2.2.0 resolution: "hast-util-to-jsx-runtime@npm:2.2.0" @@ -14239,18 +11737,6 @@ __metadata: languageName: node linkType: hard -"hast-util-to-text@npm:^4.0.0": - version: 4.0.2 - resolution: "hast-util-to-text@npm:4.0.2" - 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 - checksum: 72cce08666b86511595d3eef52236b86897cfbac166f2a0752b70b16d1f590b5aa91ea1a553c0d1603f9e0c7e373ceacab381be3d8f176129ad6e301d2a56d94 - languageName: node - linkType: hard - "hast-util-whitespace@npm:^3.0.0": version: 3.0.0 resolution: "hast-util-whitespace@npm:3.0.0" @@ -14260,19 +11746,6 @@ __metadata: languageName: node linkType: hard -"hastscript@npm:^6.0.0": - version: 6.0.0 - resolution: "hastscript@npm:6.0.0" - dependencies: - "@types/hast": ^2.0.0 - comma-separated-tokens: ^1.0.0 - hast-util-parse-selector: ^2.0.0 - property-information: ^5.0.0 - space-separated-tokens: ^1.0.0 - checksum: 5e50b85af0d2cb7c17979cb1ddca75d6b96b53019dd999b39e7833192c9004201c3cee6445065620ea05d0087d9ae147a4844e582d64868be5bc6b0232dfe52d - languageName: node - linkType: hard - "hastscript@npm:^8.0.0": version: 8.0.0 resolution: "hastscript@npm:8.0.0" @@ -14295,13 +11768,6 @@ __metadata: languageName: node linkType: hard -"highlight.js@npm:^10.4.1, highlight.js@npm:~10.7.0": - version: 10.7.3 - resolution: "highlight.js@npm:10.7.3" - checksum: defeafcd546b535d710d8efb8e650af9e3b369ef53e28c3dc7893eacfe263200bba4c5fcf43524ae66d5c0c296b1af0870523ceae3e3104d24b7abf6374a4fea - languageName: node - linkType: hard - "hosted-git-info@npm:^2.1.4": version: 2.8.9 resolution: "hosted-git-info@npm:2.8.9" @@ -14505,7 +11971,7 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:0.6, iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2": +"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" dependencies: @@ -14679,20 +12145,6 @@ __metadata: languageName: node linkType: hard -"internmap@npm:1 - 2": - version: 2.0.3 - resolution: "internmap@npm:2.0.3" - checksum: 7ca41ec6aba8f0072fc32fa8a023450a9f44503e2d8e403583c55714b25efd6390c38a87161ec456bf42d7bc83aab62eb28f5aef34876b1ac4e60693d5e1d241 - languageName: node - linkType: hard - -"internmap@npm:^1.0.0": - version: 1.0.1 - resolution: "internmap@npm:1.0.1" - checksum: 9d00f8c0cf873a24a53a5a937120dab634c41f383105e066bb318a61864e6292d24eb9516e8e7dccfb4420ec42ca474a0f28ac9a6cc82536898fa09bbbe53813 - languageName: node - linkType: hard - "interpret@npm:^3.1.1": version: 3.1.1 resolution: "interpret@npm:3.1.1" @@ -14938,13 +12390,6 @@ __metadata: languageName: node linkType: hard -"is-extendable@npm:^0.1.0": - version: 0.1.1 - resolution: "is-extendable@npm:0.1.1" - checksum: 3875571d20a7563772ecc7a5f36cb03167e9be31ad259041b4a8f73f33f885441f778cee1f1fe0085eb4bc71679b9d8c923690003a36a6a5fdf8023e6e3f0672 - languageName: node - linkType: hard - "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -15153,13 +12598,6 @@ __metadata: languageName: node linkType: hard -"is-plain-obj@npm:^3.0.0": - version: 3.0.0 - resolution: "is-plain-obj@npm:3.0.0" - checksum: a6ebdf8e12ab73f33530641972a72a4b8aed6df04f762070d823808303e4f76d87d5ea5bd76f96a7bbe83d93f04ac7764429c29413bd9049853a69cb630fb21c - languageName: node - linkType: hard - "is-plain-obj@npm:^4.0.0, is-plain-obj@npm:^4.1.0": version: 4.1.0 resolution: "is-plain-obj@npm:4.1.0" @@ -15183,15 +12621,6 @@ __metadata: languageName: node linkType: hard -"is-reference@npm:^3.0.0": - version: 3.0.2 - resolution: "is-reference@npm:3.0.2" - dependencies: - "@types/estree": "*" - checksum: ac3bf5626fe9d0afbd7454760d73c47f16b9f471401b9749721ad3b66f0a39644390382acf88ca9d029c95782c1e2ec65662855e3ba91acf52d82231247a7fd3 - languageName: node - linkType: hard - "is-regex@npm:^1.1.2, is-regex@npm:^1.1.4": version: 1.1.4 resolution: "is-regex@npm:1.1.4" @@ -15452,13 +12881,6 @@ __metadata: languageName: node linkType: hard -"javascript-stringify@npm:^2.0.1": - version: 2.1.0 - resolution: "javascript-stringify@npm:2.1.0" - checksum: 009981ec84299da88795fc764221ed213e3d52251cc93a396430a7a02ae09f1163a9be36a36808689681a8e6113cf00fe97ec2eea2552df48111f79be59e9358 - languageName: node - linkType: hard - "jiti@npm:^1.19.1": version: 1.21.0 resolution: "jiti@npm:1.21.0" @@ -15489,7 +12911,7 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:^3.13.1, js-yaml@npm:^3.6.1": +"js-yaml@npm:^3.6.1": version: 3.14.1 resolution: "js-yaml@npm:3.14.1" dependencies: @@ -15630,7 +13052,7 @@ __metadata: languageName: node linkType: hard -"json5@npm:2.2.3, json5@npm:^2.1.2, json5@npm:^2.2.2, json5@npm:^2.2.3": +"json5@npm:2.2.3, json5@npm:^2.2.2, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" bin: @@ -15736,17 +13158,6 @@ __metadata: languageName: node linkType: hard -"katex@npm:^0.16.0, katex@npm:^0.16.9": - version: 0.16.11 - resolution: "katex@npm:0.16.11" - dependencies: - commander: ^8.3.0 - bin: - katex: cli.js - checksum: 49d9340705f4922ee22aacedad45664971449e5ca65e42a70228961336c8d4746c37c3c719bcc2114b6ad21182800c7d3d8bea28fe6f951fc45fe7e8322ea3bd - languageName: node - linkType: hard - "kebab-case@npm:^1.0.0": version: 1.0.1 resolution: "kebab-case@npm:1.0.1" @@ -15763,14 +13174,7 @@ __metadata: languageName: node linkType: hard -"khroma@npm:^2.1.0": - version: 2.1.0 - resolution: "khroma@npm:2.1.0" - checksum: b34ba39d3a9a52d388110bded8cb1c12272eb69c249d8eb26feab12d18a96a9bc4ceec4851d2afa43de4569f7d5ea78fa305965a3d0e96a38e02fe77c53677da - languageName: node - linkType: hard - -"kind-of@npm:^6.0.0, kind-of@npm:^6.0.2": +"kind-of@npm:^6.0.2": version: 6.0.3 resolution: "kind-of@npm:6.0.3" checksum: 3ab01e7b1d440b22fe4c31f23d8d38b4d9b91d9f291df683476576493d5dfd2e03848a8b05813dd0c3f0e835bc63f433007ddeceb71f05cb25c45ae1b19c6d3b @@ -15798,19 +13202,6 @@ __metadata: languageName: node linkType: hard -"langium@npm:3.0.0": - version: 3.0.0 - resolution: "langium@npm:3.0.0" - dependencies: - chevrotain: ~11.0.3 - chevrotain-allstar: ~0.3.0 - vscode-languageserver: ~9.0.1 - vscode-languageserver-textdocument: ~1.0.11 - vscode-uri: ~3.0.8 - checksum: fc184dcef5cc83eaaf93e7d892c74ac74ff441f820378ceba29e4d1245bf82a0b1808a97d628f065f085046b85ed88df8c5cce3a5fc380efa4bad84fe6c2c88e - languageName: node - linkType: hard - "language-subtag-registry@npm:~0.3.2": version: 0.3.21 resolution: "language-subtag-registry@npm:0.3.21" @@ -15827,20 +13218,6 @@ __metadata: languageName: node linkType: hard -"layout-base@npm:^1.0.0": - version: 1.0.2 - resolution: "layout-base@npm:1.0.2" - checksum: e4c312765ac4fa13b49c940e701461309c7a0aa07f784f81d31f626b945dced90a8abf83222388a5af16b7074271f745501a90ef5a3af676abb2e7eb16d55b2e - languageName: node - linkType: hard - -"layout-base@npm:^2.0.0": - version: 2.0.1 - resolution: "layout-base@npm:2.0.1" - checksum: ef93baf044f67c3680f4f3a6d628bf4c7faba0f70f3e0abb16e4811bed087045208560347ca749e123d169cbf872505ad84e11fb21b0be925997227e042c7f43 - languageName: node - linkType: hard - "lazy-universal-dotenv@npm:^4.0.0": version: 4.0.0 resolution: "lazy-universal-dotenv@npm:4.0.0" @@ -15967,17 +13344,6 @@ __metadata: languageName: node linkType: hard -"loader-utils@npm:^2.0.0": - version: 2.0.4 - resolution: "loader-utils@npm:2.0.4" - dependencies: - big.js: ^5.2.2 - emojis-list: ^3.0.0 - json5: ^2.1.2 - checksum: a5281f5fff1eaa310ad5e1164095689443630f3411e927f95031ab4fb83b4a98f388185bb1fe949e8ab8d4247004336a625e9255c22122b815bb9a4c5d8fc3b7 - languageName: node - linkType: hard - "local-pkg@npm:^0.5.0": version: 0.5.0 resolution: "local-pkg@npm:0.5.0" @@ -16025,7 +13391,7 @@ __metadata: languageName: node linkType: hard -"lodash-es@npm:4.17.21, lodash-es@npm:^4.17.21": +"lodash-es@npm:^4.17.21": version: 4.17.21 resolution: "lodash-es@npm:4.17.21" checksum: 05cbffad6e2adbb331a4e16fbd826e7faee403a1a04873b82b42c0f22090f280839f85b95393f487c1303c8a3d2a010048bf06151a6cbe03eee4d388fb0a12d2 @@ -16196,16 +13562,6 @@ __metadata: languageName: node linkType: hard -"lowlight@npm:^1.17.0": - version: 1.20.0 - resolution: "lowlight@npm:1.20.0" - dependencies: - fault: ^1.0.0 - highlight.js: ~10.7.0 - checksum: 14a1815d6bae202ddee313fc60f06d46e5235c02fa483a77950b401d85b4c1e12290145ccd17a716b07f9328bd5864aa2d402b6a819ff3be7c833d9748ff8ba7 - languageName: node - linkType: hard - "lru-cache@npm:^10.2.0, lru-cache@npm:^9.1.1 || ^10.0.0": version: 10.2.0 resolution: "lru-cache@npm:10.2.0" @@ -16213,13 +13569,6 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^10.4.3": - version: 10.4.3 - resolution: "lru-cache@npm:10.4.3" - checksum: 6476138d2125387a6d20f100608c2583d415a4f64a0fecf30c9e2dda976614f09cad4baa0842447bd37dd459a7bd27f57d9d8f8ce558805abd487c583f3d774a - languageName: node - linkType: hard - "lru-cache@npm:^4.0.1": version: 4.1.5 resolution: "lru-cache@npm:4.1.5" @@ -16377,13 +13726,6 @@ __metadata: languageName: node linkType: hard -"markdown-extensions@npm:^2.0.0": - version: 2.0.0 - resolution: "markdown-extensions@npm:2.0.0" - checksum: ec4ffcb0768f112e778e7ac74cb8ef22a966c168c3e6c29829f007f015b0a0b5c79c73ee8599a0c72e440e7f5cfdbf19e80e2d77b9a313b8f66e180a330cf1b2 - languageName: node - linkType: hard - "markdown-table@npm:^3.0.0": version: 3.0.3 resolution: "markdown-table@npm:3.0.3" @@ -16400,27 +13742,6 @@ __metadata: languageName: node linkType: hard -"marked@npm:^13.0.2": - version: 13.0.3 - resolution: "marked@npm:13.0.3" - bin: - marked: bin/marked.js - checksum: 1e35459ccf26a2a4ba086d9acd5ade00736dd24bacc817b202a3ba7d219e1b252fee91fca41b07de5bc6cfe3442edebe4f0efb18975978d65043050feb116425 - languageName: node - linkType: hard - -"mathjax-full@npm:^3.2.2": - version: 3.2.2 - resolution: "mathjax-full@npm:3.2.2" - dependencies: - esm: ^3.2.25 - mhchemparser: ^4.1.0 - mj-context-menu: ^0.6.1 - speech-rule-engine: ^4.0.6 - checksum: 6fbccb9338e1fbf686202d924666d79ac9eb658157c1c8102ba018672188978c4cacfb1b6f65adf7d2d51dc79535ff3e32ba86b15e66d3011dda2ab99562d90d - languageName: node - linkType: hard - "mdast-comment-marker@npm:^1.0.0": version: 1.1.2 resolution: "mdast-comment-marker@npm:1.1.2" @@ -16473,20 +13794,6 @@ __metadata: languageName: node linkType: hard -"mdast-util-frontmatter@npm:^2.0.0": - version: 2.0.1 - resolution: "mdast-util-frontmatter@npm:2.0.1" - dependencies: - "@types/mdast": ^4.0.0 - devlop: ^1.0.0 - escape-string-regexp: ^5.0.0 - mdast-util-from-markdown: ^2.0.0 - mdast-util-to-markdown: ^2.0.0 - micromark-extension-frontmatter: ^2.0.0 - checksum: 86a7c8d9eb183be2621d6d9134b9d33df2a3647e3255f68a9796e2425e25643ffae00a501e36c57d9c10973087b94aa5a2ffd865d33cdd274cc9b88cd2d90a2e - languageName: node - linkType: hard - "mdast-util-gfm-autolink-literal@npm:^2.0.0": version: 2.0.0 resolution: "mdast-util-gfm-autolink-literal@npm:2.0.0" @@ -16571,21 +13878,6 @@ __metadata: languageName: node linkType: hard -"mdast-util-math@npm:^3.0.0": - version: 3.0.0 - resolution: "mdast-util-math@npm:3.0.0" - dependencies: - "@types/hast": ^3.0.0 - "@types/mdast": ^4.0.0 - devlop: ^1.0.0 - longest-streak: ^3.0.0 - mdast-util-from-markdown: ^2.0.0 - mdast-util-to-markdown: ^2.1.0 - unist-util-remove-position: ^5.0.0 - checksum: dc7dfb14aec2ec143420f2d92f80c5e6d69293d7cfb6b8180e7f411ce4e1314b5cf4a8d3345eefe06ab0ddd95e3c7801c4174b343fd2c26741180ca4dbad5371 - languageName: node - linkType: hard - "mdast-util-mdx-expression@npm:^2.0.0": version: 2.0.0 resolution: "mdast-util-mdx-expression@npm:2.0.0" @@ -16688,7 +13980,7 @@ __metadata: languageName: node linkType: hard -"mdast-util-to-markdown@npm:^2.0.0, mdast-util-to-markdown@npm:^2.1.0": +"mdast-util-to-markdown@npm:^2.0.0": version: 2.1.0 resolution: "mdast-util-to-markdown@npm:2.1.0" dependencies: @@ -16727,15 +14019,6 @@ __metadata: languageName: node linkType: hard -"media-query-parser@npm:^2.0.2": - version: 2.0.2 - resolution: "media-query-parser@npm:2.0.2" - dependencies: - "@babel/runtime": ^7.12.5 - checksum: 8ef956d9e63fe6f4041988beda69843b3a6bb48228ea2923a066f6e7c8f7c5dba75fae357318c48a97ed5beae840b8425cb7e727fc1bb77acc65f2005f8945ab - languageName: node - linkType: hard - "media-typer@npm:0.3.0": version: 0.3.0 resolution: "media-typer@npm:0.3.0" @@ -16796,33 +14079,6 @@ __metadata: languageName: node linkType: hard -"mermaid@npm:^11.0.0": - version: 11.2.1 - resolution: "mermaid@npm:11.2.1" - dependencies: - "@braintree/sanitize-url": ^7.0.1 - "@iconify/utils": ^2.1.32 - "@mermaid-js/parser": ^0.3.0 - cytoscape: ^3.29.2 - cytoscape-cose-bilkent: ^4.1.0 - cytoscape-fcose: ^2.2.0 - d3: ^7.9.0 - d3-sankey: ^0.12.3 - dagre-d3-es: 7.0.10 - dayjs: ^1.11.10 - dompurify: ^3.0.11 - katex: ^0.16.9 - khroma: ^2.1.0 - lodash-es: ^4.17.21 - marked: ^13.0.2 - roughjs: ^4.6.6 - stylis: ^4.3.1 - ts-dedent: ^2.2.0 - uuid: ^9.0.1 - checksum: 7a1f07dfe98182438e28f36e7a05b4316a7506ac81d4bb51c4c4912a89f381c230e6cea66696660610089534c0a86d8443c5a965250bedc2b1c4673038fed3cd - languageName: node - linkType: hard - "methods@npm:~1.1.2": version: 1.1.2 resolution: "methods@npm:1.1.2" @@ -16830,13 +14086,6 @@ __metadata: languageName: node linkType: hard -"mhchemparser@npm:^4.1.0": - version: 4.2.1 - resolution: "mhchemparser@npm:4.2.1" - checksum: 6dd7e3926befc74d26cf7b44b9e5ff7295e142bffc48a60bd225d5a30d525354afb70d23fc4fdb8f46178099ab98a66a57a6131dcb0f410264cfd2b9ad4af4b7 - languageName: node - linkType: hard - "micromark-core-commonmark@npm:^2.0.0": version: 2.0.0 resolution: "micromark-core-commonmark@npm:2.0.0" @@ -16861,18 +14110,6 @@ __metadata: languageName: node linkType: hard -"micromark-extension-frontmatter@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-extension-frontmatter@npm:2.0.0" - dependencies: - fault: ^2.0.0 - micromark-util-character: ^2.0.0 - micromark-util-symbol: ^2.0.0 - micromark-util-types: ^2.0.0 - checksum: f68032df38c00ae47de15b63bcd72515bfcce39de4a9262a3a1ac9c5990f253f8e41bdc65fd17ec4bb3d144c32529ce0829571331e4901a9a413f1a53785d1e8 - languageName: node - linkType: hard - "micromark-extension-gfm-autolink-literal@npm:^2.0.0": version: 2.0.0 resolution: "micromark-extension-gfm-autolink-literal@npm:2.0.0" @@ -16966,21 +14203,6 @@ __metadata: languageName: node linkType: hard -"micromark-extension-math@npm:^3.0.0": - version: 3.1.0 - resolution: "micromark-extension-math@npm:3.1.0" - dependencies: - "@types/katex": ^0.16.0 - devlop: ^1.0.0 - katex: ^0.16.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 - checksum: 60a9813d456a7bf1ca493b5b9a1f1df3828b5f635fdc72a3b36a0cf1ebded2a9ed12899493d80578a737d1e36e94113da09aed381f99d0103e82467f16989e28 - languageName: node - linkType: hard - "micromark-extension-mdx-expression@npm:^3.0.0": version: 3.0.0 resolution: "micromark-extension-mdx-expression@npm:3.0.0" @@ -17561,13 +14783,6 @@ __metadata: languageName: node linkType: hard -"mj-context-menu@npm:^0.6.1": - version: 0.6.1 - resolution: "mj-context-menu@npm:0.6.1" - checksum: 7a036026538662cac9619b760fade98681618c3ddf417cb36eddb7c28a937baf257c56fd0b6318738419e738ba01a00bcb3790b324885fd6edbae03fb0a2c986 - languageName: node - linkType: hard - "mkdirp-classic@npm:^0.5.2": version: 0.5.3 resolution: "mkdirp-classic@npm:0.5.3" @@ -17607,25 +14822,6 @@ __metadata: languageName: node linkType: hard -"mlly@npm:^1.7.1": - version: 1.7.1 - resolution: "mlly@npm:1.7.1" - dependencies: - acorn: ^8.11.3 - pathe: ^1.1.2 - pkg-types: ^1.1.1 - ufo: ^1.5.3 - checksum: 956a6d54119eef782f302580f63a9800654e588cd70015b4218a00069c6ef11b87984e8ffe140a4668b0100ad4022b11d1f9b11ac2c6dbafa4d8bc33ae3a08a8 - languageName: node - linkType: hard - -"modern-ahocorasick@npm:^1.0.0": - version: 1.0.1 - resolution: "modern-ahocorasick@npm:1.0.1" - checksum: ec83479f406511f37a966d66ce1c2b1701bb4a2cc2aabbbc257001178c9fbc48ce748c88eb10dfe72ba8b7f991a0bc7f1fa14683f444685edd1a9eeb32ecbc1e - languageName: node - linkType: hard - "mri@npm:^1.1.0": version: 1.2.0 resolution: "mri@npm:1.2.0" @@ -17647,7 +14843,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": +"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -17685,7 +14881,7 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.3.6, nanoid@npm:^3.3.7": +"nanoid@npm:^3.3.7": version: 3.3.7 resolution: "nanoid@npm:3.3.7" bin: @@ -17703,148 +14899,15 @@ __metadata: "negotiator@npm:0.6.3, negotiator@npm:^0.6.3": version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 - languageName: node - linkType: hard - -"neo-async@npm:^2.5.0, neo-async@npm:^2.6.0": - version: 2.6.2 - resolution: "neo-async@npm:2.6.2" - checksum: deac9f8d00eda7b2e5cd1b2549e26e10a0faa70adaa6fdadca701cc55f49ee9018e427f424bac0c790b7c7e2d3068db97f3093f1093975f2acb8f8818b936ed9 - languageName: node - linkType: hard - -"next-themes@npm:^0.3.0": - version: 0.3.0 - resolution: "next-themes@npm:0.3.0" - peerDependencies: - react: ^16.8 || ^17 || ^18 - react-dom: ^16.8 || ^17 || ^18 - checksum: 4285c4969eac517ad7addd773bcb71e7d14bc6c6e3b24eb97b80a6e06ac03fb6cb345e75dfb448156d14430d06289948eb8cfdeb52402ca7ce786093d01d2878 - languageName: node - linkType: hard - -"next@npm:14.2.13": - version: 14.2.13 - resolution: "next@npm:14.2.13" - dependencies: - "@next/env": 14.2.13 - "@next/swc-darwin-arm64": 14.2.13 - "@next/swc-darwin-x64": 14.2.13 - "@next/swc-linux-arm64-gnu": 14.2.13 - "@next/swc-linux-arm64-musl": 14.2.13 - "@next/swc-linux-x64-gnu": 14.2.13 - "@next/swc-linux-x64-musl": 14.2.13 - "@next/swc-win32-arm64-msvc": 14.2.13 - "@next/swc-win32-ia32-msvc": 14.2.13 - "@next/swc-win32-x64-msvc": 14.2.13 - "@swc/helpers": 0.5.5 - busboy: 1.6.0 - caniuse-lite: ^1.0.30001579 - graceful-fs: ^4.2.11 - postcss: 8.4.31 - styled-jsx: 5.1.1 - peerDependencies: - "@opentelemetry/api": ^1.1.0 - "@playwright/test": ^1.41.2 - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - dependenciesMeta: - "@next/swc-darwin-arm64": - optional: true - "@next/swc-darwin-x64": - optional: true - "@next/swc-linux-arm64-gnu": - optional: true - "@next/swc-linux-arm64-musl": - optional: true - "@next/swc-linux-x64-gnu": - optional: true - "@next/swc-linux-x64-musl": - optional: true - "@next/swc-win32-arm64-msvc": - optional: true - "@next/swc-win32-ia32-msvc": - optional: true - "@next/swc-win32-x64-msvc": - optional: true - peerDependenciesMeta: - "@opentelemetry/api": - optional: true - "@playwright/test": - optional: true - sass: - optional: true - bin: - next: dist/bin/next - checksum: 00b2117e047f7426bb9c4f67ce7dc77d27c1e2ff4e60a2e1a1796be76d6725d498b96e00162250274106d33161bafd1eed2b92b007c73a43e8f2bff378e8c48d - languageName: node - linkType: hard - -"nextra-theme-docs@npm:^3.0.2": - version: 3.0.2 - resolution: "nextra-theme-docs@npm:3.0.2" - dependencies: - "@headlessui/react": ^2.1.2 - clsx: ^2.0.0 - escape-string-regexp: ^5.0.0 - flexsearch: ^0.7.43 - next-themes: ^0.3.0 - scroll-into-view-if-needed: ^3.1.0 - zod: ^3.22.3 - peerDependencies: - next: ">=13" - nextra: 3.0.2 - react: ">=18.0.0" - react-dom: ">=18.0.0" - checksum: 917240d459776d8cf8c58dda42921a2ca45e5e3bd9b4068a4425aa2b1daeca4aa95904ffc5ff5960a1bfeee7729776e50dfe379c5fb9e93d86215230c79733d8 - languageName: node - linkType: hard - -"nextra@npm:^3.0.2": - version: 3.0.2 - resolution: "nextra@npm:3.0.2" - dependencies: - "@headlessui/react": ^2.1.2 - "@mdx-js/mdx": ^3.0.0 - "@mdx-js/react": ^3.0.0 - "@napi-rs/simple-git": ^0.1.9 - "@shikijs/twoslash": ^1.0.0 - "@theguild/remark-mermaid": ^0.1.2 - "@theguild/remark-npm2yarn": ^0.3.2 - better-react-mathjax: ^2.0.3 - clsx: ^2.0.0 - estree-util-to-js: ^2.0.0 - estree-util-value-to-estree: ^3.0.1 - github-slugger: ^2.0.0 - graceful-fs: ^4.2.11 - gray-matter: ^4.0.3 - hast-util-to-estree: ^3.1.0 - katex: ^0.16.9 - p-limit: ^6.0.0 - rehype-katex: ^7.0.0 - rehype-pretty-code: 0.14.0 - rehype-raw: ^7.0.0 - remark-frontmatter: ^5.0.0 - remark-gfm: ^4.0.0 - remark-math: ^6.0.0 - remark-reading-time: ^2.0.1 - remark-smartypants: ^3.0.0 - shiki: ^1.0.0 - slash: ^5.1.0 - title: ^3.5.3 - unist-util-remove: ^4.0.0 - unist-util-visit: ^5.0.0 - yaml: ^2.3.2 - zod: ^3.22.3 - zod-validation-error: ^3.0.0 - peerDependencies: - next: ">=13" - react: ">=18.0.0" - react-dom: ">=18.0.0" - checksum: 087b1833028679eddedfb0798040c7fd2dcda9b64461e12c97a1ca4f60625ad4311ea998091d5ff10f90acec3cbd5e8462a3b1390775d8c125f578479a475d50 + resolution: "negotiator@npm:0.6.3" + checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 + languageName: node + linkType: hard + +"neo-async@npm:^2.5.0, neo-async@npm:^2.6.0": + version: 2.6.2 + resolution: "neo-async@npm:2.6.2" + checksum: deac9f8d00eda7b2e5cd1b2549e26e10a0faa70adaa6fdadca701cc55f49ee9018e427f424bac0c790b7c7e2d3068db97f3093f1093975f2acb8f8818b936ed9 languageName: node linkType: hard @@ -17855,15 +14918,6 @@ __metadata: languageName: node linkType: hard -"nlcst-to-string@npm:^4.0.0": - version: 4.0.0 - resolution: "nlcst-to-string@npm:4.0.0" - dependencies: - "@types/nlcst": ^2.0.0 - checksum: a780ca517548582016b6a92216962500de1179ace37cc7a9afbddd219e6893f253eab564f4c2292a13cf2ade27a669c6222b3eb27671cf647e15b6abf2eb1827 - languageName: node - linkType: hard - "no-case@npm:^3.0.4": version: 3.0.4 resolution: "no-case@npm:3.0.4" @@ -18044,13 +15098,6 @@ __metadata: languageName: node linkType: hard -"npm-to-yarn@npm:^3.0.0": - version: 3.0.0 - resolution: "npm-to-yarn@npm:3.0.0" - checksum: df4fef7eb80c36feb5389665d1bfffd38033033a8c067a80e056c98b1be9b7acdafce51d387f4d8c6569ee943fa659ff59c091fa0227d62be8c62cba0d44cbce - languageName: node - linkType: hard - "npmlog@npm:^6.0.0": version: 6.0.2 resolution: "npmlog@npm:6.0.2" @@ -18302,15 +15349,6 @@ __metadata: languageName: node linkType: hard -"oniguruma-to-js@npm:0.4.3": - version: 0.4.3 - resolution: "oniguruma-to-js@npm:0.4.3" - dependencies: - regex: ^4.3.2 - checksum: 563d2e3490d415628f7a273fd417d16a69d19e53454821ed9654ee84877ecaf532c60d710f670edb4cde7448e505e3a70c6ab89d641769394b4238248ea71816 - languageName: node - linkType: hard - "open@npm:^8.0.4": version: 8.4.2 resolution: "open@npm:8.4.2" @@ -18416,15 +15454,6 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^6.0.0": - version: 6.1.0 - resolution: "p-limit@npm:6.1.0" - dependencies: - yocto-queue: ^1.1.1 - checksum: 0c98d8fc1006b70fc7423232a47e8d026dc69279b06fe7ff8b4c0cc8023de2b6bb8991b609d93c3dec691a7a362ab0f0157df521d931a01fec192a5e404b9ee5 - languageName: node - linkType: hard - "p-locate@npm:^3.0.0": version: 3.0.0 resolution: "p-locate@npm:3.0.0" @@ -18477,13 +15506,6 @@ __metadata: languageName: node linkType: hard -"package-manager-detector@npm:^0.2.0": - version: 0.2.0 - resolution: "package-manager-detector@npm:0.2.0" - checksum: 3ba12d366aef0045d8341670eea71a3c9ef4efb00a411f45bf970bd526dbfc41b6baac4fb18a2585fe2d5f93dbb7245fbce4b4fcb89baa175ecf221c05f47db1 - languageName: node - linkType: hard - "pako@npm:~0.2.0": version: 0.2.9 resolution: "pako@npm:0.2.9" @@ -18575,27 +15597,6 @@ __metadata: languageName: node linkType: hard -"parse-latin@npm:^7.0.0": - version: 7.0.0 - resolution: "parse-latin@npm:7.0.0" - 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 - checksum: 71b5af8857750aeaa240c1688331ba37e5320de3f5c4225bf2b816554cbf5a987ce999e180074553acab7868a9c43deff1adb6cebd01ac6f258dcbdce4803824 - languageName: node - linkType: hard - -"parse-numeric-range@npm:^1.3.0": - version: 1.3.0 - resolution: "parse-numeric-range@npm:1.3.0" - checksum: 289ca126d5b8ace7325b199218de198014f58ea6895ccc88a5247491d07f0143bf047f80b4a31784f1ca8911762278d7d6ecb90a31dfae31da91cc1a2524c8ce - languageName: node - linkType: hard - "parse5@npm:^7.0.0": version: 7.1.2 resolution: "parse5@npm:7.1.2" @@ -18629,13 +15630,6 @@ __metadata: languageName: node linkType: hard -"path-data-parser@npm:0.1.0, path-data-parser@npm:^0.1.0": - version: 0.1.0 - resolution: "path-data-parser@npm:0.1.0" - checksum: a23a214adb38074576a8873d25e8dea7e090b8396d86f58f83f3f6c6298ff56b06adc694147b67f0ed22f14dc478efa1d525710d3ec7b2d7b1efbac57e3fafe6 - languageName: node - linkType: hard - "path-exists@npm:^3.0.0": version: 3.0.0 resolution: "path-exists@npm:3.0.0" @@ -18767,17 +15761,6 @@ __metadata: languageName: node linkType: hard -"periscopic@npm:^3.0.0": - version: 3.1.0 - resolution: "periscopic@npm:3.1.0" - dependencies: - "@types/estree": ^1.0.0 - estree-walker: ^3.0.0 - is-reference: ^3.0.0 - checksum: 2153244352e58a0d76e7e8d9263e66fe74509495f809af388da20045fb30aa3e93f2f94468dc0b9166ecf206fcfc0d73d2c7641c6fbedc07b1de858b710142cb - languageName: node - linkType: hard - "picocolors@npm:^1.0.0": version: 1.0.0 resolution: "picocolors@npm:1.0.0" @@ -18785,13 +15768,6 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.1.0": - version: 1.1.0 - resolution: "picocolors@npm:1.1.0" - checksum: a64d653d3a188119ff45781dfcdaeedd7625583f45280aea33fcb032c7a0d3959f2368f9b192ad5e8aade75b74dbd954ffe3106c158509a45e4c18ab379a2acd - languageName: node - linkType: hard - "picomatch@npm:4.0.2": version: 4.0.2 resolution: "picomatch@npm:4.0.2" @@ -18890,17 +15866,6 @@ __metadata: languageName: node linkType: hard -"pkg-types@npm:^1.1.1": - version: 1.2.0 - resolution: "pkg-types@npm:1.2.0" - dependencies: - confbox: ^0.1.7 - mlly: ^1.7.1 - pathe: ^1.1.2 - checksum: c9ea31be8c7bf0b760c075d5e39f71d90fcebee316e49688345e9095d520ed766f3bfd560227e3f3c28639399a0641a27193eef60c4802d89cb414e21240bbb5 - languageName: node - linkType: hard - "playwright-core@npm:1.43.1": version: 1.43.1 resolution: "playwright-core@npm:1.43.1" @@ -18941,23 +15906,6 @@ __metadata: languageName: node linkType: hard -"points-on-curve@npm:0.2.0, points-on-curve@npm:^0.2.0": - version: 0.2.0 - resolution: "points-on-curve@npm:0.2.0" - checksum: 05e87d6839e3d869cfac0e63c2b1ca700fc8f1083e3f9ae80841cc50379fd31204f9e1f221407df1a90afcb8bfa98404aee0b0fa00330b7b3b328d33be21cf47 - languageName: node - linkType: hard - -"points-on-path@npm:^0.2.1": - version: 0.2.1 - resolution: "points-on-path@npm:0.2.1" - dependencies: - path-data-parser: 0.1.0 - points-on-curve: 0.2.0 - checksum: 5564dd84d15699579bf07bd33adfd0dc1a5e717c0d36ee11f0832b6b6890941e25e9ea68d15f7858698a9b5ec509f60e6472a0346624bb9dd9c2100cf568ac8f - languageName: node - linkType: hard - "polished@npm:^4.2.2": version: 4.2.2 resolution: "polished@npm:4.2.2" @@ -18992,17 +15940,6 @@ __metadata: languageName: node linkType: hard -"postcss@npm:8.4.31": - version: 8.4.31 - resolution: "postcss@npm:8.4.31" - dependencies: - nanoid: ^3.3.6 - picocolors: ^1.0.0 - source-map-js: ^1.0.2 - checksum: 1d8611341b073143ad90486fcdfeab49edd243377b1f51834dc4f6d028e82ce5190e4f11bb2633276864503654fb7cab28e67abdc0fbf9d1f88cad4a0ff0beea - languageName: node - linkType: hard - "postcss@npm:^8.4.23, postcss@npm:^8.4.38": version: 8.4.38 resolution: "postcss@npm:8.4.38" @@ -19014,17 +15951,6 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.43": - version: 8.4.47 - resolution: "postcss@npm:8.4.47" - dependencies: - nanoid: ^3.3.7 - picocolors: ^1.1.0 - source-map-js: ^1.2.1 - checksum: f78440a9d8f97431dd2ab1ab8e1de64f12f3eff38a3d8d4a33919b96c381046a314658d2de213a5fa5eb296b656de76a3ec269fdea27f16d5ab465b916a0f52c - languageName: node - linkType: hard - "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -19114,20 +16040,6 @@ __metadata: languageName: node linkType: hard -"prismjs@npm:^1.27.0": - version: 1.29.0 - resolution: "prismjs@npm:1.29.0" - checksum: 007a8869d4456ff8049dc59404e32d5666a07d99c3b0e30a18bd3b7676dfa07d1daae9d0f407f20983865fd8da56de91d09cb08e6aa61f5bc420a27c0beeaf93 - languageName: node - linkType: hard - -"prismjs@npm:~1.27.0": - version: 1.27.0 - resolution: "prismjs@npm:1.27.0" - checksum: 85c7f4a3e999073502cc9e1882af01e3709706369ec254b60bff1149eda701f40d02512acab956012dc7e61cfd61743a3a34c1bd0737e8dbacd79141e5698bbc - languageName: node - linkType: hard - "proc-log@npm:^3.0.0": version: 3.0.0 resolution: "proc-log@npm:3.0.0" @@ -19198,15 +16110,6 @@ __metadata: languageName: node linkType: hard -"property-information@npm:^5.0.0": - version: 5.6.0 - resolution: "property-information@npm:5.6.0" - dependencies: - xtend: ^4.0.0 - checksum: fcf87c6542e59a8bbe31ca0b3255a4a63ac1059b01b04469680288998bcfa97f341ca989566adbb63975f4d85339030b82320c324a511532d390910d1c583893 - languageName: node - linkType: hard - "property-information@npm:^6.0.0": version: 6.2.0 resolution: "property-information@npm:6.2.0" @@ -19509,21 +16412,6 @@ __metadata: languageName: node linkType: hard -"react-syntax-highlighter@npm:15.5.0": - version: 15.5.0 - resolution: "react-syntax-highlighter@npm:15.5.0" - dependencies: - "@babel/runtime": ^7.3.1 - highlight.js: ^10.4.1 - lowlight: ^1.17.0 - prismjs: ^1.27.0 - refractor: ^3.6.0 - peerDependencies: - react: ">= 0.14.0" - checksum: c082b48f30f8ba8d0c55ed1d761910630860077c7ff5793c4c912adcb5760df06436ed0ad62be0de28113aac9ad2af55eccd995f8eee98df53382e4ced2072fb - languageName: node - linkType: hard - "react-textarea-autosize@npm:8.5.3": version: 8.5.3 resolution: "react-textarea-autosize@npm:8.5.3" @@ -19636,13 +16524,6 @@ __metadata: languageName: node linkType: hard -"reading-time@npm:^1.3.0": - version: 1.5.0 - resolution: "reading-time@npm:1.5.0" - checksum: e27bc5a70ba0f4ac337896b18531b914d38f4bee67cbad48029d0c11dd0a7a847b2a6bba895ab7ce2ad3e7ecb86912bdc477d8fa2d48405a3deda964be54d09b - languageName: node - linkType: hard - "recast@npm:^0.23.3, recast@npm:^0.23.5": version: 0.23.6 resolution: "recast@npm:0.23.6" @@ -19675,17 +16556,6 @@ __metadata: languageName: node linkType: hard -"refractor@npm:^3.6.0": - version: 3.6.0 - resolution: "refractor@npm:3.6.0" - dependencies: - hastscript: ^6.0.0 - parse-entities: ^2.0.0 - prismjs: ~1.27.0 - checksum: 39b01c4168c77c5c8486f9bf8907bbb05f257f15026057ba5728535815a2d90eed620468a4bfbb2b8ceefbb3ce3931a1be8b17152dbdbc8b0eef92450ff750a2 - languageName: node - linkType: hard - "regenerate-unicode-properties@npm:^10.0.1": version: 10.0.1 resolution: "regenerate-unicode-properties@npm:10.0.1" @@ -19741,13 +16611,6 @@ __metadata: languageName: node linkType: hard -"regex@npm:^4.3.2": - version: 4.3.2 - resolution: "regex@npm:4.3.2" - checksum: 9b1009f948825a66d81478b54acc60dcf4f7f01905a951b545409873f2ef655a99f5d4dc1448c666ccb06fd95d09cdb010c6c9569ff7c126f7c2580817db26de - languageName: node - linkType: hard - "regexp-tree@npm:^0.1.27": version: 0.1.27 resolution: "regexp-tree@npm:0.1.27" @@ -19878,49 +16741,7 @@ __metadata: languageName: node linkType: hard -"rehype-katex@npm:^7.0.0": - version: 7.0.1 - resolution: "rehype-katex@npm:7.0.1" - dependencies: - "@types/hast": ^3.0.0 - "@types/katex": ^0.16.0 - hast-util-from-html-isomorphic: ^2.0.0 - hast-util-to-text: ^4.0.0 - katex: ^0.16.0 - unist-util-visit-parents: ^6.0.0 - vfile: ^6.0.0 - checksum: d8f90f2b481fcf8a922410b812dbaed253a488bf61f4981b7b37d4983845060c1fcefb1690063e31ecfb941fb6ef6858e1a044e2f8c6146687266df1f6423a7b - languageName: node - linkType: hard - -"rehype-parse@npm:^9.0.0": - version: 9.0.1 - resolution: "rehype-parse@npm:9.0.1" - dependencies: - "@types/hast": ^3.0.0 - hast-util-from-html: ^2.0.0 - unified: ^11.0.0 - checksum: 3175c8d352ca2c8bddb4749fa1bd21336cab27b06165f6db77678e944479ac4fdee729ced8956bf303ba8ff01a7e8d0666e8123980cfbce28a7b4527b2167717 - languageName: node - linkType: hard - -"rehype-pretty-code@npm:0.14.0": - version: 0.14.0 - resolution: "rehype-pretty-code@npm:0.14.0" - dependencies: - "@types/hast": ^3.0.4 - hast-util-to-string: ^3.0.0 - parse-numeric-range: ^1.3.0 - rehype-parse: ^9.0.0 - unified: ^11.0.5 - unist-util-visit: ^5.0.0 - peerDependencies: - shiki: ^1.3.0 - checksum: c3dd917638a2b8b5585105b90f1e29a5a43b2685cd02eca481c3c3e32570519795e57c0ec05917b1210a6ccdbc0557c871efd9be7a358a380dc44c166f620cf9 - languageName: node - linkType: hard - -"rehype-raw@npm:7.0.0, rehype-raw@npm:^7.0.0": +"rehype-raw@npm:7.0.0": version: 7.0.0 resolution: "rehype-raw@npm:7.0.0" dependencies: @@ -19974,19 +16795,7 @@ __metadata: languageName: node linkType: hard -"remark-frontmatter@npm:^5.0.0": - version: 5.0.0 - resolution: "remark-frontmatter@npm:5.0.0" - dependencies: - "@types/mdast": ^4.0.0 - mdast-util-frontmatter: ^2.0.0 - micromark-extension-frontmatter: ^2.0.0 - unified: ^11.0.0 - checksum: b36e11d528d1d0172489c74ce7961bb6073f7272e71ea1349f765fc79c4246a758aef949174d371a088c48e458af776fcfbb3b043c49cd1120ca8239aeafe16a - languageName: node - linkType: hard - -"remark-gfm@npm:4.0.0, remark-gfm@npm:^4.0.0": +"remark-gfm@npm:4.0.0": version: 4.0.0 resolution: "remark-gfm@npm:4.0.0" dependencies: @@ -20192,18 +17001,6 @@ __metadata: languageName: node linkType: hard -"remark-math@npm:^6.0.0": - version: 6.0.0 - resolution: "remark-math@npm:6.0.0" - dependencies: - "@types/mdast": ^4.0.0 - mdast-util-math: ^3.0.0 - micromark-extension-math: ^3.0.0 - unified: ^11.0.0 - checksum: fef489acb6cae6e40af05012367dc22a846ce16301e8a96006c6d78935887bdb3e6c5018b6514884ecee57f9c7a51f97a10862526ab0a0f5f7b7d339fe0eb20f - languageName: node - linkType: hard - "remark-mdx@npm:^3.0.0": version: 3.0.1 resolution: "remark-mdx@npm:3.0.1" @@ -20269,18 +17066,6 @@ __metadata: languageName: node linkType: hard -"remark-reading-time@npm:^2.0.1": - version: 2.0.1 - resolution: "remark-reading-time@npm:2.0.1" - dependencies: - estree-util-is-identifier-name: ^2.0.0 - estree-util-value-to-estree: ^1.3.0 - reading-time: ^1.3.0 - unist-util-visit: ^3.1.0 - checksum: 330b2c65d95f2ac3c1fd938fa9e163c5dda5b4aa8c5c554556797f6d1a7d1b7dfb3b580451f30cace04c0a23b4803a42b6827a2627f5a1c479b06b9570f86a80 - languageName: node - linkType: hard - "remark-rehype@npm:^11.0.0": version: 11.0.0 resolution: "remark-rehype@npm:11.0.0" @@ -20294,18 +17079,6 @@ __metadata: languageName: node linkType: hard -"remark-smartypants@npm:^3.0.0": - version: 3.0.2 - resolution: "remark-smartypants@npm:3.0.2" - dependencies: - retext: ^9.0.0 - retext-smartypants: ^6.0.0 - unified: ^11.0.4 - unist-util-visit: ^5.0.0 - checksum: c2d16ad997f5ebbf1c13b13e56192c6d39d0f9dcff3a00f2015d27fe18efb38f5d1b5f48229c57b2656ae53cd1e6ec1c1f686216bae159cb04337cb4ce7da345 - languageName: node - linkType: hard - "remark-stringify@npm:^11.0.0": version: 11.0.0 resolution: "remark-stringify@npm:11.0.0" @@ -20365,13 +17138,6 @@ __metadata: languageName: node linkType: hard -"require-like@npm:>= 0.1.1": - version: 0.1.2 - resolution: "require-like@npm:0.1.2" - checksum: edb8331f05fd807381a75b76f6cca9f0ce8acaa2e910b7e116541799aa970bfbc64fde5fd6adb3a6917dba346f8386ebbddb81614c24e8dad1b4290c7af9535e - languageName: node - linkType: hard - "requireindex@npm:^1.2.0": version: 1.2.0 resolution: "requireindex@npm:1.2.0" @@ -20539,51 +17305,6 @@ __metadata: languageName: node linkType: hard -"retext-latin@npm:^4.0.0": - version: 4.0.0 - resolution: "retext-latin@npm:4.0.0" - dependencies: - "@types/nlcst": ^2.0.0 - parse-latin: ^7.0.0 - unified: ^11.0.0 - checksum: 924e2e4b588e75f2884d6fd81bdd647e1848b47bcf0e2b503873752e8fa80b2d2c9bcc1ae76141334145cbaacb383df26b637ed76d07b8c8b251d4cd340dec41 - languageName: node - linkType: hard - -"retext-smartypants@npm:^6.0.0": - version: 6.1.1 - resolution: "retext-smartypants@npm:6.1.1" - dependencies: - "@types/nlcst": ^2.0.0 - nlcst-to-string: ^4.0.0 - unist-util-visit: ^5.0.0 - checksum: aadeef0b5fd9039757de4cad08169ae0d195a0712b9c4e195f1d5aa8b289533bf68b1fc026ff6cfc5c190cffdeefd4f5ab3441abb946ed418fa346e619613153 - languageName: node - linkType: hard - -"retext-stringify@npm:^4.0.0": - version: 4.0.0 - resolution: "retext-stringify@npm:4.0.0" - dependencies: - "@types/nlcst": ^2.0.0 - nlcst-to-string: ^4.0.0 - unified: ^11.0.0 - checksum: a98ede08708a3d859a07798cab5653ae312526a1e439f7066d5403c5ea0d23a53348565b3971433670cfc7d0ce95a58a535e4b68dc10834c45a74b4de37e72b1 - languageName: node - linkType: hard - -"retext@npm:^9.0.0": - version: 9.0.0 - resolution: "retext@npm:9.0.0" - dependencies: - "@types/nlcst": ^2.0.0 - retext-latin: ^4.0.0 - retext-stringify: ^4.0.0 - unified: ^11.0.0 - checksum: 191b5e5434cb5aeb5dd8947ceaebcd07637a73bae4170540941d256257898e0e65e411a839f1060888794daa575bf22e5cb4a6d3fd0bb3cc325e21b8b5423008 - languageName: node - linkType: hard - "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -20645,13 +17366,6 @@ __metadata: languageName: node linkType: hard -"robust-predicates@npm:^3.0.2": - version: 3.0.2 - resolution: "robust-predicates@npm:3.0.2" - checksum: 36854c1321548ceca96d36ad9d6e0a5a512986029ec6929ad6ed3ec1612c22cc8b46cc72d2c5674af42e8074a119d793f6f0ea3a5b51373e3ab926c64b172d7a - languageName: node - linkType: hard - "rollup@npm:^3.21.0": version: 3.29.4 resolution: "rollup@npm:3.29.4" @@ -20729,69 +17443,6 @@ __metadata: languageName: node linkType: hard -"rollup@npm:^4.20.0": - version: 4.22.5 - resolution: "rollup@npm:4.22.5" - dependencies: - "@rollup/rollup-android-arm-eabi": 4.22.5 - "@rollup/rollup-android-arm64": 4.22.5 - "@rollup/rollup-darwin-arm64": 4.22.5 - "@rollup/rollup-darwin-x64": 4.22.5 - "@rollup/rollup-linux-arm-gnueabihf": 4.22.5 - "@rollup/rollup-linux-arm-musleabihf": 4.22.5 - "@rollup/rollup-linux-arm64-gnu": 4.22.5 - "@rollup/rollup-linux-arm64-musl": 4.22.5 - "@rollup/rollup-linux-powerpc64le-gnu": 4.22.5 - "@rollup/rollup-linux-riscv64-gnu": 4.22.5 - "@rollup/rollup-linux-s390x-gnu": 4.22.5 - "@rollup/rollup-linux-x64-gnu": 4.22.5 - "@rollup/rollup-linux-x64-musl": 4.22.5 - "@rollup/rollup-win32-arm64-msvc": 4.22.5 - "@rollup/rollup-win32-ia32-msvc": 4.22.5 - "@rollup/rollup-win32-x64-msvc": 4.22.5 - "@types/estree": 1.0.6 - fsevents: ~2.3.2 - dependenciesMeta: - "@rollup/rollup-android-arm-eabi": - optional: true - "@rollup/rollup-android-arm64": - optional: true - "@rollup/rollup-darwin-arm64": - optional: true - "@rollup/rollup-darwin-x64": - optional: true - "@rollup/rollup-linux-arm-gnueabihf": - optional: true - "@rollup/rollup-linux-arm-musleabihf": - optional: true - "@rollup/rollup-linux-arm64-gnu": - optional: true - "@rollup/rollup-linux-arm64-musl": - optional: true - "@rollup/rollup-linux-powerpc64le-gnu": - optional: true - "@rollup/rollup-linux-riscv64-gnu": - optional: true - "@rollup/rollup-linux-s390x-gnu": - optional: true - "@rollup/rollup-linux-x64-gnu": - optional: true - "@rollup/rollup-linux-x64-musl": - optional: true - "@rollup/rollup-win32-arm64-msvc": - optional: true - "@rollup/rollup-win32-ia32-msvc": - optional: true - "@rollup/rollup-win32-x64-msvc": - optional: true - fsevents: - optional: true - bin: - rollup: dist/bin/rollup - checksum: 894b3d428b5a7f1db2245f50622ce65a3ad8f754265dd1da7dce133e39b315516dbcbac51e4fe100b44d59b168bac3f36ebaeb836fc9f7057d4972f44497d046 - languageName: node - linkType: hard - "root-workspace-0b6124@workspace:.": version: 0.0.0-use.local resolution: "root-workspace-0b6124@workspace:." @@ -20819,18 +17470,6 @@ __metadata: languageName: unknown linkType: soft -"roughjs@npm:^4.6.6": - version: 4.6.6 - resolution: "roughjs@npm:4.6.6" - dependencies: - hachure-fill: ^0.5.2 - path-data-parser: ^0.1.0 - points-on-curve: ^0.2.0 - points-on-path: ^0.2.1 - checksum: ec4b8266ac4a50c7369e337d8ddff3b2d970506229cac5425ddca56f4e6b29fca07dded4300e9e392bb608da4ba618d349fd241283affb25055cab7c2fe48f8f - languageName: node - linkType: hard - "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -20840,13 +17479,6 @@ __metadata: languageName: node linkType: hard -"rw@npm:1": - version: 1.3.3 - resolution: "rw@npm:1.3.3" - checksum: c20d82421f5a71c86a13f76121b751553a99cd4a70ea27db86f9b23f33db941f3f06019c30f60d50c356d0bd674c8e74764ac146ea55e217c091bde6fba82aa3 - languageName: node - linkType: hard - "sade@npm:^1.7.3": version: 1.8.1 resolution: "sade@npm:1.8.1" @@ -20918,25 +17550,6 @@ __metadata: languageName: node linkType: hard -"scroll-into-view-if-needed@npm:^3.1.0": - version: 3.1.0 - resolution: "scroll-into-view-if-needed@npm:3.1.0" - dependencies: - compute-scroll-into-view: ^3.0.2 - checksum: edc0f68dc170d0c153ce4ae2929cbdfaf3426d1fc842b67d5f092c5ec38fbb8408e6cb8467f86d8dfb23de3f77a2f2a9e79cbf80bc49b35a39f3092e18b4c3d5 - languageName: node - linkType: hard - -"section-matter@npm:^1.0.0": - version: 1.0.0 - resolution: "section-matter@npm:1.0.0" - dependencies: - extend-shallow: ^2.0.1 - kind-of: ^6.0.0 - checksum: 3cc4131705493b2955729b075dcf562359bba66183debb0332752dc9cad35616f6da7a23e42b6cab45cd2e4bb5cda113e9e84c8f05aee77adb6b0289a0229101 - languageName: node - linkType: hard - "secure-compare@npm:3.0.1": version: 3.0.1 resolution: "secure-compare@npm:3.0.1" @@ -21152,20 +17765,6 @@ __metadata: languageName: node linkType: hard -"shiki@npm:^1.0.0": - version: 1.21.0 - resolution: "shiki@npm:1.21.0" - dependencies: - "@shikijs/core": 1.21.0 - "@shikijs/engine-javascript": 1.21.0 - "@shikijs/engine-oniguruma": 1.21.0 - "@shikijs/types": 1.21.0 - "@shikijs/vscode-textmate": ^9.2.2 - "@types/hast": ^3.0.4 - checksum: b0839ec3b1fec6192a7532c64999986a258b5a040bd5bf00ce0d84d8f4482f5e9e0bcf73654fbbf0a4249022decbae940049e752d8bf439bcb84459ab06c520a - languageName: node - linkType: hard - "side-channel@npm:^1.0.4": version: 1.0.4 resolution: "side-channel@npm:1.0.4" @@ -21233,13 +17832,6 @@ __metadata: languageName: node linkType: hard -"slash@npm:^5.1.0": - version: 5.1.0 - resolution: "slash@npm:5.1.0" - checksum: 70434b34c50eb21b741d37d455110258c42d2cf18c01e6518aeb7299f3c6e626330c889c0c552b5ca2ef54a8f5a74213ab48895f0640717cacefeef6830a1ba4 - languageName: node - linkType: hard - "slate@npm:0.94.1": version: 0.94.1 resolution: "slate@npm:0.94.1" @@ -21357,13 +17949,6 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:^1.0.2, source-map-js@npm:^1.2.1": - version: 1.2.1 - resolution: "source-map-js@npm:1.2.1" - checksum: 4eb0cd997cdf228bc253bcaff9340afeb706176e64868ecd20efbe6efea931465f43955612346d6b7318789e5265bdc419bc7669c1cebe3db0eb255f57efa76b - languageName: node - linkType: hard - "source-map-js@npm:^1.2.0": version: 1.2.0 resolution: "source-map-js@npm:1.2.0" @@ -21395,20 +17980,6 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.7.0": - version: 0.7.4 - resolution: "source-map@npm:0.7.4" - checksum: 01cc5a74b1f0e1d626a58d36ad6898ea820567e87f18dfc9d24a9843a351aaa2ec09b87422589906d6ff1deed29693e176194dc88bcae7c9a852dc74b311dbf5 - languageName: node - linkType: hard - -"space-separated-tokens@npm:^1.0.0": - version: 1.1.5 - resolution: "space-separated-tokens@npm:1.1.5" - checksum: 8ef68f1cfa8ccad316b7f8d0df0919d0f1f6d32101e8faeee34ea3a923ce8509c1ad562f57388585ee4951e92d27afa211ed0a077d3d5995b5ba9180331be708 - languageName: node - linkType: hard - "space-separated-tokens@npm:^2.0.0": version: 2.0.2 resolution: "space-separated-tokens@npm:2.0.2" @@ -21460,19 +18031,6 @@ __metadata: languageName: node linkType: hard -"speech-rule-engine@npm:^4.0.6": - version: 4.0.7 - resolution: "speech-rule-engine@npm:4.0.7" - dependencies: - commander: 9.2.0 - wicked-good-xpath: 1.3.0 - xmldom-sre: 0.1.31 - bin: - sre: bin/sre - checksum: e5b8a5878be61d0344d5e9e0327e6bdf25a23de8fb66bd1898719d52b5f12f42b7e11a3387b8f293420c5eaab57b3ed9099be0adcc2132177301e81134612f38 - languageName: node - linkType: hard - "split2@npm:^4.0.0": version: 4.2.0 resolution: "split2@npm:4.2.0" @@ -21575,13 +18133,6 @@ __metadata: languageName: node linkType: hard -"streamsearch@npm:^1.1.0": - version: 1.1.0 - resolution: "streamsearch@npm:1.1.0" - checksum: 1cce16cea8405d7a233d32ca5e00a00169cc0e19fbc02aa839959985f267335d435c07f96e5e0edd0eadc6d39c98d5435fb5bbbdefc62c41834eadc5622ad942 - languageName: node - linkType: hard - "string-argv@npm:0.3.2": version: 0.3.2 resolution: "string-argv@npm:0.3.2" @@ -21837,13 +18388,6 @@ __metadata: languageName: node linkType: hard -"strip-bom-string@npm:^1.0.0": - version: 1.0.0 - resolution: "strip-bom-string@npm:1.0.0" - checksum: 5635a3656d8512a2c194d6c8d5dee7ef0dde6802f7be9413b91e201981ad4132506656d9cf14137f019fd50f0269390d91c7f6a2601b1bee039a4859cfce4934 - languageName: node - linkType: hard - "strip-bom@npm:^3.0.0": version: 3.0.0 resolution: "strip-bom@npm:3.0.0" @@ -21949,22 +18493,6 @@ __metadata: languageName: node linkType: hard -"styled-jsx@npm:5.1.1": - version: 5.1.1 - resolution: "styled-jsx@npm:5.1.1" - dependencies: - client-only: 0.0.1 - peerDependencies: - react: ">= 16.8.0 || 17.x.x || ^18.0.0-0" - peerDependenciesMeta: - "@babel/core": - optional: true - babel-plugin-macros: - optional: true - checksum: 523a33b38603492547e861b98e29c873939b04e15fbe5ef16132c6f1e15958126647983c7d4675325038b428a5e91183d996e90141b18bdd1bbadf6e2c45b2fa - languageName: node - linkType: hard - "stylis@npm:^4.3.0": version: 4.3.1 resolution: "stylis@npm:4.3.1" @@ -21972,22 +18500,6 @@ __metadata: languageName: node linkType: hard -"stylis@npm:^4.3.1": - version: 4.3.4 - resolution: "stylis@npm:4.3.4" - checksum: 7e3a482c7bba6e0e9e3187972e958acf800b1abe99f23e081fcb5dea8e4a05eca44286c1381ce2bc7179245ddbd7bf1f74237ed413fce7491320a543bcfebda9 - languageName: node - linkType: hard - -"supports-color@npm:^4.0.0": - version: 4.5.0 - resolution: "supports-color@npm:4.5.0" - dependencies: - has-flag: ^2.0.0 - checksum: 6da4f498d5c71e8619f06e4a11d16f044105faf7590b5b005fc84933fbefdf72c2b4e5b7174c66da6ddc68e7f6ef56cc960a5ebd6f2d542d910e259e61b02335 - languageName: node - linkType: hard - "supports-color@npm:^5.3.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" @@ -22065,13 +18577,6 @@ __metadata: languageName: node linkType: hard -"tabbable@npm:^6.0.0": - version: 6.2.0 - resolution: "tabbable@npm:6.2.0" - checksum: f8440277d223949272c74bb627a3371be21735ca9ad34c2570f7e1752bd646ccfc23a9d8b1ee65d6561243f4134f5fbbf1ad6b39ac3c4b586554accaff4a1300 - languageName: node - linkType: hard - "tapable@npm:^2.2.0": version: 2.2.1 resolution: "tapable@npm:2.2.1" @@ -22270,13 +18775,6 @@ __metadata: languageName: node linkType: hard -"tinyexec@npm:^0.3.0": - version: 0.3.0 - resolution: "tinyexec@npm:0.3.0" - checksum: e55473d249b8fc94bc5b1461d8e368dfe0ba23dcfca4f9069fe25418b17772e50110a1d33cd7ac8ff26456e5b609e0528cce7660e35246fad9b00bd094f3f444 - languageName: node - linkType: hard - "tinypool@npm:^0.8.3": version: 0.8.4 resolution: "tinypool@npm:0.8.4" @@ -22291,27 +18789,6 @@ __metadata: languageName: node linkType: hard -"title@npm:^3.5.3": - version: 3.5.3 - resolution: "title@npm:3.5.3" - dependencies: - arg: 1.0.0 - chalk: 2.3.0 - clipboardy: 1.2.2 - titleize: 1.0.0 - bin: - title: bin/title.js - checksum: 3fcd2fffcd12292d2015b7bdacf092cb9ed716b2e0187fdaa5ab0556f636c795f23a698e8a3d2f87ab647df35ba7b4e0ddfc1675b4676c535fb877daafb0dae5 - languageName: node - linkType: hard - -"titleize@npm:1.0.0": - version: 1.0.0 - resolution: "titleize@npm:1.0.0" - checksum: a8234b7860077f7d391d06e13c645fe2bf60431012d78ca196d4d73e4768e33cfc3a0dd881bf2f9974c8bd8beeb9d85e7842ec35d267b7c2a06f287de1c4ea7e - languageName: node - linkType: hard - "to-fast-properties@npm:^2.0.0": version: 2.0.0 resolution: "to-fast-properties@npm:2.0.0" @@ -22598,25 +19075,6 @@ __metadata: languageName: node linkType: hard -"twoslash-protocol@npm:0.2.12": - version: 0.2.12 - resolution: "twoslash-protocol@npm:0.2.12" - checksum: 9f66d3729d79ce5ebd3049e77c8efa344d5b09f19b7967dbe30d3535ddbea820a6c29fe5ea23e34db31c8349aee8968d1e983fcf644f8d455293e74b24d85d9c - languageName: node - linkType: hard - -"twoslash@npm:^0.2.12": - version: 0.2.12 - resolution: "twoslash@npm:0.2.12" - dependencies: - "@typescript/vfs": ^1.6.0 - twoslash-protocol: 0.2.12 - peerDependencies: - typescript: "*" - checksum: 7b218a6ed0e32bec16497dbc121746719e1b50324ba774500a86c3a0f6fbf58e30631c4634b51ea60ac1cce1f99c0b92ac90e180e2c2d774794acf7fc1c39918 - languageName: node - linkType: hard - "type-check@npm:^0.4.0, type-check@npm:~0.4.0": version: 0.4.0 resolution: "type-check@npm:0.4.0" @@ -22812,13 +19270,6 @@ __metadata: languageName: node linkType: hard -"ufo@npm:^1.5.3": - version: 1.5.4 - resolution: "ufo@npm:1.5.4" - checksum: f244703b7d4f9f0df4f9af23921241ab73410b591f4e5b39c23e3147f3159b139a4b1fb5903189c306129f7a16b55995dac0008e0fbae88a37c3e58cbc34d833 - languageName: node - linkType: hard - "uglify-js@npm:^3.1.4": version: 3.17.0 resolution: "uglify-js@npm:3.17.0" @@ -23008,21 +19459,6 @@ __metadata: languageName: node linkType: hard -"unified@npm:^11.0.5": - version: 11.0.5 - resolution: "unified@npm:11.0.5" - 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 - checksum: b3bf7fd6f568cc261e074dae21188483b0f2a8ab858d62e6e85b75b96cc655f59532906ae3c64d56a9b257408722d71f1d4135292b3d7ee02907c8b592fb3cf0 - languageName: node - linkType: hard - "unified@npm:^9.1.0": version: 9.2.2 resolution: "unified@npm:9.2.2" @@ -23073,16 +19509,6 @@ __metadata: languageName: node linkType: hard -"unist-util-find-after@npm:^5.0.0": - version: 5.0.0 - resolution: "unist-util-find-after@npm:5.0.0" - dependencies: - "@types/unist": ^3.0.0 - unist-util-is: ^6.0.0 - checksum: e64bd5ebee7ac021cf990bf33e9ec29fc6452159187d4a7fa0f77334bea8e378fea7a7fb0bcf957300b2ffdba902ff25b62c165fc8b86309613da35ad793ada0 - languageName: node - linkType: hard - "unist-util-generated@npm:^1.0.0, unist-util-generated@npm:^1.1.0": version: 1.1.6 resolution: "unist-util-generated@npm:1.1.6" @@ -23115,15 +19541,6 @@ __metadata: languageName: node linkType: hard -"unist-util-is@npm:^5.0.0": - version: 5.2.1 - resolution: "unist-util-is@npm:5.2.1" - dependencies: - "@types/unist": ^2.0.0 - checksum: ae76fdc3d35352cd92f1bedc3a0d407c3b9c42599a52ab9141fe89bdd786b51f0ec5a2ab68b93fb532e239457cae62f7e39eaa80229e1cb94875da2eafcbe5c4 - languageName: node - linkType: hard - "unist-util-is@npm:^6.0.0": version: 6.0.0 resolution: "unist-util-is@npm:6.0.0" @@ -23133,16 +19550,6 @@ __metadata: languageName: node linkType: hard -"unist-util-modify-children@npm:^4.0.0": - version: 4.0.0 - resolution: "unist-util-modify-children@npm:4.0.0" - dependencies: - "@types/unist": ^3.0.0 - array-iterate: ^2.0.0 - checksum: 4cb8a7d9365e6726df82a444d556177e99f582c32c1f5223b96f31b477502b53365ec5231fdab355d77ba21cd90822e594ba030b3ba06ea0786842d409d28fd3 - languageName: node - linkType: hard - "unist-util-position-from-estree@npm:^2.0.0": version: 2.0.0 resolution: "unist-util-position-from-estree@npm:2.0.0" @@ -23178,17 +19585,6 @@ __metadata: languageName: node linkType: hard -"unist-util-remove@npm:^4.0.0": - version: 4.0.0 - resolution: "unist-util-remove@npm:4.0.0" - dependencies: - "@types/unist": ^3.0.0 - unist-util-is: ^6.0.0 - unist-util-visit-parents: ^6.0.0 - checksum: 684db988a486782ae3e721d03bd502f9aaa5ef9d55c688da7cdc777864210faa02552d8a40def856d7c31c281816cdd8b9562ea86d4eec9f122c6aaf5a799f26 - languageName: node - linkType: hard - "unist-util-stringify-position@npm:^2.0.0": version: 2.0.3 resolution: "unist-util-stringify-position@npm:2.0.3" @@ -23207,15 +19603,6 @@ __metadata: languageName: node linkType: hard -"unist-util-visit-children@npm:^3.0.0": - version: 3.0.0 - resolution: "unist-util-visit-children@npm:3.0.0" - dependencies: - "@types/unist": ^3.0.0 - checksum: a900485e2778e053b6bb674437db67cc1b2dcdb21bb69dca9fac49edf6b2662ec04c6871c6cd40b623700421ac1bbc9d1265ca2cc8a91ba56f57b0da5ac3b2c9 - languageName: node - linkType: hard - "unist-util-visit-parents@npm:^3.0.0": version: 3.1.1 resolution: "unist-util-visit-parents@npm:3.1.1" @@ -23226,16 +19613,6 @@ __metadata: languageName: node linkType: hard -"unist-util-visit-parents@npm:^4.0.0": - version: 4.1.1 - resolution: "unist-util-visit-parents@npm:4.1.1" - dependencies: - "@types/unist": ^2.0.0 - unist-util-is: ^5.0.0 - checksum: 49d78984a6dd858a989f849d2b4330c8a04d1ee99c0e9920a5e37668cf847dab95db77a3bf0c8aaeb3e66abeae12e2d454949ec401614efef377d8f82d215662 - languageName: node - linkType: hard - "unist-util-visit-parents@npm:^6.0.0": version: 6.0.1 resolution: "unist-util-visit-parents@npm:6.0.1" @@ -23257,17 +19634,6 @@ __metadata: languageName: node linkType: hard -"unist-util-visit@npm:^3.1.0": - version: 3.1.0 - resolution: "unist-util-visit@npm:3.1.0" - dependencies: - "@types/unist": ^2.0.0 - unist-util-is: ^5.0.0 - unist-util-visit-parents: ^4.0.0 - checksum: c37dbc0c5509f85f3abdf46d927b3dd11e6c419159771b1f1a5ce446d36ac993d04b087e28bc6173a172e0fbe9d77e997f120029b2b449766ebe55b6f6e0cc2c - languageName: node - linkType: hard - "unist-util-visit@npm:^5.0.0": version: 5.0.0 resolution: "unist-util-visit@npm:5.0.0" @@ -23300,32 +19666,6 @@ __metadata: languageName: node linkType: hard -"unplugin-fonts@npm:^1.3.1": - version: 1.3.1 - resolution: "unplugin-fonts@npm:1.3.1" - dependencies: - fast-glob: ^3.3.2 - unplugin: 2.0.0-beta.1 - peerDependencies: - "@nuxt/kit": ^3.0.0 - vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 - peerDependenciesMeta: - "@nuxt/kit": - optional: true - checksum: 7a00d06edd90e69a4d7c5d5563259ac0c9bea54dfb1d11d14bf08115bfdf9f4e35762ab0d428f0417ce019ab075a4d0d85c9aaa5e2dc4323e675ee8b8dec7d68 - languageName: node - linkType: hard - -"unplugin@npm:2.0.0-beta.1": - version: 2.0.0-beta.1 - resolution: "unplugin@npm:2.0.0-beta.1" - dependencies: - acorn: ^8.14.0 - webpack-virtual-modules: ^0.6.2 - checksum: 62baae6ac7721844d5da3dac22f67cd66bea492ae6e7adaf5fcdd0bf390589473748a79db34ea028380583f17cc68829edfea081d9fb5b6ddcfb9a96eecb3d77 - languageName: node - linkType: hard - "unplugin@npm:^1.3.1": version: 1.10.0 resolution: "unplugin@npm:1.10.0" @@ -23451,7 +19791,7 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^9.0.0, uuid@npm:^9.0.1": +"uuid@npm:^9.0.0": version: 9.0.1 resolution: "uuid@npm:9.0.1" bin: @@ -23648,21 +19988,6 @@ __metadata: languageName: node linkType: hard -"vite-node@npm:^1.2.0": - version: 1.6.0 - resolution: "vite-node@npm:1.6.0" - dependencies: - cac: ^6.7.14 - debug: ^4.3.4 - pathe: ^1.1.1 - picocolors: ^1.0.0 - vite: ^5.0.0 - bin: - vite-node: vite-node.mjs - checksum: ce111c5c7a4cf65b722baa15cbc065b7bfdbf1b65576dd6372995f6a72b2b93773ec5df59f6c5f08cfe1284806597b44b832efcea50d5971102428159ff4379f - languageName: node - linkType: hard - "vite-plugin-dts@npm:3.8.3": version: 3.8.3 resolution: "vite-plugin-dts@npm:3.8.3" @@ -23717,20 +20042,6 @@ __metadata: languageName: node linkType: hard -"vite-plugin-static-copy@npm:^2.2.0": - version: 2.2.0 - resolution: "vite-plugin-static-copy@npm:2.2.0" - dependencies: - chokidar: ^3.5.3 - fast-glob: ^3.2.11 - fs-extra: ^11.1.0 - picocolors: ^1.0.0 - peerDependencies: - vite: ^5.0.0 || ^6.0.0 - checksum: dd3f06c779c2be556ed2ea717de20c89485710c6c6cfa7ba02da962a81998932cbf7e393c7979a6fa8e00d8dc26226de7d57b1489b86da4e0085d33f87297add - languageName: node - linkType: hard - "vite-plugin-svgr@npm:4.2.0": version: 4.2.0 resolution: "vite-plugin-svgr@npm:4.2.0" @@ -23837,49 +20148,6 @@ __metadata: languageName: node linkType: hard -"vite@npm:^5.0.11": - version: 5.4.8 - resolution: "vite@npm:5.4.8" - dependencies: - esbuild: ^0.21.3 - fsevents: ~2.3.3 - postcss: ^8.4.43 - rollup: ^4.20.0 - peerDependencies: - "@types/node": ^18.0.0 || >=20.0.0 - less: "*" - lightningcss: ^1.21.0 - sass: "*" - sass-embedded: "*" - stylus: "*" - sugarss: "*" - terser: ^5.4.0 - dependenciesMeta: - fsevents: - optional: true - peerDependenciesMeta: - "@types/node": - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - bin: - vite: bin/vite.js - checksum: b5686ff76a60d53092dc13a5c1e5627165226b8e3da7736931adf87bbe58d383bca386383cea134750108c2d42750c916db3f2314ac90a9477d693950145f140 - languageName: node - linkType: hard - "vitest@npm:1.5.0": version: 1.5.0 resolution: "vitest@npm:1.5.0" @@ -23943,23 +20211,6 @@ __metadata: languageName: node linkType: hard -"vscode-jsonrpc@npm:8.2.0": - version: 8.2.0 - resolution: "vscode-jsonrpc@npm:8.2.0" - checksum: f302a01e59272adc1ae6494581fa31c15499f9278df76366e3b97b2236c7c53ebfc71efbace9041cfd2caa7f91675b9e56f2407871a1b3c7f760a2e2ee61484a - languageName: node - linkType: hard - -"vscode-languageserver-protocol@npm:3.17.5": - version: 3.17.5 - resolution: "vscode-languageserver-protocol@npm:3.17.5" - dependencies: - vscode-jsonrpc: 8.2.0 - vscode-languageserver-types: 3.17.5 - checksum: dfb42d276df5dfea728267885b99872ecff62f6c20448b8539fae71bb196b420f5351c5aca7c1047bf8fb1f89fa94a961dce2bc5bf7e726198f4be0bb86a1e71 - languageName: node - linkType: hard - "vscode-languageserver-textdocument@npm:^1.0.3": version: 1.0.5 resolution: "vscode-languageserver-textdocument@npm:1.0.5" @@ -23967,20 +20218,6 @@ __metadata: languageName: node linkType: hard -"vscode-languageserver-textdocument@npm:~1.0.11": - version: 1.0.12 - resolution: "vscode-languageserver-textdocument@npm:1.0.12" - checksum: 49415c8f065860693fdd6cb0f7b8a24470130dc941e887a396b6e6bbae93be132323a644aa1edd7d0eec38a730e05a2d013aebff6bddd30c5af374ef3f4cd9ab - languageName: node - linkType: hard - -"vscode-languageserver-types@npm:3.17.5": - version: 3.17.5 - resolution: "vscode-languageserver-types@npm:3.17.5" - checksum: 79b420e7576398d396579ca3a461c9ed70e78db4403cd28bbdf4d3ed2b66a2b4114031172e51fad49f0baa60a2180132d7cb2ea35aa3157d7af3c325528210ac - languageName: node - linkType: hard - "vscode-languageserver-types@npm:^3.16.0": version: 3.17.2 resolution: "vscode-languageserver-types@npm:3.17.2" @@ -23988,17 +20225,6 @@ __metadata: languageName: node linkType: hard -"vscode-languageserver@npm:~9.0.1": - version: 9.0.1 - resolution: "vscode-languageserver@npm:9.0.1" - dependencies: - vscode-languageserver-protocol: 3.17.5 - bin: - installServerIntoExtension: bin/installServerIntoExtension - checksum: 8b7dfda47fb64c3f48a9dabd3f01938cc8d39f3f068f1ee586eaf0a373536180a1047bdde8d876f965cfc04160d1587e99828b61b742b0342595fee67c8814ea - languageName: node - linkType: hard - "vscode-nls@npm:^5.0.0": version: 5.1.0 resolution: "vscode-nls@npm:5.1.0" @@ -24013,13 +20239,6 @@ __metadata: languageName: node linkType: hard -"vscode-uri@npm:~3.0.8": - version: 3.0.8 - resolution: "vscode-uri@npm:3.0.8" - checksum: 514249126850c0a41a7d8c3c2836cab35983b9dc1938b903cfa253b9e33974c1416d62a00111385adcfa2b98df456437ab704f709a2ecca76a90134ef5eb4832 - languageName: node - linkType: hard - "vue-template-compiler@npm:^2.7.14": version: 2.7.16 resolution: "vue-template-compiler@npm:2.7.16" @@ -24115,13 +20334,6 @@ __metadata: languageName: node linkType: hard -"webpack-virtual-modules@npm:^0.6.2": - version: 0.6.2 - resolution: "webpack-virtual-modules@npm:0.6.2" - checksum: 7e8e1d63f35864c815420cc2f27da8561a1e028255040698a352717de0ba46d3b3faf16f06c1a1965217054c4c2894eb9af53a85451870e919b5707ce9c5822d - languageName: node - linkType: hard - "whatwg-encoding@npm:^2.0.0": version: 2.0.0 resolution: "whatwg-encoding@npm:2.0.0" @@ -24220,13 +20432,6 @@ __metadata: languageName: node linkType: hard -"wicked-good-xpath@npm:1.3.0": - version: 1.3.0 - resolution: "wicked-good-xpath@npm:1.3.0" - checksum: 1aa84bd57426aa07f95d7eca0b0410e841b8e7a35248c9404fa235eaf6a0932c811a96cbdc763c3df18ab76c7644fd8e807d8f185146154d3fc6baf554dcc7e3 - languageName: node - linkType: hard - "wide-align@npm:^1.1.5": version: 1.1.5 resolution: "wide-align@npm:1.1.5" @@ -24349,14 +20554,7 @@ __metadata: languageName: node linkType: hard -"xmldom-sre@npm:0.1.31": - version: 0.1.31 - resolution: "xmldom-sre@npm:0.1.31" - checksum: dbd101600a64c1640b06fb2b5c626ce6d909fd40c966fcae84a2b64c708fe466630766173b5760e0275db2a2c542e048b14a2a6568feece2c315f0cd22a2f642 - languageName: node - linkType: hard - -"xtend@npm:^4.0.0, xtend@npm:~4.0.1": +"xtend@npm:~4.0.1": version: 4.0.2 resolution: "xtend@npm:4.0.2" checksum: ac5dfa738b21f6e7f0dd6e65e1b3155036d68104e67e5d5d1bde74892e327d7e5636a076f625599dc394330a731861e87343ff184b0047fef1360a7ec0a5a36a @@ -24414,15 +20612,6 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^2.3.2": - version: 2.5.1 - resolution: "yaml@npm:2.5.1" - bin: - yaml: bin.mjs - checksum: 31275223863fbd0b47ba9d2b248fbdf085db8d899e4ca43fff8a3a009497c5741084da6871d11f40e555d61360951c4c910b98216c1325d2c94753c0036d8172 - languageName: node - linkType: hard - "yargs-parser@npm:^21.0.0": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1" @@ -24459,13 +20648,6 @@ __metadata: languageName: node linkType: hard -"yocto-queue@npm:^1.1.1": - version: 1.1.1 - resolution: "yocto-queue@npm:1.1.1" - checksum: f2e05b767ed3141e6372a80af9caa4715d60969227f38b1a4370d60bffe153c9c5b33a862905609afc9b375ec57cd40999810d20e5e10229a204e8bde7ef255c - languageName: node - linkType: hard - "z-schema@npm:~5.0.2": version: 5.0.4 resolution: "z-schema@npm:5.0.4" @@ -24483,15 +20665,6 @@ __metadata: languageName: node linkType: hard -"zod-validation-error@npm:^3.0.0": - version: 3.4.0 - resolution: "zod-validation-error@npm:3.4.0" - peerDependencies: - zod: ^3.18.0 - checksum: b07fbfc39582dbdf6972f5f5f0c3bac9e6b5e6d2e55ef3dd891fd08f1966ebf1023a4bc270e9b569eaa48ed1684ac2252c9f260b0bd07b167671596e6e4d0fa8 - languageName: node - linkType: hard - "zod@npm:3.22.4": version: 3.22.4 resolution: "zod@npm:3.22.4" @@ -24499,13 +20672,6 @@ __metadata: languageName: node linkType: hard -"zod@npm:^3.22.3": - version: 3.23.8 - resolution: "zod@npm:3.23.8" - checksum: 15949ff82118f59c893dacd9d3c766d02b6fa2e71cf474d5aa888570c469dbf5446ac5ad562bb035bf7ac9650da94f290655c194f4a6de3e766f43febd432c5c - languageName: node - linkType: hard - "zwitch@npm:^1.0.0": version: 1.0.5 resolution: "zwitch@npm:1.0.5" @@ -24519,10 +20685,3 @@ __metadata: checksum: 8edd7af8375f12f64d8dbef815af32cd77bd9237d0b013210ba4e3aef25fdc460fe264cd0a19deabe9f86ef0c607240ebac1a336bf4a70bf06ef53e0652de116 languageName: node linkType: hard - -"zwitch@npm:^2.0.4": - version: 2.0.4 - resolution: "zwitch@npm:2.0.4" - checksum: f22ec5fc2d5f02c423c93d35cdfa83573a3a3bd98c66b927c368ea4d0e7252a500df2a90a6b45522be536a96a73404393c958e945fdba95e6832c200791702b6 - languageName: node - linkType: hard From cf8e34467a773379f53fe536cdfcf6347739fe8a Mon Sep 17 00:00:00 2001 From: Ben Teichman Date: Tue, 14 Jan 2025 16:36:27 -0500 Subject: [PATCH 2/2] chore: rename back to react-chat --- examples/live-agent/package.json | 2 +- examples/live-agent/src/config.ts | 2 +- examples/live-agent/src/context.tsx | 2 +- examples/live-agent/src/main.tsx | 2 +- examples/live-agent/src/traces/LiveAgent.trace.ts | 2 +- examples/live-agent/src/use-live-agent.hook.ts | 4 ++-- packages/react-chat/package.json | 4 ++-- yarn.lock | 6 +++--- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/examples/live-agent/package.json b/examples/live-agent/package.json index 5d65d7089e..6e01331c49 100644 --- a/examples/live-agent/package.json +++ b/examples/live-agent/package.json @@ -13,7 +13,7 @@ "dependencies": { "@voiceflow/exception": "1.4.0", "@voiceflow/fetch": "1.5.2", - "@voiceflow/react-chat-legacy": "workspace:*", + "@voiceflow/react-chat": "workspace:*", "@voiceflow/slate-serializer": "1.4.2", "nanoevents": "8.0.0", "react": "18.2.0", diff --git a/examples/live-agent/src/config.ts b/examples/live-agent/src/config.ts index defdacebe5..35bfe5589c 100644 --- a/examples/live-agent/src/config.ts +++ b/examples/live-agent/src/config.ts @@ -1,4 +1,4 @@ -import { AssistantOptions, ChatConfig } from '@voiceflow/react-chat-legacy'; +import { AssistantOptions, ChatConfig } from '@voiceflow/react-chat'; const IMAGE = 'https://picsum.photos/seed/1/200/300'; const AVATAR = 'https://picsum.photos/seed/1/80/80'; diff --git a/examples/live-agent/src/context.tsx b/examples/live-agent/src/context.tsx index bd3d2cc545..9668585158 100644 --- a/examples/live-agent/src/context.tsx +++ b/examples/live-agent/src/context.tsx @@ -1,4 +1,4 @@ -import { RuntimeProvider as BaseProvider } from '@voiceflow/react-chat-legacy'; +import { RuntimeProvider as BaseProvider } from '@voiceflow/react-chat'; import { createNanoEvents } from 'nanoevents'; import { useMemo } from 'react'; diff --git a/examples/live-agent/src/main.tsx b/examples/live-agent/src/main.tsx index 5154f03981..7d1c89bc81 100644 --- a/examples/live-agent/src/main.tsx +++ b/examples/live-agent/src/main.tsx @@ -1,4 +1,4 @@ -import { ChatWidget } from '@voiceflow/react-chat-legacy'; +import { ChatWidget } from '@voiceflow/react-chat'; import { createRoot } from 'react-dom/client'; import { RuntimeProvider } from './context'; diff --git a/examples/live-agent/src/traces/LiveAgent.trace.ts b/examples/live-agent/src/traces/LiveAgent.trace.ts index 9b58342e45..15d88eae0c 100644 --- a/examples/live-agent/src/traces/LiveAgent.trace.ts +++ b/examples/live-agent/src/traces/LiveAgent.trace.ts @@ -1,4 +1,4 @@ -import type { TraceHandler } from '@voiceflow/react-chat-legacy'; +import type { TraceHandler } from '@voiceflow/react-chat'; import type { LiveAgentPlatform } from '../../shared/live-agent-platform.enum'; diff --git a/examples/live-agent/src/use-live-agent.hook.ts b/examples/live-agent/src/use-live-agent.hook.ts index 4f809fb0bd..c37cdbbe30 100644 --- a/examples/live-agent/src/use-live-agent.hook.ts +++ b/examples/live-agent/src/use-live-agent.hook.ts @@ -1,6 +1,6 @@ import { FetchClient } from '@voiceflow/fetch'; -import type { RuntimeState } from '@voiceflow/react-chat-legacy'; -import { TurnType } from '@voiceflow/react-chat-legacy'; +import type { RuntimeState } from '@voiceflow/react-chat'; +import { TurnType } from '@voiceflow/react-chat'; import { serializeToText } from '@voiceflow/slate-serializer/text'; import type { Emitter } from 'nanoevents'; import { useMemo } from 'react'; diff --git a/packages/react-chat/package.json b/packages/react-chat/package.json index 99e0c84390..148a8e98f6 100644 --- a/packages/react-chat/package.json +++ b/packages/react-chat/package.json @@ -1,5 +1,5 @@ { - "name": "@voiceflow/react-chat-legacy", + "name": "@voiceflow/react-chat", "version": "1.66.1", "private": true, "description": "voiceflow chat ui kit", @@ -21,7 +21,7 @@ "dist" ], "scripts": { - "build": "yarn g:turbo run build:cmd --filter=@voiceflow/react-chat-legacy...", + "build": "yarn g:turbo run build:cmd --filter=@voiceflow/react-chat...", "build:bundle": "NODE_ENV=production vite build", "build:cmd": "yarn g:run-p build:package build:bundle", "build:package": "NODE_ENV=production vite --config vite.package.config.ts build && yarn g:tsc-alias -p tsconfig.build.json", diff --git a/yarn.lock b/yarn.lock index 55feb526ac..2c844bb08a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6052,7 +6052,7 @@ __metadata: "@types/react-dom": 18.2.4 "@voiceflow/exception": 1.4.0 "@voiceflow/fetch": 1.5.2 - "@voiceflow/react-chat-legacy": "workspace:*" + "@voiceflow/react-chat": "workspace:*" "@voiceflow/slate-serializer": 1.4.2 nanoevents: 8.0.0 react: 18.2.0 @@ -6194,9 +6194,9 @@ __metadata: languageName: node linkType: hard -"@voiceflow/react-chat-legacy@workspace:*, @voiceflow/react-chat-legacy@workspace:packages/react-chat": +"@voiceflow/react-chat@workspace:*, @voiceflow/react-chat@workspace:packages/react-chat": version: 0.0.0-use.local - resolution: "@voiceflow/react-chat-legacy@workspace:packages/react-chat" + resolution: "@voiceflow/react-chat@workspace:packages/react-chat" dependencies: "@babel/core": 7.18.10 "@babel/preset-env": 7.24.1

    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 M000000RR910ABRkJpcdz diff --git a/packages/chat/.storybook/assets/fonts/ABCMaxiRound-Light.woff2 b/packages/chat/.storybook/assets/fonts/ABCMaxiRound-Light.woff2 deleted file mode 100644 index cbda6b13da04efc5a7a97a4fa7510c30fd10b6c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46284 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 DA8R;T diff --git a/packages/chat/.storybook/assets/fonts/UCityProWeb-Bold.woff2 b/packages/chat/.storybook/assets/fonts/UCityProWeb-Bold.woff2 deleted file mode 100644 index a6bc5d124759b20d804a5b75d37ed25b0d8dcd8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40752 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