feat: streamline mobile file workspace

This commit is contained in:
237899745
2026-08-03 22:21:09 +08:00
parent bd46227e49
commit c529e6c51b
3 changed files with 818 additions and 32 deletions

View File

@@ -1802,7 +1802,7 @@
</div>
<!-- 导航栏 -->
<div class="navbar" v-if="isLoggedIn">
<nav class="navbar" v-if="isLoggedIn" aria-label="主导航">
<div class="navbar-brand">
<span class="brand-mark"><i class="fas fa-cloud"></i></span>
<span class="brand-copy">
@@ -1812,19 +1812,19 @@
</div>
<div class="navbar-menu">
<div class="nav-section-label">工作台</div>
<div v-if="user && !user.is_admin" class="nav-item" :class="{active: currentView === 'files'}" @click="switchView('files')">
<i class="fas fa-folder"></i> 我的文件
</div>
<div v-if="user && !user.is_admin" class="nav-item" :class="{active: currentView === 'shares'}" @click="switchView('shares')">
<i class="fas fa-share-alt"></i> 我的分享
</div>
<div v-if="user && user.is_admin" class="nav-item" :class="{active: currentView === 'admin'}" @click="switchView('admin')">
<i class="fas fa-user-shield"></i> 管理员
</div>
<button v-if="user && !user.is_admin" type="button" class="nav-item" :class="{active: currentView === 'files'}" :aria-current="currentView === 'files' ? 'page' : null" @click="switchView('files')">
<i class="fas fa-folder"></i><span class="nav-item-label">文件</span>
</button>
<button v-if="user && !user.is_admin" type="button" class="nav-item" :class="{active: currentView === 'shares'}" :aria-current="currentView === 'shares' ? 'page' : null" @click="switchView('shares')">
<i class="fas fa-share-alt"></i><span class="nav-item-label">分享</span>
</button>
<button v-if="user && user.is_admin" type="button" class="nav-item" :class="{active: currentView === 'admin'}" :aria-current="currentView === 'admin' ? 'page' : null" @click="switchView('admin')">
<i class="fas fa-user-shield"></i><span class="nav-item-label">管理</span>
</button>
<div class="nav-section-label nav-service-label">服务</div>
<div class="nav-item" :class="{active: currentView === 'settings'}" @click="switchView('settings')">
<i class="fas fa-cog"></i> 设置
</div>
<button type="button" class="nav-item" :class="{active: currentView === 'settings'}" :aria-current="currentView === 'settings' ? 'page' : null" @click="switchView('settings')">
<i class="fas fa-cog"></i><span class="nav-item-label">设置</span>
</button>
<button class="btn btn-secondary navbar-download-btn" :disabled="desktopClientDownloading" @click="downloadDesktopClient">
<i :class="desktopClientDownloading ? 'fas fa-spinner fa-spin' : 'fas fa-download'"></i>
{{ desktopClientDownloading ? '准备中...' : '下载客户端' }}
@@ -1837,15 +1837,15 @@
<strong>{{ user.username }}</strong>
</span>
</div>
<button class="btn btn-danger navbar-logout-btn" @click="logout" title="退出登录">
<i class="fas fa-power-off"></i> 退出
<button class="btn btn-danger navbar-logout-btn" @click="logout" title="退出登录" aria-label="退出登录">
<i class="fas fa-power-off"></i><span class="nav-item-label">退出</span>
</button>
</div>
</div>
</div>
</nav>
<!-- 文件视图 -->
<div v-if="isLoggedIn && currentView === 'files'" class="main-container">
<div v-if="isLoggedIn && currentView === 'files'" class="main-container files-main-container">
<div class="card files-view-card">
<header class="workspace-page-header files-page-header">
@@ -1909,19 +1909,22 @@
<!-- 文件列表 -->
<div v-else class="files-content-shell">
<div class="files-command-bar">
<div class="files-command-primary">
<div class="files-command-primary files-command-primary-desktop">
<button class="btn btn-primary" @click="$refs.fileUploadInput.click()">
<i class="fas fa-upload"></i> 上传文件
<i class="fas fa-upload"></i><span class="btn-label">上传文件</span>
</button>
<button class="btn btn-secondary" @click="showCreateFolderModal = true">
<i class="fas fa-folder-plus"></i> 新建文件夹
<i class="fas fa-folder-plus"></i><span class="btn-label">新建文件夹</span>
</button>
</div>
<button type="button" class="btn btn-primary mobile-file-create-trigger" @click="openMobileCreateSheet($event)" aria-label="新建或上传">
<i class="fas fa-plus"></i><span>新建</span>
</button>
<div class="view-toggle-group files-view-toggle" aria-label="文件视图切换">
<button class="btn" :class="fileViewMode === 'grid' ? 'btn-primary' : 'btn-secondary'" @click="fileViewMode = 'grid'" title="大图标视图">
<button class="btn" :class="fileViewMode === 'grid' ? 'btn-primary' : 'btn-secondary'" @click="setFileViewMode('grid')" :aria-pressed="fileViewMode === 'grid'" aria-label="大图标视图" title="大图标视图">
<i class="fas fa-th-large"></i><span>大图标</span>
</button>
<button class="btn" :class="fileViewMode === 'list' ? 'btn-primary' : 'btn-secondary'" @click="fileViewMode = 'list'" title="列表视图">
<button class="btn" :class="fileViewMode === 'list' ? 'btn-primary' : 'btn-secondary'" @click="setFileViewMode('list')" :aria-pressed="fileViewMode === 'list'" aria-label="列表视图" title="列表视图">
<i class="fas fa-list"></i><span>列表</span>
</button>
</div>
@@ -1932,14 +1935,15 @@
<div class="files-search-field">
<i class="fas fa-search"></i>
<input
type="text"
type="search"
class="form-input"
v-model="globalSearchKeyword"
@input="triggerGlobalSearch"
@focus="globalSearchVisible = !!globalSearchKeyword"
placeholder="搜索全部目录中的文件或文件夹">
aria-label="搜索文件或文件夹"
placeholder="搜索文件或文件夹">
</div>
<select class="form-input files-search-type" v-model="globalSearchType" @change="runGlobalSearch">
<select class="form-input files-search-type" v-model="globalSearchType" @change="runGlobalSearch" aria-label="搜索类型">
<option value="all">全部</option>
<option value="file">仅文件</option>
<option value="directory">仅文件夹</option>
@@ -2114,6 +2118,7 @@
@touchstart.stop
@touchmove.stop
@touchend.stop
aria-label="更多操作"
title="更多操作">
<i class="fas fa-ellipsis-h"></i>
</button>
@@ -4474,9 +4479,30 @@
<i class="fas fa-trash"></i> 删除
</div>
</div>
<!-- 移动端新建面板 -->
<div v-if="showMobileCreateSheet" class="modal-overlay mobile-file-sheet-overlay mobile-create-sheet-overlay" @click="closeMobileCreateSheet">
<section class="mobile-file-sheet mobile-create-sheet" role="dialog" aria-modal="true" aria-labelledby="mobile-create-title" @click.stop>
<div class="mobile-file-sheet-handle"></div>
<div id="mobile-create-title" class="mobile-file-sheet-title mobile-create-sheet-title">新建</div>
<div class="mobile-create-sheet-actions">
<button type="button" class="mobile-create-option" @click="mobileCreateAction('upload')">
<span class="mobile-create-option-icon upload"><i class="fas fa-cloud-upload-alt"></i></span>
<span class="mobile-create-option-copy"><strong>上传文件</strong><small>从手机选择一个或多个文件</small></span>
<i class="fas fa-chevron-right mobile-create-option-arrow"></i>
</button>
<button type="button" class="mobile-create-option" @click="mobileCreateAction('folder')">
<span class="mobile-create-option-icon folder"><i class="fas fa-folder-plus"></i></span>
<span class="mobile-create-option-copy"><strong>新建文件夹</strong><small>创建目录并整理云端文件</small></span>
<i class="fas fa-chevron-right mobile-create-option-arrow"></i>
</button>
</div>
<button type="button" class="mobile-file-sheet-btn cancel mobile-create-cancel" @click="closeMobileCreateSheet">取消</button>
</section>
</div>
<!-- 移动端文件操作面板 -->
<div v-if="showMobileFileActionSheet && mobileActionFile" class="modal-overlay mobile-file-sheet-overlay" @click="closeMobileFileActionSheet">
<div class="mobile-file-sheet" @click.stop>
<section class="mobile-file-sheet" role="dialog" aria-modal="true" aria-label="文件操作" @click.stop>
<div class="mobile-file-sheet-handle"></div>
<div class="mobile-file-sheet-title" :title="getFileDisplayName(mobileActionFile)">
{{ getFileDisplayName(mobileActionFile) }}
@@ -4508,7 +4534,7 @@
<i class="fas fa-times"></i> 取消
</button>
</div>
</div>
</section>
</div>
<!-- 管理员:编辑用户存储权限模态框 -->

View File

@@ -12,6 +12,19 @@ createApp({
return (saved && ['overview', 'settings', 'monitor', 'users'].includes(saved)) ? saved : 'overview';
})();
const initialFileViewMode = (() => {
try {
const saved = localStorage.getItem('fileViewMode');
if (saved && ['grid', 'list'].includes(saved)) {
return saved;
}
} catch (error) {
console.warn('[视图] 无法读取文件视图偏好:', error);
}
return window.matchMedia('(max-width: 768px)').matches ? 'list' : 'grid';
})();
return {
// API配置
// API配置 - 通过nginx代理访问
@@ -29,7 +42,7 @@ createApp({
// 视图状态
currentView: 'files',
isLogin: true,
fileViewMode: 'grid', // 文件显示模式: grid 大图标, list 列表
fileViewMode: initialFileViewMode, // 移动端默认列表视图,并记住用户选择
shareViewMode: 'list', // 分享显示模式: grid 大图标, list 列表
shareResourceTab: 'shares', // 分享中心资源标签: shares / directLinks
settingsTab: 'storage', // 设置中心标签: storage / appearance / security
@@ -349,6 +362,7 @@ createApp({
contextMenuX: 0,
contextMenuY: 0,
contextMenuFile: null,
showMobileCreateSheet: false,
showMobileFileActionSheet: false,
mobileActionFile: null,
@@ -2245,6 +2259,46 @@ handleDragLeave(e) {
document.body.style.overflow = locked ? 'hidden' : '';
},
setFileViewMode(mode) {
if (!['grid', 'list'].includes(mode)) return;
this.fileViewMode = mode;
try {
localStorage.setItem('fileViewMode', mode);
} catch (error) {
console.warn('[视图] 无法保存文件视图偏好:', error);
}
},
openMobileCreateSheet(event) {
if (event) {
event.preventDefault();
event.stopPropagation();
}
this.closeMobileFileActionSheet();
this.showMobileCreateSheet = true;
this.setMobileSheetScrollLock(true);
},
closeMobileCreateSheet() {
this.showMobileCreateSheet = false;
this.setMobileSheetScrollLock(false);
},
mobileCreateAction(action) {
this.closeMobileCreateSheet();
if (action === 'upload') {
this.$nextTick(() => this.$refs.fileUploadInput?.click());
return;
}
if (action === 'folder') {
this.showCreateFolderModal = true;
}
},
openMobileFileActionSheet(file, event) {
if (event) {
event.preventDefault();
@@ -5176,11 +5230,12 @@ handleDragLeave(e) {
this.isDragging = false;
});
// 添加 ESC 键监听(按 ESC 关闭拖拽覆盖层)
// 添加 ESC 键监听(按 ESC 关闭当前浮层)
window.addEventListener("keydown", (e) => {
if (e.key === "Escape" && this.isDragging) {
this.isDragging = false;
}
if (e.key !== "Escape") return;
if (this.isDragging) this.isDragging = false;
if (this.showMobileCreateSheet) this.closeMobileCreateSheet();
if (this.showMobileFileActionSheet) this.closeMobileFileActionSheet();
});
// 设置axios响应拦截器处理401错误token过期/失效)

View File

@@ -2692,3 +2692,708 @@ body.enterprise-netdisk .settings-account-panel {
display: none;
}
}
/* Mobile file workspace: bottom navigation and a single-layer command surface. */
body.enterprise-netdisk .mobile-file-create-trigger {
display: none;
}
@keyframes ww-mobile-sheet-enter {
from {
opacity: 0;
transform: translateY(18px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@media (max-width: 768px) {
body.enterprise-netdisk {
min-width: 0;
min-height: 100vh;
min-height: 100dvh;
overflow-x: hidden;
background: #fff;
}
body.enterprise-netdisk #app {
min-height: 100vh;
min-height: 100dvh;
}
body.enterprise-netdisk .navbar {
position: fixed !important;
inset: auto 0 0 !important;
z-index: 80;
width: 100% !important;
height: calc(66px + env(safe-area-inset-bottom));
min-height: calc(66px + env(safe-area-inset-bottom));
padding: 5px 8px calc(5px + env(safe-area-inset-bottom));
display: flex;
flex-direction: row;
align-items: center;
gap: 0;
border: 0 !important;
border-top: 1px solid rgba(214, 222, 235, 0.92) !important;
background: rgba(255, 255, 255, 0.97) !important;
box-shadow: 0 -8px 28px rgba(28, 46, 75, 0.09);
backdrop-filter: blur(18px) !important;
}
body.enterprise-netdisk .navbar-brand,
body.enterprise-netdisk .nav-section-label,
body.enterprise-netdisk .navbar-download-btn,
body.enterprise-netdisk .user-info {
display: none !important;
}
body.enterprise-netdisk .navbar-menu {
width: 100%;
min-width: 0;
height: 56px;
flex: 1;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-around;
gap: 4px;
overflow: visible;
}
body.enterprise-netdisk .navbar-account {
min-width: 0;
flex: 1 1 0;
margin: 0;
padding: 0;
display: flex;
border: 0;
}
body.enterprise-netdisk .nav-item,
body.enterprise-netdisk .navbar-logout-btn {
width: auto;
min-width: 0;
min-height: 52px;
flex: 1 1 0;
padding: 5px 4px 4px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 3px;
border: 0;
border-radius: 12px;
color: #718099;
background: transparent;
box-shadow: none;
font-size: 10px;
font-weight: 700;
line-height: 1.15;
transform: none;
}
body.enterprise-netdisk .nav-item i,
body.enterprise-netdisk .navbar-logout-btn i {
width: auto;
color: #718099;
font-size: 18px;
line-height: 1;
}
body.enterprise-netdisk .nav-item-label {
display: block;
font-size: 10px;
line-height: 1.15;
}
body.enterprise-netdisk .nav-item.active {
color: var(--ww-blue);
background: var(--ww-blue-soft);
box-shadow: none;
}
body.enterprise-netdisk .nav-item.active i {
color: var(--ww-blue);
}
body.enterprise-netdisk .nav-item:hover,
body.enterprise-netdisk .navbar-logout-btn:hover {
color: #718099;
background: #f5f7fa;
transform: none;
}
body.enterprise-netdisk .navbar-logout-btn,
body.enterprise-netdisk .navbar-logout-btn:hover {
width: 100%;
margin: 0;
color: #9a6570;
border-color: transparent;
}
body.enterprise-netdisk .navbar-logout-btn i,
body.enterprise-netdisk .navbar-logout-btn:hover i {
color: #9a6570;
}
body.enterprise-netdisk .main-container {
margin-left: 0 !important;
padding-bottom: calc(82px + env(safe-area-inset-bottom));
}
body.enterprise-netdisk .files-main-container {
padding: 0 0 calc(66px + env(safe-area-inset-bottom));
}
body.enterprise-netdisk .files-view-card {
height: auto;
min-height: calc(100vh - 66px);
min-height: calc(100dvh - 66px - env(safe-area-inset-bottom));
border: 0;
border-radius: 0;
box-shadow: none;
}
body.enterprise-netdisk .files-page-header {
padding: 16px 16px 14px;
display: flex;
flex-direction: column;
align-items: stretch;
gap: 11px;
border-bottom: 1px solid #edf1f6;
background:
radial-gradient(circle at 100% 0%, rgba(40, 120, 255, 0.08), transparent 14rem),
#fff;
}
body.enterprise-netdisk .files-page-header .workspace-kicker,
body.enterprise-netdisk .files-page-header .workspace-page-heading p {
display: none;
}
body.enterprise-netdisk .files-page-header .workspace-page-heading h1 {
margin: 0;
font-size: 24px;
line-height: 1.2;
letter-spacing: -0.02em;
}
body.enterprise-netdisk .storage-meter-card {
width: 100%;
min-width: 0;
padding: 10px 12px 9px;
border-color: #e1e9f5;
border-radius: 12px;
background: rgba(247, 250, 255, 0.94);
}
body.enterprise-netdisk .storage-meter-head {
gap: 9px;
}
body.enterprise-netdisk .storage-meter-head strong {
min-width: 0;
flex: 1;
font-size: 11px;
text-align: right;
}
body.enterprise-netdisk .files-storage-badge {
width: auto;
max-width: 58%;
flex: 0 0 auto;
padding: 3px 7px;
justify-content: flex-start;
font-size: 10px;
}
body.enterprise-netdisk .storage-meter-track {
height: 4px;
margin: 7px 0 5px;
}
body.enterprise-netdisk .storage-meter-foot {
font-size: 9px;
}
body.enterprise-netdisk .breadcrumb-bar {
min-height: 40px;
margin: 10px 14px 0;
padding: 4px 6px;
gap: 5px;
overflow-x: auto;
border-radius: 10px;
white-space: nowrap;
scrollbar-width: none;
}
body.enterprise-netdisk .breadcrumb-bar::-webkit-scrollbar {
display: none;
}
body.enterprise-netdisk .breadcrumb-up {
position: sticky;
right: 0;
min-width: 34px;
background: var(--ww-surface-soft);
}
body.enterprise-netdisk .files-content-shell {
min-height: 0;
padding: 12px 14px 18px;
display: flex;
flex-direction: column;
}
body.enterprise-netdisk .files-command-bar {
min-height: 44px;
display: flex;
flex-direction: row;
align-items: center;
gap: 9px;
}
body.enterprise-netdisk .files-command-primary-desktop {
display: none;
}
body.enterprise-netdisk .mobile-file-create-trigger {
min-width: 0;
min-height: 44px;
flex: 1;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
border-radius: 11px;
font-size: 14px;
font-weight: 750;
box-shadow: 0 8px 18px rgba(40, 120, 255, 0.2);
}
body.enterprise-netdisk .files-view-toggle {
width: auto;
flex: 0 0 auto;
display: flex;
grid-template-columns: none;
gap: 2px;
padding: 3px;
border-radius: 11px;
}
body.enterprise-netdisk .files-view-toggle .btn {
width: 38px;
min-width: 38px;
min-height: 36px;
padding: 0;
display: grid;
place-items: center;
border-radius: 8px;
}
body.enterprise-netdisk .files-view-toggle .btn span {
display: none;
}
body.enterprise-netdisk .files-view-toggle .btn i {
margin: 0;
font-size: 14px;
}
body.enterprise-netdisk .files-search-wrap {
margin-top: 10px;
}
body.enterprise-netdisk .files-search-row {
padding: 0;
display: grid;
grid-template-columns: minmax(0, 1fr) 86px;
gap: 8px;
border: 0;
border-radius: 0;
background: transparent;
}
body.enterprise-netdisk .files-search-field {
min-width: 0;
min-height: 44px;
grid-column: auto;
padding: 0 12px;
gap: 9px;
border-color: #dce4ef;
border-radius: 11px;
background: #f7f9fc;
}
body.enterprise-netdisk .files-search-field .form-input {
min-height: 40px;
font-size: 13px;
}
body.enterprise-netdisk .files-search-field > i {
font-size: 13px;
}
body.enterprise-netdisk .files-search-type {
width: 86px;
min-height: 44px;
padding: 0 9px;
border-color: #dce4ef;
border-radius: 11px;
background-color: #f7f9fc;
font-size: 12px;
}
body.enterprise-netdisk .files-search-button,
body.enterprise-netdisk .files-search-clear {
display: none;
}
body.enterprise-netdisk .files-search-results {
inset: calc(100% + 7px) 0 auto;
max-height: min(52vh, 360px);
border-radius: 12px;
}
body.enterprise-netdisk .files-search-result {
min-height: 56px;
padding: 10px 12px;
}
body.enterprise-netdisk .files-list-heading {
min-height: 44px;
padding: 0 2px;
}
body.enterprise-netdisk .files-list-heading > div {
gap: 8px;
}
body.enterprise-netdisk .files-list-heading strong {
font-size: 15px;
}
body.enterprise-netdisk .files-list-hint,
body.enterprise-netdisk .files-drop-hint {
display: none;
}
body.enterprise-netdisk .files-container {
min-height: calc(100vh - 322px);
min-height: calc(100dvh - 322px - env(safe-area-inset-bottom));
flex: 1;
padding: 0;
overflow: visible;
border: 0;
border-radius: 0;
background: #fff;
}
body.enterprise-netdisk .files-content-shell .file-list {
overflow: visible;
border-radius: 0;
}
body.enterprise-netdisk .file-list-table thead {
display: none;
}
body.enterprise-netdisk .file-list-table td {
height: 66px;
padding: 8px 2px !important;
border-bottom-color: #edf1f6;
}
body.enterprise-netdisk .file-list-row:last-child td {
border-bottom: 1px solid #edf1f6;
}
body.enterprise-netdisk .file-list-row:active {
background: #f3f7fd;
}
body.enterprise-netdisk .file-col-size,
body.enterprise-netdisk .file-col-time,
body.enterprise-netdisk .file-list-size-cell,
body.enterprise-netdisk .file-list-time-cell {
display: none;
}
body.enterprise-netdisk .file-list-name-cell {
width: auto;
max-width: 0;
}
body.enterprise-netdisk .file-list-name-wrap {
gap: 11px;
}
body.enterprise-netdisk .file-list-name-info {
gap: 3px;
}
body.enterprise-netdisk .file-list-name-text {
font-size: 14px;
font-weight: 700;
}
body.enterprise-netdisk .file-list-name-meta {
display: block;
font-size: 10px;
}
body.enterprise-netdisk .file-list-thumb,
body.enterprise-netdisk .file-list-video-icon {
width: 40px;
height: 40px;
border-radius: 9px;
}
body.enterprise-netdisk .file-list-type-icon {
min-width: 40px;
font-size: 27px;
}
body.enterprise-netdisk .file-list-action-col {
width: 48px;
padding-left: 4px !important;
}
body.enterprise-netdisk .file-row-mobile-more {
width: 42px;
min-width: 42px;
min-height: 42px;
border-radius: 11px;
}
body.enterprise-netdisk .files-content-shell .file-grid {
min-height: 0;
padding: 2px 0 10px;
grid-template-columns: repeat(2, minmax(0, 1fr));
grid-auto-rows: auto;
gap: 8px;
}
body.enterprise-netdisk .files-content-shell .file-grid-item {
width: auto;
min-height: 124px;
padding: 12px 8px 10px;
justify-content: center;
border: 1px solid #e7edf5;
border-radius: 12px;
background: #fbfcfe;
}
body.enterprise-netdisk .file-icon {
min-height: 56px;
margin-bottom: 4px;
}
body.enterprise-netdisk .file-grid-type-icon {
font-size: 45px;
}
body.enterprise-netdisk .file-thumbnail,
body.enterprise-netdisk .file-grid-video-icon {
width: 58px;
height: 54px;
}
body.enterprise-netdisk .files-content-shell .file-name {
font-size: 12px;
}
body.enterprise-netdisk .files-content-shell .file-size {
margin-top: 1px;
font-size: 10px;
}
body.enterprise-netdisk .files-empty-state,
body.enterprise-netdisk .files-content-shell .empty-hint {
min-height: 260px;
padding: 42px 12px;
}
body.enterprise-netdisk .files-empty-state > i {
font-size: 34px;
}
body.enterprise-netdisk .files-empty-actions {
width: 100%;
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
}
body.enterprise-netdisk .files-empty-actions .btn {
min-width: 0;
}
body.enterprise-netdisk .mobile-file-sheet-overlay {
z-index: 1100;
padding: 0;
align-items: flex-end;
background: rgba(18, 31, 50, 0.38);
backdrop-filter: blur(2px);
}
body.enterprise-netdisk .mobile-file-sheet {
width: 100%;
max-width: 560px;
max-height: 82vh;
padding: 8px 14px calc(14px + env(safe-area-inset-bottom));
overflow-y: auto;
border: 0;
border-radius: 20px 20px 0 0;
color: var(--ww-ink);
background: #fff;
box-shadow: 0 -18px 50px rgba(21, 38, 65, 0.18);
animation: ww-mobile-sheet-enter 180ms ease-out both;
}
body.enterprise-netdisk .mobile-file-sheet-handle {
width: 38px;
height: 4px;
margin: 2px auto 10px;
background: #d7deea;
}
body.enterprise-netdisk .mobile-file-sheet-title {
margin-bottom: 10px;
color: var(--ww-ink);
font-size: 15px;
font-weight: 750;
}
body.enterprise-netdisk .mobile-file-sheet-actions {
gap: 7px;
}
body.enterprise-netdisk .mobile-file-sheet-btn {
min-height: 48px;
border-color: var(--ww-line);
color: var(--ww-text);
background: var(--ww-surface-soft);
}
body.enterprise-netdisk .mobile-file-sheet-btn.cancel {
margin-top: 4px;
color: var(--ww-text);
background: #fff;
}
body.enterprise-netdisk .mobile-create-sheet-title {
margin-bottom: 5px;
text-align: left;
}
body.enterprise-netdisk .mobile-create-sheet-actions {
display: grid;
gap: 4px;
}
body.enterprise-netdisk .mobile-create-option {
width: 100%;
min-height: 70px;
padding: 9px 4px;
display: flex;
align-items: center;
gap: 12px;
border: 0;
border-bottom: 1px solid #edf1f6;
color: var(--ww-ink);
text-align: left;
background: transparent;
}
body.enterprise-netdisk .mobile-create-option:active {
background: #f4f8ff;
}
body.enterprise-netdisk .mobile-create-option-icon {
width: 42px;
height: 42px;
flex: 0 0 42px;
display: grid;
place-items: center;
border-radius: 12px;
font-size: 17px;
}
body.enterprise-netdisk .mobile-create-option-icon.upload {
color: #1763e6;
background: #eaf2ff;
}
body.enterprise-netdisk .mobile-create-option-icon.folder {
color: #aa6d05;
background: #fff4da;
}
body.enterprise-netdisk .mobile-create-option-copy {
min-width: 0;
flex: 1;
display: flex;
flex-direction: column;
gap: 2px;
}
body.enterprise-netdisk .mobile-create-option-copy strong {
font-size: 14px;
}
body.enterprise-netdisk .mobile-create-option-copy small {
overflow: hidden;
color: var(--ww-muted);
font-size: 11px;
text-overflow: ellipsis;
white-space: nowrap;
}
body.enterprise-netdisk .mobile-create-option-arrow {
color: #a5b0c1;
font-size: 11px;
}
body.enterprise-netdisk .mobile-create-cancel {
width: 100%;
min-height: 46px;
margin-top: 10px;
border: 0;
border-radius: 11px;
font-weight: 700;
}
body.enterprise-netdisk .upload-progress-panel {
right: 12px;
bottom: calc(78px + env(safe-area-inset-bottom));
width: calc(100vw - 24px);
max-width: 360px;
}
}
@media (max-width: 380px) {
body.enterprise-netdisk .files-page-header {
padding-inline: 13px;
}
body.enterprise-netdisk .files-content-shell {
padding-inline: 11px;
}
body.enterprise-netdisk .files-search-row {
grid-template-columns: minmax(0, 1fr) 78px;
gap: 6px;
}
body.enterprise-netdisk .files-search-type {
width: 78px;
padding-inline: 6px;
}
body.enterprise-netdisk .nav-item,
body.enterprise-netdisk .navbar-logout-btn {
padding-inline: 2px;
}
}