|
@ -421,6 +421,36 @@ const createTypingEffect = (message, content, speed) => { |
|
|
|
|
|
|
|
|
const processNextElement = () => { |
|
|
const processNextElement = () => { |
|
|
if (currentIndex >= content.length) { |
|
|
if (currentIndex >= content.length) { |
|
|
|
|
|
if (message.isEnd) { |
|
|
|
|
|
if (message.isEnd == '1') { |
|
|
|
|
|
apiStatus.one.isEnd = true; |
|
|
|
|
|
} else if (message.isEnd == '2') { |
|
|
|
|
|
apiStatus.two.isEnd = true; |
|
|
|
|
|
} else if (message.isEnd == '3') { |
|
|
|
|
|
apiStatus.three.isEnd = true; |
|
|
|
|
|
} else if (message.isEnd == '4') { |
|
|
|
|
|
apiStatus.four.isEnd = true; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
if (message.error) { |
|
|
|
|
|
chatStore.messages.push({ |
|
|
|
|
|
class: "ing", |
|
|
|
|
|
type: "ing", |
|
|
|
|
|
flag: false, |
|
|
|
|
|
content: '工作流返回出错,请稍后重试', |
|
|
|
|
|
}) |
|
|
|
|
|
chatStore.isLoading = false; |
|
|
|
|
|
if (message.error == '2') { |
|
|
|
|
|
apiStatus.two.isError = true; |
|
|
|
|
|
} else if (message.error == '3') { |
|
|
|
|
|
apiStatus.three.isError = true; |
|
|
|
|
|
} else if (message.error == '4') { |
|
|
|
|
|
apiStatus.four.isError = true; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
if (message.end) { |
|
|
|
|
|
chatStore.isLoading = false; |
|
|
|
|
|
} |
|
|
message.isTyping = false; |
|
|
message.isTyping = false; |
|
|
nextTick(() => { |
|
|
nextTick(() => { |
|
|
resolve(); // 完成后resolve |
|
|
resolve(); // 完成后resolve |
|
@ -519,11 +549,65 @@ const createTypingEffect = (message, content, speed) => { |
|
|
} |
|
|
} |
|
|
}); |
|
|
}); |
|
|
} |
|
|
} |
|
|
|
|
|
if (message.isEnd) { |
|
|
|
|
|
if (message.isEnd == '1') { |
|
|
|
|
|
apiStatus.one.isEnd = true; |
|
|
|
|
|
} else if (message.isEnd == '2') { |
|
|
|
|
|
apiStatus.two.isEnd = true; |
|
|
|
|
|
} else if (message.isEnd == '3') { |
|
|
|
|
|
apiStatus.three.isEnd = true; |
|
|
|
|
|
} else if (message.isEnd == '4') { |
|
|
|
|
|
apiStatus.four.isEnd = true; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
if (message.error) { |
|
|
|
|
|
chatStore.messages.push({ |
|
|
|
|
|
class: "ing", |
|
|
|
|
|
type: "ing", |
|
|
|
|
|
flag: false, |
|
|
|
|
|
content: '工作流返回出错,请稍后重试', |
|
|
|
|
|
}) |
|
|
|
|
|
chatStore.isLoading = false; |
|
|
|
|
|
if (message.error == '2') { |
|
|
|
|
|
apiStatus.two.isError = true; |
|
|
|
|
|
} else if (message.error == '3') { |
|
|
|
|
|
apiStatus.three.isError = true; |
|
|
|
|
|
} else if (message.error == '4') { |
|
|
|
|
|
apiStatus.four.isError = true; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
// 延时1秒后resolve |
|
|
// 延时1秒后resolve |
|
|
setTimeout(() => { |
|
|
setTimeout(() => { |
|
|
resolve(); |
|
|
resolve(); |
|
|
}, 1000); |
|
|
}, 1000); |
|
|
} else { |
|
|
} else { |
|
|
|
|
|
if (message.isEnd) { |
|
|
|
|
|
if (message.isEnd == '1') { |
|
|
|
|
|
apiStatus.one.isEnd = true; |
|
|
|
|
|
} else if (message.isEnd == '2') { |
|
|
|
|
|
apiStatus.two.isEnd = true; |
|
|
|
|
|
} else if (message.isEnd == '3') { |
|
|
|
|
|
apiStatus.three.isEnd = true; |
|
|
|
|
|
} else if (message.isEnd == '4') { |
|
|
|
|
|
apiStatus.four.isEnd = true; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
if (message.error) { |
|
|
|
|
|
chatStore.messages.push({ |
|
|
|
|
|
class: "ing", |
|
|
|
|
|
type: "ing", |
|
|
|
|
|
flag: false, |
|
|
|
|
|
content: '工作流返回出错,请稍后重试', |
|
|
|
|
|
}) |
|
|
|
|
|
chatStore.isLoading = false; |
|
|
|
|
|
if (message.error == '2') { |
|
|
|
|
|
apiStatus.two.isError = true; |
|
|
|
|
|
} else if (message.error == '3') { |
|
|
|
|
|
apiStatus.three.isError = true; |
|
|
|
|
|
} else if (message.error == '4') { |
|
|
|
|
|
apiStatus.four.isError = true; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
// 延时1秒后resolve |
|
|
// 延时1秒后resolve |
|
|
setTimeout(() => { |
|
|
setTimeout(() => { |
|
|
resolve(); |
|
|
resolve(); |
|
@ -533,6 +617,8 @@ const createTypingEffect = (message, content, speed) => { |
|
|
}); |
|
|
}); |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
let apiStatus = {} |
|
|
|
|
|
|
|
|
// 队列处理函数 |
|
|
// 队列处理函数 |
|
|
const processTypingQueue = async () => { |
|
|
const processTypingQueue = async () => { |
|
|
if (isTypingInProgress.value || typingQueue.value.length === 0) { |
|
|
if (isTypingInProgress.value || typingQueue.value.length === 0) { |
|
@ -639,10 +725,17 @@ watch( |
|
|
content: aiContent, |
|
|
content: aiContent, |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
chatStore.setLoading(false); |
|
|
|
|
|
|
|
|
chatStore.isLoading = false; |
|
|
} |
|
|
} |
|
|
} catch (e) { |
|
|
} catch (e) { |
|
|
console.log(e, "意图识别失败"); |
|
|
console.log(e, "意图识别失败"); |
|
|
|
|
|
chatStore.messages.push({ |
|
|
|
|
|
class: "ing", |
|
|
|
|
|
type: "ing", |
|
|
|
|
|
flag: false, |
|
|
|
|
|
content: '工作流返回出错,请稍后重试', |
|
|
|
|
|
}) |
|
|
|
|
|
chatStore.isLoading = false; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (flag) { |
|
|
if (flag) { |
|
@ -686,6 +779,8 @@ watch( |
|
|
marketList: userStore.aiGoldMarketList, |
|
|
marketList: userStore.aiGoldMarketList, |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const HomePage = result20.data.HomePage; |
|
|
const HomePage = result20.data.HomePage; |
|
|
const AIGoldBull = result20.data.AIGoldBull; |
|
|
const AIGoldBull = result20.data.AIGoldBull; |
|
|
|
|
|
|
|
@ -696,11 +791,11 @@ watch( |
|
|
let result23; |
|
|
let result23; |
|
|
let result24; |
|
|
let result24; |
|
|
// 用于跟踪API完成状态和结果 |
|
|
// 用于跟踪API完成状态和结果 |
|
|
const apiStatus = { |
|
|
|
|
|
one: { completed: false, result: null, error: null }, |
|
|
|
|
|
two: { completed: false, result: null, error: null }, |
|
|
|
|
|
three: { completed: false, result: null, error: null }, |
|
|
|
|
|
four: { completed: false, result: null, error: null }, |
|
|
|
|
|
|
|
|
apiStatus = { |
|
|
|
|
|
one: { completed: false, result: null, error: null, isError: false, isEnd: false }, |
|
|
|
|
|
two: { completed: false, result: null, error: null, isError: false, isEnd: false }, |
|
|
|
|
|
three: { completed: false, result: null, error: null, isError: false, isEnd: false }, |
|
|
|
|
|
four: { completed: false, result: null, error: null, isError: false, isEnd: false }, |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
// 音频预加载状态跟踪 |
|
|
// 音频预加载状态跟踪 |
|
@ -1034,8 +1129,8 @@ watch( |
|
|
const checkAndExecuteInOrder = () => { |
|
|
const checkAndExecuteInOrder = () => { |
|
|
// 检查OneAPI - 只有当文本和音频都准备好时才开始输出 |
|
|
// 检查OneAPI - 只有当文本和音频都准备好时才开始输出 |
|
|
if (canStartFirstOutput() && !apiStatus.one.executed) { |
|
|
if (canStartFirstOutput() && !apiStatus.one.executed) { |
|
|
apiStatus.one.executed = true; |
|
|
|
|
|
if (apiStatus.one.result) { |
|
|
if (apiStatus.one.result) { |
|
|
|
|
|
apiStatus.one.executed = true; |
|
|
console.log("执行OneAPI代码(文本和音频同步开始):", apiStatus.one.result); |
|
|
console.log("执行OneAPI代码(文本和音频同步开始):", apiStatus.one.result); |
|
|
|
|
|
|
|
|
// 将第一个音频添加到播放队列(确保顺序:API1) |
|
|
// 将第一个音频添加到播放队列(确保顺序:API1) |
|
@ -1235,6 +1330,8 @@ watch( |
|
|
messageId: klineMessageId2, |
|
|
messageId: klineMessageId2, |
|
|
hasValidData: true, // 添加hasValidData标志 |
|
|
hasValidData: true, // 添加hasValidData标志 |
|
|
klineType: 2, |
|
|
klineType: 2, |
|
|
|
|
|
error: apiStatus.two.error ? '2' : '', |
|
|
|
|
|
isEnd: '1', |
|
|
}, |
|
|
}, |
|
|
"", |
|
|
"", |
|
|
50 |
|
|
50 |
|
@ -1271,6 +1368,14 @@ watch( |
|
|
// console.warn("未找到K线消息"); |
|
|
// console.warn("未找到K线消息"); |
|
|
// } |
|
|
// } |
|
|
// }); |
|
|
// }); |
|
|
|
|
|
} else { |
|
|
|
|
|
chatStore.messages.push({ |
|
|
|
|
|
class: "ing", |
|
|
|
|
|
type: "ing", |
|
|
|
|
|
flag: false, |
|
|
|
|
|
content: '工作流返回出错,请稍后重试', |
|
|
|
|
|
}) |
|
|
|
|
|
chatStore.isLoading = false; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -1280,8 +1385,9 @@ watch( |
|
|
apiStatus.two.completed && |
|
|
apiStatus.two.completed && |
|
|
!apiStatus.two.executed |
|
|
!apiStatus.two.executed |
|
|
) { |
|
|
) { |
|
|
apiStatus.two.executed = true; |
|
|
|
|
|
|
|
|
|
|
|
if (apiStatus.two.result) { |
|
|
if (apiStatus.two.result) { |
|
|
|
|
|
apiStatus.two.executed = true; |
|
|
console.log("执行TwoAPI代码:", apiStatus.two.result); |
|
|
console.log("执行TwoAPI代码:", apiStatus.two.result); |
|
|
|
|
|
|
|
|
// 将第二个音频添加到播放队列(确保顺序:API2) |
|
|
// 将第二个音频添加到播放队列(确保顺序:API2) |
|
@ -1329,6 +1435,8 @@ watch( |
|
|
type: "content3", |
|
|
type: "content3", |
|
|
content: "", |
|
|
content: "", |
|
|
isTyping: true, |
|
|
isTyping: true, |
|
|
|
|
|
error: apiStatus.three.error ? '3' : '', |
|
|
|
|
|
isEnd: '2' |
|
|
}); |
|
|
}); |
|
|
// chatStore.messages.push(aiMessage2); |
|
|
// chatStore.messages.push(aiMessage2); |
|
|
|
|
|
|
|
@ -1350,6 +1458,18 @@ watch( |
|
|
// type: "content3", |
|
|
// type: "content3", |
|
|
// content: ac2, |
|
|
// content: ac2, |
|
|
// }); |
|
|
// }); |
|
|
|
|
|
} else { |
|
|
|
|
|
console.log('1111111111111111111') |
|
|
|
|
|
if (apiStatus.one.isEnd && apiStatus.two.error && !apiStatus.two.isError) { |
|
|
|
|
|
apiStatus.two.isError = true |
|
|
|
|
|
chatStore.messages.push({ |
|
|
|
|
|
class: "ing", |
|
|
|
|
|
type: "ing", |
|
|
|
|
|
flag: false, |
|
|
|
|
|
content: '工作流返回出错,请稍后重试', |
|
|
|
|
|
}) |
|
|
|
|
|
chatStore.isLoading = false; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -1359,8 +1479,9 @@ watch( |
|
|
apiStatus.three.completed && |
|
|
apiStatus.three.completed && |
|
|
!apiStatus.three.executed |
|
|
!apiStatus.three.executed |
|
|
) { |
|
|
) { |
|
|
apiStatus.three.executed = true; |
|
|
|
|
|
|
|
|
|
|
|
if (apiStatus.three.result) { |
|
|
if (apiStatus.three.result) { |
|
|
|
|
|
apiStatus.three.executed = true; |
|
|
console.log("执行ThreeAPI代码:", apiStatus.three.result); |
|
|
console.log("执行ThreeAPI代码:", apiStatus.three.result); |
|
|
|
|
|
|
|
|
// 将第三个音频添加到播放队列(确保顺序:API3) |
|
|
// 将第三个音频添加到播放队列(确保顺序:API3) |
|
@ -1489,6 +1610,8 @@ watch( |
|
|
type: "content3", |
|
|
type: "content3", |
|
|
content: "", |
|
|
content: "", |
|
|
isTyping: true, |
|
|
isTyping: true, |
|
|
|
|
|
error: apiStatus.four.error ? '4' : '', |
|
|
|
|
|
isEnd: '3' |
|
|
}); |
|
|
}); |
|
|
// chatStore.messages.push(aiMessage4); |
|
|
// chatStore.messages.push(aiMessage4); |
|
|
|
|
|
|
|
@ -1515,6 +1638,17 @@ watch( |
|
|
// type: "content3", |
|
|
// type: "content3", |
|
|
// content: ac4, |
|
|
// content: ac4, |
|
|
// }); |
|
|
// }); |
|
|
|
|
|
} else { |
|
|
|
|
|
if (apiStatus.two.isEnd && apiStatus.three.error && !apiStatus.three.isError) { |
|
|
|
|
|
apiStatus.three.isError = true; |
|
|
|
|
|
chatStore.messages.push({ |
|
|
|
|
|
class: "ing", |
|
|
|
|
|
type: "ing", |
|
|
|
|
|
flag: false, |
|
|
|
|
|
content: '工作流返回出错,请稍后重试1111', |
|
|
|
|
|
}) |
|
|
|
|
|
chatStore.isLoading = false; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -1524,8 +1658,9 @@ watch( |
|
|
apiStatus.four.completed && |
|
|
apiStatus.four.completed && |
|
|
!apiStatus.four.executed |
|
|
!apiStatus.four.executed |
|
|
) { |
|
|
) { |
|
|
apiStatus.four.executed = true; |
|
|
|
|
|
|
|
|
|
|
|
if (apiStatus.four.result) { |
|
|
if (apiStatus.four.result) { |
|
|
|
|
|
apiStatus.four.executed = true; |
|
|
console.log("执行FourAPI代码:", apiStatus.four.result); |
|
|
console.log("执行FourAPI代码:", apiStatus.four.result); |
|
|
|
|
|
|
|
|
// 将第四个音频添加到播放队列(确保顺序:API4) |
|
|
// 将第四个音频添加到播放队列(确保顺序:API4) |
|
@ -1608,6 +1743,7 @@ watch( |
|
|
type: "mianze", |
|
|
type: "mianze", |
|
|
content: "", |
|
|
content: "", |
|
|
isTyping: true, |
|
|
isTyping: true, |
|
|
|
|
|
end: true |
|
|
}); |
|
|
}); |
|
|
// chatStore.messages.push(aiMessage6); |
|
|
// chatStore.messages.push(aiMessage6); |
|
|
|
|
|
|
|
@ -1623,13 +1759,24 @@ watch( |
|
|
// } |
|
|
// } |
|
|
// }, 50); // 调整速度为50ms/字符 |
|
|
// }, 50); // 调整速度为50ms/字符 |
|
|
addTypingTask(aiMessage6, ["", ac6], 210); |
|
|
addTypingTask(aiMessage6, ["", ac6], 210); |
|
|
|
|
|
|
|
|
|
|
|
// chatStore.isLoading = false; |
|
|
// chatStore.messages.push({ |
|
|
// chatStore.messages.push({ |
|
|
// sender: "ai", |
|
|
// sender: "ai", |
|
|
// class: "mianze", |
|
|
// class: "mianze", |
|
|
// type: "mianze", |
|
|
// type: "mianze", |
|
|
// content: "内容由AI生成,请注意甄别", |
|
|
// content: "内容由AI生成,请注意甄别", |
|
|
// }); |
|
|
// }); |
|
|
|
|
|
} else { |
|
|
|
|
|
if (apiStatus.three.isEnd && apiStatus.four.error && !apiStatus.four.isError) { |
|
|
|
|
|
apiStatus.four.isError = true; |
|
|
|
|
|
chatStore.messages.push({ |
|
|
|
|
|
class: "ing", |
|
|
|
|
|
type: "ing", |
|
|
|
|
|
flag: false, |
|
|
|
|
|
content: '工作流返回出错,请稍后重试', |
|
|
|
|
|
}) |
|
|
|
|
|
chatStore.isLoading = false; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -1722,12 +1869,15 @@ watch( |
|
|
apiStatus.two.error = error; |
|
|
apiStatus.two.error = error; |
|
|
audioPreloadStatus.two.loaded = true; |
|
|
audioPreloadStatus.two.loaded = true; |
|
|
checkAndExecuteInOrder(); |
|
|
checkAndExecuteInOrder(); |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
const handleThreeAPI = async () => { |
|
|
const handleThreeAPI = async () => { |
|
|
try { |
|
|
try { |
|
|
result23 = await dbqbSecondThreeAPI(params2); |
|
|
result23 = await dbqbSecondThreeAPI(params2); |
|
|
|
|
|
// result23 = await dbqbSecondThreeAPI(); |
|
|
|
|
|
|
|
|
console.log("ThreeAPI成功返回:", result23); |
|
|
console.log("ThreeAPI成功返回:", result23); |
|
|
|
|
|
|
|
|
apiStatus.three.completed = true; |
|
|
apiStatus.three.completed = true; |
|
@ -1774,6 +1924,7 @@ watch( |
|
|
apiStatus.four.error = error; |
|
|
apiStatus.four.error = error; |
|
|
audioPreloadStatus.four.loaded = true; |
|
|
audioPreloadStatus.four.loaded = true; |
|
|
checkAndExecuteInOrder(); |
|
|
checkAndExecuteInOrder(); |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
@ -1925,7 +2076,7 @@ watch( |
|
|
// }); |
|
|
// }); |
|
|
// chatStore.setLoading(false); |
|
|
// chatStore.setLoading(false); |
|
|
} finally { |
|
|
} finally { |
|
|
chatStore.setLoading(false); |
|
|
|
|
|
|
|
|
// chatStore.setLoading(false); |
|
|
await chatStore.getUserCount(); |
|
|
await chatStore.getUserCount(); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
@ -2059,7 +2210,7 @@ function KlineCanvsEcharts(containerId) { |
|
|
}, |
|
|
}, |
|
|
axisLabel: { |
|
|
axisLabel: { |
|
|
show: true, |
|
|
show: true, |
|
|
formatter: function (v) {}, |
|
|
|
|
|
|
|
|
formatter: function (v) { }, |
|
|
textStyle: { |
|
|
textStyle: { |
|
|
color: "auto", |
|
|
color: "auto", |
|
|
}, |
|
|
}, |
|
@ -3626,15 +3777,11 @@ onUnmounted(() => { |
|
|
<img :src="logo2" alt="夺宝奇兵大模型logo" class="logo2" /> |
|
|
<img :src="logo2" alt="夺宝奇兵大模型logo" class="logo2" /> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div |
|
|
|
|
|
v-for="(msg, index) in chatMsg" |
|
|
|
|
|
:key="index" |
|
|
|
|
|
:class="{ |
|
|
|
|
|
|
|
|
<div v-for="(msg, index) in chatMsg" :key="index" :class="{ |
|
|
'message-bubble': true, |
|
|
'message-bubble': true, |
|
|
[msg.sender]: msg.sender, |
|
|
[msg.sender]: msg.sender, |
|
|
[msg.class]: msg.class, |
|
|
[msg.class]: msg.class, |
|
|
}" |
|
|
|
|
|
> |
|
|
|
|
|
|
|
|
}"> |
|
|
<div v-if="msg.type === 'kline'" class="kline-container"> |
|
|
<div v-if="msg.type === 'kline'" class="kline-container"> |
|
|
<div :id="'kline-container-' + index" class="chart-mount-point"> |
|
|
<div :id="'kline-container-' + index" class="chart-mount-point"> |
|
|
<div v-if="!msg.hasValidData" class="no-data-message"> |
|
|
<div v-if="!msg.hasValidData" class="no-data-message"> |
|
@ -3715,6 +3862,7 @@ onUnmounted(() => { |
|
|
/* right: 30px; */ |
|
|
/* right: 30px; */ |
|
|
/* top: -30px; */ |
|
|
/* top: -30px; */ |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.logo1 { |
|
|
.logo1 { |
|
|
max-width: 350px; |
|
|
max-width: 350px; |
|
|
min-width: 200px; |
|
|
min-width: 200px; |
|
@ -3849,28 +3997,35 @@ onUnmounted(() => { |
|
|
.dot:nth-child(1) { |
|
|
.dot:nth-child(1) { |
|
|
animation-delay: 0s; |
|
|
animation-delay: 0s; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.dot:nth-child(2) { |
|
|
.dot:nth-child(2) { |
|
|
animation-delay: 0.2s; |
|
|
animation-delay: 0.2s; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.dot:nth-child(3) { |
|
|
.dot:nth-child(3) { |
|
|
animation-delay: 0.4s; |
|
|
animation-delay: 0.4s; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.dot:nth-child(4) { |
|
|
.dot:nth-child(4) { |
|
|
animation-delay: 0.6s; |
|
|
animation-delay: 0.6s; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.dot:nth-child(5) { |
|
|
.dot:nth-child(5) { |
|
|
animation-delay: 0.8s; |
|
|
animation-delay: 0.8s; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.dot:nth-child(6) { |
|
|
.dot:nth-child(6) { |
|
|
animation-delay: 1s; |
|
|
animation-delay: 1s; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@keyframes loading { |
|
|
@keyframes loading { |
|
|
|
|
|
|
|
|
0%, |
|
|
0%, |
|
|
60%, |
|
|
60%, |
|
|
100% { |
|
|
100% { |
|
|
opacity: 0.4; |
|
|
opacity: 0.4; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
30% { |
|
|
30% { |
|
|
opacity: 1; |
|
|
opacity: 1; |
|
|
} |
|
|
} |
|
|