feat: OneNote-style notebooks, text fonts, and page navigation
All checks were successful
CI / Windows build (push) Successful in 8m42s

Add notebook.json containers with multi-member pages, fix PDF text
editing (size/bold/drag/double-tap), index SidecarText in search, and
share keyboard page shortcuts plus a PDF scrubber.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-05 20:27:35 +08:00
parent 4a6fe7d05e
commit 2b1c6ba7e0
18 changed files with 1344 additions and 112 deletions

View File

@@ -237,5 +237,18 @@
"@diagExported": { "placeholders": { "bytes": { "type": "int" } } },
"diagExportFail": "Export failed: {error}",
"@diagExportFail": { "placeholders": { "error": { "type": "String" } } },
"processingOcr": "Processing OCR…"
"processingOcr": "Processing OCR…",
"notebooksSection": "Notebooks",
"addBlankPage": "Blank page",
"importIntoNotebook": "Import into notebook",
"notebookMembersEmpty": "No pages yet",
"memberCount": "{count} items",
"@memberCount": {
"placeholders": { "count": { "type": "int" } }
},
"textFontSmall": "S",
"textFontMedium": "M",
"textFontLarge": "L",
"textBold": "Bold",
"textDragHint": "Drag to move"
}

View File

@@ -1153,6 +1153,66 @@ abstract class AppLocalizations {
/// In en, this message translates to:
/// **'Processing OCR…'**
String get processingOcr;
/// No description provided for @notebooksSection.
///
/// In en, this message translates to:
/// **'Notebooks'**
String get notebooksSection;
/// No description provided for @addBlankPage.
///
/// In en, this message translates to:
/// **'Blank page'**
String get addBlankPage;
/// No description provided for @importIntoNotebook.
///
/// In en, this message translates to:
/// **'Import into notebook'**
String get importIntoNotebook;
/// No description provided for @notebookMembersEmpty.
///
/// In en, this message translates to:
/// **'No pages yet'**
String get notebookMembersEmpty;
/// No description provided for @memberCount.
///
/// In en, this message translates to:
/// **'{count} items'**
String memberCount(int count);
/// No description provided for @textFontSmall.
///
/// In en, this message translates to:
/// **'S'**
String get textFontSmall;
/// No description provided for @textFontMedium.
///
/// In en, this message translates to:
/// **'M'**
String get textFontMedium;
/// No description provided for @textFontLarge.
///
/// In en, this message translates to:
/// **'L'**
String get textFontLarge;
/// No description provided for @textBold.
///
/// In en, this message translates to:
/// **'Bold'**
String get textBold;
/// No description provided for @textDragHint.
///
/// In en, this message translates to:
/// **'Drag to move'**
String get textDragHint;
}
class _AppLocalizationsDelegate

View File

@@ -588,4 +588,36 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get processingOcr => 'Processing OCR…';
@override
String get notebooksSection => 'Notebooks';
@override
String get addBlankPage => 'Blank page';
@override
String get importIntoNotebook => 'Import into notebook';
@override
String get notebookMembersEmpty => 'No pages yet';
@override
String memberCount(int count) {
return '$count items';
}
@override
String get textFontSmall => 'S';
@override
String get textFontMedium => 'M';
@override
String get textFontLarge => 'L';
@override
String get textBold => 'Bold';
@override
String get textDragHint => 'Drag to move';
}

View File

@@ -580,4 +580,36 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get processingOcr => '正在识别文字…';
@override
String get notebooksSection => '笔记本';
@override
String get addBlankPage => '空白页';
@override
String get importIntoNotebook => '导入到笔记本';
@override
String get notebookMembersEmpty => '还没有页面';
@override
String memberCount(int count) {
return '$count';
}
@override
String get textFontSmall => '';
@override
String get textFontMedium => '';
@override
String get textFontLarge => '';
@override
String get textBold => '粗体';
@override
String get textDragHint => '拖动移动';
}

View File

@@ -207,5 +207,18 @@
"@diagExported": { "placeholders": { "bytes": { "type": "int" } } },
"diagExportFail": "导出失败:{error}",
"@diagExportFail": { "placeholders": { "error": { "type": "String" } } },
"processingOcr": "正在识别文字…"
"processingOcr": "正在识别文字…",
"notebooksSection": "笔记本",
"addBlankPage": "空白页",
"importIntoNotebook": "导入到笔记本",
"notebookMembersEmpty": "还没有页面",
"memberCount": "{count} 项",
"@memberCount": {
"placeholders": { "count": { "type": "int" } }
},
"textFontSmall": "小",
"textFontMedium": "中",
"textFontLarge": "大",
"textBold": "粗体",
"textDragHint": "拖动移动"
}