|
@@ -29,7 +29,8 @@
|
|
|
@click="setCocoQuickTab('course')">{{ lang.ssAiChatQuickTabCourse }}</button>
|
|
@click="setCocoQuickTab('course')">{{ lang.ssAiChatQuickTabCourse }}</button>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="coco-quick-list">
|
|
<div class="coco-quick-list">
|
|
|
- <button type="button" class="coco-quick-action" v-if="cocoQuickTab === 'page'" @click="sendQuickAction(lang.ssAiChatQuickAction3)">
|
|
|
|
|
|
|
+ <button type="button" class="coco-quick-action" v-if="cocoQuickTab === 'page'"
|
|
|
|
|
+ @click="sendQuickAction(lang.ssAiChatQuickAction3)">
|
|
|
<span class="coco-quick-action-copy">
|
|
<span class="coco-quick-action-copy">
|
|
|
<span class="coco-quick-action-title">{{ lang.ssAiChatQuickGenChoicesTitle }}</span>
|
|
<span class="coco-quick-action-title">{{ lang.ssAiChatQuickGenChoicesTitle }}</span>
|
|
|
<span class="coco-quick-action-desc">{{ lang.ssAiChatQuickGenChoicesDesc }}</span>
|
|
<span class="coco-quick-action-desc">{{ lang.ssAiChatQuickGenChoicesDesc }}</span>
|
|
@@ -43,7 +44,8 @@
|
|
|
</span>
|
|
</span>
|
|
|
</button>
|
|
</button>
|
|
|
|
|
|
|
|
- <!-- <button type="button" class="coco-quick-action" v-if="cocoQuickTab === 'page'" @click="sendQuickAction(lang.ssAiChatQuickAction4)">
|
|
|
|
|
|
|
+ <button type="button" class="coco-quick-action" v-if="cocoQuickTab === 'page'"
|
|
|
|
|
+ @click="sendQuickAction(lang.ssAiChatQuickAction4)">
|
|
|
<span class="coco-quick-action-copy">
|
|
<span class="coco-quick-action-copy">
|
|
|
<span class="coco-quick-action-title">{{ lang.ssAiChatQuickGenWebTitle }}</span>
|
|
<span class="coco-quick-action-title">{{ lang.ssAiChatQuickGenWebTitle }}</span>
|
|
|
<span class="coco-quick-action-desc">{{ lang.ssAiChatQuickGenWebDesc }}</span>
|
|
<span class="coco-quick-action-desc">{{ lang.ssAiChatQuickGenWebDesc }}</span>
|
|
@@ -55,18 +57,20 @@
|
|
|
<path d="M13 5l7 7-7 7"></path>
|
|
<path d="M13 5l7 7-7 7"></path>
|
|
|
</svg>
|
|
</svg>
|
|
|
</span>
|
|
</span>
|
|
|
- </button> -->
|
|
|
|
|
- <button type="button" class="coco-quick-action" v-if="cocoQuickTab === 'course'" @click="sendQuickAction(lang.ssAiChatQuickAction5)">
|
|
|
|
|
- <span class="coco-quick-action-copy">
|
|
|
|
|
- <span class="coco-quick-action-title">{{ lang.ssAiChatQuickRecommendToolsTitle }}</span>
|
|
|
|
|
- <span class="coco-quick-action-desc">{{ lang.ssAiChatQuickRecommendToolsDesc }}</span>
|
|
|
|
|
- </span>
|
|
|
|
|
- <span class="coco-quick-action-arrow">
|
|
|
|
|
- <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
|
|
|
- <path d="M5 12h14"></path>
|
|
|
|
|
- <path d="M13 5l7 7-7 7"></path>
|
|
|
|
|
- </svg>
|
|
|
|
|
- </span>
|
|
|
|
|
|
|
+ </button>
|
|
|
|
|
+ <button type="button" class="coco-quick-action" v-if="cocoQuickTab === 'course'"
|
|
|
|
|
+ @click="sendQuickAction(lang.ssAiChatQuickAction5)">
|
|
|
|
|
+ <span class="coco-quick-action-copy">
|
|
|
|
|
+ <span class="coco-quick-action-title">{{ lang.ssAiChatQuickRecommendToolsTitle }}</span>
|
|
|
|
|
+ <span class="coco-quick-action-desc">{{ lang.ssAiChatQuickRecommendToolsDesc }}</span>
|
|
|
|
|
+ </span>
|
|
|
|
|
+ <span class="coco-quick-action-arrow">
|
|
|
|
|
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
|
|
|
|
|
+ stroke-linecap="round" stroke-linejoin="round">
|
|
|
|
|
+ <path d="M5 12h14"></path>
|
|
|
|
|
+ <path d="M13 5l7 7-7 7"></path>
|
|
|
|
|
+ </svg>
|
|
|
|
|
+ </span>
|
|
|
</button>
|
|
</button>
|
|
|
<!-- <button type="button" class="coco-quick-action" v-if="cocoQuickTab === 'course'">
|
|
<!-- <button type="button" class="coco-quick-action" v-if="cocoQuickTab === 'course'">
|
|
|
<span class="coco-quick-action-copy">
|
|
<span class="coco-quick-action-copy">
|
|
@@ -115,8 +119,24 @@
|
|
|
</circle>
|
|
</circle>
|
|
|
</svg>
|
|
</svg>
|
|
|
<button class="confirm-btn" :class="{ disabled: message.jsonData?.isGenerate }"
|
|
<button class="confirm-btn" :class="{ disabled: message.jsonData?.isGenerate }"
|
|
|
- v-if="message.jsonData?.gType !== 'chat' && !message.chatloading && message.aiContent"
|
|
|
|
|
|
|
+ v-if="message.jsonData?.gType !== 'chat' && message.jsonData?.gType !== 'generate_h5page' && !message.chatloading && message.aiContent"
|
|
|
@click="generate(message)">{{ message.gLoading ? lang.ssLoading : lang.ssConfirm }}</button>
|
|
@click="generate(message)">{{ message.gLoading ? lang.ssLoading : lang.ssConfirm }}</button>
|
|
|
|
|
+ <button type="button" class="coco-interactive-web-card"
|
|
|
|
|
+ v-if="message.jsonData?.gType === 'generate_h5page' && !message.chatloading" :class="{ 'loading-state': create_app_loading }" @click="!create_app_loading && handle_add_aiWeb()">
|
|
|
|
|
+ <div class="submenu-icon loading-icon" v-show="create_app_loading">
|
|
|
|
|
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="spin">
|
|
|
|
|
+ <circle cx="12" cy="12" r="10" stroke-dasharray="32" stroke-dashoffset="12"></circle>
|
|
|
|
|
+ </svg>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="coco-interactive-web-card-head">
|
|
|
|
|
+ <div class="coco-interactive-web-card-title">{{ lang.ssInteractiveWebTitle }}</div>
|
|
|
|
|
+ <!-- <span class="coco-interactive-web-card-status">待确认</span> -->
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="coco-interactive-web-card-desc">{{ lang.ssInteractiveWebDesc }}</div>
|
|
|
|
|
+ <div class="coco-interactive-web-card-foot">
|
|
|
|
|
+ <span class="coco-interactive-web-card-action">{{ lang.ssOpenWorkspace }}</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </button>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
@@ -135,8 +155,8 @@
|
|
|
</button>
|
|
</button>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
- <textarea class="ai-input" :placeholder="lang.ssAiChatShortcut"
|
|
|
|
|
- v-model="inputText" @keyup.enter.exact="sendMessage" rows="5" />
|
|
|
|
|
|
|
+ <textarea class="ai-input" :placeholder="lang.ssAiChatShortcut" v-model="inputText"
|
|
|
|
|
+ @keyup.enter.exact="sendMessage" rows="5" />
|
|
|
<div class="input-actions">
|
|
<div class="input-actions">
|
|
|
<FileInput accept="*" @change="handleFileUpload">
|
|
<FileInput accept="*" @change="handleFileUpload">
|
|
|
<button class="attach-btn">
|
|
<button class="attach-btn">
|
|
@@ -178,6 +198,9 @@
|
|
|
@click="sendQuickAction(action)">{{ action }}</button>
|
|
@click="sendQuickAction(action)">{{ action }}</button>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+
|
|
|
|
|
+ <AiWeb :visible="showAiWebModal" :web-id="webId" @close="showAiWebModal = false" @add="addAiWeb" :is-loading="isLoading" />
|
|
|
|
|
+
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
@@ -191,6 +214,7 @@ import { getWorkPageId } from '@/services/course'
|
|
|
import FileInput from '@/components/FileInput2.vue'
|
|
import FileInput from '@/components/FileInput2.vue'
|
|
|
import axios from '@/services/config'
|
|
import axios from '@/services/config'
|
|
|
import message from '@/utils/message'
|
|
import message from '@/utils/message'
|
|
|
|
|
+import AiWeb from './aiWeb.vue'
|
|
|
|
|
|
|
|
interface ChatMessage {
|
|
interface ChatMessage {
|
|
|
uid?: string
|
|
uid?: string
|
|
@@ -235,8 +259,10 @@ interface ChatMessage {
|
|
|
|
|
|
|
|
const props = withDefaults(defineProps<{
|
|
const props = withDefaults(defineProps<{
|
|
|
userid?: string | null
|
|
userid?: string | null
|
|
|
|
|
+ userJson?: any
|
|
|
}>(), {
|
|
}>(), {
|
|
|
userid: null,
|
|
userid: null,
|
|
|
|
|
+ userJson: null,
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
@@ -405,7 +431,7 @@ const gType = ref('chat')
|
|
|
|
|
|
|
|
const sendAction = async (action: string) => {
|
|
const sendAction = async (action: string) => {
|
|
|
const md = new MarkdownIt()
|
|
const md = new MarkdownIt()
|
|
|
- if (gType.value === 'chat') {
|
|
|
|
|
|
|
+ if (gType.value === 'chat' || gType.value === 'generate_h5page') {
|
|
|
const result = chat_no_stream(action, agentid1.value, props.userid || '', lang.lang)
|
|
const result = chat_no_stream(action, agentid1.value, props.userid || '', lang.lang)
|
|
|
noStreamController.value = result
|
|
noStreamController.value = result
|
|
|
console.log(result)
|
|
console.log(result)
|
|
@@ -424,12 +450,36 @@ const sendAction = async (action: string) => {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// generate_qa // generate_choice_question // generate_photo // generate_poll
|
|
// generate_qa // generate_choice_question // generate_photo // generate_poll
|
|
|
- if (gType.value !== 'chat') {
|
|
|
|
|
|
|
+ if (gType.value !== 'chat' && gType.value !== 'generate_h5page') {
|
|
|
messages.value.at(-1).jsonData = {
|
|
messages.value.at(-1).jsonData = {
|
|
|
gType: gType.value,
|
|
gType: gType.value,
|
|
|
isGenerate: false
|
|
isGenerate: false
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ else if (gType.value === 'generate_h5page') {
|
|
|
|
|
+ messages.value.at(-1).jsonData = {
|
|
|
|
|
+ gType: gType.value,
|
|
|
|
|
+ isGenerate: false
|
|
|
|
|
+ }
|
|
|
|
|
+ messages.value.at(-1).aiContent = lang.ssInteractiveWebWorkspaceDesc
|
|
|
|
|
+ messages.value.at(-1).loading = false
|
|
|
|
|
+ messages.value.at(-1).chatloading = false
|
|
|
|
|
+ chatLoading.value = false
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (content.includes(lang.ssAiChatQuickGenWebTitle)) {
|
|
|
|
|
+ messages.value.at(-1).jsonData = {
|
|
|
|
|
+ gType: 'generate_h5page',
|
|
|
|
|
+ isGenerate: false
|
|
|
|
|
+ }
|
|
|
|
|
+ messages.value.at(-1).aiContent = lang.ssInteractiveWebWorkspaceDesc
|
|
|
|
|
+ messages.value.at(-1).loading = false
|
|
|
|
|
+ chatLoading.value = false
|
|
|
|
|
+ messages.value.at(-1).chatloading = false
|
|
|
|
|
+
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
|
messages.value.at(-1).jsonData = {
|
|
messages.value.at(-1).jsonData = {
|
|
@@ -666,7 +716,80 @@ const setCocoQuickTab = (tab: string) => {
|
|
|
cocoQuickTab.value = tab
|
|
cocoQuickTab.value = tab
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// AI Web 相关状态
|
|
|
|
|
+const create_app_loading = ref(false)
|
|
|
|
|
+const webId = ref('')
|
|
|
|
|
+const showAiWebModal = ref(false)
|
|
|
|
|
+const isEdit = ref(false)
|
|
|
|
|
+import { storeToRefs } from 'pinia'
|
|
|
|
|
+import _ from 'lodash'
|
|
|
|
|
+const { currentSlide } = storeToRefs(slidesStore)
|
|
|
|
|
+
|
|
|
|
|
+const handle_add_aiWeb = _.throttle(async () => {
|
|
|
|
|
+ create_app_loading.value = true
|
|
|
|
|
+ try {
|
|
|
|
|
+ const elements = currentSlide.value?.elements || []
|
|
|
|
|
+ console.log(elements)
|
|
|
|
|
+ const existingWebElement = elements.find((el: any) => el.toolType === 73 && el.webId && el.type === 'frame')
|
|
|
|
|
+
|
|
|
|
|
+ if (existingWebElement && existingWebElement.webId) {
|
|
|
|
|
+ webId.value = existingWebElement.webId
|
|
|
|
|
+ create_app_loading.value = false
|
|
|
|
|
+ showAiWebModal.value = true
|
|
|
|
|
+ isEdit.value = true
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ const res = await axios.post('https://appapi.cocorobo.cn/api/agents/ai_edit', {
|
|
|
|
|
+ userid: props.userid || '',
|
|
|
|
|
+ username: props.userJson.name || '',
|
|
|
|
|
+ muti_name: lang.ssAddWebH5,
|
|
|
|
|
+ description: lang.ssAddWebH5,
|
|
|
|
|
+ headUrl: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E9%BB%98%E8%AE%A4%E5%A4%B4%E5%83%8F51741770599274.svg',
|
|
|
|
|
+ organizeid: props.userJson.organizeid || '',
|
|
|
|
|
+ content: ''
|
|
|
|
|
+ })
|
|
|
|
|
+ console.log(res)
|
|
|
|
|
+ webId.value = res.id || ''
|
|
|
|
|
|
|
|
|
|
+ create_app_loading.value = false
|
|
|
|
|
+ showAiWebModal.value = true
|
|
|
|
|
+ }
|
|
|
|
|
+ catch (error) {
|
|
|
|
|
+ console.log(error)
|
|
|
|
|
+ create_app_loading.value = false
|
|
|
|
|
+ }
|
|
|
|
|
+}, 3000)
|
|
|
|
|
+
|
|
|
|
|
+const isLoading = ref(false)
|
|
|
|
|
+import useImport from '@/hooks/useImport'
|
|
|
|
|
+const { uploadFileToS3 } = useImport()
|
|
|
|
|
+
|
|
|
|
|
+const addAiWeb = async (code: string) => {
|
|
|
|
|
+ if (!code) return
|
|
|
|
|
+ const file = new File([code], 'index.html', { type: 'text/html' })
|
|
|
|
|
+ isLoading.value = true
|
|
|
|
|
+ const url = await uploadFileToS3(file)
|
|
|
|
|
+ if (isEdit.value) {
|
|
|
|
|
+ const elements = currentSlide.value?.elements || []
|
|
|
|
|
+ const frameElement = elements.find((el: any) => el.type === 'frame' && (el.toolType === 73))
|
|
|
|
|
+ if (frameElement) {
|
|
|
|
|
+ slidesStore.updateElement({
|
|
|
|
|
+ id: frameElement.id,
|
|
|
|
|
+ props: { url: url }
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ else {
|
|
|
|
|
+ createSlide()
|
|
|
|
|
+ createFrameElement(url, 73, webId.value)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ isLoading.value = false
|
|
|
|
|
+ showAiWebModal.value = false
|
|
|
|
|
+ webId.value = ''
|
|
|
|
|
+ isEdit.value = false
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
onMounted(() => {
|
|
|
session_name.value = uuidv4()
|
|
session_name.value = uuidv4()
|
|
@@ -1100,11 +1223,13 @@ ul {
|
|
|
|
|
|
|
|
.coco-collapse-body {
|
|
.coco-collapse-body {
|
|
|
padding: 0px 14px 14px;
|
|
padding: 0px 14px 14px;
|
|
|
|
|
+
|
|
|
.coco-quick-tabs {
|
|
.coco-quick-tabs {
|
|
|
display: grid;
|
|
display: grid;
|
|
|
grid-template-columns: repeat(2, minmax(0px, 1fr));
|
|
grid-template-columns: repeat(2, minmax(0px, 1fr));
|
|
|
margin-bottom: 12px;
|
|
margin-bottom: 12px;
|
|
|
gap: 8px;
|
|
gap: 8px;
|
|
|
|
|
+
|
|
|
.coco-quick-tab {
|
|
.coco-quick-tab {
|
|
|
height: 34px;
|
|
height: 34px;
|
|
|
color: rgb(124, 92, 56);
|
|
color: rgb(124, 92, 56);
|
|
@@ -1118,6 +1243,7 @@ ul {
|
|
|
border-image: initial;
|
|
border-image: initial;
|
|
|
background: rgb(250, 247, 242);
|
|
background: rgb(250, 247, 242);
|
|
|
transition: 0.2s;
|
|
transition: 0.2s;
|
|
|
|
|
+
|
|
|
&.active {
|
|
&.active {
|
|
|
color: rgb(154, 91, 17);
|
|
color: rgb(154, 91, 17);
|
|
|
box-shadow: rgba(247, 139, 34, 0.12) 0px 8px 18px;
|
|
box-shadow: rgba(247, 139, 34, 0.12) 0px 8px 18px;
|
|
@@ -1131,6 +1257,7 @@ ul {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
flex-direction: column;
|
|
|
gap: 8px;
|
|
gap: 8px;
|
|
|
|
|
+
|
|
|
.coco-quick-action {
|
|
.coco-quick-action {
|
|
|
width: 100%;
|
|
width: 100%;
|
|
|
display: flex;
|
|
display: flex;
|
|
@@ -1146,24 +1273,26 @@ ul {
|
|
|
border-radius: 14px;
|
|
border-radius: 14px;
|
|
|
padding: 12px;
|
|
padding: 12px;
|
|
|
transition: 0.2s;
|
|
transition: 0.2s;
|
|
|
|
|
+
|
|
|
.coco-quick-action-copy {
|
|
.coco-quick-action-copy {
|
|
|
min-width: 0px;
|
|
min-width: 0px;
|
|
|
display: flex;
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
flex-direction: column;
|
|
|
flex: 1 1 0%;
|
|
flex: 1 1 0%;
|
|
|
gap: 4px;
|
|
gap: 4px;
|
|
|
|
|
+
|
|
|
.coco-quick-action-title {
|
|
.coco-quick-action-title {
|
|
|
- font-size: 13px;
|
|
|
|
|
- font-weight: 700;
|
|
|
|
|
- color: rgb(17, 24, 39);
|
|
|
|
|
- line-height: 1.4;
|
|
|
|
|
|
|
+ font-size: 13px;
|
|
|
|
|
+ font-weight: 700;
|
|
|
|
|
+ color: rgb(17, 24, 39);
|
|
|
|
|
+ line-height: 1.4;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
.coco-quick-action-desc {
|
|
.coco-quick-action-desc {
|
|
|
- font-size: 12px;
|
|
|
|
|
- line-height: 1.6;
|
|
|
|
|
- color: rgb(139, 115, 86);
|
|
|
|
|
|
|
+ font-size: 12px;
|
|
|
|
|
+ line-height: 1.6;
|
|
|
|
|
+ color: rgb(139, 115, 86);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -1179,6 +1308,87 @@ ul {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+.coco-interactive-web-card {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ margin-top: 10px;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ text-align: left;
|
|
|
|
|
+ cursor: pointer;
|
|
|
|
|
+ border-width: 1px;
|
|
|
|
|
+ border-style: solid;
|
|
|
|
|
+ border-color: rgb(247, 197, 143);
|
|
|
|
|
+ border-image: initial;
|
|
|
|
|
+ border-radius: 14px;
|
|
|
|
|
+ background: linear-gradient(rgb(255, 250, 243) 0%, rgb(255, 255, 255) 100%);
|
|
|
|
|
+ padding: 12px 14px;
|
|
|
|
|
+ gap: 8px;
|
|
|
|
|
+ transition: 0.2s;
|
|
|
|
|
+ position: relative;
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+
|
|
|
|
|
+ &.loading-state {
|
|
|
|
|
+ opacity: 0.7;
|
|
|
|
|
+ cursor: not-allowed;
|
|
|
|
|
+ pointer-events: none;
|
|
|
|
|
+
|
|
|
|
|
+ .submenu-icon {
|
|
|
|
|
+ animation: pulse 1s infinite;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .spin {
|
|
|
|
|
+ animation: spin 1s linear infinite;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .submenu-icon {
|
|
|
|
|
+ position: absolute;
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ height: 100%;
|
|
|
|
|
+ background: #00000026;
|
|
|
|
|
+ top: 0;
|
|
|
|
|
+ left: 0;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+
|
|
|
|
|
+ svg {
|
|
|
|
|
+ height: 30px;
|
|
|
|
|
+ color: #fff;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .coco-interactive-web-card-head,
|
|
|
|
|
+ .coco-interactive-web-card-foot {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: space-between;
|
|
|
|
|
+ gap: 10px;
|
|
|
|
|
+
|
|
|
|
|
+ .coco-interactive-web-card-title {
|
|
|
|
|
+ min-width: 0px;
|
|
|
|
|
+ font-size: 14px;
|
|
|
|
|
+ font-weight: 700;
|
|
|
|
|
+ color: rgb(17, 24, 39);
|
|
|
|
|
+ line-height: 1.4;
|
|
|
|
|
+ flex: 1 1 0%;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .coco-interactive-web-card-action {
|
|
|
|
|
+ margin-left: auto;
|
|
|
|
|
+ font-size: 12px;
|
|
|
|
|
+ font-weight: 700;
|
|
|
|
|
+ color: rgb(240, 120, 21);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .coco-interactive-web-card-desc {
|
|
|
|
|
+ font-size: 12px;
|
|
|
|
|
+ color: rgb(107, 114, 128);
|
|
|
|
|
+ line-height: 1.6;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
</style>
|
|
</style>
|
|
|
|
|
|
|
|
<style>
|
|
<style>
|