feat: unified shell, diagnostics pack, native Office, sticky board
All checks were successful
CI / Windows build (push) Successful in 14m22s

Make Surface remote debugging and classroom workflows viable: always-on
structured logs with one-click zip export, a single AppShell chrome,
OOXML PPTX/DOCX annotation without LibreOffice, and a first-class sticky
board. Also drop spike/legacy ink widgets and tighten pen feel
(predictor, PenInfoHistory, page-tile layer).

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-05 17:55:27 +08:00
parent 3cabc7e074
commit d346cc2670
49 changed files with 2883 additions and 2515 deletions

View File

@@ -121,6 +121,18 @@
"total": { "type": "int" }
}
},
"libraryTab": "Library",
"boardTab": "Stickies",
"shellTagline": "Ink · Annotate · Know",
"notesSection": "Notes",
"documentsSection": "Documents",
"emptyLibraryTitle": "Nothing here yet",
"emptyLibraryBody": "Create a note, or import PDF / PPT / Word",
"diagnosticsSection": "Diagnostics",
"diagnosticsExport": "Export diagnostic pack",
"diagnosticsExportHint": "Reproduce on Surface, export, and send the zip back",
"diagnosticsToggle": "Input diagnostics overlay",
"penSettingsUnified": "Pen & ink",
"board": "Board",
"boardTitle": "Sticky Board",
"boardOpen": "Sticky note board",

View File

@@ -644,6 +644,78 @@ abstract class AppLocalizations {
/// **'{current} / {total}'**
String pageOfPages(int current, int total);
/// No description provided for @libraryTab.
///
/// In en, this message translates to:
/// **'Library'**
String get libraryTab;
/// No description provided for @boardTab.
///
/// In en, this message translates to:
/// **'Stickies'**
String get boardTab;
/// No description provided for @shellTagline.
///
/// In en, this message translates to:
/// **'Ink · Annotate · Know'**
String get shellTagline;
/// No description provided for @notesSection.
///
/// In en, this message translates to:
/// **'Notes'**
String get notesSection;
/// No description provided for @documentsSection.
///
/// In en, this message translates to:
/// **'Documents'**
String get documentsSection;
/// No description provided for @emptyLibraryTitle.
///
/// In en, this message translates to:
/// **'Nothing here yet'**
String get emptyLibraryTitle;
/// No description provided for @emptyLibraryBody.
///
/// In en, this message translates to:
/// **'Create a note, or import PDF / PPT / Word'**
String get emptyLibraryBody;
/// No description provided for @diagnosticsSection.
///
/// In en, this message translates to:
/// **'Diagnostics'**
String get diagnosticsSection;
/// No description provided for @diagnosticsExport.
///
/// In en, this message translates to:
/// **'Export diagnostic pack'**
String get diagnosticsExport;
/// No description provided for @diagnosticsExportHint.
///
/// In en, this message translates to:
/// **'Reproduce on Surface, export, and send the zip back'**
String get diagnosticsExportHint;
/// No description provided for @diagnosticsToggle.
///
/// In en, this message translates to:
/// **'Input diagnostics overlay'**
String get diagnosticsToggle;
/// No description provided for @penSettingsUnified.
///
/// In en, this message translates to:
/// **'Pen & ink'**
String get penSettingsUnified;
/// No description provided for @board.
///
/// In en, this message translates to:

View File

@@ -301,6 +301,43 @@ class AppLocalizationsEn extends AppLocalizations {
return '$current / $total';
}
@override
String get libraryTab => 'Library';
@override
String get boardTab => 'Stickies';
@override
String get shellTagline => 'Ink · Annotate · Know';
@override
String get notesSection => 'Notes';
@override
String get documentsSection => 'Documents';
@override
String get emptyLibraryTitle => 'Nothing here yet';
@override
String get emptyLibraryBody => 'Create a note, or import PDF / PPT / Word';
@override
String get diagnosticsSection => 'Diagnostics';
@override
String get diagnosticsExport => 'Export diagnostic pack';
@override
String get diagnosticsExportHint =>
'Reproduce on Surface, export, and send the zip back';
@override
String get diagnosticsToggle => 'Input diagnostics overlay';
@override
String get penSettingsUnified => 'Pen & ink';
@override
String get board => 'Board';

View File

@@ -300,6 +300,42 @@ class AppLocalizationsZh extends AppLocalizations {
return '$current / $total';
}
@override
String get libraryTab => '';
@override
String get boardTab => '便利贴';
@override
String get shellTagline => '手写 · 批注 · 知识';
@override
String get notesSection => '笔记';
@override
String get documentsSection => '文档';
@override
String get emptyLibraryTitle => '还没有内容';
@override
String get emptyLibraryBody => '新建笔记,或导入 PDF / PPT / Word';
@override
String get diagnosticsSection => '诊断';
@override
String get diagnosticsExport => '导出诊断包';
@override
String get diagnosticsExportHint => '在 Surface 上复现问题后导出,发回给开发者分析';
@override
String get diagnosticsToggle => '输入诊断叠加层';
@override
String get penSettingsUnified => '笔与墨迹';
@override
String get board => '便利贴板';

View File

@@ -97,6 +97,18 @@
"failedToOpenPdf": "打开 PDF 失败:\n{error}",
"pdfNoPages": "PDF 没有任何页面。",
"pageOfPages": "{current} / {total}",
"libraryTab": "库",
"boardTab": "便利贴",
"shellTagline": "手写 · 批注 · 知识",
"notesSection": "笔记",
"documentsSection": "文档",
"emptyLibraryTitle": "还没有内容",
"emptyLibraryBody": "新建笔记,或导入 PDF / PPT / Word",
"diagnosticsSection": "诊断",
"diagnosticsExport": "导出诊断包",
"diagnosticsExportHint": "在 Surface 上复现问题后导出,发回给开发者分析",
"diagnosticsToggle": "输入诊断叠加层",
"penSettingsUnified": "笔与墨迹",
"board": "便利贴板",
"boardTitle": "便利贴板",
"boardOpen": "便利贴板",