This commit is contained in:
zlwu committed 2026-05-26 19:04:27 +08:00
1 parent 4a00f21bfb
commit edf88dc016
1503 files changed
+329728 -41987

No files matched your search

@@ -1,10 +1,6 @@
<!-- 弹窗正文:加载中显示 v-loading,避免 dialog-form-layout 先小后大 -->
<template>
<div
class="dialog-form-body"
:class="bodyClass"
v-loading="loading"
>
<div class="dialog-form-body" :class="bodyClass" v-loading="loading">
<slot />
</div>
</template>
@@ -1,6 +1,10 @@
<template>
<teleport to="body">
<div v-show="visibleProxy" class="order-operate-bridge-layer" @click.self="visibleProxy = false">
<div
v-show="visibleProxy"
class="order-operate-bridge-layer"
@click.self="visibleProxy = false"
>
<div class="order-operate-bridge-dialog">
<iframe ref="frameRef" class="order-operate-bridge-frame" :src="frameSrc" frameborder="0" />
</div>
@@ -1,7 +1,12 @@
<template>
<teleport to="body">
<div v-show="visibleProxy" class="order-operate-local-layer" @click.self="visibleProxy = false">
<iframe class="order-operate-local-frame" :src="frameSrc" frameborder="0" allowtransparency="true" />
<iframe
class="order-operate-local-frame"
:src="frameSrc"
frameborder="0"
allowtransparency="true"
/>
</div>
</teleport>
</template>
File diff suppressed because it is too large. Load diff
@@ -32,7 +32,9 @@
header-align="center"
show-overflow-tooltip
>
<template #default="{ row }">{{ row.productCode || row.outputBarcode || '—' }}</template>
<template #default="{ row }">{{
row.productCode || row.outputBarcode || '—'
}}</template>
</el-table-column>
<el-table-column
label="产品名称"
@@ -67,11 +69,18 @@
<el-table-column label="储物格位置" min-width="160" align="center" header-align="center">
<template #default="{ row }">{{ row.storageSlotName || '—' }}</template>
</el-table-column>
<el-table-column label="预计细胞数量(亿)" min-width="130" align="center" header-align="center">
<el-table-column
label="预计细胞数量(亿)"
min-width="130"
align="center"
header-align="center"
>
<template #default="{ row }">{{ row.expectedCellCount ?? '—' }}</template>
</el-table-column>
<el-table-column label="活性" min-width="80" align="center" header-align="center">
<template #default="{ row }">{{ row.viability != null ? row.viability : '—' }}</template>
<template #default="{ row }">{{
row.viability != null ? row.viability : '—'
}}</template>
</el-table-column>
<el-table-column label="冻存日期" min-width="110" align="center" header-align="center">
<template #default="{ row }">{{ formatDateOnly(row.freezeDate) }}</template>
@@ -82,7 +91,13 @@
<el-table-column label="数量" min-width="80" align="center" header-align="center">
<template #default="{ row }">{{ row.quantity ?? '—' }}</template>
</el-table-column>
<el-table-column prop="unit" label="单位" min-width="70" align="center" header-align="center" />
<el-table-column
prop="unit"
label="单位"
min-width="70"
align="center"
header-align="center"
/>
<el-table-column label="状态" min-width="90" align="center" header-align="center">
<template #default="{ row }">
<el-tag :type="productStatusTagType(row.productStatus)" size="small">
@@ -103,10 +118,7 @@
import SystemViewDialog from '@/components/business/system-view-dialog/index.vue'
import type { ViewSection } from '@/components/business/system-view-dialog/index.vue'
import { fetchProductionTaskDetail } from '@/api/production-task'
import {
productionConclusionLabel,
productionConclusionTagType
} from '@/utils/production-labels'
import { productionConclusionLabel, productionConclusionTagType } from '@/utils/production-labels'
const props = defineProps<{
visible: boolean
@@ -78,14 +78,7 @@
<script setup lang="ts">
import { ElMessage } from 'element-plus'
import {
Plus,
Document,
Delete,
Download,
Loading,
VideoPlay
} from '@element-plus/icons-vue'
import { Plus, Document, Delete, Download, Loading, VideoPlay } from '@element-plus/icons-vue'
import { fetchUploadAttachment } from '@/api/business'
import { downloadAttachmentFile } from '@/utils/download-attachment'
import type { FinanceAttachmentItem } from './finance-attachments'
@@ -31,35 +31,35 @@
<template #material-usages>
<div v-if="viewMaterialUsages.length" class="view-subtable-wrap">
<el-table :data="viewMaterialUsages" stripe class="list-table view-subtable">
<el-table-column
type="index"
label="序号"
min-width="56"
align="center"
header-align="center"
:index="(index) => index + 1"
/>
<el-table-column
prop="materialName"
label="物料名称"
min-width="160"
align="center"
header-align="center"
/>
<el-table-column label="规格型号" min-width="120" align="center" header-align="center">
<template #default="{ row }">{{ row.specModel || '—' }}</template>
</el-table-column>
<el-table-column label="用量" min-width="100" align="center" header-align="center">
<template #default="{ row }">
{{ row.qty != null && row.qty !== '' ? row.qty : '—' }}
</template>
</el-table-column>
<el-table-column label="单位" min-width="72" align="center" header-align="center">
<template #default="{ row }">{{ row.unit || '—' }}</template>
</el-table-column>
<el-table-column label="备注" min-width="140" align="center" header-align="center">
<template #default="{ row }">{{ row.remark || '—' }}</template>
</el-table-column>
<el-table-column
type="index"
label="序号"
min-width="56"
align="center"
header-align="center"
:index="(index) => index + 1"
/>
<el-table-column
prop="materialName"
label="物料名称"
min-width="160"
align="center"
header-align="center"
/>
<el-table-column label="规格型号" min-width="120" align="center" header-align="center">
<template #default="{ row }">{{ row.specModel || '—' }}</template>
</el-table-column>
<el-table-column label="用量" min-width="100" align="center" header-align="center">
<template #default="{ row }">
{{ row.qty != null && row.qty !== '' ? row.qty : '—' }}
</template>
</el-table-column>
<el-table-column label="单位" min-width="72" align="center" header-align="center">
<template #default="{ row }">{{ row.unit || '—' }}</template>
</el-table-column>
<el-table-column label="备注" min-width="140" align="center" header-align="center">
<template #default="{ row }">{{ row.remark || '—' }}</template>
</el-table-column>
</el-table>
</div>
<p v-else class="view-empty-hint">暂无物料使用记录</p>
@@ -275,7 +275,10 @@
{ label: '样本编码', value: r.sampleCode || d.sampleCode || '—' },
{
label: '样本来源',
value: r.sourceTypeLabel || d.receptionSourceLabel || receptionSourceLabel(d.receptionSource || ''),
value:
r.sourceTypeLabel ||
d.receptionSourceLabel ||
receptionSourceLabel(d.receptionSource || ''),
tagType: 'primary'
},
{ label: '样本类型', value: r.sampleTypeName || d.sampleTypeName || '—' }
@@ -299,8 +302,7 @@
{
label: '结论',
value:
r.acceptConclusionLabel ||
acceptConclusionLabel(String(r.acceptConclusion || ''))
r.acceptConclusionLabel || acceptConclusionLabel(String(r.acceptConclusion || ''))
},
{ label: '检查项', value: formatCheckResults(r.checkResults), span: true },
{ label: '备注', value: r.remark || '—', span: true }
@@ -353,14 +355,27 @@
title: '任务信息',
fields: [
{ label: '任务号', value: d.taskNo },
{ label: '业务类型', value: d.qcBizTypeLabel || qcBizTypeLabel(d.qcBizType || ''), tagType: qcBizTypeTagType(d.qcBizType || '') },
{
label: '业务类型',
value: d.qcBizTypeLabel || qcBizTypeLabel(d.qcBizType || ''),
tagType: qcBizTypeTagType(d.qcBizType || '')
},
{ label: '工单号', value: d.workOrderNo || '—' },
{
label: '工单状态',
value: d.workOrderStatus ? workOrderStatusLabel(d.workOrderStatus) : '—',
tagType: d.workOrderStatus === 'ywc' ? 'success' : d.workOrderStatus === 'ypz' ? 'warning' : 'info'
tagType:
d.workOrderStatus === 'ywc'
? 'success'
: d.workOrderStatus === 'ypz'
? 'warning'
: 'info'
},
{
label: '检测类型',
value: taskTypeLabel(d.taskType),
tagType: d.taskType === 'sysz' ? 'success' : 'info'
},
{ label: '检测类型', value: taskTypeLabel(d.taskType), tagType: d.taskType === 'sysz' ? 'success' : 'info' },
{ label: '检测项目', value: d.itemName },
{ label: '项目编码', value: d.itemCode || '—' },
{ label: '第三方公司', value: d.companyName || '—' },
@@ -422,5 +437,4 @@
}
}
}
</style>
@@ -74,7 +74,11 @@
</div>
</div>
<div class="production-task-card__foot">
<button type="button" class="production-task-card__link" @click.stop="openTaskView(task)">
<button
type="button"
class="production-task-card__link"
@click.stop="openTaskView(task)"
>
点击查看详情
</button>
</div>
@@ -95,10 +99,7 @@
<script setup lang="ts">
import { ref } from 'vue'
import ProductionTaskViewDialog from '@/components/business/production-task-view-dialog/index.vue'
import {
productionConclusionLabel,
productionConclusionTagType
} from '@/utils/production-labels'
import { productionConclusionLabel, productionConclusionTagType } from '@/utils/production-labels'
export type ProductionTaskInput = {
inputType?: string
@@ -21,7 +21,9 @@
<span class="qc-kv__label">工单状态</span>
<span class="qc-kv__value">
<el-tag :type="workOrderStatusTagType(qcInfo.workOrderStatus || '')" size="small">
{{ qcInfo.workOrderStatusLabel || workOrderStatusLabel(qcInfo.workOrderStatus || '') }}
{{
qcInfo.workOrderStatusLabel || workOrderStatusLabel(qcInfo.workOrderStatus || '')
}}
</el-tag>
</span>
</div>
@@ -78,12 +80,7 @@
</div>
</div>
<div
v-else-if="qcInfo.workOrderStatus !== 'dpz'"
class="sample-qc-hint"
>
暂无检测任务
</div>
<div v-else-if="qcInfo.workOrderStatus !== 'dpz'" class="sample-qc-hint"> 暂无检测任务 </div>
</template>
<Teleport to="body">
@@ -44,7 +44,9 @@
>
<dt>{{ field.label }}</dt>
<dd>
<el-tag v-if="field.tagType" :type="field.tagType" size="small">{{ field.value ?? '—' }}</el-tag>
<el-tag v-if="field.tagType" :type="field.tagType" size="small">{{
field.value ?? '—'
}}</el-tag>
<ul v-else-if="field.items?.length" class="view-plain-list">
<li v-for="(item, idx) in field.items" :key="idx">{{ item }}</li>
</ul>
@@ -153,9 +155,7 @@
})
/** 须为 @element-plus/icons-vue 组件;字符串或未传时使用默认 Document */
const iconComponent = computed(() =>
isIconComponent(props.icon) ? props.icon : Document
)
const iconComponent = computed(() => (isIconComponent(props.icon) ? props.icon : Document))
const heroMeta = computed(() => {
if (props.meta) return props.meta
@@ -23,7 +23,9 @@
</el-form-item>
</el-form>
<template #footer>
<el-button class="btn-ghost" @click="handleClose"><el-icon><Close /></el-icon>取消</el-button>
<el-button class="btn-ghost" @click="handleClose"
><el-icon><Close /></el-icon>取消</el-button
>
<el-button class="btn-main" type="primary" :loading="submitting" @click="handleSubmit">
<el-icon><Check /></el-icon>保存
</el-button>
@@ -12,69 +12,65 @@
</template>
<script setup lang="ts">
import {
formatMoneyDisplay,
parseMoneyToNumber,
sanitizeMoneyInput,
} from '@/utils/money-format'
import { formatMoneyDisplay, parseMoneyToNumber, sanitizeMoneyInput } from '@/utils/money-format'
defineOptions({ name: 'AmountInput' })
defineOptions({ name: 'AmountInput' })
interface Props {
modelValue: number | null
min?: number
max?: number
precision?: number
placeholder?: string
disabled?: boolean
clearable?: boolean
}
interface Props {
modelValue: number | null
min?: number
max?: number
precision?: number
placeholder?: string
disabled?: boolean
clearable?: boolean
}
const props = withDefaults(defineProps<Props>(), {
min: undefined,
max: undefined,
precision: 2,
placeholder: '',
disabled: false,
clearable: true,
})
const props = withDefaults(defineProps<Props>(), {
min: undefined,
max: undefined,
precision: 2,
placeholder: '',
disabled: false,
clearable: true
})
const emit = defineEmits<{
'update:modelValue': [value: number | null]
change: [value: number | null]
}>()
const emit = defineEmits<{
'update:modelValue': [value: number | null]
change: [value: number | null]
}>()
const displayText = ref('')
const isFocused = ref(false)
const displayText = ref('')
const isFocused = ref(false)
watch(
() => props.modelValue,
(val) => {
if (!isFocused.value) {
displayText.value = formatMoneyDisplay(val, props.precision)
}
},
{ immediate: true }
)
watch(
() => props.modelValue,
(val) => {
if (!isFocused.value) {
displayText.value = formatMoneyDisplay(val, props.precision)
}
},
{ immediate: true }
)
function handleFocus() {
isFocused.value = true
displayText.value = sanitizeMoneyInput(displayText.value, props.precision)
}
function handleFocus() {
isFocused.value = true
displayText.value = sanitizeMoneyInput(displayText.value, props.precision)
}
function handleInput(val: string) {
displayText.value = sanitizeMoneyInput(val, props.precision)
}
function handleInput(val: string) {
displayText.value = sanitizeMoneyInput(val, props.precision)
}
function handleBlur() {
isFocused.value = false
let num = parseMoneyToNumber(displayText.value, props.precision)
if (num !== null) {
if (props.min !== undefined && num < props.min) num = props.min
if (props.max !== undefined && num > props.max) num = props.max
function handleBlur() {
isFocused.value = false
let num = parseMoneyToNumber(displayText.value, props.precision)
if (num !== null) {
if (props.min !== undefined && num < props.min) num = props.min
if (props.max !== undefined && num > props.max) num = props.max
}
emit('update:modelValue', num)
emit('change', num)
displayText.value = formatMoneyDisplay(num, props.precision)
}
emit('update:modelValue', num)
emit('change', num)
displayText.value = formatMoneyDisplay(num, props.precision)
}
</script>
@@ -1,12 +1,7 @@
<!-- 系统logo -->
<template>
<div class="flex-cc">
<img
:style="logoStyle"
src="/logo.png"
alt="中科兴皖"
class="block object-contain"
/>
<img :style="logoStyle" src="/logo.png" alt="中科兴皖" class="block object-contain" />
</div>
</template>
@@ -138,7 +138,10 @@
// 自定义上传
if (props.uploadConfig?.isCustomUpload && props.uploadConfig?.server && editorConfig.MENU_CONF) {
editorConfig.MENU_CONF.uploadImage.customUpload = async (file: File, insertFn: InsertFnType) => {
editorConfig.MENU_CONF.uploadImage.customUpload = async (
file: File,
insertFn: InsertFnType
) => {
try {
const formData = new FormData()
formData.append(mergedUploadConfig.value.fieldName, file)
@@ -147,7 +150,7 @@
url: props.uploadConfig?.server,
data: formData,
headers: {
'Content-Type':'multipart/form-data',
'Content-Type': 'multipart/form-data',
Authorization: userStore.accessToken
}
})
@@ -21,7 +21,7 @@
<template #default>
<div class="pt-3">
<div class="flex-c pb-1 px-0">
<el-avatar :size="40" :src="avatarDisplayUrl" style="margin-right: 12px;">
<el-avatar :size="40" :src="avatarDisplayUrl" style="margin-right: 12px">
{{ userInfo.realName?.charAt(0) || userInfo.username?.charAt(0) || '管' }}
</el-avatar>
<div class="w-[calc(100%-60px)] h-full">
@@ -110,57 +110,57 @@
</script>
<style scoped lang="scss">
.user-avatar-wrapper {
cursor: pointer;
margin-right: 5px;
background-color: #fff;
border-radius: 50%;
padding: 2px;
.user-avatar-wrapper {
cursor: pointer;
margin-right: 5px;
background-color: #fff;
border-radius: 50%;
padding: 2px;
&:hover {
opacity: 0.8;
}
}
.btn-item {
display: flex;
align-items: center;
padding: 8px;
margin-bottom: 12px;
border-radius: 6px;
cursor: pointer;
user-select: none;
transition: background-color 0.2s;
span {
font-size: 14px;
&:hover {
opacity: 0.8;
}
}
.art-svg-icon {
margin-right: 8px;
font-size: 16px;
.btn-item {
display: flex;
align-items: center;
padding: 8px;
margin-bottom: 12px;
border-radius: 6px;
cursor: pointer;
user-select: none;
transition: background-color 0.2s;
span {
font-size: 14px;
}
.art-svg-icon {
margin-right: 8px;
font-size: 16px;
}
&:hover {
background-color: var(--art-gray-200);
}
&:last-child {
margin-bottom: 0;
}
}
&:hover {
background-color: var(--art-gray-200);
}
.log-out {
padding: 6px;
margin-top: 20px;
text-align: center;
font-size: 12px;
border: 1px solid var(--art-gray-400);
border-radius: 6px;
transition: all 0.2s;
&:last-child {
margin-bottom: 0;
&:hover {
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
}
}
.log-out {
padding: 6px;
margin-top: 20px;
text-align: center;
font-size: 12px;
border: 1px solid var(--art-gray-400);
border-radius: 6px;
transition: all 0.2s;
&:hover {
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
}
</style>
@@ -60,11 +60,7 @@
</ul>
</ElScrollbar>
<ArtIconButton
class="switch-btn size-10"
icon="sort"
@click="toggleDualMenuMode"
/>
<ArtIconButton class="switch-btn size-10" icon="sort" @click="toggleDualMenuMode" />
</div>
<!-- 左侧菜单 || 双列菜单(右侧) -->
@@ -119,10 +115,7 @@
<!-- 双列菜单右侧折叠按钮 -->
<div class="dual-menu-collapse-btn" v-if="isDualMenu" @click="toggleMenuVisibility">
<ArtSvgIcon
class="text-g-500/70"
:icon="menuOpen ? 'arrow-left' : 'arrow-right'"
/>
<ArtSvgIcon class="text-g-500/70" :icon="menuOpen ? 'arrow-left' : 'arrow-right'" />
</div>
<div
@@ -443,9 +436,21 @@
@use './theme';
.layout-sidebar {
// 展开的宽度
.el-menu:not(.el-menu--collapse) {
// 侧栏容器宽度固定,内部菜单可横向滚动
.menu-left-open {
width: v-bind(menuopenwidth);
flex-shrink: 0;
}
.menu-left-close {
width: v-bind(menuclosewidth);
flex-shrink: 0;
}
// 展开的宽度:侧栏容器固定,菜单内容可随长标题撑开并横向滚动
.el-menu:not(.el-menu--collapse) {
width: max-content;
min-width: v-bind(menuopenwidth);
}
// 折叠后宽度
@@ -99,8 +99,23 @@
position: relative;
box-sizing: border-box;
height: 100vh;
overflow: hidden;
background: var(--mint-surface, #fff);
// 长菜单名完整展示:侧栏宽度不变,内容区可横向滚动
:deep(.el-scrollbar__wrap) {
overflow-x: auto !important;
}
:deep(.el-scrollbar__view) {
width: max-content;
min-width: 100%;
}
:deep(.el-scrollbar__bar.is-horizontal) {
height: 4px;
}
@media only screen and (width <= 640px) {
height: 100dvh;
}
@@ -10,9 +10,10 @@ $popup-menu-padding: 8px;
$popup-menu-margin: 5px;
$popup-menu-radius: 6px;
// 通用菜单项样式
// 通用菜单项样式(min-width 保证短标题仍铺满侧栏;width: max-content 允许长标题撑开以配合横向滚动)
@mixin menu-item-base {
width: calc(100% - 12px);
width: max-content;
min-width: calc(100% - 12px);
margin-left: 6px;
border-radius: 8px;
@@ -143,8 +144,10 @@ $popup-menu-radius: 6px;
height: $menu-height !important;
margin-bottom: 2px;
line-height: $menu-height !important;
overflow: visible !important;
span {
.menu-name {
flex-shrink: 0;
font-size: $menu-font-size !important;
font-weight: 500;
// Fresh Mint:默认菜单项为中性色(demo `.nav a`)
@@ -152,8 +155,7 @@ $popup-menu-radius: 6px;
text-rendering: geometricprecision;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
@include ellipsis();
white-space: nowrap;
}
}
@@ -45,7 +45,7 @@
>{{ item.label }}</span
>
<ArtSvgIcon
icon="arrow-right"
icon="arrow-right"
class="ubmenu-arrow ml-auto mr-0 text-base text-g-500 transition-transform duration-150"
/>
</div>
@@ -79,10 +79,7 @@
class="drag-icon mr-2 h-4.5 flex-cc text-g-500"
:class="item.fixed ? 'cursor-default text-g-300' : 'cursor-move'"
>
<ArtSvgIcon
:icon="item.fixed ? 'close' : 'rank'"
class="text-base"
/>
<ArtSvgIcon :icon="item.fixed ? 'close' : 'rank'" class="text-base" />
</div>
<ElCheckbox
:model-value="getColumnVisibility(item)"
@@ -27,7 +27,12 @@
<ElIcon :size="16"><ArrowLeft /></ElIcon>
<span>{{ backText }}</span>
</ElButton>
<ElButton type="primary" size="large" class="exception-page__btn-home" @click="backHome">
<ElButton
type="primary"
size="large"
class="exception-page__btn-home"
@click="backHome"
>
<ElIcon :size="16"><HomeFilled /></ElIcon>
<span>{{ homeText }}</span>
</ElButton>
@@ -7,113 +7,188 @@
xmlns="http://www.w3.org/2000/svg"
aria-hidden="true"
>
<template v-if="variant === 'forbidden'">
<rect x="48" y="52" width="224" height="156" rx="16" fill="var(--mint-primary-bg)" />
<rect x="48" y="52" width="224" height="156" rx="16" stroke="var(--mint-border)" stroke-width="2" />
<path
d="M160 88c-14.9 0-27 12.1-27 27v12h54v-12c0-14.9-12.1-27-27-27Z"
fill="#fff"
stroke="var(--mint-primary-dark)"
stroke-width="2"
stroke-linejoin="round"
/>
<rect
x="118"
y="127"
width="84"
height="58"
rx="10"
fill="#fff"
stroke="var(--mint-primary-dark)"
stroke-width="2"
/>
<circle cx="160" cy="156" r="10" fill="var(--mint-primary-bg)" stroke="var(--mint-primary)" stroke-width="2" />
<path
d="M160 162v8"
stroke="var(--mint-primary-dark)"
stroke-width="2.5"
stroke-linecap="round"
/>
<path
d="M96 118h128"
stroke="var(--mint-border)"
stroke-width="2"
stroke-linecap="round"
stroke-dasharray="6 6"
/>
<circle cx="248" cy="72" r="22" fill="var(--mint-primary)" opacity="0.15" />
<path
d="M248 64v16M240 72h16"
stroke="var(--mint-primary-dark)"
stroke-width="2.5"
stroke-linecap="round"
/>
</template>
<template v-if="variant === 'forbidden'">
<rect x="48" y="52" width="224" height="156" rx="16" fill="var(--mint-primary-bg)" />
<rect
x="48"
y="52"
width="224"
height="156"
rx="16"
stroke="var(--mint-border)"
stroke-width="2"
/>
<path
d="M160 88c-14.9 0-27 12.1-27 27v12h54v-12c0-14.9-12.1-27-27-27Z"
fill="#fff"
stroke="var(--mint-primary-dark)"
stroke-width="2"
stroke-linejoin="round"
/>
<rect
x="118"
y="127"
width="84"
height="58"
rx="10"
fill="#fff"
stroke="var(--mint-primary-dark)"
stroke-width="2"
/>
<circle
cx="160"
cy="156"
r="10"
fill="var(--mint-primary-bg)"
stroke="var(--mint-primary)"
stroke-width="2"
/>
<path
d="M160 162v8"
stroke="var(--mint-primary-dark)"
stroke-width="2.5"
stroke-linecap="round"
/>
<path
d="M96 118h128"
stroke="var(--mint-border)"
stroke-width="2"
stroke-linecap="round"
stroke-dasharray="6 6"
/>
<circle cx="248" cy="72" r="22" fill="var(--mint-primary)" opacity="0.15" />
<path
d="M248 64v16M240 72h16"
stroke="var(--mint-primary-dark)"
stroke-width="2.5"
stroke-linecap="round"
/>
</template>
<template v-else-if="variant === 'not-found'">
<circle cx="160" cy="120" r="78" fill="var(--mint-primary-bg)" />
<circle cx="160" cy="120" r="78" stroke="var(--mint-border)" stroke-width="2" />
<path
d="M160 62v24M160 154v24M82 120h24M214 120h24"
stroke="var(--mint-primary)"
stroke-width="2"
stroke-linecap="round"
opacity="0.45"
/>
<circle cx="160" cy="120" r="34" fill="#fff" stroke="var(--mint-primary-dark)" stroke-width="2" />
<path
d="M148 120c0-6.6 5.4-12 12-12s12 5.4 12 12-5.4 12-12 12"
stroke="var(--mint-primary-dark)"
stroke-width="2.5"
stroke-linecap="round"
/>
<circle cx="172" cy="108" r="3" fill="var(--mint-primary-dark)" />
<path
d="M72 188c18-10 38-15 88-15s70 5 88 15"
stroke="var(--mint-primary)"
stroke-width="2"
stroke-linecap="round"
opacity="0.35"
/>
<rect x="208" y="48" width="56" height="36" rx="8" fill="#fff" stroke="var(--mint-border)" stroke-width="2" />
<path
d="M220 66h32M220 58h20"
stroke="var(--mint-text-muted)"
stroke-width="2"
stroke-linecap="round"
/>
</template>
<template v-else-if="variant === 'not-found'">
<circle cx="160" cy="120" r="78" fill="var(--mint-primary-bg)" />
<circle cx="160" cy="120" r="78" stroke="var(--mint-border)" stroke-width="2" />
<path
d="M160 62v24M160 154v24M82 120h24M214 120h24"
stroke="var(--mint-primary)"
stroke-width="2"
stroke-linecap="round"
opacity="0.45"
/>
<circle
cx="160"
cy="120"
r="34"
fill="#fff"
stroke="var(--mint-primary-dark)"
stroke-width="2"
/>
<path
d="M148 120c0-6.6 5.4-12 12-12s12 5.4 12 12-5.4 12-12 12"
stroke="var(--mint-primary-dark)"
stroke-width="2.5"
stroke-linecap="round"
/>
<circle cx="172" cy="108" r="3" fill="var(--mint-primary-dark)" />
<path
d="M72 188c18-10 38-15 88-15s70 5 88 15"
stroke="var(--mint-primary)"
stroke-width="2"
stroke-linecap="round"
opacity="0.35"
/>
<rect
x="208"
y="48"
width="56"
height="36"
rx="8"
fill="#fff"
stroke="var(--mint-border)"
stroke-width="2"
/>
<path
d="M220 66h32M220 58h20"
stroke="var(--mint-text-muted)"
stroke-width="2"
stroke-linecap="round"
/>
</template>
<template v-else>
<rect x="56" y="64" width="208" height="128" rx="14" fill="var(--mint-primary-bg)" />
<rect x="56" y="64" width="208" height="128" rx="14" stroke="var(--mint-border)" stroke-width="2" />
<rect x="76" y="84" width="168" height="18" rx="6" fill="#fff" stroke="var(--mint-border)" stroke-width="1.5" />
<rect x="76" y="112" width="120" height="12" rx="4" fill="#fff" stroke="var(--mint-border)" stroke-width="1.5" />
<rect x="76" y="132" width="148" height="12" rx="4" fill="#fff" stroke="var(--mint-border)" stroke-width="1.5" />
<rect x="76" y="152" width="96" height="12" rx="4" fill="#fff" stroke="var(--mint-border)" stroke-width="1.5" />
<circle cx="228" cy="92" r="5" fill="var(--mint-primary)" />
<circle cx="244" cy="92" r="5" fill="#fbbf24" />
<circle cx="260" cy="92" r="5" fill="#f87171" />
<path
d="M248 176l18-30 18 30"
stroke="var(--mint-primary-dark)"
stroke-width="2.5"
stroke-linecap="round"
stroke-linejoin="round"
/>
<path
d="M266 176v14H230v-14"
stroke="var(--mint-primary-dark)"
stroke-width="2.5"
stroke-linecap="round"
stroke-linejoin="round"
/>
<path
d="M160 44l8 14h16l-13 10 5 14-16-11-16 11 5-14-13-10h16l8-14Z"
fill="var(--mint-primary)"
opacity="0.85"
/>
</template>
<template v-else>
<rect x="56" y="64" width="208" height="128" rx="14" fill="var(--mint-primary-bg)" />
<rect
x="56"
y="64"
width="208"
height="128"
rx="14"
stroke="var(--mint-border)"
stroke-width="2"
/>
<rect
x="76"
y="84"
width="168"
height="18"
rx="6"
fill="#fff"
stroke="var(--mint-border)"
stroke-width="1.5"
/>
<rect
x="76"
y="112"
width="120"
height="12"
rx="4"
fill="#fff"
stroke="var(--mint-border)"
stroke-width="1.5"
/>
<rect
x="76"
y="132"
width="148"
height="12"
rx="4"
fill="#fff"
stroke="var(--mint-border)"
stroke-width="1.5"
/>
<rect
x="76"
y="152"
width="96"
height="12"
rx="4"
fill="#fff"
stroke="var(--mint-border)"
stroke-width="1.5"
/>
<circle cx="228" cy="92" r="5" fill="var(--mint-primary)" />
<circle cx="244" cy="92" r="5" fill="#fbbf24" />
<circle cx="260" cy="92" r="5" fill="#f87171" />
<path
d="M248 176l18-30 18 30"
stroke="var(--mint-primary-dark)"
stroke-width="2.5"
stroke-linecap="round"
stroke-linejoin="round"
/>
<path
d="M266 176v14H230v-14"
stroke="var(--mint-primary-dark)"
stroke-width="2.5"
stroke-linecap="round"
stroke-linejoin="round"
/>
<path
d="M160 44l8 14h16l-13 10 5 14-16-11-16 11 5-14-13-10h16l8-14Z"
fill="var(--mint-primary)"
opacity="0.85"
/>
</template>
</svg>
</template>
@@ -25,10 +25,7 @@
</div>
</div>
<div class="btn palette-btn relative z-[2] h-8 w-8 c-p flex-cc tad-300">
<ArtSvgIcon
icon="brush"
class="text-xl text-g-800 transition-colors duration-300"
/>
<ArtSvgIcon icon="brush" class="text-xl text-g-800 transition-colors duration-300" />
</div>
</div>
<ElDropdown
@@ -62,7 +59,7 @@
@click="themeAnimation"
>
<ArtSvgIcon
:icon="isDark ? 'sunny' : 'moon'"
:icon="isDark ? 'sunny' : 'moon'"
class="text-xl text-g-800 transition-colors duration-300"
/>
</div>