diff --git a/apps/client/src/translations/en/translation.json b/apps/client/src/translations/en/translation.json
index 653e7dd0b2..0e335e4da0 100644
--- a/apps/client/src/translations/en/translation.json
+++ b/apps/client/src/translations/en/translation.json
@@ -1930,7 +1930,9 @@
"theme_group_light": "Light themes",
"theme_group_dark": "Dark themes",
"copy_title": "Copy to clipboard",
- "click_to_copy": "Click to copy"
+ "click_to_copy": "Click to copy",
+ "tab_width": "Tab width",
+ "tab_width_unit": "spaces"
},
"classic_editor_toolbar": {
"title": "Formatting"
diff --git a/apps/client/src/widgets/type_widgets/options/text_notes.tsx b/apps/client/src/widgets/type_widgets/options/text_notes.tsx
index 009def29a9..00c66d92b5 100644
--- a/apps/client/src/widgets/type_widgets/options/text_notes.tsx
+++ b/apps/client/src/widgets/type_widgets/options/text_notes.tsx
@@ -264,6 +264,7 @@ function CodeBlockStyle() {
}, []);
const [ codeBlockTheme, setCodeBlockTheme ] = useTriliumOption("codeBlockTheme");
const [ codeBlockWordWrap, setCodeBlockWordWrap ] = useTriliumOptionBool("codeBlockWordWrap");
+ const [ codeBlockTabWidth, setCodeBlockTabWidth ] = useTriliumOption("codeBlockTabWidth");
return (
@@ -285,6 +286,15 @@ function CodeBlockStyle() {
onChange={setCodeBlockWordWrap}
/>
+
+
+
+
);
diff --git a/apps/server/src/routes/api/options.ts b/apps/server/src/routes/api/options.ts
index f9c92c9718..8191b6812e 100644
--- a/apps/server/src/routes/api/options.ts
+++ b/apps/server/src/routes/api/options.ts
@@ -30,6 +30,7 @@ const ALLOWED_OPTIONS = new Set([
"theme",
"codeBlockTheme",
"codeBlockWordWrap",
+ "codeBlockTabWidth",
"codeNoteTheme",
"syncServerHost",
"syncServerTimeout",
diff --git a/apps/server/src/services/options_init.ts b/apps/server/src/services/options_init.ts
index 4bff15d91e..bdab81af62 100644
--- a/apps/server/src/services/options_init.ts
+++ b/apps/server/src/services/options_init.ts
@@ -216,6 +216,7 @@ const defaultOptions: DefaultOption[] = [
isSynced: false
},
{ name: "codeBlockWordWrap", value: "false", isSynced: true },
+ { name: "codeBlockTabWidth", value: "4", isSynced: true },
// Text note configuration
{ name: "textNoteEditorType", value: "ckeditor-balloon", isSynced: true },
diff --git a/packages/commons/src/lib/options_interface.ts b/packages/commons/src/lib/options_interface.ts
index 9f7db1d04b..b64ae1e568 100644
--- a/packages/commons/src/lib/options_interface.ts
+++ b/packages/commons/src/lib/options_interface.ts
@@ -160,6 +160,7 @@ export interface OptionDefinitions extends KeyboardShortcutsOptions