diff --git a/.ua/index.json b/.ua/index.json index 20dab59..2e26980 100644 --- a/.ua/index.json +++ b/.ua/index.json @@ -1,6 +1,6 @@ { "$schema": "ui-arch-registry-index/0.1", - "generatedAt": "2026-10-26T03:13:07.810Z", + "generatedAt": "2026-10-26T03:31:05.626Z", "repoRoot": ".", "packages": [ { @@ -1183,8 +1183,8 @@ "steps": [ "创建信号 tab = signal('a'),初值为默认页签", "tabs 只渲染页签头;页签内容用响应式函数按信号切换,如 () => tab() === 'a' ? panelA : panelB", - "点击或方向键(←→ 环形)切换,滑动指示条自动跟随;disabled: true 的页签置灰不可点", - "键盘可访问:Tab 聚焦激活页签,←→ 在启用页签间环形移动" + "点击或方向键(←→ 环形)、Home/End(直达首/末页签)切换,滑动指示条自动跟随;disabled: true 的页签置灰不可点", + "键盘可访问:Tab 聚焦激活页签,←→ 在启用页签间环形移动,Home/End 跳首个/末个启用页签" ] }, { diff --git a/llms-full.txt b/llms-full.txt index 28c1177..cef9cb3 100644 --- a/llms-full.txt +++ b/llms-full.txt @@ -1,6 +1,6 @@ # @ui-arch 组件库 Agent 文档(无图形版) -> 自动生成于 2026-10-26T03:13:07.810Z,数据源:各包 ua.manifest.json,勿手改。人类版文档站:apps/docs/index.html。 +> 自动生成于 2026-10-26T03:31:05.626Z,数据源:各包 ua.manifest.json,勿手改。人类版文档站:apps/docs/index.html。 > 组件 = 普通函数,传 props 返回 DOM;状态用 signal 双向绑定:读 signal() 写 signal(v)。 ## 快速上手 @@ -655,8 +655,8 @@ const tab = signal('a'); tabs({ tabs: [{ value: 'a', label: '概览' }, { value: 1. 创建信号 tab = signal('a'),初值为默认页签 2. tabs 只渲染页签头;页签内容用响应式函数按信号切换,如 () => tab() === 'a' ? panelA : panelB -3. 点击或方向键(←→ 环形)切换,滑动指示条自动跟随;disabled: true 的页签置灰不可点 -4. 键盘可访问:Tab 聚焦激活页签,←→ 在启用页签间环形移动 +3. 点击或方向键(←→ 环形)、Home/End(直达首/末页签)切换,滑动指示条自动跟随;disabled: true 的页签置灰不可点 +4. 键盘可访问:Tab 聚焦激活页签,←→ 在启用页签间环形移动,Home/End 跳首个/末个启用页签 现场演示:apps/docs/demo.html#sec-tabs-modal diff --git a/packages/skin/ui/src/tabs.ts b/packages/skin/ui/src/tabs.ts index 5f3f94a..3eaa281 100644 --- a/packages/skin/ui/src/tabs.ts +++ b/packages/skin/ui/src/tabs.ts @@ -38,15 +38,16 @@ export function tabs(props: TabsProps): HTMLElement { } head.addEventListener('keydown', (e: KeyboardEvent) => { - const delta = e.key === 'ArrowRight' ? 1 : e.key === 'ArrowLeft' ? -1 : 0; - if (!delta) return; // 卫语句:非方向键放行 + const delta = e.key === 'ArrowRight' ? 1 : e.key === 'ArrowLeft' ? -1 : 0; // 方向键步长 + const edge = e.key === 'Home' ? 'first' : e.key === 'End' ? 'last' : ''; // 首/末页签直达 + if (!delta && !edge) return; // 卫语句:非导航键放行 const list = buttons.filter((b) => !b.disabled); const i = list.indexOf(document.activeElement as HTMLButtonElement); if (i < 0) return; // 卫语句:焦点不在页签上 e.preventDefault(); - const next = list[(i + delta + list.length) % list.length]; // 环形移动 - next.focus(); - next.click(); + const next = delta ? list[(i + delta + list.length) % list.length] : edge === 'first' ? list[0] : list[list.length - 1]; // 环形移动 / Home-End 直达 + next?.focus(); + next?.click(); }); effect(sync); diff --git a/packages/skin/ui/ua.manifest.json b/packages/skin/ui/ua.manifest.json index e10e3d8..733fce2 100644 --- a/packages/skin/ui/ua.manifest.json +++ b/packages/skin/ui/ua.manifest.json @@ -1054,8 +1054,8 @@ "steps": [ "创建信号 tab = signal('a'),初值为默认页签", "tabs 只渲染页签头;页签内容用响应式函数按信号切换,如 () => tab() === 'a' ? panelA : panelB", - "点击或方向键(←→ 环形)切换,滑动指示条自动跟随;disabled: true 的页签置灰不可点", - "键盘可访问:Tab 聚焦激活页签,←→ 在启用页签间环形移动" + "点击或方向键(←→ 环形)、Home/End(直达首/末页签)切换,滑动指示条自动跟随;disabled: true 的页签置灰不可点", + "键盘可访问:Tab 聚焦激活页签,←→ 在启用页签间环形移动,Home/End 跳首个/末个启用页签" ] }, {