优化: 无障碍批次(可点容器键盘化 + icon-only aria-label)
- P2-2 命名 4 处可点容器键盘可达: ToolCard 卡头 / MessageList 轨迹卡头 / AuditLog audit-row(tr) / conv-list-item —— tabindex+keydown 复用原 handler, div 类加 role=button+aria-expanded; tr 因 role=button 会抹掉行语义故不加 role - P3-2 3 处 icon-only 按钮补 aria-label(EnrichmentPanel 关闭 / ProjectDetail 编辑·删除),复用同 :title 的 i18n key,零新增键 - 硬约束执行: 4 个并行子代理按文件分区,零跨文件改动;主代理独立核查 diff 后修正一处语义缺陷(tr role) - 看板同步: P2-2 销账 / P3-2 部分完成(~12 处待续) / 残留诊断代码 authz_debug 已清销账 / G6 标题泄漏(title.rs sanitize_title_source 双路径)销账 - 验收: bunx vue-tsc --noEmit EXIT 0 + node scripts/check-i18n.cjs 0 失败
This commit is contained in:
@@ -8,7 +8,15 @@
|
||||
:data-risk="riskLevel"
|
||||
>
|
||||
<!-- 卡片头部:图标 + 名称 + 状态 -->
|
||||
<div class="ai-tool-header" @click="emit('toggle', tc.id)">
|
||||
<div
|
||||
class="ai-tool-header"
|
||||
role="button"
|
||||
tabindex="0"
|
||||
:aria-expanded="isExpanded || shouldKeepOpen(tc)"
|
||||
@click="emit('toggle', tc.id)"
|
||||
@keydown.enter.prevent="emit('toggle', tc.id)"
|
||||
@keydown.space.prevent="emit('toggle', tc.id)"
|
||||
>
|
||||
<span class="ai-tool-icon-wrap" :class="'ai-tool-icon-wrap--' + toolCategory(tc.name)">
|
||||
<span v-html="toolIcon(tc.name)"></span>
|
||||
</span>
|
||||
|
||||
@@ -51,7 +51,7 @@ function toggleExpanded(current: boolean) {
|
||||
</svg>
|
||||
<span class="ai-enrichment-badge">{{ enrichmentBadgeText }}</span>
|
||||
</button>
|
||||
<button class="ai-enrichment-dismiss" @click="emit('dismiss')" :title="$t('aiChat.enrichmentDismiss')">×</button>
|
||||
<button class="ai-enrichment-dismiss" @click="emit('dismiss')" :title="$t('aiChat.enrichmentDismiss')" :aria-label="$t('aiChat.enrichmentDismiss')">×</button>
|
||||
<div v-if="enrichmentExpanded" class="ai-enrichment-panel">
|
||||
<div class="ai-enrichment-label">{{ $t('aiChat.enrichmentLabel') }}</div>
|
||||
<pre class="ai-enrichment-body"><code>{{ enrichmentDetailText }}</code></pre>
|
||||
|
||||
@@ -1507,7 +1507,15 @@ defineExpose({
|
||||
每轮思考 pill + 工具卡;头部聚合行含调用/耗时/全程 token 汇总) -->
|
||||
<div v-if="item.kind === 'trace'" class="ai-msg-slot ai-msg-slot--proc">
|
||||
<div class="ai-trace-card" :class="{ 'ai-trace-card--open': item.expanded }" :data-trace-key="item.key">
|
||||
<div class="ai-trace-head" @click="toggleTrace(item.key)">
|
||||
<div
|
||||
class="ai-trace-head"
|
||||
role="button"
|
||||
tabindex="0"
|
||||
:aria-expanded="item.expanded"
|
||||
@click="toggleTrace(item.key)"
|
||||
@keydown.enter.prevent="toggleTrace(item.key)"
|
||||
@keydown.space.prevent="toggleTrace(item.key)"
|
||||
>
|
||||
<span class="ai-trace-chevron" :class="{ 'is-open': item.expanded }">▸</span>
|
||||
<span class="ai-trace-title">{{ $t('ai.trace.roundN', { n: item.round }) }}</span>
|
||||
<span class="ai-trace-agg" :title="traceHoverTitle(item.startTs, item.endTs)">{{ traceAggText(item.stats, item.startTs, item.endTs) }}</span>
|
||||
|
||||
Reference in New Issue
Block a user