fix(island): 重写常驻岛自适应界面与 ClassIsland 动画

This commit is contained in:
LoveChengke committed 2026-10-17 15:12:02 +08:00
1 parent 7f7d3925b2
commit 05848570d1
10 files changed
+1017 -24

No files matched your search

+27 -1
View File
@@ -68,7 +68,7 @@
本机 `islandLayout.residentEnabled` 默认关闭,仅在 custom 模式生效。开启后,现有方案 rows 作为收起内容,新增 expandedRows 保存没有通知时点击展开的内容;两套内容在同一编辑器中切换编辑,随方案复制、导入导出和本机配置一起保存。旧配置自动补齐展开布局,不改变原来的常驻选择。
按本次产品要求,常驻模式中普通、紧急和叫人消息都先提示右侧铃铛及去重后的数量,点击常驻内容、铃铛或按 Enter/空格才展开原通知列表;上课时允许主动查看。没有消息时展开自定义内容,收起、处理完成及通知撤回后保留常驻岛。经典模式与关闭常驻的自定义模式继续使用原提醒规则。
按本次产品要求,常驻模式中普通、紧急和叫人消息都先提示右侧铃铛及去重后的数量,点击常驻内容、铃铛或按 Enter/空格才展开通知列表;上课时允许主动查看。没有消息时展开自定义内容,收起、处理完成及通知撤回后保留常驻岛。经典模式与关闭常驻的自定义模式继续使用原提醒规则。
铃铛固定占位,避免收消息时内容横移。普通组件默认继承行的垂直居中对齐;原先无条件 align-self:stretch 会使不同字号文字从顶部排版,现只在父容器有宽度且明确配置时应用覆盖对齐。时钟采用等宽数字,分隔符保持固定线高,展开页标题与收起按钮在同一基准线上。设置页重新获得焦点时读回本机配置,避免编辑器内改常驻选项后主设置页显示旧值。
@@ -84,6 +84,32 @@
最终构建视觉验收 118/118,随后后台重启检查 43/43、单实例锁和配置句柄释放通过;全仓类型、lint、构建与产物凭据门禁、格式及文档严格检查通过。最终截图为 `.cache/resident-island-ci-final-shots/`,验收日志为 `.cache/resident-island-ci-visual-final.log`。本次不修改业务数据库、不打包或推送发布。
## 常驻岛界面与动画重写
按用户反馈重新读取上游 `ClassicTheme/Styles.axaml`、`Controls/MainWindowLine.cs` 与 `Controls/MainWindowLine.axaml`。
上游背景宽度过渡为 550ms、`cubic-bezier(0,1,.5,1.1)`,内容使用 200ms 的 SineEaseIn 淡入;行高 40、左右留白 12。
本产品需要可交互的通知列表和独立空闲展开页,沿用这些度量、背景曲线与内容淡入,展开页高度也使用同一背景曲线。
旧问题由三个因素叠加:内嵌提醒仍播放 WinIsland 胶囊弹簧,外层 ResizeObserver 把动画中间帧当成自然尺寸,渲染端与主进程各延迟 120ms 调整窗口;外壳 `overflow:auto` 在两端不同步时出现滚动条。
新 `ResidentIsland.vue` 独立渲染常驻内容、空闲页和通知列表,保留既有的消息去重、排序、读回执及按钮动作。
经典渲染器保留挂载和心跳,但在常驻模式停止弹簧循环、兜底定时器和命中上报,不再内嵌到常驻岛。
常驻窗口使用受工作区限制的固定画布,开合不调用逐帧 setBounds,也不再隐藏 320ms 后重新显示。
两页内容按各自未变形的 offsetWidth/offsetHeight 测量,保持自己的排版和缩放;只让一个岛壳过渡尺寸。
内容自然尺寸、配置缩放、字体加载和窗口 resize 决定目标尺寸。长文字先限制宽度并省略,时间、分隔线和文字成组对齐;多行布局整体适配可用宽高。
消息正文限制可见行数,按高度限制列表数量,剩余内容由应用内入口承接;底部动作不被正文挤出,运行界面没有滚动容器。
原生窗口的 show/hide 通过专用白名单桥同步到渲染器;不可见时直接应用目标几何,避免后台 CSS 动画冻结在中间帧。
命中矩形仅在动画期间每 60ms 限流上报,结束时补报;静止时没有动画采样循环。
开合期间暂停指针淡化,避免鼠标留在旧展开区域时因过期命中矩形误触发 5% 透明度,造成收起闪烁。
Windows 触摸模式使用 Electron setShape:动画开始放开绘制区域,完成后只保留岛体及 8px 投影留白的原生区域,透明画布不再长期吞掉周围桌面输入。进入编辑、关闭常驻或关闭触摸模式时清除区域。
新增回归覆盖开合窗口矩形恒定、动画帧间隔、所有运行节点无滚动容器、360×260 窄画布与 2.5 倍缩放、底部右侧停靠、长正文及多通知底部动作、触摸输入区域收敛。测试保持隔离配置与本地通知,不连接真实班级。
本轮视觉验收 123/123,通过连续快速开合与停靠命中检查;1.8 秒取得 109 个动画采样,帧间隔 P95 为 16.8ms,原生窗口矩形只有 1 个。
最终补充收起期间错误淡化的回归后,后台检查 49/49;桌面类型检查、全仓 lint、构建及产物凭据门禁、格式和文档严格构建通过。
视觉记录与截图为 `.cache/resident-rewrite-final-visual.json`、`.cache/resident-rewrite-final-shots/`,最终构建后台记录为 `.cache/resident-rewrite-delivery-quick.json`。
## 十项自检
1. 第三周周三第二节:ClassPlan 的规则与 ClassPlanEntry 的 timeLayoutItemId → `resolveActiveClassPlan` → `loadTermContext/resolveCurrentWeek` → `projectPlan` → `/schedules/active-week` → `refreshIslandSchedule` 的整周 IndexedDB 缓存 → `recomputeClassState` 发送当天课程 → `ComponentNode.vue` 课程表组件。
+5 -1
View File
@@ -1584,12 +1584,16 @@ makensis 临时目录、ClassIsland 路径与日志编码等)。这里只列
天气组件本轮不做:没有可离线使用的数据源,验收不依赖外网。
自定义组件栏位于灵动岛内部,提醒内容也在同一个岛体内展开,不再嵌套另一张带底色的岛卡片。
可在「设置 → 灵动岛」选择常驻岛:收起内容与无通知展开内容分别编辑,并随方案一起导入导出。
常驻模式的新消息(含紧急消息)先亮铃铛和数量,点击岛体或铃铛查看原通知列表;上课时也可主动查看。
常驻模式的新消息(含紧急消息)先亮铃铛和数量,点击岛体或铃铛查看通知列表;上课时也可主动查看。
没有待处理消息时点击岛体,展示自定义的空闲展开页;处理完消息后回到常驻内容。关闭常驻后使用原提醒规则。
铃铛在右侧预留固定空间,收到消息时内容不横移;默认组件按垂直中心对齐,时间使用等宽数字。
常驻外观重新按 ClassIsland 源码对齐:单行基准高 40 px、左右留白 12 px、四档字号 14/16/18/20、时钟使用强调字号 18 px;默认缩放 1×、圆角 8 px、背景不透明度 0.5、行间距 5 px。
窗口设置沿用「指针移入淡化」与「反转指针移入淡化」;普通背景淡化至 5% 并穿透点击,移出恢复。铃铛/展开按钮、编辑模式、已经展开的内容及触摸操作短暂宽限期保持可交互。
界面缩放范围 0.75–2.5×,圆角 0–20 px,背景不透明度 0–1;整体外观可一键恢复 ClassIsland 默认值。
常驻岛独立使用 ClassIsland 经典主题的 550ms 背景尺寸曲线与 200ms 内容淡入;旧胶囊弹簧在常驻模式停止运行。
开合只改变岛壳,原生窗口保持固定画布,避免窗口重排、闪烁和两端尺寸防抖互相追赶。隐藏窗口直接落到目标尺寸。
布局按内容自然尺寸、屏幕可用空间和缩放设置自动适配;长文本限制宽度并省略,同一行的时间、分隔线与文字保持成组对齐,左右及底部停靠保持对应锚点。
通知列表和空闲展开页均不出现滚动条;较多消息按可用高度展示,完整长正文及剩余消息可通过「查看完整内容」进入应用查看,底部操作始终保留。
编辑器左侧按用途添加组件、中央预览岛内排列、右侧只显示当前对象的设置;方案操作收在顶部菜单。
主设置页选择经典或自定义灵动岛,自定义模式的组件尺寸、配色在编辑器中调整,主设置页保留位置与提醒选项。
迁移保留旧 Schedule 作为审计来源;新门面只写新模型。重复占用同一时间点的旧行无法同时成为一节课,