feat(desktop,island,shared): 灵动岛支持多条通知竖排列表 + 触摸模式 + 收回动画,产物加凭据门禁
灵动岛列表:多条通知时展开为竖排列表,默认显示 3 条,点「展开更多」铺到屏幕容纳 上限,放不下的收进「更多请前往应用内操作」。卡片高度由主进程与渲染进程各算一次 同一个数 —— 度量表 ISLAND_LIST_METRICS 与排序权重 PRIORITY_RANK 放在 shared, 窗口包围盒随之长高(不够高会把底部按钮裁掉)。 触摸模式:触摸屏上手指既不产生 mousemove、也不移动系统光标,原先两条命中链路都会 让窗口永远停在穿透态、手指点不开岛。现按 navigator.maxTouchPoints 上报后,主进程把 窗口贴合岛体并始终接收输入;非触摸屏机器完全不走这条路。 收回动画:main 先发 island:closing,渲染进程形变收敛后回 closing-done 才淡出, 不再靠猜时长(rAF 被节流时会把卡片缩到一半窗口就没了)。 安全门禁:新增 scripts/check-bundle-secrets.mjs 并接进 build:desktop —— dist 产物会被打进 app.asar 发到每台学生机、且可解包,冒烟凭据一律改由环境变量注入, 产物里出现种子口令即构建失败。
This commit is contained in:
1 parent
d27f9a4b9e
commit
3880eee08e
22 files changed
+2482
-175
No files matched your search
@@ -7,7 +7,18 @@ import type { IslandAppearance, IslandState } from '@classhelper/shared';
|
||||
*/
|
||||
export interface IslandBridge {
|
||||
onState(handler: (state: IslandState) => void): void;
|
||||
sendAction(action: 'expand' | 'collapse' | 'dismiss' | 'mark-read' | 'open-app', id?: string): void;
|
||||
sendAction(
|
||||
action:
|
||||
| 'expand'
|
||||
| 'expand-list'
|
||||
| 'collapse'
|
||||
| 'dismiss'
|
||||
| 'dismiss-all'
|
||||
| 'mark-read'
|
||||
| 'mark-all-read'
|
||||
| 'open-app',
|
||||
id?: string,
|
||||
): void;
|
||||
getState(): Promise<IslandState>;
|
||||
/** 订阅个性化外观(设置页改动后实时生效) */
|
||||
onAppearance(handler: (appearance: IslandAppearance) => void): void;
|
||||
@@ -16,6 +27,12 @@ export interface IslandBridge {
|
||||
setInteractive(interactive: boolean): void;
|
||||
/** 上报岛体矩形(窗口内 CSS px):主进程据此按光标位置兜底校正命中 */
|
||||
setHitRect(rect: { x: number; y: number; width: number; height: number } | null): void;
|
||||
/**
|
||||
* 上报"本机是触摸屏":主进程据此把窗口改为贴合岛体并始终接收输入。
|
||||
* 触摸屏上按光标判定命中的那套永远打不开(触摸不产生 mousemove、也不动系统光标),
|
||||
* 不上报的话手指点不到岛(希沃白板等触摸设备)。
|
||||
*/
|
||||
setTouchMode(enabled: boolean): void;
|
||||
/** 心跳:主进程据此发现"渲染进程卡死的幽灵窗口"(岛还在屏幕上但点不动)并重建窗口 */
|
||||
alive(): void;
|
||||
}
|
||||
@@ -38,6 +55,9 @@ const bridge: IslandBridge = {
|
||||
setHitRect: (rect) => {
|
||||
ipcRenderer.send('island:set-hit-rect', rect);
|
||||
},
|
||||
setTouchMode: (enabled) => {
|
||||
ipcRenderer.send('island:set-touch-mode', enabled);
|
||||
},
|
||||
alive: () => {
|
||||
ipcRenderer.send('island:alive');
|
||||
},
|
||||
|
||||
Reference in new issue
Block a user