Merge pull request #230 from gamosoft/features/quick-create

Features/quick create
This commit is contained in:
Guillermo Villar 2026-06-04 14:36:32 +02:00 committed by GitHub
commit eade9fb7a6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 227 additions and 31 deletions

View File

@ -9,6 +9,7 @@
- **Resume where you left off** - Editor scroll position is remembered per note within the session, so switching back to a long note returns you to the same spot
- **Undo/Redo** - Ctrl+Z / Ctrl+Y support
- **Note templates** - Create notes from templates with dynamic placeholders
- **Quick-create** - Set the **+ / New** button to skip the type chooser and create your most common item (note, folder, template, or drawing) in one click; **Shift+click** always shows the full chooser. Optionally pre-fill new note titles with a `yyyymmddHHMMSS` timestamp.
- **Syntax highlighting** for code blocks (50+ languages)
- **Copy code blocks** - One-click copy button on hover
- **LaTeX/Math rendering** - Beautiful mathematical equations with MathJax (see [MATHJAX.md](MATHJAX.md))

View File

@ -43,8 +43,14 @@ const LOCAL_SETTINGS = {
hideUnderscoreFolders: { key: 'hideUnderscoreFolders', type: 'boolean', default: false },
tabInsertsTab: { key: 'tabInsertsTab', type: 'boolean', default: false },
sidebarPanelCollapsed: { key: 'sidebarPanelCollapsed', type: 'boolean', default: false },
autoFillNoteTitle: { key: 'autoFillNoteTitle', type: 'boolean', default: false },
// String settings
sortMode: { key: 'sortMode', type: 'string', default: 'a-z' },
newButtonAction: {
key: 'newButtonAction', type: 'string', default: 'chooser',
valid: ['chooser', 'note', 'folder', 'template', 'drawing']
},
lastUsedTemplate: { key: 'lastUsedTemplate', type: 'string', default: '' },
// Number settings with validation
sidebarWidth: { key: 'sidebarWidth', type: 'number', default: CONFIG.DEFAULT_SIDEBAR_WIDTH, min: 200, max: 600 },
editorWidth: { key: 'editorWidth', type: 'number', default: 50, min: 20, max: 80 },
@ -408,6 +414,9 @@ function noteApp() {
availableTemplates: [],
selectedTemplate: '',
newTemplateNoteName: '',
newButtonAction: 'chooser',
autoFillNoteTitle: false,
lastUsedTemplate: '',
// New note / folder name modal (replaces window.prompt)
showCreateNameModal: false,
@ -1742,6 +1751,9 @@ function noteApp() {
const data = await response.json();
this.lastUsedTemplate = this.selectedTemplate;
try { localStorage.setItem('lastUsedTemplate', this.selectedTemplate); } catch (_) {}
// Close modal and reset state
this.showTemplateModal = false;
this.selectedTemplate = '';
@ -4570,16 +4582,35 @@ function noteApp() {
// DROPDOWN MENU SYSTEM
// =====================================================
// Shift+click always forces the chooser regardless of newButtonAction.
toggleNewDropdown(event) {
this.showNewDropdown = true; // Always open (or keep open)
const wantsChooser =
(event && event.shiftKey) ||
!this.newButtonAction ||
this.newButtonAction === 'chooser';
if (wantsChooser) {
this._openNewDropdownChooser(event);
return;
}
switch (this.newButtonAction) {
case 'note': this.createNote(); break;
case 'folder': this.createFolder(); break;
case 'template': this.openTemplateModal(); break;
case 'drawing': this.createNewDrawing(); break;
default: this._openNewDropdownChooser(event);
}
},
_openNewDropdownChooser(event) {
this.showNewDropdown = true;
if (event && event.target) {
const rect = event.target.getBoundingClientRect();
// Position dropdown next to the clicked element
let top = rect.bottom + 4; // 4px spacing
let top = rect.bottom + 4;
let left = rect.left;
// Keep dropdown on screen
const dropdownWidth = 200;
const dropdownHeight = 150;
if (left + dropdownWidth > window.innerWidth) {
@ -4593,6 +4624,26 @@ function noteApp() {
}
},
openTemplateModal() {
this.showNewDropdown = false;
this.mobileSidebarOpen = false;
const hasLastUsed = !!this.lastUsedTemplate &&
this.availableTemplates.some(t => t.name === this.lastUsedTemplate);
this.selectedTemplate = hasLastUsed ? this.lastUsedTemplate : '';
this.newTemplateNoteName = this.autoFillNoteTitle ? this._autoTitleTimestamp() : '';
this.showTemplateModal = true;
// Only steal focus when the modal is one-Enter-away from submission.
if (hasLastUsed) {
this.$nextTick(() => {
const el = document.getElementById('template-note-name-input');
if (el) {
el.focus();
el.select();
}
});
}
},
closeDropdown() {
this.showNewDropdown = false;
this.dropdownTargetFolder = null; // Reset folder context
@ -4653,7 +4704,8 @@ function noteApp() {
this.mobileSidebarOpen = false;
this.createNameModalKind = kind;
this.createNameModalTargetFolder = targetFolder;
this.createNameModalInput = '';
this.createNameModalInput =
(kind === 'note' && this.autoFillNoteTitle) ? this._autoTitleTimestamp() : '';
this.showCreateNameModal = true;
this.$nextTick(() => {
const el = document.getElementById('create-name-modal-input');
@ -4664,6 +4716,14 @@ function noteApp() {
});
},
// Zettelkasten-style yyyymmddHHMMSS in local time.
_autoTitleTimestamp() {
const d = new Date();
const pad = (n) => String(n).padStart(2, '0');
return `${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}` +
`${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}`;
},
closeCreateNameModal() {
this.showCreateNameModal = false;
this.createNameModalInput = '';

View File

@ -2158,11 +2158,11 @@
<!-- Syntax Highlighting Toggle -->
<div class="mb-4">
<label class="flex items-center justify-between cursor-pointer">
<span class="text-xs font-medium" style="color: var(--text-secondary);" x-text="t('syntax_highlight.title')"></span>
<label class="flex items-center justify-between gap-3 cursor-pointer">
<span class="text-xs font-medium flex-1 min-w-0" style="color: var(--text-secondary);" x-text="t('syntax_highlight.title')"></span>
<div
@click="toggleSyntaxHighlight()"
class="relative w-10 h-5 rounded-full transition-colors cursor-pointer"
class="relative w-10 h-5 rounded-full transition-colors cursor-pointer flex-shrink-0"
:style="syntaxHighlightEnabled ? 'background-color: var(--accent-primary)' : 'background-color: var(--bg-tertiary)'"
>
<div
@ -2176,11 +2176,11 @@
<!-- Readable Line Length Toggle -->
<div class="mb-4">
<label class="flex items-center justify-between cursor-pointer">
<span class="text-xs font-medium" style="color: var(--text-secondary);" x-text="t('settings.readable_line_length')"></span>
<label class="flex items-center justify-between gap-3 cursor-pointer">
<span class="text-xs font-medium flex-1 min-w-0" style="color: var(--text-secondary);" x-text="t('settings.readable_line_length')"></span>
<div
@click="toggleReadableLineLength()"
class="relative w-10 h-5 rounded-full transition-colors cursor-pointer"
class="relative w-10 h-5 rounded-full transition-colors cursor-pointer flex-shrink-0"
:style="readableLineLength ? 'background-color: var(--accent-primary)' : 'background-color: var(--bg-tertiary)'"
>
<div
@ -2194,11 +2194,11 @@
<!-- Hide Underscore Folders Toggle -->
<div class="mb-4">
<label class="flex items-center justify-between cursor-pointer">
<span class="text-xs font-medium" style="color: var(--text-secondary);" x-text="t('settings.hide_underscore_folders')"></span>
<label class="flex items-center justify-between gap-3 cursor-pointer">
<span class="text-xs font-medium flex-1 min-w-0" style="color: var(--text-secondary);" x-text="t('settings.hide_underscore_folders')"></span>
<div
@click="toggleHideUnderscoreFolders()"
class="relative w-10 h-5 rounded-full transition-colors cursor-pointer"
class="relative w-10 h-5 rounded-full transition-colors cursor-pointer flex-shrink-0"
:style="hideUnderscoreFolders ? 'background-color: var(--accent-primary)' : 'background-color: var(--bg-tertiary)'"
>
<div
@ -2212,11 +2212,11 @@
<!-- Tab inserts tab -->
<div class="mb-4">
<label class="flex items-center justify-between cursor-pointer">
<span class="text-xs font-medium" style="color: var(--text-secondary);" x-text="t('settings.tab_inserts_tab')"></span>
<label class="flex items-center justify-between gap-3 cursor-pointer">
<span class="text-xs font-medium flex-1 min-w-0" style="color: var(--text-secondary);" x-text="t('settings.tab_inserts_tab')"></span>
<div
@click="toggleTabInsertsTab()"
class="relative w-10 h-5 rounded-full transition-colors cursor-pointer"
class="relative w-10 h-5 rounded-full transition-colors cursor-pointer flex-shrink-0"
:style="tabInsertsTab ? 'background-color: var(--accent-primary)' : 'background-color: var(--bg-tertiary)'"
>
<div
@ -2227,6 +2227,40 @@
</label>
<p class="text-xs mt-1" style="color: var(--text-tertiary);" x-text="t('settings.tab_inserts_tab_desc')"></p>
</div>
<div class="mb-4">
<label class="block text-xs font-medium mb-2" style="color: var(--text-secondary);" x-text="t('settings.new_button_action')"></label>
<select
x-model="newButtonAction"
@change="localStorage.setItem('newButtonAction', newButtonAction)"
class="w-full px-3 py-2 rounded border text-sm"
style="background-color: var(--bg-tertiary); color: var(--text-primary); border-color: var(--border-primary);"
>
<option value="chooser" x-text="t('settings.new_button_option_chooser')"></option>
<option value="note" x-text="t('settings.new_button_option_note')"></option>
<option value="folder" x-text="t('settings.new_button_option_folder')"></option>
<option value="template" x-text="t('settings.new_button_option_template')"></option>
<option value="drawing" x-text="t('settings.new_button_option_drawing')"></option>
</select>
<p class="text-xs mt-1" style="color: var(--text-tertiary);" x-text="t('settings.new_button_action_desc')"></p>
</div>
<div class="mb-4">
<label class="flex items-center justify-between gap-3 cursor-pointer">
<span class="text-xs font-medium flex-1 min-w-0" style="color: var(--text-secondary);" x-text="t('settings.auto_fill_note_title')"></span>
<div
@click="autoFillNoteTitle = !autoFillNoteTitle; localStorage.setItem('autoFillNoteTitle', autoFillNoteTitle)"
class="relative w-10 h-5 rounded-full transition-colors cursor-pointer flex-shrink-0"
:style="autoFillNoteTitle ? 'background-color: var(--accent-primary)' : 'background-color: var(--bg-tertiary)'"
>
<div
class="absolute top-0.5 left-0.5 w-4 h-4 rounded-full transition-transform"
:style="'background-color: var(--bg-primary);' + (autoFillNoteTitle ? ' transform: translateX(20px);' : '')"
></div>
</div>
</label>
<p class="text-xs mt-1" style="color: var(--text-tertiary);" x-text="t('settings.auto_fill_note_title_desc')"></p>
</div>
<!-- Logout (if auth enabled) - uses authEnabled from main app state -->
<div x-show="authEnabled" class="mb-4">
@ -3083,7 +3117,7 @@
class="flex items-center justify-between px-3 py-2 cursor-pointer"
style="border-bottom: 1px solid var(--border-primary);"
>
<span class="text-xs font-medium" style="color: var(--text-secondary);">
<span class="text-xs font-medium flex-1 min-w-0" style="color: var(--text-secondary);">
⚙️ Properties
</span>
<span class="text-xs opacity-40">▲ Collapse</span>
@ -3449,7 +3483,7 @@
<span x-text="t('sidebar.new_folder')"></span>
</button>
<button
@click.stop="showTemplateModal = true; showNewDropdown = false; mobileSidebarOpen = false"
@click.stop="openTemplateModal()"
class="w-full px-4 py-2.5 text-sm text-left flex items-center gap-3 transition-colors"
style="color: var(--text-primary);"
onmouseover="this.style.backgroundColor='var(--bg-hover)'"
@ -3505,6 +3539,7 @@
<label class="block text-sm font-medium mb-2" style="color: var(--text-secondary);" x-text="t('notes.prompt_name')">
</label>
<input
id="template-note-name-input"
x-model="newTemplateNoteName"
type="text"
:placeholder="t('notes.input_placeholder')"
@ -3538,7 +3573,7 @@
:disabled="!selectedTemplate || !newTemplateNoteName.trim() || availableTemplates.length === 0"
class="flex-1 px-4 py-2 rounded font-medium text-white transition-colors"
style="background-color: var(--accent-primary);"
:style="(!selectedTemplate || !newTemplateNoteName.trim() || availableTemplates.length === 0) ? 'opacity: 0.5; cursor: not-allowed;' : ''"
:style="(!selectedTemplate || !newTemplateNoteName.trim() || availableTemplates.length === 0) ? { opacity: '0.5', cursor: 'not-allowed' } : {}"
onmouseover="if(!this.disabled) this.style.backgroundColor='var(--accent-hover)'"
onmouseout="if(!this.disabled) this.style.backgroundColor='var(--accent-primary)'"
x-text="t('templates.create_note')"
@ -3657,6 +3692,7 @@
<div x-show="showConfirmModal"
@click.self="confirmModalCancel()"
@keydown.escape.window="showConfirmModal && confirmModalCancel()"
@keydown.enter.window="if (showConfirmModal) { $event.preventDefault(); confirmModalConfirm(); }"
class="fixed inset-0 flex items-center justify-center p-4"
style="background-color: rgba(0, 0, 0, 0.5); z-index: 1250;"
x-cloak>

View File

@ -269,7 +269,16 @@
"hide_underscore_folders": "Systemordner ausblenden",
"hide_underscore_folders_desc": "_attachments, _templates und andere Unterstrich-Ordner ausblenden",
"tab_inserts_tab": "Tab-Taste fügt Tab ein",
"tab_inserts_tab_desc": "Tab drücken, um ein Tabulatorzeichen einzufügen statt den Fokus zu wechseln"
"tab_inserts_tab_desc": "Tab drücken, um ein Tabulatorzeichen einzufügen statt den Fokus zu wechseln",
"new_button_action": "Wenn du auf + klickst",
"new_button_action_desc": "Umschalt+Klick zeigt immer die Auswahl.",
"new_button_option_chooser": "Auswahl anzeigen (Standard)",
"new_button_option_note": "Neue Notiz",
"new_button_option_folder": "Neuer Ordner",
"new_button_option_template": "Neue Notiz aus Vorlage",
"new_button_option_drawing": "Neue Zeichnung",
"auto_fill_note_title": "Titel mit Zeitstempel",
"auto_fill_note_title_desc": "jjjjmmttHHMMSS. Enter akzeptiert, Tippen ersetzt."
},
"homepage": {
"title": "Startseite",

View File

@ -268,7 +268,16 @@
"hide_underscore_folders": "Hide system folders",
"hide_underscore_folders_desc": "Hide _attachments, _templates and other underscore folders from sidebar",
"tab_inserts_tab": "Tab key inserts tab",
"tab_inserts_tab_desc": "Press Tab to insert a tab character instead of changing focus"
"tab_inserts_tab_desc": "Press Tab to insert a tab character instead of changing focus",
"new_button_action": "When you click +",
"new_button_action_desc": "Shift+click always shows the chooser.",
"new_button_option_chooser": "Show chooser (default)",
"new_button_option_note": "New note",
"new_button_option_folder": "New folder",
"new_button_option_template": "New note from template",
"new_button_option_drawing": "New drawing",
"auto_fill_note_title": "Auto-fill title with timestamp",
"auto_fill_note_title_desc": "yyyymmddHHMMSS. Enter to accept, type to replace."
},
"homepage": {
"title": "Home",

View File

@ -269,7 +269,16 @@
"hide_underscore_folders": "Hide system folders",
"hide_underscore_folders_desc": "Hide _attachments, _templates and other underscore folders from sidebar",
"tab_inserts_tab": "Tab key inserts tab",
"tab_inserts_tab_desc": "Press Tab to insert a tab character instead of changing focus"
"tab_inserts_tab_desc": "Press Tab to insert a tab character instead of changing focus",
"new_button_action": "When you click +",
"new_button_action_desc": "Shift+click always shows the chooser.",
"new_button_option_chooser": "Show chooser (default)",
"new_button_option_note": "New note",
"new_button_option_folder": "New folder",
"new_button_option_template": "New note from template",
"new_button_option_drawing": "New drawing",
"auto_fill_note_title": "Auto-fill title with timestamp",
"auto_fill_note_title_desc": "yyyymmddHHMMSS. Enter to accept, type to replace."
},
"homepage": {
"title": "Home",

View File

@ -269,7 +269,16 @@
"hide_underscore_folders": "Ocultar carpetas de sistema",
"hide_underscore_folders_desc": "Ocultar _attachments, _templates y otras carpetas con guion bajo",
"tab_inserts_tab": "Tabulador inserta tabulación",
"tab_inserts_tab_desc": "Pulsa Tab para insertar un tabulador en lugar de cambiar el foco"
"tab_inserts_tab_desc": "Pulsa Tab para insertar un tabulador en lugar de cambiar el foco",
"new_button_action": "Cuando haces clic en +",
"new_button_action_desc": "Mayús+clic siempre muestra el selector.",
"new_button_option_chooser": "Mostrar selector (por defecto)",
"new_button_option_note": "Nueva nota",
"new_button_option_folder": "Nueva carpeta",
"new_button_option_template": "Nueva nota desde plantilla",
"new_button_option_drawing": "Nuevo dibujo",
"auto_fill_note_title": "Título con marca de tiempo",
"auto_fill_note_title_desc": "aaaammddHHMMSS. Intro acepta, escribe para reemplazar."
},
"homepage": {
"title": "Inicio",

View File

@ -269,7 +269,16 @@
"hide_underscore_folders": "Masquer les dossiers système",
"hide_underscore_folders_desc": "Masquer _attachments, _templates et autres dossiers préfixés",
"tab_inserts_tab": "Tab insère une tabulation",
"tab_inserts_tab_desc": "Appuyez sur Tab pour insérer une tabulation au lieu de changer le focus"
"tab_inserts_tab_desc": "Appuyez sur Tab pour insérer une tabulation au lieu de changer le focus",
"new_button_action": "Quand vous cliquez sur +",
"new_button_action_desc": "Maj+clic affiche toujours le sélecteur.",
"new_button_option_chooser": "Afficher le sélecteur (par défaut)",
"new_button_option_note": "Nouvelle note",
"new_button_option_folder": "Nouveau dossier",
"new_button_option_template": "Nouvelle note depuis un modèle",
"new_button_option_drawing": "Nouveau dessin",
"auto_fill_note_title": "Titre avec horodatage",
"auto_fill_note_title_desc": "aaaammjjHHMMSS. Entrée accepte, tapez pour remplacer."
},
"homepage": {
"title": "Accueil",

View File

@ -269,7 +269,16 @@
"hide_underscore_folders": "Rendszermappák elrejtése",
"hide_underscore_folders_desc": "_attachments, _templates és más aláhúzásos mappák elrejtése",
"tab_inserts_tab": "Tab billentyű több helyet hagy a szövegben",
"tab_inserts_tab_desc": "Nyomd meg a Tab-ot, hogy több helyet hagyj a szövegben a fókuszváltás helyett"
"tab_inserts_tab_desc": "Nyomd meg a Tab-ot, hogy több helyet hagyj a szövegben a fókuszváltás helyett",
"new_button_action": "A + gombra kattintáskor",
"new_button_action_desc": "Shift+kattintás mindig megmutatja a választót.",
"new_button_option_chooser": "Választó megjelenítése (alapértelmezett)",
"new_button_option_note": "Új jegyzet",
"new_button_option_folder": "Új mappa",
"new_button_option_template": "Új jegyzet sablonból",
"new_button_option_drawing": "Új rajz",
"auto_fill_note_title": "Cím kitöltése időbélyeggel",
"auto_fill_note_title_desc": "éééé.hh.nn.ÓÓ.PP.MM. Enter elfogad, gépelés felülír."
},
"homepage": {
"title": "Főoldal",

View File

@ -268,7 +268,16 @@
"hide_underscore_folders": "Nascondi cartelle di sistema",
"hide_underscore_folders_desc": "Nascondi _attachments, _templates e altre cartelle con underscore",
"tab_inserts_tab": "Tab inserisce tabulazione",
"tab_inserts_tab_desc": "Premi Tab per inserire una tabulazione invece di cambiare focus"
"tab_inserts_tab_desc": "Premi Tab per inserire una tabulazione invece di cambiare focus",
"new_button_action": "Quando clicchi su +",
"new_button_action_desc": "Shift+clic mostra sempre il selettore.",
"new_button_option_chooser": "Mostra selettore (predefinito)",
"new_button_option_note": "Nuova nota",
"new_button_option_folder": "Nuova cartella",
"new_button_option_template": "Nuova nota da modello",
"new_button_option_drawing": "Nuovo disegno",
"auto_fill_note_title": "Compila titolo con timestamp",
"auto_fill_note_title_desc": "aaaammddHHMMSS. Invio accetta, digita per sostituire."
},
"homepage": {
"title": "Home",

View File

@ -268,7 +268,16 @@
"hide_underscore_folders": "システムフォルダを非表示",
"hide_underscore_folders_desc": "_attachments、_templatesなどのフォルダをサイドバーから非表示",
"tab_inserts_tab": "Tabキーでタブを挿入",
"tab_inserts_tab_desc": "Tabキーでフォーカス移動ではなくタブ文字を挿入"
"tab_inserts_tab_desc": "Tabキーでフォーカス移動ではなくタブ文字を挿入",
"new_button_action": "+ をクリックしたとき",
"new_button_action_desc": "Shift+クリックで常にセレクタが開きます。",
"new_button_option_chooser": "セレクタを表示(デフォルト)",
"new_button_option_note": "新規ノート",
"new_button_option_folder": "新規フォルダ",
"new_button_option_template": "テンプレートから新規ノート",
"new_button_option_drawing": "新規お絵描き",
"auto_fill_note_title": "タイトルに日時を自動入力",
"auto_fill_note_title_desc": "yyyymmddHHMMSS。Enterで確定、入力で置換。"
},
"homepage": {
"title": "ホーム",

View File

@ -268,7 +268,16 @@
"hide_underscore_folders": "Скрыть системные папки",
"hide_underscore_folders_desc": "Скрыть _attachments, _templates и другие папки с подчёркиванием",
"tab_inserts_tab": "Tab вставляет табуляцию",
"tab_inserts_tab_desc": "Нажмите Tab для вставки табуляции вместо переключения фокуса"
"tab_inserts_tab_desc": "Нажмите Tab для вставки табуляции вместо переключения фокуса",
"new_button_action": "При нажатии +",
"new_button_action_desc": "Shift+клик всегда показывает селектор.",
"new_button_option_chooser": "Показать селектор (по умолчанию)",
"new_button_option_note": "Новая заметка",
"new_button_option_folder": "Новая папка",
"new_button_option_template": "Новая заметка из шаблона",
"new_button_option_drawing": "Новый рисунок",
"auto_fill_note_title": "Метка времени в названии",
"auto_fill_note_title_desc": "ггггммддЧЧММСС. Enter — принять, печатать — заменить."
},
"homepage": {
"title": "Главная",

View File

@ -268,7 +268,16 @@
"hide_underscore_folders": "Skrij sistemske mape",
"hide_underscore_folders_desc": "Skrij _attachments, _templates in druge mape s podčrtajem",
"tab_inserts_tab": "Tipka Tab vstavi tabulator",
"tab_inserts_tab_desc": "Pritisnite Tab za vstavljanje tabulatorja namesto premikanja fokusa"
"tab_inserts_tab_desc": "Pritisnite Tab za vstavljanje tabulatorja namesto premikanja fokusa",
"new_button_action": "Ko kliknete +",
"new_button_action_desc": "Shift+klik vedno pokaže izbirnik.",
"new_button_option_chooser": "Pokaži izbirnik (privzeto)",
"new_button_option_note": "Nova zabeležka",
"new_button_option_folder": "Nova mapa",
"new_button_option_template": "Nova zabeležka iz predloge",
"new_button_option_drawing": "Nova risba",
"auto_fill_note_title": "Časovni žig v naslovu",
"auto_fill_note_title_desc": "llllmmddUUMMSS. Enter potrdi, tipkanje zamenja."
},
"homepage": {
"title": "Domov",

View File

@ -268,7 +268,16 @@
"hide_underscore_folders": "隐藏系统文件夹",
"hide_underscore_folders_desc": "从侧边栏隐藏 _attachments、_templates 等下划线文件夹",
"tab_inserts_tab": "Tab键插入制表符",
"tab_inserts_tab_desc": "按Tab键插入制表符而不是切换焦点"
"tab_inserts_tab_desc": "按Tab键插入制表符而不是切换焦点",
"new_button_action": "点击 + 时",
"new_button_action_desc": "Shift+点击始终显示选择器。",
"new_button_option_chooser": "显示选择器(默认)",
"new_button_option_note": "新建笔记",
"new_button_option_folder": "新建文件夹",
"new_button_option_template": "从模板新建笔记",
"new_button_option_drawing": "新建绘图",
"auto_fill_note_title": "用时间戳自动填充标题",
"auto_fill_note_title_desc": "yyyymmddHHMMSS。Enter 接受,输入以替换。"
},
"homepage": {
"title": "首页",