Files
classhelper-island-refactor…/analysis/island-ui.md
T
ClassIsland Prompt Kit 22c1784bab feat: ClassIsland / ClassHelper 灵动岛提示词套件
- 重构版主提示词(14 parts,面向 ClassHelper 灵动岛重构)
- ClassIsland 全量规格提示词(20 parts,含分卷与逐章版本)
- 投喂指南、分卷、逐节文件
- 调研记录、一致性基线、生成与质检脚本
2026-11-12 21:59:58 +08:00

260 lines
26 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# analysis/island-ui.md —— ui-island 工作备注(Part 04 / 05)
- 任务:`task-2`(revision 2,owner: ui-island)
- 产出:`parts/04-main-window.md`(CJK 6501 字)、`parts/05-components.md`(CJK 6982 字)
- 工作方式:只读静态分析。未构建、未运行、未启动任何 UI/脚本、未截图、未安装依赖、未改动 `repos/`。
## 1. 已读文件清单
### 1.1 ClassIsland —— 主界面 / 行 / 主题 / 编辑模式
| 文件 | 读取范围 | 用途 |
|---|---|---|
| `analysis/00-brief.md` | 全文 | 团队总简报、格式与纪律 |
| `repos/ClassIsland/ClassIsland/MainWindow.axaml` | 全文 686 行 | 窗口样式、根布局树、行模板、编辑 UI、原生菜单 |
| `repos/ClassIsland/ClassIsland/MainWindow.axaml.cs` | 全文 1652 行 | 窗口几何、层级、点击穿透、编辑模式、菜单动作 |
| `repos/ClassIsland/ClassIsland/ViewModels/MainViewModel.cs` | 全文 387 行 | `IsEditMode / ActualClientBound / ContainerComponents` 等 |
| `repos/ClassIsland/ClassIsland/Controls/MainWindowLine.axaml` | 全文 79 行 | 行可见性表达式、`:dock-*` 伪类、行淡出 |
| `repos/ClassIsland/ClassIsland/Controls/MainWindowLine.cs` | 全文 815 行 | 行模板部件、淡出判定、提醒队列、鼠标命中 |
| `repos/ClassIsland/ClassIsland/XamlThemes/FluentTheme/Styles.axaml` | 全文 457 行 | 行背景/遮罩/浮层/进度条/动画参数(默认主题) |
| `repos/ClassIsland/ClassIsland/XamlThemes/ClassicTheme/Styles.axaml` | 全文 375 行 | 经典主题的等价参数(TranslateY 遮罩) |
| `repos/ClassIsland/ClassIsland.Core/Assists/MainWindowStylesAssist.cs` | 全文 | 6 个继承型附加属性(圆角/透明度/分体/编辑态等) |
| `repos/ClassIsland/ClassIsland.Core/StylesBase.axaml` | 全文 | `Border.primaryColorZone`、`SettingsContainerWidth` 用法 |
| `repos/ClassIsland/ClassIsland.Core/ThemeBase.axaml` | 1–90 行 | 字号资源 14/16/18/20、`SettingsContainerWidth=960`、图标字体 |
| `repos/ClassIsland/ClassIsland.Core/Themes/WrapPanelResizingAnimation.axaml` | 全文 | `animated-resize` 类定义 |
| `repos/ClassIsland/ClassIsland.Core/Themes/ComponentsPanelStyles.axaml` | 全文 | `components-panel` = 横排 StackPanel / 重排动画 |
| `repos/ClassIsland/ClassIsland/Controls/EditMode/EditModeView.axaml` | 全文 613 行 | 抽屉、组件库、行设置、外观设置、配置管理 |
| `repos/ClassIsland/ClassIsland/Controls/EditMode/EditModeView.axaml.cs` | 100–329 行 + grep | 抽屉打开/收起、容器组件、规则抽屉 |
| `repos/ClassIsland/ClassIsland/Controls/EditMode/EditableComponentsListBox.axaml` | 全文 338 行 | 选中框、Adorner 操作条、拖拽阈值/预览/高亮 |
| `repos/ClassIsland/ClassIsland/Controls/EditMode/EditModeContainerComponentInfo.cs` | 全文 | 浮动编辑框数据 |
| `repos/ClassIsland/ClassIsland/Controls/SlantedMaskControl.cs` | 全文 346 行 | 斜面遮罩 5 区段权重/60°/360ms/120ms |
| `repos/ClassIsland/ClassIsland.Core/Controls/VerticalDrawer.axaml` | 全文 157 行 | 抽屉外观、圆角 8 8 0 0、阴影、250ms |
| `repos/ClassIsland/ClassIsland.Core/Controls/VerticalDrawer.axaml.cs` | 部分 + grep | `RequestedWidth`、`ContentHeightRatio=0.5` |
| `repos/ClassIsland/ClassIsland.Core/Converters/SizeDoubleToCornerRadiusConverter.cs` | 全文 | 圆角 = 值/参数(1.0) |
| `repos/ClassIsland/ClassIsland.Core/Converters/WidthDoubleToRectConverter.cs` | 全文 | 行裁切矩形 + 停靠位置 X 偏移 |
| `repos/ClassIsland/platforms/ClassIsland.Platforms.Windows/Services/WindowPlatformService.cs` | 100–209 行 | `WS_EX_LAYERED/TRANSPARENT/NOACTIVATE`、Topmost/Bottommost/Private/ToolWindow |
### 1.2 ClassIsland —— 设置 / 数据模型
| 文件 | 读取范围 | 用途 |
|---|---|---|
| `repos/ClassIsland/ClassIsland/Models/Settings.cs` | 1–1856、1856–2255、grep 全文 | 全部主界面相关默认值(窗口/外观/组件/提醒/天气) |
| `repos/ClassIsland/ClassIsland.Core/Models/Components/MainWindowLineSettings.cs` | 全文 | 行设置 21 个字段与默认值 |
| `repos/ClassIsland/ClassIsland.Core/Models/Components/ComponentSettings.cs` | 全文 541 行 | 组件设置全部通用字段与默认值 |
| `repos/ClassIsland/ClassIsland/Services/ComponentsService.cs` | 20–129 行 | 默认组件布局(1 行 = 日期 + 课程表)、配置文件路径 |
| `repos/ClassIsland/ClassIsland/App.Services.xaml.cs` | 285–325 行 | Fluent 主题 `VerticalSafeAreaPx=20`、4 套天气图标模板 |
| `repos/ClassIsland/ClassIsland/Services/XamlThemeService.cs` | 108–140 行 | `ActualVerticalSafeAreaPx` 取所有启用主题的最大值 |
| `repos/ClassIsland/ClassIsland.Core/Models/XamlTheme/ThemeManifest.cs` | 110–132 行 + grep | `VerticalSafeAreaPx` 默认 0(Classic 主题即 0) |
### 1.3 ClassIsland —— 组件(全部 11 个)
| 文件 | 读取范围 |
|---|---|
| `Controls/Components/DateComponent.axaml` + `.axaml.cs` | 全文 |
| `Controls/Components/ClockComponent.axaml` + `.axaml.cs` | 全文 |
| `Controls/Components/CountDownComponent.axaml` + `.axaml.cs` | 全文(115 + 312 行) |
| `Controls/Components/ScheduleComponent.axaml` + `.axaml.cs` | 全文(117 + 268 行) |
| `Controls/Components/WeatherComponent.axaml` + `.axaml.cs` | 全文(314 行 + 68 行) |
| `Controls/Components/TextComponent.axaml` + `.axaml.cs` | 全文 |
| `Controls/Components/RollingComponent.axaml` + `.axaml.cs` | 全文(49 + 206 行) |
| `Controls/Components/SlideComponent.axaml` + `.axaml.cs` | 全文(126 + 202 行) |
| `Controls/Components/GroupComponent.axaml` + `.axaml.cs` | 全文 |
| `Controls/Components/StackComponent.axaml` + `.axaml.cs` | 全文 |
| `Controls/Components/SeparatorComponent.axaml` + `.axaml.cs` | 全文 |
| `Controls/Components/*ComponentSettingsControl.axaml`(8 个) | grep 全部 `Header=/Content=/Minimum=/Maximum=/Description=` |
| `Models/ComponentSettings/{Clock,CountDown,Group,Rolling,Slide,Stack,Text,Weather}ComponentSettings.cs` | 全文(grep 字段默认值) |
| `Models/ComponentSettings/LessonControlSettings.cs` | 全文 189 行 |
| `ClassIsland.Core/Controls/ComponentPresenter.axaml` | 全文 73 行(宿主通用行为) |
| `ClassIsland.Core/Controls/ComponentAdvancedSettingsControl.axaml` | grep 全部设置项文案/范围 |
| `ClassIsland.Core/Controls/LessonsControls/LessonsListBox.axaml` | 全文 204 行(课程列表容器与列表项主题) |
| `ClassIsland.Core/Controls/LessonsControls/LessonControlExpanded.axaml` | 全文 240 行 |
| `ClassIsland.Core/Controls/LessonsControls/LessonControlMinimized.axaml` | 全文 65 行 |
| `ClassIsland.Core/Controls/LessonsControls/LessonControlSeperator.axaml` | 全文 27 行 |
| `ClassIsland.Core/Controls/LessonsControls/LessonControlBase.cs` | 全文 75 行 |
| `ClassIsland.Core/Controls/HighlightBox.axaml` | 全文 28 行 |
| `Controls/WeatherIcons/{Index,SimpleTextWeatherIconTemplate}.axaml` | 全文(其余 3 套仅列名/大小) |
### 1.4 ClassHelper(实现栈参照)
| 文件 | 读取范围 | 用途 |
|---|---|---|
| `packages/shared/src/island-layout.ts` | 全文 404 行 | `CLASSISLAND_ISLAND_METRICS`(已核对与本任务一致)、组件契约、默认方案 |
| `packages/shared/src/constants.ts` | 240–369 行 | `DEFAULT_ISLAND_APPEARANCE`、`ISLAND_SHADOW_PAD=10`、`ISLAND_SIZE_DELTA`、`ISLAND_TYPE_SCALE` |
| `packages/desktop-client/src/main/island.ts` | 1–140、400–659 行 + grep | `BrowserWindow` 参数、`setIgnoreMouseEvents`、`setAlwaysOnTop('screen-saver')`、失焦宽限、固定包围盒、禁止 `setBackgroundMaterial` |
| `packages/desktop-client/src/island/IslandApp.vue` | 200–399 行 + grep | 弹簧形变、`--island-*` 变量、`progress²` 交叉淡入、命中重算 |
| `packages/desktop-client/src/island/spring.ts` | 全文 115 行 | stiffness 0.10 / damping 0.68 / 换向 35% / 单帧 ≤20% / snap 0.05px |
| `packages/desktop-client/src/island/squircle.ts` | 全文 81 行 | 超椭圆指数 4.2、每角 14 段、`expandedRadius` |
| `packages/desktop-client/src/island/classic-island.css` | 全文 757 行 | 卡片/胶囊/列表排版系数与 token 命名 |
| `packages/desktop-client/src/island/custom-island.css` | 全文 205 行 | 常驻行布局(`--custom-row-gap` 等) |
| `packages/desktop-client/src/island/custom-runtime.css` | 全文 255 行 | 常驻卡片的 ClassIsland Fluent 化配色(`--wn-bg:#20202080`、`--wn-border:#ffffff26`) |
| `packages/desktop-client/src/island/ComponentNode.vue` | 210–329 行 | 组件 DOM 类名约定(`component-node` + `node.kind`)、`tabular-nums` |
| `repos/ClassIsland/AGENTS.md`、`repos/ClassHelper-master/AGENTS.md` | 注入全文 | 纪律约束 |
## 2. 关键参数表(数值 → 证据)
### 2.1 窗口与几何
| 参数 | 值 | 证据 |
|---|---|---|
| 窗口透明 | `Background=Transparent` / `TransparencyLevelHint=Transparent` / `TransparencyBackgroundFallback=Transparent` | `MainWindow.axaml:169-171, 33` |
| 无边框 / 不可缩放 / 不可最大化最小化 | `SystemDecorations=None`, `CanResize=False`, `CanMaximize=False`, `CanMinimize=False` | `MainWindow.axaml:171-174` |
| 不抢焦点 | `ShowActivated="False"` | `MainWindow.axaml:32` |
| 初始高度 | `Height="1"` | `MainWindow.axaml:8` |
| 编辑模式窗口底色 | `SmokeFillColorDefaultBrush` + `TransparencyLevelHint="AcrylicBlur, Transparent"` | `MainWindow.axaml:177-181` |
| 自由窗口编辑模式 | `SystemDecorations=Full`、可缩放/最大化/最小化;Win10≤1803 用不透明底色 | `MainWindow.axaml:182-191`;`MainWindow.axaml.cs:257-260` |
| 窗口标题 | `ClassIsland` / `编辑主界面 \| ClassIsland` | `MainWindow.axaml:175, 180` |
| 自由窗口编辑模式屏幕边距 | `60` | `MainWindow.axaml.cs:134` |
| 编辑模式窗口高 = 屏高 − 1px | 防 Windows 误判全屏 | `MainWindow.axaml.cs:970` |
| 窗口宽度(非编辑) | `screen.Bounds.Width / dpiX`(整屏宽) | `MainWindow.axaml.cs:915` |
| 窗口高度(非编辑) | `内容高 + safeT + safeB` | `MainWindow.axaml.cs:916` |
| 竖直安全区 | Fluent `20` / Classic `0` | `App.Services.xaml.cs:314`;`ThemeManifest.cs:20` |
| 停靠位置 6 值 + 默认 1 | `0..5`,默认中上 | `Models/Settings.cs:48, 1810-1823` |
| 偏移 X/Y 默认 | `0` / `0`(物理像素) | `Models/Settings.cs:49-50` |
| 显示器索引默认 | `0`,越界回退主屏 | `Models/Settings.cs:51`;`MainWindow.axaml.cs:806-812` |
| 忽略工作区 | 默认 `false` | `Models/Settings.cs:1835` |
| 窗口层级 | 默认 `1=置顶`;`0=置底` | `Models/Settings.cs:52, 1961-1978` |
| 置顶重查模式 | 默认 `0`;另有 1/2/3(3=1ms 高频) | `Models/Settings.cs:1860`;`MainWindow.axaml.cs:136-139, 420-436` |
| 任务栏显示条件 | `IsWindowMode \|\| IsScreenRecordingModeEnabled` | `MainWindow.axaml:34-39` |
| 鼠标穿透(Windows) | `WS_EX_LAYERED \| WS_EX_TRANSPARENT \| WS_EX_NOACTIVATE` + `SetLayeredWindowAttributes` | `WindowPlatformService.cs:130-150` |
| ToolWindow | 非编辑/非自由窗口/非录屏时启用 `WS_EX_TOOLWINDOW` | `MainWindow.axaml.cs:832-838`;`WindowPlatformService.cs:173-185` |
| 防截屏 | `WDA_EXCLUDEFROMCAPTURE`,开关默认 `false` | `MainWindow.axaml.cs:840`;`Models/Settings.cs:1862` |
| 提醒特效渲染缩放自动值 | 屏高 ≥1400 → 0.75;≥2000 → 0.5 | `MainWindow.axaml.cs:377-392` |
### 2.2 行(MainWindowLine)
| 参数 | 值 | 证据 |
|---|---|---|
| 行高 `IslandContainerHeight` | `40` | `MainWindowLine.axaml:16`、`FluentTheme/Styles.axaml:65`、`ClassicTheme/Styles.axaml:16` |
| 内容盒内边距 / 最小宽 | `12 0` / `20` | `FluentTheme/Styles.axaml:109-110`、`ClassicTheme/Styles.axaml:99-100` |
| 行间距默认 | `5`(范围 0–150,步进 5) | `Models/Settings.cs:219`;`MainWindow.axaml:344`;`EditModeView.axaml:114-120` |
| 组件外边距 | `6 0`(相邻合计 12) | `MainWindow.axaml:396` |
| 行背景圆角 | `RadiusX`(默认 8,0–20,步进 0.5) | `Models/Settings.cs:183, 1186-1196`;`SizeDoubleToCornerRadiusConverter.cs:8-17` |
| 行背景边框 | `1px`,`ControlElevationBorderBrush` | `FluentTheme/Styles.axaml:46-47` |
| 行背景阴影 | `0 4 8 2 #48000000` | `FluentTheme/Styles.axaml:49` |
| 背景不透明度 | `Opacity` 默认 `0.5`(0–1,步进 0.05),只作用于背景层 | `Models/Settings.cs:64, 1140-1150`;`FluentTheme/Styles.axaml:44` |
| 行不透明度 | 行级 `Opacity` 默认 `1.0`(0.1–1,步进 0.05) | `MainWindowLineSettings.cs:42`;`MainWindowLine.axaml:51` |
| 行淡出不透明度 | `0.05` | `MainWindowLine.axaml:73-75` |
| 行选择框 | `1.5px` 虚线、dash `1/1.5`、`opacity 0.75`、圆角端点、Bevel 连接 | `MainWindow.axaml:353-363` |
| 行操作按钮间距/字号 | `2` / `14` | `MainWindow.axaml:403-406` |
| 行过渡(Fluent) | `opacity 100ms`;`BackgroundWidth 300ms` `0.65,0,0.35,1.0` | `FluentTheme/Styles.axaml:264-273` |
| 行过渡(Classic) | `opacity 100ms`;`BackgroundWidth 550ms` `0,1,0.5,1.10` | `ClassicTheme/Styles.axaml:202-211` |
| 行挂载淡入 | `250ms` `0.25,1,0.5,1`,仅 `AnimationLevel≥2` | `MainWindowLine.cs:382-401`;`Models/Settings.cs:1851` |
| 重排动画 | `300ms` `0.65,0,0.35,1.0` | `MainWindow.axaml:197-198` |
| 分体主界面组件盒 | `Margin -2 0`、`MinWidth 40`、`ContentPresenter Margin 16 0` | `FluentTheme/Styles.axaml:245-259` |
| 分体主界面开关 | 全局默认 `false`;行级 `IslandSeparationMode` 0/1/2 | `Models/Settings.cs:1852`;`MainWindowLineSettings.cs:47-50` |
### 2.3 遮罩 / 浮层 / 进度
| 参数 | 值 | 证据 |
|---|---|---|
| 遮罩斜面角度 | `60°`(`tan(30°)*h`,`SlantedHeight` 默认 80) | `SlantedMaskControl.cs:284-286, 25-26` |
| 遮罩区段权重 | `[0, 0.1, 0.2, 0.4, 0.2, 0.1]`(5 段 + 首尾 0) | `SlantedMaskControl.cs:298-308` |
| 遮罩区段时长 / 错峰 | `RegionDurationMs=360` / `StageStaggerMs=120`(行模板显式) | `FluentTheme/Styles.axaml:175-180` |
| 打开错峰 | 0/4 → 0ms;1/3 → 90ms;2 → 120ms;`QuarticEaseOut` | `SlantedMaskControl.cs:177-188` |
| 关闭错峰 | 2 → 0ms;1/3 → 90ms;0/4 → 120ms;`QuadraticEaseIn` | `SlantedMaskControl.cs:189-200` |
| 遮罩文字淡入 | delay 260ms / 250ms / `0.25,1,0.5,1` | `FluentTheme/Styles.axaml:329-340` |
| 遮罩文字缩放 | 1.1→1.0 / 750ms / delay 260ms | `FluentTheme/Styles.axaml:341-352` |
| 强调底淡入 | delay 600ms / 100ms / Forward | `FluentTheme/Styles.axaml:355-367` |
| 遮罩投影 | `0 8 32 0 #66000000` | `FluentTheme/Styles.axaml:323-328` |
| 提醒进度条 | `Maximum=1`,`Value=LeftProgress`,过渡 50ms 线性 | `FluentTheme/Styles.axaml:131-146`;`MainWindowLine.axaml:77` |
| 浮层淡入淡出 | 200ms `SineEaseIn` | `FluentTheme/Styles.axaml:419-451` |
| Classic 遮罩 | `Y -50→0` 200ms `QuadraticEaseIn`;关 `Y 0→50` delay100ms 200ms `QuadraticEaseOut` | `ClassicTheme/Styles.axaml:265-318` |
| Classic 首帧投影 | `DropShadowEffect` blur 8,`Effect` 过渡 100ms 线性 | `ClassicTheme/Styles.axaml:34-45` |
| 进度精度降低 | 默认 `true`;`tick=max(10, totalSeconds/500)` | `Models/Settings.cs:1853`;`CountDownComponent.axaml.cs:291-295` |
### 2.4 编辑模式
| 参数 | 值 | 证据 |
|---|---|---|
| 底部操作栏 | `bottom 64px`、`CornerRadius 6`、`Padding 4`、按钮间距 `6`、`1px` 边框 | `MainWindow.axaml:595-604` |
| 操作栏分隔线 | `0,0 → 0,25`、`1px` | `MainWindow.axaml:610-613` |
| 抽屉宽度 | `960`(`SettingsContainerWidth`) | `ThemeBase.axaml:37`;`EditModeView.axaml:600-605` |
| 抽屉圆角 / 阴影 | `8 8 0 0` / `0 8 32 0 #66000000` | `VerticalDrawer.axaml:9, 45` |
| 抽屉内边距 / 标题栏 | `8 8 8 0` / 高 `32` | `VerticalDrawer.axaml:53-54` |
| 抽屉过渡 | `bottom`+`height` 250ms `cubic-bezier(0,0,0,1)` | `VerticalDrawer.axaml:29-36` |
| 次抽屉高度比例 | `0.5` | `EditModeView.axaml:608` |
| 设置容器 | `Margin 12 12 18 12`、`Spacing 4` | `StylesBase.axaml:67-71` |
| 组件库项 | 高 `50`、`Margin 0 8`、图标 `32`、描述 `12px/0.75`、WrapPanel 目标宽 `225` | `EditModeView.axaml:177-218` |
| 拖拽阈值 / 预览透明度 | `3` / `0.5` | `EditableComponentsListBox.axaml:286-288` |
| 拖拽插入高亮 | `1s` 交替无限,opacity `0.1↔0.6`,SineEaseInOut | `EditableComponentsListBox.axaml:307-336` |
| 选中操作条 | `CornerRadius 6`、`Padding 4`、`Spacing 6`、`1px` 边框、分隔线高 25 | `EditableComponentsListBox.axaml:100-184` |
| 容器组件浮动框 | `CornerRadius 6`、`Padding 4 0`、把手宽 20、列表高 40、初始 Y+48 | `MainWindow.axaml:485-537`;`MainWindow.axaml.cs:1559-1567` |
| 隐藏组件斜条纹 | 45° 重复渐变 `#afffffff`/`#50ffffff` | `ComponentPresenter.axaml:20-33` |
| 缩放 | `ZoomBorder` 0.5–3、speed 1.2、约束开启;设置 `Scale` 0.75–2.5 步进 0.05 | `MainWindow.axaml:199-212`;`EditModeView.axaml:50-57` |
### 2.5 组件(要点)
| 参数 | 值 | 证据 |
|---|---|---|
| 字号资源 | 14 / 16 / 18 / 20 | `ThemeBase.axaml:32-35`;`Models/Settings.cs:197-200` |
| 默认字体 | `HarmonyOS Sans SC` + `FluentSystemIcons-Resizable` | `MainWindow.axaml.cs:185-189` |
| 字重 | `FontWeight.Medium`(默认 500) | `Models/Settings.cs:101` |
| 宿主内边距 | `0 8`(上下 8) | `ComponentPresenter.axaml:55-57` |
| 组件宽约束默认 | min 100 / max 300 / fixed 200,全部关闭 | `ComponentSettings.cs:30-35, 37, 43` |
| 组件不透明度默认 | `1.0` | `ComponentSettings.cs:46` |
| 日期格式 | `ddd MM/dd` | `DateComponent.axaml:11` |
| 时钟分隔符逻辑 | `!Flash \|\| ShowSeconds \|\| 秒%2==1` | `ClockComponent.axaml.cs:75` |
| 倒计时环 | 22×22、描边 3.1、半径 `r=9.5`、>100% 按 99.9999 | `CountDownComponent.axaml.cs:34-47` |
| 倒计时默认色/字号 | `#FFFF0000` / `16`(16–30) | `CountDownComponentSettings.cs`;设置页 `:410-414` |
| 倒计时格式默认 | `%D天` | 同上 |
| 课程列表高 | `40`、项 `MaxHeight 40` | `LessonsListBox.axaml:41, 107` |
| 课程淡化 | `0.6`,`150ms` `CubicEaseInOut` | `LessonsListBox.axaml:56-77` |
| 课程强调字号 | `18` + Bold | `LessonControlExpanded.axaml:66-67` |
| 课程左右间隔 | `16px * ScheduleSpacing`(0.2–1) | `LessonControlExpanded.axaml:51-56, 219-224` |
| 最小型间隔 | `10px * ScheduleSpacing` | `LessonControlMinimized.axaml:33-38` |
| 高亮条 | 高 12、opacity 0.4、margin `-2 8 -2 0`、radius 2 | `HighlightBox.axaml:15-18` |
| 天气主图尺寸 | 图标 22×22,图标右移 `-2px` | `WeatherComponent.axaml:42-44, 65-67` |
| 预警药丸 | 高 22、radius 11、文本 `14px`、`margin 4 0 8 0` | `WeatherComponent.axaml:252-263` |
| 降水药丸 | `padding 0 8`、`1px` 边框、底色 opacity 0.15、radius = 高/2 | `WeatherComponent.axaml:276-311` |
| 滚动速度默认 | `40 px/s`(≥0.1) | `RollingComponentSettings.cs` |
| 滚动暂停默认 | 启用、`10s`、偏移 `0` | 同上 |
| 轮播间隔默认 | `15s`(≥0.1) | `SlideComponentSettings.cs` |
| 轮播动画 | `250ms` `0.65,0,0.35,1`,位移 ±40 | `SlideComponent.axaml:72-107` |
| 分割线 | `2×25`、`2px`、opacity 0.8 | `SeparatorComponent.axaml:10-13` |
| 默认布局 | 1 行:日期 + 课程表 | `ComponentsService.cs:33-52` |
## 3. 未决问题 / 缺口(需要 Lead 或其它 part 决策)
1. **主题颜色 token 未取色**:`SolidBackgroundFillColorSecondaryBrush`、`ControlElevationBorderBrush`、`AccentFillColorDefaultBrush`、`SmokeFillColorDefaultBrush`、`CommandBarOverflowPresenterBackground/BorderBrush`、`ContentDialogBackground/BorderBrush/BorderWidth`、`AqiLevel1..6Brush` 的实际 HEX/alpha 未逐一定位取色(属 part 03 设计系统职责)。本 part 只写资源名与语义。**风险**:part 03 若用了不同命名,需要一次对齐。
2. **ProgressBar 默认高度/圆角未确认**:FluentAvalonia 的 ProgressBar 模板高度直接影响行底提醒进度条、课程进度条、倒计时进度条的像素高度;part 04/05 已标【推断:约 3px】。需要 design 提供 token 或在实现里固定为 3px。
3. **Acrylic 的 Electron 等价**:编辑模式用了 `TransparencyLevelHint="AcrylicBlur, Transparent"`。ClassHelper 的既有结论是禁止 `setBackgroundMaterial()`(会破坏逐像素透明)。本 part 给出的方案是"全屏半透明遮罩 + 窗口仍逐像素透明",**未验证视觉等价性**(不能运行)。需 Lead 决定是否接受该近似,或允许编辑模式例外使用材质。
4. **`IsWindowMode` 的 UI 入口未定位**:`MainViewModel.EditModeIsWindowMode` 默认 `true`(`MainViewModel.cs:48`),但 `EditModeView.axaml` 中没有找到"全屏/自由窗口"切换按钮,可能在别的设置页或教程步骤里。属未决。
5. **提醒在多行之间的分发策略**:`NotificationHostService.RegisterNotificationConsumer(this, IsMainLine ? -1 : LineNumber)`(`MainWindowLine.cs:441`)只说明注册顺序,具体"多行都启用提醒时谁显示"的规则在 `NotificationHostService` 内部,本 part 未深入(属 part 07)。
6. **`StackComponent` 的测量语义**:Avalonia `Panel` 中带 `Margin="6 0"` 的子项,其宽度是否计入容器测量宽,未验证;实现时以实测为准(本 part 按"取子项最大宽度 + 6px 外边距"描述)。
7. **`ZoomBorder` 手势细节**:`ZoomBorder` 未定位到源码(可能来自 Avalonia 扩展库),滚轮是否需修饰键、双击是否重置、平移边界计算均为【推断】,已在 part 04 §4.6 标注。
8. **`TextComponent` 字号与全局字号的关系**:文本组件用自身 `Settings.FontSize`(默认 16),不随 `MainWindowBodyFontSize` 变化,除非开启资源覆盖。这是源码事实,但产品上可能造成困惑,建议 part 10(设置中心)或 part 16 提示。
9. **斜面遮罩的完整 CSS**:part 04 只给了 5 段权重、60°、时长、缓动与实现思路,未给可直接粘贴的完整 `@keyframes` + 5 个 `clip-path` 片段(篇幅取舍)。若 Lead 要求"可直接粘贴",需补一节。
10. **窗口高度=内容高的方案取舍**:ClassIsland 是"窗口随内容高变化",ClassHelper 是"固定包围盒 + 窗内形变"。part 04 按 ClassIsland 写(附 ClassHelper 参考),但两者在"展开/折叠"场景下动画观感不同;需要 Lead 在 part 01/14 统一口径。
11. **`MainWindow.axaml:8 Height="1"`** 的初始化意图未深究(Electron 无对应需求)。
12. **`ReduceProgressAccuracy` 对主界面行提醒进度条的量化**:源码只对倒计时组件做了量化(`CountDownComponent.axaml.cs:291-295`),行进度条是否也量化未直接看到;part 04 §4.7.1 写成"同样应做降频"属【推断】。
13. **`ExtraInfo4ShowSecondsSeconds`、`ShowTomorrowSchedules`、`PauseOnRule`/`PauseRule`(滚动容器)** 等字段在源码中存在但当前 UI 未暴露或未使用,属历史/预留字段;part 05 已标注"保留/兼容",实现时可保留 JSON 字段但不提供 UI。
14. **多显示器 `WindowDockingMonitorIndex` 与 DPI 混合场景**:ClassIsland 用所选屏幕的 `Scaling` 统一换算,若显示器 DPI 不同,跨屏拖动时会重算;part 04 只写了公式,跨 DPI 拖动的边界行为未验证。
15. **`WindowTopmostRecheckMode` 的 1ms 高频模式**(`WindowTopmostRecheckMode==3`)在 Electron 下不可照搬(1ms 轮询会烧 CPU),part 04 已建议最小 1000ms;需 Lead 在 part 18(禁止事项/性能底线)确认。
## 4. Lead 裁决回填(第二轮,已完成)
Lead 对 §3 未决项做了最终裁决,已按"小范围修补"回填 parts 04/05(未重写整篇):
| # | 裁决 | 回填位置 |
|---|---|---|
| 1 | **禁止**系统材质 API;编辑态用 `rgba(0,0,0,0.30)` 全屏遮罩 + 逐像素透明,**禁 `backdrop-filter`**;标【推断/差异说明】,不得写"与 Acrylic 完全一致" | 04 §4.8.1、验收 14;拖拽预览浮标降级色 §4.8.8 |
| 2 | 窗口改采**固定包围盒 + 窗内形变**:宽 = 屏宽,高 = `contentMaxHeight + 2*safePadding`,`setBounds` 节流 ≥100ms;编辑模式扩展为「屏宽 ×(屏高−1px)」+ 四边 60px 安全边距 + 开鼠标;保留 ClassIsland 视觉结果(可见岛高 = 行高之和 + 行距) | 04 §4.1 约定 1、§4.3 全节重写(4.3.1 裁决 / 4.3.2 视觉基准 / 4.3.3 编辑画布 / 4.3.4 节流)、§4.6、§4.8.2、§4.9、验收 5/5.1/6/14 |
| 3 | 进度条高度**定为 3px**(`--ci-progress-height`),3 处【推断≈3px】改确定值 | 04 §4.4 token 表 + §4.7.1 + 验收 8.1;05 §5.4、§5.5.2、§5.15 |
| 4 | `IsWindowMode` 不实现 UI 入口,保留字段与能力说明,标 **P2/【推断】**;注明 2.1 中该设置存在但编辑页无可见切换按钮 | 04 §4.2 第 5 条 |
| 5 | 置顶:事件驱动 + 兜底轮询 **≥1000ms**,**禁止 1ms/10ms 级轮询**,另列各模块刷新频率 | 04 §4.2 第 4 条 + 新增 §4.2.1 性能底线 + 验收 5.1 |
| 6 | ZoomBorder:**仅 `Ctrl+滚轮` 0.5–3.0 + 双击重置**;不做平移(`Space+drag` 标 P2/【推断】) | 04 §4.6 全节重写 |
| 7 | 提醒多行分发规则归 part 07;04 只保留宿主与 `IsNotificationEnabled` 标记 | 04 §4.5.8、验收 8 |
| 8 | 预留 JSON 字段保留 schema、不给 UI,统一标【预留】 | 05 §5.5.5、§5.8、§5.9(含统一处置说明) |
修补后字数:04 = CJK 8360(+1859)、05 = CJK 7173(+191)。仍为只读分析、未运行任何程序、未改 `repos/`。
## 5. 自检
- [x] 数值全部有 `路径:行号` 证据或标【推断】。
- [x] 覆盖 `MainWindow.axaml(.cs)`、`MainWindowLine`、两套主题 Styles、全部 11 个组件 axaml+cs、8 个组件设置控件、EditMode 三个文件、ComponentPresenter、LessonsListBox + 3 种课程控件、SlantedMaskControl、VerticalDrawer、两个关键 Converter、Windows 平台窗口特性实现。
- [x] 覆盖 ClassHelper 侧 island.ts / IslandApp.vue / spring.ts / squircle.ts / classic-island.css / custom-island.css / custom-runtime.css / ComponentNode.vue / shared island-layout.ts + constants.ts。
- [x] 两份 part 均含「验收标准」小节,且均为中文祈使句、无"建议考虑"式模糊表述。
- [x] CJK 字数:04 = 8360,05 = 7173(要求 ≥5000)。
- [x] Lead 8 条裁决已全部回填(见 §4)。
- [x] 未构建、未运行、未截图、未安装依赖、未修改 `repos/`。