Repository navigation
Replies: 5 comments
|
这是 #279 的指南初稿(中文全文)。英文版会随 docs PR 一起提供,指向同一套清单与验收方式。 范围说明:只要求「桌面不变 + 小屏可用」,不重做交互;文中的 dsh-global-todo 是样板,未公开发布的部分已注明。 移动端插件适配指南(初稿)
英文摘要见文末 English summary。 1. 移动页是怎么承载你的插件的先理解宿主,再改自己的面板。DSH Mobile 在已认证的手机页面上使用专用布局,插件仍然由 DSH 正常加载:
2. 核心决定:用「实测宽度」,不要用 UA 或 viewport推荐做法:测量面板自身的宽度,按阈值切换移动档。 // 在面板根节点上过一次测量;ResizeObserver 保证侧栏折叠、窗口变窄也会重新判断
const MOBILE_MAX_WIDTH = 600
const [panelWidth, setPanelWidth] = useState(null)
const isMobile = panelWidth !== null && panelWidth <= MOBILE_MAX_WIDTH
useEffect(() => {
const element = rootRef.current
if (element === null) return undefined
const measure = () => setPanelWidth(element.getBoundingClientRect().width)
measure()
window.addEventListener('resize', measure)
const observer = typeof window.ResizeObserver === 'function' ? new window.ResizeObserver(measure) : null
observer?.observe(element)
return () => {
window.removeEventListener('resize', measure)
observer?.disconnect()
}
}, [])// 根节点带出状态,CSS 只认这一个开关
h('div', { className: 'my-panel', 'data-mobile': isMobile ? '1' : '0' }, …)为什么不用
阈值选 600px 不是规定。已有的双列断点(例如 ≥960px 开第二列)继续保留,两者互不冲突: 3. 适配清单每条都给出「为什么」和「最小做法」。按影响从大到小排列。 3.1 触控目标 ≥44px为什么:桌面尺寸的 28–32px 按钮在手机上点不中,误触比慢更烦。 [data-mobile="1"] .check { position: relative; }
[data-mobile="1"] .check::after { content: ''; position: absolute; inset: -10px; }常见错:把整张卡片都放大。命中区可以扩,视觉尺寸不必跟着变。 3.2 横向 chip / 标签条改为可横滑为什么:手机上筛选条、分组标签是最先被裁掉的东西,而且被裁的那几个往往正是「只在有数据时才出现」的过滤器。 [data-mobile="1"] .chips {
flex-wrap: nowrap; overflow-x: auto; overflow-y: hidden;
padding: 0; scrollbar-width: none; -webkit-overflow-scrolling: touch;
}
[data-mobile="1"] .chips::-webkit-scrollbar { display: none; }
[data-mobile="1"] .chip { flex: 0 0 auto; min-height: 44px; }常见错:只给容器 3.3 行内文字动作收成图标为什么:一行里的「交给 Agent」「编辑」「更多」并排,会吃掉标题的宽度,把正文挤成两三行。 h('button', { className: 'btn', 'aria-label': dispatchLabel }, h(Icon, { name: 'play' }), h('span', { className: 'btn-label' }, dispatchLabel))[data-mobile="1"] .btn-label { display: none; }
[data-mobile="1"] .btn { min-width: 44px; padding: 0; justify-content: center; }常见错:连唯一入口一起藏掉。文字可以消失,动作不能消失。 3.4 隐藏桌面专属提示为什么: 3.5 底部安全区 + 滚动边界为什么:面板自己是滚动容器时,外壳的顶部安全区管不到列表末尾;惯性滚动还可能把背后页面一起带着走。 [data-mobile="1"] .inner { padding-bottom: max(28px, calc(14px + env(safe-area-inset-bottom))); }
[data-mobile="1"] .list { overscroll-behavior: contain; }3.6 字号跟随外壳变量为什么:DSH Mobile 有「移动端字号」设置,外壳把它放在 [data-mobile="1"] .panel { font-size: var(--dsh-content-font-size, 15px); }
[data-mobile="1"] .meta { font-size: max(12px, 0.8em); }桌面没有这个变量,回退值即可,不会影响电脑。 3.7 弹层与表单:贴边、单列为什么:固定 360px 的设置卡放进 390px 视口会两边被切;两列表单在手机上挤成一条。 [data-mobile="1"] .settings { width: auto; max-width: none; }
[data-mobile="1"] .form-row { grid-template-columns: minmax(0, 1fr); }
[data-mobile="1"] textarea { min-height: 96px; }3.8 标题区压缩、列表密度为什么:手机首屏要留给内容。20px 标题 + 两行副标题 + 三个按钮会占掉四分之一屏。 4. 验证:让适配可回归适配最容易烂在「只有真机能看出来」。下面这套做法可以让大部分回归在 CI 里发现。 4.1 给静态预览夹具加
|
| 项 | 值 |
|---|---|
| 信号 | 面板实测宽度 ≤600px → data-mobile="1";桌面不变 |
| 触控 | 按钮/输入/筛选 44px;圆形勾选框保持 24px 视觉 + 伪元素扩命中区 |
| 信息密度 | 行内「交给 Agent」收成图标(aria-label 保留);「谁加的」移入详情;meta 从「每条独占一行」回到每行 2–3 条 |
| 横向条 | 筛选 chip 单行横滑,隐藏分隔条;工具栏改单列、搜索满宽 |
| 桌面提示 | / 角标与 kbd 隐藏 |
| 安全区 | 底部 max(28px, 14px + env(safe-area-inset-bottom));列表 overscroll-behavior: contain |
| 字号 | 正文取 --dsh-content-font-size(回退 15px) |
| 弹层 | 设置卡贴两边、保留实测 top,不再固定 360px |
| 结果 | 390×844 卡片高度约 250px → 150px;所有目标 ≥44px;桌面截图逐像素不变 |
| 可回归 | 预览夹具加 --width=390;渲染检查断言移动分支与三条关键规则;生成 390×844 基线 |
改动只用了三个稳定挂钩:data-mobile(开关)、一个文字标签的包装类(用于收起)、以及一到两个「移动档要隐藏的事实」的类名(例如创建者归属)。没有第二套渲染路径——详情仍然只有一份实现。
6. 给插件作者的模板
6.1 Issue 模板
## 插件与小屏
- 插件名/版本:
- 面板位置(侧栏入口 / 主面板 / 其他):
- 手机与 App(或浏览器)版本:
- 现象(截图/录屏):
- 期望(只要求「桌面不变 + 小屏可用」):
## 验收清单
- [ ] 触控目标 ≥44px
- [ ] 横向 chip 可横滑、无被裁的尾部
- [ ] 行内文字动作收成图标且保留可访问名称
- [ ] 桌面专属提示已隐藏
- [ ] 底部安全区与 overscroll 处理
- [ ] 字号跟随 --dsh-content-font-size
- [ ] 弹层/表单在 390px 下不溢出
- [ ] 桌面截图无回归6.2 PR 检查表
- 只有一份渲染/详情实现,没有为移动复制第二套;
- 断点基于实测宽度,不是 UA/viewport;
- 移动规则全部挂在同一个开关下,桌面选择器未改动;
- 演示用的静态预览可以指定宽度,且窄屏分支真的被执行;
- 渲染检查里新增了结构断言;桌面基线已对比;
- 真机未验的部分在描述里写明(键盘、安全区、惯性滚动)。
7. 边界与反模式
- 不要由移动层按类名注入第三方 CSS:类名一变就碎,而且会同时影响桌面。
- 不要为移动端复制一套组件树:两份实现一定会在第一个字段变更时分叉。
- 不要承诺「所有插件都能适配」:后台型、依赖原生窗口的插件不在此列。
- 不要把「能滚动」当成验收通过:还要看首个异常、实际尺寸和焦点顺序。
|
@saya-ch 打扰一下,想请你看一眼这条提案,顺便把同类诉求一起收拢 🙏 这条提案只要一个决定:要不要让「移动端插件适配」以可执行的清单 + 一个样板的形式成为正式入口(置顶讨论 / issue 模板 / 写进贡献流程,三者选一或组合)。其余都是执行细节。 已经落地的部分(不需要你先投入时间):
同方向的另两条:#277(讨论区 / 短视频 / 站点入口)、#278(社群与网页)——如果你觉得该并到一条路线里,我可以在那边补一句指向这里,避免三条各聊各的。 想请你定三件事:
你给个方向就行,执行我这边来。 @saya-ch a quick ping — this proposal only needs one decision: should mobile plugin adaptation become a formal entry point (pinned discussion, issue template, or contribution-flow text) built on the executable checklist plus one worked example? The guide already landed: #280 merged this morning as |
--- English ---
|
|
感谢这份提案。指南已经通过 #280 落地;我倾向于把移动适配保持为文档建议,不设为正式入口,也不代表 DSH 官方标准。同类议题建议集中在这一个讨论里,避免分散。 |
Uh oh!
There was an error while loading. Please reload this page.
中文
问题
DSH Mobile 的立场很清楚:移动层负责布局与连接,具体插件在小屏上好不好用,取决于插件自己。这一定位是对的,但留下一个空档:
提议
开一条轻量的移动适配线,四步:
适配清单(草案)
/快捷键、kbd角标)在小屏隐藏。env(safe-area-inset-bottom);列表容器设overscroll-behavior: contain。--dsh-content-font-size,让「移动端字号」设置生效。aria-label;不隐藏唯一入口。--width=390档;没有的话,用 390×844 截图加一份手工检查表。样板:dsh-global-todo
我们把这个流程在自己的插件上走了一遍(0.19.0 的移动档,尚未公开发布),可以作为参照:
data-mobile(≤600px),桌面一字不动;/提示;底部让出安全区;字号取--dsh-content-font-size;设置弹层贴两边而不是固定 360px;--width=390(让静态 harness 回答面板的宽度测量),把移动分支纳入渲染检查,并生成 390×844 的基线截图。这样下次改样式不需要真机就能发现回归。边界
征求
docs/指南或置顶讨论的形式存在?我们这边可以先出指南初稿、把 dsh-global-todo 的适配整理成可对照的 diff 与截图,并挑 1–2 个插件在作者同意后提适配 PR。
English
The gap
DSH Mobile's position is clear: the mobile layer owns layout and connectivity, and whether a plugin is usable on a small screen is the plugin's own responsibility. That is the right boundary, but it leaves a gap:
Proposal
A lightweight mobile-adaptation track, in four steps:
Adaptation checklist (draft)
/shortcut,kbdhints) are hidden on a phone.env(safe-area-inset-bottom); give the list containeroverscroll-behavior: contain.--dsh-content-font-sizeso the mobile text-size setting applies.aria-label, but never hide the only entry point.--width=390mode; if not, use 390×844 screenshots plus a manual checklist.Worked example: dsh-global-todo
We ran this flow on our own plugin (the 0.19.0 mobile layout, not yet published publicly):
data-mobilebranch keyed on the panel's measured width (600px or less); desktop untouched./hint disappears; the bottom padding yields to the safe area; type follows--dsh-content-font-size; the settings sheet spans both edges instead of a fixed 360px card.--width=390mode (a static harness that answers the panel's width measurement), the mobile branch is asserted on every render check, and 390×844 baselines are generated. Style changes can be caught without a device.Boundaries
Asking
docs/guide or a pinned discussion?We can start with the guide draft, turn the dsh-global-todo work into a reference diff plus screenshots, and approach one or two plugins with an adaptation PR once the author agrees.
All reactions