dsh-pocket 2.6.2 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/client/api.js +0 -3
- package/client/client.js +259 -419
- package/client/index.jsx +0 -125
- package/client/mobile/fileCopy.ts +115 -0
- package/client/mobile/mobile-apply.tsx +9 -11
- package/client/mobile/mobile.css.ts +36 -44
- package/client/pocket-locales.js +0 -38
- package/lib/index.js +1 -8
- package/lib/proxy.mjs +2 -2
- package/lib/settings.mjs +0 -75
- package/lib/web-rpc.js +1 -20
- package/package.json +1 -1
- package/client/mobile/MobileComposerFullscreen.tsx +0 -77
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
// 手机端「⛶ 放大输入」开关(issue #23)
|
|
2
|
-
//
|
|
3
|
-
// 行为:
|
|
4
|
-
// - 点击切换 body 属性 `data-dsh-pocket-composer-fullscreen`;
|
|
5
|
-
// - mobile.css.ts 监听这个属性,把 composer 卡片固定到全屏(textarea 拉高、工具行
|
|
6
|
-
// 全部展开),插件 UI 注册到 conversation.input.* slot 的按钮全部恢复显示;
|
|
7
|
-
// - 默认(无 fullscreen 属性)下,CSS 把这些 slot 全部隐藏,只保留官方 resident
|
|
8
|
-
// chrome(权限/plan/模型/发送)。新插件只要注册到 input slot 就自动遵守此规则,
|
|
9
|
-
// 无需逐个适配。
|
|
10
|
-
//
|
|
11
|
-
// 实现细节:
|
|
12
|
-
// - 不依赖 dsh web 把 data-slot 包装暴露给选择器(0.1.1 没,0.1.2+ 才有)。我们用
|
|
13
|
-
// `:scope > :not([data-mobile-nav-keep])` 这样的「保留」标记:所有插件如果
|
|
14
|
-
// 想在手机未放大时也露出,加 data-mobile-nav-keep="1" 即可。默认隐藏的是
|
|
15
|
-
// slot 容器下的所有直接子元素,**包含 dsh web 官方自己注入的**(这些是
|
|
16
|
-
// 我们想隐藏的"插件 UI"——只要不冲突)。所以需要 dsh web 在官方自己的 UI 上
|
|
17
|
-
// 加 `data-mobile-nav-keep` 标记——等 dsh 0.1.2+ data-slot 上线后改用那个
|
|
18
|
-
// 更优雅(CSS 选择器变成 `[data-slot=...] > :not([data-mobile-nav-keep])`)。
|
|
19
|
-
import { createElement as h, useEffect, useState } from 'react';
|
|
20
|
-
|
|
21
|
-
const FULLSCREEN_ATTR = 'data-dsh-pocket-composer-fullscreen';
|
|
22
|
-
|
|
23
|
-
function isFullscreen() {
|
|
24
|
-
return typeof document !== 'undefined' && document.body?.getAttribute(FULLSCREEN_ATTR) === '1';
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function setFullscreen(on) {
|
|
28
|
-
if (typeof document === 'undefined') return;
|
|
29
|
-
if (on) document.body.setAttribute(FULLSCREEN_ATTR, '1');
|
|
30
|
-
else document.body.removeAttribute(FULLSCREEN_ATTR);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* 放大输入按钮:注册到 `conversation.input.right`,id `mobile-composer-fullscreen`。
|
|
35
|
-
* 仅在窄屏(max-width:1023px)显示,桌面端由 CSS 隐藏。
|
|
36
|
-
*/
|
|
37
|
-
export function MobileComposerFullscreen() {
|
|
38
|
-
const [on, setOn] = useState(isFullscreen);
|
|
39
|
-
useEffect(() => {
|
|
40
|
-
const update = () => setOn(isFullscreen());
|
|
41
|
-
// 与其它 effect 协调:监听任何对 body 属性的修改即可(设置项自己改也算)
|
|
42
|
-
const observer = new MutationObserver(update);
|
|
43
|
-
observer.observe(document.body, { attributes: true, attributeFilter: [FULLSCREEN_ATTR] });
|
|
44
|
-
return () => observer.disconnect();
|
|
45
|
-
}, []);
|
|
46
|
-
return h('button', {
|
|
47
|
-
type: 'button',
|
|
48
|
-
'aria-label': on ? '收起输入' : '放大输入',
|
|
49
|
-
'aria-pressed': on,
|
|
50
|
-
title: on ? '收起输入' : '放大输入',
|
|
51
|
-
'data-mobile-nav': 'composer-fullscreen',
|
|
52
|
-
'data-mobile-nav-keep': '1', // 自己的按钮不该被 #23 的 slot 通用隐藏规则误伤
|
|
53
|
-
onClick: () => {
|
|
54
|
-
const next = !isFullscreen();
|
|
55
|
-
setFullscreen(next);
|
|
56
|
-
setOn(next);
|
|
57
|
-
},
|
|
58
|
-
style: {
|
|
59
|
-
appearance: 'none',
|
|
60
|
-
WebkitAppearance: 'none',
|
|
61
|
-
border: 'none',
|
|
62
|
-
background: 'transparent',
|
|
63
|
-
color: 'inherit',
|
|
64
|
-
cursor: 'pointer',
|
|
65
|
-
padding: '0 8px',
|
|
66
|
-
height: 32,
|
|
67
|
-
minWidth: 32,
|
|
68
|
-
borderRadius: 6,
|
|
69
|
-
display: 'inline-flex',
|
|
70
|
-
alignItems: 'center',
|
|
71
|
-
justifyContent: 'center',
|
|
72
|
-
font: 'inherit',
|
|
73
|
-
fontSize: 16,
|
|
74
|
-
lineHeight: 1,
|
|
75
|
-
},
|
|
76
|
-
}, on ? '⤡' : '⤢');
|
|
77
|
-
}
|