跨端: 5 处 Unicode 符号当图标换成 AmIcon(并把判据扩到"排版符号"这一类)
起因:做邮件详情时顺手把 `Text('‹')` 换成 `AmIcon('chevronLeft')`,
想着"本仓不是有这条判据吗,怎么没抓到" —— 去看了判据,发现它**只扫 emoji 那一段**。
判据(`harmony-arkts.test.mjs:168`)扫的是 U+2600–27BF / U+2B00–2BFF / U+FE0F,
而漏网的 5 处全在这三段**之外**:
MainPage.ets Text('‹') 返回键(会话视图)
MainPage.ets Text('›') 会话别名前的小箭头
SettingsPage.ets Text('›') 「管理」的进入下一级指示
ComposePage.ets Text(' ▾') 账号下拉指示
MailDetailPage.ets Text('‹') 返回键
★ 它们与 emoji 那类**问题不同、但同样是"看着像图标其实不是"**:
· 字形宽窄由**字体**决定,与旁边 20vp 的 `AmIcon` 对不齐;
· 而且**WebUI 用的根本不是字符** —— `icons.tsx:135` 是
`ChevronRightIcon`(SVG)、`AccountSwitcher.tsx:84` 是它**转 90°**。
所以这同时是"两端不一致",不只是"字形不好看"。
修法:5 处一律换 `AmIcon`,并按 WebUI 的**同一形状**给:
· 两个返回键 → `chevronLeft` 20vp、可点区 `HEADER_BACK_HIT`(与 `AppHeader` 同值)
· 会话别名 / 「管理」→ `chevronRight`
· 账号下拉 → `chevronRight` + `rotate(open ? 90 : 0)`(照 `AccountSwitcher` 那句)
★ 判据扩了一类(`GLYPH_ISH`:U+2039/203A/00AB/00BB/25A0–25CF/25B2/25BC/25C0/25B6),
并保持原有那条边界不被破坏:**U+2190–21FF 基本箭头仍不扫** ——
`→`/`←` 在正文里是标点,扫进来会误伤大量正常文案(原注释里已经踩过这个坑)。
这次的符号是"单个字符整体",所以 `Text('a → b')` 这类多字符本来也不匹配。
★ 扩完之后判据**当场又抓到一处我自己没注意的**(`SettingsPage.ets` 的 `›`)——
这正是"把判据从'枚举实例'扩到'枚举类'立刻多抓一个"的现场证据,
也说明原来那三条区间是照"已经出现过的实例"框的,不是照"这类东西的共同形状"框的。
This commit is contained in:
@ -309,7 +309,15 @@ export struct ComposeView {
|
||||
.fontSize(13).fontColor(Theme.accentFor())
|
||||
.layoutWeight(1)
|
||||
.onClick(() => { this.showAccountPicker = !this.showAccountPicker; })
|
||||
Text(' ▾').fontSize(12).fontColor(Theme.textSubtleFor())
|
||||
/*
|
||||
* 下拉指示 —— 与 WebUI `AccountSwitcher.tsx:84` 逐项对齐:
|
||||
* <ChevronRightIcon className={`w-3 h-3 transition-transform
|
||||
* ${open ? 'rotate-90' : ''}`} />
|
||||
* 即**同一个右尖括号图标,展开时转 90°**(不是一个专门的"下箭头")。
|
||||
* 原来这里写的是 `Text(' ▾')` —— 一个 Unicode 字符(本仓禁用当图标)。
|
||||
*/
|
||||
AmIcon({ iconName: 'chevronRight', iconSize: 12, iconColor: Theme.textSubtleFor() })
|
||||
.rotate({ angle: this.showAccountPicker ? 90 : 0 })
|
||||
.onClick(() => { this.showAccountPicker = !this.showAccountPicker; })
|
||||
}
|
||||
.width('100%').height(40).padding({ left: 12, right: 12 })
|
||||
|
||||
@ -16,7 +16,7 @@ import { MailDetail, SendMailRequest, ForwardMailRequest, Address } from '../mod
|
||||
import { MailDetailParams } from '../model/RouteParams';
|
||||
import { AmIcon } from '../common/Icons';
|
||||
import { permissionLabel } from '../model/MailGrouping';
|
||||
import { LIST_FADE_LENGTH } from '../model/NavItems';
|
||||
import { LIST_FADE_LENGTH, HEADER_BACK_HIT } from '../model/NavItems';
|
||||
import { LengthMetrics } from '@kit.ArkUI';
|
||||
import {
|
||||
participantAddress,
|
||||
@ -651,11 +651,21 @@ export struct MailDetailView {
|
||||
*/
|
||||
Column() {
|
||||
Row() {
|
||||
Text('‹')
|
||||
.fontSize(24).fontColor(Theme.accentFor())
|
||||
.width(36).height(36)
|
||||
.textAlign(TextAlign.Center)
|
||||
.onClick(() => { this.goBack(); })
|
||||
/*
|
||||
* 返回键 —— **用图标,不用 `‹` 这个 Unicode 字符**。
|
||||
*
|
||||
* ★ 本仓明令禁止把 Unicode 符号当图标(渲染依赖字体、各家字形宽窄不一,
|
||||
* 还会被部分主题替换成 emoji 字形)。全仓已统一走 `AmIcon` + `ICON_PATHS`,
|
||||
* 这里是**最后一处漏网**(其它页面 2026-09-19 那批已经换过)。
|
||||
*
|
||||
* 尺寸按 `NAV_ITEM_MIN_HIT` 的口径给足 44vp 可点区 ——
|
||||
* `AppHeader` 的返回键就是这个尺寸,两处要对齐。
|
||||
*/
|
||||
Stack({ alignContent: Alignment.Center }) {
|
||||
AmIcon({ iconName: 'chevronLeft', iconSize: 20, iconColor: Theme.accentFor() })
|
||||
}
|
||||
.width(HEADER_BACK_HIT).height(HEADER_BACK_HIT)
|
||||
.onClick(() => { this.goBack(); })
|
||||
|
||||
Row() {
|
||||
Text(this.subject)
|
||||
|
||||
@ -88,6 +88,7 @@ import {
|
||||
NAV_CONTENT_RESERVE,
|
||||
NAV_ITEM_MIN_HIT,
|
||||
NAV_ITEMS,
|
||||
HEADER_BACK_HIT,
|
||||
TAB_BAR_RADIUS,
|
||||
TAB_BAR_SIDE,
|
||||
TAB_BAR_TOP,
|
||||
@ -2198,9 +2199,12 @@ struct ContactsTab {
|
||||
Column() {
|
||||
/* 返回行:与 WebUI 的 `BackButton label="会话"` 同一语义 */
|
||||
Row() {
|
||||
Text('‹').fontSize(24).fontColor(Theme.accentFor()).width(36).height(36)
|
||||
.textAlign(TextAlign.Center)
|
||||
.onClick(() => { this.closeSession(); })
|
||||
/* 返回键用图标,不用 `‹`(本仓禁 Unicode 符号当图标 —— 见 Icons.ets) */
|
||||
Stack({ alignContent: Alignment.Center }) {
|
||||
AmIcon({ iconName: 'chevronLeft', iconSize: 20, iconColor: Theme.accentFor() })
|
||||
}
|
||||
.width(HEADER_BACK_HIT).height(HEADER_BACK_HIT)
|
||||
.onClick(() => { this.closeSession(); })
|
||||
Text(this.openSessionTitle)
|
||||
.fontSize(14).fontWeight(FontWeight.Bold).fontColor(Theme.textPrimary)
|
||||
.maxLines(1).textOverflow({ overflow: TextOverflow.Ellipsis })
|
||||
@ -2292,7 +2296,9 @@ struct ContactsTab {
|
||||
.width('100%')
|
||||
|
||||
Row() {
|
||||
Text('›').fontSize(12).fontColor(Theme.accentFor())
|
||||
/* WebUI `ContactPanel.tsx:247` 这里是 `<ChevronRightIcon className="w-3 h-3">`
|
||||
—— 一个 SVG 图标,不是 `›` 这个字符。逐项对齐。 */
|
||||
AmIcon({ iconName: 'chevronRight', iconSize: 12, iconColor: Theme.accentFor() })
|
||||
Text(c.session_alias.length > 0 ? c.session_alias : '(未命名会话)')
|
||||
.fontSize(11).fontColor(Theme.accentFor())
|
||||
.maxLines(1).textOverflow({ overflow: TextOverflow.Ellipsis })
|
||||
|
||||
@ -1188,7 +1188,9 @@ export struct SettingsPane {
|
||||
Row() {
|
||||
Text('管理').fontSize(Theme.fontBody).fontColor(Theme.textPrimary)
|
||||
.layoutWeight(1)
|
||||
Text('›').fontSize(Theme.fontBody).fontColor(Theme.textSubtleFor())
|
||||
/* 「进入下一级」指示:用图标不用 `›`(本仓禁 Unicode 符号当图标;
|
||||
口径与 `MailList`/`ContactPanel` 的 chevron 一致) */
|
||||
AmIcon({ iconName: 'chevronRight', iconSize: 14, iconColor: Theme.textSubtleFor() })
|
||||
}
|
||||
.width('100%')
|
||||
Text('用户管理(新建 / 编辑 / 启停 / 重置密码)')
|
||||
|
||||
Reference in New Issue
Block a user