chatnest
Version:
A lightweight, customizable, and responsive chat widget for modern web applications.
467 lines (396 loc) • 10.3 kB
CSS
/* Base Variables */
:root {
--chat-primary-color: #0084ff;
--chat-secondary-color: #f0f2f5;
--chat-font-size: 14px;
--chat-width: 400px;
--chat-height: 600px;
--chat-toggle-size: 60px;
--chat-border-radius: 16px;
--chat-shadow: 0 5px 40px rgba(0,0,0,0.16);
}
/* Base Chat Widget */
.chat-widget {
position: fixed;
z-index: 1000;
}
/* Chat Toggle Button */
.chat-toggle {
position: fixed;
bottom: 20px;
right: 20px;
width: var(--chat-toggle-size);
height: var(--chat-toggle-size);
border-radius: 50%;
background: var(--chat-primary-color);
box-shadow: 0 2px 12px rgba(0,0,0,0.15);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: transform 0.3s ease;
z-index: 1000;
}
.chat-widget.left .chat-toggle {
left: 20px;
right: auto;
}
.chat-toggle:hover {
transform: scale(1.1);
}
.chat-toggle img {
width: calc(var(--chat-toggle-size) * 0.5);
height: calc(var(--chat-toggle-size) * 0.5);
}
/* Toggle Button Animations */
.chat-toggle.animation-1 {
animation: pulseAnimation 2s infinite;
}
.chat-toggle.animation-2 {
animation: bounceAnimation 2s infinite;
}
.chat-toggle.animation-3 {
animation: shakeAnimation 3s infinite;
}
.chat-toggle.animation-4 {
animation: infinityAnimation 3s infinite;
}
.chat-toggle.animation-5 {
animation: rotateAnimation 4s infinite linear;
}
/* Keyframe Animations */
@keyframes pulseAnimation {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.15); }
}
@keyframes bounceAnimation {
0%, 20%, 50%, 80%, 100% { transform: translateY(0); }
40% { transform: translateY(-10px); }
60% { transform: translateY(-5px); }
}
@keyframes shakeAnimation {
0%, 100% { transform: translateX(0); }
10%, 30%, 50%, 70%, 90% { transform: translateX(-5px); }
20%, 40%, 60%, 80% { transform: translateX(5px); }
}
@keyframes infinityAnimation {
0%, 100% { transform: scale(1); }
25% { transform: scale(1.2); }
50% { transform: scale(1); }
75% { transform: scale(1.2); }
}
@keyframes rotateAnimation {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
/* Chat Window */
.chat-window {
position: fixed;
bottom: 100px;
right: 20px;
width: var(--chat-width);
height: var(--chat-height);
background: white;
border-radius: var(--chat-border-radius);
box-shadow: var(--chat-shadow);
display: none;
flex-direction: column;
overflow: hidden;
transition: transform 0.3s ease, opacity 0.3s ease;
transform: translateY(20px);
opacity: 0;
z-index: 999;
max-width: calc(100vw - 40px);
max-height: calc(100vh - 120px);
}
.chat-widget.left .chat-window {
left: 20px;
right: auto;
}
.chat-window.active {
display: flex;
transform: translateY(0);
opacity: 1;
}
/* Dark Theme */
.chat-widget.dark {
--chat-bg-color: #1a1a1a;
--chat-text-color: #ffffff;
--chat-message-bg: #2d2d2d;
--chat-bot-message-bg: #383838;
--chat-input-bg: #2d2d2d;
--chat-input-border: #404040;
}
.chat-widget.dark .chat-window {
background: var(--chat-bg-color);
color: var(--chat-text-color);
}
.chat-widget.dark .message {
background: var(--chat-message-bg);
color: var(--chat-text-color);
}
.chat-widget.dark .bot-message {
background: var(--chat-bot-message-bg);
}
.chat-widget.dark .chat-input input {
background: var(--chat-input-bg);
color: var(--chat-text-color);
border-color: var(--chat-input-border);
}
/* Responsive Design */
/* Mobile Portrait */
@media screen and (max-width: 480px) {
:root {
--chat-toggle-size: 50px;
}
.chat-window {
bottom: 0;
right: 0;
left: 0;
width: 100%;
height: 100vh;
border-radius: 0;
max-height: calc(100vh - env(safe-area-inset-bottom));
}
.chat-toggle {
bottom: 10px;
right: 10px;
}
.chat-header {
padding: 0.8rem;
}
.chat-messages {
padding: 0.8rem;
}
.chat-input-container {
padding: 0.8rem;
padding-bottom: max(0.8rem, env(safe-area-inset-bottom));
}
.message {
max-width: 85%;
padding: 0.7rem;
}
.suggestion-chips {
padding: 0.5rem 0;
}
.chip {
padding: 0.4rem 0.8rem;
font-size: 0.9rem;
}
}
/* Mobile Landscape */
@media screen and (max-height: 500px) and (orientation: landscape) {
.chat-window {
height: 100vh;
max-height: calc(100vh - 20px);
}
.chat-messages {
flex: 1;
max-height: calc(100vh - 180px);
}
.suggestion-chips {
padding: 0.3rem 0;
}
.chip {
padding: 0.3rem 0.6rem;
}
.chat-input-container {
padding: 0.5rem;
}
}
/* Tablet Portrait */
@media screen and (min-width: 481px) and (max-width: 768px) {
.chat-window {
width: 380px;
height: 520px;
bottom: 80px;
right: 10px;
}
.chat-toggle {
bottom: 15px;
right: 15px;
}
}
/* Tablet Landscape */
@media screen and (min-width: 769px) and (max-width: 1024px) {
.chat-window {
width: 420px;
height: 580px;
}
}
/* Large Desktop */
@media screen and (min-width: 1025px) {
.chat-window {
width: 450px;
height: 600px;
}
}
/* Safe Area Insets */
@supports (padding: max(0px)) {
.chat-window {
padding-bottom: max(0px, env(safe-area-inset-bottom));
/* padding-right: max(0px, env(safe-area-inset-right));
padding-left: max(0px, env(safe-area-inset-left)); */
}
.chat-input-container {
padding-bottom: max(1rem, env(safe-area-inset-bottom));
}
}
/* High Contrast Mode */
@media (prefers-contrast: high) {
.chat-widget {
--chat-primary-color: #000000;
--chat-secondary-color: #ffffff;
}
.message {
border: 2px solid #000000;
}
}
/* Reduced Motion */
@media (prefers-reduced-motion: reduce) {
.chat-toggle,
.chat-window {
transition: none;
}
}
/* Print Styles */
@media print {
.chat-widget {
display: none;
}
}
.chat-widget-window {
position: fixed;
bottom: 100px;
right: 20px;
width: var(--chat-width);
height: var(--chat-height);
background: white;
border-radius: var(--chat-border-radius);
box-shadow: var(--chat-shadow);
display: none;
flex-direction: column;
overflow: hidden;
transition: transform 0.3s ease, opacity 0.3s ease;
transform: translateY(20px);
opacity: 0;
z-index: 999999;
max-width: calc(100vw - 40px);
max-height: calc(100vh - 120px);
}
.chat-widget.left .chat-widget-window {
left: 20px;
right: auto;
}
.chat-widget-window.active {
display: flex;
transform: translateY(0);
opacity: 1;
}
/* Dark Theme */
.chat-widget.dark .chat-widget-window {
background: var(--chat-bg-color);
color: var(--chat-text-color);
}
.chat-widget.dark .chat-widget-window .message {
background: var(--chat-message-bg);
color: var(--chat-text-color);
}
.chat-widget.dark .chat-widget-window .bot-message {
background: var(--chat-bot-message-bg);
}
.chat-widget.dark .chat-widget-window .chat-input input {
background: var(--chat-input-bg);
color: var(--chat-text-color);
border-color: var(--chat-input-border);
}
/* Mobile view styles */
@media screen and (max-width: 768px) {
.chat-widget-window {
position: fixed;
top: 0 ;
left: 0 ;
right: 0 ;
bottom: 0 ;
width: 100% ;
height: 100% ;
max-height: 100vh ;
margin: 0 ;
border-radius: 0 ;
transform: translateY(100%);
transition: transform 0.3s ease-in-out;
}
.chat-widget-window.active {
transform: translateY(0);
}
.chat-widget-header {
position: sticky;
top: 0;
background: var(--chat-primary-color);
z-index: 999999;
}
.chat-widget-messages {
height: calc(100vh - 120px);
max-height: none ;
}
.chat-widget-input-container {
position: sticky;
bottom: 0;
background: #fff;
z-index: 999999;
}
}
/* Optional: Add safe area insets for modern mobile browsers */
@supports (padding: max(0px)) {
@media screen and (max-width: 768px) {
.chat-widget-window {
padding-top: max(0px, env(safe-area-inset-top));
padding-bottom: max(0px, env(safe-area-inset-bottom));
}
.chat-widget-messages {
height: calc(100vh - 120px - env(safe-area-inset-top) - env(safe-area-inset-bottom));
}
}
}
/* Base styles for chat messages */
.chat-widget-message {
padding: 10px 15px;
margin: 5px 10px;
border-radius: 15px;
max-width: 80%;
word-wrap: break-word;
}
/* User message specific styles */
.chat-widget-message.user-message {
background-color: var(--chat-primary-color);
color: white;
margin-left: auto;
font-size: var(--chat-font-size, 14px); /* Use CSS variable for font size */
}
/* AI message specific styles */
.chat-widget-message.ai-message {
background-color: #f0f0f0;
color: #333;
margin-right: auto;
font-size: var(--chat-font-size, 14px); /* Use CSS variable for font size */
}
/* Keep other elements' font sizes constant */
.chat-widget-header {
font-size: 16px; /* Fixed size */
}
.chat-widget-header .close-chat {
font-size: 20px; /* Fixed size */
}
.chat-widget-input {
font-size: 14px; /* Fixed size */
}
.chat-widget-send-button {
font-size: 14px; /* Fixed size */
}
.chat-widget-toggle {
font-size: 14px; /* Fixed size */
}
/* Timestamp and other metadata if any */
.chat-widget-message-timestamp {
font-size: 12px; /* Fixed size */
}