From f1615bb4f6cb6c1bfcd5a751b822579f29477925 Mon Sep 17 00:00:00 2001 From: Barszczun Date: Sun, 21 Dec 2025 22:23:46 +0100 Subject: [PATCH 01/37] Translated using Weblate (Polish) Currently translated at 99.6% (1712 of 1718 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/pl/ --- apps/client/src/translations/pl/translation.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/client/src/translations/pl/translation.json b/apps/client/src/translations/pl/translation.json index 79d6687a5..9eab5ddac 100644 --- a/apps/client/src/translations/pl/translation.json +++ b/apps/client/src/translations/pl/translation.json @@ -1934,7 +1934,10 @@ }, "highlights_list_2": { "title": "Lista wyróżnień", - "options": "Opcje" + "options": "Opcje", + "modal_title": "Konfiguracja listy wyróżnień", + "menu_configure": "Konfiguracja listy wyróżnień...", + "no_highlights": "Nie znaleziono wyróżnień." }, "quick-search": { "placeholder": "Szybkie wyszukiwanie", From d99e08bfdd23e8cb2b14879a80b3c5a5b44b04d7 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Mon, 22 Dec 2025 01:39:33 +0200 Subject: [PATCH 02/37] style/text editor: fix links --- apps/client/src/stylesheets/theme-next/notes/text.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/client/src/stylesheets/theme-next/notes/text.css b/apps/client/src/stylesheets/theme-next/notes/text.css index deedf02da..82aac0a42 100644 --- a/apps/client/src/stylesheets/theme-next/notes/text.css +++ b/apps/client/src/stylesheets/theme-next/notes/text.css @@ -676,10 +676,15 @@ html .note-detail-editable-text :not(figure, .include-note, hr):first-child { .ck-content a.reference-link:hover { /* Apply underline only to the span inside the link so it can follow the * target note's user defined color */ + outline: none; text-decoration: none; } .ck-content a.reference-link > span { + color: var(--custom-color, inherit); +} + +.ck-content a.reference-link:hover > span { text-decoration: underline; } From aa7ae150dcda9207df9fcba5b0525f78be61a116 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Mon, 22 Dec 2025 02:04:35 +0200 Subject: [PATCH 03/37] style/text editor/links: tweak --- apps/client/src/stylesheets/theme-next/forms.css | 3 ++- .../src/stylesheets/theme-next/notes/text.css | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/apps/client/src/stylesheets/theme-next/forms.css b/apps/client/src/stylesheets/theme-next/forms.css index abe65e911..6c4799da3 100644 --- a/apps/client/src/stylesheets/theme-next/forms.css +++ b/apps/client/src/stylesheets/theme-next/forms.css @@ -653,7 +653,8 @@ body a.tn-link:focus-visible, } body a.tn-link:hover, -.use-tn-links a:hover { +.use-tn-links a:hover, +.use-tn-links a.ck-widget_selected { box-shadow: 0 0 0 4px var(--link-hover-background); --background: var(--link-hover-background); color: var(--link-hover-color); diff --git a/apps/client/src/stylesheets/theme-next/notes/text.css b/apps/client/src/stylesheets/theme-next/notes/text.css index 82aac0a42..2fe4a00c2 100644 --- a/apps/client/src/stylesheets/theme-next/notes/text.css +++ b/apps/client/src/stylesheets/theme-next/notes/text.css @@ -670,14 +670,26 @@ html .note-detail-editable-text :not(figure, .include-note, hr):first-child { color: var(--main-text-color); } +/* Links */ + +.ck-content a.ck-widget { + outline: none; +} + +.ck-content a.ck-widget.ck-widget_selected, +.ck-content a.ck-link_selected { + outline: 2px solid var(--input-focus-outline-color); + outline-offset: 2px; + background: var(--link-hover-background); +} + /* Reference link */ .ck-content a.reference-link, .ck-content a.reference-link:hover { /* Apply underline only to the span inside the link so it can follow the * target note's user defined color */ - outline: none; - text-decoration: none; + text-decoration: none; } .ck-content a.reference-link > span { From 150e2504b1e2d1506d3a64a423b1d7d4c28c0708 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Mon, 22 Dec 2025 02:20:56 +0200 Subject: [PATCH 04/37] style: add (limited) support for scrollable menus --- apps/client/src/stylesheets/theme-next/base.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/client/src/stylesheets/theme-next/base.css b/apps/client/src/stylesheets/theme-next/base.css index f77696dc0..b896d4e56 100644 --- a/apps/client/src/stylesheets/theme-next/base.css +++ b/apps/client/src/stylesheets/theme-next/base.css @@ -128,6 +128,12 @@ body.backdrop-effects-disabled { font-size: 0.9rem !important; } +.dropdown-menu.tn-dropdown-menu-scrollable { + /* Note: scrollable dropdowns does not support submenus */ + max-height: 90vh; + overflow: scroll; +} + body.desktop .dropdown-menu::before, :root .ck.ck-dropdown__panel::before, :root .excalidraw .popover::before, From a867c646e4c89a04386313e8600a8d1015c97a10 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Mon, 22 Dec 2025 02:23:43 +0200 Subject: [PATCH 05/37] style: refactor --- apps/client/src/widgets/layout/StatusBar.css | 5 ----- apps/client/src/widgets/layout/StatusBar.tsx | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/apps/client/src/widgets/layout/StatusBar.css b/apps/client/src/widgets/layout/StatusBar.css index 506d60afd..c4b72e807 100644 --- a/apps/client/src/widgets/layout/StatusBar.css +++ b/apps/client/src/widgets/layout/StatusBar.css @@ -155,11 +155,6 @@ } } - .dropdown-code-note-switcher { - max-height: 90vh; - overflow: scroll; - } - .backlinks-widget > .dropdown-menu { --menu-padding-size: .9em; diff --git a/apps/client/src/widgets/layout/StatusBar.tsx b/apps/client/src/widgets/layout/StatusBar.tsx index 6f8e5cdcc..0436a9f5b 100644 --- a/apps/client/src/widgets/layout/StatusBar.tsx +++ b/apps/client/src/widgets/layout/StatusBar.tsx @@ -422,7 +422,7 @@ function CodeNoteSwitcher({ note }: StatusBarContext) { icon="bx bx-code-curly" text={correspondingMimeType?.title} title={t("status_bar.code_note_switcher")} - dropdownContainerClassName="dropdown-code-note-switcher" + dropdownContainerClassName="dropdown-code-note-switcher tn-dropdown-menu-scrollable" > Date: Mon, 22 Dec 2025 02:24:34 +0200 Subject: [PATCH 06/37] style/breadcrumb: use scrollable dropdowns for note listings --- apps/client/src/widgets/layout/Breadcrumb.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/client/src/widgets/layout/Breadcrumb.tsx b/apps/client/src/widgets/layout/Breadcrumb.tsx index 350b52999..cd08cce1e 100644 --- a/apps/client/src/widgets/layout/Breadcrumb.tsx +++ b/apps/client/src/widgets/layout/Breadcrumb.tsx @@ -193,6 +193,7 @@ function BreadcrumbSeparator(props: BreadcrumbSeparatorProps) { noSelectButtonStyle buttonClassName="icon-action" hideToggleArrow + dropdownContainerClassName="tn-dropdown-menu-scrollable" dropdownOptions={{ popperConfig: { strategy: "fixed", placement: "top" } }} > From 353d626d45b5ce7c0de536936057f8506674dcd0 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Mon, 22 Dec 2025 02:29:05 +0200 Subject: [PATCH 07/37] style/breadcrumb: tweak arrows --- apps/client/src/widgets/layout/Breadcrumb.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/widgets/layout/Breadcrumb.tsx b/apps/client/src/widgets/layout/Breadcrumb.tsx index cd08cce1e..bc1494d3d 100644 --- a/apps/client/src/widgets/layout/Breadcrumb.tsx +++ b/apps/client/src/widgets/layout/Breadcrumb.tsx @@ -189,7 +189,7 @@ interface BreadcrumbSeparatorProps { function BreadcrumbSeparator(props: BreadcrumbSeparatorProps) { return ( } + text={} noSelectButtonStyle buttonClassName="icon-action" hideToggleArrow From d0f91e7709c092dd2c190e2e5d87dbf067bfc6f5 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Mon, 22 Dec 2025 02:37:00 +0200 Subject: [PATCH 08/37] style/status bar: hide the focus outline for dropdown buttons --- apps/client/src/widgets/layout/StatusBar.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/client/src/widgets/layout/StatusBar.css b/apps/client/src/widgets/layout/StatusBar.css index c4b72e807..15d45bf4e 100644 --- a/apps/client/src/widgets/layout/StatusBar.css +++ b/apps/client/src/widgets/layout/StatusBar.css @@ -255,4 +255,8 @@ } } + button.select-button:not(:focus-visible) { + outline: none; + } + } From 0d32e1f0d8152487676fc6c8e08215cdae17ed8b Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Mon, 22 Dec 2025 02:43:39 +0200 Subject: [PATCH 09/37] style/classic toolbar: fix broken border radius --- apps/client/src/stylesheets/theme-next/shell.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/stylesheets/theme-next/shell.css b/apps/client/src/stylesheets/theme-next/shell.css index a9707ed53..78ccc9455 100644 --- a/apps/client/src/stylesheets/theme-next/shell.css +++ b/apps/client/src/stylesheets/theme-next/shell.css @@ -1230,7 +1230,7 @@ body.layout-vertical .tab-row-widget-is-sorting .note-tab.note-tab-is-dragging . margin-bottom: 2px; } -body.vertical-layout #rest-pane > .classic-toolbar-widget { +body.layout-vertical #rest-pane > .classic-toolbar-widget { border-start-start-radius: var(--center-pane-border-radius); } From 931f0a694e937457f062a5bfcd6ee9763e3130ab Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 22 Dec 2025 01:50:47 +0000 Subject: [PATCH 10/37] chore(deps): update dependency @types/tabulator-tables to v6.3.1 --- apps/client/package.json | 2 +- pnpm-lock.yaml | 18 +++++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index e5996a36a..3604c236b 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -75,7 +75,7 @@ "@types/leaflet-gpx": "1.3.8", "@types/mark.js": "8.11.12", "@types/reveal.js": "5.2.2", - "@types/tabulator-tables": "6.3.0", + "@types/tabulator-tables": "6.3.1", "copy-webpack-plugin": "13.0.1", "happy-dom": "20.0.11", "script-loader": "0.7.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0d3d03c1f..30955aa67 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -330,8 +330,8 @@ importers: specifier: 5.2.2 version: 5.2.2 '@types/tabulator-tables': - specifier: 6.3.0 - version: 6.3.0 + specifier: 6.3.1 + version: 6.3.1 copy-webpack-plugin: specifier: 13.0.1 version: 13.0.1(webpack@5.101.3(esbuild@0.27.2)) @@ -5653,8 +5653,8 @@ packages: '@types/supertest@6.0.3': resolution: {integrity: sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==} - '@types/tabulator-tables@6.3.0': - resolution: {integrity: sha512-/mQzrThCdSQXc2lz2SUZglIG+vWQ1sb1CEiVxw9SFGKPulaj1543zrL2qABeJIKjKPxcSgmWUyDA9e8CMaI2cQ==} + '@types/tabulator-tables@6.3.1': + resolution: {integrity: sha512-qL05wGXVy0yfWcF8LCE9+9uSeUIpeKdgpm8YmOAPTjLd3FaoZziPOhVxIiLzEhLTFfOvbuwnaWDm4v4i87diRQ==} '@types/through2@2.0.41': resolution: {integrity: sha512-ryQ0tidWkb1O1JuYvWKyMLYEtOWDqF5mHerJzKz/gQpoAaJq2l/dsMPBF0B5BNVT34rbARYJ5/tsZwLfUi2kwQ==} @@ -15149,8 +15149,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.3.0 '@ckeditor/ckeditor5-utils': 47.3.0 ckeditor5: 47.3.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-block-quote@47.3.0': dependencies: @@ -15444,6 +15442,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.3.0 ckeditor5: 47.3.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-multi-root@47.3.0': dependencies: @@ -15493,6 +15493,8 @@ snapshots: '@ckeditor/ckeditor5-core': 47.3.0 '@ckeditor/ckeditor5-engine': 47.3.0 '@ckeditor/ckeditor5-utils': 47.3.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-essentials@47.3.0': dependencies: @@ -15953,6 +15955,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.3.0 '@ckeditor/ckeditor5-utils': 47.3.0 ckeditor5: 47.3.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-restricted-editing@47.3.0': dependencies: @@ -20362,7 +20366,7 @@ snapshots: '@types/methods': 1.1.4 '@types/superagent': 8.1.9 - '@types/tabulator-tables@6.3.0': {} + '@types/tabulator-tables@6.3.1': {} '@types/through2@2.0.41': dependencies: From 74b00e60e3c0c924cd7cbee94fdac6dba6d7c99e Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Mon, 22 Dec 2025 19:39:52 +0200 Subject: [PATCH 11/37] client/status bar panes: refactor into own component, add title bar and close button --- apps/client/src/widgets/layout/StatusBar.css | 27 ++++++++++++- apps/client/src/widgets/layout/StatusBar.tsx | 40 +++++++++++++++++--- 2 files changed, 61 insertions(+), 6 deletions(-) diff --git a/apps/client/src/widgets/layout/StatusBar.css b/apps/client/src/widgets/layout/StatusBar.css index 15d45bf4e..52e7962d2 100644 --- a/apps/client/src/widgets/layout/StatusBar.css +++ b/apps/client/src/widgets/layout/StatusBar.css @@ -243,7 +243,6 @@ > .attribute-list { font-size: 0.9em; - padding: 0.5em 0.75em; .inherited-attributes-widget > div { padding: 0; @@ -260,3 +259,29 @@ } } + +.status-bar-pane { + margin: 0 !important; + padding: 0; + + .status-bar-pane-title-bar { + display: flex; + padding: 6px 12px; + background: #2d2d2d; + justify-content: space-between; + align-items: center; + + .status-bar-pane-title-bar-caption { + text-transform: uppercase; + letter-spacing: .3pt; + font-weight: 600; + font-size: .85em; + } + } + + .status-bar-pane-content { + background: #363636; + padding: 8px 12px; + } +} + diff --git a/apps/client/src/widgets/layout/StatusBar.tsx b/apps/client/src/widgets/layout/StatusBar.tsx index 0436a9f5b..e49e9a030 100644 --- a/apps/client/src/widgets/layout/StatusBar.tsx +++ b/apps/client/src/widgets/layout/StatusBar.tsx @@ -266,11 +266,14 @@ function NoteInfoValue({ text, title, value }: { text: string; title?: string, v ); } -function SimilarNotesPane({ note, similarNotesShown }: NoteInfoContext) { +function SimilarNotesPane({ note, similarNotesShown, setSimilarNotesShown }: NoteInfoContext) { return (similarNotesShown && -
+ -
+ ); } //#endregion @@ -367,7 +370,11 @@ function AttributesPane({ note, noteContext, attributesShown, setAttributesShown }), [ api ])); return (context && -
+ + -
+ ); } //#endregion @@ -439,3 +446,26 @@ function CodeNoteSwitcher({ note }: StatusBarContext) { ); } //#endregion + +//#region Status bar pane + +interface StatusBarPaneParms { + children: ComponentChildren; + title: string; + visible: boolean; + setVisible?: (visible: boolean) => void; + className?: string; +} + +function StatusBarPane({ children, title, visible, setVisible, className }: StatusBarPaneParms) { + return
+
+ {title} + +
+
+ {children} +
+
+} +//#endregion \ No newline at end of file From 67fb8d0354caf427c2a89c7543a514f9a43941b9 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Mon, 22 Dec 2025 21:25:39 +0200 Subject: [PATCH 12/37] client/status bar panes: tweak --- apps/client/src/widgets/layout/StatusBar.css | 14 ++++++++++++-- apps/client/src/widgets/layout/StatusBar.tsx | 8 +++++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/apps/client/src/widgets/layout/StatusBar.css b/apps/client/src/widgets/layout/StatusBar.css index 52e7962d2..e9ad2e231 100644 --- a/apps/client/src/widgets/layout/StatusBar.css +++ b/apps/client/src/widgets/layout/StatusBar.css @@ -254,6 +254,10 @@ } } + div.similar-notes-widget div.similar-notes-wrapper { + max-height: unset; + } + button.select-button:not(:focus-visible) { outline: none; } @@ -267,7 +271,7 @@ .status-bar-pane-title-bar { display: flex; padding: 6px 12px; - background: #2d2d2d; + background: #272727; justify-content: space-between; align-items: center; @@ -280,8 +284,14 @@ } .status-bar-pane-content { - background: #363636; + border-bottom: 1px solid var(--main-border-color); + background: #181818; padding: 8px 12px; + + &.status-bar-pane-scrollable { + max-height: 40vh; + overflow-y: auto; + } } } diff --git a/apps/client/src/widgets/layout/StatusBar.tsx b/apps/client/src/widgets/layout/StatusBar.tsx index e49e9a030..a52cc9323 100644 --- a/apps/client/src/widgets/layout/StatusBar.tsx +++ b/apps/client/src/widgets/layout/StatusBar.tsx @@ -271,7 +271,8 @@ function SimilarNotesPane({ note, similarNotesShown, setSimilarNotesShown }: Not + setVisible={setSimilarNotesShown} + scrollable> ); @@ -454,16 +455,17 @@ interface StatusBarPaneParms { title: string; visible: boolean; setVisible?: (visible: boolean) => void; + scrollable?: boolean; className?: string; } -function StatusBarPane({ children, title, visible, setVisible, className }: StatusBarPaneParms) { +function StatusBarPane({ children, title, visible, setVisible, className, scrollable }: StatusBarPaneParms) { return
{title}
-
+
{children}
From 1f55ff536eeedd408e13deb8bcd431b26d5e3a86 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Mon, 22 Dec 2025 22:23:16 +0200 Subject: [PATCH 13/37] client/status bar panes: tweak --- apps/client/src/widgets/layout/StatusBar.css | 15 +++++++++------ apps/client/src/widgets/layout/StatusBar.tsx | 5 ++--- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/apps/client/src/widgets/layout/StatusBar.css b/apps/client/src/widgets/layout/StatusBar.css index e9ad2e231..8a21c233d 100644 --- a/apps/client/src/widgets/layout/StatusBar.css +++ b/apps/client/src/widgets/layout/StatusBar.css @@ -250,7 +250,13 @@ } .attribute-list-editor { - padding: 0 !important; + padding-block: 0 !important; + padding-inline: 0 100px !important ; + } + + .ck.ck-editor__editable::after { + /* Remove a hidden spinner that causes overflow */ + display: none; } } @@ -287,11 +293,8 @@ border-bottom: 1px solid var(--main-border-color); background: #181818; padding: 8px 12px; - - &.status-bar-pane-scrollable { - max-height: 40vh; - overflow-y: auto; - } + max-height: 40vh; + overflow-y: auto; } } diff --git a/apps/client/src/widgets/layout/StatusBar.tsx b/apps/client/src/widgets/layout/StatusBar.tsx index a52cc9323..691b8c576 100644 --- a/apps/client/src/widgets/layout/StatusBar.tsx +++ b/apps/client/src/widgets/layout/StatusBar.tsx @@ -455,17 +455,16 @@ interface StatusBarPaneParms { title: string; visible: boolean; setVisible?: (visible: boolean) => void; - scrollable?: boolean; className?: string; } -function StatusBarPane({ children, title, visible, setVisible, className, scrollable }: StatusBarPaneParms) { +function StatusBarPane({ children, title, visible, setVisible, className }: StatusBarPaneParms) { return
{title}
-
+
{children}
From b6d550f682207617b94f22c288612246ce80516a Mon Sep 17 00:00:00 2001 From: Kuzma Simonov Date: Mon, 22 Dec 2025 11:09:31 +0100 Subject: [PATCH 14/37] Translated using Weblate (Russian) Currently translated at 100.0% (389 of 389 strings) Translation: Trilium Notes/Server Translate-URL: https://hosted.weblate.org/projects/trilium/server/ru/ --- apps/server/src/assets/translations/ru/server.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/server/src/assets/translations/ru/server.json b/apps/server/src/assets/translations/ru/server.json index d6a52f501..f524c6933 100644 --- a/apps/server/src/assets/translations/ru/server.json +++ b/apps/server/src/assets/translations/ru/server.json @@ -82,7 +82,7 @@ "toggle-note-paths": "Перейти к путям заметки", "toggle-similar-notes": "Перейти к похожим заметкам", "other": "Прочее", - "toggle-right-pane": "Включить/выключить отображение правой панели, которая включает оглавление и выделенные фрагменты", + "toggle-right-pane": "Включить/выключить отображение правой панели, которая включает оглавление и акценты", "print-active-note": "Распечатать активную заметку", "open-note-externally": "Открыть заметку как файл с помощью приложения по умолчанию", "render-active-note": "Отрендерить (повторно отрендерить) активную заметку", From 3fc195998ce2b794174fa13814473539435e982f Mon Sep 17 00:00:00 2001 From: Yunho Park Date: Mon, 22 Dec 2025 01:19:15 +0100 Subject: [PATCH 15/37] Translated using Weblate (Korean) Currently translated at 67.7% (103 of 152 strings) Translation: Trilium Notes/Website Translate-URL: https://hosted.weblate.org/projects/trilium/website/ko/ --- apps/website/src/translations/ko/translation.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/website/src/translations/ko/translation.json b/apps/website/src/translations/ko/translation.json index 5b9c0bf32..d8d5c861d 100644 --- a/apps/website/src/translations/ko/translation.json +++ b/apps/website/src/translations/ko/translation.json @@ -125,5 +125,11 @@ "geomap_description": "커스터마이징이 가능한 마커로 휴가를 계획하거나 관심 지점을 지도에 직접 표시하세요. 기록된 GPX 트랙을 표시하여 여정을 추적할 수도 있습니다.", "presentation_title": "프레젠테이션", "presentation_description": "슬라이드에 정보를 정리하고, 매끄러운 전환 효과와 함께 전체 화면으로 발표하세요. 슬라이드를 PDF로 내보내 간편하게 공유할 수도 있습니다." + }, + "faq": { + "mobile_question": "모바일 앱이 있나요?", + "mobile_answer": "현재 공식적인 모바일 앱은 없습니다. 하지만, 서버 인스턴스를 가지고 있다면 웹 브라우저를 이용해 접근하거나 PWA로 설치할 수 있습니다. 안드로이드에는 (데스크탑 클라이언트처럼)오프라인에서도 작동하는 TriliumDroid라는 비공식 앱이 있습니다.", + "database_question": "어디에 데이터가 저장되나요?", + "server_question": "Trilium을 사용하기 위해 서버가 필요한가요?" } } From 68dc7eedec899e0960ab3a9f0b091c7b842d820b Mon Sep 17 00:00:00 2001 From: "Francis C." Date: Mon, 22 Dec 2025 09:44:00 +0100 Subject: [PATCH 16/37] Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 99.5% (1711 of 1718 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hant/ --- .../src/translations/tw/translation.json | 86 ++++++++++++++++--- 1 file changed, 72 insertions(+), 14 deletions(-) diff --git a/apps/client/src/translations/tw/translation.json b/apps/client/src/translations/tw/translation.json index 43aa33dfa..f09fce30c 100644 --- a/apps/client/src/translations/tw/translation.json +++ b/apps/client/src/translations/tw/translation.json @@ -691,7 +691,12 @@ "convert_into_attachment_prompt": "確定要將筆記 '{{title}}' 轉換為父級筆記的附件嗎?", "print_pdf": "匯出為 PDF…", "open_note_on_server": "在伺服器上開啟筆記", - "view_revisions": "筆記歷史版本..." + "view_revisions": "筆記歷史版本...", + "advanced": "進階", + "export_as_image": "匯出為圖片", + "export_as_image_png": "PNG (點陣)", + "export_as_image_svg": "SVG (向量)", + "note_map": "筆記地圖" }, "onclick_button": { "no_click_handler": "按鈕元件'{{componentId}}'沒有定義點擊時的處理方式" @@ -790,7 +795,7 @@ "file_type": "檔案類型", "file_size": "檔案大小", "download": "下載", - "open": "打開", + "open": "以外部程式打開", "upload_new_revision": "上傳新版本", "upload_success": "已上傳新檔案版本。", "upload_failed": "新檔案版本上傳失敗。", @@ -821,7 +826,9 @@ "note_size_info": "筆記大小提供了該筆記儲存需求的粗略估計。它考慮了筆記及其歷史的內容。", "calculate": "計算", "subtree_size": "(子階層大小: {{size}}, 共計 {{count}} 個筆記)", - "title": "筆記資訊" + "title": "筆記資訊", + "mime": "MIME 類型", + "show_similar_notes": "顯示相似筆記" }, "note_map": { "open_full": "展開顯示", @@ -884,7 +891,8 @@ "search_parameters": "搜尋參數", "unknown_search_option": "未知的搜尋選項 {{searchOptionName}}", "search_note_saved": "搜尋筆記已儲存至 {{- notePathTitle}}", - "actions_executed": "已執行操作。" + "actions_executed": "已執行操作。", + "view_options": "查看選項:" }, "similar_notes": { "title": "相似筆記", @@ -1503,7 +1511,11 @@ }, "highlights_list_2": { "title": "高亮列表", - "options": "選項" + "options": "選項", + "title_with_count_one": "{{count}} 處高亮", + "modal_title": "設定高亮列表", + "menu_configure": "設定高亮列表…", + "no_highlights": "未找到高亮內容。" }, "quick-search": { "placeholder": "快速搜尋", @@ -1539,8 +1551,13 @@ }, "note_title": { "placeholder": "請輸入筆記標題...", - "created_on": "建立於 {{date}}", - "last_modified": "最後修改於 {{date}}" + "created_on": "建立於 ", + "last_modified": "修改於 ", + "note_type_switcher_label": "從 {{type}} 切換至:", + "note_type_switcher_others": "其他筆記類型", + "note_type_switcher_templates": "模板", + "note_type_switcher_collection": "集合", + "edited_notes": "編輯過的筆記" }, "search_result": { "no_notes_found": "沒有找到符合搜尋條件的筆記。", @@ -1569,7 +1586,8 @@ }, "toc": { "table_of_contents": "目錄", - "options": "選項" + "options": "選項", + "no_headings": "無標題。" }, "watched_file_update_status": { "file_last_modified": "檔案 最後修改時間為 。", @@ -1943,8 +1961,9 @@ "unknown_widget": "未知元件:\"{{id}}\"。" }, "note_language": { - "not_set": "不設定", - "configure-languages": "設定語言…" + "not_set": "未設定語言", + "configure-languages": "設定語言…", + "help-on-languages": "設定內容語言說明…" }, "content_language": { "title": "內文語言", @@ -2011,7 +2030,7 @@ "book_properties_config": { "hide-weekends": "隱藏週末", "display-week-numbers": "顯示週數", - "map-style": "地圖樣式:", + "map-style": "地圖樣式", "max-nesting-depth": "最大嵌套深度:", "raster": "柵格", "vector_light": "向量(淺色)", @@ -2068,14 +2087,19 @@ "next_theme_title": "試用新 Trilium 主題", "next_theme_message": "您正在使用舊版主題,要試用新主題嗎?", "next_theme_button": "試用新主題", - "dismiss": "關閉" + "dismiss": "關閉", + "new_layout_title": "新版面配置", + "new_layout_button": "更多資訊" }, "settings": { "related_settings": "相關設定" }, "settings_appearance": { "related_code_blocks": "文字筆記中程式碼區塊的配色方案", - "related_code_notes": "程式碼筆記的配色方案" + "related_code_notes": "程式碼筆記的配色方案", + "ui": "使用者介面", + "ui_old_layout": "舊版面配置", + "ui_new_layout": "新版面配置" }, "units": { "percentage": "%" @@ -2135,6 +2159,40 @@ "read_only_explicit": "唯讀", "read_only_auto": "自動唯讀", "shared_publicly": "公開分享", - "shared_locally": "本地分享" + "shared_locally": "本地分享", + "read_only_explicit_description": "此筆記已被手動設定為唯讀。\n點擊以臨時編輯。", + "read_only_temporarily_disabled": "臨時編輯", + "shared_copy_to_clipboard": "複製連結至剪貼簿", + "shared_open_in_browser": "在瀏覽器中打開連結", + "shared_unshare": "取消分享", + "clipped_note": "網頁擷取", + "execute_script": "運行腳本", + "execute_sql": "運行 SQL" + }, + "breadcrumb": { + "hoisted_badge": "聚焦", + "hoisted_badge_title": "取消聚焦", + "workspace_badge": "工作空間", + "scroll_to_top_title": "跳轉至筆記開頭", + "create_new_note": "新增子筆記", + "empty_hide_archived_notes": "隱藏已歸檔的筆記" + }, + "status_bar": { + "language_title": "更改內容語言", + "note_info_title": "查看筆記資訊(如日期、筆記大小)", + "backlinks_one": "{{count}} 個反連結", + "backlinks_title_one": "查看反連結", + "attachments_one": "{{count}} 個附件", + "attachments_title_one": "在新分頁中查看附件", + "attributes_one": "{{count}} 個屬性", + "attributes_title": "自有屬性及繼承屬性", + "note_paths_one": "{{count}} 條路徑", + "note_paths_title": "筆記路徑", + "code_note_switcher": "更改語言模式" + }, + "right_pane": { + "empty_button": "隱藏面板", + "toggle": "切換右側面板", + "custom_widget_go_to_source": "跳轉至原始碼" } } From 29ed08d062255d1aade36503ea718ef4d8643868 Mon Sep 17 00:00:00 2001 From: Kuzma Simonov Date: Mon, 22 Dec 2025 11:13:00 +0100 Subject: [PATCH 17/37] Translated using Weblate (Russian) Currently translated at 100.0% (1718 of 1718 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/ru/ --- .../src/translations/ru/translation.json | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/apps/client/src/translations/ru/translation.json b/apps/client/src/translations/ru/translation.json index e030abbb3..ddbf23a8f 100644 --- a/apps/client/src/translations/ru/translation.json +++ b/apps/client/src/translations/ru/translation.json @@ -483,7 +483,7 @@ "workspace_template": "Эта заметка появится в списке доступных шаблонов при создании новой заметки, но только если будет установлен фокус на рабочую область с этим шаблоном", "workspace_search_home": "новые заметки поиска будут созданы как дочерние записи этой заметки, когда установлен фокус на какую-либо родительскую заметку этого рабочего пространство", "workspace_calendar_root": "Определяет корень календаря для каждого рабочего пространства", - "hide_highlight_widget": "Скрыть виджет «Выделенное»", + "hide_highlight_widget": "Скрыть виджет «Акценты»", "is_owned_by_note": "принадлежит заметке", "and_more": "... и ещё {{count}}.", "app_theme": "отмечает заметки CSS, которые являются полноценными темами Trilium и, таким образом, доступны в опциях Trilium.", @@ -750,7 +750,8 @@ }, "toc": { "table_of_contents": "Оглавление", - "options": "Параметры" + "options": "Параметры", + "no_headings": "Заголовки не найдены." }, "note_tree": { "hide-archived-notes": "Скрыть архивные заметки", @@ -1562,7 +1563,13 @@ }, "highlights_list_2": { "options": "Параметры", - "title": "Список выделенного" + "title": "Акценты", + "modal_title": "Настроить акценты", + "menu_configure": "Настроить акценты...", + "no_highlights": "Акценты в тексте не найдены.", + "title_with_count_one": "{{count}} акцент", + "title_with_count_few": "{{count}} акцента", + "title_with_count_many": "{{count}} акцентов" }, "include_note": { "dialog_title": "Вставить заметку", @@ -1755,15 +1762,15 @@ "enable_tray": "Включить отображение иконки в системном трее (чтобы изменения вступили в силу, необходимо перезапустить Trilium)" }, "highlights_list": { - "title": "Список выделенного", + "title": "Акценты", "bold": "Жирный текст", "italic": "Наклонный текст", "underline": "Подчеркнутый текст", "color": "Цветной текст", - "description": "Вы можете настроить список выделенного, отображаемый на правой панели:", + "description": "Вы можете настроить список акцентов, отображаемый на правой панели:", "bg_color": "Текст с заливкой фона", - "visibility_title": "Видимость списка выделений", - "visibility_description": "Вы можете скрыть виджет списка выделенного, добавив атрибут #hideHighlightWidget к заметке.", + "visibility_title": "Видимость списка акцентов", + "visibility_description": "Вы можете скрыть виджет списка акцентов, добавив атрибут #hideHighlightWidget к заметке.", "shortcut_info": "Вы можете настроить сочетание клавиш для быстрого переключения правой панели (включая список выделенного) в меню Параметры -> Сочетания клавиш (название \"toggleRightPane\")." }, "custom_date_time_format": { @@ -1808,7 +1815,7 @@ "edit_this_note": "Редактировать заметку" }, "show_highlights_list_widget_button": { - "show_highlights_list": "Показать список выделенного" + "show_highlights_list": "Показать список акцентов" }, "zen_mode": { "button_exit": "Покинуть режим \"дзен\"" @@ -2203,5 +2210,11 @@ }, "popup-editor": { "maximize": "Переключить на полный редактор" + }, + "right_pane": { + "custom_widget_go_to_source": "Исходный код", + "toggle": "Переключить панель справа", + "empty_button": "Скрыть панель", + "empty_message": "Нечего отобразить для текущей заметки" } } From 7bf0a4134e56a6da27cc88891f2f338f3e51a155 Mon Sep 17 00:00:00 2001 From: Anton Antonov Date: Mon, 22 Dec 2025 20:06:20 +0100 Subject: [PATCH 18/37] Added translation using Weblate (Bulgarian) --- apps/client/src/translations/bg/translation.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/client/src/translations/bg/translation.json diff --git a/apps/client/src/translations/bg/translation.json b/apps/client/src/translations/bg/translation.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/client/src/translations/bg/translation.json @@ -0,0 +1 @@ +{} From 8142b7489a2267f471f10f3d247b19e9e41df004 Mon Sep 17 00:00:00 2001 From: Anton Antonov Date: Mon, 22 Dec 2025 20:06:22 +0100 Subject: [PATCH 19/37] Added translation using Weblate (Bulgarian) --- docs/README-bg.md | 337 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 337 insertions(+) create mode 100644 docs/README-bg.md diff --git a/docs/README-bg.md b/docs/README-bg.md new file mode 100644 index 000000000..0da3a37bf --- /dev/null +++ b/docs/README-bg.md @@ -0,0 +1,337 @@ +
+ Special thanks to:
+ + Warp sponsorship
+ Warp, built for coding with multiple AI agents
+
+ Available for macOS, Linux and Windows +
+ +
+ +# Trilium Notes + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (all assets, all +releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Translation +status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + + + +[Chinese (Simplified Han script)](./README-ZH_CN.md) | [Chinese (Traditional Han +script)](./README-ZH_TW.md) | [English](../README.md) | [French](./README-fr.md) +| [German](./README-de.md) | [Greek](./README-el.md) | [Italian](./README-it.md) +| [Japanese](./README-ja.md) | [Romanian](./README-ro.md) | +[Spanish](./README-es.md) + + +Trilium Notes is a free and open-source, cross-platform hierarchical note taking +application with focus on building large personal knowledge bases. + +Trilium Screenshot + +## ⏬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + unstable development version, updated daily with the latest features and + fixes. + +## 📚 Documentation + +**Visit our comprehensive documentation at +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Our documentation is available in multiple formats: +- **Online Documentation**: Browse the full documentation at + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **In-App Help**: Press `F1` within Trilium to access the same documentation + directly in the application +- **GitHub**: Navigate through the [User Guide](./User%20Guide/User%20Guide/) in + this repository + +### Quick Links +- [Getting Started Guide](https://docs.triliumnotes.org/) +- [Installation Instructions](https://docs.triliumnotes.org/user-guide/setup) +- [Docker + Setup](https://docs.triliumnotes.org/user-guide/setup/server/installation/docker) +- [Upgrading + TriliumNext](https://docs.triliumnotes.org/user-guide/setup/upgrading) +- [Basic Concepts and + Features](https://docs.triliumnotes.org/user-guide/concepts/notes) +- [Patterns of Personal Knowledge + Base](https://docs.triliumnotes.org/user-guide/misc/patterns-of-personal-knowledge) + +## 🎁 Features + +* Notes can be arranged into arbitrarily deep tree. Single note can be placed + into multiple places in the tree (see + [cloning](https://docs.triliumnotes.org/user-guide/concepts/notes/cloning)) +* Rich WYSIWYG note editor including e.g. tables, images and + [math](https://docs.triliumnotes.org/user-guide/note-types/text) with markdown + [autoformat](https://docs.triliumnotes.org/user-guide/note-types/text/markdown-formatting) +* Support for editing [notes with source + code](https://docs.triliumnotes.org/user-guide/note-types/code), including + syntax highlighting +* Fast and easy [navigation between + notes](https://docs.triliumnotes.org/user-guide/concepts/navigation/note-navigation), + full text search and [note + hoisting](https://docs.triliumnotes.org/user-guide/concepts/navigation/note-hoisting) +* Seamless [note + versioning](https://docs.triliumnotes.org/user-guide/concepts/notes/note-revisions) +* Note + [attributes](https://docs.triliumnotes.org/user-guide/advanced-usage/attributes) + can be used for note organization, querying and advanced + [scripting](https://docs.triliumnotes.org/user-guide/scripts) +* UI available in English, German, Spanish, French, Romanian, and Chinese + (simplified and traditional) +* Direct [OpenID and TOTP + integration](https://docs.triliumnotes.org/user-guide/setup/server/mfa) for + more secure login +* [Synchronization](https://docs.triliumnotes.org/user-guide/setup/synchronization) + with self-hosted sync server + * there are [3rd party services for hosting synchronisation + server](https://docs.triliumnotes.org/user-guide/setup/server/cloud-hosting) +* [Sharing](https://docs.triliumnotes.org/user-guide/advanced-usage/sharing) + (publishing) notes to public internet +* Strong [note + encryption](https://docs.triliumnotes.org/user-guide/concepts/notes/protected-notes) + with per-note granularity +* Sketching diagrams, based on [Excalidraw](https://excalidraw.com/) (note type + "canvas") +* [Relation + maps](https://docs.triliumnotes.org/user-guide/note-types/relation-map) and + [note/link maps](https://docs.triliumnotes.org/user-guide/note-types/note-map) + for visualizing notes and their relations +* Mind maps, based on [Mind Elixir](https://docs.mind-elixir.com/) +* [Geo maps](https://docs.triliumnotes.org/user-guide/collections/geomap) with + location pins and GPX tracks +* [Scripting](https://docs.triliumnotes.org/user-guide/scripts) - see [Advanced + showcases](https://docs.triliumnotes.org/user-guide/advanced-usage/advanced-showcases) +* [REST API](https://docs.triliumnotes.org/user-guide/advanced-usage/etapi) for + automation +* Scales well in both usability and performance upwards of 100 000 notes +* Touch optimized [mobile + frontend](https://docs.triliumnotes.org/user-guide/setup/mobile-frontend) for + smartphones and tablets +* Built-in [dark + theme](https://docs.triliumnotes.org/user-guide/concepts/themes), support for + user themes +* [Evernote](https://docs.triliumnotes.org/user-guide/concepts/import-export/evernote) + and [Markdown import & + export](https://docs.triliumnotes.org/user-guide/concepts/import-export/markdown) +* [Web Clipper](https://docs.triliumnotes.org/user-guide/setup/web-clipper) for + easy saving of web content +* Customizable UI (sidebar buttons, user-defined widgets, ...) +* [Metrics](https://docs.triliumnotes.org/user-guide/advanced-usage/metrics), + along with a Grafana Dashboard. + +✨ Check out the following third-party resources/communities for more TriliumNext +related goodies: + +- [awesome-trilium](https://github.com/Nriver/awesome-trilium) for 3rd party + themes, scripts, plugins and more. +- [TriliumRocks!](https://trilium.rocks/) for tutorials, guides, and much more. + +## ❓Why TriliumNext? + +The original Trilium developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### ⬆️Migrating from Zadam/Trilium? + +There are no special migration steps to migrate from a zadam/Trilium instance to +a TriliumNext/Trilium instance. Simply [install +TriliumNext/Trilium](#-installation) as usual and it will use your existing +database. + +Versions up to and including +[v0.90.4](https://github.com/TriliumNext/Trilium/releases/tag/v0.90.4) are +compatible with the latest zadam/trilium version of +[v0.63.7](https://github.com/zadam/trilium/releases/tag/v0.63.7). Any later +versions of TriliumNext/Trilium have their sync versions incremented which +prevents direct migration. + +## 💬 Discuss with us + +Feel free to join our official conversations. We would love to hear what +features, suggestions, or issues you may have! + +- [Matrix](https://matrix.to/#/#triliumnext:matrix.org) (For synchronous + discussions.) + - The `General` Matrix room is also bridged to + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For + asynchronous discussions.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug + reports and feature requests.) + +## 🏗 Installation + +### Windows / MacOS + +Download the binary release for your platform from the [latest release +page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package +and run the `trilium` executable. + +### Linux + +If your distribution is listed in the table below, use your distribution's +package. + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](https://repology.org/project/triliumnext/versions) + +You may also download the binary release for your platform from the [latest +release page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the +package and run the `trilium` executable. + +TriliumNext is also provided as a Flatpak, but not yet published on FlatHub. + +### Browser (any OS) + +If you use a server installation (see below), you can directly access the web +interface (which is almost identical to the desktop app). + +Currently only the latest versions of Chrome & Firefox are supported (and +tested). + +### Mobile + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### Server + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://docs.triliumnotes.org/user-guide/setup/server). + + +## 💻 Contribute + +### Translations + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### Code + +Download the repository, install dependencies using `pnpm` and then run the +server (available at http://localhost:8080): +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm run server:start +``` + +### Documentation + +Download the repository, install dependencies using `pnpm` and then run the +environment required to edit the documentation: +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm edit-docs:edit-docs +``` + +### Building the Executable +Download the repository, install dependencies using `pnpm` and then build the +desktop app for Windows: +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Developer Documentation + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/docs/Developer%20Guide/Developer%20Guide/Environment%20Setup.md) +for details. If you have more questions, feel free to reach out via the links +described in the "Discuss with us" section above. + +## 👏 Shoutouts + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + Used in [relation + maps](https://docs.triliumnotes.org/user-guide/note-types/relation-map) and + [link + maps](https://docs.triliumnotes.org/user-guide/advanced-usage/note-map#link-map) + +## 🤝 Support + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## 🔑 License + +Copyright 2017-2025 zadam, Elian Doran, and other contributors + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU Affero General Public License as published by the Free +Software Foundation, either version 3 of the License, or (at your option) any +later version. From 18f3b83827c1b6ff32bd013489e54c9b1b35d5d3 Mon Sep 17 00:00:00 2001 From: Anton Antonov Date: Mon, 22 Dec 2025 20:06:23 +0100 Subject: [PATCH 20/37] Added translation using Weblate (Bulgarian) --- apps/server/src/assets/translations/bg/server.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/server/src/assets/translations/bg/server.json diff --git a/apps/server/src/assets/translations/bg/server.json b/apps/server/src/assets/translations/bg/server.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/server/src/assets/translations/bg/server.json @@ -0,0 +1 @@ +{} From 198dd15fb403c2cddec3fcfe24b7d7cf149929ba Mon Sep 17 00:00:00 2001 From: Anton Antonov Date: Mon, 22 Dec 2025 20:06:24 +0100 Subject: [PATCH 21/37] Added translation using Weblate (Bulgarian) --- apps/website/src/translations/bg/translation.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/website/src/translations/bg/translation.json diff --git a/apps/website/src/translations/bg/translation.json b/apps/website/src/translations/bg/translation.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/website/src/translations/bg/translation.json @@ -0,0 +1 @@ +{} From 6e044b19c826daa5d6c1ab9803cb2ffaae037f89 Mon Sep 17 00:00:00 2001 From: Anton Antonov Date: Mon, 22 Dec 2025 20:25:05 +0100 Subject: [PATCH 22/37] Translated using Weblate (Bulgarian) Currently translated at 12.5% (19 of 152 strings) Translation: Trilium Notes/Website Translate-URL: https://hosted.weblate.org/projects/trilium/website/bg/ --- .../src/translations/bg/translation.json | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/apps/website/src/translations/bg/translation.json b/apps/website/src/translations/bg/translation.json index 0967ef424..a77d15624 100644 --- a/apps/website/src/translations/bg/translation.json +++ b/apps/website/src/translations/bg/translation.json @@ -1 +1,30 @@ -{} +{ + "get-started": { + "title": "Започнете тук", + "desktop_title": "Свалете десктоп апликацията (v{{version}})", + "architecture": "Архитектура:", + "older_releases": "Вижте по-стари версии", + "server_title": "Конфигурирайте сървър за достъп от различни устройства" + }, + "hero_section": { + "title": "Организирайте Вашите идеи. Създайте Вашата лична база от знания.", + "subtitle": "Trilium е решение с отворен код за създаване на бележки и организация на лична база от знания. Изполвайте приложението на Вашия десктоп, или го синхоранизирайте чрез сървар хостнат от Вас за да имате дотъп до бележките си навсякъде.", + "get_started": "Започнете тук", + "github": "GitHub", + "dockerhub": "", + "screenshot_alt": "Скриншот от Trilium Notes десктоп програмата" + }, + "organization_benefits": { + "title": "Организация", + "note_structure_title": "Структура на бележката", + "note_structure_description": "Бележките може да бъдат подредени йерархично. Няма нужа от папки, понеже всяка бележка може да съдържа под-бележка. Една бележка може да бъде добавена на няколко места в йерархията.", + "attributes_title": "Етикети и връзки на бележката", + "attributes_description": "Използвайте връзки между бележките или добавете етикети за по-лесна кетегоризация. Изплозвайте избрани атрибуте за да въведете стуктурирана информация, която може да бъде използвана в таблици, табла.", + "hoisting_title": "Работни плотове", + "hoisting_description": "Лесно разделяйте лични от работни бележки като ги групирате в работен плот, който ще накара дървото от бележки да показва само специфичен сет от бележки." + }, + "productivity_benefits": { + "title": "Продуктивност и безопасност", + "revisions_title": "Ревизии на бележката" + } +} From b0a97208a227f388680f1ecb76f8a9e095eb9ada Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Mon, 22 Dec 2025 20:25:49 +0100 Subject: [PATCH 23/37] Update translation files Updated by "Remove blank strings" add-on in Weblate. Translation: Trilium Notes/Website Translate-URL: https://hosted.weblate.org/projects/trilium/website/ --- apps/website/src/translations/bg/translation.json | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/website/src/translations/bg/translation.json b/apps/website/src/translations/bg/translation.json index a77d15624..054308f1e 100644 --- a/apps/website/src/translations/bg/translation.json +++ b/apps/website/src/translations/bg/translation.json @@ -11,7 +11,6 @@ "subtitle": "Trilium е решение с отворен код за създаване на бележки и организация на лична база от знания. Изполвайте приложението на Вашия десктоп, или го синхоранизирайте чрез сървар хостнат от Вас за да имате дотъп до бележките си навсякъде.", "get_started": "Започнете тук", "github": "GitHub", - "dockerhub": "", "screenshot_alt": "Скриншот от Trilium Notes десктоп програмата" }, "organization_benefits": { From 99ac6b4df12291f8edb039b81b0ae36718d302a6 Mon Sep 17 00:00:00 2001 From: Anton Antonov Date: Mon, 22 Dec 2025 20:31:50 +0100 Subject: [PATCH 24/37] Translated using Weblate (Bulgarian) Currently translated at 16.4% (25 of 152 strings) Translation: Trilium Notes/Website Translate-URL: https://hosted.weblate.org/projects/trilium/website/bg/ --- apps/website/src/translations/bg/translation.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/website/src/translations/bg/translation.json b/apps/website/src/translations/bg/translation.json index 054308f1e..e61d41820 100644 --- a/apps/website/src/translations/bg/translation.json +++ b/apps/website/src/translations/bg/translation.json @@ -24,6 +24,12 @@ }, "productivity_benefits": { "title": "Продуктивност и безопасност", - "revisions_title": "Ревизии на бележката" + "revisions_title": "Ревизии на бележката", + "revisions_content": "Бележките периодично се запазват и ревизиите може да се ползват за ревю или за да се отмени нежелана промяна. Ревизиите също могат да бъдат създавани ръчно.", + "sync_title": "Синхронизация", + "sync_content": "Използвайте лично хостната или качена в клауда инстанция за да синхронизирате Вашите бележки на няколко устройства, и за да ги достъпите от мобилно устройство използвайки ПУА(Прогресивен Уеб Апп).", + "protected_notes_title": "Защитени бележки", + "protected_notes_content": "Защитете чуствителна лична информация като криптирате съобщенията и ги заключите с парола.", + "jump_to_title": "Бързо търсене и команди" } } From bdc0b062d50987ce80e0dcbfdfd7a5df01280fdf Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Mon, 22 Dec 2025 23:27:45 +0200 Subject: [PATCH 25/37] client/status bar panes: improve --- .../src/translations/en/translation.json | 6 +- apps/client/src/widgets/layout/StatusBar.css | 46 +++- apps/client/src/widgets/layout/StatusBar.tsx | 9 +- .../widgets/ribbon/InheritedAttributesTab.tsx | 8 +- .../ribbon/components/AttributeEditor.tsx | 198 +++++++++--------- 5 files changed, 151 insertions(+), 116 deletions(-) diff --git a/apps/client/src/translations/en/translation.json b/apps/client/src/translations/en/translation.json index b45f26cb5..946971bf8 100644 --- a/apps/client/src/translations/en/translation.json +++ b/apps/client/src/translations/en/translation.json @@ -818,7 +818,8 @@ }, "inherited_attribute_list": { "title": "Inherited Attributes", - "no_inherited_attributes": "No inherited attributes." + "no_inherited_attributes": "No inherited attributes.", + "none": "none" }, "note_info_widget": { "note_id": "Note ID", @@ -2203,6 +2204,9 @@ "note_paths_title": "Note paths", "code_note_switcher": "Change language mode" }, + "attributes_panel": { + "title": "Note Attributes" + }, "right_pane": { "empty_message": "Nothing to show for this note", "empty_button": "Hide the panel", diff --git a/apps/client/src/widgets/layout/StatusBar.css b/apps/client/src/widgets/layout/StatusBar.css index 8a21c233d..0663d6083 100644 --- a/apps/client/src/widgets/layout/StatusBar.css +++ b/apps/client/src/widgets/layout/StatusBar.css @@ -244,20 +244,44 @@ > .attribute-list { font-size: 0.9em; - .inherited-attributes-widget > div { - padding: 0; - font-size: 0.9em; + .attributes-panel-label { + opacity: .5; + margin-inline-end: 4px; + font-weight: 600; } - .attribute-list-editor { - padding-block: 0 !important; - padding-inline: 0 100px !important ; - } + .inherited-attributes-widget { + display: inline; + + > div { + display: inline; + padding: 0; + } + } + + .attribute-list-editor-wrapper { + display: flex; + flex-direction: column-reverse; + padding-bottom: 0 !important; + + .attribute-list-editor { + padding-block: 0 !important; + padding-inline: 0 100px !important ; + } + + .attribute-errors { + padding: 4px 0; + color: var(--dropdown-item-icon-destructive-color); + font-style: italic; + } + + .ck.ck-editor__editable::after { + /* Remove a hidden spinner that causes overflow */ + display: none; + } + } + - .ck.ck-editor__editable::after { - /* Remove a hidden spinner that causes overflow */ - display: none; - } } div.similar-notes-widget div.similar-notes-wrapper { diff --git a/apps/client/src/widgets/layout/StatusBar.tsx b/apps/client/src/widgets/layout/StatusBar.tsx index 691b8c576..932d51b53 100644 --- a/apps/client/src/widgets/layout/StatusBar.tsx +++ b/apps/client/src/widgets/layout/StatusBar.tsx @@ -268,7 +268,7 @@ function NoteInfoValue({ text, title, value }: { text: string; title?: string, v function SimilarNotesPane({ note, similarNotesShown, setSimilarNotesShown }: NoteInfoContext) { return (similarNotesShown && - - - + + {t("inherited_attribute_list.title")} + ) { +type InheritedAttributesTabArgs = Pick & { + emptyListString?: string; +} + +export default function InheritedAttributesTab({ note, componentId, emptyListString }: InheritedAttributesTabArgs) { const [ inheritedAttributes, setInheritedAttributes ] = useState(); const [ attributeDetailWidgetEl, attributeDetailWidget ] = useLegacyWidget(() => new AttributeDetailWidget()); @@ -63,7 +67,7 @@ export default function InheritedAttributesTab({ note, componentId }: Pick )), " ") ) : ( - <>{t("inherited_attribute_list.no_inherited_attributes")} + <>{t(emptyListString ?? "inherited_attribute_list.no_inherited_attributes")} )}
diff --git a/apps/client/src/widgets/ribbon/components/AttributeEditor.tsx b/apps/client/src/widgets/ribbon/components/AttributeEditor.tsx index ee9129bbd..3871e0790 100644 --- a/apps/client/src/widgets/ribbon/components/AttributeEditor.tsx +++ b/apps/client/src/widgets/ribbon/components/AttributeEditor.tsx @@ -283,6 +283,7 @@ export default function AttributeEditor({ api, note, componentId, notePath, ntxI return ( <> {!hidden &&
{ @@ -296,106 +297,107 @@ export default function AttributeEditor({ api, note, componentId, notePath, ntxI setTimeout(() => save(), 100); } }} - > - { - currentValueRef.current = currentValue ?? ""; - - const oldValue = getPreprocessedData(lastSavedContent.current ?? "").trimEnd(); - const newValue = getPreprocessedData(currentValue ?? "").trimEnd(); - setNeedsSaving(oldValue !== newValue); - setError(undefined); - }} - onClick={(e, pos) => { - if (pos && pos.textNode && pos.textNode.data) { - const clickIndex = getClickIndex(pos); - - let parsedAttrs: Attribute[]; - - try { - parsedAttrs = attribute_parser.lexAndParse(getPreprocessedData(currentValueRef.current), true); - } catch (e: unknown) { - // the input is incorrect because the user messed up with it and now needs to fix it manually - console.log(e); - return null; - } - - let matchedAttr: Attribute | null = null; - - for (const attr of parsedAttrs) { - if (attr.startIndex && clickIndex > attr.startIndex && attr.endIndex && clickIndex <= attr.endIndex) { - matchedAttr = attr; - break; - } - } - - setTimeout(() => { - if (matchedAttr) { - attributeDetailWidget.showAttributeDetail({ - allAttributes: parsedAttrs, - attribute: matchedAttr, - isOwned: true, - x: e.pageX, - y: e.pageY - }); - setState("showAttributeDetail"); - } else { - setState("showHelpTooltip"); - } - }, 100); - } else { - setState("showHelpTooltip"); - } - }} - onKeyDown={() => attributeDetailWidget.hide()} - onBlur={() => save()} - onInitialized={() => editorRef.current?.focus()} - disableNewlines disableSpellcheck - /> - -
- { needsSaving && } - - { - // Prevent automatic hiding of the context menu due to the button being clicked. - e.stopPropagation(); - - contextMenu.show({ - x: e.pageX, - y: e.pageY, - orientation: "left", - items: [ - { title: t("attribute_editor.add_new_label"), command: "addNewLabel", uiIcon: "bx bx-hash" }, - { title: t("attribute_editor.add_new_relation"), command: "addNewRelation", uiIcon: "bx bx-transfer" }, - { kind: "separator" }, - { title: t("attribute_editor.add_new_label_definition"), command: "addNewLabelDefinition", uiIcon: "bx bx-empty" }, - { title: t("attribute_editor.add_new_relation_definition"), command: "addNewRelationDefinition", uiIcon: "bx bx-empty" } - ], - selectMenuItemHandler: (item) => handleAddNewAttributeCommand(item.command) - }); + >
+ { + currentValueRef.current = currentValue ?? ""; + + const oldValue = getPreprocessedData(lastSavedContent.current ?? "").trimEnd(); + const newValue = getPreprocessedData(currentValue ?? "").trimEnd(); + setNeedsSaving(oldValue !== newValue); + setError(undefined); + }} + onClick={(e, pos) => { + if (pos && pos.textNode && pos.textNode.data) { + const clickIndex = getClickIndex(pos); + + let parsedAttrs: Attribute[]; + + try { + parsedAttrs = attribute_parser.lexAndParse(getPreprocessedData(currentValueRef.current), true); + } catch (e: unknown) { + // the input is incorrect because the user messed up with it and now needs to fix it manually + console.log(e); + return null; + } + + let matchedAttr: Attribute | null = null; + + for (const attr of parsedAttrs) { + if (attr.startIndex && clickIndex > attr.startIndex && attr.endIndex && clickIndex <= attr.endIndex) { + matchedAttr = attr; + break; + } + } + + setTimeout(() => { + if (matchedAttr) { + attributeDetailWidget.showAttributeDetail({ + allAttributes: parsedAttrs, + attribute: matchedAttr, + isOwned: true, + x: e.pageX, + y: e.pageY + }); + setState("showAttributeDetail"); + } else { + setState("showHelpTooltip"); + } + }, 100); + } else { + setState("showHelpTooltip"); + } + }} + onKeyDown={() => attributeDetailWidget.hide()} + onBlur={() => save()} + onInitialized={() => editorRef.current?.focus()} + disableNewlines disableSpellcheck /> + +
+ { needsSaving && } + + { + // Prevent automatic hiding of the context menu due to the button being clicked. + e.stopPropagation(); + + contextMenu.show({ + x: e.pageX, + y: e.pageY, + orientation: "left", + items: [ + { title: t("attribute_editor.add_new_label"), command: "addNewLabel", uiIcon: "bx bx-hash" }, + { title: t("attribute_editor.add_new_relation"), command: "addNewRelation", uiIcon: "bx bx-transfer" }, + { kind: "separator" }, + { title: t("attribute_editor.add_new_label_definition"), command: "addNewLabelDefinition", uiIcon: "bx bx-empty" }, + { title: t("attribute_editor.add_new_relation_definition"), command: "addNewRelationDefinition", uiIcon: "bx bx-empty" } + ], + selectMenuItemHandler: (item) => handleAddNewAttributeCommand(item.command) + }); + }} + /> +
{ error && ( From 0c965bfdf42f5b0bab5dca9a69d3e76c77fe2afe Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Mon, 22 Dec 2025 23:36:35 +0200 Subject: [PATCH 26/37] client/status bar panes: extract colors as CSS variables --- apps/client/src/stylesheets/theme-next-dark.css | 3 +++ apps/client/src/stylesheets/theme-next-light.css | 3 +++ apps/client/src/widgets/layout/StatusBar.css | 4 ++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/client/src/stylesheets/theme-next-dark.css b/apps/client/src/stylesheets/theme-next-dark.css index 150a3ffc6..2061acb48 100644 --- a/apps/client/src/stylesheets/theme-next-dark.css +++ b/apps/client/src/stylesheets/theme-next-dark.css @@ -234,6 +234,9 @@ --right-pane-item-hover-background: #ffffff26; --right-pane-item-hover-color: white; + --bottom-panel-background-color: #181818; + --bottom-panel-title-bar-background-color: #272727; + --scrollbar-thumb-color: #fdfdfd5c; --scrollbar-thumb-hover-color: #ffffff7d; --scrollbar-background-color: transparent; diff --git a/apps/client/src/stylesheets/theme-next-light.css b/apps/client/src/stylesheets/theme-next-light.css index c5828ab17..db93b95b9 100644 --- a/apps/client/src/stylesheets/theme-next-light.css +++ b/apps/client/src/stylesheets/theme-next-light.css @@ -232,6 +232,9 @@ --right-pane-item-hover-background: #00000013; --right-pane-item-hover-color: inherit; + --bottom-panel-background-color: #181818; + --bottom-panel-title-bar-background-color: #272727; + --scrollbar-thumb-color: #0000005c; --scrollbar-thumb-hover-color: #00000066; --scrollbar-background-color: transparent; diff --git a/apps/client/src/widgets/layout/StatusBar.css b/apps/client/src/widgets/layout/StatusBar.css index 0663d6083..4502cd412 100644 --- a/apps/client/src/widgets/layout/StatusBar.css +++ b/apps/client/src/widgets/layout/StatusBar.css @@ -301,7 +301,7 @@ .status-bar-pane-title-bar { display: flex; padding: 6px 12px; - background: #272727; + background: var(--bottom-panel-title-bar-background-color); justify-content: space-between; align-items: center; @@ -315,7 +315,7 @@ .status-bar-pane-content { border-bottom: 1px solid var(--main-border-color); - background: #181818; + background: var(--bottom-panel-background-color); padding: 8px 12px; max-height: 40vh; overflow-y: auto; From 608f156b82d16f99788fff07f19c95d3d00478b7 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Mon, 22 Dec 2025 23:40:11 +0200 Subject: [PATCH 27/37] client: rename "status bar pane" to "bottom panel" --- apps/client/src/widgets/layout/StatusBar.css | 8 +++---- apps/client/src/widgets/layout/StatusBar.tsx | 22 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/apps/client/src/widgets/layout/StatusBar.css b/apps/client/src/widgets/layout/StatusBar.css index 4502cd412..f7c468dac 100644 --- a/apps/client/src/widgets/layout/StatusBar.css +++ b/apps/client/src/widgets/layout/StatusBar.css @@ -294,18 +294,18 @@ } -.status-bar-pane { +.bottom-panel { margin: 0 !important; padding: 0; - .status-bar-pane-title-bar { + .bottom-panel-title-bar { display: flex; padding: 6px 12px; background: var(--bottom-panel-title-bar-background-color); justify-content: space-between; align-items: center; - .status-bar-pane-title-bar-caption { + .bottom-panel-title-bar-caption { text-transform: uppercase; letter-spacing: .3pt; font-weight: 600; @@ -313,7 +313,7 @@ } } - .status-bar-pane-content { + .bottom-panel-content { border-bottom: 1px solid var(--main-border-color); background: var(--bottom-panel-background-color); padding: 8px 12px; diff --git a/apps/client/src/widgets/layout/StatusBar.tsx b/apps/client/src/widgets/layout/StatusBar.tsx index 932d51b53..73938b502 100644 --- a/apps/client/src/widgets/layout/StatusBar.tsx +++ b/apps/client/src/widgets/layout/StatusBar.tsx @@ -268,13 +268,13 @@ function NoteInfoValue({ text, title, value }: { text: string; title?: string, v function SimilarNotesPane({ note, similarNotesShown, setSimilarNotesShown }: NoteInfoContext) { return (similarNotesShown && - - + ); } //#endregion @@ -371,7 +371,7 @@ function AttributesPane({ note, noteContext, attributesShown, setAttributesShown }), [ api ])); return (context && - @@ -384,7 +384,7 @@ function AttributesPane({ note, noteContext, attributesShown, setAttributesShown api={api} ntxId={noteContext.ntxId} /> - + ); } //#endregion @@ -449,9 +449,9 @@ function CodeNoteSwitcher({ note }: StatusBarContext) { } //#endregion -//#region Status bar pane +//#region Bottom panel -interface StatusBarPaneParms { +interface BottomPanelParams { children: ComponentChildren; title: string; visible: boolean; @@ -459,13 +459,13 @@ interface StatusBarPaneParms { className?: string; } -function StatusBarPane({ children, title, visible, setVisible, className }: StatusBarPaneParms) { - return
-
- {title} +function BottomPanel({ children, title, visible, setVisible, className }: BottomPanelParams) { + return
+
+ {title}
-
+
{children}
From d4fa21e7c161fc57ae4782e80103324d7b379429 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Mon, 22 Dec 2025 23:57:40 +0200 Subject: [PATCH 28/37] style/bottom panel: tweak colors --- apps/client/src/stylesheets/theme-next-dark.css | 4 ++-- apps/client/src/stylesheets/theme-next-light.css | 4 ++-- apps/client/src/widgets/layout/StatusBar.css | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/client/src/stylesheets/theme-next-dark.css b/apps/client/src/stylesheets/theme-next-dark.css index 2061acb48..a975680b6 100644 --- a/apps/client/src/stylesheets/theme-next-dark.css +++ b/apps/client/src/stylesheets/theme-next-dark.css @@ -234,8 +234,8 @@ --right-pane-item-hover-background: #ffffff26; --right-pane-item-hover-color: white; - --bottom-panel-background-color: #181818; - --bottom-panel-title-bar-background-color: #272727; + --bottom-panel-background-color: #111111; + --bottom-panel-title-bar-background-color: #2F2F2F; --scrollbar-thumb-color: #fdfdfd5c; --scrollbar-thumb-hover-color: #ffffff7d; diff --git a/apps/client/src/stylesheets/theme-next-light.css b/apps/client/src/stylesheets/theme-next-light.css index db93b95b9..6ae0119cf 100644 --- a/apps/client/src/stylesheets/theme-next-light.css +++ b/apps/client/src/stylesheets/theme-next-light.css @@ -232,8 +232,8 @@ --right-pane-item-hover-background: #00000013; --right-pane-item-hover-color: inherit; - --bottom-panel-background-color: #181818; - --bottom-panel-title-bar-background-color: #272727; + --bottom-panel-background-color: #0000000a; + --bottom-panel-title-bar-background-color: #00000017; --scrollbar-thumb-color: #0000005c; --scrollbar-thumb-hover-color: #00000066; diff --git a/apps/client/src/widgets/layout/StatusBar.css b/apps/client/src/widgets/layout/StatusBar.css index f7c468dac..c5129223b 100644 --- a/apps/client/src/widgets/layout/StatusBar.css +++ b/apps/client/src/widgets/layout/StatusBar.css @@ -1,15 +1,15 @@ .component.status-bar { contain: none; border-top: 1px solid var(--main-border-color); - background-color: var(--left-pane-background-color); > .status-bar-main-row { min-height: 28px; display: flex; align-items: center; + background-color: var(--left-pane-background-color); padding-inline: 0.25em; font-size: 0.85em; - + > .breadcrumb { flex-grow: 1; --icon-button-size: 23px; From 7507d6b385b9e3661a9973a5bd8353d2f36b5288 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 23 Dec 2025 02:52:03 +0200 Subject: [PATCH 29/37] style/bottom panel: tweak colors --- apps/client/src/stylesheets/theme-next-dark.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/client/src/stylesheets/theme-next-dark.css b/apps/client/src/stylesheets/theme-next-dark.css index a975680b6..59e2cb9a1 100644 --- a/apps/client/src/stylesheets/theme-next-dark.css +++ b/apps/client/src/stylesheets/theme-next-dark.css @@ -234,8 +234,8 @@ --right-pane-item-hover-background: #ffffff26; --right-pane-item-hover-color: white; - --bottom-panel-background-color: #111111; - --bottom-panel-title-bar-background-color: #2F2F2F; + --bottom-panel-background-color: #11111180; + --bottom-panel-title-bar-background-color: #3F3F3F80; --scrollbar-thumb-color: #fdfdfd5c; --scrollbar-thumb-hover-color: #ffffff7d; From 2d6f17aeaabc03385d6ae2c11ac4f12fa798acc0 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 23 Dec 2025 03:07:30 +0200 Subject: [PATCH 30/37] style/breadcrumb: tweak dropdown lists --- apps/client/src/widgets/layout/Breadcrumb.css | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/apps/client/src/widgets/layout/Breadcrumb.css b/apps/client/src/widgets/layout/Breadcrumb.css index 947f8266e..54e9c5da0 100644 --- a/apps/client/src/widgets/layout/Breadcrumb.css +++ b/apps/client/src/widgets/layout/Breadcrumb.css @@ -72,6 +72,15 @@ color: var(--custom-color, inherit) !important; } + .dropdown .breadcrumb-child-list { + /* Icon */ + li > span:first-child { + opacity: .75; + padding-inline-end: 4px; + translate: none; + }; + } + a.breadcrumb-last-item, a.breadcrumb-last-item:visited { text-decoration: none; From 519323292c7dfe74dc1d2edda17c996d340c94c1 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 23 Dec 2025 03:48:09 +0200 Subject: [PATCH 31/37] style/breadcrumb: tweak --- apps/client/src/widgets/layout/Breadcrumb.css | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/apps/client/src/widgets/layout/Breadcrumb.css b/apps/client/src/widgets/layout/Breadcrumb.css index 54e9c5da0..2bdb6d3a4 100644 --- a/apps/client/src/widgets/layout/Breadcrumb.css +++ b/apps/client/src/widgets/layout/Breadcrumb.css @@ -46,6 +46,19 @@ overflow: hidden; display: block; flex-shrink: 2; + font-weight: normal; + } + } + + .icon-action { + font-size: .9rem !important; + + .bxs-chevron-right { + transform: translateY(8%); + + &::before { + opacity: .75; + } } } From 3f1b0fa71eea7b76723811ddc0b8d068773c989d Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 23 Dec 2025 04:02:53 +0200 Subject: [PATCH 32/37] style/breadcrumb: tweak --- apps/client/src/widgets/layout/Breadcrumb.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/client/src/widgets/layout/Breadcrumb.css b/apps/client/src/widgets/layout/Breadcrumb.css index 2bdb6d3a4..572392757 100644 --- a/apps/client/src/widgets/layout/Breadcrumb.css +++ b/apps/client/src/widgets/layout/Breadcrumb.css @@ -16,6 +16,8 @@ } a.tn-link { + --link-hover-background: var(--icon-button-hover-background); + color: var(--custom-color, inherit); &:hover { From 7af8acec0f484ea3959c780500ab4cab69473a0a Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 23 Dec 2025 04:20:17 +0200 Subject: [PATCH 33/37] style/zen mode: fix the title widget layout, make the icon and title editable --- apps/client/src/stylesheets/style.css | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/client/src/stylesheets/style.css b/apps/client/src/stylesheets/style.css index 5ea6776ff..e54bd26e2 100644 --- a/apps/client/src/stylesheets/style.css +++ b/apps/client/src/stylesheets/style.css @@ -2012,8 +2012,9 @@ body.zen .shared-info-widget, body.zen .ribbon-container:not(:has(.classic-toolbar-widget)), body.zen .ribbon-container:has(.classic-toolbar-widget) .ribbon-top-row, body.zen .ribbon-container .ribbon-body:not(:has(.classic-toolbar-widget)), -body.zen .note-icon-widget, body.zen .title-row .icon-action, +body.zen .note-badges, +body.zen .inline-title, body.zen .promoted-attributes-widget, body.zen .floating-buttons-children > *:not(.bx-edit-alt), body.zen .action-button, @@ -2036,11 +2037,11 @@ body.zen #launcher-pane { } body.zen .title-row { - display: block !important; height: unset !important; -webkit-app-region: drag; padding-inline-start: env(titlebar-area-x); padding-inline-end: calc(100vw - env(titlebar-area-width, 100vw) + 2.5em); + border-bottom: none !important; } body.zen .floating-buttons { @@ -2060,8 +2061,6 @@ body.zen .floating-buttons-children .button-widget { body.zen .note-title-widget, body.zen .note-title-widget input { font-size: 1rem !important; - background: transparent !important; - pointer-events: none; } body.zen #detail-container { From db1f632859989850c10837e39e4da89ebd74d5d3 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 23 Dec 2025 04:24:39 +0200 Subject: [PATCH 34/37] style/zen mode: make the read-only note badge visible --- apps/client/src/stylesheets/style.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/client/src/stylesheets/style.css b/apps/client/src/stylesheets/style.css index e54bd26e2..5a7d4d923 100644 --- a/apps/client/src/stylesheets/style.css +++ b/apps/client/src/stylesheets/style.css @@ -2013,7 +2013,8 @@ body.zen .ribbon-container:not(:has(.classic-toolbar-widget)), body.zen .ribbon-container:has(.classic-toolbar-widget) .ribbon-top-row, body.zen .ribbon-container .ribbon-body:not(:has(.classic-toolbar-widget)), body.zen .title-row .icon-action, -body.zen .note-badges, +body.zen .note-badges > *:not(.read-only-badge), +body.zen .ribbon-button-container, body.zen .inline-title, body.zen .promoted-attributes-widget, body.zen .floating-buttons-children > *:not(.bx-edit-alt), From b6ca6476de15da9334d259b5fb217698ab99d03e Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 23 Dec 2025 05:00:23 +0200 Subject: [PATCH 35/37] demo notes: change the icon and color for the "Trilium Demo" branch --- apps/server/src/assets/db/demo.zip | Bin 916280 -> 916336 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/server/src/assets/db/demo.zip b/apps/server/src/assets/db/demo.zip index c4cbc6058fef77cc0e75f15d9246f36cdfeefebf..d01018a1e8d9cb1808266ced2edc13421b1900e4 100644 GIT binary patch delta 30694 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

|-Lwk&h7mz0UC8QIKZcW2bioC?qpvFVZ4BRN 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 IrvNzr2X+0;GXMYp delta 31164 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 From a4be86dbd85b7240342dd87d4661e41993edb70c Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 23 Dec 2025 05:26:54 +0200 Subject: [PATCH 36/37] style/text: prevent reference links inherit color from the current note --- apps/client/src/stylesheets/theme-next/notes/text.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/stylesheets/theme-next/notes/text.css b/apps/client/src/stylesheets/theme-next/notes/text.css index 2fe4a00c2..d31acc280 100644 --- a/apps/client/src/stylesheets/theme-next/notes/text.css +++ b/apps/client/src/stylesheets/theme-next/notes/text.css @@ -692,7 +692,7 @@ html .note-detail-editable-text :not(figure, .include-note, hr):first-child { text-decoration: none; } -.ck-content a.reference-link > span { +.ck-content a.reference-link.use-note-color > span { color: var(--custom-color, inherit); } From b4e4950d20712f4cfafbaa2c9786a486fc01e1d9 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Tue, 23 Dec 2025 12:59:22 +0200 Subject: [PATCH 37/37] chore(client): fix typecheck --- apps/client/src/widgets/layout/StatusBar.tsx | 22 ++++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/apps/client/src/widgets/layout/StatusBar.tsx b/apps/client/src/widgets/layout/StatusBar.tsx index 73938b502..250aeaad1 100644 --- a/apps/client/src/widgets/layout/StatusBar.tsx +++ b/apps/client/src/widgets/layout/StatusBar.tsx @@ -269,10 +269,10 @@ function NoteInfoValue({ text, title, value }: { text: string; title?: string, v function SimilarNotesPane({ note, similarNotesShown, setSimilarNotesShown }: NoteInfoContext) { return (similarNotesShown && + className="similar-notes-pane" + visible={similarNotesShown} + setVisible={setSimilarNotesShown} + > ); @@ -372,10 +372,10 @@ function AttributesPane({ note, noteContext, attributesShown, setAttributesShown return (context && - + className="attribute-list" + visible={attributesShown} + setVisible={setAttributesShown}> + {t("inherited_attribute_list.title")} @@ -463,11 +463,11 @@ function BottomPanel({ children, title, visible, setVisible, className }: Bottom return

{title} - +
{children}
-
+
; } -//#endregion \ No newline at end of file +//#endregion