Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Integrated chatbot component #282

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions chainforge/react-server/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ import {
import { v4 as uuid } from "uuid";
import LZString from "lz-string";
import { EXAMPLEFLOW_1 } from "./example_flows";
import Chatbot from "./Chatbot";

// Styling
import "reactflow/dist/style.css"; // reactflow
Expand Down Expand Up @@ -1240,6 +1241,7 @@ const App = () => {
Send us feedback
</a>
</div>
<Chatbot />
</div>
);
};
Expand Down
254 changes: 254 additions & 0 deletions chainforge/react-server/src/Chatbot.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,254 @@
/* Import Google font - Poppins */
@import url("https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600&display=swap");

* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: "Poppins", sans-serif;
}
body {
background: #e3f2fd;
}
.chatbot-toggler {
position: fixed;
bottom: 30px;
right: 35px;
outline: none;
border: none;
height: 50px;
width: 50px;
display: flex;
cursor: pointer;
align-items: center;
justify-content: center;
border-radius: 50%;
background: #7bb3ff;
transition: all 0.2s ease;
}
.show-chatbot .chatbot-toggler {
transform: rotate(90deg);
}
.chatbot-toggler span {
color: #fff;
position: absolute;
}
.chatbot-toggler span:last-child,
.show-chatbot .chatbot-toggler span:first-child {
opacity: 0;
}
.show-chatbot .chatbot-toggler span:last-child {
opacity: 1;
}
.chatbot {
position: fixed;
right: 35px;
bottom: 90px;
width: 420px;
background: #fff;
border-radius: 15px;
overflow: hidden;
opacity: 0;
pointer-events: none;
transform: scale(0.5);
transform-origin: bottom right;
box-shadow:
0 0 128px 0 rgba(0, 0, 0, 0.1),
0 32px 64px -48px rgba(0, 0, 0, 0.5);
transition: all 0.1s ease;
}
.show-chatbot .chatbot {
opacity: 1;
pointer-events: auto;
transform: scale(1);
}
.chatbot header {
padding: 16px 0;
position: relative;
text-align: center;
color: #fff;
background: #7bb3ff;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}
.chatbot header span {
position: absolute;
right: 15px;
top: 50%;
display: none;
cursor: pointer;
transform: translateY(-50%);
}
header h2 {
font-size: 1.4rem;
}
.chatbot .chatbox {
overflow-y: auto;
height: 510px;
padding: 30px 20px 100px;
}
.chatbot :where(.chatbox, textarea)::-webkit-scrollbar {
width: 6px;
}
.chatbot :where(.chatbox, textarea)::-webkit-scrollbar-track {
background: #fff;
border-radius: 25px;
}
.chatbot :where(.chatbox, textarea)::-webkit-scrollbar-thumb {
background: #ccc;
border-radius: 25px;
}
.chatbox .chat {
display: flex;
list-style: none;
}
.chatbox .outgoing {
margin: 20px 0;
justify-content: flex-end;
}
.chatbox .incoming span {
width: 32px;
height: 32px;
color: #fff;
cursor: default;
text-align: center;
line-height: 32px;
align-self: flex-end;
background: #7bb3ff;
border-radius: 4px;
margin: 0 10px 7px 0;
}
.chatbox .chat.incoming span {
display: inline-block; /* Ensure the icon is displayed for incoming messages */
}
.chatbox .chat.outgoing span {
display: none; /* Hide the icon for outgoing messages */
}
.chatbox .chat p {
white-space: pre-wrap;
padding: 12px 16px;
border-radius: 10px 10px 0 10px;
max-width: 75%;
color: #fff;
font-size: 0.95rem;
background: #7bb3ff;
}
.chatbox .incoming p {
border-radius: 10px 10px 10px 0;
}
.chatbox .chat p.error {
color: #721c24;
background: #f8d7da;
}
.chatbox .incoming p {
color: #000;
background: #f2f2f2;
}
.chatbot .chat-input {
display: flex;
gap: 5px;
position: absolute;
bottom: 0;
width: 100%;
background: #fff;
padding: 3px 20px;
border-top: 1px solid #ddd;
}
.chat-input textarea {
height: 55px;
width: 100%;
border: none;
outline: none;
resize: none;
max-height: 180px;
padding: 15px 15px 15px 0;
font-size: 0.95rem;
}
.chat-input span {
align-self: flex-end;
color: #7bb3ff;
cursor: pointer;
height: 55px;
display: flex;
align-items: center;
visibility: hidden;
font-size: 1.35rem;
}
.chat-input textarea:valid ~ span {
visibility: visible;
}

@media (max-width: 490px) {
.chatbot-toggler {
right: 20px;
bottom: 20px;
}
.chatbot {
right: 0;
bottom: 0;
height: 100%;
border-radius: 0;
width: 100%;
}
.chatbot .chatbox {
height: 90%;
padding: 25px 15px 100px;
}
.chatbot .chat-input {
padding: 5px 15px;
}
.chatbot header span {
display: block;
}
}

/* loading animation */
@keyframes dots {
0%,
20% {
color: rgba(0, 0, 0, 0);
text-shadow:
0.25em 0 0 rgba(0, 0, 0, 0),
0.5em 0 0 rgba(0, 0, 0, 0);
}
40% {
color: #000;
text-shadow:
0.25em 0 0 rgba(0, 0, 0, 0),
0.5em 0 0 rgba(0, 0, 0, 0);
}
60% {
text-shadow:
0.25em 0 0 #000,
0.5em 0 0 rgba(0, 0, 0, 0);
}
80%,
100% {
text-shadow:
0.25em 0 0 #000,
0.5em 0 0 #000;
}
}

.chatbox .incoming.loading p::after {
content: "...";
animation: dots 1s steps(5, end) infinite;
display: inline-block;
font-size: 30px; /* Increase font size for larger dots */
}

.chatbox .incoming.loading p {
display: flex;
align-items: center;
justify-content: left;
height: 0.5%;
width: 70px;
font-size: 24px;
}

.chatbox .chat.incoming span {
display: inline-block; /* Ensure the icon is displayed for incoming messages */
}

.chatbox .chat.outgoing span {
display: none; /* Hide the icon for outgoing messages */
}
Loading