From 63351dcaba1c5256710834c9e10977a42350cc84 Mon Sep 17 00:00:00 2001 From: HIsheR Date: Mon, 26 Oct 2026 20:05:07 +0800 Subject: [PATCH] =?UTF-8?q?iter(g224):=20=E6=94=B6=E8=B5=B7=E6=80=81?= =?UTF-8?q?=E4=B8=8A=E4=B8=8B=E9=94=AE=E5=BE=AE=E8=B0=83=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- llms-full.txt | 3 ++- packages/skin/ui/src/timePicker.ts | 13 ++++++++++--- packages/skin/ui/ua.manifest.json | 3 ++- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/llms-full.txt b/llms-full.txt index 6234e4b..f4624f4 100644 --- a/llms-full.txt +++ b/llms-full.txt @@ -1,6 +1,6 @@ # @ui-arch 组件库 Agent 文档(无图形版) -> 自动生成于 2026-10-26T12:04:13.764Z,数据源:各包 ua.manifest.json,勿手改。人类版文档站:apps/docs/index.html。 +> 自动生成于 2026-10-26T12:04:54.649Z,数据源:各包 ua.manifest.json,勿手改。人类版文档站:apps/docs/index.html。 > 组件 = 普通函数,传 props 返回 DOM;状态用 signal 双向绑定:读 signal() 写 signal(v)。 ## 快速上手 @@ -2016,6 +2016,7 @@ const at = signal('09:30'); timePicker({ value: at, minuteStep: 15, onChange: (t 6. 需要允许回到「未选」态就传 clearable: true:有值时触发器右侧出现 ×(不进 Tab 序),聚焦触发器按 Delete / Backspace 也能清空,回调收到空串 7. 要和输入框并排对齐就传 size(sm / md / lg):高度走 --ua-control-h-* 三档,与 textField、select 的档位完全同源,不会出现「旁边的输入框矮 6px」 8. 传入值不在步长档上时(如 09:07 + 15 分钟档)不会「没有高亮」:分列按最近档高亮并滚到位,点它即落到 09:15;原值在触发器上照常显示,直到用户重新选 +9. 收起态键盘微调:聚焦触发器按 ↑↓ 按步长加减(12:30 步长 15 → 12:45),Shift + ↑↓ 按小时加减,跨 00:00 / 23:xx 自动环形;改完同样触发 onChange 现场演示:apps/docs/demo.html#sec-timepicker diff --git a/packages/skin/ui/src/timePicker.ts b/packages/skin/ui/src/timePicker.ts index 360bdb3..2f56ef5 100644 --- a/packages/skin/ui/src/timePicker.ts +++ b/packages/skin/ui/src/timePicker.ts @@ -127,10 +127,17 @@ export function timePicker(props: TimePickerProps): HTMLElement { effect(() => { clearBtn.hidden = !clearable || !value(); }); // 无值或未开启时藏起来(hidden 一并移出点击区) root.addEventListener('keydown', (e: KeyboardEvent) => { - if (open() || !clearable) return; // 卫语句:展开时按键归列内导航,未开启清空则不接管 - if (e.key !== 'Backspace' && e.key !== 'Delete') return; // 卫语句:只接管这两个键 + if (open()) return; // 卫语句:展开时按键归列内导航 + if (clearable && (e.key === 'Backspace' || e.key === 'Delete')) { // 收起态清空:不必伸手去点 × + e.preventDefault(); + clear(); + return; + } + if (!value() || (e.key !== 'ArrowUp' && e.key !== 'ArrowDown')) return; // 卫语句:无值不猜、只管上下键 e.preventDefault(); - clear(); // 键盘等价:不必伸手去点 × + const delta = (e.key === 'ArrowUp' ? 1 : -1) * (e.shiftKey ? 60 : step); // Shift + ↑↓ 按小时调,否则按步长调 + const total = (Number(picked().hh) * 60 + Number(picked().mm) + delta + 1440) % 1440; // 环形:00:00 的上一档回到 23:xx + commit(pad(Math.floor(total / 60)), pad(total % 60)); // 收起态改值同样派发 onChange }); bindOutside(root, open, () => open(false)); // 点外部收起:仅展开期间挂监听 effect(() => { diff --git a/packages/skin/ui/ua.manifest.json b/packages/skin/ui/ua.manifest.json index 68687a3..4d42271 100644 --- a/packages/skin/ui/ua.manifest.json +++ b/packages/skin/ui/ua.manifest.json @@ -3704,7 +3704,8 @@ "需要 15 分钟一档就传 minuteStep: 15,步长只影响分列的可选值,时列始终 24 档", "需要允许回到「未选」态就传 clearable: true:有值时触发器右侧出现 ×(不进 Tab 序),聚焦触发器按 Delete / Backspace 也能清空,回调收到空串", "要和输入框并排对齐就传 size(sm / md / lg):高度走 --ua-control-h-* 三档,与 textField、select 的档位完全同源,不会出现「旁边的输入框矮 6px」", - "传入值不在步长档上时(如 09:07 + 15 分钟档)不会「没有高亮」:分列按最近档高亮并滚到位,点它即落到 09:15;原值在触发器上照常显示,直到用户重新选" + "传入值不在步长档上时(如 09:07 + 15 分钟档)不会「没有高亮」:分列按最近档高亮并滚到位,点它即落到 09:15;原值在触发器上照常显示,直到用户重新选", + "收起态键盘微调:聚焦触发器按 ↑↓ 按步长加减(12:30 步长 15 → 12:45),Shift + ↑↓ 按小时加减,跨 00:00 / 23:xx 自动环形;改完同样触发 onChange" ] } ]