@airsurfer09/web-handsfree
Version:
A React package for integrating Convai's AI-powered voice assistants with LiveKit for real-time audio/video conversations
640 lines (613 loc) • 21 kB
JavaScript
import styled from "styled-components";
import { motion } from "framer-motion";
import { aeroTheme } from "./theme";
// Styled Components matching the original webChat exactly
export const ConvaiContainer = styled(motion.div) `
position: fixed !important;
bottom: 2rem !important;
right: 2rem !important;
z-index: 1000 !important;
isolation: isolate;
contain: layout style paint;
/* Override any inherited text styles */
* {
font-family: ${aeroTheme.typography.fontFamily.body} !important;
color-scheme: light !important;
font-synthesis: none !important;
text-rendering: optimizeLegibility !important;
-webkit-font-smoothing: antialiased !important;
-moz-osx-font-smoothing: grayscale !important;
-webkit-text-size-adjust: 100% !important;
}
`;
export const MorphingContainer = styled(motion.div) `
position: relative !important;
background: ${(props) => {
const opacity = props.$backgroundOpacity ?? 0.95;
// Extract RGB from the theme backdrop color and apply custom opacity
return `rgba(255, 255, 255, ${opacity})`;
}} !important;
backdrop-filter: blur(20px) !important;
border: 1px solid rgba(255, 255, 255, 0.3) !important;
display: flex !important;
flex-direction: column !important;
overflow: visible !important;
isolation: isolate;
contain: layout style paint;
`;
export const ButtonContent = styled(motion.div) `
width: 100% !important;
height: 100% !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
position: absolute !important;
top: 0 !important;
left: 0 !important;
isolation: isolate;
contain: layout style paint;
`;
export const Logo = styled(motion.div) `
width: 2rem !important;
height: 2rem !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
color: ${aeroTheme.colors.primary[500]} !important;
isolation: isolate;
contain: layout style paint;
`;
export const ChatContent = styled(motion.div) `
width: 100% !important;
height: 100% !important;
display: flex !important;
flex-direction: column !important;
position: absolute !important;
top: 0 !important;
left: 0 !important;
overflow: visible !important;
isolation: isolate;
contain: layout style paint;
`;
export const Header = styled(motion.div) `
padding: ${aeroTheme.spacing.md} !important;
border-bottom: ${aeroTheme.colors.glass.borderLight} !important;
display: flex !important;
align-items: center !important;
justify-content: space-between !important;
background: ${aeroTheme.colors.glass.light} !important;
backdrop-filter: ${aeroTheme.colors.glass.backdropLight} !important;
position: relative !important;
z-index: 10 !important;
isolation: isolate;
contain: layout style paint;
`;
export const Title = styled.h3 `
margin: 0 !important;
font-size: ${aeroTheme.typography.fontSize.lg} !important;
font-weight: ${aeroTheme.typography.fontWeight.semibold} !important;
font-family: ${aeroTheme.typography.fontFamily.body} !important;
color: ${aeroTheme.colors.text.primary} !important;
text-align: center !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
gap: 0.5rem !important;
flex: 1 !important;
font-synthesis: none !important;
text-rendering: optimizeLegibility !important;
-webkit-font-smoothing: antialiased !important;
-moz-osx-font-smoothing: grayscale !important;
-webkit-text-size-adjust: 100% !important;
isolation: isolate;
contain: layout style paint;
`;
export const HeaderLogo = styled.div `
display: flex !important;
align-items: center !important;
justify-content: center !important;
isolation: isolate;
contain: layout style paint;
`;
export const CloseButton = styled(motion.button) `
background: rgba(255, 255, 255, 0.95) !important;
backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.3) !important;
border-radius: 50% !important;
width: 2rem;
height: 2rem;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer !important;
color: ${aeroTheme.colors.text.primary} !important;
transition: ${aeroTheme.transitions.normal};
z-index: 1;
box-shadow: 0 1px 6px rgba(0, 0, 0, 0.08);
outline: none !important;
padding: 0 !important;
font-size: inherit !important;
font-weight: inherit !important;
font-family: inherit !important;
&:hover {
background: rgba(255, 255, 255, 1) !important;
color: ${aeroTheme.colors.text.primary} !important;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.12);
border-color: rgba(255, 255, 255, 0.3) !important;
}
&:focus {
outline: none !important;
}
&:focus-visible {
outline: none !important;
}
`;
export const SettingsButton = styled(motion.button) `
background: rgba(255, 255, 255, 0.95) !important;
backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.3) !important;
border-radius: 50% !important;
width: 2rem;
height: 2rem;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer !important;
color: ${aeroTheme.colors.text.primary} !important;
transition: ${aeroTheme.transitions.normal};
z-index: 1;
box-shadow: 0 1px 6px rgba(0, 0, 0, 0.08);
outline: none !important;
padding: 0 !important;
font-size: inherit !important;
font-weight: inherit !important;
font-family: inherit !important;
&:hover {
background: rgba(255, 255, 255, 1) !important;
color: ${aeroTheme.colors.text.primary} !important;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.12);
border-color: rgba(255, 255, 255, 0.3) !important;
}
&:focus {
outline: none !important;
}
&:focus-visible {
outline: none !important;
}
`;
export const SettingsTray = styled(motion.div) `
background: rgba(255, 255, 255, 0.98) !important;
backdrop-filter: blur(20px) !important;
border: 1px solid rgba(255, 255, 255, 0.3) !important;
border-radius: ${aeroTheme.borderRadius.lg} !important;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15) !important;
padding: 0 !important;
min-width: 0 !important;
isolation: isolate;
contain: layout style paint;
`;
export const SettingsOption = styled(motion.button) `
padding: ${aeroTheme.spacing.sm} ${aeroTheme.spacing.md};
background: transparent;
border: none !important;
border-radius: ${aeroTheme.borderRadius.md} !important;
color: ${aeroTheme.colors.text.primary};
font-family: ${aeroTheme.typography.fontFamily.body} !important;
font-size: ${aeroTheme.typography.sizes.sm} !important;
font-weight: inherit !important;
cursor: pointer !important;
transition: ${aeroTheme.transitions.normal};
display: flex;
align-items: center;
justify-content: center;
gap: ${aeroTheme.spacing.sm};
outline: none !important;
flex: 1;
min-width: 2.5rem;
&:hover {
background: rgba(0, 0, 0, 0.05);
border-color: transparent !important;
}
&:active {
background: rgba(0, 0, 0, 0.1);
}
&:focus {
outline: none !important;
}
&:focus-visible {
outline: none !important;
}
`;
export const Content = styled(motion.div) `
flex: 1 !important;
padding: ${aeroTheme.spacing.md} !important;
display: flex !important;
flex-direction: column !important;
justify-content: space-between !important;
min-height: 0 !important;
z-index: 1 !important;
overflow: hidden !important;
isolation: isolate;
contain: layout style paint;
`;
export const Footer = styled(motion.div) `
padding: ${aeroTheme.spacing.md} !important;
border-top: ${aeroTheme.colors.glass.borderLight} !important;
background: ${aeroTheme.colors.glass.light} !important;
backdrop-filter: ${aeroTheme.colors.glass.backdropLight} !important;
position: relative !important;
isolation: isolate;
contain: layout style paint;
`;
export const InputContainer = styled(motion.div) `
display: flex !important;
align-items: center !important;
gap: ${aeroTheme.spacing.sm} !important;
background: rgba(255, 255, 255, 0.95) !important;
backdrop-filter: blur(20px) !important;
border: 1px solid rgba(255, 255, 255, 0.3) !important;
border-radius: ${aeroTheme.borderRadius.full} !important;
min-height: 3rem !important;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08) !important;
isolation: isolate;
contain: layout style paint;
`;
export const Input = styled.input `
flex: 1 !important;
background: transparent !important;
border: none !important;
outline: none !important;
color: ${aeroTheme.colors.text.primary} !important;
font-size: ${aeroTheme.typography.fontSize.sm} !important;
font-family: ${aeroTheme.typography.fontFamily.body} !important;
border-radius: ${aeroTheme.borderRadius.full} !important;
padding: 0.5rem 0.75rem !important;
line-height: 1.5 !important;
min-height: 2.25rem !important;
font-synthesis: none !important;
text-rendering: optimizeLegibility !important;
-webkit-font-smoothing: antialiased !important;
-moz-osx-font-smoothing: grayscale !important;
-webkit-text-size-adjust: 100% !important;
isolation: isolate;
contain: layout style paint;
&::placeholder {
color: ${aeroTheme.colors.text.tertiary} !important;
font-family: ${aeroTheme.typography.fontFamily.body} !important;
font-size: ${aeroTheme.typography.fontSize.sm} !important;
}
&:focus {
outline: none !important;
border: none !important;
}
`;
export const ActionButton = styled(motion.button) `
width: 2.25rem !important;
height: 2.25rem !important;
min-width: 2.25rem !important;
min-height: 2.25rem !important;
flex-shrink: 0 !important;
border-radius: 50% !important;
border: none !important;
background: ${(props) => props.$active
? aeroTheme.colors.convai.light
: aeroTheme.colors.text.primary};
color: ${(props) => props.$active ? aeroTheme.colors.text.inverse : "white"};
display: flex !important;
align-items: center !important;
justify-content: center !important;
cursor: pointer !important;
transition: ${aeroTheme.transitions.normal} !important;
outline: none !important;
padding: 0 !important;
font-size: inherit !important;
font-weight: inherit !important;
font-family: inherit !important;
isolation: isolate;
contain: layout style paint;
&:hover {
transform: scale(1.05);
background: ${aeroTheme.colors.neutral[800]} !important;
border-color: transparent !important;
}
&:active {
transform: scale(0.95);
}
&:focus {
outline: none !important;
}
&:focus-visible {
outline: none !important;
}
`;
export const MessageList = styled.div `
flex: 1 !important;
overflow-y: auto !important;
padding: ${aeroTheme.spacing.md} !important;
display: flex !important;
flex-direction: column !important;
gap: ${aeroTheme.spacing.sm} !important;
isolation: isolate;
contain: layout style paint;
`;
export const Message = styled.div `
display: flex !important;
flex-direction: ${(props) => props.isUser ? "row-reverse" : "row"} !important;
align-items: flex-start !important;
gap: ${aeroTheme.spacing.sm} !important;
margin-bottom: ${aeroTheme.spacing.sm} !important;
isolation: isolate;
contain: layout style paint;
`;
export const MessageBubble = styled.div `
max-width: 70% !important;
padding: ${aeroTheme.spacing.sm} ${aeroTheme.spacing.md} !important;
background: ${(props) => props.isUser
? aeroTheme.colors.primary[500]
: "rgba(255, 255, 255, 0.9)"} !important;
color: ${(props) => props.isUser ? "white" : aeroTheme.colors.text.primary} !important;
border-radius: ${aeroTheme.borderRadius.lg} !important;
font-size: ${aeroTheme.typography.fontSize.sm} !important;
font-family: ${aeroTheme.typography.fontFamily.body} !important;
line-height: 1.4 !important;
word-wrap: break-word !important;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1) !important;
font-synthesis: none !important;
text-rendering: optimizeLegibility !important;
-webkit-font-smoothing: antialiased !important;
-moz-osx-font-smoothing: grayscale !important;
-webkit-text-size-adjust: 100% !important;
isolation: isolate;
contain: layout style paint;
`;
export const MessageTime = styled.div `
font-size: ${aeroTheme.typography.fontSize.xs} !important;
font-family: ${aeroTheme.typography.fontFamily.body} !important;
color: ${aeroTheme.colors.text.secondary} !important;
margin-top: ${aeroTheme.spacing.xs} !important;
text-align: ${(props) => (props.isUser ? "right" : "left")} !important;
font-synthesis: none !important;
text-rendering: optimizeLegibility !important;
-webkit-font-smoothing: antialiased !important;
-moz-osx-font-smoothing: grayscale !important;
-webkit-text-size-adjust: 100% !important;
isolation: isolate;
contain: layout style paint;
`;
export const ButtonContainer = styled(motion.button) `
position: fixed !important;
bottom: 2rem !important;
right: 2rem !important;
width: 4rem !important;
height: 4rem !important;
border: none !important;
border-radius: 50% !important;
background: ${aeroTheme.colors.glass.backdrop} !important;
backdrop-filter: ${aeroTheme.glass.backdrop} !important;
border: ${aeroTheme.glass.border} !important;
box-shadow: ${aeroTheme.shadows.glass} !important;
cursor: pointer !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
z-index: 1000 !important;
isolation: isolate;
contain: layout style paint;
&:hover {
transform: scale(1.05) !important;
box-shadow: ${aeroTheme.shadows.xl} !important;
}
`;
export const ButtonLogo = styled(motion.div) `
width: 2rem !important;
height: 2rem !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
color: ${aeroTheme.colors.primary[500]} !important;
isolation: isolate;
contain: layout style paint;
`;
// Message Components
export const ConviBubble = styled.div `
background: rgba(255, 255, 255, 0.95) !important;
backdrop-filter: blur(20px) !important;
border: 1px solid rgba(255, 255, 255, 0.3) !important;
border-radius: 12px 12px 12px 4px !important;
padding: 12px !important;
box-shadow: 0 1px 6px rgba(0, 0, 0, 0.08) !important;
color: ${aeroTheme.colors.text.primary} !important;
font-family: ${aeroTheme.typography.fontFamily.body} !important;
font-size: 14px !important;
line-height: 1.5 !important;
/* Markdown styling */
strong {
font-weight: 600 !important;
color: ${aeroTheme.colors.text.primary} !important;
}
em {
font-style: italic !important;
}
word-wrap: break-word !important;
max-width: 100% !important;
font-synthesis: none !important;
text-rendering: optimizeLegibility !important;
-webkit-font-smoothing: antialiased !important;
-moz-osx-font-smoothing: grayscale !important;
-webkit-text-size-adjust: 100% !important;
isolation: isolate;
contain: layout style paint;
`;
export const ConviMessageContainer = styled.div `
display: flex !important;
flex-direction: column !important;
max-width: 70% !important;
margin-right: auto !important;
width: 100% !important;
isolation: isolate;
contain: layout style paint;
`;
export const MessageHeader = styled.div `
display: flex !important;
align-items: center !important;
gap: ${aeroTheme.spacing.xs} !important;
margin-bottom: ${aeroTheme.spacing.xs} !important;
isolation: isolate;
contain: layout style paint;
`;
export const ConviLabel = styled.span `
font-size: ${aeroTheme.typography.sizes.caption} !important;
color: #10b981 !important;
font-weight: 500 !important;
font-family: ${aeroTheme.typography.fontFamily.body} !important;
isolation: isolate;
contain: layout style paint;
`;
export const LogoWrapper = styled.div `
width: 1rem !important;
height: 1rem !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
isolation: isolate;
contain: layout style paint;
`;
export const UserBubble = styled.div `
background: rgba(255, 255, 255, 0.95) !important;
backdrop-filter: blur(20px) !important;
border: 1px solid rgba(255, 255, 255, 0.3) !important;
border-radius: 12px 12px 4px 12px !important;
padding: 12px !important;
box-shadow: 0 1px 6px rgba(0, 0, 0, 0.08) !important;
color: ${aeroTheme.colors.text.primary} !important;
font-family: ${aeroTheme.typography.fontFamily.body} !important;
font-size: 14px !important;
line-height: 1.5 !important;
/* Markdown styling */
strong {
font-weight: 600 !important;
color: ${aeroTheme.colors.text.primary} !important;
}
em {
font-style: italic !important;
}
word-wrap: break-word !important;
max-width: 100% !important;
font-synthesis: none !important;
text-rendering: optimizeLegibility !important;
-webkit-font-smoothing: antialiased !important;
-moz-osx-font-smoothing: grayscale !important;
-webkit-text-size-adjust: 100% !important;
isolation: isolate;
contain: layout style paint;
`;
export const UserMessageContainer = styled.div `
display: flex !important;
flex-direction: column !important;
max-width: 70% !important;
margin-left: auto !important;
width: 100% !important;
isolation: isolate;
contain: layout style paint;
`;
export const UserLabel = styled.span `
font-size: ${aeroTheme.typography.sizes.caption} !important;
color: ${aeroTheme.colors.convai.dark} !important;
font-weight: 500 !important;
font-family: ${aeroTheme.typography.fontFamily.body} !important;
isolation: isolate;
contain: layout style paint;
`;
export const BubbleContainer = styled(motion.div) `
display: flex !important;
flex-direction: column !important;
max-width: 70% !important;
margin: ${aeroTheme.spacing.sm} 0 !important;
align-self: ${(props) => props.$isUser ? "flex-end" : "flex-start"} !important;
isolation: isolate;
contain: layout style paint;
`;
export const Bubble = styled(motion.div) `
background: ${(props) => props.$isUser
? "rgba(255, 255, 255, 0.95)"
: "rgba(248, 250, 252, 0.95)"} !important;
backdrop-filter: blur(20px) !important;
border: 1px solid
${(props) => props.$isUser
? "rgba(255, 255, 255, 0.3)"
: "rgba(248, 250, 252, 0.3)"} !important;
border-radius: ${(props) => props.$isUser
? `${aeroTheme.borderRadius.lg} ${aeroTheme.borderRadius.lg} ${aeroTheme.borderRadius.sm} ${aeroTheme.borderRadius.lg}`
: `${aeroTheme.borderRadius.lg} ${aeroTheme.borderRadius.lg} ${aeroTheme.borderRadius.lg} ${aeroTheme.borderRadius.sm}`} !important;
padding: ${aeroTheme.spacing.md} !important;
box-shadow: 0 1px 6px rgba(0, 0, 0, 0.08) !important;
color: ${aeroTheme.colors.text.primary} !important;
font-family: ${aeroTheme.typography.fontFamily.body} !important;
font-size: ${aeroTheme.typography.sizes.body} !important;
line-height: 1.5 !important;
word-wrap: break-word !important;
position: relative !important;
font-synthesis: none !important;
text-rendering: optimizeLegibility !important;
-webkit-font-smoothing: antialiased !important;
-moz-osx-font-smoothing: grayscale !important;
-webkit-text-size-adjust: 100% !important;
isolation: isolate;
contain: layout style paint;
`;
export const Timestamp = styled.span `
font-size: ${aeroTheme.typography.sizes.caption} !important;
color: ${aeroTheme.colors.text.secondary} !important;
margin-top: ${aeroTheme.spacing.xs} !important;
align-self: ${(props) => props.$isUser ? "flex-end" : "flex-start"} !important;
font-family: ${aeroTheme.typography.fontFamily.body} !important;
isolation: isolate;
contain: layout style paint;
`;
export const MessageListContainer = styled.div `
display: flex !important;
flex-direction: column !important;
overflow-y: auto !important;
flex: 1 !important;
min-height: 0 !important;
width: 100% !important;
scroll-behavior: smooth !important;
isolation: isolate;
contain: layout style paint;
/* Custom scrollbar */
&::-webkit-scrollbar {
width: 4px !important;
}
&::-webkit-scrollbar-track {
background: transparent !important;
}
&::-webkit-scrollbar-thumb {
background: rgba(0, 0, 0, 0.1) !important;
border-radius: 2px !important;
}
&::-webkit-scrollbar-thumb:hover {
background: rgba(0, 0, 0, 0.2) !important;
}
`;
export const MessageWrapper = styled.div `
margin-bottom: 16px !important;
width: 100% !important;
isolation: isolate;
contain: layout style paint;
&:last-child {
margin-bottom: 0 !important;
}
`;
export const EmptyState = styled.div `
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100%;
color: ${aeroTheme.colors.text.secondary};
font-family: ${aeroTheme.typography.fontFamily.body};
font-size: ${aeroTheme.typography.sizes.body};
text-align: center;
padding: 32px;
`;
//# sourceMappingURL=styledComponents.js.map