docs: add cell storage protocol modules design for 2.2.6–2.2.10

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zlwuandCursor committed 2026-05-13 17:48:22 +08:00
1 parent 058811ae77
commit 246ad2228e
153 files changed
+20578 -2040

No files matched your search

@@ -13,7 +13,7 @@
class="fixed right-10 bottom-15 size-9.5 flex-cc c-p border border-g-300 rounded-md tad-300 hover:bg-g-200"
@click="scrollToTop"
>
<ArtSvgIcon icon="ri:arrow-up-wide-line" class="text-g-500 text-lg" />
<ArtSvgIcon icon="arrow-up" class="text-g-500 text-lg" />
</div>
</Transition>
</template>
@@ -3,8 +3,8 @@
<div class="flex-cc">
<img
:style="logoStyle"
src="/logo1.jpg"
alt="陇耘鲜达"
src="/logo.png"
alt="中科兴皖"
class="block object-contain"
/>
</div>
@@ -1,24 +1,29 @@
<!-- 图标组件 -->
<!-- 图标组件:支持 Element Plus 图标(无 : 前缀)与 Iconify 图标(含 : 前缀) -->
<template>
<Icon v-if="icon" :icon="icon" v-bind="bindAttrs" class="art-svg-icon inline" />
<el-icon v-if="epIcon" v-bind="iconAttrs" class="art-svg-icon inline">
<component :is="epIcon" />
</el-icon>
<Icon v-else-if="icon" :icon="icon" v-bind="iconAttrs" class="art-svg-icon inline" />
</template>
<script setup lang="ts">
import { Icon } from '@iconify/vue'
import { resolveEpIcon } from '@/utils/ui/ep-icon-map'
defineOptions({ name: 'ArtSvgIcon', inheritAttrs: false })
interface Props {
/** Iconify icon name */
icon?: string
}
defineProps<Props>()
const props = defineProps<Props>()
const attrs = useAttrs()
const bindAttrs = computed<{ class: string; style: string }>(() => ({
const iconAttrs = computed<{ class: string; style: string }>(() => ({
class: (attrs.class as string) || '',
style: (attrs.style as string) || ''
}))
const epIcon = computed(() => resolveEpIcon(props.icon))
</script>
@@ -27,7 +27,7 @@
>
</div>
<div v-if="showArrow">
<ArtSvgIcon icon="ri:arrow-right-s-line" class="text-xl text-g-500" />
<ArtSvgIcon icon="arrow-right" class="text-xl text-g-500" />
</div>
</div>
</template>
@@ -2,7 +2,7 @@
<template>
<div>
<ElDropdown v-if="hasAnyAuthItem">
<ArtIconButton icon="ri:more-2-fill" class="!size-8 bg-g-200 dark:bg-g-300/45 text-sm" />
<ArtIconButton icon="more-filled" class="!size-8 bg-g-200 dark:bg-g-300/45 text-sm" />
<template #dropdown>
<ElDropdownMenu>
<template v-for="item in list" :key="item.key">
@@ -36,11 +36,11 @@
// 默认按钮配置
const defaultButtons = {
add: { icon: 'ri:add-fill', class: 'bg-theme/12 text-theme' },
edit: { icon: 'ri:pencil-line', class: 'bg-secondary/12 text-secondary' },
delete: { icon: 'ri:delete-bin-5-line', class: 'bg-error/12 text-error' },
view: { icon: 'ri:eye-line', class: 'bg-info/12 text-info' },
more: { icon: 'ri:more-2-fill', class: '' }
add: { icon: 'plus', class: 'bg-theme/12 text-theme' },
edit: { icon: 'edit', class: 'bg-secondary/12 text-secondary' },
delete: { icon: 'delete', class: 'bg-error/12 text-error' },
view: { icon: 'view', class: 'bg-info/12 text-info' },
more: { icon: 'more-filled', class: '' }
} as const
// 获取图标内容
@@ -92,8 +92,8 @@
completedBg: '#57D187',
circle: false,
radius: 'calc(var(--custom-radius) / 3 + 2px)',
handlerIcon: 'solar:double-alt-arrow-right-linear',
successIcon: 'ri:check-fill',
handlerIcon: 'd-arrow-right',
successIcon: 'check',
handlerBg: '#fff',
textSize: '13px',
textColor: '#333'
@@ -77,8 +77,8 @@
</ElInput>
<div class="mt-3 flex-cb">
<div class="flex-c">
<ArtSvgIcon icon="ri:image-line" class="mr-5 c-p text-g-600 text-lg" />
<ArtSvgIcon icon="ri:emotion-happy-line" class="mr-5 c-p text-g-600 text-lg" />
<ArtSvgIcon icon="picture" class="mr-5 c-p text-g-600 text-lg" />
<ArtSvgIcon icon="smile" class="mr-5 c-p text-g-600 text-lg" />
</div>
<ElButton type="primary" @click="sendMessage" v-ripple class="min-w-20">发送</ElButton>
</div>
@@ -22,7 +22,7 @@
<div
class="h-4.5 flex-cc rounded border border-g-300 dark:!bg-g-200/50 !bg-box px-1.5 text-g-500"
>
<ArtSvgIcon icon="fluent:arrow-enter-left-20-filled" />
<ArtSvgIcon icon="select" />
</div>
</template>
</ElInput>
@@ -40,7 +40,7 @@
@mouseenter="highlightOnHover(index)"
>
{{ formatMenuTitle(item.meta.title) }}
<ArtSvgIcon v-show="isHighlighted(index)" icon="fluent:arrow-enter-left-20-filled" />
<ArtSvgIcon v-show="isHighlighted(index)" icon="select" />
</div>
</div>
</div>
@@ -65,7 +65,7 @@
class="size-5 selected-icon select-none rounded-full text-g-500 flex-cc c-p"
@click.stop="deleteHistory(index)"
>
<ArtSvgIcon icon="ri:close-large-fill" class="text-xs" />
<ArtSvgIcon icon="close-bold" class="text-xs" />
</div>
</div>
</div>
@@ -75,12 +75,12 @@
<template #footer>
<div class="dialog-footer box-border flex-c border-t-d pt-4.5 pb-1">
<div class="flex-cc">
<ArtSvgIcon icon="fluent:arrow-enter-left-20-filled" class="keyboard" />
<ArtSvgIcon icon="select" class="keyboard" />
<span class="mr-3.5 text-xs text-g-700">{{ $t('search.selectKeydown') }}</span>
</div>
<div class="flex-c">
<ArtSvgIcon icon="ri:arrow-up-wide-fill" class="keyboard" />
<ArtSvgIcon icon="ri:arrow-down-wide-fill" class="keyboard" />
<ArtSvgIcon icon="arrow-up" class="keyboard" />
<ArtSvgIcon icon="arrow-down" class="keyboard" />
<span class="mr-3.5 text-xs text-g-700">{{ $t('search.switchKeydown') }}</span>
</div>
<div class="flex-c">
@@ -29,7 +29,7 @@
<!-- 菜单按钮 -->
<ArtIconButton
v-if="isLeftMenu && shouldShowMenuButton"
icon="ri:menu-2-fill"
icon="fold"
class="ml-3 max-sm:ml-[7px]"
@click="visibleMenu"
/>
@@ -37,7 +37,7 @@
<!-- 刷新按钮 - 已隐藏 -->
<ArtIconButton
v-if="shouldShowRefreshButton"
icon="ri:refresh-line"
icon="refresh"
class="!ml-3 refresh-btn max-sm:!hidden"
:style="{ marginLeft: !isLeftMenu ? '10px' : '0' }"
@click="reload"
@@ -64,7 +64,7 @@
<!-- 全屏按钮 -->
<ArtIconButton
v-if="shouldShowFullscreen"
:icon="isFullscreen ? 'ri:fullscreen-exit-line' : 'ri:fullscreen-fill'"
:icon="isFullscreen ? 'fullscreen' : 'fullscreen'"
:class="[!isFullscreen ? 'full-screen-btn' : 'exit-full-screen-btn', 'ml-3']"
class="max-md:!hidden"
@click="toggleFullScreen"
@@ -35,11 +35,11 @@
</div>
<ul class="py-4 mt-3 border-t border-g-300/80">
<li class="btn-item">
<ArtSvgIcon icon="ri:user-3-line" />
<ArtSvgIcon icon="user" />
<span>{{ userInfo.phone || '暂无电话' }}</span>
</li>
<li v-if="userInfo.regionName" class="btn-item">
<ArtSvgIcon icon="ri:map-pin-line" />
<ArtSvgIcon icon="location" />
<span>{{ userInfo.regionName }}</span>
</li>
<div class="w-full h-px my-2 bg-g-300/80"></div>
@@ -113,6 +113,9 @@
.user-avatar-wrapper {
cursor: pointer;
margin-right: 5px;
background-color: #fff;
border-radius: 50%;
padding: 2px;
&:hover {
opacity: 0.8;
@@ -54,7 +54,7 @@
<ArtIconButton
class="switch-btn size-10"
icon="ri:arrow-left-right-fill"
icon="sort"
@click="toggleDualMenuMode"
/>
</div>
@@ -83,9 +83,9 @@
opacity: 1
}"
>
<template v-if="AppConfig.systemInfo.name === '陇耘鲜达'">
<span class="system-name-main">陇耘</span>
<span class="system-name-accent">鲜达</span>
<template v-if="AppConfig.systemInfo.name === '中科兴皖'">
<span class="system-name-main">中科</span>
<span class="system-name-accent">兴皖</span>
</template>
<template v-else>
{{ AppConfig.systemInfo.name }}
@@ -119,7 +119,7 @@
<div class="dual-menu-collapse-btn" v-if="isDualMenu" @click="toggleMenuVisibility">
<ArtSvgIcon
class="text-g-500/70"
:icon="menuOpen ? 'ri:arrow-left-wide-fill' : 'ri:arrow-right-wide-fill'"
:icon="menuOpen ? 'arrow-left' : 'arrow-right'"
/>
</div>
@@ -84,7 +84,7 @@
v-show="currentTabIsEmpty"
class="relative top-25 h-full text-g-500 text-center !bg-transparent"
>
<ArtSvgIcon icon="system-uicons:inbox" class="text-5xl" />
<ArtSvgIcon icon="box" class="text-5xl" />
<p class="mt-3.5 text-xs !bg-transparent"
>{{ $t('notice.text[0]') }}{{ barList[barActiveIndex].name }}</p
>
@@ -271,30 +271,30 @@
const useNotificationStyles = () => {
const noticeStyleMap: Record<NoticeType, NoticeStyle> = {
email: {
icon: 'ri:mail-line',
icon: 'message',
iconClass: 'bg-warning/12 text-warning'
},
message: {
icon: 'ri:volume-down-line',
icon: 'notification',
iconClass: 'bg-success/12 text-success'
},
collection: {
icon: 'ri:heart-3-line',
icon: 'star-filled',
iconClass: 'bg-danger/12 text-danger'
},
user: {
icon: 'ri:volume-down-line',
icon: 'notification',
iconClass: 'bg-info/12 text-info'
},
notice: {
icon: 'ri:notification-3-line',
icon: 'bell',
iconClass: 'bg-theme/12 text-theme'
}
}
const getNoticeStyle = (type: NoticeType): NoticeStyle => {
const defaultStyle: NoticeStyle = {
icon: 'ri:arrow-right-circle-line',
icon: 'arrow-right',
iconClass: 'bg-theme/12 text-theme'
}
@@ -11,7 +11,7 @@
@click="colorHandlers.selectColor(color)"
>
<ArtSvgIcon
icon="ri:check-fill"
icon="check"
class="text-base !text-white"
v-show="color === systemThemeColor"
/>
@@ -5,7 +5,7 @@
@click="$emit('close')"
class="flex-cc c-p size-7.5 !transition-all duration-200 rounded hover:bg-g-300/80"
>
<ArtSvgIcon icon="ri:close-fill" class="block text-xl text-g-600" />
<ArtSvgIcon icon="close" class="block text-xl text-g-600" />
</div>
</div>
</div>
@@ -36,7 +36,7 @@
class="worktab-close inline-flex flex-cc relative ml-0.5 p-1 rounded-full tad-200"
@click.stop="closeWorktab('current', item.path)"
>
<ArtSvgIcon icon="ri:close-large-fill" class="text-[10px] text-inherit" />
<ArtSvgIcon icon="close-bold" class="text-[10px] text-inherit" />
</span>
</li>
</ul>
@@ -47,7 +47,7 @@
class="worktab-menu-btn flex-cc relative top-0 size-8 leading-8 text-center c-p tad-200"
@click="(e) => showMenu(e, activeTab)"
>
<ArtSvgIcon icon="iconamoon:arrow-down-2-thin" class="text-2xl text-g-700" />
<ArtSvgIcon icon="arrow-down" class="text-2xl text-g-700" />
</div>
</div>
@@ -161,38 +161,38 @@
{
key: 'refresh',
label: t('worktab.btn.refresh'),
icon: 'ri:refresh-line',
icon: 'refresh',
disabled: !isCurrentTab
},
{
key: 'fixed',
label: currentTab?.fixedTab ? t('worktab.btn.unfixed') : t('worktab.btn.fixed'),
icon: 'ri:pushpin-2-line',
icon: 'position',
disabled: false,
showLine: true
},
{
key: 'left',
label: t('worktab.btn.closeLeft'),
icon: 'ri:arrow-left-s-line',
icon: 'arrow-left',
disabled: clickedIndex === 0 || fixedStatus.areAllLeftTabsFixed
},
{
key: 'right',
label: t('worktab.btn.closeRight'),
icon: 'ri:arrow-right-s-line',
icon: 'arrow-right',
disabled: isLastTab || fixedStatus.areAllRightTabsFixed
},
{
key: 'other',
label: t('worktab.btn.closeOther'),
icon: 'ri:close-fill',
icon: 'close',
disabled: isOneTab || fixedStatus.areAllOtherTabsFixed
},
{
key: 'all',
label: t('worktab.btn.closeAll'),
icon: 'ri:close-circle-line',
icon: 'circle-close',
disabled: isOneTab || fixedStatus.areAllTabsFixed
}
]
@@ -45,7 +45,7 @@
>{{ item.label }}</span
>
<ArtSvgIcon
icon="ri:arrow-right-s-line"
icon="arrow-right"
class="ubmenu-arrow ml-auto mr-0 text-base text-g-500 transition-transform duration-150"
/>
</div>
@@ -12,7 +12,7 @@
@click="search"
:class="showSearchBar ? 'active !bg-theme hover:!bg-theme/80' : ''"
>
<ArtSvgIcon icon="ri:search-line" :class="showSearchBar ? 'text-white' : 'text-g-700'" />
<ArtSvgIcon icon="search" :class="showSearchBar ? 'text-white' : 'text-g-700'" />
</div>
<div
v-if="shouldShow('refresh')"
@@ -21,14 +21,14 @@
:class="{ loading: loading && isManualRefresh }"
>
<ArtSvgIcon
icon="ri:refresh-line"
icon="refresh"
:class="loading && isManualRefresh ? 'animate-spin text-g-600' : ''"
/>
</div>
<ElDropdown v-if="shouldShow('size')" @command="handleTableSizeChange">
<div class="button">
<ArtSvgIcon icon="ri:arrow-up-down-fill" />
<ArtSvgIcon icon="sort" />
</div>
<template #dropdown>
<ElDropdownMenu>
@@ -50,14 +50,14 @@
</ElDropdown>
<div v-if="shouldShow('fullscreen')" class="button" @click="toggleFullScreen">
<ArtSvgIcon :icon="isFullScreen ? 'ri:fullscreen-exit-line' : 'ri:fullscreen-line'" />
<ArtSvgIcon :icon="isFullScreen ? 'fullscreen' : 'fullscreen'" />
</div>
<!-- 列设置 -->
<ElPopover v-if="shouldShow('columns')" placement="bottom" trigger="click">
<template #reference>
<div class="button">
<ArtSvgIcon icon="ri:align-right" />
<ArtSvgIcon icon="operation" />
</div>
</template>
<div>
@@ -80,7 +80,7 @@
:class="item.fixed ? 'cursor-default text-g-300' : 'cursor-move'"
>
<ArtSvgIcon
:icon="item.fixed ? 'ri:unpin-line' : 'ri:drag-move-2-fill'"
:icon="item.fixed ? 'close' : 'rank'"
class="text-base"
/>
</div>
@@ -102,7 +102,7 @@
<ElPopover v-if="shouldShow('settings')" placement="bottom" trigger="click">
<template #reference>
<div class="button">
<ArtSvgIcon icon="ri:settings-line" />
<ArtSvgIcon icon="setting" />
</div>
</template>
<div>
@@ -7,7 +7,7 @@
:style="containerStyle"
>
<div class="flex-cc absolute left-0 h-full w-9 z-10" :style="{ backgroundColor: bgColor }">
<ArtSvgIcon icon="ri:volume-down-line" class="text-lg" />
<ArtSvgIcon icon="notification" class="text-lg" />
</div>
<div
@@ -37,7 +37,7 @@
:style="{ backgroundColor: bgColor }"
@click="handleClose"
>
<ArtSvgIcon icon="ri:close-fill" class="text-lg" />
<ArtSvgIcon icon="close" class="text-lg" />
</div>
</div>
</template>
@@ -21,12 +21,12 @@
:style="{ background: color, '--index': index }"
@click="changeThemeColor(color)"
>
<ArtSvgIcon v-if="color === systemThemeColor" icon="ri:check-fill" class="text-white" />
<ArtSvgIcon v-if="color === systemThemeColor" icon="check" class="text-white" />
</div>
</div>
<div class="btn palette-btn relative z-[2] h-8 w-8 c-p flex-cc tad-300">
<ArtSvgIcon
icon="ri:palette-line"
icon="brush"
class="text-xl text-g-800 transition-colors duration-300"
/>
</div>
@@ -50,7 +50,7 @@
:class="{ 'is-selected': locale === lang.value }"
>
<span class="menu-txt">{{ lang.label }}</span>
<ArtSvgIcon icon="ri:check-fill" class="text-base" v-if="locale === lang.value" />
<ArtSvgIcon icon="check" class="text-base" v-if="locale === lang.value" />
</ElDropdownItem>
</div>
</ElDropdownMenu>
@@ -62,7 +62,7 @@
@click="themeAnimation"
>
<ArtSvgIcon
:icon="isDark ? 'ri:sun-fill' : 'ri:moon-line'"
:icon="isDark ? 'sunny' : 'moon'"
class="text-xl text-g-800 transition-colors duration-300"
/>
</div>