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 718d6fea48..0000000000 Binary files a/apps/documentation/public/favicon.ico and /dev/null differ diff --git a/apps/documentation/public/fonts/UCityProWeb-Bold.woff b/apps/documentation/public/fonts/UCityProWeb-Bold.woff deleted file mode 100644 index 14bb018650..0000000000 Binary files a/apps/documentation/public/fonts/UCityProWeb-Bold.woff and /dev/null differ diff --git a/apps/documentation/public/fonts/UCityProWeb-Bold.woff2 b/apps/documentation/public/fonts/UCityProWeb-Bold.woff2 deleted file mode 100644 index a6bc5d1247..0000000000 Binary files a/apps/documentation/public/fonts/UCityProWeb-Bold.woff2 and /dev/null differ diff --git a/apps/documentation/public/fonts/UCityProWeb-Regular.woff b/apps/documentation/public/fonts/UCityProWeb-Regular.woff deleted file mode 100644 index 88f2a66c5a..0000000000 Binary files a/apps/documentation/public/fonts/UCityProWeb-Regular.woff and /dev/null differ diff --git a/apps/documentation/public/fonts/UCityProWeb-Regular.woff2 b/apps/documentation/public/fonts/UCityProWeb-Regular.woff2 deleted file mode 100644 index 43f69dd5b7..0000000000 Binary files a/apps/documentation/public/fonts/UCityProWeb-Regular.woff2 and /dev/null differ diff --git a/apps/documentation/public/fonts/UCityProWeb-Semibold.woff b/apps/documentation/public/fonts/UCityProWeb-Semibold.woff deleted file mode 100644 index 140ecb7ff0..0000000000 Binary files a/apps/documentation/public/fonts/UCityProWeb-Semibold.woff and /dev/null differ diff --git a/apps/documentation/public/fonts/UCityProWeb-Semibold.woff2 b/apps/documentation/public/fonts/UCityProWeb-Semibold.woff2 deleted file mode 100644 index 5da6b5df93..0000000000 Binary files a/apps/documentation/public/fonts/UCityProWeb-Semibold.woff2 and /dev/null differ 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 2384891e15..0000000000 Binary files a/packages/chat/.storybook/assets/fonts/ABCMaxiRound-Light.woff and /dev/null differ 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 cbda6b13da..0000000000 Binary files a/packages/chat/.storybook/assets/fonts/ABCMaxiRound-Light.woff2 and /dev/null differ diff --git a/packages/chat/.storybook/assets/fonts/UCityProWeb-Bold.woff b/packages/chat/.storybook/assets/fonts/UCityProWeb-Bold.woff deleted file mode 100644 index 14bb018650..0000000000 Binary files a/packages/chat/.storybook/assets/fonts/UCityProWeb-Bold.woff and /dev/null differ 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 a6bc5d1247..0000000000 Binary files a/packages/chat/.storybook/assets/fonts/UCityProWeb-Bold.woff2 and /dev/null differ 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 88f2a66c5a..0000000000 Binary files a/packages/chat/.storybook/assets/fonts/UCityProWeb-Regular.woff and /dev/null differ 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 43f69dd5b7..0000000000 Binary files a/packages/chat/.storybook/assets/fonts/UCityProWeb-Regular.woff2 and /dev/null differ diff --git a/packages/chat/.storybook/assets/fonts/UCityProWeb-Semibold.woff b/packages/chat/.storybook/assets/fonts/UCityProWeb-Semibold.woff deleted file mode 100644 index 140ecb7ff0..0000000000 Binary files a/packages/chat/.storybook/assets/fonts/UCityProWeb-Semibold.woff and /dev/null differ diff --git a/packages/chat/.storybook/assets/fonts/UCityProWeb-Semibold.woff2 b/packages/chat/.storybook/assets/fonts/UCityProWeb-Semibold.woff2 deleted file mode 100644 index 5da6b5df93..0000000000 Binary files a/packages/chat/.storybook/assets/fonts/UCityProWeb-Semibold.woff2 and /dev/null differ 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 617fd6538c..0000000000 Binary files a/packages/chat/src/__fixtures__/default-launcher-image.png and /dev/null differ diff --git a/packages/chat/src/__fixtures__/empty-image.png b/packages/chat/src/__fixtures__/empty-image.png deleted file mode 100644 index af27d4fe57..0000000000 Binary files a/packages/chat/src/__fixtures__/empty-image.png and /dev/null differ 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 d643f272e2..0000000000 Binary files a/packages/chat/src/__fixtures__/tiled-bg.png and /dev/null differ diff --git a/packages/chat/src/assets/blank-image.png b/packages/chat/src/assets/blank-image.png deleted file mode 100644 index bade0cbac1..0000000000 Binary files a/packages/chat/src/assets/blank-image.png and /dev/null differ diff --git a/packages/chat/src/assets/message.png b/packages/chat/src/assets/message.png deleted file mode 100644 index b9d2eb42bc..0000000000 Binary files a/packages/chat/src/assets/message.png and /dev/null differ diff --git a/packages/chat/src/assets/svg/ai.svg b/packages/chat/src/assets/svg/ai.svg deleted file mode 100644 index 1e1dfabb4b..0000000000 --- a/packages/chat/src/assets/svg/ai.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - 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 2c3c7a1c0d..0000000000 Binary files a/packages/chat/src/assets/vf_chat.png and /dev/null differ diff --git a/packages/chat/src/assets/vf_logo.png b/packages/chat/src/assets/vf_logo.png deleted file mode 100644 index 9273a59602..0000000000 Binary files a/packages/chat/src/assets/vf_logo.png and /dev/null differ 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 &&
    } - - {showExtraText &&
    {extraLinkText}
    } - - {showExtraLink && ( - - {extraLinkText} - - )} -
    - ); -}; 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..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", @@ -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..2c844bb08a 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" @@ -5777,56 +4750,11 @@ __metadata: 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 - languageName: node - linkType: hard - -"@tanstack/react-virtual@npm:^3.8.1": - version: 3.10.8 - resolution: "@tanstack/react-virtual@npm:3.10.8" - dependencies: - "@tanstack/virtual-core": 3.10.8 - 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/hast-util-to-babel-ast": 8.0.0 + svg-parser: ^2.0.4 + peerDependencies: + "@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" @@ -7365,27 +6046,6 @@ __metadata: "@voiceflow-example/live-agent@workspace:examples/live-agent": version: 0.0.0-use.local resolution: "@voiceflow-example/live-agent@workspace:examples/live-agent" - 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-legacy": "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 - styled-components: 6.0.3 - ts-pattern: 4.3.0 - vite: 4.3.9 - 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 @@ -7398,7 +6058,6 @@ __metadata: 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 @@ -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" @@ -7544,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 @@ -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" @@ -8666,17 +7202,6 @@ __metadata: languageName: node linkType: hard -"better-react-mathjax@npm:^2.0.3": - version: 2.0.3 - resolution: "better-react-mathjax@npm:2.0.3" - dependencies: - mathjax-full: ^3.2.2 - peerDependencies: - react: ">=16.8" - checksum: 35e525fecfde2f8ed2787ddebe4d67ded8de89a7afb648a87f0247b1c42bff5d0d962849aee602af8f471ff7c241fe8d60c79c3d8cbc0f2d6d63ddad1c8c4feb - languageName: node - linkType: hard - "big-integer@npm:^1.6.44": version: 1.6.52 resolution: "big-integer@npm:1.6.52" @@ -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" @@ -8984,15 +7493,8 @@ __metadata: "caniuse-lite@npm:^1.0.30001370": version: 1.0.30001377 - resolution: "caniuse-lite@npm:1.0.30001377" - checksum: bd42fa4255f30df914bcef846412c2710e032dfd43f5861753befbd45244574a8c281147247a57c11b19684c8516e3ef731b45bc12b1adfdad13b62f548b23fb - languageName: node - linkType: hard - -"caniuse-lite@npm:^1.0.30001579": - version: 1.0.30001664 - resolution: "caniuse-lite@npm:1.0.30001664" - checksum: cee25b4ea8a84779b7c9a60c1f9e304f6d99b79ef622b25fbc7873b4e55e8722a1091dd6c8b77bd7723e9f26a84b4a820a50a864989dd477e7ee51dc30461dca + resolution: "caniuse-lite@npm:1.0.30001377" + checksum: bd42fa4255f30df914bcef846412c2710e032dfd43f5861753befbd45244574a8c281147247a57c11b19684c8516e3ef731b45bc12b1adfdad13b62f548b23fb languageName: node linkType: hard @@ -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" @@ -10546,31 +8520,19 @@ __metadata: resolution: "debug@npm:3.2.7" dependencies: ms: ^2.1.1 - checksum: b3d8c5940799914d30314b7c3304a43305fd0715581a919dacb8b3176d024a782062368405b47491516d2091d6462d4d11f2f4974a405048094f8bfebfa3071c - languageName: node - linkType: hard - -"debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2": - version: 4.3.2 - resolution: "debug@npm:4.3.2" - dependencies: - ms: 2.1.2 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 820ea160e267e23c953c9ed87e7ad93494d8cda2f7349af5e7e3bb236d23707ee3022f477d5a7d2ee86ef2bf7d60aa9ab22d1f58080d7deb9dccd073585e1e43 + checksum: b3d8c5940799914d30314b7c3304a43305fd0715581a919dacb8b3176d024a782062368405b47491516d2091d6462d4d11f2f4974a405048094f8bfebfa3071c languageName: node linkType: hard -"debug@npm:^4.3.6": - version: 4.3.7 - resolution: "debug@npm:4.3.7" +"debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2": + version: 4.3.2 + resolution: "debug@npm:4.3.2" dependencies: - ms: ^2.1.3 + ms: 2.1.2 peerDependenciesMeta: supports-color: optional: true - checksum: 822d74e209cd910ef0802d261b150314bbcf36c582ccdbb3e70f0894823c17e49a50d3e66d96b633524263975ca16b6a833f3e3b7e030c157169a5fabac63160 + checksum: 820ea160e267e23c953c9ed87e7ad93494d8cda2f7349af5e7e3bb236d23707ee3022f477d5a7d2ee86ef2bf7d60aa9ab22d1f58080d7deb9dccd073585e1e43 languageName: node linkType: hard @@ -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