| | |
| | | <template> |
| | | <div class="relative h100" v-loading="loadingData" :style="`width: ${rightBox}px;transition: 0.7s ease-in;`"> |
| | | <div class="retract_icon" @click="toggleShow"> |
| | | <div class="retract_icon" @click="toggleShow" v-if="!isSharePage"> |
| | | <i class="text-[#fff] transition-all" :class="isShow ? 'ywifont ywicon-zuoyoujiantou1' : 'ywifont ywicon-zuoyoujiantou'"></i> |
| | | </div> |
| | | <div class="pc-mouldboard column exampleSlide"> |
| | | <div class="header flex items-center justify-center"> |
| | | <div |
| | | class="box-border flex w-[203px] h-[32px] rounded-md items-center justify-between cursor-pointer relative border border-solid border-[#2c2d33]" |
| | | > |
| | | <div |
| | | class="tabbar-item" |
| | | :class="state.activeName === item.ID ? 'set-tabbar-active' : ''" |
| | | @click="handleTabClick(item)" |
| | | v-for="item in state.tabNameList" |
| | | :key="item.ID" |
| | | > |
| | | {{ item.Name }} |
| | | </div> |
| | | </div> |
| | | <i |
| | | class="ywifont ywicon-guanbi text-[#999] text-[18px] absolute right-[14px] top-5 cursor-pointer" |
| | | @click="handleCloseTemplate" |
| | | ></i> |
| | | </div> |
| | | |
| | | <div class="box-border w-[354px] flex-1 min-h-0 bg-[#e0e7fb]" v-show="state.activeName == 1"> |
| | | <div class="flex flex-col w100 h100 pt-0 pr-[15px] pb-0 pl-[20px] overflow-auto"> |
| | | <div class="box-border w-[354px] flex-1 min-h-0 bg-[#e0e7fb]" v-show="activeGroupType"> |
| | | <div class="flex flex-col w100 h100 pt-0 pr-[15px] pb-0 pl-[20px]"> |
| | | <div class="flex items-center w100 h-[30px] border border-solid border-[#b2b2b2] transition-[border-color 1s] rounded-2xl"> |
| | | <el-input v-model="queryParams.sample_title" placeholder="搜索更多" class="set-input" :prefix-icon="Search" clearable> |
| | | </el-input> |
| | | <el-input v-model="searchValue" placeholder="搜索更多" class="set-input" :prefix-icon="Search" clearable> </el-input> |
| | | </div> |
| | | <div class="mt20 w100 relative" v-show="state.customTagList.length > 0"> |
| | | <div |
| | | class="overflow-hidden max-h-[36px] transition-[max-height 0.2s] w100 flex flex-wrap text-xs leading-[14px] m-[-5px]" |
| | | :class="{ 'set-expand-active': state.isShowExpand }" |
| | | > |
| | | <div |
| | | v-for="item in state.customTagList" |
| | | :key="item.group_id" |
| | | :class="{ 'set-label-active': state.activeLabelName === item.group_id }" |
| | | @click="handleLabelClick(item)" |
| | | class="cursor-pointer m-[5px] py-[5px] px-[10px] rounded-xl border border-solid border-[#b2b2b2] bg-[#e0e7f] text-[#4c4c4c] transition-[background-color .1s, color .1s, border-color .1s]" |
| | | > |
| | | {{ item.section_name }} |
| | | <div class="mt10 w100 h100 relative" v-show="allData[activeGroupType]"> |
| | | <div class="set_custom_label"> |
| | | <div class="chanel-tags"> |
| | | <div |
| | | v-for="(item, index) in allData[activeGroupType]" |
| | | :key="index" |
| | | :class="{ 'set-group-label-active': activeMainScene[activeGroupType] === item.group_id }" |
| | | class="flex items-center border border-solid border-[#b2b2b2] rounded-xl mx-[3px] leading-6" |
| | | @click="handleBusinessClick(item)" |
| | | > |
| | | <span class="set-group-name">{{ item.group_name }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="bg-[#e0e7fb] absolute right-0 top-0 text-[#131313] w-[30px] h-[26px] cursor-pointer flex items-center"> |
| | | <i class="myiconfont icon-bolangneng" title="展开" @click="handleExpandClick(1)" v-show="!state.isShowExpand"></i> |
| | | <i class="myiconfont icon-zhongduancanshu" title="收缩" @click="handleExpandClick(2)" v-show="state.isShowExpand"></i> |
| | | <div |
| | | class="overflow-hidden min-h-[34px] transition-[max-height 0.2s] w100 flex flex-wrap text-xs leading-[14px] items-center bg-[#f5f7fd]" |
| | | > |
| | | <div |
| | | v-for="(itemChildren, index) in state.customBusinessChildList" |
| | | :key="index" |
| | | :class="{ 'set-label-active': state.activeBusinessChildName === itemChildren.group_id }" |
| | | @click="handleLabelChildClick(itemChildren)" |
| | | class="cursor-pointer m-[5px] py-[5px] pl-[10px] rounded-xl border transition-[background-color .1s, color .1s, border-color .1s] text-[#999]" |
| | | > |
| | | {{ itemChildren.group_name }} |
| | | </div> |
| | | </div> |
| | | <div class="mt20 w100"> |
| | | <div class="mt10 overflow-auto set-height-custom" v-if="activeGroupType !== '办公助手'"> |
| | | <div class="w100 pb-[20px]" v-for="item in finalSampleList" :key="item.sample_id"> |
| | | <div |
| | | class="cursor-pointer flex box-border p-[12px] w100 rounded bg-[#f5f7fd] transition-[background-color .2s]" |
| | |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="box-border w-[354px] flex-1 min-h-0 bg-[#e0e7fb]" v-show="state.activeName == 2"> |
| | | <div class="flex flex-col w100 h100 pt-0 pr-[15px] pb-0 pl-[20px] overflow-auto"> |
| | | <div class="flex items-center w100 h-[30px] border border-solid border-[#b2b2b2] transition-[border-color 1s] rounded-2xl"> |
| | | <el-input v-model="instructParams.template_title" placeholder="搜索更多" class="set-input" :prefix-icon="Search" clearable> |
| | | </el-input> |
| | | </div> |
| | | <div class="mt20 w100 relative" v-show="state.customOfficeList.length > 0"> |
| | | <div |
| | | class="overflow-hidden max-h-[36px] transition-[max-height 0.2s] w100 flex flex-wrap text-xs leading-[14px] m-[-5px]" |
| | | :class="{ 'set-expand-active': state.isShowExpand }" |
| | | > |
| | | <div |
| | | v-for="item in state.customOfficeList" |
| | | :key="item.template_id" |
| | | :class="{ 'set-label-active': state.activeInstructName === item.template_id }" |
| | | @click="handleInstructClick(item)" |
| | | class="cursor-pointer m-[5px] py-[5px] px-[10px] rounded-xl border border-solid border-[#b2b2b2] bg-[#e0e7f] text-[#4c4c4c] transition-[background-color .1s, color .1s, border-color .1s]" |
| | | > |
| | | {{ item.section_name }} |
| | | </div> |
| | | </div> |
| | | <div class="bg-[#e0e7fb] absolute right-0 top-0 text-[#131313] w-[30px] h-[26px] cursor-pointer flex items-center"> |
| | | <i class="myiconfont icon-bolangneng" title="展开" @click="handleExpandClick(1)" v-show="!state.isShowExpand"></i> |
| | | <i class="myiconfont icon-zhongduancanshu" title="收缩" @click="handleExpandClick(2)" v-show="state.isShowExpand"></i> |
| | | </div> |
| | | <div class="mt20 w100"> |
| | | <div class="w100 pb-[20px] flex overflow-auto flex-col" v-for="item in showInstructList" :key="item.template_id"> |
| | | <div class="mt10 w100 overflow-auto set-height-custom" v-else> |
| | | <div class="w100 pb-[20px] flex flex-col" v-for="item in finalSampleList" :key="item.sample_id"> |
| | | <div class="bg-[#f5f7fd] p-[12px] transition-[background-color .2s] flex flex-col rounded-2xl"> |
| | | <div class="flex justify-between"> |
| | | <span class="set-title">{{ item.template_title }}</span> |
| | | <span class="set-title">{{ item.sample_title }}</span> |
| | | </div> |
| | | <div class="example-body ellipsis">{{ item.template_value }}</div> |
| | | <div class="example-body ellipsis">{{ item.sample_question }}</div> |
| | | <div class="example-bottom"> |
| | | <span class="example-item">{{ item.template_type }}</span> |
| | | <el-button type="primary" class="set-button" @click="templateUseClick(item)">使用</el-button> |
| | |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="mt10 w100" v-show="finalSampleList?.length == 0"><el-empty description="暂无数据" /></div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <el-dialog v-model="state.useInstructDialog" :title="state.instructInfo?.template_title" width="500" :before-close="handleClose"> |
| | | <el-dialog v-model="state.useInstructDialog" :title="state.instructInfo?.sample_title" width="500" :before-close="handleClose"> |
| | | <el-input v-model="state.inputInstruct" :rows="10" type="textarea"></el-input> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | |
| | | <script setup lang="ts"> |
| | | import { Search } from '@element-plus/icons-vue'; |
| | | import { computed, reactive, ref, watch } from 'vue'; |
| | | import { getSectionList, getSelectSample, getUserTemplateList } from '/@/api/ai/chat'; |
| | | import { useSearch } from '/@/hooks/useSearch'; |
| | | import { activeRoomId, activeSampleId, activeSectionAId, sectionAList, setRoomConfig } from '/@/stores/chatRoom'; |
| | | import { debounce } from '/@/utils/util'; |
| | | import { |
| | | activeGroupType, |
| | | activeRoomId, |
| | | activeSampleId, |
| | | activeSectionAId, |
| | | exampleSceneList, |
| | | isSharePage, |
| | | sceneGroupList, |
| | | setRoomConfig, |
| | | } from '/@/stores/chatRoom'; |
| | | import { convertListToTree } from '/@/utils/util'; |
| | | import { groupBy } from 'lodash-es'; |
| | | let state = reactive({ |
| | | tabNameList: [ |
| | | { ID: 1, Name: '提问示例' }, |
| | | { ID: 2, Name: '指令模板' }, |
| | | ], |
| | | activeName: 1, |
| | | |
| | | activeLabelName: 'knowledge_base', //默认选择第一个 |
| | | activeInstructName: 'office_assistant', //默认选择第一个 |
| | | isShowExpand: false, |
| | | activeBusinessName: '', //场景 |
| | | activeBusinessChildName: '', |
| | | customBusinessList: [], |
| | | customBusinessChildList: [], |
| | | activeOfficeName: '', //办公 |
| | | activeOfficeChildName: '', |
| | | customOfficeList: [], |
| | | customOfficeChildList: [], |
| | | activeKnowledgeName: '', //知识库 |
| | | activeKnowledgeChildName: '', |
| | | knowledgeBaseList: [], |
| | | customKnowledgeChildList: [], |
| | | useInstructDialog: false, |
| | | instructInfo: {}, |
| | | inputInstruct: '', //可修改指令 |
| | | exampleRandomContent: [], |
| | | exampleContent: [], |
| | | listSampleLoading: false, |
| | | listInstructLoading: false, |
| | | listSampleExpand: false, |
| | | listInstructExpand: false, |
| | | customTagList: [], |
| | | customOfficeList: [], |
| | | sampleMap: {}, |
| | | }); |
| | | const instructContentList = ref([]); //指令列表 |
| | | const exampleList = ref([]); //示例列表 |
| | | |
| | | //#region ====================== 传参 ====================== |
| | | const isShow = defineModel('isShow', { |
| | | type: Boolean, |
| | | }); |
| | | |
| | | const emit = defineEmits(['updateChatInput']); |
| | | const rightBox = computed(() => (isShow.value ? 354 : 0)); |
| | | |
| | | //获取模版列表 |
| | | const getSelectListSample = async () => { |
| | | state.listSampleLoading = true; |
| | | const res = await getSelectSample({}).finally(() => { |
| | | state.listSampleLoading = false; |
| | | }); |
| | | console.log(res, 63); |
| | | state.exampleRandomContent = res.samples; |
| | | |
| | | const array = []; |
| | | res.samples.forEach((sample, index) => { |
| | | sample.Icon = '/static/images/wave/ChatImg.png'; |
| | | sample.BgColor = randomHexColor(); |
| | | if (index < 4) { |
| | | array.push(sample); |
| | | } |
| | | }); |
| | | exampleList.value = res.samples; |
| | | |
| | | state.exampleContent = array; |
| | | }; |
| | | //随机生成颜色 |
| | | const randomHexColor = () => { |
| | | return `#${Math.floor(Math.random() * 16777215) |
| | | .toString(16) |
| | | .padEnd(6, '0')}`; |
| | | }; |
| | | const emit = defineEmits(['updateChatInput']); |
| | | //#endregion |
| | | //#region ====================== 业务场景/知识库的list ====================== |
| | | const loadingData = ref(false); |
| | | const changeExample = (item) => { |
| | | emit('updateChatInput', item.sample_question); |
| | | setRoomConfig(activeRoomId.value, 'isAnswerByLLM', false); |
| | | activeSampleId.value = item.sample_id; |
| | | activeSectionAId.value = item.section_a_id; |
| | | activeSectionAId.value = item.group_id; |
| | | }; |
| | | //获取用户模板 |
| | | const getUserTemplate = async () => { |
| | | state.listInstructLoading = true; |
| | | const res = await getUserTemplateList().finally(() => { |
| | | state.listInstructLoading = false; |
| | | }); |
| | | instructContentList.value = res.templates; |
| | | }; |
| | | //切换到指令/提问 |
| | | const handleTabClick = (item) => { |
| | | state.activeName = item.ID; |
| | | getTableData(); |
| | | }; |
| | | //标签点击事件(提问示例) |
| | | const handleLabelClick = (item) => { |
| | | state.activeLabelName = item.group_id; |
| | | }; |
| | | //标签点击事件(指令模板) |
| | | const handleInstructClick = (item) => { |
| | | state.activeInstructName = item.group_id; |
| | | }; |
| | | |
| | | //展开收起 |
| | | const handleExpandClick = (type) => { |
| | | if (type == 1) { |
| | | state.isShowExpand = true; |
| | | } else { |
| | | state.isShowExpand = false; |
| | | } |
| | | }; |
| | | const toggleShow = async () => { |
| | | isShow.value = !isShow.value; |
| | | if (!isShow.value) { |
| | | loadingData.value = true; |
| | | await getMainSectionList().finally(() => { |
| | | loadingData.value = false; |
| | | }); |
| | | |
| | | getTableData(); |
| | | } |
| | | }; |
| | | const getMainSectionList = async () => { |
| | | const res = await getSectionList(); |
| | | const iconList = [ |
| | | 'biaodan', |
| | | 'putong', |
| | | 'zhongduancanshuchaxun', |
| | | 'shidu', |
| | | 'fuwenbenkuang', |
| | | 'fuwenben', |
| | | 'jiliandongxuanzeqi', |
| | | 'jinridaiban', |
| | | 'gongju', |
| | | ]; |
| | | res.sections.forEach((sectionItem, index) => { |
| | | sectionItem.Icon = iconList[index]; |
| | | }); |
| | | sectionAList.value = res.sections; |
| | | }; |
| | | const loadingData = ref(false); |
| | | const getTableData = async () => { |
| | | loadingData.value = true; |
| | | |
| | | try { |
| | | if (state.activeName == 1) { |
| | | if (state.listSampleExpand) return; |
| | | await getSelectListSample(); |
| | | state.listSampleExpand = true; |
| | | } |
| | | if (state.activeName == 2) { |
| | | if (state.listInstructExpand) return; |
| | | await getUserTemplate(); |
| | | state.listInstructExpand = true; |
| | | } |
| | | } finally { |
| | | loadingData.value = false; |
| | | } |
| | | }; |
| | | //关闭高级示例 |
| | | const handleCloseTemplate = () => { |
| | | isShow.value = false; |
| | | }; |
| | | //#region ====================== templateUseClick ====================== |
| | | //#endregion |
| | | //#region ====================== 办公助手使用 ====================== |
| | | const templateUseClick = (row) => { |
| | | state.useInstructDialog = true; |
| | | state.instructInfo = row; |
| | | state.inputInstruct = row.template_value; |
| | | }; |
| | | const handleClose = () => { |
| | | state.useInstructDialog = false; |
| | | state.inputInstruct = row.sample_question; |
| | | }; |
| | | const submitInstruct = () => { |
| | | setRoomConfig(activeRoomId.value, 'isAnswerByLLM', true); |
| | |
| | | handleClose(); |
| | | }; |
| | | //#endregion |
| | | //#region ====================== 搜索模板/指令 ====================== |
| | | const queryParams = ref({ |
| | | sample_title: '', |
| | | }); |
| | | const { query: querySample, queryData: showSampleList } = useSearch(exampleList, queryParams); |
| | | const debounceQuery = debounce(querySample); |
| | | const finalSampleList = computed(() => { |
| | | const result = showSampleList.value.filter((item) => item.section_a_id == state.activeLabelName); |
| | | return result; |
| | | }); |
| | | |
| | | watch( |
| | | () => queryParams.value.sample_title, |
| | | (val) => { |
| | | debounceQuery(); |
| | | } |
| | | ); |
| | | //指令 |
| | | const instructParams = ref({ |
| | | template_title: '', |
| | | }); |
| | | const { query: queryInstruct, queryData: showInstructList } = useSearch(instructContentList, instructParams); |
| | | |
| | | const instructQuery = debounce(queryInstruct); |
| | | |
| | | watch( |
| | | () => instructParams.value.template_title, |
| | | (val) => { |
| | | instructQuery(); |
| | | } |
| | | ); |
| | | //#endregion |
| | | |
| | | //#region ====================== 获取tag ====================== |
| | | |
| | | const tagListClick = (val) => { |
| | | if (val.length > 0) { |
| | | const selectTagList = []; |
| | | const officeList = []; |
| | | val.forEach((item) => { |
| | | if (item.group_id != 'office_assistant') { |
| | | selectTagList.push(item); |
| | | } else { |
| | | officeList.push(item); |
| | | } |
| | | }); |
| | | state.customTagList = selectTagList; |
| | | state.customOfficeList = officeList; |
| | | //#region ====================== 打开示例 ====================== |
| | | //打开高级示例 |
| | | const toggleShow = async () => { |
| | | isShow.value = !isShow.value; |
| | | getTableData(); |
| | | }; |
| | | //关闭高级示例 |
| | | const handleCloseTemplate = () => { |
| | | isShow.value = false; |
| | | }; |
| | | const handleClose = () => { |
| | | state.useInstructDialog = false; |
| | | }; |
| | | const handleBusinessClick = (item) => { |
| | | activeMainScene.value[activeGroupType.value] = item.group_id; |
| | | state.customBusinessChildList = item.children; |
| | | state.activeBusinessChildName = item.children[0]?.group_id; |
| | | if (!state.activeBusinessChildName) { |
| | | finalSampleList.value = []; |
| | | } else { |
| | | state.customTagList = []; |
| | | state.customOfficeList = []; |
| | | finalSampleList.value = searchFilterSampleList(state.sampleMap[state.activeBusinessChildName]); |
| | | } |
| | | }; |
| | | |
| | | watch( |
| | | () => sectionAList.value, |
| | | (val) => { |
| | | tagListClick(val); |
| | | }, |
| | | { |
| | | immediate: true, |
| | | } |
| | | ); |
| | | |
| | | const handleLabelChildClick = (item) => { |
| | | state.activeBusinessChildName = item.group_id; |
| | | finalSampleList.value = searchFilterSampleList(state.sampleMap[state.activeBusinessChildName]); |
| | | }; |
| | | //#endregion |
| | | //#region ====================== 默认选择第一个的场景的子场景 ====================== |
| | | const allData = ref({}); |
| | | const activeMainScene = ref({}); |
| | | const activeSubScene = ref({}); |
| | | const allSubScene = ref([]); |
| | | const searchValue = ref(''); |
| | | const finalSampleList = ref([]); //搜索过滤后的示例列表 |
| | | const getTableData = async () => { |
| | | const res = await sceneGroupList.value; |
| | | let groupDataByType = groupBy(res ?? [], (item) => item.group_type); |
| | | for (const key in groupDataByType) { |
| | | if (Object.prototype.hasOwnProperty.call(groupDataByType, key)) { |
| | | const value = groupDataByType[key]; |
| | | const newValue = convertListToTree(value ?? [], { |
| | | ID: 'group_id', |
| | | ParentID: 'p_group_id', |
| | | Children: 'children', |
| | | }); |
| | | groupDataByType[key] = newValue; |
| | | } |
| | | } |
| | | const keys = Object.keys(groupDataByType); |
| | | if (keys.includes('业务场景')) { |
| | | const value = groupDataByType['业务场景']; |
| | | //有业务场景,业务场景放第一 |
| | | groupDataByType = { |
| | | 业务场景: value, |
| | | ...groupDataByType, |
| | | }; |
| | | } |
| | | allData.value = groupDataByType; |
| | | const typeArr = Object.keys(allData.value); |
| | | let subSceneList = []; |
| | | |
| | | if (activeGroupType.value) { |
| | | // 初始化激活 mainScene |
| | | activeMainScene.value = typeArr.reduce((preVal, curVal) => { |
| | | const mainSceneList = allData.value[curVal]; |
| | | // 设置第一个激活 |
| | | preVal[curVal] = mainSceneList?.[0]?.group_id; |
| | | // 初始化激活 subScene |
| | | mainSceneList.map((item, index, array) => { |
| | | if (item.children) { |
| | | subSceneList = subSceneList.concat(item.children); |
| | | } |
| | | // 设置第一个激活 |
| | | activeSubScene.value[item.group_id] = array[index].children?.[0]?.group_id; |
| | | }); |
| | | return preVal; |
| | | }, {}); |
| | | } |
| | | allSubScene.value = subSceneList; |
| | | const activeMainSceneData = allData.value[activeGroupType.value]; |
| | | const activeMainSceneId = activeMainScene.value[activeGroupType.value]; |
| | | state.activeBusinessChildName = activeSubScene.value[activeMainSceneId]; //初始化业务场景的子场景默认值 |
| | | state.customBusinessChildList = activeMainSceneData.filter((item) => item.group_id === activeMainSceneId)[0].children; |
| | | state.sampleMap = displaySampleMap(); |
| | | finalSampleList.value = searchFilterSampleList(state.sampleMap[state.activeBusinessChildName]); |
| | | }; |
| | | const displaySampleMap = () => { |
| | | const sampleMap = {}; |
| | | allSubScene.value.map(async (item) => { |
| | | const groupId = item.group_id; |
| | | sampleMap[groupId] = exampleSceneList.value.filter((item) => item.group_id === groupId); |
| | | }); |
| | | return sampleMap; |
| | | }; |
| | | |
| | | const searchFilterSampleList = (sampleList: any[]) => { |
| | | if (!searchValue.value) return sampleList; |
| | | const checkKey = ['sample_question', 'sample_title']; |
| | | const filterList = sampleList.filter((item) => { |
| | | return checkKey.some((subItem) => item[subItem].toLowerCase().trim().includes(searchValue.value.toLowerCase().trim())); |
| | | }); |
| | | return filterList; |
| | | }; |
| | | watch(activeGroupType, () => { |
| | | getTableData(); |
| | | }); |
| | | watch(searchValue, () => { |
| | | finalSampleList.value = searchFilterSampleList(state.sampleMap[state.activeBusinessChildName]); |
| | | }); |
| | | //#endregion |
| | | defineExpose({ getTableData }); |
| | | </script> |
| | | <style scoped lang="scss"> |
| | | .exampleSlide { |
| | | // position: absolute; |
| | | right: 0; |
| | | top: 0; |
| | | height: 100%; |
| | | -webkit-box-sizing: border-box; |
| | | box-sizing: border-box; |
| | | z-index: 100; |
| | | } |
| | | .set_custom_label { |
| | | min-height: 32px; |
| | | box-sizing: border-box; |
| | | // background-color: #f2f4f8; |
| | | border-bottom: 1px solid #eee; |
| | | .chanel-tags { |
| | | width: 100%; |
| | | position: relative; |
| | | overflow: hidden; |
| | | font-size: 12px; |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | line-height: 26px; |
| | | color: #999; |
| | | cursor: pointer; |
| | | box-sizing: border-box; |
| | | height: 100%; |
| | | .set-group-name { |
| | | margin: 0px 7px; |
| | | white-space: nowrap; |
| | | // border: 1px solid #999; |
| | | // border-radius: 0.75rem; |
| | | // padding: 0 6px; |
| | | // line-height: 22px; |
| | | } |
| | | } |
| | | } |
| | | .retract_icon { |
| | | width: 20px; |
| | |
| | | font-size: 14px; |
| | | -webkit-animation: right-c650b75e 0.2s; |
| | | animation: right-c650b75e 0.2s; |
| | | |
| | | overflow: hidden; |
| | | .header { |
| | | box-sizing: border-box; |
| | | width: 100%; |
| | |
| | | position: relative; |
| | | } |
| | | .tabbar-item { |
| | | width: 108px; |
| | | width: 78px; |
| | | height: 30px; |
| | | font-size: 13px; |
| | | font-weight: 400; |
| | |
| | | .set-expand-active { |
| | | max-height: 180px; |
| | | } |
| | | .set-group-label-active { |
| | | border-color: #161616; |
| | | color: #000; |
| | | } |
| | | .set-label-active { |
| | | border-color: #1c86ff; |
| | | background-color: #ccdcfb; |
| | | // background-color: #ccdcfb; |
| | | color: #1c86ff; |
| | | } |
| | | .example-body { |
| | |
| | | -webkit-box-pack: justify; |
| | | -ms-flex-pack: justify; |
| | | justify-content: space-between; |
| | | overflow: hidden; |
| | | .example-item { |
| | | background-color: #f0f2f3; |
| | | color: #8b939e; |
| | |
| | | -webkit-box-direction: normal; |
| | | -ms-flex-direction: column; |
| | | flex-direction: column; |
| | | overflow: hidden; |
| | | } |
| | | .set-height-custom { |
| | | height: calc(100% - 120px); |
| | | } |
| | | </style> |