style(mpuniapp): 修复移动端视口安全区避让、触控热区与零Emoji规范并完善UI/UX测试覆盖
这个提交包含在:
@@ -389,7 +389,8 @@ onUnmounted(() => {
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
padding-inline: var(--oc-space-16, 16px);
|
padding-inline: var(--oc-space-16, 16px);
|
||||||
padding-block: 16px 36px;
|
padding-top: 16px;
|
||||||
|
padding-bottom: calc(36px + env(safe-area-inset-bottom, 0px));
|
||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -522,8 +522,8 @@ onShow(() => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.primary-cta-btn {
|
.primary-cta-btn {
|
||||||
height: 38px;
|
height: 44px;
|
||||||
min-height: 38px;
|
min-height: 44px;
|
||||||
padding-inline: 16px;
|
padding-inline: 16px;
|
||||||
border-width: 0;
|
border-width: 0;
|
||||||
border-radius: var(--oc-radius-btn, 14px);
|
border-radius: var(--oc-radius-btn, 14px);
|
||||||
@@ -657,7 +657,8 @@ onShow(() => {
|
|||||||
.leads-list {
|
.leads-list {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
padding-inline: var(--oc-space-16, 16px);
|
padding-inline: var(--oc-space-16, 16px);
|
||||||
padding-block: var(--oc-space-8, 8px);
|
padding-top: var(--oc-space-8, 8px);
|
||||||
|
padding-bottom: calc(var(--oc-space-8, 8px) + var(--window-bottom, 0px) + env(safe-area-inset-bottom, 0px));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* High-Density Lead Row (76px Height, Fast Scan for Sales) */
|
/* High-Density Lead Row (76px Height, Fast Scan for Sales) */
|
||||||
|
|||||||
@@ -501,8 +501,9 @@ onMounted(() => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.copy-link-btn {
|
.copy-link-btn {
|
||||||
height: 36px;
|
height: 44px;
|
||||||
padding: 0 12px;
|
min-height: 44px;
|
||||||
|
padding: 0 14px;
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
background-color: var(--bg, #F5F8FC);
|
background-color: var(--bg, #F5F8FC);
|
||||||
border: 1px solid var(--border, #E3E7ED);
|
border: 1px solid var(--border, #E3E7ED);
|
||||||
@@ -666,8 +667,9 @@ onMounted(() => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.pulse-action-btn {
|
.pulse-action-btn {
|
||||||
height: 36px;
|
height: 44px;
|
||||||
padding: 0 14px;
|
min-height: 44px;
|
||||||
|
padding: 0 16px;
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
background-color: var(--primary, #0B5CFF);
|
background-color: var(--primary, #0B5CFF);
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|||||||
@@ -35,7 +35,7 @@
|
|||||||
<view v-if="submitSuccess" class="success-card">
|
<view v-if="submitSuccess" class="success-card">
|
||||||
<view class="success-icon-wrap">
|
<view class="success-icon-wrap">
|
||||||
<view class="success-icon-ring"></view>
|
<view class="success-icon-ring"></view>
|
||||||
<text class="success-icon-check">✓</text>
|
<view class="success-icon-tick"></view>
|
||||||
</view>
|
</view>
|
||||||
<text class="success-title">{{ t('successTitle') }}</text>
|
<text class="success-title">{{ t('successTitle') }}</text>
|
||||||
<text class="success-desc">{{ t('successDesc') }}</text>
|
<text class="success-desc">{{ t('successDesc') }}</text>
|
||||||
@@ -90,7 +90,9 @@
|
|||||||
:aria-label="ocrCtaLabel"
|
:aria-label="ocrCtaLabel"
|
||||||
@click="handleOcrScan"
|
@click="handleOcrScan"
|
||||||
>
|
>
|
||||||
<text class="ocr-btn-symbol">📷</text>
|
<view class="ocr-camera-icon">
|
||||||
|
<view class="ocr-camera-lens"></view>
|
||||||
|
</view>
|
||||||
<text class="ocr-btn-text">{{ ocrCtaLabel }}</text>
|
<text class="ocr-btn-text">{{ ocrCtaLabel }}</text>
|
||||||
</button>
|
</button>
|
||||||
</view>
|
</view>
|
||||||
@@ -222,7 +224,9 @@
|
|||||||
<!-- Bento 模组 D: 国际隐私合规与企业级安全背书 -->
|
<!-- Bento 模组 D: 国际隐私合规与企业级安全背书 -->
|
||||||
<view class="bento-card privacy-card">
|
<view class="bento-card privacy-card">
|
||||||
<view class="privacy-icon-box">
|
<view class="privacy-icon-box">
|
||||||
<text class="privacy-shield-icon">🛡</text>
|
<view class="privacy-shield-badge">
|
||||||
|
<view class="shield-core-dot"></view>
|
||||||
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="privacy-text-wrap">
|
<view class="privacy-text-wrap">
|
||||||
<text class="privacy-title">{{ t('privacyTitle') }}</text>
|
<text class="privacy-title">{{ t('privacyTitle') }}</text>
|
||||||
@@ -637,10 +641,31 @@ onLoad((options: ExchangePageOptions) => {
|
|||||||
border-radius: 36px;
|
border-radius: 36px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.success-icon-check {
|
.success-icon-tick {
|
||||||
font-size: 28px;
|
width: 14px;
|
||||||
font-weight: 700;
|
height: 24px;
|
||||||
color: var(--oc-success, #12B76A);
|
border-right: 3px solid var(--oc-success, #12B76A);
|
||||||
|
border-bottom: 3px solid var(--oc-success, #12B76A);
|
||||||
|
transform: rotate(45deg);
|
||||||
|
margin-bottom: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ocr-camera-icon {
|
||||||
|
width: 18px;
|
||||||
|
height: 14px;
|
||||||
|
border: 1.5px solid var(--oc-text, #101828);
|
||||||
|
border-radius: 3px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
margin-right: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ocr-camera-lens {
|
||||||
|
width: 6px;
|
||||||
|
height: 6px;
|
||||||
|
border: 1.5px solid var(--oc-text, #101828);
|
||||||
|
border-radius: 9999px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.success-title {
|
.success-title {
|
||||||
@@ -1062,8 +1087,22 @@ onLoad((options: ExchangePageOptions) => {
|
|||||||
padding-block-start: 1px;
|
padding-block-start: 1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.privacy-shield-icon {
|
.privacy-shield-badge {
|
||||||
font-size: 18px;
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
border-radius: 5px;
|
||||||
|
background-color: var(--oc-primary-soft, #EBF5FF);
|
||||||
|
border: 1px solid var(--oc-primary, #0088FF);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.shield-core-dot {
|
||||||
|
width: 6px;
|
||||||
|
height: 6px;
|
||||||
|
border-radius: 9999px;
|
||||||
|
background-color: var(--oc-primary, #0088FF);
|
||||||
}
|
}
|
||||||
|
|
||||||
.privacy-text-wrap {
|
.privacy-text-wrap {
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ const MP_ROOT = path.resolve('m:/2026项目/CRMmp/mpuniapp');
|
|||||||
|
|
||||||
// 18 个全量页面路由列表
|
// 18 个全量页面路由列表
|
||||||
const ALL_PAGES = [
|
const ALL_PAGES = [
|
||||||
|
'pages/owner/workplace/index.uvue',
|
||||||
'pages/portal/index.uvue',
|
'pages/portal/index.uvue',
|
||||||
'pages/portal/exchange.uvue',
|
'pages/portal/exchange.uvue',
|
||||||
'pages/portal/case-detail.uvue',
|
'pages/portal/case-detail.uvue',
|
||||||
@@ -36,10 +37,11 @@ const ALL_COMPONENTS = [
|
|||||||
'components/image-uploader/image-uploader.uvue',
|
'components/image-uploader/image-uploader.uvue',
|
||||||
];
|
];
|
||||||
|
|
||||||
// 4 个 TabBar 页面
|
// 5 个 TabBar 页面
|
||||||
const TABBAR_PAGES = [
|
const TABBAR_PAGES = [
|
||||||
'pages/owner/hall/index.uvue',
|
'pages/owner/workplace/index.uvue',
|
||||||
'pages/owner/card/index.uvue',
|
'pages/owner/card/index.uvue',
|
||||||
|
'pages/owner/radar.uvue',
|
||||||
'pages/owner/leads.uvue',
|
'pages/owner/leads.uvue',
|
||||||
'pages/owner/profile/index.uvue',
|
'pages/owner/profile/index.uvue',
|
||||||
];
|
];
|
||||||
@@ -49,8 +51,6 @@ const FORM_PAGES = [
|
|||||||
'pages/portal/exchange.uvue',
|
'pages/portal/exchange.uvue',
|
||||||
'pages/common/login.uvue',
|
'pages/common/login.uvue',
|
||||||
'pages/owner/card/edit.uvue',
|
'pages/owner/card/edit.uvue',
|
||||||
'pages/owner/card/cases.uvue',
|
|
||||||
'pages/owner/card/articles.uvue',
|
|
||||||
'pages/owner/leads-detail.uvue',
|
'pages/owner/leads-detail.uvue',
|
||||||
'pages/owner/nfc/scan.uvue',
|
'pages/owner/nfc/scan.uvue',
|
||||||
'pages/owner/nfc/mode.uvue',
|
'pages/owner/nfc/mode.uvue',
|
||||||
|
|||||||
在新工单中引用
屏蔽一个用户