Compare commits

...

2424 Commits

Author SHA1 Message Date
Adorian Doran be33fd7a0f Merge branch 'main' of https://github.com/TriliumNext/Trilium
Checks / main (push) Successful in 4s
CodeQL Advanced / Analyze (actions) (push) Failing after 21m41s
CodeQL Advanced / Analyze (javascript-typescript) (push) Failing after 55s
Dev / Test development (push) Failing after 54s
Dev / Build Docker image (push) Has been skipped
Dev / Check Docker build (Dockerfile) (push) Has been skipped
Dev / Check Docker build (Dockerfile.alpine) (push) Has been skipped
2026-05-02 12:24:23 +03:00
Adorian Doran 73f0924b78 client/keyboard actions: update the cheatsheet 2026-05-02 12:24:13 +03:00
Adorian Doran 278eeffdb4 Add a keyboard shortcut (Ctrl+H/Cmd+Shift+H) to show/hide archived notes in the tree (#9631) 2026-05-02 11:44:14 +03:00
Adorian Doran 1acca255ad client/keyboard actions: add a Mac-only binding 2026-05-02 11:42:27 +03:00
Adorian Doran ea0ab71a88 client/keyboard actions: fix a typo and a missing await 2026-05-02 11:28:08 +03:00
Adorian Doran 4ad5243806 client/keyboard actions: add a command to toggle archived notes visibility 2026-05-02 11:19:35 +03:00
Elian Doran 41c7b0e22f Update .gitignore (#9618) 2026-04-30 17:41:05 +03:00
misch334 20f718951b Update .gitignore 2026-04-30 10:49:17 +00:00
Elian Doran 3db4375424 fix(deps): update dependency i18next to v26.0.8 (#9600) 2026-04-30 07:01:26 +03:00
Elian Doran 9b0bf05cc2 Translations update from Hosted Weblate (#9613) 2026-04-30 06:59:56 +03:00
Ulices 82e4446040 Translated using Weblate (Spanish)
Currently translated at 100.0% (2008 of 2008 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/es/
2026-04-29 18:10:01 +02:00
Giovi 26eedbbdae Translated using Weblate (Italian)
Currently translated at 99.9% (2007 of 2008 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/it/
2026-04-29 18:09:59 +02:00
Aindriú Mac Giolla Eoin a866696e5c Translated using Weblate (Irish)
Currently translated at 99.9% (2007 of 2008 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ga/
2026-04-29 18:09:54 +02:00
renovate[bot] efc6a0a95e fix(deps): update dependency i18next to v26.0.8 2026-04-29 15:37:13 +00:00
Elian Doran 8f4f94f953 docs(user): fix typo regarding anchors 2026-04-28 19:14:15 +03:00
Elian Doran 852d5facbe Revert "chore(server): allow cross-site cookie for standalone sync purposes"
This reverts commit 33ecb735d3.
2026-04-28 18:10:30 +03:00
Elian Doran b515fe6a98 Revert "chore(server): set Access-Control-Allow-Credentials"
This reverts commit 415468bcf8.
2026-04-28 18:10:16 +03:00
Elian Doran 9527be49c3 docs(user): improve documentation on password reset 2026-04-28 17:56:30 +03:00
Elian Doran 0304108818 docs(user): document the content width 2026-04-28 17:38:56 +03:00
Elian Doran 49e89e8dfa chore(deps): update dependency i18next-fs-backend to v2.6.5 (#9528) 2026-04-28 08:24:15 +03:00
Elian Doran 9d3174199d chore(deps): update dependency express-rate-limit to v8.4.1 (#9599) 2026-04-28 08:23:35 +03:00
Elian Doran d898c9eec7 chore(deps): update dependency @redocly/cli to v2.30.0 (#9601) 2026-04-28 08:22:57 +03:00
renovate[bot] 67e1bc0ff7 chore(deps): update dependency @redocly/cli to v2.30.0 2026-04-28 00:55:10 +00:00
renovate[bot] 0ce83d8403 chore(deps): update dependency express-rate-limit to v8.4.1 2026-04-28 00:53:27 +00:00
Adorian Doran 361a6618b7 contributor list: update display name 2026-04-27 20:52:18 +03:00
Elian Doran 632124cf2a Translations update from Hosted Weblate (#9595) 2026-04-27 13:40:54 +03:00
green 2a7c6781d0 Translated using Weblate (Japanese)
Currently translated at 99.9% (2007 of 2008 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2026-04-27 08:10:09 +00:00
Artyom Rybakov a21913521a Translated using Weblate (Russian)
Currently translated at 100.0% (406 of 406 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ru/
2026-04-27 08:09:58 +00:00
Artyom Rybakov 78b09d1b67 Translated using Weblate (Russian)
Currently translated at 85.8% (1723 of 2008 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ru/
2026-04-27 08:09:52 +00:00
renovate[bot] 5c2df90f5b chore(deps): update dependency i18next-fs-backend to v2.6.5 2026-04-27 05:04:14 +00:00
Elian Doran 2e0c8b10f5 fix(deps): update dependency @zumer/snapdom to v2.9.0 (#9592) 2026-04-27 08:01:57 +03:00
Elian Doran c949ab6362 fix(deps): update dependency i18next to v26.0.7 (#9588) 2026-04-27 08:01:43 +03:00
renovate[bot] 4f8ee2f1df fix(deps): update dependency i18next to v26.0.7 2026-04-27 04:37:52 +00:00
Elian Doran abd212e9c9 chore(deps): update dependency vite to v8.0.10 (#9586) 2026-04-27 07:36:02 +03:00
Elian Doran 0c8b2523df fix(deps): update dependency i18next-http-backend to v3.0.6 (#9589) 2026-04-27 07:34:53 +03:00
Elian Doran 0793e5b730 chore(deps): update dependency express-rate-limit to v8.4.0 (#9590) 2026-04-27 07:34:17 +03:00
Elian Doran 4924a64f0c chore(deps): update dependency @redocly/cli to v2.29.2 (#9585) 2026-04-27 07:33:34 +03:00
Elian Doran 5065044c07 chore(deps): update dependency stylelint to v17.9.0 (#9591) 2026-04-27 07:33:11 +03:00
Elian Doran 59d80b0641 chore(deps): update pnpm to v10.33.2 (#9587) 2026-04-27 07:32:35 +03:00
renovate[bot] 9ebc3eb959 fix(deps): update dependency @zumer/snapdom to v2.9.0 2026-04-27 02:21:04 +00:00
renovate[bot] d7ff8908b2 chore(deps): update dependency stylelint to v17.9.0 2026-04-27 02:20:25 +00:00
renovate[bot] 4591e2b4bf chore(deps): update dependency express-rate-limit to v8.4.0 2026-04-27 02:19:45 +00:00
renovate[bot] 35279f0815 fix(deps): update dependency i18next-http-backend to v3.0.6 2026-04-27 02:19:07 +00:00
renovate[bot] 269ff2b78d chore(deps): update pnpm to v10.33.2 2026-04-27 02:17:35 +00:00
renovate[bot] a5ab6be14b chore(deps): update dependency vite to v8.0.10 2026-04-27 02:17:21 +00:00
renovate[bot] 93a985848a chore(deps): update dependency @redocly/cli to v2.29.2 2026-04-27 02:15:27 +00:00
Elian Doran 712c7c76ba Translations update from Hosted Weblate (#9583) 2026-04-26 13:01:50 +03:00
Ulices 7503dbdadf Translated using Weblate (Spanish)
Currently translated at 99.1% (1988 of 2005 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/es/
2026-04-26 09:56:32 +02:00
Elian Doran 45fa6a8de0 Release bugfixes (#9582) 2026-04-26 10:56:24 +03:00
Elian Doran f84d050580 e2e(server): pdf test affected by virtualization 2026-04-26 10:43:43 +03:00
Elian Doran 2955ab4f90 chore(client): revert changes to translations in other languages 2026-04-26 10:35:34 +03:00
Elian Doran 96e0503265 fix(spreadsheet): search triggers regardless of note context 2026-04-26 10:34:14 +03:00
Elian Doran df78622d90 chore(spreadsheet): mitigate cross-workspace formula contamination 2026-04-26 10:27:34 +03:00
Elian Doran 5972b728df chore(client): fix JSON issues caused by merge 2026-04-26 10:22:19 +03:00
Elian Doran 8fee6b7f43 chore(spreadsheet): address requested change 2026-04-26 10:16:42 +03:00
Elian Doran e4044f363a Merge remote-tracking branch 'origin/main' into feature/release_bugfixes
; Conflicts:
;	apps/client/src/translations/cn/translation.json
;	apps/client/src/translations/es/translation.json
;	apps/client/src/translations/ga/translation.json
;	apps/client/src/translations/it/translation.json
;	apps/client/src/translations/tw/translation.json
2026-04-26 10:08:48 +03:00
Elian Doran ec96fa0c31 fix(print_preview): print report behind the modal 2026-04-26 10:00:03 +03:00
Elian Doran 979d408a44 chore(print_preview): increase deboucing 2026-04-26 09:46:40 +03:00
Elian Doran ca29a11b09 feat(print_preview): display dialog first and preview second 2026-04-26 09:44:29 +03:00
Elian Doran 8c8e797dda refactor(print_preview): extract styles 2026-04-26 09:27:10 +03:00
Elian Doran f9a5935b85 chore(print_preview): reuse existing widgets 2026-04-26 09:20:43 +03:00
Elian Doran 5e406a077d chore(pdfjs): reduce triggering of save events 2026-04-26 08:51:39 +03:00
Elian Doran 3c0700f5cd chore(deps): update dependency @redocly/cli to v2.29.1 (#9576) 2026-04-26 08:07:18 +03:00
Elian Doran a19a080f91 fix(deps): update ckeditor monorepo to v48.0.1 (#9579) 2026-04-26 08:06:21 +03:00
Elian Doran afd43b68ad fix(deps): update dependency mind-elixir to v5.11.0 (#9581) 2026-04-26 08:05:36 +03:00
Elian Doran aa13193fd8 chore(deps): update dependency @types/tabulator-tables to v6.3.2 (#9577) 2026-04-26 08:05:08 +03:00
Elian Doran 59d386bc9a chore(deps): update pnpm to v10.33.1 (#9578) 2026-04-26 08:04:07 +03:00
Elian Doran 361169803f chore(deps): update dependency electron to v41.3.0 (#9580) 2026-04-26 08:03:13 +03:00
renovate[bot] 303d614c2a fix(deps): update dependency mind-elixir to v5.11.0 2026-04-26 02:11:13 +00:00
renovate[bot] d211dfce2d chore(deps): update dependency electron to v41.3.0 2026-04-26 02:10:39 +00:00
renovate[bot] 5e84ebdc9c fix(deps): update ckeditor monorepo to v48.0.1 2026-04-26 02:10:01 +00:00
renovate[bot] c22eecdbc4 chore(deps): update pnpm to v10.33.1 2026-04-26 02:09:23 +00:00
renovate[bot] 1337fd19b8 chore(deps): update dependency @types/tabulator-tables to v6.3.2 2026-04-26 02:09:10 +00:00
renovate[bot] cf1110639f chore(deps): update dependency @redocly/cli to v2.29.1 2026-04-26 02:08:32 +00:00
Elian Doran 4e1b71dac2 fix(pdfjs): not reacting to deleting highlights or moving (closes #9069) 2026-04-25 21:24:48 +03:00
Elian Doran a2424cd0df docs(user): mention changes to PDF 2026-04-25 21:02:29 +03:00
Elian Doran 4b57ebf06f chore(pdf): remove unnecessary highlight types 2026-04-25 20:54:55 +03:00
Elian Doran 36e597ca3e fix(pdf): toolbar shifting when clicking on an annotation 2026-04-25 20:45:03 +03:00
Elian Doran 992f72b139 fix(pdf): not reacting to new annotations 2026-04-25 20:38:07 +03:00
Elian Doran 2a668b82b1 fix(pdf): annotation color changes not considered 2026-04-25 20:25:26 +03:00
Elian Doran 62eb825e52 feat(pdf): support as template 2026-04-25 20:22:59 +03:00
Elian Doran d976076ae5 chore(pdf): remove grouping annotations by page 2026-04-25 19:18:21 +03:00
Elian Doran 345932d392 fix(pdf): readability on dakr theme 2026-04-25 19:17:15 +03:00
Elian Doran faa4fce987 feat(pdf): improve color rendering of highlights 2026-04-25 19:16:02 +03:00
Elian Doran 778b4b2850 Translations update from Hosted Weblate (#9574) 2026-04-25 18:22:41 +03:00
Elian Doran becc66721d Apply suggestions from code review
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-04-25 18:22:19 +03:00
noobhjy 2b79c43737 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (406 of 406 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/zh_Hans/
2026-04-25 15:09:59 +00:00
Giovi 86a8a7bf2f Translated using Weblate (Italian)
Currently translated at 99.9% (2004 of 2005 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/it/
2026-04-25 15:09:57 +00:00
Giovi c07636b822 Translated using Weblate (Italian)
Currently translated at 100.0% (406 of 406 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/it/
2026-04-25 15:09:51 +00:00
noobhjy 6479d4f038 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 91.2% (1829 of 2005 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2026-04-25 15:09:50 +00:00
Elian Doran d100278935 fix(pdf): wrong icon for comment annotations 2026-04-25 13:04:09 +03:00
Elian Doran 4d2c346b80 fix(pdf): navigate to the correct position of an annotation 2026-04-25 13:03:08 +03:00
Elian Doran 1184cd6faf fix(pdf): annotation icons not showing 2026-04-25 12:59:18 +03:00
Elian Doran 7311e1a734 fix(pdf): highlights not processed correctly 2026-04-25 12:53:12 +03:00
Elian Doran efeed4942a feat(pdf): start listing annotations 2026-04-25 12:44:34 +03:00
Elian Doran f24d81ffa2 feat(pdf): make searchable using PDF.js builtin mechanism 2026-04-25 12:30:49 +03:00
Elian Doran 8d6597f198 feat(pdf): make printable using PDF.js builtin mechanism 2026-04-25 12:26:57 +03:00
Elian Doran 7ee0d9a1c9 fix(pdf): language not always applied 2026-04-25 12:19:32 +03:00
Elian Doran fad82c2138 chore(sidebar/pdf): bring back to column-layout 2026-04-25 12:09:14 +03:00
Elian Doran e8bb093e84 feat(sidebar/pdf): virtualize pages to improve performance 2026-04-25 12:08:02 +03:00
Elian Doran c920dfb4a0 chore(sidebar): make grow sections individually scrollable 2026-04-25 12:00:07 +03:00
Elian Doran f35724a844 fix(sidebar): collapse state not correct 2026-04-25 11:55:00 +03:00
Elian Doran 2ee764d581 feat(llm): improve sidebar fit 2026-04-25 11:54:47 +03:00
Elian Doran 1673d9cfdb feat(sidebar): improve layout when space is constrained 2026-04-25 11:52:43 +03:00
Elian Doran 86f13bd0e3 feat(pdf): render in share with native PDF provider 2026-04-25 11:49:39 +03:00
Elian Doran ef7d123c95 fix(sidebar): table of contents & pages not scrollable 2026-04-25 11:49:26 +03:00
Elian Doran bd9eae5c9d docs(user): mention markdown ToC 2026-04-25 11:38:32 +03:00
Elian Doran d363a4870b feat(pdf): add read-only badge 2026-04-25 11:38:10 +03:00
Elian Doran c63c7a6f16 docs(user): mention read-only in PDF 2026-04-25 11:30:39 +03:00
Elian Doran 42e1d881da chore(note_list): hide toolbar in PDF as previously handled 2026-04-25 11:30:21 +03:00
Elian Doran 4b30b1dd08 feat(pdf): support read-only mode 2026-04-25 11:27:46 +03:00
Elian Doran 6289643e80 chore(llm): make images and Mermaid fit 2026-04-25 11:14:47 +03:00
Elian Doran f113d3b132 feat(llm): instruct to not create notes unless needed 2026-04-25 11:06:11 +03:00
Elian Doran 09412150f1 feat(llm): instruct to make use of extended Markdown features 2026-04-25 11:01:37 +03:00
Elian Doran 7df8d8be23 chore(llm): remove breaks handling 2026-04-25 10:51:13 +03:00
Elian Doran 34ebc6e375 feat(llm): render with full Markdown support 2026-04-25 10:50:10 +03:00
Elian Doran 7d0b1a7fc1 feat(llm): render math 2026-04-25 10:47:57 +03:00
Elian Doran 72a7e8daa6 chore(llm): use shared Markdown renderer 2026-04-25 10:45:48 +03:00
Elian Doran 14ec83ef41 chore(llm): use instant scrolling for streaming as well 2026-04-25 10:35:28 +03:00
Elian Doran e340db8664 feat(delete_notes): use virtualization if many notes are being deleted 2026-04-25 10:26:58 +03:00
Elian Doran 2276dd17a4 fix(llm): first scroll to button had an animation 2026-04-25 10:24:23 +03:00
Elian Doran 967dfbfdcd feat(llm): don't scrol up if the user is already at the top 2026-04-25 10:22:44 +03:00
Elian Doran 8618248d57 feat(spreadsheet): use the default font 2026-04-25 10:06:44 +03:00
Elian Doran 92975c75c8 fix(ocr): confusing message when processing image-based PDFs 2026-04-25 09:54:41 +03:00
Elian Doran b711f2bb6e feat(markdown): basic footnote support 2026-04-25 09:42:36 +03:00
Elian Doran 7db48b8b84 docs(user): mention shared notes functionality 2026-04-25 09:40:51 +03:00
Elian Doran ffb36f6a54 fix(spreadsheet): find not dismissed by changing note type 2026-04-25 09:32:49 +03:00
Elian Doran b0dfb9ecd7 fix(share/markdown): not rendering inline mermaid or math 2026-04-25 09:29:10 +03:00
Elian Doran 571e52a115 chore(share/markdown): use proper (CKEditor-like) formatting 2026-04-25 09:25:57 +03:00
Elian Doran 68e99437b5 fix(share/markdown): bare code blocks rendered with syntax highlighting 2026-04-25 09:25:44 +03:00
Elian Doran 3a165bc385 fix(spreadsheet): hide find dialog when switching to a different note 2026-04-25 09:22:36 +03:00
Elian Doran 1571267496 feat(markdown): basic rendering in share 2026-04-25 09:20:31 +03:00
Elian Doran cf9e4d8d45 chore(deps): update dependency @electron/rebuild to v4.0.4 (#9566) 2026-04-25 08:23:20 +03:00
Elian Doran 776ef050a5 chore(deps): update dependency electron to v41.2.2 (#9567) 2026-04-25 08:22:32 +03:00
Elian Doran 95b8d90c73 chore(deps): update vitest monorepo to v4.1.5 (#9568) 2026-04-25 08:21:14 +03:00
Elian Doran df07dec9f6 fix(deps): update dependency dompurify to v3.4.1 (#9569) 2026-04-25 08:20:45 +03:00
Elian Doran 1d58e48a7a fix(deps): update dependency @codemirror/search to v6.7.0 (#9570) 2026-04-25 08:19:58 +03:00
Elian Doran 02086131af chore: delete accidentally committed files 2026-04-25 08:13:47 +03:00
renovate[bot] a322dbafd1 fix(deps): update dependency @codemirror/search to v6.7.0 2026-04-25 01:20:07 +00:00
renovate[bot] 12a127ce71 fix(deps): update dependency dompurify to v3.4.1 2026-04-25 01:19:04 +00:00
renovate[bot] c1edc2c924 chore(deps): update vitest monorepo to v4.1.5 2026-04-25 01:18:03 +00:00
renovate[bot] aa1596173c chore(deps): update dependency electron to v41.2.2 2026-04-25 01:16:59 +00:00
renovate[bot] b37a43c541 chore(deps): update dependency @electron/rebuild to v4.0.4 2026-04-25 01:15:59 +00:00
Elian Doran b502d2c9f5 chore(llm): add hint for tool parallelization 2026-04-24 21:17:03 +03:00
Elian Doran 14eaba444c Merge branch 'feature/release_bugfixes' of https://github.com/TriliumNext/Trilium into feature/release_bugfixes 2026-04-24 21:16:45 +03:00
Elian Doran 15d44e0794 feat(spreadsheet): add hyperlink support 2026-04-24 19:13:53 +03:00
Elian Doran af3663c254 feat(ckeditor5-keyboard-marker): improve alignment 2026-04-24 19:05:27 +03:00
Elian Doran 48c6901d3e chore(ckeditor5-keyboard-marker): reduce margin 2026-04-24 18:57:44 +03:00
Elian Doran d1004ad66e feat(ckeditor5-keyboard-marker): use two-step caret movement 2026-04-24 18:55:21 +03:00
Elian Doran 04cd631021 feat(ckeditor): disable spellchecking for shortcuts 2026-04-24 18:51:40 +03:00
Elian Doran b95b7460ea feat(ckeditor): improve the style of keyboard shortcuts 2026-04-24 18:50:33 +03:00
Elian Doran 980974cf86 feat(backup): append the date when downloading a backup for easy reference 2026-04-24 18:43:27 +03:00
Elian Doran 5dbdcd8bc9 fix(backup): slashes not displayed well in the backup toast 2026-04-24 18:34:00 +03:00
Elian Doran cce90782d6 fix(breadcrumb): children shown even if subtree is hidden 2026-04-24 18:12:14 +03:00
Elian Doran c4657c72e5 feat(markdown): use lexer-based ToC 2026-04-24 17:43:50 +03:00
Elian Doran d4fa608dfe feat(markdown): add HTML-based table of contents 2026-04-24 17:37:16 +03:00
Elian Doran b0c91bd889 feat(llm): group similar tool calls together 2026-04-24 12:43:51 +03:00
Elian Doran dd2f32c840 chore(llm): improve spacing in full-page chat 2026-04-24 12:23:48 +03:00
Elian Doran 298db2cba6 feat(llm): support admonitions 2026-04-24 10:57:22 +03:00
Elian Doran b156595693 fix(markdown): inline title not changing when switching MIME type 2026-04-24 10:10:19 +03:00
Elian Doran ea20193d6b fix(markdown): wrong preview background for read-only 2026-04-24 10:08:11 +03:00
Elian Doran 1ee4aef2b1 feat(markdown): don't auto-highlight 2026-04-24 10:01:16 +03:00
Elian Doran 0980916e31 fix(markdown): slow rendering due to syntax highlighting 2026-04-24 09:49:24 +03:00
Elian Doran 58d984f197 feat(markdown): improve rendering of images 2026-04-24 09:45:48 +03:00
Elian Doran a4ab139a51 chore(llm): improve cost analysis 2026-04-24 09:36:08 +03:00
Elian Doran d3b5c702b4 chore(client): basic stylelint with only directionality warnings 2026-04-24 09:36:08 +03:00
Elian Doran 0a18a681c4 chore(llm): integrate Opus 4.7 2026-04-24 09:36:08 +03:00
Elian Doran 698d37f222 chore(deps): update typescript-eslint monorepo to v8.59.0 (#9561) 2026-04-24 08:39:54 +03:00
Elian Doran bac6780346 chore(deps): update apple-actions/import-codesign-certs action to v7 (#9562) 2026-04-24 08:39:40 +03:00
Elian Doran 0f746f31a1 fix(deps): update ai sdk (#9496) 2026-04-24 08:35:13 +03:00
Elian Doran a70287be48 chore(deps): update dependency stylelint to v17.8.0 (#9504) 2026-04-24 08:26:05 +03:00
renovate[bot] 47c65ddab2 chore(deps): update typescript-eslint monorepo to v8.59.0 2026-04-24 05:22:11 +00:00
Elian Doran 6854df59be chore(deps): update dependency @redocly/cli to v2.29.0 (#9560) 2026-04-24 08:20:14 +03:00
Elian Doran 5b5b611494 fix(deps): update dependency @excalidraw/excalidraw to v0.18.1 (#9559) 2026-04-24 08:20:04 +03:00
Elian Doran bb9f8e8325 chore(deps): update dependency vite to v8.0.9 (#9558) 2026-04-24 08:19:35 +03:00
Elian Doran 62e78f0b21 chore(deps): update dependency eslint-plugin-playwright to v2.10.2 (#9557) 2026-04-24 08:17:46 +03:00
renovate[bot] 8dce0ef98d chore(deps): update apple-actions/import-codesign-certs action to v7 2026-04-24 00:54:14 +00:00
renovate[bot] 8d2740637c chore(deps): update dependency @redocly/cli to v2.29.0 2026-04-24 00:53:09 +00:00
renovate[bot] bfe921da85 fix(deps): update dependency @excalidraw/excalidraw to v0.18.1 2026-04-24 00:52:13 +00:00
renovate[bot] bbb7a77174 chore(deps): update dependency vite to v8.0.9 2026-04-24 00:51:10 +00:00
renovate[bot] 84c34748c0 chore(deps): update dependency eslint-plugin-playwright to v2.10.2 2026-04-24 00:50:15 +00:00
Elian Doran 9048119bf1 fix(deps): update dependency i18next to v26.0.6 (#9527) 2026-04-23 22:44:50 +03:00
renovate[bot] 8afb294bff fix(deps): update dependency i18next to v26.0.6 2026-04-23 19:34:30 +00:00
Elian Doran f8f8138100 Update dependency i18next-fs-backend to v2.6.4 [SECURITY] (#9542) 2026-04-23 22:32:17 +03:00
Elian Doran 007764cec9 Basic script deployer (#9543) 2026-04-23 22:31:40 +03:00
Elian Doran f0a8002a15 chore(spreadsheet): improve translation for read-only 2026-04-23 22:16:07 +03:00
Elian Doran 1a29db8607 fix(spreadsheet): read-only not working 2026-04-23 21:52:10 +03:00
Elian Doran 860af33710 feat(spreadsheet): basic search support 2026-04-23 21:44:15 +03:00
Elian Doran 8576eebff0 refactor(server): use different mechanism for detecting if note is templateable 2026-04-23 21:37:19 +03:00
Elian Doran 20825a3cac feat(spreadsheet): add print support 2026-04-23 21:35:24 +03:00
Elian Doran c3a5bedfaf fix(spreadsheet): cannot be used as a template 2026-04-23 21:33:42 +03:00
Elian Doran 6cdb26a843 feat(spreadsheet): hide the font family selector 2026-04-23 21:31:40 +03:00
Elian Doran b1c8bc0483 feat(tree): disable hide subtree on root note 2026-04-23 21:25:09 +03:00
Elian Doran 1927e1feaa feat(status_bar): add a help button for the attribute pane 2026-04-23 21:22:15 +03:00
Elian Doran 0349989da4 Merge branch 'feature/various_fixes' into feature/release_bugfixes
; Conflicts:
;	apps/client/src/widgets/react/Modal.tsx
2026-04-23 21:15:30 +03:00
Elian Doran f8ad52bcfa chore(client): get rid of data-in-app-help-page 2026-04-23 21:14:40 +03:00
Elian Doran dd2a3617e2 chore(client): get rid of data-help-page 2026-04-23 21:11:53 +03:00
Elian Doran b60b74e66d fix(search): help button not working (closes #9537) 2026-04-23 21:08:05 +03:00
Elian Doran 6602b65e0a Translations update from Hosted Weblate (#9546) 2026-04-23 21:06:18 +03:00
renovate[bot] 4542f2caea Update dependency stylelint to v17.8.0 2026-04-23 17:56:40 +00:00
renovate[bot] d8da52f98b Update ai sdk 2026-04-23 17:55:01 +00:00
renovate[bot] aab67b270c Update dependency i18next-fs-backend to v2.6.4 [SECURITY] 2026-04-23 17:54:09 +00:00
Antonio Sanchez Castellón 6131ba7829 Translated using Weblate (Spanish)
Currently translated at 97.2% (1949 of 2005 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/es/
2026-04-23 17:51:44 +00:00
Aindriú Mac Giolla Eoin 6981e2b488 Translated using Weblate (Irish)
Currently translated at 99.9% (2004 of 2005 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ga/
2026-04-23 17:51:44 +00:00
Ulices 3c6810c79e Translated using Weblate (Spanish)
Currently translated at 91.9% (1843 of 2005 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/es/
2026-04-23 17:51:43 +00:00
Francis C. dc645eff02 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 96.4% (1933 of 2005 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hant/
2026-04-23 17:51:43 +00:00
Francis C. 4effdd6835 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (406 of 406 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/zh_Hant/
2026-04-23 17:51:42 +00:00
Elian Doran 904c3659da chore(ci): remove claude workflow 2026-04-23 20:51:28 +03:00
Elian Doran 0077b35854 test(script-deployer): fix failing test due to non-refreshed cache 2026-04-23 20:48:44 +03:00
Elian Doran 7cf5e7f1d9 feat(script-deployer): make notes read-only 2026-04-23 19:42:35 +03:00
Elian Doran 1107d0c65a chore(script-deployer): address requested changes 2026-04-23 19:42:30 +03:00
Elian Doran ca797737b4 feat(scripts/auto-import-rnote): handle v0.14 raw images 2026-04-23 19:29:35 +03:00
Elian Doran 199eac394d feat(scripts/auto-import-rnote): suppport v0.13 vs v0.14 2026-04-23 19:29:21 +03:00
Elian Doran 074edeefab fix(script_deployer): Node.js imports not working 2026-04-23 19:23:13 +03:00
Elian Doran f297dd882c fix(scripts): basic importer for rnote 2026-04-23 19:16:00 +03:00
Elian Doran 82056e59bf fix(script_deployer): labels not applied on already existing note 2026-04-23 19:07:53 +03:00
Elian Doran 51972bdaa6 feat(script_deployer): support execute 2026-04-23 19:06:27 +03:00
Elian Doran ff4480a9d6 fix(scripts/auto-import-xopp): stroke too thick 2026-04-23 19:02:47 +03:00
Elian Doran a0449ff7bf feat(script_deployer): backend-script to import to XOPP 2026-04-23 19:02:29 +03:00
Elian Doran 2aa7c06b82 Update dependency vite-plugin-static-copy to v4.1.0 (#9545) 2026-04-23 06:54:45 +03:00
renovate[bot] d53f152fdf Update dependency vite-plugin-static-copy to v4.1.0 2026-04-23 01:55:28 +00:00
Elian Doran e26e69441e chore(script_deployer): basic support for backend notes 2026-04-22 21:51:58 +03:00
Elian Doran 8574593989 chore(script_deployer): fix thickness in XOPP import 2026-04-22 21:34:34 +03:00
Elian Doran 1164fb7dc7 test(script_deployer): add deployment tests 2026-04-22 21:28:53 +03:00
Elian Doran a51e6801e8 chore(script_deployer): improve types 2026-04-22 21:21:43 +03:00
Elian Doran c24301440e chore(script_deployer): preserve JSX 2026-04-22 21:13:43 +03:00
Elian Doran 366461fdce chore(script_deployer): fix more typecheck issues 2026-04-22 21:10:36 +03:00
Elian Doran a92c4f23c2 feat(script_deployer): add watch 2026-04-22 21:08:08 +03:00
Elian Doran 7c86272705 feat(script_deployer): basic TypeScript support 2026-04-22 20:59:48 +03:00
Elian Doran 5e9c514596 chore(script_deployer): basic typecheck 2026-04-22 20:36:20 +03:00
Elian Doran ae787b8f82 chore(script_deployer): refresh all active contexts 2026-04-22 20:25:06 +03:00
Elian Doran 7d103e0c31 chore(script_deployer): add tsconfig 2026-04-22 20:21:32 +03:00
Elian Doran dcfb58cc83 feat(script_deployer): basic auto-refresh for render notes 2026-04-22 20:06:06 +03:00
Elian Doran 5935028082 feat(script_deployer): basic support for syncing 2026-04-22 19:48:32 +03:00
Elian Doran 5cec43047e chore(script_deployer): change render note to subnote 2026-04-22 19:45:28 +03:00
Elian Doran 155413468e chore(script_deployer): basic deployment scheme 2026-04-22 19:41:29 +03:00
Elian Doran daeb51a43c chore(script_deployer): ensure script directory 2026-04-22 19:38:46 +03:00
Elian Doran d3a2884739 chore(script_deployer): add an existing script 2026-04-22 19:33:01 +03:00
Elian Doran 5ac532d709 fix(script_deployer): translations not working 2026-04-22 19:24:11 +03:00
Elian Doran aee87c5556 chore(script_deployer): basic setup 2026-04-22 19:21:15 +03:00
Elian Doran 3a9104e723 Translations update from Hosted Weblate (#9533) 2026-04-22 07:46:44 +03:00
Francis C. b11f1f51e4 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 94.8% (1901 of 2005 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hant/
2026-04-22 04:45:05 +00:00
Giovi a4a2243fbf Translated using Weblate (Italian)
Currently translated at 90.2% (1810 of 2005 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/it/
2026-04-22 04:45:05 +00:00
passkal4 b967129ad9 Translated using Weblate (Uyghur)
Currently translated at 46.3% (930 of 2005 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ug/
2026-04-22 04:45:04 +00:00
Hosted Weblate 0563817e75 Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/
2026-04-22 04:45:04 +00:00
Elian Doran 96a3e2275f Update dependency electron to v41.2.1 (#9497) 2026-04-22 07:44:53 +03:00
Elian Doran b5e2dccefd Update dependency i18next-http-backend to v3.0.5 (#9529) 2026-04-22 07:43:04 +03:00
Elian Doran da3a5ae247 Update dependency marked to v18.0.2 (#9530) 2026-04-22 07:42:30 +03:00
Elian Doran dad48dc279 Update dependency wxt to v0.20.25 (#9531) 2026-04-22 07:42:06 +03:00
Elian Doran 7362a946fc Update dependency @redocly/cli to v2.28.1 (#9516) 2026-04-22 07:41:37 +03:00
Elian Doran 57b1d5c0d4 Update dependency @codemirror/view to v6.41.1 (#9526) 2026-04-22 07:41:16 +03:00
renovate[bot] 843bd44d9d Update dependency wxt to v0.20.25 2026-04-22 01:52:38 +00:00
renovate[bot] 56967ae2d2 Update dependency marked to v18.0.2 2026-04-22 01:51:55 +00:00
renovate[bot] 609ebb8b0a Update dependency i18next-http-backend to v3.0.5 2026-04-22 01:51:12 +00:00
renovate[bot] 2d4cc8181c Update dependency @codemirror/view to v6.41.1 2026-04-22 01:49:04 +00:00
Elian Doran a0544699f0 fix(markdown): crashing in quick edit 2026-04-21 23:22:26 +03:00
Elian Doran c56cad1479 feat(dialogs): open help in quick edit 2026-04-21 21:22:46 +03:00
Elian Doran 3f7ee2c76c fix(revisions): broken diffing for some note types 2026-04-21 20:50:11 +03:00
Elian Doran be37179c97 fix(server): hash code changed after introduction of OCR
See https://github.com/TriliumNext/Trilium/commit/b4e5d9dbc24ef26a7f50f10d0fae21c9e3b5d7c5#r182901277
2026-04-21 20:30:48 +03:00
Elian Doran 3b57d2bacf Update dependency express-openid-connect to v2.20.2 (#9498) 2026-04-21 19:04:10 +03:00
Elian Doran 33ecb735d3 chore(server): allow cross-site cookie for standalone sync purposes 2026-04-21 16:57:50 +03:00
Elian Doran 415468bcf8 chore(server): set Access-Control-Allow-Credentials 2026-04-21 16:18:56 +03:00
Elian Doran cf826f636d Update dependency eslint-linter-browserify to v10.2.1 (#9518) 2026-04-21 10:28:30 +03:00
Elian Doran 9bb6a6e36c Update dependency i18next to v26.0.5 (#9500) 2026-04-21 10:26:26 +03:00
Elian Doran 79b642ce97 Update dependency wxt to v0.20.24 (#9521) 2026-04-21 09:12:36 +03:00
renovate[bot] 5f38d5611a Update dependency wxt to v0.20.24 2026-04-21 05:28:35 +00:00
renovate[bot] 8822476fd8 Update dependency i18next to v26.0.5 2026-04-21 05:25:58 +00:00
Elian Doran 1213d88619 Update dependency eslint to v10.2.1 (#9517) 2026-04-21 08:24:55 +03:00
Elian Doran dfc3b9d700 Update dependency marked to v18.0.1 (#9519) 2026-04-21 08:23:48 +03:00
Elian Doran 4a3ea5e35f Update dependency react-i18next to v17.0.4 (#9520) 2026-04-21 08:23:11 +03:00
Elian Doran bb14ba65f3 Translations update from Hosted Weblate (#9509) 2026-04-21 08:22:24 +03:00
renovate[bot] 5c39a713b4 Update dependency eslint to v10.2.1 2026-04-21 05:17:51 +00:00
Endric Barnekow b7e6ab7ff5 Translated using Weblate (German)
Currently translated at 100.0% (406 of 406 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/de/
2026-04-21 07:15:36 +02:00
Ulices a082452c71 Translated using Weblate (Spanish)
Currently translated at 87.1% (1747 of 2005 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/es/
2026-04-21 07:15:36 +02:00
Giovi b359d1d21c Translated using Weblate (Italian)
Currently translated at 88.4% (1773 of 2005 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/it/
2026-04-21 07:15:35 +02:00
passkal4 077a18a7d8 Translated using Weblate (Uyghur)
Currently translated at 36.0% (722 of 2005 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ug/
2026-04-21 07:15:35 +02:00
noobhjy f5c2fd2a5d Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 90.5% (1815 of 2005 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2026-04-21 07:15:34 +02:00
Endric Barnekow 89bff082f4 Translated using Weblate (German)
Currently translated at 89.2% (1789 of 2005 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/de/
2026-04-21 07:15:33 +02:00
green c1b8952509 Translated using Weblate (Japanese)
Currently translated at 99.9% (2004 of 2005 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2026-04-21 07:15:33 +02:00
Giovi 298ad3afc7 Translated using Weblate (Italian)
Currently translated at 99.7% (405 of 406 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/it/
2026-04-21 07:15:32 +02:00
Mr. Dalgali e118c46993 Translated using Weblate (Turkish)
Currently translated at 17.0% (27 of 158 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/tr/
2026-04-21 07:15:32 +02:00
Endric Barnekow ae3e4ecc4e Translated using Weblate (German)
Currently translated at 87.4% (1754 of 2005 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/de/
2026-04-21 07:15:31 +02:00
Ulices f05cb47ad8 Translated using Weblate (Spanish)
Currently translated at 100.0% (406 of 406 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/es/
2026-04-21 07:15:31 +02:00
Ulices 96534ecc39 Translated using Weblate (Spanish)
Currently translated at 85.9% (1724 of 2005 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/es/
2026-04-21 07:15:30 +02:00
Endric Barnekow b4b7adc3fd Translated using Weblate (German)
Currently translated at 99.7% (405 of 406 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/de/
2026-04-21 07:15:30 +02:00
passkal4 c73686ec5a Translated using Weblate (Uyghur)
Currently translated at 28.4% (570 of 2005 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ug/
2026-04-21 07:15:29 +02:00
Mr. Dalgali 6e3ade51ae Translated using Weblate (Turkish)
Currently translated at 5.9% (120 of 2005 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/tr/
2026-04-21 07:15:28 +02:00
Hosted Weblate 73f094f9a6 Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/
2026-04-21 07:15:28 +02:00
Elian Doran 8a1267a7b6 Update ckeditor5 config packages to v15 (major) (#9522) 2026-04-21 08:15:21 +03:00
renovate[bot] bf2965016d Update ckeditor5 config packages to v15 2026-04-21 02:08:04 +00:00
renovate[bot] 042b29b174 Update dependency react-i18next to v17.0.4 2026-04-21 02:02:59 +00:00
renovate[bot] 523b64e9e8 Update dependency marked to v18.0.1 2026-04-21 02:00:52 +00:00
renovate[bot] 3006ebd8b5 Update dependency eslint-linter-browserify to v10.2.1 2026-04-21 01:58:57 +00:00
renovate[bot] 0ccd7a6c11 Update dependency @redocly/cli to v2.28.1 2026-04-21 01:54:53 +00:00
Adorian Doran ca52fabb8a Merge branch 'main' of https://github.com/TriliumNext/Trilium 2026-04-21 01:31:45 +03:00
Adorian Doran cbeb539c69 style/about dialog: tweak the background color for the nightly channel 2026-04-21 01:31:42 +03:00
Elian Doran a988543487 fix(share): unchecked TODOs not visible in dark theme (closes #8944) 2026-04-20 08:56:44 +03:00
Elian Doran d625565830 Update Node.js to v24.15.0 (#9505) 2026-04-20 08:22:34 +03:00
Elian Doran ef7facc3f0 Update dependency force-graph to v1.51.4 (#9499) 2026-04-20 08:21:49 +03:00
Elian Doran b20d2436fa Update dependency @types/express-session to v1.19.0 (#9503) 2026-04-20 08:20:00 +03:00
Elian Doran 516a177bfb Update actions/checkout action to v6 (#9506) 2026-04-20 08:19:27 +03:00
Elian Doran 26efc3a8ff Update dependency wxt to v0.20.23 (#9502) 2026-04-20 08:18:11 +03:00
Elian Doran 91e989719b Update dependency typescript to v6.0.3 (#9501) 2026-04-20 08:17:15 +03:00
renovate[bot] 390877931b Update actions/checkout action to v6 2026-04-20 01:09:06 +00:00
renovate[bot] f794a34132 Update Node.js to v24.15.0 2026-04-20 01:08:59 +00:00
renovate[bot] 67f5fc3dbc Update dependency @types/express-session to v1.19.0 2026-04-20 01:08:10 +00:00
renovate[bot] 753475ee46 Update dependency wxt to v0.20.23 2026-04-20 01:07:31 +00:00
renovate[bot] 90e4e73316 Update dependency typescript to v6.0.3 2026-04-20 01:06:55 +00:00
renovate[bot] b5a4956188 Update dependency force-graph to v1.51.4 2026-04-20 01:05:37 +00:00
renovate[bot] e00c72079a Update dependency express-openid-connect to v2.20.2 2026-04-20 01:04:57 +00:00
renovate[bot] 99bce0c262 Update dependency electron to v41.2.1 2026-04-20 01:04:14 +00:00
Elian Doran f48509ea2f Translations update from Hosted Weblate (#9493) 2026-04-19 19:53:53 +03:00
Hosted Weblate 1d0bc138fd Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/
2026-04-19 16:01:26 +00:00
Abi Quinn 326c0234ff Translated using Weblate (English (United Kingdom))
Currently translated at 8.5% (170 of 1999 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/en_GB/
2026-04-19 16:01:24 +00:00
Abi Quinn bbbacf7f78 Translated using Weblate (English (United Kingdom))
Currently translated at 100.0% (116 of 116 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/en_GB/
2026-04-19 16:01:23 +00:00
Abi Quinn fd428a81e0 Translated using Weblate (English (United Kingdom))
Currently translated at 91.1% (144 of 158 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/en_GB/
2026-04-19 16:01:22 +00:00
green ba0e9e2eaa Translated using Weblate (Japanese)
Currently translated at 99.9% (1998 of 1999 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2026-04-19 16:01:22 +00:00
Abi Quinn 286f412906 Translated using Weblate (English (United Kingdom))
Currently translated at 35.4% (144 of 406 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/en_GB/
2026-04-19 16:01:21 +00:00
Francis C. 4708d55a99 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 90.1% (1803 of 1999 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hant/
2026-04-19 16:01:21 +00:00
Aindriú Mac Giolla Eoin 5952d13498 Translated using Weblate (Irish)
Currently translated at 99.9% (1998 of 1999 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ga/
2026-04-19 16:01:20 +00:00
passkal4 6d39bd91d9 Translated using Weblate (Uyghur)
Currently translated at 17.7% (355 of 1999 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ug/
2026-04-19 16:01:20 +00:00
green b97fd784ea Translated using Weblate (Japanese)
Currently translated at 100.0% (406 of 406 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ja/
2026-04-19 16:01:19 +00:00
Aindriú Mac Giolla Eoin e7bbdf8cc1 Translated using Weblate (Irish)
Currently translated at 100.0% (406 of 406 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ga/
2026-04-19 16:01:19 +00:00
Adorian Doran fe334ca8eb contributor list: fix broken list 2026-04-19 19:01:04 +03:00
Adorian Doran 9e37a803f7 A new about dialog (#9151) 2026-04-19 18:44:44 +03:00
Adorian Doran c4d832eebc contributor list: update script name, change a comment 2026-04-19 18:33:35 +03:00
Adorian Doran 5921d1f1a6 client/about dialog: fix some issues 2026-04-19 18:21:33 +03:00
Elian Doran b04945e793 chore(client): remove limit on contributors 2026-04-19 15:47:13 +03:00
Elian Doran 2c744122ca chore: update contributors list 2026-04-19 15:44:52 +03:00
Elian Doran adc648d277 chore(scripts): tweak criteria for contributors 2026-04-19 15:34:14 +03:00
Elian Doran a403aca054 chore(scripts): group translators separately 2026-04-19 13:16:08 +03:00
Elian Doran e7f85bb447 chore(scripts): filter contributors by minimum commits 2026-04-19 13:12:41 +03:00
Elian Doran e6e6c1feff chore(scripts): filter contributors by role 2026-04-19 13:03:57 +03:00
Elian Doran 415d9364de Merge remote-tracking branch 'origin/main' into feat/about-dialog-overhaul 2026-04-19 12:49:46 +03:00
Elian Doran 8a2b649714 Print collection - add missing link/titles for reference-link links (#9489) 2026-04-19 12:41:03 +03:00
Elian Doran 9c655baab9 Update softprops/action-gh-release action to v3 (#9470) 2026-04-19 12:37:21 +03:00
Elian Doran ae6f5fad3b chore(deps): update dependency officeparser to v6.1.0 (#9482) 2026-04-19 12:36:47 +03:00
Elian Doran f9baac34cc fix(ocr): use correct officeparser v6.1.0 API
v6.1.0 renamed parseOfficeAsync to OfficeParser.parseOffice (static
method) and returns an AST object with toText() instead of a plain
string.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-19 12:10:08 +03:00
Elian Doran 9d1f831737 chore(ci): disable signing for nightlies temporarily 2026-04-19 11:15:40 +03:00
Elian Doran 3839dad55d fix(print): margins not taken into consideration 2026-04-19 11:11:56 +03:00
Adorian Doran 900f308349 contributor list: switch to manual update, add a tool for a reference list (local Git + GitHub listing) 2026-04-19 11:10:45 +03:00
Elian Doran 4ae3a00464 chore: remove Electron repro project 2026-04-19 10:55:29 +03:00
Elian Doran bc21fd560f fix(server): increase sync version to match new DB schema 2026-04-19 10:18:44 +03:00
Elian Doran ab1d1f97c8 Translations update from Hosted Weblate (#9487) 2026-04-19 00:10:37 +03:00
noobhjy 9a85d7ec26 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 92.5% (1818 of 1965 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2026-04-18 19:57:01 +00:00
noobhjy f702930731 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (404 of 404 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/zh_Hans/
2026-04-18 19:57:00 +00:00
passkal4 f449fffaf5 Translated using Weblate (Uyghur)
Currently translated at 44.5% (180 of 404 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ug/
2026-04-18 19:57:00 +00:00
passkal4 78777e69fc Translated using Weblate (Uyghur)
Currently translated at 9.2% (182 of 1965 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ug/
2026-04-18 19:56:59 +00:00
passkal4 2d7df2d079 Translated using Weblate (Uyghur)
Currently translated at 93.6% (148 of 158 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/ug/
2026-04-18 19:56:59 +00:00
passkal4 fbbdb6e6e6 Translated using Weblate (Uyghur)
Currently translated at 95.7% (114 of 119 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/ug/
2026-04-18 19:56:58 +00:00
passkal4 797b5ffd80 Translated using Weblate (Uyghur)
Currently translated at 43.8% (177 of 404 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ug/
2026-04-18 19:56:57 +00:00
passkal4 04954a46d0 Translated using Weblate (Uyghur)
Currently translated at 9.0% (178 of 1965 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ug/
2026-04-18 19:56:57 +00:00
Hosted Weblate fafa080cfc Update translation files
Updated by "Remove blank strings" add-on in Weblate.

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/
2026-04-18 19:56:56 +00:00
passkal4 62e30d76fb Translated using Weblate (Uyghur)
Currently translated at 42.8% (173 of 404 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ug/
2026-04-18 19:56:55 +00:00
passkal4 ca78285fea Translated using Weblate (Uyghur)
Currently translated at 91.1% (144 of 158 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/ug/
2026-04-18 19:56:55 +00:00
passkal4 7a47928b82 Translated using Weblate (Uyghur)
Currently translated at 8.9% (175 of 1965 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ug/
2026-04-18 19:56:54 +00:00
Hosted Weblate 63e2a33543 Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/
2026-04-18 19:56:53 +00:00
Elian Doran caf53877e3 fix(deps): update dependency @codemirror/language-data to v6.5.2 (#9479) 2026-04-18 22:56:46 +03:00
contributor e9b1b2de21 chore(print): parallelize loading note reference links 2026-04-18 22:23:53 +03:00
contributor 9d8d7bd496 fix(print): missing note title for reference links 2026-04-18 22:00:04 +03:00
contributor 4579e4d31b Revert "fix(print): add missing note title for links (content renderer aware of printing)"
This reverts commit 62a8fb2228.
2026-04-18 21:59:08 +03:00
Elian Doran 8d41ba85a8 docs(user): add documentation on code & print improvements 2026-04-18 21:35:29 +03:00
Adorian Doran 4e55b29041 Merge branch 'main' of https://github.com/TriliumNext/Trilium into feat/about-dialog-overhaul 2026-04-18 20:36:13 +03:00
Adorian Doran ac1bcefe80 client/property sheet component: fix width limit on mobile 2026-04-18 20:31:48 +03:00
Adorian Doran 1d8a8107af style/property sheet component: improve appearance 2026-04-18 20:29:49 +03:00
Adorian Doran 36270397c2 git mailmap: update 2026-04-18 20:21:52 +03:00
Adorian Doran b349922add client/about dialog: make full page on mobile 2026-04-18 20:20:39 +03:00
Adorian Doran dbea88fa56 client/modal dialog: add support for full page dialogs on mobile 2026-04-18 20:20:06 +03:00
claude[bot] b2bcccb4c7 fix(ocr): adapt OfficeProcessor to officeparser v6.1.0 ESM changes
v6.1.0 added native ESM with Node16 resolution and a strict exports
field, breaking deep subpath imports like
officeparser/dist/parsers/ExcelParser.js. Switch to the main package
entry and use parseOfficeAsync(), which accepts a Buffer and
auto-detects the format via magic bytes.

Co-authored-by: Elian Doran <eliandoran@users.noreply.github.com>
2026-04-18 17:07:02 +00:00
Elian Doran 9d60bb804d Named revisions (#9490) 2026-04-18 20:04:54 +03:00
Elian Doran 189867ca03 Merge branch 'main' into renovate/officeparser-6.x 2026-04-18 19:56:55 +03:00
Elian Doran 23cb66bba9 chore(revisions): address requested changes 2026-04-18 19:55:36 +03:00
Elian Doran 10a2e21636 chore(etapi): revert change to revision API 2026-04-18 19:55:36 +03:00
Elian Doran 2fa0a4b35c fix(ci): grant write permissions to interactive Claude workflow
The contents, pull-requests, and issues permissions were set to read, preventing Claude from pushing commits and commenting on PRs/issues.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 19:51:44 +03:00
Elian Doran 8d20fec5b8 Merge branch 'main' into feature/named_revisions 2026-04-18 19:41:14 +03:00
Elian Doran 1d25d79a3f fix(ci): grant write permission to Claude code review workflow
The pull-requests permission was set to read, preventing Claude from posting review comments on PRs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 19:30:32 +03:00
Elian Doran c61c6ae64c Merge branch 'feature/named_revisions' of github.com:TriliumNext/Trilium into feature/named_revisions 2026-04-18 19:22:05 +03:00
Elian Doran fb3c487c0d test(server): fix ETAPI related test 2026-04-18 19:22:03 +03:00
Elian Doran 087fc5f2c4 Merge branch 'main' into feature/named_revisions 2026-04-18 19:20:48 +03:00
Elian Doran e01d835709 feat(revisions): add a shortcut to save named revisions 2026-04-18 19:13:37 +03:00
Elian Doran 662d6fa91c chore(deps): update dependency wxt to v0.20.22 (#9477) 2026-04-18 18:50:45 +03:00
Elian Doran 03a4e1d4c1 fix(deps): update dependency react-i18next to v17.0.3 (#9480) 2026-04-18 18:50:17 +03:00
Elian Doran 9d953ea700 docs(user): update note revisions to new layout 2026-04-18 18:47:21 +03:00
Elian Doran da96d2bc88 feat(revisions): dedicated no revisions modal 2026-04-18 18:08:11 +03:00
Elian Doran dabbbbb874 fix(revisions): context menu on mobile + regression in tab switcher 2026-04-18 18:01:34 +03:00
Elian Doran ffe60580db fix(revisions): layout on mobile 2026-04-18 17:55:03 +03:00
Elian Doran a2cd75c2c4 feat(revisions): preserve monospace for code notes diff 2026-04-18 17:36:31 +03:00
Elian Doran f4cf8829f7 feat(revisions): improve the layout even further & rebrand description to name 2026-04-18 17:23:44 +03:00
Elian Doran fb5520a3c5 feat(revisions): relocate the description 2026-04-18 17:17:02 +03:00
Elian Doran bd30e9efc1 feat(revisions): declutter the header 2026-04-18 17:11:22 +03:00
Elian Doran f9310c5cde feat(revisions): improve title display 2026-04-18 17:00:19 +03:00
Elian Doran 01c57fc8db feat(revisions): display sidebar in full-height 2026-04-18 16:48:54 +03:00
Elian Doran f22eaee4e2 Merge remote-tracking branch 'origin/main' into feature/named_revisions 2026-04-18 16:45:08 +03:00
Adorian Doran 2742df7cd1 client/about dialog: fix a typo 2026-04-18 16:10:00 +03:00
Adorian Doran c031a99fc0 client/about dialog: update the license URL 2026-04-18 16:07:39 +03:00
Adorian Doran 83d08d890d style/about dialog: improve appearance 2026-04-18 16:05:09 +03:00
Adorian Doran e2c79ff047 client: refactor 2026-04-18 15:54:10 +03:00
Adorian Doran e624c204ff client/fluid container: fix a bug 2026-04-18 15:53:08 +03:00
contributor 62a8fb2228 fix(print): add missing note title for links (content renderer aware of printing) 2026-04-18 15:41:44 +03:00
Elian Doran 7473d50711 fix(deps): update ai sdk (#9478) 2026-04-18 15:14:02 +03:00
Elian Doran 41a90f1904 chore(deps): update dependency @redocly/cli to v2.28.0 (#9481) 2026-04-18 15:13:43 +03:00
Elian Doran ae6803d711 Add Claude Code GitHub Workflow (#9488) 2026-04-18 15:12:53 +03:00
Elian Doran 81dfc59846 "Claude Code Review workflow" 2026-04-18 15:11:00 +03:00
Elian Doran d1528a2f3a "Claude PR Assistant workflow" 2026-04-18 15:10:58 +03:00
Elian Doran 36f635b7d5 chore(deps): update node.js to v24.15.0 (#9483) 2026-04-18 15:00:10 +03:00
Elian Doran 6278a376b7 Translations update from Hosted Weblate (#9486) 2026-04-18 14:59:37 +03:00
Elian Doran 20fca6c0df feat(revisions): improve layout and highlighting 2026-04-18 14:51:15 +03:00
Elian Doran 1ab04cf951 feat(revisions): improve grouping with smart auto-titles 2026-04-18 14:46:56 +03:00
Elian Doran 3ece5d6213 feat(revisions): group revisions and improve display 2026-04-18 14:39:31 +03:00
Elian Doran 65aba291ca feat(revisions): highlight inserted/removed images 2026-04-18 14:27:07 +03:00
Elian Doran b3e877f5dd feat(revisions): remove paddings for a smoother display 2026-04-18 14:24:11 +03:00
Elian Doran 066be7fa33 feat(revisions): group less used options into overflow menu 2026-04-18 14:18:29 +03:00
Elian Doran 6390f59fcf feat(revisions): improve header layout 2026-04-18 14:07:38 +03:00
Elian Doran 81ea86100f feat(revisions): add full date in tooltip 2026-04-18 13:52:19 +03:00
Elian Doran d086c8664b feat(revisions): improve layout of note revision list 2026-04-18 13:51:04 +03:00
Elian Doran 03d6c81659 chore(revisions): get rid of source tag 2026-04-18 13:35:47 +03:00
Elian Doran 270f135632 feat(revisions): add a fall-back title for revisions 2026-04-18 13:33:44 +03:00
Elian Doran 6436e56448 feat(revisions): display date in relative time 2026-04-18 13:30:09 +03:00
Elian Doran 315a97701b feat(revisions): add an icon based on the source 2026-04-18 13:26:38 +03:00
Elian Doran 927c359716 feat(revisions): basic rich diff 2026-04-18 13:22:09 +03:00
Elian Doran fc5252e6b8 feat(llm): provide description when saving a revision 2026-04-18 12:54:17 +03:00
Elian Doran 69e757459f feat(revisions): improve the list of revisions 2026-04-18 12:53:57 +03:00
Elian Doran 62189cfa04 refactor(revisions): extract inline styles to CSS 2026-04-18 12:48:03 +03:00
Elian Doran 4b35881889 feat(revisions): add a source field 2026-04-18 12:46:13 +03:00
green 1c508b830e Translated using Weblate (Japanese)
Currently translated at 100.0% (404 of 404 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ja/
2026-04-18 11:41:53 +02:00
green e5f97b6fdd Translated using Weblate (Japanese)
Currently translated at 100.0% (116 of 116 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/ja/
2026-04-18 11:41:53 +02:00
Francis C. 0bdebca2b6 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 89.7% (1760 of 1962 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hant/
2026-04-18 11:41:53 +02:00
passkal4 7dfdc7f31a Translated using Weblate (Uyghur)
Currently translated at 78.9% (94 of 119 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/ug/
2026-04-18 11:41:53 +02:00
passkal4 ec7b9e08e3 Translated using Weblate (Uyghur)
Currently translated at 23.0% (93 of 404 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ug/
2026-04-18 11:41:53 +02:00
Francis C. a915c60c38 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 99.2% (401 of 404 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/zh_Hant/
2026-04-18 11:41:53 +02:00
green 676a988433 Translated using Weblate (Japanese)
Currently translated at 99.9% (1961 of 1962 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2026-04-18 11:41:53 +02:00
Elian Doran 15951886bd Bundle of assigned issues (#9476) 2026-04-18 12:41:45 +03:00
Elian Doran 8aaa4d7bde feat(revisions): add a description field 2026-04-18 12:40:33 +03:00
Elian Doran a439e7c29b docs(user): sync 2026-04-18 12:30:12 +03:00
Elian Doran 85bd4790ac fix(markdown): wrong management of backtick-escaped triple backtips 2026-04-18 12:24:18 +03:00
Elian Doran 4876d4b8c6 chore: address requested changes 2026-04-18 12:21:27 +03:00
Elian Doran 81a54d8398 fix(dialogs): focus on first field in note type chooser (closes #9433) 2026-04-18 12:06:15 +03:00
Elian Doran 8e91a9eb0e chore(desktop): don't use subdirectory when changing electron path 2026-04-18 12:04:02 +03:00
Elian Doran 2a7309477c fix(desktop): handling of electron path not correct for portable installations 2026-04-18 12:01:58 +03:00
Adorian Doran 837cb37642 Merge branch 'main' of https://github.com/TriliumNext/Trilium into feat/about-dialog-overhaul 2026-04-18 11:58:15 +03:00
renovate[bot] c69e3b7e14 chore(deps): update dependency @redocly/cli to v2.28.0 2026-04-18 08:42:38 +00:00
Adorian Doran 7c3bb8c589 client: refactor 2026-04-18 11:22:16 +03:00
Adorian Doran 2c6c7cb037 client: create a fluid wrapper component 2026-04-18 11:15:18 +03:00
Elian Doran 8446e98b21 feat(text): add a copy button to bookmarks 2026-04-18 11:14:13 +03:00
Elian Doran 96ddb79d06 fix(text): add link doesn't clear bookmark section when removing the note selection 2026-04-18 11:07:13 +03:00
Elian Doran 4244b66cea feat(text): rebrand bookmarks to anchors 2026-04-18 11:06:50 +03:00
Elian Doran 15c121f950 docs(user): document linking to bookmarks 2026-04-18 10:54:57 +03:00
Adorian Doran 683814c9d2 client/about dialog: refactor 2026-04-18 10:47:20 +03:00
Elian Doran b01feed4a2 feat(text): add bookmark title for non-mirrored link 2026-04-18 10:45:51 +03:00
Adorian Doran 3ce2af9abe client/property sheet component: add support for CSS class names 2026-04-18 10:44:59 +03:00
Elian Doran 7219fc875d feat(text): improve display of reference links with bookmarks 2026-04-18 10:43:14 +03:00
Elian Doran 131e10f4fe fix(text): clicking on a bookmark link won't scroll properly 2026-04-18 10:35:46 +03:00
Adorian Doran 8cc5e0282e client/about dialog: refactor 2026-04-18 10:35:09 +03:00
Adorian Doran 426d5daf73 client/refactor: create a separate property sheet component 2026-04-18 10:34:47 +03:00
Elian Doran 480da09bcc fix(client): internalBookmark not hidden 2026-04-18 10:30:03 +03:00
Elian Doran ae004c4334 feat(text): basic insert link with anchors 2026-04-18 10:29:43 +03:00
Elian Doran 4dcbd36b2d feat(text): add a slash command for bookmarks 2026-04-18 10:22:58 +03:00
Adorian Doran 5539c901fe style/about dialog: make the property sheet responsive 2026-04-18 10:20:30 +03:00
Elian Doran 84fff30723 feat(server): mark bookmarks as internal links 2026-04-18 10:17:39 +03:00
Elian Doran bdf4e40577 fix(server): bookmarks not processed due to self-closing tag 2026-04-18 10:17:28 +03:00
Elian Doran 79d639108b feat(status_bar): display system links in dev mode 2026-04-18 10:12:41 +03:00
Elian Doran 5b957dd111 chore(server): start processing bookmarks 2026-04-18 10:09:41 +03:00
Elian Doran c0b1ff31e5 fix(server): safe import strips out bookmarks from note 2026-04-18 09:56:41 +03:00
Elian Doran cc010e1568 chore(desktop/appimage): fix path for packaging 2026-04-18 09:54:19 +03:00
Adorian Doran d240fb32bb style/about dialog: refactor 2026-04-18 09:49:05 +03:00
Elian Doran 374eeaeb08 feat(print): respect user's detail font when printing 2026-04-18 09:38:21 +03:00
Elian Doran 1674bf0a87 fix(print): wait for custom fonts to be loaded (closes #8097) 2026-04-18 09:28:54 +03:00
Elian Doran a617b59765 fix(print): text notes would override custom font 2026-04-18 09:26:50 +03:00
renovate[bot] e5daa75cb4 chore(deps): update node.js to v24.15.0 2026-04-18 02:36:30 +00:00
renovate[bot] a9e7cd7bfe chore(deps): update dependency officeparser to v6.1.0 2026-04-18 02:36:22 +00:00
renovate[bot] 84d46c0a29 fix(deps): update dependency react-i18next to v17.0.3 2026-04-18 02:34:41 +00:00
renovate[bot] 036d09f99e fix(deps): update dependency @codemirror/language-data to v6.5.2 2026-04-18 02:33:50 +00:00
renovate[bot] 6c2ce8f39c fix(deps): update ai sdk 2026-04-18 02:32:56 +00:00
renovate[bot] 77b89c5a01 chore(deps): update dependency wxt to v0.20.22 2026-04-18 02:32:03 +00:00
Elian Doran 65d3224c1a fix(tree): hidden notes appearing on root import (closes #5520) 2026-04-17 23:47:59 +03:00
Elian Doran 7d6fd54562 chore(client): fix TODO related to hidden node 2026-04-17 23:32:24 +03:00
Elian Doran 1a07dff373 feat(electron): disable terminal from portable mode 2026-04-17 23:29:38 +03:00
Elian Doran e99cf74988 feat(electron): customizable Electron directory (closes #4192) 2026-04-17 23:29:27 +03:00
Elian Doran 1acbf5ba45 feat(electron): generate appimage (closes #409) 2026-04-17 23:26:24 +03:00
Elian Doran 64bc1271e1 fix(server): prevent NaN potentially corrupting the backup when migrating 2026-04-17 23:03:28 +03:00
Elian Doran 06f7818ee3 Basic Markdown support (#9475) 2026-04-17 22:30:54 +03:00
Elian Doran a0548e1627 fix(deps): update dependency unpdf to v1.6.0 (#9469) 2026-04-17 22:27:21 +03:00
Elian Doran 2639c5a225 chore: fix typecheck error 2026-04-17 22:22:22 +03:00
Elian Doran bfc22864f6 Translations update from Hosted Weblate (#9474) 2026-04-17 22:04:05 +03:00
Elian Doran 69763c8b14 feat(markdown): render preview as Markdown 2026-04-17 21:41:35 +03:00
Elian Doran 75b4877c87 fix(import/mime): importing a Markdown file with conversion to text disabled is treated as file instead of code 2026-04-17 21:35:14 +03:00
Elian Doran 9ff466c9f5 docs: add more details to Markdown note type 2026-04-17 21:33:43 +03:00
Elian Doran 5f32d83c79 fix(markdown): always maintain horizontal layout 2026-04-17 21:24:43 +03:00
Elian Doran eb3adfa733 docs: add documentation on the new Markdown type 2026-04-17 20:59:00 +03:00
Elian Doran 80aac52066 feat(markdown): improve display mode selector on mobile 2026-04-17 20:40:36 +03:00
Elian Doran 0335ece20b fix(markdown): syncing doesn't work on read-only notes 2026-04-17 20:40:36 +03:00
Elian Doran e2d6fdb09a refactor(markdown): use different mechanism for syncing based on init 2026-04-17 20:40:36 +03:00
Elian Doran 79ea95cb39 Apply suggestions from code review
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-04-17 20:18:26 +03:00
Elian Doran 84bc385bab chore(markdown): add a small separator between buttons 2026-04-17 19:09:30 +03:00
Elian Doran 1af2a07a57 fix(markdown): align button order between layouts to avoid shifts 2026-04-17 19:09:08 +03:00
Elian Doran 98b92b7220 fix(markdown): read-only code not scrollable 2026-04-17 19:06:50 +03:00
Elian Doran 9b94d232a8 feat(layout): remove lock/unlock buttons in new layout 2026-04-17 18:58:33 +03:00
Elian Doran fef8b6f58e feat(client): handle editing temporarily mind map, canvas, spreadsheet & mermaid 2026-04-17 18:47:41 +03:00
noobhjy 7bb15029cf Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (403 of 403 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/zh_Hans/
2026-04-17 17:33:49 +02:00
green c328b858a4 Translated using Weblate (Japanese)
Currently translated at 99.9% (1957 of 1958 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2026-04-17 17:33:48 +02:00
noobhjy c2d5ba8e52 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 90.7% (1777 of 1958 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2026-04-17 17:33:47 +02:00
Hosted Weblate aa7615e72e Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/
2026-04-17 17:33:46 +02:00
Elian Doran e0c951e758 feat(attachments): display text attachments for file role 2026-04-17 18:31:42 +03:00
Elian Doran 9b1b0c5574 fix(import/enex): attachments were imported as files (closs #9473) 2026-04-17 18:15:52 +03:00
Elian Doran 1b4400db03 feat(split): use grouped buttons for view selectors 2026-04-17 12:20:36 +03:00
Elian Doran 9a3d160c34 chore(split): bring back lazy loading for editor 2026-04-17 12:10:56 +03:00
Elian Doran 8457c22be3 feat(split): smoother switching between view modes 2026-04-17 12:06:57 +03:00
Elian Doran fb5f89108f fix(split): source view not occupying the right width 2026-04-17 10:47:06 +03:00
Elian Doran b6144f3d09 chore(mermaid): add view changer 2026-04-17 10:45:54 +03:00
Elian Doran 5fe6611a91 refactor(markdown): handle source view at split editor level 2026-04-17 10:33:21 +03:00
Elian Doran 8760d683a3 feat(markdown): add a display mode switcher 2026-04-17 10:29:21 +03:00
renovate[bot] 07a22722ae chore(deps): update softprops/action-gh-release action to v3 2026-04-17 06:46:59 +00:00
Elian Doran 9565c398f8 chore(deps): update softprops/action-gh-release action to v2.6.2 (#9462) 2026-04-17 09:45:28 +03:00
Elian Doran d22b0079dc feat(markdown): add read-only toggle button 2026-04-17 08:24:43 +03:00
Elian Doran dee9959d5b feat(markdown): don't alter h1 and h2 2026-04-17 08:17:48 +03:00
Elian Doran 3f39e6f7f1 feat(client): mark spreadsheet and markdown as new note types 2026-04-17 08:15:23 +03:00
Elian Doran f03e527cb0 feat(markdown): integrate into note types 2026-04-17 08:14:02 +03:00
Elian Doran 66819cb73f fix(export/markdown): wrong extension (.mkd or .code) 2026-04-17 08:06:26 +03:00
Elian Doran 9f4c3ed35a feat(markdown): basic support hash-based wikilinks 2026-04-17 07:49:38 +03:00
Elian Doran e33446c219 feat(markdown): flickerless Markdown rendering even when changing it 2026-04-17 07:46:17 +03:00
Elian Doran daf5740610 feat(markdown): use a Mermaid cache to avoid flicker while editing something else 2026-04-17 07:41:30 +03:00
Elian Doran 9464e2aff5 feat(markdown): respect heading style 2026-04-17 07:39:06 +03:00
Elian Doran 5ef74d5639 fix(markdown): mermaid not rendering 2026-04-17 07:35:17 +03:00
Elian Doran 822e7ffbab feat(markdown): support full feature set (math, admonitions) 2026-04-17 07:32:08 +03:00
Elian Doran 11b0bec47d chore(markdown): improve max width of Mermaid diagrams 2026-04-17 07:15:39 +03:00
Elian Doran 0c051327cf feat(markdown): render with ReadOnlyText 2026-04-17 07:13:46 +03:00
Elian Doran e943891e2f chore(markdown): improve code margins when scrolling 2026-04-17 07:09:36 +03:00
Elian Doran 438442345e feat(codemirror): enable nested syntax highlighting for MD (closes #9150) 2026-04-17 07:05:01 +03:00
Elian Doran d2c51d5175 chore(deps): update dependency dotenv to v17.4.2 (#9459) 2026-04-17 07:02:15 +03:00
Elian Doran 12e07dbfcd feat(markdown): basic block highlighting in preview 2026-04-17 07:00:07 +03:00
Elian Doran dbe37730c3 chore(markdown): make preview selectable 2026-04-17 06:52:01 +03:00
Elian Doran 0dfbfaa61c refactor(markdown): get rid of DOM queries 2026-04-17 06:51:31 +03:00
Elian Doran f1d557645c fix(deps): update ai sdk (#9464) 2026-04-17 06:50:33 +03:00
Elian Doran 08e3a4aefc chore(deps): update dependency rollup-plugin-webpack-stats to v3.1.1 (#9460) 2026-04-17 06:50:19 +03:00
Elian Doran ff215bd228 chore(deps): update dependency sanitize-html to v2.17.3 [security] (#9458) 2026-04-17 06:50:00 +03:00
Elian Doran dc57d6131a refactor(markdown): clean up a bit the sync rendering 2026-04-17 06:46:04 +03:00
Elian Doran 3417f82e27 feat(markdown): basic block-based sync 2026-04-17 06:43:50 +03:00
Elian Doran 1ec270dba2 feat(markdown): basic percentage-based scroll 2026-04-17 06:38:12 +03:00
Elian Doran 6d2496599f feat(markdown): make preview scrollable 2026-04-17 06:35:45 +03:00
Elian Doran 18d69f94d2 feat(markdown): introduce some padding 2026-04-17 06:32:49 +03:00
Elian Doran b84e50065c feat(markdown): compact title 2026-04-17 06:29:27 +03:00
Elian Doran 81c266f69b fix(markdown): scroll padding affecting height 2026-04-17 06:25:47 +03:00
Elian Doran e9d8aa82f4 feat(markdown): basic note type integration 2026-04-17 06:20:59 +03:00
renovate[bot] da76d4c50e chore(deps): update dependency dotenv to v17.4.2 2026-04-17 03:08:59 +00:00
Elian Doran ec7f6a9325 chore(deps): update dependency wxt to v0.20.21 (#9461) 2026-04-17 06:05:32 +03:00
Elian Doran 28e33e3c58 chore(deps): update typescript-eslint monorepo to v8.58.2 (#9463) 2026-04-17 06:03:12 +03:00
Elian Doran c6ee5fabee chore(deps): update dependency happy-dom to v20.9.0 (#9465) 2026-04-17 06:02:23 +03:00
Elian Doran 1048ecb7c0 chore(deps): update dependency stylelint to v17.7.0 (#9466) 2026-04-17 06:01:54 +03:00
renovate[bot] b1af1510f4 fix(deps): update ai sdk 2026-04-17 03:01:17 +00:00
Elian Doran 944d0542b6 fix(deps): update dependency globals to v17.5.0 (#9468) 2026-04-17 06:01:12 +03:00
Elian Doran cee2338c1b fix(deps): update dependency diff to v9 (#9471) 2026-04-17 06:00:12 +03:00
Elian Doran 93db35518a fix(deps): update dependency better-sqlite3 to v12.9.0 (#9467) 2026-04-17 05:59:06 +03:00
renovate[bot] 63dcdc4e83 fix(deps): update dependency diff to v9 2026-04-17 00:15:19 +00:00
renovate[bot] 5a073398ed fix(deps): update dependency unpdf to v1.6.0 2026-04-17 00:14:36 +00:00
renovate[bot] 6166a8df43 fix(deps): update dependency globals to v17.5.0 2026-04-17 00:13:59 +00:00
renovate[bot] 57c3f2df17 fix(deps): update dependency better-sqlite3 to v12.9.0 2026-04-17 00:13:22 +00:00
renovate[bot] 244d0f5568 chore(deps): update dependency stylelint to v17.7.0 2026-04-17 00:12:43 +00:00
renovate[bot] eb426ca3a7 chore(deps): update dependency happy-dom to v20.9.0 2026-04-17 00:12:04 +00:00
renovate[bot] d17634aaa8 chore(deps): update typescript-eslint monorepo to v8.58.2 2026-04-17 00:10:44 +00:00
renovate[bot] 78efebaeea chore(deps): update softprops/action-gh-release action to v2.6.2 2026-04-17 00:10:01 +00:00
renovate[bot] 4357901c24 chore(deps): update dependency wxt to v0.20.21 2026-04-17 00:09:53 +00:00
renovate[bot] 8b8a955782 chore(deps): update dependency rollup-plugin-webpack-stats to v3.1.1 2026-04-17 00:09:11 +00:00
renovate[bot] 5153306a68 chore(deps): update dependency sanitize-html to v2.17.3 [security] 2026-04-16 21:12:03 +00:00
Elian Doran fc2d171fcf Translations update from Hosted Weblate (#9456) 2026-04-16 23:25:35 +03:00
green ab10a19932 Translated using Weblate (Japanese)
Currently translated at 99.9% (1956 of 1957 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2026-04-16 22:15:03 +02:00
Elian Doran 3f9b26d42c feat(nix): experiment with reusing deps when source code changes 2026-04-16 23:14:50 +03:00
Elian Doran bf9ee98406 docs(user): add license 2026-04-16 23:05:01 +03:00
Elian Doran 3dc93fde37 feat(desktop): disable cache in dev mode 2026-04-16 23:00:57 +03:00
Elian Doran 8ec6125ec4 fix(launch_bar): some context menus intercepted by browser 2026-04-16 23:00:41 +03:00
Elian Doran 999bfbc118 feat(launch_bar): add a context menu to every option to easily remove them 2026-04-16 22:52:02 +03:00
Elian Doran 889e44363a feat(client): make view source searchable 2026-04-16 22:26:56 +03:00
Elian Doran 53413be08c fex: UI overlap in attribute editing (#9453) 2026-04-16 21:49:53 +03:00
Adorian Doran 28b1eb71ba Merge branch 'main' of https://github.com/TriliumNext/Trilium into feat/about-dialog-overhaul 2026-04-16 21:08:39 +03:00
Adorian Doran 4bc1d93b75 style/about dialog: lower CSS selector specificity 2026-04-16 21:07:47 +03:00
Zaki Ur Rehman f64b029009 refactor: ensure only the changed lines are shown 2026-04-16 23:04:29 +05:00
Adorian Doran d65d7dba3f client/about dialog: refactor 2026-04-16 21:04:06 +03:00
Adorian Doran 12a83510ed style/about dialog: add a different background color for nightly builds 2026-04-16 20:59:05 +03:00
Zaki Ur Rehman b2f02962fc refactor: show only modified lines 2026-04-16 22:54:48 +05:00
Adorian Doran 262c89d252 style/about dialog: tweak the tooltip clues 2026-04-16 20:48:53 +03:00
Adorian Doran 7f75ab0638 client/about dialog: define the strings for a brief history 2026-04-16 20:47:30 +03:00
Elian Doran 30a82f3cfc Translations update from Hosted Weblate (#9455) 2026-04-16 18:45:40 +03:00
Hosted Weblate 011cce05af Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/
2026-04-16 17:27:19 +02:00
noobhjy 735712123c Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 88.8% (1716 of 1932 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2026-04-16 17:27:17 +02:00
passkal4 603b232d1f Translated using Weblate (Uyghur)
Currently translated at 21.3% (86 of 403 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ug/
2026-04-16 17:27:16 +02:00
Elian Doran ce836bccc2 Translations update from Hosted Weblate (#9454) 2026-04-16 18:26:58 +03:00
Elian Doran d8db862c22 test(client,server): guard against duplicate JSON keys 2026-04-16 18:25:37 +03:00
Elian Doran d2836ef84c fix revisions dialog shows translation keys instead of values (#9447) 2026-04-16 18:22:46 +03:00
Hosted Weblate 09d1c85bd3 Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/
2026-04-16 17:06:46 +02:00
Elian Doran e88cb60711 Translations update from Hosted Weblate (#9452) 2026-04-16 18:06:28 +03:00
Zaki Ur Rehman 6bc3176251 fix: resolve context menu state reset issue causing UI text overlap 2026-04-16 18:29:57 +05:00
Zaki Ur Rehman c888826192 fex: UI overlap in attribute editing 2026-04-16 18:06:14 +05:00
Aindriú Mac Giolla Eoin cd6f63a908 Translated using Weblate (Irish)
Currently translated at 99.9% (1931 of 1932 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ga/
2026-04-16 12:44:52 +02:00
Aindriú Mac Giolla Eoin c36264203f Translated using Weblate (Irish)
Currently translated at 100.0% (403 of 403 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ga/
2026-04-16 12:44:48 +02:00
Elian Doran 1044776218 Translations update from Hosted Weblate (#9448) 2026-04-16 08:57:16 +03:00
passkal4 093e671fb5 Translated using Weblate (Uyghur)
Currently translated at 52.1% (62 of 119 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/ug/
2026-04-16 05:50:57 +00:00
passkal4 0e76f412ec Translated using Weblate (Uyghur)
Currently translated at 14.3% (58 of 403 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ug/
2026-04-16 05:50:56 +00:00
passkal4 1154a1f7bf Translated using Weblate (Uyghur)
Currently translated at 51.2% (61 of 119 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/ug/
2026-04-16 05:50:55 +00:00
green 062d0863a1 Translated using Weblate (Japanese)
Currently translated at 99.9% (1931 of 1932 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2026-04-16 05:50:54 +00:00
passkal4 8b202b6760 Translated using Weblate (Uyghur)
Currently translated at 14.1% (57 of 403 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ug/
2026-04-16 05:50:53 +00:00
Ulices 2fc907e756 Translated using Weblate (Spanish)
Currently translated at 85.3% (1649 of 1932 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/es/
2026-04-16 05:50:52 +00:00
Hosted Weblate 5218373f3e Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/
2026-04-16 05:50:51 +00:00
Elian Doran 6221f17beb Update dependency ejs to v5.0.2 (#9427) 2026-04-16 08:50:43 +03:00
Elian Doran f96f64bd84 Update dependency typedoc to v0.28.19 (#9428) 2026-04-16 08:50:12 +03:00
Elian Doran 13cdba199a Update dependency reveal.js to v6.0.1 (#9430) 2026-04-16 08:49:43 +03:00
Elian Doran 4aa4d4880d Update univer monorepo to v0.20.1 (#9431) 2026-04-16 08:49:07 +03:00
Elian Doran 51f1559473 Update dependency @ai-sdk/google to v3.0.62 (#9429) 2026-04-16 08:47:47 +03:00
Elian Doran ff9f0ad676 Update dependency dompurify to v3.4.0 [SECURITY] (#9445) 2026-04-16 08:47:13 +03:00
contributor 7e3683b8c2 fix revisions dialog shows translation keys instead of values 2026-04-16 08:14:30 +03:00
renovate[bot] 0df186ef7d Update dependency dompurify to v3.4.0 [SECURITY] 2026-04-16 04:07:11 +00:00
renovate[bot] ff3b6c4011 Update univer monorepo to v0.20.1 2026-04-15 20:51:08 +00:00
renovate[bot] 0b5332fbb3 Update dependency typedoc to v0.28.19 2026-04-15 20:50:32 +00:00
renovate[bot] f285f7e14f Update dependency reveal.js to v6.0.1 2026-04-15 20:49:57 +00:00
renovate[bot] 794ad9410b Update dependency ejs to v5.0.2 2026-04-15 20:49:25 +00:00
renovate[bot] 60f3ddd354 Update dependency @ai-sdk/google to v3.0.62 2026-04-15 20:48:53 +00:00
Elian Doran 20235509ef Translations update from Hosted Weblate (#9432) 2026-04-15 23:43:47 +03:00
green 0ece1270c7 Translated using Weblate (Japanese)
Currently translated at 99.9% (1919 of 1920 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2026-04-15 22:38:49 +02:00
passkal4 a32eeb27e3 Translated using Weblate (Uyghur)
Currently translated at 87.9% (139 of 158 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/ug/
2026-04-15 22:38:48 +02:00
Hosted Weblate e50ef8552b Update translation files
Updated by "Remove blank strings" add-on in Weblate.

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/
2026-04-15 22:38:48 +02:00
seb2020 c34df3a17a Translated using Weblate (French)
Currently translated at 88.8% (1671 of 1880 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/fr/
2026-04-15 22:38:47 +02:00
passkal4 48e90396bd Translated using Weblate (Uyghur)
Currently translated at 8.4% (159 of 1880 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ug/
2026-04-15 22:38:46 +02:00
passkal4 d147bbe63d Translated using Weblate (Uyghur)
Currently translated at 1.4% (6 of 403 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ug/
2026-04-15 22:38:45 +02:00
passkal4 a82d9dad1b Translated using Weblate (Uyghur)
Currently translated at 6.7% (8 of 119 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/ug/
2026-04-15 22:38:45 +02:00
passkal4 5ad0cb2b4b Translated using Weblate (Uyghur)
Currently translated at 3.1% (5 of 158 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/ug/
2026-04-15 22:38:44 +02:00
passkal4 a0e9082364 Translated using Weblate (Uyghur)
Currently translated at 1.4% (28 of 1880 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ug/
2026-04-15 22:38:43 +02:00
passkal4 1442041cda Added translation using Weblate (Uyghur) 2026-04-15 22:38:43 +02:00
passkal4 4b9d253745 Added translation using Weblate (Uyghur) 2026-04-15 22:38:42 +02:00
passkal4 3c0d5b7614 Added translation using Weblate (Uyghur) 2026-04-15 22:38:42 +02:00
passkal4 f0293b7f07 Added translation using Weblate (Uyghur) 2026-04-15 22:38:41 +02:00
green 2bf2d977ad Translated using Weblate (Japanese)
Currently translated at 99.9% (1879 of 1880 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2026-04-15 22:38:41 +02:00
Marcel 7e1090c59d Translated using Weblate (German)
Currently translated at 100.0% (403 of 403 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/de/
2026-04-15 22:38:40 +02:00
Ulices a4c419de6f Translated using Weblate (Spanish)
Currently translated at 87.0% (1637 of 1880 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/es/
2026-04-15 22:38:39 +02:00
green 263479adee Translated using Weblate (Japanese)
Currently translated at 100.0% (403 of 403 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ja/
2026-04-15 22:38:39 +02:00
Artyom Rybakov c0c0cea376 Translated using Weblate (Russian)
Currently translated at 100.0% (403 of 403 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ru/
2026-04-15 22:38:38 +02:00
Artyom Rybakov 1bf36574e2 Translated using Weblate (Russian)
Currently translated at 91.8% (1726 of 1880 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ru/
2026-04-15 22:38:38 +02:00
Marcel 3ed6297011 Translated using Weblate (German)
Currently translated at 91.8% (1726 of 1880 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/de/
2026-04-15 22:38:37 +02:00
Ulices 3bd98d6a1b Translated using Weblate (Spanish)
Currently translated at 100.0% (403 of 403 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/es/
2026-04-15 22:38:36 +02:00
Elian Doran ecc872828c Feature/small improvements (#9440) 2026-04-15 23:38:27 +03:00
Elian Doran 9c5d6e0a19 Merge branch 'main' into feature/small_improvements 2026-04-15 22:47:05 +03:00
Elian Doran 98d718031b test(commons): fix failure in locale 2026-04-15 22:46:24 +03:00
Elian Doran 9bd78c5f83 feat(print): display detailed error on print failure 2026-04-15 22:45:23 +03:00
Elian Doran 598317ea6e chore: add reproduction sample for printing issue 2026-04-15 22:43:34 +03:00
Elian Doran 99878a1d48 fix(print): overlapping toasts on error 2026-04-15 22:40:09 +03:00
Elian Doran 264021360a fix(print): infinite re-rendering when changing an option 2026-04-15 22:04:35 +03:00
Elian Doran ae4dc53647 chore: address requested changes 2026-04-15 21:58:35 +03:00
Elian Doran 6dd51f66ab Merge branch 'main' into feature/small_improvements 2026-04-15 19:07:43 +03:00
Elian Doran 61262e899b chore(commons): fix typecheck 2026-04-15 19:06:24 +03:00
Elian Doran 0ebec2ce5d refactor(print): simplify and modularize 2026-04-15 18:51:20 +03:00
Elian Doran 6225f92a7d feat(print): add printer descriptions 2026-04-15 18:33:18 +03:00
Elian Doran 6c9ffe1d80 feat(print): use dropdown with icons for printers 2026-04-15 18:25:13 +03:00
Elian Doran 9116cbcba4 feat(code): adjust word wrap through note actions 2026-04-15 18:18:37 +03:00
Elian Doran d0e61e39d0 feat(print): selectable printer 2026-04-15 18:17:28 +03:00
Elian Doran c691a9c6e6 feat(code): adjustable word wrap at note level 2026-04-15 18:02:54 +03:00
Elian Doran 94e70c0318 feat(print): integrate with print preview and merge with export to PDF 2026-04-15 17:37:27 +03:00
Elian Doran edb2ec2a6f feat(code): normalize indentation 2026-04-15 17:34:30 +03:00
Elian Doran f68a481edc feat(print/pdf): disable selection in preview 2026-04-15 17:14:44 +03:00
Elian Doran 3a1f0b2be1 chore(code): fix inconsistency in status bar naming 2026-04-15 17:14:15 +03:00
Elian Doran bf5d6c4e01 feat(print/pdf): basic support for printing only a subset of pages 2026-04-15 10:26:25 +03:00
Elian Doran ba13f86f5f feat(print/pdf): improve error management 2026-04-15 10:10:28 +03:00
Elian Doran e7c30927f7 chore(print/pdf): bring back footers regardless of margin 2026-04-15 10:08:24 +03:00
Elian Doran 634b2b3a84 chore(print/pdf): bring back 2cm as the default margin 2026-04-15 09:59:47 +03:00
Elian Doran 83cb437133 fix(print/pdf): default / none / minimum margins appearing the same 2026-04-15 09:58:36 +03:00
Elian Doran 37e8514400 chore(print/pdf): align margin selector 2026-04-15 09:52:15 +03:00
Elian Doran 341a5310e1 feat(code): basic tabs vs spaces 2026-04-15 09:42:20 +03:00
Elian Doran 9e4a5c892e feat(print/pdf): basic support for margins 2026-04-15 09:41:45 +03:00
Elian Doran 307536b70f feat(code): separate reindentation from display width 2026-04-15 09:33:06 +03:00
Elian Doran f12d73a5c7 feat(code): reindent on changing tab width 2026-04-15 09:14:55 +03:00
Elian Doran b20e2459c3 refactor(code): simplify status bar widget 2026-04-15 09:06:47 +03:00
Elian Doran 692a31772d feat(code): status bar indentation selector 2026-04-15 09:01:23 +03:00
Elian Doran 6a05288be4 feat(code): adjustable tab width via attribute 2026-04-14 23:58:01 +03:00
Elian Doran fc82b9374e feat(print/pdf): debounce rendering when changing scale 2026-04-14 23:51:14 +03:00
Elian Doran 457bba9337 feat(print/pdf): basic support for scale 2026-04-14 23:48:12 +03:00
Elian Doran 249b08f1ce fix(options): code preview doesn't reflect tab width 2026-04-14 23:40:39 +03:00
Elian Doran 54a6e3d9a1 feat(code): adjustable default tab width 2026-04-14 23:33:32 +03:00
Elian Doran f7a36fc997 feat(print/pdf): adjustable page size 2026-04-14 23:31:05 +03:00
Elian Doran 1952b44141 chore(print/pdf): make use of attribute for adjusting orientation 2026-04-14 23:24:37 +03:00
Elian Doran cd84e6ba08 fix(text): tab width is reset when component is re-rendered 2026-04-14 23:10:57 +03:00
Elian Doran 454c18ff0e feat(print/pdf): use segmented buttons instead of toggle 2026-04-14 23:10:13 +03:00
Elian Doran 4d4e63998f feat(print/pdf): add toggle for landscape 2026-04-14 22:58:15 +03:00
Elian Doran 2db1e2d750 fix(server): HMR WS port interferes between server & desktop 2026-04-14 22:50:06 +03:00
Elian Doran cb03f3cec5 chore(text): tab width doesn't adjust when pressing the spinner 2026-04-14 22:33:29 +03:00
Elian Doran b2ec9a2f47 chore(text): make sure tab size constant is available regardless of theme 2026-04-14 22:30:53 +03:00
Elian Doran 71b3ee143f feat(print): basic PDF preview 2026-04-14 22:30:29 +03:00
Elian Doran 22eb2697d5 feat(text): adjustable tab width (closes #5701) 2026-04-14 22:25:20 +03:00
Elian Doran 59994a5877 feat(find): allow searching in view source 2026-04-14 22:21:29 +03:00
Elian Doran c35bc6fbd2 feat(options): add tab width selector 2026-04-14 22:15:13 +03:00
Elian Doran 2d6c2b2cd0 test(server): validate tesseract language codes 2026-04-14 21:59:01 +03:00
Elian Doran 6b6573bf02 feat(i18n: set up Uyghur as content language 2026-04-14 21:54:33 +03:00
Elian Doran 278da994ce fix(server): wrong DB version (closes #9418) 2026-04-14 21:43:38 +03:00
Elian Doran ab00772559 chore(deps): update pnpm/action-setup action to v6 (#9417) 2026-04-14 17:30:47 +03:00
Elian Doran 49e432fb66 fix(deps): update ai sdk (#9416) 2026-04-14 08:32:21 +03:00
renovate[bot] 6f73ea5847 fix(deps): update ai sdk 2026-04-14 04:57:36 +00:00
renovate[bot] 743db3a9cd chore(deps): update pnpm/action-setup action to v6 2026-04-14 00:38:33 +00:00
Elian Doran b899a0b5f8 fix(link): file URLs not working with Unicode characters on Windows (closes #8973) 2026-04-13 21:06:59 +03:00
Elian Doran c6ea68c012 feat(link): add an error when link couldn't be opened 2026-04-13 21:06:59 +03:00
Elian Doran 9fc750533c fix(mermaid): nbsp entity causing issues (closes #9413) 2026-04-13 21:06:58 +03:00
Elian Doran 7d52c62155 Translations update from Hosted Weblate (#9414) 2026-04-13 20:00:27 +03:00
Hosted Weblate 27801a859a Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/
2026-04-13 16:27:14 +00:00
Giovi 25a28abb2d Translated using Weblate (Italian)
Currently translated at 100.0% (402 of 402 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/it/
2026-04-13 16:27:08 +00:00
noobhjy 591a9a6963 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 97.3% (1819 of 1869 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2026-04-13 16:27:07 +00:00
Giovi f2815de17e Translated using Weblate (Italian)
Currently translated at 99.9% (1868 of 1869 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/it/
2026-04-13 16:27:07 +00:00
Elian Doran b61b5100f0 Settings improvements (#9412) 2026-04-13 19:26:53 +03:00
Elian Doran 51f06f064e e2e(options): fix changes to options 2026-04-13 19:17:38 +03:00
Elian Doran 27ed4165dc chore(options): address requested changes 2026-04-13 19:13:10 +03:00
Elian Doran 24167c0691 e2e(options): fix i18n change 2026-04-13 19:12:10 +03:00
Elian Doran 203c725e0c i18n(server): password not correct 2026-04-13 18:21:41 +03:00
Elian Doran 9326751923 feat(options/password): use modals for changing the password 2026-04-13 18:18:04 +03:00
Elian Doran 9ba1eeaf20 feat(options/password): use options row for protected session timeout 2026-04-13 18:14:39 +03:00
Elian Doran ae676f38d3 fix(options): automatic read-only size confused with OTP by KeepassXC
See https://github.com/keepassxreboot/keepassxc-browser/issues/2282
2026-04-13 18:12:22 +03:00
Elian Doran 1765917393 refactor(options): remove workaround for title sections 2026-04-13 18:10:33 +03:00
Elian Doran 02336f4e53 feat(options/other): improve predefined search engines 2026-04-13 18:02:25 +03:00
Elian Doran 3ce508c5ee feat(options/other): improve descriptions 2026-04-13 17:52:54 +03:00
Elian Doran 266f542028 feat(options/other): improve desktop-specific options 2026-04-13 17:50:37 +03:00
Elian Doran 0f605ba994 feat(options/appearance): improve desktop-specific options 2026-04-13 17:45:23 +03:00
Elian Doran d4333400c4 refactor(options/appearance): use simpler mechanism for theme note icon 2026-04-13 17:39:57 +03:00
Elian Doran 7180569357 feat(options/appearance): display icon for custom themes 2026-04-13 17:37:39 +03:00
Elian Doran b88eaaeeec feat(options/appearance): group and add icons to theme selector 2026-04-13 17:34:49 +03:00
Elian Doran b9e8cd5697 chore(options/appearance): integrate application theme into first section 2026-04-13 17:29:32 +03:00
Elian Doran 92d011503d feat(options/appearance): improve content width section 2026-04-13 17:26:37 +03:00
Elian Doran a62a7e351e feat(options/appearance): use toggles everywhere 2026-04-13 17:23:25 +03:00
Elian Doran 19e07bc6fd chore(options/appearance): improve font description slightly 2026-04-13 17:21:57 +03:00
Elian Doran f9b0a88a4e fix(options/appearance): theme defined not previewed correctly 2026-04-13 17:19:40 +03:00
Elian Doran 00b85bb7bd feat(options/appearance): improve font buttons 2026-04-13 17:18:20 +03:00
Elian Doran 17fb3f576d chore(options/appearance): improve font buttons 2026-04-13 17:09:41 +03:00
Elian Doran 49878d64aa chore(options/appearance): integrate font description properly 2026-04-13 17:07:03 +03:00
Elian Doran 368dd1adc4 fix(options/appearance): font modal styles are affected 2026-04-13 17:05:18 +03:00
Elian Doran 2e8f6a495b feat(options/appearance): use modal for font selection 2026-04-13 17:01:46 +03:00
Elian Doran 2a23b8a868 feat(options/appearance): add font preview in dropdown 2026-04-13 16:56:43 +03:00
Elian Doran 8e56585575 feat(options/appearance): improve font selection further 2026-04-13 16:53:45 +03:00
Elian Doran 80f40a439c feat(options/appearance): improve font selection 2026-04-13 16:45:01 +03:00
Elian Doran 9d49324557 feat(options/text): improve formatting toolbar 2026-04-13 16:41:33 +03:00
Elian Doran 85ebe59a3b feat(options/appearance): merge layout style with orientation 2026-04-13 16:38:25 +03:00
Elian Doran 692d33bedf feat(options/appearance): add illustration for vertical/horizontal layout 2026-04-13 16:36:51 +03:00
Elian Doran cd0763e807 feat(options/text): add visual representation for layout 2026-04-13 16:32:37 +03:00
Elian Doran 93920bdfb4 feat(options/text): add for heading style & formatting toolbar 2026-04-13 16:31:43 +03:00
Elian Doran 09fdcb3839 chore(options/text): merge multiple options into single section 2026-04-13 16:27:48 +03:00
Elian Doran 6ff7219300 chore(options/text): use options row for code blocks 2026-04-13 16:22:06 +03:00
Elian Doran 7e246f599d chore(options/text): use options row for features 2026-04-13 16:20:36 +03:00
Elian Doran f422155dee chore(options/code): use options row for apperance 2026-04-13 16:18:40 +03:00
Elian Doran 05d4d3a1a2 chore(options/code): merge sections 2026-04-13 16:15:54 +03:00
Elian Doran d716fec524 chore(options/backup): use action button for download 2026-04-13 16:11:02 +03:00
Elian Doran 66347e4bad chore(options/backup): merge the sections together 2026-04-13 16:09:48 +03:00
Elian Doran e740e729c3 chore(options/sync): get rid of save button 2026-04-13 16:03:21 +03:00
Elian Doran 4baa22a01a chore(options/sync): floating help button 2026-04-13 16:00:37 +03:00
Elian Doran 7c1f509eca chore(options/sync): merge sections and use options row 2026-04-13 15:56:41 +03:00
Elian Doran 0ead37fd5c chore(options/other): use toggles 2026-04-13 15:48:59 +03:00
Elian Doran a33de6454f chore(options/other): improve section titles 2026-04-13 15:26:13 +03:00
Elian Doran 4a9e7c843e chore(options/other): merge note revisions 2026-04-13 15:22:52 +03:00
Elian Doran 1f6c88dcc1 chore(options/other): use options row for inputs with unit 2026-04-13 15:21:03 +03:00
Elian Doran 43d9d726f8 chore(options/i18n): simplify first week of the year 2026-04-13 15:15:21 +03:00
Elian Doran c5667d9141 chore(options/advanced): move sync at the bottom 2026-04-13 15:11:42 +03:00
Elian Doran 7455d235d1 chore(options/advanced): use options row for database anonymization 2026-04-13 15:11:10 +03:00
Elian Doran 3dc0d25c4d chore(options/advanced): merge database-related options 2026-04-13 15:01:51 +03:00
Elian Doran c352d46a5b chore(options/advanced): use options row for database integrity check 2026-04-13 14:59:31 +03:00
Elian Doran c262187496 chore(options/advanced): use options row for sync 2026-04-13 14:56:45 +03:00
Elian Doran 0c5a8a24da refactor(options): create OptionsRowWithToggle 2026-04-13 14:40:46 +03:00
Elian Doran e5a9622720 fix(note_actions): copy reference to clipboard button not working (closes #9406) 2026-04-13 14:21:24 +03:00
Elian Doran ad864cfe48 feat(search): try to improve search performance through some creative mechanisms... (#9034) 2026-04-13 14:17:24 +03:00
Elian Doran f58dd12983 chore(search): use loop to prevent nested strip tags injection 2026-04-13 14:03:17 +03:00
Elian Doran e40504b7f0 chore(search): address requested changes 2026-04-13 13:43:25 +03:00
Elian Doran 301f23cd2d test(server): clean up search scripts 2026-04-13 13:38:06 +03:00
Elian Doran 885e94cf58 test(server): migrate database 2026-04-13 13:30:53 +03:00
Elian Doran 6763f4f403 chore(becca): add log for cache memory consumption 2026-04-13 13:29:58 +03:00
Elian Doran ead70ad394 fix(autocomplete): fuzzy search not working if the search one was not enabled 2026-04-13 13:20:42 +03:00
Elian Doran 597c6eb15b chore(options): improve descriptions for search 2026-04-13 13:14:45 +03:00
Elian Doran 47ce77e04c refactor(search): simplify branching for autocomplete 2026-04-13 13:05:54 +03:00
Elian Doran 6e90a4168e feat(autocomplete): toggle for fuzzy matching (closes #8360) 2026-04-13 13:03:29 +03:00
Elian Doran 9b2be57365 docs: remove search analysis 2026-04-13 12:56:50 +03:00
Elian Doran 5ba7803ea9 Merge branch 'main' into feat/search-perf-take1
Resolved conflicts:
- search_result.ts: Keep optimized index-based token iteration
- search.ts: Merge OCR text representation support with perf optimizations

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-04-13 12:45:24 +03:00
Elian Doran 88743f158b chore(deps): update dependency vite to v8.0.8 (#9398) 2026-04-13 10:25:30 +03:00
Elian Doran f360b1fb55 fix(etapi): correct calendar year/month endpoint descriptions and year pattern; docs: add trilium-fastmcp integration (#9383) 2026-04-13 09:59:45 +03:00
Elian Doran dda9e51a37 Translations update from Hosted Weblate (#9404) 2026-04-13 09:58:37 +03:00
Elian Doran ef9002dede Apply suggestion from @gemini-code-assist[bot]
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-04-13 09:58:13 +03:00
renovate[bot] 37df2dd9b2 chore(deps): update dependency vite to v8.0.8 2026-04-13 06:57:10 +00:00
green 7ec5945517 Translated using Weblate (Japanese)
Currently translated at 100.0% (402 of 402 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ja/
2026-04-13 06:56:53 +00:00
Aindriú Mac Giolla Eoin 0150b5b61e Translated using Weblate (Irish)
Currently translated at 99.9% (1863 of 1864 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ga/
2026-04-13 06:56:53 +00:00
green d41d727950 Translated using Weblate (Japanese)
Currently translated at 99.9% (1863 of 1864 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2026-04-13 06:56:52 +00:00
Aindriú Mac Giolla Eoin 224c31d16b Translated using Weblate (Irish)
Currently translated at 100.0% (402 of 402 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ga/
2026-04-13 06:56:51 +00:00
noobhjy b67bd01858 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 97.5% (1818 of 1864 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2026-04-13 06:56:51 +00:00
Elian Doran 5459ec33df fix(deps): update ai sdk (#9400) 2026-04-13 09:56:43 +03:00
Elian Doran 59999e5adc chore(deps): update vitest monorepo to v4.1.4 (#9399) 2026-04-13 09:54:16 +03:00
Elian Doran fc009923e5 chore(deps): update ckeditor5 config packages to v14.1.0 (#9401) 2026-04-13 09:53:27 +03:00
Elian Doran 9303f54026 chore(deps): update actions/github-script action to v9 (#9402) 2026-04-13 09:52:32 +03:00
renovate[bot] 7e30b8c029 chore(deps): update actions/github-script action to v9 2026-04-13 01:37:35 +00:00
renovate[bot] c1596d2a25 chore(deps): update ckeditor5 config packages to v14.1.0 2026-04-13 01:37:28 +00:00
renovate[bot] 2411d7bc76 fix(deps): update ai sdk 2026-04-13 01:36:47 +00:00
renovate[bot] a44ff4c78b chore(deps): update vitest monorepo to v4.1.4 2026-04-13 01:36:07 +00:00
Elian Doran f9aaccdfe2 chore(docker): set up tooling for building better-sqlite3 from scratch 2026-04-13 01:06:34 +03:00
Elian Doran 4c02d70dae fix(toc): not rendering math the first time 2026-04-13 00:08:40 +03:00
Adorian Doran e6db4a51d1 client/about dialog: update the version format 2026-04-12 21:13:00 +03:00
Adorian Doran d3c927ed88 style/about dialog: exclude the brackets from the contributor role tooltip cue 2026-04-12 20:59:29 +03:00
Adorian Doran 3a8f0e0fcd Merge branch 'main' of https://github.com/TriliumNext/Trilium into feat/about-dialog-overhaul 2026-04-12 18:52:49 +03:00
Elian Doran 9a427f4b9f chore(client): dev server not working due to prefresh bug
See https://github.com/preactjs/prefresh/issues/610
2026-04-12 17:32:03 +03:00
Adorian Doran 3720851ff7 Merge branch 'main' of https://github.com/TriliumNext/Trilium into feat/about-dialog-overhaul 2026-04-12 17:15:40 +03:00
Elian Doran 6a83356cf7 chore(deps): update dependency @lezer/common to v1.5.2 (#9386) 2026-04-12 13:13:51 +03:00
Elian Doran 233c41acc0 fix(deps): update dependency i18next to v26.0.4 (#9388) 2026-04-12 13:13:12 +03:00
Elian Doran 3b0451da9e fix(deps): update dependency ai to v6.0.154 (#9387) 2026-04-12 13:11:26 +03:00
Elian Doran e217a3146f chore(deps): update dependency @redocly/cli to v2.26.0 (#9389) 2026-04-12 13:10:41 +03:00
Elian Doran 97c42ef1cb fix(deps): update dependency @zumer/snapdom to v2.8.0 (#9391) 2026-04-12 13:09:06 +03:00
Elian Doran b12a524de8 chore(deps): update dependency electron to v41.2.0 (#9390) 2026-04-12 11:56:45 +03:00
Elian Doran ee37fee2c0 Revert "Update dependency minimatch@3>brace-expansion to v5" (#9393) 2026-04-12 11:35:35 +03:00
Elian Doran ef5d9f980e Merge branch 'main' into revert-9307-renovate/minimatch3-brace-expansion-5.x 2026-04-12 11:35:27 +03:00
Elian Doran fadbc906e2 chore(deps): update dependency @prefresh/vite to v3 (#9392) 2026-04-12 09:39:14 +03:00
Elian Doran ba816fc132 Revert "Update dependency minimatch@3>brace-expansion to v5" 2026-04-12 09:37:53 +03:00
renovate[bot] 5ea615da1e chore(deps): update dependency @prefresh/vite to v3 2026-04-12 00:47:10 +00:00
renovate[bot] ceb955b72b fix(deps): update dependency @zumer/snapdom to v2.8.0 2026-04-12 00:46:12 +00:00
renovate[bot] 43823bcb37 chore(deps): update dependency electron to v41.2.0 2026-04-12 00:45:14 +00:00
renovate[bot] 7984ada306 chore(deps): update dependency @redocly/cli to v2.26.0 2026-04-12 00:44:11 +00:00
renovate[bot] d3e0c8d894 fix(deps): update dependency i18next to v26.0.4 2026-04-12 00:43:10 +00:00
renovate[bot] cee1be11ab fix(deps): update dependency ai to v6.0.154 2026-04-12 00:42:06 +00:00
renovate[bot] 230b3207a5 chore(deps): update dependency @lezer/common to v1.5.2 2026-04-12 00:41:03 +00:00
Elias Soares 62ff35c080 Merge remote-tracking branch 'origin/fix/etapi-calendar-descriptions-and-mcp-docs' into fix/etapi-calendar-descriptions-and-mcp-docs 2026-04-11 20:41:35 -03:00
Elias Soares e2043c14f2 improv: applying Gemini's suggestions 2026-04-11 20:41:08 -03:00
Elian Doran a7f9032347 feat(llm): add note mutation tools (rename, delete, move, clone) (#9339) 2026-04-12 01:32:14 +03:00
Elian Doran f137868f92 feat(llm): add stop generation button (#9341) 2026-04-12 00:48:55 +03:00
Elian Doran 175e200d88 fix(llm): stopping a tool call leaves an infinite spinner 2026-04-12 00:48:01 +03:00
Elian Doran 74f951023b Merge remote-tracking branch 'origin/main' into feat/llm-stop-generation 2026-04-12 00:37:27 +03:00
Elian Doran 3e697338e1 Translations update from Hosted Weblate (#9381) 2026-04-11 22:18:18 +03:00
Elias Soares bae77017a9 Merge branch 'main' into fix/etapi-calendar-descriptions-and-mcp-docs 2026-04-11 14:28:57 -03:00
Elias Soares 32a2834bf3 fix(etapi): correct calendar year/month endpoint descriptions and year pattern; docs: add trilium-fastmcp integration 2026-04-11 14:25:49 -03:00
Hosted Weblate 4bffc1c156 Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/
2026-04-11 16:38:08 +00:00
green ac4c5f7d8c Translated using Weblate (Japanese)
Currently translated at 99.9% (1851 of 1852 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2026-04-11 16:38:04 +00:00
AggelosPnS 8f41e55b3c Translated using Weblate (Greek)
Currently translated at 100.0% (116 of 116 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/el/
2026-04-11 16:38:02 +00:00
AggelosPnS ad8aab7b15 Translated using Weblate (Greek)
Currently translated at 96.2% (152 of 158 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/el/
2026-04-11 16:38:00 +00:00
AggelosPnS 7e779669ea Translated using Weblate (Greek)
Currently translated at 2.6% (49 of 1852 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/el/
2026-04-11 16:37:58 +00:00
green 5b01791021 Translated using Weblate (Japanese)
Currently translated at 100.0% (401 of 401 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ja/
2026-04-11 16:37:55 +00:00
Elian Doran 14bb068626 fix(tree): deleting ancestor of the current note doesn't correctly navigate 2026-04-11 19:36:50 +03:00
Elian Doran 1c93636538 fix(tree): navigating to parent note when deleting a non-active note (closes #9380) 2026-04-11 19:31:44 +03:00
Elian Doran b402a7a32b Easy fixes v2 (#9377) 2026-04-11 19:19:57 +03:00
Elian Doran 3a7167a65d chore: address requested changes 2026-04-11 19:19:32 +03:00
Elian Doran 6dd7e9cb38 chore(delete): address requested changes 2026-04-11 14:30:44 +03:00
Elian Doran 4ffa016045 fix(sidebar): highlights with math split in read-only text 2026-04-11 14:28:58 +03:00
Elian Doran 2d6f1ee9b7 fix(sidebar): editable mode equations sometimes not rendering 2026-04-11 14:26:22 +03:00
Elian Doran a1f0615afe chore: fix typecheck 2026-04-11 14:25:01 +03:00
Elian Doran 03ff9c4b27 fix(sidebar): highlights not rendering math in read-only text 2026-04-11 14:23:07 +03:00
Elian Doran 67a48bbec7 fix(sidebar): duplicate equations rendering 2026-04-11 14:14:18 +03:00
Elian Doran 2b63af82ec fix(sidebar): equations not rendered for read-only text 2026-04-11 13:53:10 +03:00
Elian Doran c5ee7083d8 chore(sidebar): deduplicate math rendering 2026-04-11 13:49:13 +03:00
Elian Doran 0696f7724d chore(react): add an option to make options row stacked 2026-04-11 13:43:10 +03:00
Elian Doran b7231e3464 feat(delete): improve translations 2026-04-11 13:35:27 +03:00
Elian Doran 214c6c93fd feat(similarity): filter out hidden notes (closes #4584) 2026-04-11 13:34:04 +03:00
Elian Doran 7037ae4ba8 feat(delete): hide removal of clones completely if no clones are affected 2026-04-11 13:24:09 +03:00
Elian Doran 46d6d6fdee feat(include_note): remember value of box size (closes #1623) 2026-04-11 13:23:13 +03:00
Elian Doran ae751bfb91 feat(delete): improve layout of the note path 2026-04-11 13:20:28 +03:00
Elian Doran bd0117c52f feat(delete): borderless table 2026-04-11 13:10:38 +03:00
Elian Doran 1402695dbe feat(delete): improve table for broken relations 2026-04-11 13:01:18 +03:00
Elian Doran 72c42afb50 feat(delete): use proper note links and show icons 2026-04-11 12:53:36 +03:00
Elian Doran 2752e0998e feat(delete): render broken relations as a table 2026-04-11 12:50:34 +03:00
Elian Doran 52114e08ba chore(delete): remove redundant list of clones 2026-04-11 12:44:28 +03:00
Elian Doran a98721c016 fix(ckeditor/include_note): changing expandability doesn't refresh 2026-04-11 12:43:34 +03:00
Elian Doran c3ab2d09d5 feat(ckeditor/include_note): add a new size for expandable items (closes #4134) 2026-04-11 12:43:17 +03:00
Elian Doran 9ef7802651 chore(delete): remove self-descriptive title 2026-04-11 12:35:27 +03:00
Elian Doran a913d33a9e chore(ckeditor/include_note): remove debug logs 2026-04-11 12:35:01 +03:00
Elian Doran 49dc7135a7 feat(delete): different behavior when only deleted clones 2026-04-11 12:34:34 +03:00
Elian Doran 7e77560d70 fix(ckeditor/include_note): undo not working after select mechanism 2026-04-11 12:23:22 +03:00
Elian Doran 35cb110151 chore(delete): add missing translations 2026-04-11 12:20:06 +03:00
Elian Doran 4e49c2458d refactor(delete): deduplicate form toggle 2026-04-11 12:19:47 +03:00
Elian Doran 755e5fc416 feat(delete): improve dialog slightly by using cards and options rows 2026-04-11 12:17:25 +03:00
Elian Doran 5d4fd0269f refactor(ckeditor/include_note): use different method for intercepting selection 2026-04-11 12:13:24 +03:00
Elian Doran 461abf768c feat(ckeditor/include_note): add a way to change size after creation (closes #3705) 2026-04-11 12:07:16 +03:00
Elian Doran 602bebe498 feat(server): improve note path display to use chevrons instead of slashes to separate notes (closes #762) 2026-04-11 11:43:57 +03:00
Elian Doran 6c31b35f08 refactor(delete): reuse components for delete note list 2026-04-11 11:42:14 +03:00
Elian Doran ccf95ad885 feat(delete): clarify "Delete also all clones" based on actual number of clones (closes #2362) 2026-04-11 11:39:05 +03:00
Elian Doran fb33921308 feat(script): add warning if trying to render an unavailable protected server-side note (closes #21) 2026-04-11 11:17:58 +03:00
Elian Doran 1121ee0133 feat(script): add warning if trying to render a protected note without the session active 2026-04-11 11:15:31 +03:00
Elian Doran 77af4bd288 feat(link): allow bookends: and highlights: protocols (closes #2817) 2026-04-11 11:11:43 +03:00
Elian Doran a1a2119e37 fix(server): indentation in HTML not preserved (closes #3151) 2026-04-11 11:07:59 +03:00
Elian Doran afd2806a67 feat(script): increase warning toast time 2026-04-11 11:02:56 +03:00
Elian Doran 3410f0f5bc feat(script): warn if user is trying to run the script in a wrong environment (closes #342) 2026-04-11 11:01:04 +03:00
Elian Doran 4ed2226206 fix(script): logging api.startNote not working (closes #3751) 2026-04-11 10:57:05 +03:00
Elian Doran b8d7277d88 feat(server): remove old keyboard shortcuts from options (closes #4543) 2026-04-11 10:48:09 +03:00
Elian Doran 1becc18354 fix(ckeditor5): internal link enabled in code block (closes #1712) 2026-04-11 10:41:24 +03:00
Elian Doran 9366d351e0 chore(edit-demo): ensure proper tree expansion state 2026-04-11 10:32:27 +03:00
Elian Doran e27f5cd419 docs(demo): statistics not rendering (closes #4178) 2026-04-11 10:27:49 +03:00
Elian Doran b7c1116738 chore(deps): update vitest monorepo to v4.1.3 (#9374) 2026-04-11 10:03:26 +03:00
renovate[bot] a6a3d743f7 chore(deps): update vitest monorepo to v4.1.3 2026-04-11 06:39:38 +00:00
Elian Doran dd3f3e9e5c fix(deps): update ai sdk (#9375) 2026-04-11 09:34:36 +03:00
Elian Doran ad2732b249 chore(deps): update typescript-eslint monorepo to v8.58.1 (#9373) 2026-04-11 09:33:57 +03:00
Elian Doran 10c04bdda0 Translations update from Hosted Weblate (#9371) 2026-04-11 09:00:34 +03:00
noobhjy 26d88afeb7 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (401 of 401 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/zh_Hans/
2026-04-11 07:59:57 +02:00
noobhjy 376d19563d Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 98.4% (1823 of 1852 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2026-04-11 07:59:57 +02:00
Francis C. d2895f0f42 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 99.9% (1851 of 1852 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hant/
2026-04-11 07:59:56 +02:00
Francis C. 30310ef2ba Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (401 of 401 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/zh_Hant/
2026-04-11 07:59:56 +02:00
Hosted Weblate 924a9747f1 Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/
2026-04-11 07:59:55 +02:00
Elian Doran f8ed48d2d2 fix(deps): update dependency marked to v18 (#9376) 2026-04-11 08:59:47 +03:00
renovate[bot] 9cdb2a73e3 chore(deps): update typescript-eslint monorepo to v8.58.1 2026-04-11 05:58:20 +00:00
Elian Doran ad3258b88e chore(deps): update dependency vite to v8.0.7 (#9372) 2026-04-11 08:52:36 +03:00
renovate[bot] 4461ab080a fix(deps): update ai sdk 2026-04-11 05:44:10 +00:00
renovate[bot] 9b07f156b2 fix(deps): update dependency marked to v18 2026-04-11 01:54:33 +00:00
renovate[bot] 94c7967800 chore(deps): update dependency vite to v8.0.7 2026-04-11 01:50:19 +00:00
Elian Doran a5b248e663 feat(ckeditor): match style for admonitions in floating toolbar 2026-04-11 00:50:20 +03:00
Elian Doran 1ec43722e8 fix(ckeditor): admonitions overshadowing floating toolbar 2026-04-11 00:47:51 +03:00
Elian Doran 88c548cc70 feat(ckeditor): add a toolbar to switch admonition types 2026-04-11 00:47:36 +03:00
Elian Doran daafe251da feat(text): click to copy inline code in read-only text 2026-04-11 00:40:41 +03:00
Elian Doran 147ecbccda feat(ckeditor): add copy button for inline code 2026-04-11 00:36:43 +03:00
Elian Doran be5d2d07bc Easy fixes v1 (#9370) 2026-04-11 00:29:15 +03:00
Elian Doran adbe8f6c42 feat(options/sync): improve timeout layout 2026-04-11 00:16:41 +03:00
Elian Doran 18aec84be5 chore(client): address requested changes 2026-04-11 00:16:20 +03:00
Elian Doran 5f68958aa7 chore(client): address requested changes 2026-04-10 23:54:27 +03:00
Elian Doran 4787f644a6 feat(options): friendlier zoom factor selection (closes #5444) 2026-04-10 23:38:29 +03:00
Elian Doran 524f8df866 feat(search): add an option to open all results (closes #5376) 2026-04-10 23:36:29 +03:00
Elian Doran bb381c1349 refactor(highlights): remove unnecessary logic in old layout (closes #5375) 2026-04-10 23:21:00 +03:00
Elian Doran 36c31dac14 refactor(client): remove unused translation 2026-04-10 23:20:35 +03:00
Elian Doran 01b6926054 test(server): sync options with various scenarios 2026-04-10 23:20:24 +03:00
Elian Doran 84cfa0a9f7 fix(server): overriding sync_options affected by the timeScale 2026-04-10 23:17:47 +03:00
Elian Doran cb83c51632 chore(ai): update system prompt regarding tests 2026-04-10 23:17:09 +03:00
Elian Doran 97256ba291 feat(options): add nicer sync timeout selector (closes #5513) 2026-04-10 23:12:07 +03:00
Elian Doran d3c596aaa0 feat(highlights): render highlighted equations in new layout 2026-04-10 23:03:30 +03:00
Elian Doran 3d2fa57873 fix(toc): equations sometimes duplicated 2026-04-10 23:01:07 +03:00
Elian Doran c435050018 refactor(client): deduplicate checks for title/icon editability 2026-04-10 22:36:13 +03:00
Elian Doran 14f761de36 fix(options): icons can be modified 2026-04-10 22:35:06 +03:00
Elian Doran 626438d8f5 fix(options): titles can be modified (closes #5371) 2026-04-10 22:33:39 +03:00
Elian Doran e29555a89b fix(collections/calendar): displaying deep children (closes #7944) 2026-04-10 22:17:55 +03:00
Elian Doran 05da2d7a50 fix(collections/table): unable to set number cell to zero (closes #6555) 2026-04-10 22:11:10 +03:00
Elian Doran 1124533557 fix(edit-docs): wrong starting note 2026-04-10 22:01:41 +03:00
Elian Doran 878603c7b0 fix(jump_to_note): caret at the end when entering command mode (closes #7942) 2026-04-10 21:17:38 +03:00
Elian Doran 19583cd84a fix(edit-demo): cloned notes lost due to async issue 2026-04-10 21:14:39 +03:00
Elian Doran 9f26d6efdc feat(text): render note icons in autocompletion (closes #8188) 2026-04-10 21:11:49 +03:00
Elian Doran 043e620231 fix(setup): trailing slash affects sync (closes #8045) 2026-04-10 21:09:29 +03:00
Elian Doran d3dbdd4ceb docs(scripting): typos in "Trilium Demo" note (closes #8230) 2026-04-10 21:02:05 +03:00
Elian Doran 0859165072 docs(scripting): missing step in word count widget (closes #8561) 2026-04-10 20:54:13 +03:00
Elian Doran ca7ab6105d chore(ai): keep system prompts in sync 2026-04-10 20:48:15 +03:00
Elian Doran 3af2b32783 fix(react): workaround for bootstrap tooltip error (closes #8900) 2026-04-10 20:43:41 +03:00
Elian Doran 8d5df7e888 chore(ai): update system prompt for reusing components and using translations 2026-04-10 20:42:33 +03:00
Elian Doran 126ee27505 feat(search): some error messages were not translated (closes #8850) 2026-04-10 20:38:13 +03:00
Elian Doran fc2d8452b5 feat(search): clarify error message for full-text search after expressions 2026-04-10 20:31:23 +03:00
Elian Doran 1b8c234f30 feat(search): clarify error message for use of unquoted note 2026-04-10 20:28:37 +03:00
Elian Doran 540b607459 fix(note_map): freezing the app if there are too many notes (closes #8916) 2026-04-10 20:13:00 +03:00
Elian Doran ee229bd0d7 fix(client): note title doesn't get selected anymore when creating new note (closes #8407) 2026-04-10 20:04:23 +03:00
Elian Doran 439d39d8fa Editing quirks (#9362) 2026-04-10 13:42:03 +03:00
Elian Doran 8c379d03a9 Update apps/client/src/widgets/collections/calendar/index.tsx
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-04-10 13:41:25 +03:00
Elian Doran ff31104b99 fix(collections/calendar): unnecessary start date set when editing a note in quick edit 2026-04-10 13:31:44 +03:00
Elian Doran dfe6063929 fix(client): spaced update saving more times than necesssary and causing performance issues 2026-04-10 12:00:08 +03:00
Elian Doran a4b716f8c7 fix(board): clicking on a URL would open th quick edit panel 2026-04-10 11:38:42 +03:00
Elian Doran 7efc36efef fix(collections): not reacting to changes in reordering 2026-04-10 11:35:32 +03:00
Elian Doran 1554c9907e fix(server): not starting due to dependency update 2026-04-10 11:34:46 +03:00
Elian Doran df46ddcf60 chore(deps): update pnpm lock 2026-04-10 11:28:18 +03:00
Elian Doran 6fb19d0287 feat: add download button for backups (#9190) 2026-04-10 11:00:04 +03:00
Elian Doran d702f69415 Update dependency minimatch@3>brace-expansion to v5 (#9307) 2026-04-10 10:41:05 +03:00
Elian Doran eb81e830a1 Update dependency eslint-linter-browserify to v10.2.0 (#9334) 2026-04-10 10:38:45 +03:00
Elian Doran a24b9d7a38 fix(web-clipper): Remove trailing / from triliumServerUrl (#9344) 2026-04-10 10:37:14 +03:00
Elian Doran efeaa1e895 chore(deps): audit fix 2026-04-10 10:29:50 +03:00
Elian Doran a239eba6ce chore(llm): update backend script to be aware of the changes 2026-04-10 10:24:44 +03:00
Elian Doran d009582252 feat(script): mark cheerio as deprecated and provide alternative 2026-04-10 10:22:15 +03:00
Elian Doran fe710823c1 docs(user): add breaking change documentation for axios 2026-04-10 10:15:24 +03:00
Elian Doran bfe593ae52 feat(server): remove axios 2026-04-10 09:59:51 +03:00
Elian Doran f653a22557 chore(deps): remove upath 2026-04-10 09:51:49 +03:00
Elian Doran 96e7f22520 Update ai sdk (#9357) 2026-04-10 09:49:30 +03:00
Elian Doran e6d3d22db7 Update dependency fuse.js to v7.3.0 (#9335) 2026-04-10 09:46:01 +03:00
Elian Doran 1258dedab3 Update dependency marked to v17.0.6 (#9348) 2026-04-10 08:18:26 +03:00
Elian Doran ec15c7e63e Update dependency eslint-plugin-simple-import-sort to v13 (#9359) 2026-04-10 08:17:44 +03:00
Elian Doran 5037eaf205 Update codemirror themes (#9358) 2026-04-10 08:16:43 +03:00
renovate[bot] cb706453aa Update dependency eslint-plugin-simple-import-sort to v13 2026-04-10 02:14:33 +00:00
renovate[bot] 772ebbf929 Update codemirror themes 2026-04-10 02:13:55 +00:00
renovate[bot] 60e1aca3b1 Update ai sdk 2026-04-10 02:13:17 +00:00
Elian Doran 741ae4b070 chore(server): fix dist creation 2026-04-09 22:31:50 +03:00
Tomas Adamek 49476d72fc Update apps/server/src/services/llm/tools/hierarchy_tools.ts
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-04-09 20:50:59 +02:00
renovate[bot] 31eaa4181d Update dependency fuse.js to v7.3.0 2026-04-09 15:03:57 +00:00
Elian Doran ca13a8accd Update dependency katex to v0.16.45 (#9347) 2026-04-09 18:01:24 +03:00
Elian Doran 78b1f119dc Update dependency dotenv to v17.4.1 (#9346) 2026-04-09 18:00:51 +03:00
Elian Doran 2908b29c0d Translations update from Hosted Weblate (#9351) 2026-04-09 15:25:40 +03:00
Elian Doran 91afa08cdc Apply suggestions from code review
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-04-09 15:24:53 +03:00
Lorinc936 9e701645d5 Merge branch 'TriliumNext:main' into main 2026-04-09 11:23:49 +00:00
Giovi d93b0442d2 Translated using Weblate (Italian)
Currently translated at 100.0% (395 of 395 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/it/
2026-04-09 11:10:04 +00:00
Giovi ce4f9f5f01 Translated using Weblate (Italian)
Currently translated at 100.0% (1846 of 1846 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/it/
2026-04-09 11:10:03 +00:00
Aindriú Mac Giolla Eoin 353d638823 Translated using Weblate (Irish)
Currently translated at 100.0% (395 of 395 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ga/
2026-04-09 11:10:01 +00:00
Ali Kaya 995a774140 Translated using Weblate (Turkish)
Currently translated at 7.5% (30 of 395 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/tr/
2026-04-09 11:10:00 +00:00
green c131b245bc Translated using Weblate (Japanese)
Currently translated at 100.0% (1846 of 1846 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2026-04-09 11:09:58 +00:00
Ali Kaya 42aabaf9b5 Translated using Weblate (Turkish)
Currently translated at 6.5% (121 of 1846 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/tr/
2026-04-09 11:09:56 +00:00
Bas Wouters 84cce151b8 Translated using Weblate (Dutch)
Currently translated at 4.1% (76 of 1846 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/nl/
2026-04-09 11:09:54 +00:00
Bas Wouters e3e6316af7 Translated using Weblate (Dutch)
Currently translated at 26.7% (31 of 116 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/nl/
2026-04-09 11:09:53 +00:00
green 96e64c4f17 Translated using Weblate (Japanese)
Currently translated at 100.0% (395 of 395 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ja/
2026-04-09 11:09:52 +00:00
Aindriú Mac Giolla Eoin 3005917256 Translated using Weblate (Irish)
Currently translated at 100.0% (1846 of 1846 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ga/
2026-04-09 11:09:50 +00:00
renovate[bot] 0fa121cdf2 fix(deps): update dependency marked to v17.0.6 2026-04-09 01:14:36 +00:00
renovate[bot] 3bf6215249 fix(deps): update dependency katex to v0.16.45 2026-04-09 01:13:57 +00:00
renovate[bot] 2ef045a66d chore(deps): update dependency dotenv to v17.4.1 2026-04-09 01:13:19 +00:00
renovate[bot] 2316f38978 chore(deps): update dependency minimatch@3>brace-expansion to v5 2026-04-08 21:14:49 +00:00
renovate[bot] b65bf12247 fix(deps): update dependency eslint-linter-browserify to v10.2.0 2026-04-08 21:13:29 +00:00
Bart Visscher 55291d43a6 fix(web-clipper): Remove trailing / from triliumServerUrl 2026-04-08 16:38:17 +02:00
Tomáš Adámek 01bee95833 fix: extract finalizeStream helper, re-throw non-AbortError exceptions
- Extract duplicated cleanup logic into shared finalizeStream() function
- Add else branch to re-throw non-AbortError exceptions instead of swallowing them
2026-04-08 16:17:37 +02:00
Tomáš Adámek 5938fa6ffb fix: address review — shared PROTECTED_SYSTEM_NOTES, protection checks, soft delete description
- Move PROTECTED_SYSTEM_NOTES to helpers.ts for shared use
- move_note: check against full system notes set, add protected parent check
- clone_note: add source note protection + protected parent checks
- delete_note: fix description to say 'soft delete' (recoverable)
2026-04-08 16:08:02 +02:00
Elian Doran 743fe5a75d chore(deps): update dependency vite-plugin-static-copy to v4.0.1 (#9333) 2026-04-08 08:03:36 +03:00
renovate[bot] 0c2fdba586 chore(deps): update dependency vite-plugin-static-copy to v4.0.1 2026-04-08 01:34:23 +00:00
Elian Doran a2c5adec3d Extra bugfixes (#9332) 2026-04-07 21:28:45 +03:00
Elian Doran 6089c8c7c6 Merge branch 'feature/extra_bugfixes' of https://github.com/TriliumNext/Trilium into feature/extra_bugfixes 2026-04-07 20:52:26 +03:00
Elian Doran f28f725519 fix(server,desktop): not running correctly if placed in dot-hidden directory 2026-04-07 20:46:25 +03:00
Elian Doran 22d853e0b0 Apply suggestions from code review
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Elian Doran <contact@eliandoran.me>
2026-04-07 20:26:55 +03:00
Elian Doran 0f1d395651 refactor(script): move runScript to executeScript at BNote level 2026-04-07 19:59:14 +03:00
Elian Doran 3a0bab217d fix(share): hard-coded root-level paths 2026-04-07 19:48:06 +03:00
Elian Doran f824cb5f15 feat(script): add API to execute backend 2026-04-07 19:40:12 +03:00
Elian Doran 40fd8d6d1a fix(quick_search): ctrl+click & middle click not working (closes #9220) 2026-04-07 19:18:16 +03:00
Elian Doran e37f73bce0 fix(tab_bar): changing note icon reflect in the tab icon (closes #8994) 2026-04-07 19:11:26 +03:00
Elian Doran d1cd08972f chore(share): use i18n for more strings 2026-04-07 19:07:20 +03:00
Elian Doran 5a13ca6409 feat(share): render dates on the client side 2026-04-07 19:06:33 +03:00
Elian Doran eb3fd73415 fix(share): translation not used in template (closes #8722) 2026-04-07 18:54:13 +03:00
Elian Doran 1764fcbba2 fix(script): useContext not provided in imports (closes #9152) 2026-04-07 18:49:54 +03:00
Elian Doran 19f3552bfc fix(calendar): colors unreadable on dark theme (closes #8989)
The calendar event has a light yellow background with light yellow text in dark theme, making it nearly unreadable.

The root cause is a CSS load order issue. The :root defaults in index.css:1-10 are loaded after the dark theme's :root overrides (since component CSS loads after global CSS in Vite), so the defaults (95% lightness, 80% saturation) stomp over the dark theme values (20% lightness, 25% saturation). The background stays light, but --custom-color correctly gets the dark-adjusted (light) text color → light-on-light = bad contrast.

The fix: remove the :root block and use var() fallbacks instead, so there's no :root competition.
2026-04-07 18:48:32 +03:00
Elian Doran cedce6cf32 feat(relation_map): rename relations through context menu (closes #442) 2026-04-07 18:47:00 +03:00
Elian Doran 26cf215150 fix(share): webviews occupied very little height (closes #9215) 2026-04-07 18:08:23 +03:00
Elian Doran d21557069c fix(import/zip): ZIPs without language encoding flag importing garbage (closes #3013) 2026-04-07 17:01:34 +03:00
Elian Doran 28b2547229 Translations update from Hosted Weblate (#9327) 2026-04-07 16:13:33 +03:00
Hosted Weblate d75f556074 Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/
2026-04-07 15:03:00 +02:00
Ali Kaya eb66810e59 Translated using Weblate (Turkish)
Currently translated at 5.6% (104 of 1842 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/tr/
2026-04-07 15:02:55 +02:00
Tomas Adamek 540b39206d Translated using Weblate (Czech)
Currently translated at 100.0% (1842 of 1842 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/cs/
2026-04-07 15:02:55 +02:00
Tomas Adamek 5baea04c5d Translated using Weblate (Czech)
Currently translated at 100.0% (158 of 158 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/cs/
2026-04-07 15:02:54 +02:00
Giovi f5e65748a7 Translated using Weblate (Italian)
Currently translated at 100.0% (1842 of 1842 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/it/
2026-04-07 15:02:53 +02:00
Elian Doran de84e09062 Custom dictionary (#9317) 2026-04-07 16:02:34 +03:00
Elian Doran c81c88c930 fix(log): occassional race condition when creating log dir 2026-04-07 15:54:11 +03:00
Elian Doran 2cb39ea7e3 fix(migration): don't crash on idempotent column creation 2026-04-07 15:30:24 +03:00
Elian Doran 6986963e45 e2e(server): update after changing spellcheck settings 2026-04-07 15:23:19 +03:00
Elian Doran dc9b0093d9 fix(server): server-side rendered pages use old style 2026-04-07 15:18:38 +03:00
Elian Doran 40f9927842 docs(user): mention updates to spell check 2026-04-07 14:44:51 +03:00
Elian Doran ff02f5f3ed Merge remote-tracking branch 'origin/main' into feature/custom_dictionary 2026-04-07 14:36:20 +03:00
Tomáš Adámek dc40f6b530 feat(llm): add stop generation button
Allow users to stop an in-progress LLM generation by aborting the
SSE connection. The send button transforms into a red stop button
during streaming.

- AbortController passed to fetch() signal for stream cancellation
- On abort, partial content is finalized and saved as a message
- Stop button replaces send button during streaming with danger color
- Button is always clickable during streaming (not disabled)
2026-04-07 13:28:23 +02:00
Elian Doran 22149b94a1 chore(spellcheck): address requested changes 2026-04-07 14:26:55 +03:00
Tomáš Adámek d771454aa5 feat(llm): add note mutation tools (rename, delete, move, clone)
Add four new LLM tools for note management:
- rename_note: Change the title of an existing note
- delete_note: Delete a note with system note protection
- move_note: Move a note to a new parent using branch service
- clone_note: Clone a note to an additional parent

All mutation tools are marked with mutates: true for the tool
approval system. Protected and system notes are guarded against
modification.
2026-04-07 13:19:16 +02:00
Elian Doran 372d25667f fix(deps): update codemirror themes (#9322) 2026-04-07 14:08:32 +03:00
Elian Doran 21f6cc00eb feat(options/spellcheck): improve display in browser 2026-04-07 13:31:22 +03:00
Elian Doran 620a080128 feat(options/media): hide spellcheck related setting in browser 2026-04-07 13:28:44 +03:00
Elian Doran 6a972aaf3d feat(codemirror): add four more themes 2026-04-07 13:25:25 +03:00
Elian Doran d878d6b20b chore(deps): update dependency eslint to v10.2.0 (#9324) 2026-04-07 10:57:43 +03:00
Elian Doran ec075311f4 fix(deps): update dependency preact to v10.29.1 (#9323) 2026-04-07 08:26:20 +03:00
Elian Doran 237c9bb62a fix(deps): update ai sdk (#9321) 2026-04-07 08:22:23 +03:00
Elian Doran 5aa9733bd7 chore(deps): update dependency typedoc-plugin-missing-exports to v4.1.3 (#9320) 2026-04-07 08:20:42 +03:00
renovate[bot] a157a003c5 chore(deps): update dependency eslint to v10.2.0 2026-04-07 05:20:05 +00:00
renovate[bot] e40869d3f8 fix(deps): update dependency preact to v10.29.1 2026-04-07 05:19:03 +00:00
Elian Doran edaecfad4d fix(deps): update univer monorepo to v0.20.0 (#9325) 2026-04-07 08:18:48 +03:00
Elian Doran 983a98ae15 chore(deps): update dependency turndown to v7.2.4 (#9319) 2026-04-07 08:18:10 +03:00
Elian Doran 20ad902feb chore(deps): update dependency @types/node to v24.12.2 (#9318) 2026-04-07 08:15:55 +03:00
renovate[bot] 05de9c6e41 fix(deps): update univer monorepo to v0.20.0 2026-04-07 01:09:37 +00:00
renovate[bot] df281cbbaa fix(deps): update codemirror themes 2026-04-07 01:07:46 +00:00
renovate[bot] a979d11b8c fix(deps): update ai sdk 2026-04-07 01:07:09 +00:00
renovate[bot] f7ff9c114f chore(deps): update dependency typedoc-plugin-missing-exports to v4.1.3 2026-04-07 01:06:33 +00:00
renovate[bot] 807dbdd133 chore(deps): update dependency turndown to v7.2.4 2026-04-07 01:05:58 +00:00
renovate[bot] 4aa944237f chore(deps): update dependency @types/node to v24.12.2 2026-04-07 01:05:24 +00:00
Elian Doran 48db55e3da chore(deps): update dependency vite to v8.0.5 [security] (#9313) 2026-04-06 22:33:44 +03:00
Elian Doran bd1491e6e5 feat(options/i18n): add reference to spell check 2026-04-06 22:08:23 +03:00
Elian Doran ac35730e3b feat(options/spellcheck): add button to reload app 2026-04-06 21:56:31 +03:00
Elian Doran 00023adbc0 Revert "feat(options/spellcheck): merge into single card"
This reverts commit 7b056fe1af.
2026-04-06 21:53:17 +03:00
Elian Doran a70142a4dc feat(options/spellcheck): add button to edit custom words 2026-04-06 21:50:54 +03:00
Elian Doran 7b056fe1af feat(options/spellcheck): merge into single card 2026-04-06 21:44:49 +03:00
Elian Doran 467be38bd1 feat(options/spellcheck): improve language selection 2026-04-06 21:39:58 +03:00
renovate[bot] 933054a095 chore(deps): update dependency vite to v8.0.5 [security] 2026-04-06 18:36:10 +00:00
Elian Doran f56482157c chore(ai): update system prompt 2026-04-06 21:25:54 +03:00
Elian Doran 5d0c91d91d fix(spellcheck): don't remove local words every time 2026-04-06 20:46:38 +03:00
Elian Doran 03136611a1 fix(spellcheck): don't merge words every time 2026-04-06 20:44:13 +03:00
Elian Doran 3e7488e4f3 feat(spellcheck): clean up local words 2026-04-06 20:36:51 +03:00
Elian Doran 3ed7d48d42 feat(spellcheck): save new words to custom dictionary 2026-04-06 20:28:22 +03:00
Elian Doran ef72d89172 fix(spellcheck): custom dictionary not actually saved due to CLS 2026-04-06 20:16:02 +03:00
Elian Doran ad97071862 feat(spellcheck): basic logic to save words 2026-04-06 20:09:29 +03:00
Elian Doran 2291892946 chore(server): create hidden note for the dictionary 2026-04-06 19:55:42 +03:00
Elian Doran bf8cfa1421 Merge branch 'main' of https://github.com/TriliumNext/Trilium 2026-04-06 19:48:42 +03:00
Elian Doran bdd806efff refactor: delegate theme management completely to client via bootstrap 2026-04-06 19:45:18 +03:00
Elian Doran c912c4af7b fix(webview): refresh content for SPAs with "query string" in hash (#8883) 2026-04-06 18:50:16 +03:00
Elian Doran fc7f359f28 Update Web Clipper.md (#9294) 2026-04-06 16:51:46 +03:00
Elian Doran 21598f6189 chore(desktop): change more electron fuses for increased safety 2026-04-06 15:15:47 +03:00
Elian Doran a1987ea193 Feature/cleanup ck modules (#9310) 2026-04-06 13:27:26 +03:00
Elian Doran 480d167131 fix(desktop): cannot print/export to PDF on Linux wayland (closes #7967) 2026-04-06 13:11:06 +03:00
Elian Doran d873accf3e Merge remote-tracking branch 'origin/main' into feature/cleanup_ck_modules 2026-04-06 12:41:45 +03:00
Elian Doran 94b448863c chore(deps): update dependency esbuild to v0.28.0 (#9302) 2026-04-06 12:34:15 +03:00
Elian Doran 32acc8555d fix(deps): update dependency @eslint/js to v10 (#9308) 2026-04-06 12:33:56 +03:00
Elian Doran d68ad84155 Refactor/build warnings due to imports (#9309) 2026-04-06 12:32:32 +03:00
Elian Doran 45e82b7f33 test(ckeditor5-mermaid): fix type errors 2026-04-06 12:31:53 +03:00
Elian Doran 55ad0fe9f0 test(ckeditor5-mermaid): broken tests after change in rendering 2026-04-06 12:30:33 +03:00
Elian Doran 559815273e fix(ckeditor5-mermaid): protect against multiple init 2026-04-06 12:27:12 +03:00
Elian Doran af76740fd9 fix(ckeditor5-mermaid): protect against stale renders 2026-04-06 12:26:17 +03:00
Elian Doran 7dadd50bfe chore(ckeditor5-mermaid): don't remove parent element on error 2026-04-06 12:25:50 +03:00
Elian Doran dd4cab22c1 chore(client): address requested changes 2026-04-06 12:22:00 +03:00
Elian Doran c4d3e776a1 refactor(client): the last circular dependency 2026-04-06 12:20:40 +03:00
Elian Doran 19bb7f5ddb refactor(server): remove unnecessary route 2026-04-06 12:18:36 +03:00
Elian Doran d212120f9b refactor(client): read locales from common instead of going through the server 2026-04-06 12:16:32 +03:00
Elian Doran 42da1872e7 fix(client): crashing due to circular dependency 2026-04-06 12:10:33 +03:00
Elian Doran a080b50c45 refactor(client): duplicate toast import 2026-04-06 12:06:27 +03:00
Elian Doran 6d31e9b028 feat(ckeditor5-mermaid): use more modern mechanism for rendering with less flicker 2026-04-06 12:03:29 +03:00
Elian Doran b606afa858 refactor(ckeditor5-mermaid): get rid of any runtime dependencies 2026-04-06 11:59:24 +03:00
Elian Doran f9446304b3 refactor(ckeditor5-mermaid): switch to es-toolkit 2026-04-06 11:57:31 +03:00
renovate[bot] fbe312d580 chore(deps): update dependency esbuild to v0.28.0 2026-04-06 08:54:56 +00:00
Elian Doran 8d383caaff chore(deps): update dependency @electron/fuses to v2 (#9304) 2026-04-06 11:53:07 +03:00
Elian Doran 6caf4fa7ce chore(deps): update dependency copy-webpack-plugin to v14 (#9305) 2026-04-06 11:52:29 +03:00
Elian Doran 606d58b08c chore(ckeditor5-*): remove unnecessary publishing stack 2026-04-06 11:49:47 +03:00
Elian Doran 09258179f0 refactor(client): one more ineffective dynamic import due to appContext 2026-04-06 11:46:35 +03:00
Elian Doran 40e986b188 refactor(client): ineffective dynamic imports 2026-04-06 11:41:35 +03:00
Elian Doran 37e47041bf Merge branch 'main' of https://github.com/TriliumNext/Trilium 2026-04-06 11:41:09 +03:00
Elian Doran 543438bca0 chore(ai): mention instructions for adding new locale 2026-04-06 11:28:10 +03:00
Elian Doran b31290c1fc fix(deps): update dependency fuse.js to v7.2.0 (#9303) 2026-04-06 11:22:33 +03:00
Elian Doran d41111a209 docs(dev): remove unnecessary step for adding new locale 2026-04-06 11:21:17 +03:00
Elian Doran 828b523382 feat(i18n): enable Czech 2026-04-06 11:20:58 +03:00
Elian Doran 32409ecbee Translations update from Hosted Weblate (#9295) 2026-04-06 11:16:03 +03:00
renovate[bot] 3ca2cec63a chore(deps): update dependency copy-webpack-plugin to v14 2026-04-06 08:14:46 +00:00
Francis C. 1ed2db0c82 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (1842 of 1842 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hant/
2026-04-06 08:13:48 +00:00
Francis C. 2423b74dd0 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (391 of 391 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/zh_Hant/
2026-04-06 08:13:48 +00:00
Tomas Adamek 3f781ea298 Translated using Weblate (Czech)
Currently translated at 98.9% (1822 of 1842 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/cs/
2026-04-06 08:13:47 +00:00
Tomas Adamek 30c5c49aef Translated using Weblate (Czech)
Currently translated at 100.0% (391 of 391 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/cs/
2026-04-06 08:13:47 +00:00
Tomas Adamek 9421e39c34 Translated using Weblate (Czech)
Currently translated at 100.0% (116 of 116 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/cs/
2026-04-06 08:13:46 +00:00
Tomas Adamek c46805cf4f Translated using Weblate (Czech)
Currently translated at 100.0% (158 of 158 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/cs/
2026-04-06 08:13:46 +00:00
Elian Doran f181343fca chore(deps): update dependency @redocly/cli to v2.25.4 (#9297) 2026-04-06 11:13:37 +03:00
Elian Doran 8a512e4f73 chore(deps): update dependency electron to v41 (#9306) 2026-04-06 11:13:01 +03:00
Elian Doran 06a3750168 chore(renovate): group AI SDK updates 2026-04-06 11:09:07 +03:00
renovate[bot] 35c1a5642d fix(deps): update dependency @eslint/js to v10 2026-04-06 01:05:51 +00:00
renovate[bot] f29df2ad28 chore(deps): update dependency electron to v41 2026-04-06 01:03:55 +00:00
renovate[bot] 75a5714451 chore(deps): update dependency @electron/fuses to v2 2026-04-06 01:01:53 +00:00
renovate[bot] 2882863b5b fix(deps): update dependency fuse.js to v7.2.0 2026-04-06 01:00:57 +00:00
renovate[bot] 773b6cca14 chore(deps): update dependency @redocly/cli to v2.25.4 2026-04-06 00:54:32 +00:00
Elian Doran f97370c8f7 Dependency cleanup (#9293) 2026-04-05 23:04:03 +03:00
Elian Doran afad96a375 Merge remote-tracking branch 'origin/main' into feature/dependency_cleanup 2026-04-05 22:56:13 +03:00
Elian Doran 9e5ababfcb chore(deps): update dependency electron to v41.1.1 (#9277) 2026-04-05 22:51:05 +03:00
Elian Doran dc1e0e8db4 fix(desktop): tesseract.js not copied 2026-04-05 22:22:58 +03:00
Elian Doran 1e861d1125 chore(ocr): externalize tesseract.js completely 2026-04-05 22:20:38 +03:00
Elian Doran baa93cb371 chore(ocr): expose needed dependencies 2026-04-05 22:14:01 +03:00
Elian Doran 61dcc8db47 Revert "fix(ocr): not working in server prod"
This reverts commit f4f881e839.
2026-04-05 21:53:53 +03:00
ce603 15505ffcd8 Update docs/User Guide/User Guide/Installation & Setup/Web Clipper.md
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-04-05 14:41:25 -04:00
Elian Doran 2c557eb015 Revert "fix(desktop): failing in prod due to tesseract"
This reverts commit 9e34fcb8a8.
2026-04-05 21:36:11 +03:00
Elian Doran f5a80526ab fix(deps): update dependency mermaid to v11.14.0 (#9282) 2026-04-05 21:35:45 +03:00
ce603 96cef35f09 Update Web Clipper.md
Update web clipper docs with published store links
2026-04-05 14:28:51 -04:00
Elian Doran 27e1455874 fix(mermaid): treeview clipped when padding 2026-04-05 21:27:39 +03:00
Elian Doran 278d8428de feat(mermaid): integrate two new note types 2026-04-05 21:26:42 +03:00
Elian Doran 164e667158 chore: remove empty dependencies list in JSON 2026-04-05 21:05:11 +03:00
Elian Doran 28b31791e7 fix(codemirror): broken dependency on electron-window-state 2026-04-05 21:03:24 +03:00
Elian Doran 9515768e62 fix(server): broken dependency on electron-window-state 2026-04-05 21:02:03 +03:00
Elian Doran fbbad19cb7 chore(deps): update dependency electron to v40.8.5 [security] (#9291) 2026-04-05 20:59:58 +03:00
Elian Doran eab353ca2e chore(deps): remove unnecessary depedencies 2026-04-05 20:58:02 +03:00
Elian Doran cb9ee20763 chore(deps): remove hard-coded dependency to @smithy/middleware-retry 2026-04-05 20:55:43 +03:00
Elian Doran dac12532bc Merge branch 'main' into renovate/electron-41.x 2026-04-05 20:49:33 +03:00
Elian Doran 1d99734ea0 chore(ci): try to bypass operation not permitted in Electron build
7
node_modules/fs-xattr install: gyp http 200 https://nodejs.org/download/release/v24.14.1/node-v24.14.1-headers.tar.gz
node_modules/wxt/node_modules/esbuild postinstall$ node install.js
node_modules/wxt/node_modules/esbuild postinstall: Done
node_modules/macos-alias install: gyp http GET https://nodejs.org/download/release/v24.14.1/SHASUMS256.txt
node_modules/macos-alias install: gyp http 200 https://nodejs.org/download/release/v24.14.1/SHASUMS256.txt
node_modules/fs-xattr install: gyp http GET https://nodejs.org/download/release/v24.14.1/SHASUMS256.txt
node_modules/fs-xattr install: gyp http 200 https://nodejs.org/download/release/v24.14.1/SHASUMS256.txt
node_modules/electron postinstall: Done
.../remote/node_modules/electron postinstall: Done
 ERR_PNPM_EPERM  EPERM: operation not permitted, link '/Users/runner/work/Trilium/Trilium/node_modules/@electron/remote/node_modules/electron/dist/Electron.app/Contents/Frameworks/Electron Framework.framework/Helpers' -> 'apps/desktop/node_modules/_tmp_3196_65c494775712c8b30c73644d84dc191e/dist/Electron.app/Contents/Frameworks/Electron Framework.framework/Helpers'
2026-04-05 20:49:06 +03:00
Elian Doran 3e764c762a chore(desktop): remove unnecessary dependencies 2026-04-05 20:43:37 +03:00
Elian Doran 7be51168d3 Merge branch 'main' into renovate/electron-41.x 2026-04-05 20:38:36 +03:00
Elian Doran 530d193734 fix(forge): build no longer working due to audit 2026-04-05 20:37:33 +03:00
Elian Doran aba5ff75af fix(server): sync version not increased after breaking changes 2026-04-05 20:22:49 +03:00
Elian Doran 9e34fcb8a8 fix(desktop): failing in prod due to tesseract 2026-04-05 20:15:08 +03:00
Elian Doran 055dd9cd01 chore(toast): fix button alignment if no title & make buttons full-width 2026-04-05 20:14:54 +03:00
Elian Doran 1437fdc4e3 feat(ocr): warn if text wasn't retrieved on manual to due low confidence 2026-04-05 20:14:38 +03:00
Elian Doran e5c67b16ac fix(flake): failing due to symlinks to /build 2026-04-05 20:12:59 +03:00
Elian Doran 94987314b8 feat(ocr): warn about OCR confidence too low 2026-04-05 20:03:12 +03:00
Elian Doran f4f881e839 fix(ocr): not working in server prod 2026-04-05 19:58:48 +03:00
renovate[bot] 92f5901b95 chore(deps): update dependency electron to v41.1.1 2026-04-05 16:44:14 +00:00
renovate[bot] 1c0cb601cb chore(deps): update dependency electron to v40.8.5 [security] 2026-04-05 16:43:32 +00:00
Elian Doran 109f06f8bb Merge branch 'release/v0.102.2'
; Conflicts:
;	apps/desktop/package.json
;	apps/server/src/routes/api/image.ts
;	apps/server/src/share/routes.ts
;	pnpm-lock.yaml
2026-04-05 19:41:24 +03:00
Elian Doran bf23439792 chore(release): prepare for v0.102.2
Checks / main (push) Successful in 2s
/ Check Docker build (Dockerfile) (push) Failing after 39s
/ Check Docker build (Dockerfile.alpine) (push) Failing after 40s
/ Build Docker images (Dockerfile, ubuntu-24.04-arm, linux/arm64) (push) Has been skipped
/ Build Docker images (Dockerfile.alpine, ubuntu-latest, linux/amd64) (push) Has been skipped
/ Build Docker images (Dockerfile.legacy, ubuntu-24.04-arm, linux/arm/v7) (push) Has been skipped
/ Build Docker images (Dockerfile.legacy, ubuntu-24.04-arm, linux/arm/v8) (push) Has been skipped
/ Merge manifest lists (push) Has been skipped
Release / Sanity Check (push) Failing after 45s
Release / Make Electron (arm64, map[forge_platform:darwin image:macos-latest name:macos shell:bash]) (push) Has been skipped
Release / Make Electron (arm64, map[forge_platform:linux image:ubuntu-22.04 name:linux shell:bash]) (push) Has been skipped
Release / Make Electron (arm64, map[forge_platform:linux image:ubuntu-24.04-arm name:linux shell:bash]) (push) Has been skipped
Release / Make Electron (arm64, map[forge_platform:win32 image:win-signing name:windows shell:cmd]) (push) Has been skipped
Release / Make Electron (x64, map[forge_platform:darwin image:macos-latest name:macos shell:bash]) (push) Has been skipped
Release / Make Electron (x64, map[forge_platform:linux image:ubuntu-22.04 name:linux shell:bash]) (push) Has been skipped
Release / Make Electron (x64, map[forge_platform:win32 image:win-signing name:windows shell:cmd]) (push) Has been skipped
Release / Build Linux Server (arm64, ubuntu-24.04-arm) (push) Has been skipped
Release / Build Linux Server (x64, ubuntu-22.04) (push) Has been skipped
Release / Publish release (push) Has been skipped
2026-04-05 19:30:04 +03:00
Elian Doran b7a0bc08be Various bugfixes (#9274) 2026-04-05 19:28:59 +03:00
Elian Doran 9d6a26dda9 docs(security): add more details & change reporting mechanism 2026-04-05 19:28:30 +03:00
Elian Doran a01ce2c3fc docs(release): release notes for v0.102.2 2026-04-05 19:28:03 +03:00
Elian Doran ba6298af27 Translations update from Hosted Weblate (#9289) 2026-04-05 17:11:26 +03:00
green 3d17e0aa75 Translated using Weblate (Japanese)
Currently translated at 100.0% (1837 of 1837 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2026-04-05 14:10:34 +00:00
Elian Doran 7e18166160 chore(deps): update dependency esbuild to v0.27.5 (#9278) 2026-04-05 17:10:26 +03:00
Elian Doran 40d8571797 Translations update from Hosted Weblate (#9288) 2026-04-05 17:09:36 +03:00
Elian Doran 25e04e358a Apply suggestions from code review
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-04-05 17:08:56 +03:00
Aindriú Mac Giolla Eoin e473e12c0e Translated using Weblate (Irish)
Currently translated at 100.0% (1837 of 1837 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ga/
2026-04-05 14:09:52 +02:00
Aindriú Mac Giolla Eoin dfb20df16f Translated using Weblate (Irish)
Currently translated at 100.0% (391 of 391 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ga/
2026-04-05 14:09:49 +02:00
Elian Doran efcbf439ee chore(deps): update dependency http-proxy-agent to v9 (#9283) 2026-04-05 13:54:41 +03:00
renovate[bot] 514f7fedbc chore(deps): update dependency http-proxy-agent to v9 2026-04-05 10:35:14 +00:00
Elian Doran ee88fedacd chore(deps): update dependency https-proxy-agent to v9 (#9284) 2026-04-05 13:32:40 +03:00
renovate[bot] 2933f9c49f chore(deps): update dependency esbuild to v0.27.5 2026-04-05 10:26:58 +00:00
Elian Doran 1cca5d989c chore(deps): update dependency @playwright/test to v1.59.1 (#9276) 2026-04-05 13:25:47 +03:00
Elian Doran 9981020728 chore(deps): update dependency dotenv to v17.4.0 (#9280) 2026-04-05 13:25:17 +03:00
Elian Doran 56843dcf8b chore(deps): update dependency @ckeditor/ckeditor5-dev-build-tools to v55.3.1 (#9275) 2026-04-05 13:24:29 +03:00
Elian Doran e661118192 fix(deps): update dependency @codemirror/view to v6.41.0 (#9281) 2026-04-05 13:23:16 +03:00
Elian Doran 54a7de6cb0 fix(deps): update dependency mathlive to v0.109.1 (#9279) 2026-04-05 13:22:48 +03:00
Elian Doran 13b1e0afbb fix(desktop): make failing due to wrong version of fuses 2026-04-05 12:46:39 +03:00
Elian Doran 4a48796142 chore(ci): trigger dev on release branches as well 2026-04-05 12:37:33 +03:00
Elian Doran 9a4fef80b9 chore(deps): fix pnpm lock 2026-04-05 12:15:07 +03:00
Elian Doran 79dc4b39f1 chore(client): address requested changes 2026-04-05 12:11:05 +03:00
Elian Doran 9bc18b774e test(server): add unit tests for sanitizeSvg 2026-04-05 12:11:05 +03:00
Elian Doran 465c36407c Update apps/server/src/etapi/notes.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-04-05 12:10:52 +03:00
Elian Doran b99486259e Update apps/server/src/etapi/notes.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-04-05 12:10:44 +03:00
Elian Doran ecf5475966 Update apps/desktop/package.json
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-04-05 12:10:29 +03:00
Elian Doran 90822cc8a3 chore: address requested changes 2026-04-05 11:59:45 +03:00
Elian Doran 5c46209ddc feat(server): improve request handling for SVGs 2026-04-05 11:28:28 +03:00
Elian Doran 176de87b6b feat(desktop): add Electron fuses 2026-04-05 11:01:22 +03:00
Elian Doran 7f199c527b feat(share): improve request handling for SVGs 2026-04-05 10:52:36 +03:00
Elian Doran 2432e230c5 chore(etapi): enforce MIME for image upload 2026-04-05 10:44:47 +03:00
Elian Doran fc1be0d23d fix(ckeditor5-mermaid): use textContent for diagram source rendering 2026-04-05 10:17:16 +03:00
renovate[bot] d084b9e941 chore(deps): update dependency https-proxy-agent to v9 2026-04-05 01:33:43 +00:00
renovate[bot] 6678c0af49 fix(deps): update dependency mermaid to v11.14.0 2026-04-05 01:32:26 +00:00
renovate[bot] 37754ecf31 fix(deps): update dependency @codemirror/view to v6.41.0 2026-04-05 01:31:45 +00:00
renovate[bot] 709d9633a1 chore(deps): update dependency dotenv to v17.4.0 2026-04-05 01:31:06 +00:00
renovate[bot] 7ca57efaad fix(deps): update dependency mathlive to v0.109.1 2026-04-05 01:30:27 +00:00
renovate[bot] 342fedca1c chore(deps): update dependency @playwright/test to v1.59.1 2026-04-05 01:28:20 +00:00
renovate[bot] b1262b0448 chore(deps): update dependency @ckeditor/ckeditor5-dev-build-tools to v55.3.1 2026-04-05 01:27:37 +00:00
Elian Doran 626aca5181 fix(client): toasts could render HTML content 2026-04-04 22:21:25 +03:00
Elian Doran 8204322b46 fix(openid): use more secure RNG 2026-04-04 22:02:33 +03:00
Elian Doran 70ce86cd53 fix(scripts): electron rebuild failing in flake 2026-04-04 22:01:43 +03:00
Elian Doran ed3b86cd49 fix(import): no longer preserve named note IDs 2026-04-04 21:27:37 +03:00
Elian Doran b371675494 chore(commons): mark docName as a dangerous attribute 2026-04-04 21:25:05 +03:00
Elian Doran ff06c8e7bd fix(client): validate docName attribute in doc renderer 2026-04-04 21:21:50 +03:00
Elian Doran 8ff41d8fa9 fix(server): align attachment upload validation with note upload 2026-04-04 20:46:03 +03:00
Elian Doran 5f5b9ba8cb Clean up dependencies (#9272) 2026-04-04 14:03:41 +03:00
Elian Doran a3221470e7 refactor(ckeditor): get rid of lint-staged 2026-04-04 13:34:59 +03:00
Elian Doran 0e115bd92a refactor(ckeditor): get rid of unnecessary http-server & ts-node 2026-04-04 13:32:45 +03:00
Elian Doran 95a50c0ba6 refactor(ckeditor): get rid of ckeditor5-package-tools 2026-04-04 13:27:07 +03:00
Elian Doran e323ccb259 refactor(turndown-plugin-gfm): convert tests from turndown-attendant to vite 2026-04-04 13:23:49 +03:00
Elian Doran 3294d0b93b refactor(splitjs): convert tests from karma to vitest 2026-04-04 13:13:07 +03:00
Elian Doran 55e8694990 test(server): remove redundant log 2026-04-04 13:10:03 +03:00
Elian Doran b3888b391a chore(deps): fix minimatch issue 2026-04-04 13:09:53 +03:00
Elian Doran f2907ab40f chore(deps): clean up some redundancies in overrides 2026-04-04 13:06:56 +03:00
Elian Doran 7e7218cbdf Merge remote-tracking branch 'origin/main' into chore/audit
; Conflicts:
;	pnpm-lock.yaml
2026-04-04 12:58:46 +03:00
Elian Doran e41c9cb7f4 chore(deps): revert override for file-type 2026-04-04 12:57:09 +03:00
Elian Doran 20f96c88e4 Translations update from Hosted Weblate (#9271) 2026-04-04 12:53:52 +03:00
Elian Doran 66afda1343 Apply suggestions from code review
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-04-04 12:53:35 +03:00
Hosted Weblate c5a6212065 Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/
2026-04-04 11:50:19 +02:00
noobhjy 3e7e355575 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.1% (1800 of 1815 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2026-04-04 11:50:18 +02:00
green fb9eb3e4b5 Translated using Weblate (Japanese)
Currently translated at 100.0% (391 of 391 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ja/
2026-04-04 11:50:17 +02:00
green a35ac82f24 Translated using Weblate (Japanese)
Currently translated at 100.0% (1815 of 1815 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2026-04-04 11:50:17 +02:00
Elian Doran 66add6b9e4 fix(deps): update ckeditor monorepo to v48 (major) (#9270) 2026-04-04 12:50:07 +03:00
Elian Doran fe81bde1c9 chore(scripts): fix electron rebuild failing due to Python on NixOS 2026-04-04 12:49:03 +03:00
Elian Doran 6b223098ab chore(deps): auto-fix deps 2026-04-04 12:45:11 +03:00
Elian Doran 788e867a6c fix(scripts): use flake when rebuilding Electron in postinstall script 2026-04-04 12:38:23 +03:00
Elian Doran 7ad8d307dc Merge remote-tracking branch 'origin/main' into renovate/major-ckeditor-monorepo
; Conflicts:
;	pnpm-lock.yaml
2026-04-04 12:34:17 +03:00
Elian Doran b6d4ac5ada fix(text): signature change in CK watchdog 2026-04-04 12:30:02 +03:00
Elian Doran 0a069854e5 chore(deps): update dependency pdfjs-dist to v5.6.205 (#9227) 2026-04-04 12:26:08 +03:00
Elian Doran 8770afa211 fix(ckeditor): changes in icon package structure 2026-04-04 12:25:07 +03:00
Elian Doran 312c193b1a fix(text): patches no longer applying after version upgrade 2026-04-04 12:22:52 +03:00
Elian Doran 3700e2bb93 chore(ai): update copilot instructions for PDF.js update 2026-04-04 12:17:43 +03:00
renovate[bot] a9be72081c fix(deps): update ckeditor monorepo to v48 2026-04-04 09:16:52 +00:00
Elian Doran f57b57791b fix(pdfjs): potential cache issue with PDF.js (closes #9176) 2026-04-04 12:16:10 +03:00
Elian Doran 5cf249afa4 fix(deps): update dependency i18next to v26.0.3 (#9264) 2026-04-04 12:13:12 +03:00
Elian Doran 3f24627f67 chore(deps): update dependency tesseract.js to v7 (#9269) 2026-04-04 12:12:41 +03:00
Elian Doran 806c3fdc00 Merge remote-tracking branch 'origin/main' into renovate/pdfjs-dist-5.x 2026-04-04 12:11:47 +03:00
Elian Doran e81ee88cda feat(pdfjs): update viewer to v5.6.205 2026-04-04 12:09:26 +03:00
Elian Doran db46f63337 chore(deps): update dependency @smithy/middleware-retry to v4.4.46 (#9261) 2026-04-04 12:05:39 +03:00
Elian Doran 395102026d test(ocr): image processor with PNG 2026-04-04 12:04:19 +03:00
renovate[bot] b62c078de6 fix(deps): update dependency i18next to v26.0.3 2026-04-04 08:57:28 +00:00
Elian Doran 47c1c08bed Improved tools & MC (#9256) 2026-04-04 11:53:14 +03:00
Elian Doran a23c4f03e0 fix(deps): update dependency @ai-sdk/google to v3.0.55 (#9263) 2026-04-04 11:52:34 +03:00
Elian Doran 5a6da60fe8 chore(deps): update dependency @playwright/test to v1.59.0 (#9267) 2026-04-04 11:52:12 +03:00
Elian Doran 588c47aee7 chore(deps): update dependency yauzl to v3.3.0 (#9268) 2026-04-04 11:51:39 +03:00
Elian Doran 36fd51219a chore(deps): update dependency i18next-fs-backend to v2.6.3 (#9262) 2026-04-04 11:50:41 +03:00
Elian Doran bc43a79d97 fix(deps): update dependency i18next-http-backend to v3.0.4 (#9265) 2026-04-04 11:50:28 +03:00
Elian Doran 5c22c029d7 fix(deps): update dependency react-i18next to v17.0.2 (#9266) 2026-04-04 11:50:15 +03:00
Elian Doran 126d9be9d8 fix(llm): one more async tool 2026-04-04 11:44:34 +03:00
Elian Doran 09be2822e0 fix(llm): some tools were async 2026-04-04 11:35:38 +03:00
Elian Doran a93029f789 fix(llm): misuse of transactions in tool use due to async 2026-04-04 11:21:10 +03:00
Elian Doran 48cf214f4c chore(deps): address requested changes 2026-04-04 11:07:06 +03:00
Elian Doran 6834bad7b0 chore(deps): update pnpm lock 2026-04-04 10:44:16 +03:00
Elian Doran 855458bab0 feat(options): improve alignment of option rows 2026-04-04 10:40:31 +03:00
Elian Doran 5be48bf8c8 feat(options/advanced): use tabular layout for experimental features 2026-04-04 10:35:57 +03:00
Elian Doran 80ac0eea62 feat(options/llm): don't show settings unless the experimental setting is on 2026-04-04 10:33:24 +03:00
Elian Doran 5995ec468d feat(options/llm): improve layout for MCP card 2026-04-04 10:26:27 +03:00
Elian Doran e9a876e8f0 feat(options/llm): display endpoint URL 2026-04-04 10:24:11 +03:00
Elian Doran 90223a5ffd chore(mcp): address requested changes 2026-04-04 10:15:05 +03:00
Elian Doran 8331daae5b chore(mcp): better loopback detection 2026-04-04 10:11:27 +03:00
Elian Doran 027280954a chore(llm): remove some lesser used fields from LLM response 2026-04-04 09:59:00 +03:00
Elian Doran 5138a63d23 chore(llm): encourage not to duplicate reference links with note titles 2026-04-04 09:44:11 +03:00
Elian Doran be95cf5510 refactor(commons): deduplicate wikilink plugins 2026-04-04 09:40:48 +03:00
Elian Doran 4082328c2b feat(llm): encourage LLM to use reference links 2026-04-04 09:34:15 +03:00
Elian Doran 729e840af2 refactor(llm): build system prompt using arrays 2026-04-04 09:26:26 +03:00
Elian Doran e4a38fe277 feat(llm): improve prompt when no access to web 2026-04-04 09:24:26 +03:00
Elian Doran a5cb9c7de6 feat(llm): improve prompt when no access to notes 2026-04-04 09:23:17 +03:00
Elian Doran 7543109583 chore(llm): redesign thinking card 2026-04-04 09:15:40 +03:00
renovate[bot] bff2f10fa4 chore(deps): update dependency tesseract.js to v7 2026-04-04 01:10:29 +00:00
renovate[bot] 37120bf153 chore(deps): update dependency yauzl to v3.3.0 2026-04-04 01:09:23 +00:00
renovate[bot] b88c85db5e chore(deps): update dependency @playwright/test to v1.59.0 2026-04-04 01:08:16 +00:00
renovate[bot] c682e3dfc0 fix(deps): update dependency react-i18next to v17.0.2 2026-04-04 01:07:09 +00:00
renovate[bot] 6c0bbb7778 fix(deps): update dependency i18next-http-backend to v3.0.4 2026-04-04 01:05:58 +00:00
renovate[bot] bde8c40d16 fix(deps): update dependency @ai-sdk/google to v3.0.55 2026-04-04 01:03:43 +00:00
renovate[bot] c4d352ba26 chore(deps): update dependency i18next-fs-backend to v2.6.3 2026-04-04 01:02:39 +00:00
renovate[bot] cc1c0696ad chore(deps): update dependency @smithy/middleware-retry to v4.4.46 2026-04-04 01:01:28 +00:00
Elian Doran 186b784004 feat(llm): improve bubble layout 2026-04-03 22:52:31 +03:00
Elian Doran 5441d15654 refactor(llm): use separate component for expandable card 2026-04-03 22:38:11 +03:00
Elian Doran bd61af89ae feat(llm): further improve display of citations 2026-04-03 22:34:01 +03:00
Elian Doran eddd77f97f feat(llm): group sources in expandable header 2026-04-03 22:31:58 +03:00
Elian Doran ab0338c318 fix(llm): duplicate citations 2026-04-03 22:17:40 +03:00
Elian Doran 1892bec772 fix(llm): tools calls not displayed while in progress 2026-04-03 22:13:51 +03:00
Elian Doran bf7070a7da fix(llm): tools calls not displayed during streaming 2026-04-03 22:02:19 +03:00
Elian Doran 314331b956 chore(llm): improve tool call slightly 2026-04-03 21:36:31 +03:00
Elian Doran 6ff949fdb5 feat(llm): improve tool call icons 2026-04-03 21:30:55 +03:00
Elian Doran 21d24b7bea feat(llm): group tool calls 2026-04-03 21:25:16 +03:00
Elian Doran 8522151949 refactor(llm): remove legacy tool use 2026-04-03 21:20:44 +03:00
Elian Doran 3720099b1d chore(llm): use boxicons chevron 2026-04-03 21:16:53 +03:00
Elian Doran 073873c33c chore(llm): improve tool card slightly 2026-04-03 21:15:02 +03:00
Elian Doran 25bf62faa3 refactor(llm): split CSS into components 2026-04-03 21:06:50 +03:00
Elian Doran e54cb9c626 feat(llm): basic nesting support 2026-04-03 21:00:22 +03:00
Elian Doran 208330d73a feat(llm): display tool calls as table 2026-04-03 20:53:52 +03:00
Elian Doran 343e3e67ed refactor(llm): extract tool call card to separate file 2026-04-03 20:47:44 +03:00
Elian Doran 6447003927 chore(llm): increase maximum number of steps 2026-04-03 20:38:11 +03:00
Elian Doran cbdf925703 fix(llm): cannot create non-standard note types 2026-04-03 20:31:24 +03:00
Elian Doran 7440e4a610 feat(llm): limit number of results in note meta 2026-04-03 20:26:53 +03:00
Elian Doran 54a5c3fac0 feat(llm): mention child notes directly in system prompt 2026-04-03 20:12:54 +03:00
Elian Doran 42e60da127 feat(llm): mention total number of results in search 2026-04-03 19:55:11 +03:00
Elian Doran 325dc9c8a8 feat(llm): add content preview & parent title to search 2026-04-03 19:52:47 +03:00
Elian Doran 877427f0db refactor(llm): extract helpers out of tools 2026-04-03 19:49:01 +03:00
Elian Doran 1a64e7ba63 feat(llm): provide attachments list directly in note meta 2026-04-03 19:44:23 +03:00
Elian Doran 7dfa59a845 feat(llm): encourage through system prompt 2026-04-03 19:37:58 +03:00
Elian Doran 62fd19368d feat(llm): display content preview for attachments 2026-04-03 19:33:07 +03:00
Elian Doran 058518fcba feat(llm): allow reading attachment content with OCR integration 2026-04-03 19:30:03 +03:00
Elian Doran 6e1d10f052 chore(ai): update system prompt for tool creation 2026-04-03 19:24:47 +03:00
Elian Doran af988fec69 refactor(llm): wrong types in MCP server 2026-04-03 19:20:25 +03:00
Elian Doran dd5979aec8 refactor(llm): don't rely on ETAPI mappers 2026-04-03 19:17:59 +03:00
Elian Doran 657fbeba79 refactor(llm): use same method for meta between get_note and system prompt 2026-04-03 19:12:15 +03:00
Elian Doran 4a0d45ad7d feat(llm): get_attachment + get_note_attachments 2026-04-03 19:09:43 +03:00
Elian Doran f47ec21aa8 feat(llm): provide content preview in system prompt 2026-04-03 18:59:46 +03:00
Elian Doran be40d65982 feat(llm): format system prompt metadata as YAML 2026-04-03 18:54:58 +03:00
Elian Doran faebacb883 feat(llm): inject meta-data directly in the system prompt 2026-04-03 18:51:33 +03:00
Elian Doran df0efc39d5 refactor(llm): get rid of context-aware tools 2026-04-03 18:48:59 +03:00
Elian Doran 57a299de8f feat(llm): inject current note ID in the system prompt 2026-04-03 18:48:32 +03:00
Elian Doran be724ec45f feat(llm/tools): split read_note into get_note and get_content_note 2026-04-03 18:42:00 +03:00
Elian Doran 98c70e662d feat(llm/tools): get attachments by note 2026-04-03 18:25:00 +03:00
Elian Doran 4ed9b84d75 chore(llm): synchronize provider configuration 2026-04-03 18:16:46 +03:00
Elian Doran b7f05acfd3 fix(mcp): issues after merge 2026-04-03 18:09:33 +03:00
Elian Doran 45ebb37a01 Merge remote-tracking branch 'origin/main' into feature/mcp 2026-04-03 17:57:47 +03:00
Elian Doran f77adea800 chore(deps): update typescript-eslint monorepo to v8.58.0 (#9237) 2026-04-03 17:17:10 +03:00
Elian Doran 88b855ed47 Translations update from Hosted Weblate (#9243) 2026-04-03 17:16:25 +03:00
Skriep 4fa689873f Translated using Weblate (Italian)
Currently translated at 99.2% (1774 of 1787 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/it/
2026-04-03 08:36:34 +00:00
Skriep d76b9329fc Translated using Weblate (Russian)
Currently translated at 100.0% (391 of 391 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ru/
2026-04-03 08:36:32 +00:00
noobhjy 1c43ddd3a9 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 97.1% (1736 of 1787 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2026-04-03 08:36:31 +00:00
Skriep 1aedbcef94 Translated using Weblate (Russian)
Currently translated at 100.0% (1787 of 1787 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ru/
2026-04-03 08:36:29 +00:00
Skriep 295280861a Translated using Weblate (English)
Currently translated at 100.0% (1787 of 1787 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/en/
2026-04-03 08:36:28 +00:00
noobhjy 9f70e20fa0 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.7% (390 of 391 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/zh_Hans/
2026-04-03 08:36:26 +00:00
Aindriú Mac Giolla Eoin a20e96eb6a Translated using Weblate (Irish)
Currently translated at 100.0% (391 of 391 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ga/
2026-04-03 08:36:25 +00:00
Aindriú Mac Giolla Eoin 9b238a3ac6 Translated using Weblate (Irish)
Currently translated at 100.0% (1787 of 1787 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ga/
2026-04-03 08:36:24 +00:00
Marc 0167597ae0 Translated using Weblate (French)
Currently translated at 100.0% (1787 of 1787 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/fr/
2026-04-03 08:36:22 +00:00
Marc a4f6071c8b Translated using Weblate (French)
Currently translated at 100.0% (119 of 119 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/fr/
2026-04-03 08:36:21 +00:00
Marc aa0b0bd249 Translated using Weblate (French)
Currently translated at 100.0% (391 of 391 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/fr/
2026-04-03 08:36:19 +00:00
green c6185a51c2 Translated using Weblate (Japanese)
Currently translated at 100.0% (1787 of 1787 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2026-04-03 08:36:18 +00:00
green 9c9c717025 Translated using Weblate (Japanese)
Currently translated at 100.0% (391 of 391 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ja/
2026-04-03 08:36:16 +00:00
Marc 00342ed569 Translated using Weblate (French)
Currently translated at 89.7% (1604 of 1787 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/fr/
2026-04-03 08:36:14 +00:00
Elian Doran 1f0a6b4a79 feat(ocr): add OCR (#5834) 2026-04-03 11:35:36 +03:00
Elian Doran 3e767b4723 chore(ocr): remove accidentally commited file 2026-04-03 11:25:41 +03:00
Elian Doran e539b11718 chore(ocr): upgrade to officeprocessor v6 to avoid pdfjs issues 2026-04-03 11:11:53 +03:00
Elian Doran 2fca8c3850 fix(build): missing pdfjs-dist 2026-04-03 10:33:19 +03:00
Elian Doran 0d3f70a231 chore(server): try to bypass officeparser PDFjs issue 2026-04-03 10:02:54 +03:00
Elian Doran a3a52aaafe chore(ocr): switch to unpdf due to issues with pdfjs-dist 2026-04-03 09:22:56 +03:00
Elian Doran a6c4401973 chore(server): remove pdf-parse dependency 2026-04-03 09:04:56 +03:00
Elian Doran 2e34ec2a17 chore(server): remove sharp from externals 2026-04-03 09:04:04 +03:00
Elian Doran 927afec83c chore(ocr): remove multi-page TIFF support for now to remove dependency to sharp 2026-04-03 08:50:02 +03:00
Elian Doran 8bd1da0552 fix(deps): update dependency i18next to v26.0.2 (#9255) 2026-04-03 08:42:50 +03:00
renovate[bot] 4f571fc3d7 fix(deps): update dependency i18next to v26.0.2 2026-04-03 00:49:43 +00:00
Elian Doran c3f8e523cc fix(deps): update dependency lodash-es to v4.18.1 [security] (#9252) 2026-04-02 23:14:01 +03:00
Elian Doran 9878f76f65 fix(ocr): sharp failing on Alpine 2026-04-02 22:56:22 +03:00
Elian Doran 23799562ae refactor(ocr): reuse office processor for PDFs 2026-04-02 22:53:57 +03:00
Elian Doran f441a145b5 fix(server): prod not starting due to bundling issues 2026-04-02 22:42:53 +03:00
Elian Doran 7189764916 chore(ocr): support overriding cache dir 2026-04-02 22:00:37 +03:00
Elian Doran 70bc707e3a chore(ocr): address requested changes 2026-04-02 21:58:54 +03:00
Elian Doran 90215bde8b chore(ocr): remove unnecessary index 2026-04-02 21:55:07 +03:00
Elian Doran 2b3ae5285b test(server): update integration DB to latest migration 2026-04-02 21:49:19 +03:00
Elian Doran 9b6d0db5b6 test(server): fix outdated tests in search result 2026-04-02 21:48:42 +03:00
Elian Doran 723da88ff8 chore(ocr): disable auto-processing by default 2026-04-02 21:46:05 +03:00
Elian Doran 5bcf2f4356 chore(deps): remove deprecated types for tesseract 2026-04-02 21:34:32 +03:00
Elian Doran 42680574c1 chore(deps): update pnpm lock 2026-04-02 21:34:03 +03:00
Elian Doran 82e723c915 test(ocr): fix broken tests 2026-04-02 21:27:46 +03:00
renovate[bot] ac9560d9d7 chore(deps): update typescript-eslint monorepo to v8.58.0 2026-04-02 18:18:05 +00:00
Elian Doran 32f95efa54 fix(ocr): image OCR in search results not shown 2026-04-02 21:14:56 +03:00
Elian Doran 3da416908d feat(ocr): display content snippet in quick search 2026-04-02 21:04:18 +03:00
Elian Doran d79d2e9ad2 fix(ocr): too many blob queries in search 2026-04-02 20:58:11 +03:00
Elian Doran 30ba36894d chore(ocr): optimize search algorithm
OCRContentExpression now takes all tokens as an array (like NoteContentFulltextExp), iterates over the input note set from becca, and checks text representations in-memory — zero SQL queries.
parse.ts creates a single OCRContentExpression(tokens) instead of N separate instances.
The LIMIT 50 and the N+1 blob→note/attachment queries are gone entirely.
2026-04-02 20:54:22 +03:00
Elian Doran b747402352 chore(ocr): get rid of costly ranking for OCR 2026-04-02 20:48:41 +03:00
Elian Doran 0398a9bda3 refactor(ocr): potential race condition with image upload 2026-04-02 20:40:17 +03:00
Elian Doran 72dff88384 refactor(ocr): get rid of unused routes and services 2026-04-02 20:34:37 +03:00
Elian Doran 0314a9755f refactor(ocr): minor changes 2026-04-02 20:32:58 +03:00
Elian Doran bc967b15b2 chore(server): fix accidental changes 2026-04-02 20:28:17 +03:00
Elian Doran 8ac686a19f fix(ocr): TIFF overlapping with image processor 2026-04-02 20:26:31 +03:00
Elian Doran aafecaa3a4 refactor(ocr): get rid of fake metadata 2026-04-02 20:24:31 +03:00
Elian Doran bb23b08b15 refactor(ocr): get rid of unused clean up 2026-04-02 20:23:03 +03:00
Elian Doran 476396da53 refactor(ocr): deduplicate batch processing 2026-04-02 20:19:32 +03:00
Elian Doran 5112971848 refactor(ocr): reduce duplication 2026-04-02 20:17:24 +03:00
Elian Doran 2d852c38ec feat(ocr): automatic processing of attachments 2026-04-02 20:00:55 +03:00
Elian Doran f163cacddc feat(ocr): integrate viewing attachment OCR 2026-04-02 19:51:11 +03:00
Elian Doran 6ecb1cb2b0 feat(settings): cross-reference OCR and language & region settings 2026-04-02 17:09:27 +03:00
Elian Doran 24fefe0711 refactor(ocr): remove unnecessary methods 2026-04-02 13:17:38 +03:00
Elian Doran e5eba69d0d fix(ocr): cannot handle image/tiff 2026-04-02 12:51:58 +03:00
Elian Doran bdd2b7e317 fix(ocr): properly handle office MIME types 2026-04-02 12:41:45 +03:00
Elian Doran ad29375975 chore(ocr): remove unimplemented logic 2026-04-02 12:36:10 +03:00
Elian Doran cf73a4ef43 feat(llm): integrate with OCR 2026-04-02 12:16:17 +03:00
Elian Doran 60a2621928 chore(ocr): remove last extraction date
Wasn't useful because blobs are hash-identified
2026-04-02 12:04:27 +03:00
Elian Doran b4e5d9dbc2 feat(ocr): not well integrate with sync 2026-04-02 11:43:19 +03:00
Elian Doran 650b700415 feat(options/media): use a slider for JPEG quality 2026-04-02 11:17:54 +03:00
renovate[bot] 212f742164 fix(deps): update dependency lodash-es to v4.18.1 [security] 2026-04-02 08:16:15 +00:00
Elian Doran 6f2296eb05 feat(ocr): use a slider for confidence 2026-04-02 11:09:36 +03:00
Elian Doran 722efd74c2 fix(ocr): default confidence level is too low 2026-04-02 11:06:58 +03:00
Elian Doran 5dc9b6defe chore(ocr): deduplicate & fix percentage for confidence in log 2026-04-02 11:04:26 +03:00
Elian Doran 605fbaaa4a fix(ocr): automatic OCR not respecting language 2026-04-02 11:01:20 +03:00
Elian Doran 23b46865c5 refactor(ocr): simplify initialization of image processor 2026-04-02 10:59:58 +03:00
Elian Doran ac310eaaf5 feat(ocr): handle cache dir properly 2026-04-02 10:54:15 +03:00
Elian Doran 010f59df8a chore(ocr): make OCR text representation selectable 2026-04-02 10:25:41 +03:00
Elian Doran 44a5dccd61 chore(ocr): remove master switch 2026-04-02 10:22:34 +03:00
Elian Doran acbbf021a1 refactor(ocr): remove unnecessary translations 2026-04-02 10:13:03 +03:00
Elian Doran 731fece258 feat(ocr): reintroduce batch processing 2026-04-02 10:08:24 +03:00
Elian Doran 8d255d1b89 feat(ocr): make "process OCR" always reprocess 2026-04-02 10:02:06 +03:00
Elian Doran 64318c92e7 fix(ocr): route default interfering with content language 2026-04-02 10:00:12 +03:00
Elian Doran 49fc7e48d4 feat(ocr): integrate with content language 2026-04-02 09:52:28 +03:00
Elian Doran ec9fa0baee chore(options): rename options to match media scope 2026-04-01 22:42:17 +03:00
Elian Doran ba91d91fd1 chore(options): start adding options for OCR 2026-04-01 22:37:32 +03:00
Elian Doran 0aa1fea9dc chore(options): improve media layout slightly 2026-04-01 22:30:41 +03:00
renovate[bot] 1551f01f49 chore(deps): update dependency pdfjs-dist to v5.6.205 2026-04-01 19:04:32 +00:00
Elian Doran d46748602e chore(settings): rebrand Images settings page to Media 2026-04-01 22:01:21 +03:00
Elian Doran 9cfad0fe6a refactor(ocr): move TextRepresentationResponse into server_api 2026-04-01 21:45:28 +03:00
Elian Doran 6d3cff84a4 feat(ocr): allow reprocessing of a file 2026-04-01 17:21:12 +03:00
Elian Doran 010230645c fix(ocr): text displayed in monospace 2026-04-01 17:20:10 +03:00
Elian Doran 5979290f0c refactor(ocr): get rid of inline styles 2026-04-01 17:18:58 +03:00
Elian Doran e648872257 fix(ocr): incorrect date display 2026-04-01 17:17:49 +03:00
Elian Doran e4910ae31a fix(ocr): pdf extraction not working due to import 2026-04-01 17:14:37 +03:00
Elian Doran d8ea0c7bcf feat(ocr): allow manual processing of OCR 2026-04-01 17:09:26 +03:00
Elian Doran 6393d2c188 chore(ocr): remove trainneddata artifact 2026-04-01 17:08:15 +03:00
Elian Doran d9f0a163cf refactor(ocr): use idiomatic status handling 2026-04-01 17:04:36 +03:00
Elian Doran 6534beec14 fix(ocr): errors not properly shown due to lack of convention 2026-04-01 16:58:34 +03:00
Elian Doran 6d050340ee fix(client): server errors don't reject the promise 2026-04-01 16:53:50 +03:00
Elian Doran 0e7f7fa208 chore(ocr): fix type issues & integrate ReadOnlyTextRepresentation 2026-04-01 16:45:38 +03:00
Elian Doran 287be0bd25 chore(scripts): integrate filter-tsc-output from standalone branch 2026-04-01 16:39:54 +03:00
Elian Doran 18cf2ff873 test(ocr): fix type issues 2026-04-01 16:35:45 +03:00
Elian Doran b626fb448b refactor(ocr): get rid of require imports 2026-04-01 16:30:27 +03:00
Elian Doran 38f6fb5a7f refactor(ocr): rename ocr_last_processed to textExtractionLastProcessed 2026-04-01 16:26:16 +03:00
Elian Doran 5846df7d02 refactor(ocr): rename ocr_text to textRepresentation 2026-04-01 16:14:08 +03:00
Elian Doran 9462d6109c Merge remote-tracking branch 'origin/main' into feat/add-ocr-capabilities 2026-04-01 15:59:05 +03:00
Elian Doran f0c93cd06e feat(llm): improve display of blocks while streaming 2026-04-01 15:38:23 +03:00
Elian Doran 14e0507689 fix(llm): web search not translated 2026-04-01 15:28:49 +03:00
Elian Doran 393b90f7be feat(llm): display skill read 2026-04-01 15:27:31 +03:00
Elian Doran 47ee5c1d84 feat(llm): display affected note in read current note 2026-04-01 15:11:34 +03:00
Elian Doran 1cb6f2d351 chore(llm): improve layout for tool card 2026-04-01 15:09:45 +03:00
Elian Doran bb72b0cdfc refactor(llm): proper translation use for element interpolation 2026-04-01 15:04:07 +03:00
Elian Doran ab2467b074 feat(llm): display note creation result 2026-04-01 14:57:45 +03:00
Elian Doran 2d652523bb feat(llm): display a reference to the affected note in tool calls 2026-04-01 14:55:18 +03:00
Elian Doran 55df50253f feat(llm): improve tool call style slightly 2026-04-01 14:51:17 +03:00
Elian Doran d009914ff9 chore(llm): update system prompt for tool creation 2026-04-01 14:48:13 +03:00
Elian Doran 5e97222206 feat(llm): display friendly tool names 2026-04-01 14:47:17 +03:00
Elian Doran 038705483b refactor(llm): integrate tools requiring context 2026-04-01 12:34:14 +03:00
Elian Doran 10c9ba5783 refactor(llm): different way to register tools 2026-04-01 12:20:08 +03:00
Elian Doran a1d008688b chore(llm): harden MCP against uninitialized database 2026-04-01 11:56:46 +03:00
Elian Doran 78a043c536 test(llm): test MCP using supertest 2026-04-01 11:52:49 +03:00
Elian Doran acdc840f17 feat(llm): improve MCP settings card 2026-04-01 11:46:54 +03:00
Elian Doran 63d4b8894b feat(llm): gate MCP access behind option 2026-04-01 11:44:01 +03:00
Elian Doran 23ccbf9642 chore(llm): add instructions for MCP use 2026-04-01 11:30:47 +03:00
Elian Doran a5793ff768 chore(mcp): add MCP config for localhost 2026-04-01 11:29:29 +03:00
Elian Doran a84e2f72c3 feat(llm/mcp): first implementation 2026-04-01 11:19:10 +03:00
Elian Doran 0d805a01c1 fix(deps): update dependency i18next to v26 (#9224) 2026-04-01 10:58:03 +03:00
Elian Doran ba90a1c396 Merge branch 'main' of https://github.com/TriliumNext/Trilium 2026-04-01 10:38:47 +03:00
Elian Doran 465927e730 chore(deps): update dependency vite-plugin-static-copy to v4 (#9147) 2026-04-01 10:28:46 +03:00
Elian Doran 74f3c14a62 fix(llm): sidebar chat lost when saving to note 2026-04-01 10:26:33 +03:00
Elian Doran 2eb40c7b42 Merge branch 'main' of https://github.com/TriliumNext/Trilium 2026-04-01 09:30:37 +03:00
Elian Doran 457c5f85af chore(client/i18n): fix weird translation 2026-04-01 09:30:34 +03:00
copilot-swe-agent[bot] c6ef3d774a fix: update vite.config.mts for vite-plugin-static-copy v4 breaking change
Agent-Logs-Url: https://github.com/TriliumNext/Trilium/sessions/df2e0038-ab36-4d77-b73a-f4739f9db838

Co-authored-by: eliandoran <21236836+eliandoran@users.noreply.github.com>
2026-03-31 20:31:34 +00:00
copilot-swe-agent[bot] 7f1e4c0969 fix: remove showSupportNotice from i18next init options (removed in v26)
Agent-Logs-Url: https://github.com/TriliumNext/Trilium/sessions/41f772f7-49b7-4905-8b17-cf90165fc736

Co-authored-by: eliandoran <21236836+eliandoran@users.noreply.github.com>
2026-03-31 20:13:27 +00:00
renovate[bot] e55cd7841f fix(deps): update dependency i18next to v26 2026-03-31 20:03:35 +00:00
Elian Doran 8b5b32fecb chore(deps): update dependency typescript to v6 (#9162) 2026-03-31 23:01:09 +03:00
copilot-swe-agent[bot] 819c9a7506 fix: resolve TypeScript 6 typecheck issues
- Remove deprecated `downlevelIteration` from tsconfig.base.json (not needed for ES2022+ target)
- Add `noUncheckedSideEffectImports: false` to tsconfig.base.json and ckeditor5 package tsconfigs to allow CSS/plugin side-effect imports
- Remove deprecated `baseUrl: "."` from 6 package tsconfig.lib.json files (unused without `paths`)
- Replace `NodeJS.Timeout` with `ReturnType<typeof setTimeout>` in debounce.ts

Agent-Logs-Url: https://github.com/TriliumNext/Trilium/sessions/8e861e56-2be6-4c61-9558-a666abbe3ff0

Co-authored-by: eliandoran <21236836+eliandoran@users.noreply.github.com>
2026-03-31 19:22:16 +00:00
Elian Doran 4b3ef50d4b Feature/llm tools (#9241) 2026-03-31 22:10:16 +03:00
Elian Doran bc945c5196 Translations update from Hosted Weblate (#9242) 2026-03-31 22:08:37 +03:00
Giovi 57ea3c576e Translated using Weblate (Italian)
Currently translated at 100.0% (1775 of 1775 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/it/
2026-03-31 19:06:02 +00:00
Marc 450e15f558 Translated using Weblate (French)
Currently translated at 89.0% (1581 of 1775 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/fr/
2026-03-31 19:06:01 +00:00
Marc a66ef977a0 Translated using Weblate (French)
Currently translated at 100.0% (391 of 391 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/fr/
2026-03-31 19:05:59 +00:00
Marc 96a474adc1 Translated using Weblate (French)
Currently translated at 100.0% (158 of 158 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/fr/
2026-03-31 19:05:59 +00:00
Giovi 1fe22aeef1 Translated using Weblate (Italian)
Currently translated at 100.0% (391 of 391 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/it/
2026-03-31 19:05:58 +00:00
Elian Doran a97897527e fix(deps): update univer monorepo to v0.19.0 (#9223) 2026-03-31 22:05:49 +03:00
Elian Doran 86bbb4d885 chore(deps): update dependency @redocly/cli to v2.25.3 (#9233) 2026-03-31 21:59:25 +03:00
Elian Doran 041f8314ab fix(deps): update dependency mind-elixir to v5.10.0 (#9228) 2026-03-31 21:58:13 +03:00
Elian Doran dffdeff798 chore(deps): fix flake lock 2026-03-31 21:52:55 +03:00
Adorian Doran d61e399c67 style/about dialog: add an animation to the donate button 2026-03-31 21:48:14 +03:00
Adorian Doran 601f246bdc style/about dialog: move the brief history tooltip from the contributor name link to the role string 2026-03-31 21:29:32 +03:00
copilot-swe-agent[bot] 6f08dc3ada Merge branch 'main' into renovate/mind-elixir-5.x - resolve translations conflict
Co-authored-by: eliandoran <21236836+eliandoran@users.noreply.github.com>
2026-03-31 18:21:21 +00:00
copilot-swe-agent[bot] 07e1b86586 chore: keep only English mind-map translations (others handled by Weblate)
Co-authored-by: eliandoran <21236836+eliandoran@users.noreply.github.com>
2026-03-31 18:20:11 +00:00
Adorian Doran ce4883ea39 Merge branch 'main' of https://github.com/TriliumNext/Trilium into feat/about-dialog-overhaul 2026-03-31 21:12:12 +03:00
copilot-swe-agent[bot] 2deda8947e feat: migrate mind-elixir i18n to use own translations integrated with Weblate
- Remove deprecated `locale` option and LOCALE_MAPPINGS constant from MindMap.tsx
- Add `buildMindElixirLangPack()` function using i18next translations for contextMenu.locale
- Add mind-map translation keys to all 37 locale translation files
- Languages with specific translations: de, es, fr, it, ja, pt, pt_br, ru, ro, cn, tw, fi, ko, nl, nb-NO, sv
- Other languages fall back to English via i18next

Agent-Logs-Url: https://github.com/TriliumNext/Trilium/sessions/f2cb95ee-9a97-4618-ba9a-5fb7f31ab965

Co-authored-by: eliandoran <21236836+eliandoran@users.noreply.github.com>
2026-03-31 18:08:38 +00:00
Elian Doran adb9532d1b chore(deps): update dependency @smithy/middleware-retry to v4.4.45 (#9234) 2026-03-31 21:06:22 +03:00
Elian Doran a2959342a9 chore(deps): update dependency express-rate-limit to v8.3.2 (#9236) 2026-03-31 21:05:58 +03:00
Elian Doran f528833232 chore(llm): relocate skills to assets 2026-03-31 20:52:17 +03:00
Elian Doran a6b8785341 chore(llm): address requested changes 2026-03-31 20:32:19 +03:00
Elian Doran 6e7a14fb3e chore(llm): update to AI SDK 6 2026-03-31 20:24:49 +03:00
Elian Doran 708180a037 fix(llm): sending empty messages crashes on Anthropic 2026-03-31 19:47:39 +03:00
Elian Doran 04efa2742c feat(llm): basic support for Google Gemini 2026-03-31 19:28:42 +03:00
Elian Doran 0e2c96d544 feat(llm): add web search to OpenAI 2026-03-31 19:08:41 +03:00
Elian Doran a45c1818a5 refactor(llm): deduplicate logic between providers 2026-03-31 19:05:38 +03:00
Elian Doran f04f47d17a fix(llm): not returning full list of models 2026-03-31 18:59:02 +03:00
Elian Doran cabce14a49 chore(llm): set up for ChatGPT 2026-03-31 18:51:19 +03:00
Elian Doran 5f669684c4 feat(llm): enforce MIME type in code notes 2026-03-31 18:39:47 +03:00
Elian Doran 4d169809bd chore(llm): improve render notes skill 2026-03-31 18:12:42 +03:00
Elian Doran 2929d64fa0 chore(llm): improve TSX import skill 2026-03-31 18:07:28 +03:00
Elian Doran 20311d31f6 chore(llm): modify frontend script to prefer Preact 2026-03-31 16:04:48 +03:00
Elian Doran c13b68ef42 feat(llm): basic skill to write scripts 2026-03-31 16:01:20 +03:00
Elian Doran 8eff623b67 Merge remote-tracking branch 'origin/main' into feature/llm_tools 2026-03-31 15:52:10 +03:00
Elian Doran f4b9207379 fix(llm/sidebar): no longer properly persisting the chat 2026-03-31 15:52:05 +03:00
Elian Doran 90930e19e7 feat(llm): improve search discoverability 2026-03-31 15:41:56 +03:00
Elian Doran 8c0dacd6d7 feat(llm): basic skill to do search 2026-03-31 15:36:50 +03:00
Elian Doran c617bea45a feat(llm): basic tool to get subtree 2026-03-31 15:15:14 +03:00
Elian Doran bac25c9173 feat(llm): basic tool to get child notes 2026-03-31 15:04:02 +03:00
renovate[bot] acfc3f617e chore(deps): update dependency typescript to v6 2026-03-31 11:14:01 +00:00
Elian Doran 4c6aa3baf1 Translations update from Hosted Weblate (#9240) 2026-03-31 14:11:37 +03:00
Elian Doran ed2d72c008 AI reintegration test (#9225) 2026-03-31 14:11:02 +03:00
Marc 3cb82c58a1 Translated using Weblate (French)
Currently translated at 99.3% (157 of 158 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/fr/
2026-03-31 13:09:51 +02:00
Marc d87e3cb24d Translated using Weblate (French)
Currently translated at 90.2% (1551 of 1719 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/fr/
2026-03-31 13:09:50 +02:00
Elian Doran 8a4c46c40b feat(server): protect becca against protoype pollution 2026-03-31 14:03:49 +03:00
Elian Doran 5f3dcdb7e5 fix(renovate): set up a minimum release age before doing updates 2026-03-31 10:53:37 +03:00
Elian Doran 8964c316b8 Revert "chore(deps): update dependency axios to v1.14.1" (#9239) 2026-03-31 10:46:43 +03:00
Elian Doran 230f682a27 Revert "chore(deps): update dependency axios to v1.14.1" 2026-03-31 10:46:30 +03:00
Elian Doran 8f25d048df chore(deps): update dependency axios to v1.14.1 (#9235) 2026-03-31 07:32:25 +03:00
renovate[bot] 90fcf3153c chore(deps): update dependency express-rate-limit to v8.3.2 2026-03-31 01:48:59 +00:00
renovate[bot] 069c4cf5c4 chore(deps): update dependency axios to v1.14.1 2026-03-31 01:48:18 +00:00
renovate[bot] f10e55ad71 chore(deps): update dependency @smithy/middleware-retry to v4.4.45 2026-03-31 01:47:36 +00:00
renovate[bot] a934c7842b chore(deps): update dependency @redocly/cli to v2.25.3 2026-03-31 01:46:56 +00:00
Elian Doran a2b6bc0493 chore(llm): address requested changes 2026-03-30 22:20:44 +03:00
Elian Doran 24e418bf7c Translations update from Hosted Weblate (#9232) 2026-03-30 22:03:35 +03:00
Hosted Weblate 3fc3ef4ea8 Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/
2026-03-30 18:59:12 +00:00
Elian Doran 952d6b9851 feat(db): add missing sqlite indices to help with performance (#9141) 2026-03-30 21:58:54 +03:00
Elian Doran 841c58ca8c chore: fix type errors 2026-03-30 20:23:00 +03:00
Elian Doran 41164add15 chore(deps): fix OOM caused by Zod
See https://github.com/vercel/ai/issues/7351
2026-03-30 20:17:37 +03:00
Elian Doran f4858d3684 refactor(llm): simplify the saving process 2026-03-30 19:40:38 +03:00
Elian Doran be60479122 fix(llm): XSS risk when displaying the message 2026-03-30 19:36:22 +03:00
Elian Doran 948f160d14 fix(llm): XSS risk when displaying the message 2026-03-30 19:31:56 +03:00
Elian Doran 768c733f92 fix(llm): missing translation for name 2026-03-30 19:31:44 +03:00
Elian Doran 1a02be7c91 fix(llm): usage not reset when opening an empty chat 2026-03-30 19:23:42 +03:00
Elian Doran ac75f6f7a6 feat(llm): hide the feature behind an experimental flag 2026-03-30 19:19:04 +03:00
Elian Doran b2befb4feb feat(llm): automatic refresh of note title 2026-03-30 19:08:54 +03:00
Elian Doran 3e49399f82 fix(llm): automatic title not working for standalone chats 2026-03-30 19:03:17 +03:00
Elian Doran eaaaf3effd fix(llm): automatic title not persisted 2026-03-30 18:59:49 +03:00
Elian Doran f2cd1be3af fix(llm): history doesn't show last notes correctly 2026-03-30 18:55:41 +03:00
Elian Doran b4fcf41420 feat(llm): basic auto-title 2026-03-30 18:52:22 +03:00
Elian Doran 5feccae2a0 feat(llm): enable cache control in Anthropic 2026-03-30 18:26:49 +03:00
Elian Doran d28318005d feat(llm): basic support for attributes 2026-03-30 18:26:23 +03:00
Elian Doran fcf39d7786 feat(llm): show footer only on hover 2026-03-30 18:14:23 +03:00
Elian Doran 5e9fc614d7 feat(llm): display message time 2026-03-30 18:08:20 +03:00
Elian Doran a860803cc4 feat(llm): add usage underneath the message 2026-03-30 18:02:06 +03:00
Elian Doran c40f5953fa feat(llm): make the prompt usage more compact 2026-03-30 17:56:07 +03:00
Elian Doran 241282296e fix(llm): report append to note not supporting all string content types 2026-03-30 17:50:28 +03:00
Elian Doran 8a8143167f feat(llm): report tool call errors 2026-03-30 17:45:58 +03:00
Elian Doran 12797293f0 feat(llm): improve model name display 2026-03-30 17:40:57 +03:00
Elian Doran af0eb9551a feat(llm): save revision before changing content 2026-03-30 17:32:40 +03:00
Elian Doran 8a492450da feat(llm): render tools inline 2026-03-30 17:29:25 +03:00
Elian Doran f3cb356b2b chore(llm): allow editing all string note types 2026-03-30 17:20:18 +03:00
Elian Doran 8ea1b7afba chore(llm): always mention note type 2026-03-30 17:16:49 +03:00
Elian Doran 911c1bdd0c feat(llm): use Markdown instead of HTML 2026-03-30 17:13:20 +03:00
Elian Doran 41f3274c7e feat(llm): use tool-based approach for reading current note 2026-03-30 17:08:47 +03:00
Elian Doran 0fc62dda78 chore(llm): styling of history menu 2026-03-30 16:38:11 +03:00
Elian Doran e482c911c4 chore(desktop): add script to start prod with no dir 2026-03-30 12:45:30 +03:00
renovate[bot] 0e59126c52 fix(deps): update dependency mind-elixir to v5.10.0 2026-03-30 01:32:10 +00:00
Elian Doran abbe6437a9 chore(llm): use NoItems for type widget as well 2026-03-29 23:58:30 +03:00
Elian Doran f2d67d4128 fix(desktop): stream not working on Electron 2026-03-29 23:50:23 +03:00
Elian Doran 7c9e02996e fix(desktop): unable to list providers 2026-03-29 23:47:37 +03:00
Elian Doran dc560edb7c fix(deps): update dependency preact-render-to-string to v6.6.7 (#9221) 2026-03-29 23:23:55 +03:00
renovate[bot] f7bbcee386 fix(deps): update dependency preact-render-to-string to v6.6.7 2026-03-29 20:23:27 +00:00
Elian Doran 2182d4b440 fix(deps): update dependency react-i18next to v17.0.1 (#9222) 2026-03-29 23:21:15 +03:00
Elian Doran c43e10c4af feat(llm): add tool to create note 2026-03-29 23:01:05 +03:00
Elian Doran 25037324ab feat(llm): improve handling when there is no provider set 2026-03-29 22:55:28 +03:00
Elian Doran b8f9916d13 feat(llm): add tools to append or replace note content 2026-03-29 22:53:06 +03:00
Elian Doran ed8b9cc943 feat(llm): integrate API keys with provider settings 2026-03-29 22:46:07 +03:00
Elian Doran efbe7e0a21 feat(llm): add provider config in options 2026-03-29 22:42:05 +03:00
Elian Doran 46dd500d37 chore(llm): improve button for note access 2026-03-29 22:21:42 +03:00
Elian Doran 261c95fb06 feat(llm): add button to toggle access to the note 2026-03-29 22:20:26 +03:00
Elian Doran 41a122f722 feat(llm): allow the sidebar chat access to the note content 2026-03-29 22:09:29 +03:00
Elian Doran 490406e12a feat(llm): create empty settings page 2026-03-29 22:03:52 +03:00
Elian Doran d12677094d chore(llm): improve chat bar size in sidebar 2026-03-29 21:54:50 +03:00
Elian Doran 3c69792744 feat(llm): improve layout with send button & context window 2026-03-29 21:52:35 +03:00
Elian Doran 395e79adbf fix(llm): sidebar chat box required scrolling to reach 2026-03-29 21:46:04 +03:00
Elian Doran d5e56d8e29 feat(llm): integrate chat options into model selector 2026-03-29 21:43:27 +03:00
Elian Doran e4c4873aa7 feat(llm): group legacy models into submenu 2026-03-29 21:35:33 +03:00
Elian Doran 293da1d4ef feat(llm): display cost next to the title 2026-03-29 21:29:59 +03:00
Elian Doran d1c206a05a feat(llm): add same selectors in sidebar 2026-03-29 21:22:54 +03:00
Elian Doran 37b370511f chore(llm): get rid of different chat bar for sidebar 2026-03-29 21:14:09 +03:00
Elian Doran 734ef5533a refactor(llm): extract chat input bar into separate component 2026-03-29 21:11:51 +03:00
Elian Doran 0eb9b9fdac fix(llm): wrong icon size 2026-03-29 21:05:58 +03:00
Elian Doran 7817890cfe feat(llm): history button 2026-03-29 21:00:43 +03:00
Elian Doran 23dbedd139 refactor(llm): deduplicate LLM chat widgets 2026-03-29 20:28:19 +03:00
Elian Doran 2c8e2251fa feat(llm): use a better placeholder 2026-03-29 20:13:11 +03:00
Elian Doran 4c27ed9997 fix(sidebar): pressing a sidebar button would collapse the section 2026-03-29 20:11:16 +03:00
Elian Doran d2fd1362c0 feat(llm): redesign sidebar to work on a single conversation 2026-03-29 20:09:00 +03:00
Elian Doran 45e57f0d5e chore(llm): always show AI chat sidebar 2026-03-29 20:00:22 +03:00
Elian Doran 660facea96 fix(llm): hide sidebar item if already in a chat 2026-03-29 19:52:44 +03:00
Elian Doran 9fa2e940d6 fix(llm): chat note created for every note navigated to 2026-03-29 19:49:13 +03:00
Elian Doran 0ffcfb8f43 feat(llm): identify sidebar chat notes by note ID 2026-03-29 19:45:45 +03:00
Elian Doran ad1b3df74e fix(llm): sidebar not collapsing properly 2026-03-29 19:36:58 +03:00
Elian Doran 0ccf10bbbb feat(llm): basic sidebar implementation 2026-03-29 19:35:33 +03:00
Elian Doran 59c007e801 feat(llm): API to create LLM notes similar to search 2026-03-29 18:55:43 +03:00
Elian Doran 0654bc1049 fix(llm): wrong context window 2026-03-29 15:20:08 +03:00
Elian Doran 9fabefc847 feat(llm): minimize context window indicator 2026-03-29 15:17:27 +03:00
Elian Doran e70ded0be1 fix(llm): content window progress bar not shown at startup 2026-03-29 15:12:18 +03:00
Elian Doran 16806275e0 feat(llm): basic context window progress bar 2026-03-29 15:10:49 +03:00
Elian Doran e8214c3aae chore(llm): update list of models 2026-03-29 15:03:53 +03:00
Elian Doran 3a8e148301 chore(llm): correct pricing 2026-03-29 14:54:51 +03:00
Elian Doran a0b546614f chore(llm): make multiplier relative to default 2026-03-29 14:47:41 +03:00
Elian Doran 5fcea86b94 feat(llm): basic cost multiplier 2026-03-29 14:44:40 +03:00
Elian Doran d8c00ed6c0 chore(llm): use FormDropdownList 2026-03-29 14:39:53 +03:00
Elian Doran 863e68ec88 feat(llm): add model switcher 2026-03-29 14:34:31 +03:00
Elian Doran 046ee343dc feat(llm): display the model that was used 2026-03-29 14:06:23 +03:00
Elian Doran 2db9e376d5 refactor(llm): delegate pricings to provider 2026-03-29 14:02:33 +03:00
Elian Doran 9458128ad6 feat(llm): display estimated cost 2026-03-29 13:57:25 +03:00
Elian Doran 89638e3f56 feat(llm): display usage info (prompt + completion) 2026-03-29 13:53:13 +03:00
Elian Doran 8d492d7d4b feat(llm): show tool calls as references 2026-03-29 13:37:35 +03:00
Elian Doran 246c561b64 feat(llm): basic tool use 2026-03-29 13:30:04 +03:00
Elian Doran 88295f2462 refactor(llm): use vercel/AI instead 2026-03-29 13:07:21 +03:00
Elian Doran d2d4e1cbac refactor(llm): use vercel/AI instead 2026-03-29 13:03:05 +03:00
Elian Doran 261e5b59e0 refactor(llm): use shared types in commons 2026-03-29 12:44:53 +03:00
Elian Doran fa7ec01329 fix(llm): use of crypto.randomUUID 2026-03-29 12:27:18 +03:00
Elian Doran 4c4a29f9cf chore(llm): fix type issues 2026-03-29 12:24:13 +03:00
Elian Doran 9ddcaf4552 refactor(server): add triliumResponseHandled to typings 2026-03-29 12:01:06 +03:00
Elian Doran c806a99fbc feat(llm): display thinking process 2026-03-29 11:51:39 +03:00
Elian Doran ad91d360ce fix(llm): thinking budget mismatch 2026-03-29 11:41:28 +03:00
Elian Doran cf8d7cd71f feat(llm): persist errors 2026-03-29 11:37:12 +03:00
Elian Doran f370799b1d chore(llm): start working on extended thjinking 2026-03-29 11:26:10 +03:00
Elian Doran f8655b5de4 fix(llm): errors not selectable 2026-03-29 11:25:54 +03:00
renovate[bot] ed3a5778d0 fix(deps): update univer monorepo to v0.19.0 2026-03-29 00:54:35 +00:00
renovate[bot] 19d213059f fix(deps): update dependency react-i18next to v17.0.1 2026-03-29 00:53:30 +00:00
Elian Doran 276a802ab2 chore(deps): update dependency @ckeditor/ckeditor5-dev-build-tools to v55.3.0 (#9209) 2026-03-28 23:28:14 +02:00
Elian Doran e756ded89f fix(deps): update dependency @zumer/snapdom to v2.7.0 (#9213) 2026-03-28 23:27:22 +02:00
Elian Doran b551f0fe2d feat(llm): basic Markdown rendering 2026-03-28 21:19:59 +02:00
Elian Doran f6e8bdb0fd fix(llm): text not selectable 2026-03-28 21:07:54 +02:00
Elian Doran 9029ea8085 fix(llm): last response not saved 2026-03-28 21:06:20 +02:00
Elian Doran d61ade9fe9 feat(llm): add basic web search support 2026-03-28 21:00:53 +02:00
Elian Doran aa1fe549c7 feat(llm): make source viewable 2026-03-28 20:52:40 +02:00
Elian Doran e3701bbcb4 fix(llm): streaming not working due to compression 2026-03-28 20:45:35 +02:00
Elian Doran fb7fc4bf0c feat(llm): basic chat interface 2026-03-28 20:39:09 +02:00
Lorinc936 f8c59a1730 Merge branch 'main' into main 2026-03-28 17:26:36 +00:00
Elian Doran dc50ca157d chore(deps): update dependency electron to v41.1.0 (#9211) 2026-03-28 11:11:11 +02:00
Elian Doran ff2e775b5e chore(deps): update node.js to v24.14.1 (#9184) 2026-03-28 11:10:44 +02:00
renovate[bot] 584d48c5ab chore(deps): update dependency vite-plugin-static-copy to v4 2026-03-28 09:06:29 +00:00
Elian Doran 25df43b0be chore(deps): update dependency vite to v8.0.3 (#9194) 2026-03-28 11:02:24 +02:00
Elian Doran 1af1fcd148 chore(deps): update dependency @redocly/cli to v2.25.2 (#9206) 2026-03-28 10:54:11 +02:00
Elian Doran 516f9aad45 fix(deps): update dependency @preact/signals to v2.9.0 (#9212) 2026-03-28 10:53:55 +02:00
Elian Doran 79a420de0f chore(deps): update dependency express-openid-connect to v2.20.1 (#9207) 2026-03-28 10:50:27 +02:00
Elian Doran ac213b6664 fix(deps): update dependency katex to v0.16.44 (#9208) 2026-03-28 10:50:01 +02:00
Elian Doran ff2d74029a chore(deps): update dependency axios to v1.14.0 (#9210) 2026-03-28 10:49:46 +02:00
Elian Doran 31ac1d3f2d fix(deps): update dependency react-i18next to v17 (#9214) 2026-03-28 10:49:21 +02:00
renovate[bot] 2c32382ca6 fix(deps): update dependency react-i18next to v17 2026-03-28 01:18:11 +00:00
renovate[bot] 0d94c20deb fix(deps): update dependency @zumer/snapdom to v2.7.0 2026-03-28 01:17:16 +00:00
renovate[bot] 9904df1611 fix(deps): update dependency @preact/signals to v2.9.0 2026-03-28 01:16:17 +00:00
renovate[bot] 2d945d4fb2 chore(deps): update dependency electron to v41.1.0 2026-03-28 01:15:19 +00:00
renovate[bot] c1f9a22bf3 chore(deps): update dependency axios to v1.14.0 2026-03-28 01:14:20 +00:00
renovate[bot] 22e2e2339e chore(deps): update dependency @ckeditor/ckeditor5-dev-build-tools to v55.3.0 2026-03-28 01:13:17 +00:00
renovate[bot] b6435bbfc9 fix(deps): update dependency katex to v0.16.44 2026-03-28 01:12:21 +00:00
renovate[bot] 63387cb958 chore(deps): update dependency express-openid-connect to v2.20.1 2026-03-28 01:11:16 +00:00
renovate[bot] a8d104ec57 chore(deps): update dependency @redocly/cli to v2.25.2 2026-03-28 01:10:12 +00:00
Adorian Doran 2432bb11c7 style/about dialog: allow long directory paths to be wrapped 2026-03-27 19:13:05 +02:00
renovate[bot] 10377b527f chore(deps): update dependency vite to v8.0.3 2026-03-27 17:05:56 +00:00
Adorian Doran 87fb568995 style/about dialog: customize the style of tooltips used for brief history 2026-03-27 18:42:26 +02:00
Adorian Doran 355209769f style/tooltips: use higher contrast on the light theme 2026-03-27 18:30:24 +02:00
Adorian Doran 72cc5cc5ea style/about dialog: update the donate button link on light theme 2026-03-27 18:23:05 +02:00
Adorian Doran d4552fa075 client/about dialog: refactor 2026-03-27 18:08:36 +02:00
JYC333 4413566e14 chore(deps): update dependency happy-dom to v20.8.9 (#9192) 2026-03-27 15:46:18 +00:00
Adorian Doran 8dafd918ed Merge branch 'main' of https://github.com/TriliumNext/Trilium into feat/about-dialog-overhaul 2026-03-27 17:29:16 +02:00
renovate[bot] 6c295611cc chore(deps): update node.js to v24.14.1 2026-03-27 06:55:05 +00:00
renovate[bot] c1c98a6955 chore(deps): update dependency happy-dom to v20.8.9 2026-03-27 06:53:56 +00:00
Elian Doran 6e222bb901 chore(deps): update dependency user-agent-data-types to v0.4.3 (#9193) 2026-03-27 08:49:31 +02:00
Elian Doran 82b8601e0b chore(deps): update vitest monorepo to v4.1.2 (#9195) 2026-03-27 08:49:02 +02:00
Elian Doran 47e515bc77 fix(deps): update dependency i18next to v25.10.10 (#9196) 2026-03-27 08:48:25 +02:00
Elian Doran eef35c3a5f fix(deps): update dependency panzoom to v9.4.4 (#9198) 2026-03-27 08:43:36 +02:00
Elian Doran a18d0484c5 chore(deps): update dependency express-openid-connect to v2.20.0 (#9199) 2026-03-27 08:42:31 +02:00
Elian Doran 4eaa3d7ac1 chore(deps): update dependency stylelint to v17.6.0 (#9200) 2026-03-27 08:42:15 +02:00
Elian Doran ad24cf9ab9 fix(deps): update dependency katex to v0.16.43 (#9197) 2026-03-27 08:41:39 +02:00
renovate[bot] 5467d7719d chore(deps): update dependency stylelint to v17.6.0 2026-03-27 01:56:44 +00:00
renovate[bot] 875b3a3f9a chore(deps): update dependency express-openid-connect to v2.20.0 2026-03-27 01:56:02 +00:00
renovate[bot] 4ab6a66c75 fix(deps): update dependency panzoom to v9.4.4 2026-03-27 01:55:20 +00:00
renovate[bot] 53e157567d fix(deps): update dependency katex to v0.16.43 2026-03-27 01:54:38 +00:00
renovate[bot] 5725680d3a fix(deps): update dependency i18next to v25.10.10 2026-03-27 01:53:56 +00:00
renovate[bot] 07fe884fd8 chore(deps): update vitest monorepo to v4.1.2 2026-03-27 01:53:12 +00:00
renovate[bot] 8d57a593d8 chore(deps): update dependency user-agent-data-types to v0.4.3 2026-03-27 01:51:38 +00:00
Lorinc936 c833c3591f docs: documentation for downloading backups 2026-03-26 22:09:01 +01:00
Lorinc936 ccbd962e0b Backend for backup download button 2026-03-26 21:57:53 +01:00
Lorinc936 966d2afe69 Feat: backup download frontend and locales 2026-03-26 21:36:54 +01:00
Elian Doran fb9f33b9ff chore(deps): update dependency @codemirror/language to v6.12.3 (#9182) 2026-03-26 17:27:53 +02:00
Elian Doran 2c690d4dd2 chore(deps): update dependency electron to v41.0.4 (#9183) 2026-03-26 17:27:18 +02:00
renovate[bot] 7db7dc287f chore(deps): update dependency electron to v41.0.4 2026-03-26 01:15:29 +00:00
renovate[bot] dece273c2b chore(deps): update dependency @codemirror/language to v6.12.3 2026-03-26 01:14:45 +00:00
JYC333 bf7449bc90 Translations update from Hosted Weblate (#9165) 2026-03-25 15:24:42 +00:00
noobhjy 6f3c9e2883 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1719 of 1719 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2026-03-25 16:04:33 +01:00
TS 49248a636a Translated using Weblate (Polish)
Currently translated at 100.0% (387 of 387 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/pl/
2026-03-25 16:04:32 +01:00
Wojciech O f51b0eb4de Translated using Weblate (Polish)
Currently translated at 100.0% (387 of 387 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/pl/
2026-03-25 16:04:31 +01:00
Luk On f0d06815ec Translated using Weblate (Polish)
Currently translated at 100.0% (387 of 387 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/pl/
2026-03-25 16:04:30 +01:00
TS 070701ee9e Translated using Weblate (Polish)
Currently translated at 100.0% (158 of 158 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/pl/
2026-03-25 16:04:30 +01:00
TS 57fefaae1d Translated using Weblate (Polish)
Currently translated at 100.0% (116 of 116 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/pl/
2026-03-25 16:04:29 +01:00
TS 1d109f592b Translated using Weblate (Polish)
Currently translated at 100.0% (1719 of 1719 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pl/
2026-03-25 16:04:28 +01:00
Mik Piet 29b01c3fe6 Translated using Weblate (Polish)
Currently translated at 100.0% (1719 of 1719 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pl/
2026-03-25 16:04:27 +01:00
Giovi 6cd263a897 Translated using Weblate (Italian)
Currently translated at 100.0% (158 of 158 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/it/
2026-03-25 16:04:27 +01:00
Giovi c9ca1de271 Translated using Weblate (Italian)
Currently translated at 100.0% (1719 of 1719 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/it/
2026-03-25 16:04:26 +01:00
Francis C. c369ba416c Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (1719 of 1719 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hant/
2026-03-25 16:04:25 +01:00
Lluís Forns 4b3d923d29 Translated using Weblate (Catalan)
Currently translated at 6.5% (112 of 1719 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ca/
2026-03-25 16:04:24 +01:00
JYC333 64c3d0b36d chore(deps): update dependency happy-dom to v20.8.8 (#9166) 2026-03-25 15:04:13 +00:00
Adorian Doran 0386e7dd4f style/about dialog: add a clue about contributor links with a tooltip 2026-03-25 11:41:50 +02:00
Adorian Doran 573ab077ac client/about dialog: add a delay for contributor link hover event 2026-03-25 11:30:50 +02:00
Adorian Doran 496405d922 client/about dialog: add custom tooltips 2026-03-25 11:19:54 +02:00
Elian Doran 0fdc3590dc fix(deps): update dependency i18next to v25.10.9 (#9168) 2026-03-25 09:52:26 +02:00
Elian Doran 26fd6a573d chore(deps): update node.js to v24.14.1 (#9167) 2026-03-25 09:52:13 +02:00
renovate[bot] 59d8961111 fix(deps): update dependency i18next to v25.10.9 2026-03-25 06:27:01 +00:00
Elian Doran 9b733849a9 fix(deps): update dependency katex to v0.16.42 (#9169) 2026-03-25 08:24:47 +02:00
Elian Doran 133b847b15 fix(deps): update dependency react-i18next to v16.6.6 (#9170) 2026-03-25 08:24:14 +02:00
Elian Doran ecdbed6bac chore(deps): update dependency @redocly/cli to v2.25.1 (#9171) 2026-03-25 08:23:49 +02:00
Elian Doran d1deccc23c Merge branch 'main' into renovate/redocly-cli-2.x 2026-03-25 08:23:39 +02:00
Elian Doran c71d8a87b9 chore(deps): update dependency image-type to v6.1.0 (#9172) 2026-03-25 08:23:19 +02:00
Elian Doran 0614d92597 chore(deps): update pnpm to v10.33.0 (#9173) 2026-03-25 08:22:55 +02:00
renovate[bot] 9ab7e8e2b7 chore(deps): update pnpm to v10.33.0 2026-03-25 01:37:38 +00:00
renovate[bot] 0a5543cc72 chore(deps): update dependency image-type to v6.1.0 2026-03-25 01:37:27 +00:00
renovate[bot] 6d000d7b7c chore(deps): update dependency @redocly/cli to v2.25.1 2026-03-25 01:36:35 +00:00
renovate[bot] ac4ca16e85 fix(deps): update dependency react-i18next to v16.6.6 2026-03-25 01:35:37 +00:00
renovate[bot] e248d93e29 fix(deps): update dependency katex to v0.16.42 2026-03-25 01:34:41 +00:00
renovate[bot] acd786da67 chore(deps): update node.js to v24.14.1 2026-03-25 01:32:38 +00:00
renovate[bot] ef19d6260c chore(deps): update dependency happy-dom to v20.8.8 2026-03-25 01:32:31 +00:00
Adorian Doran 591b3a121f style/about dialog: add icon animation 2026-03-25 01:41:00 +02:00
Adorian Doran a81dae2ad0 client/about dialog: allow toggling to the classic icon 2026-03-25 01:01:16 +02:00
Adorian Doran d370ee2d99 style/about dialog: select the icon using CSS class names 2026-03-25 00:28:38 +02:00
Adorian Doran a6b1af6a16 style/about dialog: improve appearance 2026-03-24 23:57:44 +02:00
JYC333 638e1ebd1d chore(deps): update dependency webdriverio to v9.27.0 (#9160) 2026-03-24 21:26:56 +00:00
Adorian Doran 2d21627aff client/about dialog: refactor 2026-03-24 23:20:20 +02:00
Adorian Doran 0fb3f98136 client/about dialog: add some tooltips 2026-03-24 22:55:55 +02:00
Adorian Doran 3889d7a5be client/about dialog: add a license link 2026-03-24 21:18:13 +02:00
Adorian Doran 9d3c997743 style/about dialog: improve appearance 2026-03-24 20:18:10 +02:00
Adorian Doran 8c86f9fcea client/about dialog: fix unwanted array mutation 2026-03-24 19:49:44 +02:00
Adorian Doran 1c74a019ab style/about dialog: create a card-like table style 2026-03-24 19:32:14 +02:00
Adorian Doran 11a46f0f58 client/about dialog: reduce the contributor list length to 10 2026-03-24 18:54:48 +02:00
renovate[bot] 0c5efc3dcb chore(deps): update dependency webdriverio to v9.27.0 2026-03-24 16:25:45 +00:00
JYC333 a774218429 fix(deps): update dependency @zumer/snapdom to v2.6.0 (#9161) 2026-03-24 16:20:58 +00:00
renovate[bot] e305be9e75 fix(deps): update dependency @zumer/snapdom to v2.6.0 2026-03-24 16:03:21 +00:00
JYC333 f267dd5fc1 fix(deps): update dependency diff to v8.0.4 (#9159) 2026-03-24 15:57:59 +00:00
JYC333 6ba736b83f chore(deps): update dependency vite to v8.0.2 (#9156) 2026-03-24 15:57:40 +00:00
renovate[bot] 5eb8715295 fix(deps): update dependency diff to v8.0.4 2026-03-24 12:32:24 +00:00
renovate[bot] 7654be5132 chore(deps): update dependency vite to v8.0.2 2026-03-24 12:31:24 +00:00
JYC333 3f4358a422 chore(deps): update typescript-eslint monorepo to v8.57.2 (#9157) 2026-03-24 12:23:36 +00:00
JYC333 b3ca412bbd chore(deps): update dependency happy-dom to v20.8.7 (#9154) 2026-03-24 12:23:03 +00:00
renovate[bot] d1f60840a2 chore(deps): update typescript-eslint monorepo to v8.57.2 2026-03-24 12:04:49 +00:00
renovate[bot] a337ace856 chore(deps): update dependency happy-dom to v20.8.7 2026-03-24 12:00:19 +00:00
JYC333 0b6f6dee7f chore(deps): update vitest monorepo to v4.1.1 (#9158) 2026-03-24 11:58:29 +00:00
JYC333 93f1743432 chore(deps): update dependency typedoc to v0.28.18 (#9155) 2026-03-24 11:55:50 +00:00
renovate[bot] 3fb4ab1a31 chore(deps): update vitest monorepo to v4.1.1 2026-03-24 00:42:19 +00:00
renovate[bot] 8970d02404 chore(deps): update dependency typedoc to v0.28.18 2026-03-24 00:40:07 +00:00
Elian Doran b671aa6204 fix(deps): update dependency i18next to v25.10.5 (#9144) 2026-03-23 15:59:06 +02:00
Elian Doran 7ffb8b0202 chore(deps): update dependency vite-plugin-static-copy to v3.4.0 (#9146) 2026-03-23 15:58:47 +02:00
renovate[bot] 6564ea2738 fix(deps): update dependency i18next to v25.10.5 2026-03-23 13:40:08 +00:00
Elian Doran 0a673d2f1b fix(deps): update dependency react-i18next to v16.6.2 (#9145) 2026-03-23 15:35:20 +02:00
Adorian Doran 0a0157a1ef style/about dialog: improve appearance 2026-03-23 11:41:13 +02:00
renovate[bot] 05eea0d1f1 fix(deps): update dependency react-i18next to v16.6.2 2026-03-23 09:25:16 +00:00
Adorian Doran 680fb4122c Merge branch 'feat/about-dialog-overhaul' of https://github.com/TriliumNext/Trilium into feat/about-dialog-overhaul 2026-03-23 10:36:36 +02:00
Adorian Doran 3502324389 client/about dialog: add keys to the contributor list 2026-03-23 10:36:32 +02:00
Adorian Doran 97e52e53bf Update scripts/update-contributor-list.ts
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-03-23 10:34:03 +02:00
Adorian Doran dfd68ca8a3 scripts/update contributor list: update indentation size 2026-03-23 10:07:47 +02:00
Adorian Doran fc6bdb56df client/about dialog: refactor 2026-03-23 10:06:53 +02:00
Adorian Doran 129f1ccd8d client/about dialog: add a full list link, improve layout 2026-03-23 09:52:04 +02:00
Adorian Doran f6e92c411e client/about dialog: show the contributor list 2026-03-23 09:38:23 +02:00
Adorian Doran db98884ae4 scripts/update contributor list: refactor 2026-03-23 09:00:30 +02:00
Adorian Doran a7a1e5c480 scripts/update contributor list: optimize 2026-03-23 08:53:52 +02:00
renovate[bot] 1215fbf3e1 chore(deps): update dependency vite-plugin-static-copy to v3.4.0 2026-03-23 01:07:30 +00:00
Elian Doran ea206116cb Translations update from Hosted Weblate (#9142) 2026-03-22 23:25:09 +02:00
Adorian Doran b32dd949d7 scripts/update contributor list: add full name support for pinned contributors 2026-03-22 22:35:59 +02:00
Adorian Doran 015e50cdb8 scripts/update contributor list: refactor 2026-03-22 22:11:35 +02:00
Marcel 7d87c89668 Translated using Weblate (German)
Currently translated at 100.0% (1719 of 1719 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/de/
2026-03-22 19:09:50 +00:00
Aindriú Mac Giolla Eoin b0431f2338 Translated using Weblate (Irish)
Currently translated at 100.0% (1719 of 1719 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ga/
2026-03-22 19:09:48 +00:00
Adorian Doran f00e051e75 scripts/update contributor list: add completion feedback 2026-03-22 20:05:47 +02:00
Adorian Doran e7adf08854 scripts/update contributor list: add role for pinned contributors 2026-03-22 19:55:46 +02:00
Adorian Doran 7646d8be07 client: update the contributor list via a script, persist the list into the repo 2026-03-22 19:37:22 +02:00
Adorian Doran 978e02350c client: revert the Vite build script 2026-03-22 19:14:44 +02:00
Adorian Doran b4d0af6eb2 client/modals: make the title optional 2026-03-22 18:55:46 +02:00
Adorian Doran 555d997e34 client/about dialog: show the dialog only after the required information is ready 2026-03-22 18:53:23 +02:00
Adorian Doran 1b9124422a client/about dialog: switch to boxicons 2026-03-22 18:40:26 +02:00
perfectra1n 81f02209ea feat(db): update index and fix suggestion from gemini 2026-03-22 09:22:55 -07:00
Adorian Doran 8f23874628 client/about dialog: add an indication for the nightly version, use SVG icons 2026-03-22 18:17:13 +02:00
perfectra1n 124d456c60 feat(db): add missing sqlite indices to help with performance 2026-03-22 09:14:33 -07:00
Adorian Doran 75da044bbe client/about dialog: add a link for the build revision 2026-03-22 17:21:20 +02:00
Elian Doran 76fc9eaeb0 chore(deps): update dependency ws to v8.20.0 (#9136) 2026-03-22 11:40:00 +02:00
Elian Doran a4b7f54c64 fix(nix): build failing due to rolldown optional deps 2026-03-22 11:37:05 +02:00
Elian Doran 53192d202d chore(nix): add electron & python to shell 2026-03-22 11:37:05 +02:00
Elian Doran 6896ed2c70 chore(nix): update flake lock for new Electron version 2026-03-22 11:37:05 +02:00
Adorian Doran 19dfbaacce client/about dialog: improve, add GitHub and donate buttons 2026-03-22 11:14:16 +02:00
Elian Doran 5a96b9c48d fix(deps): update dependency i18next to v25.10.3 (#9135) 2026-03-22 10:56:13 +02:00
renovate[bot] 6113bfc57f fix(deps): update dependency i18next to v25.10.3 2026-03-22 08:49:05 +00:00
Elian Doran 9d7bc20f26 fix(deps): update dependency react-i18next to v16.6.0 (#9137) 2026-03-22 10:47:18 +02:00
Adorian Doran 31578521cf client/about dialog: create a new UI 2026-03-22 10:27:27 +02:00
Adorian Doran 8d5e82fa5e client/contributor list: refine filtering 2026-03-22 10:25:35 +02:00
renovate[bot] 79788937b9 fix(deps): update dependency react-i18next to v16.6.0 2026-03-22 01:08:10 +00:00
renovate[bot] 66873f16f2 chore(deps): update dependency ws to v8.20.0 2026-03-22 01:07:33 +00:00
perfectra1n bd25ae77fc docs(search): rewrite benchmark doc for clarity
Consolidated from 12 sections to 4. Leads with the e2e results a
reviewer cares about, follows with scaling data, then lists what
changed and known limitations. Removed redundant tables and
internal-only details.
2026-03-21 14:06:13 -07:00
perfectra1n 9aec8be1c0 docs(search): add full search + fuzzy benchmark sections
Adds end-to-end full search (fastSearch=false) comparison tables
for both fuzzy ON and OFF, plus long queries and realistic typo
recovery benchmarks. Full search multi-token shows 45-65% improvement.
2026-03-21 14:06:10 -07:00
perfectra1n 90ac727250 docs(search): update benchmark comparison with final optimized numbers
All numbers re-measured on the same machine/session after the scoring,
highlighting, and tree walk optimizations. Multi-token autocomplete
now shows 50-70% improvement over main.
2026-03-21 14:06:06 -07:00
perfectra1n 5bc9840825 fix(search): restore toLowerCase in fuzzyMatchWordWithResult
The function has multiple callers (not just smartMatch) so it must
normalize inputs itself. Removing toLowerCase broke fuzzy matching
for the two-phase search path.
2026-03-21 14:06:03 -07:00
Adorian Doran 0525114036 Merge branch 'main' of https://github.com/TriliumNext/Trilium into feat/about-dialog-overhaul 2026-03-21 20:29:01 +02:00
Adorian Doran fb691f6ade client/contributor list: add extra bot exclusion 2026-03-21 20:28:36 +02:00
Adorian Doran 92f1048911 client/contributor list: add support for honorific contributors 2026-03-21 20:19:17 +02:00
Adorian Doran 6481b90daf client: retrieve the contributor list 2026-03-21 19:59:19 +02:00
Elian Doran 532e001ef0 chore(deps): update dependency stylelint to v17.5.0 (#9115) 2026-03-21 19:29:30 +02:00
Elian Doran 17991bf31f chore(deps): update dependency @preact/preset-vite to v2.10.5 (#9125) 2026-03-21 19:28:47 +02:00
renovate[bot] 2b21b1f75e chore(deps): update dependency @preact/preset-vite to v2.10.5 2026-03-21 17:28:07 +00:00
Elian Doran dae1f9302c chore(deps): update dependency @redocly/cli to v2.24.1 (#9126) 2026-03-21 19:27:55 +02:00
Elian Doran 33365cdaf1 Translations update from Hosted Weblate (#9124) 2026-03-21 19:25:38 +02:00
green 3ac66ffe72 Translated using Weblate (Japanese)
Currently translated at 100.0% (1719 of 1719 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2026-03-21 18:24:53 +01:00
Francis C. 81baf13720 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (1719 of 1719 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hant/
2026-03-21 18:24:52 +01:00
AggelosPnS e0e96350d6 Translated using Weblate (Greek)
Currently translated at 2.8% (49 of 1719 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/el/
2026-03-21 18:24:52 +01:00
Elian Doran c539c21ced chore(deps): update dependency eslint to v10.1.0 (#9130) 2026-03-21 19:24:44 +02:00
Elian Doran 3f7f6cf982 fix(deps): update dependency i18next to v25.10.2 (#9113) 2026-03-21 19:23:13 +02:00
Elian Doran 271d87ae33 fix(deps): update dependency katex to v0.16.40 (#9127) 2026-03-21 19:22:03 +02:00
Elian Doran 533a77e606 fix(deps): update dependency marked to v17.0.5 (#9128) 2026-03-21 19:21:19 +02:00
Elian Doran 77cf2d4dd9 fix(deps): update dependency sanitize-filename to v1.6.4 (#9129) 2026-03-21 19:20:42 +02:00
Elian Doran 890cb247c1 fix(deps): update dependency eslint-linter-browserify to v10.1.0 (#9131) 2026-03-21 19:19:18 +02:00
renovate[bot] 8d7f4dd0fa fix(deps): update dependency i18next to v25.10.2 2026-03-21 16:55:05 +00:00
Adorian Doran 4d753398c1 refactor: normalize to double quotes 2026-03-21 18:30:33 +02:00
Adorian Doran f01bebedc9 client: create a Vite plugin to generate a contributor list JSON at the build time 2026-03-21 18:28:35 +02:00
Elian Doran 00c4933344 fix(collections/grid): full-width images are too small in preview (closes #9116) 2026-03-21 09:15:13 +02:00
Elian Doran cd9b46e1c7 fix(attributes): attribute detail not showing up for first item (closes #6948) 2026-03-21 09:06:21 +02:00
Elian Doran b356b355ca fix(layout): attribute details not visible in new layout (closes #9005) 2026-03-21 08:58:13 +02:00
renovate[bot] d1aebb7bb0 fix(deps): update dependency eslint-linter-browserify to v10.1.0 2026-03-21 02:04:29 +00:00
renovate[bot] 6cbb595ae8 chore(deps): update dependency eslint to v10.1.0 2026-03-21 02:03:50 +00:00
renovate[bot] fcf238bc35 fix(deps): update dependency sanitize-filename to v1.6.4 2026-03-21 02:03:10 +00:00
renovate[bot] 8c82468ecc fix(deps): update dependency marked to v17.0.5 2026-03-21 02:02:32 +00:00
renovate[bot] 965905ce00 fix(deps): update dependency katex to v0.16.40 2026-03-21 02:01:52 +00:00
renovate[bot] ed280775bd chore(deps): update dependency @redocly/cli to v2.24.1 2026-03-21 02:01:10 +00:00
perfectra1n 48dd93b94b revert: remove FTS5 content search (no measured end-to-end improvement)
FTS5 query was 32x faster in isolation, but the content scan is only
1-7% of total search time. The JS pipeline (scoring, snippets,
highlighting, tree walk) dominates. The in-memory optimizations in
this PR provide the real gains.

Removes: migration, fts_index service, event wiring, UI option,
integration test. Keeps all in-memory performance optimizations.
2026-03-20 12:50:40 -07:00
perfectra1n ac231374f6 perf(search): optimize scoring, highlighting, and tree walk
- Remove redundant toLowerCase() before normalizeSearchText() in
  search_result.ts (normalizeSearchText already lowercases)
- Pre-normalize tokens once in addScoreForStrings instead of per-chunk
- Skip edit distance computation entirely when fuzzy matching is
disabled
- Move removeDiacritic() outside the regex while-loop in highlighting
- Cache normalized parent titles per search execution in
note_flat_text.ts
- Use Set for token lookup in searchPathTowardsRoot (O(1) vs O(n))
- Remove redundant toLowerCase in fuzzyMatchWordWithResult (inputs
  from smartMatch are already normalized)
2026-03-20 12:12:08 -07:00
perfectra1n 87fc4e1281 docs(search): add FTS5 benchmark results to performance comparison
Adds real SQLite benchmarks showing FTS5 is 15-33x faster for the
raw content query, though end-to-end improvement is masked by JS
pipeline overhead (scoring, snippets, path walking).
2026-03-20 12:05:08 -07:00
perfectra1n 8fd2cb39c1 fix(search): fix busy connection error in FTS5 index build
Collect rows before inserting — iterateRows() holds an open cursor
that conflicts with writes on the same connection.
2026-03-20 12:05:03 -07:00
Elian Doran 8834899012 fix(math): limit size of popup and add back overflow (closes #9117) 2026-03-20 20:57:07 +02:00
perfectra1n 24a01aefe2 feat(search): add user option to enable/disable FTS5 content index 2026-03-20 11:54:42 -07:00
perfectra1n 06fb9c0a6b test(search): add FTS5 integration test 2026-03-20 11:54:39 -07:00
perfectra1n bc0942180e feat(search): use FTS5 index in NoteContentFulltextExp with sequential fallback
For operators =, !=, and *=*, the search now tries the FTS5 index first
via searchViaFts(). If FTS is unavailable or fails, it falls back to the
original sequential scan. The flat text attribute search is extracted
into its own searchFlatTextAttributes() method and runs after both
paths.
2026-03-20 11:54:36 -07:00
perfectra1n f358563c27 feat(search): wire FTS index updates to note content changes 2026-03-20 11:54:24 -07:00
perfectra1n dcaebeea83 feat(search): add FTS5 index service for content search 2026-03-20 11:54:21 -07:00
perfectra1n ac13af73c5 feat(search): add FTS5 migration for content search index 2026-03-20 11:54:18 -07:00
perfectra1n ba529d2721 feat(tests): implement search benchmark test... 2026-03-20 11:26:19 -07:00
Elian Doran 55dea474e9 chore(deps): update dependency @ckeditor/ckeditor5-dev-build-tools to v55.2.0 (#9099) 2026-03-20 13:45:51 +02:00
Elian Doran bc74455a64 chore(deps): update dependency @smithy/middleware-retry to v4.4.44 (#9111) 2026-03-20 13:45:21 +02:00
Elian Doran 2d0b28367f chore(deps): update dependency vite to v8.0.1 (#9112) 2026-03-20 13:45:00 +02:00
Elian Doran 7d8a3e2811 fix(deps): update dependency katex to v0.16.39 (#9114) 2026-03-20 13:44:32 +02:00
renovate[bot] 79e5d9595a chore(deps): update dependency @ckeditor/ckeditor5-dev-build-tools to v55.2.0 2026-03-20 00:11:04 +00:00
renovate[bot] 1f0fa57218 chore(deps): update dependency stylelint to v17.5.0 2026-03-20 00:09:32 +00:00
renovate[bot] 0310626025 fix(deps): update dependency katex to v0.16.39 2026-03-20 00:08:50 +00:00
renovate[bot] fefbb40c03 chore(deps): update dependency vite to v8.0.1 2026-03-20 00:07:33 +00:00
renovate[bot] 12f89078b8 chore(deps): update dependency @smithy/middleware-retry to v4.4.44 2026-03-20 00:06:57 +00:00
Elian Doran 8d873c5869 fix(share): prevent crash when accessing /share on uninitialized setup (#9088) 2026-03-19 20:13:32 +02:00
Elian Doran 27f4ac1d03 Textarea Label Support (#9077) 2026-03-19 20:02:11 +02:00
Elian Doran d533360903 chore(attributes): rename textarea to multiline text 2026-03-19 20:01:55 +02:00
Elian Doran 49f5dc1c26 fix(table): text jumping when editing multiline text 2026-03-19 20:00:43 +02:00
Elian Doran 16419ed4ac Merge remote-tracking branch 'origin/main' into textarea-labels 2026-03-19 19:54:16 +02:00
Elian Doran 1595d1b5c9 Fix setup page error (#9102) 2026-03-19 19:50:07 +02:00
Elian Doran 50eb11997c fix(setup): contrast issue in alert (closes #8915) 2026-03-19 19:49:32 +02:00
Elian Doran d974dfbc31 Translations update from Hosted Weblate (#9109) 2026-03-19 19:26:35 +02:00
Hosted Weblate e9b63e50d4 Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/
2026-03-19 18:08:13 +01:00
Elian Doran b6efb7c9ab feat(relation_map): add common note opening options to context menu 2026-03-19 19:07:54 +02:00
Elian Doran f84479b1c2 fix(deps): update univer monorepo to v0.18.0 (#9101) 2026-03-19 17:48:23 +02:00
JYC333 8597fa560b Merge branch 'main' into fix/share-uninitialized-crash 2026-03-19 11:49:55 +00:00
JYC333 b29ab93fd5 fix: limit the scope of DB check only for share page 2026-03-19 11:46:35 +00:00
JYC333 225cdaff46 Update apps/client/src/setup.ts
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-03-19 11:34:53 +00:00
JYC333 61dfba8c32 fix: remove knockout dependency 2026-03-19 11:24:45 +00:00
JYC333 4fee91d219 fix: change html to use DOM status 2026-03-19 11:24:09 +00:00
JYC333 12e4f76a8b fix: move setup to DOM implementation to fix knockout issue 2026-03-19 11:23:06 +00:00
JYC333 ec30598397 chore(deps): update dependency eslint-plugin-playwright to v2.10.1 (#9097) 2026-03-19 10:55:01 +00:00
JYC333 fdd2cc77e6 Merge branch 'main' into renovate/eslint-plugin-playwright-2.x 2026-03-19 10:30:16 +00:00
JYC333 6f5c618bcd chore(deps): update dependency @redocly/cli to v2.24.0 (#9100) 2026-03-19 10:29:43 +00:00
JYC333 8041112414 chore(deps): update dependency sanitize-html to v2.17.2 (#9098) 2026-03-19 10:28:18 +00:00
renovate[bot] 40ab2bc798 fix(deps): update univer monorepo to v0.18.0 2026-03-19 00:46:10 +00:00
renovate[bot] 3a3029cf3a chore(deps): update dependency @redocly/cli to v2.24.0 2026-03-19 00:45:28 +00:00
renovate[bot] e7d1c75cdb chore(deps): update dependency sanitize-html to v2.17.2 2026-03-19 00:44:03 +00:00
renovate[bot] bc907ee6ad chore(deps): update dependency eslint-plugin-playwright to v2.10.1 2026-03-19 00:43:25 +00:00
perfectra1n f23a7b4842 feat(settings): also allow for fuzzy searching to just be disabled 2026-03-18 11:43:28 -07:00
Elian Doran 0bff3f1fbc chore(deps): update dependency electron to v41.0.3 (#9090) 2026-03-18 20:18:44 +02:00
Elian Doran 377864b2c6 chore(deps): update dependency wxt to v0.20.20 (#9091) 2026-03-18 19:50:35 +02:00
Elian Doran 3db13df245 fix(deps): update dependency @zumer/snapdom to v2.5.0 (#9093) 2026-03-18 19:48:36 +02:00
Elian Doran a2e09b40fa chore(deps): update dependency sax to v1.6.0 (#9092) 2026-03-18 19:43:21 +02:00
perfectra1n 5718631889 fix(search): resolve issue with autocomplete with search performance enhancements 2026-03-18 09:46:24 -07:00
Elian Doran aa590753d5 Translations update from Hosted Weblate (#9095) 2026-03-18 13:28:23 +02:00
Hosted Weblate 1c8519d7ec Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/
2026-03-18 12:26:56 +01:00
Elian Doran 686a614bfa Translations update from Hosted Weblate (#9085) 2026-03-18 13:26:47 +02:00
Elian Doran 01261220e3 Apply suggestion from @gemini-code-assist[bot]
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-03-18 13:26:25 +02:00
허석 1bf92ab19a Translated using Weblate (Korean)
Currently translated at 93.9% (109 of 116 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/ko/
2026-03-18 12:15:30 +01:00
Yunho Park c0d0d1868d Translated using Weblate (Korean)
Currently translated at 100.0% (158 of 158 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/ko/
2026-03-18 12:15:30 +01:00
허석 da2dec16cc Translated using Weblate (Korean)
Currently translated at 7.3% (126 of 1719 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ko/
2026-03-18 12:15:29 +01:00
Ulices 787ef7d513 Translated using Weblate (Spanish)
Currently translated at 100.0% (1719 of 1719 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/es/
2026-03-18 12:15:28 +01:00
허석 dcb0ce79e6 Translated using Weblate (Korean)
Currently translated at 51.4% (199 of 387 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ko/
2026-03-18 12:15:27 +01:00
Elian Doran 9d8202539d chore(deps): update pnpm/action-setup action to v5 (#9094) 2026-03-18 13:15:19 +02:00
renovate[bot] c46af4bca9 chore(deps): update pnpm/action-setup action to v5 2026-03-18 01:26:54 +00:00
renovate[bot] 610f6652df fix(deps): update dependency @zumer/snapdom to v2.5.0 2026-03-18 01:26:47 +00:00
renovate[bot] b33635381b chore(deps): update dependency sax to v1.6.0 2026-03-18 01:26:06 +00:00
renovate[bot] f20af8cac9 chore(deps): update dependency wxt to v0.20.20 2026-03-18 01:25:25 +00:00
renovate[bot] 29f3b987aa chore(deps): update dependency electron to v41.0.3 2026-03-18 01:24:43 +00:00
argusagent e9987b40e6 fix(share): wire assertShareDbReady into router middleware — address code review 2026-03-17 20:27:04 -04:00
argusagent 1990a990c3 fix(share): return 503 when app is still initializing (#5677) 2026-03-17 20:22:06 -04:00
argusagent d1159d3af9 fix(share): guard against uninitialized DB connection on /share routes (#5677) 2026-03-17 20:22:05 -04:00
JYC333 723dada78a chore(deps): update typescript-eslint monorepo to v8.57.1 (#9080) 2026-03-17 21:56:25 +00:00
JYC333 0e089af677 chore(deps): update dependency @smithy/middleware-retry to v4.4.43 (#9079) 2026-03-17 20:47:42 +00:00
renovate[bot] f4aed5d012 chore(deps): update typescript-eslint monorepo to v8.57.1 2026-03-17 20:42:50 +00:00
Elian Doran 860f953962 chore(deps): update dependency @redocly/cli to v2.22.1 (#9081) 2026-03-17 22:37:46 +02:00
Elian Doran ded692ead7 chore(deps): update ckeditor5 config packages to v14 (major) (#9082) 2026-03-17 22:37:20 +02:00
renovate[bot] 4f5413ebbe chore(deps): update ckeditor5 config packages to v14 2026-03-17 01:14:47 +00:00
renovate[bot] 8f3e210740 chore(deps): update dependency @redocly/cli to v2.22.1 2026-03-17 01:14:03 +00:00
renovate[bot] 783cb8b4e9 chore(deps): update dependency @smithy/middleware-retry to v4.4.43 2026-03-17 01:12:33 +00:00
Mystler 2b94d96930 fix(labels): Code review issue 2026-03-16 18:21:08 +01:00
Elian Doran ca349e03f2 feat(editor): add catppuccin theme to highlightjs (#9075) 2026-03-16 18:39:40 +02:00
Mystler 5b5222b846 feat(labels): Add textarea label type with Table support 2026-03-16 17:07:37 +01:00
Giulia Ye 850f8ad939 feat(editor): make theme selector scoped to code tag replace regex more robust
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-03-16 11:55:06 +01:00
Giulia Ye 50e5f89e9a feat(editor): make theme selector scoped to code tag regex more robust
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-03-16 11:54:14 +01:00
giuxtaposition 603b47f9b0 feat(editor): add catppuccin theme to highlightjs 2026-03-16 10:35:49 +01:00
Elian Doran 92227c364e chore(deps): update dependency @preact/preset-vite to v2.10.4 (#9070) 2026-03-16 08:05:58 +02:00
Elian Doran 10ac18a7cc chore(deps): update dependency webdriverio to v9.26.1 (#9071) 2026-03-16 08:04:54 +02:00
Elian Doran e06123e4bd chore(deps): update softprops/action-gh-release action to v2.6.1 (#9072) 2026-03-16 08:04:23 +02:00
Elian Doran b44bd544cd chore(deps): update dependency node-abi to v4.28.0 (#9073) 2026-03-16 08:01:45 +02:00
renovate[bot] 4c3a448330 chore(deps): update softprops/action-gh-release action to v2.6.1 2026-03-16 01:31:50 +00:00
renovate[bot] 7f07c249af chore(deps): update dependency node-abi to v4.28.0 2026-03-16 01:31:44 +00:00
renovate[bot] 51958d2ac0 chore(deps): update dependency webdriverio to v9.26.1 2026-03-16 00:10:44 +00:00
renovate[bot] 67f474d794 chore(deps): update dependency @preact/preset-vite to v2.10.4 2026-03-16 00:10:12 +00:00
Adorian Doran e6e8ebd881 pdf.js: add ability to comment selected text (#9068) 2026-03-16 02:08:31 +02:00
Elian Doran b138fedd35 CSRF fixes (#9067) 2026-03-15 20:13:46 +02:00
contributor a92d846b57 pdf.js: add ability to comment selected text 2026-03-15 20:05:59 +02:00
Elian Doran 7a544482d1 chore(server): request bootstrap with no cache 2026-03-15 19:39:27 +02:00
Elian Doran 53739ee8d4 e2e(server): address flaky test 2026-03-15 19:33:21 +02:00
Elian Doran 495145e033 chore(server): use random UUID for session ID 2026-03-15 19:33:06 +02:00
Elian Doran 6701d09df5 feat(client): refresh CSRF if request fails 2026-03-15 19:02:28 +02:00
Elian Doran e36d7121f1 fix(desktop): broken due to CSRF failing 2026-03-15 18:54:37 +02:00
JYC333 9290a60b23 chore(deps): update dependency csrf-csrf to v4.0.3 (#9061) 2026-03-15 15:08:17 +00:00
Elian Doran 761de79a8c chore(deps): update dependency eslint-plugin-playwright to v2.10.0 (#9064) 2026-03-15 16:37:03 +02:00
Elian Doran b8e9beff1b chore(deps): update dependency lint-staged to v16.4.0 (#9065) 2026-03-15 16:23:52 +02:00
Elian Doran 5b13e0ba4f chore(deps): update softprops/action-gh-release action to v2.5.3 (#9063) 2026-03-15 16:23:07 +02:00
Elian Doran b0bab18d00 chore(deps): update dependency wxt to v0.20.19 (#9062) 2026-03-15 16:21:31 +02:00
Elian Doran b4fa1392de Translations update from Hosted Weblate (#9066) 2026-03-15 16:07:45 +02:00
Elian Doran 4e58002e13 Apply suggestions from code review
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-03-15 16:07:18 +02:00
Aindriú Mac Giolla Eoin adc149aac8 Translated using Weblate (Irish)
Currently translated at 100.0% (1719 of 1719 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ga/
2026-03-15 11:09:59 +00:00
Marcel 4c02773ddc Translated using Weblate (German)
Currently translated at 100.0% (1719 of 1719 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/de/
2026-03-15 11:09:56 +00:00
green 892abe1d70 Translated using Weblate (Japanese)
Currently translated at 100.0% (158 of 158 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/ja/
2026-03-15 11:09:54 +00:00
green 71c23d33ff Translated using Weblate (Japanese)
Currently translated at 100.0% (1719 of 1719 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2026-03-15 11:09:52 +00:00
msnx0 9c110e896e Translated using Weblate (Polish)
Currently translated at 100.0% (1719 of 1719 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pl/
2026-03-15 11:09:50 +00:00
renovate[bot] afe7a748e1 chore(deps): update softprops/action-gh-release action to v2.5.3 2026-03-15 05:14:23 +00:00
renovate[bot] 325e582593 chore(deps): update dependency lint-staged to v16.4.0 2026-03-15 00:53:10 +00:00
renovate[bot] ccebe6a423 chore(deps): update dependency eslint-plugin-playwright to v2.10.0 2026-03-15 00:52:28 +00:00
renovate[bot] f7c92fa4b2 chore(deps): update dependency wxt to v0.20.19 2026-03-15 00:51:42 +00:00
renovate[bot] d07c2d118f chore(deps): update dependency csrf-csrf to v4.0.3 2026-03-15 00:51:00 +00:00
Elian Doran 94a09edd1d Renovate/csrf csrf 4.x (#5831) 2026-03-15 00:19:23 +02:00
Elian Doran f6f939c245 chore(server): address requested changes 2026-03-14 23:49:36 +02:00
Elian Doran 0d889426e8 refactor(server): use different approach to handling the CSRF token 2026-03-14 23:48:06 +02:00
Elian Doran c8a546ef1e fix(server): uninitialized sessions causing bad CSRF errors 2026-03-14 23:31:17 +02:00
Elian Doran 693919b21a Merge remote-tracking branch 'origin/main' into renovate/csrf-csrf-4.x 2026-03-14 22:48:43 +02:00
Elian Doran 7c1a2039b1 feat(editor): add catppuccin theme to codemirror (#9060) 2026-03-14 22:05:50 +02:00
Elian Doran c66e4e0475 pdf.js floating highlight button (#9048) 2026-03-14 22:03:55 +02:00
Elian Doran 6bdfbf0d7d chore(deps): fix package lock 2026-03-14 21:52:55 +02:00
Giulia Ye 61393bca90 fix(editor): catppuccin theme declared following alphabetical order based by id
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-03-14 16:03:03 +01:00
giuxtaposition c41b649bff feat(editor): add catppuccin theme to codemirror 2026-03-14 15:58:37 +01:00
Elian Doran ba87487714 Space mobile launcher container evenly (#9031) 2026-03-14 13:49:20 +02:00
Elian Doran 3e73f38ae2 chore(deps): update dependency vite to v8 (#9043) 2026-03-14 13:45:25 +02:00
Elian Doran 51dd55c3fd Merge remote-tracking branch 'origin/main' into renovate/vite-8.x
; Conflicts:
;	pnpm-lock.yaml
2026-03-14 12:54:04 +02:00
Elian Doran de49ca37b9 fix(deps): update ckeditor monorepo (#8884) 2026-03-14 12:51:11 +02:00
Elian Doran 8d8080ee09 Merge remote-tracking branch 'origin/main' into renovate/ckeditor-monorepo
; Conflicts:
;	pnpm-lock.yaml
2026-03-14 12:38:35 +02:00
Elian Doran f3613ccb25 chore(client): typecheck failing due to changes in JSX handling 2026-03-14 12:35:44 +02:00
Elian Doran ad7b5700f3 chore(client): tests not running due to change in Vite 2026-03-14 12:29:57 +02:00
Elian Doran 0d17c62d02 chore(client): remove deprecated vite manual chunks 2026-03-14 12:15:43 +02:00
Elian Doran 826690982a chore(deps): update dependency pdfjs-dist to v5.5.207 (#8874) 2026-03-14 12:10:41 +02:00
Elian Doran b438ff9c62 chore(deps): update dependency electron to v41 (#9025) 2026-03-14 12:08:15 +02:00
Elian Doran 43fb9d1a23 chore(deps): update docker/setup-buildx-action action to v4 (#8931) 2026-03-14 12:07:53 +02:00
Elian Doran fb17ce8c8a Merge remote-tracking branch 'origin/main' into renovate/ckeditor-monorepo
; Conflicts:
;	pnpm-lock.yaml
2026-03-14 12:06:40 +02:00
Elian Doran 3a8e12535e fix(ckeditor5): version misalignment 2026-03-14 12:04:32 +02:00
Elian Doran ce0caa3f6d chore(deps): update dependency @smithy/middleware-retry to v4.4.42 (#9035) 2026-03-14 12:00:14 +02:00
Elian Doran 00a0315f12 chore(pdfjs): fix type error after update 2026-03-14 11:59:57 +02:00
renovate[bot] da38d56dc7 chore(deps): update docker/setup-buildx-action action to v4 2026-03-14 09:55:13 +00:00
renovate[bot] 83e47cba2c chore(deps): update dependency electron to v41 2026-03-14 09:54:14 +00:00
Elian Doran f4d1eebed4 fix(deps): update dependency knockout to v3.5.2 (#8970) 2026-03-14 11:47:51 +02:00
Elian Doran f27b394099 Merge remote-tracking branch 'origin/main' into renovate/ckeditor-monorepo
; Conflicts:
;	pnpm-lock.yaml
2026-03-14 11:47:16 +02:00
renovate[bot] a66c9ccc1f chore(deps): update dependency @smithy/middleware-retry to v4.4.42 2026-03-14 09:45:48 +00:00
Elian Doran 0bc6a830c8 chore(pdfjs): update viewer to latest 2026-03-14 11:42:39 +02:00
Elian Doran f3008b29af chore(deps): bump yauzl from 2.10.0 to 3.2.1 (#9047) 2026-03-14 11:33:15 +02:00
Elian Doran 5b16ff8be1 chore(client): fix type error after update of knockout 2026-03-14 11:32:44 +02:00
Elian Doran 86621e3388 fix(deps): update dependency reveal.js to v6 (#9028) 2026-03-14 11:30:40 +02:00
Elian Doran 1beb0668c3 fix(deps): update codemirror (#9039) 2026-03-14 11:30:21 +02:00
Elian Doran 34b09f90fb fix(deps): wrong ckeditor version 2026-03-14 11:24:49 +02:00
Elian Doran a6f964925b chore(presentation): fix paths to themes 2026-03-14 11:17:21 +02:00
Elian Doran 196416bb9f chore(presentation): fix type issues 2026-03-14 11:15:04 +02:00
Elian Doran 1535db9f7d chore(presentation): remove now redundant type definitions 2026-03-14 11:13:50 +02:00
renovate[bot] ae38ac4de8 fix(deps): update dependency knockout to v3.5.2 2026-03-14 09:11:59 +00:00
Elian Doran e0aa8d8ecf fix(codemirror): version misalignment causing type errors 2026-03-14 11:09:48 +02:00
renovate[bot] 23c1eacf2b fix(deps): update ckeditor monorepo 2026-03-14 09:03:13 +00:00
contributor 10e28789e2 add optional chaining to access window.parent in callback 2026-03-14 11:03:10 +02:00
contributor 940f7f77f5 add automatic removal of the event 2026-03-14 11:03:10 +02:00
renovate[bot] 83f8b4fcb4 fix(deps): update codemirror 2026-03-14 09:02:35 +00:00
Elian Doran 42dc801ddf fix(deps): update univer monorepo to v0.17.0 (#9057) 2026-03-14 11:01:08 +02:00
renovate[bot] 5e6e5bfbec chore(deps): update dependency vite to v8 2026-03-14 09:00:57 +00:00
Elian Doran 28fc99dd45 fix(deps): update dependency mermaid to v11.13.0 (#8988) 2026-03-14 10:59:16 +02:00
Elian Doran 9ef501c399 Mermaid diagram switcher (#9058) 2026-03-14 10:54:47 +02:00
Elian Doran 6bba908654 feat(mermaid): add new sample diagrams for Ishikawa & Venn 2026-03-14 10:54:33 +02:00
Elian Doran d423e43312 Merge branch 'feature/mermaid_diagram_switcher' into renovate/mermaid-11.x 2026-03-14 10:50:33 +02:00
Elian Doran 91718f218b Merge remote-tracking branch 'origin/main' into renovate/mermaid-11.x 2026-03-14 10:50:18 +02:00
Elian Doran e623e91a82 docs(user): mention changes to Mermaid diagrams 2026-03-14 10:44:55 +02:00
Elian Doran dce9f50911 fix(mermaid): not recentering when using the sample switcher 2026-03-14 10:37:26 +02:00
Elian Doran 5f1486cf6a feat(mermaid): use custom placeholder 2026-03-14 10:31:28 +02:00
Elian Doran 2c6bdc79af chore(mermaid): rounded corners for editor only on desktop 2026-03-14 10:25:59 +02:00
Elian Doran a6b89cfa30 chore(mermaid): use translations for sample names 2026-03-14 10:22:35 +02:00
Elian Doran 21d1cd395b feat(mermaid): add a text for sample diagram switcher 2026-03-14 10:14:21 +02:00
Elian Doran 981466cbe8 fix(deps): update dependency better-sqlite3 to v12.8.0 (#9056) 2026-03-14 10:08:38 +02:00
Elian Doran 0209573fce chore(mermaid): remove default placeholder content 2026-03-14 10:03:15 +02:00
Elian Doran 92f8459f28 feat(mermaid): show switcher only when note is empty 2026-03-14 10:02:05 +02:00
Elian Doran da193b456b fix(mermaid): error when diagram is empty 2026-03-14 10:00:18 +02:00
Elian Doran 6c151afca3 fix(mermaid): error text not selectable 2026-03-14 09:58:45 +02:00
Elian Doran aba6750c18 chore(mermaid): add rounded corners to code editor 2026-03-14 09:44:06 +02:00
Elian Doran b9a8e4e4ba feat(mermaid): add all official samples 2026-03-14 09:42:35 +02:00
Elian Doran 4134c4ddd0 feat(mermaid): replace note content on switch 2026-03-14 09:29:28 +02:00
Elian Doran 72038fb2ec chore(mermaid): basic logic for content switcher 2026-03-14 09:26:14 +02:00
Elian Doran 069d8b1ae4 refactor(mermaid): move into own directory 2026-03-14 09:20:07 +02:00
Elian Doran ce71068f6d chore(mermaid): add a bottom section for switching between samples 2026-03-14 09:18:38 +02:00
renovate[bot] dc298a44e1 fix(deps): update univer monorepo to v0.17.0 2026-03-14 06:54:06 +00:00
renovate[bot] 306bfd7673 fix(deps): update dependency better-sqlite3 to v12.8.0 2026-03-14 06:53:12 +00:00
Elian Doran 25cf23f507 chore(deps): update dependency http-proxy-agent to v8 (#9026) 2026-03-14 08:39:04 +02:00
Elian Doran 096d5f7c65 chore: remove old references to svelte 2026-03-14 08:06:46 +02:00
Elian Doran 0e2dee1609 chore(renovate): group univerjs packages 2026-03-14 08:05:50 +02:00
Elian Doran ec927d25a9 chore(deps): update dependency @redocly/cli to v2.21.1 (#8905) 2026-03-14 07:44:45 +02:00
renovate[bot] 7c8aefb4ef chore(deps): update dependency http-proxy-agent to v8 2026-03-14 05:44:33 +00:00
Elian Doran e840769dd6 fix(deps): update dependency react-i18next to v16.5.8 (#9014) 2026-03-14 07:44:00 +02:00
Elian Doran 4a5d3f01b8 chore(deps): update dependency node-abi to v4.27.0 (#9015) 2026-03-14 07:43:26 +02:00
Elian Doran 71d975f339 fix(deps): update dependency force-graph to v1.51.2 (#9050) 2026-03-14 07:42:10 +02:00
Elian Doran a4051fc372 chore(deps): update pnpm to v10.32.1 (#9012) 2026-03-14 07:41:44 +02:00
Elian Doran 359b2a68b8 chore(deps): update dependency https-proxy-agent to v8 (#9027) 2026-03-14 07:41:11 +02:00
Elian Doran 8124e4e589 chore(deps): update dependency electron to v40.8.2 (#9049) 2026-03-14 07:40:06 +02:00
Elian Doran 5f699996f8 chore(deps): update dependency rollup-plugin-webpack-stats to v3.1.0 (#9051) 2026-03-14 07:35:09 +02:00
Elian Doran c7c0bc4185 chore(deps): update marocchino/sticky-pull-request-comment action to v3 (#9053) 2026-03-14 07:34:47 +02:00
Elian Doran d422ac7bc5 chore(deps): update dependency vite-plugin-static-copy to v3.3.0 (#9052) 2026-03-14 07:33:52 +02:00
Elian Doran 0bd912d18a Translations update from Hosted Weblate (#9054) 2026-03-14 07:33:19 +02:00
Ulices 252f2fe72c Translated using Weblate (Spanish)
Currently translated at 100.0% (1693 of 1693 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/es/
2026-03-14 06:09:49 +01:00
renovate[bot] 7f29c347e2 chore(deps): update marocchino/sticky-pull-request-comment action to v3 2026-03-14 00:40:57 +00:00
renovate[bot] 7a3dc824d6 chore(deps): update dependency vite-plugin-static-copy to v3.3.0 2026-03-14 00:40:47 +00:00
renovate[bot] 8550c62771 chore(deps): update dependency rollup-plugin-webpack-stats to v3.1.0 2026-03-14 00:39:43 +00:00
renovate[bot] 66cd657cd8 fix(deps): update dependency force-graph to v1.51.2 2026-03-14 00:38:45 +00:00
renovate[bot] beac80e175 chore(deps): update dependency electron to v40.8.2 2026-03-14 00:37:41 +00:00
contributor 5ae9952ba1 use pagehide event instead of unload 2026-03-14 01:30:59 +02:00
contributor d4bc1ec444 add typings 2026-03-14 01:24:50 +02:00
contributor d52f529b24 extract handler setup into a function 2026-03-14 01:24:50 +02:00
contributor 9a9cfdec2b add unload handler 2026-03-14 01:24:50 +02:00
contributor 6ab421ffa0 check target iframe 2026-03-14 01:24:50 +02:00
contributor 53b0aafb98 disable preferences warning 2026-03-14 01:24:49 +02:00
contributor 6b02ad8421 enable floating highlight button 2026-03-14 01:24:43 +02:00
renovate[bot] 242ebfccc0 chore(deps): update dependency https-proxy-agent to v8 2026-03-13 22:26:27 +00:00
renovate[bot] 545cc0782f fix(deps): update dependency react-i18next to v16.5.8 2026-03-13 22:24:39 +00:00
renovate[bot] bf6a2917cd fix(deps): update dependency reveal.js to v6 2026-03-13 22:22:26 +00:00
renovate[bot] eaba2a8395 fix(deps): update dependency mermaid to v11.13.0 2026-03-13 22:19:14 +00:00
Elian Doran c581fb17bc chore(deps): update dependency @ckeditor/ckeditor5-dev-build-tools to v55 (#9042) 2026-03-14 00:14:41 +02:00
renovate[bot] 9b05b95d77 chore(deps): update dependency pdfjs-dist to v5.5.207 2026-03-13 22:12:07 +00:00
renovate[bot] b3ba18ddd0 chore(deps): update dependency node-abi to v4.27.0 2026-03-13 22:11:25 +00:00
renovate[bot] bb2a633ba7 chore(deps): update dependency @redocly/cli to v2.21.1 2026-03-13 22:10:44 +00:00
renovate[bot] 913efdef03 chore(deps): update pnpm to v10.32.1 2026-03-13 22:07:56 +00:00
Elian Doran bf0bea18b1 fix(deps): update dependency i18next to v25.8.18 (#9013) 2026-03-14 00:06:31 +02:00
Elian Doran cdebd1f63a chore(deps): update dependency esbuild to v0.27.4 (#9037) 2026-03-14 00:06:07 +02:00
Elian Doran a6a2635836 chore(deps): update dependency happy-dom to v20.8.4 (#9038) 2026-03-14 00:05:38 +02:00
dependabot[bot] 024b57c2b4 chore(deps): bump yauzl from 2.10.0 to 3.2.1
Bumps [yauzl](https://github.com/thejoshwolfe/yauzl) from 2.10.0 to 3.2.1.
- [Commits](https://github.com/thejoshwolfe/yauzl/compare/2.10.0...3.2.1)

---
updated-dependencies:
- dependency-name: yauzl
  dependency-version: 3.2.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-13 20:13:10 +00:00
renovate[bot] 6fbc85cbc7 chore(deps): update dependency @ckeditor/ckeditor5-dev-build-tools to v55 2026-03-13 05:51:53 +00:00
renovate[bot] 5f8a0aee13 chore(deps): update dependency happy-dom to v20.8.4 2026-03-13 05:47:50 +00:00
renovate[bot] 0c67b292ef chore(deps): update dependency esbuild to v0.27.4 2026-03-13 05:46:42 +00:00
Elian Doran ba663e6162 chore(deps): update dependency electron to v40.8.1 (#9036) 2026-03-13 07:42:35 +02:00
Elian Doran 14925266cf fix(deps): update dependency dayjs to v1.11.20 (#9040) 2026-03-13 07:41:36 +02:00
Elian Doran 702e29bd8c chore(deps): update vitest monorepo to v4.1.0 (#9041) 2026-03-13 07:41:10 +02:00
Elian Doran 27ac3e58c5 fix(deps): update dependency sqlite3 to v6 (#9044) 2026-03-13 07:40:07 +02:00
Elian Doran 86e268c06d Translations update from Hosted Weblate (#9046) 2026-03-13 07:39:12 +02:00
Ulices 6e4b231319 Translated using Weblate (Spanish)
Currently translated at 99.2% (1681 of 1693 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/es/
2026-03-13 05:09:49 +01:00
green 041eff6cbd Translated using Weblate (Japanese)
Currently translated at 100.0% (1693 of 1693 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2026-03-13 05:09:48 +01:00
renovate[bot] 1a3471a516 fix(deps): update dependency sqlite3 to v6 2026-03-13 01:10:11 +00:00
renovate[bot] 57c8727bb1 chore(deps): update vitest monorepo to v4.1.0 2026-03-13 01:06:52 +00:00
renovate[bot] bd451d0738 fix(deps): update dependency dayjs to v1.11.20 2026-03-13 01:05:48 +00:00
renovate[bot] ced062842d chore(deps): update dependency electron to v40.8.1 2026-03-13 01:01:51 +00:00
Jon Fuller da3d71d21e Merge branch 'main' into feat/search-perf-take1 2026-03-12 14:57:03 -07:00
perfectra1n b533546236 fix(search): fix flying bracket 2026-03-12 14:35:47 -07:00
perfectra1n 1c148f407c feat(search): don't toss the entire index after each note change 2026-03-12 14:35:17 -07:00
perfectra1n 9403efa9a1 feat(search): add even some more robust tests 2026-03-12 14:21:36 -07:00
perfectra1n 6a06fc7995 feat(search): get rid of candidate capping 2026-03-12 14:02:23 -07:00
Elian Doran a1bf7bfa08 Protected note tweaks (#9033) 2026-03-12 22:24:10 +02:00
Elian Doran 2a67c93c20 fix(deps): update dependency mathlive to v0.109.0 (#9024) 2026-03-12 21:30:13 +02:00
Elian Doran b51bfdfb33 chore(client): address requested change 2026-03-12 21:09:30 +02:00
Elian Doran 9aa84877ee fix(tree): not reacting to protected state changes 2026-03-12 21:03:12 +02:00
Elian Doran 9e99670b19 fix(collections): displaying note list even if session is not unlocked 2026-03-12 20:53:19 +02:00
Elian Doran 744b93dd98 fix(board): does not respect protected note of parent 2026-03-12 20:50:56 +02:00
Elian Doran 5abb77242c feat(map): create pins atomically 2026-03-12 20:49:34 +02:00
Elian Doran 4ab3b0dd2b fix(map): does not respect protected note of parent 2026-03-12 20:47:43 +02:00
Elian Doran a6a1594265 fix(table): does not respect protected note of parent 2026-03-12 20:44:25 +02:00
Elian Doran b06cdd442d fix(calendar): does not respect protected note of parent 2026-03-12 20:41:53 +02:00
Mystler f7067fb968 fix(mobile): Space mobile launcher container evenly 2026-03-12 19:24:27 +01:00
perfectra1n 77733ce205 feat(search): try to rice performance some more 2026-03-11 21:11:55 -07:00
perfectra1n 585b6ccd3e feat(search): try to improve performance 2026-03-11 19:05:44 -07:00
renovate[bot] cf0f5ba4c4 fix(deps): update dependency mathlive to v0.109.0 2026-03-12 01:25:15 +00:00
renovate[bot] 309a81a0fe fix(deps): update dependency i18next to v25.8.18 2026-03-12 01:14:10 +00:00
Elian Doran caa428c1a2 Translations update from Hosted Weblate (#8990) 2026-03-11 21:44:21 +02:00
Hosted Weblate 517c721664 Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/
2026-03-11 20:39:34 +01:00
green a8cdaa69f7 Translated using Weblate (Japanese)
Currently translated at 100.0% (1693 of 1693 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2026-03-11 20:39:33 +01:00
Luk On 53d221ef34 Translated using Weblate (Polish)
Currently translated at 100.0% (1676 of 1676 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pl/
2026-03-11 20:39:33 +01:00
pythaac 5450fde472 Translated using Weblate (Korean)
Currently translated at 93.1% (108 of 116 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/ko/
2026-03-11 20:39:33 +01:00
pythaac 808446cef5 Translated using Weblate (Korean)
Currently translated at 100.0% (158 of 158 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/ko/
2026-03-11 20:39:33 +01:00
ibs-allaow 921c663199 Translated using Weblate (Arabic)
Currently translated at 57.2% (959 of 1676 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ar/
2026-03-11 20:39:33 +01:00
Микола Копитін 1b8a75b615 Translated using Weblate (Ukrainian)
Currently translated at 98.2% (114 of 116 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/uk/
2026-03-11 20:39:33 +01:00
Микола Копитін f78ced5bc3 Translated using Weblate (Ukrainian)
Currently translated at 99.3% (157 of 158 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/uk/
2026-03-11 20:39:33 +01:00
JYC333 81bf5f4f3b Translated using Weblate (Swedish)
Currently translated at 17.6% (21 of 119 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/sv/
2026-03-11 20:39:33 +01:00
Hosted Weblate aaed368670 Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/
2026-03-11 20:39:33 +01:00
Elian Doran 5e8de14721 Audio player improvements (#9008) 2026-03-11 21:38:58 +02:00
Elian Doran 634ab5b5c0 chore(media): address requested changes 2026-03-11 21:26:24 +02:00
Elian Doran 906889a035 fix(video): auto-hide no longer working 2026-03-11 21:07:48 +02:00
Elian Doran ab9d50b905 feat(video): add blur for controls 2026-03-11 21:06:08 +02:00
Elian Doran e61b7c7cfc feat(audio): add background effects 2026-03-11 20:58:49 +02:00
Elian Doran 1c628fba4c fix(video): playing button not working 2026-03-11 20:53:08 +02:00
Elian Doran f8b4c6cb15 fix(audio): styling on light theme 2026-03-11 20:41:37 +02:00
Elian Doran 3edd8f6c5a chore(media): solve linter warnings 2026-03-11 20:38:53 +02:00
Elian Doran 7777f72893 chore(media): change translations prefix 2026-03-11 20:36:51 +02:00
Elian Doran 9af85b767b feat(audio): add an icon placeholder 2026-03-11 20:35:41 +02:00
Elian Doran 73260b91eb feat(audio): add mime to unsupported format 2026-03-11 20:29:34 +02:00
Elian Doran 2858f63873 feat(audio): report unsupported format 2026-03-11 19:30:12 +02:00
Elian Doran 15ca328727 feat(audio): make player full-width 2026-03-11 19:26:17 +02:00
Elian Doran 5b3fbecc0f feat(audio): introduce keyboard shortcuts 2026-03-11 19:24:47 +02:00
Elian Doran 365d0f0aac feat(audio): introduce playback speed 2026-03-11 19:17:14 +02:00
Elian Doran e86d84c463 feat(audio): introduce loop button 2026-03-11 19:14:52 +02:00
Elian Doran 6b974c2ac7 feat(audio): introduce skip buttons 2026-03-11 19:12:09 +02:00
Elian Doran d2afcbb98d feat(audio): introduce volume slider 2026-03-11 19:10:18 +02:00
Elian Doran 68a122fcf5 chore(audio): reintroduce some styles 2026-03-11 19:06:59 +02:00
Elian Doran 92f0144b48 feat(audio): reintroduce seek bar 2026-03-11 19:03:09 +02:00
Elian Doran a5a345728c feat(audio): reintroduce play button 2026-03-11 18:56:43 +02:00
Elian Doran 23890e64e9 refactor(audio): extract to separate file 2026-03-11 18:51:20 +02:00
Elian Doran 3de712aca4 fix(server/search): invalid canvas crashing search (closes #9004) 2026-03-11 18:32:53 +02:00
Elian Doran cb5b4d870f refactor(server/search): extract fulltext preprocessing to separate file 2026-03-11 18:29:36 +02:00
Elian Doran f81aef2de5 docs(user): specify spreadsheets 2026-03-11 18:01:22 +02:00
Elian Doran 06aed16ea1 refactor(spreadsheet): simplify the checks for popups 2026-03-11 12:11:00 +02:00
Elian Doran aa2d8af15c fix(spreadsheet): popups show up and hide 2026-03-11 12:10:46 +02:00
Elian Doran dc7b91433b docs(user): mention changes to video player 2026-03-11 09:44:24 +02:00
Elian Doran 72951386b1 Video player improvements (#8992) 2026-03-11 08:33:04 +02:00
Elian Doran db8df01d82 fix(deps): update dependency eslint-linter-browserify to v10.0.3 (#8948) 2026-03-11 08:32:06 +02:00
Elian Doran 98713ed111 chore(deps): update dependency lint-staged to v16.3.3 (#8997) 2026-03-11 08:31:29 +02:00
Elian Doran 3e88fecb15 chore(deps): update dependency yauzl to v3.2.1 (#8998) 2026-03-11 08:31:12 +02:00
Elian Doran fe4255f2fc fix(deps): update dependency @codemirror/view to v6.39.17 (#8999) 2026-03-11 08:31:00 +02:00
Elian Doran c046a57654 chore(deps): update dependency webdriverio to v9.25.0 (#9000) 2026-03-11 08:30:47 +02:00
Elian Doran d8fc0d45a8 fix(deps): update dependency @zumer/snapdom to v2.1.0 (#9001) 2026-03-11 08:30:01 +02:00
Elian Doran 567b96cfb4 fix(deps): update dependency preact to v10.29.0 (#9002) 2026-03-11 08:29:34 +02:00
renovate[bot] d25849d280 fix(deps): update dependency preact to v10.29.0 2026-03-11 00:06:32 +00:00
renovate[bot] d4d73995db fix(deps): update dependency @zumer/snapdom to v2.1.0 2026-03-11 00:05:36 +00:00
renovate[bot] f4657b5da9 chore(deps): update dependency webdriverio to v9.25.0 2026-03-11 00:04:47 +00:00
renovate[bot] 614f43cb8a fix(deps): update dependency @codemirror/view to v6.39.17 2026-03-11 00:04:00 +00:00
renovate[bot] ca2fbf8dba chore(deps): update dependency yauzl to v3.2.1 2026-03-11 00:03:14 +00:00
renovate[bot] a421513442 chore(deps): update dependency lint-staged to v16.3.3 2026-03-11 00:02:25 +00:00
JYC333 a9599c471a Merge branch 'main' into renovate/eslint-linter-browserify-10.x 2026-03-10 23:56:13 +00:00
JYC333 415bcac641 chore(deps): update dependency lightningcss to v1.32.0 (#8985) 2026-03-10 23:54:00 +00:00
JYC333 9527017314 fix(deps): update dependency mind-elixir to v5.9.3 (#8984) 2026-03-10 23:53:12 +00:00
JYC333 1d3d7c77f8 fix(deps): update dependency i18next to v25.8.17 (#8983) 2026-03-10 23:52:55 +00:00
Elian Doran e868615fd5 chore(client): address requested changes 2026-03-10 22:19:50 +02:00
Elian Doran 80493a52be feat(video_player): move loop to center section 2026-03-10 20:46:28 +02:00
Elian Doran 3fed2ba42e feat(video_player): add zoom to fit button 2026-03-10 20:44:32 +02:00
Elian Doran 82592ada54 fix(video_player): unreadable controls on light theme 2026-03-10 20:36:03 +02:00
Elian Doran 5528701744 feat(video_player): indicate unsupported file formats 2026-03-10 20:33:47 +02:00
Elian Doran 0ca665fb85 chore(video_player): mention keys 2026-03-10 20:24:16 +02:00
Elian Doran 7eb452ed8b refactor(video_player): use translations 2026-03-10 20:22:03 +02:00
Elian Doran d81dec94a9 feat(video_player): add keyboard shortcuts for toggling volume 2026-03-10 20:18:16 +02:00
Elian Doran 6631a4a806 feat(video_player): add shortcuts to just to beginning/end 2026-03-10 20:16:53 +02:00
Elian Doran 12f817c896 feat(video_player): add keyboard shortcut to toggle mute 2026-03-10 20:16:04 +02:00
Elian Doran 87229600d2 feat(video_player): keyboard shortcut to toggle full-screen 2026-03-10 20:15:10 +02:00
Elian Doran 471a46a030 feat(video_player): flash controls when pressing shortcuts 2026-03-10 20:14:11 +02:00
Elian Doran 41220eebd5 feat(video_player): arrow keys to seek 2026-03-10 20:11:56 +02:00
Elian Doran 755872277b feat(video_player): space to toggle play/pause 2026-03-10 20:10:40 +02:00
Elian Doran 2cb54d7021 fix(video_player): loop can get out of sync with external control 2026-03-10 20:09:33 +02:00
Elian Doran 5a16bafbbf fix(video_player): playback speed can get out of sync with external control 2026-03-10 20:08:17 +02:00
Elian Doran fc6e9d89d9 fix(video_player): volume can get out of sync with external control 2026-03-10 20:07:45 +02:00
Elian Doran 8af35da279 feat(video_player): add loop button 2026-03-10 20:05:40 +02:00
Elian Doran 7107fec1a4 feat(video_player): add rotate button 2026-03-10 20:03:58 +02:00
Elian Doran 4bb662c5fb feat(video_player): button to toggle PIP 2026-03-10 20:00:38 +02:00
Elian Doran 89297b92f8 feat(video_player): click toggles play/pause instead of controls 2026-03-10 19:53:24 +02:00
Elian Doran e019271e74 feat(video_player): hide immediately on play 2026-03-10 19:50:31 +02:00
Elian Doran f6d61eefcc feat(video_player): don't hide controls if not playing 2026-03-10 19:48:21 +02:00
Elian Doran fabc07be42 refactor(video_player): extract hiding visibility to hook 2026-03-10 19:47:25 +02:00
Elian Doran bccfa7956c refactor(video_player): extract more buttons into separate components 2026-03-10 19:45:42 +02:00
Elian Doran 42a05f411b feat(video_player): basic toggle of the controls 2026-03-10 19:42:54 +02:00
Elian Doran 7ba7b98f5f feat(video_player): add playback speed indicator 2026-03-10 19:38:15 +02:00
Elian Doran 2132c2ab38 refactor(video_player): extract full screen to separate component 2026-03-10 19:29:00 +02:00
Elian Doran 2ce4d512e7 feat(video_player): add full screen button 2026-03-10 19:23:45 +02:00
Elian Doran 1258d32820 feat(video_player): add skip left/right buttons 2026-03-10 19:22:29 +02:00
Elian Doran db763ba229 feat(video_player): improve style of bottom bar 2026-03-10 19:20:49 +02:00
Elian Doran 951fdaec70 chore(video_player): change button alignment 2026-03-10 19:17:51 +02:00
Elian Doran 4303f3687e refactor(video_player): extract seek bar & volume control 2026-03-10 19:12:52 +02:00
Elian Doran 540b0e0b83 feat(video_player): volume changer 2026-03-10 19:11:08 +02:00
Elian Doran 08a0326cb0 feat(video_player): add elapsed/remaining time 2026-03-10 19:05:59 +02:00
Elian Doran 8b0a45e4fd feat(video_player): add a trackbar for seeking the video 2026-03-10 18:57:58 +02:00
Elian Doran 0e0ad2ed73 feat(video_player): single play/pause button 2026-03-10 18:56:20 +02:00
Elian Doran 4c73f31aca feat(video_player): start adding custom controls (play/pause) 2026-03-10 18:54:53 +02:00
Elian Doran 6b2ae8fd12 feat(video_player): black background 2026-03-10 18:49:36 +02:00
Elian Doran 88d84fae1e refactor(video_player): extract to separate file 2026-03-10 18:48:54 +02:00
Elian Doran cdc46faaad fix(board): add column not snappable on mobile 2026-03-10 18:41:53 +02:00
Elian Doran 24dbc79961 fix(board): clipped on horizontal scroll 2026-03-10 18:40:17 +02:00
Elian Doran 8cb58dcc45 fix(icon_packs): missing empty icon 2026-03-10 18:35:20 +02:00
Elian Doran fe70b8aee6 fix(note_badges): saved indicator not disappearing if reduced motion was activated 2026-03-10 18:32:31 +02:00
Elian Doran 00f66cfb49 fix(popup_editor): note content no longer rendering
The commit f44b47ec added a hasTabBeenActive guard in NoteDetail that defers rendering until the tab has been active at least once. It initializes via noteContext?.isActive() and then listens for activeNoteChanged events.

The popup editor creates its own NoteContext("_popup-editor") which is never the activeNtxId in the tab manager — isActive() always returns false, and activeNoteChanged never fires for it. So hasTabBeenActive stays false forever, and the if (!type || !hasTabBeenActive) return guard at NoteDetail.tsx:64 prevents the note type widget from ever loading.
2026-03-10 18:32:31 +02:00
Elian Doran 3a4b080765 Table of contents fixes (#8933) 2026-03-10 18:31:24 +02:00
Elian Doran 41269ef987 chore(deps): update dependency express-rate-limit to v8.3.1 (#8981) 2026-03-10 08:30:06 +02:00
Elian Doran e521c6a386 fix(deps): update dependency @mermaid-js/layout-elk to v0.2.1 (#8982) 2026-03-10 08:29:41 +02:00
Elian Doran 1c35a557c1 chore(deps): update pnpm to v10.32.0 (#8986) 2026-03-10 08:29:20 +02:00
Elian Doran 99eb8389c5 chore(deps): update typescript-eslint monorepo to v8.57.0 (#8987) 2026-03-10 08:29:03 +02:00
renovate[bot] c5e560ef5b chore(deps): update typescript-eslint monorepo to v8.57.0 2026-03-10 02:13:50 +00:00
renovate[bot] a7d7a078b1 chore(deps): update pnpm to v10.32.0 2026-03-10 02:12:47 +00:00
renovate[bot] a06fa5222f chore(deps): update dependency lightningcss to v1.32.0 2026-03-10 02:12:35 +00:00
renovate[bot] 8d3e40a28a fix(deps): update dependency mind-elixir to v5.9.3 2026-03-10 02:11:34 +00:00
renovate[bot] 8e32f99790 fix(deps): update dependency i18next to v25.8.17 2026-03-10 02:10:34 +00:00
renovate[bot] 57bce62e48 fix(deps): update dependency @mermaid-js/layout-elk to v0.2.1 2026-03-10 02:09:36 +00:00
renovate[bot] 1c873394d5 chore(deps): update dependency express-rate-limit to v8.3.1 2026-03-10 02:08:32 +00:00
JYC333 d652f67364 Translations update from Hosted Weblate (#8977) 2026-03-09 10:43:00 +00:00
JYC333 5e54d098c5 Apply suggestions from code review
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-03-09 10:23:14 +00:00
JYC333 ec95303c31 Apply suggestion from @gemini-code-assist[bot]
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-03-09 10:22:31 +00:00
Hosted Weblate 07aafe7e89 Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/
2026-03-09 11:17:40 +01:00
Giovi dc7acbb70e Translated using Weblate (Italian)
Currently translated at 100.0% (1676 of 1676 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/it/
2026-03-09 11:17:32 +01:00
JYC333 0dcb8b3ff8 Translations update from Hosted Weblate (#8975) 2026-03-09 10:17:22 +00:00
JYC333 e4ddff01ca Update docs/README-sv.md
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-03-09 10:13:43 +00:00
JYC333 015c1161d4 Update docs/README-sv.md
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-03-09 10:11:43 +00:00
Robert Magnusson ca0c6076c5 Translated using Weblate (Swedish)
Currently translated at 5.4% (21 of 387 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/sv/
2026-03-09 05:47:59 +00:00
Robert Magnusson 80a02f88be Translated using Weblate (Swedish)
Currently translated at 1.3% (22 of 1676 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/sv/
2026-03-09 05:47:58 +00:00
Robert Magnusson 430833bedb Translated using Weblate (Swedish)
Currently translated at 13.2% (21 of 158 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/sv/
2026-03-09 05:47:57 +00:00
Hosted Weblate dc80d83964 Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/
2026-03-09 05:47:56 +00:00
Elian Doran 5f7ade45f4 fix(deps): update dependency katex to v0.16.38 (#8969) 2026-03-09 07:47:35 +02:00
Elian Doran 8b36a7ab1e Spreadsheet experiment v0.5 (#8966) 2026-03-09 07:47:08 +02:00
Elian Doran fd18276693 fix(deps): update dependency @preact/signals to v2.8.2 (#8968) 2026-03-09 07:46:47 +02:00
Elian Doran 0becfc16ba chore(deps): update pnpm to v10.31.0 (#8971) 2026-03-09 07:46:02 +02:00
renovate[bot] d480d1f6ba chore(deps): update pnpm to v10.31.0 2026-03-09 01:36:51 +00:00
renovate[bot] f5c9a71ba0 fix(deps): update dependency katex to v0.16.38 2026-03-09 01:35:41 +00:00
renovate[bot] c177a8a464 fix(deps): update dependency @preact/signals to v2.8.2 2026-03-09 01:34:42 +00:00
Elian Doran c826564c9e chore(spreadsheet): address requested changes 2026-03-08 23:25:47 +02:00
Elian Doran ccb13fa6b9 fix(commons): typecheck 2026-03-08 23:19:23 +02:00
Elian Doran 69e374138f fix(spreadsheet): missing some CSS imports 2026-03-08 23:07:48 +02:00
Elian Doran 3156b2cb59 feat(spreadsheet): enable conditional formatting 2026-03-08 23:02:54 +02:00
Elian Doran d6217ffed4 feat(spreadsheet): enable data validation 2026-03-08 22:59:41 +02:00
Elian Doran fc90c6af9d feat(spreadsheet): enable sorting 2026-03-08 22:56:11 +02:00
Elian Doran a1118419ec feat(spreadsheet): enable filtering 2026-03-08 22:53:04 +02:00
Elian Doran 8599785ee8 refactor(spreadsheet): use multiple modules 2026-03-08 22:39:43 +02:00
Elian Doran 99ba192a44 feat(spreadsheet): allow triggering find/replace from context menu 2026-03-08 22:35:08 +02:00
Elian Doran b86d3587ac feat(spreadsheet): basic integration of find/replace 2026-03-08 22:24:03 +02:00
Elian Doran b2a0baf56a fix(spreadsheet): jumping when editing in another split 2026-03-08 22:15:29 +02:00
Elian Doran 22f37817e5 fix(spreadsheet): fix The column width is less than 0 when switching tabs 2026-03-08 22:01:45 +02:00
Elian Doran 6b4fe03625 fix(spreadsheet): mitigate The column width is less than 0, need to adjust page width to make it great than 0 when changing an inactive tab 2026-03-08 21:57:26 +02:00
Elian Doran f44b47ec23 fix(client): tabs still rendering in the background 2026-03-08 21:48:45 +02:00
Elian Doran 8d667e838a feat(spreadsheet): hide cell protection mechanism 2026-03-08 21:28:12 +02:00
Elian Doran f32385de2e feat(spreadsheet): hide toolbars while in read-only 2026-03-08 21:24:24 +02:00
Elian Doran 90796fc4fa feat(spreadsheet): basic read-only support 2026-03-08 21:09:11 +02:00
Elian Doran 4960c49cb2 feat(spreadsheet): add note plugin 2026-03-08 20:39:07 +02:00
Elian Doran b112e8b56b feat(spreadsheet): basic support for note revision using image 2026-03-08 20:30:24 +02:00
Elian Doran 83095130f6 feat(spreadsheet): basic rendering as HTML for share 2026-03-08 20:04:14 +02:00
Elian Doran d005c0ef2d feat(spreadsheet): basic note list preview using SVG 2026-03-08 19:49:53 +02:00
Elian Doran c135578626 fix(spreadsheet): not focusing on tab switch 2026-03-08 13:05:47 +02:00
Elian Doran 9a6e20029e fix(client): all tabs loaded in the background 2026-03-08 12:59:57 +02:00
Elian Doran 39bd4ccea1 Merge branch 'main' of https://github.com/TriliumNext/Trilium 2026-03-08 12:59:44 +02:00
Elian Doran aac4774326 Merge remote-tracking branch 'origin/main' into feature/toc_improvements 2026-03-08 12:20:53 +02:00
Elian Doran ea7aac2030 v0.102.1 (#8961) 2026-03-08 12:13:12 +02:00
Elian Doran e7f98f08d0 Merge remote-tracking branch 'origin/main' into stable 2026-03-08 12:12:52 +02:00
Elian Doran 8ac9daa5d3 chore(release): prepare for v0.102.1
Checks / main (push) Successful in 2s
/ Check Docker build (Dockerfile) (push) Failing after 38s
/ Check Docker build (Dockerfile.alpine) (push) Failing after 45s
/ Build Docker images (Dockerfile, ubuntu-24.04-arm, linux/arm64) (push) Has been skipped
/ Build Docker images (Dockerfile.alpine, ubuntu-latest, linux/amd64) (push) Has been skipped
/ Build Docker images (Dockerfile.legacy, ubuntu-24.04-arm, linux/arm/v7) (push) Has been skipped
/ Build Docker images (Dockerfile.legacy, ubuntu-24.04-arm, linux/arm/v8) (push) Has been skipped
/ Merge manifest lists (push) Has been skipped
Release / Sanity Check (push) Failing after 35s
Release / Make Electron (arm64, map[forge_platform:darwin image:macos-latest name:macos shell:bash]) (push) Has been skipped
Release / Make Electron (arm64, map[forge_platform:linux image:ubuntu-22.04 name:linux shell:bash]) (push) Has been skipped
Release / Make Electron (arm64, map[forge_platform:linux image:ubuntu-24.04-arm name:linux shell:bash]) (push) Has been skipped
Release / Make Electron (arm64, map[forge_platform:win32 image:win-signing name:windows shell:cmd]) (push) Has been skipped
Release / Make Electron (x64, map[forge_platform:darwin image:macos-latest name:macos shell:bash]) (push) Has been skipped
Release / Make Electron (x64, map[forge_platform:linux image:ubuntu-22.04 name:linux shell:bash]) (push) Has been skipped
Release / Make Electron (x64, map[forge_platform:win32 image:win-signing name:windows shell:cmd]) (push) Has been skipped
Release / Build Linux Server (arm64, ubuntu-24.04-arm) (push) Has been skipped
Release / Build Linux Server (x64, ubuntu-22.04) (push) Has been skipped
Release / Publish release (push) Has been skipped
2026-03-08 10:43:59 +02:00
Elian Doran 0b506c6327 chore(pdfjs): bump pdfjs viewer version 2026-03-08 10:41:21 +02:00
Elian Doran d2b62540ec fix(ci): migrate all the jank docker ci to use crane instead (#8869) 2026-03-08 10:37:49 +02:00
Elian Doran 64418c7fec docs(release): prepare for v0.102.1 2026-03-08 10:36:06 +02:00
Elian Doran 8c1a58e64f fix(pdf): cache buster not working in all circumstances 2026-03-08 10:29:57 +02:00
Adorian Doran b27fd31c1f style/pdf viewer: fix some layout issues in toolbar 2026-03-08 10:25:05 +02:00
Elian Doran f18a531924 fix(mindmap): crashing on auto-switch to dark theme (closes #8879) 2026-03-08 10:22:21 +02:00
Elian Doran 3cabb4b661 fix(pdf): not accessible on Nginx Proxy Manager with block common exploits (closes #8877) 2026-03-08 09:30:27 +02:00
Elian Doran 5c88b1c6b8 chore(server): add infrastructure for running Nginx Proxy Manager 2026-03-08 09:01:47 +02:00
Elian Doran c2adc43780 chore(deps): update dependency @types/multer to v2.1.0 (#8921) 2026-03-07 23:17:45 +02:00
Elian Doran 7eaa5352ba Translations update from Hosted Weblate (#8956) 2026-03-07 23:17:15 +02:00
Patric Siesing 17e3e3187b Translated using Weblate (Swedish)
Currently translated at 4.6% (18 of 387 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/sv/
2026-03-07 22:15:57 +01:00
Robert Magnusson 2ad7cd3a49 Translated using Weblate (Swedish)
Currently translated at 4.6% (18 of 387 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/sv/
2026-03-07 22:15:56 +01:00
Patric Siesing 39aa8d61c2 Translated using Weblate (Swedish)
Currently translated at 11.3% (18 of 158 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/sv/
2026-03-07 22:15:55 +01:00
Robert Magnusson 1a3ea977b7 Translated using Weblate (Swedish)
Currently translated at 11.3% (18 of 158 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/sv/
2026-03-07 22:15:54 +01:00
Robert Magnusson 4cd8f9a1e6 Translated using Weblate (Swedish)
Currently translated at 1.0% (18 of 1676 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/sv/
2026-03-07 22:15:53 +01:00
Hosted Weblate 87ce6d1231 Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/
2026-03-07 22:15:52 +01:00
Elian Doran 8fdbeacf77 fix(deps): update dependency katex to v0.16.37 (#8935) 2026-03-07 23:15:44 +02:00
Elian Doran f4f775a1c9 chore(deps): update dependency @smithy/middleware-retry to v4.4.40 (#8945) 2026-03-07 23:13:13 +02:00
Elian Doran fe1154cb2d chore(deps): update dependency @types/sanitize-html to v2.16.1 (#8946) 2026-03-07 23:12:53 +02:00
Elian Doran 638f479ff3 chore(deps): update dependency eslint to v10.0.3 (#8947) 2026-03-07 23:12:27 +02:00
Elian Doran 70436bdb04 fix(deps): update dependency react-i18next to v16.5.6 (#8949) 2026-03-07 23:12:05 +02:00
Elian Doran 575ecaae07 fix(deps): update dependency tabulator-tables to v6.4.0 (#8950) 2026-03-07 23:11:37 +02:00
Elian Doran d277e6db94 chore(deps): update actions/upload-artifact action to v7 (#8951) 2026-03-07 08:29:42 +02:00
renovate[bot] 25efcd12d0 chore(deps): update actions/upload-artifact action to v7 2026-03-07 02:18:00 +00:00
renovate[bot] 10129321be fix(deps): update dependency tabulator-tables to v6.4.0 2026-03-07 02:17:54 +00:00
renovate[bot] 72710a8f6b chore(deps): update dependency @types/multer to v2.1.0 2026-03-07 02:17:10 +00:00
renovate[bot] 6a7c5c04d8 fix(deps): update dependency react-i18next to v16.5.6 2026-03-07 02:16:21 +00:00
renovate[bot] 7f32fe5ef7 fix(deps): update dependency eslint-linter-browserify to v10.0.3 2026-03-07 02:15:20 +00:00
renovate[bot] 5d89591dea chore(deps): update dependency eslint to v10.0.3 2026-03-07 02:14:21 +00:00
renovate[bot] a88bf5a87b chore(deps): update dependency @types/sanitize-html to v2.16.1 2026-03-07 02:13:18 +00:00
renovate[bot] bbe5d3506e chore(deps): update dependency @smithy/middleware-retry to v4.4.40 2026-03-07 02:12:12 +00:00
renovate[bot] c2993d4e7d fix(deps): update dependency katex to v0.16.37 2026-03-06 21:42:06 +00:00
Elian Doran 17ba479182 chore(deps): update dependency @smithy/middleware-retry to v4.4.39 (#8906) 2026-03-06 19:01:41 +02:00
Elian Doran a465014bbe fix(deps): update codemirror (#8885) 2026-03-06 19:01:13 +02:00
Elian Doran 5dfe253ef6 chore(deps): update imjasonh/setup-crane action to v0.5 (#8910) 2026-03-06 19:00:14 +02:00
Elian Doran ae7ca6021f Translations update from Hosted Weblate (#8919) 2026-03-06 18:57:49 +02:00
noobhjy c389697acd Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1676 of 1676 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2026-03-06 16:50:15 +00:00
Aleksandr Reid c13c3e0f4a Translated using Weblate (Russian)
Currently translated at 100.0% (1676 of 1676 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ru/
2026-03-06 16:50:14 +00:00
Ulices 82c042d045 Translated using Weblate (Spanish)
Currently translated at 100.0% (1676 of 1676 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/es/
2026-03-06 16:50:14 +00:00
Aleksandr Reid 9145ba1690 Translated using Weblate (Russian)
Currently translated at 100.0% (387 of 387 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ru/
2026-03-06 16:50:13 +00:00
Marcel d60653ee17 Translated using Weblate (German)
Currently translated at 100.0% (158 of 158 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/de/
2026-03-06 16:50:12 +00:00
Marcel dae8613b4e Translated using Weblate (German)
Currently translated at 100.0% (1676 of 1676 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/de/
2026-03-06 16:50:12 +00:00
Aindriú Mac Giolla Eoin 2f8e2c40be Translated using Weblate (Irish)
Currently translated at 100.0% (1676 of 1676 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ga/
2026-03-06 16:50:11 +00:00
Francis C. d85225a0dc Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (1676 of 1676 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hant/
2026-03-06 16:50:11 +00:00
green 0cb66df2b2 Translated using Weblate (Japanese)
Currently translated at 100.0% (1676 of 1676 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2026-03-06 16:50:10 +00:00
Aleksandr Reid 92e0578cb6 Translated using Weblate (Russian)
Currently translated at 100.0% (158 of 158 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/ru/
2026-03-06 16:50:09 +00:00
Elian Doran 2eee06786e chore(deps): update dependency lint-staged to v16.3.2 (#8908) 2026-03-06 18:50:00 +02:00
Elian Doran 19053dcb3b fix(deps): update dependency mind-elixir to v5.9.2 (#8909) 2026-03-06 18:49:24 +02:00
JYC333 e10c30c59f fix(deps): update dependency i18next to v25.8.14 (#8922) 2026-03-06 14:12:55 +00:00
Elian Doran c356159664 fix(deps): update dependency marked to v17.0.4 (#8923) 2026-03-06 15:45:12 +02:00
Elian Doran 579be68ca1 chore(deps): update dependency electron to v40.8.0 (#8924) 2026-03-06 15:28:24 +02:00
Elian Doran a6326a682e chore(deps): update dependency @types/node to v24.12.0 (#8934) 2026-03-06 15:27:19 +02:00
renovate[bot] 4595a3a5dd fix(deps): update dependency i18next to v25.8.14 2026-03-06 12:42:27 +00:00
renovate[bot] ee21185e64 chore(deps): update dependency electron to v40.8.0 2026-03-06 12:39:17 +00:00
Elian Doran 6d0676c37d chore(deps): update docker/login-action action to v4 (#8925) 2026-03-06 14:38:39 +02:00
Elian Doran 1d4768a581 chore(deps): update docker/setup-qemu-action action to v4 (#8926) 2026-03-06 14:38:14 +02:00
Elian Doran d086bb7fcb chore(deps): update dependency multer to v2.1.1 [security] (#8929) 2026-03-06 14:37:33 +02:00
Elian Doran 2607c4a32e fix(deps): update dependency react-i18next to v16.5.5 (#8936) 2026-03-06 14:37:12 +02:00
Elian Doran 624333a2ef chore(deps): update dependency express-rate-limit to v8.3.0 (#8937) 2026-03-06 14:36:43 +02:00
Elian Doran d4acb37f21 chore(deps): update dependency ejs to v5 (#8938) 2026-03-06 14:36:24 +02:00
Elian Doran 6c1a1e9812 chore(deps): update docker/build-push-action action to v7 (#8939) 2026-03-06 13:19:16 +02:00
Elian Doran 9a13641f9b chore(deps): update docker/metadata-action action to v6 (#8940) 2026-03-06 13:18:33 +02:00
renovate[bot] 699e0624c9 chore(deps): update docker/setup-qemu-action action to v4 2026-03-06 06:58:29 +00:00
renovate[bot] 47ceb0d4d2 chore(deps): update docker/metadata-action action to v6 2026-03-06 06:58:27 +00:00
renovate[bot] 15c42f4a09 chore(deps): update docker/login-action action to v4 2026-03-06 06:58:24 +00:00
renovate[bot] bf8401bb26 chore(deps): update docker/build-push-action action to v7 2026-03-06 06:58:21 +00:00
renovate[bot] f234433c63 chore(deps): update dependency ejs to v5 2026-03-06 06:58:18 +00:00
renovate[bot] 1b70101123 chore(deps): update imjasonh/setup-crane action to v0.5 2026-03-06 06:57:50 +00:00
renovate[bot] d610c63c28 chore(deps): update dependency express-rate-limit to v8.3.0 2026-03-06 06:57:17 +00:00
renovate[bot] 5e820a407f chore(deps): update dependency @types/node to v24.12.0 2026-03-06 06:56:18 +00:00
renovate[bot] 62610979b7 fix(deps): update dependency react-i18next to v16.5.5 2026-03-06 06:55:50 +00:00
renovate[bot] 700e99e854 fix(deps): update dependency mind-elixir to v5.9.2 2026-03-06 06:55:19 +00:00
renovate[bot] 7767116b3d fix(deps): update dependency marked to v17.0.4 2026-03-06 06:54:40 +00:00
renovate[bot] 0206e8247b fix(deps): update codemirror 2026-03-06 06:52:48 +00:00
renovate[bot] 5476fe3df9 chore(deps): update dependency lint-staged to v16.3.2 2026-03-06 06:50:46 +00:00
renovate[bot] d9a4581d37 chore(deps): update dependency @smithy/middleware-retry to v4.4.39 2026-03-06 06:49:46 +00:00
renovate[bot] 8d9c888481 chore(deps): update dependency multer to v2.1.1 [security] 2026-03-06 06:46:38 +00:00
Elian Doran 11e4b672d1 Fix CI test issues (#8932) 2026-03-06 08:43:51 +02:00
Elian Doran bace3daadc Update apps/server/src/routes/session_parser.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-03-06 08:43:31 +02:00
Elian Doran dee5380e60 fix(ci): sequential tests ended up run in parallel 2026-03-06 08:20:17 +02:00
Elian Doran bc6a6fd860 Revert "test(server): reset ws module"
This reverts commit 0212398815.
2026-03-05 23:44:24 +02:00
Elian Doran e928337fe9 test(server): adjust timeout 2026-03-05 23:40:43 +02:00
Elian Doran 432f86ea4b Revert "test(server): switch to forks with 2 max workers"
This reverts commit 4ac22678df.
2026-03-05 23:37:28 +02:00
Elian Doran 5d2daecee0 test(server): switch to forks with 6 max workers 2026-03-05 23:35:15 +02:00
Elian Doran 7c8eb311af test(server): switch to forks with 3 max workers 2026-03-05 23:31:54 +02:00
Elian Doran 4ac22678df test(server): switch to forks with 2 max workers 2026-03-05 23:25:45 +02:00
Elian Doran 5057c02176 test(server): fix errors due to database already existing 2026-03-05 22:52:26 +02:00
Elian Doran d301e56216 refactor(server): don't set up other timers on module init 2026-03-05 22:19:04 +02:00
Elian Doran 3c22ab8c9c refactor(server): don't set up session timer on module init 2026-03-05 22:17:19 +02:00
Elian Doran 0212398815 test(server): reset ws module 2026-03-05 22:14:34 +02:00
Elian Doran db0c515bad test(server): fake timers not restored 2026-03-05 22:11:51 +02:00
Elian Doran 9b4f8c5003 feat(ci/client): HTML output 2026-03-05 22:07:11 +02:00
Elian Doran 85d8c4c8fa feat(ci/server): HTML output 2026-03-05 22:06:46 +02:00
Elian Doran 5afab6938a test(server): reduce max workers to 1 2026-03-05 21:54:30 +02:00
Elian Doran a437169ad5 test(server): increase hook timeout 2026-03-05 21:20:12 +02:00
Elian Doran f632d3aeb6 Merge remote-tracking branch 'origin/main' into fix/ci 2026-03-05 21:14:57 +02:00
Elian Doran 513fffcb1a ci(dev): escape test filter 2026-03-05 21:14:21 +02:00
Elian Doran d3337eab9c Merge branch 'main' into feature/toc_improvements 2026-03-05 21:05:17 +02:00
Elian Doran 8128a8192a refactor(ckeditor): address requested changes 2026-03-05 19:28:52 +02:00
Elian Doran c80bb9657c fix(mindmap): crashing on auto-switch to dark theme 2026-03-05 19:25:07 +02:00
Elian Doran 65514a6fd7 fix(toc): title is extracted before changes are made 2026-03-05 19:08:56 +02:00
Elian Doran 93a7f8c711 fix(toc): not reacting to attribute changes in CKEditor 2026-03-05 19:03:32 +02:00
Elian Doran 0ca179f990 ci(test): quote command 2026-03-05 18:40:24 +02:00
Elian Doran 9d104015f3 ci(test): quote command 2026-03-05 18:30:08 +02:00
Elian Doran 2c4cf2dcf1 ci(test): separate running of heavy tests to avoid OOM issues 2026-03-05 18:28:27 +02:00
Elian Doran d2e0124962 chore(deps): update dependency fs-extra to v11.3.4 (#8907) 2026-03-05 16:51:11 +02:00
renovate[bot] cd59c75c04 chore(deps): update dependency fs-extra to v11.3.4 2026-03-04 01:13:39 +00:00
Elian Doran caa9143591 chore(deps): update dependency happy-dom to v20.8.3 (#8887) 2026-03-03 22:15:58 +02:00
renovate[bot] 7e53810c02 chore(deps): update dependency happy-dom to v20.8.3 2026-03-03 19:42:03 +00:00
Elian Doran 12efa8dc0b chore(deps): update dependency eslint-plugin-playwright to v2.9.0 (#8886) 2026-03-03 21:21:22 +02:00
Elian Doran 4d0ccac7b5 fix(deps): update dependency node-html-parser to v7.1.0 (#8888) 2026-03-03 21:20:21 +02:00
Elian Doran 8b023a55d0 chore(deps): update dependency copy-webpack-plugin to v14 (#8889) 2026-03-03 21:10:22 +02:00
Elian Doran b4df5fcbd9 chore(deps): update dependency rollup-plugin-webpack-stats to v3 (#8890) 2026-03-03 20:58:24 +02:00
renovate[bot] 6fbe5718e9 chore(deps): update dependency rollup-plugin-webpack-stats to v3 2026-03-03 18:54:56 +00:00
Elian Doran 908bafca63 Translations update from Hosted Weblate (#8901) 2026-03-03 20:54:00 +02:00
Elian Doran d7313efd67 fix(ci): migrate all the jank docker ci to use crane instead (#8869) 2026-03-03 20:48:42 +02:00
Микола Копитін a51e15c9b8 Translated using Weblate (Ukrainian)
Currently translated at 90.0% (1508 of 1675 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/uk/
2026-03-03 18:44:20 +00:00
Hosted Weblate 37e9c7d639 Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/
2026-03-03 18:44:20 +00:00
Elian Doran 2d00ac4dfb Univer Sheets v0 (#8902) 2026-03-03 20:44:06 +02:00
Elian Doran 6aec7eae00 chore(server): increase sync version to avoid data loss due to unsupported note type 2026-03-03 20:25:33 +02:00
Elian Doran 6bfbc2d35e chore(spreadsheet): use better clean up mechanism 2026-03-03 20:12:54 +02:00
Elian Doran 2ffc854ce6 chore(spreadsheet): mark note type as beta 2026-03-03 19:59:12 +02:00
Elian Doran ddd4a374e4 chore(client): fix some whitespace issues 2026-03-03 19:52:15 +02:00
Elian Doran 0d6e2fc00f chore(client): fix typecheck 2026-03-03 19:41:51 +02:00
Elian Doran 366a8e8726 fix(spreadsheet): persistence hook on every render 2026-03-03 19:24:04 +02:00
Elian Doran 7f0aa0697a fix(spreadsheet): error due to duplicate unit IDs 2026-03-03 19:20:25 +02:00
Elian Doran d123ce33b8 feat(spreadsheet): restore from JSON 2026-03-03 19:09:33 +02:00
Elian Doran 55588f5962 feat(spreadsheet): restore from JSON 2026-03-03 19:05:01 +02:00
Elian Doran f32130d5c2 feat(spreadsheet): allow source to be viewed 2026-03-03 19:00:23 +02:00
Elian Doran 03f4ff9e7c feat(spreadsheet): save spreadsheet to JSON 2026-03-03 19:00:14 +02:00
Elian Doran 6de78c7154 refactor(spreadsheet): make use of hooks 2026-03-03 18:48:45 +02:00
Elian Doran d331e418d4 feat(spreadsheet): support dark mode 2026-03-03 18:42:26 +02:00
Elian Doran 4ace74bcb8 feat(spreadsheet): make full-width 2026-03-03 18:36:17 +02:00
Elian Doran 1d4a336256 feat(spreadsheet): integrate spreadsheet with full-height 2026-03-03 18:34:46 +02:00
Elian Doran ee6c192ab9 chore(spreadsheet): create new note type 2026-03-03 18:24:55 +02:00
Elian Doran b220bdce9c fix(note_list): affected by floating images (closes #8899) 2026-03-03 18:14:43 +02:00
Elian Doran 4d86c6c4f1 feat(import/single): trim extension for audio files + default icon 2026-03-03 16:19:44 +02:00
Elian Doran 4fd68bf12d feat(import/single): trim extension for video files 2026-03-03 14:29:18 +02:00
Elian Doran 3ffe34964f feat(notes): add default icon for videos 2026-03-03 14:26:45 +02:00
Elian Doran faaf26c174 fix(quick_edit): save indicator not shown 2026-03-03 14:19:24 +02:00
Elian Doran f9c7518db2 fix(spaced_update): triggering events too often while typing 2026-03-03 14:19:24 +02:00
Elian Doran 8357c2a39c chore(pdfjs): version not updated for releases 2026-03-03 14:19:24 +02:00
renovate[bot] 793dcee562 chore(deps): update dependency copy-webpack-plugin to v14 2026-03-03 02:02:49 +00:00
renovate[bot] 00368fc131 fix(deps): update dependency node-html-parser to v7.1.0 2026-03-03 02:01:49 +00:00
renovate[bot] f81b686f41 chore(deps): update dependency eslint-plugin-playwright to v2.9.0 2026-03-03 02:00:00 +00:00
contributor ac24c69858 fix(webview): refresh content for SPAs with "query string" in hash 2026-03-02 23:35:53 +02:00
Elian Doran 4c5aada5d3 chore(deps): update dependency @types/express-serve-static-core to v5.1.1 (#8346) 2026-03-02 22:42:10 +02:00
Elian Doran 05551cec9e chore(deps): update dependency sax to v1.5.0 (#8875) 2026-03-02 22:41:20 +02:00
Elian Doran 6300a8c8d1 chore(deps): update dependency @redocly/cli to v2.20.2 (#8853) 2026-03-02 22:34:22 +02:00
Elian Doran ca4d15727d Merge branch 'main' into renovate/express-serve-static-core-5.x 2026-03-02 22:30:43 +02:00
renovate[bot] 2fe076086e chore(deps): update dependency sax to v1.5.0 2026-03-02 20:25:56 +00:00
Elian Doran 56b65ddfae Translations update from Hosted Weblate (#8870) 2026-03-02 22:22:37 +02:00
Hasan Kara fcf6673825 Translated using Weblate (Turkish)
Currently translated at 16.3% (19 of 116 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/tr/
2026-03-02 20:54:15 +01:00
Hasan Kara 9eda264f52 Translated using Weblate (Turkish)
Currently translated at 5.1% (20 of 387 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/tr/
2026-03-02 20:54:14 +01:00
Hasan Kara fe1270c679 Translated using Weblate (Turkish)
Currently translated at 4.2% (71 of 1675 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/tr/
2026-03-02 20:54:13 +01:00
Hasan Kara 679e1ac678 Translated using Weblate (Turkish)
Currently translated at 12.0% (19 of 158 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/tr/
2026-03-02 20:54:12 +01:00
ibs-allaow e309ff2d17 Translated using Weblate (Arabic)
Currently translated at 100.0% (116 of 116 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/ar/
2026-03-02 20:54:12 +01:00
Francis C. c910335155 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (1675 of 1675 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hant/
2026-03-02 20:54:11 +01:00
Yatrik Patel 5606cde506 Translated using Weblate (Hindi)
Currently translated at 100.0% (1675 of 1675 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/hi/
2026-03-02 20:54:10 +01:00
Yatrik Patel 0e2f4f4e13 Translated using Weblate (Hindi)
Currently translated at 38.6% (61 of 158 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/hi/
2026-03-02 20:54:09 +01:00
renovate[bot] 1f6c6f2acd chore(deps): update dependency @redocly/cli to v2.20.2 2026-03-02 18:09:58 +00:00
Elian Doran 37d2e9f14b fix(deps): update dependency globals to v17.4.0 (#8876) 2026-03-02 16:44:44 +02:00
Adorian Doran 0fcf30a3b8 Merge branch 'main' of https://github.com/TriliumNext/Trilium 2026-03-02 11:22:08 +02:00
Adorian Doran 8712e7dd16 style/pdf viewer: fix some layout issues in toolbar 2026-03-02 11:21:47 +02:00
renovate[bot] 2ee4e9cc14 fix(deps): update dependency globals to v17.4.0 2026-03-02 01:18:53 +00:00
perfectra1n b257b75be2 fix(ci): remove fragile jq where possible 2026-03-01 13:49:45 -08:00
perfectra1n 2de2709420 fix(ci): migrate all the jank docker ci to use crane instead 2026-03-01 13:47:18 -08:00
Elian Doran 34ca7912fc Merge remote-tracking branch 'origin/main' into renovate/express-serve-static-core-5.x 2026-02-28 19:11:57 +02:00
Elian Doran dc3de5bf36 chore(server): address requested changes 2026-02-27 00:05:54 +02:00
Elian Doran 1041bf70e1 test(express-partial-content): fix type errors 2026-02-26 21:11:22 +02:00
Elian Doran 0c6326b678 refactor(server): use strong typing for routes 2026-02-26 21:08:54 +02:00
renovate[bot] fd805a5279 chore(deps): update dependency @types/express-serve-static-core to v5.1.1 2026-02-26 18:18:55 +00:00
Elian Doran b9cef158d8 Merge remote-tracking branch 'origin/main' into feat/add-ocr-capabilities 2025-07-31 08:25:30 +03:00
Elian Doran a3a3b3cb5c Merge remote-tracking branch 'origin/main' into renovate/csrf-csrf-4.x 2025-07-26 15:49:50 +03:00
Elian Doran 5ec6141369 feat(ocr): filter out text based on confidence 2025-07-26 14:57:12 +03:00
Elian Doran 55ac1e01f2 chore(ocr): improve ocr search result style 2025-07-26 14:15:45 +03:00
Elian Doran 65b58c3668 feat(ocr): auto-process images only if enabled in settings 2025-07-26 14:12:22 +03:00
Elian Doran 2cb4e5e8dc feat(ocr): run the image operation in the background 2025-07-26 14:07:23 +03:00
Elian Doran 72cea245f1 feat(ocr): automatically process images 2025-07-26 14:00:35 +03:00
Elian Doran 08ca86c68a chore(deps): move workspace dependencies to server 2025-07-26 13:48:28 +03:00
Elian Doran 925c9c1e7b feat(ocr): display OCR text only in search results 2025-07-26 12:55:52 +03:00
Elian Doran 6212ea0304 feat(ocr): display OCR text in search results 2025-07-26 12:41:30 +03:00
Elian Doran f295592134 fix(ocr): search error due to scoring 2025-07-26 12:33:45 +03:00
Elian Doran 69b0973e6d feat(ocr): add a button to trigger an OCR manually 2025-07-26 12:18:20 +03:00
Elian Doran 422d318dac feat(ocr): add an option to display OCR text 2025-07-26 12:08:04 +03:00
Elian Doran c55aa6ee88 refactor(ocr): unnecessary initialization logic 2025-07-26 11:56:48 +03:00
Elian Doran 090b175152 refactor(ocr): deduplicate mime types partially 2025-07-26 11:51:53 +03:00
Elian Doran 11e9b097a2 feat(ocr): basic processing of new files 2025-07-26 11:46:28 +03:00
Elian Doran 2adfc1d32b chore(ci): remove unnecessary change 2025-07-26 11:24:42 +03:00
Elian Doran 99fa5d89e7 Merge remote-tracking branch 'origin/main' into feat/add-ocr-capabilities 2025-07-26 10:33:01 +03:00
perf3ct ca8cbf8ccf feat(ocr): add additional processors for OCR feature 2025-07-16 20:10:56 +00:00
perf3ct 6722d2d266 feat(ocr): implement new language selection form 2025-07-16 20:10:41 +00:00
perf3ct 508cbeaa1b feat(ocr): update this new migration to also add a ocr_last_processed column 2025-07-16 20:10:07 +00:00
perf3ct e040865905 feat(ocr): add officeparser, pdf-parse, and sharp dependencies for ocr 2025-07-16 20:09:41 +00:00
perf3ct a7878dd2c6 Merge branch 'main' into feat/add-ocr-capabilities 2025-07-16 17:54:32 +00:00
Jon Fuller 02980834ad Merge branch 'main' into feat/add-ocr-capabilities 2025-07-15 10:10:47 -07:00
perf3ct 2a8c8871c4 fix(dev): resolve issues with pnpm-lock.yaml 2025-07-14 16:41:02 +00:00
perf3ct 893be24c1d merge main into feature branch 2025-07-14 16:38:22 +00:00
perf3ct 9029f59410 feat(ocr): swap from custom table to using the blobs table, with a new column 2025-07-14 16:15:15 +00:00
Jon Fuller d4aaf4ca9b Merge branch 'develop' into renovate/csrf-csrf-4.x 2025-06-11 12:44:51 -07:00
Jon Fuller 4b5e8d33a6 Update playwright.yml 2025-06-10 15:37:05 -07:00
perf3ct 09196c045f fix(ocr): obviously don't need this migration file anymore 2025-06-10 20:59:17 +00:00
perf3ct 7868ebec1e fix(unit): also fix broken llm test 2025-06-10 20:51:34 +00:00
perf3ct 80a9182f05 feat(unit): ocr tests almost pass... 2025-06-10 20:41:40 +00:00
perf3ct d20b3d854f feat(unit): ocr tests almost pass... 2025-06-10 20:36:52 +00:00
perf3ct f1356228a3 feat(unit): ocr unit tests almost pass 2025-06-10 20:22:31 +00:00
perf3ct a4adc51e50 fix(unit): resolve typecheck errors 2025-06-10 19:48:48 +00:00
perf3ct 864543e4f9 feat(ocr): drop confidence down a little bit 2025-06-10 19:22:46 +00:00
perf3ct 33a549202b fix(package): referenced wrong tesseract.js lol 2025-06-10 19:19:17 +00:00
perf3ct c4a0219b18 feat(ocr): add unit tests, resolve double sent headers, and fix the wonderful tesseract.js path issues 2025-06-10 19:12:50 +00:00
Elian Doran e7450b5143 Merge branch 'develop' into renovate/csrf-csrf-4.x 2025-06-08 14:31:55 +03:00
Elian Doran fd90454eb6 Merge branch 'develop' into renovate/csrf-csrf-4.x 2025-05-17 09:51:02 +03:00
Elian Doran f327b54c0e feat(csrf): use different token to avoid issues with old token 2025-05-16 19:45:32 +03:00
Elian Doran f38105ef05 Merge remote-tracking branch 'origin/develop' into renovate/csrf-csrf-4.x 2025-05-16 19:34:19 +03:00
Elian Doran 6f6041ee7b fix(server): migrate csrf to v4 2025-05-15 20:39:31 +03:00
renovate[bot] 2c1517d259 chore(deps): update dependency csrf-csrf to v4 2025-05-15 16:12:11 +00:00
937 changed files with 68468 additions and 28609 deletions
+19 -3
View File
@@ -21,7 +21,7 @@ runs:
# Certificate setup
- name: Import Apple certificates
if: inputs.os == 'macos'
uses: apple-actions/import-codesign-certs@v6
uses: apple-actions/import-codesign-certs@v7
with:
p12-file-base64: ${{ env.APPLE_APP_CERTIFICATE_BASE64 }}
p12-password: ${{ env.APPLE_APP_CERTIFICATE_PASSWORD }}
@@ -30,7 +30,7 @@ runs:
- name: Install Installer certificate
if: inputs.os == 'macos'
uses: apple-actions/import-codesign-certs@v6
uses: apple-actions/import-codesign-certs@v7
with:
p12-file-base64: ${{ env.APPLE_INSTALLER_CERTIFICATE_BASE64 }}
p12-password: ${{ env.APPLE_INSTALLER_CERTIFICATE_PASSWORD }}
@@ -66,12 +66,20 @@ runs:
if: ${{ inputs.os == 'linux' }}
shell: ${{ inputs.shell }}
run: |
sudo apt-get update && sudo apt-get install rpm flatpak-builder elfutils
sudo apt-get update && sudo apt-get install rpm flatpak-builder elfutils libfuse2
flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
FLATPAK_ARCH=$(if [[ ${{ inputs.arch }} = 'arm64' ]]; then echo 'aarch64'; else echo 'x86_64'; fi)
FLATPAK_VERSION='24.08'
flatpak install --user --no-deps --arch $FLATPAK_ARCH --assumeyes runtime/org.freedesktop.Platform/$FLATPAK_ARCH/$FLATPAK_VERSION runtime/org.freedesktop.Sdk/$FLATPAK_ARCH/$FLATPAK_VERSION org.electronjs.Electron2.BaseApp/$FLATPAK_ARCH/$FLATPAK_VERSION
- name: Install appimagetool
if: ${{ inputs.os == 'linux' }}
shell: ${{ inputs.shell }}
run: |
APPIMAGETOOL_ARCH=$(if [[ ${{ inputs.arch }} = 'arm64' ]]; then echo 'aarch64'; else echo 'x86_64'; fi)
wget -q "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-${APPIMAGETOOL_ARCH}.AppImage" -O /usr/local/bin/appimagetool
chmod +x /usr/local/bin/appimagetool
- name: Update build info
shell: ${{ inputs.shell }}
run: pnpm run chore:update-build-info
@@ -90,6 +98,14 @@ runs:
TARGET_ARCH: ${{ inputs.arch }}
run: pnpm run --filter desktop electron-forge:make --arch=${{ inputs.arch }} --platform=${{ inputs.forge_platform }}
- name: Build AppImage
if: ${{ inputs.os == 'linux' }}
shell: ${{ inputs.shell }}
env:
TRILIUM_ARTIFACT_NAME_HINT: TriliumNotes-${{ github.ref_name }}-${{ inputs.os }}-${{ inputs.arch }}
APPIMAGE_EXTRACT_AND_RUN: "1"
run: bash apps/desktop/scripts/build-appimage.sh ${{ inputs.arch }}
# Add DMG signing step
- name: Sign DMG
if: inputs.os == 'macos'
+1 -1
View File
@@ -8,7 +8,7 @@ inputs:
runs:
using: composite
steps:
- uses: pnpm/action-setup@v4
- uses: pnpm/action-setup@v6
- name: Set up node & dependencies
uses: actions/setup-node@v6
with:
@@ -55,7 +55,7 @@ runs:
# Post deployment URL as PR comment
- name: Comment PR with Preview URL
if: github.event_name == 'pull_request'
uses: actions/github-script@v8
uses: actions/github-script@v9
env:
COMMENT_BODY: ${{ inputs.comment_body }}
PRODUCTION_URL: ${{ inputs.production_url }}
+1 -1
View File
@@ -69,7 +69,7 @@ runs:
# Post github action comment
- name: Post comment
uses: marocchino/sticky-pull-request-comment@v2
uses: marocchino/sticky-pull-request-comment@v3
if: ${{ steps.bundleSize.outputs.hasDifferences == 'true' }} # post only in case of changes
with:
number: ${{ github.event.pull_request.number }}
+60
View File
@@ -1,5 +1,7 @@
# Trilium Notes - AI Coding Agent Instructions
> **Note**: When updating this file, also update `CLAUDE.md` in the repository root to keep both AI coding assistants in sync.
## Project Overview
Trilium Notes is a hierarchical note-taking application with advanced features like synchronization, scripting, and rich text editing. Built as a TypeScript monorepo using pnpm, it implements a three-layer caching architecture (Becca/Froca/Shaca) with a widget-based UI system and supports extensive user scripting capabilities.
@@ -115,6 +117,24 @@ class MyNoteWidget extends NoteContextAwareWidget {
**Important**: Widgets use jQuery (`this.$widget`) for DOM manipulation. Don't mix React patterns here.
### Reusable Preact Components
Common UI components are available in `apps/client/src/widgets/react/`**always** reuse these instead of writing raw HTML elements or custom implementations:
- `NoItems` - Empty state placeholder with icon and message (use for "no results", "too many items", error states)
- `ActionButton` - Consistent button styling with icon support
- `FormTextBox` - Text input with validation and controlled input handling; `FormTextBoxWithUnit` for inputs with a unit suffix (e.g. "mm", "px")
- `FormSelect` - Dropdown/combobox taking an object array as data
- `Slider` - Range slider with label
- `Checkbox`, `RadioButton` - Form controls
- `CollapsibleSection` - Expandable content sections
**Do not use Bootstrap utility classes** (e.g. `form-control-sm`, `form-select-sm`, `input-group`) on these components — they manage their own styling internally. If you need to adjust sizing or layout, use props provided by the component or CSS custom properties, not Bootstrap overrides.
#### Component Styling
- **Avoid inline styles** — do not use the `style` attribute/prop on JSX elements unless absolutely necessary (e.g. a truly dynamic, computed value that cannot be expressed in CSS). Static layout, sizing, spacing, and visual properties must go in CSS.
- **Per-component CSS files**: each component should have a matching `.css` file (e.g. `my_dialog.tsx``my_dialog.css`), imported at the top of the component file.
- **CSS nesting for scoping**: since CSS modules are not available, scope styles using a root class and native CSS nesting. For example, a dialog with `className="my-dialog"` should have its styles nested under `.modal.my-dialog { … }`.
- **Reuse existing components** instead of building custom markup — prefer `FormTextBox`, `FormTextBoxWithUnit`, `FormSelect`, `Slider`, `Button`, etc. over hand-rolled `<input>`, `<select>`, or `<button>` elements.
## Development Workflow
### Running & Testing
@@ -186,6 +206,14 @@ When adding query parameters to ETAPI endpoints (`apps/server/src/etapi/`), main
**Auth note**: ETAPI uses basic auth with tokens. Internal API endpoints trust the frontend.
### Adding New LLM Tools
Tools are defined using `defineTools()` in `apps/server/src/services/llm/tools/` and automatically registered for both the LLM chat and MCP server.
1. Add the tool definition in the appropriate module (`note_tools.ts`, `attribute_tools.ts`, `hierarchy_tools.ts`) or create a new module
2. Each tool needs: `description`, `inputSchema` (Zod), `execute` function, and optionally `mutates: true` for write operations or `needsContext: true` for tools that need the current note context
3. If creating a new module, wrap tools in `defineTools({...})` and add the registry to `allToolRegistries` in `tools/index.ts`
4. Add a client-side friendly name in `apps/client/src/translations/en/translation.json` under `llm.tools.<tool_name>` — use **imperative tense** (e.g. "Search notes", "Create note", "Get attributes"), not present continuous
### Database Migrations
- Add scripts in `apps/server/src/migrations/YYMMDD_HHMM__description.sql`
- Update schema in `apps/server/src/assets/db/schema.sql`
@@ -213,6 +241,12 @@ When adding query parameters to ETAPI endpoints (`apps/server/src/etapi/`), main
10. **Attribute inheritance can be complex** - When checking for labels/relations, use `note.getOwnedAttribute()` for direct attributes or `note.getAttribute()` for inherited ones. Don't assume attributes are directly on the note.
## MCP Server
- Trilium exposes an MCP (Model Context Protocol) server at `http://localhost:8080/mcp`, configured in `.mcp.json`
- The MCP server is **only available when the Trilium server is running** (`pnpm run server:start`)
- It provides tools for reading, searching, and modifying notes directly from the AI assistant
- Use it to interact with actual note data when developing or debugging note-related features
## TypeScript Configuration
- **Project references**: Monorepo uses TypeScript project references (`tsconfig.json`)
@@ -275,6 +309,12 @@ View types are configured via `#viewType` label (e.g., `#viewType=table`). Each
- Register in `packages/ckeditor5/src/plugins.ts`
- See `ckeditor5-admonition`, `ckeditor5-footnotes`, `ckeditor5-math`, `ckeditor5-mermaid` for examples
### Updating PDF.js
1. Update `pdfjs-dist` version in `packages/pdfjs-viewer/package.json`
2. Run `npx tsx scripts/update-viewer.ts` from that directory
3. Run `pnpm build` to verify success
4. Commit all changes including updated viewer files
### Database Migrations
- Add migration scripts in `apps/server/src/migrations/YYMMDD_HHMM__description.sql`
- Update schema in `apps/server/src/assets/db/schema.sql`
@@ -299,9 +339,29 @@ Trilium provides powerful user scripting capabilities:
- Translation files in `apps/client/src/translations/`
- Use translation system via `t()` function
- Automatic pluralization: Add `_other` suffix to translation keys (e.g., `item` and `item_other` for singular/plural)
- When a translated string contains **interpolated components** (e.g. links, note references) whose order may vary across languages, use `<Trans>` from `react-i18next` instead of `t()`. This lets translators reorder components freely (e.g. `"<Note/> in <Parent/>"` vs `"in <Parent/>, <Note/>"`)
- When adding a new locale, follow the step-by-step guide in `docs/Developer Guide/Developer Guide/Concepts/Internationalisation Translations/Adding a new locale.md`
#### Client vs Server Translation Usage
- **Client-side**: `import { t } from "../services/i18n"` with keys in `apps/client/src/translations/en/translation.json`
- **Server-side**: `import { t } from "i18next"` with keys in `apps/server/src/assets/translations/en/server.json`
- **Interpolation**: Use `{{variable}}` for normal interpolation; use `{{- variable}}` (with hyphen) for **unescaped** interpolation when the value contains special characters like quotes that shouldn't be HTML-escaped
### Storing User Preferences
- **Do not use `localStorage`** for user preferences — Trilium has a synced options system that persists across devices
- To add a new user preference:
1. Add the option type to `OptionDefinitions` in `packages/commons/src/lib/options_interface.ts`
2. Add a default value in `apps/server/src/services/options_init.ts` in the `defaultOptions` array
3. **Whitelist the option** in `apps/server/src/routes/api/options.ts` by adding it to `ALLOWED_OPTIONS` (required for client updates)
4. Use `useTriliumOption("optionName")` hook in React components to read/write the option
- Available hooks: `useTriliumOption` (string), `useTriliumOptionBool`, `useTriliumOptionInt`, `useTriliumOptionJson`
- See `docs/Developer Guide/Developer Guide/Concepts/Options/Creating a new option.md` for detailed documentation
## Testing Conventions
- **Write concise tests**: Group related assertions together in a single test case rather than creating many one-shot tests
- **Extract and test business logic**: When adding pure business logic (e.g., data transformations, migrations, validations), extract it as a separate function and always write unit tests for it
```typescript
// ETAPI test pattern
describe("etapi/feature", () => {
+1 -1
View File
@@ -45,7 +45,7 @@ jobs:
uses: actions/checkout@v6
- name: Setup pnpm
uses: pnpm/action-setup@v4
uses: pnpm/action-setup@v6
- name: Setup Node.js
uses: actions/setup-node@v6
+42 -11
View File
@@ -1,9 +1,13 @@
name: Dev
on:
push:
branches: [ main ]
branches:
- main
- "release/*"
pull_request:
branches: [ main ]
branches:
- main
- "release/*"
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
@@ -26,7 +30,7 @@ jobs:
- name: Checkout the repository
uses: actions/checkout@v6
- uses: pnpm/action-setup@v4
- uses: pnpm/action-setup@v6
- name: Set up node & dependencies
uses: actions/setup-node@v6
with:
@@ -37,8 +41,35 @@ jobs:
- name: Typecheck
run: pnpm typecheck
- name: Run the unit tests
run: pnpm run test:all
- name: Run the client-side tests
run: pnpm run --filter=client test
- name: Upload client test report
uses: actions/upload-artifact@v7
if: always()
with:
name: client-test-report
path: apps/client/test-output/vitest/html/
retention-days: 30
- name: Run the server-side tests
run: pnpm run --filter=server test
- name: Upload server test report
uses: actions/upload-artifact@v7
if: always()
with:
name: server-test-report
path: apps/server/test-output/vitest/html/
retention-days: 30
- name: Run CKEditor e2e tests
run: |
pnpm run --filter=ckeditor5-mermaid test
pnpm run --filter=ckeditor5-math test
- name: Run the rest of the tests
run: pnpm run --filter=\!client --filter=\!server --filter=\!ckeditor5-mermaid --filter=\!ckeditor5-math test
build_docker:
name: Build Docker image
@@ -47,7 +78,7 @@ jobs:
- test_dev
steps:
- uses: actions/checkout@v6
- uses: pnpm/action-setup@v4
- uses: pnpm/action-setup@v6
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Update build info
@@ -62,8 +93,8 @@ jobs:
key: ${{ secrets.RELATIVE_CI_CLIENT_KEY }}
- name: Trigger server build
run: pnpm run server:build
- uses: docker/setup-buildx-action@v3
- uses: docker/build-push-action@v6
- uses: docker/setup-buildx-action@v4
- uses: docker/build-push-action@v7
with:
context: apps/server
cache-from: type=gha
@@ -82,7 +113,7 @@ jobs:
- name: Checkout the repository
uses: actions/checkout@v6
- uses: pnpm/action-setup@v4
- uses: pnpm/action-setup@v6
- name: Install dependencies
run: pnpm install --frozen-lockfile
@@ -97,10 +128,10 @@ jobs:
run: echo "TEST_TAG=${TEST_TAG,,}" >> $GITHUB_ENV
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@v4
- name: Build and export to Docker
uses: docker/build-push-action@v6
uses: docker/build-push-action@v7
with:
context: apps/server
file: apps/server/${{ matrix.dockerfile }}
+1 -1
View File
@@ -18,7 +18,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: pnpm/action-setup@v4
- uses: pnpm/action-setup@v6
- name: Set up node & dependencies
uses: actions/setup-node@v6
with:
+71 -71
View File
@@ -40,9 +40,9 @@ jobs:
run: echo "TEST_TAG=${TEST_TAG,,}" >> $GITHUB_ENV
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@v4
- uses: pnpm/action-setup@v4
- uses: pnpm/action-setup@v6
- name: Set up node & dependencies
uses: actions/setup-node@v6
with:
@@ -59,7 +59,7 @@ jobs:
run: pnpm run server:build
- name: Build and export to Docker
uses: docker/build-push-action@v6
uses: docker/build-push-action@v7
with:
context: apps/server
file: apps/server/${{ matrix.dockerfile }}
@@ -142,7 +142,7 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v6
- uses: pnpm/action-setup@v4
- uses: pnpm/action-setup@v6
- name: Set up node & dependencies
uses: actions/setup-node@v6
with:
@@ -164,11 +164,9 @@ jobs:
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
uses: docker/metadata-action@v6
with:
images: |
${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}
${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }}
images: ${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=ref,event=branch
type=ref,event=tag
@@ -177,36 +175,27 @@ jobs:
latest=false
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
uses: docker/setup-qemu-action@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@v4
- name: Login to GHCR
uses: docker/login-action@v3
uses: docker/login-action@v4
with:
registry: ${{ env.GHCR_REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Login to DockerHub
uses: docker/login-action@v3
with:
registry: ${{ env.DOCKERHUB_REGISTRY }}
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push by digest
id: build
uses: docker/build-push-action@v6
uses: docker/build-push-action@v7
with:
context: apps/server
file: apps/server/${{ matrix.dockerfile }}
platforms: ${{ matrix.platform }}
labels: ${{ steps.meta.outputs.labels }}
outputs: |
type=image,name=${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true
type=image,name=${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true
outputs: type=image,name=${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true
- name: Export digest
run: |
@@ -239,75 +228,86 @@ jobs:
- name: Set TEST_TAG to lowercase
run: echo "TEST_TAG=${TEST_TAG,,}" >> $GITHUB_ENV
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: |
${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}
${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }}
flavor: |
latest=false
- name: Set up crane
uses: imjasonh/setup-crane@v0.5
- name: Login to GHCR
uses: docker/login-action@v3
uses: docker/login-action@v4
with:
registry: ${{ env.GHCR_REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Login to DockerHub
uses: docker/login-action@v3
uses: docker/login-action@v4
with:
registry: ${{ env.DOCKERHUB_REGISTRY }}
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Create manifest list and push
- name: Docker meta
id: meta
uses: docker/metadata-action@v6
with:
images: ${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=ref,event=branch
type=ref,event=tag
type=sha
flavor: |
latest=false
- name: Verify digests exist on GHCR
working-directory: /tmp/digests
run: |
# Extract the branch or tag name from the ref
REF_NAME=$(echo "${GITHUB_REF}" | sed 's/refs\/heads\///' | sed 's/refs\/tags\///')
echo "Verifying all digests are available on GHCR..."
for DIGEST_FILE in *; do
DIGEST="sha256:${DIGEST_FILE}"
echo -n " ${DIGEST}: "
crane manifest "${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}@${DIGEST}" > /dev/null
echo "OK"
done
# Create and push the manifest list with both the branch/tag name and the commit SHA
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
-t ${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}:${REF_NAME} \
$(printf '${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}@sha256:%s ' *)
- name: Create and push multi-arch manifest
working-directory: /tmp/digests
run: |
GHCR_IMAGE="${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}"
DOCKERHUB_IMAGE="${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }}"
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
-t ${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${REF_NAME} \
$(printf '${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }}@sha256:%s ' *)
# Build -m flags for crane index append from digest files
MANIFEST_ARGS=""
for d in *; do
MANIFEST_ARGS="${MANIFEST_ARGS} -m ${GHCR_IMAGE}@sha256:${d}"
done
# If the ref is a tag, also tag the image as stable as this is part of a 'release'
# and only go in the `if` if there is NOT a `-` in the tag's name, due to tagging of `-alpha`, `-beta`, etc...
# Create multi-arch manifest for each tag from metadata, plus copy to DockerHub
while IFS= read -r TAG; do
echo "Creating manifest: ${TAG}"
crane index append ${MANIFEST_ARGS} -t "${TAG}"
SUFFIX="${TAG#*:}"
echo "Copying to DockerHub: ${DOCKERHUB_IMAGE}:${SUFFIX}"
crane copy "${TAG}" "${DOCKERHUB_IMAGE}:${SUFFIX}"
done <<< "${{ steps.meta.outputs.tags }}"
# For stable releases (tags without hyphens), also create stable + latest
REF_NAME="${GITHUB_REF#refs/tags/}"
if [[ "${GITHUB_REF}" == refs/tags/* && ! "${REF_NAME}" =~ - ]]; then
# First create stable tags
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
-t ${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}:stable \
$(printf '${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}@sha256:%s ' *)
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
-t ${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:stable \
$(printf '${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }}@sha256:%s ' *)
# Small delay to ensure stable tag is fully propagated
sleep 5
# Now update latest tags
docker buildx imagetools create \
-t ${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}:latest \
${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}:stable
docker buildx imagetools create \
-t ${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:latest \
${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:stable
echo "Creating stable tags..."
crane index append ${MANIFEST_ARGS} -t "${GHCR_IMAGE}:stable"
crane copy "${GHCR_IMAGE}:stable" "${DOCKERHUB_IMAGE}:stable"
echo "Creating latest tags..."
crane copy "${GHCR_IMAGE}:stable" "${GHCR_IMAGE}:latest"
crane copy "${GHCR_IMAGE}:latest" "${DOCKERHUB_IMAGE}:latest"
fi
- name: Inspect image
- name: Inspect manifests
run: |
docker buildx imagetools inspect ${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.meta.outputs.version }}
docker buildx imagetools inspect ${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.meta.outputs.version }}
REF_NAME="${GITHUB_REF#refs/heads/}"
REF_NAME="${REF_NAME#refs/tags/}"
echo "=== GHCR ==="
crane manifest "${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}:${REF_NAME}"
echo ""
echo "=== DockerHub ==="
crane manifest "${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${REF_NAME}"
+6 -6
View File
@@ -42,7 +42,7 @@ jobs:
shell: bash
forge_platform: linux
- name: windows
image: win-signing
image: windows-latest
shell: cmd
forge_platform: win32
# Exclude ARM64 Linux from default matrix to use native runner
@@ -61,7 +61,7 @@ jobs:
runs-on: ${{ matrix.os.image }}
steps:
- uses: actions/checkout@v6
- uses: pnpm/action-setup@v4
- uses: pnpm/action-setup@v6
- name: Set up node & dependencies
uses: actions/setup-node@v6
with:
@@ -69,6 +69,8 @@ jobs:
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
env:
npm_config_package_import_method: copy
- name: Update nightly version
run: pnpm run chore:ci-update-nightly-version
- name: Run the build
@@ -86,12 +88,10 @@ jobs:
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
WINDOWS_SIGN_EXECUTABLE: ${{ vars.WINDOWS_SIGN_EXECUTABLE }}
WINDOWS_SIGN_ERROR_LOG: ${{ vars.WINDOWS_SIGN_ERROR_LOG }}
GPG_SIGNING_KEY: ${{ secrets.GPG_SIGN_KEY }}
- name: Publish release
uses: softprops/action-gh-release@v2.5.0
uses: softprops/action-gh-release@v3.0.0
if: ${{ github.event_name != 'pull_request' }}
with:
make_latest: false
@@ -132,7 +132,7 @@ jobs:
arch: ${{ matrix.arch }}
- name: Publish release
uses: softprops/action-gh-release@v2.5.0
uses: softprops/action-gh-release@v3.0.0
if: ${{ github.event_name != 'pull_request' }}
with:
make_latest: false
+1 -1
View File
@@ -38,7 +38,7 @@ jobs:
filter: tree:0
fetch-depth: 0
- uses: pnpm/action-setup@v4
- uses: pnpm/action-setup@v6
- uses: actions/setup-node@v6
with:
node-version: 24
+3 -3
View File
@@ -17,7 +17,7 @@ jobs:
steps:
- uses: actions/checkout@v6
- uses: pnpm/action-setup@v4
- uses: pnpm/action-setup@v6
- name: Set up node & dependencies
uses: actions/setup-node@v6
with:
@@ -66,7 +66,7 @@ jobs:
runs-on: ${{ matrix.os.image }}
steps:
- uses: actions/checkout@v6
- uses: pnpm/action-setup@v4
- uses: pnpm/action-setup@v6
- name: Set up node & dependencies
uses: actions/setup-node@v6
with:
@@ -150,7 +150,7 @@ jobs:
path: upload
- name: Publish stable release
uses: softprops/action-gh-release@v2.5.0
uses: softprops/action-gh-release@v3.0.0
with:
draft: false
body_path: docs/Release Notes/Release Notes/${{ github.ref_name }}.md
+2 -2
View File
@@ -32,7 +32,7 @@ jobs:
steps:
- uses: actions/checkout@v6
- uses: pnpm/action-setup@v4
- uses: pnpm/action-setup@v6
- name: Set up node & dependencies
uses: actions/setup-node@v6
with:
@@ -58,7 +58,7 @@ jobs:
compression-level: 0
- name: Release web clipper extension
uses: softprops/action-gh-release@v2.5.0
uses: softprops/action-gh-release@v3.0.0
if: ${{ startsWith(github.ref, 'refs/tags/web-clipper-v') }}
with:
draft: false
+1 -1
View File
@@ -26,7 +26,7 @@ jobs:
steps:
- uses: actions/checkout@v6
- uses: pnpm/action-setup@v4
- uses: pnpm/action-setup@v6
- name: Set up node & dependencies
uses: actions/setup-node@v6
with:
+3 -1
View File
@@ -46,9 +46,11 @@ upload
/.direnv
/result
.svelte-kit
# docs
site/
apps/*/coverage
scripts/translation/.language*.json
.claude
.pnpm-store
+116 -2
View File
@@ -1,2 +1,116 @@
zadam <adam.zivner@gmail.com>
zadam <zadam.apps@gmail.com>
# Format: Canonical Name <canonical-email> <commit-email>
# Merges aliases so `git shortlog`, `git log --use-mailmap`, etc. group commits per person.
# Core maintainers
zadam <zadam.apps@gmail.com>
zadam <zadam.apps@gmail.com> <adam.zivner@gmail.com>
zadam <zadam.apps@gmail.com> <adam.zivner@gemalto.com>
Elian Doran <contact@eliandoran.me>
Elian Doran <contact@eliandoran.me> <online@eliandoran.me>
Adorian Doran <adorian@esevo.ro>
Adorian Doran <adorian@esevo.ro> <adoriandoran@gmail.com>
# Contributors with multiple emails / name variants
Panagiotis Papadopoulos <pano_90@gmx.net> <102623907+pano9000@users.noreply.github.com>
Jon Fuller <jonfuller2012@gmail.com>
SiriusXT <1160925501@qq.com>
SiriusXT <1160925501@qq.com> <11609255001@qq.com>
SiriusXT <1160925501@qq.com> <37627919+SiriusXT@users.noreply.github.com>
JYC333 <22962980+JYC333@users.noreply.github.com>
JYC333 <22962980+JYC333@users.noreply.github.com> <yuchuanjin333@gmail.com>
Nriver <6752679+Nriver@users.noreply.github.com>
Francis C. <normitomf@gmail.com>
Francis C. <normitomf@gmail.com> <francistw@users.noreply.github.com>
Thomas Frei <7283497+thfrei@users.noreply.github.com>
hasecilu <hasecilu@tuta.io>
meinzzzz <lukas.geiselhart35@gmail.com>
FliegendeWurst <arne.keller@posteo.de>
FliegendeWurst <arne.keller@posteo.de> <2012gdwu@web.de>
FliegendeWurst <arne.keller@posteo.de> <2012gdwu+github@posteo.de>
MeIchthys <github.com@meichthys.com>
MeIchthys <github.com@meichthys.com> <10717998+meichthys@users.noreply.github.com>
Marcel Wiechmann <marcel.wiechmann@gmail.com>
Marcel Wiechmann <marcel.wiechmann@gmail.com> <github.y3y0w@sl.wiechmann.at>
Tomas Adamek <ad.tomik@seznam.cz>
Tomas Adamek <ad.tomik@seznam.cz> <50672285+Kureii@users.noreply.github.com>
soulsands <407221377@qq.com>
chesspro13 <chesspro13@gmail.com>
sigaloid <69441971+sigaloid@users.noreply.github.com>
Marek Lewandowski <m.lewandowski@cksource.com>
Marek Lewandowski <m.lewandowski@cksource.com> <code@mlewandowski.com>
Marek Lewandowski <m.lewandowski@cksource.com> <mlewand@users.noreply.github.com>
lzinga <lucas.elzinga@outlook.com>
lzinga <lucas.elzinga@outlook.com> <lzinga@users.noreply.github.com>
Sukant Gujar <sukantgujar@yahoo.com>
Matt Wilkie <maphew@gmail.com>
Matt Wilkie <maphew@gmail.com> <matt.wilkie@yukon.ca>
Andreas Haan <andreas.mobil1@googlemail.com>
Potjoe-97 <42873357+Potjoe-97@users.noreply.github.com>
Potjoe-97 <42873357+Potjoe-97@users.noreply.github.com> <giann@LAPTOPT490-GF>
Alex Pietsch <54153428+alexpietsch@users.noreply.github.com>
Laurent Cozic <laurent@cozic.net>
Laurent Cozic <laurent@cozic.net> <laurent22@users.noreply.github.com>
Zexin Yuan <git@yzx9.xyz>
Zexin Yuan <git@yzx9.xyz> <yuan.zx@outlook.com>
hulmgulm <hulmgulm@users.noreply.github.com>
hulmgulm <hulmgulm@users.noreply.github.com> <12165268+hulmgulm@users.noreply.github.com>
hulmgulm <hulmgulm@users.noreply.github.com> <github@hulmgulm.de>
Jules Bertholet <jules.bertholet@gmail.com>
Charles Dagenais <dagenais.charles@gmail.com>
Giulia Ye <yg97.cs@gmail.com>
baddate <37013819+baddate@users.noreply.github.com>
DerVogel101 <128903814+DerVogel101@users.noreply.github.com>
DerVogel101 <128903814+DerVogel101@users.noreply.github.com> <jan.irmer@outlook.de>
Marcello Fuschi <marcellofuschi1@gmail.com>
Jiahao Lee <lijiahao34@live.com>
Dmitry Matveyev <dev@greenfork.me>
Dmitry Matveyev <dev@greenfork.me> <info@greenfork.me>
Grant Zhu <a1065135230@gmail.com>
Sylvain Pasche <sylvain.pasche@gmail.com>
Sylvain Pasche <sylvain.pasche@gmail.com> <spasche@spasche.net>
mm21 <8033134+mm21@users.noreply.github.com>
mm21 <8033134+mm21@users.noreply.github.com> <mm21.dev@gmail.com>
BeatLink <git@beatlink.simplelogin.com>
BeatLink <git@beatlink.simplelogin.com> <github@beatlink.simplelogin.com>
Florian Meißner <161936+Mystler@users.noreply.github.com>
Florian Meißner <161936+Mystler@users.noreply.github.com> <developer@mystler.eu>
+8
View File
@@ -0,0 +1,8 @@
{
"mcpServers": {
"trilium": {
"type": "http",
"url": "http://localhost:8080/mcp"
}
}
}
+1 -1
View File
@@ -1 +1 @@
24.14.0
24.15.0
+98
View File
@@ -2,6 +2,8 @@
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
> **Note**: When updating this file, also update `.github/copilot-instructions.md` to keep both AI coding assistants in sync.
## Overview
Trilium Notes is a hierarchical note-taking application with advanced features like synchronization, scripting, and rich text editing. It's built as a TypeScript monorepo using pnpm, with multiple applications and shared packages.
@@ -66,6 +68,24 @@ Frontend uses a widget system (`apps/client/src/widgets/`):
- `RightPanelWidget` - Widgets displayed in the right panel
- Type-specific widgets in `type_widgets/` directory
#### Reusable Preact Components
Common UI components are available in `apps/client/src/widgets/react/`**always** reuse these instead of writing raw HTML elements or custom implementations:
- `NoItems` - Empty state placeholder with icon and message (use for "no results", "too many items", error states)
- `ActionButton` - Consistent button styling with icon support
- `FormTextBox` - Text input with validation and controlled input handling; `FormTextBoxWithUnit` for inputs with a unit suffix (e.g. "mm", "px")
- `FormSelect` - Dropdown/combobox taking an object array as data
- `Slider` - Range slider with label
- `Checkbox`, `RadioButton` - Form controls
- `CollapsibleSection` - Expandable content sections
**Do not use Bootstrap utility classes** (e.g. `form-control-sm`, `form-select-sm`, `input-group`) on these components — they manage their own styling internally. If you need to adjust sizing or layout, use props provided by the component or CSS custom properties, not Bootstrap overrides.
#### Component Styling
- **Avoid inline styles** — do not use the `style` attribute/prop on JSX elements unless absolutely necessary (e.g. a truly dynamic, computed value that cannot be expressed in CSS). Static layout, sizing, spacing, and visual properties must go in CSS.
- **Per-component CSS files**: each component should have a matching `.css` file (e.g. `my_dialog.tsx``my_dialog.css`), imported at the top of the component file.
- **CSS nesting for scoping**: since CSS modules are not available, scope styles using a root class and native CSS nesting. For example, a dialog with `className="my-dialog"` should have its styles nested under `.modal.my-dialog { … }`.
- **Reuse existing components** instead of building custom markup — prefer `FormTextBox`, `FormTextBoxWithUnit`, `FormSelect`, `Slider`, `Button`, etc. over hand-rolled `<input>`, `<select>`, or `<button>` elements.
#### API Architecture
- **Internal API**: REST endpoints in `apps/server/src/routes/api/`
- **ETAPI**: External API for third-party integrations (`apps/server/src/etapi/`)
@@ -108,6 +128,8 @@ Trilium supports multiple note types, each with specialized widgets:
- Client tests can run in parallel
- E2E tests use Playwright for both server and desktop apps
- Build validation tests check artifact integrity
- **Write concise tests**: Group related assertions together in a single test case rather than creating many one-shot tests
- **Extract and test business logic**: When adding pure business logic (e.g., data transformations, migrations, validations), extract it as a separate function and always write unit tests for it
### Scripting System
Trilium provides powerful user scripting capabilities:
@@ -118,6 +140,21 @@ Trilium provides powerful user scripting capabilities:
### Internationalization
- Translation files in `apps/client/src/translations/`
- Supported languages: English, German, Spanish, French, Romanian, Chinese
- **Only add new translation keys to `en/translation.json`** — translations for other languages are managed via Weblate and will be contributed by the community
- Third-party components (e.g., mind-map context menu) should use i18next `t()` for their labels, with the English strings added to `en/translation.json` under a dedicated namespace (e.g., `"mind-map"`)
- When a translated string contains **interpolated components** (e.g. links, note references) whose order may vary across languages, use `<Trans>` from `react-i18next` instead of `t()`. This lets translators reorder components freely (e.g. `"<Note/> in <Parent/>"` vs `"in <Parent/>, <Note/>"`)
- When adding a new locale, follow the step-by-step guide in `docs/Developer Guide/Developer Guide/Concepts/Internationalisation Translations/Adding a new locale.md`
- **Server-side translations** (e.g. hidden subtree titles) go in `apps/server/src/assets/translations/en/server.json`, not in the client `translation.json`
#### Client vs Server Translation Usage
- **Client-side**: `import { t } from "../services/i18n"` with keys in `apps/client/src/translations/en/translation.json`
- **Server-side**: `import { t } from "i18next"` with keys in `apps/server/src/assets/translations/en/server.json`
- **Interpolation**: Use `{{variable}}` for normal interpolation; use `{{- variable}}` (with hyphen) for **unescaped** interpolation when the value contains special characters like quotes that shouldn't be HTML-escaped
### Electron Desktop App
- Desktop entry point: `apps/desktop/src/main.ts`, window management: `apps/server/src/services/window.ts`
- IPC communication: use `electron.ipcMain.on(channel, handler)` on server side, `electron.ipcRenderer.send(channel, data)` on client side
- Electron-only features should check `isElectron()` from `apps/client/src/services/utils.ts` (client) or `utils.isElectron` (server)
### Security Considerations
- Per-note encryption with granular protected sessions
@@ -125,6 +162,26 @@ Trilium provides powerful user scripting capabilities:
- OpenID and TOTP authentication support
- Sanitization of user-generated content
### Client-Side API Restrictions
- **Do not use `crypto.randomUUID()`** or other Web Crypto APIs that require secure contexts - Trilium can run over HTTP, not just HTTPS
- Use `randomString()` from `apps/client/src/services/utils.ts` for generating IDs instead
### Storing User Preferences
- **Do not use `localStorage`** for user preferences — Trilium has a synced options system that persists across devices
- To add a new user preference:
1. Add the option type to `OptionDefinitions` in `packages/commons/src/lib/options_interface.ts`
2. Add a default value in `apps/server/src/services/options_init.ts` in the `defaultOptions` array
3. **Whitelist the option** in `apps/server/src/routes/api/options.ts` by adding it to the `ALLOWED_OPTIONS` array — **without this, the API will reject changes with "Option 'X' is not allowed to be changed"**
4. If the option should be user-editable in the UI, add a control in the appropriate settings component (e.g., `apps/client/src/widgets/type_widgets/options/other.tsx`) and a translation key in `apps/client/src/translations/en/translation.json`
5. Use `useTriliumOption("optionName")` hook in React components to read/write the option
- Available hooks: `useTriliumOption` (string), `useTriliumOptionBool`, `useTriliumOptionInt`, `useTriliumOptionJson`
- See `docs/Developer Guide/Developer Guide/Concepts/Options/Creating a new option.md` for detailed documentation
### Shared Types Policy
- Types shared between client and server belong in `@triliumnext/commons` (`packages/commons/src/lib/`)
- Import shared types directly from `@triliumnext/commons` - do not re-export them from app-specific modules
- Keep app-specific types (e.g., `LlmProvider` for server, `StreamCallbacks` for client) in their respective apps
## Common Development Tasks
### Adding New Note Types
@@ -140,10 +197,51 @@ Trilium provides powerful user scripting capabilities:
- Create new package in `packages/` following existing plugin structure
- Register in `packages/ckeditor5/src/plugins.ts`
### Adding Hidden System Notes
The hidden subtree (`_hidden`) contains system notes with predictable IDs (prefixed with `_`). Defined in `apps/server/src/services/hidden_subtree.ts` via the `HiddenSubtreeItem` interface from `@triliumnext/commons`.
1. Add the note definition to `buildHiddenSubtreeDefinition()` in `apps/server/src/services/hidden_subtree.ts`
2. Add a translation key for the title in `apps/server/src/assets/translations/en/server.json` under `"hidden-subtree"`
3. The note is auto-created on startup by `checkHiddenSubtree()` — uses deterministic IDs so all sync cluster instances generate the same structure
4. Key properties: `id` (must start with `_`), `title`, `type`, `icon` (format: `bx-icon-name` without `bx ` prefix), `attributes`, `children`, `content`
5. Use `enforceAttributes: true` to keep attributes in sync, `enforceBranches: true` for correct placement, `enforceDeleted: true` to remove deprecated notes
6. For launcher bar entries, see `hidden_subtree_launcherbar.ts`; for templates, see `hidden_subtree_templates.ts`
### Writing to Notes from Server Services
- `note.setContent()` requires a CLS (Continuation Local Storage) context — wrap calls in `cls.init(() => { ... })` (from `apps/server/src/services/cls.ts`)
- Operations called from Express routes already have CLS context; standalone services (schedulers, Electron IPC handlers) do not
### Adding New LLM Tools
Tools are defined using `defineTools()` in `apps/server/src/services/llm/tools/` and automatically registered for both the LLM chat and MCP server.
1. Add the tool definition in the appropriate module (`note_tools.ts`, `attribute_tools.ts`, `attachment_tools.ts`, `hierarchy_tools.ts`) or create a new module
2. Each tool needs: `description`, `inputSchema` (Zod), `execute` function, and optionally `mutates: true` for write operations
3. If creating a new module, wrap tools in `defineTools({...})` and add the registry to `allToolRegistries` in `tools/index.ts`
4. Add a client-side friendly name in `apps/client/src/translations/en/translation.json` under `llm.tools.<tool_name>` — use **imperative tense** (e.g. "Search notes", "Create note", "Get attributes"), not present continuous
5. Use ETAPI (`apps/server/src/etapi/`) as inspiration for what fields to expose, but **do not import ETAPI mappers** — inline the field mappings directly in the tool so the LLM layer stays decoupled from the API layer
### Updating PDF.js
1. Update `pdfjs-dist` version in `packages/pdfjs-viewer/package.json`
2. Run `npx tsx scripts/update-viewer.ts` from that directory
3. Run `pnpm build` to verify success
4. Commit all changes including updated viewer files
### Database Migrations
- Add migration scripts in `apps/server/src/migrations/`
- Update schema in `apps/server/src/assets/db/schema.sql`
### Server-Side Static Assets
- Static assets (templates, SQL, translations, etc.) go in `apps/server/src/assets/`
- Access them at runtime via `RESOURCE_DIR` from `apps/server/src/services/resource_dir.ts` (e.g. `path.join(RESOURCE_DIR, "llm", "skills", "file.md")`)
- **Do not use `import.meta.url`/`fileURLToPath`** to resolve file paths — the server is bundled into CJS for production, so `import.meta.url` will not point to the source directory
- **Do not use `__dirname` with relative paths** from source files — after bundling, `__dirname` points to the bundle output, not the original source tree
## MCP Server
- Trilium exposes an MCP (Model Context Protocol) server at `http://localhost:8080/mcp`, configured in `.mcp.json`
- The MCP server is **only available when the Trilium server is running** (`pnpm run server:start`)
- It provides tools for reading, searching, and modifying notes directly from the AI assistant
- Use it to interact with actual note data when developing or debugging note-related features
## Build System Notes
- Uses pnpm for monorepo management
- Vite for fast development builds
+79 -5
View File
@@ -2,13 +2,87 @@
## Supported Versions
In the (still active) 0.X phase of the project only the latest stable minor release is getting bugfixes (including security ones).
Only the latest stable minor release receives security fixes.
So e.g. if the latest stable version is 0.42.3 and the latest beta version is 0.43.0-beta, then 0.42 line will still get security fixes but older versions (like 0.41.X) won't get any fixes.
For example, if the latest stable version is 0.92.3 and the latest beta is 0.93.0-beta, then only the 0.92.x line will receive security patches. Older versions (like 0.91.x) will not receive fixes.
Description above is a general rule and may be altered on case by case basis.
This policy may be altered on a case-by-case basis for critical vulnerabilities.
## Reporting a Vulnerability
* For low severity vulnerabilities, they can be reported as GitHub issues.
* For severe vulnerabilities, please report it using [GitHub Security Advisories](https://github.com/TriliumNext/Trilium/security/advisories).
**Please report all security vulnerabilities through [GitHub Security Advisories](https://github.com/TriliumNext/Notes/security/advisories/new).**
We do not accept security reports via email, public issues, or other channels. GitHub Security Advisories allows us to:
- Discuss and triage vulnerabilities privately
- Coordinate fixes before public disclosure
- Credit reporters appropriately
- Publish advisories with CVE identifiers
### What to Include
When reporting, please provide:
- A clear description of the vulnerability
- Steps to reproduce or proof-of-concept
- Affected versions (if known)
- Potential impact assessment
- Any suggested mitigations or fixes
### Response Timeline
- **Initial response**: Within 7 days
- **Triage decision**: Within 14 days
- **Fix timeline**: Depends on severity and complexity
## Scope
### In Scope
- Remote code execution
- Authentication/authorization bypass
- Cross-site scripting (XSS) that affects other users
- SQL injection
- Path traversal
- Sensitive data exposure
- Privilege escalation
### Out of Scope (Won't Fix)
The following are considered out of scope or accepted risks:
#### Self-XSS / Self-Injection
Trilium is a personal knowledge base where users have full control over their own data. Users can intentionally create notes containing scripts, HTML, or other executable content. This is by design - Trilium's scripting system allows users to extend functionality with custom JavaScript.
Vulnerabilities that require a user to inject malicious content into their own notes and then view it themselves are not considered security issues.
#### Electron Architecture (nodeIntegration)
Trilium's desktop application runs with `nodeIntegration: true` to enable its powerful scripting features. This is an intentional design decision, similar to VS Code extensions having full system access. We mitigate risks by:
- Sanitizing content at input boundaries
- Fixing specific XSS vectors as they're discovered
- Using Electron fuses to prevent external abuse
#### Authenticated User Actions
Actions that require valid authentication and only affect the authenticated user's own data are generally not vulnerabilities.
#### Denial of Service via Resource Exhaustion
Creating extremely large notes or performing many operations is expected user behavior in a note-taking application.
#### Missing Security Headers on Non-Sensitive Endpoints
We implement security headers where they provide meaningful protection, but may omit them on endpoints where they provide no practical benefit.
## Coordinated Disclosure
We follow a coordinated disclosure process:
1. **Report received** - We acknowledge receipt and begin triage
2. **Fix developed** - We develop and test a fix privately
3. **Release prepared** - Security release is prepared with vague changelog
4. **Users notified** - Release is published, users encouraged to upgrade
5. **Advisory published** - After reasonable upgrade window (typically 2-4 weeks), full advisory is published
We appreciate reporters allowing us time to fix issues before public disclosure. We aim to credit all reporters in published advisories unless they prefer to remain anonymous.
## Security Updates
Security fixes are released as patch versions (e.g., 0.92.1 → 0.92.2) to minimize upgrade friction. We recommend all users keep their installations up to date.
Subscribe to GitHub releases or watch the repository to receive notifications of new releases.
+5 -7
View File
@@ -14,15 +14,13 @@
"keywords": [],
"author": "Elian Doran <contact@eliandoran.me>",
"license": "AGPL-3.0-only",
"packageManager": "pnpm@10.30.3",
"packageManager": "pnpm@10.33.2",
"devDependencies": {
"@redocly/cli": "2.19.2",
"@redocly/cli": "2.30.0",
"archiver": "7.0.1",
"fs-extra": "11.3.3",
"fs-extra": "11.3.4",
"js-yaml": "4.1.1",
"react": "19.2.4",
"react-dom": "19.2.4",
"typedoc": "0.28.17",
"typedoc-plugin-missing-exports": "4.1.2"
"typedoc": "0.28.19",
"typedoc-plugin-missing-exports": "4.1.3"
}
}
+26
View File
@@ -0,0 +1,26 @@
{
"languageOptions": {
"directionality": {
"block": "top-to-bottom",
"inline": "left-to-right"
}
},
"rules": {
"property-layout-mappings": ["flow-relative", {
"ignoreProperties": [
"top", "bottom",
"width", "height",
"min-width", "min-height",
"max-width", "max-height",
"margin-top", "margin-bottom",
"padding-top", "padding-bottom",
"border-top", "border-top-width", "border-top-style", "border-top-color",
"border-bottom", "border-bottom-width", "border-bottom-style", "border-bottom-color",
"scroll-margin-top", "scroll-margin-bottom",
"scroll-padding-top", "scroll-padding-bottom",
"overflow-x", "overflow-y",
"contain-intrinsic-width", "contain-intrinsic-height"
]
}]
}
}
+37 -30
View File
@@ -1,6 +1,6 @@
{
"name": "@triliumnext/client",
"version": "0.102.0",
"version": "0.102.2",
"description": "JQuery-based client for TriliumNext, used for both web and desktop (via Electron)",
"private": true,
"license": "AGPL-3.0-only",
@@ -13,10 +13,11 @@
"build": "cross-env NODE_OPTIONS=--max-old-space-size=4096 vite build",
"test": "vitest",
"coverage": "vitest --coverage",
"circular-deps": "dpdm -T src/**/*.ts --tree=false --warning=false --skip-dynamic-imports=circular"
"circular-deps": "dpdm -T src/**/*.ts --tree=false --warning=false --skip-dynamic-imports=circular",
"stylelint": "stylelint --allow-empty-input \"src/**/*.css\""
},
"dependencies": {
"@excalidraw/excalidraw": "0.18.0",
"@excalidraw/excalidraw": "0.18.1",
"@fullcalendar/core": "6.1.20",
"@fullcalendar/daygrid": "6.1.20",
"@fullcalendar/interaction": "6.1.20",
@@ -25,64 +26,70 @@
"@fullcalendar/rrule": "6.1.20",
"@fullcalendar/timegrid": "6.1.20",
"@maplibre/maplibre-gl-leaflet": "0.1.3",
"@mermaid-js/layout-elk": "0.2.0",
"@mermaid-js/layout-elk": "0.2.1",
"@mind-elixir/node-menu": "5.0.1",
"@popperjs/core": "2.11.8",
"@preact/signals": "2.8.1",
"@preact/signals": "2.9.0",
"@triliumnext/ckeditor5": "workspace:*",
"@triliumnext/codemirror": "workspace:*",
"@triliumnext/commons": "workspace:*",
"@triliumnext/highlightjs": "workspace:*",
"@triliumnext/share-theme": "workspace:*",
"@triliumnext/split.js": "workspace:*",
"@zumer/snapdom": "2.0.2",
"@univerjs/preset-sheets-conditional-formatting": "0.20.1",
"@univerjs/preset-sheets-core": "0.20.1",
"@univerjs/preset-sheets-data-validation": "0.20.1",
"@univerjs/preset-sheets-filter": "0.20.1",
"@univerjs/preset-sheets-find-replace": "0.20.1",
"@univerjs/preset-sheets-note": "0.20.1",
"@univerjs/preset-sheets-sort": "0.20.1",
"@univerjs/presets": "0.20.1",
"@zumer/snapdom": "2.9.0",
"autocomplete.js": "0.38.1",
"bootstrap": "5.3.8",
"boxicons": "2.1.4",
"clsx": "2.1.1",
"color": "5.0.3",
"debounce": "3.0.0",
"dompurify": "3.4.1",
"draggabilly": "3.0.0",
"force-graph": "1.51.1",
"globals": "17.3.0",
"i18next": "25.8.13",
"i18next-http-backend": "3.0.2",
"force-graph": "1.51.4",
"htmldiff-js": "1.0.5",
"i18next": "26.0.8",
"i18next-http-backend": "3.0.6",
"jquery": "4.0.0",
"jquery.fancytree": "2.38.5",
"jsplumb": "2.15.6",
"katex": "0.16.33",
"knockout": "3.5.1",
"katex": "0.16.45",
"leaflet": "1.9.4",
"leaflet-gpx": "2.2.0",
"mark.js": "8.11.1",
"marked": "17.0.3",
"mermaid": "11.12.3",
"mind-elixir": "5.9.1",
"normalize.css": "8.0.1",
"panzoom": "9.4.3",
"preact": "10.28.4",
"react-i18next": "16.5.4",
"marked": "18.0.2",
"mermaid": "11.14.0",
"mind-elixir": "5.11.0",
"panzoom": "9.4.4",
"preact": "10.29.1",
"react-i18next": "17.0.4",
"react-window": "2.2.7",
"reveal.js": "5.2.1",
"reveal.js": "6.0.1",
"rrule": "2.8.1",
"svg-pan-zoom": "3.6.2",
"tabulator-tables": "6.3.1",
"tabulator-tables": "6.4.0",
"vanilla-js-wheel-zoom": "9.0.4"
},
"devDependencies": {
"@ckeditor/ckeditor5-inspector": "5.0.0",
"@prefresh/vite": "2.4.12",
"@prefresh/vite": "3.0.0",
"@types/bootstrap": "5.2.10",
"@types/jquery": "4.0.0",
"@types/leaflet": "1.9.21",
"@types/leaflet-gpx": "1.3.8",
"@types/mark.js": "8.11.12",
"@types/reveal.js": "5.2.2",
"@types/tabulator-tables": "6.3.1",
"copy-webpack-plugin": "13.0.1",
"happy-dom": "20.7.0",
"lightningcss": "1.31.1",
"@types/tabulator-tables": "6.3.2",
"copy-webpack-plugin": "14.0.0",
"happy-dom": "20.9.0",
"lightningcss": "1.32.0",
"script-loader": "0.7.2",
"vite-plugin-static-copy": "3.2.0"
"stylelint": "17.9.0",
"vite-plugin-static-copy": "4.1.0"
}
}
}
+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve"><path d="M63.966,45.043c0.008-0.009,0.021-0.021,0.027-0.029c0.938-1.156-0.823-13.453-5.063-20.125 c-1.389-2.186-2.239-3.423-3.219-4.719c-3.907-5.166-6-6.125-6-6.125S35.732,24.78,36.149,44.315 c-1.754,0.065-11.218,7.528-14.826,14.388c-1.206,2.291-1.856,3.645-2.493,5.141c-2.539,5.957-2.33,8.25-2.33,8.25 s16.271,6.79,33.014-3.294c0.007,0.021,0.013,0.046,0.02,0.063c0.537,1.389,12.08,5.979,19.976,5.621 c2.587-0.116,4.084-0.238,5.696-0.444c6.424-0.818,8.298-2.157,8.298-2.157S81.144,54.396,63.966,45.043z M50.787,65.343 c1.059-1.183,4.648-5.853,0.995-11.315c-0.253-0.377-0.496-0.236-0.496-0.236s0.063,10.822-5.162,12.359 c-5.225,1.537-13.886,4.4-20.427,0.455C25,66.186,26.924,53.606,38.544,47.229c0.546,1.599,2.836,6.854,9.292,6.409 c0.453-0.031,0.453-0.313,0.453-0.313s-9.422-5.328-8.156-10.625s3.089-14.236,9.766-17.948c0.714-0.397,10.746,7.593,10.417,20.94 c-1.606-0.319-7.377-1.004-10.226,4.864c-0.198,0.409,0.046,0.549,0.046,0.549s9.31-5.521,13.275-1.789 c3.965,3.733,10.813,9.763,10.71,17.4C74.111,67.533,62.197,72.258,50.787,65.343z M35.613,35.145c0,0-0.991,3.241-0.603,7.524 l-13.393-7.524C21.618,35.145,27.838,30.931,35.613,35.145z M21.193,36.03l13.344,7.612c-3.872,1.872-6.142,4.388-6.142,4.388 C20.78,43.531,21.193,36.03,21.193,36.03z M72.287,49.064c0,0-2.321-2.471-6.23-4.263l13.187-7.881 C79.243,36.92,79.808,44.413,72.287,49.064z M78.687,36.113l-13.237,7.794c0.3-4.291-0.754-7.511-0.754-7.511 C72.383,32.025,78.687,36.113,78.687,36.113z M42.076,73.778c0,0,3.309-0.737,6.845-3.185l0.056,15.361 C48.977,85.955,42.244,82.621,42.076,73.778z M49.956,85.888L50,70.526c3.539,2.445,6.846,3.181,6.846,3.181 C56.686,82.551,49.956,85.888,49.956,85.888z"></path></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+17
View File
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg enable-background="new 0 0 256 256" version="1.1" viewBox="0 0 256 256" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<title>Trilium Notes</title>
<g>
<path d="m202.9 112.7c-22.5 16.1-54.5 12.8-74.9 6.3l14.8-11.8 14.1-11.3 49.1-39.3-51.2 35.9-14.3 10-14.9 10.5c0.7-21.2 7-49.9 28.6-65.4 1.8-1.3 3.9-2.6 6.1-3.8 2.7-1.5 5.7-2.9 8.8-4.1 27.1-11.1 68.5-15.3 85.2-9.5 0.1 16.2-15.9 45.4-33.9 65.9-2.4 2.8-4.9 5.4-7.4 7.8-3.4 3.5-6.8 6.4-10.1 8.8z" fill="#ab60e3"/>
<path d="m213.1 104c-22.2 12.6-51.4 9.3-70.3 3.2l14.1-11.3 49.1-39.3-51.2 35.9-14.3 10c0.5-18.1 4.9-42.1 19.7-58.6 2.7-1.5 5.7-2.9 8.8-4.1 27.1-11.1 68.5-15.3 85.2-9.5 0.1 16.2-15.9 45.4-33.9 65.9-2.3 2.8-4.8 5.4-7.2 7.8z" fill="#8038b8"/>
<path d="m220.5 96.2c-21.1 8.6-46.6 5.3-63.7-0.2l49.2-39.4-51.2 35.9c0.3-15.8 3.5-36.6 14.3-52.8 27.1-11.1 68.5-15.3 85.2-9.5 0.1 16.2-15.9 45.4-33.8 66z" fill="#560a8f"/>
<path d="m106.7 179c-5.8-21 5.2-43.8 15.5-57.2l4.8 14.2 4.5 13.4 15.9 47-12.8-47.6-3.6-13.2-3.7-13.9c15.5 6.2 35.1 18.6 40.7 38.8 0.5 1.7 0.9 3.6 1.2 5.5 0.4 2.4 0.6 5 0.7 7.7 0.9 23.1-7.1 54.9-15.9 65.7-12-4.3-29.3-24-39.7-42.8-1.4-2.6-2.7-5.1-3.8-7.6-1.6-3.5-2.9-6.8-3.8-10z" fill="#bb9dd2"/>
<path d="m110.4 188.9c-3.4-19.8 6.9-40.5 16.6-52.9l4.5 13.4 15.9 47-12.8-47.6-3.6-13.2c13.3 5.2 29.9 15 38.1 30.4 0.4 2.4 0.6 5 0.7 7.7 0.9 23.1-7.1 54.9-15.9 65.7-12-4.3-29.3-24-39.7-42.8-1.4-2.6-2.7-5.2-3.8-7.7z" fill="#9a6cbc"/>
<path d="m114.2 196.5c-0.7-18 8.6-35.9 17.3-47.1l15.9 47-12.8-47.6c11.6 4.4 26.1 12.4 35.2 24.8 0.9 23.1-7.1 54.9-15.9 65.7-12-4.3-29.3-24-39.7-42.8z" fill="#783ba5"/>
<path d="m86.3 59.1c21.7 10.9 32.4 36.6 35.8 54.9l-15.2-6.6-14.5-6.3-50.6-22 48.8 24.9 13.6 6.9 14.3 7.3c-16.6 7.9-41.3 14.5-62.1 4.1-1.8-0.9-3.6-1.9-5.4-3.2-2.3-1.5-4.5-3.2-6.8-5.1-19.9-16.4-40.3-46.4-42.7-61.5 12.4-6.5 41.5-5.8 64.8-0.3 3.2 0.8 6.2 1.6 9.1 2.5 4 1.3 7.6 2.8 10.9 4.4z" fill="#ab60e3"/>
<path d="m75.4 54.8c18.9 12 28.4 35.6 31.6 52.6l-14.5-6.3-50.6-22 48.7 24.9 13.6 6.9c-14.1 6.8-34.5 13-53.3 8.2-2.3-1.5-4.5-3.2-6.8-5.1-19.8-16.4-40.2-46.4-42.6-61.5 12.4-6.5 41.5-5.8 64.8-0.3 3.1 0.8 6.2 1.6 9.1 2.6z" fill="#8038b8"/>
<path d="m66.3 52.2c15.3 12.8 23.3 33.6 26.1 48.9l-50.6-22 48.8 24.9c-12.2 6-29.6 11.8-46.5 10-19.8-16.4-40.2-46.4-42.6-61.5 12.4-6.5 41.5-5.8 64.8-0.3z" fill="#6f2796"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

+28
View File
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg enable-background="new 0 0 256 256" version="1.1" viewBox="0 0 256 256" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<title>Trilium Notes</title>
<style type="text/css">
.st0{fill:#95C980;}
.st1{fill:#72B755;}
.st2{fill:#4FA52B;}
.st3{fill:#EE8C89;}
.st4{fill:#E96562;}
.st5{fill:#E33F3B;}
.st6{fill:#EFB075;}
.st7{fill:#E99547;}
.st8{fill:#E47B19;}
</style>
<g>
<path class="st0" d="m202.9 112.7c-22.5 16.1-54.5 12.8-74.9 6.3l14.8-11.8 14.1-11.3 49.1-39.3-51.2 35.9-14.3 10-14.9 10.5c0.7-21.2 7-49.9 28.6-65.4 1.8-1.3 3.9-2.6 6.1-3.8 2.7-1.5 5.7-2.9 8.8-4.1 27.1-11.1 68.5-15.3 85.2-9.5 0.1 16.2-15.9 45.4-33.9 65.9-2.4 2.8-4.9 5.4-7.4 7.8-3.4 3.5-6.8 6.4-10.1 8.8z"/>
<path class="st1" d="m213.1 104c-22.2 12.6-51.4 9.3-70.3 3.2l14.1-11.3 49.1-39.3-51.2 35.9-14.3 10c0.5-18.1 4.9-42.1 19.7-58.6 2.7-1.5 5.7-2.9 8.8-4.1 27.1-11.1 68.5-15.3 85.2-9.5 0.1 16.2-15.9 45.4-33.9 65.9-2.3 2.8-4.8 5.4-7.2 7.8z"/>
<path class="st2" d="m220.5 96.2c-21.1 8.6-46.6 5.3-63.7-0.2l49.2-39.4-51.2 35.9c0.3-15.8 3.5-36.6 14.3-52.8 27.1-11.1 68.5-15.3 85.2-9.5 0.1 16.2-15.9 45.4-33.8 66z"/>
<path class="st3" d="m106.7 179c-5.8-21 5.2-43.8 15.5-57.2l4.8 14.2 4.5 13.4 15.9 47-12.8-47.6-3.6-13.2-3.7-13.9c15.5 6.2 35.1 18.6 40.7 38.8 0.5 1.7 0.9 3.6 1.2 5.5 0.4 2.4 0.6 5 0.7 7.7 0.9 23.1-7.1 54.9-15.9 65.7-12-4.3-29.3-24-39.7-42.8-1.4-2.6-2.7-5.1-3.8-7.6-1.6-3.5-2.9-6.8-3.8-10z"/>
<path class="st4" d="m110.4 188.9c-3.4-19.8 6.9-40.5 16.6-52.9l4.5 13.4 15.9 47-12.8-47.6-3.6-13.2c13.3 5.2 29.9 15 38.1 30.4 0.4 2.4 0.6 5 0.7 7.7 0.9 23.1-7.1 54.9-15.9 65.7-12-4.3-29.3-24-39.7-42.8-1.4-2.6-2.7-5.2-3.8-7.7z"/>
<path class="st5" d="m114.2 196.5c-0.7-18 8.6-35.9 17.3-47.1l15.9 47-12.8-47.6c11.6 4.4 26.1 12.4 35.2 24.8 0.9 23.1-7.1 54.9-15.9 65.7-12-4.3-29.3-24-39.7-42.8z"/>
<path class="st6" d="m86.3 59.1c21.7 10.9 32.4 36.6 35.8 54.9l-15.2-6.6-14.5-6.3-50.6-22 48.8 24.9 13.6 6.9 14.3 7.3c-16.6 7.9-41.3 14.5-62.1 4.1-1.8-0.9-3.6-1.9-5.4-3.2-2.3-1.5-4.5-3.2-6.8-5.1-19.9-16.4-40.3-46.4-42.7-61.5 12.4-6.5 41.5-5.8 64.8-0.3 3.2 0.8 6.2 1.6 9.1 2.5 4 1.3 7.6 2.8 10.9 4.4z"/>
<path class="st7" d="m75.4 54.8c18.9 12 28.4 35.6 31.6 52.6l-14.5-6.3-50.6-22 48.7 24.9 13.6 6.9c-14.1 6.8-34.5 13-53.3 8.2-2.3-1.5-4.5-3.2-6.8-5.1-19.8-16.4-40.2-46.4-42.6-61.5 12.4-6.5 41.5-5.8 64.8-0.3 3.1 0.8 6.2 1.6 9.1 2.6z"/>
<path class="st8" d="m66.3 52.2c15.3 12.8 23.3 33.6 26.1 48.9l-50.6-22 48.8 24.9c-12.2 6-29.6 11.8-46.5 10-19.8-16.4-40.2-46.4-42.6-61.5 12.4-6.5 41.5-5.8 64.8-0.3z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

+9 -4
View File
@@ -1,10 +1,11 @@
import type { CKTextEditor } from "@triliumnext/ckeditor5";
import type CodeMirror from "@triliumnext/codemirror";
import { SqlExecuteResponse } from "@triliumnext/commons";
import { type LOCALE_IDS, SqlExecuteResponse } from "@triliumnext/commons";
import type { NativeImage, TouchBar } from "electron";
import { ColumnComponent } from "tabulator-tables";
import type { Attribute } from "../services/attribute_parser.js";
import bundleService from "../services/bundle.js";
import froca from "../services/froca.js";
import { initLocale, t } from "../services/i18n.js";
import keyboardActionsService from "../services/keyboard_actions.js";
@@ -23,6 +24,7 @@ import { IncludeNoteOpts } from "../widgets/dialogs/include_note.jsx";
import type { InfoProps } from "../widgets/dialogs/info.jsx";
import type { MarkdownImportOpts } from "../widgets/dialogs/markdown_import.jsx";
import { ChooseNoteTypeCallback } from "../widgets/dialogs/note_type_chooser.jsx";
import type { PrintPreviewData } from "../widgets/dialogs/print_preview.jsx";
import type { PromptDialogOptions } from "../widgets/dialogs/prompt.js";
import type NoteTreeWidget from "../widgets/note_tree.js";
import Component from "./component.js";
@@ -171,6 +173,7 @@ export type CommandMappings = {
duplicateSubtree: ContextMenuCommandData;
expandSubtree: ContextMenuCommandData;
collapseSubtree: ContextMenuCommandData;
toggleArchivedNotes: CommandData;
sortChildNotes: ContextMenuCommandData;
copyNotePathToClipboard: ContextMenuCommandData;
recentChangesInSubtree: ContextMenuCommandData;
@@ -279,6 +282,7 @@ export type CommandMappings = {
backInNoteHistory: CommandData;
forwardInNoteHistory: CommandData;
forceSaveRevision: CommandData;
saveNamedRevision: CommandData;
scrollToActiveNote: CommandData;
quickSearch: CommandData;
collapseTree: CommandData;
@@ -302,6 +306,7 @@ export type CommandMappings = {
ninthTab: CommandData;
lastTab: CommandData;
showNoteSource: CommandData;
showNoteOCRText: CommandData;
showSQLConsole: CommandData;
showBackendLog: CommandData;
showCheatsheet: CommandData;
@@ -328,6 +333,7 @@ export type CommandMappings = {
toggleRightPane: CommandData;
printActiveNote: CommandData;
exportAsPdf: CommandData;
showPrintPreview: PrintPreviewData;
openNoteExternally: CommandData;
openNoteCustom: CommandData;
openNoteOnServer: CommandData;
@@ -508,7 +514,7 @@ type EventMappings = {
contentSafeMarginChanged: {
top: number;
noteContext: NoteContext;
}
};
};
export type EventListener<T extends EventNames> = {
@@ -562,7 +568,7 @@ export class AppContext extends Component {
*/
async earlyInit() {
await options.initializedPromise;
await initLocale();
await initLocale((options.get("locale") || "en") as LOCALE_IDS);
}
setLayout(layout: Layout) {
@@ -577,7 +583,6 @@ export class AppContext extends Component {
this.tabManager.loadTabs();
const bundleService = (await import("../services/bundle.js")).default;
setTimeout(() => bundleService.executeStartupBundles(), 2000);
}
+18
View File
@@ -1,6 +1,7 @@
import { CreateChildrenResponse, SqlExecuteResponse } from "@triliumnext/commons";
import bundleService from "../services/bundle.js";
import dialog from "../services/dialog.js";
import dateNoteService from "../services/date_notes.js";
import froca from "../services/froca.js";
import { t } from "../services/i18n.js";
@@ -216,4 +217,21 @@ export default class Entrypoints extends Component {
toastService.showMessage(t("entrypoints.note-revision-created"));
}
async saveNamedRevisionCommand() {
const noteId = appContext.tabManager.getActiveContextNoteId();
if (!noteId) return;
const name = await dialog.prompt({
title: t("entrypoints.save-named-revision-title"),
message: t("entrypoints.save-named-revision-message"),
defaultValue: ""
});
// null means the user cancelled
if (name === null) return;
await server.post(`notes/${noteId}/revision`, { description: name || undefined });
toastService.showMessage(t("entrypoints.note-revision-created"));
}
}
@@ -79,4 +79,8 @@ export default class MainTreeExecutors extends Component {
saveSelection: false
});
}
async toggleArchivedNotesCommand(){
await this.tree?.toggleArchivedNotes();
}
}
+34 -3
View File
@@ -19,12 +19,23 @@ import Component from "./component.js";
export interface SetNoteOpts {
triggerSwitchEvent?: unknown;
viewScope?: ViewScope;
/** If true, skip closing the currently active dialog. Used when opening a note into a stackable popup (e.g. quick-edit) that must not dismiss the dialog it was launched from. */
keepActiveDialog?: boolean;
}
export type GetTextEditorCallback = (editor: CKTextEditor) => void;
export type SaveState = "saved" | "saving" | "unsaved" | "error";
const READ_ONLY_CAPABLE_TYPES: string[] = [
"text",
"code",
"mermaid",
"canvas",
"mindMap",
"spreadsheet"
];
export interface NoteContextDataMap {
toc: HeadingContext;
pdfPages: {
@@ -41,6 +52,10 @@ export interface NoteContextDataMap {
layers: PdfLayer[];
toggleLayer(layerId: string, visible: boolean): void;
};
pdfAnnotations: {
annotations: PdfAnnotationInfo[];
scrollToAnnotation(annotationId: string, pageNumber: number): void;
};
saveState: {
state: SaveState;
};
@@ -118,7 +133,9 @@ class NoteContext extends Component implements EventListener<"entitiesReloaded">
await this.triggerEvent("beforeNoteSwitch", { noteContext: this });
closeActiveDialog();
if (!opts.keepActiveDialog) {
closeActiveDialog();
}
this.notePath = resolvedNotePath;
this.viewScope = opts.viewScope;
@@ -303,8 +320,13 @@ class NoteContext extends Component implements EventListener<"entitiesReloaded">
return false;
}
// "readOnly" is a state valid only for text/code notes
if (!this.note || (this.note.type !== "text" && this.note.type !== "code")) {
if (!this.note) {
return false;
}
// Note types that support a read-only state (via the #readOnly label, source view, or auto-readonly).
const isPdf = this.note.type === "file" && this.note.mime === "application/pdf";
if (!isPdf && !READ_ONLY_CAPABLE_TYPES.includes(this.note.type)) {
return false;
}
@@ -320,6 +342,11 @@ class NoteContext extends Component implements EventListener<"entitiesReloaded">
return true;
}
// Auto read-only based on content size is only configurable for text/code.
if (this.note.type !== "text" && this.note.type !== "code") {
return false;
}
// Store the initial decision about read-only status in the viewScope
// This will be "remembered" until the viewScope is refreshed
if (!this.viewScope) {
@@ -381,6 +408,10 @@ class NoteContext extends Component implements EventListener<"entitiesReloaded">
// Collections must always display a note list, even if no children.
if (note.type === "book") {
if (note.isProtected && !protectedSessionHolder.isProtectedSessionAvailable()) {
return false;
}
const viewType = note.getLabelValue("viewType") ?? "grid";
if (!["list", "grid"].includes(viewType)) {
return true;
@@ -148,6 +148,19 @@ export default class RootCommandExecutor extends Component {
}
}
async showNoteOCRTextCommand() {
const notePath = appContext.tabManager.getActiveContextNotePath();
if (notePath) {
await appContext.tabManager.openTabWithNoteWithHoisting(notePath, {
activate: true,
viewScope: {
viewMode: "ocr"
}
});
}
}
async showAttachmentsCommand() {
const notePath = appContext.tabManager.getActiveContextNotePath();
+4 -4
View File
@@ -54,7 +54,7 @@ function initOnElectron() {
const currentWindow = electronRemote.getCurrentWindow();
const style = window.getComputedStyle(document.body);
initDarkOrLightMode(style);
initDarkOrLightMode();
initTransparencyEffects(style, currentWindow);
initFullScreenDetection(currentWindow);
@@ -119,11 +119,11 @@ function initTransparencyEffects(style: CSSStyleDeclaration, currentWindow: Elec
*
* @param style the root CSS element to read variables from.
*/
function initDarkOrLightMode(style: CSSStyleDeclaration) {
function initDarkOrLightMode() {
let themeSource: typeof nativeTheme.themeSource = "system";
const themeStyle = style.getPropertyValue("--theme-style");
if (style.getPropertyValue("--theme-style-auto") !== "true" && (themeStyle === "light" || themeStyle === "dark")) {
const themeStyle = window.glob.getThemeStyle();
if (themeStyle !== "auto") {
themeSource = themeStyle;
}
+9 -1
View File
@@ -66,7 +66,15 @@ class FAttribute {
}
get isAutoLink() {
return this.type === "relation" && ["internalLink", "imageLink", "relationMapLink", "includeNoteLink"].includes(this.name);
if (this.type === "relation") {
return ["internalLink", "imageLink", "relationMapLink", "includeNoteLink"].includes(this.name);
}
if (this.type === "label") {
return this.name === "internalBookmark";
}
return false;
}
get toString() {
+16 -2
View File
@@ -1,5 +1,6 @@
import { getNoteIcon } from "@triliumnext/commons";
import bundleService from "../services/bundle.js";
import cssClassManager from "../services/css_class_manager.js";
import type { Froca } from "../services/froca-interface.js";
import noteAttributeCache from "../services/note_attribute_cache.js";
@@ -18,7 +19,7 @@ const RELATION = "relation";
* end user. Those types should be used only for checking against, they are
* not for direct use.
*/
export type NoteType = "file" | "image" | "search" | "noteMap" | "launcher" | "doc" | "contentWidget" | "text" | "relationMap" | "render" | "canvas" | "mermaid" | "book" | "webView" | "code" | "mindMap";
export type NoteType = "file" | "image" | "search" | "noteMap" | "launcher" | "doc" | "contentWidget" | "text" | "relationMap" | "render" | "canvas" | "mermaid" | "book" | "webView" | "code" | "mindMap" | "spreadsheet" | "llmChat";
export interface NotePathRecord {
isArchived: boolean;
@@ -235,6 +236,16 @@ export default class FNote {
return this.hasAttribute("label", "archived");
}
/**
* Returns true if the note's metadata (title, icon) should not be editable.
* This applies to system notes like options, help, and launch bar configuration.
*/
get isMetadataReadOnly() {
return utils.isLaunchBarConfig(this.noteId)
|| this.noteId.startsWith("_help_")
|| this.noteId.startsWith("_options");
}
getChildNoteIds() {
return this.children;
}
@@ -1014,7 +1025,6 @@ export default class FNote {
const env = this.getScriptEnv();
if (env === "frontend") {
const bundleService = (await import("../services/bundle.js")).default;
return await bundleService.getAndExecuteBundle(this.noteId);
} else if (env === "backend") {
await server.post(`script/run/${this.noteId}`);
@@ -1059,6 +1069,10 @@ export default class FNote {
return this.mime === "text/x-sqlite;schema=trilium";
}
isMarkdown() {
return this.type === "code" && (this.mime === "text/markdown" || this.mime === "text/x-markdown" || this.mime === "text/x-gfm");
}
isTriliumScript() {
return this.mime.startsWith("application/javascript");
}
+56 -19
View File
@@ -1,3 +1,5 @@
import { getThemeStyle } from "./services/theme";
async function bootstrap() {
showSplash();
await setupGlob();
@@ -38,6 +40,7 @@ async function setupGlob() {
...json,
activeDialog: null
};
window.glob.getThemeStyle = getThemeStyle;
}
async function loadBootstrapCss() {
@@ -49,31 +52,65 @@ async function loadBootstrapCss() {
}
}
function loadStylesheets() {
const { device, assetPath, themeCssUrl, themeUseNextAsBase } = window.glob;
type StylesheetRef = {
href: string;
media?: string;
};
const cssToLoad: string[] = [];
if (device !== "print") {
cssToLoad.push(`${assetPath}/stylesheets/ckeditor-theme.css`);
cssToLoad.push(`api/fonts`);
cssToLoad.push(`${assetPath}/stylesheets/theme-light.css`);
if (themeCssUrl) {
cssToLoad.push(themeCssUrl);
}
if (themeUseNextAsBase === "next") {
cssToLoad.push(`${assetPath}/stylesheets/theme-next.css`);
} else if (themeUseNextAsBase === "next-dark") {
cssToLoad.push(`${assetPath}/stylesheets/theme-next-dark.css`);
} else if (themeUseNextAsBase === "next-light") {
cssToLoad.push(`${assetPath}/stylesheets/theme-next-light.css`);
}
cssToLoad.push(`${assetPath}/stylesheets/style.css`);
function getConfiguredThemeStylesheets(stylesheetsPath: string, theme: string, customThemeCssUrl?: string) {
if (theme === "auto") {
return [{ href: `${stylesheetsPath}/theme-dark.css`, media: "(prefers-color-scheme: dark)" }];
}
for (const href of cssToLoad) {
if (theme === "dark") {
return [{ href: `${stylesheetsPath}/theme-dark.css` }];
}
if (theme === "next") {
return [
{ href: `${stylesheetsPath}/theme-next-light.css` },
{ href: `${stylesheetsPath}/theme-next-dark.css`, media: "(prefers-color-scheme: dark)" }
];
}
if (theme === "next-light") {
return [{ href: `${stylesheetsPath}/theme-next-light.css` }];
}
if (theme === "next-dark") {
return [{ href: `${stylesheetsPath}/theme-next-dark.css` }];
}
if (theme !== "light" && customThemeCssUrl) {
return [{ href: customThemeCssUrl }];
}
return [];
}
function loadStylesheets() {
const { device, assetPath, theme, themeBase, customThemeCssUrl } = window.glob;
const stylesheetsPath = `${assetPath}/stylesheets`;
const cssToLoad: StylesheetRef[] = [];
if (device !== "print") {
cssToLoad.push({ href: `${stylesheetsPath}/ckeditor-theme.css` });
cssToLoad.push({ href: `api/fonts` });
cssToLoad.push({ href: `${stylesheetsPath}/theme-light.css` });
cssToLoad.push(...getConfiguredThemeStylesheets(stylesheetsPath, theme, customThemeCssUrl));
if (themeBase) {
cssToLoad.push(...getConfiguredThemeStylesheets(stylesheetsPath, themeBase));
}
cssToLoad.push({ href: `${stylesheetsPath}/style.css` });
}
for (const { href, media } of cssToLoad) {
const linkEl = document.createElement("link");
linkEl.href = href;
linkEl.rel = "stylesheet";
if (media) {
linkEl.media = media;
}
document.head.appendChild(linkEl);
}
}
@@ -24,6 +24,7 @@ import InfoDialog from "../widgets/dialogs/info.js";
import IncorrectCpuArchDialog from "../widgets/dialogs/incorrect_cpu_arch.js";
import CallToActionDialog from "../widgets/dialogs/call_to_action.jsx";
import PopupEditorDialog from "../widgets/dialogs/PopupEditor.jsx";
import PrintPreviewDialog from "../widgets/dialogs/print_preview.jsx";
import ToastContainer from "../widgets/Toast.jsx";
export function applyModals(rootContainer: RootContainer) {
@@ -46,6 +47,7 @@ export function applyModals(rootContainer: RootContainer) {
.child(<ProtectedSessionPasswordDialog />)
.child(<RevisionsDialog />)
.child(<DeleteNotesDialog />)
.child(<PrintPreviewDialog />)
.child(<InfoDialog />)
.child(<ConfirmDialog />)
.child(<PromptDialog />)
+1
View File
@@ -39,6 +39,7 @@ export interface MenuCommandItem<T> {
title: string;
command?: T;
type?: string;
mime?: string;
/**
* The icon to display in the menu item.
*
+12 -16
View File
@@ -1,12 +1,14 @@
import utils from "../services/utils.js";
import options from "../services/options.js";
import zoomService from "../components/zoom.js";
import contextMenu, { type MenuItem } from "./context_menu.js";
import { t } from "../services/i18n.js";
import server from "../services/server.js";
import * as clipboardExt from "../services/clipboard_ext.js";
import type { BrowserWindow } from "electron";
import type { CommandNames, AppContext } from "../components/app_context.js";
import type { CommandNames } from "../components/app_context.js";
import appContext from "../components/app_context.js";
import zoomService from "../components/zoom.js";
import * as clipboardExt from "../services/clipboard_ext.js";
import { t } from "../services/i18n.js";
import options from "../services/options.js";
import server from "../services/server.js";
import utils from "../services/utils.js";
import contextMenu, { type MenuItem } from "./context_menu.js";
function setupContextMenu() {
const electron = utils.dynamicRequire("electron");
@@ -15,8 +17,6 @@ function setupContextMenu() {
// FIXME: Remove typecast once Electron is properly integrated.
const { webContents } = remote.getCurrentWindow() as BrowserWindow;
let appContext: AppContext;
webContents.on("context-menu", (event, params) => {
const { editFlags } = params;
const hasText = params.selectionText.trim().length > 0;
@@ -38,7 +38,7 @@ function setupContextMenu() {
items.push({
title: t("electron_context_menu.add-term-to-dictionary", { term: params.misspelledWord }),
uiIcon: "bx bx-plus",
handler: () => webContents.session.addWordToSpellCheckerDictionary(params.misspelledWord)
handler: () => electron.ipcRenderer.send("add-word-to-dictionary", params.misspelledWord)
});
items.push({ kind: "separator" });
@@ -141,7 +141,7 @@ function setupContextMenu() {
}
// Replace the placeholder with the real search keyword.
let searchUrl = searchEngineUrl.replace("{keyword}", encodeURIComponent(params.selectionText));
const searchUrl = searchEngineUrl.replace("{keyword}", encodeURIComponent(params.selectionText));
items.push({ kind: "separator" });
@@ -155,10 +155,6 @@ function setupContextMenu() {
title: t("electron_context_menu.search_in_trilium", { term: shortenedSelection }),
uiIcon: "bx bx-search",
handler: async () => {
if (!appContext) {
appContext = (await import("../components/app_context.js")).default;
}
await appContext.triggerCommand("searchNotes", {
searchString: params.selectionText
});
@@ -0,0 +1,101 @@
import type { ToggleInParentResponse } from "@triliumnext/commons";
import type FNote from "../entities/fnote.js";
import branchService from "../services/branches.js";
import { t } from "../services/i18n.js";
import server from "../services/server.js";
import toast from "../services/toast.js";
import contextMenu, { type ContextMenuEvent, type MenuItem } from "./context_menu.js";
const VISIBLE_LAUNCHER_PARENTS = ["_lbVisibleLaunchers", "_lbMobileVisibleLaunchers"];
function getVisibleLauncherBranch(launcherNote: FNote) {
return launcherNote.getParentBranches().find((b) => VISIBLE_LAUNCHER_PARENTS.includes(b.parentNoteId));
}
function getBookmarkBranch(launcherNote: FNote) {
return launcherNote.getParentBranches().find((b) => b.parentNoteId === "_lbBookmarks");
}
async function removeFromLaunchBar(launcherNote: FNote) {
const bookmarkBranch = getBookmarkBranch(launcherNote);
if (bookmarkBranch) {
// Individual bookmarks are represented via a branch under `_lbBookmarks`; removing them
// from the launch bar is the same as unbookmarking the note.
const resp = await server.put<ToggleInParentResponse>(
`notes/${launcherNote.noteId}/toggle-in-parent/_lbBookmarks/false`
);
if (!resp.success && resp.message) {
toast.showError(resp.message);
}
return;
}
const launcherBranch = getVisibleLauncherBranch(launcherNote);
if (!launcherBranch) return;
const isMobileLauncher = launcherBranch.parentNoteId === "_lbMobileVisibleLaunchers";
// Branch IDs in the hidden subtree follow the `${parentNoteId}_${noteId}` convention,
// so the branch linking `_lb(Mobile)?Root` to the "available" launchers root is predictable.
const targetBranchId = isMobileLauncher
? "_lbMobileRoot__lbMobileAvailableLaunchers"
: "_lbRoot__lbAvailableLaunchers";
await branchService.moveToParentNote([launcherBranch.branchId], targetBranchId);
}
export function canRemoveFromLaunchBar(launcherNote: FNote | null | undefined) {
if (!launcherNote) return false;
return !!(getVisibleLauncherBranch(launcherNote) || getBookmarkBranch(launcherNote));
}
export interface ShowLauncherContextMenuOptions<T extends string> {
/** Menu items specific to this launcher (e.g. "Open in new tab" for note-based launchers). They appear above the "Remove from launch bar" item. */
extraItems?: MenuItem<T>[];
/** Handler for the {@link extraItems}. The "Remove from launch bar" item is handled internally and will not be forwarded. */
onCommand?: (command: T | undefined) => void;
}
const REMOVE_COMMAND = "__removeFromLaunchBar__";
/**
* Displays the launch bar icon context menu. When the launcher can be removed (i.e. it is a direct
* child of the visible launchers root or of `_lbBookmarks`), a "Remove from launch bar" entry is
* appended. Extra items can be supplied to preserve launcher-specific actions (e.g. "Open in new tab").
*/
export async function showLauncherContextMenu<T extends string>(
launcherNote: FNote | null | undefined,
e: ContextMenuEvent,
options: ShowLauncherContextMenuOptions<T> = {}
) {
e.preventDefault();
const items = [...(options.extraItems ?? [])] as MenuItem<string>[];
if (canRemoveFromLaunchBar(launcherNote)) {
if (items.length > 0) {
items.push({ kind: "separator" });
}
items.push({
title: t("launcher_button_context_menu.remove_from_launch_bar"),
command: REMOVE_COMMAND,
uiIcon: "bx bx-x-circle"
});
}
if (items.length === 0) return;
contextMenu.show<string>({
x: e.pageX ?? 0,
y: e.pageY ?? 0,
items,
selectMenuItemHandler: ({ command }) => {
if (command === REMOVE_COMMAND) {
if (launcherNote) {
void removeFromLaunchBar(launcherNote);
}
return;
}
options.onCommand?.(command as T | undefined);
}
});
}
+4 -1
View File
@@ -158,6 +158,7 @@ export default class TreeContextMenu implements SelectMenuItemEventListener<Tree
{
title: hasSubtreeHidden ? t("tree-context-menu.show-subtree") : t("tree-context-menu.hide-subtree"),
uiIcon: "bx bx-show",
enabled: isNotRoot,
handler: async () => {
const note = await froca.getNote(this.node.data.noteId);
if (!note) return;
@@ -288,7 +289,7 @@ export default class TreeContextMenu implements SelectMenuItemEventListener<Tree
return items.filter((row) => row !== null) as MenuItem<TreeCommandNames>[];
}
async selectMenuItemHandler({ command, type, templateNoteId }: MenuCommandItem<TreeCommandNames>) {
async selectMenuItemHandler({ command, type, mime, templateNoteId }: MenuCommandItem<TreeCommandNames>) {
const notePath = treeService.getNotePath(this.node);
if (utils.isMobile()) {
@@ -305,6 +306,7 @@ export default class TreeContextMenu implements SelectMenuItemEventListener<Tree
target: "after",
targetBranchId: this.node.data.branchId,
type,
mime,
isProtected,
templateNoteId
});
@@ -313,6 +315,7 @@ export default class TreeContextMenu implements SelectMenuItemEventListener<Tree
noteCreateService.createNote(parentNotePath, {
type,
mime,
isProtected: this.node.data.isProtected,
templateNoteId
});
+28 -6
View File
@@ -2,18 +2,17 @@
:root {
--print-font-size: 11pt;
--ck-content-color-image-caption-background: transparent !important;
}
html,
body {
--print-font-family: var(--detail-font-family, sans-serif);
width: 100%;
height: 100%;
color: black;
}
@page {
margin: 2cm;
font-family: var(--print-font-family);
}
.note-list-widget.full-height,
@@ -26,6 +25,12 @@ body {
}
body[data-note-type="text"] .ck-content {
--ck-content-font-family: var(--print-font-family);
--ck-content-font-size: var(--print-font-size);
--ck-content-font-color: black;
--ck-content-line-height: 1.5;
--ck-content-color-image-caption-background: transparent;
font-size: var(--print-font-size);
text-align: justify;
}
@@ -144,6 +149,23 @@ span[style] {
}
/* #endregion */
/* #region Spreadsheet */
.spreadsheet-table {
border-collapse: collapse;
width: 100%;
font-size: var(--print-font-size);
print-color-adjust: exact;
-webkit-print-color-adjust: exact;
}
.spreadsheet-table td {
border: 0.5pt solid #ccc;
padding: 2pt 4pt;
overflow: hidden;
text-overflow: ellipsis;
}
/* #endregion */
/* #region Page breaks */
.page-break {
page-break-after: always;
@@ -154,4 +176,4 @@ span[style] {
.page-break::after {
display: none !important;
}
/* #endregion */
/* #endregion */
+48 -20
View File
@@ -1,9 +1,11 @@
import { renderSpreadsheetToHtml } from "@triliumnext/commons";
import { render } from "preact";
import { useCallback, useLayoutEffect, useRef } from "preact/hooks";
import FNote from "./entities/fnote";
import content_renderer from "./services/content_renderer";
import { applyInlineMermaid } from "./services/content_renderer_text";
import froca from "./services/froca";
import { dynamicRequire, isElectron } from "./services/utils";
import { CustomNoteList, useNoteViewType } from "./widgets/collections/NoteList";
@@ -30,7 +32,21 @@ async function main() {
if (!noteId) return;
await import("./print.css");
const froca = (await import("./services/froca")).default;
// Browser printing relies on @page margins since there's no programmatic control.
// Electron uses printToPDF() margins instead, so we only inject this for the browser path.
if (!isElectron()) {
const style = document.createElement("style");
style.textContent = "@page { margin: 2cm; }";
document.head.appendChild(style);
}
// Load the user's font preferences so that --detail-font-family is available.
const fontLink = document.createElement("link");
fontLink.rel = "stylesheet";
fontLink.href = "api/fonts";
document.head.appendChild(fontLink);
const note = await froca.getNote(noteId);
const bodyWrapper = document.createElement("div");
@@ -79,32 +95,43 @@ function SingleNoteRenderer({ note, onReady }: RendererProps) {
useLayoutEffect(() => {
async function load() {
if (note.type === "text") {
await import("@triliumnext/ckeditor5/src/theme/ck-content.css");
}
const { $renderedContent } = await content_renderer.getRenderedContent(note, { noChildrenList: true });
const container = containerRef.current!;
container.replaceChildren(...$renderedContent);
// Wait for all images to load.
const images = Array.from(container.querySelectorAll("img"));
await Promise.all(
images.map(img => {
if (img.complete) return Promise.resolve();
return new Promise<void>(resolve => {
img.addEventListener("load", () => resolve(), { once: true });
img.addEventListener("error", () => resolve(), { once: true });
});
})
);
if (note.type === "spreadsheet") {
// Render spreadsheet as HTML tables instead of an image.
const blob = await note.getBlob();
const html = renderSpreadsheetToHtml(blob?.content ?? "");
container.innerHTML = html;
} else {
if (note.type === "text") {
await import("@triliumnext/ckeditor5/src/theme/ck-content.css");
}
const { $renderedContent } = await content_renderer.getRenderedContent(note, { noChildrenList: true });
container.replaceChildren(...$renderedContent);
// Initialize mermaid.
if (note.type === "text") {
await applyInlineMermaid(container);
// Wait for all images to load.
const images = Array.from(container.querySelectorAll("img"));
await Promise.all(
images.map(img => {
if (img.complete) return Promise.resolve();
return new Promise<void>(resolve => {
img.addEventListener("load", () => resolve(), { once: true });
img.addEventListener("error", () => resolve(), { once: true });
});
})
);
// Initialize mermaid.
if (note.type === "text") {
await applyInlineMermaid(container);
}
}
// Check custom CSS.
await loadCustomCss(note);
// Wait for all fonts (including those from custom CSS) to finish loading.
await document.fonts.ready;
}
load().then(() => requestAnimationFrame(() => onReady({
@@ -130,6 +157,7 @@ function CollectionRenderer({ note, onReady, onProgressChanged }: RendererProps)
media="print"
onReady={async (data: PrintReport) => {
await loadCustomCss(note);
await document.fonts.ready;
onReady(data);
}}
onProgressChanged={onProgressChanged}
@@ -7,6 +7,10 @@ async function renderAttribute(attribute: FAttribute, renderIsInheritable: boole
const isInheritable = renderIsInheritable && attribute.isInheritable ? `(inheritable)` : "";
const $attr = $("<span>");
if (attribute.isAutoLink) {
return $attr;
}
if (attribute.type === "label") {
$attr.append(document.createTextNode(`#${attribute.name}${isInheritable}`));
@@ -15,9 +19,6 @@ async function renderAttribute(attribute: FAttribute, renderIsInheritable: boole
$attr.append(document.createTextNode(formatValue(attribute.value)));
}
} else if (attribute.type === "relation") {
if (attribute.isAutoLink) {
return $attr;
}
// when the relation has just been created, then it might not have a value
if (attribute.value) {
+2 -4
View File
@@ -6,10 +6,8 @@ import froca from "./froca";
import server from "./server.js";
// Spy on server methods to track calls
// @ts-expect-error the generic typing is causing issues here
server.put = vi.fn(async <T> (url: string, data?: T) => ({} as T));
// @ts-expect-error the generic typing is causing issues here
server.remove = vi.fn(async <T> (url: string) => ({} as T));
server.put = vi.fn(async () => ({})) as typeof server.put;
server.remove = vi.fn(async () => ({})) as typeof server.remove;
describe("Set boolean with inheritance", () => {
beforeEach(() => {
+21 -6
View File
@@ -120,7 +120,7 @@ async function deleteNotes(branchIdsToDelete: string[], forceDeleteAllClones = f
if (moveToParent) {
try {
await activateParentNotePath();
await activateParentNotePath(branchIdsToDelete);
} catch (e) {
console.error(e);
}
@@ -152,13 +152,28 @@ async function deleteNotes(branchIdsToDelete: string[], forceDeleteAllClones = f
return true;
}
async function activateParentNotePath() {
// this is not perfect, maybe we should find the next/previous sibling, but that's more complex
async function activateParentNotePath(branchIdsToDelete: string[]) {
const activeContext = appContext.tabManager.getActiveContext();
const parentNotePathArr = activeContext?.notePathArray.slice(0, -1);
const activeNotePath = activeContext?.notePathArray ?? [];
if (parentNotePathArr && parentNotePathArr.length > 0) {
activeContext?.setNote(parentNotePathArr.join("/"));
// Find the deleted branch that appears earliest in the active note's path
let earliestIndex = activeNotePath.length;
for (const branchId of branchIdsToDelete) {
const branch = froca.getBranch(branchId);
if (branch) {
const index = activeNotePath.indexOf(branch.noteId);
if (index !== -1 && index < earliestIndex) {
earliestIndex = index;
}
}
}
// Navigate to the parent of the highest deleted ancestor
if (earliestIndex < activeNotePath.length) {
const parentPath = activeNotePath.slice(0, earliestIndex);
if (parentPath.length > 0) {
await activeContext?.setNote(parentPath.join("/"));
}
}
}
+1 -1
View File
@@ -26,7 +26,7 @@ type WithNoteId<T> = T & {
};
export type Widget = WithNoteId<(LegacyWidget | WidgetDefinitionWithType)>;
async function getAndExecuteBundle(noteId: string, originEntity = null, script = null, params = null) {
async function getAndExecuteBundle(noteId: string, originEntity: Entity | null = null, script: string | null = null, params: string | null = null) {
const bundle = await server.post<Bundle>(`script/bundle/${noteId}`, {
script,
params
+16 -16
View File
@@ -1,3 +1,6 @@
import { t } from "./i18n.js";
import toast from "./toast.js";
export function copyText(text: string) {
if (!text) {
return;
@@ -6,29 +9,26 @@ export function copyText(text: string) {
if (navigator.clipboard) {
navigator.clipboard.writeText(text);
return true;
} else {
// Fallback method: https://stackoverflow.com/a/72239825
const textArea = document.createElement("textarea");
textArea.value = text;
try {
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
return document.execCommand('copy');
} finally {
document.body.removeChild(textArea);
}
}
// Fallback method: https://stackoverflow.com/a/72239825
const textArea = document.createElement("textarea");
textArea.value = text;
try {
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
return document.execCommand('copy');
} finally {
document.body.removeChild(textArea);
}
} catch (e) {
console.warn(e);
return false;
}
}
export async function copyTextWithToast(text: string) {
const t = (await import("./i18n.js")).t;
const toast = (await import("./toast.js")).default;
export function copyTextWithToast(text: string) {
if (copyText(text)) {
toast.showMessage(t("clipboard.copy_success"));
} else {
+73 -10
View File
@@ -1,6 +1,7 @@
import "./content_renderer.css";
import { normalizeMimeTypeForCKEditor } from "@triliumnext/commons";
import { normalizeMimeTypeForCKEditor, renderToHtml, type TextRepresentationResponse } from "@triliumnext/commons";
import DOMPurify from "dompurify";
import { h, render } from "preact";
import WheelZoom from 'vanilla-js-wheel-zoom';
@@ -8,13 +9,14 @@ import FAttachment from "../entities/fattachment.js";
import FNote from "../entities/fnote.js";
import imageContextMenuService from "../menus/image_context_menu.js";
import { t } from "../services/i18n.js";
import renderText from "./content_renderer_text.js";
import renderText, { postProcessRichContent, renderChildrenList } from "./content_renderer_text.js";
import renderDoc from "./doc_renderer.js";
import { loadElkIfNeeded, postprocessMermaidSvg } from "./mermaid.js";
import openService from "./open.js";
import protectedSessionService from "./protected_session.js";
import protectedSessionHolder from "./protected_session_holder.js";
import renderService from "./render.js";
import server from "./server.js";
import { applySingleBlockSyntaxHighlight } from "./syntax_highlight.js";
import utils, { getErrorMessage } from "./utils.js";
@@ -32,6 +34,7 @@ export interface RenderOptions {
includeArchivedNotes?: boolean;
/** Set of note IDs that have already been seen during rendering to prevent infinite recursion. */
seenNoteIds?: Set<string>;
showTextRepresentation?: boolean;
}
const CODE_MIME_TYPES = new Set(["application/json"]);
@@ -52,12 +55,14 @@ export async function getRenderedContent(this: {} | { ctx: string }, entity: FNo
if (type === "text" || type === "book") {
await renderText(entity, $renderedContent, options);
} else if (type === "markdown") {
await renderMarkdown(entity, $renderedContent, options);
} else if (type === "code") {
await renderCode(entity, $renderedContent);
} else if (["image", "canvas", "mindMap"].includes(type)) {
renderImage(entity, $renderedContent, options);
} else if (["image", "canvas", "mindMap", "spreadsheet"].includes(type)) {
await renderImage(entity, $renderedContent, options);
} else if (!options.tooltip && ["file", "pdf", "audio", "video"].includes(type)) {
await renderFile(entity, type, $renderedContent);
await renderFile(entity, type, $renderedContent, options);
} else if (type === "mermaid") {
await renderMermaid(entity, $renderedContent);
} else if (type === "render" && entity instanceof FNote) {
@@ -117,6 +122,31 @@ export async function getRenderedContent(this: {} | { ctx: string }, entity: FNo
};
}
/**
* Renders a markdown note by converting its source to CKEditor-compatible HTML,
* then running the same post-render pipeline as text notes (included notes,
* math, reference links, Mermaid, code highlight) so the preview matches what
* the user sees in the Markdown note type's preview pane.
*/
async function renderMarkdown(note: FNote | FAttachment, $renderedContent: JQuery<HTMLElement>, options: RenderOptions) {
const blob = await note.getBlob();
const source = blob?.content ?? "";
if (!source.trim()) {
if (note instanceof FNote && !options.noChildrenList) {
await renderChildrenList($renderedContent, note, options.includeArchivedNotes ?? false);
}
return;
}
const html = renderToHtml(source, note.title, {
sanitize: (dirty) => DOMPurify.sanitize(dirty),
wikiLink: { formatHref: (id) => `#root/${id}` }
});
$renderedContent.append($('<div class="ck-content">').html(html));
await postProcessRichContent(note, $renderedContent, options);
}
/**
* Renders a code note, by displaying its content and applying syntax highlighting based on the selected MIME type.
*/
@@ -138,7 +168,7 @@ async function renderCode(note: FNote | FAttachment, $renderedContent: JQuery<HT
await applySingleBlockSyntaxHighlight($codeBlock, normalizeMimeTypeForCKEditor(note.mime));
}
function renderImage(entity: FNote | FAttachment, $renderedContent: JQuery<HTMLElement>, options: RenderOptions = {}) {
async function renderImage(entity: FNote | FAttachment, $renderedContent: JQuery<HTMLElement>, options: RenderOptions = {}) {
const encodedTitle = encodeURIComponent(entity.title);
let url;
@@ -146,13 +176,14 @@ function renderImage(entity: FNote | FAttachment, $renderedContent: JQuery<HTMLE
if (entity instanceof FNote) {
url = `api/images/${entity.noteId}/${encodedTitle}?${Math.random()}`;
} else if (entity instanceof FAttachment) {
url = `api/attachments/${entity.attachmentId}/image/${encodedTitle}?${entity.utcDateModified}">`;
url = `api/attachments/${entity.attachmentId}/image/${encodedTitle}?${entity.utcDateModified}`;
}
$renderedContent // styles needed for the zoom to work well
.css("display", "flex")
.css("align-items", "center")
.css("justify-content", "center");
.css("justify-content", "center")
.css("flex-direction", "column"); // OCR text is displayed below the image.
const $img = $("<img>")
.attr("src", url || "")
@@ -178,9 +209,35 @@ function renderImage(entity: FNote | FAttachment, $renderedContent: JQuery<HTMLE
}
imageContextMenuService.setupContextMenu($img);
if (entity instanceof FNote && options.showTextRepresentation) {
await addOCRTextIfAvailable(entity, $renderedContent);
}
}
async function renderFile(entity: FNote | FAttachment, type: string, $renderedContent: JQuery<HTMLElement>) {
async function addOCRTextIfAvailable(note: FNote, $content: JQuery<HTMLElement>) {
try {
const data = await server.get<TextRepresentationResponse>(`ocr/notes/${note.noteId}/text`);
if (data.success && data.hasOcr && data.text) {
const $ocrSection = $(`
<div class="ocr-text-section">
<div class="ocr-header">
<span class="bx bx-text"></span> ${t("ocr.extracted_text")}
</div>
<div class="ocr-content"></div>
</div>
`);
$ocrSection.find('.ocr-content').text(data.text);
$content.append($ocrSection);
}
} catch (error) {
// Silently fail if OCR API is not available
console.debug('Failed to fetch OCR text:', error);
}
}
async function renderFile(entity: FNote | FAttachment, type: string, $renderedContent: JQuery<HTMLElement>, options: RenderOptions = {}) {
let entityType, entityId;
if (entity instanceof FNote) {
@@ -199,7 +256,7 @@ async function renderFile(entity: FNote | FAttachment, type: string, $renderedCo
const url = `../../api/${entityType}/${entityId}/open`;
const $viewer = $(`<div style="height: 100%">`);
const PdfViewer = (await import("../widgets/type_widgets/file/PdfViewer")).default;
render(h(PdfViewer, {pdfUrl: url, editable: false}), $viewer.get(0)!);
render(h(PdfViewer, {pdfUrl: url, editable: false, toolbar: false}), $viewer.get(0)!);
$content.append($viewer);
@@ -220,6 +277,10 @@ async function renderFile(entity: FNote | FAttachment, type: string, $renderedCo
$content.append($videoPreview);
}
if (entity instanceof FNote && options.showTextRepresentation) {
await addOCRTextIfAvailable(entity, $content);
}
if (entityType === "notes" && "noteId" in entity) {
// TODO: we should make this available also for attachments, but there's a problem with "Open externally" support
// in attachment list
@@ -297,6 +358,8 @@ function getRenderingType(entity: FNote | FAttachment) {
if (type === "file" && mime === "application/pdf") {
type = "pdf";
} else if (type === "code" && entity instanceof FNote && entity.isMarkdown()) {
type = "markdown";
} else if ((type === "file" || type === "viewConfig") && mime && CODE_MIME_TYPES.has(mime) && !isIconPack) {
type = "code";
} else if (type === "file" && mime && mime.startsWith("audio/")) {
+129 -31
View File
@@ -15,37 +15,47 @@ export default async function renderText(note: FNote | FAttachment, $renderedCon
if (blob && !isHtmlEmpty(blob.content)) {
$renderedContent.append($('<div class="ck-content">').html(blob.content));
const seenNoteIds = options.seenNoteIds ?? new Set<string>();
seenNoteIds.add("noteId" in note ? note.noteId : note.attachmentId);
if (!options.noIncludedNotes) {
await renderIncludedNotes($renderedContent[0], seenNoteIds);
} else {
$renderedContent.find("section.include-note").remove();
}
if ($renderedContent.find("span.math-tex").length > 0) {
renderMathInElement($renderedContent[0], { trust: true });
}
const getNoteIdFromLink = (el: HTMLElement) => tree.getNoteIdFromUrl($(el).attr("href") || "");
const referenceLinks = $renderedContent.find<HTMLAnchorElement>("a.reference-link");
const noteIdsToPrefetch = referenceLinks.map((i, el) => getNoteIdFromLink(el));
await froca.getNotes(noteIdsToPrefetch);
for (const el of referenceLinks) {
const innerSpan = document.createElement("span");
await link.loadReferenceLinkTitle($(innerSpan), el.href);
el.replaceChildren(innerSpan);
}
await rewriteMermaidDiagramsInContainer($renderedContent[0] as HTMLDivElement);
await formatCodeBlocks($renderedContent);
await postProcessRichContent(note, $renderedContent, options);
} else if (note instanceof FNote && !options.noChildrenList) {
await renderChildrenList($renderedContent, note, options.includeArchivedNotes ?? false);
}
}
/**
* Apply the post-render passes that make CKEditor-compatible HTML fully
* interactive: expand `<section class="include-note">`, render inline math and
* Mermaid diagrams, rewrite reference-link titles, and highlight code blocks.
* Assumes the caller has already appended the HTML inside a `.ck-content` child
* of `$renderedContent`.
*/
export async function postProcessRichContent(note: FNote | FAttachment, $renderedContent: JQuery<HTMLElement>, options: RenderOptions = {}) {
const seenNoteIds = options.seenNoteIds ?? new Set<string>();
seenNoteIds.add("noteId" in note ? note.noteId : note.attachmentId);
if (!options.noIncludedNotes) {
await renderIncludedNotes($renderedContent[0], seenNoteIds);
} else {
$renderedContent.find("section.include-note").remove();
}
if ($renderedContent.find("span.math-tex").length > 0) {
renderMathInElement($renderedContent[0], { trust: true });
}
const getNoteIdFromLink = (el: HTMLElement) => tree.getNoteIdFromUrl($(el).attr("href") || "");
const referenceLinks = $renderedContent.find<HTMLAnchorElement>("a.reference-link");
const noteIdsToPrefetch = referenceLinks.map((i, el) => getNoteIdFromLink(el));
await froca.getNotes(noteIdsToPrefetch);
await Promise.all(referenceLinks.toArray().map(async (el) => {
const innerSpan = document.createElement("span");
await link.loadReferenceLinkTitle($(innerSpan), el.getAttribute("href"));
el.replaceChildren(innerSpan);
}));
await rewriteMermaidDiagramsInContainer($renderedContent[0] as HTMLDivElement);
await formatCodeBlocks($renderedContent);
}
async function renderIncludedNotes(contentEl: HTMLElement, seenNoteIds: Set<string>) {
// TODO: Consider duplicating with server's share/content_renderer.ts.
const includeNoteEls = contentEl.querySelectorAll("section.include-note");
@@ -101,19 +111,107 @@ export async function rewriteMermaidDiagramsInContainer(container: HTMLDivElemen
}
}
/**
* Per-container cache of rendered mermaid SVG keyed by diagram source text.
* Populated after each successful render; reused on subsequent renders to
* avoid flicker when the preview HTML is regenerated (e.g. live markdown
* editing). Entries for diagrams no longer present in the container are
* evicted on each run so the cache can't grow unbounded.
*/
const mermaidSvgCache = new WeakMap<HTMLElement, Map<string, string>>();
/**
* Per-container, ordered snapshot of the most recently rendered SVGs. Used as
* a positional placeholder so edits to a diagram's source keep the previous
* SVG visible while the new one renders offscreen.
*/
const mermaidLastRenderedByPosition = new WeakMap<HTMLElement, string[]>();
export async function applyInlineMermaid(container: HTMLDivElement) {
// Initialize mermaid
const nodes = Array.from(container.querySelectorAll<HTMLElement>("div.mermaid-diagram"));
if (!nodes.length) {
mermaidLastRenderedByPosition.delete(container);
return;
}
let cache = mermaidSvgCache.get(container);
if (!cache) {
cache = new Map();
mermaidSvgCache.set(container, cache);
}
const lastRendered = mermaidLastRenderedByPosition.get(container) ?? [];
// Decide per node: exact cache hit → paint final SVG; source changed →
// paint the previous SVG (by position) as a placeholder and queue an
// offscreen re-render. This way the user keeps seeing the old diagram
// until mermaid has finished producing the new one.
const pending: Array<{ visible: HTMLElement; source: string }> = [];
const seenSources = new Set<string>();
for (const [ index, node ] of nodes.entries()) {
const source = (node.textContent ?? "").trim();
seenSources.add(source);
const cached = cache.get(source);
if (cached) {
node.innerHTML = cached;
node.setAttribute("data-processed", "true");
continue;
}
pending.push({ visible: node, source });
const placeholder = lastRendered[index];
if (placeholder) {
node.innerHTML = placeholder;
}
}
// Evict cache entries whose source is no longer present.
for (const key of [ ...cache.keys() ]) {
if (!seenSources.has(key)) cache.delete(key);
}
if (!pending.length) {
mermaidLastRenderedByPosition.set(container, nodes.map((n) => n.innerHTML));
return;
}
const mermaid = (await import("mermaid")).default;
mermaid.initialize(getMermaidConfig());
const nodes = Array.from(container.querySelectorAll<HTMLElement>("div.mermaid-diagram"));
// Render clones offscreen so the visible nodes keep showing the placeholder
// until the new SVG is ready. Keeps mermaid away from our placeholder SVG
// (which would otherwise confuse its text-based parser).
const offscreen = document.createElement("div");
offscreen.style.cssText = "position:absolute;left:-9999px;top:-9999px;width:0;height:0;overflow:hidden;visibility:hidden;";
document.body.appendChild(offscreen);
const pairs = pending.map(({ visible, source }) => {
const clone = document.createElement("div");
clone.className = "mermaid-diagram";
clone.textContent = source;
offscreen.appendChild(clone);
return { visible, clone, source };
});
try {
await mermaid.run({ nodes });
await mermaid.run({ nodes: pairs.map((p) => p.clone) });
for (const { visible, clone, source } of pairs) {
if (clone.getAttribute("data-processed") !== "true") continue;
const svg = clone.innerHTML;
visible.innerHTML = svg;
visible.setAttribute("data-processed", "true");
cache.set(source, svg);
}
} catch (e) {
console.log(e);
console.error(e);
} finally {
offscreen.remove();
}
mermaidLastRenderedByPosition.set(container, nodes.map((n) => n.innerHTML));
}
async function renderChildrenList($renderedContent: JQuery<HTMLElement>, note: FNote, includeArchivedNotes: boolean) {
export async function renderChildrenList($renderedContent: JQuery<HTMLElement>, note: FNote, includeArchivedNotes: boolean) {
let childNoteIds = note.getChildNoteIds();
if (!childNoteIds.length) {
+54 -1
View File
@@ -84,6 +84,55 @@ async function createSearchNote(opts = {}) {
return await froca.getNote(note.noteId);
}
async function createLlmChat() {
const note = await server.post<FNoteRow>("special-notes/llm-chat");
await ws.waitForMaxKnownEntityChangeId();
return await froca.getNote(note.noteId);
}
/**
* Gets the most recently modified LLM chat.
* Returns null if no chat exists.
*/
async function getMostRecentLlmChat() {
const note = await server.get<FNoteRow | null>("special-notes/most-recent-llm-chat");
if (!note) {
return null;
}
await ws.waitForMaxKnownEntityChangeId();
return await froca.getNote(note.noteId);
}
/**
* Gets the most recent LLM chat, or creates a new one if none exists.
* Used by sidebar chat for persistent conversations across page refreshes.
*/
async function getOrCreateLlmChat() {
const note = await server.get<FNoteRow>("special-notes/get-or-create-llm-chat");
await ws.waitForMaxKnownEntityChangeId();
return await froca.getNote(note.noteId);
}
export interface RecentLlmChat {
noteId: string;
title: string;
dateModified: string;
}
/**
* Gets a list of recent LLM chats for the history popup.
*/
async function getRecentLlmChats(limit: number = 10): Promise<RecentLlmChat[]> {
return await server.get<RecentLlmChat[]>(`special-notes/recent-llm-chats?limit=${limit}`);
}
export default {
getInboxNote,
getTodayNote,
@@ -94,5 +143,9 @@ export default {
getMonthNote,
getYearNote,
createSqlConsole,
createSearchNote
createSearchNote,
createLlmChat,
getMostRecentLlmChat,
getOrCreateLlmChat,
getRecentLlmChats
};
+3 -2
View File
@@ -1,9 +1,11 @@
import { Modal } from "bootstrap";
import appContext from "../components/app_context.js";
import type { ConfirmDialogOptions, ConfirmDialogResult, ConfirmWithMessageOptions, MessageType } from "../widgets/dialogs/confirm.js";
import { InfoExtraProps } from "../widgets/dialogs/info.jsx";
import type { PromptDialogOptions } from "../widgets/dialogs/prompt.js";
import { focusSavedElement, saveFocusedElement } from "./focus.js";
import { InfoExtraProps } from "../widgets/dialogs/info.jsx";
import keyboardActionsService from "./keyboard_actions.js";
export async function openDialog($dialog: JQuery<HTMLElement>, closeActDialog = true, config?: Partial<Modal.Options>) {
if (closeActDialog) {
@@ -25,7 +27,6 @@ export async function openDialog($dialog: JQuery<HTMLElement>, closeActDialog =
}
});
const keyboardActionsService = (await import("./keyboard_actions.js")).default;
keyboardActionsService.updateDisplayedShortcuts($dialog);
return $dialog;
@@ -0,0 +1,30 @@
import { describe, expect, it } from "vitest";
import { isValidDocName } from "./doc_renderer.js";
describe("isValidDocName", () => {
it("accepts valid docNames", () => {
expect(isValidDocName("launchbar_intro")).toBe(true);
expect(isValidDocName("User Guide/Quick Start")).toBe(true);
expect(isValidDocName("User Guide/User Guide/Quick Start")).toBe(true);
expect(isValidDocName("Quick Start Guide")).toBe(true);
expect(isValidDocName("quick_start_guide")).toBe(true);
expect(isValidDocName("quick-start-guide")).toBe(true);
});
it("rejects path traversal attacks", () => {
expect(isValidDocName("..")).toBe(false);
expect(isValidDocName("../etc/passwd")).toBe(false);
expect(isValidDocName("foo/../bar")).toBe(false);
expect(isValidDocName("../../../../api/notes/_malicious/open")).toBe(false);
expect(isValidDocName("..\\etc\\passwd")).toBe(false);
expect(isValidDocName("foo\\bar")).toBe(false);
});
it("rejects URL manipulation attacks", () => {
expect(isValidDocName("../../../../api/notes/_malicious/open?x=")).toBe(false);
expect(isValidDocName("foo#bar")).toBe(false);
expect(isValidDocName("%2e%2e")).toBe(false);
expect(isValidDocName("%2e%2e%2f%2e%2e%2fapi")).toBe(false);
});
});
+34 -12
View File
@@ -3,22 +3,39 @@ import { applyReferenceLinks } from "../widgets/type_widgets/text/read_only_help
import { getCurrentLanguage } from "./i18n.js";
import { formatCodeBlocks } from "./syntax_highlight.js";
/**
* Validates a docName to prevent path traversal attacks.
* Allows forward slashes for subdirectories (e.g., "User Guide/Quick Start")
* but blocks traversal sequences and URL manipulation characters.
*/
export function isValidDocName(docName: string): boolean {
// Allow alphanumeric characters, spaces, underscores, hyphens, and forward slashes.
const validDocNameRegex = /^[a-zA-Z0-9_/\- ]+$/;
return validDocNameRegex.test(docName);
}
export default function renderDoc(note: FNote) {
return new Promise<JQuery<HTMLElement>>((resolve) => {
let docName = note.getLabelValue("docName");
const docName = note.getLabelValue("docName");
const $content = $("<div>");
if (docName) {
// find doc based on language
const url = getUrl(docName, getCurrentLanguage());
// find doc based on language
const url = getUrl(docName, getCurrentLanguage());
if (url) {
$content.load(url, async (response, status) => {
// fallback to english doc if no translation available
if (status === "error") {
const fallbackUrl = getUrl(docName, "en");
$content.load(fallbackUrl, async () => {
await processContent(fallbackUrl, $content)
if (fallbackUrl) {
$content.load(fallbackUrl, async () => {
await processContent(fallbackUrl, $content);
resolve($content);
});
} else {
resolve($content);
});
}
return;
}
@@ -28,8 +45,6 @@ export default function renderDoc(note: FNote) {
} else {
resolve($content);
}
return $content;
});
}
@@ -39,7 +54,7 @@ async function processContent(url: string, $content: JQuery<HTMLElement>) {
// Images are relative to the docnote but that will not work when rendered in the application since the path breaks.
$content.find("img").each((i, el) => {
const $img = $(el);
$img.attr("src", dir + "/" + $img.attr("src"));
$img.attr("src", `${dir}/${$img.attr("src")}`);
});
formatCodeBlocks($content);
@@ -48,10 +63,17 @@ async function processContent(url: string, $content: JQuery<HTMLElement>) {
await applyReferenceLinks($content[0]);
}
function getUrl(docNameValue: string, language: string) {
function getUrl(docNameValue: string | null, language: string) {
if (!docNameValue) return;
if (!isValidDocName(docNameValue)) {
console.error(`Invalid docName: ${docNameValue}`);
return null;
}
// Cannot have spaces in the URL due to how JQuery.load works.
docNameValue = docNameValue.replaceAll(" ", "%20");
const basePath = window.glob.isDev ? window.glob.assetPath + "/.." : window.glob.assetPath;
const basePath = window.glob.isDev ? `${window.glob.assetPath }/..` : window.glob.assetPath;
return `${basePath}/doc_notes/${language}/${docNameValue}.html`;
}
@@ -13,6 +13,11 @@ export const experimentalFeatures = [
id: "new-layout",
name: t("experimental_features.new_layout_name"),
description: t("experimental_features.new_layout_description"),
},
{
id: "llm",
name: t("experimental_features.llm_name"),
description: t("experimental_features.llm_description"),
}
] as const satisfies ExperimentalFeature[];
+17 -11
View File
@@ -1,14 +1,16 @@
import LoadResults from "./load_results.js";
import froca from "./froca.js";
import utils from "./utils.js";
import options from "./options.js";
import noteAttributeCache from "./note_attribute_cache.js";
import FBranch, { type FBranchRow } from "../entities/fbranch.js";
import FAttribute, { type FAttributeRow } from "../entities/fattribute.js";
import type { OptionNames } from "@triliumnext/commons";
import appContext from "../components/app_context.js";
import FAttachment, { type FAttachmentRow } from "../entities/fattachment.js";
import FAttribute, { type FAttributeRow } from "../entities/fattribute.js";
import FBranch, { type FBranchRow } from "../entities/fbranch.js";
import type { default as FNote, FNoteRow } from "../entities/fnote.js";
import type { EntityChange } from "../server_types.js";
import type { OptionNames } from "@triliumnext/commons";
import froca from "./froca.js";
import LoadResults from "./load_results.js";
import noteAttributeCache from "./note_attribute_cache.js";
import options from "./options.js";
import utils from "./utils.js";
async function processEntityChanges(entityChanges: EntityChange[]) {
const loadResults = new LoadResults(entityChanges);
@@ -63,7 +65,7 @@ async function processEntityChanges(entityChanges: EntityChange[]) {
if (entityName === "branches" && !((entity as FBranchRow).parentNoteId in froca.notes)) {
missingNoteIds.push((entity as FBranchRow).parentNoteId);
} else if (entityName === "attributes") {
let attributeEntity = entity as FAttributeRow;
const attributeEntity = entity as FAttributeRow;
if (attributeEntity.type === "relation" && (attributeEntity.name === "template" || attributeEntity.name === "inherit") && !(attributeEntity.value in froca.notes)) {
missingNoteIds.push(attributeEntity.value);
}
@@ -79,7 +81,6 @@ async function processEntityChanges(entityChanges: EntityChange[]) {
noteAttributeCache.invalidate();
}
const appContext = (await import("../components/app_context.js")).default;
await appContext.triggerEvent("entitiesReloaded", { loadResults });
}
}
@@ -110,7 +111,12 @@ function processNoteChange(loadResults: LoadResults, ec: EntityChange) {
}
}
if (ec.componentId) {
// Only register as a content change if the protection status didn't change.
// When isProtected changes, the blobId change is a side effect of re-encryption,
// not a content edit. Registering it as content would cause the tree's content-only
// filter to incorrectly skip the note update (since both changes share the same
// componentId).
if (ec.componentId && note.isProtected === (ec.entity as FNoteRow).isProtected) {
loadResults.addNoteContent(note.noteId, ec.componentId);
}
}
@@ -1,4 +1,4 @@
import { Fragment, h, VNode } from "preact";
import { createContext, Fragment, h, VNode } from "preact";
import * as hooks from "preact/hooks";
import ActionButton from "../widgets/react/ActionButton";
@@ -47,6 +47,7 @@ export const preactAPI = Object.freeze({
// Core
h,
Fragment,
createContext,
/**
* Method that must be run for widget scripts that run on Preact, using JSX. The method just returns the same definition, reserved for future typechecking and perhaps validation purposes.
-2
View File
@@ -75,8 +75,6 @@ function setupGlobs() {
requireCss(`api/notes/download/${appCssNoteId}`, false);
}
utils.initHelpButtons($(window));
$("body").on("click", "a.external", function () {
window.open($(this).attr("href"), "_blank");
+9 -2
View File
@@ -1,10 +1,10 @@
import { LOCALES } from "@triliumnext/commons";
import { findDuplicateJsonKeys, LOCALES } from "@triliumnext/commons";
import { readFileSync } from "fs";
import { join } from "path";
import { describe, expect, it } from "vitest";
describe("i18n", () => {
it("translations are valid JSON", () => {
it("translations are valid JSON with no duplicate keys", () => {
for (const locale of LOCALES) {
if (locale.contentOnly || locale.id === "en_rtl") {
continue;
@@ -14,6 +14,13 @@ describe("i18n", () => {
const translationFile = readFileSync(translationPath, { encoding: "utf-8" });
expect(() => JSON.parse(translationFile), `JSON error while parsing locale '${locale.id}' at "${translationPath}"`)
.not.toThrow();
const duplicates = findDuplicateJsonKeys(translationFile);
expect(
duplicates,
`Duplicate keys in locale '${locale.id}' at "${translationPath}":\n${
duplicates.map((d) => ` - "${d.key}" (line ${d.line})`).join("\n")}`
).toEqual([]);
}
});
});
+6 -18
View File
@@ -1,21 +1,14 @@
import options from "./options.js";
import { LOCALE_IDS, LOCALES, setDayjsLocale } from "@triliumnext/commons";
import i18next from "i18next";
import i18nextHttpBackend from "i18next-http-backend";
import server from "./server.js";
import { LOCALE_IDS, setDayjsLocale, type Locale } from "@triliumnext/commons";
import { initReactI18next } from "react-i18next";
let locales: Locale[] | null;
/**
* A deferred promise that resolves when translations are initialized.
*/
export let translationsInitializedPromise = $.Deferred();
export const translationsInitializedPromise = $.Deferred();
export async function initLocale() {
const locale = ((options.get("locale") as string) || "en") as LOCALE_IDS;
locales = await server.get<Locale[]>("options/locales");
export async function initLocale(locale: LOCALE_IDS = "en") {
i18next.use(initReactI18next);
await i18next.use(i18nextHttpBackend).init({
@@ -24,8 +17,7 @@ export async function initLocale() {
backend: {
loadPath: `${window.glob.assetPath}/translations/{{lng}}/{{ns}}.json`
},
returnEmptyString: false,
showSupportNotice: false
returnEmptyString: false
});
await setDayjsLocale(locale);
@@ -33,11 +25,7 @@ export async function initLocale() {
}
export function getAvailableLocales() {
if (!locales) {
throw new Error("Tried to load list of locales, but localization is not yet initialized.")
}
return locales;
return LOCALES;
}
/**
@@ -48,7 +36,7 @@ export function getAvailableLocales() {
*/
export function getLocaleById(localeId: string | null | undefined) {
if (!localeId) return null;
return locales?.find((l) => l.id === localeId) ?? null;
return LOCALES.find((l) => l.id === localeId) ?? null;
}
export const t = i18next.t;
+5 -2
View File
@@ -1,4 +1,5 @@
import { NoteType } from "@triliumnext/commons";
import FNote from "../entities/fnote";
import { ViewTypeOptions } from "../widgets/collections/interface";
@@ -17,7 +18,9 @@ export const byNoteType: Record<Exclude<NoteType, "book">, string | null> = {
render: null,
search: null,
text: null,
webView: null
webView: null,
spreadsheet: null,
llmChat: null
};
export const byBookType: Record<ViewTypeOptions, string | null> = {
@@ -38,6 +41,6 @@ export function getHelpUrlForNote(note: FNote | null | undefined) {
} else if (note?.hasLabel("textSnippet")) {
return "pwc194wlRzcH";
} else if (note && note.type === "book") {
return byBookType[note.getAttributeValue("label", "viewType") as ViewTypeOptions ?? ""]
return byBookType[note.getAttributeValue("label", "viewType") as ViewTypeOptions ?? ""];
}
}
+40 -10
View File
@@ -4,6 +4,8 @@ import appContext, { type NoteCommandData } from "../components/app_context.js";
import { openInCurrentNoteContext } from "../components/note_context.js";
import linkContextMenuService from "../menus/link_context_menu.js";
import froca from "./froca.js";
import { t } from "./i18n.js";
import { showError } from "./toast.js";
import treeService from "./tree.js";
import utils from "./utils.js";
@@ -28,7 +30,7 @@ async function getLinkIcon(noteId: string, viewMode: ViewMode | undefined) {
return icon;
}
export type ViewMode = "default" | "source" | "attachments" | "contextual-help" | "note-map";
export type ViewMode = "default" | "source" | "attachments" | "contextual-help" | "note-map" | "ocr";
export interface ViewScope {
/**
@@ -58,6 +60,8 @@ export interface ViewScope {
*/
tocPreviousVisible?: boolean;
tocCollapsedHeadings?: Set<string>;
/** When set, scrolls to a bookmark anchor within the note after navigation. */
bookmark?: string;
}
interface CreateLinkOptions {
@@ -242,7 +246,7 @@ export function parseNavigationStateFromUrl(url: string | undefined) {
hoistedNoteId = value;
} else if (name === "searchString") {
searchString = value; // supports triggering search from URL, e.g. #?searchString=blabla
} else if (["viewMode", "attachmentId"].includes(name)) {
} else if (["viewMode", "attachmentId", "bookmark"].includes(name)) {
(viewScope as any)[name] = value;
} else if (name === "popup") {
openInPopup = true;
@@ -333,15 +337,30 @@ export function goToLinkExt(evt: MouseEvent | JQuery.ClickEvent | JQuery.MouseDo
if (openInNewTab || openInNewWindow || (isLeftClick && (withinEditLink || outsideOfCKEditor))) {
if (hrefLink.toLowerCase().startsWith("http") || hrefLink.startsWith("api/")) {
window.open(hrefLink, "_blank");
} else {
} else if (ALLOWED_PROTOCOLS.some((protocol) => hrefLink.toLowerCase().startsWith(`${protocol}:`))) {
// Enable protocols supported by CKEditor 5 to be clickable.
if (ALLOWED_PROTOCOLS.some((protocol) => hrefLink.toLowerCase().startsWith(`${protocol}:`))) {
if ( utils.isElectron()) {
const electron = utils.dynamicRequire("electron");
electron.shell.openExternal(hrefLink);
if (utils.isElectron()) {
const electron = utils.dynamicRequire("electron");
const reportLinkError = (e: unknown) => {
const message = e instanceof Error ? e.message : String(e);
logError(`Failed to open link '${hrefLink}': ${message}`);
showError(t("link.failed_to_open", { href: hrefLink, message }));
};
if (hrefLink.toLowerCase().startsWith("file:")) {
// shell.openExternal mishandles Unicode file:// URLs on Windows;
// convert to a filesystem path and use shell.openPath instead.
// Normalize file://c:/... (2 slashes — drive read as host) to file:///c:/...
const normalized = hrefLink.replace(/^file:\/\/(?=[a-zA-Z]:)/i, "file:///");
const { fileURLToPath } = utils.dynamicRequire("url");
electron.shell.openPath(fileURLToPath(normalized)).then((err: string) => {
if (err) reportLinkError(new Error(err));
}).catch(reportLinkError);
} else {
window.open(hrefLink, "_blank");
electron.shell.openExternal(hrefLink).catch(reportLinkError);
}
} else {
window.open(hrefLink, "_blank");
}
}
}
@@ -415,6 +434,13 @@ async function loadReferenceLinkTitle($el: JQuery<HTMLElement>, href: string | n
const title = await getReferenceLinkTitle(href);
$el.text(title);
if (viewScope?.bookmark) {
$el.append($("<small>").append(
$("<span>").addClass("bx bx-bookmark"),
document.createTextNode(viewScope.bookmark)
));
}
if (note) {
const icon = await getLinkIcon(noteId, viewScope.viewMode);
@@ -440,8 +466,8 @@ async function getReferenceLinkTitle(href: string) {
return attachment ? attachment.title : "[missing attachment]";
}
return note.title;
return note.title;
}
function getReferenceLinkTitleSync(href: string) {
@@ -464,8 +490,12 @@ function getReferenceLinkTitleSync(href: string) {
return attachment ? attachment.title : "[missing attachment]";
}
return note.title;
if (viewScope?.bookmark) {
return `${note.title} - ${viewScope.bookmark}`;
}
return note.title;
}
if (glob.device !== "print") {
+116
View File
@@ -0,0 +1,116 @@
import type { LlmChatConfig, LlmCitation, LlmMessage, LlmModelInfo,LlmUsage } from "@triliumnext/commons";
import server from "./server.js";
/**
* Fetch available models from all configured providers.
*/
export async function getAvailableModels(): Promise<LlmModelInfo[]> {
const response = await server.get<{ models?: LlmModelInfo[] }>("llm-chat/models");
return response.models ?? [];
}
export interface StreamCallbacks {
onChunk: (text: string) => void;
onThinking?: (text: string) => void;
onToolUse?: (toolName: string, input: Record<string, unknown>) => void;
onToolResult?: (toolName: string, result: string, isError?: boolean) => void;
onCitation?: (citation: LlmCitation) => void;
onUsage?: (usage: LlmUsage) => void;
onError: (error: string) => void;
onDone: () => void;
}
/**
* Stream a chat completion from the LLM API using Server-Sent Events.
*/
export async function streamChatCompletion(
messages: LlmMessage[],
config: LlmChatConfig,
callbacks: StreamCallbacks,
abortSignal?: AbortSignal
): Promise<void> {
const headers = await server.getHeaders();
const response = await fetch(`${window.glob.baseApiUrl}llm-chat/stream`, {
method: "POST",
headers: {
...headers,
"Content-Type": "application/json"
} as HeadersInit,
body: JSON.stringify({ messages, config }),
signal: abortSignal
});
if (!response.ok) {
callbacks.onError(`HTTP ${response.status}: ${response.statusText}`);
return;
}
const reader = response.body?.getReader();
if (!reader) {
callbacks.onError("No response body");
return;
}
const decoder = new TextDecoder();
let buffer = "";
try {
while (true) {
const { done, value } = await reader.read();
if (done) break;
buffer += decoder.decode(value, { stream: true });
const lines = buffer.split("\n");
buffer = lines.pop() || "";
for (const line of lines) {
if (line.startsWith("data: ")) {
try {
const data = JSON.parse(line.slice(6));
switch (data.type) {
case "text":
callbacks.onChunk(data.content);
break;
case "thinking":
callbacks.onThinking?.(data.content);
break;
case "tool_use":
callbacks.onToolUse?.(data.toolName, data.toolInput);
// Yield to force Preact to commit the pending tool call
// state before we process the result.
await new Promise((r) => setTimeout(r, 1));
break;
case "tool_result":
callbacks.onToolResult?.(data.toolName, data.result, data.isError);
await new Promise((r) => setTimeout(r, 1));
break;
case "citation":
if (data.citation) {
callbacks.onCitation?.(data.citation);
}
break;
case "usage":
if (data.usage) {
callbacks.onUsage?.(data.usage);
}
break;
case "error":
callbacks.onError(data.error);
break;
case "done":
callbacks.onDone();
break;
}
} catch (e) {
console.error("Failed to parse SSE data line:", line, e);
}
}
}
}
} finally {
reader.releaseLock();
}
}
+5
View File
@@ -32,4 +32,9 @@ describe("Mermaid", () => {
`;
expect(postprocessMermaidSvg(before)).toBe(after);
});
it("replaces &nbsp; with numeric entity for valid XML", () => {
expect(postprocessMermaidSvg("<text>a&nbsp;b&nbsp;&nbsp;c</text>"))
.toBe("<text>a&#160;b&#160;&#160;c</text>");
});
});
+6 -2
View File
@@ -49,11 +49,15 @@ export async function loadElkIfNeeded(mermaid: Mermaid, mermaidContent: string)
* Processes the output of a Mermaid SVG render before it should be delivered to the user.
*
* <p>
* Currently this fixes <br> to <br/> which would otherwise cause an invalid XML.
* Currently this fixes <br> to <br/> and replaces named HTML entities like &nbsp; with their
* numeric equivalents, both of which would otherwise cause invalid XML when the SVG is saved
* as an attachment.
*
* @param svg the Mermaid SVG to process.
* @returns the processed SVG.
*/
export function postprocessMermaidSvg(svg: string) {
return svg.replaceAll(/<br\s*>/ig, "<br/>");
return svg
.replaceAll(/<br\s*>/ig, "<br/>")
.replaceAll(/&nbsp;/g, "&#160;");
}
@@ -68,7 +68,8 @@ async function autocompleteSourceForCKEditor(queryText: string) {
name: row.notePathTitle || "",
link: `#${row.notePath}`,
notePath: row.notePath,
highlightedNotePathTitle: row.highlightedNotePathTitle
highlightedNotePathTitle: row.highlightedNotePathTitle,
icon: row.icon
};
})
);
+17 -21
View File
@@ -1,15 +1,17 @@
import type { CKTextEditor } from "@triliumnext/ckeditor5";
import { AttributeRow } from "@triliumnext/commons";
import appContext from "../components/app_context.js";
import type FBranch from "../entities/fbranch.js";
import type FNote from "../entities/fnote.js";
import type { ChooseNoteTypeResponse } from "../widgets/dialogs/note_type_chooser.js";
import froca from "./froca.js";
import { t } from "./i18n.js";
import protectedSessionHolder from "./protected_session_holder.js";
import server from "./server.js";
import ws from "./ws.js";
import froca from "./froca.js";
import treeService from "./tree.js";
import toastService from "./toast.js";
import { t } from "./i18n.js";
import type FNote from "../entities/fnote.js";
import type FBranch from "../entities/fbranch.js";
import type { ChooseNoteTypeResponse } from "../widgets/dialogs/note_type_chooser.js";
import type { CKTextEditor } from "@triliumnext/ckeditor5";
import treeService from "./tree.js";
import ws from "./ws.js";
export interface CreateNoteOpts {
isProtected?: boolean;
@@ -24,6 +26,8 @@ export interface CreateNoteOpts {
target?: string;
targetBranchId?: string;
textEditor?: CKTextEditor;
/** Attributes to be set on the note. These are set atomically on note creation, so entity changes are not sent for attributes defined here. */
attributes?: Omit<AttributeRow, "noteId" | "attributeId">[];
}
interface Response {
@@ -37,7 +41,7 @@ interface DuplicateResponse {
note: FNote;
}
async function createNote(parentNotePath: string | undefined, options: CreateNoteOpts = {}) {
async function createNote(parentNotePath: string | undefined, options: CreateNoteOpts = {}, componentId?: string) {
options = Object.assign(
{
activate: true,
@@ -63,22 +67,15 @@ async function createNote(parentNotePath: string | undefined, options: CreateNot
const parentNoteId = treeService.getNoteIdFromUrl(parentNotePath);
if (options.type === "mermaid" && !options.content && !options.templateNoteId) {
options.content = `graph TD;
A-->B;
A-->C;
B-->D;
C-->D;`;
}
const { note, branch } = await server.post<Response>(`notes/${parentNoteId}/children?target=${options.target}&targetBranchId=${options.targetBranchId || ""}`, {
title: options.title,
content: options.content || "",
isProtected: options.isProtected,
type: options.type,
mime: options.mime,
templateNoteId: options.templateNoteId
});
templateNoteId: options.templateNoteId,
attributes: options.attributes
}, componentId);
if (options.saveSelection) {
// we remove the selection only after it was saved to server to make sure we don't lose anything
@@ -140,9 +137,8 @@ function parseSelectedHtml(selectedHtml: string) {
const content = selectedHtml.replace(dom[0].outerHTML, "");
return [title, content];
} else {
return [null, selectedHtml];
}
return [null, selectedHtml];
}
async function duplicateSubtree(noteId: string, parentNotePath: string) {
+18 -13
View File
@@ -1,9 +1,10 @@
import { t } from "./i18n.js";
import froca from "./froca.js";
import server from "./server.js";
import type { MenuCommandItem, MenuItem, MenuItemBadge, MenuSeparatorItem } from "../menus/context_menu.js";
import type { NoteType } from "../entities/fnote.js";
import type { MenuCommandItem, MenuItem, MenuItemBadge, MenuSeparatorItem } from "../menus/context_menu.js";
import type { TreeCommandNames } from "../menus/tree_context_menu.js";
import { isExperimentalFeatureEnabled } from "./experimental_features.js";
import froca from "./froca.js";
import { t } from "./i18n.js";
import server from "./server.js";
export interface NoteTypeMapping {
type: NoteType;
@@ -26,6 +27,7 @@ export const NOTE_TYPES: NoteTypeMapping[] = [
// The default note type (always the first item)
{ type: "text", mime: "text/html", title: t("note_types.text"), icon: "bx-note" },
{ type: "spreadsheet", mime: "application/json", title: t("note_types.spreadsheet"), icon: "bx-table", isBeta: true, isNew: true },
// Text notes group
{ type: "book", mime: "", title: t("note_types.book"), icon: "bx-book" },
@@ -40,12 +42,14 @@ export const NOTE_TYPES: NoteTypeMapping[] = [
{ type: "relationMap", mime: "application/json", title: t("note_types.relation-map"), icon: "bxs-network-chart" },
// Misc note types
{ type: "llmChat", mime: "application/json", title: t("note_types.llm-chat"), icon: "bx-message-square-dots", isBeta: true },
{ type: "render", mime: "", title: t("note_types.render-note"), icon: "bx-extension" },
{ type: "search", title: t("note_types.saved-search"), icon: "bx-file-find", static: true },
{ type: "webView", mime: "", title: t("note_types.web-view"), icon: "bx-globe-alt" },
// Code notes
{ type: "code", mime: "text/plain", title: t("note_types.code"), icon: "bx-code" },
{ type: "code", mime: "text/x-markdown", title: t("note_types.markdown"), icon: "bxl-markdown", isNew: true },
// Reserved types (cannot be created by the user)
{ type: "contentWidget", mime: "", title: t("note_types.widget"), reserved: true },
@@ -91,14 +95,16 @@ async function getNoteTypeItems(command?: TreeCommandNames) {
function getBlankNoteTypes(command?: TreeCommandNames): MenuItem<TreeCommandNames>[] {
return NOTE_TYPES
.filter((nt) => !nt.reserved && nt.type !== "book")
.filter((nt) => nt.type !== "llmChat" || isExperimentalFeatureEnabled("llm"))
.map((nt) => {
const menuItem: MenuCommandItem<TreeCommandNames> = {
title: nt.title,
command,
type: nt.type,
uiIcon: "bx " + nt.icon,
mime: nt.mime,
uiIcon: `bx ${nt.icon}`,
badges: []
}
};
if (nt.isNew) {
menuItem.badges?.push(NEW_BADGE);
@@ -130,7 +136,7 @@ async function getUserTemplates(command?: TreeCommandNames) {
const item: MenuItem<TreeCommandNames> = {
title: templateNote.title,
uiIcon: templateNote.getIcon(),
command: command,
command,
type: templateNote.type,
templateNoteId: templateNote.noteId
};
@@ -159,7 +165,7 @@ async function getBuiltInTemplates(title: string | null, command: TreeCommandNam
const items: MenuItem<TreeCommandNames>[] = [];
if (title) {
items.push({
title: title,
title,
kind: "header"
});
} else {
@@ -175,7 +181,7 @@ async function getBuiltInTemplates(title: string | null, command: TreeCommandNam
const item: MenuItem<TreeCommandNames> = {
title: templateNote.title,
uiIcon: templateNote.getIcon(),
command: command,
command,
type: templateNote.type,
templateNoteId: templateNote.noteId
};
@@ -193,7 +199,7 @@ async function isNewTemplate(templateNoteId) {
if (rootCreationDate === undefined) {
// Retrieve the root note creation date
try {
let rootNoteInfo: any = await server.get("notes/root");
const rootNoteInfo: any = await server.get("notes/root");
if ("dateCreated" in rootNoteInfo) {
rootCreationDate = new Date(rootNoteInfo.dateCreated);
}
@@ -208,7 +214,7 @@ async function isNewTemplate(templateNoteId) {
if (creationDate === undefined) {
// The creation date isn't available in the cache, try to retrieve it from the server
try {
const noteInfo: any = await server.get("notes/" + templateNoteId);
const noteInfo: any = await server.get(`notes/${templateNoteId}`);
if ("dateCreated" in noteInfo) {
creationDate = new Date(noteInfo.dateCreated);
creationDateCache.set(templateNoteId, creationDate);
@@ -230,9 +236,8 @@ async function isNewTemplate(templateNoteId) {
const age = (new Date().getTime() - creationDate.getTime()) / DAY_LENGTH;
// Return true if the template is at most NEW_TEMPLATE_MAX_AGE days old
return (age <= NEW_TEMPLATE_MAX_AGE);
} else {
return false;
}
return false;
}
export default {
@@ -1,4 +1,4 @@
export type LabelType = "text" | "number" | "boolean" | "date" | "datetime" | "time" | "url" | "color";
export type LabelType = "text" | "textarea" | "number" | "boolean" | "date" | "datetime" | "time" | "url" | "color";
type Multiplicity = "single" | "multi";
export interface DefinitionObject {
@@ -17,7 +17,7 @@ function parse(value: string) {
for (const token of tokens) {
if (token === "promoted") {
defObj.isPromoted = true;
} else if (["text", "number", "boolean", "date", "datetime", "time", "url", "color"].includes(token)) {
} else if (["text", "textarea", "number", "boolean", "date", "datetime", "time", "url", "color"].includes(token)) {
defObj.labelType = token as LabelType;
} else if (["single", "multi"].includes(token)) {
defObj.multiplicity = token as Multiplicity;
+4
View File
@@ -18,6 +18,10 @@ async function render(note: FNote, $el: JQuery<HTMLElement>, onError?: ErrorHand
for (const renderNoteId of renderNoteIds) {
const bundle = await server.postWithSilentInternalServerError<Bundle>(`script/bundle/${renderNoteId}`);
if (!bundle) {
throw new Error(`Script note '${renderNoteId}' could not be loaded. It may be protected and require an active protected session.`);
}
const $scriptContainer = $("<div>");
$el.append($scriptContainer);
+87 -11
View File
@@ -1,3 +1,4 @@
import { t } from "./i18n.js";
import utils, { isShare } from "./utils.js";
import ValidationError from "./validation_error.js";
@@ -32,8 +33,7 @@ async function getHeaders(headers?: Headers) {
return {};
}
const appContext = (await import("../components/app_context.js")).default;
const activeNoteContext = appContext.tabManager ? appContext.tabManager.getActiveContext() : null;
const activeNoteContext = glob.appContext?.tabManager ? glob.appContext.tabManager.getActiveContext() : null;
// headers need to be lowercase because node.js automatically converts them to lower case
// also avoiding using underscores instead of dashes since nginx filters them out by default
@@ -89,21 +89,33 @@ async function remove<T>(url: string, componentId?: string) {
return await call<T>("DELETE", url, componentId);
}
async function upload(url: string, fileToUpload: File, componentId?: string) {
async function upload(url: string, fileToUpload: File, componentId?: string, method = "PUT") {
const formData = new FormData();
formData.append("upload", fileToUpload);
return await $.ajax({
const doUpload = async () => $.ajax({
url: window.glob.baseApiUrl + url,
headers: await getHeaders(componentId ? {
"trilium-component-id": componentId
} : undefined),
data: formData,
type: "PUT",
type: method,
timeout: 60 * 60 * 1000,
contentType: false, // NEEDED, DON'T REMOVE THIS
processData: false // NEEDED, DON'T REMOVE THIS
});
try {
return await doUpload();
} catch (e: unknown) {
// jQuery rejects with the jqXHR object
const jqXhr = e as JQuery.jqXHR;
if (jqXhr?.status && isCsrfError(jqXhr.status, jqXhr.responseText)) {
await refreshCsrfToken();
return await doUpload();
}
throw e;
}
}
let idCounter = 1;
@@ -112,12 +124,55 @@ const idToRequestMap: Record<string, RequestData> = {};
let maxKnownEntityChangeId = 0;
let csrfRefreshInProgress: Promise<void> | null = null;
/**
* Re-fetches /bootstrap to obtain a fresh CSRF token. This is needed when the
* server session expires (e.g. mobile tab backgrounded for a long time) and the
* existing CSRF token is no longer valid.
*
* Coalesces concurrent calls so only one bootstrap request is in-flight at a time.
*/
async function refreshCsrfToken(): Promise<void> {
if (csrfRefreshInProgress) {
return csrfRefreshInProgress;
}
csrfRefreshInProgress = (async () => {
try {
const response = await fetch(`./bootstrap${window.location.search}`, { cache: "no-store" });
if (response.ok) {
const json = await response.json();
glob.csrfToken = json.csrfToken;
}
} finally {
csrfRefreshInProgress = null;
}
})();
return csrfRefreshInProgress;
}
function isCsrfError(status: number, responseText: string): boolean {
if (status !== 403) {
return false;
}
try {
const body = JSON.parse(responseText);
return body.message === "Invalid CSRF token";
} catch {
return false;
}
}
interface CallOptions {
data?: unknown;
silentNotFound?: boolean;
silentInternalServerError?: boolean;
// If `true`, the value will be returned as a string instead of a JavaScript object if JSON, XMLDocument if XML, etc.
raw?: boolean;
/** Used internally to prevent infinite retry loops on CSRF refresh. */
csrfRetried?: boolean;
}
async function call<T>(method: string, url: string, componentId?: string, options: CallOptions = {}) {
@@ -167,7 +222,7 @@ function ajax(url: string, method: string, data: unknown, headers: Headers, opts
type: method,
headers,
timeout: 60000,
success: (body, textStatus, jqXhr) => {
success: (body, _textStatus, jqXhr) => {
const respHeaders: Headers = {};
jqXhr
@@ -192,12 +247,34 @@ function ajax(url: string, method: string, data: unknown, headers: Headers, opts
// don't report requests that are rejected by the browser, usually when the user is refreshing or going to a different page.
rej("rejected by browser");
return;
} else if (opts.silentNotFound && jqXhr.status === 404) {
}
// If the CSRF token is stale (e.g. session expired while tab was backgrounded),
// refresh it and retry the request once.
if (!opts.csrfRetried && isCsrfError(jqXhr.status, jqXhr.responseText)) {
try {
await refreshCsrfToken();
// Rebuild headers so the fresh glob.csrfToken is picked up
const retryHeaders = await getHeaders({ "trilium-component-id": headers["trilium-component-id"] });
const retryResult = await ajax(url, method, data, retryHeaders, { ...opts, csrfRetried: true });
res(retryResult);
return;
} catch (retryErr) {
rej(retryErr);
return;
}
}
if (opts.silentNotFound && jqXhr.status === 404) {
// report nothing
} else if (opts.silentInternalServerError && jqXhr.status === 500) {
// report nothing
} else {
await reportError(method, url, jqXhr.status, jqXhr.responseText);
try {
await reportError(method, url, jqXhr.status, jqXhr.responseText);
} catch {
// reportError may throw (e.g. ValidationError); ensure rej() is still called below.
}
}
rej(jqXhr.responseText);
@@ -267,6 +344,7 @@ async function reportError(method: string, url: string, statusCode: number, resp
} catch (e) {}
}
// Dynamic import to avoid circular dependency (toast → app_context → options → server).
const toastService = (await import("./toast.js")).default;
const messageStr = (typeof message === "string" ? message : JSON.stringify(message)) || "-";
@@ -280,7 +358,6 @@ async function reportError(method: string, url: string, statusCode: number, resp
...response
});
} else {
const { t } = await import("./i18n.js");
if (statusCode === 400 && (url.includes("%23") || url.includes("%2F"))) {
toastService.showPersistent({
id: "trafik-blocked",
@@ -294,8 +371,7 @@ async function reportError(method: string, url: string, statusCode: number, resp
t("server.unknown_http_error_content", { statusCode, method, url, message: messageStr }),
15_000);
}
const { logError } = await import("./ws.js");
logError(`${statusCode} ${method} ${url} - ${message}`);
window.logError(`${statusCode} ${method} ${url} - ${message}`);
}
}
@@ -0,0 +1,87 @@
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import SpacedUpdate from "./spaced_update";
// Mock logError which is a global in Trilium
vi.stubGlobal("logError", vi.fn());
describe("SpacedUpdate", () => {
beforeEach(() => {
vi.useFakeTimers();
});
afterEach(() => {
vi.useRealTimers();
});
it("should only call updater once per interval even with multiple pending callbacks", async () => {
const updater = vi.fn(async () => {
// Simulate a slow network request - this is where the race condition occurs
await new Promise((resolve) => setTimeout(resolve, 100));
});
const spacedUpdate = new SpacedUpdate(updater, 50);
// Simulate rapid typing - each keystroke calls scheduleUpdate()
// This queues multiple setTimeout callbacks due to recursive scheduleUpdate() calls
for (let i = 0; i < 10; i++) {
spacedUpdate.scheduleUpdate();
// Small delay between keystrokes
await vi.advanceTimersByTimeAsync(5);
}
// Advance time past the update interval to trigger the update
await vi.advanceTimersByTimeAsync(100);
// Let the "network request" complete and any pending callbacks run
await vi.advanceTimersByTimeAsync(200);
// The updater should have been called only ONCE, not multiple times
// With the bug, multiple pending setTimeout callbacks would all pass the time check
// during the async updater call and trigger multiple concurrent requests
expect(updater).toHaveBeenCalledTimes(1);
});
it("should call updater again if changes occur during the update", async () => {
const updater = vi.fn(async () => {
await new Promise((resolve) => setTimeout(resolve, 50));
});
const spacedUpdate = new SpacedUpdate(updater, 30);
// First update
spacedUpdate.scheduleUpdate();
await vi.advanceTimersByTimeAsync(40);
// Schedule another update while the first one is in progress
spacedUpdate.scheduleUpdate();
// Let first update complete
await vi.advanceTimersByTimeAsync(60);
// Advance past the interval again for the second update
await vi.advanceTimersByTimeAsync(100);
// Should have been called twice - once for each distinct change period
expect(updater).toHaveBeenCalledTimes(2);
});
it("should restore changed flag on error so retry can happen", async () => {
const updater = vi.fn()
.mockRejectedValueOnce(new Error("Network error"))
.mockResolvedValue(undefined);
const spacedUpdate = new SpacedUpdate(updater, 50);
spacedUpdate.scheduleUpdate();
// Advance to trigger first update (which will fail)
await vi.advanceTimersByTimeAsync(60);
// The error should have restored the changed flag, so scheduling again should work
spacedUpdate.scheduleUpdate();
await vi.advanceTimersByTimeAsync(60);
expect(updater).toHaveBeenCalledTimes(2);
});
});
+23 -9
View File
@@ -12,6 +12,7 @@ export default class SpacedUpdate {
private updateInterval: number;
private changeForbidden?: boolean;
private stateCallback?: StateCallback;
private lastState: SaveState = "saved";
constructor(updater: Callback, updateInterval = 1000, stateCallback?: StateCallback) {
this.updater = updater;
@@ -24,7 +25,7 @@ export default class SpacedUpdate {
scheduleUpdate() {
if (!this.changeForbidden) {
this.changed = true;
this.stateCallback?.("unsaved");
this.onStateChanged("unsaved");
setTimeout(() => this.triggerUpdate());
}
}
@@ -34,12 +35,12 @@ export default class SpacedUpdate {
this.changed = false; // optimistic...
try {
this.stateCallback?.("saving");
this.onStateChanged("saving");
await this.updater();
this.stateCallback?.("saved");
this.onStateChanged("saved");
} catch (e) {
this.changed = true;
this.stateCallback?.("error");
this.onStateChanged("error");
logError(getErrorMessage(e));
throw e;
}
@@ -76,22 +77,35 @@ export default class SpacedUpdate {
}
if (Date.now() - this.lastUpdated > this.updateInterval) {
this.stateCallback?.("saving");
// Update these BEFORE the async call to prevent race conditions.
// Multiple setTimeout callbacks may be pending from recursive scheduleUpdate() calls.
// Without this, they would all pass the time check during the await and trigger multiple requests.
this.lastUpdated = Date.now();
this.changed = false;
this.onStateChanged("saving");
try {
await this.updater();
this.stateCallback?.("saved");
this.changed = false;
this.onStateChanged("saved");
} catch (e) {
this.stateCallback?.("error");
// Restore changed flag on error so a retry can happen
this.changed = true;
this.onStateChanged("error");
logError(getErrorMessage(e));
}
this.lastUpdated = Date.now();
} else {
// update isn't triggered but changes are still pending, so we need to schedule another check
this.scheduleUpdate();
}
}
onStateChanged(state: SaveState) {
if (state === this.lastState) return;
this.stateCallback?.(state);
this.lastState = state;
}
async allowUpdateWithoutChange(callback: Callback) {
this.changeForbidden = true;
@@ -9,6 +9,27 @@ import { isShare } from "./utils.js";
let highlightingLoaded = false;
// Highlight.js can spend tens of milliseconds per block (php/c# are especially slow).
// The Markdown live preview replaces the entire rendered DOM on every keystroke, so the
// same unchanged code blocks would otherwise be re-highlighted continuously. Cache the
// output keyed by (language, text) so repeat renders short-circuit to a plain innerHTML
// assignment. FIFO eviction keeps memory bounded without needing an LRU.
const HIGHLIGHT_CACHE_MAX = 256;
const highlightCache = new Map<string, string>();
function getCachedHighlight(language: string, text: string) {
return highlightCache.get(`${language}\x00${text}`);
}
function setCachedHighlight(language: string, text: string, value: string) {
const key = `${language}\x00${text}`;
if (highlightCache.size >= HIGHLIGHT_CACHE_MAX) {
const oldest = highlightCache.keys().next().value;
if (oldest !== undefined) highlightCache.delete(oldest);
}
highlightCache.set(key, value);
}
/**
* Identifies all the code blocks (as `pre code`) under the specified hierarchy and uses the highlight.js library to obtain the highlighted text which is then applied on to the code blocks.
* Additionally, adds a "Copy to clipboard" button.
@@ -33,6 +54,14 @@ export async function formatCodeBlocks($container: JQuery<HTMLElement>) {
applySingleBlockSyntaxHighlight($(codeBlock), normalizedMimeType);
}
}
// Add click-to-copy for inline code (code elements not inside pre)
if (glob.device !== "print") {
const inlineCodeElements = $container.find("code:not(pre code)");
for (const inlineCode of inlineCodeElements) {
applyInlineCodeCopy($(inlineCode));
}
}
}
export function applyCopyToClipboardButton($codeBlock: JQuery<HTMLElement>) {
@@ -51,6 +80,23 @@ export function applyCopyToClipboardButton($codeBlock: JQuery<HTMLElement>) {
$codeBlock.parent().append($copyButton);
}
export function applyInlineCodeCopy($inlineCode: JQuery<HTMLElement>) {
$inlineCode
.addClass("copyable-inline-code")
.attr("title", t("code_block.click_to_copy"))
.off("click")
.on("click", (e) => {
e.stopPropagation();
const text = $inlineCode.text();
if (!isShare) {
copyTextWithToast(text);
} else {
copyText(text);
}
});
}
/**
* Applies syntax highlight to the given code block (assumed to be <pre><code>), using highlight.js.
*/
@@ -58,6 +104,12 @@ export async function applySingleBlockSyntaxHighlight($codeBlock: JQuery<HTMLEle
$codeBlock.parent().toggleClass("hljs");
const text = $codeBlock.text();
const cached = getCachedHighlight(normalizedMimeType, text);
if (cached !== undefined) {
$codeBlock.html(cached);
return;
}
let highlightedText: HighlightResult | AutoHighlightResult | null = null;
if (normalizedMimeType === mime_types.MIME_TYPE_AUTO && !isShare) {
await ensureMimeTypesForHighlighting();
@@ -72,6 +124,7 @@ export async function applySingleBlockSyntaxHighlight($codeBlock: JQuery<HTMLEle
}
if (highlightedText) {
setCachedHighlight(normalizedMimeType, text, highlightedText.value);
$codeBlock.html(highlightedText.value);
}
}
+35
View File
@@ -0,0 +1,35 @@
export function getThemeStyle(): "auto" | "light" | "dark" {
const configuredTheme = window.glob?.theme;
if (configuredTheme === "auto" || configuredTheme === "next") {
return "auto";
}
if (configuredTheme === "light" || configuredTheme === "dark") {
return configuredTheme;
}
if (configuredTheme === "next-light") {
return "light";
}
if (configuredTheme === "next-dark") {
return "dark";
}
const style = window.getComputedStyle(document.body);
const themeStyle = style.getPropertyValue("--theme-style");
if (style.getPropertyValue("--theme-style-auto") !== "true" && (themeStyle === "light" || themeStyle === "dark")) {
return themeStyle as "light" | "dark";
}
return "auto";
}
export function getEffectiveThemeStyle(): "light" | "dark" {
const themeStyle = getThemeStyle();
if (themeStyle === "auto") {
return window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
}
return themeStyle === "dark" ? "dark" : "light";
}
+5 -46
View File
@@ -360,7 +360,8 @@ function copySelectionToClipboard() {
type dynamicRequireMappings = {
"@electron/remote": typeof import("@electron/remote"),
"electron": typeof import("electron"),
"child_process": typeof import("child_process")
"child_process": typeof import("child_process"),
"url": typeof import("url")
};
export function dynamicRequire<T extends keyof dynamicRequireMappings>(moduleName: T): Awaited<dynamicRequireMappings[T]>{
@@ -403,36 +404,6 @@ function initHelpDropdown($el: JQuery<HTMLElement>) {
// stop inside clicks from closing the menu
const $dropdownMenu = $el.find(".help-dropdown .dropdown-menu");
$dropdownMenu.on("click", (e) => e.stopPropagation());
// previous propagation stop will also block help buttons from being opened, so we need to re-init for this element
initHelpButtons($dropdownMenu);
}
const wikiBaseUrl = "https://triliumnext.github.io/Docs/Wiki/";
function openHelp($button: JQuery<HTMLElement>) {
if ($button.length === 0) {
return;
}
const helpPage = $button.attr("data-help-page");
if (helpPage) {
const url = wikiBaseUrl + helpPage;
window.open(url, "_blank");
}
}
async function openInAppHelp($button: JQuery<HTMLElement>) {
if ($button.length === 0) {
return;
}
const inAppHelpPage = $button.attr("data-in-app-help");
if (inAppHelpPage) {
openInAppHelpFromUrl(inAppHelpPage);
}
}
/**
@@ -455,9 +426,7 @@ export function openInAppHelpFromUrl(inAppHelpPage: string) {
export async function openInReusableSplit(targetNoteId: string, targetViewMode: ViewMode, openOpts: {
hoistedNoteId?: string;
} = {}) {
// Dynamic import to avoid import issues in tests.
const appContext = (await import("../components/app_context.js")).default;
const activeContext = appContext.tabManager.getActiveContext();
const activeContext = glob.appContext?.tabManager?.getActiveContext();
if (!activeContext) {
return;
}
@@ -467,7 +436,7 @@ export async function openInReusableSplit(targetNoteId: string, targetViewMode:
if (!existingSubcontext) {
// The target split is not already open, open a new split with it.
const { ntxId } = subContexts[subContexts.length - 1];
appContext.triggerCommand("openNewNoteSplit", {
glob.appContext?.triggerCommand("openNewNoteSplit", {
ntxId,
notePath: targetNoteId,
hoistedNoteId: openOpts.hoistedNoteId,
@@ -479,15 +448,6 @@ export async function openInReusableSplit(targetNoteId: string, targetViewMode:
}
}
function initHelpButtons($el: JQuery<HTMLElement> | JQuery<Window>) {
// for some reason, the .on(event, listener, handler) does not work here (e.g. Options -> Sync -> Help button)
// so we do it manually
$el.on("click", (e) => {
openHelp($(e.target).closest("[data-help-page]"));
openInAppHelp($(e.target).closest("[data-in-app-help]"));
});
}
function filterAttributeName(name: string) {
return name.replace(/[^\p{L}\p{N}_:]/gu, "");
}
@@ -922,6 +882,7 @@ export default {
parseDate,
formatDateISO,
formatDateTime,
formatTime,
formatTimeInterval,
formatSize,
localNowDateTime,
@@ -946,8 +907,6 @@ export default {
dynamicRequire,
timeLimit,
initHelpDropdown,
initHelpButtons,
openHelp,
filterAttributeName,
isValidAttributeName,
sleep,
+15 -19
View File
@@ -1,13 +1,15 @@
import utils from "./utils.js";
import toastService from "./toast.js";
import server from "./server.js";
import options from "./options.js";
import frocaUpdater from "./froca_updater.js";
import appContext from "../components/app_context.js";
import { t } from "./i18n.js";
import type { EntityChange } from "../server_types.js";
import { WebSocketMessage } from "@triliumnext/commons";
import appContext from "../components/app_context.js";
import type { EntityChange } from "../server_types.js";
import bundleService from "./bundle.js";
import froca from "./froca.js";
import frocaUpdater from "./froca_updater.js";
import { t } from "./i18n.js";
import options from "./options.js";
import server from "./server.js";
import toast from "./toast.js";
import utils from "./utils.js";
type MessageHandler = (message: WebSocketMessage) => void;
let messageHandlers: MessageHandler[] = [];
@@ -126,20 +128,14 @@ async function handleMessage(event: MessageEvent<any>) {
} else if (message.type === "frontend-update") {
await executeFrontendUpdate(message.data.entityChanges);
} else if (message.type === "sync-hash-check-failed") {
toastService.showError(t("ws.sync-check-failed"), 60000);
toast.showError(t("ws.sync-check-failed"), 60000);
} else if (message.type === "consistency-checks-failed") {
toastService.showError(t("ws.consistency-checks-failed"), 50 * 60000);
toast.showError(t("ws.consistency-checks-failed"), 50 * 60000);
} else if (message.type === "api-log-messages") {
appContext.triggerEvent("apiLogMessages", { noteId: message.noteId, messages: message.messages });
} else if (message.type === "toast") {
toastService.showMessage(message.message);
toast.showMessage(message.message, message.timeout);
} else if (message.type === "execute-script") {
// TODO: Remove after porting the file
// @ts-ignore
const bundleService = (await import("./bundle.js")).default as any;
// TODO: Remove after porting the file
// @ts-ignore
const froca = (await import("./froca.js")).default as any;
const originEntity = message.originEntityId ? await froca.getNote(message.originEntityId) : null;
bundleService.getAndExecuteBundle(message.currentNoteId, originEntity, message.script, message.params);
@@ -161,7 +157,7 @@ function waitForEntityChangeId(desiredEntityChangeId: number) {
return new Promise<void>((res, rej) => {
entityChangeIdReachedListeners.push({
desiredEntityChangeId: desiredEntityChangeId,
desiredEntityChangeId,
resolvePromise: res,
start: Date.now()
});
@@ -205,7 +201,7 @@ async function consumeFrontendUpdateData() {
} else {
console.log("nonProcessedEntityChanges causing the timeout", nonProcessedEntityChanges);
toastService.showError(t("ws.encountered-error", { message: e.message }));
toast.showError(t("ws.encountered-error", { message: e.message }));
}
}
+130 -54
View File
@@ -1,66 +1,107 @@
import "jquery";
import utils from "./services/utils.js";
import ko from "knockout";
// TriliumNextTODO: properly make use of below types
// type SetupModelSetupType = "new-document" | "sync-from-desktop" | "sync-from-server" | "";
// type SetupModelStep = "sync-in-progress" | "setup-type" | "new-document-in-progress" | "sync-from-desktop";
type SetupStep = "sync-in-progress" | "setup-type" | "new-document-in-progress" | "sync-from-desktop" | "sync-from-server";
type SetupType = "new-document" | "sync-from-desktop" | "sync-from-server" | "";
class SetupModel {
syncInProgress: boolean;
step: ko.Observable<string>;
setupType: ko.Observable<string>;
setupNewDocument: ko.Observable<boolean>;
setupSyncFromDesktop: ko.Observable<boolean>;
setupSyncFromServer: ko.Observable<boolean>;
syncServerHost: ko.Observable<string | undefined>;
syncProxy: ko.Observable<string | undefined>;
password: ko.Observable<string | undefined>;
class SetupController {
private step: SetupStep;
private setupType: SetupType = "";
private syncPollIntervalId: number | null = null;
private rootNode: HTMLElement;
private setupTypeForm: HTMLFormElement;
private syncFromServerForm: HTMLFormElement;
private setupTypeNextButton: HTMLButtonElement;
private setupTypeInputs: HTMLInputElement[];
private syncServerHostInput: HTMLInputElement;
private syncProxyInput: HTMLInputElement;
private passwordInput: HTMLInputElement;
private sections: Record<SetupStep, HTMLElement>;
constructor(syncInProgress: boolean) {
this.syncInProgress = syncInProgress;
this.step = ko.observable(syncInProgress ? "sync-in-progress" : "setup-type");
this.setupType = ko.observable("");
this.setupNewDocument = ko.observable(false);
this.setupSyncFromDesktop = ko.observable(false);
this.setupSyncFromServer = ko.observable(false);
this.syncServerHost = ko.observable();
this.syncProxy = ko.observable();
this.password = ko.observable();
constructor(rootNode: HTMLElement, syncInProgress: boolean) {
this.rootNode = rootNode;
this.step = syncInProgress ? "sync-in-progress" : "setup-type";
this.setupTypeForm = mustGetElement("setup-type-form", HTMLFormElement);
this.syncFromServerForm = mustGetElement("sync-from-server-form", HTMLFormElement);
this.setupTypeNextButton = mustGetElement("setup-type-next", HTMLButtonElement);
this.setupTypeInputs = Array.from(document.querySelectorAll<HTMLInputElement>("input[name='setup-type']"));
this.syncServerHostInput = mustGetElement("sync-server-host", HTMLInputElement);
this.syncProxyInput = mustGetElement("sync-proxy", HTMLInputElement);
this.passwordInput = mustGetElement("password", HTMLInputElement);
this.sections = {
"setup-type": mustGetElement("setup-type-section", HTMLElement),
"new-document-in-progress": mustGetElement("new-document-in-progress-section", HTMLElement),
"sync-from-desktop": mustGetElement("sync-from-desktop-section", HTMLElement),
"sync-from-server": mustGetElement("sync-from-server-section", HTMLElement),
"sync-in-progress": mustGetElement("sync-in-progress-section", HTMLElement)
};
}
if (this.syncInProgress) {
setInterval(checkOutstandingSyncs, 1000);
init() {
this.setupTypeForm.addEventListener("submit", (event) => {
event.preventDefault();
void this.selectSetupType();
});
this.syncFromServerForm.addEventListener("submit", (event) => {
event.preventDefault();
void this.finish();
});
for (const input of this.setupTypeInputs) {
input.addEventListener("change", () => {
this.setupType = input.value as SetupType;
this.render();
});
}
for (const backButton of document.querySelectorAll<HTMLElement>("[data-action='back']")) {
backButton.addEventListener("click", () => {
this.back();
});
}
const serverAddress = `${location.protocol}//${location.host}`;
$("#current-host").html(serverAddress);
if (this.step === "sync-in-progress") {
this.startSyncPolling();
}
this.render();
this.rootNode.style.display = "";
}
// this is called in setup.ejs
setupTypeSelected() {
return !!this.setupType();
}
private async selectSetupType() {
if (this.setupType === "new-document") {
this.setStep("new-document-in-progress");
selectSetupType() {
if (this.setupType() === "new-document") {
this.step("new-document-in-progress");
await $.post("api/setup/new-document");
window.location.replace("./setup");
return;
}
$.post("api/setup/new-document").then(() => {
window.location.replace("./setup");
});
} else {
this.step(this.setupType());
if (this.setupType) {
this.setStep(this.setupType);
}
}
back() {
this.step("setup-type");
this.setupType("");
private back() {
this.setStep("setup-type");
this.setupType = "";
for (const input of this.setupTypeInputs) {
input.checked = false;
}
this.render();
}
async finish() {
const syncServerHost = this.syncServerHost();
const syncProxy = this.syncProxy();
const password = this.password();
private async finish() {
const syncServerHost = this.syncServerHostInput.value.trim().replace(/\/+$/, "");
const syncProxy = this.syncProxyInput.value.trim();
const password = this.passwordInput.value;
if (!syncServerHost) {
showAlert("Trilium server address can't be empty");
@@ -74,21 +115,44 @@ class SetupModel {
// not using server.js because it loads too many dependencies
const resp = await $.post("api/setup/sync-from-server", {
syncServerHost: syncServerHost,
syncProxy: syncProxy,
password: password
syncServerHost,
syncProxy,
password
});
if (resp.result === "success") {
this.step("sync-in-progress");
setInterval(checkOutstandingSyncs, 1000);
hideAlert();
this.setStep("sync-in-progress");
this.startSyncPolling();
} else {
showAlert(`Sync setup failed: ${resp.error}`);
}
}
private setStep(step: SetupStep) {
this.step = step;
this.render();
}
private render() {
for (const [step, section] of Object.entries(this.sections) as [SetupStep, HTMLElement][]) {
section.style.display = step === this.step ? "" : "none";
}
this.setupTypeNextButton.disabled = !this.setupType;
}
private getSelectedSetupType(): SetupType {
return (this.setupTypeInputs.find((input) => input.checked)?.value ?? "") as SetupType;
}
private startSyncPolling() {
if (this.syncPollIntervalId !== null) {
return;
}
this.syncPollIntervalId = window.setInterval(checkOutstandingSyncs, 1000);
}
}
async function checkOutstandingSyncs() {
@@ -122,7 +186,19 @@ function getSyncInProgress() {
return !!parseInt(el.content);
}
function mustGetElement<T extends typeof HTMLElement>(id: string, ctor: T): InstanceType<T> {
const element = document.getElementById(id);
if (!element || !(element instanceof ctor)) {
throw new Error(`Expected element #${id}`);
}
return element as InstanceType<T>;
}
addEventListener("DOMContentLoaded", (event) => {
ko.applyBindings(new SetupModel(getSyncInProgress()), document.getElementById("setup-dialog"));
$("#setup-dialog").show();
const rootNode = document.getElementById("setup-dialog");
if (!rootNode || !(rootNode instanceof HTMLElement)) return;
new SetupController(rootNode, getSyncInProgress()).init();
});
+175 -12
View File
@@ -835,6 +835,7 @@ table.promoted-attributes-in-tooltip th {
text-align: start;
color: var(--main-text-color) !important;
max-width: 500px;
white-space: pre-line;
box-shadow: 10px 10px 93px -25px #aaaaaa;
}
@@ -960,15 +961,19 @@ table.promoted-attributes-in-tooltip th {
background-color: var(--active-item-background-color);
}
.help-button {
.help-button,
.custom-title-bar-button {
float: inline-end;
background: none;
font-weight: 900;
color: orange;
border: 0;
cursor: pointer;
}
.help-button {
color: orange;
}
.multiplicity {
font-size: 1.3em;
}
@@ -1147,11 +1152,90 @@ a.external:not(.no-arrow):after, a[href^="http://"]:not(.no-arrow):after, a[href
padding: 0.5rem 1rem 0.5rem 1rem !important; /* make modal header padding slightly smaller */
}
.modal-header .help-button {
.modal-header .help-button,
.modal-header .custom-title-bar-button {
padding: 6px;
margin: 0 12px;
}
.modal-content-with-sidebar {
flex-direction: row !important;
}
.modal-content-with-sidebar > .modal-sidebar {
display: flex;
flex-direction: column;
border-right: 1px solid var(--main-border-color);
flex-shrink: 0;
min-height: 0;
}
.modal-content-with-sidebar .modal-sidebar-header {
padding: 0.75rem 1rem;
flex-shrink: 0;
text-align: center;
border-bottom: 1px solid var(--main-border-color);
}
.modal-content-with-sidebar .modal-sidebar-header h5 {
margin: 0;
font-size: 1em;
}
.modal-content-with-sidebar > .modal-main > .modal-header > .modal-title {
visibility: hidden;
flex-grow: 1;
width: 0;
padding: 0;
margin: 0;
overflow: hidden;
}
.modal-content-with-sidebar > .modal-main > .modal-header {
flex-wrap: nowrap;
}
.modal-content-with-sidebar > .modal-main {
display: flex;
flex-direction: column;
flex-grow: 1;
min-width: 0;
min-height: 0;
overflow: hidden;
}
.modal-content-with-sidebar > .modal-main > .modal-body {
overflow: auto;
flex-grow: 1;
min-height: 0;
}
body.mobile .modal-content-with-sidebar {
flex-direction: column !important;
}
body.mobile .modal-content-with-sidebar > .modal-sidebar {
border-right: none;
border-bottom: 1px solid var(--main-border-color);
height: 30vh;
flex-shrink: 0;
overflow: hidden;
order: 1;
}
body.mobile .modal-content-with-sidebar > .modal-main {
order: 0;
}
body.mobile .modal-content-with-sidebar .modal-sidebar-header {
display: none;
}
body.mobile .modal-content-with-sidebar > .modal-main > .modal-header > .modal-title {
visibility: visible;
width: auto;
}
.ck-mentions .ck-button {
font-size: var(--detail-font-size) !important;
padding: 5px;
@@ -1230,6 +1314,43 @@ a.external:not(.no-arrow):after, a[href^="http://"]:not(.no-arrow):after, a[href
width: 100%;
}
/* Expandable include note styles */
.include-note-title-row {
display: flex;
align-items: center;
gap: 5px;
cursor: pointer;
}
.include-note-title-row .include-note-title {
margin: 0;
}
.include-note-toggle {
background: none;
border: none;
padding: 2px;
cursor: pointer;
font-size: 1.2em;
color: var(--main-text-color);
transition: transform 0.2s ease;
display: flex;
align-items: center;
justify-content: center;
}
.include-note-toggle:hover {
color: var(--main-link-color);
}
.include-note-toggle.expanded {
transform: rotate(90deg);
}
.include-note[data-box-size="expandable"] .include-note-content {
margin-top: 10px;
}
.alert {
padding: 8px 14px;
width: auto;
@@ -1612,11 +1733,7 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu {
}
body.mobile #launcher-container {
justify-content: center;
}
body.mobile #launcher-container button {
margin: 0 16px;
justify-content: space-evenly;
}
body.mobile .modal.show {
@@ -1633,6 +1750,22 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu {
display: flex;
}
body.mobile .modal-dialog.modal-dialog-full-page-on-mobile {
width: 100%;
height: 100%;
max-height: unset;
max-width: unset;
.modal-content {
border-radius: 0;
border: 0;
.modal-body {
overflow: scroll;
}
}
}
body.mobile .modal-content {
overflow-y: auto;
border-radius: var(--bs-modal-border-radius) var(--bs-modal-border-radius) 0 0;
@@ -1647,7 +1780,7 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu {
display: inline !important;
}
body.mobile .options-section table {
body.mobile .options-section-card table {
word-break: break-all;
}
@@ -1754,10 +1887,13 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu {
justify-content: space-between;
align-items: baseline;
font-weight: bold;
text-transform: uppercase;
color: var(--muted-text-color) !important;
}
#right-pane .card-header-title {
text-transform: uppercase;
}
#right-pane .card-header-buttons {
display: flex;
transform: scale(0.9);
@@ -1824,12 +1960,12 @@ button.close:hover {
margin-bottom: 15px;
}
.options-section h5 {
.options-section-card h5 {
margin-top: 10px;
margin-bottom: 10px;
}
.options-section input[type="number"] {
.options-section-card input[type="number"] {
/* overriding settings from .form-control */
width: 10em !important;
flex-grow: 0 !important;
@@ -2642,3 +2778,30 @@ iframe.print-iframe {
min-height: 50px;
align-items: center;
}
.ocr-text-section {
padding: 10px;
background: var(--accented-background-color);
border-left: 3px solid var(--main-border-color);
text-align: left;
width: 100%;
}
.ocr-header {
font-weight: bold;
margin-bottom: 8px;
font-size: 0.9em;
color: var(--muted-text-color);
}
.ocr-content {
max-height: 150px;
overflow-y: auto;
font-size: 0.9em;
line-height: 1.4;
white-space: pre-wrap;
}
.ck-content pre code {
tab-size: var(--code-block-tab-width, 4);
}
@@ -278,9 +278,9 @@
--help-card-background: var(--card-background-color);
--help-card-shadow: 2px 2px 2px rgba(0, 0, 0, 0.2);
--help-card-heading-color: #959595;
--help-kbd-shortcut-color: white;
--help-kbd-shortcut-background: #676767;
--help-kbd-shortcut-shadow: 1px 1px 2px rgba(0, 0, 0, 0.7);
--help-kbd-shortcut-color: #e0e0e0;
--help-kbd-shortcut-background: #4a4a4a;
--help-kbd-shortcut-border: #3a3a3a;
--help-code-color: inherit;
--help-code-background: #565656;
@@ -269,17 +269,17 @@
--timeline-connector-active-color: #ddd;
--timeline-connector-hover-blend-mode: multiply;
--tooltip-background-color: rgba(255, 255, 255, 0.85);
--tooltip-foreground-color: #000000ba;
--tooltip-shadow-color: rgba(0, 0, 0, 0.15);
--tooltip-background-color: rgba(0, 0, 0, 0.818);
--tooltip-foreground-color: #ffffffeb;
--tooltip-shadow-color: rgba(0, 0, 0, 0.2);
--help-background-color: #fffc;
--help-card-background: var(--card-background-color);
--help-card-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1);
--help-card-heading-color: #797979;
--help-kbd-shortcut-color: #3f3f3f;
--help-kbd-shortcut-background: white;
--help-kbd-shortcut-shadow: 1px 1px 2px rgba(0, 0, 0, 0.3);
--help-kbd-shortcut-background: #f5f5f5;
--help-kbd-shortcut-border: #c9c9c9;
--help-code-color: black;
--help-code-background: #d7d5d5;
@@ -1,11 +0,0 @@
/* Import the light color scheme.
* This is the base color scheme, always active and overridden by the dark
* color scheme stylesheet when necessary. */
@import url(./theme-next-light.css);
/* Import the dark color scheme when the system preference is set to dark mode */
@import url(./theme-next-dark.css) (prefers-color-scheme: dark);
:root {
--theme-style-auto: true;
}
@@ -544,14 +544,11 @@ li.dropdown-item a.dropdown-item-button:focus-visible {
vertical-align: middle;
}
#toast-container .toast .toast-header .btn-close {
#toast-container .toast .toast-header .btn-close,
#toast-container .toast .toast-close .btn-close {
margin: 0 0 0 12px;
}
#toast-container .toast.no-title {
flex-direction: row;
}
#toast-container .toast .toast-body {
flex-grow: 1;
overflow: hidden;
@@ -675,10 +672,11 @@ li.dropdown-item a.dropdown-item-button:focus-visible {
div.alert {
margin-bottom: 8px;
background: var(--alert-bar-background) !important;
color: var(--main-text-color);
border-radius: 8px;
font-size: .85em;
}
div.alert p + p {
margin-block: 1em 0;
}
}
@@ -26,7 +26,8 @@
.modal .modal-header .btn-close,
.modal .modal-header .help-button,
.modal .modal-header .custom-title-bar-button,
#toast-container .toast .toast-header .btn-close {
#toast-container .toast .toast-header .btn-close,
#toast-container .toast .toast-close .btn-close {
display: flex;
justify-content: center;
align-items: center;
@@ -46,12 +47,14 @@
}
.modal .modal-header .btn-close,
#toast-container .toast .toast-header .btn-close {
#toast-container .toast .toast-header .btn-close,
#toast-container .toast .toast-close .btn-close {
--modal-control-button-hover-background: var(--modal-close-button-hover-background);
}
.modal .modal-header .btn-close::after,
#toast-container .toast .toast-header .btn-close::after {
#toast-container .toast .toast-header .btn-close::after,
#toast-container .toast .toast-close .btn-close::after {
content: "\ec8d";
font-family: boxicons;
}
@@ -67,7 +70,8 @@
.modal .modal-header .btn-close:hover,
.modal .modal-header .help-button:hover,
.modal .modal-header .custom-title-bar-button:hover,
#toast-container .toast .toast-header .btn-close:hover {
#toast-container .toast .toast-header .btn-close:hover,
#toast-container .toast .toast-close .btn-close:hover {
background: var(--modal-control-button-hover-background);
color: var(--modal-control-button-hover-color);
}
@@ -75,19 +79,22 @@
.modal .modal-header .btn-close:active,
.modal .modal-header .help-button:active,
.modal .modal-header .custom-title-bar-button:active,
#toast-container .toast .toast-header .btn-close:active {
#toast-container .toast .toast-header .btn-close:active,
#toast-container .toast .toast-close .btn-close:active {
transform: scale(.85);
}
.modal .modal-header .btn-close:focus,
.modal .modal-header .help-button:focus,
#toast-container .toast .toast-header .btn-close:focus {
#toast-container .toast .toast-header .btn-close:focus,
#toast-container .toast .toast-close .btn-close:focus {
box-shadow: none !important;
}
.modal .modal-header .btn-close:focus-visible,
.modal .modal-header .help-button:focus-visible,
#toast-container .toast .toast-header .btn-close:focus-visible {
#toast-container .toast .toast-header .btn-close:focus-visible,
#toast-container .toast .toast-close .btn-close:focus-visible {
outline: 2px solid var(--input-focus-outline-color);
outline-offset: 2px;
}
@@ -366,15 +373,23 @@ div.tn-tool-dialog {
/* Keyboard shortcut */
.help-dialog .help-cards kbd,
.ck-content kbd {
box-shadow: var(--help-kbd-shortcut-shadow);
margin: 0 4px;
border: none;
border-radius: 4px;
padding: 2px 10px;
display: inline-block;
margin: 0 2px 2px !important;
border: 1px solid var(--help-kbd-shortcut-border);
border-radius: 5px;
padding: 2px 8px;
background: var(--help-kbd-shortcut-background);
box-shadow:
0 2px 0 var(--help-kbd-shortcut-border),
inset 0 -1px 0 var(--help-kbd-shortcut-border);
color: var(--help-kbd-shortcut-color);
font-weight: 500;
font-family: var(--main-font-family) !important;
font-size: 0.75em;
font-weight: normal;
line-height: 1.4;
letter-spacing: 0.5pt;
vertical-align: 1px;
white-space: nowrap;
}
.help-dialog .help-cards kbd:first-child {
@@ -21,6 +21,20 @@ button.ck.ck-button:is(.ck-button-action, .ck-button-save, .ck-button-cancel, .c
&.dropdown-toggle-split {
min-width: unset;
}
.btn-group > & {
border-radius: 0;
}
.btn-group > &:first-child {
border-start-start-radius: 6px;
border-end-start-radius: 6px;
}
.btn-group > &:last-child {
border-start-end-radius: 6px;
border-end-end-radius: 6px;
}
}
button.btn.btn-primary:hover,
@@ -117,11 +131,16 @@ button.tn-low-profile:hover {
color: var(--icon-button-color);
}
:root .btn-group .icon-action:last-child {
:root .btn-group .icon-action:not(:first-child) {
border-top-left-radius: unset !important;
border-bottom-left-radius: unset !important;
}
:root .btn-group .icon-action:not(:last-child) {
border-top-right-radius: unset !important;
border-bottom-right-radius: unset !important;
}
.btn-group .tn-tool-button + .tn-tool-button {
margin-inline-start: 4px !important;
}
@@ -635,6 +635,7 @@ html .note-detail-editable-text :not(figure, .include-note, hr):first-child {
inset-inline-end: 0.35em;
}
.ck-content h1,
.ck-content h2,
.ck-content h3,
.ck-content h4,
@@ -694,7 +695,7 @@ html .note-detail-editable-text :not(figure, .include-note, hr):first-child {
outline: none;
box-shadow: 0 0 0 2px var(--link-selection-outline-color);
background: var(--link-hover-background);
}
}
/* Reference link */
@@ -713,6 +714,15 @@ html .note-detail-editable-text :not(figure, .include-note, hr):first-child {
text-decoration: underline;
}
.ck-content a.reference-link small {
margin-left: 0.25em;
opacity: 0.5;
>span {
font-size: 0.7em;
}
}
/*
* Read-only text content
*/
@@ -186,12 +186,7 @@ body.experimental-feature-new-layout .note-detail-content-widget-content.options
}
.options-section:not(.tn-no-card) {
margin-bottom: calc(var(--options-title-offset) + 26px) !important;
box-shadow: var(--card-box-shadow);
border: 1px solid var(--card-border-color) !important;
border-radius: 8px;
background: var(--card-background-color);
padding: var(--options-card-padding);
margin-bottom: 26px !important;
}
body.desktop .options-section:not(.tn-no-card) {
@@ -199,40 +194,70 @@ body.desktop .options-section:not(.tn-no-card) {
max-width: var(--options-card-max-width);
}
.options-section-card {
box-shadow: var(--card-box-shadow);
border: 1px solid var(--card-border-color);
border-radius: 8px;
background: var(--card-background-color);
padding: var(--options-card-padding);
}
.note-detail-content-widget-content.options {
--default-padding: 15px;
padding-top: calc(var(--default-padding) + var(--options-title-offset) + var(--options-title-font-size));
padding-top: var(--default-padding);
padding-bottom: var(--default-padding);
}
.options-section:not(.tn-no-card) h4,
.options-section:not(.tn-no-card) h5 {
.options-section:not(.tn-no-card) h4 {
text-transform: uppercase;
letter-spacing: .4pt;
}
.options-section:not(.tn-no-card) h4 {
font-size: var(--options-title-font-size);
font-weight: 600;
color: var(--launcher-pane-text-color);
margin-top: calc(-1 * var(--options-card-padding) - var(--options-title-font-size) - var(--options-title-offset)) !important;
margin-bottom: calc(var(--options-title-offset) + var(--options-card-padding)) !important;
margin-inline-start: calc(-1 * var(--options-card-padding));
margin-top: 0;
margin-bottom: var(--options-title-offset);
}
.options-section:not(.tn-no-card) h5 {
.options-section:not(.tn-no-card) .options-section-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 8px;
}
.options-section:not(.tn-no-card) .options-section-header h4 {
margin: 0;
margin-bottom: 0;
}
.options-section:not(.tn-no-card) .options-section-header .icon-action {
margin-inline-start: auto;
}
.options-section-description {
color: var(--muted-text-color);
font-size: 13px;
margin-top: 0;
margin-bottom: 16px;
}
.options-section-card h5 {
text-transform: uppercase;
letter-spacing: .4pt;
font-size: var(--options-title-font-size);
font-weight: bold;
margin-top: 1em !important;
margin-bottom: unset !important;
}
.options-section:not(.tn-no-card) h5:first-of-type {
.options-section-card h5:first-of-type {
margin-top: unset !important;
}
.options-section hr {
.options-section-card hr {
--bs-border-width: 2px;
margin-inline-start: calc(var(--options-card-padding) * -1);
@@ -241,27 +266,26 @@ body.desktop .options-section:not(.tn-no-card) {
color: var(--root-background);
}
.options-section p:last-of-type:not(:first-of-type),
.options-section h4 + p:last-child,
.options-section .existing-anonymized-databases {
.options-section-card p:last-of-type:not(:first-of-type),
.options-section-card .existing-anonymized-databases {
margin-bottom: 0;
}
.options-section .form-group {
.options-section-card .form-group {
margin-bottom: 1em;
}
.options-section .form-group:last-child {
.options-section-card .form-group:last-child {
margin-bottom: 0;
}
.options-section ul {
.options-section-card ul {
margin: 0;
padding: 0;
margin-bottom: 1em;
}
.options-section label:not(.tn-checkbox):not(.tn-radio) {
.options-section-card label:not(.tn-checkbox):not(.tn-radio) {
margin-bottom: 6px;
}
@@ -275,7 +299,7 @@ nav.options-section-tabs .nav-tabs {
border-bottom: 0;
}
nav.options-section-tabs + .options-section {
nav.options-section-tabs + .options-section .options-section-card {
border-top-left-radius: 0;
border-top-right-radius: 0;
}
@@ -329,3 +353,9 @@ nav.options-section-tabs + .options-section {
.etapi-options-section div {
height: auto !important;
}
/* BACKUP */
.options-section-card table a {
color: inherit;
}
-11
View File
@@ -1,11 +0,0 @@
/* Import the light color scheme.
* This is the base color scheme, always active and overridden by the dark
* color scheme stylesheet when necessary. */
@import url(./theme-light.css);
/* Import the dark color scheme when the system preference is set to dark mode */
@import url(./theme-dark.css) (prefers-color-scheme: dark);
:root {
--theme-style-auto: true;
}
@@ -1,13 +1,6 @@
{
"about": {
"title": "حول تريليوم للملاحظات",
"homepage": "الصفحة الرئيسية:",
"app_version": "اصدار التطبيق:",
"sync_version": "اصدار المزامنه:",
"build_date": "تاريخ الانشاء:",
"build_revision": "مراجعة الاصدار:",
"data_directory": "مجلد البيانات:",
"db_version": "اصدار قاعدة البيانات:"
"data_directory": "مجلد البيانات:"
},
"toast": {
"critical-error": {
@@ -373,7 +366,6 @@
"theme_defined": "النسق المحدد",
"main_font": "الخط الرئيسي",
"font_family": "عائلة الخطوط",
"reload_frontend": "اعادة تحميل الواجهة",
"generic-fonts": "الخطوط العامة",
"sans-serif": "خطوط بدون زوائد",
"system-default": "الاعداد الافتراضي للنظام",
@@ -393,9 +385,7 @@
},
"delete_notes": {
"close": "غلق",
"cancel": "الغاء",
"ok": "نعم",
"delete_notes_preview": "حذف معاينة الملاحظات"
"cancel": "الغاء"
},
"export": {
"close": "غلق",
@@ -487,26 +477,6 @@
"start_button": "بدء جلسة محمية",
"help_title": "مساعدة حول الملاحظات المحمية"
},
"revisions": {
"delete_button": "حذف",
"download_button": "تنزيل",
"restore_button": "أستعادة",
"note_revisions": "مراجعات الملاحظة",
"diff_on": "عرض الفروقات",
"diff_off": "عرض المحتوى",
"file_size": "حجم الملف:",
"mime": "MIME: ",
"delete_all_button": "حذف كل المراجعات",
"settings": "اعدادات مراجعة الملاحظة",
"diff_not_available": "المقارنة غير متوفرة.",
"help_title": "مساعدة حول مراجعات الملاحظة",
"diff_off_hint": "انقر لعرض محتويات الملاحظة",
"revisions_deleted": "تم حذف جميع نسخ المراجعات للملاحظة.",
"revision_restored": "تم استعادة نسخ المراجعة للملاحظة.",
"revision_deleted": "تم حذف مراجعة الملاحظة.",
"snapshot_interval": "فاصل زمني لحفظ لقطات اصدارات المراجعة: {{seconds}}",
"maximum_revisions": "حد عدد لقطات اصدارات الملاحظة: {{number}}"
},
"sort_child_notes": {
"title": "عنوان",
"ascending": "تصاعدي",
@@ -626,7 +596,8 @@
"date-and-time": "التاريخ والوقت",
"no_backup_yet": "لايوجد نسخة احتياطية لحد الان",
"enable_daily_backup": "تمكين النسخ الاحتياطي اليومي",
"backup_database_now": "نسخ اختياطي لقاعدة البيانات الان"
"backup_database_now": "نسخ اختياطي لقاعدة البيانات الان",
"download": "تنزيل"
},
"etapi": {
"created": "تم الأنشاء",
@@ -663,8 +634,6 @@
"default_shortcuts": "اختصارات افتراضية"
},
"sync_2": {
"timeout_unit": "ميلي ثانية",
"note": "ملاحظة",
"save": "حفظ",
"help": "المساعدة",
"config_title": "تهيئة المزامنة",
@@ -803,12 +772,13 @@
"web-view": "عرض الويب",
"mind-map": "خريطة ذهنية",
"geo-map": "خريطة جغرافية",
"task-list": "قائمة المهام"
"task-list": "قائمة المهام",
"spreadsheet": "جدول البيانات"
},
"shared_switch": {
"shared": "مشترك",
"toggle-on-title": "مشاركة الملاحظة",
"toggle-off-title": "الغاء مشاركة الملاحظة"
"toggle-off-title": "إلغاء مشاركة الملاحظة"
},
"template_switch": {
"template": "قالب"
@@ -1068,7 +1038,6 @@
"rename_note": "اعادة تسمية الملاحظة",
"remove_relation": "حذف العلاقة",
"default_new_note_title": "ملاحظة جديدة",
"open_in_new_tab": "فتح في تبويب جديد",
"enter_new_title": "ادخل عنوان ملاحظة جديدة:",
"note_not_found": "الملاحظة {{noteId}} غير موجودة!",
"cannot_match_transform": "تعذر مطابقة التحويل: {{transform}}"
@@ -1129,9 +1098,7 @@
"spellcheck": {
"title": "التدقيق الاملائي",
"enable": "تفعيل التدقيق الاملائي",
"language_code_label": "رمز اللغة او رموز اللغات",
"available_language_codes_label": "رموز اللغات المتاحة:",
"language_code_placeholder": "على سبيل المثال \"en-US\", \"de-AI\""
"language_code_label": "رمز اللغة او رموز اللغات"
},
"note-map": {
"button-link-map": "خريطة الروابط",
@@ -1286,8 +1253,10 @@
"search-for": "بحث ل \"{{term}}\""
},
"protect_note": {
"toggle-off": "ازالة الحماية عن الملاحظة",
"toggle-on": "حماية الملاحظة"
"toggle-off": "إزالة الحماية عن الملاحظة",
"toggle-on": "حماية الملاحظة",
"toggle-on-hint": "الملاحظة غير محمة، انقر لحمايتها",
"toggle-off-hint": "الملاحظة محمية، انقر لإزالة الحماية منها"
},
"open-help-page": "فتح صفحة المساعدة",
"empty": {
@@ -1,10 +1,4 @@
{
"about": {
"title": "Sobre Trilium Notes",
"homepage": "Pàgina principal:",
"app_version": "Versió de l'aplicació:",
"db_version": "Versió de la base de dades:"
},
"add_link": {
"note": "Nota"
},
@@ -25,8 +19,7 @@
},
"delete_notes": {
"close": "Tanca",
"cancel": "Cancel·la",
"ok": "OK"
"cancel": "Cancel·la"
},
"export": {
"close": "Tanca",
@@ -60,12 +53,6 @@
"recent_changes": {
"undelete_link": "recuperar"
},
"revisions": {
"restore_button": "Restaura",
"delete_button": "Suprimeix",
"download_button": "Descarrega",
"mime": "MIME: "
},
"sort_child_notes": {
"title": "títol",
"ascending": "ascendent",
@@ -93,7 +80,10 @@
"digits": "dígits",
"inheritable": "Heretable",
"delete": "Suprimeix",
"color_type": "Color"
"color_type": "Color",
"textarea": "Text multi linia",
"date_time": "Data i hora",
"precision_title": "Quants dígits han d'estar disponibles per a coma flotant a la interfície de configuració."
},
"rename_label": {
"to": "Per"
+329 -115
View File
@@ -1,13 +1,23 @@
{
"about": {
"title": "关于 Trilium Notes",
"homepage": "项目主页",
"app_version": "应用版本:",
"db_version": "数据库版本:",
"sync_version": "同步版本",
"build_date": "编译日期:",
"build_revision": "编译版本:",
"data_directory": "数据目录:"
"data_directory": "数据目录:",
"version_label": "版本",
"version": "{{appVersion}}(数据库:{{dbVersion}},同步协议:{{syncVersion}}",
"build_info": "创建: {{buildDate}}, 修订: <buildRevision />",
"contributors_label": "贡献者",
"contributor_roles": {
"lead-dev": "首席开发者",
"original-dev": "原始开发者"
},
"role_brief_history": {
"lead-dev": "Elian Doran 于 2024 年创立了 TriliumNext,这是在 Zadam 从该项目退出后创建的一个社区分支。Zadam 后来将原始仓库转移给 TriliumNext 团队,将两个项目合并回一个。",
"original-dev": "2017年12月25日,Zadam发布了Trilium的第一个测试版(写作时只用一个“l”,不同于那种花)。由于对现有的笔记整理工具不满意,他构建了一个强大的自托管层次化知识库,该项目在GitHub上获得了超过22,000颗星。到了2024年,随着生活变得更加忙碌,他将该项目置于维护模式。"
},
"contributor_full_list": "查看整个社区",
"github_tooltip": "在 GitHub 上报告错误、提出功能建议或贡献代码",
"license_tooltip": "查看许可证",
"donate": "捐赠",
"donate_tooltip": "捐款支持这个项目"
},
"toast": {
"critical-error": {
@@ -41,7 +51,9 @@
"link_title_mirrors": "链接标题跟随笔记标题变化",
"link_title_arbitrary": "链接标题可随意修改",
"link_title": "链接标题",
"button_add_link": "添加链接"
"button_add_link": "添加链接",
"anchor": "锚点(可选)",
"anchor_none": "无(笔记链接)"
},
"branch_prefix": {
"edit_branch_prefix": "编辑分支前缀",
@@ -88,17 +100,22 @@
"also_delete_note": "同时删除笔记"
},
"delete_notes": {
"delete_notes_preview": "删除笔记预览",
"close": "关闭",
"delete_all_clones_description": "同时删除所有克隆(可以在最近修改中撤消)",
"erase_notes_description": "通常(软)删除仅标记笔记为已删除,可以在一段时间内通过最近修改对话框撤消。选中此选项将立即擦除笔记,不可撤销。",
"erase_notes_description": "立即删除笔记,而不是软删除。此操作无法撤销,并将强制应用程序重新加载。",
"erase_notes_warning": "永久擦除笔记(无法撤销),包括所有克隆。这将强制应用程序重载。",
"notes_to_be_deleted": "删除以下笔记 ({{notesCount}})",
"notes_to_be_deleted": "删除笔记({{notesCount}}",
"no_note_to_delete": "没有笔记将被删除(仅克隆)。",
"broken_relations_to_be_deleted": "将删除以下关系并断开连接 ({{ relationCount}})",
"broken_relations_to_be_deleted": "断开的关联({{relationCount}}",
"cancel": "取消",
"ok": "确定",
"deleted_relation_text": "笔记 {{- note}} (将被删除的笔记) 被以下关系 {{- relation}} 引用, 来自 {{- source}}。"
"title": "删除笔记",
"delete": "删除",
"clones_label": "克隆",
"delete_clones_description_other": "同时删除 {{count}} 个其他克隆。此操作可在最近的更改中撤销。",
"erase_notes_label": "永久擦除",
"table_note_with_relation": "关联笔记",
"table_relation": "关联",
"table_points_to": "指向(已删除)"
},
"export": {
"export_note_title": "导出笔记",
@@ -209,7 +226,8 @@
"box_size_small": "小型 (显示大约10行)",
"box_size_medium": "中型 (显示大约30行)",
"box_size_full": "完整显示(完整文本框)",
"button_include": "包含笔记"
"button_include": "包含笔记",
"box_size_expandable": "可展开(默认折叠)"
},
"info": {
"modalTitle": "信息消息",
@@ -270,33 +288,6 @@
"undelete_link": "恢复删除",
"confirm_undelete": "您确定要恢复此笔记及其子笔记吗?"
},
"revisions": {
"note_revisions": "笔记历史版本",
"delete_all_revisions": "删除此笔记的所有修订版本",
"delete_all_button": "删除所有修订版本",
"help_title": "关于笔记修订版本的帮助",
"confirm_delete_all": "您是否要删除此笔记的所有修订版本?",
"no_revisions": "此笔记暂无修订版本...",
"restore_button": "恢复",
"confirm_restore": "您是否要恢复此修订版本?这将使用此修订版本覆盖笔记的当前标题和内容。",
"delete_button": "删除",
"confirm_delete": "您是否要删除此修订版本?",
"revisions_deleted": "笔记修订版本已删除。",
"revision_restored": "笔记修订版本已恢复。",
"revision_deleted": "笔记修订版本已删除。",
"snapshot_interval": "笔记快照保存间隔: {{seconds}}秒。",
"maximum_revisions": "当前笔记的最大历史数量: {{number}}。",
"settings": "笔记修订设置",
"download_button": "下载",
"mime": "MIME 类型: ",
"file_size": "文件大小:",
"preview_not_available": "无法预览此类型的笔记。",
"diff_on": "显示差异",
"diff_off": "显示内容",
"diff_on_hint": "点击以显示笔记源代码差异",
"diff_off_hint": "点击以显示笔记内容",
"diff_not_available": "差异不可用。"
},
"sort_child_notes": {
"sort_children_by": "按...排序子笔记",
"sorting_criteria": "排序条件",
@@ -368,7 +359,7 @@
"calendar_root": "标记应用作为每日笔记的根。只应标记一个笔记。",
"archived": "含有此标签的笔记默认在搜索结果中不可见(也适用于跳转到、添加链接对话框等)。",
"exclude_from_export": "笔记(及其子树)不会包含在任何笔记导出中",
"run": "定义脚本应运行的事件。可能的值包括:\n<ul>\n<li>frontendStartup - Trilium前端启动时(或刷新时),但不会在移动端执行。</li>\n<li>mobileStartup - Trilium前端启动时(或刷新时), 在移动端会执行。</li>\n<li>backendStartup - Trilium后端启动时</li>\n<li>hourly - 每小时运行一次。您可以使用附加标签<code>runAtHour</code>指定小时。</li>\n<li>daily - 每天运行一次</li>\n</ul>",
"run": "定义脚本应运行的事件。可能的值包括:\n<ul>\n<li>frontendStartup - Trilium前端启动时(或刷新时),但不会在移动端执行。</li>\n<li>mobileStartup - Trilium前端启动时(或刷新时), 在移动端会执行。</li>\n<li>backendStartup - Trilium后端启动时</li>\n<li>hourly - 每小时运行一次。您可以使用附加标签<code>runAtHour</code>指定小时。</li>\n<li>daily - 每天运行一次</li>\n</ul>",
"run_on_instance": "定义应在哪个Trilium实例上运行。默认为所有实例。",
"run_at_hour": "应在哪个小时运行。应与<code>#run=hourly</code>一起使用。可以多次定义,以便一天内运行多次。",
"disable_inclusion": "含有此标签的脚本不会包含在父脚本执行中。",
@@ -446,7 +437,10 @@
"and_more": "... 以及另外 {{count}} 个。",
"print_landscape": "导出为 PDF 时,将页面方向更改为横向而不是纵向。",
"print_page_size": "导出为 PDF 时,更改页面大小。支持的值:<code>A0</code>、<code>A1</code>、<code>A2</code>、<code>A3</code>、<code>A4</code>、<code>A5</code>、<code>A6</code>、<code>Legal</code>、<code>Letter</code>、<code>Tabloid</code>、<code>Ledger</code>。",
"color_type": "颜色"
"color_type": "颜色",
"textarea": "多行文本",
"print_scale": "导出为 PDF 时,更改渲染内容的比例。取值范围从 0.1 (10%) 到 2 (200%),默认值为 1 (100%)。",
"print_margins": "导出为 PDF 时,设置页面边距。可以使用 <code>default</code>、<code>none</code>、<code>minimum</code> 或以毫米为单位的自定义值,例如 <code>top,right,bottom,left</code>。"
},
"attribute_editor": {
"help_text_body1": "要添加标签,只需输入例如 <code>#rock</code> 或者如果您还想添加值,则例如 <code>#year = 2020</code>",
@@ -708,7 +702,13 @@
"advanced": "高级",
"export_as_image": "导出为图像",
"export_as_image_png": "PNG(栅格)",
"export_as_image_svg": "SVG(矢量图)"
"export_as_image_svg": "SVG(矢量图)",
"view_ocr_text": "查看 OCR 文本",
"word_wrap": "自动换行",
"word_wrap_auto": "自动",
"word_wrap_auto_description": "遵循全局设置",
"word_wrap_on": "开启",
"word_wrap_off": "关闭"
},
"onclick_button": {
"no_click_handler": "按钮组件'{{componentId}}'没有定义点击处理程序"
@@ -802,7 +802,10 @@
"expand_first_level": "展开直接子代",
"expand_nth_level": "展开 {{depth}} 层",
"expand_all_levels": "展开所有层级",
"hide_child_notes": "隐藏树中的子笔记"
"hide_child_notes": "隐藏树中的子笔记",
"open_all_in_tabs": "全部打开",
"open_all_in_tabs_tooltip": "在新标签页中打开所有结果",
"open_all_confirm": "这将在新标签页中打开 {{count}} 个笔记。继续吗?"
},
"edited_notes": {
"no_edited_notes_found": "今天还没有编辑过的笔记...",
@@ -856,7 +859,8 @@
"collapse": "折叠到正常大小",
"title": "笔记地图",
"fix-nodes": "固定节点",
"link-distance": "链接距离"
"link-distance": "链接距离",
"too-many-notes": "此子树包含 {{count}} 个笔记,超过了笔记地图中可显示的 {{max}} 个笔记的限制。"
},
"note_paths": {
"title": "笔记路径",
@@ -1047,7 +1051,6 @@
"unprotecting-title": "解除保护状态"
},
"relation_map": {
"open_in_new_tab": "在新标签页中打开",
"remove_note": "删除笔记",
"edit_title": "编辑标题",
"rename_note": "重命名笔记",
@@ -1062,7 +1065,8 @@
"note_already_in_diagram": "笔记 \"{{title}}\" 已经在图中。",
"enter_title_of_new_note": "输入新笔记的标题",
"default_new_note_title": "新笔记",
"click_on_canvas_to_place_new_note": "点击画布以放置新笔记"
"click_on_canvas_to_place_new_note": "点击画布以放置新笔记",
"rename_relation": "重命名关系"
},
"backend_log": {
"refresh": "刷新"
@@ -1071,15 +1075,17 @@
"title": "检查一致性",
"find_and_fix_button": "查找并修复一致性问题",
"finding_and_fixing_message": "正在查找并修复一致性问题...",
"issues_fixed_message": "一致性问题应该已被修复。"
"issues_fixed_message": "一致性问题应该已被修复。",
"find_and_fix_label": "查找并修复一致性问题",
"find_and_fix_description": "扫描并自动修复数据库中的任何数据一致性问题。"
},
"database_anonymization": {
"title": "数据库匿名化",
"full_anonymization": "完全匿名化",
"full_anonymization_description": "此操作将创建一个新的数据库副本并进行匿名化处理(删除所有笔记内容,仅保留结构和一些非敏感元数据),用来分享到网上做调试而不用担心泄漏您的个人资料。",
"full_anonymization_description": "创建数据库副本,移除所有笔记内容,仅保留数据库结构和非敏感元数据。在调试问题时,可安全地在线共享。",
"save_fully_anonymized_database": "保存完全匿名化的数据库",
"light_anonymization": "轻度匿名化",
"light_anonymization_description": "此操作将创建一个新的数据库副本,并对其进行轻度匿名化处理——仅删除所有笔记内容,但保留标题属性。此外,自定义 JS 前端/后端脚本笔记和自定义小部件将保留。这提供更多上下文以调试问题。",
"light_anonymization_description": "创建一个副本,其中移除笔记内容,但保留标题属性和自定义脚本/小部件。这有助于提供更多调试信息。",
"choose_anonymization": "您可以自行决定是提供完全匿名化还是轻度匿名化的数据库。即使是完全匿名化的数据库也非常有用,但在某些情况下,轻度匿名化的数据库可以加快错误识别和修复的过程。",
"save_lightly_anonymized_database": "保存轻度匿名化的数据库",
"existing_anonymized_databases": "现有的匿名化数据库",
@@ -1088,15 +1094,17 @@
"error_creating_anonymized_database": "无法创建匿名化数据库,请检查后端日志以获取详细信息",
"successfully_created_fully_anonymized_database": "成功创建完全匿名化的数据库,路径为 {{anonymizedFilePath}}",
"successfully_created_lightly_anonymized_database": "成功创建轻度匿名化的数据库,路径为 {{anonymizedFilePath}}",
"no_anonymized_database_yet": "尚无匿名化数据库。"
"no_anonymized_database_yet": "尚无匿名化数据库。",
"description": "创建数据库的匿名副本,以便在调试问题时与开发人员共享,而不会泄露个人数据。"
},
"database_integrity_check": {
"title": "数据库完整性检查",
"description": "检查 SQLite 数据库是否损坏。根据数据库的大小,可能会需要一些时间。",
"check_button": "检查数据库完整性",
"checking_integrity": "正在检查数据库完整性...",
"integrity_check_succeeded": "完整性检查成功 - 未发现问题。",
"integrity_check_failed": "完整性检查失败: {{results}}"
"integrity_check_failed": "完整性检查失败: {{results}}",
"check_integrity_label": "检查数据库完整性",
"check_integrity_description": "验证 SQLite 数据库是否已损坏。"
},
"sync": {
"title": "同步",
@@ -1106,28 +1114,31 @@
"filling_entity_changes": "正在填充实体变更行...",
"sync_rows_filled_successfully": "同步行填充成功",
"finished-successfully": "同步已完成。",
"failed": "同步失败:{{message}}"
"failed": "同步失败:{{message}}",
"force_full_sync_label": "强制全量同步",
"force_full_sync_description": "触发与同步服务器的全量同步,重新上传所有更改。",
"fill_entity_changes_description": "重建实体变更记录。如果同步过程中缺少某些变更,请使用此功能。",
"fill_entity_changes_label": "填充实体变更"
},
"vacuum_database": {
"title": "数据库清理",
"description": "这会重建数据库,通常会减少占用空间,不会删除数据。",
"button_text": "清理数据库",
"vacuuming_database": "正在清理数据库...",
"database_vacuumed": "数据库已清理"
"database_vacuumed": "数据库已清理",
"vacuum_label": "数据库清理",
"vacuum_description": "重建数据库以减小文件大小。数据不会发生任何变化。"
},
"fonts": {
"theme_defined": "跟随主题",
"fonts": "字体",
"main_font": "字体",
"main_font": "界面字体",
"font_family": "字体系列",
"size": "大小",
"note_tree_font": "笔记树字体",
"note_detail_font": "笔记详情字体",
"monospace_font": "等宽(代码)字体",
"note_tree_and_detail_font_sizing": "请注意,笔记树字体和详细字体的大小相对于主字体大小设置。",
"not_all_fonts_available": "并非所有列出的字体都可能在您的系统上可用。",
"apply_font_changes": "要应用字体更改,请点击",
"reload_frontend": "重载前端",
"note_detail_font": "文档字体",
"monospace_font": "等宽字体",
"not_all_fonts_available": "并非所有列出的字体都可能在您的系统上可用",
"generic-fonts": "通用字体",
"sans-serif-system-fonts": "无衬线系统字体",
"serif-system-fonts": "衬线系统字体",
@@ -1136,7 +1147,12 @@
"serif": "衬线",
"sans-serif": "无衬线",
"monospace": "等宽",
"system-default": "系统默认"
"system-default": "系统默认",
"custom_fonts": "使用自定义字体",
"preview": "预览",
"monospace_font_description": "用于代码注释和代码块",
"size_relative_to_general": "大小相对于一般字体大小",
"apply_changes": "重新加载以应用更改"
},
"max_content_width": {
"title": "内容宽度",
@@ -1156,20 +1172,23 @@
"edited_notes_message": "日记笔记自动打开编辑过的笔记功能区标签页"
},
"theme": {
"title": "主题",
"theme_label": "主题",
"title": "用户界面",
"theme_label": "应用主题",
"override_theme_fonts_label": "覆盖主题字体",
"triliumnext": "Trilium跟随系统颜色方案",
"triliumnext-light": "Trilium浅色",
"triliumnext-dark": "Trilium深色",
"triliumnext": "跟随系统颜色方案",
"triliumnext-light": "浅色",
"triliumnext-dark": "深色",
"layout": "布局",
"layout-vertical-title": "垂直",
"layout-horizontal-title": "水平",
"layout-vertical-description": "启动栏位于左侧(默认)",
"layout-horizontal-description": "启动栏位于标签页栏下方,标签页栏现在是全宽的。",
"auto_theme": "传统(跟随系统配色方案",
"light_theme": "传统(浅色",
"dark_theme": "传统(深色"
"auto_theme": "跟随系统配色方案",
"light_theme": "浅色",
"dark_theme": "深色",
"modern_themes": "现代",
"legacy_themes": "传统",
"custom_themes": "自定义"
},
"zoom_factor": {
"title": "缩放系数(仅桌面客户端有效)",
@@ -1178,7 +1197,7 @@
"code_auto_read_only_size": {
"title": "自动只读大小",
"description": "自动只读大小是指笔记超过设置的大小后自动设置为只读模式(为性能考虑)。",
"label": "自动只读大小(代码笔记)",
"label": "自动只读大小",
"unit": "字符"
},
"code_mime_types": {
@@ -1197,32 +1216,51 @@
},
"images": {
"images_section_title": "图片",
"download_images_automatically": "自动下载图片以供离线使用。",
"download_images_description": "粘贴的 HTML 可能包含在线图片的引用,Trilium 会找到这些引用并下载图片,以便它们可以离线使用。",
"enable_image_compression": "启用图片压缩",
"max_image_dimensions": "图片的最大宽度/高度(超过此限制的图像将会被缩放)。",
"jpeg_quality_description": "JPEG 质量(10 - 最差质量,100 最佳质量,建议为 50 - 85)",
"max_image_dimensions_unit": "像素"
"download_images_automatically": "自动下载图片",
"download_images_description": "粘贴的 HTML 代码中下载引用的在线图片,以便离线使用。",
"enable_image_compression": "图片压缩",
"max_image_dimensions": "最大图像尺寸",
"jpeg_quality_description": "建议范围为 50–85。较低的值可以减小文件大小,较高的值可以保留细节。",
"max_image_dimensions_unit": "像素",
"enable_image_compression_description": "上传或粘贴图片时,对其进行压缩和调整大小。",
"max_image_dimensions_description": "超过此尺寸的图片将自动调整大小。",
"jpeg_quality": "JPEG质量",
"ocr_section_title": "文本提取(OCR",
"ocr_related_content_languages": "内容语言(用于文本提取)",
"ocr_auto_process": "自动处理新文件",
"ocr_auto_process_description": "自动从新上传或粘贴的文件中提取文本。",
"ocr_min_confidence": "最低置信度",
"ocr_confidence_description": "仅提取置信度高于此阈值的文本。较低的置信度阈值会包含更多文本,但可能准确性较低。",
"batch_ocr_title": "处理现有文件",
"batch_ocr_description": "从笔记中的所有现有图像、PDF 和 Office 文档中提取文本。这可能需要一些时间,具体取决于文件数量。",
"batch_ocr_start": "开始批量处理",
"batch_ocr_starting": "开始批量处理...",
"batch_ocr_progress": "正在处理 {{processed}} 个文件,共 {{total}} 个文件...",
"batch_ocr_completed": "批量处理完成!已处理 {{processed}} 个文件。",
"batch_ocr_error": "批量处理过程中出错:{{error}}"
},
"attachment_erasure_timeout": {
"attachment_erasure_timeout": "附件清理超时",
"attachment_auto_deletion_description": "如果附件在一段时间后不再被笔记引用,它们将自动被删除(并被清理)。",
"erase_attachments_after": "在此时间后删除未使用的附件:",
"manual_erasing_description": "您还可以手动触发清理(而不考虑上述定义的超时时间):",
"erase_unused_attachments_now": "立即清理未使用的附件笔记",
"unused_attachments_erased": "未使用的附件已被删除。"
"attachment_erasure_timeout": "未使用的附件",
"erase_attachments_after": "在此时间后清理未使用的附件",
"manual_erasing_description": "手动触发清理,忽略上述超时。",
"erase_unused_attachments_now": "立即清理未使用的附件",
"unused_attachments_erased": "未使用的附件已被清理。",
"description": "不再被任何笔记引用的附件被视为未使用,可以在一段时间后自动清理。",
"erase_attachments_after_description": "未使用附件被永久清理前的时间。"
},
"network_connections": {
"network_connections_title": "网络连接",
"check_for_updates": "自动检查更新"
"network_connections_title": "网络",
"check_for_updates": "自动检查更新",
"check_for_updates_description": "在 GitHub 上检查新版本,并在可用时在全局菜单中显示通知。"
},
"note_erasure_timeout": {
"note_erasure_timeout_title": "笔记清理超时",
"note_erasure_description": "被删除的笔记(以及属性、修订历史等)最初仅被标记为“删除”,可以从“最近修改”对话框中恢复它们。经过一段时间后,已删除的笔记会被“清理”,这意味着它们的内容将无法恢复。此设置允许您配置从删除到清除笔记之间的时间长度。",
"erase_notes_after": "在此时间后删除笔记:",
"manual_erasing_description": "您还可以手动触发清理(不考虑上述定义的超时):",
"note_erasure_timeout_title": "已删除的笔记",
"erase_notes_after": "在此时间后清理笔记",
"manual_erasing_description": "手动触发清理,忽略上述超时。",
"erase_deleted_notes_now": "立即清理已删除的笔记",
"deleted_notes_erased": "已删除的笔记已被清理。"
"deleted_notes_erased": "已删除的笔记已被清理。",
"description": "删除的笔记最初只是被标记为已删除,可以从“最近的笔记”中恢复。经过一段时间后,它们将被永久清理。",
"erase_notes_after_description": "删除的笔记被永久清理之前的时间。"
},
"revisions_snapshot_interval": {
"note_revisions_snapshot_interval_title": "笔记修订快照间隔",
@@ -1297,7 +1335,6 @@
"first-week-contains-first-thursday": "第一周包含一年的第一个周四",
"first-week-has-minimum-days": "第一周有最小天数",
"min-days-in-first-week": "第一周的最小天数",
"first-week-info": "第一周包含一年的第一个周四,基于 <a href=\"https://en.wikipedia.org/wiki/ISO_week_date#First_week\">ISO 8601</a> 标准。",
"first-week-warning": "更改第一周选项可能会导致与现有周笔记重复,已创建的周笔记将不会相应更新。",
"formatting-locale": "日期和数字格式",
"tuesday": "周二",
@@ -1320,7 +1357,8 @@
"date-and-time": "日期和时间",
"path": "路径",
"database_backed_up_to": "数据库已备份到 {{backupFilePath}}",
"no_backup_yet": "尚无备份"
"no_backup_yet": "尚无备份",
"download": "下载"
},
"etapi": {
"title": "ETAPI",
@@ -1418,28 +1456,28 @@
"spellcheck": {
"title": "拼写检查",
"description": "这些选项仅适用于桌面版本,浏览器将使用其原生的拼写检查功能。",
"enable": "启用拼写检查",
"language_code_label": "语言代码",
"language_code_placeholder": "例如 \"en-US\", \"de-AT\"",
"multiple_languages_info": "多种语言可以用逗号分隔,例如 \"en-US, de-DE, cs\"。 ",
"available_language_codes_label": "可用的语言代码:",
"restart-required": "拼写检查选项的更改将在应用重启后生效。"
"enable": "拼写检查",
"language_code_label": "拼写检查语言",
"restart-required": "拼写检查选项的更改将在应用重启后生效。",
"custom_dictionary_title": "自定义词典",
"custom_dictionary_description": "添加到词典中的单词会在您的所有设备上同步。",
"custom_dictionary_edit": "自定义词",
"custom_dictionary_edit_description": "编辑拼写检查器不应标记的单词列表。更改将在重启后生效。",
"custom_dictionary_open": "编辑词典",
"related_description": "配置拼写检查语言和自定义词典。"
},
"sync_2": {
"config_title": "同步配置",
"server_address": "服务器实例地址",
"timeout": "同步超时(单位:毫秒)",
"proxy_label": "同步代理服务器(可选)",
"note": "注意",
"note_description": "代理设置留空则使用系统代理(仅桌面客户端有效)。",
"special_value_description": "另一个特殊值是 <code>noproxy</code>,它强制忽略系统代理并遵守 <code>NODE_TLS_REJECT_UNAUTHORIZED</code>。",
"save": "保存",
"help": "帮助",
"test_title": "同步测试",
"test_description": "测试和同步服务器之间的连接。如果同步服务器没有初始化,会将本地文档同步到同步服务器上。",
"test_button": "测试同步",
"handshake_failed": "同步服务器握手失败,错误:{{message}}",
"timeout_unit": "毫秒"
"timeout_description": "同步连接速度慢时,应该等待多久才放弃?如果网络不稳定,请增加等待时间。"
},
"api_log": {
"close": "关闭"
@@ -1535,7 +1573,9 @@
"new-feature": "新建",
"collections": "集合",
"book": "集合",
"ai-chat": "AI聊天"
"ai-chat": "AI对话",
"spreadsheet": "电子表格",
"llm-chat": "AI对话"
},
"protect_note": {
"toggle-on": "保护笔记",
@@ -1842,7 +1882,9 @@
}
},
"code-editor-options": {
"title": "编辑器"
"title": "编辑器",
"tab_width": "制表符宽度",
"tab_width_unit": "空格"
},
"custom_date_time_format": {
"title": "自定义日期/时间格式",
@@ -1860,7 +1902,7 @@
},
"content_language": {
"title": "内容语言",
"description": "选择一种或多种语言出现在只读或可编辑文本注释的基本属性,这将支持拼写检查从右向左之类的功能。"
"description": "在只读或可编辑文本笔记的“基本属性”部分,选择一种或多种语言,这些语言将显示在语言选择列表中。这将启用拼写检查从右到左的阅读支持和文本提取(OCR)等功能。"
},
"switch_layout_button": {
"title_vertical": "将编辑面板移至底部",
@@ -2001,11 +2043,11 @@
},
"ui-performance": {
"title": "性能",
"enable-motion": "启用过渡和动画",
"enable-shadows": "启用阴影",
"enable-backdrop-effects": "启用菜单、弹窗和面板的背景效果",
"enable-smooth-scroll": "启用平滑滚动",
"app-restart-required": "(需重启程序以应用更改)"
"enable-motion": "过渡和动画",
"enable-shadows": "阴影",
"enable-backdrop-effects": "菜单、弹窗和面板的背景效果",
"enable-smooth-scroll": "平滑滚动",
"app-restart-required": "需要重启应用"
},
"pagination": {
"total_notes": "{{count}} 篇笔记",
@@ -2045,7 +2087,9 @@
"title": "实验选项",
"disclaimer": "这些选项处于实验阶段,可能导致系统不稳定。请谨慎使用。",
"new_layout_name": "新布局",
"new_layout_description": "尝试全新布局,呈现更现代的外观并提升易用性。后续版本将进行重大调整。"
"new_layout_description": "尝试全新布局,呈现更现代的外观并提升易用性。后续版本将进行重大调整。",
"llm_name": "AI/大语言模型对话",
"llm_description": "启用由大语言模型驱动的 AI对话侧边栏和大语言模型对话笔记。"
},
"tab_history_navigation_buttons": {
"go-back": "返回前一笔记",
@@ -2167,5 +2211,175 @@
},
"setup_form": {
"more_info": "了解更多"
},
"media": {
"play": "播放(空格)",
"pause": "暂停(空格)",
"back-10s": "后退10秒(左箭头键)",
"forward-30s": "前进30秒",
"mute": "静音(M",
"unmute": "取消静音(M",
"playback-speed": "播放速度",
"loop": "循环播放",
"disable-loop": "禁用循环播放",
"rotate": "旋转",
"picture-in-picture": "画中画",
"exit-picture-in-picture": "退出画中画",
"fullscreen": "全屏(F",
"exit-fullscreen": "退出全屏",
"unsupported-format": "此文件格式不支持媒体预览:\n{{mime}}",
"zoom-to-fit": "缩放以填充",
"zoom-reset": "重置缩放以填充"
},
"mermaid": {
"sample_diagrams": "示例图:",
"sample_flowchart": "流程图",
"sample_class": "类图",
"sample_sequence": "时序图",
"sample_entity_relationship": "实体关系图",
"sample_state": "状态图",
"sample_mindmap": "思维导图",
"sample_architecture": "架构图",
"sample_block": "模块图",
"sample_c4": "C4 图",
"sample_gantt": "甘特图",
"sample_git": "Git 流程图",
"sample_kanban": "看板图",
"sample_packet": "数据包图",
"sample_pie": "饼图",
"sample_quadrant": "象限图",
"sample_radar": "雷达图",
"sample_requirement": "需求图",
"sample_sankey": "桑基图",
"sample_timeline": "时间轴图",
"sample_treemap": "树形图",
"sample_user_journey": "用户旅程图",
"sample_xy": "散点图",
"sample_venn": "韦恩图",
"sample_ishikawa": "鱼骨图",
"placeholder": "输入你的美人鱼图的内容,或者使用下面的示例图之一。",
"sample_treeview": "树形视图",
"sample_wardley": "沃德利地图"
},
"llm_chat": {
"placeholder": "输入消息…",
"send": "发送",
"sending": "正在发送...",
"empty_state": "在下方输入消息,即可开始对话。",
"searching_web": "在网上搜索…",
"web_search": "联网搜索",
"sources": "来源",
"extended_thinking": "延伸思考",
"legacy_models": "传统模型",
"thinking": "正在思考...",
"thought_process": "思考过程",
"tool_calls": "{{count}} 次工具调用",
"input": "输入",
"result": "结果",
"error": "错误",
"tool_error": "失败",
"total_tokens": "{{total}} 个词元",
"tokens_detail": "{{prompt}} 提示词 + {{completion}} 补全",
"tokens_used": "{{prompt}} 提示词 + {{completion}} 补全 = {{total}} 个词元",
"tokens_used_with_cost": "{{prompt}} 提示词 + {{completion}} 补全 = {{total}} 个词元(约 ${{cost}}",
"tokens_used_with_model": "{{model}}: {{prompt}} 提示词 + {{completion}} 补全 = {{total}} 个词元",
"tokens_used_with_model_and_cost": "{{model}}: {{prompt}} 提示词 + {{completion}} 补全 = {{total}} 个词元(约 ${{cost}}",
"tokens": "词元",
"context_used": "{{percentage}}% 使用率",
"note_context_enabled": "点击即可禁用笔记上下文:{{title}}",
"note_context_disabled": "点击即可将当前注释添加到上下文中",
"no_provider_message": "未配置人工智能提供商。添加一个即可开始对话。",
"add_provider": "添加人工智能提供商",
"note_tools": "笔记访问",
"sources_summary": "来自 {{sites}} 个网站的 {{count}} 个来源"
},
"sidebar_chat": {
"title": "AI对话",
"launcher_title": "打开AI对话",
"new_chat": "开始新对话",
"save_chat": "将对话保存到笔记",
"empty_state": "开始对话",
"history": "对话历史",
"recent_chats": "最近对话",
"no_chats": "无历史对话"
},
"ocr": {
"extracted_text": "提取文本(OCR",
"extracted_text_title": "提取文本(OCR",
"loading_text": "正在加载OCR文本...",
"no_text_available": "暂无OCR文本",
"no_text_explanation": "该笔记未进行 OCR 文本提取处理,或未找到文本。",
"failed_to_load": "OCR文本加载失败",
"process_now": "处理 OCR",
"processing": "正在处理...",
"processing_started": "OCR识别已开始。请稍候片刻并刷新页面。",
"processing_failed": "OCR处理启动失败",
"view_extracted_text": "查看提取的文本(OCR",
"processing_complete": "OCR识别处理完成。",
"text_filtered_low_confidence": "OCR 检测到文本,置信度为 {{confidence}}% ,但由于您的最小阈值为 {{threshold}}% ,因此该文本已被丢弃。",
"open_media_settings": "打开设置"
},
"mind-map": {
"addChild": "添加子节点",
"addParent": "添加父节点",
"addSibling": "添加同级节点",
"removeNode": "删除节点",
"focus": "专注模式",
"cancelFocus": "退出专注模式",
"moveUp": "上移",
"moveDown": "下移",
"link": "链接",
"linkBidirectional": "双向链接",
"clickTips": "请点击目标节点",
"summary": "总结"
},
"llm": {
"settings_description": "配置人工智能和大语言模型集成。",
"add_provider": "添加提供商",
"settings_title": "AI / LLM",
"feature_not_enabled": "在“设置”→“高级”→“实验性功能”中启用 LLM 实验性功能,即可使用 AI 集成。",
"add_provider_title": "添加AI供应商",
"configured_providers": "已配置的供应商",
"no_providers_configured": "尚未配置任何供应商。",
"provider_name": "名称",
"provider_type": "供应商"
},
"revisions": {
"note_revisions": "笔记修订",
"delete_all_revisions": "删除此笔记的所有修订版本",
"delete_all_button": "删除所有修订版本",
"help_title": "关于笔记修订的帮助",
"confirm_delete_all": "是否要删除此笔记的所有修订版本?",
"no_revisions": "这篇笔记目前还没有修改……",
"restore_button": "恢复",
"diff_on": "显示差异",
"diff_off": "显示内容",
"diff_on_hint": "点击显示笔记来源差异",
"diff_off_hint": "点击显示笔记内容",
"diff_not_available": "差异数据不可用。",
"confirm_restore": "是否恢复此版本?这将用此版本覆盖笔记的当前标题和内容。",
"delete_button": "删除",
"confirm_delete": "您要删除此修订吗?",
"revisions_deleted": "笔记修订已被删除。",
"revision_restored": "笔记修订已恢复。",
"revision_deleted": "笔记修订已删除。",
"snapshot_interval": "笔记修订快照间隔:{{seconds}}秒。",
"maximum_revisions": "笔记修订快照限制:{{number}}。",
"settings": "笔记修订设置",
"download_button": "下载",
"mime": "MIME 类型: ",
"file_size": "文件大小:",
"preview_not_available": "无法预览此类型的笔记。",
"highlight_changes": "高亮变更",
"save_revision_now": "立即保存修订",
"save_named_revision": "保存已命名的修订...",
"snapshot_header": "笔记修订快照",
"snapshot_interval_value": "间隔:{{seconds}}秒"
},
"database": {
"title": "数据库"
},
"auto_link_attribute_list": {
"title": "系统属性"
}
}
File diff suppressed because it is too large Load Diff
+306 -106
View File
@@ -1,13 +1,23 @@
{
"about": {
"title": "Über Trilium Notes",
"homepage": "Startseite:",
"app_version": "App-Version:",
"db_version": "DB-Version:",
"sync_version": "Sync-Version:",
"build_date": "Build-Datum:",
"build_revision": "Build-Revision:",
"data_directory": "Datenverzeichnis:"
"data_directory": "Datenverzeichnis:",
"version_label": "Version:",
"version": "{{appVersion}} (Datenbankversion: {{dbVersion}}, Synchroniserungsprotokoll {{syncVersion}})",
"build_info": "Erstelldatum: {{buildDate}}, Revision: <buildRevision />",
"contributors_label": "Mitwirkende:",
"contributor_roles": {
"lead-dev": "Leitender Entwickler:",
"original-dev": "Orginaler Entwickler"
},
"role_brief_history": {
"lead-dev": "Elian Doran began mit der Entwicklung von TrilliumNext im Jahr 2024, nachdem Zadam, der orginale Erfinder, von dem Projekt zurücktrat. Später übergab Zadam das orginale Projekt an das TrilliumNext Team, damit beide Projekte zu eins verschmelzen konnten.",
"original-dev": "Am 25. Dezember 2017 veröffentlichte Zadam die erste Betaversion von Trilium - anders als die Blume, geschrieben mit einem \"l\". Da er unzufrieden mit dem aktuellen Stand von Notizprogrammen war, entschied er sich, selbst eine hierachie-basierte, soveräne Wissensdatenbank aufzubauen, welche über 22.000 Github Sterne bekan. Jedoch musste er das Projekt durch persönliche Gründe in den Wartungsmodus versetzen."
},
"contributor_full_list": "Die gesamte Community anschauen",
"github_tooltip": "Fehler melden, Features vorschlagen oder auf Github mitwirken",
"license_tooltip": "Lizenz ansehen",
"donate": "Spenden",
"donate_tooltip": "Spende, um Trillium zu unterstützen"
},
"toast": {
"critical-error": {
@@ -41,7 +51,9 @@
"link_title_mirrors": "Der Linktitel spiegelt den aktuellen Titel der Notiz wider",
"link_title_arbitrary": "Der Linktitel kann beliebig geändert werden",
"link_title": "Linktitel",
"button_add_link": "Link hinzufügen"
"button_add_link": "Link hinzufügen",
"anchor": "Anker (optional)",
"anchor_none": "Link zu Notiz"
},
"branch_prefix": {
"edit_branch_prefix": "Zweigpräfix bearbeiten",
@@ -88,17 +100,23 @@
"also_delete_note": "Auch die Notiz löschen"
},
"delete_notes": {
"delete_notes_preview": "Vorschau der Notizen löschen",
"close": "Schließen",
"delete_all_clones_description": "auch alle Klone löschen (kann bei letzte Änderungen rückgängig gemacht werden)",
"erase_notes_description": "Beim normalen (vorläufigen) Löschen werden die Notizen nur als gelöscht markiert und sie können innerhalb eines bestimmten Zeitraums (im Dialogfeld „Letzte Änderungen“) wiederhergestellt werden. Wenn du diese Option aktivierst, werden die Notizen sofort gelöscht und es ist nicht möglich, die Notizen wiederherzustellen.",
"erase_notes_description": "Lösche Notizen sofort. Diese Aktion kann nicht rückgängig gemacht werden und erfordert einen Neustart der Applikation.",
"erase_notes_warning": "Notizen dauerhaft löschen (kann nicht rückgängig gemacht werden), einschließlich aller Klone. Dadurch wird ein Neuladen der Anwendung erzwungen.",
"notes_to_be_deleted": "Folgende Notizen werden gelöscht ({{notesCount}})",
"notes_to_be_deleted": "({{notesCount}}) Notizen werden gelöscht",
"no_note_to_delete": "Es werden keine Notizen gelöscht (nur Klone).",
"broken_relations_to_be_deleted": "Folgende Beziehungen werden gelöst und gelöscht ({{ relationCount}})",
"broken_relations_to_be_deleted": "Unterbrochene Beziehungen ({{relationCount}})",
"cancel": "Abbrechen",
"ok": "OK",
"deleted_relation_text": "Notiz {{- note}} (soll gelöscht werden) wird von Beziehung {{- relation}} ausgehend von {{- source}} referenziert."
"title": "Notizen löschen",
"clones_label": "Duplikate",
"delete_clones_description_one": "Löscht {{count}} weiteres Duplikat. Kann unter „Letzte Änderungen“ rückgängig gemacht werden.",
"delete_clones_description_other": "Löscht {{count}} weitere Duplikate. Kann unter „Letzte Änderungen“ rückgängig gemacht werden.",
"erase_notes_label": "Permanent löschen",
"table_note_with_relation": "Notiz mit Beziehung",
"table_relation": "Beziehung",
"delete": "Löschen",
"table_points_to": "Zeigt auf (gelöscht)"
},
"export": {
"export_note_title": "Notiz exportieren",
@@ -209,7 +227,8 @@
"box_size_small": "klein (~ 10 Zeilen)",
"box_size_medium": "mittel (~ 30 Zeilen)",
"box_size_full": "vollständig (Feld zeigt vollständigen Text)",
"button_include": "Notiz beifügen"
"button_include": "Notiz beifügen",
"box_size_expandable": "ausklappbar (standardmäßig zusammengeklappt)"
},
"info": {
"modalTitle": "Infonachricht",
@@ -270,33 +289,6 @@
"undelete_link": "Wiederherstellen",
"confirm_undelete": "Möchten Sie diese Notiz und ihre Unternotizen wiederherstellen?"
},
"revisions": {
"note_revisions": "Notizrevisionen",
"delete_all_revisions": "Lösche alle Revisionen dieser Notiz",
"delete_all_button": "Alle Revisionen löschen",
"help_title": "Hilfe zu Notizrevisionen",
"confirm_delete_all": "Möchtest du alle Revisionen dieser Notiz löschen?",
"no_revisions": "Für diese Notiz gibt es noch keine Revisionen...",
"confirm_restore": "Möchtest du diese Revision wiederherstellen? Dadurch werden der aktuelle Titel und Inhalt der Notiz mit dieser Revision überschrieben.",
"confirm_delete": "Möchtest du diese Revision löschen?",
"revisions_deleted": "Notizrevisionen wurden gelöscht.",
"revision_restored": "Die Notizrevision wurde wiederhergestellt.",
"revision_deleted": "Notizrevision wurde gelöscht.",
"snapshot_interval": "Notizrevisionen-Snapshot Intervall: {{seconds}}s.",
"maximum_revisions": "Maximale Revisionen für aktuelle Notiz: {{number}}.",
"settings": "Einstellungen für Notizrevisionen",
"download_button": "Herunterladen",
"mime": "MIME: ",
"file_size": "Dateigröße:",
"preview_not_available": "Für diesen Notiztyp ist keine Vorschau verfügbar.",
"restore_button": "Wiederherstellen",
"delete_button": "Löschen",
"diff_on": "Zeige Differenz",
"diff_off": "Zeige Inhalt",
"diff_on_hint": "Klicke, um die Differenz des Notiz-Quellcodes zu zeigen",
"diff_off_hint": "Klicke, um den Notizinhalt zu zeigen",
"diff_not_available": "Differenz-Abgleich ist nicht verfügbar."
},
"sort_child_notes": {
"sort_children_by": "Unternotizen sortieren nach...",
"sorting_criteria": "Sortierkriterien",
@@ -368,7 +360,7 @@
"calendar_root": "Markiert eine Notiz, die als Basis für Tagesnotizen verwendet werden soll. Nur einer sollte als solcher gekennzeichnet sein.",
"archived": "Notizen mit dieser Bezeichnung werden standardmäßig nicht in den Suchergebnissen angezeigt (auch nicht in den Dialogen „Springen zu“, „Link hinzufügen“ usw.).",
"exclude_from_export": "Notizen (mit ihrem Unterbaum) werden nicht im Notizexport inkludiert",
"run": "Definiert, bei welchen Ereignissen das Skript ausgeführt werden soll. Mögliche Werte sind:\n<ul>\n<li>frontendStartup - wenn das Trilium-Frontend startet (oder aktualisiert wird), außer auf mobilen Geräten.</li>\n<li>mobileStartup - wenn das Trilium-Frontend auf einem mobilen Gerät startet (oder aktualisiert wird).</li>\n<li>backendStartup - wenn das Trilium-Backend startet</li>\n<li>hourly - einmal pro Stunde ausführen. Du kannst das zusätzliche Label <code>runAtHour</code> verwenden, um die genaue Stunde festzulegen.</li>\n<li>daily - einmal pro Tag ausführen</li>\n</ul>",
"run": "Definiert bei welchen Ereignissen das Skript ausgeführt werden soll. Mögliche Werte sind:\n<ul>\n<li>frontendStartup - wenn das Trilium-Frontend startet (oder aktualisiert wird), außer auf mobilen Geräten.</li>\n<li>mobileStartup - wenn das Trilium-Frontend auf einem mobilen Gerät startet (oder aktualisiert wird).</li>\n<li>backendStartup - wenn das Trilium-Backend startet.</li>\n<li>hourly - einmal pro Stunde ausführen. Du kannst das zusätzliche Label <code>runAtHour</code> verwenden, um die genaue Stunde festzulegen.</li>\n<li>daily - einmal pro Tag ausführen</li>\n</ul>",
"run_on_instance": "Definiere, auf welcher Trilium-Instanz dies ausgeführt werden soll. Standardmäßig alle Instanzen.",
"run_at_hour": "Zu welcher Stunde soll das laufen? Sollte zusammen mit <code>#runu003dhourly</code> verwendet werden. Kann für mehr Läufe im Laufe des Tages mehrfach definiert werden.",
"disable_inclusion": "Skripte mit dieser Bezeichnung werden nicht in die Ausführung des übergeordneten Skripts einbezogen.",
@@ -446,7 +438,8 @@
"and_more": "... und {{count}} mehr.",
"print_landscape": "Beim Export als PDF, wird die Seitenausrichtung Querformat anstatt Hochformat verwendet.",
"print_page_size": "Beim Export als PDF, wird die Größe der Seite angepasst. Unterstützte Größen: <code>A0</code>, <code>A1</code>, <code>A2</code>, <code>A3</code>, <code>A4</code>, <code>A5</code>, <code>A6</code>, <code>Legal</code>, <code>Letter</code>, <code>Tabloid</code>, <code>Ledger</code>.",
"color_type": "Farbe"
"color_type": "Farbe",
"textarea": "Mehrzeilen-Text"
},
"attribute_editor": {
"help_text_body1": "Um ein Label hinzuzufügen, gebe einfach z.B. ein. <code>#rock</code> oder wenn du auch einen Wert hinzufügen möchten, dann z.B. <code>#year = 2024</code>",
@@ -705,7 +698,8 @@
"export_as_image_svg": "SVG (Vektor)",
"note_map": "Notizen Karte",
"view_revisions": "Notizrevisionen...",
"advanced": "Erweitert"
"advanced": "Erweitert",
"view_ocr_text": "OCR text anzeigen"
},
"onclick_button": {
"no_click_handler": "Das Schaltflächen-Widget „{{componentId}}“ hat keinen definierten Klick-Handler"
@@ -801,7 +795,10 @@
"expand_tooltip": "Erweitert die direkten Unterelemente dieser Sammlung (eine Ebene tiefer). Für weitere Optionen auf den Pfeil rechts klicken.",
"expand_first_level": "Direkte Unterelemente erweitern",
"expand_nth_level": "{{depth}} Ebenen erweitern",
"hide_child_notes": "Untergeordnete Notizen im Baum ausblenden"
"hide_child_notes": "Untergeordnete Notizen im Baum ausblenden",
"open_all_in_tabs": "Alle öffnen",
"open_all_in_tabs_tooltip": "Alle Resultate in neuen Tabs öffnen",
"open_all_confirm": "Dies öffnet {{count}} Notizen in neuen Tabs. Fortfahren?"
},
"edited_notes": {
"no_edited_notes_found": "An diesem Tag wurden noch keine Notizen bearbeitet...",
@@ -855,7 +852,8 @@
"collapse": "Auf normale Größe reduzieren",
"title": "Notizkarte",
"fix-nodes": "Knoten fixieren",
"link-distance": "Verbindungslänge"
"link-distance": "Verbindungslänge",
"too-many-notes": "Dieser Unterbaum enthält {{count}} Notizen, welche die Limitierung von {{max}} überschreitet die in der Notizkarte dargestellt werden können."
},
"note_paths": {
"title": "Notizpfade",
@@ -903,7 +901,7 @@
"limit": "Limit",
"limit_description": "Begrenze die Anzahl der Ergebnisse",
"debug": "debuggen",
"debug_description": "Debug gibt zusätzliche Debuginformationen in die Konsole aus, um das Debuggen komplexer Abfragen zu erleichtern",
"debug_description": "Debug gibt zusätzliche Protokolleinträge in der Konsole aus, um die Fehlerdiagnose komplexer Abfragen zu erleichtern",
"action": "Aktion",
"search_button": "Suchen",
"search_execute": "Aktionen suchen und ausführen",
@@ -935,7 +933,7 @@
},
"debug": {
"debug": "Debuggen",
"debug_info": "Debug gibt zusätzliche Debuginformationen in die Konsole aus, um das Debuggen komplexer Abfragen zu erleichtern.",
"debug_info": "Debug gibt zusätzliche Protokolleinträge in der Konsole aus, um die Fehlerdiagnose komplexer Abfragen zu erleichtern.",
"access_info": "Um auf die Debug-Informationen zuzugreifen, führe die Abfrage aus und klicke oben links auf \"Backend-Log anzeigen\"."
},
"fast_search": {
@@ -1046,7 +1044,6 @@
"unprotecting-title": "Ungeschützt-Status"
},
"relation_map": {
"open_in_new_tab": "In neuem Tab öffnen",
"remove_note": "Notiz entfernen",
"edit_title": "Titel bearbeiten",
"rename_note": "Notiz umbenennen",
@@ -1061,7 +1058,8 @@
"note_already_in_diagram": "Die Notiz \"{{title}}\" ist schon im Diagram.",
"enter_title_of_new_note": "Gebe den Titel der neuen Notiz ein",
"default_new_note_title": "neue Notiz",
"click_on_canvas_to_place_new_note": "Klicke auf den Canvas, um eine neue Notiz zu platzieren"
"click_on_canvas_to_place_new_note": "Klicke auf den Canvas, um eine neue Notiz zu platzieren",
"rename_relation": "Beziehung umbenennen"
},
"backend_log": {
"refresh": "Aktualisieren"
@@ -1070,15 +1068,17 @@
"title": "Konsistenzprüfungen",
"find_and_fix_button": "Finde und behebe die Konsistenzprobleme",
"finding_and_fixing_message": "Konsistenzprobleme finden und beheben...",
"issues_fixed_message": "Konsistenzprobleme sollten behoben werden."
"issues_fixed_message": "Konsistenzprobleme sollten behoben werden.",
"find_and_fix_label": "Finde und behebe Konsistenzprobleme",
"find_and_fix_description": "Suche nach Probleme mit der Datenkonsistenz in der Datenbank und repariere diese automatisch."
},
"database_anonymization": {
"title": "Datenbankanonymisierung",
"full_anonymization": "Vollständige Anonymisierung",
"full_anonymization_description": "Durch diese Aktion wird eine neue Kopie der Datenbank erstellt und anonymisiert (der gesamte Notizinhalt wird entfernt und nur die Struktur und einige nicht vertrauliche Metadaten bleiben übrig), sodass sie zu Debugging-Zwecken online geteilt werden kann, ohne befürchten zu müssen, dass Ihre persönlichen Daten verloren gehen.",
"full_anonymization_description": "Erstellt eine Kopie der Datenbank, wo der Inhalt der Notizen entfernt wurde. Es vergleicht lediglich die Struktur sowie nicht-kritische Metadaten. Sicher zum teilen für die Fehlerdiagnose.",
"save_fully_anonymized_database": "Speichere eine vollständig anonymisierte Datenbank",
"light_anonymization": "Leichte Anonymisierung",
"light_anonymization_description": "Durch diese Aktion wird eine neue Kopie der Datenbank erstellt und eine leichte Anonymisierung vorgenommen insbesondere wird nur der Inhalt aller Notizen entfernt, Titel und Attribute bleiben jedoch erhalten. Darüber hinaus bleiben benutzerdefinierte JS-Frontend-/Backend-Skriptnotizen und benutzerdefinierte Widgets erhalten. Dies bietet mehr Kontext zum Debuggen der Probleme.",
"light_anonymization_description": "Erstellt eine Kopie wo der Inhalt der Notiz entfernt ist, jedoch Title, Attribute und benutzerdefinierte Skripte erhalten bleiben. Hilfreich zur Fehlerdiagnose.",
"choose_anonymization": "Du kannst selbst entscheiden, ob du eine vollständig oder leicht anonymisierte Datenbank bereitstellen möchten. Selbst eine vollständig anonymisierte Datenbank ist sehr nützlich. In einigen Fällen kann jedoch eine leicht anonymisierte Datenbank den Prozess der Fehlererkennung und -behebung beschleunigen.",
"save_lightly_anonymized_database": "Speichere eine leicht anonymisierte Datenbank",
"existing_anonymized_databases": "Vorhandene anonymisierte Datenbanken",
@@ -1087,15 +1087,17 @@
"error_creating_anonymized_database": "Die anonymisierte Datenbank konnte nicht erstellt werden. Überprüfe die Backend-Protokolle auf Details",
"successfully_created_fully_anonymized_database": "Vollständig anonymisierte Datenbank in {{anonymizedFilePath}} erstellt",
"successfully_created_lightly_anonymized_database": "Leicht anonymisierte Datenbank in {{anonymizedFilePath}} erstellt",
"no_anonymized_database_yet": "Noch keine anonymisierte Datenbank."
"no_anonymized_database_yet": "Noch keine anonymisierte Datenbank.",
"description": "Erstellt eine anonymisierte Kopie deiner Datenbank für den Austausch mit Entwicklern zur Fehlerdiagnose, ohne persönliche Daten preiszugeben."
},
"database_integrity_check": {
"title": "Datenbankintegritätsprüfung",
"description": "Dadurch wird überprüft, ob die Datenbank auf SQLite-Ebene nicht beschädigt ist. Abhängig von der DB-Größe kann es einige Zeit dauern.",
"check_button": "Überprüfe die Datenbankintegrität",
"checking_integrity": "Datenbankintegrität prüfen...",
"integrity_check_succeeded": "Integritätsprüfung erfolgreich keine Probleme gefunden.",
"integrity_check_failed": "Integritätsprüfung fehlgeschlagen: {{results}}"
"integrity_check_failed": "Integritätsprüfung fehlgeschlagen: {{results}}",
"check_integrity_label": "Überprüfe die Datenbankintegrität",
"check_integrity_description": "Überprüfe die Datenbank auf SQLite Ebene auf Fehler."
},
"sync": {
"title": "Synchronisieren",
@@ -1105,14 +1107,18 @@
"filling_entity_changes": "Entitätsänderungszeilen werden gefüllt...",
"sync_rows_filled_successfully": "Synchronisierungszeilen erfolgreich gefüllt",
"finished-successfully": "Synchronisierung erfolgreich beendet.",
"failed": "Synchronisierung fehlgeschlagen: {{message}}"
"failed": "Synchronisierung fehlgeschlagen: {{message}}",
"force_full_sync_label": "Vollständige Synchronisierung erzwingen",
"force_full_sync_description": "Vollständige Synchronisation mit dem Sync-Server auslösen, lädt alle Änderungen erneut hoch."
},
"vacuum_database": {
"title": "Datenbank aufräumen",
"description": "Dadurch wird die Datenbank neu erstellt, was normalerweise zu einer kleineren Datenbankdatei führt. Es werden keine Daten tatsächlich geändert.",
"button_text": "Datenbank aufräumen",
"vacuuming_database": "Datenbank wird geleert...",
"database_vacuumed": "Die Datenbank wurde geleert"
"database_vacuumed": "Die Datenbank wurde geleert",
"vacuum_label": "Datenbank bereinigen",
"vacuum_description": "Datenbank neu aufbauen um die Dateigröße zu reduzieren. Keine Daten werden verändert."
},
"fonts": {
"theme_defined": "Thema definiert",
@@ -1123,10 +1129,7 @@
"note_tree_font": "Notizbaum-Schriftart",
"note_detail_font": "Notiz-Detail-Schriftart",
"monospace_font": "Minivan (Code) Schriftart",
"note_tree_and_detail_font_sizing": "Beachte, dass die Größe der Baum- und Detailschriftarten relativ zur Hauptschriftgrößeneinstellung ist.",
"not_all_fonts_available": "Möglicherweise sind nicht alle aufgelisteten Schriftarten auf Ihrem System verfügbar.",
"apply_font_changes": "Um Schriftartänderungen zu übernehmen, klicke auf",
"reload_frontend": "Frontend neu laden",
"not_all_fonts_available": "Möglicherweise sind nicht alle aufgelisteten Schriftarten auf Ihrem System verfügbar",
"generic-fonts": "Generische Schriftarten",
"sans-serif-system-fonts": "Sans-serif Systemschriftarten",
"serif-system-fonts": "Serif Systemschriftarten",
@@ -1135,7 +1138,9 @@
"serif": "Serif",
"sans-serif": "Sans Serif",
"monospace": "Monospace",
"system-default": "System Standard"
"system-default": "System Standard",
"custom_fonts": "Benutzerdefinierte Schriftarten verwenden",
"preview": "Vorschau"
},
"max_content_width": {
"title": "Inhaltsbreite",
@@ -1168,7 +1173,10 @@
"layout-horizontal-description": "Startleiste ist unter der Tableiste. Die Tableiste wird dadurch auf die ganze Breite erweitert.",
"auto_theme": "Alt (Folge dem Farbschema des Systems)",
"light_theme": "Alt (Hell)",
"dark_theme": "Alt (Dunkel)"
"dark_theme": "Alt (Dunkel)",
"modern_themes": "Modern",
"legacy_themes": "Veraltet",
"custom_themes": "Benutzerdefiniert"
},
"zoom_factor": {
"title": "Zoomfaktor (nur Desktop-Build)",
@@ -1196,18 +1204,25 @@
},
"images": {
"images_section_title": "Bilder",
"download_images_automatically": "Lade Bilder automatisch herunter, um sie offline zu verwenden.",
"download_images_description": "Eingefügter HTML-Code kann Verweise auf Online-Bilder enthalten. Trilium findet diese Verweise und lädt die Bilder herunter, sodass sie offline verfügbar sind.",
"enable_image_compression": "Bildkomprimierung aktivieren",
"max_image_dimensions": "Maximale Breite/Höhe eines Bildes in Pixel (die Größe des Bildes wird geändert, wenn es diese Einstellung überschreitet).",
"jpeg_quality_description": "JPEG-Qualität (10 schlechteste Qualität, 100 beste Qualität, 50 85 wird empfohlen)",
"max_image_dimensions_unit": "Pixel"
"download_images_automatically": "Bilder automatisch herunterladen",
"download_images_description": "Referenzierte online Bilder vom eingefügten HTML-Code herunterladen, damit diese offline zur Verfügung stehen.",
"enable_image_compression": "Bildkomprimierung",
"max_image_dimensions": "Maximale Maße eines Bildes",
"jpeg_quality_description": "Empfohlener Bereich liegt zwischen 50-85. Niedrige Werte reduzieren die Dateigröße, höhere Werte bewahren Details.",
"max_image_dimensions_unit": "Pixel",
"enable_image_compression_description": "Komprimieren und skalieren Bilder, wenn diese hochgeladen oder eingefügt werden.",
"max_image_dimensions_description": "Bilder, die diese Größe überschreiten, werden automatisch verkleinert.",
"jpeg_quality": "JPEG Qualität",
"ocr_section_title": "Text Extrahierung (OCR)",
"ocr_related_content_languages": "Inhaltssprachen (für Textextrahierung verwendet)",
"ocr_auto_process": "Neue Dateien automatisch verarbeiten",
"ocr_auto_process_description": "Text automatisch extrahieren von neu hochgeladenen oder eingefügten Dateien.",
"ocr_min_confidence": "Minimale Sicherheit"
},
"attachment_erasure_timeout": {
"attachment_erasure_timeout": "Zeitüberschreitung beim Löschen von Anhängen",
"attachment_auto_deletion_description": "Anhänge werden automatisch gelöscht (und gelöscht), wenn sie nach einer definierten Zeitspanne nicht mehr in ihrer Notiz referenziert werden.",
"erase_attachments_after": "Nicht verwendete Anhänge löschen nach:",
"manual_erasing_description": "Du kannst das Löschen auch manuell auslösen (ohne Berücksichtigung des oben definierten Timeouts):",
"erase_attachments_after": "Nicht verwendete Anhänge löschen nach",
"manual_erasing_description": "Manuelle Löschung aktivieren, ignoriert den obigen Zeitpunkt.",
"erase_unused_attachments_now": "Lösche jetzt nicht verwendete Anhangnotizen",
"unused_attachments_erased": "Nicht verwendete Anhänge wurden gelöscht."
},
@@ -1217,28 +1232,30 @@
},
"note_erasure_timeout": {
"note_erasure_timeout_title": "Beachte das Zeitlimit für die Löschung",
"note_erasure_description": "Gelöschte Notizen (und Attribute, Notizrevisionen...) werden zunächst nur als gelöscht markiert und können über den Dialog „Zuletzt verwendete Notizen” wiederhergestellt werden. Nach einer bestimmten Zeit werden gelöschte Notizen „gelöscht”, was bedeutet, dass ihr Inhalt nicht mehr wiederhergestellt werden kann. Mit dieser Einstellung können Sie die Zeitspanne zwischen dem Löschen und dem endgültigen Löschen der Notiz festlegen.",
"erase_notes_after": "Notizen löschen nach:",
"manual_erasing_description": "Du kannst das Löschen auch manuell auslösen (ohne Berücksichtigung des oben definierten Timeouts):",
"erase_notes_after": "Notizen löschen nach",
"manual_erasing_description": "Manuelle Löschung aktivieren, ignoriert den obigen Zeitpunkt.",
"erase_deleted_notes_now": "Jetzt gelöschte Notizen löschen",
"deleted_notes_erased": "Gelöschte Notizen wurden gelöscht."
},
"revisions_snapshot_interval": {
"note_revisions_snapshot_interval_title": "Snapshot-Intervall für Notizrevisionen",
"note_revisions_snapshot_description": "Das Snapshot-Zeitintervall für Notizrevisionen ist die Zeit, nach der eine neue Notizrevision erstellt wird. Weitere Informationen findest du im <doc>Wiki</doc>.",
"snapshot_time_interval_label": "Zeitintervall für Notiz-Revisions-Snapshot:"
"note_revisions_snapshot_interval_title": "Schnappschuss-Intervall für Notizrevisionen",
"note_revisions_snapshot_description": "Das Schnappschuss-Zeitintervall für Notizrevisionen ist die Zeit, nach der eine neue Notizrevision erstellt wird. Weitere Informationen finden Sie im <doc>Wiki</doc>.",
"snapshot_time_interval_label": "Schnappschuss Intervall",
"note_revisions_snapshot_description_short": "Zeit, nachdem eine neue Notizrevision erstellt wird."
},
"revisions_snapshot_limit": {
"note_revisions_snapshot_limit_title": "Limit für Notizrevision-Snapshots",
"note_revisions_snapshot_limit_description": "Das Limit für Notizrevision-Snapshots bezieht sich auf die maximale Anzahl von Revisionen, die für jede Notiz gespeichert werden können. Dabei bedeutet -1, dass es kein Limit gibt, und 0 bedeutet, dass alle Revisionen gelöscht werden. Du kannst das maximale Limit für Revisionen einer einzelnen Notiz über das Label #versioningLimit festlegen.",
"snapshot_number_limit_label": "Limit der Notizrevision-Snapshots:",
"snapshot_number_limit_label": "Maximale Revisionen",
"erase_excess_revision_snapshots": "Überschüssige Revision-Snapshots jetzt löschen",
"erase_excess_revision_snapshots_prompt": "Überschüssige Revision-Snapshots wurden gelöscht.",
"snapshot_number_limit_unit": "Momentaufnahmen"
"snapshot_number_limit_unit": "Momentaufnahmen",
"note_revisions_snapshot_limit_description_short": "Maximale Anzahl an Revisionen pro Notiz. Nutze -1 für unlimitiert oder 0 zum deaktivieren.",
"erase_excess_revision_snapshots_description": "Lösche Revisionen aller Notizen die das Limit überschreiten."
},
"search_engine": {
"title": "Suchmaschine",
"custom_search_engine_info": "Für eine benutzerdefinierte Suchmaschine müssen sowohl ein Name als auch eine URL festgelegt werden. Wenn keine dieser Optionen festgelegt ist, wird DuckDuckGo als Standardsuchmaschine verwendet.",
"custom_search_engine_info": "Wird verwendet bei der Suche im Web für den ausgewählten Text. Wenn nicht konfiguriert, wird DuckDuckGo verwendet.",
"predefined_templates_label": "Vordefinierte Suchmaschinenvorlagen",
"bing": "Bing",
"baidu": "Baidu",
@@ -1296,7 +1313,6 @@
"first-week-contains-first-thursday": "Erste Woche enthält den ersten Donnerstag des Jahres",
"first-week-has-minimum-days": "Erste Woche hat Mindestanzahl an Tagen",
"min-days-in-first-week": "Mindestanzahl an Tagen in erster Woche",
"first-week-info": "Die erste Woche, die den ersten Donnerstag des Jahres enthält, basiert auf dem Standard <a href=\"https://en.wikipedia.org/wiki/ISO_week_date#First_week\">ISO 8601</a>.",
"first-week-warning": "Das Ändern der Optionen für die erste Woche kann zu Duplikaten mit bestehenden Wochen-Notizen führen. Bestehende Wochen-Notizen werden nicht entsprechend aktualisiert.",
"formatting-locale": "Datums- und Zahlenformat",
"tuesday": "Dienstag",
@@ -1319,7 +1335,9 @@
"date-and-time": "Datum & Uhrzeit",
"path": "Pfad",
"database_backed_up_to": "Die Datenbank wurde gesichert unter {{backupFilePath}}",
"no_backup_yet": "noch kein Backup"
"no_backup_yet": "noch kein Backup",
"title": "Sicherung",
"download": "Download"
},
"etapi": {
"title": "ETAPI",
@@ -1358,14 +1376,17 @@
"protected_session_timeout_description": "Das Zeitlimit für geschützte Sitzungen ist ein Zeitraum, nach dem die geschützte Sitzung aus dem Speicher des Browsers gelöscht wird. Dies wird ab der letzten Interaktion mit geschützten Notizen gemessen. Sehen",
"wiki": "Wiki",
"for_more_info": "für weitere Informationen.",
"protected_session_timeout_label": "Zeitüberschreitung der geschützten Sitzung:",
"protected_session_timeout_label": "Automatisches beenden der Sitzung nach",
"reset_confirmation": "Durch das Zurücksetzen des Passworts verlierst du für immer den Zugriff auf alle Ihre bestehenden geschützten Notizen. Möchtest du das Passwort wirklich zurücksetzen?",
"reset_success_message": "Das Passwort wurde zurückgesetzt. Bitte lege ein neues Passwort fest",
"change_password_heading": "Kennwort ändern",
"set_password_heading": "Passwort festlegen",
"set_password": "Passwort festlegen",
"password_mismatch": "Neue Passwörter sind nicht dasselbe.",
"password_changed_success": "Das Passwort wurde geändert. Trilium wird neu geladen, nachdem du auf OK geklickt hast."
"password_changed_success": "Das Passwort wurde geändert. Trilium wird neu geladen, nachdem du auf OK geklickt hast.",
"change_password_description": "Aktualisiere dein aktuelles Passwort",
"reset_password": "Passwort zurücksetzen",
"cancel": "Abbrechen"
},
"shortcuts": {
"keyboard_shortcuts": "Tastaturkürzel",
@@ -1386,26 +1407,22 @@
"description": "Diese Optionen gelten nur für Desktop-Builds. Browser verwenden ihre eigene native Rechtschreibprüfung.",
"enable": "Aktiviere die Rechtschreibprüfung",
"language_code_label": "Sprachcode(s)",
"language_code_placeholder": "zum Beispiel \"en-US\", \"de-AT\"",
"multiple_languages_info": "Mehrere Sprachen können mit einem Komma getrennt werden z.B. \"en-US, de-DE, cs\". ",
"available_language_codes_label": "Verfügbare Sprachcodes:",
"restart-required": "Änderungen an den Rechtschreibprüfungsoptionen werden nach dem Neustart der Anwendung wirksam."
"restart-required": "Änderungen an den Rechtschreibprüfungsoptionen werden nach dem Neustart der Anwendung wirksam.",
"custom_dictionary_title": "Benutzerdefiniertes Wörterbuch",
"custom_dictionary_edit": "Benutzerdefiniert Wörter",
"custom_dictionary_open": "Wörterbuch bearbeiten"
},
"sync_2": {
"config_title": "Synchronisierungskonfiguration",
"server_address": "Adresse der Serverinstanz",
"timeout": "Synchronisierungs-Timeout (Millisekunden)",
"proxy_label": "Proxyserver synchronisieren (optional)",
"note": "Notiz",
"note_description": "Wenn du die Proxy-Einstellung leer lässt, wird der System-Proxy verwendet (gilt nur für Desktop-/Electron-Build).",
"special_value_description": "Ein weiterer besonderer Wert ist <code>noproxy</code>, der das Ignorieren sogar des System-Proxys erzwingt und <code>NODE_TLS_REJECT_UNAUTHORIZED</code> respektiert.",
"save": "Speichern",
"help": "Helfen",
"test_title": "Synchronisierungstest",
"test_description": "Dadurch werden die Verbindung und der Handshake zum Synchronisierungsserver getestet. Wenn der Synchronisierungsserver nicht initialisiert ist, wird er dadurch für die Synchronisierung mit dem lokalen Dokument eingerichtet.",
"test_button": "Teste die Synchronisierung",
"handshake_failed": "Handshake des Synchronisierungsservers fehlgeschlagen, Fehler: {{message}}",
"timeout_unit": "Millisekunden"
"handshake_failed": "Handshake des Synchronisierungsservers fehlgeschlagen, Fehler: {{message}}"
},
"api_log": {
"close": "Schließen"
@@ -1488,20 +1505,22 @@
"mermaid-diagram": "Mermaid Diagramm",
"canvas": "Leinwand",
"web-view": "Webansicht",
"mind-map": "Mind Map",
"mind-map": "Mindmap",
"file": "Datei",
"image": "Bild",
"launcher": "Starter",
"doc": "Dokument",
"widget": "Widget",
"confirm-change": "Es is nicht empfehlenswert den Notiz-Typ zu ändern, wenn der Inhalt der Notiz nicht leer ist. Möchtest du dennoch fortfahren?",
"confirm-change": "Es ist nicht empfehlenswert den Notiz-Typ zu ändern, wenn der Inhalt der Notiz nicht leer ist. Möchtest du dennoch fortfahren?",
"geo-map": "Geo-Karte",
"beta-feature": "Beta",
"book": "Sammlung",
"ai-chat": "KI Chat",
"ai-chat": "KI-Chat",
"task-list": "Aufgabenliste",
"new-feature": "Neu",
"collections": "Sammlungen"
"collections": "Sammlungen",
"spreadsheet": "Tabelle",
"llm-chat": "KI-Chat"
},
"protect_note": {
"toggle-on": "Notiz schützen",
@@ -1703,7 +1722,8 @@
"theme_none": "Keine Syntaxhervorhebung",
"theme_group_light": "Helle Themen",
"theme_group_dark": "Dunkle Themen",
"copy_title": "Kopiere in Zwischenablage"
"copy_title": "Kopiere in Zwischenablage",
"click_to_copy": "Klicke zum kopieren"
},
"classic_editor_toolbar": {
"title": "Format"
@@ -1722,7 +1742,7 @@
"title": "Fixiert",
"description": "Werkzeuge erscheinen im \"Format\" Tab."
},
"multiline-toolbar": "Toolbar wenn nötig in mehreren Zeilen darstellen."
"multiline-toolbar": "Toolbar wenn nötig in mehreren Zeilen darstellen"
}
},
"electron_context_menu": {
@@ -1813,8 +1833,9 @@
"custom_date_time_format": {
"title": "Benutzerdefiniertes Datums-/Zeitformat",
"description": "Passe das Format des Datums und der Uhrzeit an, die über <shortcut /> oder die Symbolleiste eingefügt werden. Die verfügbaren Format-Tokens sind unter <doc>Day.js docs</doc> zu finden.",
"format_string": "Format Zeichenfolge:",
"formatted_time": "Formatiertes Datum/Uhrzeit:"
"format_string": "Format Zeichenfolge",
"formatted_time": "Formatiertes Datum/Uhrzeit",
"preview": "Vorschau: {{preview}}"
},
"multi_factor_authentication": {
"title": "Multi-Faktor-Authentifizierung",
@@ -2045,7 +2066,9 @@
"title": "Experimentelle Optionen",
"disclaimer": "Diese Optionen sind experimentell und können Instabilitäten verursachen. Achtsam zu verwenden.",
"new_layout_name": "Neues Layout",
"new_layout_description": "Probiere das neue Layout für eine modernere Darstellung und verbesserte Benutzbarkeit aus. Kann sich in Zukunft stark ändern."
"new_layout_description": "Probiere das neue Layout für eine modernere Darstellung und verbesserte Benutzbarkeit aus. Kann sich in Zukunft stark ändern.",
"llm_name": "KI- / LLM-Chat",
"llm_description": "Aktiviert die KI-Chat Seitenleiste sowie LLM-Chat Notizen die von einem Sprachmodell betrieben werden."
},
"server": {
"unknown_http_error_title": "Kommunikationsfehler mit dem Server",
@@ -2182,5 +2205,182 @@
},
"setup_form": {
"more_info": "Mehr erfahren"
},
"media": {
"play": "Abspielen (Arbeitsbereich)",
"pause": "Pausieren (Arbeitsbereich)",
"back-10s": "10 s zurück (Linke Pfeiltaste)",
"forward-30s": "30 s vorwärts",
"mute": "Stumm (M)",
"unmute": "Stummschaltung aufheben (M)",
"playback-speed": "Wiedergabegeschwindigkeit",
"loop": "Schleife",
"disable-loop": "Schleife deaktivieren",
"rotate": "Rotieren",
"picture-in-picture": "Bild-in-Bild",
"exit-picture-in-picture": "Bild-in-Bild verlassen",
"fullscreen": "Vollbild (F)",
"exit-fullscreen": "Vollbild verlassen",
"unsupported-format": "Medienvorschau ist für dieses Format nicht verfügbar:\n{{mime}}",
"zoom-to-fit": "Zoomen um auszufüllen",
"zoom-reset": "Zoomen um auszufüllen zurücksetzen"
},
"mermaid": {
"placeholder": "Geben den Inhalt des Mermaid-Diagramms ein oder verwenden eine der folgenden Beispieldiagramme.",
"sample_diagrams": "Beispieldiagramme:",
"sample_flowchart": "Flussdiagramm",
"sample_class": "Klasse",
"sample_sequence": "Abfolge",
"sample_entity_relationship": "Entität Beziehung",
"sample_state": "Zustandsübergangsdiagramm",
"sample_mindmap": "Mindmap",
"sample_architecture": "Architektur",
"sample_block": "Block",
"sample_c4": "C4",
"sample_gantt": "Gantt",
"sample_git": "GitGraph",
"sample_kanban": "Kanban",
"sample_packet": "Paket",
"sample_pie": "Kuchen",
"sample_quadrant": "Quadrant",
"sample_radar": "Radar",
"sample_requirement": "Anforderung",
"sample_sankey": "Sankey",
"sample_timeline": "Zeitstrahl",
"sample_treemap": "Kachel",
"sample_user_journey": "Benutzererfahrung",
"sample_xy": "XY",
"sample_venn": "Mengen",
"sample_ishikawa": "Ursache-Wirkung"
},
"database": {
"title": "Datenbank"
},
"search": {
"title": "Suche",
"fuzzy_matching_label": "Fehlertoleranz bei Suche"
},
"text_editor": {
"title": "Editor"
},
"llm_chat": {
"placeholder": "Schreibe eine Nachricht...",
"send": "Senden",
"sending": "Sende...",
"empty_state": "Starte eine Unterhaltung indem du unten eine Nachricht schreibst.",
"searching_web": "Suche im Web...",
"web_search": "Websuche",
"note_tools": "Notizzugriff",
"sources": "Quellen",
"legacy_models": "Veraltete Modelle",
"thinking": "Denke...",
"thought_process": "Denkprozess",
"result": "Ergebnis",
"error": "Fehler",
"tool_error": "Fehlgeschlagen",
"total_tokens": "{{total}} Token",
"tokens": "Token",
"context_used": "{{percentage}}% verwendet",
"no_provider_message": "Kein KI-Anbieter konfiguriert. Fügen einen hinzu, um zu chatten.",
"add_provider": "KI-Anbieter hinzufügen",
"stop": "Stopp"
},
"sidebar_chat": {
"title": "KI-Chat",
"launcher_title": "KI-Chat öffnen",
"new_chat": "Neuen Chat starten",
"save_chat": "Chat in Notiz sichern",
"empty_state": "Starte Unterhaltung",
"history": "Chathistorie",
"recent_chats": "Kürzliche Chats",
"no_chats": "Keine vorherigen Chats"
},
"llm": {
"tools": {
"clone_note": "Notiz duplizieren",
"move_note": "Notiz verschieben",
"delete_note": "Notiz löschen",
"rename_note": "Notiz umbenennen",
"web_search": "Websuche",
"create_note": "Notiz erstellen",
"append_to_note": "An Notiz anhängen",
"get_note": "Notiz beziehen",
"search_notes": "Notizen durchsuchen"
},
"cancel": "Abbrechen",
"api_key": "API Schlüssel",
"delete_provider": "Löschen",
"actions": "Aktionen",
"provider_type": "Anbieter",
"provider_name": "Name",
"settings_title": "KI / LLM"
},
"mind-map": {
"summary": "Zusammenfassung",
"link": "Link"
},
"ocr": {
"view_extracted_text": "Extrahierten Text anzeigen (OCR)",
"open_media_settings": "Öffne Einstellungen",
"processing": "Verarbeite...",
"loading_text": "Lädt OCR Text...",
"extracted_text_title": "Extrahierter Text (OCR)",
"extracted_text": "Extrahierter Text (OCR)"
},
"revisions": {
"note_revisions": "Notizrevisionen",
"delete_all_revisions": "Lösche alle Revisionen dieser Notiz",
"delete_all_button": "Lösche alle Revisionen",
"help_title": "Hilfe zu Notizrevisionen",
"confirm_delete_all": "Möchten Sie alle Revisionen dieser Notiz löschen?",
"no_revisions": "Keine Revisionen für diese Notiz vorhanden...",
"restore_button": "Wiederherstellen",
"highlight_changes": "Änderungen hervorheben",
"diff_on": "Zeige Unterschiede",
"diff_off": "Zeige Inhalt",
"diff_on_hint": "Klicken, um Notizquellenunterschied anzuzeigen",
"diff_off_hint": "Klicken, um Notizinhalt anzuzeigen",
"diff_not_available": "Keine Unterschiede verfügbar.",
"confirm_restore": "Möchten sie diese Revision wiederherstellen? Diese Aktion überschreibt den aktuellen Titel und Inhalt der Notiz mit dieser Revision.",
"delete_button": "Löschen",
"confirm_delete": "Möchten Sie diese Revision löschen?",
"revisions_deleted": "Notiz-Revisionen wurden gelöscht.",
"revision_restored": "Notiz-Revisionen wurden wiederhergestellt.",
"revision_deleted": "Revision wurde gelöscht.",
"snapshot_interval": "Speicherintervall für Revisionsverlauf: {{seconds}} Sek.",
"maximum_revisions": "Maximale Anzahl an gespeicherten Revisionen einer Notiz: {{number}}.",
"save_revision_now": "Eine Revision jetzt speichern",
"save_named_revision": "Eine benannte Revision speichern...",
"snapshot_header": "Notizrevision Schnappschuss",
"snapshot_interval_value": "Speicherintervall: {{seconds}}s",
"snapshot_limit_value": "Grenze: {{number}}",
"settings": "Notizrevisionen-Einstellungen",
"menu_tooltip": "Revisionoptionen",
"download_button": "Herunterladen",
"mime": "MIME: ",
"file_size": "Dateigröße:",
"preview_not_available": "Keine Vorschau für diesen Notiztyp verfügbar.",
"save_revision": "Revision speichern",
"save_revision_tooltip": "Einen Schnappschus dieser Notiz speichern",
"description_placeholder": "Diese Revisionen benennen",
"revision_saved": "Notizrevision wurde gespeichert.",
"edit_description": "Name bearbeiten",
"description_updated": "Revisionsname wurde aktualisiert.",
"source_auto": "Automatisches Speichern",
"source_manual": "Manuelles Speichern",
"source_etapi": "ETAPI",
"source_llm": "LLM",
"source_restore": "Wiederherstellen",
"source_unknown": "Schnappschuss",
"date_today": "Heute",
"date_yesterday": "Gestern",
"date_this_week": "Diese Woche",
"date_this_month": "Dieser Monat",
"source_description_auto": "Automatisch vom System im Intervall gespeichert",
"source_description_manual": "Manuell vom Benutzer gespeichert",
"source_description_etapi": "Über die External Trilium API erstellt.",
"source_description_llm": "Von KI Assistenten erstellt",
"source_description_restore": "Gespeichert vor dem Wiederherstellen einer vorherigen Revision",
"source_description_unknown": "Quelle nicht verfügbar"
}
}
@@ -1,12 +1,5 @@
{
"about": {
"title": "Πληροφορίες για το Trilium Notes",
"homepage": "Αρχική Σελίδα:",
"app_version": "Έκδοση εφαρμογής:",
"db_version": "Έκδοση βάσης δεδομένων:",
"sync_version": "Έκδοση πρωτοκόλου συγχρονισμού:",
"build_date": "Ημερομηνία χτισίματος εφαρμογής:",
"build_revision": "Αριθμός αναθεώρησης χτισίματος:",
"data_directory": "Φάκελος δεδομένων:"
},
"toast": {
@@ -66,6 +66,172 @@
"set-custom-color": "Set custom note colour"
},
"about": {
"title": "About Trilium Notes"
"data_directory": "Data directory:"
},
"toast": {
"critical-error": {
"title": "Critical error",
"message": "A critical error has occurred which prevents the client application from starting:\n\n{{message}}\n\nThis is most likely caused by a script failing in an unexpected way. Try starting the application in safe mode and addressing the issue."
},
"widget-error": {
"title": "Failed to initialise a widget",
"message-custom": "Custom widget from note with ID \"{{id}}\", titled \"{{title}}\" could not be initialised due to:\n\n{{message}}",
"message-unknown": "Unknown widget could not be initialised due to:\n\n{{message}}"
},
"bundle-error": {
"title": "Failed to load a custom script",
"message": "Script could not be executed due to:\n\n{{message}}"
},
"widget-list-error": {
"title": "Failed to obtain the list of widgets from the server"
},
"widget-render-error": {
"title": "Failed to render a custom React widget"
},
"widget-missing-parent": "Custom widget does not have mandatory '{{property}}' property defined.\n\nIf this script is meant to be run without a UI element, use '#run=frontendStartup' instead.",
"open-script-note": "Open script note",
"scripting-error": "Custom script error: {{title}}"
},
"add_link": {
"add_link": "Add link",
"help_on_links": "Help on links",
"note": "Note",
"search_note": "search for note by its name",
"link_title_mirrors": "link title mirrors the note's current title",
"link_title_arbitrary": "link title can be changed arbitrarily",
"link_title": "Link title",
"anchor": "Anchor (optional)",
"anchor_none": "None (link to note)",
"button_add_link": "Add link"
},
"delete_notes": {
"delete_clones_description_one": "Also delete {{count}} other clone. Can be undone in recent changes.",
"delete_clones_description_other": "Also delete {{count}} other clones. Can be undone in recent changes.",
"title": "Delete notes",
"close": "Close",
"clones_label": "Clones",
"delete_all_clones_description": "Delete also all clones (can be undone in recent changes)",
"erase_notes_label": "Erase permanently",
"erase_notes_description": "Erase notes immediately instead of soft deletion. This cannot be undone and will force application reload.",
"erase_notes_warning": "Erase notes permanently (can't be undone), including all clones. This will force application reload.",
"notes_to_be_deleted": "Notes to be deleted ({{notesCount}})",
"no_note_to_delete": "No note will be deleted (only clones).",
"broken_relations_to_be_deleted": "Broken relations ({{relationCount}})",
"table_note_with_relation": "Note with relation",
"table_relation": "Relation",
"table_points_to": "Points to (deleted)",
"cancel": "Cancel",
"delete": "Delete"
},
"branch_prefix": {
"edit_branch_prefix": "Edit branch prefix",
"edit_branch_prefix_multiple": "Edit branch prefix for {{count}} branches",
"help_on_tree_prefix": "Help on Tree prefix",
"prefix": "Prefix: ",
"save": "Save",
"branch_prefix_saved": "Branch prefix has been saved.",
"branch_prefix_saved_multiple": "Branch prefix has been saved for {{count}} branches.",
"affected_branches": "Affected branches ({{count}}):"
},
"bulk_actions": {
"bulk_actions": "Bulk actions",
"affected_notes": "Affected notes",
"include_descendants": "Include descendants of the selected notes",
"available_actions": "Available actions",
"chosen_actions": "Chosen actions",
"execute_bulk_actions": "Execute bulk actions",
"bulk_actions_executed": "Bulk actions have been executed successfully.",
"none_yet": "None yet... add an action by clicking one of the available ones above.",
"labels": "Labels",
"relations": "Relations",
"notes": "Notes",
"other": "Other"
},
"clone_to": {
"clone_notes_to": "Clone notes to...",
"help_on_links": "Help on links",
"notes_to_clone": "Notes to clone",
"target_parent_note": "Target parent note",
"search_for_note_by_its_name": "search for note by its name",
"cloned_note_prefix_title": "Cloned note will be shown in note tree with given prefix",
"prefix_optional": "Prefix (optional)",
"clone_to_selected_note": "Clone to selected note",
"no_path_to_clone_to": "No path to clone to.",
"note_cloned": "Note \"{{clonedTitle}}\" has been cloned into \"{{targetTitle}}\""
},
"confirm": {
"confirmation": "Confirmation",
"cancel": "Cancel",
"ok": "OK",
"are_you_sure_remove_note": "Are you sure you want to remove the note \"{{title}}\" from relation map? ",
"if_you_dont_check": "If you don't check this, the note will be only removed from the relation map.",
"also_delete_note": "Also delete the note"
},
"export": {
"export_note_title": "Export note",
"close": "Close",
"export_type_subtree": "This note and all of its descendants",
"format_html": "HTML - recommended as it keeps all format",
"format_html_zip": "HTML in ZIP archive - this is recommended since this preserves all the formatting.",
"format_markdown": "Markdown - this preserves most of the formatting.",
"format_opml": "OPML - outliner interchange format for text only. Formatting, images and files are not included.",
"opml_version_1": "OPML v1.0 - plain text only",
"opml_version_2": "OPML v2.0 - allows also HTML",
"export_type_single": "Only this note without its descendants",
"export": "Export",
"choose_export_type": "Choose export type first please",
"export_status": "Export status",
"export_in_progress": "Export in progress: {{progressCount}}",
"export_finished_successfully": "Export finished successfully.",
"format_pdf": "PDF - for printing or sharing purposes.",
"share-format": "HTML for web publishing - uses the same theme that is used shared notes, but can be published as a static website."
},
"help": {
"title": "Cheatsheet",
"collapseSubTree": "collapse sub-tree",
"activateNextTab": "activate next tab",
"editShortcuts": "Edit keyboard shortcuts",
"noteNavigation": "Note navigation",
"goUpDown": "go up/down in the list of notes",
"collapseExpand": "collapse/expand node",
"notSet": "not set",
"goBackForwards": "go back / forwards in the history",
"showJumpToNoteDialog": "show <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/note-navigation.html#jump-to-note\">\"Jump to\" dialog</a>",
"scrollToActiveNote": "scroll to active note",
"jumpToParentNote": "jump to parent note",
"collapseWholeTree": "collapse whole note tree",
"tabShortcuts": "Tab shortcuts",
"newTabNoteLink": "on note link opens note in a new tab",
"newTabWithActivationNoteLink": "on note link opens and activates the note in a new tab",
"onlyInDesktop": "Only in desktop (Electron build)",
"openEmptyTab": "open empty tab",
"closeActiveTab": "close active tab",
"activatePreviousTab": "activate previous tab",
"creatingNotes": "Creating notes",
"createNoteAfter": "create new note after the active note",
"createNoteInto": "create new sub-note into active note",
"editBranchPrefix": "edit <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/tree-concepts.html#prefix\">prefix</a> of active note clone",
"movingCloningNotes": "Moving / cloning notes",
"moveNoteUpDown": "move note up/down in the note list",
"moveNoteUpHierarchy": "move note up in the hierarchy",
"multiSelectNote": "multi-select note above/below",
"selectAllNotes": "select all notes in the current level",
"selectNote": "select note",
"copyNotes": "copy active note (or current selection) into clipboard (used for <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">cloning</a>)",
"cutNotes": "cut current note (or current selection) into clipboard (used for moving notes)",
"pasteNotes": "paste note(s) as sub-note into active note (which is either move or clone depending on whether it was copied or cut into clipboard)",
"deleteNotes": "delete note / sub-tree",
"editingNotes": "Editing notes",
"editNoteTitle": "in tree pane will switch from tree pane into note title. Enter from note title will switch focus to text editor. <kbd>Ctrl+.</kbd> will switch back from editor to tree pane.",
"createEditLink": "create / edit external link",
"createInternalLink": "create internal link",
"followLink": "follow link under cursor",
"insertDateTime": "insert current date and time at caret position",
"jumpToTreePane": "jump away to the tree pane and scroll to active note",
"markdownAutoformat": "Markdown-like autoformatting",
"headings": "<code>##</code>, <code>###</code>, <code>####</code> etc. followed by space for headings",
"bulletList": "<code>*</code> or <code>-</code> followed by space for bullet list",
"numberedList": "<code>1.</code> or <code>1)</code> followed by space for numbered list",
"blockQuote": "start a line with <code>></code> followed by space for block quote"
}
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,12 +1,5 @@
{
"about": {
"title": "درباره Trilium Notes",
"homepage": "صفحه اصلی:",
"app_version": "نسخه برنامه:",
"db_version": "نسخه پایگاه داده:",
"sync_version": "نسخه منطبق:",
"build_date": "تاریخ ساخت:",
"build_revision": "نسخه بازنگری شده:",
"data_directory": "دایرکتوری داده:"
},
"toast": {
@@ -1,13 +1,6 @@
{
"about": {
"title": "Lisätietoja Trilium Notes:ista",
"homepage": "Kotisivu:",
"app_version": "Sovelluksen versio:",
"db_version": "Tietokannan versio:",
"build_date": "Koontipäivämäärä:",
"data_directory": "Datakansio:",
"sync_version": "Synkronoinnin versio:",
"build_revision": "Sovelluksen versio:"
"data_directory": "Datakansio:"
},
"toast": {
"critical-error": {
@@ -62,12 +55,10 @@
"also_delete_note": "Poista myös muistio"
},
"delete_notes": {
"delete_notes_preview": "Poista muistion esikatselu",
"close": "Sulje",
"notes_to_be_deleted": "Seuraavat muistiot tullaan poistamaan ({{notesCount}})",
"no_note_to_delete": "Muistioita ei poisteta (vain kopiot).",
"cancel": "Peruuta",
"ok": "OK"
"cancel": "Peruuta"
},
"export": {
"export_note_title": "Vie muistio",
+390 -102
View File
@@ -1,12 +1,5 @@
{
"about": {
"title": "À propos de Trilium Notes",
"homepage": "Page d'accueil :",
"app_version": "Version de l'application :",
"db_version": "Version de la base de données :",
"sync_version": "Version de la synchronisation :",
"build_date": "Date du build :",
"build_revision": "Version de build :",
"data_directory": "Répertoire des données :"
},
"toast": {
@@ -28,7 +21,10 @@
},
"widget-render-error": {
"title": "Rendu impossible d'un widget React custom"
}
},
"widget-missing-parent": "Le widget personnalisé ne comprend pas de propriété '{{property}}' définie\n\nSi ce script est prévu pour être exécuté sans fonctionnalité UI, utilisez '#run=frontendStartup' plutôt.",
"open-script-note": "Ouvrir une note script",
"scripting-error": "Échec du script personnalisé : {{title}}"
},
"add_link": {
"add_link": "Ajouter un lien",
@@ -46,7 +42,7 @@
"prefix": "Préfixe : ",
"save": "Sauvegarder",
"branch_prefix_saved": "Le préfixe de la branche a été enregistré.",
"edit_branch_prefix_multiple": "Modifier le préfixe de branche pour {{count}} branches",
"edit_branch_prefix_multiple": "Modifier le préfixe pour {{count}} branches",
"branch_prefix_saved_multiple": "Le préfixe de la branche a été sauvegardé pour {{count}} branches.",
"affected_branches": "Branches impactées ({{count}}):"
},
@@ -85,7 +81,6 @@
"also_delete_note": "Supprimer également la note"
},
"delete_notes": {
"delete_notes_preview": "Supprimer la note",
"close": "Fermer",
"delete_all_clones_description": "Supprimer aussi les clones (peut être annulé dans des modifications récentes)",
"erase_notes_description": "La suppression normale (douce) marque uniquement les notes comme supprimées et elles peuvent être restaurées (dans la boîte de dialogue des Modifications récentes) dans un délai donné. Cocher cette option effacera les notes immédiatement et il ne sera pas possible de les restaurer.",
@@ -94,8 +89,9 @@
"no_note_to_delete": "Aucune note ne sera supprimée (uniquement les clones).",
"broken_relations_to_be_deleted": "Les relations suivantes seront rompues et supprimées ({{ relationCount}})",
"cancel": "Annuler",
"ok": "OK",
"deleted_relation_text": "Note {{- note}} (à supprimer) est référencée dans la relation {{- relation}} provenant de {{- source}}."
"title": "Notes supprimées",
"clones_label": "Clone",
"erase_notes_label": "Supprimer définitivement"
},
"export": {
"export_note_title": "Exporter la note",
@@ -114,7 +110,7 @@
"export_in_progress": "Exportation en cours : {{progressCount}}",
"export_finished_successfully": "L'exportation s'est terminée avec succès.",
"format_pdf": "PDF - pour l'impression ou le partage de documents.",
"share-format": "HTML pour la publication Web - utilise le même thème que celui utilisé pour les notes partagées, mais peut être publié sous forme de site Web statique."
"share-format": "HTML pour la publication Web : utilise le même thème que celui utilisé pour les notes partagées, mais peut être publié sous forme de site Web statique."
},
"help": {
"noteNavigation": "Navigation dans les notes",
@@ -267,33 +263,6 @@
"undelete_link": "annuler la suppression",
"confirm_undelete": "Voulez-vous restaurer cette note et ses sous-notes ?"
},
"revisions": {
"note_revisions": "Versions de la note",
"delete_all_revisions": "Supprimer toutes les versions de cette note",
"delete_all_button": "Supprimer toutes les versions",
"help_title": "Aide sur les versions de notes",
"confirm_delete_all": "Voulez-vous supprimer toutes les versions de cette note ?",
"no_revisions": "Aucune version pour cette note pour l'instant...",
"confirm_restore": "Voulez-vous restaurer cette version ? Le titre et le contenu actuels de la note seront écrasés par cette version.",
"confirm_delete": "Voulez-vous supprimer cette version ?",
"revisions_deleted": "Les versions de notes ont été supprimées.",
"revision_restored": "La version de la note a été restaurée.",
"revision_deleted": "La version de la note a été supprimée.",
"snapshot_interval": "Délai d'enregistrement automatique des versions de notes : {{seconds}}s.",
"maximum_revisions": "Nombre maximal de versions : {{number}}.",
"settings": "Paramètres des versions de notes",
"download_button": "Télécharger",
"mime": "MIME : ",
"file_size": "Taille du fichier :",
"preview_not_available": "L'aperçu n'est pas disponible pour ce type de note.",
"restore_button": "Restaurer",
"delete_button": "Supprimer",
"diff_on": "Afficher les différences",
"diff_off": "Afficher le contenu",
"diff_on_hint": "Cliquer pour afficher les différences avec la note d'origine",
"diff_off_hint": "Cliquer pour afficher le contenu de la note",
"diff_not_available": "La comparaison n'est pas disponible."
},
"sort_child_notes": {
"sort_children_by": "Trier les enfants par...",
"sorting_criteria": "Critères de tri",
@@ -443,7 +412,8 @@
"and_more": "... et {{count}} plus.",
"print_landscape": "Lors de l'exportation en PDF, change l'orientation de la page en paysage au lieu de portrait.",
"print_page_size": "Lors de l'exportation en PDF, change la taille de la page. Valeurs supportées : <code>A0</code>, <code>A1</code>, <code>A2</code>, <code>A3</code>, <code>A4</code>, <code>A5</code>, <code>A6</code>, <code>Legal</code>, <code>Letter</code>, <code>Tabloid</code>, <code>Ledger</code>.",
"color_type": "Couleur"
"color_type": "Couleur",
"textarea": "Texte multiligne"
},
"attribute_editor": {
"help_text_body1": "Pour ajouter un label, tapez simplement par ex. <code>#rock</code>, ou si vous souhaitez également ajouter une valeur, tapez par ex. <code>#année = 2020</code>",
@@ -659,7 +629,8 @@
"show-cheatsheet": "Afficher l'aide rapide",
"toggle-zen-mode": "Zen Mode",
"new-version-available": "Nouvelle mise à jour disponible",
"download-update": "Obtenir la version {{latestVersion}}"
"download-update": "Obtenir la version {{latestVersion}}",
"search_notes": "Rechercher notes"
},
"zen_mode": {
"button_exit": "Sortir du Zen mode"
@@ -703,7 +674,8 @@
"advanced": "Avancé",
"export_as_image": "Exporter en tant qu'image",
"export_as_image_png": "PNG",
"export_as_image_svg": "SVG (vectoriel)"
"export_as_image_svg": "SVG (vectoriel)",
"note_map": "Note Carte"
},
"onclick_button": {
"no_click_handler": "Le widget bouton '{{componentId}}' n'a pas de gestionnaire de clic défini"
@@ -741,23 +713,25 @@
"button_title": "Exporter le diagramme au format SVG"
},
"relation_map_buttons": {
"create_child_note_title": "Créer une nouvelle note enfant et l'ajouter à cette carte de relation",
"create_child_note_title": "Créer une note enfant et l'ajouter à la carte",
"reset_pan_zoom_title": "Réinitialiser le panoramique et le zoom aux coordonnées et à la position initiales",
"zoom_in_title": "Zoomer",
"zoom_out_title": "Zoom arrière"
},
"zpetne_odkazy": {
"relation": "relation",
"backlink_one": "{{count}} Lien inverse",
"backlink_many": "",
"backlink_other": "{{count}} Liens inverses"
"backlink_one": "{{count}} Rétrolien",
"backlink_many": "{{count}} Rétroliens",
"backlink_other": "{{count}} Rétrolien"
},
"mobile_detail_menu": {
"insert_child_note": "Insérer une note enfant",
"delete_this_note": "Supprimer cette note",
"error_cannot_get_branch_id": "Impossible d'obtenir branchId pour notePath '{{notePath}}'",
"error_unrecognized_command": "Commande non reconnue {{command}}",
"note_revisions": "Révision de la note"
"note_revisions": "Révision de la note",
"backlinks": "Rétro-liens",
"content_language_switcher": "Langue du contenu: {{language}}"
},
"note_icon": {
"change_note_icon": "Changer l'icône de note",
@@ -766,7 +740,12 @@
"filter": "Filtre",
"filter-none": "Toutes les icônes",
"filter-default": "Icônes par défaut",
"icon_tooltip": "{{name}}\nPack d'icônes : {{iconPack}}"
"icon_tooltip": "{{name}}\nPack d'icônes : {{iconPack}}",
"no_results": "Aucune icône trouvée.",
"search_placeholder_one": "{{number}} icône recherchées parmi {{count}} packs.",
"search_placeholder_many": "{{number}} icônes recherchées parmi {{count}} packs.",
"search_placeholder_other": "{{number}} icônes recherchées parmi {{count}} packs.",
"search_placeholder_filtered": "Rechercher {{number}} icônes dans {{name}}"
},
"basic_properties": {
"note_type": "Type de note",
@@ -782,7 +761,7 @@
"collapse_all_notes": "Réduire toutes les notes",
"collapse": "Réduire",
"expand": "Développer",
"invalid_view_type": "Type de vue non valide '{{type}}'",
"invalid_view_type": "Type de vue '{{type}}' non valide",
"calendar": "Calendrier",
"book_properties": "Propriétés de la collection",
"table": "Tableau",
@@ -793,7 +772,8 @@
"expand_tooltip": "Développe les éléments enfants directs de cette collection (à un niveau). Pour plus d'options, appuyez sur la flèche à droite.",
"expand_first_level": "Développer les enfants directs",
"expand_nth_level": "Développer sur {{depth}} niveaux",
"expand_all_levels": "Développer tous les niveaux"
"expand_all_levels": "Développer tous les niveaux",
"hide_child_notes": "Masquer les notes enfants dans larborescence"
},
"edited_notes": {
"no_edited_notes_found": "Aucune note modifiée ce jour-là...",
@@ -806,7 +786,7 @@
"file_type": "Type de fichier",
"file_size": "Taille du fichier",
"download": "Télécharger",
"open": "Ouvrir",
"open": "Ouvrir dans une nouvelle fenêtre",
"upload_new_revision": "Téléverser une nouvelle version",
"upload_success": "Une nouvelle version de fichier a été téléversée.",
"upload_failed": "Le téléversement d'une nouvelle version de fichier a échoué.",
@@ -826,7 +806,8 @@
},
"inherited_attribute_list": {
"title": "Attributs hérités",
"no_inherited_attributes": "Aucun attribut hérité."
"no_inherited_attributes": "Aucun attribut hérité.",
"none": "aucun"
},
"note_info_widget": {
"note_id": "Identifiant de la note",
@@ -903,7 +884,8 @@
"unknown_search_option": "Option de recherche inconnue {{searchOptionName}}",
"search_note_saved": "La note de recherche a été enregistrée dans {{- notePathTitle}}",
"actions_executed": "Les actions ont été exécutées.",
"view_options": "Afficher les options:"
"view_options": "Afficher les options:",
"option": "option"
},
"similar_notes": {
"title": "Notes similaires",
@@ -997,7 +979,7 @@
"no_attachments": "Cette note ne contient aucune pièce jointe."
},
"book": {
"no_children_help": "Cette note de type Livre n'a aucune note enfant, donc il n'y a rien à afficher. Consultez le <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a> pour plus de détails.",
"no_children_help": "Cette collection ne contient pas de notes enfants, il n'y a donc rien à afficher.",
"drag_locked_title": "Edition verrouillée",
"drag_locked_message": "Le glisser-déposer n'est pas autorisé car l'édition de cette collection est verrouillé."
},
@@ -1036,7 +1018,6 @@
"unprotecting-title": "Statut de la non-protection"
},
"relation_map": {
"open_in_new_tab": "Ouvrir dans un nouvel onglet",
"remove_note": "Supprimer la note",
"edit_title": "Modifier le titre",
"rename_note": "Renommer la note",
@@ -1081,7 +1062,6 @@
},
"database_integrity_check": {
"title": "Vérification de l'intégrité de la base de données",
"description": "Vérifiera que la base de données n'est pas corrompue au niveau SQLite. Cela peut prendre un certain temps, en fonction de la taille de la base de données.",
"check_button": "Vérifier l'intégrité de la base de données",
"checking_integrity": "Vérification de l'intégrité de la base de données...",
"integrity_check_succeeded": "Le contrôle d'intégrité a réussi - aucun problème détecté.",
@@ -1113,10 +1093,7 @@
"note_tree_font": "Police de l'arborescence",
"note_detail_font": "Police du contenu des notes",
"monospace_font": "Police Monospace (code)",
"note_tree_and_detail_font_sizing": "Notez que la taille de la police de larborescence et du contenu est relative au paramètre de taille de police principal.",
"not_all_fonts_available": "Toutes les polices répertoriées peuvent ne pas être disponibles sur votre système.",
"apply_font_changes": "Pour appliquer les modifications de police, cliquez sur",
"reload_frontend": "recharger l'interface",
"generic-fonts": "Polices génériques",
"sans-serif-system-fonts": "Polices système sans serif",
"serif-system-fonts": "Polices système Serif",
@@ -1172,8 +1149,8 @@
},
"code_mime_types": {
"title": "Types MIME disponibles dans la liste déroulante",
"tooltip_syntax_highlighting": "Souligner la syntaxe",
"tooltip_code_block_syntax": "Blocs de code dans les notes de texte",
"tooltip_syntax_highlighting": "Mise en évidence de la syntaxe",
"tooltip_code_block_syntax": "Blocs de code dans les notes textuelles",
"tooltip_code_note_syntax": "Notes de code"
},
"vim_key_bindings": {
@@ -1195,8 +1172,7 @@
},
"attachment_erasure_timeout": {
"attachment_erasure_timeout": "Délai d'effacement des pièces jointes",
"attachment_auto_deletion_description": "Les pièces jointes sont automatiquement supprimées (et effacées) si elles ne sont plus référencées par leur note après un certain délai.",
"erase_attachments_after": "Effacer les pièces jointes inutilisées après :",
"erase_attachments_after": "Effacer les pièces jointes inutilisées après :",
"manual_erasing_description": "Vous pouvez également déclencher l'effacement manuellement (sans tenir compte du délai défini ci-dessus) :",
"erase_unused_attachments_now": "Effacez maintenant les pièces jointes inutilisées",
"unused_attachments_erased": "Les pièces jointes inutilisées ont été effacées."
@@ -1207,7 +1183,6 @@
},
"note_erasure_timeout": {
"note_erasure_timeout_title": "Délai d'effacement des notes",
"note_erasure_description": "Les notes supprimées (et les attributs, versions...) sont seulement marquées comme supprimées et il est possible de les récupérer à partir de la boîte de dialogue Notes récentes. Après un certain temps, les notes supprimées sont « effacées », ce qui signifie que leur contenu n'est plus récupérable. Ce paramètre vous permet de configurer la durée entre la suppression et l'effacement de la note.",
"erase_notes_after": "Effacer les notes après :",
"manual_erasing_description": "Vous pouvez également déclencher l'effacement manuellement (sans tenir compte de la durée définie ci-dessus) :",
"erase_deleted_notes_now": "Effacer les notes supprimées maintenant",
@@ -1291,7 +1266,6 @@
"first-week-contains-first-thursday": "La première semaine contient le premier jeudi de l'année",
"first-week-has-minimum-days": "La première semaine a un nombre minimum de jours",
"min-days-in-first-week": "Nombre minimum de jours dans la première semaine",
"first-week-info": "La première semaine contient le premier jeudi de l'année et est basée sur la norme <a href=\"https://en.wikipedia.org/wiki/ISO_week_date#First_week\">ISO 8601</a> .",
"first-week-warning": "La modification des options de la première semaine peut entraîner des doublons avec les notes de semaine existantes et les notes de semaine existantes ne seront pas mises à jour en conséquence.",
"formatting-locale": "Format de date et de nombre",
"formatting-locale-auto": "En fonction de la langue de l'application"
@@ -1368,16 +1342,14 @@
"description": "Description",
"reload_app": "Recharger l'application pour appliquer les modifications",
"set_all_to_default": "Réinitialiser aux valeurs par défaut",
"confirm_reset": "Voulez-vous vraiment réinitialiser tous les raccourcis clavier par défaut ?"
"confirm_reset": "Voulez-vous vraiment réinitialiser tous les raccourcis clavier par défaut ?",
"no_results": "Aucun raccourci correspondant à '{{filter}}'"
},
"spellcheck": {
"title": "Vérification orthographique",
"description": "Ces options s'appliquent uniquement aux versions de bureau, les navigateurs utiliseront leur propre vérification orthographique native.",
"enable": "Activer la vérification orthographique",
"language_code_label": "Code(s) de langue",
"language_code_placeholder": "par exemple \"fr-FR\", \"en-US\", \"de-AT\"",
"multiple_languages_info": "Plusieurs langues peuvent être séparées par une virgule, par ex. \"fr-FR, en-US, de-DE, cs\". ",
"available_language_codes_label": "Codes de langue disponibles :",
"restart-required": "Les modifications apportées aux options de vérification orthographique prendront effet après le redémarrage de l'application."
},
"sync_2": {
@@ -1385,16 +1357,12 @@
"server_address": "Adresse de l'instance du serveur",
"timeout": "Délai d'expiration de la synchronisation (millisecondes)",
"proxy_label": "Serveur proxy de synchronisation (facultatif)",
"note": "Note",
"note_description": "Si vous laissez le paramètre de proxy vide, le proxy système sera utilisé (applicable uniquement à la version de bureau/électronique).",
"special_value_description": "Une autre valeur spéciale est <code>noproxy</code> qui oblige à ignorer même le proxy système et respecte <code>NODE_TLS_REJECT_UNAUTHORIZED</code>.",
"save": "Sauvegarder",
"help": "Aide",
"test_title": "Test de synchronisation",
"test_description": "Testera la connexion et la prise de contact avec le serveur de synchronisation. Si le serveur de synchronisation n'est pas initialisé, cela le configurera pour qu'il se synchronise avec le document local.",
"test_button": "Tester la synchronisation",
"handshake_failed": "Échec de la négociation avec le serveur de synchronisation, erreur : {{message}}",
"timeout_unit": "millisecondes"
"handshake_failed": "Échec de la négociation avec le serveur de synchronisation, erreur : {{message}}"
},
"api_log": {
"close": "Fermer"
@@ -1403,7 +1371,7 @@
"will_be_deleted_in": "Cette pièce jointe sera automatiquement supprimée dans {{time}}",
"will_be_deleted_soon": "Cette pièce jointe sera bientôt supprimée automatiquement",
"deletion_reason": ", car la pièce jointe n'est pas liée dans le contenu de la note. Pour empêcher la suppression, ajoutez à nouveau le lien de la pièce jointe dans le contenu d'une note ou convertissez la pièce jointe en note.",
"role_and_size": "Rôle : {{role}}, Taille : {{size}}",
"role_and_size": "Rôle : {{role}}, Taille : {{size}}, MIME: {{- mimeType}}",
"link_copied": "Lien de pièce jointe copié dans le presse-papiers.",
"unrecognized_role": "Rôle de pièce jointe « {{role}} » non reconnu."
},
@@ -1454,10 +1422,13 @@
"import-into-note": "Importer dans la note",
"apply-bulk-actions": "Appliquer des Actions groupées",
"converted-to-attachments": "Les notes {{count}} ont été converties en pièces jointes.",
"convert-to-attachment-confirm": "Êtes-vous sûr de vouloir convertir les notes sélectionnées en pièces jointes de leurs notes parentes ?",
"convert-to-attachment-confirm": "Êtes-vous sûr de vouloir convertir les notes sélectionnées en pièces jointes de leurs notes parentales? Cette opération s'applique uniquement aux notes d'image, les autres notes seront ignorées.",
"archive": "Archive",
"unarchive": "Désarchiver",
"open-in-popup": "Modification rapide"
"open-in-popup": "Modification rapide",
"open-in-a-new-window": "Ouvrir dans une nouvelle fenêtre",
"hide-subtree": "Masquer le sous-arbre",
"show-subtree": "Afficher le sous-arbre"
},
"shared_info": {
"shared_publicly": "Cette note est partagée publiquement sur {{- link}}.",
@@ -1486,7 +1457,10 @@
"task-list": "Liste de tâches",
"book": "Collection",
"new-feature": "Nouveau",
"collections": "Collections"
"collections": "Collections",
"ai-chat": "Chat IA",
"llm-chat": "Chat AI",
"spreadsheet": "Feuille de calcul"
},
"protect_note": {
"toggle-on": "Protéger la note",
@@ -1517,7 +1491,13 @@
},
"highlights_list_2": {
"title": "Accentuations",
"options": "Options"
"options": "Options",
"title_with_count_one": "{{count}} mise en évidence",
"title_with_count_many": "{{count}} mises en évidence",
"title_with_count_other": "{{count}} mises en évidence",
"modal_title": "Configurer les mises en évidence",
"menu_configure": "Configuration des mises en évidence...",
"no_highlights": "Aucune mise en évidence."
},
"quick-search": {
"placeholder": "Recherche rapide",
@@ -1541,7 +1521,17 @@
"create-child-note": "Créer une note enfant",
"unhoist": "Désactiver le focus",
"toggle-sidebar": "Basculer la barre latérale",
"dropping-not-allowed": "Lâcher des notes à cet endroit n'est pas autorisé"
"dropping-not-allowed": "Déplacer des notes à cet emplacement n'est pas autorisé.",
"clone-indicator-tooltip": "Cette note a {{- count}} parents: {{- parents}}",
"clone-indicator-tooltip-single": "Cette note est clonée (1 parent supplémentaire: {{- parent}})",
"shared-indicator-tooltip": "Cette note est partagée publiquement",
"shared-indicator-tooltip-with-url": "Cette note est partagée publiquement sur: {{- url}}",
"subtree-hidden-tooltip_one": "{{count}} note enfant cachée de l'arbre",
"subtree-hidden-tooltip_many": "{{count}} notes enfants cachées de l'arbre",
"subtree-hidden-tooltip_other": "{{count}} notes enfants cachées de l'arbre",
"subtree-hidden-moved-title": "Ajouté à {{title}}",
"subtree-hidden-moved-description-collection": "Cette collection cache ses notes enfants dans l'arbre.",
"subtree-hidden-moved-description-other": "Les notes enfants sont cachées dans l'arbre pour cette note."
},
"title_bar_buttons": {
"window-on-top": "Épingler cette fenêtre au premier plan"
@@ -1552,7 +1542,12 @@
"printing_pdf": "Export au format PDF en cours...",
"print_report_title": "Imprimer le rapport",
"print_report_collection_details_button": "Consulter les détails",
"print_report_collection_details_ignored_notes": "Notes ignorées"
"print_report_collection_details_ignored_notes": "Notes ignorées",
"print_report_error_title": "Échec de l'impression",
"print_report_stack_trace": "Trace de la pile",
"print_report_collection_content_one": "La {{count}} note de la collection n'a pas pu être imprimée car elle n'est pas prises en charge ou est protégée.",
"print_report_collection_content_many": "Les {{count}} notes de la collection n'ont pas pu être imprimées car elles ne sont pas prises en charge ou sont protégées.",
"print_report_collection_content_other": "Les {{count}} notes de la collection n'ont pas pu être imprimées car elles ne sont pas prises en charge ou sont protégées."
},
"note_title": {
"placeholder": "saisir le titre de la note ici...",
@@ -1561,17 +1556,24 @@
"note_type_switcher_label": "Basculer de {{type}} à :",
"note_type_switcher_others": "Autre type de note",
"note_type_switcher_templates": "Modèle",
"note_type_switcher_collection": "Collection"
"note_type_switcher_collection": "Collection",
"edited_notes": "Notes éditées ce jour",
"promoted_attributes": "Attributs promus"
},
"search_result": {
"no_notes_found": "Aucune note n'a été trouvée pour les paramètres de recherche donnés.",
"search_not_executed": "La recherche n'a pas encore été exécutée. Cliquez sur le bouton \"Rechercher\" ci-dessus pour voir les résultats."
"search_not_executed": "La recherche n'a pas encore été exécutée.",
"search_now": "Recherche maintenant"
},
"spacer": {
"configure_launchbar": "Configurer la Barre de raccourcis"
},
"sql_result": {
"no_rows": "Aucune ligne n'a été renvoyée pour cette requête"
"no_rows": "Aucune ligne n'a été renvoyée pour cette requête",
"not_executed": "La requête n'a pas encore été exécutée.",
"failed": "L'exécution de requêtes SQL a échoué",
"statement_result": "Résultat de la déclaration",
"execute_now": "Exécuter maintenant"
},
"sql_table_schemas": {
"tables": "Tableaux"
@@ -1694,7 +1696,7 @@
"paste": "Coller",
"paste-as-plain-text": "Coller comme texte brut",
"search_online": "Rechercher «{{term}}» avec {{searchEngine}}",
"search_in_trilium": "Rechercher \"{{term}}\" dans Trilium"
"search_in_trilium": "Rechercher « {{term}} » dans Trilium"
},
"image_context_menu": {
"copy_reference_to_clipboard": "Copier la référence dans le presse-papiers",
@@ -1704,14 +1706,15 @@
"open_note_in_new_tab": "Ouvrir la note dans un nouvel onglet",
"open_note_in_new_split": "Ouvrir la note dans une nouvelle division",
"open_note_in_new_window": "Ouvrir la note dans une nouvelle fenêtre",
"open_note_in_popup": "Édition rapide"
"open_note_in_popup": "Édition rapide",
"open_note_in_other_split": "Ouvrir la note dans l'autre volet"
},
"electron_integration": {
"desktop-application": "Application de bureau",
"native-title-bar": "Barre de titre native",
"native-title-bar-description": "Sous Windows et macOS, désactiver la barre de titre native rend l'application plus compacte. Sous Linux, le maintien de la barre de titre native permet une meilleure intégration avec le reste du système.",
"background-effects": "Activer les effets d'arrière-plan (Windows 11 uniquement)",
"background-effects-description": "L'effet Mica ajoute un fond flou et élégant aux fenêtres de l'application, créant une profondeur et un style moderne.",
"background-effects": "Activer les effets d'arrière-plan",
"background-effects-description": "Ajoute un arrière-plan flou et élégant aux fenêtres d'application, créant de la profondeur et un style moderne. La « barre de titre native » doit être désactivée.",
"restart-app-button": "Redémarrez l'application pour afficher les modifications",
"zoom-factor": "Facteur de zoom"
},
@@ -1730,7 +1733,8 @@
"geo-map": {
"create-child-note-title": "Créer une nouvelle note enfant et l'ajouter à la carte",
"create-child-note-instruction": "Cliquez sur la carte pour créer une nouvelle note à cet endroit ou appuyez sur Échap pour la supprimer.",
"unable-to-load-map": "Impossible de charger la carte."
"unable-to-load-map": "Impossible de charger la carte.",
"create-child-note-text": "Ajouter le marqueur"
},
"geo-map-context": {
"open-location": "Ouvrir la position",
@@ -1835,12 +1839,13 @@
"book_properties_config": {
"hide-weekends": "Masquer les week-ends",
"display-week-numbers": "Afficher les numéros de semaine",
"map-style": "Style de carte :",
"map-style": "Style de carte",
"max-nesting-depth": "Profondeur d'imbrication maximale :",
"raster": "Trame",
"vector_light": "Vecteur (clair)",
"vector_dark": "Vecteur (foncé)",
"show-scale": "Afficher l'échelle"
"show-scale": "Afficher l'échelle",
"show-labels": "Afficher les noms des marqueurs"
},
"table_context_menu": {
"delete_row": "Supprimer la ligne"
@@ -1861,7 +1866,7 @@
"add-column-placeholder": "Entrez le nom de la colonne...",
"edit-note-title": "Cliquez pour modifier le titre de la note",
"edit-column-title": "Cliquez pour modifier le titre de la colonne",
"column-already-exists": "Cette colonne existe déjà dans le tableau."
"column-already-exists": "Cette colonne existe déjà sur le tableau."
},
"presentation_view": {
"edit-slide": "Modifier cette diapositive",
@@ -1891,22 +1896,30 @@
"next_theme_message": "Vous utilisez actuellement le thème hérité de l'ancienne version, souhaitez-vous essayer le nouveau thème?",
"next_theme_button": "Essayez le nouveau thème",
"background_effects_title": "Les effets d'arrière-plan sont désormais stables",
"background_effects_message": "Sur les appareils Windows, les effets d'arrière-plan sont désormais parfaitement stables. Ils ajoutent une touche de couleur à l'interface utilisateur en floutant l'arrière-plan. Cette technique est également utilisée dans d'autres applications comme l'Explorateur Windows.",
"background_effects_message": "Sur les appareils Windows et macOS les effets d'arrière-plan sont désormais stables. Ils ajoutent une touche de couleur à l'interface utilisateur en floutant l'arrière-plan.",
"background_effects_button": "Activer les effets d'arrière-plan",
"dismiss": "Rejeter"
"dismiss": "Rejeter",
"new_layout_title": "Nouvelle mise en page",
"new_layout_message": "Nous avons introduit une mise en page modernisée pour Trilium. Le ruban a été supprimé et intégré de manière transparente dans l'interface principale, avec une nouvelle barre d'état et des sections extensibles (telles que les attributs promus) reprenant les fonctions clés.\n\nLa nouvelle mise en page est activée par défaut et peut être temporairement désactivée via Options → Apparence.",
"new_layout_button": "Plus d'infos"
},
"settings": {
"related_settings": "Paramètres associés"
},
"settings_appearance": {
"related_code_blocks": "Schéma de coloration syntaxique pour les blocs de code dans les notes de texte",
"related_code_notes": "Schéma de couleurs pour les notes de code"
"related_code_notes": "Schéma de couleurs pour les notes de code",
"ui": "Interface utilisateur",
"ui_old_layout": "Ancienne mise en page",
"ui_new_layout": "Nouvelle mise en page"
},
"units": {
"percentage": "%"
},
"pagination": {
"total_notes": "{{count}} notes"
"total_notes": "{{count}} notes",
"prev_page": "Page précédente",
"next_page": "Page suivante"
},
"collections": {
"rendering_error": "Impossible d'afficher le contenu en raison d'une erreur."
@@ -1925,8 +1938,9 @@
"unknown_widget": "Widget inconnu pour « {{id}} »."
},
"note_language": {
"not_set": "Non défini",
"configure-languages": "Configurer les langues..."
"not_set": "Langage non défini",
"configure-languages": "Configurer les langues...",
"help-on-languages": "Aide sur les langues de contenu..."
},
"content_language": {
"title": "Contenu des langues",
@@ -1974,14 +1988,288 @@
"title": "Options expérimentales",
"disclaimer": "Ces options sont expérimentales et peuvent provoquer une instabilité. Utilisez avec prudence.",
"new_layout_name": "Nouvelle mise en page",
"new_layout_description": "Essayez la nouvelle mise en page pour un look plus moderne et un usage améliorée. Sous réserve de changements importants dans les prochaines versions."
"new_layout_description": "Essayez la nouvelle mise en page pour un look plus moderne et un usage améliorée. Sous réserve de changements importants dans les prochaines versions.",
"llm_name": "AI / LLM Chat",
"llm_description": "Activer la barre de chat AI et les notes de chat LLM alimentées par de grands modèles de langage."
},
"read-only-info": {
"read-only-note": "Vous consultez actuellement une note en lecture seule.",
"auto-read-only-note": "Cette note s'affiche en mode lecture seule pour un chargement plus rapide.",
"edit-note": "Editer la note"
"edit-note": "Modifier la note"
},
"calendar_view": {
"delete_note": "Effacer la note..."
"delete_note": "Supprimer la note..."
},
"media": {
"play": "Lire (Espace)",
"pause": "Pause (Espace)",
"back-10s": "Retour arrière 10s (flèche gauche)",
"forward-30s": "Avance 30s",
"mute": "Silence (M)",
"unmute": "Réactiver le son (M)",
"playback-speed": "Vitesse de lecture",
"loop": "Boucle",
"disable-loop": "Désactiver la boucle",
"rotate": "Rotation",
"picture-in-picture": "Image dans l'image",
"exit-picture-in-picture": "Sortir de Image dans l'image",
"fullscreen": "Plein-écran (F)",
"exit-fullscreen": "Sortir du mode plein-écran",
"unsupported-format": "L'aperçu multimédia n'est pas disponible pour ce format de fichier:\n{{mime}}",
"zoom-to-fit": "Zoom pour remplir",
"zoom-reset": "Annuler zoom pour remplir"
},
"render": {
"setup_title": "Afficher du HTML personnalisé ou Preact JSX dans cette note",
"setup_create_sample_preact": "Créer un exemple de note avec Preact",
"setup_create_sample_html": "Créer un exemple de note avec HTML",
"setup_sample_created": "Un exemple de note a été créé en tant que note enfant.",
"disabled_description": "Ces notes de rendu proviennent d'une source externe. Pour vous protéger de contenu malveillant, elle n'est pas activée par défaut. Assurez-vous de faire confiance à la source avant de lactiver.",
"disabled_button_enable": "Activer la note de rendu"
},
"web_view_setup": {
"title": "Créez la vue de la page Web directement dans Trilium",
"url_placeholder": "Entrez ou collez l'adresse du site Web, par exemple https://triliumnotes.org",
"create_button": "Créer une vue Web",
"invalid_url_title": "Adresse invalide",
"invalid_url_message": "Insérer une adresse Web valide, par exemple https://triliumnotes.org.",
"disabled_description": "Cette vue Web a été importée à partir d'une source externe. Pour vous protéger du phishing ou du contenu malveillant, elle ne se charge pas automatiquement. Vous pouvez l'activer si vous faites confiance à la source.",
"disabled_button_enable": "Activer la vue Web"
},
"llm_chat": {
"placeholder": "Tapez un message...",
"send": "Envoyer",
"sending": "Envoi...",
"empty_state": "Démarrez une conversation en tapant un message ci-dessous.",
"searching_web": "Recherche sur le Web...",
"web_search": "Recherche sur le Web",
"note_tools": "Accès aux notes",
"sources": "Sources",
"extended_thinking": "Réflexion étendue",
"legacy_models": "Modèles hérités",
"thinking": "Réflexion...",
"thought_process": "Processus de réflexion",
"tool_calls": "{{count}} appel(s) d'outil",
"input": "Entrée",
"result": "Résultat",
"error": "Erreur",
"tool_error": "échoué",
"total_tokens": "{{total}} jetons",
"tokens_detail": "{{prompt}} prompt + {{completion}} achèvement",
"tokens_used": "{{prompt}} prompt + {{completion}} achèvement = {{total}} jetons",
"tokens_used_with_cost": "{{prompt}} prompt + {{completion}} achèvement = {{total}} jetons (~${{cost}})",
"tokens_used_with_model": "{{model}}: {{prompt}} prompt + {{completion}} achèvement = {{total}} jetons",
"tokens_used_with_model_and_cost": "{{model}}: {{prompt}} prompt + {{completion}} achèvement = {{total}} jetons (~${{cost}})",
"tokens": "jetons",
"context_used": "{{percentage}}% utilisé",
"note_context_enabled": "Cliquez pour désactiver le contexte de la note : {{title}}",
"note_context_disabled": "Cliquez pour inclure la note actuelle dans le contexte",
"no_provider_message": "Aucun fournisseur d'IA configuré. Ajoutez en un pour commencer à discuter.",
"add_provider": "Ajouter un fournisseur d'IA"
},
"sidebar_chat": {
"title": "discussion IA",
"launcher_title": "Ouvrir la discussion IA",
"new_chat": "Démarrer une nouvelle discussion",
"save_chat": "Enregistrer la discussion dans les notes",
"empty_state": "Démarrer une conversation",
"history": "Historique des discussions",
"recent_chats": "Discussions récentes",
"no_chats": "Pas de discussions précédentes"
},
"note-color": {
"clear-color": "Retirer la couleur de la note",
"set-color": "Définir la couleur de la note",
"set-custom-color": "Définir la couleur personnalisée de la note"
},
"popup-editor": {
"maximize": "Basculer sur l'éditeur complet"
},
"server": {
"unknown_http_error_title": "Erreur de communication avec le serveur",
"unknown_http_error_content": "Code de statut: {{statusCode}}\nURL: {{method}} {{url}}\nMessage: {{message}}",
"traefik_blocks_requests": "Si vous utilisez le reverse proxy Traefik, celui-ci a introduit un changement de rupture qui affecte la communication avec le serveur."
},
"tab_history_navigation_buttons": {
"go-back": "Revenir à la note précédente",
"go-forward": "Aller vers la note suivante"
},
"breadcrumb": {
"hoisted_badge": "Remonté",
"hoisted_badge_title": "Redescendu",
"workspace_badge": "Espace de travail",
"scroll_to_top_title": "Aller au début de la note",
"create_new_note": "Créer une nouvelle note enfant",
"empty_hide_archived_notes": "Cacher les notes archivées"
},
"breadcrumb_badges": {
"read_only_explicit": "Lecture seule",
"read_only_explicit_description": "Cette note a été paramétrée manuellement en lecture seule.\nCliquer pour temporairement l'éditer.",
"read_only_auto": "Lecture seule automatique",
"read_only_auto_description": "Cette note a été réglée automatiquement en mode lecture seule pour des raisons de performances. Cette limite automatique est réglable à partir des paramètres.\n\nCliquez pour la modifier temporairement.",
"read_only_temporarily_disabled": "Temporairement modifiable",
"read_only_temporarily_disabled_description": "Cette note est actuellement modifiable, mais elle est normalement en lecture seule. La note redeviendra en lecture seule dès que vous accéderez à une autre note.\n\nCliquez pour réactiver le mode lecture seule.",
"shared_publicly": "Partagés publiquement",
"shared_locally": "Partagé localement",
"shared_copy_to_clipboard": "Copier le lien vers le presse-papier",
"shared_open_in_browser": "Ouvrir le lien dans le navigateur",
"shared_unshare": "Supprimer le partage",
"clipped_note": "Clip Web",
"clipped_note_description": "Cette note a été initialement construite depuis l'url {{url}}.\n\nCliquez pour accéder à la page Web source.",
"execute_script": "Exécuter le script",
"execute_script_description": "Cette note est une note de script. Cliquez pour exécuter le script.",
"execute_sql": "Exécuter la commande SQL",
"execute_sql_description": "Cette note est une note SQL. Cliquer pour exécuter la requête SQL.",
"save_status_saved": "Enregister",
"save_status_saving": "Enregistrement...",
"save_status_unsaved": "Non sauvée",
"save_status_error": "La sauvegarde a échoué",
"save_status_saving_tooltip": "Les modifications sont enregistrées.",
"save_status_unsaved_tooltip": "Il y a des changements non enregistrés. Ils seront enregistrés automatiquement dans un instant.",
"save_status_error_tooltip": "Une erreur s'est produite lors de l'enregistrement de la note. Si possible, essayez de copier le contenu de la note ailleurs et de recharger l'application."
},
"right_pane": {
"toggle": "Basculer le panneau de droite",
"custom_widget_go_to_source": "Aller sur le code source",
"empty_message": "Rien à afficher pour cette note",
"empty_button": "Cacher le panneau"
},
"pdf": {
"attachments_one": "{{count}} pièce jointe",
"attachments_many": "{{count}} pièces jointes",
"attachments_other": "{{count}} pièces jointes",
"layers_one": "{{count}} couche",
"layers_many": "{{count}} couches",
"layers_other": "{{count}} couches",
"pages_one": "{{count}} page",
"pages_many": "{{count}} pages",
"pages_other": "{{count}} pages",
"pages_alt": "Page {{pageNumber}}",
"pages_loading": "Chargement..."
},
"platform_indicator": {
"available_on": "Disponible sur {{platform}}"
},
"mobile_tab_switcher": {
"title_one": "{{count}} onglet",
"title_many": "{{count}} onglets",
"title_other": "{{count}} onglets",
"more_options": "Autres options"
},
"bookmark_buttons": {
"bookmarks": "Signets"
},
"active_content_badges": {
"type_icon_pack": "pack d'icônes",
"type_backend_script": "Script backend",
"type_frontend_script": "Script frontend",
"type_widget": "Widget",
"type_app_css": "CSS personnalisé",
"type_render_note": "Note de rendu",
"type_web_view": "Vue Web",
"type_app_theme": "Thème personnalisé",
"toggle_tooltip_enable_tooltip": "Cliquer pour activer {{type}}.",
"toggle_tooltip_disable_tooltip": "Cliquer pour désactiver ce {{type}}.",
"menu_docs": "Ouvrir la documentation",
"menu_execute_now": "Exécuter le script maintenant",
"menu_run": "Démarrer automatiquement",
"menu_run_disabled": "Manuellement",
"menu_run_backend_startup": "Lorsque le backend commence",
"menu_run_hourly": "Horaire",
"menu_run_daily": "Quotidien",
"menu_run_frontend_startup": "Lorsque le frontend du bureau démarre",
"menu_run_mobile_startup": "Lorsque le frontend mobile démarre",
"menu_change_to_widget": "Passer au widget",
"menu_change_to_frontend_script": "Passer au script frontend",
"menu_theme_base": "Thème de base"
},
"setup_form": {
"more_info": "En savoir plus"
},
"mermaid": {
"placeholder": "Tapez le contenu de votre diagramme Mermaid ou utilisez l'un des diagrammes de l'échantillon ci-dessous.",
"sample_diagrams": "Diagrammes d 'exemple:",
"sample_flowchart": "Organigramme",
"sample_class": "Classe",
"sample_sequence": "Séquence",
"sample_entity_relationship": "Entité relationnelle",
"sample_state": "État",
"sample_mindmap": "Carte mentale",
"sample_architecture": "Architecture",
"sample_block": "Bloc",
"sample_c4": "C4",
"sample_gantt": "Gantt",
"sample_git": "Git",
"sample_kanban": "Kanban",
"sample_packet": "Paquet",
"sample_pie": "Camembert",
"sample_quadrant": "Quadrant",
"sample_radar": "Radar",
"sample_requirement": "Exigence",
"sample_sankey": "Sankey",
"sample_timeline": "Chronologie",
"sample_treemap": "Arborescence",
"sample_user_journey": "Utilisateur Journey",
"sample_xy": "XY",
"sample_venn": "Venn",
"sample_ishikawa": "Ishikawa"
},
"mind-map": {
"addChild": "Ajouter un enfant",
"addParent": "Ajouter parent",
"addSibling": "Ajouter un frère",
"removeNode": "Supprimer le nœud",
"focus": "Mode Focus",
"cancelFocus": "Annuler le mode Focus",
"moveUp": "Monter",
"moveDown": "Descendre",
"link": "Lien",
"linkBidirectional": "Lien bidirectionnel",
"clickTips": "Cliquer sur le nœud cible",
"summary": "Résumé"
},
"llm": {
"settings_title": "AI / LLM",
"settings_description": "Configurer les intégrations AI et les LLM (Large Language Model).",
"add_provider": "Ajouter le fournisseur",
"add_provider_title": "Ajouter le fournisseur d'IA",
"configured_providers": "Fournisseurs configurés",
"no_providers_configured": "Aucun fournisseur n'est encore configuré.",
"provider_name": "Nom",
"provider_type": "Fournisseur",
"actions": "Actions",
"delete_provider": "Supprimer",
"delete_provider_confirmation": "Êtes-vous sûr de vouloir supprimer le fournisseur \"{{name}}\"?",
"api_key": "Clé API",
"api_key_placeholder": "Entrer votre clé API",
"cancel": "Annuler"
},
"status_bar": {
"language_title": "Changer de langue",
"note_info_title": "Afficher les informations sur les notes (par exemple, dates, taille des notes)",
"backlinks_one": "{{count}} rétrolien",
"backlinks_many": "{{count}} rétroliens",
"backlinks_other": "{{count}} rétroliens",
"backlinks_title_one": "voir le rétrolien",
"backlinks_title_many": "voir les rétroliens",
"backlinks_title_other": "voir les rétroliens",
"attachments_one": "{{count}} pièce-jointe",
"attachments_many": "{{count}} pièces-jointes",
"attachments_other": "{{count}} pièces-jointes",
"attachments_title_one": "Voir la pièce-jointe dans un nouvel onglet",
"attachments_title_many": "Voir les pièces-jointes dans un nouvel onglet",
"attachments_title_other": "Voir les pièces-jointes dans un nouvel onglet",
"attributes_one": "{{count}} attribut",
"attributes_many": "{{count}} attributs",
"attributes_other": "{{count}} attributs",
"attributes_title": "Attributs propres et attributs hérités",
"note_paths_one": "{{count}} chemin",
"note_paths_many": "{{count}} chemins",
"note_paths_other": "{{count}} chemins",
"note_paths_title": "Chemins de la note",
"code_note_switcher": "Changer de langue"
},
"attributes_panel": {
"title": "Attributs de la note"
}
}
File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More