@lobehub/chat
Version:
Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.
217 lines (189 loc) • 5 kB
text/typescript
import { createStyles } from 'antd-style';
import { rgba } from 'polished';
export const useStyles = createStyles(
(
{ cx, css, token, responsive },
{
placement,
variant,
title,
avatarSize,
editing,
time,
disabled,
}: {
avatarSize?: number;
disabled?: boolean;
editing?: boolean;
placement?: 'left' | 'right';
primary?: boolean;
showTitle?: boolean;
time?: number;
title?: string;
variant?: 'bubble' | 'docs';
},
) => {
const blockStylish = css`
padding-block: 8px;
padding-inline: 12px;
border: 1px solid ${rgba(token.colorBorderSecondary, 0.66)};
border-radius: ${token.borderRadiusLG}px;
background-color: ${token.colorBgContainer};
`;
const rawStylish = css`
padding-block-start: ${title ? 0 : '6px'};
`;
const rawContainerStylish = css`
margin-block-end: -16px;
transition: background-color 100ms ${token.motionEaseOut};
`;
const typeStylish = variant === 'bubble' ? blockStylish : rawStylish;
const editingStylish =
editing &&
css`
width: 100%;
`;
return {
actions: cx(
css`
flex: none;
align-self: ${variant === 'bubble'
? 'flex-end'
: placement === 'left'
? 'flex-start'
: 'flex-end'};
justify-content: ${placement === 'left' ? 'flex-end' : 'flex-start'};
`,
editing &&
css`
pointer-events: none ;
opacity: 0 ;
`,
),
avatarContainer: css`
position: relative;
flex: none;
width: ${avatarSize}px;
height: ${avatarSize}px;
`,
avatarGroupContainer: css`
width: ${avatarSize}px;
`,
container: cx(
variant === 'docs' && rawContainerStylish,
css`
position: relative;
width: 100%;
max-width: 100vw;
padding-block: 24px 12px;
padding-inline: 12px;
time {
display: inline-block;
white-space: nowrap;
}
div[role='menubar'] {
display: flex;
}
time,
div[role='menubar'] {
pointer-events: none;
opacity: 0;
transition: opacity 200ms ${token.motionEaseOut};
}
&:hover {
time,
div[role='menubar'] {
pointer-events: unset;
opacity: 1;
}
}
${responsive.mobile} {
padding-block-start: ${variant === 'docs' ? '16px' : '12px'};
padding-inline: 8px;
}
`,
),
editingContainer: cx(
editingStylish,
css`
padding-block: 8px 12px;
padding-inline: 12px;
border: 1px solid ${token.colorBorderSecondary};
&:active,
&:hover {
border-color: ${token.colorBorder};
}
`,
variant === 'docs' &&
css`
border-radius: ${token.borderRadius}px;
background: ${token.colorFillQuaternary};
`,
),
editingInput: css`
width: 100%;
`,
errorContainer: css`
position: relative;
overflow: hidden;
width: 100%;
`,
loading: css`
position: absolute;
inset-block-end: 0;
inset-inline: ${placement === 'right' ? '-4px' : 'unset'}
${placement === 'left' ? '-4px' : 'unset'};
width: 16px;
height: 16px;
border-radius: 50%;
color: ${token.colorBgLayout};
background: ${token.colorPrimary};
`,
message: cx(
typeStylish,
css`
user-select: ${disabled ? 'none' : 'text'};
position: relative;
overflow: hidden;
max-width: 100%;
color: ${disabled ? token.colorTextSecondary : 'unset'};
${responsive.mobile} {
width: 100%;
}
`,
),
messageContainer: cx(
editingStylish,
css`
position: relative;
overflow: hidden;
max-width: 100%;
margin-block-start: ${time ? -16 : 0}px;
${responsive.mobile} {
overflow-x: auto;
}
`,
),
messageContent: cx(
editingStylish,
css`
position: relative;
overflow: hidden;
max-width: 100%;
${responsive.mobile} {
flex-direction: column ;
}
`,
),
messageExtra: cx('message-extra'),
name: css`
pointer-events: none;
margin-block-end: 6px;
font-size: 12px;
line-height: 1;
color: ${token.colorTextDescription};
text-align: ${placement === 'left' ? 'left' : 'right'};
`,
};
},
);