Files
012-kaopeilian/知识库/参考代码/coze-chat-frontend/src/pages/Training/VoiceChat.scss
111 998211c483 feat: 初始化考培练系统项目
- 从服务器拉取完整代码
- 按框架规范整理项目结构
- 配置 Drone CI 测试环境部署
- 包含后端(FastAPI)、前端(Vue3)、管理端

技术栈: Vue3 + TypeScript + FastAPI + MySQL
2026-01-24 19:33:28 +08:00

287 lines
6.0 KiB
SCSS
Executable File

.voice_wrapper {
background: url("@/assets/images/training_logo.png") top center no-repeat;
overflow: hidden;
.blur_bg {
height: 100%;
left: 0;
position: absolute;
top: 0;
width: 100%;
-webkit-backdrop-filter: blur(60px);
backdrop-filter: blur(60px);
background-color: rgba(244, 244, 246, 0.8);
}
.voice_chat_wrapper {
align-items: center;
display: flex;
flex-direction: column;
height: 100%;
justify-content: space-between;
padding-bottom: 80px;
}
.chat_header {
position: relative;
width: 100%;
.avatar_container {
align-items: center;
display: flex;
flex-direction: column;
justify-content: center;
margin-top: 70px;
width: 100%;
}
.logo_wrap {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.logo {
width: 140px;
height: 140px;
background-image: url("@/assets/images/training_logo.png");
background-position: 50%;
background-repeat: no-repeat;
background-size: cover;
border-radius: 36px;
box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.25);
}
.title {
color: rgba(6, 7, 9, 0.96);
font-size: 20px;
font-weight: 500;
line-height: 28px;
margin-bottom: 16px;
margin-top: 12px;
max-width: 40%;
min-width: 180px;
overflow: hidden;
text-align: center;
text-overflow: ellipsis;
white-space: nowrap;
}
.content_flag {
position: absolute;
top: 8px;
right: 8px;
.button_flag {
border: none;
}
}
.play_loading_wrap {
position: absolute;
top: -28px;
right: -42px;
width: 82px;
height: 58px;
background: #fff;
border: 1px solid rgba(153, 182, 255, 0.12);
border-radius: 36px;
box-shadow: 0 4px 12px 0 rgba(0, 0, 0, 0.25);
}
.play_loading {
display: flex;
gap: 4px;
align-items: center;
}
.play_loading_dot {
width: 8px;
height: 8px;
background-color: #7a70eb;
border-radius: 4px;
animation: bounce 0.8s infinite ease-in-out;
&:nth-child(1) {
animation-delay: 0s;
}
&:nth-child(2) {
animation-delay: 0.2s;
}
&:nth-child(3) {
animation-delay: 0.4s;
}
}
@keyframes bounce {
0%,
100% {
height: 8px;
opacity: 0.6;
}
50% {
height: 16px;
opacity: 1;
}
}
}
.chat_content {
-webkit-mask: linear-gradient(
hsla(0, 0%, 100%, 0),
#fff 10%,
#fff 90%,
hsla(0, 0%, 100%, 0)
);
mask: linear-gradient(
hsla(0, 0%, 100%, 0),
#fff 10%,
#fff 90%,
hsla(0, 0%, 100%, 0)
);
font-size: 14px;
padding: 24px 24px 8px;
overflow-y: auto;
max-width: 900px;
width: 100%;
flex: 1;
.ant-list-item {
border: none;
}
.message_item_wrap {
text-align: left;
padding: 8px 16px;
}
.message_item {
padding: 8px 12px;
border-radius: 8px;
background-color: #fff;
display: inline-block;
color: rgba(0, 0, 0, 0.88);
}
.user_item {
background-color: #c8c4f6;
}
}
.chat_info {
align-items: flex-end;
display: flex;
height: 70px;
justify-content: center;
margin-bottom: 16px;
width: 100%;
position: relative;
.tips {
font-size: 14px;
color: rgba(6, 7, 9, 0.5);
}
.listening {
display: flex;
flex-direction: column;
align-items: center;
}
.listen_dots {
margin-bottom: 20px;
}
.dot {
width: 8px;
height: 8px;
border-radius: 4px;
background-color: #6c6a6f;
margin-right: 4px;
&:last-child {
margin-right: 0;
}
}
.retry_btn {
cursor: pointer;
color: $primary-color;
}
}
.button_wrapper {
align-items: center;
display: flex;
flex-wrap: nowrap;
justify-content: center;
.button_block {
position: relative;
height: 64px;
width: 64px;
}
.button_hangup {
border-radius: 100%;
font-size: 24px;
height: 64px;
width: 64px;
color: #e53241;
box-shadow: 0 4px 12px 0 rgba(#000, 0.08), 0 8px 24px 0 rgba(#000, 0.04);
border: none;
&:hover {
background-color: rgb(233, 235, 242);
color: #e53241;
}
}
.button_text {
align-items: center;
display: flex;
flex-direction: column;
justify-content: center;
margin-top: 12px;
position: absolute;
width: 100%;
font-size: 14px;
}
.button_answer_wrapper {
position: relative;
margin-left: 110px;
.button_answer_box {
height: 64px;
position: relative;
width: 64px;
}
.cycle {
animation: diffusion 3s cubic-bezier(0.32, 0.94, 0.6, 1) infinite;
background-image: linear-gradient(#3ec254, rgba(62, 194, 84, 0));
border-radius: 50%;
height: 64px;
position: absolute;
width: 64px;
}
.cycle1 {
animation-delay: 0.6s;
}
.cycle2 {
animation-delay: 1.2s;
}
.cycle3 {
animation-delay: 1.8s;
}
.button_answer {
animation: rotation 0.2s cubic-bezier(0.4, 0.8, 0.74, 1) infinite;
border-radius: 100%;
font-size: 24px;
height: 64px;
position: absolute;
width: 64px;
z-index: 2;
-webkit-tap-highlight-color: transparent;
background-color: #3ec254;
border: none;
color: #fff;
}
}
.btn_loading {
animation: animation-rotate 0.6s linear infinite;
animation-fill-mode: forwards;
}
}
@keyframes diffusion {
0% {
opacity: 1;
transform: scale(1);
}
100% {
opacity: 0;
transform: scale(2);
}
}
@keyframes animation-rotate {
0% {
transform: rotate(0);
}
100% {
transform: rotate(1turn);
}
}
}