Compare commits

...

1777 Commits

Author SHA1 Message Date
SiriusXT
91237918d8 fix(window): windowId is always main on mobile devices 2026-01-14 14:46:43 +08:00
SiriusXT
3f207663aa Merge branch 'main' into feat/extra-window 2026-01-14 14:28:28 +08:00
Elian Doran
f466367c4d Translations update from Hosted Weblate (#8384) 2026-01-14 07:48:07 +02:00
Yatrik Patel
924d495d2e Translated using Weblate (Hindi)
Currently translated at 7.2% (28 of 388 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/hi/
2026-01-14 05:42:20 +00:00
Hosted Weblate
0b5c1b648b 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-01-14 05:42:19 +00:00
Elian Doran
03ec39f52a chore(deps): update dependency @smithy/middleware-retry to v4.4.22 (#8377) 2026-01-14 07:42:05 +02:00
Elian Doran
f3ae1bf12c fix(deps): update dependency react-i18next to v16.5.3 (#8378) 2026-01-14 07:41:51 +02:00
Elian Doran
6d61cf41d9 chore(deps): update dependency @ckeditor/ckeditor5-dev-build-tools to v54.3.0 (#8379) 2026-01-14 07:41:35 +02:00
Elian Doran
333679523b fix(deps): update codemirror (#8381) 2026-01-14 07:41:17 +02:00
Elian Doran
1cd3a361f6 chore(deps): update node.js to v24.13.0 (#8380) 2026-01-14 07:41:03 +02:00
renovate[bot]
7405627663 fix(deps): update codemirror 2026-01-14 01:03:37 +00:00
renovate[bot]
2c4fb6c0d0 chore(deps): update node.js to v24.13.0 2026-01-14 01:02:53 +00:00
renovate[bot]
3e284208ef chore(deps): update dependency @ckeditor/ckeditor5-dev-build-tools to v54.3.0 2026-01-14 01:01:57 +00:00
renovate[bot]
42b7f4c795 fix(deps): update dependency react-i18next to v16.5.3 2026-01-14 01:01:06 +00:00
renovate[bot]
d445209eeb chore(deps): update dependency @smithy/middleware-retry to v4.4.22 2026-01-14 01:00:18 +00:00
Elian Doran
ed1bf17add feat(i18n): add workflow to check translation coverage (#8376) 2026-01-13 23:06:10 +02:00
Elian Doran
4800f2a172 chore(ci/i18n): add permissions 2026-01-13 22:56:27 +02:00
Elian Doran
e7ff364c01 chore(i18n): trigger on workflow change 2026-01-13 22:52:51 +02:00
Elian Doran
79ca299726 feat(i18n): add workflow to check translation coverage 2026-01-13 22:49:46 +02:00
Elian Doran
9d7ba48a6a Translations update from Hosted Weblate (#8375) 2026-01-13 22:28:17 +02:00
Gishky
9329665919 Translated using Weblate (English (United Kingdom))
Currently translated at 1.9% (34 of 1759 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/en_GB/
2026-01-13 21:23:46 +01:00
Gishky
f6821bce03 Translated using Weblate (German)
Currently translated at 100.0% (1759 of 1759 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/de/
2026-01-13 21:23:45 +01:00
Gishky
a7aedf93ab Translated using Weblate (German)
Currently translated at 100.0% (152 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/de/
2026-01-13 21:23:45 +01:00
Elian Doran
4ffcf01452 fix: mac alt shortcuts (#8369) 2026-01-13 22:23:38 +02:00
Elian Doran
618459d353 feat(flake): provide .#edit-docs as a standalone docs editor (#8350) 2026-01-13 22:22:58 +02:00
Elian Doran
6436c16449 Fix race condition in edit-docs Electron ready event (#8344) 2026-01-13 22:20:22 +02:00
Elian Doran
1bec457004 Translations update from Hosted Weblate (#8374) 2026-01-13 21:58:13 +02:00
Hosted Weblate
3e541e37fe 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-01-13 20:44:40 +01:00
Elian Doran
a41b78d36f feat(ux): show more helpful output when users encounter permissions issues within the data directory (#8273) 2026-01-13 21:44:30 +02:00
Elian Doran
79c50f3b4c fix(deps): update dependency react-i18next to v16.5.2 (#8348) 2026-01-13 13:38:55 +02:00
Elian Doran
0f54b01cdd chore(deps): update dependency @smithy/middleware-retry to v4.4.20 (#8362) 2026-01-13 10:45:41 +02:00
Elian Doran
41f2b03711 chore(deps): update dependency @redocly/cli to v2.14.5 (#8361) 2026-01-13 10:33:06 +02:00
Elian Doran
0be76f982c Merge branch 'main' into renovate/smithy-middleware-retry-4.x 2026-01-13 10:33:02 +02:00
Elian Doran
5deb277672 chore(deps): update vitest monorepo to v4.0.17 (#8363) 2026-01-13 10:32:25 +02:00
Elian Doran
3d15c9e94c Translations update from Hosted Weblate (#8370) 2026-01-13 10:22:31 +02:00
noobhjy
1363f94621 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1759 of 1759 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2026-01-13 08:14:58 +00:00
Kim Nøglegaard
abdcd6cc0c Translated using Weblate (Norwegian Bokmål)
Currently translated at 6.4% (25 of 388 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/nb_NO/
2026-01-13 08:14:58 +00:00
nvno
dc8abed2f3 Translated using Weblate (Portuguese)
Currently translated at 99.6% (1753 of 1759 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pt/
2026-01-13 08:14:57 +00:00
Kim Nøglegaard
892c2cd838 Translated using Weblate (Norwegian Bokmål)
Currently translated at 2.3% (41 of 1759 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/nb_NO/
2026-01-13 08:14:56 +00:00
Hosted Weblate
2796b29138 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-01-13 08:14:55 +00:00
Elian Doran
05620a129f chore(deps): update electron-forge monorepo to v7.11.1 (#8366) 2026-01-13 10:14:48 +02:00
renovate[bot]
cb11955a44 chore(deps): update vitest monorepo to v4.0.17 2026-01-13 08:12:19 +00:00
Elian Doran
c3623a15fb fix(ci): website workflow failing due to postinstall scripts 2026-01-13 10:09:51 +02:00
Wael Nasreddine
0273c64bbf Build edit-docs as standalone package using makeApp
Changed edit-docs from a simple wrapper script to a properly built Nix
package using makeApp, similar to how desktop and server are built.

Changes:
- Added build script to apps/edit-docs/package.json
- Created apps/edit-docs/scripts/build.ts based on desktop's build script
- Added edit-docs:build task to root package.json
- Changed flake.nix to use makeApp which:
  - Builds edit-docs with all dependencies bundled
  - Creates a standalone trilium-edit-docs executable
  - Can be installed with 'nix profile install' and run from any directory

This makes edit-docs truly reusable - it can now be installed and run
from any project without requiring the Trilium source tree.
2026-01-12 22:08:27 -08:00
Wael Nasreddine
5b37140ffa Fix race condition in edit-docs Electron ready event
The edit-docs tool would hang on startup when the Electron 'ready' event
fired before the event listener was registered. This race condition occurred
because:

1. startElectron() creates a deferred promise and registers a 'ready' listener
2. The 'ready' event fires asynchronously at some point during app initialization
3. If async work (like config loading) delays the listener registration,
   Electron may already be ready when app.on('ready', ...) is called
4. Once fired, the 'ready' event doesn't fire again, leaving the listener
   waiting forever

The fix checks electron.app.isReady() before registering the listener:
- If already ready: execute the handler immediately
- If not ready: register the listener as before

This ensures the initialization sequence completes regardless of timing.

The issue became apparent while working on making edit-docs reusable from
other projects (see #8343), where config loading added enough async delay
to consistently trigger the race condition.

Related: https://github.com/TriliumNext/Trilium/issues/8343
2026-01-12 22:08:27 -08:00
Wael Nasreddine
fb4d63b049 Add --config, --help, and --version flags to edit-docs
- Implement --config (-c) flag to allow custom configuration file paths.
- Add --help (-h) flag to display tool usage and available options.
- Add --version (-v) flag to display the current Trilium version.
- Update electron-start.mts to correctly pass command-line arguments to Electron.
- Synchronize edit-docs version with the root package.json via update-version.ts.
- Resolve config paths relative to the configuration file's directory.

This makes edit-docs more robust and easier to use from external projects
and immutable environments like Nix.
2026-01-12 22:08:27 -08:00
Wael Nasreddine
015e41e792 fix(edit-docs): Minify meta for format==share 2026-01-12 22:08:27 -08:00
Wael Nasreddine
8e47f33329 Refactor edit-docs to use edit-docs-config.yaml
This removes hardcoded configuration from edit-docs.ts and replaces
it with dynamic loading from edit-docs-config.yaml.

Changes:
- Removed BASE_URL and NOTE_MAPPINGS constants
- Removed DOCS_ROOT and USER_GUIDE_ROOT environment variable dependencies
- Added js-yaml for YAML parsing
- Config paths are resolved relative to repository root

The tool now reads configuration from edit-docs-config.yaml, making it
easier to customize without code changes. The pnpm script is simplified
since it no longer needs to pass complex environment variables.
2026-01-12 22:08:27 -08:00
Elian Doran
ad4a8ec5f4 chore(deps): use pinned versions 2026-01-13 07:40:20 +02:00
renovate[bot]
56356f9c61 fix(deps): update dependency react-i18next to v16.5.2 2026-01-13 05:38:17 +00:00
Elian Doran
abda0f9111 chore(deps): update dependency happy-dom to v20.1.0 (#8307) 2026-01-13 07:35:35 +02:00
Elian Doran
c2a9d21198 fix(deps): update dependency i18next to v25.7.4 (#8305) 2026-01-13 07:34:54 +02:00
Elian Doran
59ffa1fa93 fix(deps): update dependency diff to v8.0.3 (#8364) 2026-01-13 07:33:16 +02:00
Elian Doran
d056185368 chore(deps): update dependency eslint-plugin-playwright to v2.5.0 (#8365) 2026-01-13 07:32:37 +02:00
Elian Doran
251c1f6471 chore(deps): update typescript-eslint monorepo to v8.53.0 (#8367) 2026-01-13 07:32:15 +02:00
Chloe Lee
9efca9827e Merge branch 'main' into fix/mac-alt-shortcuts 2026-01-13 10:54:30 +08:00
renovate[bot]
f5e2129ad4 chore(deps): update typescript-eslint monorepo to v8.53.0 2026-01-13 01:17:33 +00:00
renovate[bot]
6c8e6f2429 chore(deps): update electron-forge monorepo to v7.11.1 2026-01-13 01:16:59 +00:00
renovate[bot]
9b4b1a393e chore(deps): update dependency eslint-plugin-playwright to v2.5.0 2026-01-13 01:16:28 +00:00
renovate[bot]
028334407c fix(deps): update dependency diff to v8.0.3 2026-01-13 01:15:54 +00:00
renovate[bot]
b93540b40d chore(deps): update dependency @smithy/middleware-retry to v4.4.20 2026-01-13 01:14:27 +00:00
renovate[bot]
9e7eba5eab chore(deps): update dependency @redocly/cli to v2.14.5 2026-01-13 01:13:45 +00:00
Elian Doran
fcfa64ae52 Translations update from Hosted Weblate (#8358) 2026-01-12 19:29:13 +02:00
Hosted Weblate
62f5b800b6 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-01-12 17:28:06 +00:00
Elian Doran
5b910cce56 fix: add "latex" alias for math command (#8357) 2026-01-12 19:27:50 +02:00
chloelee767
a5e8c8f573 add tests 2026-01-13 00:05:07 +08:00
Atmois
2c8edb413e fix: add "latex" alias for math command 2026-01-12 16:02:45 +00:00
chloelee767
644cc27fa7 fix alt shortcuts on mac not triggering 2026-01-12 23:05:42 +08:00
Elian Doran
71d3eb4fde Translations update from Hosted Weblate (#8340) 2026-01-12 07:58:21 +02:00
Elian Doran
7c2340d60e Apply suggestion from @gemini-code-assist[bot]
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-01-12 07:55:25 +02:00
Elian Doran
24013ef020 Apply suggestion from @gemini-code-assist[bot]
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-01-12 07:55:16 +02:00
renovate[bot]
72d9e846b7 fix(deps): update dependency i18next to v25.7.4 2026-01-12 05:55:15 +00:00
Yatrik Patel
b572ea0954 Translated using Weblate (Hindi)
Currently translated at 12.0% (14 of 116 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/hi/
2026-01-12 06:51:45 +01:00
Francis C.
060257fa06 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (1759 of 1759 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hant/
2026-01-12 06:51:44 +01:00
Yatrik Patel
1c6bb0a20e Translated using Weblate (Hindi)
Currently translated at 6.9% (27 of 388 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/hi/
2026-01-12 06:51:43 +01:00
Hosted Weblate
1479109582 Update translation files
Updated by "Cleanup translation files" add-on in Weblate.

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/
2026-01-12 06:51:42 +01:00
Yatrik Patel
13f4e38f48 Translated using Weblate (Hindi)
Currently translated at 6.6% (26 of 389 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/hi/
2026-01-12 06:51:41 +01:00
Yatrik Patel
5cbde8d32a Translated using Weblate (Hindi)
Currently translated at 1.1% (20 of 1759 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/hi/
2026-01-12 06:51:40 +01:00
Yatrik Patel
f3e3ef2f7d Translated using Weblate (Hindi)
Currently translated at 37.5% (57 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/hi/
2026-01-12 06:51:39 +01:00
Yatrik Patel
0a58f8108a Translated using Weblate (Hindi)
Currently translated at 10.3% (12 of 116 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/hi/
2026-01-12 06:51:38 +01:00
green
768213438a Translated using Weblate (Japanese)
Currently translated at 100.0% (1759 of 1759 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2026-01-12 06:51:38 +01:00
Kim Nøglegaard
00e0eb6f8a Translated using Weblate (Norwegian Bokmål)
Currently translated at 2.8% (11 of 389 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/nb_NO/
2026-01-12 06:51:37 +01:00
Kim Nøglegaard
3abea13d79 Translated using Weblate (Norwegian Bokmål)
Currently translated at 1.8% (33 of 1759 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/nb_NO/
2026-01-12 06:51:36 +01:00
noobhjy
67ab7f0c1e Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.8% (1757 of 1759 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2026-01-12 06:51:35 +01:00
Kim Nøglegaard
b38e8e27b2 Translated using Weblate (Norwegian Bokmål)
Currently translated at 2.5% (10 of 389 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/nb_NO/
2026-01-12 06:51:34 +01:00
Kim Nøglegaard
a70c103b93 Translated using Weblate (Norwegian Bokmål)
Currently translated at 1.4% (26 of 1759 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/nb_NO/
2026-01-12 06:51:34 +01:00
Yatrik Patel
b83c3090f7 Translated using Weblate (Hindi)
Currently translated at 1.0% (19 of 1759 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/hi/
2026-01-12 06:51:33 +01:00
Bart Louwers
59ee38e7a6 Translated using Weblate (Dutch)
Currently translated at 23.0% (35 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/nl/
2026-01-12 06:51:32 +01:00
Bart Louwers
890fe5929b Translated using Weblate (Dutch)
Currently translated at 4.2% (75 of 1751 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/nl/
2026-01-12 06:51:31 +01:00
nvno
56cc312565 Translated using Weblate (Portuguese)
Currently translated at 91.5% (1603 of 1751 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pt/
2026-01-12 06:51:30 +01:00
Elian Doran
9dfd015a27 fix(deps): update dependency preact to v10.28.2 [security] (#8301) 2026-01-12 07:51:22 +02:00
Elian Doran
04618dcdab fix(deps): update dependency react-window to v2.2.5 (#8353) 2026-01-12 07:50:09 +02:00
Elian Doran
f408e15c32 chore(deps): update dependency typedoc to v0.28.16 (#8352) 2026-01-12 07:49:20 +02:00
SiriusXT
21cb896849 feat(window): add the extra-window class to the body of extra windows 2026-01-12 09:58:43 +08:00
SiriusXT
b9bcb07b6d Merge branch 'main' into feat/extra-window 2026-01-12 09:20:14 +08:00
renovate[bot]
00e60c147c fix(deps): update dependency react-window to v2.2.5 2026-01-12 00:58:16 +00:00
renovate[bot]
ad6fd64226 chore(deps): update dependency typedoc to v0.28.16 2026-01-12 00:57:28 +00:00
renovate[bot]
6595fd9c10 chore(deps): update dependency happy-dom to v20.1.0 2026-01-11 14:43:06 +00:00
Elian Doran
a268507b80 chore(deps): update dependency ws to v8.19.0 (#8276) 2026-01-11 16:41:38 +02:00
renovate[bot]
9e847f67f2 chore(deps): update dependency ws to v8.19.0 2026-01-11 14:27:35 +00:00
renovate[bot]
df4992122b fix(deps): update dependency preact to v10.28.2 [security] 2026-01-11 14:26:08 +00:00
Elian Doran
a325ba7b8f chore(deps): update dependency @types/node to v24.10.7 (#8347) 2026-01-11 16:23:31 +02:00
Elian Doran
26e64ae7d0 Lightweight: Bootstrap index EJS (#8283) 2026-01-11 15:45:25 +02:00
renovate[bot]
d793774f51 chore(deps): update dependency @types/node to v24.10.7 2026-01-11 13:32:09 +00:00
Elian Doran
c5f2b5c177 fix(deps): update dependency react-window to v2.2.4 (#8275) 2026-01-11 15:31:53 +02:00
Elian Doran
b2f782f2a3 fix(deps): update dependency node-html-parser to v7.0.2 (#8306) 2026-01-11 15:31:24 +02:00
Elian Doran
b65b31ca4d chore(deps): update dependency vite to v7.3.1 (#8304) 2026-01-11 15:29:23 +02:00
Elian Doran
64827dcdcf fix(deps): update dependency mind-elixir to v5.5.0 (#8278) 2026-01-11 15:28:42 +02:00
Elian Doran
96d5d07087 chore(deps): update dependency @redocly/cli to v2.14.4 (#8316) 2026-01-11 15:27:44 +02:00
Elian Doran
ffd0f4727a chore(deps): update typescript-eslint monorepo to v8.52.0 (#8277) 2026-01-11 15:26:38 +02:00
Elian Doran
e33cd86d30 chore(deps): update dependency supertest to v7.2.2 (#8291) 2026-01-11 15:25:53 +02:00
Elian Doran
fc85c23a67 fix(deps): update dependency @codemirror/view to v6.39.9 (#8289) 2026-01-11 15:25:17 +02:00
Elian Doran
a55c8fb210 chore(deps): update dependency sax to v1.4.4 (#8317) 2026-01-11 15:24:44 +02:00
Elian Doran
19b865a5b4 chore(deps): update dependency express-openid-connect to v2.19.4 (#8327) 2026-01-11 15:24:10 +02:00
Elian Doran
61d90dda36 chore(deps): update dependency @smithy/middleware-retry to v4.4.19 (#8303) 2026-01-11 14:15:07 +02:00
Elian Doran
a4b1f06475 chore(deps): update dependency eslint-plugin-playwright to v2.4.1 (#8326) 2026-01-11 14:14:10 +02:00
Elian Doran
49704ea928 chore(deps): update dependency openai to v6.16.0 (#8328) 2026-01-11 14:13:32 +02:00
Elian Doran
a73df362d5 fix(deps): update dependency better-sqlite3 to v12.6.0 (#8349) 2026-01-11 14:13:06 +02:00
renovate[bot]
f42010e22a fix(deps): update dependency mind-elixir to v5.5.0 2026-01-11 10:28:35 +00:00
renovate[bot]
0b85e0fe2d fix(deps): update dependency better-sqlite3 to v12.6.0 2026-01-11 10:27:40 +00:00
renovate[bot]
c7f0720237 chore(deps): update typescript-eslint monorepo to v8.52.0 2026-01-11 10:26:45 +00:00
renovate[bot]
cc3031eaad chore(deps): update dependency supertest to v7.2.2 2026-01-11 10:25:13 +00:00
renovate[bot]
2850c7808c chore(deps): update dependency openai to v6.16.0 2026-01-11 10:24:24 +00:00
renovate[bot]
30bbcd866f fix(deps): update dependency react-window to v2.2.4 2026-01-11 10:22:53 +00:00
renovate[bot]
55b6f322ac fix(deps): update dependency node-html-parser to v7.0.2 2026-01-11 10:21:22 +00:00
Elian Doran
4518c9bb99 Merge remote-tracking branch 'origin/main' into lightweight/bootstrap_ejs 2026-01-11 12:20:17 +02:00
renovate[bot]
c551c863f4 fix(deps): update dependency @codemirror/view to v6.39.9 2026-01-11 10:19:51 +00:00
renovate[bot]
3c25f8b4f3 chore(deps): update dependency vite to v7.3.1 2026-01-11 10:19:14 +00:00
renovate[bot]
d3c37556c3 chore(deps): update dependency sax to v1.4.4 2026-01-11 10:18:42 +00:00
renovate[bot]
cf60fcd6c1 chore(deps): update dependency express-openid-connect to v2.19.4 2026-01-11 10:18:10 +00:00
renovate[bot]
97075ff91b chore(deps): update dependency eslint-plugin-playwright to v2.4.1 2026-01-11 10:17:37 +00:00
renovate[bot]
ce57a43d90 chore(deps): update dependency @smithy/middleware-retry to v4.4.19 2026-01-11 10:15:52 +00:00
renovate[bot]
33485369c3 chore(deps): update dependency @redocly/cli to v2.14.4 2026-01-11 10:15:00 +00:00
Elian Doran
7fcd93a61b e2e(server): fix broken e2e test after MathTex integration 2026-01-11 11:55:49 +02:00
Elian Doran
3d4b84c7c4 e2e(server): format file 2026-01-11 11:49:49 +02:00
Elian Doran
61eb4017dd Vite performance improvement (#8345) 2026-01-11 11:28:36 +02:00
Elian Doran
b4df4aaf0d chore(client): address requested changes 2026-01-11 11:06:59 +02:00
Elian Doran
244294f699 Revert "chore(scripts): remove analyze-perf"
This reverts commit 94d4a307cf.
2026-01-11 10:55:47 +02:00
Elian Doran
d609ee028e chore(client): get rid of workspace projects from optimizeDeps 2026-01-11 10:55:13 +02:00
Elian Doran
8dc8b046fb chore(client): reintroduce live refresh 2026-01-11 00:55:42 +02:00
Elian Doran
349203e300 chore(client): remove dependency to @preact/preset-vite 2026-01-11 00:35:11 +02:00
Elian Doran
83a8f07998 chore(client): change vite config 2026-01-11 00:33:40 +02:00
Elian Doran
94d4a307cf chore(scripts): remove analyze-perf 2026-01-11 00:21:38 +02:00
Elian Doran
2e35e0a830 chore(client): re-enable source maps 2026-01-11 00:21:32 +02:00
Elian Doran
ecdb819067 chore(scripts): address requested changes 2026-01-11 00:11:13 +02:00
Elian Doran
e2cf0c6e3e chore(client): disable preact preset-vite 2026-01-10 23:27:14 +02:00
Elian Doran
5dd600a291 chore(client): shared config 2026-01-10 23:09:51 +02:00
Elian Doran
df1beb1ffb chore(client): set up LightningCSS 2026-01-10 23:04:04 +02:00
Elian Doran
7773059ac0 chore(client): optimize babel 2026-01-10 22:40:20 +02:00
Elian Doran
a238fc16b2 chore(client): add more optimize deps 2026-01-10 22:26:01 +02:00
Elian Doran
e298f5ea6f chore(client): optimize dependencies more aggressively 2026-01-10 22:12:41 +02:00
Elian Doran
a5512267c1 feat(ckeditor5): lazy-load premium features 2026-01-10 21:54:35 +02:00
Elian Doran
f503c4ca6c feat(ckeditor5-math): use dynamic import to reduce loading time 2026-01-10 21:49:16 +02:00
Elian Doran
c834c01c8e chore(scripts): improve performance analysis script by timing out earlier 2026-01-10 21:48:27 +02:00
Elian Doran
1f72ab9593 chore(scripts): spawn process automatically 2026-01-10 21:20:13 +02:00
Elian Doran
c7d446f4aa chore(scripts): display time in seconds 2026-01-10 21:13:34 +02:00
Elian Doran
fb1530423d chore(scripts): add more categories to analyze performance 2026-01-10 21:12:35 +02:00
Elian Doran
545464efee chore(scripts): add a script to anlayze performance logs 2026-01-10 21:10:56 +02:00
Elian Doran
29d0223fd1 chore(server): address requested changes 2026-01-10 20:45:03 +02:00
Elian Doran
00852277f2 fix(server): some routes not working on prod 2026-01-10 20:43:43 +02:00
Elian Doran
edfe23d88c fix(server): server-side images not served in dev mode 2026-01-10 19:58:05 +02:00
Elian Doran
2b8a7a28d9 Merge remote-tracking branch 'origin/main' into lightweight/bootstrap_ejs 2026-01-10 19:51:05 +02:00
Elian Doran
7f29480237 Revert "refactor(client): get rid of runtime in favor of bootstrap script"
This reverts commit 2e845a9faa.
2026-01-10 19:51:03 +02:00
Elian Doran
61ac482946 Revert "chore(server): remove runtime from login"
This reverts commit 455edbfb5d.
2026-01-10 19:48:14 +02:00
Elian Doran
de6a6cbb07 feat(tree): open notes in new window from tree (#8269) 2026-01-10 19:37:12 +02:00
Elian Doran
2dcb003909 chore(deps): update pnpm to v10.28.0 (#8329) 2026-01-10 19:36:34 +02:00
Elian Doran
d5c934a518 add logseq to supported protocols (#8320) 2026-01-10 19:36:03 +02:00
Elian Doran
779909837c Allow hiding children from tree (especially for collections) (#8335) 2026-01-10 18:32:41 +02:00
Elian Doran
a4cb375a0f test(client): fix broken tests 2026-01-10 18:21:38 +02:00
Elian Doran
e2da8c28ca fix(tree): spotlighted note has + button & insert child context menu 2026-01-10 18:21:16 +02:00
Elian Doran
7808848f05 Translations update from Hosted Weblate (#8339) 2026-01-10 18:02:07 +02:00
Elian Doran
7c05109645 Merge remote-tracking branch 'origin/main' into feature/hide_from_tree 2026-01-10 18:01:05 +02:00
Hosted Weblate
8f9e89b73b 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-01-10 15:59:25 +00:00
Elian Doran
861a61a4d8 Tree performance improvement (#8274) 2026-01-10 17:59:08 +02:00
Elian Doran
52d4083814 chore(tree): address requested changes 2026-01-10 17:46:45 +02:00
Elian Doran
0272189b22 fix(tree): performance issue due to batch update 2026-01-10 17:32:06 +02:00
Elian Doran
ddba0e823c fix(tree): tree is updated on note content updates 2026-01-10 17:32:02 +02:00
Elian Doran
be81acb9e7 feat(tree): respect motion settings instead of always disabling animation 2026-01-10 16:11:15 +02:00
Elian Doran
3bb97385c9 fix(client): a case where inheritance boolean is not correct 2026-01-10 13:17:44 +02:00
Elian Doran
a72cec0494 chore(client): address a few requested changes 2026-01-10 13:06:13 +02:00
Elian Doran
cb02198c6f docs(user): document hiding the subtree 2026-01-10 12:57:11 +02:00
Elian Doran
298d438230 Merge branch 'feature/tree_performance_improvement' into feature/hide_from_tree 2026-01-10 12:34:44 +02:00
Elian Doran
cb2f7932dd Merge remote-tracking branch 'origin/main' into feature/tree_performance_improvement 2026-01-10 12:34:26 +02:00
Elian Doran
3354bd669f fix(client/tree): toast displayed when doing operations outside of tree 2026-01-10 12:32:55 +02:00
Elian Doran
8ad779be66 fix(client/load_results): component ID not preserved for attributes & branches 2026-01-10 12:26:08 +02:00
Elian Doran
f462034868 fix(client/tree): toast not appearing when inserted via paste 2026-01-10 11:55:49 +02:00
Elian Doran
26c25cd4cd fix(client): edge case not handled when parent note overrides to false 2026-01-10 11:25:00 +02:00
Elian Doran
6398830c2d test(client): attribute toggling 2026-01-10 11:15:21 +02:00
Elian Doran
0b065063f2 refactor(client): use same logic for setting boolean with inheritance 2026-01-10 10:37:19 +02:00
Elian Doran
a3a9de6fdd feat(collections): add setting to hide subtree 2026-01-10 10:34:06 +02:00
Elian Doran
d77d30f29e fix(note_tree): subtree hidden cannot be overridden through inheritance 2026-01-10 10:17:09 +02:00
Elian Doran
5cabc6379d fix(note_tree): not reacting to changes in subtreeHidden 2026-01-10 10:14:15 +02:00
Elian Doran
af537e6a48 feat(tree): add option to hide or show subtree 2026-01-10 10:08:50 +02:00
Elian Doran
faf3797663 feat(tree): disable insert child note if subnotes are hidden 2026-01-10 09:57:09 +02:00
Elian Doran
db57f3ff62 feat(tree): add tooltip when moving into hidden subtree 2026-01-10 09:53:23 +02:00
Elian Doran
0f77caad69 feat(tree): hide items dragged into a subtreeHidden 2026-01-10 09:40:19 +02:00
renovate[bot]
751b91e1b8 chore(deps): update pnpm to v10.28.0 2026-01-10 00:41:10 +00:00
Elian Doran
968a17fbfb fix(tree): alignment of note count badge 2026-01-10 00:55:33 +02:00
Elian Doran
712e87b39f feat(tree): distinguish spotlighted node 2026-01-10 00:52:11 +02:00
Elian Doran
0b40b42315 fix(tree): random exceptions when switching between two spotlighted notes 2026-01-10 00:42:24 +02:00
Elian Doran
62996b1162 feat(tree): remove spotlighted note after switching to another one 2026-01-10 00:38:28 +02:00
Elian Doran
b67ccc6091 feat(tree): basic spotlight support for hidden child 2026-01-10 00:15:59 +02:00
Elian Doran
211d2dcf99 feat(collections): hide children by default for some collection types 2026-01-09 20:06:49 +02:00
Elian Doran
ee52e16a75 feat(tree): add title for subnote count badge 2026-01-09 19:15:57 +02:00
Elian Doran
0c27bd25fa chore(tree): align child count to the right 2026-01-09 17:03:56 +02:00
Elian Doran
b6a6e78d01 feat(tree): hide add button if subtree is hidden 2026-01-09 16:59:55 +02:00
Elian Doran
92e6a29e70 feat(tree): display number of children if subtree is hidden 2026-01-09 16:54:04 +02:00
Elian Doran
acc8cee7cd Merge remote-tracking branch 'origin/feature/tree_performance_improvement' into feature/hide_from_tree 2026-01-09 16:38:56 +02:00
Elian Doran
afefbe154b feat(tree): hide arrow if children are hidden 2026-01-09 16:37:11 +02:00
SngAbc
83fa55b7d9 Merge branch 'main' into feat/tree/new_window 2026-01-09 22:35:30 +08:00
Elian Doran
4f6c10d995 feat(tree): allow hiding child notes via attribute 2026-01-09 16:32:55 +02:00
Elian Doran
ed972d2601 e2e(server): math popup fails on CI 2026-01-09 12:13:39 +02:00
Elian Doran
6b57ee5654 e2e(server): flakiness in tab_bar 2026-01-09 11:54:16 +02:00
contributor
e469af1ca5 add logseq to supported protocols 2026-01-09 11:51:49 +02:00
Elian Doran
6d41f076c2 Merge branch 'main' of https://github.com/TriliumNext/Trilium 2026-01-09 11:25:26 +02:00
Elian Doran
8cff591746 fix(toc): unnecessary <ol> when no children 2026-01-09 11:25:24 +02:00
SiriusXT
787b180378 Merge branch 'main' into feat/extra-window 2026-01-09 16:45:20 +08:00
Elian Doran
b3ccf89094 Translations update from Hosted Weblate (#8315) 2026-01-09 00:06:09 +02:00
Ulices
d31c6b1627 Translated using Weblate (Spanish)
Currently translated at 100.0% (152 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/es/
2026-01-08 23:01:53 +01:00
Yatrik Patel
1481356d1f Translated using Weblate (Hindi)
Currently translated at 36.8% (56 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/hi/
2026-01-08 23:01:52 +01:00
Ulices
a54661fd0a Translated using Weblate (Spanish)
Currently translated at 93.8% (1643 of 1751 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/es/
2026-01-08 23:01:49 +01:00
Elian Doran
ae4a3f10ae fix(toc): equations not rendered in new layout 2026-01-08 21:26:04 +02:00
Elian Doran
fe3160e7a1 e2e(server): adapt tests to new layout directly 2026-01-08 20:32:54 +02:00
Elian Doran
66659d4786 e2e(server): flaky test in PDF 2026-01-08 20:11:21 +02:00
Elian Doran
0b25b09040 feat(ci): check version consistency before releasing 2026-01-08 19:49:29 +02:00
Elian Doran
0d41cc2660 Merge remote-tracking branch 'origin/stable' 2026-01-08 19:42:10 +02:00
Elian Doran
f5e8822718 chore(release): prepare for v0.101.3 2026-01-08 19:38:21 +02:00
Elian Doran
bdc220ec12 Merge remote-tracking branch 'origin/stable' 2026-01-08 18:19:16 +02:00
Elian Doran
3eb68e5271 Stable fixes (#8310) 2026-01-08 18:16:55 +02:00
Elian Doran
521952ebcc test(client): remove debug statements 2026-01-08 18:10:00 +02:00
Elian Doran
034091a696 docs(release): prepare for v0.101.2 2026-01-08 18:08:34 +02:00
Elian Doran
ae881101d8 fix(note_list): archived notes displayed in empty grid card (closes #8184) 2026-01-08 17:23:40 +02:00
Elian Doran
b11a30c49c fix(launcher_bar): crashing if there is a non-launcher note (closes #8218) 2026-01-08 16:55:51 +02:00
Elian Doran
4625efda7f fix(note_list): skip rendering of included notes for performance (closes #8017) 2026-01-08 16:50:27 +02:00
Elian Doran
3c168d750d fix(client): cycle in include causing infinite loop (closes #8294) 2026-01-08 16:44:35 +02:00
Elian Doran
5cc7b259ce fix(client): max content width not preserved (closes #8065) 2026-01-08 15:59:57 +02:00
Elian Doran
f7ae046b20 fix(mermaid): error container not scrollable (closes #8299) 2026-01-08 15:52:19 +02:00
Elian Doran
02f43d6239 fix(mermaid): code not scrollable (closes #8299) 2026-01-08 15:33:16 +02:00
Elian Doran
53e1fa1047 fix(mermaid) diagrams not saving content and SVG attachment (#8220) 2026-01-08 15:22:07 +02:00
Elian Doran
b1dc0e234f fix(popupEditor): fix closing of popupEditor when inserting note link (#8224) 2026-01-08 15:21:23 +02:00
Elian Doran
9d380dd828 fix(sql_console): cannot copy table data (#8268) 2026-01-08 15:20:36 +02:00
Elian Doran
1f77540dbb fix(text): Title is not selected when creating a note via the launcher (#8292) 2026-01-08 15:20:14 +02:00
Elian Doran
455edbfb5d chore(server): remove runtime from login 2026-01-07 23:31:28 +02:00
Elian Doran
7288b66d27 chore(client): address requested changes 2026-01-07 23:04:34 +02:00
Elian Doran
3d72ec80bb refactor(client): get rid of any 2026-01-07 22:01:35 +02:00
Elian Doran
f2a74df511 feat(client): use hashes for assets 2026-01-07 21:49:05 +02:00
Elian Doran
68c6052d10 chore(client): remove useless manual chunk 2026-01-07 21:39:35 +02:00
Elian Doran
c4edb56bd4 fix(server): not starting due to serving of assets 2026-01-07 21:38:44 +02:00
Elian Doran
b6a3fe7cfb chore(client): get rid of translation issue 2026-01-07 21:18:09 +02:00
Elian Doran
7a088c5b7d refactor(client): handle everything in bootstrap 2026-01-07 21:11:38 +02:00
Elian Doran
2e845a9faa refactor(client): get rid of runtime in favor of bootstrap script 2026-01-07 21:08:19 +02:00
Elian Doran
ac3ae0dbbe chore(client): fix type issues 2026-01-07 21:02:27 +02:00
Elian Doran
a3fc13de3a refactor(client): extract bootstrap script into separate file 2026-01-07 21:00:40 +02:00
Elian Doran
ee6cbc710c chore(server): remove font size globs 2026-01-07 20:52:27 +02:00
Elian Doran
18d701525e fix(client): print broken due to lack of query forwarding
; Conflicts:
;	apps/client/src/index.html
2026-01-07 20:52:04 +02:00
Elian Doran
e47c848ec8 chore(server): reintegrate mobile layout 2026-01-07 20:51:33 +02:00
Elian Doran
cd64548299 fix(client): load custom fonts 2026-01-07 20:51:29 +02:00
Elian Doran
8645d053de fix(client): ckeditor theme not loaded properly 2026-01-07 20:51:24 +02:00
Elian Doran
91f2dabed7 Merge remote-tracking branch 'origin/main' into lightweight/bootstrap_ejs
; Conflicts:
;	apps/client/src/widgets/layout/StatusBar.tsx
2026-01-07 20:51:17 +02:00
Elian Doran
716612680d Translations update from Hosted Weblate (#8293) 2026-01-07 19:35:42 +02:00
Michael
3800fb85eb Translated using Weblate (German)
Currently translated at 95.4% (1672 of 1751 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/de/
2026-01-07 18:32:56 +01:00
Rafa Osuna
d807984be4 Translated using Weblate (Spanish)
Currently translated at 92.7% (1624 of 1751 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/es/
2026-01-07 18:32:56 +01:00
Giovi
2c92ae8898 Translated using Weblate (Italian)
Currently translated at 100.0% (1751 of 1751 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/it/
2026-01-07 18:32:55 +01:00
Argann Bonneau
3d8cbc81c4 Translated using Weblate (French)
Currently translated at 94.5% (1656 of 1751 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/fr/
2026-01-07 18:32:54 +01:00
Yatrik Patel
d747c94450 Translated using Weblate (Hindi)
Currently translated at 3.4% (4 of 116 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/hi/
2026-01-07 18:32:53 +01:00
pythaac
a627d1f96e Translated using Weblate (Korean)
Currently translated at 76.3% (116 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/ko/
2026-01-07 18:32:53 +01:00
Yatrik Patel
869db5e478 Translated using Weblate (Hindi)
Currently translated at 0.9% (17 of 1751 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/hi/
2026-01-07 18:32:52 +01:00
Yatrik Patel
73e94d385e Translated using Weblate (Hindi)
Currently translated at 5.9% (23 of 389 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/hi/
2026-01-07 18:32:51 +01:00
Kim Nøglegaard
8f4ebeb335 Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (152 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/nb_NO/
2026-01-07 18:32:51 +01:00
Yatrik Patel
263ee864be Translated using Weblate (Hindi)
Currently translated at 9.2% (14 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/hi/
2026-01-07 18:32:50 +01:00
Elian Doran
f078732624 fix(text): Title is not selected when creating a note via the launcher (#8292) 2026-01-07 19:32:37 +02:00
SngAbc
fac1f6b16c fix(text): Title is not focused when creating a note via the launcher
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-01-07 10:33:17 +08:00
SiriusXT
a5841c1423 fix(text): Title is not focused when creating a note via the launcher 2026-01-07 10:11:24 +08:00
Elian Doran
aaca18003d Translations update from Hosted Weblate (#8279) 2026-01-06 13:54:24 +02:00
Kim Nøglegaard
5ec521b024 Translated using Weblate (Norwegian Bokmål)
Currently translated at 68.4% (104 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/nb_NO/
2026-01-06 04:01:53 +01:00
Yatrik Patel
b3c0be7559 Translated using Weblate (Hindi)
Currently translated at 3.0% (12 of 389 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/hi/
2026-01-06 04:01:51 +01:00
Máté Zsólya
d52b735b99 Translated using Weblate (Hungarian)
Currently translated at 1.9% (34 of 1751 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/hu/
2026-01-06 04:01:49 +01:00
Yatrik Patel
639b1f2863 Translated using Weblate (Hindi)
Currently translated at 5.9% (9 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/hi/
2026-01-06 04:01:47 +01:00
Elian Doran
aff4f7e010 feat(tree): disable animation for performance 2026-01-06 01:34:02 +02:00
Elian Doran
dec4dafba6 feat(tree): avoid async 2026-01-06 01:26:56 +02:00
Elian Doran
d0cdcfc32c refactor(tree): use loop for mini optimisation 2026-01-06 01:21:43 +02:00
Elian Doran
0867b81c7a feat(tree): use template for create child to improve performance 2026-01-06 01:13:31 +02:00
Elian Doran
bde6068f2d refactor(tree): extract enchance title into separate method 2026-01-06 01:07:37 +02:00
Elian Doran
47fd2affa4 feat(tree): use direct DOM manipulation instead of jQuery 2026-01-06 00:59:32 +02:00
perfectra1n
2dd541e1d0 fix(tests): update data_dir tests for new EEXIST graceful handling 2026-01-05 14:34:52 -08:00
Elian Doran
7f2cc885fe Feat(math): Improve legacy math input with MathLive (#7842) 2026-01-06 00:12:38 +02:00
Elian Doran
19a365a370 fix(sql_console): cannot copy table data (#8268) 2026-01-06 00:10:11 +02:00
Elian Doran
9a50da328e chore(deps): update dependency rollup-plugin-webpack-stats to v2.1.9 (#8265) 2026-01-05 23:53:05 +02:00
Elian Doran
181e36a7c1 Merge remote-tracking branch 'origin/main' into Meinzzzz/main
; Conflicts:
;	.gitignore
2026-01-05 23:46:12 +02:00
Elian Doran
178508d245 Merge branch 'main' into fix/sql_select_text 2026-01-05 23:43:29 +02:00
Elian Doran
8157ef5e74 Merge branch 'main' into feat/show-helpful-permission-error-output 2026-01-05 23:43:20 +02:00
Elian Doran
d132d084cf Merge branch 'main' into renovate/rollup-plugin-webpack-stats-2.x 2026-01-05 23:43:06 +02:00
Elian Doran
494b55d685 fix(ckeditor): missing pl locale 2026-01-05 23:39:36 +02:00
perfectra1n
0185dd0d18 feat(ux): implement suggestions from gemini just to make sure 2026-01-05 11:55:14 -08:00
perfectra1n
142ed42d90 feat(ux): show more helpful output when users encounter permissions issues within the data directory 2026-01-05 11:38:18 -08:00
Elian Doran
51513d3779 fix(status_bar): count not refreshing properly after change 2026-01-05 21:03:32 +02:00
SiriusXT
5b95b9875b feat(tree): open notes in new window from tree 2026-01-05 19:27:44 +08:00
Elian Doran
688d197472 chore(client): set up body classes 2026-01-05 11:55:51 +02:00
Elian Doran
b745fb476e chore(client): get icons to load 2026-01-05 11:50:21 +02:00
Elian Doran
047b5a85d2 chore(client): load stylesheets 2026-01-05 11:48:19 +02:00
Elian Doran
370a0c6a05 feat(client): get desktop to start 2026-01-05 11:40:53 +02:00
Elian Doran
0d4558fee1 feat(client): get glob to be populated 2026-01-05 11:37:03 +02:00
Elian Doran
76526e0a96 feat(server): bootstrap route 2026-01-05 11:22:10 +02:00
Elian Doran
70093e0a7d feat(server): render static Vite HTML 2026-01-05 11:07:40 +02:00
SngAbc
458398f2ca Merge branch 'main' into fix/sql_select_text 2026-01-05 13:51:45 +08:00
SngAbc
7a6cc4f51e fix(sql_console): cannot copy table data
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-01-05 12:16:16 +08:00
SiriusXT
80404b83b0 Merge branch 'main' into feat/extra-window 2026-01-05 11:28:47 +08:00
SiriusXT
f4ccce7de5 fix(sql_console): cannot copy table data 2026-01-05 11:23:50 +08:00
SiriusXT
c612bdbfc1 fix(window): normalize closedAt of OpenNoteContexts for abnormally closed windows 2026-01-05 11:21:40 +08:00
renovate[bot]
f8b5417d6c chore(deps): update dependency rollup-plugin-webpack-stats to v2.1.9 2026-01-05 01:03:52 +00:00
Elian Doran
13ce8cf498 fix(note_list): the note list cannot open the context menu. (#8254) 2026-01-04 23:49:25 +02:00
Elian Doran
6c2afc086c feat(i18n): add Polish 2026-01-04 23:38:51 +02:00
Elian Doran
93d50712a9 chore(scripts): fix typecheck issue 2026-01-04 23:38:51 +02:00
Elian Doran
ed91a44928 feat(scripts): check translation coverage 2026-01-04 23:38:50 +02:00
Elian Doran
cd10e66fbb chore(scripts): build scripts not working properly on Windows 2026-01-04 23:38:50 +02:00
Elian Doran
d6aa126fcc Translations update from Hosted Weblate (#8264) 2026-01-04 22:34:38 +02:00
noobhjy
3308c7bdf4 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1751 of 1751 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2026-01-04 20:01:53 +00:00
Francis C.
56341a1a73 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (1751 of 1751 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hant/
2026-01-04 20:01:52 +00:00
green
0857e1a536 Translated using Weblate (Japanese)
Currently translated at 100.0% (1751 of 1751 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2026-01-04 20:01:50 +00:00
Kim Nøglegaard
5d6b25a29e Translated using Weblate (Norwegian Bokmål)
Currently translated at 57.2% (87 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/nb_NO/
2026-01-04 20:01:49 +00:00
Elian Doran
5bc15a5448 PDFjs v1 final tweaks (#8256) 2026-01-04 21:21:51 +02:00
Elian Doran
51a19d0544 docs(user): add missing slug 2026-01-04 21:11:13 +02:00
Elian Doran
fb4e912ed0 chore(pdfjs): address requested changes 2026-01-04 21:08:39 +02:00
Elian Doran
20c2652013 chore(server): set up environment for starting Nginx proxy with subdir 2026-01-04 20:33:54 +02:00
Elian Doran
971d6ad9e3 chore(pdfjs): use version-based system for cache busting 2026-01-04 20:06:11 +02:00
Elian Doran
757fc7a7fe chore(pdfjs): embed sandbox file 2026-01-04 18:50:40 +02:00
Elian Doran
e4d0a4554a feat(client/note_list): use built-in PDF viewer 2026-01-04 18:40:17 +02:00
Elian Doran
dfab7dbc4b fix(note_list): missing margin in button 2026-01-04 18:39:23 +02:00
Elian Doran
0039f4c155 feat(pdfjs): replace blob instead of creating a new revision every time 2026-01-04 17:25:56 +02:00
Elian Doran
23f7dc63b8 feat(pdfjs): enable editing features only if in main editor 2026-01-04 17:11:16 +02:00
Elian Doran
e485b75a44 fix(pdfjs): saves as soon as document is opened 2026-01-04 17:06:41 +02:00
SiriusXT
3a9e686533 chore(window): simplify replacement logic for open windows 2026-01-04 18:49:08 +08:00
Elian Doran
dbef57d329 chore(deps): update dependency webdriverio to v9.23.0 (#8258) 2026-01-04 10:36:47 +02:00
SiriusXT
9e8d89a170 chore(window): avoid missing windowId 2026-01-04 15:18:57 +08:00
SiriusXT
31c70938d6 Merge branch 'main' into feat/extra-window 2026-01-04 14:13:25 +08:00
SiriusXT
07f3c48d0b chore(window): import randomString only when needed 2026-01-04 14:13:18 +08:00
SiriusXT
c650441655 Merge branch 'main' into fix/note_list 2026-01-04 10:49:46 +08:00
SiriusXT
e573a8af77 chore(note_grid): remove unused tree import 2026-01-04 10:48:45 +08:00
SiriusXT
b23252d046 fix(note_grid): the note grid cannot open the context menu 2026-01-04 10:25:43 +08:00
renovate[bot]
2f7448dbd4 chore(deps): update dependency webdriverio to v9.23.0 2026-01-04 02:13:34 +00:00
Adorian Doran
9bf4aa2968 readme: update screenshot 2026-01-04 00:28:00 +02:00
Elian Doran
d78a7bad3b feat(import/markdown): handle bash as sh 2026-01-03 23:30:38 +02:00
Elian Doran
b812177e78 docs(user): add spellcheck=false to inline code 2026-01-03 23:28:28 +02:00
Elian Doran
4710a6af41 feat(export/markdown): add spellcheck=false to inline code 2026-01-03 23:19:58 +02:00
Elian Doran
a613980ea4 docs(user): add missing jsx / HTML code blocks 2026-01-03 22:56:23 +02:00
Elian Doran
20ae1f844b feat(markdown): support html, jsx in code blocks 2026-01-03 22:44:48 +02:00
Elian Doran
69511134e5 refactor(client/pdf): handle blob request on client side 2026-01-03 20:54:28 +02:00
Elian Doran
75952563e4 Translations update from Hosted Weblate (#8255) 2026-01-03 20:31:35 +02:00
Elian Doran
21cf5e1df7 chore(client/pdf): use custom spaced update hook 2026-01-03 20:29:54 +02:00
Hosted Weblate
9df5505989 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-01-03 18:03:22 +00:00
Kim Nøglegaard
1809d59193 Translated using Weblate (Norwegian Bokmål)
Currently translated at 43.4% (66 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/nb_NO/
2026-01-03 18:03:20 +00:00
Francis C.
feaa54d660 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (1745 of 1745 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hant/
2026-01-03 18:03:20 +00:00
noobhjy
c94bd41162 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.8% (1743 of 1745 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2026-01-03 18:03:19 +00:00
Elian Doran
f1f3e66537 Save indicator (#8249) 2026-01-03 20:03:12 +02:00
Elian Doran
80363cdc73 chore(client/save_indicator): fix some spacing issues 2026-01-03 19:53:46 +02:00
Elian Doran
02e08fdf12 chore(client/save_indicator): address requested changes 2026-01-03 19:47:33 +02:00
Elian Doran
42283b2469 doc(user): mention the save status indicator 2026-01-03 19:40:39 +02:00
Elian Doran
d3b598a5b2 fix(client/save_indicator): not visible on light theme 2026-01-03 19:39:16 +02:00
Elian Doran
0dd3a03c6b chore(client): fix type issue 2026-01-03 19:30:52 +02:00
Elian Doran
2144888447 Merge remote-tracking branch 'origin/main' into feature/save_indicator 2026-01-03 19:24:51 +02:00
Elian Doran
b2549066dc PDF.js refinement (#8247) 2026-01-03 19:24:28 +02:00
SiriusXT
2821b6da9d chore(window): add TS type WindowState 2026-01-03 20:04:17 +08:00
SiriusXT
daba7c398d Merge branch 'main' into feat/extra-window 2026-01-03 20:04:11 +08:00
SiriusXT
de1ef5b98b chore(test): fix errors caused by layout changes 2026-01-03 19:04:34 +08:00
SiriusXT
1bb206d978 chore(i18n): tabs total 2026-01-03 18:15:45 +08:00
Elian Doran
cd1f3aa9a7 chore(client): address self-review 2026-01-03 10:05:44 +02:00
Elian Doran
1674401342 Merge remote-tracking branch 'origin/main' into feature/pdfjs_refinement 2026-01-03 09:57:42 +02:00
Elian Doran
7ba8dbbf6e fix(deps): update dependency mind-elixir to v5.4.0 (#8253) 2026-01-03 09:53:36 +02:00
Elian Doran
ad27d9ed0e chore(deps): update dependency @redocly/cli to v2.14.3 (#8252) 2026-01-03 09:53:03 +02:00
SiriusXT
2fd5ddab86 chore(window): optimize the replacement logic for old window notes 2026-01-03 11:07:48 +08:00
renovate[bot]
482d2f9624 fix(deps): update dependency mind-elixir to v5.4.0 2026-01-03 01:46:19 +00:00
renovate[bot]
824ef704d4 chore(deps): update dependency @redocly/cli to v2.14.3 2026-01-03 01:45:28 +00:00
Adorian Doran
58b73cfc7d Merge branch 'main' of https://github.com/TriliumNext/Trilium 2026-01-03 02:25:07 +02:00
Adorian Doran
0465fea2db style/pdf viewer: improve appearance 2026-01-03 02:24:59 +02:00
Elian Doran
39b75e3561 Translations update from Hosted Weblate (#8248) 2026-01-03 00:10:42 +02:00
Elian Doran
2933db9b16 feat(save_indicator): fade out after a few seconds 2026-01-02 23:53:14 +02:00
Kim Nøglegaard
d94914046b Translated using Weblate (Norwegian Bokmål)
Currently translated at 23.0% (35 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/nb_NO/
2026-01-02 21:51:24 +00:00
Kim Nøglegaard
9cf384b14b Translated using Weblate (Norwegian Bokmål)
Currently translated at 20.3% (31 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/nb_NO/
2026-01-02 21:51:23 +00:00
Kim Nøglegaard
614a2f0ccb Translated using Weblate (Norwegian Bokmål)
Currently translated at 3.2% (5 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/nb_NO/
2026-01-02 21:51:23 +00:00
Yatrik Patel
5cecc72384 Translated using Weblate (Hindi)
Currently translated at 2.8% (11 of 389 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/hi/
2026-01-02 21:51:22 +00:00
Yatrik Patel
3ad37fb602 Translated using Weblate (Hindi)
Currently translated at 5.2% (8 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/hi/
2026-01-02 21:51:21 +00:00
noobhjy
42b048c2bf Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.8% (1742 of 1745 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2026-01-02 21:51:21 +00:00
Kim Nøglegaard
a01bf3dfa1 Translated using Weblate (Norwegian Bokmål)
Currently translated at 2.0% (8 of 389 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/nb_NO/
2026-01-02 21:51:20 +00:00
Yatrik Patel
ad60988553 Translated using Weblate (Hindi)
Currently translated at 0.7% (13 of 1745 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/hi/
2026-01-02 21:51:19 +00:00
green
c9ae4e4cc6 Translated using Weblate (Japanese)
Currently translated at 100.0% (1745 of 1745 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2026-01-02 21:51:18 +00:00
Kim Nøglegaard
d2639851d5 Translated using Weblate (Norwegian Bokmål)
Currently translated at 0.6% (11 of 1745 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/nb_NO/
2026-01-02 21:51:18 +00:00
Hosted Weblate
8dc5f9cfa4 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-01-02 21:51:17 +00:00
Adorian Doran
d99a408e04 style/pdf viewer: add support for background effects 2026-01-02 23:51:07 +02:00
Elian Doran
5f14861682 feat(save_indicator): indicate errors 2026-01-02 23:22:33 +02:00
Adorian Doran
8f8493f3ec client/note split: allow enabling background effects according to the MIME type 2026-01-02 23:06:08 +02:00
Elian Doran
62af66b5ae feat(save_indicator): report saving and saved states 2026-01-02 22:53:18 +02:00
Elian Doran
e8d1fa7447 chore(save_indicator): basic infrastructure to display state 2026-01-02 22:44:29 +02:00
Adorian Doran
ee03871405 style/pdf viewer: remove irrelevant elements 2026-01-02 22:28:33 +02:00
Elian Doran
345378d97f feat(save_indicator): add tooltip for each of the states 2026-01-02 22:14:58 +02:00
Elian Doran
07a463ee52 feat(save_indicator): improve display of some states 2026-01-02 22:10:41 +02:00
Elian Doran
3157047160 chore(save_indicator): add opacity 2026-01-02 22:00:25 +02:00
Elian Doran
a1dda3b578 chore(save_indicator): prepare icon and title 2026-01-02 21:58:13 +02:00
Elian Doran
e161ffce57 fix(client/pdf): not always focusing on click 2026-01-02 21:20:29 +02:00
Adorian Doran
0c1859dc43 style/note splits: highlight the active split only in a multi-split view 2026-01-02 20:59:51 +02:00
Elian Doran
e4dcc0f768 chore(client): fix typecheck issues 2026-01-02 20:45:28 +02:00
Elian Doran
74ab591214 chore(package): automatically build share theme & PDF viewer 2026-01-02 20:38:18 +02:00
Elian Doran
7bd7996893 feat(revisions): use customized PDF viewer 2026-01-02 20:17:27 +02:00
Elian Doran
505ae4eeb5 chore(revisions): remove "Preview" heading 2026-01-02 20:02:39 +02:00
Elian Doran
951d6d3ce3 feat(revisions): display PDF preview for revisions 2026-01-02 20:02:13 +02:00
Elian Doran
5ff7764699 style(revisions): prevent revision list from overflowing 2026-01-02 19:49:20 +02:00
Elian Doran
0d74998625 style(revisions): prevent buttons from overflowing 2026-01-02 19:47:07 +02:00
Elian Doran
29b70a12bd feat(revisions): display video preview for revisions 2026-01-02 19:44:23 +02:00
Elian Doran
d84150e97b feat(revisions): display audio preview for revisions 2026-01-02 19:21:51 +02:00
Elian Doran
2b2ef4251f style(revisions): minor spacing adjustments to file table 2026-01-02 18:44:06 +02:00
Elian Doran
2840ea0f38 chore(revisions): display a message when a preview is not available 2026-01-02 18:42:05 +02:00
Elian Doran
542d485267 fix(revisions): missing meta information about revisions 2026-01-02 18:34:45 +02:00
Elian Doran
cdd4fbc81d refactor(client): fix lint warnings in revisions modal 2026-01-02 18:23:04 +02:00
Elian Doran
bfdddab0a0 refactor(client): format revisions dialog 2026-01-02 18:20:55 +02:00
Elian Doran
44d1d01105 fix(pdfjs): preferences don't account for ntxId or noteId 2026-01-02 18:08:25 +02:00
Elian Doran
120bb09171 fix(pdfjs): saving doesn't account for ntxId or noteId 2026-01-02 17:57:43 +02:00
Elian Doran
b7af99c671 refactor(pdfjs): add type safety for messages 2026-01-02 17:57:28 +02:00
Elian Doran
869e0b3973 docs(user): mention updates to the new PDF functions 2026-01-02 12:49:30 +02:00
SiriusXT
27dc662636 fix(window): a window with no open notes appears blank. 2026-01-02 18:17:05 +08:00
Elian Doran
b68613dee4 feat(share): integrate custom pdf.js viewer 2026-01-02 12:13:31 +02:00
SiriusXT
52691b5c8c Merge branch 'main' into feat/extra-window 2026-01-02 17:44:39 +08:00
Elian Doran
ce0f32e7d5 chore(client/pdfjs): remove open file 2026-01-02 11:44:33 +02:00
Elian Doran
78bc9b59c2 chore(client/pdfjs): remove download button from toolbar 2026-01-02 11:41:58 +02:00
Elian Doran
23cf3d2923 feat(client/pdfjs): rewrite download button 2026-01-02 11:40:32 +02:00
Elian Doran
335136f3a3 fix(deps): update dependency preact-render-to-string to v6.6.5 (#8240) 2026-01-02 11:13:42 +02:00
renovate[bot]
11dd7aef09 fix(deps): update dependency preact-render-to-string to v6.6.5 2026-01-02 09:09:55 +00:00
Elian Doran
2d1769e2f9 fix: toggling right pane visibility incorrectly affects all windows (#8226) 2026-01-02 11:08:27 +02:00
Elian Doran
21e26147b0 fix(deps): update dependency react-i18next to v16.5.1 (#8241) 2026-01-02 11:06:38 +02:00
Elian Doran
ba301f8c12 fix(deps): update dependency globals to v17 (#8242) 2026-01-02 11:06:13 +02:00
SiriusXT
8087ed5688 Merge branch 'main' into feat/extra-window 2026-01-02 14:58:10 +08:00
SiriusXT
3420374649 fix: toggling right pane visibility incorrectly affects all windows 2026-01-02 11:31:59 +08:00
SiriusXT
644d3a181f fix: toggling right pane visibility incorrectly affects all windows 2026-01-02 11:08:49 +08:00
SiriusXT
4be3011a8a fix: toggling right pane visibility incorrectly affects all windows 2026-01-02 10:30:15 +08:00
SiriusXT
5aa0a956dd fix: toggling right pane visibility incorrectly affects all windows 2026-01-02 10:25:34 +08:00
renovate[bot]
7fdb1bdce8 fix(deps): update dependency globals to v17 2026-01-02 01:53:43 +00:00
renovate[bot]
57c6cef2bd fix(deps): update dependency react-i18next to v16.5.1 2026-01-02 01:52:49 +00:00
Elian Doran
e5599adca1 feat(share): Add support for shareJs in static website export (#8173) 2026-01-02 00:39:36 +02:00
Elian Doran
ab392ffb7f Translations update from Hosted Weblate (#8239) 2026-01-02 00:38:23 +02:00
Hosted Weblate
7585d4b258 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-01-01 22:37:01 +00:00
Elian Doran
ff82d9c38c Clean up Vite (#8238) 2026-01-02 00:36:46 +02:00
Elian Doran
920fde69bb chore: add missing space from imports 2026-01-02 00:21:50 +02:00
Elian Doran
053812e5f0 e2e(server): wrong import 2026-01-02 00:14:07 +02:00
Elian Doran
c2f59c4b6c test(server): type error 2026-01-02 00:07:04 +02:00
Elian Doran
06980fe9b5 chore(tsconfig): fix empty type 2026-01-02 00:04:52 +02:00
Elian Doran
3f5616f1fc chore(vitest): fix node:test import 2026-01-02 00:03:45 +02:00
Elian Doran
b6af3b70b0 test(client): increase a timeout for local run 2026-01-01 23:57:43 +02:00
Elian Doran
d8e4547988 chore(vitest): get rid of warning about number of projects 2026-01-01 23:56:26 +02:00
Elian Doran
34f649155e chore(vite): remove vite/global for other projects 2026-01-01 23:44:17 +02:00
Elian Doran
11779fe3e3 chore(vite): remove vite/global for commons 2026-01-01 23:43:59 +02:00
Elian Doran
032cde67b0 chore(vite): remove vite/global for express-partial-content 2026-01-01 23:42:02 +02:00
Elian Doran
229636a796 chore(vite): remove vite/global for server 2026-01-01 23:39:53 +02:00
Elian Doran
da9c9ac346 chore(vite): remove vite/importMeta from spec types 2026-01-01 23:34:39 +02:00
Elian Doran
3fecc4c648 chore(vite): remove vite/client from spec types 2026-01-01 23:33:21 +02:00
Elian Doran
98cefcf77b fix(desktop/pdfjs): not working due to build script 2026-01-01 23:13:21 +02:00
Elian Doran
413ee81ffa Translations update from Hosted Weblate (#8234) 2026-01-01 22:51:03 +02:00
Yatrik Patel
578ca8785e Translated using Weblate (Hindi)
Currently translated at 0.5% (10 of 1740 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/hi/
2026-01-01 20:49:31 +00:00
Yatrik Patel
da4112c078 Translated using Weblate (Hindi)
Currently translated at 2.0% (8 of 389 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/hi/
2026-01-01 20:49:30 +00:00
Yatrik Patel
704c7c881d Translated using Weblate (Hindi)
Currently translated at 4.6% (7 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/hi/
2026-01-01 20:49:29 +00:00
Elian Doran
63b6abdb9d PDF.js sidebar experiments for new layout (#8212) 2026-01-01 22:49:15 +02:00
Elian Doran
2e936a3d5c test(pdfjs): disable for now as there are no tests 2026-01-01 22:31:49 +02:00
Elian Doran
606574e18e chore(pdjs): address self-review 2026-01-01 22:15:40 +02:00
Elian Doran
1021879167 chore(client/pdfjs): add some missing translations 2026-01-01 22:15:31 +02:00
Elian Doran
dc4aa9c607 feat(ui): implement tooltips for share icons and clone icons (#8211) 2026-01-01 21:13:01 +02:00
Elian Doran
b2c3d78773 Fix excessive noteContext calls (#8233) 2026-01-01 21:09:39 +02:00
Elian Doran
8d3a0b5295 test(pdfjs): replace beforeAll with beforeEach 2026-01-01 21:06:03 +02:00
lzinga
9879d07bec fix(widget): remove redundant note context update in useLegacyWidget 2026-01-01 11:05:30 -08:00
Elian Doran
7bfce851e7 fix(mermaid) diagrams not saving content and SVG attachment (#8220) 2026-01-01 20:58:56 +02:00
Elian Doran
34e81881ec fix(popupEditor): fix closing of popupEditor when inserting note link (#8224) 2026-01-01 20:56:04 +02:00
Lucas
0143d6c60d Merge branch 'TriliumNext:main' into fix/layout-calls 2026-01-01 10:55:25 -08:00
Elian Doran
267c2bc907 Translations update from Hosted Weblate (#8231) 2026-01-01 19:25:36 +02:00
Yatrik Patel
316f27d88c Translated using Weblate (Hindi)
Currently translated at 0.1% (2 of 1736 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/hi/
2026-01-01 17:39:40 +01:00
Yatrik Patel
452b56f470 Translated using Weblate (Hindi)
Currently translated at 2.6% (4 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/hi/
2026-01-01 17:39:40 +01:00
Jan Klass
43aeaa4455 Translated using Weblate (German)
Currently translated at 96.1% (1669 of 1736 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/de/
2026-01-01 17:39:40 +01:00
Yatrik Patel
08b7a6985e Translated using Weblate (Hindi)
Currently translated at 1.0% (4 of 389 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/hi/
2026-01-01 17:39:40 +01:00
dirlligafu
4bbd8e28c1 Translated using Weblate (French)
Currently translated at 95.3% (1656 of 1736 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/fr/
2026-01-01 17:39:40 +01:00
Yatrik Patel
fcf4c09389 Translated using Weblate (Hindi)
Currently translated at 1.7% (2 of 116 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/hi/
2026-01-01 17:39:40 +01:00
Elian Doran
2c323cbe80 fix(client): color with uppercase causing exception (closes #8232) 2026-01-01 18:39:31 +02:00
Elian Doran
7ec7b6bd7b chore(pdfjs): manage requested changes 2026-01-01 12:36:33 +02:00
Elian Doran
b2378f2a53 test(server/pdf): move beforeAll 2026-01-01 12:19:51 +02:00
Elian Doran
8bf8d85bb7 test(server/pdf): switching to another note 2026-01-01 11:23:24 +02:00
Elian Doran
676173e895 test(server/pdf): layer listing works 2026-01-01 11:06:29 +02:00
SiriusXT
79e2c97882 chore(window): initialize closed time of openNoteContents to 0 2026-01-01 16:09:03 +08:00
SiriusXT
1078107776 chore(window): initialize closed time of openNoteContents to 0 2026-01-01 14:30:01 +08:00
SiriusXT
9c9e123e3d Merge branch 'main' into feat/extra-window 2026-01-01 14:04:45 +08:00
Elian Doran
d8649c87e0 test(server/pdf): attachment listing works 2026-01-01 01:06:26 +02:00
Elian Doran
b9456ca466 test(server/pdf): basic page navigation test 2026-01-01 00:35:39 +02:00
Elian Doran
cfccbb8927 test(server/pdf): basic table of contents test 2025-12-31 23:40:32 +02:00
Elian Doran
a18578362a Merge remote-tracking branch 'origin/main' into feature/pdfjs_sidebar_experiments 2025-12-31 22:55:37 +02:00
Elian Doran
2f9f94dee0 fix(server): pdfjs not available in dist 2025-12-31 22:46:55 +02:00
Elian Doran
c84e45ddee test(pdfjs): set up basic vitest 2025-12-31 21:18:27 +02:00
Lucas
ea558d8c9d Merge branch 'TriliumNext:main' into fix/layout-calls 2025-12-31 07:33:11 -08:00
lzinga
b936a35b63 fix(widget): prevent unnecessary refresh by checking note context change 2025-12-31 07:31:22 -08:00
Elian Doran
b4ef4c2143 chore(pdfjs): fix code scanning issues 2025-12-31 17:27:58 +02:00
Elian Doran
0ff4756ef4 chore(pdfjs): fix typecheck issues 2025-12-31 17:00:56 +02:00
Elian Doran
94204b4739 style(pdf_pages): slight improvement to page layout 2025-12-31 16:45:11 +02:00
Elian Doran
bf3a2b768e chore(pdfjs): set proper target origin when posting messages 2025-12-31 16:37:51 +02:00
SiriusXT
5fb7badfb4 fix(rightPane): toggling right pane visibility incorrectly affects all windows 2025-12-31 19:54:31 +08:00
Elian Doran
239d56f9a3 fix(deps): update dependency @codemirror/view to v6.39.8 (#8222) 2025-12-31 10:38:22 +02:00
Elian Doran
9163fc23f4 chore(deps): update dependency @redocly/cli to v2.14.2 (#8221) 2025-12-31 10:37:30 +02:00
Elian Doran
d225c28fde chore(deps): update pnpm to v10.27.0 (#8223) 2025-12-31 10:29:28 +02:00
SiriusXT
a8c2947062 Merge branch 'main' into feat/extra-window 2025-12-31 14:23:42 +08:00
SiriusXT
8a3f02e845 fix(popupEditor): fix closing of popupEditor when inserting note link 2025-12-31 14:12:38 +08:00
renovate[bot]
d0dc92c891 chore(deps): update pnpm to v10.27.0 2025-12-31 02:34:03 +00:00
renovate[bot]
8d660f5a2f fix(deps): update dependency @codemirror/view to v6.39.8 2025-12-31 02:33:52 +00:00
renovate[bot]
b41b4e77b2 chore(deps): update dependency @redocly/cli to v2.14.2 2025-12-31 02:33:14 +00:00
lzinga
267a37d3bd feat(component): add removeChild method for cleanup of child components
feat(hooks): improve useLegacyWidget cleanup and memoization logic
2025-12-30 13:59:46 -08:00
Lucas
0cf23c7d7c Update apps/client/src/widgets/type_widgets/helpers/SvgSplitEditor.tsx
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2025-12-30 11:56:34 -08:00
lzinga
a632486229 fix(mermaid) diagrams not saving content and SVG attachment 2025-12-30 11:35:48 -08:00
Elian Doran
64a518a00b chore(deps): update typescript-eslint monorepo to v8.51.0 (#8214) 2025-12-30 12:07:14 +02:00
Elian Doran
2f3a914027 Translations update from Hosted Weblate (#8213) 2025-12-30 12:06:27 +02:00
Elian Doran
7182d32d9c Merge remote-tracking branch 'origin/main' into feature/pdfjs_sidebar_experiments 2025-12-30 11:47:00 +02:00
green
18381c5d32 Translated using Weblate (Japanese)
Currently translated at 100.0% (1736 of 1736 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2025-12-30 09:00:07 +01:00
Kuzma Simonov
79327073b4 Translated using Weblate (Russian)
Currently translated at 100.0% (1736 of 1736 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ru/
2025-12-30 09:00:06 +01:00
Giovi
018f2fd789 Translated using Weblate (Italian)
Currently translated at 100.0% (1736 of 1736 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/it/
2025-12-30 09:00:06 +01:00
noobhjy
3889392aed Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1736 of 1736 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2025-12-30 09:00:05 +01:00
Elian Doran
bd976a25f1 style(next): use border for focus instead 2025-12-30 09:59:46 +02:00
Elian Doran
01f05ac6fd fix(pdf): active context not changed when clicking preview 2025-12-30 09:47:02 +02:00
Elian Doran
52292cb5a5 style(next): indicate active note context 2025-12-30 09:31:03 +02:00
perfectra1n
c6dd1ba0ca fix(types): resolve typecheck issue with note_tree 2025-12-29 18:25:55 -08:00
SiriusXT
366166a561 fix(window): avoid invalid fallback value for openNoteContexts 2025-12-30 09:44:58 +08:00
renovate[bot]
84f069087c chore(deps): update typescript-eslint monorepo to v8.51.0 2025-12-30 01:05:53 +00:00
SiriusXT
4d2b02eddb Merge branch 'main' into feat/extra-window 2025-12-30 09:03:26 +08:00
Elian Doran
76cfced60f chore(pdfjs): fix partially removed method 2025-12-30 01:43:07 +02:00
Elian Doran
5c2aea0a6b chore: remove LLM generated doc 2025-12-30 01:40:34 +02:00
Elian Doran
7a883c62df Merge remote-tracking branch 'origin/main' into feature/pdfjs_sidebar_experiments 2025-12-30 01:40:03 +02:00
Elian Doran
ff97461ff8 PDF.js integration (part I) (#8206) 2025-12-30 01:39:09 +02:00
Elian Doran
51b0eb74a5 chore(pdfjs): address requested changes 2025-12-30 01:37:44 +02:00
Elian Doran
2304407986 chore(pdfjs): address origin concerns 2025-12-30 01:27:05 +02:00
Elian Doran
a1ebdc3004 chore(pdfjs): integrate into typecheck 2025-12-30 01:23:19 +02:00
Elian Doran
fef30f4bea chore(client): fix typecheck 2025-12-30 01:20:29 +02:00
Elian Doran
eee8d9ab7c feat(pdfjs): optionally hide left sidebar 2025-12-30 01:09:45 +02:00
perfectra1n
4f2678d321 feat(ui): implement tooltips for share icons and clone icons
asdf
2025-12-29 14:42:34 -08:00
Elian Doran
c473fba628 refactor(right_pane): move PDF-specific components in own dir 2025-12-30 00:17:29 +02:00
Elian Doran
9a9cd8e6a5 feat(right_pane): add count in title for PDF items 2025-12-30 00:16:45 +02:00
Elian Doran
f5a89aa81a feat(right_pane): hide PDF attachments/layers when not needed 2025-12-30 00:10:23 +02:00
Elian Doran
3c1beab725 fix(pdf_pages): fix a few type errors 2025-12-30 00:00:03 +02:00
Elian Doran
79f03ad3ac fix(pdf_layers): toggling layers and updating state not working 2025-12-29 23:57:52 +02:00
Elian Doran
574138a1fb refactor(pdf_layers): get layers to show 2025-12-29 23:08:35 +02:00
Elian Doran
6513e2cfca refactor(pdf_attachments): deduplicate font size 2025-12-29 23:04:02 +02:00
Elian Doran
43a749b6a7 feat(right_pane): display attachments 2025-12-29 22:56:06 +02:00
Elian Doran
c1d6b3121a fix(pdf_pages): pages not updating between notes 2025-12-29 22:50:48 +02:00
Elian Doran
0d9c8ae4df style(pdf_pages): page numbers within pages 2025-12-29 22:46:20 +02:00
Elian Doran
62d8c089ed chore(pdf_pages): remove logs 2025-12-29 22:43:17 +02:00
Elian Doran
971a76ce11 style(pdf_pages): render in multiple columns 2025-12-29 22:39:38 +02:00
Elian Doran
cb33404122 feat(client/right_pane): use intersection observer for performance 2025-12-29 22:36:03 +02:00
Elian Doran
bcf72f4624 feat(client/right_pane): display pages 2025-12-29 22:34:36 +02:00
Elian Doran
77ad6950e8 feat(client/right_pane): highlight current heading 2025-12-29 22:11:25 +02:00
Elian Doran
e2d29aadca refactor(pdfjs): extract toc logic to separate file 2025-12-29 21:58:11 +02:00
Elian Doran
64ca04ad07 feat(client/right_pane): jump to heading 2025-12-29 21:55:47 +02:00
Elian Doran
b6506a9331 chore(client/right_pane): get table of contents to show 2025-12-29 21:49:02 +02:00
Elian Doran
fd7222242a chore(pdf): process PDF outline 2025-12-29 21:44:49 +02:00
Elian Doran
e36049cd43 chore(client/right_pane): get raw ToC data to show up 2025-12-29 21:44:15 +02:00
Elian Doran
257f6c5994 chore(client/right_pane): inject title into PDF toc sidebar 2025-12-29 21:28:17 +02:00
Elian Doran
9098bfb63a chore(client): prototype implementation to communicate data through note context 2025-12-29 21:26:52 +02:00
Wael Nasreddine
118d22c4ec Merge branch 'main' into static-implement-sharejs 2025-12-29 11:02:07 -08:00
Elian Doran
758df0d85a fix(share): Prevent crashing if candidate note is null (#8164) 2025-12-29 20:43:12 +02:00
Elian Doran
59bbd902fc feat(share): Render JS Frontend files as-is with extension .js (#8172) 2025-12-29 20:41:46 +02:00
Elian Doran
d96528dae4 chore(server): fix type error 2025-12-29 20:38:48 +02:00
Elian Doran
f3cfa84d1d Merge remote-tracking branch 'origin/main' into static-correct-type 2025-12-29 20:37:05 +02:00
Elian Doran
dc2ffa516b Fix: Change /calendar/weeks/{date} to use ISO week format (YYYY-Www) … (#8204) 2025-12-29 20:18:46 +02:00
Elian Doran
fffab73061 feat(pdfjs): auto-watch dev 2025-12-29 19:23:56 +02:00
Elian Doran
0a9ce84cf2 feat(client/pdf): respect locale 2025-12-29 19:10:14 +02:00
Elian Doran
07a1734d4b chore(pdfjs): copy locales during build 2025-12-29 19:09:03 +02:00
Elian Doran
6e41d3591d chore(pdfjs): add locales 2025-12-29 19:06:08 +02:00
Elian Doran
4134e5054a fix(client/pdf): not refreshing when uploading new revision 2025-12-29 17:02:22 +02:00
Elian Doran
bb374a5ce2 fix(client/pdf): blob reloaded when saving 2025-12-29 16:46:30 +02:00
Elian Doran
359f398afa feat(pdfjs): debounce saving view config 2025-12-29 16:19:21 +02:00
Elian Doran
84425e86e9 feat(client/pdf): filter out view config by fingerprint 2025-12-29 16:15:38 +02:00
Elian Doran
ebf725c949 feat(client/pdf): store and restore page position 2025-12-29 15:55:47 +02:00
Elian Doran
fc0ea36cf3 chore(pdfjs): first attempt at intercepting store 2025-12-29 14:06:59 +02:00
Elian Doran
7836de3f08 fix(client/pdf): form elements not detected for save 2025-12-29 13:29:04 +02:00
SiriusXT
07871853a5 fix(window): cannot save when switching between multiple windows 2025-12-29 19:24:53 +08:00
Elian Doran
406232c478 chore(pdfjs): log event bus 2025-12-29 13:23:54 +02:00
Elian Doran
9e0c29496f refactor(pdfjs): use TypeScript for the custom script 2025-12-29 13:14:00 +02:00
Elian Doran
480954ee87 feat(pdfjs): react to dark mode 2025-12-29 12:51:43 +02:00
Elian Doran
94039bd9b1 chore(pdfjs): improve toolbar contrast 2025-12-29 12:40:43 +02:00
Elian Doran
667eaca9f2 feat(pdfjs): improve style to better match Trilium 2025-12-29 12:35:49 +02:00
Elian Doran
446822a7ae chore(client/pdf): inject some CSS variables 2025-12-29 12:21:44 +02:00
Elian Doran
f09a3e06f4 refactor(client/pdf): split into own component 2025-12-29 12:01:47 +02:00
Elian Doran
7c4a56f5f2 chore(deps): add missing pdfjs dependency 2025-12-29 11:10:12 +02:00
Elian Doran
08f6a32c34 fix(client/pdfjs): not reacting to all changes 2025-12-29 10:33:57 +02:00
SiriusXT
254145f0e5 chore(window): handle potential JSON parsing failures 2025-12-29 16:26:50 +08:00
Elian Doran
3e255fa647 feat(client/pdf): add debouncing 2025-12-29 10:15:15 +02:00
SiriusXT
c28f11336e chore(window_db): fix potential migration error 2025-12-29 16:11:49 +08:00
SiriusXT
2e30683b7b chore(window): avoid reduce error when no candidates 2025-12-29 16:08:29 +08:00
SiriusXT
0af7b8b145 chore(window): use MAX_SAVED_WINDOWS constant 2025-12-29 15:56:04 +08:00
Elian Doran
c0a90402ef feat(client/pdf): save annotations by uploading new revision 2025-12-29 09:51:54 +02:00
openapphub
37c0f7ec75 Fix: Change /calendar/weeks/{date} to use ISO week format (YYYY-Www) instead of date 2025-12-29 15:44:37 +08:00
SiriusXT
5d39b84886 fix(window): Fix incorrect noteContents error 2025-12-29 15:28:27 +08:00
SiriusXT
537c4051cc feat(window): add class to extra windows 2025-12-29 15:27:35 +08:00
SiriusXT
d0a22bc517 fix(window): Fix empty array issue during openNoteContents data migration 2025-12-29 15:27:11 +08:00
SiriusXT
19a75acf3f Merge branch 'main' into feat/extra-window 2025-12-29 14:44:25 +08:00
SiriusXT
3f0abce874 feat(window_db): migrate openNoteContexts to structured format with window metadata 2025-12-29 14:43:49 +08:00
SiriusXT
36dd29f919 feat(window): add class to extra windows 2025-12-29 14:37:40 +08:00
SiriusXT
d7838f0b67 feat(window): restore recently closed windows from tray 2025-12-29 14:37:35 +08:00
SiriusXT
3353d4f436 feat(window): record openNoteContents of recently closed windows 2025-12-29 14:33:34 +08:00
SiriusXT
7740154bdc feat(window): add windowId for extra windows 2025-12-29 14:32:53 +08:00
Elian Doran
5e42627bce chore(client/pdf): basic reaction to annotations 2025-12-29 02:00:59 +02:00
Elian Doran
41bcf9524a feat(client/pdf): integrate pdf.js 2025-12-29 01:16:56 +02:00
Elian Doran
914cf10911 chore(pdfjs): get icons to show up 2025-12-29 01:11:04 +02:00
Elian Doran
855d4d139d chore(pdfjs): get to actually render something 2025-12-29 01:03:16 +02:00
Elian Doran
abb7b0f8c8 feat(server): serve pdfjs over static route 2025-12-29 00:50:59 +02:00
Elian Doran
d78ad52662 chore(pdfjs): copy viewer to dist 2025-12-29 00:45:57 +02:00
Elian Doran
25b4bcd311 chore(pdfjs): create empty package 2025-12-29 00:26:37 +02:00
Elian Doran
a14eed81f6 Translations update from Hosted Weblate (#8197) 2025-12-28 23:25:34 +02:00
Hosted Weblate
54f51b365a 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/
2025-12-28 22:19:17 +01:00
Marcelo Nolasco
c0e0a712ad Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (152 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/pt_BR/
2025-12-28 22:19:16 +01:00
Marcelo Nolasco
3ab5bbae4d Translated using Weblate (Portuguese (Brazil))
Currently translated at 11.2% (13 of 116 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/pt_BR/
2025-12-28 22:19:15 +01:00
Marcelo Nolasco
cafeb3920a Translated using Weblate (Portuguese (Brazil))
Currently translated at 12.5% (19 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/pt_BR/
2025-12-28 22:19:14 +01:00
MarcelWie
fb465b442c Translated using Weblate (German)
Currently translated at 94.3% (1632 of 1730 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/de/
2025-12-28 22:19:13 +01:00
Francis C.
d3a559a700 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 99.5% (1722 of 1730 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hant/
2025-12-28 22:19:13 +01:00
green
7768003735 Translated using Weblate (Japanese)
Currently translated at 100.0% (1730 of 1730 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2025-12-28 22:19:12 +01:00
Elian Doran
f02b3b48e8 docs(user): add missing share aliases 2025-12-28 23:18:51 +02:00
Elian Doran
ba273bb9f4 Custom icon pack (#8190) 2025-12-28 23:09:43 +02:00
Elian Doran
490c539d63 Merge branch 'main' into feature/icon_packs 2025-12-28 23:09:34 +02:00
Elian Doran
ebd60519dd fix(note_icon): empty slots appearing when reducing list 2025-12-28 22:59:01 +02:00
Elian Doran
56304a4d71 chore(icon-pack-builder): improve output dir 2025-12-28 22:54:29 +02:00
Elian Doran
32f0f98522 feat(icon-pack-builder): integrate boxicons 3 with brands 2025-12-28 22:53:03 +02:00
Elian Doran
b18dd22341 fix(icon-pack-builder): add missing deps 2025-12-28 22:52:54 +02:00
Elian Doran
8eebae0955 chore(scripts): add script to compare the two boxicons 2025-12-28 22:29:51 +02:00
Elian Doran
ed229e0578 chore(scripts): update boxicons script to use packs instead of weights 2025-12-28 22:29:42 +02:00
Elian Doran
dbfaad6c06 test(server): fix broken test after changes to CSS generation 2025-12-28 21:46:19 +02:00
Elian Doran
6e5176b088 chore(deps): fix dependency 2025-12-28 21:31:10 +02:00
Elian Doran
becf4d7426 fix(note_icon): crash when reducing number of items 2025-12-28 21:10:22 +02:00
Elian Doran
082040c6e1 feat(share): display an icon for attachment download 2025-12-28 21:03:30 +02:00
Elian Doran
1ae11ce3a5 fix(export/share): .zip attachment marked as html 2025-12-28 20:52:47 +02:00
Elian Doran
cf968b3590 fix(export/share): attachment download links not working 2025-12-28 20:45:33 +02:00
Adorian Doran
a3db1ab156 UI fixes (#8200) 2025-12-28 20:36:19 +02:00
Adorian Doran
7440110a44 Merge branch 'feat/ui/fixes' of https://github.com/TriliumNext/Trilium into feat/ui/fixes 2025-12-28 20:31:43 +02:00
Adorian Doran
3638e6b12c style/note title actions: fix an issue identified by gemini-code-assist 2025-12-28 20:31:32 +02:00
Adorian Doran
621ed5b9de Update apps/client/src/widgets/type_widgets/text/EditableText.css
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2025-12-28 20:24:24 +02:00
Adorian Doran
1e3135dea0 style/note title actions: fix width for full-width content notes 2025-12-28 20:19:51 +02:00
Elian Doran
8f21c0b34a feat(note_icon): use grid virtualization for listing high performance 2025-12-28 19:46:57 +02:00
Adorian Doran
b3feb38369 style/options: properly align the title with the option cards when the content is centered 2025-12-28 19:45:48 +02:00
Adorian Doran
2bf862d5b9 style/note scrolling container: make the alignment of children more consistent 2025-12-28 19:20:46 +02:00
Elian Doran
cbb7b4ffea refactor(note_icon): split off into two hooks 2025-12-28 19:20:44 +02:00
Elian Doran
b2f496048f feat(icon-pack-builder): add icons to packs 2025-12-28 18:57:32 +02:00
Elian Doran
e084bc4c07 feat(icon-pack-builder): add phosphor fill 2025-12-28 18:52:08 +02:00
Elian Doran
d9b0660def fix(icon-pack-builder): some phosphor icons not working due to alias 2025-12-28 18:41:54 +02:00
Elian Doran
b997452733 feat(icon-pack-builder): integrate phosphor 2025-12-28 18:33:01 +02:00
Elian Doran
e699566e62 chore(note_icon): remove ellipsis in placeholder 2025-12-28 18:13:46 +02:00
Elian Doran
2bd83e6285 feat(note_icon): display count and filter in search placeholder 2025-12-28 17:41:11 +02:00
Elian Doran
46e5090445 fix(icon-pack): non-BMP icons not rendering 2025-12-28 17:33:12 +02:00
Elian Doran
035a311e4d feat(icon-pack-builder): save attachment 2025-12-28 17:17:08 +02:00
Elian Doran
850528750c feat(icon-pack-builder): add manifest to zip 2025-12-28 16:56:41 +02:00
Elian Doran
645720a725 feat(icon-pack-builder): build zip without content yet 2025-12-28 16:50:16 +02:00
Elian Doran
a6c74449aa feat(icon-pack-builder): generate CSS for mdi 2025-12-28 16:25:21 +02:00
Elian Doran
7f05d9cdff test(client): broken tests after change in icon definition 2025-12-28 15:51:48 +02:00
Elian Doran
02d42dc5ff chore(icon_packs): address requested changes 2025-12-28 15:50:01 +02:00
Elian Doran
e730378b27 fix(icon_packs): references to .bx for icon selection 2025-12-28 13:42:45 +02:00
Elian Doran
c14d95f561 docs(user): mention icon pack prefix constraints 2025-12-28 12:36:18 +02:00
Elian Doran
13b700e0e5 chore(icon_packs): address requested changes 2025-12-28 12:30:26 +02:00
Elian Doran
f849c4b315 chore: fix typecheck 2025-12-28 12:15:43 +02:00
Elian Doran
c2c19e8ecd chore(server): address self-review 2025-12-28 12:01:10 +02:00
Elian Doran
12875ec308 chore(deps): update package lock 2025-12-28 11:56:50 +02:00
Elian Doran
5d12d57a22 test(server): fix broken tests after changes 2025-12-28 11:52:49 +02:00
Elian Doran
5cc2296768 chore(server): fix typecheck 2025-12-28 11:46:25 +02:00
Elian Doran
7c1175995f chore(icon_packs): remove prefix from phosphor script 2025-12-28 11:43:37 +02:00
Elian Doran
d834cd78a7 docs(user): document icon packs 2025-12-28 11:43:25 +02:00
Adorian Doran
79d2010bfa style/note title actions: properly align when the content is centered 2025-12-28 10:18:50 +02:00
Adorian Doran
3f86c809ce style/note title actions: properly align when the content is centered 2025-12-28 10:12:01 +02:00
Elian Doran
1570ea77d8 chore(icon_packs): integrate prefix as part of the attribute instead of manifest 2025-12-28 09:56:08 +02:00
Elian Doran
99bdd2e433 feat(icon_packs): skip duplicate icon packs 2025-12-28 09:43:33 +02:00
Elian Doran
7646061215 refactor(client): move a bx style to dedicated CSS 2025-12-28 09:43:17 +02:00
Elian Doran
505a985755 fix(mobile): icons missing 2025-12-28 09:28:24 +02:00
Elian Doran
e895ea406a chore(client): reintegrate boxicons special class names (e.g. flip) 2025-12-28 09:25:10 +02:00
Elian Doran
8b8a78e949 chore(server): get rid of boxicons CSS import 2025-12-28 02:27:02 +02:00
Elian Doran
1c940ff8a2 fix(icon_packs): integrate boxicons back into share export 2025-12-28 02:24:18 +02:00
Elian Doran
841cb32835 fix(icon_packs): integrate boxicons back into share theme 2025-12-28 01:58:22 +02:00
Elian Doran
61e96f91d0 fix(icon_packs): use right name for boxicons for compatibility 2025-12-28 01:20:01 +02:00
Elian Doran
9f6c07f5cc chore(icon_packs): use builtin boxicons for client 2025-12-28 01:00:45 +02:00
Elian Doran
1efb21c627 feat(export/share): render custom icons 2025-12-27 23:39:27 +02:00
Elian Doran
d5b04864c8 chore(export/share): inject font 2025-12-27 23:31:56 +02:00
Elian Doran
da28f4505a chore(export/share): inject pack CSS 2025-12-27 23:21:59 +02:00
Elian Doran
5174deac07 fix(status_bar): attribute count displays system links 2025-12-27 23:02:35 +02:00
Elian Doran
e2a628fa2f feat(icon_packs): ignore protected notes 2025-12-27 22:50:31 +02:00
Elian Doran
290f488c78 feat(share): ignore unsupported icon packs 2025-12-27 22:09:16 +02:00
Elian Doran
b00cb52da5 feat(share): basic support for custom icon packs 2025-12-27 21:58:18 +02:00
Elian Doran
c7bb5ff119 feat(attachments): display MIME type 2025-12-27 20:54:14 +02:00
Elian Doran
faa069b8a1 feat(note_icon): add message if no results 2025-12-27 20:47:56 +02:00
Elian Doran
e57f1e6f23 feat(note_icon): add placeholder for search 2025-12-27 20:45:08 +02:00
Elian Doran
73975ab521 feat(note_icon): use bootstrap tooltip 2025-12-27 20:43:05 +02:00
Elian Doran
761a67f238 feat(note_icon): display icon pack in note title 2025-12-27 20:37:59 +02:00
Elian Doran
736c69816d feat(note_icon): change design for icon reset button 2025-12-27 20:21:10 +02:00
Elian Doran
270339da11 style(next): selector interfering with grouped buttons 2025-12-27 20:16:13 +02:00
Elian Doran
aa93bc5492 fix(note_icon): one column short 2025-12-27 19:52:11 +02:00
Elian Doran
0c9c36ea7e fix(note_icon): missing tooltip for filter 2025-12-27 18:14:53 +02:00
Elian Doran
af67967502 fix(note_icon): modal not dismissing 2025-12-27 18:11:07 +02:00
Elian Doran
78bec0c782 feat(icon_packs): integrate boxicons JSON 2025-12-27 18:04:16 +02:00
Elian Doran
0c77563672 feat(icon_packs): mark icon packs as unsafe 2025-12-27 18:02:59 +02:00
Elian Doran
241a9e2e7f chore(icon_packs): process boxicons v2 2025-12-27 17:56:12 +02:00
Elian Doran
59b691d670 chore(scripts): process boxicons v3 icons 2025-12-27 00:26:33 +02:00
Elian Doran
a6c515aea0 Translations update from Hosted Weblate (#8189) 2025-12-26 23:02:47 +02:00
green
850710926e Translated using Weblate (Japanese)
Currently translated at 100.0% (1730 of 1730 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2025-12-26 21:50:48 +01:00
noobhjy
904da14895 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1730 of 1730 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2025-12-26 21:50:47 +01:00
Kuzma Simonov
4c5bc3a3d3 Translated using Weblate (Russian)
Currently translated at 100.0% (1730 of 1730 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ru/
2025-12-26 21:50:47 +01:00
Elian Doran
ecec661b72 chore(scripts): add icon to process phosphor meta 2025-12-26 22:43:03 +02:00
Elian Doran
fb629f7693 feat(note_icon): display note pack icon 2025-12-26 21:14:13 +02:00
Elian Doran
13fff33aa4 feat(icon_packs): use note title isntead of manifest 2025-12-26 21:08:37 +02:00
Elian Doran
8053221b12 chore(note_icon): hide filter if no custom icon packs 2025-12-26 21:01:48 +02:00
Elian Doran
ba699f9842 refactor(note_icon): split filter content into a component 2025-12-26 21:01:19 +02:00
Elian Doran
eb5ebb53cb fix(icon_list): border-right icon missing 2025-12-26 20:57:10 +02:00
Elian Doran
c26357be40 feat(note_icon): allow filtering default icons 2025-12-26 20:49:20 +02:00
Elian Doran
db4af96040 feat(note_icon): filter by icon pack 2025-12-26 20:42:19 +02:00
Elian Doran
5cb3983fe0 chore(note_icon): get rid of categories 2025-12-26 20:03:34 +02:00
Elian Doran
92292de0ff chore(client): basic integration of icon packs in icon selector 2025-12-26 19:52:54 +02:00
Elian Doran
a26923cc6d fix(icon_pack): listing definitions even if parsing fails 2025-12-26 19:42:23 +02:00
Elian Doran
2c4ac4ba30 fix(server): crashing due to bad icon pack 2025-12-26 19:37:10 +02:00
Elian Doran
254511bfbf chore(icon_pack): switch schema to support multiple terms per icon 2025-12-26 19:25:31 +02:00
Elian Doran
e2f6f8a4e4 feat(icon_pack): generate icon registry for client 2025-12-26 19:10:28 +02:00
Elian Doran
e346963e76 feat(icon_pack): inject the icon pack into the client 2025-12-26 18:36:36 +02:00
Elian Doran
5f1bdf7264 chore(icon_pack): generate icon declarations 2025-12-26 18:16:33 +02:00
Elian Doran
93a3b29677 chore(icon_pack): generate root declaration 2025-12-26 18:08:26 +02:00
Elian Doran
b157cd909c chore(icon_pack): generate src declaration 2025-12-26 18:04:39 +02:00
Elian Doran
2f24703690 chore(icon_pack): generate font face declaration without source 2025-12-26 17:42:44 +02:00
Elian Doran
27efa8844e refactor(server): mark ownerId in AttachmentRow as mandatory 2025-12-26 17:32:28 +02:00
Elian Doran
98de4b6dc3 chore(icon_pack): map ttf 2025-12-26 17:31:35 +02:00
Elian Doran
d121de5152 chore(icon_pack): map woff attachment 2025-12-26 17:30:19 +02:00
Elian Doran
5ad7323d03 chore(icon_pack): map woff2 attachment 2025-12-26 17:28:57 +02:00
Elian Doran
183020a4e3 chore(icon_pack): return icon mappings 2025-12-26 16:04:56 +02:00
Elian Doran
a56a5fe1f5 feat(icon_pack): check if JSON is parsable 2025-12-26 16:00:21 +02:00
Elian Doran
af4fc11a4e docs(release): fix link to new layout 2025-12-26 14:13:52 +02:00
Elian Doran
a63b8b2031 chore(release): prepare for v0.101.1 2025-12-26 14:01:04 +02:00
Elian Doran
7b02d87558 docs(release): prepare for v0.101.1 2025-12-26 13:59:49 +02:00
Elian Doran
16737b93dd fix(client): not working in HTTPs (closes #8165) 2025-12-26 13:51:01 +02:00
Elian Doran
c23fe7cf13 fix(table_of_contents): not showing on first render of read-only notes 2025-12-26 13:28:29 +02:00
Adorian Doran
6d80323a76 style/text selection: refactor, apply custom color tint over the note title selection 2025-12-26 11:45:42 +02:00
Adorian Doran
8b630c6e2e UI fixes (#8180) 2025-12-26 11:25:29 +02:00
Adorian Doran
047a8d9644 Fix #8177 2025-12-26 10:56:48 +02:00
Adorian Doran
f14ae01fab style/links: fix background color 2025-12-26 10:42:53 +02:00
Adorian Doran
785470b0ae style/global menu: fix icon alignment 2025-12-26 10:31:06 +02:00
Adorian Doran
73918c042b Fix #8170 2025-12-26 10:28:25 +02:00
Wael Nasreddine
1d3e971ed7 Merge branch 'static-correct-type' into static-implement-sharejs
* static-correct-type:
  improve the protected note handling
  be loosy and honor startsWith application/javascript
2025-12-25 23:01:30 -08:00
Wael Nasreddine
7e7f3ba78f improve the protected note handling 2025-12-25 23:01:01 -08:00
Wael Nasreddine
03eaebc71c be loosy and honor startsWith application/javascript 2025-12-25 22:54:58 -08:00
Wael Nasreddine
3d1f6c4f91 be loosy and honor startsWith application/javascript 2025-12-25 22:54:14 -08:00
Wael Nasreddine
8368969932 implement the second part of the sharejs 2025-12-25 22:06:30 -08:00
Wael Nasreddine
afcd23cb99 add a todo 2025-12-25 22:03:06 -08:00
Wael Nasreddine
94d1181fe8 render js notes as-is 2025-12-25 21:52:35 -08:00
Wael Nasreddine
7e45aaa1da for frontend js files add .js 2025-12-25 21:40:42 -08:00
Wael Nasreddine
cb016c4307 Address Gemini's comment 2025-12-25 16:26:58 -08:00
Wael Nasreddine
7c7797d35a fix(share/prev_next): Prevent crashing if candide page is null
When a note is not visible, attempting to export it ends up crashing the
server with this error:

```
TypeError: ejs:193
    191|
    192|                 <% if (hasTree) { %>
 >> 193|                     <%- include("prev_next", { note: note, subRoot: subRoot }) %>
    194|                 <% } %>
    195|             </footer>
    196|         </div>
ejs:1
 >> 1| <%
    2|     // TODO: code cleanup + putting this behind a toggle/attribute
    3|     const previousNote = (() => {
    4|         // If we are at the subRoot, there is no previous
Cannot read properties of undefined (reading 'hasVisibleChildren')
    at eval (eval at compile (/usr/src/app/main.cjs:553:203), <anonymous>:27:26)
    at eval (eval at compile (/usr/src/app/main.cjs:553:203), <anonymous>:34:7)
    at d (/usr/src/app/main.cjs:557:265)
    at g (/usr/src/app/main.cjs:557:251)
    at eval (eval at compile (/usr/src/app/main.cjs:553:203), <anonymous>:293:17)
    at d (/usr/src/app/main.cjs:557:265)
    at as.render (/usr/src/app/main.cjs:532:458)
    at Omr (/usr/src/app/main.cjs:581:109552)
    at Rmr (/usr/src/app/main.cjs:581:107637)
    at $W.prepareContent (/usr/src/app/main.cjs:653:28) {
  path: ''
```

fixes #8002
fixes #8162
2025-12-25 16:11:01 -08:00
Elian Doran
8d6eb6fa53 fix(right_pane): toggle shortcut not working on new layout 2025-12-25 23:42:45 +02:00
Elian Doran
f97fbf8325 Translations update from Hosted Weblate (#8161) 2025-12-25 23:24:14 +02:00
Mohammed Saati
e7d6e646be Translated using Weblate (Arabic)
Currently translated at 60.9% (1054 of 1730 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ar/
2025-12-25 21:22:36 +00:00
Mohammed Saati
839444af47 Translated using Weblate (Arabic)
Currently translated at 57.8% (88 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/ar/
2025-12-25 21:22:35 +00:00
Hosted Weblate
24a58da4b6 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/
2025-12-25 21:22:34 +00:00
Elian Doran
aa37196169 fix(layout): missing right pane toggle on macos vertical layout (closes #8157) 2025-12-25 23:22:17 +02:00
Elian Doran
f821d7fcd6 fix(desktop): right margin on icon 2025-12-25 23:16:07 +02:00
Elian Doran
b417831507 Merge branch 'main' of github.com:TriliumNext/Trilium 2025-12-25 22:52:04 +02:00
Elian Doran
a4dbefd7ef fix(launch_bar): note launcher no longer hoisting in same tab (closes #8160) 2025-12-25 22:52:01 +02:00
Elian Doran
2d486c9934 chore(release): prepare for v0.101.0 2025-12-25 19:14:38 +02:00
Elian Doran
47cfbd0740 docs(release): prepare for v0.101.0 2025-12-25 19:08:55 +02:00
Elian Doran
f09d918695 fix(promoted_attributes): editing with multiplicity modifies all displayed values (closes #7992) 2025-12-25 18:32:52 +02:00
Elian Doran
33098a1120 feat(login): implement better time comparison management across several features (#8129) 2025-12-25 17:58:36 +02:00
Elian Doran
73f7c42437 Fixes for main (#8151) 2025-12-25 15:40:37 +02:00
Elian Doran
4ff0e2a1d9 Merge branch 'main' into feature/fixes_for_main 2025-12-25 15:40:34 +02:00
Elian Doran
afeaf51831 style(attachment): fix margin for code blocks 2025-12-25 11:54:00 +02:00
Adorian Doran
98db2fcd7b fix note title color for legacy themes (#7997) 2025-12-25 11:40:00 +02:00
Elian Doran
6b4d069211 fix(attachment): deletion time displayed incorrectly (closes #7987) 2025-12-25 11:34:49 +02:00
Adorian Doran
cecf7e6afb style/selected tree item color: use the color adjusted for readability 2025-12-25 11:34:41 +02:00
Adorian Doran
920e53957c Merge branch 'main' of https://github.com/TriliumNext/Trilium into bugfix/title-color-in-note-tree 2025-12-25 11:32:08 +02:00
Elian Doran
27c3d4da3c style(attachment): improve paddings & margins, remove scroll for image 2025-12-25 11:28:51 +02:00
Elian Doran
00a1a63d7e chore(attachment): use admonition instead of alert 2025-12-25 11:25:48 +02:00
Elian Doran
b0e7b6ce67 chore: address requested changes 2025-12-25 11:22:18 +02:00
Elian Doran
e06c004e0d Merge remote-tracking branch 'origin/main' into feature/fixes_for_main
; Conflicts:
;	apps/client/src/stylesheets/theme-next/base.css
2025-12-25 11:01:49 +02:00
Adorian Doran
a47ea0d653 style/quick editor: fix title margin 2025-12-25 10:47:05 +02:00
Adorian Doran
86c04cae96 style/menus: fix broken margin 2025-12-25 10:31:00 +02:00
Elian Doran
9eedbb8cd5 chore(deps): update dependency webdriverio to v9.22.0 (#8155) 2025-12-25 09:50:07 +02:00
Elian Doran
85404b02fc fix(deps): update dependency @codemirror/view to v6.39.7 (#8154) 2025-12-25 09:49:37 +02:00
Elian Doran
ae08c47929 chore(deps): update dependency @redocly/cli to v2.14.1 (#8153) 2025-12-25 09:49:12 +02:00
Adorian Doran
c97a6d82c3 style/menus: rollback a change 2025-12-25 05:13:17 +02:00
Adorian Doran
656b261946 style/note attachments: fix the context menu getting clipped 2025-12-25 05:10:20 +02:00
Adorian Doran
13fb57b46d Merge branch 'main' of https://github.com/TriliumNext/Trilium 2025-12-25 05:05:13 +02:00
Adorian Doran
fe38689a26 style/note attachments: make the list scrollable again 2025-12-25 05:05:03 +02:00
Adorian Doran
62263e3eea style/menus: fix menu backdrop effects 2025-12-25 04:44:51 +02:00
Adorian Doran
22d258b6bc style/menus: fix transparent submenus 2025-12-25 04:21:36 +02:00
Adorian Doran
51242f9bcb style/menus: ignore the disabled destructive menu items from being highlighted with red 2025-12-25 04:10:16 +02:00
Adorian Doran
ab0a0d3807 style/menus: bring back the red trash bin icon 2025-12-25 04:03:27 +02:00
Adorian Doran
cc37da9f11 style/menus: improve the icon-caption alignment 2025-12-25 03:46:32 +02:00
renovate[bot]
404618ed79 chore(deps): update dependency webdriverio to v9.22.0 2025-12-25 00:44:26 +00:00
renovate[bot]
3deda84b38 fix(deps): update dependency @codemirror/view to v6.39.7 2025-12-25 00:43:46 +00:00
renovate[bot]
ccf8e07316 chore(deps): update dependency @redocly/cli to v2.14.1 2025-12-25 00:43:09 +00:00
Adorian Doran
9c73b71feb style: add some animations when opening the sidebar and the bottom panel 2025-12-25 02:40:42 +02:00
Adorian Doran
bbec2f6082 style/bottom panel: improve appearance 2025-12-25 02:26:17 +02:00
Adorian Doran
924bd4512b style/options: tweak the padding of the page 2025-12-25 02:00:18 +02:00
Adorian Doran
ecb8bc0158 style/note header: fix a background issue on code notes 2025-12-25 01:50:28 +02:00
Adorian Doran
67b01ec1d8 style/bottom bar: tweak light color scheme colors 2025-12-25 01:31:47 +02:00
Adorian Doran
7ca7dd8867 Merge branch 'main' of https://github.com/TriliumNext/Trilium 2025-12-25 01:22:43 +02:00
Adorian Doran
ac086bc2a4 style/UI switcher illustration: improve 2025-12-25 01:22:35 +02:00
Elian Doran
a583369658 fix(zen): formatting toolbar disappearing due to specificity 2025-12-24 23:56:31 +02:00
Elian Doran
4bc2e9743c Translations update from Hosted Weblate (#8149) 2025-12-24 23:40:48 +02:00
Elian Doran
ba2ba4fd80 Apply suggestion from @gemini-code-assist[bot]
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2025-12-24 23:40:24 +02:00
Elian Doran
52aaa72935 fix(launch_bar): bookmarks not refreshing 2025-12-24 23:16:09 +02:00
Kuzma Simonov
4123c24a9f Translated using Weblate (Russian)
Currently translated at 100.0% (1726 of 1726 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ru/
2025-12-24 21:15:43 +00:00
noobhjy
4bba910501 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1726 of 1726 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2025-12-24 21:15:42 +00:00
green
3b31916b26 Translated using Weblate (Japanese)
Currently translated at 100.0% (1726 of 1726 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2025-12-24 21:15:41 +00:00
Francis C.
4234ee97fb Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1724 of 1724 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2025-12-24 21:15:41 +00:00
Marcelo Nolasco
a5c8287446 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (1724 of 1724 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pt_BR/
2025-12-24 21:15:40 +00:00
Luk On
77a90e524a Translated using Weblate (Polish)
Currently translated at 100.0% (1724 of 1724 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pl/
2025-12-24 21:15:39 +00:00
Francis C.
814f81adfc Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (1724 of 1724 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hant/
2025-12-24 21:15:39 +00:00
Adorian Doran
45c8b24b9c UI Tweaks (#8152) 2025-12-24 23:15:17 +02:00
Adorian Doran
2a7023ea16 style/tab bar: fix tab button rounded corners on horizontal layout 2025-12-24 23:06:06 +02:00
Elian Doran
4a2ff25052 chore(client): provide workaround for bypassing widget-missing-parent 2025-12-24 22:55:54 +02:00
Elian Doran
93582c1489 test(client): fix broken test after change to reference links 2025-12-24 22:41:29 +02:00
Adorian Doran
37d647261a style/watched file change alert bar: tweak 2025-12-24 22:39:10 +02:00
Adorian Doran
8af549aba4 style/bottom panel: do not use Mica on horizontal layout 2025-12-24 22:21:42 +02:00
Elian Doran
662423221e docs(user): mention new printing limitations 2025-12-24 22:21:14 +02:00
Adorian Doran
d6cd252f23 style/note title widget: fix the input selected text color when the current note is tinted 2025-12-24 22:13:52 +02:00
Adorian Doran
5af87788c6 style/quick edit/promoted attributes: fix card ghost margin causing unnecessary scroll 2025-12-24 21:59:55 +02:00
Adorian Doran
c329ab7eee style/zen mode/formatting toolbar: fix the background 2025-12-24 21:45:51 +02:00
Adorian Doran
2340c307cf style/label & relation definition dialog: fix the deformed close button 2025-12-24 20:06:50 +02:00
Adorian Doran
219454c7d3 style/links: fix the color for links referencing colored notes 2025-12-24 19:41:05 +02:00
Adorian Doran
3c14750e90 style/links: improve the selection outline 2025-12-24 19:36:26 +02:00
Elian Doran
b49ca3efe3 fix(print): disable for protected notes 2025-12-24 19:27:29 +02:00
Elian Doran
d21127e3a7 chore(client): fix typecheck 2025-12-24 19:25:13 +02:00
Elian Doran
9adf24da01 chore(client): address requested changes 2025-12-24 19:23:17 +02:00
Elian Doran
571cdfdeea feat(print): report for electron as well 2025-12-24 19:16:31 +02:00
Elian Doran
c2214493dc feat(print): add links to print report 2025-12-24 18:59:50 +02:00
Elian Doran
293ef60350 feat(print): display list of ignored notes 2025-12-24 18:50:50 +02:00
Elian Doran
60866c959f feat(print): report ignored notes 2025-12-24 18:42:13 +02:00
Elian Doran
84c40eb233 fix(print): skip files from being printed 2025-12-24 17:56:15 +02:00
Elian Doran
2afc8d181d fix(print): don't skip child notes if parent note has to be skipped 2025-12-24 17:55:30 +02:00
Elian Doran
66cdee82a4 fix(print): skip printing protected notes if session not available 2025-12-24 17:54:27 +02:00
Elian Doran
502c896616 fix(breadcrumbs): bottom gap caused by scrollbar in context menu 2025-12-24 17:45:45 +02:00
Elian Doran
b5af513371 fix(breadcrumbs): not reacting to protected session being started 2025-12-24 17:41:44 +02:00
Elian Doran
30cc221eca fix(breadcrumbs): branch prefix not shown 2025-12-24 17:37:31 +02:00
Elian Doran
db3aedf39d fix(note_detail): spaced update sometimes overwrites when note type is changed 2025-12-24 16:36:34 +02:00
Elian Doran
fd760951cc fix(text): recreating editor rapidly causes error 2025-12-24 16:23:17 +02:00
Elian Doran
b84cdd648f fix(layout): broken layout if new-layout is enabled as experimental feature 2025-12-24 16:05:20 +02:00
Elian Doran
b94b30e864 fix(options): new layout shown in experimental options 2025-12-24 15:51:26 +02:00
Elian Doran
0027bca415 fix(collections/grid): not displaying some images properly (closes #7969) 2025-12-24 15:02:17 +02:00
Elian Doran
4ac3634b04 fix(collections/list): archived notes always shown in sub-children (closes #8127) 2025-12-24 13:28:26 +02:00
Elian Doran
3207f37ac3 chore(client): format ListOrGridView 2025-12-24 13:20:00 +02:00
Elian Doran
28d3e61199 fix(text): search crashes editor (closes #8114) 2025-12-24 13:16:35 +02:00
Elian Doran
e476a2d306 fix(status_bar): code popup not displaying tooltips 2025-12-24 12:59:13 +02:00
Elian Doran
1d6766d9f3 fix(call_to_action): new layout message displayed for new installations as well 2025-12-24 12:49:45 +02:00
Elian Doran
b429861e8f fix(note_list): reference links displayed incorrectly 2025-12-24 12:45:11 +02:00
Elian Doran
81c55aab72 fix(launch_bar): escaped HTML in tooltip 2025-12-24 12:28:31 +02:00
Elian Doran
f67e06c8b2 fix(geomap): vector maps not rendering labels
Obtained from https://www.npmjs.com/package/@versatiles/style
2025-12-24 12:25:21 +02:00
Elian Doran
b3d92f932f fix(breadcrumbs): menu dismisses on click 2025-12-24 12:19:00 +02:00
Elian Doran
478c0e93f0 fix(breadcrumbs): last arrow not displayed on overflow menu 2025-12-24 12:14:54 +02:00
Elian Doran
bd24cf68b6 fix(note_type_switcher): don't read blob 2025-12-24 11:40:01 +02:00
Elian Doran
faea35b363 Revert "chore(right_pane): revert note data store"
This reverts commit 02294206ec.
2025-12-24 11:35:23 +02:00
Elian Doran
6b66d2089f fix(inline_title): reading metadata on every keystroke 2025-12-24 11:33:44 +02:00
Elian Doran
df05101e93 fix(inline_title): prevent flicker when updating tooltip 2025-12-24 10:52:36 +02:00
Elian Doran
7a1ea8833f fix(inline_title): tooltip getting stuck if refresh 2025-12-24 10:49:36 +02:00
Elian Doran
3600192933 fix(status_bar): note info requesting update on each keystroke 2025-12-24 10:38:57 +02:00
Elian Doran
d6d75a0e48 Minor tweaks (#8145) 2025-12-24 09:42:29 +02:00
Elian Doran
102e10efe3 fix(deps): update dependency @codemirror/view to v6.39.6 (#8147) 2025-12-24 09:41:28 +02:00
Elian Doran
a516185a2e fix(deps): update dependency preact to v10.28.1 (#8148) 2025-12-24 09:37:35 +02:00
Elian Doran
ae81b20334 chore(deps): update pnpm to v10.26.2 (#8146) 2025-12-24 09:29:18 +02:00
renovate[bot]
8fffbdc748 fix(deps): update dependency preact to v10.28.1 2025-12-24 00:25:29 +00:00
renovate[bot]
14d7d1da03 fix(deps): update dependency @codemirror/view to v6.39.6 2025-12-24 00:24:44 +00:00
renovate[bot]
9cb565e821 chore(deps): update pnpm to v10.26.2 2025-12-24 00:24:06 +00:00
Elian Doran
e3595a43c2 docs(user): missing language tags for JSX code blocks 2025-12-24 00:42:20 +02:00
Elian Doran
963fcd615a docs(user): missing language tags for code blocks 2025-12-24 00:30:16 +02:00
Elian Doran
fc8605a14f docs(user): broken code blocks due to table 2025-12-24 00:26:29 +02:00
Elian Doran
04fffb7ee0 Merge remote-tracking branch 'origin/main' into feature/minor_tweaks 2025-12-24 00:20:48 +02:00
Elian Doran
86307b482f docs(user): change URL for demo notes 2025-12-24 00:01:13 +02:00
Elian Doran
3e50262665 fix(status_bar): attribute pane not shown when adding new attribute def 2025-12-23 23:40:16 +02:00
Elian Doran
4e5c97d548 fix(toast): unreadable buttons on light theme 2025-12-23 23:06:29 +02:00
Elian Doran
1185d4b10b chore(layout): reduce padding for promoted attributes 2025-12-23 23:02:26 +02:00
Elian Doran
19cd7a0cad feat(script): improve script error message 2025-12-23 23:02:15 +02:00
Elian Doran
8fda283977 fix(title_actions): dark background in code affecting readability 2025-12-23 22:14:07 +02:00
Elian Doran
6e3a020d0f chore(badges): increase threshold for hiding text 2025-12-23 22:02:06 +02:00
Elian Doran
2fef25e57b chore(badges): allow overflow with clipping 2025-12-23 22:01:49 +02:00
Elian Doran
89ef38ba97 docs(user): mention history navigation buttons in the tab bar 2025-12-23 21:16:24 +02:00
Elian Doran
e96ee87472 chore: prevent error in .envrc for non nix systems (#8144) 2025-12-23 21:10:56 +02:00
Elian Doran
ae83126903 chore(tab_navigation): enable on server as well 2025-12-23 21:09:03 +02:00
Elian Doran
a6c7610fcc fix(dropdown): clicking in the outer area of a menu dismisses it 2025-12-23 21:06:47 +02:00
contributor
d8ce0e5f16 chore: use direnv built-in has command
https://direnv.net/man/direnv-stdlib.1.html#stdlib
2025-12-23 20:52:07 +02:00
Elian Doran
1eebc8ff77 fix(note_badges): avoid "shared locally" on server build 2025-12-23 20:44:12 +02:00
Elian Doran
00592025c0 fix(breadcrumb): overflow hides more items than threshold 2025-12-23 20:40:56 +02:00
Elian Doran
1ac7db41d3 fix(note_title_actions): edited notes link looking strange 2025-12-23 20:33:46 +02:00
contributor
ce84e7a861 chore: prevent error in .envrc for non nix systems 2025-12-23 20:25:15 +02:00
Elian Doran
cf039916d3 chore(note_title_actions): rephrase edited notes 2025-12-23 20:08:21 +02:00
Elian Doran
bfb3ed3ddf chore(layout): relocate note type switcher right above content 2025-12-23 20:03:27 +02:00
Elian Doran
a4f34ce6c5 refactor(client): remove items array 2025-12-23 19:55:50 +02:00
Elian Doran
2ac3d3aaed style(layout): adjust paddings slightly 2025-12-23 19:49:21 +02:00
Elian Doran
494b99d073 chore(layout): integrate edited notes into note title actions 2025-12-23 19:34:19 +02:00
Elian Doran
8434549a9b feat(breadcrumbs): display separator even if no child notes 2025-12-23 19:15:48 +02:00
Elian Doran
c1e01467a5 fix(breadcrumbs): not showing on first render 2025-12-23 19:12:18 +02:00
meinzzzz
87ab41c80c Fix shift+tab behavior in MathInputView 2025-12-23 18:02:40 +01:00
Elian Doran
4bd8eeb52a Translations update from Hosted Weblate (#8143) 2025-12-23 15:41:11 +02:00
Marcelo Nolasco
f4a6edbc9f Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (389 of 389 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/pt_BR/
2025-12-23 13:38:17 +00:00
noobhjy
0d0a1866e4 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1720 of 1720 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2025-12-23 13:38:16 +00:00
green
cd47e79a1b Translated using Weblate (Japanese)
Currently translated at 100.0% (1720 of 1720 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2025-12-23 13:38:16 +00:00
Kuzma Simonov
d0a83f7c05 Translated using Weblate (Russian)
Currently translated at 100.0% (1720 of 1720 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ru/
2025-12-23 13:38:15 +00:00
Marcelo Nolasco
26160b44ea Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (1720 of 1720 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pt_BR/
2025-12-23 13:38:14 +00:00
Giovi
9df7b04d7d Translated using Weblate (Italian)
Currently translated at 100.0% (1720 of 1720 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/it/
2025-12-23 13:38:13 +00:00
Elian Doran
b8d933d308 Icons for code notes by mime type (#8142) 2025-12-23 15:37:51 +02:00
Elian Doran
9021b119b2 fix(client): some tooltips don't render correctly due to extra whitespace 2025-12-23 15:34:53 +02:00
Elian Doran
35034fe9df chore: address requested changes 2025-12-23 15:30:57 +02:00
Elian Doran
2eef655ec2 feat(client): display mapped icon as default for notes 2025-12-23 15:15:22 +02:00
Elian Doran
57ff2f4023 feat(status_bar): display icon for code note switcher 2025-12-23 15:00:31 +02:00
Elian Doran
df6331e3a0 chore(commons): add icon mappings to some common mime types 2025-12-23 15:00:19 +02:00
Elian Doran
b84da65a81 fix(code): not reacting to mime type changes 2025-12-23 14:38:17 +02:00
Elian Doran
58e04a6f72 Support for scripting with Preact and JSX (#8126) 2025-12-23 13:50:35 +02:00
Elian Doran
450bdeb39e fix(deps): update dependency @codemirror/view to v6.39.5 (#8137) 2025-12-23 13:39:58 +02:00
Elian Doran
79494e8cfe chore(deps): update dependency @ckeditor/ckeditor5-dev-build-tools to v54.2.3 (#8135) 2025-12-23 13:39:40 +02:00
Elian Doran
2afba34055 chore(deps): update typescript-eslint monorepo to v8.50.1 (#8136) 2025-12-23 13:39:26 +02:00
Elian Doran
c391234eeb fix(deps): update fullcalendar monorepo to v6.1.20 (#8138) 2025-12-23 13:39:13 +02:00
Elian Doran
a3fca323c7 test(server): fix test depending on note content 2025-12-23 13:38:38 +02:00
Elian Doran
9332b9ca8f docs(demo): add JSX widget showcase 2025-12-23 13:34:26 +02:00
Elian Doran
8740bf84cf chore(mime_types): set JSX as enabled by default 2025-12-23 13:12:29 +02:00
Elian Doran
1554085d7a chore(scripts/preact): address review 2025-12-23 13:06:33 +02:00
renovate[bot]
7dd4c09057 fix(deps): update fullcalendar monorepo to v6.1.20 2025-12-23 11:05:39 +00:00
renovate[bot]
eafd5140ea fix(deps): update dependency @codemirror/view to v6.39.5 2025-12-23 11:04:52 +00:00
renovate[bot]
cddde353cd chore(deps): update typescript-eslint monorepo to v8.50.1 2025-12-23 11:04:01 +00:00
renovate[bot]
e4ef8f2352 chore(deps): update dependency @ckeditor/ckeditor5-dev-build-tools to v54.2.3 2025-12-23 11:02:27 +00:00
Elian Doran
2561c7ca0d Merge remote-tracking branch 'origin/main' into feature/preact_scripts 2025-12-23 13:00:55 +02:00
Elian Doran
b4e4950d20 chore(client): fix typecheck 2025-12-23 12:59:22 +02:00
Adorian Doran
a4be86dbd8 style/text: prevent reference links inherit color from the current note 2025-12-23 05:26:54 +02:00
Adorian Doran
b6ca6476de demo notes: change the icon and color for the "Trilium Demo" branch 2025-12-23 05:00:23 +02:00
Adorian Doran
db1f632859 style/zen mode: make the read-only note badge visible 2025-12-23 04:24:39 +02:00
Adorian Doran
7af8acec0f style/zen mode: fix the title widget layout, make the icon and title editable 2025-12-23 04:20:17 +02:00
Adorian Doran
3f1b0fa71e style/breadcrumb: tweak 2025-12-23 04:02:53 +02:00
Adorian Doran
519323292c style/breadcrumb: tweak 2025-12-23 03:48:09 +02:00
Adorian Doran
2d6f17aeaa style/breadcrumb: tweak dropdown lists 2025-12-23 03:07:30 +02:00
Adorian Doran
7507d6b385 style/bottom panel: tweak colors 2025-12-23 02:52:03 +02:00
Adorian Doran
d4fa21e7c1 style/bottom panel: tweak colors 2025-12-22 23:57:40 +02:00
Adorian Doran
608f156b82 client: rename "status bar pane" to "bottom panel" 2025-12-22 23:40:11 +02:00
Adorian Doran
0c965bfdf4 client/status bar panes: extract colors as CSS variables 2025-12-22 23:36:35 +02:00
Adorian Doran
d407c72fae Merge branch 'main' of https://github.com/TriliumNext/Trilium 2025-12-22 23:27:55 +02:00
Adorian Doran
bdc0b062d5 client/status bar panes: improve 2025-12-22 23:27:45 +02:00
Elian Doran
0b912b9c7d Translations update from Hosted Weblate (#8134) 2025-12-22 22:35:26 +02:00
Anton Antonov
99ac6b4df1 Translated using Weblate (Bulgarian)
Currently translated at 16.4% (25 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/bg/
2025-12-22 20:23:36 +00:00
Hosted Weblate
b0a97208a2 Update translation files
Updated by "Remove blank strings" add-on in Weblate.

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/
2025-12-22 20:23:36 +00:00
Anton Antonov
6e044b19c8 Translated using Weblate (Bulgarian)
Currently translated at 12.5% (19 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/bg/
2025-12-22 20:23:35 +00:00
Anton Antonov
198dd15fb4 Added translation using Weblate (Bulgarian) 2025-12-22 20:23:34 +00:00
Anton Antonov
18f3b83827 Added translation using Weblate (Bulgarian) 2025-12-22 20:23:33 +00:00
Anton Antonov
8142b7489a Added translation using Weblate (Bulgarian) 2025-12-22 20:23:33 +00:00
Anton Antonov
7bf0a4134e Added translation using Weblate (Bulgarian) 2025-12-22 20:23:32 +00:00
Kuzma Simonov
29ed08d062 Translated using Weblate (Russian)
Currently translated at 100.0% (1718 of 1718 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ru/
2025-12-22 20:23:31 +00:00
Francis C.
68dc7eedec Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 99.5% (1711 of 1718 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hant/
2025-12-22 20:23:31 +00:00
Yunho Park
3fc195998c Translated using Weblate (Korean)
Currently translated at 67.7% (103 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/ko/
2025-12-22 20:23:30 +00:00
Kuzma Simonov
b6d550f682 Translated using Weblate (Russian)
Currently translated at 100.0% (389 of 389 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ru/
2025-12-22 20:23:29 +00:00
Adorian Doran
1f55ff536e client/status bar panes: tweak 2025-12-22 22:23:16 +02:00
Adorian Doran
67fb8d0354 client/status bar panes: tweak 2025-12-22 21:25:39 +02:00
Adorian Doran
1408b159d7 Merge branch 'main' of https://github.com/TriliumNext/Trilium 2025-12-22 19:40:01 +02:00
Adorian Doran
74b00e60e3 client/status bar panes: refactor into own component, add title bar and close button 2025-12-22 19:39:52 +02:00
Elian Doran
1b18a964b9 chore(deps): update dependency @types/tabulator-tables to v6.3.1 (#8131) 2025-12-22 19:35:09 +02:00
renovate[bot]
931f0a694e chore(deps): update dependency @types/tabulator-tables to v6.3.1 2025-12-22 01:50:47 +00:00
Adorian Doran
0d32e1f0d8 style/classic toolbar: fix broken border radius 2025-12-22 02:43:39 +02:00
Adorian Doran
d0f91e7709 style/status bar: hide the focus outline for dropdown buttons 2025-12-22 02:37:00 +02:00
Adorian Doran
353d626d45 style/breadcrumb: tweak arrows 2025-12-22 02:29:05 +02:00
Adorian Doran
af67a3ba11 style/breadcrumb: use scrollable dropdowns for note listings 2025-12-22 02:24:34 +02:00
Adorian Doran
a867c646e4 style: refactor 2025-12-22 02:23:43 +02:00
Adorian Doran
150e2504b1 style: add (limited) support for scrollable menus 2025-12-22 02:20:56 +02:00
Adorian Doran
aa7ae150dc style/text editor/links: tweak 2025-12-22 02:04:35 +02:00
Adorian Doran
d99e08bfdd style/text editor: fix links 2025-12-22 01:39:33 +02:00
Elian Doran
29d038c76b Translations update from Hosted Weblate (#8130) 2025-12-22 00:25:39 +02:00
Barszczun
f1615bb4f6 Translated using Weblate (Polish)
Currently translated at 99.6% (1712 of 1718 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pl/
2025-12-21 23:11:12 +01:00
Elian Doran
0688ea7de3 chore(client): address requested changes 2025-12-21 22:59:21 +02:00
Elian Doran
af37c175a3 chore(client): fix typecheck 2025-12-21 22:55:20 +02:00
Elian Doran
7567903da3 docs(user): improve documentation on custom widgets & Preact 2025-12-21 22:51:23 +02:00
Elian Doran
531698cafb fix(server/script): ignoring sub-component JSX 2025-12-21 20:01:59 +02:00
perfectra1n
f45920e506 fix(comparison): check all tokens, and do not short-circuit 2025-12-21 09:26:20 -08:00
perfectra1n
6fdd418edd fix(comparison): also fix string comparison hashes in recovery codes 2025-12-21 09:22:53 -08:00
perfectra1n
409ecb84a8 feat(login): implement better time comparison management across several features 2025-12-21 08:58:38 -08:00
Elian Doran
f68f99806b Merge remote-tracking branch 'origin/main' into feature/preact_scripts 2025-12-21 18:25:24 +02:00
Elian Doran
ea1efb785b Translations update from Hosted Weblate (#8128) 2025-12-21 17:13:12 +02:00
noobhjy
308943f754 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1718 of 1718 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2025-12-21 15:00:25 +00:00
green
d43409f6e4 Translated using Weblate (Japanese)
Currently translated at 100.0% (1718 of 1718 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2025-12-21 15:00:23 +00:00
noobhjy
4f51aa7a43 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 96.2% (1654 of 1718 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hant/
2025-12-21 15:00:22 +00:00
Elian Doran
c4f55395a9 feat(client/jsx): disable debug info 2025-12-21 13:31:44 +02:00
Elian Doran
444c0c6107 chore(client/jsx): fix errors in API 2025-12-21 13:19:42 +02:00
Elian Doran
4da5cb43fc fet(client/jsx): expose basic React widgets 2025-12-21 13:16:05 +02:00
Elian Doran
e6b79e83c4 fet(client/jsx): basic support for JSX render notes 2025-12-21 11:18:42 +02:00
Elian Doran
6e67da7b1f chore(deps): revert sucrase from client 2025-12-21 10:32:54 +02:00
Elian Doran
9071e54bfe chore(client/jsx): use different method for launcher widget defs 2025-12-21 10:26:20 +02:00
Elian Doran
783b5ac8e3 feat(client/jsx): support launcher widgets 2025-12-21 10:23:34 +02:00
Elian Doran
f3f491d141 feat(client/bundle): respect position for TSX widgets 2025-12-21 10:02:13 +02:00
Adorian Doran
a9f58262fc style/links: tweak 2025-12-21 00:29:25 +02:00
Adorian Doran
3ef39784ed Merge branch 'main' of https://github.com/TriliumNext/Trilium 2025-12-21 00:21:26 +02:00
Adorian Doran
24d0d562a9 style/links: tweak 2025-12-21 00:21:17 +02:00
Elian Doran
86c5a4d10c chore(etapi): Add missing share format (#8125) 2025-12-20 23:58:24 +02:00
Elian Doran
f8bf301d12 feat(client/bundle): use new toast for script errors with known note ID 2025-12-20 23:34:36 +02:00
Adorian Doran
32f0d81c07 style/links: tweak colors 2025-12-20 23:33:27 +02:00
Elian Doran
2c25786fa2 feat(client/bundle): expose Trilium hooks 2025-12-20 23:26:10 +02:00
Elian Doran
1093acfe45 feat(client/bundle): make Preact custom widgets content-sized by default 2025-12-20 23:17:30 +02:00
Elian Doran
76f054bbd5 feat(client/bundle): support rendering in other places 2025-12-20 23:16:19 +02:00
Adorian Doran
1ed4192c93 style/note badges: tweak 2025-12-20 23:12:39 +02:00
Elian Doran
c558255450 feat(client/bundle): add button to open script note 2025-12-20 22:51:04 +02:00
Elian Doran
1e94125133 feat(client/bundle): display toast when parent is missing 2025-12-20 22:45:58 +02:00
Elian Doran
64a770175f refactor(client/bundle): use type for parent name 2025-12-20 22:40:03 +02:00
Elian Doran
e0416097e1 feat(script/jsx): support import syntax for api 2025-12-20 22:23:25 +02:00
Elian Doran
6c1b327f5f feat(script/jsx): support import syntax for preact 2025-12-20 22:14:45 +02:00
Wael Nasreddine
17a9550803 chore(etapi): Add missing share format 2025-12-20 12:01:12 -08:00
Elian Doran
284b66acd2 feat(script/jsx): support export default syntax 2025-12-20 21:59:03 +02:00
Elian Doran
dcd73ff9f9 test(script/jsx): JSX fragment 2025-12-20 21:37:41 +02:00
Elian Doran
645557b505 test(script/jsx): basic JSX processing 2025-12-20 21:35:52 +02:00
Elian Doran
22a83d9f82 refactor(script/jsx): "react-widget" -> "preact-widget" 2025-12-20 21:26:01 +02:00
Elian Doran
f64de3acca chore(script/jsx): move defineWidget into Preact API 2025-12-20 21:25:36 +02:00
Elian Doran
34d5793888 chore(script/jsx): expose RightPanelWidget 2025-12-20 21:19:53 +02:00
Adorian Doran
0de9b219a5 style/note badges: extract colors as CSS variables 2025-12-20 20:41:23 +02:00
Elian Doran
44ca9f457c feat(script/jsx): add support for React hooks 2025-12-20 20:29:03 +02:00
Adorian Doran
93eead04a9 Merge branch 'main' of https://github.com/TriliumNext/Trilium 2025-12-20 20:27:12 +02:00
Adorian Doran
8ff1f7ec84 style/classic toolbar: tweak background color 2025-12-20 20:27:04 +02:00
Elian Doran
4d7e5bc8f6 chore(script/jsx): move Preact API in dedicated object 2025-12-20 20:10:19 +02:00
Elian Doran
644ff07a50 feat(script/jsx): get right panel widgets to actually render 2025-12-20 19:49:24 +02:00
Elian Doran
41220a9d1d fix(script/jsx): cannot find preact hydration function 2025-12-20 19:45:44 +02:00
Elian Doran
88945788d6 fix(script/jsx): critical crash if widget fails to render 2025-12-20 19:41:48 +02:00
Elian Doran
fe8f033409 chore(script/jsx): get widgets to be interpreted 2025-12-20 19:36:02 +02:00
Elian Doran
eee7c49f6e fix(script/jsx): module not defined 2025-12-20 19:28:26 +02:00
Elian Doran
d036bf0870 fix(client): full crash if server fails to obtain list of widgets 2025-12-20 19:18:50 +02:00
Elian Doran
fa8ff4bfbf chore(script/jsx): basic client-side logic to render bundles 2025-12-20 19:01:29 +02:00
Elian Doran
3619c0c3e4 feat(script/jsx): compile JSX on server side 2025-12-20 18:46:15 +02:00
Elian Doran
883e32f5c9 chore(script): install sucrase 2025-12-20 18:03:45 +02:00
Elian Doran
8722ed405e docs(user): add missing share aliases 2025-12-20 17:56:18 +02:00
Adorian Doran
201c3a6eba style: tint the text selection according to the note's custom color 2025-12-20 16:13:38 +02:00
Adorian Doran
5a46f6ad04 style/classic toolbar: tweak 2025-12-20 15:51:55 +02:00
Adorian Doran
4f20ffe933 Tweak the classic formatting toolbar (#8123) 2025-12-20 15:33:17 +02:00
Adorian Doran
061b0966bb rollback: style/tab bar: visually merge the tab bar with the center panel 2025-12-20 15:28:46 +02:00
Elian Doran
bd799823b8 docs(user): add troubleshooting on content-sized 2025-12-20 13:54:50 +02:00
Elian Doran
c581ee7252 docs(user): improve examples for right pane widgets 2025-12-20 13:29:38 +02:00
Elian Doran
666c434c74 docs(user): mention changes to sidebar 2025-12-20 13:17:01 +02:00
Elian Doran
78ac59581e New layout: Right panel (sidebar) (#8095) 2025-12-20 13:09:59 +02:00
Elian Doran
d7b370253d chore(right_pane): fix regression in highlights_list 2025-12-20 13:00:13 +02:00
Elian Doran
1e885625f6 chore(right_pane): address requested changes 2025-12-20 12:58:06 +02:00
Adorian Doran
8cf6a6b9ae style: make the center panel border radius apply over the classic formatting toolbar if required 2025-12-20 12:51:43 +02:00
Elian Doran
f1ca8881a1 chore(right_pane): fix typecheck 2025-12-20 12:32:20 +02:00
Elian Doran
ea76fd797c chore(right_pane): address requested changes 2025-12-20 12:29:43 +02:00
Elian Doran
b248805905 feat(right_pane): add count to highlights list 2025-12-20 12:25:43 +02:00
Adorian Doran
7af5c77bcb style/tab bar: tweak margin 2025-12-20 12:18:11 +02:00
Elian Doran
35afd60d00 feat(right_pane): respect position 2025-12-20 12:17:14 +02:00
Elian Doran
2b827991ef feat(right_pane): only grow table of contents & highlights 2025-12-20 11:52:40 +02:00
Elian Doran
bc8c852a4d chore(right_pane): align collapse icon with menu item 2025-12-20 11:48:47 +02:00
Elian Doran
cd49c36529 chore(right_pane): decrease context menu size slightly 2025-12-20 11:45:08 +02:00
Elian Doran
a0577dc202 chore(right_pane): use menu instead of button for highlights list 2025-12-20 11:42:21 +02:00
Elian Doran
dced799976 feat(right_pane): add context menu with go to source for custom widgets 2025-12-20 11:39:46 +02:00
Elian Doran
eeea96b98c chore(right_pane): missing key for custom widgets 2025-12-20 11:17:29 +02:00
Elian Doran
e82e92c22c fix(right_pane): custom widgets not aware of note context 2025-12-20 11:16:41 +02:00
Elian Doran
e1df65adce fix(right_pane): custom widgets not rendering after being expanded 2025-12-20 11:09:59 +02:00
Adorian Doran
b7b7610f4d style/classic toolbar: allow customizing the background color via a CSS variable 2025-12-20 11:05:14 +02:00
Adorian Doran
37ea1584c9 style/tab bar: visually merge the tab bar with the center panel 2025-12-20 10:42:13 +02:00
Elian Doran
aac4316fb8 feat(right_pane): render title bar 2025-12-20 10:33:28 +02:00
Elian Doran
fb96b3f80a Translations update from Hosted Weblate (#8120) 2025-12-20 09:04:25 +02:00
Maxime
243d8158cf Translated using Weblate (French)
Currently translated at 100.0% (152 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/fr/
2025-12-20 07:03:32 +00:00
Eugene
6861a61cac Translated using Weblate (Russian)
Currently translated at 100.0% (152 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/ru/
2025-12-20 07:03:31 +00:00
Kuzma Simonov
d3299d8aa4 Translated using Weblate (Russian)
Currently translated at 100.0% (152 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/ru/
2025-12-20 07:03:30 +00:00
Maxime
0be5581fe5 Translated using Weblate (French)
Currently translated at 99.7% (388 of 389 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/fr/
2025-12-20 07:03:30 +00:00
Kuzma Simonov
60572a28ff Translated using Weblate (Russian)
Currently translated at 100.0% (389 of 389 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ru/
2025-12-20 07:03:29 +00:00
Maxime
422c391c82 Translated using Weblate (French)
Currently translated at 95.9% (1640 of 1709 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/fr/
2025-12-20 07:03:28 +00:00
Kuzma Simonov
457d30cd80 Translated using Weblate (Russian)
Currently translated at 100.0% (1709 of 1709 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ru/
2025-12-20 07:03:27 +00:00
Hosted Weblate
9caa058b18 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/
2025-12-20 07:03:26 +00:00
Elian Doran
33bde688c1 chore(deps): update dependency @redocly/cli to v2.14.0 (#8118) 2025-12-20 09:03:18 +02:00
Elian Doran
e79da6b0f3 chore(deps): update pnpm to v10.26.1 (#8117) 2025-12-20 09:02:39 +02:00
Elian Doran
3e527b9f5c chore(deps): update dependency openai to v6.15.0 (#8119) 2025-12-20 09:01:46 +02:00
renovate[bot]
ba242a6169 chore(deps): update dependency openai to v6.15.0 2025-12-20 01:00:35 +00:00
renovate[bot]
489113f582 chore(deps): update dependency @redocly/cli to v2.14.0 2025-12-20 00:59:47 +00:00
renovate[bot]
0fa6335d0f chore(deps): update pnpm to v10.26.1 2025-12-20 00:58:53 +00:00
Elian Doran
8f1614f603 chore(right_pane_widget): basic support for custom widgets 2025-12-20 00:01:21 +02:00
Elian Doran
a5f322617d chore(script): remove node-detail-pane 2025-12-19 23:44:19 +02:00
Elian Doran
6da42fac20 feat(right_pane_widget): handle zero headings 2025-12-19 23:32:58 +02:00
Elian Doran
fad6414e1d feat(right_pane_widget): handle zero highlights 2025-12-19 23:29:52 +02:00
Elian Doran
c0cd9e36d9 feat(right_pane_widget): hide highlights if disabled in settings 2025-12-19 23:25:58 +02:00
Elian Doran
e94704ce64 chore(right_pane_widget): respect highlight settings 2025-12-19 23:18:28 +02:00
Elian Doran
7a5d24f968 feat(right_pane_widget): options modal for highlight list 2025-12-19 23:02:32 +02:00
Elian Doran
9d351ae479 chore(options/text_notes): adapt to new layout sidebar 2025-12-19 22:33:26 +02:00
Elian Doran
01d4fa8afd chore(right_pane_widget): add padding to no items 2025-12-19 22:26:17 +02:00
Elian Doran
7d386c249a fix(right_pane_widget): toggle button clipped on desktop 2025-12-19 22:23:46 +02:00
Elian Doran
45dd47d039 feat(layout): button to toggle right pane on vertical layout 2025-12-19 21:20:36 +02:00
Elian Doran
06ad0bfa90 feat(hooks): react faster to setting options 2025-12-19 21:12:49 +02:00
Elian Doran
3d9efb23ec chore(right_pane): make right pane collapsible 2025-12-19 21:11:46 +02:00
Elian Doran
9acef4d502 feat(layout): button to toggle right pane on horizontal layout 2025-12-19 21:05:21 +02:00
Elian Doran
d22583457f style(right_pane): left-align title 2025-12-19 20:51:27 +02:00
Elian Doran
290469d1df Translations update from Hosted Weblate (#8115) 2025-12-19 14:28:57 +02:00
Kuzma Simonov
de5b766d0c Translated using Weblate (Russian)
Currently translated at 17.7% (27 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/ru/
2025-12-19 12:26:27 +01:00
Kuzma Simonov
cbeb5dfb58 Translated using Weblate (Russian)
Currently translated at 98.0% (1676 of 1709 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ru/
2025-12-19 12:26:27 +01:00
Kuzma Simonov
be5448eba2 Translated using Weblate (Russian)
Currently translated at 65.5% (76 of 116 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/ru/
2025-12-19 12:26:24 +01:00
Kuzma Simonov
200e5d04a4 Translated using Weblate (Russian)
Currently translated at 97.6% (380 of 389 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ru/
2025-12-19 12:26:24 +01:00
Elian Doran
c7bbf709a1 Translations update from Hosted Weblate (#8108) 2025-12-19 08:39:18 +02:00
Elian Doran
23c2a59eba chore(deps): update dependency fs-extra to v11.3.3 (#8103) 2025-12-19 08:38:40 +02:00
Hosted Weblate
bf74c40f73 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/
2025-12-19 07:38:21 +01:00
Elian Doran
2af1ceda0b fix(deps): update dependency preact-iso to v2.11.1 (#8105) 2025-12-19 08:38:15 +02:00
renovate[bot]
44ae60005c chore(deps): update dependency fs-extra to v11.3.3 2025-12-19 06:38:07 +00:00
Elian Doran
3d591922bb chore(deps): update dependency @redocly/cli to v2.13.0 (#8106) 2025-12-19 08:37:41 +02:00
Elian Doran
31b2aba44c fix(deps): update dependency @codemirror/commands to v6.10.1 (#8104) 2025-12-19 08:37:01 +02:00
Elian Doran
df1c6196bf chore(deps): update dependency esbuild to v0.27.2 (#8102) 2025-12-19 08:36:18 +02:00
Elian Doran
96f4567ba1 chore(deps): update dependency @smithy/middleware-retry to v4.4.17 (#8101) 2025-12-19 08:32:52 +02:00
Adorian Doran
3e783817b6 style/quick edit dialog: tweak title 2025-12-19 02:51:04 +02:00
Adorian Doran
f7f3f707f1 client/note title row: use distinct style when used as a note split title 2025-12-19 02:46:50 +02:00
Adorian Doran
5ce81f1a32 client/note title widget: add support for custom CSS class name 2025-12-19 02:30:46 +02:00
renovate[bot]
53df319aeb chore(deps): update dependency @redocly/cli to v2.13.0 2025-12-19 00:17:52 +00:00
renovate[bot]
c56a253e49 fix(deps): update dependency preact-iso to v2.11.1 2025-12-19 00:17:17 +00:00
renovate[bot]
551b2aa33a fix(deps): update dependency @codemirror/commands to v6.10.1 2025-12-19 00:16:42 +00:00
Adorian Doran
8e245ccad8 Note header: apply note custom colors over the note icons (#8100) 2025-12-19 02:15:30 +02:00
renovate[bot]
03cea8b702 chore(deps): update dependency esbuild to v0.27.2 2025-12-19 00:15:28 +00:00
renovate[bot]
c94b5bc6c9 chore(deps): update dependency @smithy/middleware-retry to v4.4.17 2025-12-19 00:14:36 +00:00
Adorian Doran
69dc1ba68f Merge branch 'main' into feat/note-header/custom-colors 2025-12-19 02:12:25 +02:00
Adorian Doran
32f7ae1edd client: refactor 2025-12-19 02:12:00 +02:00
Adorian Doran
0de05ed16e style/note icon: apply note custom colors over the icons of the quick edit dialog as well 2025-12-19 02:01:03 +02:00
Adorian Doran
58e24c98ed style/note icon: fix the parent note color being applied over note links and board items 2025-12-19 01:55:52 +02:00
Adorian Doran
46da118749 style/note icon: cleanup 2025-12-19 01:43:11 +02:00
Adorian Doran
3f7514c9c7 style/note icon: tweak dark mode colors 2025-12-19 01:39:36 +02:00
Adorian Doran
5123f7b678 style/note icon: fix broken hover color for monochrome icons 2025-12-19 01:38:34 +02:00
Adorian Doran
b8af961690 style/note icon: refactor variable names 2025-12-19 01:23:56 +02:00
Adorian Doran
5bcec9fcfd style/note icon: add hover effect for custom colors 2025-12-19 01:21:52 +02:00
Elian Doran
0a2d4131d7 feat(docs): improve link docs organization (#8057) 2025-12-19 00:26:09 +02:00
Elian Doran
9ef4ab9983 fix(search): add null check for canvas elements in fulltext search (#8090) 2025-12-19 00:22:43 +02:00
Elian Doran
2a237e9a49 Translations update from Hosted Weblate (#8081) 2025-12-19 00:20:30 +02:00
Elian Doran
29115f5e61 Translated using Weblate (Dutch)
Currently translated at 25.8% (30 of 116 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/nl/
2025-12-18 23:19:45 +01:00
noobhjy
3411ed79d8 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1709 of 1709 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2025-12-18 23:14:32 +01:00
green
b9c6cae5b4 Translated using Weblate (Japanese)
Currently translated at 100.0% (1709 of 1709 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2025-12-18 23:14:31 +01:00
Luk On
cc84d09230 Translated using Weblate (Polish)
Currently translated at 100.0% (1709 of 1709 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pl/
2025-12-18 23:14:30 +01:00
Luk On
a82b12a599 Translated using Weblate (Polish)
Currently translated at 100.0% (1703 of 1703 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pl/
2025-12-18 23:14:29 +01:00
noobhjy
65ebbc71f5 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1703 of 1703 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2025-12-18 23:14:29 +01:00
green
77c1a00831 Translated using Weblate (Japanese)
Currently translated at 100.0% (1703 of 1703 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2025-12-18 23:14:28 +01:00
Hosted Weblate
8eb6bf402d 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/
2025-12-18 23:14:27 +01:00
Elian Doran
e45beb541e Fix translation text for database cleaning button (#8080) 2025-12-19 00:14:19 +02:00
Elian Doran
334c31e79d fix(right_pane): table of contents no longer visible 2025-12-18 17:00:11 +02:00
Elian Doran
a986c84ce7 chore(right_pane): remove redundant check for note type 2025-12-18 16:59:40 +02:00
Elian Doran
9b21e042ec feat(floating_buttons): handle case when empty 2025-12-18 16:58:15 +02:00
Elian Doran
c44bb6c203 chore(floating_buttons): revert changes due to new layout 2025-12-18 16:33:12 +02:00
Elian Doran
ddb6b3ea8a feat(right_pane): store expansion state 2025-12-18 16:29:35 +02:00
Elian Doran
a4024d17ba fix(highlights_list): empty results 2025-12-18 16:18:31 +02:00
Elian Doran
57081a1bfb feat(right_pane): make whole title clickable 2025-12-18 16:16:52 +02:00
Elian Doran
7af063e7cd feat(right_pane): simplify collapsing mechanism 2025-12-18 16:15:21 +02:00
Elian Doran
7b04ca8cc7 style(right_pane): improve header space slightly 2025-12-18 15:57:48 +02:00
Elian Doran
02294206ec chore(right_pane): revert note data store 2025-12-18 15:42:44 +02:00
Elian Doran
7f7ec5d858 chore(right_pane): make the gutter slightly bigger 2025-12-18 15:40:09 +02:00
Elian Doran
ea3222cf12 chore(right_pane): more advanced expand/collapse 2025-12-18 14:57:42 +02:00
Elian Doran
5dacfd3ac6 chore(right_pane): basic expand support 2025-12-18 14:52:22 +02:00
Elian Doran
682c61305c chore(right_pane): basic collapse support 2025-12-18 14:43:54 +02:00
Elian Doran
b5bfb02d96 chore(right_pane): experiment with resizable sections 2025-12-18 14:12:28 +02:00
Elian Doran
fc3692333a chore(right_pane): improve style slightly 2025-12-18 14:10:16 +02:00
Elian Doran
28d9d98964 fix(highlights_list): unable to scroll to text fragments 2025-12-18 13:45:45 +02:00
Elian Doran
751a874c51 chore(highlights_list): improve performance by matching fewer elements 2025-12-18 13:38:52 +02:00
Elian Doran
d18ac0c613 fix(highlights_list): displaying non-highlighted attributes 2025-12-18 13:33:08 +02:00
Elian Doran
cd9654cd5f chore(highlights_list): reintroduce support for read-only notes 2025-12-18 13:29:36 +02:00
Elian Doran
925049357a fix(highlights_list): missing key 2025-12-18 13:20:04 +02:00
Elian Doran
d920da9e6f chore(highlights_list): render highlights 2025-12-18 13:17:41 +02:00
Elian Doran
b42a4dcb36 chore(highlights_list): react to changes 2025-12-18 13:13:05 +02:00
Elian Doran
7085e62cfc chore(highlights_list): reintroduce navigation 2025-12-18 13:09:53 +02:00
Elian Doran
73f2f56932 chore(highlights_list): read highlights from CK 2025-12-18 12:52:22 +02:00
Elian Doran
dbf29ed23f chore(highlights_list): start from scratch 2025-12-18 12:38:45 +02:00
Elian Doran
b0e1751dc7 chore(toc): reintroduce navigation in readonly text notes 2025-12-18 12:09:05 +02:00
Elian Doran
bf5c56a61a chore(toc): reintroduce navigation in editable text notes 2025-12-18 12:04:42 +02:00
Elian Doran
96ccb1e67e fix(toc): sometimes not reacting to read-only note switching 2025-12-18 11:46:21 +02:00
Elian Doran
704dcd011e feat(toc): basic support for docs 2025-12-18 11:46:13 +02:00
Elian Doran
b93c80fe7b feat(toc): basic support for read-only text 2025-12-18 11:12:36 +02:00
Elian Doran
41751c205c refactor(toc): reorder according to purpose 2025-12-18 10:58:25 +02:00
Elian Doran
852398426e chore(toc): add unique keys to headings 2025-12-18 10:56:44 +02:00
Elian Doran
73f1b91d34 chore(toc): reintroduce basic collapse support 2025-12-18 10:49:33 +02:00
Xen0r
28da93fc65 Merge branch 'main' into main 2025-12-18 09:36:55 +01:00
Elian Doran
87a98201b4 chore(toc): reintroduce hierarchy 2025-12-18 10:30:39 +02:00
Elian Doran
60342c0f6f fix(toc): not working on note switch 2025-12-18 10:08:10 +02:00
Elian Doran
97a3e439d2 refactor(toc): decouple CKEditor TOC 2025-12-18 09:58:10 +02:00
Jason Wasem
ee6f988c35 refactor(search): simplify null check and use join for text concatenation
根据代码审查建议优化代码:
- 移除多余的 `elements &&` 检查,因为 Array.isArray() 本身可处理 null/undefined
- 使用 `join(" ")` 替代 `toString()` 以确保文本元素用空格分隔,更适合全文搜索
- 移除显式类型声明,让 TypeScript 自动推断

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 10:01:13 +08:00
Adorian Doran
7cfc67cf9f style/note icon: tweak colors 2025-12-18 03:14:21 +02:00
Adorian Doran
ea2dd0293f style/note icon: tweak colors 2025-12-18 02:05:49 +02:00
Adorian Doran
76c16f3a62 style/note icon: apply the note custom color on the icon 2025-12-18 00:53:09 +02:00
Elian Doran
094f77b1af chore(toc): react to changes 2025-12-18 00:38:40 +02:00
Elian Doran
b2bcbdde3f style(attachment): top padding not matching side padding 2025-12-18 00:25:16 +02:00
Elian Doran
eceb7179b8 style(attachment): code block cuts off card 2025-12-18 00:20:48 +02:00
Elian Doran
3a46a9fbc3 chore(toc): attempt to read using CKEditor API 2025-12-18 00:16:03 +02:00
Elian Doran
2e484a11e6 feat(layout/right_pane): basic store to read content without blob 2025-12-17 23:40:25 +02:00
Elian Doran
98ed442d27 chore(layout/right_pane): empty table of contents 2025-12-17 23:19:42 +02:00
Elian Doran
dac923e45d chore(layout/right_pane): bring back resizer 2025-12-17 23:17:25 +02:00
Elian Doran
f46de50f17 refactor(layout/right_pane): CSS for container 2025-12-17 23:03:57 +02:00
Elian Doran
616af1502f feat(layout/right_pane): create empty container 2025-12-17 23:01:44 +02:00
Adorian Doran
c9fae88a86 style/note: add custom note color CSS variables on the split containers 2025-12-17 22:48:47 +02:00
Elian Doran
9872a3d522 feat(call_to_action): add more info button for new layout 2025-12-17 22:46:25 +02:00
Elian Doran
851169e061 fix(edited_notes): no message if there are no edited notes on a day 2025-12-17 22:39:24 +02:00
Elian Doran
f3b274650e docs(user): mark new layout in feature highlights 2025-12-17 22:34:01 +02:00
Elian Doran
3293ed2ce0 docs(user): document the new layout 2025-12-17 22:34:01 +02:00
Elian Doran
231ec39025 New layout refinement (#8088) 2025-12-17 18:51:38 +02:00
Jason Wasem
ecb972c71c fix(search): add null check for canvas elements in fulltext search
添加对 Canvas 笔记 elements 字段的空值检查,防止当 elements 为 null 或非数组时搜索功能报错。

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 00:42:12 +08:00
Elian Doran
c7f1e46b26 e2e(server): disable new layout and call-to-action for now 2025-12-17 18:05:39 +02:00
Elian Doran
b9c39d757b style(next): match attachment code border radius with context menu 2025-12-17 17:42:03 +02:00
Elian Doran
ea4a3b7f07 chore(client): address requested changes 2025-12-17 17:24:15 +02:00
Elian Doran
cbecc24999 feat(call_to_action): inform about the layout change 2025-12-17 16:05:55 +02:00
Elian Doran
261c1f77cf fix(layout): 2px margin in code notes 2025-12-17 15:47:11 +02:00
Elian Doran
87d99aaffa fix(layout): experimental styles not applied 2025-12-17 15:46:00 +02:00
Elian Doran
d0b0a13b6d chore(options/appearance): use translations 2025-12-17 15:44:01 +02:00
Elian Doran
1ed83b3598 Merge remote-tracking branch 'origin/main' into layout/refinement 2025-12-17 15:43:51 +02:00
Elian Doran
2759beb5d0 feat(options/appearance): improve new layout 2025-12-17 15:34:44 +02:00
Elian Doran
d623b2ffa0 feat(options/appearance): switch between layouts 2025-12-17 15:17:54 +02:00
Elian Doran
3ed613cf1d style(options/appearance): improve layout slightly 2025-12-17 12:40:36 +02:00
Elian Doran
948a6f84d6 feat(options/appearance): add basic illustration for old layout 2025-12-17 12:37:12 +02:00
Xen0r
334024b2d1 Merge branch 'main' into main 2025-12-17 10:28:53 +01:00
Elian Doran
6aa14d17d7 chore(deps): update dependency openai to v6.14.0 (#8086) 2025-12-17 11:26:29 +02:00
Elian Doran
e1da74d4d1 fix(deps): update dependency mind-elixir to v5.3.8 (#8085) 2025-12-17 11:26:15 +02:00
Elian Doran
a6012283da fix(deps): update dependency lodash-es to v4.17.22 (#8084) 2025-12-17 11:25:23 +02:00
Elian Doran
e450e0299f chore(deps): update vitest monorepo to v4.0.16 (#8083) 2025-12-17 11:25:03 +02:00
Xen0r
816f851709 Update translation.json 2025-12-17 10:22:13 +01:00
Xen0r
514ded5b8d Merge branch 'main' into main 2025-12-17 10:20:10 +01:00
Nate River
35a109616c Update apps/client/src/stylesheets/theme-light.css
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2025-12-17 11:25:41 +08:00
Nate River
641176011f Update apps/client/src/stylesheets/theme-dark.css
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2025-12-17 11:25:35 +08:00
renovate[bot]
304fd37ce2 chore(deps): update dependency openai to v6.14.0 2025-12-17 00:03:10 +00:00
renovate[bot]
51ef473964 fix(deps): update dependency mind-elixir to v5.3.8 2025-12-17 00:02:27 +00:00
Adorian Doran
96f148a870 Tweak note title and icon (#8082) 2025-12-17 02:01:58 +02:00
renovate[bot]
150bc07d28 fix(deps): update dependency lodash-es to v4.17.22 2025-12-17 00:01:46 +00:00
renovate[bot]
dcec780846 chore(deps): update vitest monorepo to v4.0.16 2025-12-17 00:01:03 +00:00
Adorian Doran
03602addc5 Merge branch 'main' into feat/tweak/note-title-and-icon-widgets 2025-12-17 01:59:07 +02:00
Adorian Doran
fc9f47a801 style/note title & icon: fix an issue pointed by gemini-code-assist 2025-12-17 01:58:20 +02:00
Adorian Doran
3b6a823556 style/note title & icon: tweak icon size 2025-12-17 01:48:35 +02:00
Adorian Doran
b8ceb10e68 style/note title & icon: update the colors for the dark color scheme 2025-12-17 01:39:14 +02:00
Adorian Doran
ddca68eafa style/note title & icon: add support for both dark and light color schemes 2025-12-17 01:33:23 +02:00
Adorian Doran
468d4a4369 style/inline title: fix (again) icon hover color 2025-12-17 01:15:35 +02:00
Adorian Doran
c31f35dbd7 style/inline title: handle empty icons when the icon selection is disabled 2025-12-17 01:11:23 +02:00
Elian Doran
b5129402be chore(deps): update dependency vite to v7.3.0 (#8071) 2025-12-17 01:05:15 +02:00
Elian Doran
f38dfb035a chore(deps): update typescript-eslint monorepo to v8.50.0 (#8073) 2025-12-17 01:04:19 +02:00
Elian Doran
c2bee1a968 chore(deps): update dependency @ckeditor/ckeditor5-dev-build-tools to v54 (#8074) 2025-12-17 01:03:46 +02:00
Adorian Doran
84f7ae9f05 style/inline title: fix icon hover color 2025-12-17 01:03:01 +02:00
Elian Doran
c4df640ea4 chore(deps): update pnpm to v10.26.0 (#8072) 2025-12-17 01:01:04 +02:00
Elian Doran
fe5e1eb066 chore(deps): update dependency openai to v6.13.0 (#8070) 2025-12-17 01:00:32 +02:00
Elian Doran
6abc5a777f fix(deps): update dependency i18next to v25.7.3 (#8069) 2025-12-17 01:00:14 +02:00
Adorian Doran
08730dd821 style/inline title: add an intro animation for the note type selector 2025-12-17 01:00:07 +02:00
Elian Doran
b08ea33eb0 chore(deps): update dependency @smithy/middleware-retry to v4.4.16 (#8068) 2025-12-17 00:59:52 +02:00
Elian Doran
f389fc3414 chore(deps): update dependency @redocly/cli to v2.12.7 (#8067) 2025-12-17 00:59:27 +02:00
Elian Doran
cb024d0455 Translations update from Hosted Weblate (#8066) 2025-12-17 00:59:02 +02:00
Adorian Doran
286d2e8e5b style/inline title: tweak the layout of the note type selector 2025-12-17 00:52:47 +02:00
Adorian Doran
5446d8a932 style/inline title: improve the note icon focus indicator 2025-12-17 00:33:33 +02:00
Adorian Doran
07dcdf3078 style/inline title: replace the hover effect of the note icon 2025-12-17 00:16:45 +02:00
Adorian Doran
143b1827e6 style/inline title: tweak appearance 2025-12-17 00:09:15 +02:00
Adorian Doran
6f494e3e38 style/inline title: use a better layout 2025-12-16 23:33:57 +02:00
Xen0r
e88623e9fa Fix translation text for database cleaning button 2025-12-16 22:00:21 +01:00
Adorian Doran
cad86d4b21 style/note title & icon: tweak appearance 2025-12-16 22:54:55 +02:00
Adorian Doran
5ffae303c4 style/forms/buttons: add a generic class for focusable buttons 2025-12-16 22:54:12 +02:00
Adorian Doran
35218aca71 style/note title & icon: add a circular background for the note icon 2025-12-16 22:34:42 +02:00
Adorian Doran
9542c9776a style/note title & icon: use CSS variables to adjust size, improve the layout on different sizes 2025-12-16 20:30:58 +02:00
Elian Doran
af02685f2f chore(options): fix misalignment in options row 2025-12-16 20:14:21 +02:00
Elian Doran
737e5b85b4 fix(badges): "temporarily editable" remaining after changing editability 2025-12-16 19:40:24 +02:00
Elian Doran
90a7217b32 feat(layout): preserve newlines in tooltips 2025-12-16 19:29:59 +02:00
Elian Doran
77b92385cb feat(layout): keyboard shortcut for promoted attributes 2025-12-16 19:21:50 +02:00
Elian Doran
22e0776049 fix(layout): toggleRibbonTabNoteMap not working in old layout 2025-12-16 19:12:42 +02:00
Elian Doran
db51198449 feat(layout): keyboard shortcut for similar notes 2025-12-16 19:01:03 +02:00
Elian Doran
998a16ab87 feat(layout): keyboard shortcut for note paths 2025-12-16 18:59:36 +02:00
Elian Doran
4f1c19f1e2 feat(layout): keyboard shortcut for note info 2025-12-16 18:57:25 +02:00
Elian Doran
1835676d09 feat(layout): keyboard shortcut for owned & inherited attributes 2025-12-16 18:54:15 +02:00
Elian Doran
2eaa4ef206 fix(note_info): fixed note types do not have icon 2025-12-16 18:43:04 +02:00
Elian Doran
a5fcee500e feat(layout): keyboard shortcut for image properties 2025-12-16 18:40:37 +02:00
Elian Doran
613764d423 feat(layout): keyboard shortcut for file properties 2025-12-16 18:39:31 +02:00
Elian Doran
0518e64576 feat(layout): keyboard shortcut for collection properties 2025-12-16 18:32:33 +02:00
Elian Doran
713900b2b3 feat(layout): focus exactly on basic properties 2025-12-16 18:29:46 +02:00
Elian Doran
c0eb34927f feat(layout): keyboard shortcut for basic properties 2025-12-16 18:23:14 +02:00
Elian Doran
ec3c9a9ae5 feat(layout): keyboard shortcut for formatting toolbar 2025-12-16 18:16:05 +02:00
noobhjy
70374b622e Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1700 of 1700 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2025-12-16 17:02:40 +01:00
green
7fcc0ae290 Translated using Weblate (Japanese)
Currently translated at 99.8% (1697 of 1700 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2025-12-16 17:02:40 +01:00
Luk On
1de4db1a08 Translated using Weblate (Polish)
Currently translated at 100.0% (1700 of 1700 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pl/
2025-12-16 17:02:40 +01:00
Hosted Weblate
74ac58d3a6 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/
2025-12-16 17:02:40 +01:00
Luk On
993f56976e Translated using Weblate (Polish)
Currently translated at 99.9% (1698 of 1699 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pl/
2025-12-16 17:02:40 +01:00
Giovi
94859f2303 Translated using Weblate (Italian)
Currently translated at 100.0% (1699 of 1699 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/it/
2025-12-16 17:02:40 +01:00
Elian Doran
db116981b8 fix(note_info): MIME type entry shown even when empty 2025-12-16 17:53:05 +02:00
Elian Doran
2e563b0a1f feat(note_info): display user-friendly note type name & icon 2025-12-16 17:53:05 +02:00
Elian Doran
7222b233f0 feat(note_info): separate note type from mime type 2025-12-16 17:53:05 +02:00
Adorian Doran
bea15c46e5 style/new layout: fix the title actions container wasting vertical space when empty 2025-12-16 17:49:17 +02:00
Elian Doran
d96157de47 New layout: Power breadcrumbs (#8077) 2025-12-16 17:43:19 +02:00
Elian Doran
120b5c678d chore(client): fix typecheck 2025-12-16 17:27:29 +02:00
Elian Doran
8c008e2e3a chore(breadcrumb): address requested changes 2025-12-16 17:17:58 +02:00
Elian Doran
7e07280eb3 feat(breadcrumb): relocate copy note path to empty area 2025-12-16 16:14:08 +02:00
Elian Doran
d28c3f0851 feat(breadcrumb): hide archived notes if needed 2025-12-16 16:08:41 +02:00
Elian Doran
0390fd3174 fix(breadcrumb): hiding archived notes doesn't update tree 2025-12-16 16:03:09 +02:00
Elian Doran
193c9d8fa6 feat(breadcrumb): option to hide archived notes 2025-12-16 16:00:23 +02:00
Elian Doran
3a4cff6529 feat(breadcrumb): allow creating notes from separator menu 2025-12-16 15:35:14 +02:00
Elian Doran
5449d033bf feat(breadcrumb): indicate archived in separator menu 2025-12-16 15:05:33 +02:00
Elian Doran
66ed88c409 fix(breadcrumb): archived not respected by last item 2025-12-16 15:03:47 +02:00
Elian Doran
94df5c9126 feat(breadcrumb): respect note color class in context menu 2025-12-16 15:02:16 +02:00
Elian Doran
181ea31c1c chore(client): improve error handling message in events 2025-12-16 14:06:12 +02:00
Elian Doran
f235839d03 feat(breadcrumb): indicate archived notes 2025-12-16 13:50:53 +02:00
Elian Doran
d97b68fcd7 feat(breadcrumb): maintain note color on hover 2025-12-16 13:44:35 +02:00
Elian Doran
79d1a509e5 feat(breadcrumb): respect note color in last item 2025-12-16 13:42:41 +02:00
Elian Doran
0af5fa9f0c feat(breadcrumb): respect note color 2025-12-16 13:40:22 +02:00
Elian Doran
2693b18ee6 refactor(breadcrumb): use new component for rendering note links 2025-12-16 13:36:50 +02:00
Elian Doran
34343ce356 fix(server): autocomplete shows empty name for hoisted note 2025-12-16 12:53:51 +02:00
Elian Doran
c9025f2304 fix(breadcrumb): not reacting to changes in note path 2025-12-16 12:43:26 +02:00
Elian Doran
ec22fd9e99 refactor(breadcrumb): use existing function to parse note path 2025-12-16 10:56:00 +02:00
Elian Doran
15f9b2cadf feat(breadcrumb): add context menu on last item 2025-12-16 10:52:03 +02:00
Elian Doran
7c85fe1c37 feat(breadcrumb): add search in subtree 2025-12-16 10:46:56 +02:00
Elian Doran
d1820a6bc3 feat(breadcrumb): color selector 2025-12-16 10:43:56 +02:00
Elian Doran
d1575a28ad feat(breadcrumb): add duplicate/archive/delete options 2025-12-16 10:34:43 +02:00
Elian Doran
d13e19cf59 feat(breadcrumb): copy note path to clipboard & recent changes in subtree options 2025-12-16 10:26:46 +02:00
Elian Doran
0b7ffdf109 chore(breadcrumb): remove keyboard shortcuts 2025-12-16 10:20:15 +02:00
Elian Doran
e91cb1a198 feat(breadcrumb): add clone to/move to options 2025-12-16 10:16:09 +02:00
Elian Doran
51fcda646d feat(breadcrumb): add hoist option 2025-12-16 10:09:10 +02:00
Elian Doran
cb8e35c4dc feat(breadcrumb): get link menu items 2025-12-16 10:03:28 +02:00
Elian Doran
9d581347f1 Revert "feat(breadcrumb): get tree menu to show"
This reverts commit 96a6ea4c7a.
2025-12-16 09:56:21 +02:00
Elian Doran
96a6ea4c7a feat(breadcrumb): get tree menu to show 2025-12-16 09:35:19 +02:00
Elian Doran
587ea42700 chore(breadcrumb): get a menu to render on note link 2025-12-16 09:27:40 +02:00
renovate[bot]
8a5c7b3551 chore(deps): update dependency @ckeditor/ckeditor5-dev-build-tools to v54 2025-12-16 01:20:12 +00:00
renovate[bot]
f1fa44feb6 chore(deps): update typescript-eslint monorepo to v8.50.0 2025-12-16 01:19:39 +00:00
renovate[bot]
569cb6bf53 chore(deps): update pnpm to v10.26.0 2025-12-16 01:19:08 +00:00
renovate[bot]
3445b594e8 chore(deps): update dependency vite to v7.3.0 2025-12-16 01:18:58 +00:00
renovate[bot]
676595dd6b chore(deps): update dependency openai to v6.13.0 2025-12-16 01:18:25 +00:00
renovate[bot]
f8c84602f4 fix(deps): update dependency i18next to v25.7.3 2025-12-16 01:17:51 +00:00
renovate[bot]
d41842bc2a chore(deps): update dependency @smithy/middleware-retry to v4.4.16 2025-12-16 01:17:16 +00:00
renovate[bot]
ced47e64db chore(deps): update dependency @redocly/cli to v2.12.7 2025-12-16 01:16:41 +00:00
Elian Doran
16a6344687 fix(layout/badges): not reacting to changes in share 2025-12-16 00:10:42 +02:00
Elian Doran
7bac0b25ce feat(layout/badges): interactive share badge 2025-12-16 00:07:19 +02:00
Meinzzzz
d2391f94c0 Fix offline math rendering by bundling local fonts 2025-12-15 21:32:50 +01:00
Meinzzzz
050ddb8c55 Improve css to fix tooltips 2025-12-15 20:17:58 +01:00
Elian Doran
6094f738f2 New layout refinements (#8064) 2025-12-15 17:47:03 +02:00
Elian Doran
c3a6d1bba8 feat(badge): bigger dropdown arrow 2025-12-15 17:17:01 +02:00
Elian Doran
1feeb350ce chore(client): address requested changes 2025-12-15 17:14:00 +02:00
Elian Doran
f21ba207fe feat(inline_title): improve fit on small splits 2025-12-15 16:50:26 +02:00
Elian Doran
07c8ff4571 chore(note_type_switcher): shorten last modified date 2025-12-15 16:49:09 +02:00
Elian Doran
71d8588091 feat(note_type_switcher): use arrows next to dropdowns 2025-12-15 16:47:53 +02:00
Elian Doran
3c41b7e5a9 feat(note_type_switcher): use singular form 2025-12-15 16:45:56 +02:00
Elian Doran
41b7a295b9 feat(breadcrumb): add tooltip about jumping to top 2025-12-15 16:40:36 +02:00
Elian Doran
ca8e889e1e feat(breadcrumb): respect workspace color 2025-12-15 16:37:33 +02:00
Elian Doran
6d4e52c928 feat(breadcrumb): prefer workspace icon class 2025-12-15 16:31:43 +02:00
Elian Doran
e2fac8ab05 feat(breadcrumb): distinguish between workspace and hoisted notes 2025-12-15 16:26:25 +02:00
Elian Doran
af3883fdac feat(breadcrumb): react to hosted note ID change 2025-12-15 16:20:17 +02:00
Elian Doran
83777d7ea0 feat(breadcrumb): unhoist badge 2025-12-15 16:02:31 +02:00
Elian Doran
c6854c84b9 feat(breadcrumb): use different approach for displaying workspace icon 2025-12-15 15:52:55 +02:00
Elian Doran
eb99352fff Revert "feat(breadcrumb): display workspace text"
This reverts commit 441958028d.
2025-12-15 15:29:53 +02:00
Elian Doran
7dac5d424b Translations update from Hosted Weblate (#8061) 2025-12-15 15:24:27 +02:00
Elian Doran
441958028d feat(breadcrumb): display workspace text 2025-12-15 15:10:37 +02:00
Elian Doran
80b61a35a9 feat(breadcrumb): display correct icon for first note when hoisted 2025-12-15 15:10:37 +02:00
Elian Doran
61df0f3d31 feat(breadcrumb): trim path when hoisted 2025-12-15 15:10:37 +02:00
green
23ece9fc86 Translated using Weblate (Japanese)
Currently translated at 100.0% (1695 of 1695 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2025-12-15 13:15:48 +01:00
Kuzma Simonov
220e3d7195 Translated using Weblate (Russian)
Currently translated at 95.0% (1602 of 1686 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ru/
2025-12-15 13:15:47 +01:00
Kuzma Simonov
392c0311e5 Translated using Weblate (Russian)
Currently translated at 17.1% (26 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/ru/
2025-12-15 13:15:46 +01:00
Adorian Doran
3abdcfa7a5 style/status bar/breadcrumb: tweak the last segment 2025-12-15 14:15:36 +02:00
Elian Doran
4896042fc4 fix(layout): classic toolbar not appearing after making a note temporarily editable 2025-12-15 12:45:27 +02:00
Elian Doran
7edfd5d7b4 fix(layout): classic toolbar in zen mode 2025-12-15 12:41:34 +02:00
Elian Doran
ad8e52f744 feat(layout): disable transition when promoted attributes are shown by default 2025-12-15 12:14:44 +02:00
Elian Doran
455dc5dc11 feat(layout): automatically collapse promoted attributes in full-height notes 2025-12-15 12:10:12 +02:00
Elian Doran
158f5ac310 feat(layout): use collapsible for promoted attributes 2025-12-15 12:10:12 +02:00
Elian Doran
fb70029091 fix(icon-list): border-left icon regular missing 2025-12-15 12:10:12 +02:00
Elian Doran
b370512893 fix(status_bar): unable to dismiss panes 2025-12-15 12:10:12 +02:00
Elian Doran
764607314c feat(tree): change icon for note paths 2025-12-15 12:10:12 +02:00
Adorian Doran
dbcf9b01c5 style/status bar/note paths flyout: document 2025-12-15 12:06:32 +02:00
Adorian Doran
93ce77438f style/status bar/note paths flyout: tweak the current path arrow 2025-12-15 12:04:39 +02:00
Adorian Doran
14c30661e6 Restyle the backlinks flyout (#8063) 2025-12-15 12:01:48 +02:00
Adorian Doran
37efc44f43 Merge branch 'main' into feat/restyle/backlinks-panel 2025-12-15 11:54:03 +02:00
Adorian Doran
6aaade846a style/status bar/backlinks flyout: restyle 2025-12-15 11:52:04 +02:00
Elian Doran
bd2402396b New layout: Remove floating buttons (#8059) 2025-12-15 11:11:18 +02:00
Elian Doran
a9b3479216 fix(mermaid): preview not 100% height on vertical layout 2025-12-15 10:54:39 +02:00
Adorian Doran
05e98877b0 style/status bar/backlinks flyout: rename HTML tag 2025-12-15 10:52:14 +02:00
Elian Doran
862ddf3a71 fix(mermaid): 1px border visible in read-only mode 2025-12-15 10:51:54 +02:00
Elian Doran
c1df2c45de fix(context_menu): regression on mobile sub-menu 2025-12-15 10:47:28 +02:00
Elian Doran
065e97c940 chore(layout/note_actions): address requested changes 2025-12-15 10:41:58 +02:00
Elian Doran
adae7fa03b feat(layout/note_actions): integrate in-app help button 2025-12-15 10:24:24 +02:00
Elian Doran
b725dbea7e feat(layout/note_actions): export as image 2025-12-15 10:06:01 +02:00
Elian Doran
4b80eec000 feat(layout/note_actions): integrate geo map add button 2025-12-15 09:14:19 +02:00
Elian Doran
d7722a1e05 feat(layout/note_actions): integrate add child for relation map 2025-12-15 09:07:45 +02:00
Elian Doran
35cfcc59f6 feat(layout/note_actions): integrate zoom buttons into relation map 2025-12-15 09:04:31 +02:00
Elian Doran
192190d685 fix(layout/note_actions): save to note not disappearing after save 2025-12-15 08:46:27 +02:00
Elian Doran
d6cc4bfa9c fix(layout/note_actions): buttons not reacting to mime type changes 2025-12-15 08:34:40 +02:00
Elian Doran
ed284fbc5f feat(layout/note_actions): integrate open API docs 2025-12-15 08:33:15 +02:00
Elian Doran
cb0efe25f5 feat(layout/note_actions): integrate save to note button 2025-12-15 08:24:59 +02:00
Elian Doran
906fe4f8da feat(layout/note_actions): integrate execute script button 2025-12-15 08:19:40 +02:00
Elian Doran
04a641199b feat(layout/note_actions): prevent layout shift by disabling button 2025-12-15 08:17:01 +02:00
Elian Doran
50cbad22d0 feat(layout/note_actions): integrate toggle read-only button 2025-12-15 08:15:00 +02:00
Elian Doran
4cfe59271f feat(layout/note_actions): integrate switch split orientation 2025-12-15 08:12:39 +02:00
Elian Doran
ba7969dad4 style(backend-log): remove extra padding & decrease font size 2025-12-15 08:08:45 +02:00
Elian Doran
43b6440bf9 style: borderless and paddingless code editor 2025-12-15 08:05:18 +02:00
Elian Doran
3e19a163c2 feat(layout/note_actions): integrate refresh backend log 2025-12-15 08:00:03 +02:00
Elian Doran
ca39282269 fix(global_menu): alignment of advanced button 2025-12-15 07:53:34 +02:00
Elian Doran
016389df68 fix(context_menu): clicking on a submenu dismisses it 2025-12-15 07:51:53 +02:00
Elian Doran
17db2a6b38 Revert "fix(context_menu): clicking submenu dismisses the menu"
This reverts commit 34bc444b18.
2025-12-15 07:46:36 +02:00
Elian Doran
bc8f17ee5c New layout refinement (#8053) 2025-12-15 07:36:58 +02:00
Elian Doran
0c8944ab8e chore(layout): address requested changes 2025-12-15 07:27:55 +02:00
Elian Doran
0960b585bd fix(layout): note actions button duplicated in old layout 2025-12-15 07:25:49 +02:00
Chris Cavalluzzi
55649c3750 fix(docs): mismatching phrasing in reference link notes 2025-12-14 21:17:59 -07:00
Chris Cavalluzzi
51bbf71577 feat(docs): improve link docs organization 2025-12-14 19:30:21 -07:00
Adorian Doran
728fab1dda Tweak note info (#8056) 2025-12-15 02:24:41 +02:00
Adorian Doran
d5ec80d85d client/status bar/note info: fix an issue pointed by gemini-code-assist 2025-12-15 02:23:57 +02:00
Adorian Doran
15ef93d7e6 style/status bar/note info: tweak appearance 2025-12-15 02:07:14 +02:00
Adorian Doran
9711b22ea9 style/status bar/note info: replace the "calculate" button with a link 2025-12-15 01:55:43 +02:00
Adorian Doran
b9c7d2b01d Tweak note paths (#8055) 2025-12-15 01:48:03 +02:00
Adorian Doran
9834846a23 client/status bar/note paths: fix the issues pointed by gemini-code-assist 2025-12-15 01:43:36 +02:00
Adorian Doran
65f425df2c style/status bar/note paths: fix an issue pointed by gemini-code-assist 2025-12-15 01:37:36 +02:00
Adorian Doran
a551dfe4d6 style/status bar/note paths: fix the final path segment color when icons are displayed 2025-12-15 01:18:35 +02:00
Adorian Doran
e9bfacdb7c style/status bar/note paths: highlight the current path 2025-12-15 01:12:51 +02:00
Adorian Doran
3ba7b7d439 style/status bar/note paths: refactor 2025-12-15 00:49:25 +02:00
Adorian Doran
381943818d client/status bar/note paths: improve appearance 2025-12-15 00:37:23 +02:00
Adorian Doran
d1ae2db587 client/status bar/note paths: replace the "Clone note to new location" button with a link 2025-12-15 00:31:36 +02:00
Elian Doran
8fa6e38382 refactor(ribbon): decouple completely from new layout 2025-12-14 23:50:40 +02:00
Elian Doran
749074ea94 chore(layout/status_bar): enforce single pane opened at a time 2025-12-14 23:35:16 +02:00
Elian Doran
f1bb786a49 chore(layout): support for similar notes in the status bar 2025-12-14 23:29:01 +02:00
Elian Doran
42bde3873b fix(layout): extra spacing between badges when no custom actions are available 2025-12-14 23:02:24 +02:00
Meinzzzz
bc23e0984a Undo unnecessary formatting changes 2025-12-14 22:00:56 +01:00
Elian Doran
4877238015 refactor(layout): integrate copy image reference to button to all supported note types 2025-12-14 22:56:39 +02:00
Elian Doran
16374aaf1d refactor(layout): use note.isContentAvailable() 2025-12-14 22:51:50 +02:00
Elian Doran
19709f749a feat(layout): integrate copy reference to clipboard button 2025-12-14 22:50:26 +02:00
Elian Doran
09c7affc16 feat(layout): integrate file-similar options to image 2025-12-14 22:45:23 +02:00
Elian Doran
01e197fd46 feat(layout): integrate original file name into status bar 2025-12-14 22:34:13 +02:00
Elian Doran
0fe129ac16 feat(layout): add a margin for custom note action buttons 2025-12-14 22:22:41 +02:00
Elian Doran
3c52ceb4e6 refactor(layout): extract file actions to separate file 2025-12-14 22:16:54 +02:00
Elian Doran
8ba2357d91 feat(layout/file): upload new revision button 2025-12-14 22:14:05 +02:00
Elian Doran
20f4990d48 feat(layout/file): open externally & download buttons 2025-12-14 22:07:25 +02:00
Elian Doran
8c793bf0fe fix(layout): title area gets wrong note context 2025-12-14 21:58:10 +02:00
Elian Doran
12a0eebafe refactor(layout): handle note actions differently 2025-12-14 21:57:16 +02:00
Elian Doran
092c7dff6b fix(layout): extra padding when no note title actions 2025-12-14 21:38:02 +02:00
Elian Doran
7a1ff42d67 feat(layout/search_properties): expand search properties 2025-12-14 21:29:10 +02:00
Meinzzzz
07de353207 Adding comments and improving code quality in math input views 2025-12-14 20:21:42 +01:00
Elian Doran
5a09a80902 feat(layout): basic ARIA & some padding 2025-12-14 21:20:55 +02:00
Elian Doran
a7ca839afb feat(layout/search_definition): integrate view options directly in search parameters 2025-12-14 20:48:50 +02:00
Elian Doran
6b9b9a96c3 feat(layout): integrate search parameters ribbon tab 2025-12-14 20:34:55 +02:00
Elian Doran
272888acab refactor(ribbon): format SearchDefinitionTab 2025-12-14 20:27:34 +02:00
Elian Doran
283e3c9de1 style(layout/edited_notes): increase vertical padding slighly 2025-12-14 20:23:08 +02:00
Elian Doran
859087b850 feat(layout/edited_notes): respect choice to auto-open 2025-12-14 20:21:30 +02:00
Elian Doran
f7b911dc0b feat(layout): make edited notes collapsible 2025-12-14 20:15:17 +02:00
Elian Doran
9d7e2855d3 feat(layout): edited notes underneath title details 2025-12-14 19:39:55 +02:00
Elian Doran
8e6ea87754 fix(context_menu): regressions on mobile 2025-12-14 12:02:40 +02:00
Elian Doran
34bc444b18 fix(context_menu): clicking submenu dismisses the menu 2025-12-14 12:02:32 +02:00
Elian Doran
860a903336 feat(breadcrumb): hide note paths if only one 2025-12-14 11:49:16 +02:00
Elian Doran
be923ad2b7 chore(breadcrumb): add text span for hiding them at some point 2025-12-14 11:47:18 +02:00
Elian Doran
d2da1ed1e7 feat(breadcrumb): make tooltips shorter 2025-12-14 11:26:09 +02:00
Elian Doran
1c05f5e5c3 feat(breadcrumb): disable tooltip animation for faster input 2025-12-14 11:21:27 +02:00
Elian Doran
e043f30cc6 feat(breadcrumb): add text for all items 2025-12-14 11:20:24 +02:00
Elian Doran
e1611d83a3 fix(breadcrumb): tree displayed in root navigation 2025-12-14 11:12:14 +02:00
Elian Doran
58e2111a8f chore(nix): update flake lock 2025-12-14 11:01:25 +02:00
Elian Doran
c5e4c484dc chore(deps): update react monorepo to v19.2.3 (#8033) 2025-12-14 10:58:02 +02:00
Elian Doran
75a6dece7a Translations update from Hosted Weblate (#8052) 2025-12-14 10:57:37 +02:00
Hosted Weblate
5c0e7736d6 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/
2025-12-14 09:52:47 +01:00
Elian Doran
2562ecd055 feat(renovate): enable nix 2025-12-14 10:52:29 +02:00
Elian Doran
aaaa47b575 Translations update from Hosted Weblate (#8049) 2025-12-14 10:33:29 +02:00
green
21d82ec1d7 Translated using Weblate (Japanese)
Currently translated at 100.0% (1686 of 1686 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2025-12-14 09:21:46 +01:00
Luk On
5af8444cac 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/
2025-12-14 09:21:46 +01:00
Wojciech O
cd82c34b93 Translated using Weblate (Polish)
Currently translated at 100.0% (389 of 389 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/pl/
2025-12-14 09:21:45 +01:00
noobhjy
d182659d62 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1686 of 1686 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2025-12-14 09:21:44 +01:00
Mik Piet
171f428b9d Translated using Weblate (Polish)
Currently translated at 100.0% (1686 of 1686 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pl/
2025-12-14 09:21:43 +01:00
kamykO
da4ca9c804 Translated using Weblate (Polish)
Currently translated at 100.0% (1686 of 1686 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pl/
2025-12-14 09:21:43 +01:00
Luk On
c019341503 Translated using Weblate (Polish)
Currently translated at 100.0% (1686 of 1686 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pl/
2025-12-14 09:21:42 +01:00
Hosted Weblate
7234f04b56 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/
2025-12-14 09:21:42 +01:00
Elian Doran
1998cbc005 chore(deps): update dependency @types/node to v24.10.4 (#8050) 2025-12-14 10:21:26 +02:00
renovate[bot]
5914073c3f chore(deps): update dependency @types/node to v24.10.4 2025-12-14 02:09:59 +00:00
Elian Doran
d5aadf2604 chore: add dev shell and direnv support (#8011) 2025-12-13 22:49:35 +02:00
renovate[bot]
1fe22f940b chore(deps): update react monorepo to v19.2.3 2025-12-13 20:46:52 +00:00
Elian Doran
0cdaf70efe chore(deps): update dependency electron to v39.2.7 (#8030) 2025-12-13 22:46:30 +02:00
Elian Doran
8174c65243 chore(deps): update dependency eslint to v9.39.2 (#8031) 2025-12-13 22:45:31 +02:00
Elian Doran
2645801277 chore(deps): update dependency vite to v7.2.7 (#8032) 2025-12-13 22:44:45 +02:00
Elian Doran
fb8c31cb9c fix(deps): update dependency i18next to v25.7.2 (#8035) 2025-12-13 22:44:05 +02:00
Elian Doran
7287dbd64f fix(deps): update dependency preact-render-to-string to v6.6.4 (#8036) 2025-12-13 22:43:19 +02:00
renovate[bot]
6569d64931 fix(deps): update dependency preact-render-to-string to v6.6.4 2025-12-13 19:24:56 +00:00
renovate[bot]
e9f3216926 fix(deps): update dependency i18next to v25.7.2 2025-12-13 19:24:28 +00:00
renovate[bot]
ca0af9646d chore(deps): update dependency vite to v7.2.7 2025-12-13 19:23:33 +00:00
renovate[bot]
92dfafd1ff chore(deps): update dependency eslint to v9.39.2 2025-12-13 19:23:05 +00:00
renovate[bot]
d04dde3b97 chore(deps): update dependency electron to v39.2.7 2025-12-13 19:22:36 +00:00
Elian Doran
4c520c6df3 e2e(server): broken test after submenu 2025-12-13 21:10:59 +02:00
Adorian Doran
65d6ed1cdc Merge branch 'main' of https://github.com/TriliumNext/Trilium 2025-12-13 20:42:24 +02:00
Adorian Doran
3352a92445 style/new layout/inline title: tweak 2025-12-13 20:42:16 +02:00
Elian Doran
bc8c55b8fb Translations update from Hosted Weblate (#8047) 2025-12-13 20:37:28 +02:00
Elian Doran
7660914eb8 Merge branch 'main' into weblate-trilium-client 2025-12-13 20:34:04 +02:00
Elian Doran
869aec778c New layout: Shared formatting toolbar (#8046) 2025-12-13 20:15:43 +02:00
noobhjy
255726dcc4 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1685 of 1685 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2025-12-13 18:09:10 +00:00
Adorian Doran
9969000807 style/new layout/note title: tweak 2025-12-13 20:08:57 +02:00
Elian Doran
3b909fd739 chore(layout/formatting_toolbar): address requested changes 2025-12-13 19:59:45 +02:00
Elian Doran
ad08fb8132 chore(formatting_toolbar): address self-review 2025-12-13 19:32:44 +02:00
Elian Doran
8d536a6040 fix(formatting_toolbar): view mode check not working in multi-split 2025-12-13 19:29:13 +02:00
Elian Doran
2b1bc8e2b9 feat(inline_title): in split, avoid layout shift by maintaining the toolbar 2025-12-13 16:54:04 +02:00
Adorian Doran
563194ff6c client/note menu: localize string 2025-12-13 16:45:09 +02:00
Elian Doran
0c9ff4dae4 chore(inline_title): fix type error 2025-12-13 16:43:27 +02:00
Elian Doran
b10e7f1811 fix(inline_title): some badges not visible in split 2025-12-13 16:42:06 +02:00
Elian Doran
f93ad499e2 feat(layout/formatting_toolbar): move above sidebar 2025-12-13 16:35:48 +02:00
Adorian Doran
87a51251ca client/layout/status bar: replace some icons 2025-12-13 16:33:33 +02:00
Elian Doran
b56e5b2483 fix(inline_title): note type switcher visible for options 2025-12-13 16:33:33 +02:00
Elian Doran
476c162016 fix(layout/formatting_toolbar): memory leak for closed tabs 2025-12-13 16:31:19 +02:00
Elian Doran
4182f6043a feat(layout/formatting_toolbar): render cached components 2025-12-13 16:26:01 +02:00
Elian Doran
aa528c65b7 chore(layout/formatting_toolbar): render without adapter 2025-12-13 16:05:11 +02:00
Elian Doran
4998560e31 chore(layout/inline_title): show note type switcher for code notes as well 2025-12-13 15:55:56 +02:00
Elian Doran
86f36922c4 Translations update from Hosted Weblate (#8025) 2025-12-13 15:42:54 +02:00
Hosted Weblate
4f617b86d3 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/
2025-12-13 13:34:47 +00:00
noobhjy
b28527e10d Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1683 of 1683 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2025-12-13 13:34:46 +00:00
green
fbb8924ebf Translated using Weblate (Japanese)
Currently translated at 100.0% (1683 of 1683 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2025-12-13 13:34:45 +00:00
Hosted Weblate
f68c9b751f 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/
2025-12-13 13:34:45 +00:00
Luk On
8091f02b16 Translated using Weblate (Polish)
Currently translated at 100.0% (1677 of 1677 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pl/
2025-12-13 13:34:44 +00:00
noobhjy
f4c68d115b Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1677 of 1677 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2025-12-13 13:34:43 +00:00
Luk On
6c70d6b9ae Translated using Weblate (Polish)
Currently translated at 100.0% (152 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/pl/
2025-12-13 13:34:43 +00:00
Luk On
1ea12567a3 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/
2025-12-13 13:34:42 +00:00
Luk On
2d16ab7a70 Translated using Weblate (Polish)
Currently translated at 100.0% (389 of 389 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/pl/
2025-12-13 13:34:41 +00:00
Luk On
a228ba5273 Translated using Weblate (Polish)
Currently translated at 100.0% (1677 of 1677 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/pl/
2025-12-13 13:34:41 +00:00
Luk On
d0477e9ebf Translated using Weblate (Polish)
Currently translated at 100.0% (152 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/pl/
2025-12-13 13:34:40 +00:00
Luk On
c99907972d Translated using Weblate (Polish)
Currently translated at 11.2% (13 of 116 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/pl/
2025-12-13 13:34:39 +00:00
Luk On
b9ebc7d7ea Translated using Weblate (Polish)
Currently translated at 100.0% (389 of 389 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/pl/
2025-12-13 13:34:39 +00:00
green
4f9e2c5eca Translated using Weblate (Japanese)
Currently translated at 100.0% (389 of 389 strings)

Translation: Trilium Notes/Server
Translate-URL: https://hosted.weblate.org/projects/trilium/server/ja/
2025-12-13 13:34:38 +00:00
green
ab1f8ee5ae Translated using Weblate (Japanese)
Currently translated at 100.0% (152 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/ja/
2025-12-13 13:34:37 +00:00
green
89276ad51a Translated using Weblate (Japanese)
Currently translated at 100.0% (1677 of 1677 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2025-12-13 13:34:36 +00:00
green
eca533a517 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/
2025-12-13 13:34:36 +00:00
Elian Doran
0be578c517 chore(deps): update dependency @electron/rebuild to v4.0.2 (#8028) 2025-12-13 15:34:09 +02:00
Elian Doran
198b315602 chore(deps): update dependency @redocly/cli to v2.12.6 (#8029) 2025-12-13 15:33:28 +02:00
Elian Doran
6474abc983 fix(deps): update dependency eslint-linter-browserify to v9.39.2 (#8034) 2025-12-13 15:32:33 +02:00
Elian Doran
2137dbe849 chore(deps): update node.js to v24.12.0 (#8037) 2025-12-13 15:32:07 +02:00
Elian Doran
b7b46703d9 chore(deps): update pnpm to v10.25.0 (#8038) 2025-12-13 15:31:13 +02:00
Elian Doran
d2d96a1421 chore(deps): update typescript-eslint monorepo to v8.49.0 (#8039) 2025-12-13 15:30:26 +02:00
Elian Doran
cfcc309e5a fix(deps): update dependency @codemirror/view to v6.39.4 (#8040) 2025-12-13 15:28:35 +02:00
Elian Doran
7d87ec942e fix(deps): update dependency react-i18next to v16.5.0 (#8041) 2025-12-13 15:26:40 +02:00
Elian Doran
4def13272f chore(deps): update github artifact actions (major) (#8042) 2025-12-13 15:25:59 +02:00
Elian Doran
c4f914bb7b New layout: Title bar & inline title (#8044) 2025-12-13 15:09:30 +02:00
Elian Doran
6bf213a0b0 fix(layout/status_bar): some popups not dismissing 2025-12-13 15:02:16 +02:00
Elian Doran
694cd2bc7c chore(layout/title_bar): address LLM review 2025-12-13 14:58:11 +02:00
Elian Doran
3851a94400 fix(layout/title_bar): badges not collapsing 2025-12-13 14:51:58 +02:00
Elian Doran
e296416a54 fix(layout/inline-title): title not shown when switching to other types of notes 2025-12-13 14:38:58 +02:00
Elian Doran
0bd89a659c chore(layout/inline-title): disable pointer events while hidden 2025-12-13 14:00:27 +02:00
Elian Doran
0ada6523a8 feat(layout/inline-title): add transition 2025-12-13 13:58:20 +02:00
Elian Doran
56570d7ba1 fix(layout/inline-title): text displayed even when note is not empty 2025-12-13 13:46:28 +02:00
Elian Doran
0ffdedcfa6 feat(layout/inline-title): dropdown for collections 2025-12-13 13:45:34 +02:00
Elian Doran
f391bb8eec feat(layout/inline-title): support built-in templates 2025-12-13 13:35:32 +02:00
Elian Doran
7000076961 feat(layout/inline-title): react to template add/remove 2025-12-13 13:26:48 +02:00
Elian Doran
e0f6ba808c feat(layout/inline-title): template switcher 2025-12-13 13:24:32 +02:00
Elian Doran
4c2fe8a846 feat(layout/inline-title): group some note types 2025-12-13 13:12:03 +02:00
Elian Doran
2ea23368bc feat(vscode): eslint on save 2025-12-13 12:59:32 +02:00
Elian Doran
87666005a6 feat(layout/inline-title): add an intro text 2025-12-13 12:57:33 +02:00
Elian Doran
7666f44b7a fix(layout/inline-title): hide note type switcher on other note types 2025-12-13 12:49:51 +02:00
Elian Doran
470f6e5334 feat(layout/inline-title): hide note type switcher when empty 2025-12-13 12:48:20 +02:00
Elian Doran
a2b007874b feat(layout/inline-title): not reacting to note type changes 2025-12-13 12:43:15 +02:00
Elian Doran
9946d8c6b9 fix(layout/statusbar): code note switcher displayed for other note types 2025-12-13 12:29:59 +02:00
Elian Doran
02fab16475 feat(layout/inline-title): add icons 2025-12-13 12:28:22 +02:00
Elian Doran
5145ce2d23 feat(layout/inline-title): horizontal scroll via wheel 2025-12-13 12:27:45 +02:00
Elian Doran
e06abe6e5b fix(layout/inline-title): current note type displayed in switcher 2025-12-13 12:26:02 +02:00
Elian Doran
50a847777e feat(layout/inline-title): basic note type switcher 2025-12-13 12:25:01 +02:00
Elian Doran
4473f80d73 refactor(layout): remove floating title bar experiment 2025-12-13 12:02:17 +02:00
Elian Doran
70c918c9c6 feat(layout/inline-title): support in options as well 2025-12-13 12:01:06 +02:00
Elian Doran
0939975631 style(layout/inline-title): use muted text color 2025-12-13 11:58:35 +02:00
Elian Doran
0ef90c6165 fix(layout/inline-title): hide in attachments and other view scopes 2025-12-13 11:57:53 +02:00
Elian Doran
cef14a3b19 feat(layout/inline-title): support code 2025-12-13 11:51:57 +02:00
Elian Doran
61d3141bce refactor(layout/inline-title): extract specific styles 2025-12-13 11:49:05 +02:00
Elian Doran
f040a0b6d1 refactor(layout/inline-title): separate old title details into title actions 2025-12-13 11:46:42 +02:00
Elian Doran
e9dfec88c9 feat(layout/inline-title): bring back creation and modification date 2025-12-13 11:43:27 +02:00
Elian Doran
6fa97c845a fix(layout/inline-title): still visible in other note types 2025-12-13 11:37:56 +02:00
Elian Doran
f686d9ecd0 feat(layout/inline-title): keep header bar visible 2025-12-13 11:34:29 +02:00
Elian Doran
621ebe4396 feat(layout/inline-title): title and icon 2025-12-13 11:33:02 +02:00
Adorian Doran
ac2a566685 client/note menu: reorganize menu items 2025-12-13 11:29:39 +02:00
Elian Doran
ac3d57d5da chore(layout): remove ribbon border 2025-12-13 11:28:52 +02:00
Elian Doran
9ab5eef984 feat(layout/inline-title): intersection observer 2025-12-13 11:26:42 +02:00
Elian Doran
912f90accf feat(layout/inline-title): collapse title for text notes 2025-12-13 11:17:39 +02:00
Elian Doran
6463b0dcaa chore(layout/inline-title): placeholder for the title 2025-12-13 11:08:34 +02:00
Elian Doran
0b45fb6764 feat(layout/title): hide note badges while editing title 2025-12-13 10:57:34 +02:00
Elian Doran
330d71847b refactor(layout/title): rename to note badges 2025-12-13 10:54:19 +02:00
Elian Doran
60c8f0c78b refactor(layout/title): relocate badges to layouts dir 2025-12-13 10:47:46 +02:00
Elian Doran
fcbd1ab0b1 chore(layout/title): remove spacer 2025-12-13 10:44:33 +02:00
Elian Doran
3549bfb328 feat(layout/title): collapse badges and note title while constrained in size 2025-12-13 10:43:32 +02:00
Elian Doran
c97038fffd chore(layout): revert breadcrumb row 2025-12-13 10:26:25 +02:00
Elian Doran
15b5885982 New layout: status bar (#8021) 2025-12-13 10:23:12 +02:00
renovate[bot]
6aa8d9fbf9 chore(deps): update github artifact actions 2025-12-13 01:19:13 +00:00
renovate[bot]
eccf4620ac fix(deps): update dependency react-i18next to v16.5.0 2025-12-13 01:19:08 +00:00
renovate[bot]
f08fbe9bb2 fix(deps): update dependency @codemirror/view to v6.39.4 2025-12-13 01:18:39 +00:00
renovate[bot]
bfa87af489 chore(deps): update typescript-eslint monorepo to v8.49.0 2025-12-13 01:18:08 +00:00
renovate[bot]
a7899b7505 chore(deps): update pnpm to v10.25.0 2025-12-13 01:17:37 +00:00
renovate[bot]
e80b5cddcd chore(deps): update node.js to v24.12.0 2025-12-13 01:17:27 +00:00
renovate[bot]
db12f9b8dc fix(deps): update dependency eslint-linter-browserify to v9.39.2 2025-12-13 01:15:42 +00:00
renovate[bot]
f4c95195c9 chore(deps): update dependency @redocly/cli to v2.12.6 2025-12-13 01:12:39 +00:00
renovate[bot]
e2cbff7b3a chore(deps): update dependency @electron/rebuild to v4.0.2 2025-12-13 01:11:53 +00:00
Elian Doran
98a3c8150c feat(breadcrumb): replace title editing with jump to top 2025-12-13 01:45:02 +02:00
Elian Doran
447e09fec1 feat(note_actions): hide code notes from new layout 2025-12-13 01:24:37 +02:00
Elian Doran
7d2a1bb2e5 feat(status_bar): modal for configuring list of code languages 2025-12-13 01:19:20 +02:00
Elian Doran
40fcf79778 fix(status_bar): code mime not updating between notes 2025-12-13 01:14:50 +02:00
Elian Doran
88a779bbdb feat(status_bar): indicate selected code mime in menu 2025-12-13 01:10:38 +02:00
Elian Doran
db04514769 fix(status_bar): code mime switcher is clipped 2025-12-13 01:07:30 +02:00
Elian Doran
23062470f5 feat(status_bar): code mime switcher 2025-12-13 01:03:57 +02:00
Elian Doran
5bad043ed5 chore(status_bar): address requested changes 2025-12-13 00:43:00 +02:00
Elian Doran
4ab8af0995 feat(status_bar): keep button active when dropdown is shown 2025-12-13 00:37:29 +02:00
Elian Doran
1a65c5e13e feat(status_bar): hide note paths in hidden notes 2025-12-13 00:30:22 +02:00
Elian Doran
fc08946038 chore(status_bar): avoid shifting due to language switcher 2025-12-13 00:27:51 +02:00
Elian Doran
4d6dba06ad refactor(ribbon): remove left-over logic for calculating ribbon height 2025-12-13 00:24:05 +02:00
Elian Doran
d7887fe25f chore(layout): hide ribbon in new layout 2025-12-13 00:22:34 +02:00
Elian Doran
81dd50e752 fix(status_bar): wrong font size for language selector text 2025-12-13 00:13:06 +02:00
Elian Doran
fe13065ef8 lint: status bar 2025-12-13 00:11:28 +02:00
Meinzzzz
c02491d2e6 Remove unnecessary any casts in math plugin 2025-12-12 23:09:20 +01:00
Elian Doran
eb02330fdf feat(status_bar): integrate note paths widget 2025-12-13 00:05:33 +02:00
Elian Doran
738fa6fd0e lint: note paths 2025-12-12 23:51:03 +02:00
Elian Doran
0c1c7e4f8e feat(status_bar): note paths (no interaction yet) 2025-12-12 23:47:31 +02:00
Elian Doran
9eb9b66398 fix(status_bar): keyboard shortcuts to add attributes not working 2025-12-12 23:34:26 +02:00
Elian Doran
9db046b401 fix(status_bar): attributes not editable from modal 2025-12-12 23:29:59 +02:00
Elian Doran
914272eee0 style(status_bar): improve layout and spacing slightly 2025-12-12 23:13:31 +02:00
Elian Doran
2b7e203bcc refactor(status_bar): remove wrapper container for breadcrumb 2025-12-12 23:07:57 +02:00
Elian Doran
a61ddedc0b refactor(status_bar): remove old breadcrumb styles 2025-12-12 23:06:47 +02:00
Meinzzzz
a6ede8f905 Improve mathinputview 2025-12-12 21:33:59 +01:00
Elian Doran
60fc34ffac feat(status_bar): functional attribute toggle button 2025-12-12 21:57:42 +02:00
Elian Doran
685109556c chore(ribbon): hide inherited & owned attributes on new layout 2025-12-12 21:49:42 +02:00
Elian Doran
45927053f3 fix(ribbon): links in inherited attributes not visible 2025-12-12 21:48:11 +02:00
Elian Doran
5d438a877b feat(status_bar): improve alignment of attribute editor 2025-12-12 21:44:27 +02:00
Elian Doran
870499bc3a feat(status_bar): basic integration of inherited attributes 2025-12-12 21:41:05 +02:00
Elian Doran
c6d97e3d4b feat(status_bar): basic integration of attribute editor 2025-12-12 21:30:32 +02:00
Elian Doran
efff38b116 feat(status_bar): attribute button (not yet interactive) 2025-12-12 21:19:23 +02:00
Elian Doran
1b725175c6 refactor(status_bar): solve warnings 2025-12-12 20:59:57 +02:00
Elian Doran
6eff62f73f feat(status_bar): add new attachment count 2025-12-12 20:55:54 +02:00
Meinzzzz
22941a9ce0 Fix sync issues 2025-12-12 19:48:09 +01:00
Elian Doran
95d2160c76 feat(status_bar): integrate backlinks 2025-12-12 20:31:19 +02:00
Elian Doran
2b195155ed fix(note_details): appearing in options 2025-12-12 20:21:55 +02:00
Elian Doran
28e9abc8bb chore(status_bar): re-order icons to avoid layout shifting 2025-12-12 20:19:37 +02:00
Elian Doran
0162b9d441 fix(status_bar): language selector appearing for non-text notes 2025-12-12 20:18:50 +02:00
Elian Doran
0545b929e1 fix(status_bar): react to active note context 2025-12-12 20:17:53 +02:00
Elian Doran
d2b32ff5af feat(status_bar): relocate to outside split area 2025-12-12 19:47:47 +02:00
Elian Doran
2d3776cd5f feat(status_bar): integrate note info badge 2025-12-12 19:31:00 +02:00
Elian Doran
2638963171 feat(status_bar/language): add tooltip 2025-12-12 18:58:54 +02:00
Elian Doran
24ed97f65d feat(status_bar/language): improve display of more languages 2025-12-12 18:53:54 +02:00
Elian Doran
c099634e39 feat(status_bar/language): improve display of Asian languages 2025-12-12 18:50:48 +02:00
Elian Doran
12be14e6cf feat(status_bar/language): display icon 2025-12-12 18:47:34 +02:00
Elian Doran
4dc773c1a3 refactor(status_bar/language): stop reusing UI for greater customisibility 2025-12-12 18:29:40 +02:00
Elian Doran
31c5323fd9 feat(status_bar/language): compact locale name 2025-12-12 18:05:10 +02:00
Elian Doran
74b6e7bf63 fix(breadcrumb): some dropdowns not visible 2025-12-12 17:55:22 +02:00
Elian Doran
34025fa646 fix(global_menu): dev menu wrongly positioned on horizontal layout 2025-12-12 14:41:10 +02:00
Elian Doran
df9554194a feat(layout/status_bar): integrate language selector basically 2025-12-12 00:34:47 +02:00
Elian Doran
4e1188484d refactor(layout/status_bar): move breadcrumbs into layout dir 2025-12-12 00:24:30 +02:00
Elian Doran
2f44b9dc59 feat(layout/status_bar): integrate breadcrumbs 2025-12-12 00:21:40 +02:00
Elian Doran
9ee3c48485 chore(layout): relocate ribbon on the top temporarily 2025-12-12 00:15:58 +02:00
Elian Doran
78b9c94829 chore(layout/status_bar): create empty component 2025-12-12 00:13:38 +02:00
Meinzzzz
633a09d414 Fix sync bug 2025-12-11 23:06:13 +01:00
Elian Doran
4c8225ed73 Translations update from Hosted Weblate (#8020) 2025-12-11 23:58:41 +02:00
noobhjy
88aad6d351 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1668 of 1668 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2025-12-11 20:38:41 +00:00
Elian Doran
d99d701095 feat(global_menu): add support for all experimental options 2025-12-11 22:38:22 +02:00
Elian Doran
61fe27abbe feat(layout): extract floating titlebar into its own experimental feature 2025-12-11 22:29:22 +02:00
Elian Doran
24cd5006d5 chore(note_map): open in reusable split 2025-12-11 22:14:08 +02:00
Elian Doran
726d6aad65 feat(layout): integrate note map 2025-12-11 22:01:22 +02:00
Elian Doran
bd9fe14a6c chore(layout): remove title extra spacing for now 2025-12-11 21:08:36 +02:00
Elian Doran
792a10ace5 New layout: Integrate small ribbon categories + collection properties (#8018) 2025-12-11 20:59:31 +02:00
Elian Doran
e9ac69b8e5 chore(note_bars/collection): address change request 2025-12-11 20:33:52 +02:00
Elian Doran
c76ff2d371 feat(note_bars/collection): add a help button 2025-12-11 20:19:06 +02:00
Elian Doran
8ab9e30404 chore(note_bars/collection): disable ribbon tab 2025-12-11 20:13:04 +02:00
Elian Doran
53b7d93efb feat(note_bars/collection): support comboboxes 2025-12-11 20:09:25 +02:00
Elian Doran
00df3c3d1f feat(note_bars/collection): support number fields 2025-12-11 19:51:40 +02:00
Elian Doran
e766b82418 feat(note_bars/collection): add icon to checkboxes 2025-12-11 19:44:22 +02:00
Elian Doran
9f4757af5b chore(note_bars/collection): put archived notes at the end 2025-12-11 19:39:07 +02:00
Elian Doran
1a9fb34a6e feat(note_bars/collection): support dropdown menu click action 2025-12-11 19:37:04 +02:00
Elian Doran
a1513a3567 feat(note_bars/collection): support split button properties 2025-12-11 19:34:22 +02:00
Elian Doran
0de67b6a69 feat(note_bars/collection): support button properties 2025-12-11 19:29:27 +02:00
Elian Doran
fec5ee9335 feat(note_bars/collection): integrate show archived notes 2025-12-11 19:21:51 +02:00
Elian Doran
b540111fa4 feat(note_bars): add icons to view type switcher 2025-12-11 18:59:28 +02:00
Elian Doran
0eed72b888 feat(note_bars): view type switcher 2025-12-11 18:53:48 +02:00
Elian Doran
0856d3dbdf fix(layout): note title padding on full-height note 2025-12-11 18:02:52 +02:00
Elian Doran
a9b453c27a feat(breadcrumb_badges): integrate query/script tab 2025-12-11 17:43:00 +02:00
Elian Doran
fa8287269f feat(breadcrumb_badges): integrate note properties tab 2025-12-11 17:34:04 +02:00
Elian Doran
1eee471018 fix(breadcrumb_badges): temporarily editable showing up always in popup editor 2025-12-11 17:20:28 +02:00
Elian Doran
c3829f82ab New layout: Note info (#8015) 2025-12-11 17:18:19 +02:00
Elian Doran
a51820f5df chore(note_info): address requested changes 2025-12-11 16:57:04 +02:00
Elian Doran
68591fb511 feat(note_info): hide ribbon on new layout 2025-12-11 16:48:49 +02:00
Elian Doran
3795ce2143 feat(note_info): integrate near the note title 2025-12-11 16:47:44 +02:00
Elian Doran
3561a4f14d feat(note_info): add back tooltip for note size 2025-12-11 16:38:31 +02:00
Elian Doran
84cda001aa feat(note_info): improve layout slightly 2025-12-11 16:33:18 +02:00
Elian Doran
481127a560 docs(user): mention version for board custom attributes 2025-12-11 10:57:30 +02:00
Elian Doran
c708e7cd61 Translations update from Hosted Weblate (#8016) 2025-12-11 10:49:33 +02:00
Elian Doran
fee0268792 Translated using Weblate (Romanian)
Currently translated at 100.0% (116 of 116 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/ro/
2025-12-11 09:47:52 +01:00
green
953593c9d4 Translated using Weblate (Japanese)
Currently translated at 100.0% (1668 of 1668 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2025-12-11 09:47:52 +01:00
Elian Doran
5ff60e53cb Translated using Weblate (Romanian)
Currently translated at 100.0% (1668 of 1668 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ro/
2025-12-11 09:47:51 +01:00
Giovi
b38ee36fae Translated using Weblate (Italian)
Currently translated at 100.0% (1668 of 1668 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/it/
2025-12-11 09:47:49 +01:00
Hosted Weblate
38a415faf0 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/
2025-12-11 09:32:25 +01:00
Elian Doran
1e26864842 Translations update from Hosted Weblate (#8006) 2025-12-11 10:32:09 +02:00
Elian Doran
4b74ad5577 feat(breadcrumb/note_info): note size 2025-12-11 00:34:25 +02:00
Elian Doran
e5696713de feat(breadcrumb/note_info): modification/creation date 2025-12-11 00:23:32 +02:00
Elian Doran
2e44397c88 feat(breadcrumb/note_info): get basic dropdown 2025-12-11 00:18:56 +02:00
Meinzzzz
29f0881c5a Fix clicking issue in Mathfield 2025-12-10 22:44:02 +01:00
Francis C.
5d19881981 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (1658 of 1658 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hant/
2025-12-10 22:38:11 +01:00
Tomas Adamek
1711384eaa Translated using Weblate (Czech)
Currently translated at 35.3% (41 of 116 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/cs/
2025-12-10 22:38:11 +01:00
Tomas Adamek
9897efe4af Translated using Weblate (Czech)
Currently translated at 5.3% (88 of 1658 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/cs/
2025-12-10 22:38:10 +01:00
Francis C.
884578ea95 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (116 of 116 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/zh_Hans/
2025-12-10 22:38:09 +01:00
Francis C.
e404e76299 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (116 of 116 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/zh_Hant/
2025-12-10 22:38:09 +01:00
green
1db54cba3e Translated using Weblate (Japanese)
Currently translated at 100.0% (1658 of 1658 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2025-12-10 22:38:08 +01:00
Francis C.
77e3cc4021 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1658 of 1658 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/
2025-12-10 22:38:07 +01:00
pythaac
242c63dfb4 Translated using Weblate (Korean)
Currently translated at 65.1% (99 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/ko/
2025-12-10 22:38:06 +01:00
Abdulmajeed Alaskar
f5440576b5 Translated using Weblate (Arabic)
Currently translated at 53.9% (82 of 152 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/ar/
2025-12-10 22:38:06 +01:00
Abdulmajeed Alaskar
b020365af4 Translated using Weblate (Arabic)
Currently translated at 29.3% (34 of 116 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/ar/
2025-12-10 22:38:05 +01:00
green
25e5bf0b86 Translated using Weblate (Japanese)
Currently translated at 100.0% (1648 of 1648 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/
2025-12-10 22:38:05 +01:00
Elian Doran
19b32dd3a6 New layout: Integrate Basic properties (#8014) 2025-12-10 23:37:54 +02:00
Elian Doran
1ab89d0db0 fix(status_bar): language selector not updating properly 2025-12-10 23:36:47 +02:00
Elian Doran
6e8e10323f chore(client): address requested changes 2025-12-10 23:19:17 +02:00
Elian Doran
58bc5dc66a chore(ribbon): hide basic properties from the ribbon on new layout 2025-12-10 23:07:35 +02:00
Elian Doran
db42bb603b feat(status_bar): add help item 2025-12-10 23:04:32 +02:00
Elian Doran
cb382c9537 fix(global_menu): layout switcher sometimes fails 2025-12-10 22:57:52 +02:00
Elian Doran
a4b79a2dc9 fix(ribbon): content code modal hidden behind backdrop 2025-12-10 22:56:29 +02:00
Elian Doran
0f867e02c4 fix(ribbon): content languages modal hidden behind backdrop 2025-12-10 22:52:13 +02:00
Elian Doran
ab1b4b37f4 feat(global_menu): add an option to switch layouts 2025-12-10 22:51:47 +02:00
Elian Doran
5a1d138f29 feat(status_bar): language selector 2025-12-10 22:39:07 +02:00
Elian Doran
06a5298efa feat(note_actions): hide options in attachments 2025-12-10 22:27:56 +02:00
Elian Doran
db720acc18 feat(note_actions): hide options in help pages 2025-12-10 22:25:09 +02:00
Elian Doran
8d8ff25bae feat(note_actions): reintroduce help pages 2025-12-10 22:21:15 +02:00
Elian Doran
6f85b7cc09 feat(note_actions): integrate note type 2025-12-10 21:54:17 +02:00
Elian Doran
77f5770bff feat(note_actions): protect note switch 2025-12-10 20:57:15 +02:00
Elian Doran
14cda5b921 fix(note_actions): editability context menu is too narrow 2025-12-10 20:46:58 +02:00
Elian Doran
36b1182565 feat(widgets/toggle): disable if going too fast 2025-12-10 20:33:30 +02:00
Elian Doran
483327c808 fix(widgets/toggle): double event triggering when in menu 2025-12-10 20:30:55 +02:00
Elian Doran
efb2f9a048 chore(note_actions): reintroduce disabled logic for toggles 2025-12-10 20:20:21 +02:00
Meinzzzz
60debca37b Improve comments 2025-12-10 18:36:34 +01:00
Elian Doran
01978dabf0 fix(breadcrumb_badges): doesn't refresh when switching editability 2025-12-10 19:05:33 +02:00
Elian Doran
cfbd2bf53a feat(note_actions): integrate editability menu into new layout 2025-12-10 18:58:46 +02:00
Elian Doran
9262f94190 feat(note_actions): integrate template switch into new layout 2025-12-10 18:43:34 +02:00
Elian Doran
b36a0bd10b feat(note_actions): integrate shared switch into new layout 2025-12-10 18:40:56 +02:00
Elian Doran
2dc8948f33 chore(breadcrumb_badges): chagne icon for shared locally 2025-12-10 18:35:29 +02:00
Elian Doran
9f2ed2f9d4 feat(widgets/toggle): disable transitions on first render 2025-12-10 18:33:29 +02:00
Elian Doran
e0f7d65f77 feat(widgets): toggle from label 2025-12-10 18:24:31 +02:00
Elian Doran
f18ac3a923 feat(note_actions): integrate bookmark into new layout 2025-12-10 18:20:36 +02:00
Elian Doran
b39a6bcc97 feat(widgets): prevent clicks in toggle from dismissing menu 2025-12-10 18:17:39 +02:00
Elian Doran
8fa9c25f2a feat(widgets): menu item with toggle 2025-12-10 18:07:38 +02:00
Elian Doran
84bde62e05 New layout improvements (#8012) 2025-12-10 17:50:31 +02:00
Elian Doran
5bb4621097 chore(layout): address requested changes 2025-12-10 17:42:08 +02:00
Elian Doran
f1edf84f4d fix(layout): title background for code notes 2025-12-10 17:13:52 +02:00
Elian Doran
f7955a9040 fix(client/dropdown): tooltip flickering due to child elements 2025-12-10 17:02:11 +02:00
Elian Doran
7c5df21685 feat(note_actions): group development options 2025-12-10 16:51:07 +02:00
Elian Doran
2060bb8cdd feat(breadcrumb): show note preview 2025-12-10 16:14:40 +02:00
Elian Doran
a9b4e7b1e2 style(layout): apply heavy padding to title only in normal view 2025-12-10 16:11:17 +02:00
Elian Doran
82528c4478 style(layout): slightly smaller note title in full-height note type 2025-12-10 15:23:42 +02:00
Zexin Yuan
4dcfc3e0bc chore: add dev shell and direnv support 2025-12-10 21:17:11 +08:00
Elian Doran
999315d3c6 feat(breadcrumb): basic rename note support 2025-12-10 15:16:45 +02:00
Elian Doran
aef0b03c34 feat(breadcrumb_row): collapse badges sooner 2025-12-10 13:38:15 +02:00
Elian Doran
49f008c46f feat(breadcrumb_row): improve button fit on constrained width 2025-12-10 13:37:07 +02:00
Elian Doran
bd81db4117 feat(breadcrumb_row): improve badge fit on constrained width 2025-12-10 13:33:33 +02:00
Elian Doran
9f274883e3 feat(breadcrumb_badges): basic shrink support 2025-12-10 13:06:25 +02:00
Elian Doran
07b76b80f4 feat(layout): hide note details in attachment view 2025-12-10 12:52:03 +02:00
Elian Doran
0014f0a88d feat(layout): minor improvements to title/icon alignment 2025-12-10 12:50:05 +02:00
Elian Doran
63f7a78d31 chore(note_actions): use dedicated translation for note revisions 2025-12-10 12:46:23 +02:00
Elian Doran
e556c090ff fix(ribbon): attribute details not shown in new layout 2025-12-10 12:40:06 +02:00
Elian Doran
c4f483c250 feat(options/advanced): automatically refresh 2025-12-10 12:29:12 +02:00
Elian Doran
4031332b98 feat(note_title_details): tooltips for values 2025-12-10 12:25:38 +02:00
Elian Doran
10cb7c8d6a feat(note_title_details): hide creation dates on hidden notes 2025-12-10 12:10:32 +02:00
Elian Doran
be190bfe33 feat(layout): improve layout for full-height notes 2025-12-10 12:06:05 +02:00
Elian Doran
4d7d642952 fix(layout): floating toolbar displayed in attachments 2025-12-10 11:58:17 +02:00
Elian Doran
737711e5eb fix(layout): weird title in full-width & attachments 2025-12-10 11:56:34 +02:00
Elian Doran
42fc128f97 chore(breadcrumb_badges/backlinks): display actual count of backlinks 2025-12-10 11:51:09 +02:00
Elian Doran
b03e6c3b19 chore(breadcrumb_badges/backlinks): display list of backlinks on click 2025-12-10 11:41:14 +02:00
Elian Doran
66008489c4 chore(breadcrumb_badges): fake backlink widget 2025-12-10 11:21:06 +02:00
Elian Doran
3262e3490a feat(breadcrumb_badges): integrate into quick edit 2025-12-10 11:10:26 +02:00
Elian Doran
16a73b0848 fix(popup_editor): wrong margin for title 2025-12-10 11:03:12 +02:00
Elian Doran
52bb4d7a0e feat(breadcrumb_badges): make badge not wrap-around 2025-12-10 09:52:46 +02:00
Elian Doran
40b5e4d549 feat(breadcrumb_badges): proper link handling support 2025-12-10 09:47:05 +02:00
Elian Doran
b014ea8950 feat(breadcrumb_badges): add colors to the badges 2025-12-10 09:38:55 +02:00
Elian Doran
61592716f9 feat(breadcrumb_badges): add tooltips for the badges 2025-12-10 09:27:44 +02:00
Elian Doran
efe7fc0ee7 chore(layout): hide breadcrumb badges if not on new layout 2025-12-10 09:12:57 +02:00
Elian Doran
a810db3641 feat(breadcrumb_badges): display badge when editing is unlocked 2025-12-10 09:11:28 +02:00
Elian Doran
f8b292dfa3 Experimental layout (#8005) 2025-12-09 23:35:15 +02:00
Elian Doran
fc2ab91280 feat(options/advanced): add description for experimental 2025-12-09 23:16:30 +02:00
Elian Doran
668ee219c6 chore(layout): use translation for badges 2025-12-09 23:02:21 +02:00
Elian Doran
ee6512a1a6 refactor(layout): align name for breadcrumb badges 2025-12-09 23:00:41 +02:00
Elian Doran
fe1f590286 chore(layout): use translations for note title details 2025-12-09 23:00:02 +02:00
Elian Doran
876e8f843a chore(layout): use i18n for options 2025-12-09 22:58:16 +02:00
Elian Doran
a45c1a1dc8 chore(layout): fix regressions after merge 2025-12-09 22:57:36 +02:00
Elian Doran
f8377169e6 Merge remote-tracking branch 'origin/main' into feature/new_layout 2025-12-09 22:46:18 +02:00
Elian Doran
a197a33d35 chore(experimental_features): address review 2025-12-09 22:43:39 +02:00
Elian Doran
3060207d04 feat(layout): created & modification date 2025-12-09 22:22:28 +02:00
Elian Doran
28c1d0b3f5 feat(layout): indicate clickable badges 2025-12-09 21:50:38 +02:00
Elian Doran
644d051477 feat(layout): add shared badge 2025-12-09 21:44:39 +02:00
Elian Doran
f42031c8de feat(layout): add icon to the badge 2025-12-09 21:11:30 +02:00
Elian Doran
6b50d9b087 feat(layout): implement read-only badge 2025-12-09 21:06:28 +02:00
Elian Doran
a0f0da64b4 feat(layout): new icon for note actions & fix padding 2025-12-09 20:59:28 +02:00
Elian Doran
1e72ebd104 feat(layout): move revisions button to note actions 2025-12-09 20:48:54 +02:00
Elian Doran
1184a95697 style(layout): missed bottom border in ribbon buttons 2025-12-09 20:44:58 +02:00
Elian Doran
cd0e4a5678 feat(layout): move fixed formatting toolbar above 2025-12-09 20:36:48 +02:00
Elian Doran
394f6c3110 feat(layout): respect content width for title 2025-12-09 20:22:31 +02:00
Elian Doran
e2b6d0c256 feat(layout): move the note title into the scrollable region 2025-12-09 20:09:06 +02:00
Elian Doran
fe7ca210dd feat(layout): move the note actions into the breadcrumb area 2025-12-09 20:05:42 +02:00
Elian Doran
e58d6bf2a3 feat(layout): reverse the layout of the ribbon 2025-12-09 19:51:53 +02:00
Elian Doran
460d20d6b2 feat(layout): move ribbon to the bottom as experimental layout 2025-12-09 19:42:37 +02:00
Elian Doran
ae154212fe feat(client/server): basic support for experimental features 2025-12-09 19:34:03 +02:00
Elian Doran
28bb4edbac chore(layout): revert work on floating panel 2025-12-09 19:18:48 +02:00
Elian Doran
1ceed1b47b chore(layout): revert work on floating panel 2025-12-09 19:11:27 +02:00
Nriver
5907b7090e fix note title color for legacy themes 2025-12-09 10:49:28 +08:00
Meinzzzz
30ea81d0fb Improve virtual keyboard logic and fix Tab issues 2025-12-08 22:59:08 +01:00
Meinzzzz
b1d92c4fe6 Fix Tab issues 2025-12-08 22:39:12 +01:00
Meinzzzz
70f46de2d8 MathLive virtual keyboard only appears when focusing the mathfield 2025-12-08 20:30:07 +01:00
Meinzzzz
f1b2d0b870 Increas Mathfield font size and ensure virtual keyboard appears above CKEditor 2025-12-08 20:22:52 +01:00
Meinzzzz
8a385972fc Close Virtual Keyboard when Mathinput is closed 2025-12-08 18:49:06 +01:00
Meinzzzz
28dd85c1d1 Merge upstream changes and resolve conflicts 2025-12-07 23:51:41 +01:00
meinzzzz
827c8e0e72 Refactor: Combine MathLive and LaTeX inputs into one single component 2025-12-07 23:19:48 +01:00
meinzzzz
162c076a14 Improve MathLive integration and lazy loading 2025-12-02 22:30:37 +01:00
meinzzzz
9386465de7 Added mathrender error class for better error handling in math rendering 2025-12-02 22:29:20 +01:00
meinzzzz
acca22f3a1 Improve Synchronization Between Mathlive and rawlatex input 2025-12-02 22:28:16 +01:00
meinzzzz
f8d84814e0 Fix differential d problems 2025-11-26 23:02:34 +01:00
meinzzzz
c46cf41842 Small improvements 2025-11-26 22:48:57 +01:00
meinzzzz
64ab1c4116 Imrovement for Latex 2025-11-26 22:29:29 +01:00
meinzzzz
a6de1041c7 Fix bug in math rendering where old content was not cleared 2025-11-26 21:59:33 +01:00
meinzzzz
c8d34e65ea Improve max window size 2025-11-26 21:49:09 +01:00
meinzzzz
51db729546 Improve and simplify Mathfield integration 2025-11-25 23:27:06 +01:00
meinzzzz
d2052ad236 Disable mathlive sound effects 2025-11-24 21:51:59 +01:00
meinzzzz
9c4301467f Remove unused icons from ckeditor5-math package 2025-11-24 19:46:04 +01:00
meinzzzz
e7355dc0e4 remove gitignore unneccesary changes 2025-11-24 18:43:52 +01:00
meinzzzz
4110fec94f Removed unnecessary declare keyboard 2025-11-24 18:28:59 +01:00
meinzzzz
d5e601eae9 Simpliyfied resize logic for math input form and improved css 2025-11-24 17:56:18 +01:00
meinzzzz
4f044c4a57 Use icons form CKEditor5 icons, instead of testing icons. 2025-11-23 22:43:07 +01:00
meinzzzz
5821c350e1 Fixing class property initialization order 2025-11-23 17:58:51 +01:00
meinzzzz
edba8188fe Fix dark selection colors in MathLive math-field 2025-11-23 13:44:28 +01:00
meinzzzz
1471a72633 refactor: avoid recursive updates in mathLiveInput by normalizing value before updateing 2025-11-23 13:34:22 +01:00
meinzzzz
56834cb88a Improve MathLive and Raw LaTeX input views to propagate mousedown events 2025-11-23 13:29:26 +01:00
meinzzzz
a0f16f9184 Fix typos in mathform.css 2025-11-23 13:09:56 +01:00
meinzzzz
de80eb4806 Improve mathform.css styling for better visual integration 2025-11-22 22:42:34 +01:00
meinzzzz
48a4b81fbe remove automated screenshot files 2025-11-22 21:40:55 +01:00
meinzzzz
e225794f72 Better window focus handling in MathFormView 2025-11-22 21:35:37 +01:00
meinzzzz
4eef30f8b5 Fix names 2025-11-22 00:20:20 +01:00
meinzzzz
569b09609d Remove mathlive dependency and chunking 2025-11-22 00:01:14 +01:00
meinzzzz
39838c25c2 Fixed chaching problems 2025-11-21 23:50:49 +01:00
meinzzzz
49e90c08a9 Better Names for Math UI Components 2025-11-20 22:45:21 +01:00
meinzzzz
e777b06fb8 Math 2025-11-20 18:53:39 +01:00
meinzzzz
497ec2ac74 Merge branch 'main' of https://github.com/Meinzzzz/Trilium-Mathlive 2025-11-20 18:00:18 +01:00
meinzzzz
c5d282d203 Mathlive 2025-11-20 00:09:10 +01:00
1001 changed files with 167366 additions and 23941 deletions

3
.envrc Normal file
View File

@@ -0,0 +1,3 @@
if has nix; then
use flake
fi

30
.github/workflows/i18n.yml vendored Normal file
View File

@@ -0,0 +1,30 @@
name: Internationalization
on:
push:
branches:
- "weblate:*"
workflow_dispatch:
pull_request:
paths:
- "apps/client/src/translations/**"
- ".github/workflows/i18n.yml"
permissions:
contents: read
jobs:
i18n-check:
name: Check i18n translations
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: pnpm/action-setup@v4
- name: Set up node & dependencies
uses: actions/setup-node@v6
with:
node-version: 24
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Check translations
run: pnpm tsx scripts/translation/check-translation-coverage.ts

View File

@@ -86,12 +86,12 @@ jobs:
- name: Upload Playwright trace
if: failure()
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: Playwright trace (${{ matrix.dockerfile }})
path: test-output/playwright/output
- uses: actions/upload-artifact@v5
- uses: actions/upload-artifact@v6
if: ${{ !cancelled() }}
with:
name: Playwright report (${{ matrix.dockerfile }})
@@ -213,7 +213,7 @@ jobs:
touch "/tmp/digests/${digest#sha256:}"
- name: Upload digest
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: digests-${{ env.PLATFORM_PAIR }}-${{ matrix.dockerfile }}
path: /tmp/digests/*
@@ -227,7 +227,7 @@ jobs:
- build
steps:
- name: Download digests
uses: actions/download-artifact@v6
uses: actions/download-artifact@v7
with:
path: /tmp/digests
pattern: digests-*

View File

@@ -102,7 +102,7 @@ jobs:
name: Nightly Build
- name: Publish artifacts
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
if: ${{ github.event_name == 'pull_request' }}
with:
name: TriliumNotes ${{ matrix.os.name }} ${{ matrix.arch }}

View File

@@ -77,7 +77,7 @@ jobs:
- name: Upload test report
if: failure()
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: e2e report ${{ matrix.arch }}
path: apps/server-e2e/test-output

View File

@@ -11,6 +11,14 @@ concurrency:
cancel-in-progress: true
jobs:
sanity-check:
name: Sanity Check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Check version consistency
run: pnpm tsx ${{ github.workspace }}/scripts/check-version-consistency.ts ${{ github.ref_name }}
make-electron:
name: Make Electron
strategy:
@@ -73,7 +81,7 @@ jobs:
GPG_SIGNING_KEY: ${{ secrets.GPG_SIGN_KEY }}
- name: Upload the artifact
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: release-desktop-${{ matrix.os.name }}-${{ matrix.arch }}
path: apps/desktop/upload/*.*
@@ -100,7 +108,7 @@ jobs:
arch: ${{ matrix.arch }}
- name: Upload the artifact
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: release-server-linux-${{ matrix.arch }}
path: upload/*.*
@@ -120,7 +128,7 @@ jobs:
docs/Release Notes
- name: Download all artifacts
uses: actions/download-artifact@v6
uses: actions/download-artifact@v7
with:
merge-multiple: true
pattern: release-*

View File

@@ -34,7 +34,7 @@ jobs:
cache: "pnpm"
- name: Install dependencies
run: pnpm install --filter website --frozen-lockfile
run: pnpm install --filter website --frozen-lockfile --ignore-scripts
- name: Build the website
run: pnpm website:build

4
.gitignore vendored
View File

@@ -44,9 +44,11 @@ upload
.rollup.cache
*.tsbuildinfo
/.direnv
/result
.svelte-kit
# docs
site/
apps/*/coverage
apps/*/coverage
scripts/translation/.language*.json

2
.nvmrc
View File

@@ -1 +1 @@
24.11.1
24.13.0

View File

@@ -37,6 +37,9 @@
"apps/server/src/assets/doc_notes/**": true,
"apps/edit-docs/demo/**": true
},
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
},
"eslint.rules.customizations": [
{ "rule": "*", "severity": "warn" }
]

View File

@@ -165,6 +165,17 @@ pnpm install
pnpm edit-docs:edit-docs
```
Alternatively, if you have Nix installed:
```shell
# Run directly
nix run .#edit-docs
# Or install to your profile
nix profile install .#edit-docs
trilium-edit-docs
```
### Building the Executable
Download the repository, install dependencies using `pnpm` and then build the desktop app for Windows:
```shell

View File

@@ -9,14 +9,14 @@
"keywords": [],
"author": "Elian Doran <contact@eliandoran.me>",
"license": "AGPL-3.0-only",
"packageManager": "pnpm@10.24.0",
"packageManager": "pnpm@10.28.0",
"devDependencies": {
"@redocly/cli": "2.12.3",
"@redocly/cli": "2.14.5",
"archiver": "7.0.1",
"fs-extra": "11.3.2",
"react": "19.2.1",
"react-dom": "19.2.1",
"typedoc": "0.28.15",
"fs-extra": "11.3.3",
"react": "19.2.3",
"react-dom": "19.2.3",
"typedoc": "0.28.16",
"typedoc-plugin-missing-exports": "4.1.2"
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "@triliumnext/client",
"version": "0.100.0",
"version": "0.101.3",
"description": "JQuery-based client for TriliumNext, used for both web and desktop (via Electron)",
"private": true,
"license": "AGPL-3.0-only",
@@ -17,12 +17,12 @@
},
"dependencies": {
"@excalidraw/excalidraw": "0.18.0",
"@fullcalendar/core": "6.1.19",
"@fullcalendar/daygrid": "6.1.19",
"@fullcalendar/interaction": "6.1.19",
"@fullcalendar/list": "6.1.19",
"@fullcalendar/multimonth": "6.1.19",
"@fullcalendar/timegrid": "6.1.19",
"@fullcalendar/core": "6.1.20",
"@fullcalendar/daygrid": "6.1.20",
"@fullcalendar/interaction": "6.1.20",
"@fullcalendar/list": "6.1.20",
"@fullcalendar/multimonth": "6.1.20",
"@fullcalendar/timegrid": "6.1.20",
"@maplibre/maplibre-gl-leaflet": "0.1.3",
"@mermaid-js/layout-elk": "0.2.0",
"@mind-elixir/node-menu": "5.0.1",
@@ -43,8 +43,8 @@
"debounce": "3.0.0",
"draggabilly": "3.0.0",
"force-graph": "1.51.0",
"globals": "16.5.0",
"i18next": "25.7.1",
"globals": "17.0.0",
"i18next": "25.7.4",
"i18next-http-backend": "3.0.2",
"jquery": "3.7.1",
"jquery.fancytree": "2.38.5",
@@ -56,11 +56,12 @@
"mark.js": "8.11.1",
"marked": "17.0.1",
"mermaid": "11.12.2",
"mind-elixir": "5.3.7",
"mind-elixir": "5.5.0",
"normalize.css": "8.0.1",
"panzoom": "9.4.3",
"preact": "10.28.0",
"react-i18next": "16.4.0",
"preact": "10.28.2",
"react-i18next": "16.5.3",
"react-window": "2.2.5",
"reveal.js": "5.2.1",
"svg-pan-zoom": "3.6.2",
"tabulator-tables": "6.3.1",
@@ -68,16 +69,17 @@
},
"devDependencies": {
"@ckeditor/ckeditor5-inspector": "5.0.0",
"@preact/preset-vite": "2.10.2",
"@prefresh/vite": "2.4.11",
"@types/bootstrap": "5.2.10",
"@types/jquery": "3.5.33",
"@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.0",
"@types/tabulator-tables": "6.3.1",
"copy-webpack-plugin": "13.0.1",
"happy-dom": "20.0.11",
"happy-dom": "20.1.0",
"lightningcss": "1.30.2",
"script-loader": "0.7.2",
"vite-plugin-static-copy": "3.1.4"
}

View File

@@ -1,40 +1,41 @@
import froca from "../services/froca.js";
import RootCommandExecutor from "./root_command_executor.js";
import Entrypoints from "./entrypoints.js";
import options from "../services/options.js";
import utils, { hasTouchBar } from "../services/utils.js";
import zoomComponent from "./zoom.js";
import TabManager from "./tab_manager.js";
import Component from "./component.js";
import keyboardActionsService from "../services/keyboard_actions.js";
import linkService, { type ViewScope } from "../services/link.js";
import MobileScreenSwitcherExecutor, { type Screen } from "./mobile_screen_switcher.js";
import MainTreeExecutors from "./main_tree_executors.js";
import toast from "../services/toast.js";
import ShortcutComponent from "./shortcut_component.js";
import { t, initLocale } from "../services/i18n.js";
import type { ResolveOptions } from "../widgets/dialogs/delete_notes.js";
import type { PromptDialogOptions } from "../widgets/dialogs/prompt.js";
import type { ConfirmWithMessageOptions, ConfirmWithTitleOptions } from "../widgets/dialogs/confirm.js";
import type LoadResults from "../services/load_results.js";
import type { Attribute } from "../services/attribute_parser.js";
import type NoteTreeWidget from "../widgets/note_tree.js";
import type { default as NoteContext, GetTextEditorCallback } from "./note_context.js";
import type { NativeImage, TouchBar } from "electron";
import TouchBarComponent from "./touch_bar.js";
import type { CKTextEditor } from "@triliumnext/ckeditor5";
import type CodeMirror from "@triliumnext/codemirror";
import { StartupChecks } from "./startup_checks.js";
import type { CreateNoteOpts } from "../services/note_create.js";
import { ColumnComponent } from "tabulator-tables";
import { ChooseNoteTypeCallback } from "../widgets/dialogs/note_type_chooser.jsx";
import type RootContainer from "../widgets/containers/root_container.js";
import { SqlExecuteResults } from "@triliumnext/commons";
import { AddLinkOpts } from "../widgets/dialogs/add_link.jsx";
import { IncludeNoteOpts } from "../widgets/dialogs/include_note.jsx";
import type { NativeImage, TouchBar } from "electron";
import { ColumnComponent } from "tabulator-tables";
import type { Attribute } from "../services/attribute_parser.js";
import froca from "../services/froca.js";
import { initLocale, t } from "../services/i18n.js";
import keyboardActionsService from "../services/keyboard_actions.js";
import linkService, { type ViewScope } from "../services/link.js";
import type LoadResults from "../services/load_results.js";
import type { CreateNoteOpts } from "../services/note_create.js";
import options from "../services/options.js";
import toast from "../services/toast.js";
import utils, { hasTouchBar } from "../services/utils.js";
import { ReactWrappedWidget } from "../widgets/basic_widget.js";
import type { MarkdownImportOpts } from "../widgets/dialogs/markdown_import.jsx";
import type RootContainer from "../widgets/containers/root_container.js";
import { AddLinkOpts } from "../widgets/dialogs/add_link.jsx";
import type { ConfirmWithMessageOptions, ConfirmWithTitleOptions } from "../widgets/dialogs/confirm.js";
import type { ResolveOptions } from "../widgets/dialogs/delete_notes.js";
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 { PromptDialogOptions } from "../widgets/dialogs/prompt.js";
import type NoteTreeWidget from "../widgets/note_tree.js";
import Component from "./component.js";
import Entrypoints from "./entrypoints.js";
import MainTreeExecutors from "./main_tree_executors.js";
import MobileScreenSwitcherExecutor, { type Screen } from "./mobile_screen_switcher.js";
import type { default as NoteContext, GetTextEditorCallback } from "./note_context.js";
import RootCommandExecutor from "./root_command_executor.js";
import ShortcutComponent from "./shortcut_component.js";
import { StartupChecks } from "./startup_checks.js";
import TabManager from "./tab_manager.js";
import TouchBarComponent from "./touch_bar.js";
import zoomComponent from "./zoom.js";
interface Layout {
getRootWidget: (appContext: AppContext) => RootContainer;
@@ -153,6 +154,7 @@ export type CommandMappings = {
};
openInTab: ContextMenuCommandData;
openNoteInSplit: ContextMenuCommandData;
openNoteInWindow: ContextMenuCommandData;
openNoteInPopup: ContextMenuCommandData;
toggleNoteHoisting: ContextMenuCommandData;
insertNoteAfter: ContextMenuCommandData;
@@ -265,7 +267,7 @@ export type CommandMappings = {
reEvaluateRightPaneVisibility: CommandData;
runActiveNote: CommandData;
scrollContainerToCommand: CommandData & {
scrollContainerTo: CommandData & {
position: number;
};
scrollToEnd: CommandData;
@@ -381,7 +383,8 @@ export type CommandMappings = {
reloadTextEditor: CommandData;
chooseNoteType: CommandData & {
callback: ChooseNoteTypeCallback
}
};
customDownload: CommandData;
};
type EventMappings = {
@@ -447,6 +450,7 @@ type EventMappings = {
};
searchRefreshed: { ntxId?: string | null };
textEditorRefreshed: { ntxId?: string | null, editor: CKTextEditor };
contentElRefreshed: { ntxId?: string | null, contentEl: HTMLElement };
hoistedNoteChanged: {
noteId: string;
ntxId: string | null;
@@ -471,6 +475,11 @@ type EventMappings = {
noteContextRemoved: {
ntxIds: string[];
};
contextDataChanged: {
noteContext: NoteContext;
key: string;
value: unknown;
};
exportSvg: { ntxId: string | null | undefined; };
exportPng: { ntxId: string | null | undefined; };
geoMapCreateChildNote: {
@@ -498,6 +507,10 @@ type EventMappings = {
noteIds: string[];
};
refreshData: { ntxId: string | null | undefined };
contentSafeMarginChanged: {
top: number;
noteContext: NoteContext;
}
};
export type EventListener<T extends EventNames> = {
@@ -529,6 +542,7 @@ export type FilteredCommandNames<T extends CommandData> = keyof Pick<CommandMapp
export class AppContext extends Component {
isMainWindow: boolean;
windowId: string;
components: Component[];
beforeUnloadListeners: (WeakRef<BeforeUploadListener> | (() => boolean))[];
tabManager!: TabManager;
@@ -537,10 +551,11 @@ export class AppContext extends Component {
lastSearchString?: string;
constructor(isMainWindow: boolean) {
constructor(isMainWindow: boolean, windowId: string) {
super();
this.isMainWindow = isMainWindow;
this.windowId = windowId;
// non-widget/layout components needed for the application
this.components = [];
this.beforeUnloadListeners = [];
@@ -670,8 +685,7 @@ export class AppContext extends Component {
this.beforeUnloadListeners = this.beforeUnloadListeners.filter(l => l !== listener);
}
}
const appContext = new AppContext(window.glob.isMainWindow);
const appContext = new AppContext(window.glob.isMainWindow, window.glob.windowId);
// we should save all outstanding changes before the page/app is closed
$(window).on("beforeunload", () => {
@@ -691,10 +705,8 @@ $(window).on("beforeunload", () => {
console.log(`Component ${component.componentId} is not finished saving its state.`);
allSaved = false;
}
} else {
if (!listener()) {
allSaved = false;
}
} else if (!listener()) {
allSaved = false;
}
}
@@ -704,7 +716,7 @@ $(window).on("beforeunload", () => {
}
});
$(window).on("hashchange", function () {
$(window).on("hashchange", () => {
const { notePath, ntxId, viewScope, searchString } = linkService.parseNavigationStateFromUrl(window.location.href);
if (notePath || ntxId) {

View File

@@ -57,6 +57,18 @@ export class TypedComponent<ChildT extends TypedComponent<ChildT>> {
return this;
}
/**
* Removes a child component from this component's children array.
* This is used for cleanup when a widget is unmounted to prevent event listener accumulation.
*/
removeChild(component: ChildT) {
const index = this.children.indexOf(component);
if (index !== -1) {
this.children.splice(index, 1);
component.parent = undefined;
}
}
handleEvent<T extends EventNames>(name: T, data: EventData<T>): Promise<unknown[] | unknown> | null | undefined {
try {
const callMethodPromise = this.initialized ? this.initialized.then(() => this.callMethod((this as any)[`${name}Event`], data)) : this.callMethod((this as any)[`${name}Event`], data);
@@ -65,8 +77,8 @@ export class TypedComponent<ChildT extends TypedComponent<ChildT>> {
// don't create promises if not needed (optimization)
return callMethodPromise && childrenPromise ? Promise.all([callMethodPromise, childrenPromise]) : callMethodPromise || childrenPromise;
} catch (e: any) {
console.error(`Handling of event '${name}' failed in ${this.constructor.name} with error ${e.message} ${e.stack}`);
} catch (e: unknown) {
console.error(`Handling of event '${name}' failed in ${this.constructor.name} with error`, e);
return null;
}

View File

@@ -142,14 +142,15 @@ export default class Entrypoints extends Component {
}
async openInWindowCommand({ notePath, hoistedNoteId, viewScope }: NoteCommandData) {
const extraWindowId = utils.randomString(4);
const extraWindowHash = linkService.calculateHash({ notePath, hoistedNoteId, viewScope });
if (utils.isElectron()) {
const { ipcRenderer } = utils.dynamicRequire("electron");
ipcRenderer.send("create-extra-window", { extraWindowHash });
ipcRenderer.send("create-extra-window", { extraWindowId, extraWindowHash });
} else {
const url = `${window.location.protocol}//${window.location.host}${window.location.pathname}?extraWindow=1${extraWindowHash}`;
const url = `${window.location.protocol}//${window.location.host}${window.location.pathname}?extraWindow=${extraWindowId}${extraWindowHash}`;
window.open(url, "", "width=1000,height=800");
}

View File

@@ -1,18 +1,20 @@
import protectedSessionHolder from "../services/protected_session_holder.js";
import server from "../services/server.js";
import utils from "../services/utils.js";
import appContext, { type EventData, type EventListener } from "./app_context.js";
import treeService from "../services/tree.js";
import Component from "./component.js";
import froca from "../services/froca.js";
import hoistedNoteService from "../services/hoisted_note.js";
import options from "../services/options.js";
import type { ViewScope } from "../services/link.js";
import type FNote from "../entities/fnote.js";
import type { CKTextEditor } from "@triliumnext/ckeditor5";
import type CodeMirror from "@triliumnext/codemirror";
import type FNote from "../entities/fnote.js";
import { closeActiveDialog } from "../services/dialog.js";
import froca from "../services/froca.js";
import hoistedNoteService from "../services/hoisted_note.js";
import type { ViewScope } from "../services/link.js";
import options from "../services/options.js";
import protectedSessionHolder from "../services/protected_session_holder.js";
import server from "../services/server.js";
import treeService from "../services/tree.js";
import utils from "../services/utils.js";
import { ReactWrappedWidget } from "../widgets/basic_widget.js";
import type { HeadingContext } from "../widgets/sidebar/TableOfContents.js";
import appContext, { type EventData, type EventListener } from "./app_context.js";
import Component from "./component.js";
export interface SetNoteOpts {
triggerSwitchEvent?: unknown;
@@ -21,6 +23,31 @@ export interface SetNoteOpts {
export type GetTextEditorCallback = (editor: CKTextEditor) => void;
export type SaveState = "saved" | "saving" | "unsaved" | "error";
export interface NoteContextDataMap {
toc: HeadingContext;
pdfPages: {
totalPages: number;
currentPage: number;
scrollToPage(page: number): void;
requestThumbnail(page: number): void;
};
pdfAttachments: {
attachments: PdfAttachment[];
downloadAttachment(filename: string): void;
};
pdfLayers: {
layers: PdfLayer[];
toggleLayer(layerId: string, visible: boolean): void;
};
saveState: {
state: SaveState;
};
}
type ContextDataKey = keyof NoteContextDataMap;
class NoteContext extends Component implements EventListener<"entitiesReloaded"> {
ntxId: string | null;
hoistedNoteId: string;
@@ -31,6 +58,13 @@ class NoteContext extends Component implements EventListener<"entitiesReloaded">
parentNoteId?: string | null;
viewScope?: ViewScope;
/**
* Metadata storage for UI components (e.g., table of contents, PDF page list, code outline).
* This allows type widgets to publish data that sidebar/toolbar components can consume.
* Data is automatically cleared when navigating to a different note.
*/
private contextData: Map<string, unknown> = new Map();
constructor(ntxId: string | null = null, hoistedNoteId: string = "root", mainNtxId: string | null = null) {
super();
@@ -90,6 +124,22 @@ class NoteContext extends Component implements EventListener<"entitiesReloaded">
this.viewScope = opts.viewScope;
({ noteId: this.noteId, parentNoteId: this.parentNoteId } = treeService.getNoteIdAndParentIdFromUrl(resolvedNotePath));
// Clear context data when switching notes and notify subscribers
const oldKeys = Array.from(this.contextData.keys());
this.contextData.clear();
if (oldKeys.length > 0) {
// Notify subscribers asynchronously to avoid blocking navigation
window.setTimeout(() => {
for (const key of oldKeys) {
this.triggerEvent("contextDataChanged", {
noteContext: this,
key,
value: undefined
});
}
}, 0);
}
this.saveToRecentNotes(resolvedNotePath);
protectedSessionHolder.touchProtectedSessionIfNecessary(this.note);
@@ -389,7 +439,7 @@ class NoteContext extends Component implements EventListener<"entitiesReloaded">
* If no content could be determined `null` is returned instead.
*/
async getContentElement() {
return this.timeout<JQuery<HTMLElement>>(
return this.timeout<JQuery<HTMLElement> | null>(
new Promise((resolve) =>
appContext.triggerCommand("executeWithContentElement", {
resolve,
@@ -442,6 +492,52 @@ class NoteContext extends Component implements EventListener<"entitiesReloaded">
return title;
}
/**
* Set metadata for this note context (e.g., table of contents, PDF pages, code outline).
* This data can be consumed by sidebar/toolbar components.
*
* @param key - Unique identifier for the data type (e.g., "toc", "pdfPages", "codeOutline")
* @param value - The data to store (will be cleared when switching notes)
*/
setContextData<K extends ContextDataKey>(key: K, value: NoteContextDataMap[K]): void {
this.contextData.set(key, value);
// Trigger event so subscribers can react
this.triggerEvent("contextDataChanged", {
noteContext: this,
key,
value
});
}
/**
* Get metadata for this note context.
*
* @param key - The data key to retrieve
* @returns The stored data, or undefined if not found
*/
getContextData<K extends ContextDataKey>(key: K): NoteContextDataMap[K] | undefined {
return this.contextData.get(key) as NoteContextDataMap[K] | undefined;
}
/**
* Check if context data exists for a given key.
*/
hasContextData(key: ContextDataKey): boolean {
return this.contextData.has(key);
}
/**
* Clear specific context data.
*/
clearContextData(key: ContextDataKey): void {
this.contextData.delete(key);
this.triggerEvent("contextDataChanged", {
noteContext: this,
key,
value: undefined
});
}
}
export function openInCurrentNoteContext(evt: MouseEvent | JQuery.ClickEvent | JQuery.MouseDownEvent | React.PointerEvent<HTMLCanvasElement> | null, notePath: string, viewScope?: ViewScope) {

View File

@@ -1,14 +1,14 @@
import Component from "./component.js";
import appContext, { type CommandData, type CommandListenerData } from "./app_context.js";
import dateNoteService from "../services/date_notes.js";
import treeService from "../services/tree.js";
import openService from "../services/open.js";
import protectedSessionService from "../services/protected_session.js";
import options from "../services/options.js";
import froca from "../services/froca.js";
import utils from "../services/utils.js";
import toastService from "../services/toast.js";
import noteCreateService from "../services/note_create.js";
import openService from "../services/open.js";
import options from "../services/options.js";
import protectedSessionService from "../services/protected_session.js";
import toastService from "../services/toast.js";
import treeService from "../services/tree.js";
import utils, { openInReusableSplit } from "../services/utils.js";
import appContext, { type CommandListenerData } from "./app_context.js";
import Component from "./component.js";
export default class RootCommandExecutor extends Component {
editReadOnlyNoteCommand() {
@@ -193,6 +193,19 @@ export default class RootCommandExecutor extends Component {
appContext.triggerEvent("zenModeChanged", { isEnabled });
}
async toggleRibbonTabNoteMapCommand(data: CommandListenerData<"toggleRibbonTabNoteMap">) {
const { isExperimentalFeatureEnabled } = await import("../services/experimental_features.js");
const isNewLayout = isExperimentalFeatureEnabled("new-layout");
if (!isNewLayout) {
this.triggerEvent("toggleRibbonTabNoteMap", data);
return;
}
const activeContext = appContext.tabManager.getActiveContext();
if (!activeContext?.notePath) return;
openInReusableSplit(activeContext.notePath, "note-map");
}
firstTabCommand() {
this.#goToTab(1);
}
@@ -262,7 +275,7 @@ export default class RootCommandExecutor extends Component {
}
catch (e) {
console.error("Error creating AI Chat note:", e);
toastService.showError("Failed to create AI Chat note: " + (e as Error).message);
toastService.showError(`Failed to create AI Chat note: ${(e as Error).message}`);
}
}
}

View File

@@ -11,6 +11,8 @@ import linkService from "../services/link.js";
import type { EventData } from "./app_context.js";
import type FNote from "../entities/fnote.js";
const MAX_SAVED_WINDOWS = 10;
interface TabState {
contexts: NoteContext[];
position: number;
@@ -25,6 +27,13 @@ interface NoteContextState {
viewScope: Record<string, any>;
}
interface WindowState {
windowId: string;
createdAt: number;
closedAt: number;
contexts: NoteContextState[];
}
export default class TabManager extends Component {
public children: NoteContext[];
public mutex: Mutex;
@@ -41,9 +50,6 @@ export default class TabManager extends Component {
this.recentlyClosedTabs = [];
this.tabsUpdate = new SpacedUpdate(async () => {
if (!appContext.isMainWindow) {
return;
}
if (options.is("databaseReadonly")) {
return;
}
@@ -52,9 +58,21 @@ export default class TabManager extends Component {
.map((nc) => nc.getPojoState())
.filter((t) => !!t);
await server.put("options", {
openNoteContexts: JSON.stringify(openNoteContexts)
});
// Update the current windows openNoteContexts in options
const savedWindows = options.getJson("openNoteContexts") || [];
const win = savedWindows.find((w: WindowState) => w.windowId === appContext.windowId);
if (win) {
win.contexts = openNoteContexts;
} else {
savedWindows.push({
windowId: appContext.windowId,
createdAt: Date.now(),
closedAt: 0,
contexts: openNoteContexts
} as WindowState);
}
await options.save("openNoteContexts", JSON.stringify(savedWindows));
});
appContext.addBeforeUnloadListener(this);
@@ -69,8 +87,13 @@ export default class TabManager extends Component {
}
async loadTabs() {
// Get the current windows openNoteContexts
const savedWindows = options.getJson("openNoteContexts") || [];
const currentWin = savedWindows.find(w => w.windowId === appContext.windowId);
const openNoteContexts = currentWin ? currentWin.contexts : undefined;
try {
const noteContextsToOpen = (appContext.isMainWindow && options.getJson("openNoteContexts")) || [];
const noteContextsToOpen = openNoteContexts || [];
// preload all notes at once
await froca.getNotes([...noteContextsToOpen.flatMap((tab: NoteContextState) =>
@@ -119,6 +142,51 @@ export default class TabManager extends Component {
}
});
// Save window contents
if (currentWin as WindowState) {
currentWin.createdAt = Date.now();
currentWin.closedAt = 0;
currentWin.contexts = filteredNoteContexts;
} else {
if (savedWindows?.length >= MAX_SAVED_WINDOWS) {
// Filter out the oldest entry
// 1) Never remove the "main" window
// 2) Prefer removing the oldest closed window (closedAt !== 0)
// 3) If no closed window exists, remove the window with the oldest created window
let oldestClosedIndex = -1;
let oldestClosedTime = Infinity;
let oldestCreatedIndex = -1;
let oldestCreatedTime = Infinity;
savedWindows.forEach((w: WindowState, i: number) => {
if (w.windowId === "main") return;
if (w.closedAt !== 0) {
if (w.closedAt < oldestClosedTime) {
oldestClosedTime = w.closedAt;
oldestClosedIndex = i;
}
} else {
if (w.createdAt < oldestCreatedTime) {
oldestCreatedTime = w.createdAt;
oldestCreatedIndex = i;
}
}
});
const indexToRemove = oldestClosedIndex !== -1 ? oldestClosedIndex : oldestCreatedIndex;
if (indexToRemove !== -1) {
savedWindows.splice(indexToRemove, 1);
}
}
savedWindows.push({
windowId: appContext.windowId,
createdAt: Date.now(),
closedAt: 0,
contexts: filteredNoteContexts
} as WindowState);
}
await options.save("openNoteContexts", JSON.stringify(savedWindows));
// if there's a notePath in the URL, make sure it's open and active
// (useful, for e.g., opening clipped notes from clipper or opening link in an extra window)
if (parsedFromUrl.notePath) {

View File

@@ -1,17 +1,18 @@
import appContext from "./components/app_context.js";
import utils from "./services/utils.js";
import noteTooltipService from "./services/note_tooltip.js";
import bundleService from "./services/bundle.js";
import toastService from "./services/toast.js";
import noteAutocompleteService from "./services/note_autocomplete.js";
import electronContextMenu from "./menus/electron_context_menu.js";
import glob from "./services/glob.js";
import { t } from "./services/i18n.js";
import options from "./services/options.js";
import "autocomplete.js/index_jquery.js";
import type ElectronRemote from "@electron/remote";
import type Electron from "electron";
import "boxicons/css/boxicons.min.css";
import "autocomplete.js/index_jquery.js";
import appContext from "./components/app_context.js";
import electronContextMenu from "./menus/electron_context_menu.js";
import bundleService from "./services/bundle.js";
import glob from "./services/glob.js";
import { t } from "./services/i18n.js";
import noteAutocompleteService from "./services/note_autocomplete.js";
import noteTooltipService from "./services/note_tooltip.js";
import options from "./services/options.js";
import toastService from "./services/toast.js";
import utils from "./services/utils.js";
await appContext.earlyInit();

View File

@@ -1,17 +1,19 @@
import server from "../services/server.js";
import noteAttributeCache from "../services/note_attribute_cache.js";
import protectedSessionHolder from "../services/protected_session_holder.js";
import { MIME_TYPES_DICT } from "@triliumnext/commons";
import cssClassManager from "../services/css_class_manager.js";
import type { Froca } from "../services/froca-interface.js";
import type FAttachment from "./fattachment.js";
import type { default as FAttribute, AttributeType } from "./fattribute.js";
import utils from "../services/utils.js";
import noteAttributeCache from "../services/note_attribute_cache.js";
import protectedSessionHolder from "../services/protected_session_holder.js";
import search from "../services/search.js";
import server from "../services/server.js";
import utils from "../services/utils.js";
import type FAttachment from "./fattachment.js";
import type { AttributeType, default as FAttribute } from "./fattribute.js";
const LABEL = "label";
const RELATION = "relation";
const NOTE_TYPE_ICONS = {
export const NOTE_TYPE_ICONS = {
file: "bx bx-file",
image: "bx bx-image",
code: "bx bx-code",
@@ -268,13 +270,12 @@ export default class FNote {
}
}
return results;
} else {
return this.children;
}
return this.children;
}
async getSubtreeNoteIds(includeArchived = false) {
let noteIds: (string | string[])[] = [];
const noteIds: (string | string[])[] = [];
for (const child of await this.getChildNotes()) {
if (child.isArchived && !includeArchived) continue;
@@ -471,9 +472,8 @@ export default class FNote {
return a.isHidden ? 1 : -1;
} else if (a.isSearch !== b.isSearch) {
return a.isSearch ? 1 : -1;
} else {
return a.notePath.length - b.notePath.length;
}
return a.notePath.length - b.notePath.length;
});
return notePaths;
@@ -582,6 +582,10 @@ export default class FNote {
}
getIcon() {
return `tn-icon ${this.#getIconInternal()}`;
}
#getIconInternal() {
const iconClassLabels = this.getLabels("iconClass");
const workspaceIconClass = this.getWorkspaceIconClass();
@@ -597,14 +601,13 @@ export default class FNote {
} else if (this.type === "text") {
if (this.isFolder()) {
return "bx bx-folder";
} else {
return "bx bx-note";
}
} else if (this.type === "code" && this.mime.startsWith("text/x-sql")) {
return "bx bx-data";
} else {
return NOTE_TYPE_ICONS[this.type];
return "bx bx-note";
} else if (this.type === "code") {
const correspondingMimeType = MIME_TYPES_DICT.find(m => m.mime === this.mime);
return correspondingMimeType?.icon ?? NOTE_TYPE_ICONS.code;
}
return NOTE_TYPE_ICONS[this.type];
}
getColorClass() {
@@ -613,11 +616,13 @@ export default class FNote {
}
isFolder() {
return this.type === "search" || this.getFilteredChildBranches().length > 0;
if (this.isLabelTruthy("subtreeHidden")) return false;
if (this.type === "search") return true;
return this.getFilteredChildBranches().length > 0;
}
getFilteredChildBranches() {
let childBranches = this.getChildBranches();
const childBranches = this.getChildBranches();
if (!childBranches) {
console.error(`No children for '${this.noteId}'. This shouldn't happen.`);
@@ -811,9 +816,9 @@ export default class FNote {
return this.getLabelValue(nameWithPrefix.substring(1));
} else if (nameWithPrefix.startsWith("~")) {
return this.getRelationValue(nameWithPrefix.substring(1));
} else {
return this.getLabelValue(nameWithPrefix);
}
return this.getLabelValue(nameWithPrefix);
}
/**
@@ -878,10 +883,10 @@ export default class FNote {
promotedAttrs.sort((a, b) => {
if (a.noteId === b.noteId) {
return a.position < b.position ? -1 : 1;
} else {
// inherited promoted attributes should stay grouped: https://github.com/zadam/trilium/issues/3761
return a.noteId < b.noteId ? -1 : 1;
}
// inherited promoted attributes should stay grouped: https://github.com/zadam/trilium/issues/3761
return a.noteId < b.noteId ? -1 : 1;
});
return promotedAttrs;
@@ -993,6 +998,10 @@ export default class FNote {
);
}
isJsx() {
return (this.type === "code" && this.mime === "text/jsx");
}
/** @returns true if this note is HTML */
isHtml() {
return (this.type === "code" || this.type === "file" || this.type === "render") && this.mime === "text/html";
@@ -1000,7 +1009,7 @@ export default class FNote {
/** @returns JS script environment - either "frontend" or "backend" */
getScriptEnv() {
if (this.isHtml() || (this.isJavaScript() && this.mime.endsWith("env=frontend"))) {
if (this.isHtml() || (this.isJavaScript() && this.mime.endsWith("env=frontend")) || this.isJsx()) {
return "frontend";
}
@@ -1022,7 +1031,7 @@ export default class FNote {
* @returns a promise that resolves when the script has been run. Additionally, for front-end notes, the promise will contain the value that is returned by the script.
*/
async executeScript() {
if (!this.isJavaScript()) {
if (!(this.isJavaScript() || this.isJsx())) {
throw new Error(`Note ${this.noteId} is of type ${this.type} and mime ${this.mime} and thus cannot be executed`);
}

Binary file not shown.

View File

@@ -0,0 +1,29 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="shortcut icon" href="favicon.ico">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover, interactive-widget=resizes-content" />
<link rel="manifest" crossorigin="use-credentials" href="manifest.webmanifest">
<title>Trilium Notes</title>
</head>
<body id="trilium-app">
<noscript>Trilium requires JavaScript to be enabled.</noscript>
<div class="dropdown-menu dropdown-menu-sm" id="context-menu-container" style="display: none"></div>
<!-- Required to match the PWA's top bar color with the theme -->
<!-- This works even when the user directly changes --root-background in CSS -->
<div id="background-color-tracker" style="position: absolute; visibility: hidden; color: var(--root-background); transition: color 1ms;"></div>
<script src="./index.ts" type="module"></script>
<!-- Required for correct loading of scripts in Electron -->
<script>
if (typeof module === 'object') {window.module = module; module = undefined;}
</script>
</body>
</html>

View File

@@ -0,0 +1,111 @@
async function bootstrap() {
showSplash();
await setupGlob();
await Promise.all([
initJQuery(),
loadBootstrapCss()
]);
loadStylesheets();
loadIcons();
setBodyAttributes();
await loadScripts();
hideSplash();
}
async function initJQuery() {
const $ = (await import("jquery")).default;
window.$ = $;
window.jQuery = $;
}
async function setupGlob() {
const response = await fetch(`/bootstrap${window.location.search}`);
const json = await response.json();
window.global = globalThis; /* fixes https://github.com/webpack/webpack/issues/10035 */
window.glob = {
...json,
activeDialog: null
};
}
async function loadBootstrapCss() {
// We have to selectively import Bootstrap CSS based on text direction.
if (glob.isRtl) {
await import("bootstrap/dist/css/bootstrap.rtl.min.css");
} else {
await import("bootstrap/dist/css/bootstrap.min.css");
}
}
function loadStylesheets() {
const { assetPath, themeCssUrl, themeUseNextAsBase } = window.glob;
const cssToLoad: string[] = [];
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`);
for (const href of cssToLoad) {
const linkEl = document.createElement("link");
linkEl.href = href;
linkEl.rel = "stylesheet";
document.head.appendChild(linkEl);
}
}
function loadIcons() {
const styleEl = document.createElement("style");
styleEl.innerText = window.glob.iconPackCss;
document.head.appendChild(styleEl);
}
function setBodyAttributes() {
const { device, headingStyle, layoutOrientation, platform, isElectron, hasNativeTitleBar, hasBackgroundEffects, currentLocale, isMainWindow } = window.glob;
const classesToSet = [
device,
`heading-style-${headingStyle}`,
`layout-${layoutOrientation}`,
`platform-${platform}`,
isElectron && "electron",
hasNativeTitleBar && "native-titlebar",
hasBackgroundEffects && "background-effects",
!isMainWindow && 'extra-window'
].filter(Boolean) as string[];
for (const classToSet of classesToSet) {
document.body.classList.add(classToSet);
}
document.body.lang = currentLocale.id;
document.body.dir = currentLocale.rtl ? "rtl" : "ltr";
}
async function loadScripts() {
if (glob.device === "mobile") {
await import("./mobile.js");
} else {
await import("./desktop.js");
}
}
function showSplash() {
// hide body to reduce flickering on the startup. This is done through JS and not CSS to not hide <noscript>
document.body.style.display = "none";
}
function hideSplash() {
document.body.style.display = "block";
}
bootstrap();

View File

@@ -1,51 +1,59 @@
import { applyModals } from "./layout_commons.js";
import { DESKTOP_FLOATING_BUTTONS } from "../widgets/FloatingButtonsDefinitions.jsx";
import type { AppContext } from "../components/app_context.js";
import type { WidgetsByParent } from "../services/bundle.js";
import { isExperimentalFeatureEnabled } from "../services/experimental_features.js";
import options from "../services/options.js";
import utils from "../services/utils.js";
import ApiLog from "../widgets/api_log.jsx";
import ClosePaneButton from "../widgets/buttons/close_pane_button.js";
import CloseZenModeButton from "../widgets/close_zen_button.jsx";
import ContentHeader from "../widgets/containers/content_header.js";
import CreatePaneButton from "../widgets/buttons/create_pane_button.js";
import FindWidget from "../widgets/find.js";
import FlexContainer from "../widgets/containers/flex_container.js";
import FloatingButtons from "../widgets/FloatingButtons.jsx";
import GlobalMenu from "../widgets/buttons/global_menu.jsx";
import HighlightsListWidget from "../widgets/highlights_list.js";
import LeftPaneContainer from "../widgets/containers/left_pane_container.js";
import LeftPaneToggle from "../widgets/buttons/left_pane_toggle.js";
import MovePaneButton from "../widgets/buttons/move_pane_button.js";
import NoteIconWidget from "../widgets/note_icon.jsx";
import RightPaneToggle from "../widgets/buttons/right_pane_toggle.jsx";
import CloseZenModeButton from "../widgets/close_zen_button.jsx";
import NoteList from "../widgets/collections/NoteList.jsx";
import NoteTitleWidget from "../widgets/note_title.jsx";
import NoteTreeWidget from "../widgets/note_tree.js";
import NoteWrapperWidget from "../widgets/note_wrapper.js";
import options from "../services/options.js";
import PasswordNoteSetDialog from "../widgets/dialogs/password_not_set.js";
import QuickSearchWidget from "../widgets/quick_search.js";
import ReadOnlyNoteInfoBar from "../widgets/ReadOnlyNoteInfoBar.jsx";
import Ribbon from "../widgets/ribbon/Ribbon.jsx";
import ContentHeader from "../widgets/containers/content_header.js";
import FlexContainer from "../widgets/containers/flex_container.js";
import LeftPaneContainer from "../widgets/containers/left_pane_container.js";
import RightPaneContainer from "../widgets/containers/right_pane_container.js";
import RootContainer from "../widgets/containers/root_container.js";
import ScrollingContainer from "../widgets/containers/scrolling_container.js";
import SplitNoteContainer from "../widgets/containers/split_note_container.js";
import PasswordNoteSetDialog from "../widgets/dialogs/password_not_set.js";
import UploadAttachmentsDialog from "../widgets/dialogs/upload_attachments.js";
import FindWidget from "../widgets/find.js";
import FloatingButtons from "../widgets/FloatingButtons.jsx";
import { DESKTOP_FLOATING_BUTTONS } from "../widgets/FloatingButtonsDefinitions.jsx";
import HighlightsListWidget from "../widgets/highlights_list.js";
import LauncherContainer from "../widgets/launch_bar/LauncherContainer.jsx";
import SpacerWidget from "../widgets/launch_bar/SpacerWidget.jsx";
import InlineTitle from "../widgets/layout/InlineTitle.jsx";
import NoteBadges from "../widgets/layout/NoteBadges.jsx";
import NoteTitleActions from "../widgets/layout/NoteTitleActions.jsx";
import StatusBar from "../widgets/layout/StatusBar.jsx";
import NoteIconWidget from "../widgets/note_icon.jsx";
import NoteTitleWidget from "../widgets/note_title.jsx";
import NoteTreeWidget from "../widgets/note_tree.js";
import NoteWrapperWidget from "../widgets/note_wrapper.js";
import NoteDetail from "../widgets/NoteDetail.jsx";
import PromotedAttributes from "../widgets/PromotedAttributes.jsx";
import QuickSearchWidget from "../widgets/quick_search.js";
import ReadOnlyNoteInfoBar from "../widgets/ReadOnlyNoteInfoBar.jsx";
import { FixedFormattingToolbar } from "../widgets/ribbon/FormattingToolbar.jsx";
import NoteActions from "../widgets/ribbon/NoteActions.jsx";
import Ribbon from "../widgets/ribbon/Ribbon.jsx";
import ScrollPadding from "../widgets/scroll_padding.js";
import SearchResult from "../widgets/search_result.jsx";
import SharedInfo from "../widgets/shared_info.jsx";
import SplitNoteContainer from "../widgets/containers/split_note_container.js";
import RightPanelContainer from "../widgets/sidebar/RightPanelContainer.jsx";
import SqlResults from "../widgets/sql_result.js";
import SqlTableSchemas from "../widgets/sql_table_schemas.js";
import TabRowWidget from "../widgets/tab_row.js";
import TabHistoryNavigationButtons from "../widgets/TabHistoryNavigationButtons.jsx";
import TitleBarButtons from "../widgets/title_bar_buttons.jsx";
import TocWidget from "../widgets/toc.js";
import type { AppContext } from "../components/app_context.js";
import type { WidgetsByParent } from "../services/bundle.js";
import UploadAttachmentsDialog from "../widgets/dialogs/upload_attachments.js";
import utils from "../services/utils.js";
import WatchedFileUpdateStatusWidget from "../widgets/watched_file_update_status.js";
import NoteDetail from "../widgets/NoteDetail.jsx";
import PromotedAttributes from "../widgets/PromotedAttributes.jsx";
import SpacerWidget from "../widgets/launch_bar/SpacerWidget.jsx";
import LauncherContainer from "../widgets/launch_bar/LauncherContainer.jsx";
import Breadcrumb from "../widgets/Breadcrumb.jsx";
import TabHistoryNavigationButtons from "../widgets/TabHistoryNavigationButtons.jsx";
import { applyModals } from "./layout_commons.js";
export default class DesktopLayout {
@@ -71,10 +79,11 @@ export default class DesktopLayout {
*/
const fullWidthTabBar = launcherPaneIsHorizontal || (isElectron && !hasNativeTitleBar && isMac);
const customTitleBarButtons = !hasNativeTitleBar && !isMac && !isWindows;
const isNewLayout = isExperimentalFeatureEnabled("new-layout");
const rootContainer = new RootContainer(true)
.setParent(appContext)
.class((launcherPaneIsHorizontal ? "horizontal" : "vertical") + "-layout")
.class(`${launcherPaneIsHorizontal ? "horizontal" : "vertical" }-layout`)
.optChild(
fullWidthTabBar,
new FlexContainer("row")
@@ -83,6 +92,7 @@ export default class DesktopLayout {
.optChild(launcherPaneIsHorizontal, <LeftPaneToggle isHorizontalLayout={true} />)
.child(<TabHistoryNavigationButtons />)
.child(new TabRowWidget().class("full-width"))
.optChild(isNewLayout, <RightPaneToggle />)
.optChild(customTitleBarButtons, <TitleBarButtons />)
.css("height", "40px")
.css("background-color", "var(--launcher-pane-background-color)")
@@ -106,10 +116,15 @@ export default class DesktopLayout {
.css("flex-grow", "1")
.optChild(!fullWidthTabBar,
new FlexContainer("row")
.class("tab-row-container")
.child(<TabHistoryNavigationButtons />)
.child(new TabRowWidget())
.optChild(isNewLayout, <RightPaneToggle />)
.optChild(customTitleBarButtons, <TitleBarButtons />)
.css("height", "40px"))
.css("height", "40px")
.css("align-items", "center")
)
.optChild(isNewLayout, <FixedFormattingToolbar />)
.child(
new FlexContainer("row")
.filling()
@@ -123,37 +138,31 @@ export default class DesktopLayout {
.child(
new SplitNoteContainer(() =>
new NoteWrapperWidget()
.child(
new FlexContainer("row")
.class("breadcrumb-row")
.css("height", "30px")
.css("min-height", "30px")
.css("align-items", "center")
.css("padding", "10px")
.cssBlock(".breadcrumb-row > * { margin: 5px; }")
.child(<Breadcrumb />)
.child(<SpacerWidget baseSize={0} growthFactor={1} />)
.child(<MovePaneButton direction="left" />)
.child(<MovePaneButton direction="right" />)
.child(<ClosePaneButton />)
.child(<CreatePaneButton />)
)
.child(new FlexContainer("row")
.class("title-row note-split-title")
.cssBlock(".title-row > * { margin: 5px; }")
.child(<NoteIconWidget />)
.child(<NoteTitleWidget />)
.optChild(isNewLayout, <NoteBadges />)
.child(<SpacerWidget baseSize={0} growthFactor={1} />)
.optChild(!isNewLayout, <MovePaneButton direction="left" />)
.optChild(!isNewLayout, <MovePaneButton direction="right" />)
.optChild(!isNewLayout, <ClosePaneButton />)
.optChild(!isNewLayout, <CreatePaneButton />)
.optChild(isNewLayout, <NoteActions />))
.optChild(!isNewLayout, <Ribbon />)
.child(new WatchedFileUpdateStatusWidget())
.child(<FloatingButtons items={DESKTOP_FLOATING_BUTTONS} />)
.optChild(!isNewLayout, <FloatingButtons items={DESKTOP_FLOATING_BUTTONS} />)
.child(
new ScrollingContainer()
.filling()
.child(new ContentHeader()
.child(new FlexContainer("row")
.class("title-row")
.child(<NoteIconWidget />)
.child(<NoteTitleWidget />)
)
.optChild(isNewLayout, <InlineTitle />)
.optChild(isNewLayout, <NoteTitleActions />)
.optChild(!isNewLayout, new ContentHeader()
.child(<ReadOnlyNoteInfoBar />)
.child(<SharedInfo />)
)
.child(<Ribbon />)
.child(<PromotedAttributes />)
.optChild(!isNewLayout, <PromotedAttributes />)
.child(<SqlTableSchemas />)
.child(<NoteDetail />)
.child(<NoteList media="screen" />)
@@ -163,23 +172,24 @@ export default class DesktopLayout {
)
.child(<ApiLog />)
.child(new FindWidget())
.child(
...this.customWidgets.get("node-detail-pane"), // typo, let's keep it for a while as BC
...this.customWidgets.get("note-detail-pane")
)
.child(...this.customWidgets.get("note-detail-pane"))
)
)
.child(...this.customWidgets.get("center-pane"))
)
.child(
.optChild(!isNewLayout,
new RightPaneContainer()
.child(new TocWidget())
.child(new HighlightsListWidget())
.child(...this.customWidgets.get("right-pane"))
)
.optChild(isNewLayout, <RightPanelContainer widgetsByParent={this.customWidgets} />)
)
.optChild(!launcherPaneIsHorizontal && isNewLayout, <StatusBar />)
)
)
.optChild(launcherPaneIsHorizontal && isNewLayout, <StatusBar />)
.child(<CloseZenModeButton />)
// Desktop-specific dialogs.

View File

@@ -52,5 +52,5 @@ export function applyModals(rootContainer: RootContainer) {
.child(<IncorrectCpuArchDialog />)
.child(<PopupEditorDialog />)
.child(<CallToActionDialog />)
.child(<ToastContainer />)
.child(<ToastContainer />);
}

View File

@@ -1,35 +1,35 @@
import { applyModals } from "./layout_commons.js";
import { MOBILE_FLOATING_BUTTONS } from "../widgets/FloatingButtonsDefinitions.jsx";
import { useNoteContext } from "../widgets/react/hooks.jsx";
import CloseZenModeButton from "../widgets/close_zen_button.js";
import FilePropertiesTab from "../widgets/ribbon/FilePropertiesTab.jsx";
import FlexContainer from "../widgets/containers/flex_container.js";
import FloatingButtons from "../widgets/FloatingButtons.jsx";
import type AppContext from "../components/app_context.js";
import GlobalMenuWidget from "../widgets/buttons/global_menu.js";
import MobileDetailMenu from "../widgets/mobile_widgets/mobile_detail_menu.js";
import CloseZenModeButton from "../widgets/close_zen_button.js";
import NoteList from "../widgets/collections/NoteList.jsx";
import NoteTitleWidget from "../widgets/note_title.js";
import ContentHeader from "../widgets/containers/content_header.js";
import FlexContainer from "../widgets/containers/flex_container.js";
import RootContainer from "../widgets/containers/root_container.js";
import ScrollingContainer from "../widgets/containers/scrolling_container.js";
import SplitNoteContainer from "../widgets/containers/split_note_container.js";
import FloatingButtons from "../widgets/FloatingButtons.jsx";
import { MOBILE_FLOATING_BUTTONS } from "../widgets/FloatingButtonsDefinitions.jsx";
import LauncherContainer from "../widgets/launch_bar/LauncherContainer.jsx";
import MobileDetailMenu from "../widgets/mobile_widgets/mobile_detail_menu.js";
import ScreenContainer from "../widgets/mobile_widgets/screen_container.js";
import SidebarContainer from "../widgets/mobile_widgets/sidebar_container.js";
import ToggleSidebarButton from "../widgets/mobile_widgets/toggle_sidebar_button.jsx";
import NoteTitleWidget from "../widgets/note_title.js";
import NoteTreeWidget from "../widgets/note_tree.js";
import NoteWrapperWidget from "../widgets/note_wrapper.js";
import NoteDetail from "../widgets/NoteDetail.jsx";
import PromotedAttributes from "../widgets/PromotedAttributes.jsx";
import QuickSearchWidget from "../widgets/quick_search.js";
import { useNoteContext } from "../widgets/react/hooks.jsx";
import ReadOnlyNoteInfoBar from "../widgets/ReadOnlyNoteInfoBar.jsx";
import RootContainer from "../widgets/containers/root_container.js";
import ScreenContainer from "../widgets/mobile_widgets/screen_container.js";
import ScrollingContainer from "../widgets/containers/scrolling_container.js";
import StandaloneRibbonAdapter from "../widgets/ribbon/components/StandaloneRibbonAdapter.jsx";
import FilePropertiesTab from "../widgets/ribbon/FilePropertiesTab.jsx";
import SearchDefinitionTab from "../widgets/ribbon/SearchDefinitionTab.jsx";
import SearchResult from "../widgets/search_result.jsx";
import SharedInfoWidget from "../widgets/shared_info.js";
import SidebarContainer from "../widgets/mobile_widgets/sidebar_container.js";
import StandaloneRibbonAdapter from "../widgets/ribbon/components/StandaloneRibbonAdapter.jsx";
import TabRowWidget from "../widgets/tab_row.js";
import ToggleSidebarButton from "../widgets/mobile_widgets/toggle_sidebar_button.jsx";
import type AppContext from "../components/app_context.js";
import NoteDetail from "../widgets/NoteDetail.jsx";
import MobileEditorToolbar from "../widgets/type_widgets/text/mobile_editor_toolbar.jsx";
import PromotedAttributes from "../widgets/PromotedAttributes.jsx";
import SplitNoteContainer from "../widgets/containers/split_note_container.js";
import LauncherContainer from "../widgets/launch_bar/LauncherContainer.jsx";
import { applyModals } from "./layout_commons.js";
const MOBILE_CSS = `
<style>
@@ -194,11 +194,11 @@ export default class MobileLayout {
}
function FilePropertiesWrapper() {
const { note } = useNoteContext();
const { note, ntxId } = useNoteContext();
return (
<div>
{note?.type === "file" && <FilePropertiesTab note={note} />}
{note?.type === "file" && <FilePropertiesTab note={note} ntxId={ntxId} />}
</div>
);
}

View File

@@ -1,10 +1,11 @@
import { t } from "../services/i18n.js";
import contextMenu, { type ContextMenuEvent, type MenuItem } from "./context_menu.js";
import type { LeafletMouseEvent } from "leaflet";
import appContext, { type CommandNames } from "../components/app_context.js";
import { t } from "../services/i18n.js";
import type { ViewScope } from "../services/link.js";
import utils, { isMobile } from "../services/utils.js";
import { getClosestNtxId } from "../widgets/widget_utils.js";
import type { LeafletMouseEvent } from "leaflet";
import contextMenu, { type ContextMenuEvent, type MenuItem } from "./context_menu.js";
function openContextMenu(notePath: string, e: ContextMenuEvent, viewScope: ViewScope = {}, hoistedNoteId: string | null = null) {
contextMenu.show({
@@ -34,15 +35,21 @@ function handleLinkContextMenuItem(command: string | undefined, e: ContextMenuEv
if (command === "openNoteInNewTab") {
appContext.tabManager.openContextWithNote(notePath, { hoistedNoteId, viewScope });
return true;
} else if (command === "openNoteInNewSplit") {
const ntxId = getNtxId(e);
if (!ntxId) return;
if (!ntxId) return false;
appContext.triggerCommand("openNewNoteSplit", { ntxId, notePath, hoistedNoteId, viewScope });
return true;
} else if (command === "openNoteInNewWindow") {
appContext.triggerCommand("openInWindow", { notePath, hoistedNoteId, viewScope });
return true;
} else if (command === "openNoteInPopup") {
appContext.triggerCommand("openInPopup", { noteIdOrPath: notePath })
appContext.triggerCommand("openInPopup", { noteIdOrPath: notePath });
return true;
}
return false;
}
function getNtxId(e: ContextMenuEvent | LeafletMouseEvent) {
@@ -52,9 +59,9 @@ function getNtxId(e: ContextMenuEvent | LeafletMouseEvent) {
return subContexts[subContexts.length - 1].ntxId;
} else if (e.target instanceof HTMLElement) {
return getClosestNtxId(e.target);
} else {
return null;
}
return null;
}
export default {

View File

@@ -1,21 +1,21 @@
import NoteColorPicker from "./custom-items/NoteColorPicker.jsx";
import treeService from "../services/tree.js";
import froca from "../services/froca.js";
import clipboard from "../services/clipboard.js";
import noteCreateService from "../services/note_create.js";
import contextMenu, { type MenuCommandItem, type MenuItem } from "./context_menu.js";
import appContext, { type ContextMenuCommandData, type FilteredCommandNames } from "../components/app_context.js";
import type { SelectMenuItemEventListener } from "../components/events.js";
import type FAttachment from "../entities/fattachment.js";
import attributes from "../services/attributes.js";
import { executeBulkActions } from "../services/bulk_action.js";
import clipboard from "../services/clipboard.js";
import dialogService from "../services/dialog.js";
import froca from "../services/froca.js";
import { t } from "../services/i18n.js";
import noteCreateService from "../services/note_create.js";
import noteTypesService from "../services/note_types.js";
import server from "../services/server.js";
import toastService from "../services/toast.js";
import dialogService from "../services/dialog.js";
import { t } from "../services/i18n.js";
import type NoteTreeWidget from "../widgets/note_tree.js";
import type FAttachment from "../entities/fattachment.js";
import type { SelectMenuItemEventListener } from "../components/events.js";
import treeService from "../services/tree.js";
import utils from "../services/utils.js";
import attributes from "../services/attributes.js";
import { executeBulkActions } from "../services/bulk_action.js";
import type NoteTreeWidget from "../widgets/note_tree.js";
import contextMenu, { type MenuCommandItem, type MenuItem } from "./context_menu.js";
import NoteColorPicker from "./custom-items/NoteColorPicker.jsx";
// TODO: Deduplicate once client/server is well split.
interface ConvertToAttachmentResponse {
@@ -72,6 +72,8 @@ export default class TreeContextMenu implements SelectMenuItemEventListener<Tree
const noSelectedNotes = selNodes.length === 0 || (selNodes.length === 1 && selNodes[0] === this.node);
const notSearch = note?.type !== "search";
const hasSubtreeHidden = note?.isLabelTruthy("subtreeHidden") ?? false;
const isSpotlighted = this.node.extraClasses.includes("spotlighted-node");
const notOptionsOrHelp = !note?.noteId.startsWith("_options") && !note?.noteId.startsWith("_help");
const parentNotSearch = !parentNote || parentNote.type !== "search";
const insertNoteAfterEnabled = isNotRoot && !isHoisted && parentNotSearch;
@@ -79,17 +81,18 @@ export default class TreeContextMenu implements SelectMenuItemEventListener<Tree
const items: (MenuItem<TreeCommandNames> | null)[] = [
{ title: t("tree-context-menu.open-in-a-new-tab"), command: "openInTab", shortcut: "Ctrl+Click", uiIcon: "bx bx-link-external", enabled: noSelectedNotes },
{ title: t("tree-context-menu.open-in-a-new-split"), command: "openNoteInSplit", uiIcon: "bx bx-dock-right", enabled: noSelectedNotes },
{ title: t("tree-context-menu.open-in-a-new-window"), command: "openNoteInWindow", uiIcon: "bx bx-window-open", enabled: noSelectedNotes },
{ title: t("tree-context-menu.open-in-popup"), command: "openNoteInPopup", uiIcon: "bx bx-edit", enabled: noSelectedNotes },
isHoisted
? null
: {
title: `${t("tree-context-menu.hoist-note")}`,
command: "toggleNoteHoisting",
keyboardShortcut: "toggleNoteHoisting",
uiIcon: "bx bxs-chevrons-up",
enabled: noSelectedNotes && notSearch
},
title: `${t("tree-context-menu.hoist-note")}`,
command: "toggleNoteHoisting",
keyboardShortcut: "toggleNoteHoisting",
uiIcon: "bx bxs-chevrons-up",
enabled: noSelectedNotes && notSearch
},
!isHoisted || !isNotRoot
? null
: { title: t("tree-context-menu.unhoist-note"), command: "toggleNoteHoisting", keyboardShortcut: "toggleNoteHoisting", uiIcon: "bx bx-door-open" },
@@ -112,7 +115,7 @@ export default class TreeContextMenu implements SelectMenuItemEventListener<Tree
keyboardShortcut: "createNoteInto",
uiIcon: "bx bx-plus",
items: notSearch ? await noteTypesService.getNoteTypeItems("insertChildNote") : null,
enabled: notSearch && noSelectedNotes && notOptionsOrHelp,
enabled: notSearch && noSelectedNotes && notOptionsOrHelp && !hasSubtreeHidden && !isSpotlighted,
columns: 2
},
@@ -150,8 +153,17 @@ export default class TreeContextMenu implements SelectMenuItemEventListener<Tree
{ kind: "separator" },
{ title: t("tree-context-menu.expand-subtree"), command: "expandSubtree", keyboardShortcut: "expandSubtree", uiIcon: "bx bx-expand", enabled: noSelectedNotes },
{ title: t("tree-context-menu.collapse-subtree"), command: "collapseSubtree", keyboardShortcut: "collapseSubtree", uiIcon: "bx bx-collapse", enabled: noSelectedNotes },
!hasSubtreeHidden && { title: t("tree-context-menu.expand-subtree"), command: "expandSubtree", keyboardShortcut: "expandSubtree", uiIcon: "bx bx-expand", enabled: noSelectedNotes },
!hasSubtreeHidden && { title: t("tree-context-menu.collapse-subtree"), command: "collapseSubtree", keyboardShortcut: "collapseSubtree", uiIcon: "bx bx-collapse", enabled: noSelectedNotes },
{
title: hasSubtreeHidden ? t("tree-context-menu.show-subtree") : t("tree-context-menu.hide-subtree"),
uiIcon: "bx bx-show",
handler: async () => {
const note = await froca.getNote(this.node.data.noteId);
if (!note) return;
attributes.setBooleanWithInheritance(note, "subtreeHidden", !hasSubtreeHidden);
}
},
{
title: t("tree-context-menu.sort-by"),
command: "sortChildNotes",
@@ -164,7 +176,7 @@ export default class TreeContextMenu implements SelectMenuItemEventListener<Tree
{ title: t("tree-context-menu.copy-note-path-to-clipboard"), command: "copyNotePathToClipboard", uiIcon: "bx bx-directions", enabled: true },
{ title: t("tree-context-menu.recent-changes-in-subtree"), command: "recentChangesInSubtree", uiIcon: "bx bx-history", enabled: noSelectedNotes && notOptionsOrHelp }
]
].filter(Boolean) as MenuItem<TreeCommandNames>[]
},
{ kind: "separator" },
@@ -292,25 +304,30 @@ export default class TreeContextMenu implements SelectMenuItemEventListener<Tree
noteCreateService.createNote(parentNotePath, {
target: "after",
targetBranchId: this.node.data.branchId,
type: type,
isProtected: isProtected,
templateNoteId: templateNoteId
type,
isProtected,
templateNoteId
});
} else if (command === "insertChildNote") {
const parentNotePath = treeService.getNotePath(this.node);
noteCreateService.createNote(parentNotePath, {
type: type,
type,
isProtected: this.node.data.isProtected,
templateNoteId: templateNoteId
templateNoteId
});
} else if (command === "openNoteInSplit") {
const subContexts = appContext.tabManager.getActiveContext()?.getSubContexts();
const { ntxId } = subContexts?.[subContexts.length - 1] ?? {};
this.treeWidget.triggerCommand("openNewNoteSplit", { ntxId, notePath });
} else if (command === "openNoteInWindow") {
appContext.triggerCommand("openInWindow", {
notePath,
hoistedNoteId: appContext.tabManager.getActiveContext()?.hoistedNoteId
});
} else if (command === "openNoteInPopup") {
appContext.triggerCommand("openInPopup", { noteIdOrPath: notePath })
appContext.triggerCommand("openInPopup", { noteIdOrPath: notePath });
} else if (command === "convertNoteToAttachment") {
if (!(await dialogService.confirm(t("tree-context-menu.convert-to-attachment-confirm")))) {
return;
@@ -332,11 +349,11 @@ export default class TreeContextMenu implements SelectMenuItemEventListener<Tree
toastService.showMessage(t("tree-context-menu.converted-to-attachments", { count: converted }));
} else if (command === "copyNotePathToClipboard") {
navigator.clipboard.writeText("#" + notePath);
navigator.clipboard.writeText(`#${ notePath}`);
} else if (command) {
this.treeWidget.triggerCommand<TreeCommandNames>(command, {
node: this.node,
notePath: notePath,
notePath,
noteId: this.node.data.noteId,
selectedOrActiveBranchIds: this.treeWidget.getSelectedOrActiveBranchIds(this.node),
selectedOrActiveNoteIds: this.treeWidget.getSelectedOrActiveNoteIds(this.node)

View File

@@ -1,9 +1,9 @@
import appContext from "./components/app_context.js";
import noteAutocompleteService from "./services/note_autocomplete.js";
import glob from "./services/glob.js";
import "boxicons/css/boxicons.min.css";
import "autocomplete.js/index_jquery.js";
import appContext from "./components/app_context.js";
import glob from "./services/glob.js";
import noteAutocompleteService from "./services/note_autocomplete.js";
glob.setupGlobs();
await appContext.earlyInit();

View File

@@ -1,17 +1,25 @@
import FNote from "./entities/fnote";
import { render } from "preact";
import { CustomNoteList, useNoteViewType } from "./widgets/collections/NoteList";
import { useCallback, useLayoutEffect, useRef } from "preact/hooks";
import FNote from "./entities/fnote";
import content_renderer from "./services/content_renderer";
import { dynamicRequire, isElectron } from "./services/utils";
import { applyInlineMermaid } from "./services/content_renderer_text";
import { dynamicRequire, isElectron } from "./services/utils";
import { CustomNoteList, useNoteViewType } from "./widgets/collections/NoteList";
interface RendererProps {
note: FNote;
onReady: () => void;
onReady: (data: PrintReport) => void;
onProgressChanged?: (progress: number) => void;
}
export type PrintReport = {
type: "single-note";
} | {
type: "collection";
ignoredNoteIds: string[];
};
async function main() {
const notePath = window.location.hash.substring(1);
const noteId = notePath.split("/").at(-1);
@@ -34,15 +42,17 @@ function App({ note, noteId }: { note: FNote | null | undefined, noteId: string
window.dispatchEvent(new CustomEvent("note-load-progress", { detail: { progress } }));
}
}, []);
const onReady = useCallback(() => {
const onReady = useCallback((printReport: PrintReport) => {
if (sentReadyEvent.current) return;
window.dispatchEvent(new Event("note-ready"));
window._noteReady = true;
window.dispatchEvent(new CustomEvent("note-ready", {
detail: printReport
}));
window._noteReady = printReport;
sentReadyEvent.current = true;
}, []);
const props: RendererProps | undefined | null = note && { note, onReady, onProgressChanged };
if (!note || !props) return <Error404 noteId={noteId} />
if (!note || !props) return <Error404 noteId={noteId} />;
useLayoutEffect(() => {
document.body.dataset.noteType = note.type;
@@ -51,8 +61,8 @@ function App({ note, noteId }: { note: FNote | null | undefined, noteId: string
return (
<>
{note.type === "book"
? <CollectionRenderer {...props} />
: <SingleNoteRenderer {...props} />
? <CollectionRenderer {...props} />
: <SingleNoteRenderer {...props} />
}
</>
);
@@ -91,7 +101,9 @@ function SingleNoteRenderer({ note, onReady }: RendererProps) {
await loadCustomCss(note);
}
load().then(() => requestAnimationFrame(onReady))
load().then(() => requestAnimationFrame(() => onReady({
type: "single-note"
})));
}, [ note ]);
return <>
@@ -110,9 +122,9 @@ function CollectionRenderer({ note, onReady, onProgressChanged }: RendererProps)
ntxId="print"
highlightedTokens={null}
media="print"
onReady={async () => {
onReady={async (data: PrintReport) => {
await loadCustomCss(note);
onReady();
onReady(data);
}}
onProgressChanged={onProgressChanged}
/>;
@@ -124,12 +136,12 @@ function Error404({ noteId }: { noteId: string }) {
<p>The note you are trying to print could not be found.</p>
<small>{noteId}</small>
</main>
)
);
}
async function loadCustomCss(note: FNote) {
const printCssNotes = await note.getRelationTargets("printCss");
let loadPromises: JQueryPromise<void>[] = [];
const loadPromises: JQueryPromise<void>[] = [];
for (const printCssNote of printCssNotes) {
if (!printCssNote || (printCssNote.type !== "code" && printCssNote.mime !== "text/css")) continue;

View File

@@ -0,0 +1,139 @@
import { beforeEach, describe, expect, it, vi } from "vitest";
import { buildNote } from "../test/easy-froca";
import { setBooleanWithInheritance } from "./attributes";
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));
describe("Set boolean with inheritance", () => {
beforeEach(() => {
vi.clearAllMocks();
});
it("doesn't call server if value matches directly", async () => {
const noteWithLabel = buildNote({
title: "New note",
"#foo": ""
});
const noteWithoutLabel = buildNote({
title: "New note"
});
await setBooleanWithInheritance(noteWithLabel, "foo", true);
await setBooleanWithInheritance(noteWithoutLabel, "foo", false);
expect(server.put).not.toHaveBeenCalled();
expect(server.remove).not.toHaveBeenCalled();
});
it("sets boolean normally without inheritance", async () => {
const standaloneNote = buildNote({
title: "New note"
});
await setBooleanWithInheritance(standaloneNote, "foo", true);
expect(server.put).toHaveBeenCalledWith(`notes/${standaloneNote.noteId}/set-attribute`, {
type: "label",
name: "foo",
value: "",
isInheritable: false
});
});
it("removes boolean normally without inheritance", async () => {
const standaloneNote = buildNote({
title: "New note",
"#foo": ""
});
const attributeId = standaloneNote.getLabel("foo")!.attributeId;
await setBooleanWithInheritance(standaloneNote, "foo", false);
expect(server.remove).toHaveBeenCalledWith(`notes/${standaloneNote.noteId}/attributes/${attributeId}`);
});
it("doesn't call server if value matches inherited", async () => {
const parentNote = buildNote({
title: "Parent note",
"#foo(inheritable)": "",
"children": [
{
title: "Child note"
}
]
});
const childNote = froca.getNoteFromCache(parentNote.children[0])!;
expect(childNote.isLabelTruthy("foo")).toBe(true);
await setBooleanWithInheritance(childNote, "foo", true);
expect(server.put).not.toHaveBeenCalled();
expect(server.remove).not.toHaveBeenCalled();
});
it("overrides boolean with inheritance", async () => {
const parentNote = buildNote({
title: "Parent note",
"#foo(inheritable)": "",
"children": [
{
title: "Child note"
}
]
});
const childNote = froca.getNoteFromCache(parentNote.children[0])!;
expect(childNote.isLabelTruthy("foo")).toBe(true);
await setBooleanWithInheritance(childNote, "foo", false);
expect(server.put).toHaveBeenCalledWith(`notes/${childNote.noteId}/set-attribute`, {
type: "label",
name: "foo",
value: "false",
isInheritable: false
});
});
it("overrides boolean with inherited false", async () => {
const parentNote = buildNote({
title: "Parent note",
"#foo(inheritable)": "false",
"children": [
{
title: "Child note"
}
]
});
const childNote = froca.getNoteFromCache(parentNote.children[0])!;
expect(childNote.isLabelTruthy("foo")).toBe(false);
await setBooleanWithInheritance(childNote, "foo", true);
expect(server.put).toHaveBeenCalledWith(`notes/${childNote.noteId}/set-attribute`, {
type: "label",
name: "foo",
value: "",
isInheritable: false
});
});
it("deletes override boolean with inherited false with already existing value", async () => {
const parentNote = buildNote({
title: "Parent note",
"#foo(inheritable)": "false",
"children": [
{
title: "Child note",
"#foo": "false",
}
]
});
const childNote = froca.getNoteFromCache(parentNote.children[0])!;
expect(childNote.isLabelTruthy("foo")).toBe(false);
await setBooleanWithInheritance(childNote, "foo", true);
expect(server.put).toBeCalledWith(`notes/${childNote.noteId}/set-attribute`, {
type: "label",
name: "foo",
value: "",
isInheritable: false
});
});
});

View File

@@ -1,14 +1,15 @@
import server from "./server.js";
import froca from "./froca.js";
import type FNote from "../entities/fnote.js";
import type { AttributeRow } from "./load_results.js";
import { AttributeType } from "@triliumnext/commons";
import type FNote from "../entities/fnote.js";
import froca from "./froca.js";
import type { AttributeRow } from "./load_results.js";
import server from "./server.js";
async function addLabel(noteId: string, name: string, value: string = "", isInheritable = false) {
await server.put(`notes/${noteId}/attribute`, {
type: "label",
name: name,
value: value,
name,
value,
isInheritable
});
}
@@ -16,8 +17,8 @@ async function addLabel(noteId: string, name: string, value: string = "", isInhe
export async function setLabel(noteId: string, name: string, value: string = "", isInheritable = false) {
await server.put(`notes/${noteId}/set-attribute`, {
type: "label",
name: name,
value: value,
name,
value,
isInheritable
});
}
@@ -25,12 +26,42 @@ export async function setLabel(noteId: string, name: string, value: string = "",
export async function setRelation(noteId: string, name: string, value: string = "", isInheritable = false) {
await server.put(`notes/${noteId}/set-attribute`, {
type: "relation",
name: name,
value: value,
name,
value,
isInheritable
});
}
/**
* Sets a boolean label on the given note, taking inheritance into account. If the desired value matches the inherited
* value, any owned label will be removed to allow the inherited value to take effect. If the desired value differs
* from the inherited value, an owned label will be created or updated to reflect the desired value.
*
* When checking if the boolean value is set, don't use `note.hasLabel`; instead use `note.isLabelTruthy`.
*
* @param note the note on which to set the boolean label.
* @param labelName the name of the label to set.
* @param value the boolean value to set for the label.
*/
export async function setBooleanWithInheritance(note: FNote, labelName: string, value: boolean) {
const actualValue = note.isLabelTruthy(labelName);
if (actualValue === value) return;
const hasInheritedValue = !note.hasOwnedLabel(labelName) && note.hasLabel(labelName);
if (hasInheritedValue) {
if (value) {
setLabel(note.noteId, labelName, "");
} else {
// Label is inherited - override to false.
setLabel(note.noteId, labelName, "false");
}
} else if (value) {
setLabel(note.noteId, labelName, "");
} else {
removeOwnedLabelByName(note, labelName);
}
}
async function removeAttributeById(noteId: string, attributeId: string) {
await server.remove(`notes/${noteId}/attributes/${attributeId}`);
}
@@ -142,6 +173,7 @@ export default {
setLabel,
setRelation,
setAttribute,
setBooleanWithInheritance,
removeAttributeById,
removeOwnedLabelByName,
removeOwnedRelationByName,

View File

@@ -1,12 +1,12 @@
import utils from "./utils.js";
import server from "./server.js";
import toastService, { type ToastOptionsWithRequiredId } from "./toast.js";
import appContext from "../components/app_context.js";
import type { ResolveOptions } from "../widgets/dialogs/delete_notes.js";
import froca from "./froca.js";
import hoistedNoteService from "./hoisted_note.js";
import ws from "./ws.js";
import appContext from "../components/app_context.js";
import { t } from "./i18n.js";
import type { ResolveOptions } from "../widgets/dialogs/delete_notes.js";
import server from "./server.js";
import toastService, { type ToastOptionsWithRequiredId } from "./toast.js";
import utils from "./utils.js";
import ws from "./ws.js";
// TODO: Deduplicate type with server
interface Response {
@@ -66,7 +66,7 @@ async function moveAfterBranch(branchIdsToMove: string[], afterBranchId: string)
}
}
async function moveToParentNote(branchIdsToMove: string[], newParentBranchId: string) {
async function moveToParentNote(branchIdsToMove: string[], newParentBranchId: string, componentId?: string) {
const newParentBranch = froca.getBranch(newParentBranchId);
if (!newParentBranch) {
return;
@@ -86,7 +86,7 @@ async function moveToParentNote(branchIdsToMove: string[], newParentBranchId: st
continue;
}
const resp = await server.put<Response>(`branches/${branchIdToMove}/move-to/${newParentBranchId}`);
const resp = await server.put<Response>(`branches/${branchIdToMove}/move-to/${newParentBranchId}`, undefined, componentId);
if (!resp.success) {
toastService.showError(resp.message);

View File

@@ -1,10 +1,15 @@
import { h, VNode } from "preact";
import BasicWidget, { ReactWrappedWidget } from "../widgets/basic_widget.js";
import RightPanelWidget from "../widgets/right_panel_widget.js";
import froca from "./froca.js";
import type { Entity } from "./frontend_script_api.js";
import { WidgetDefinitionWithType } from "./frontend_script_api_preact.js";
import { t } from "./i18n.js";
import ScriptContext from "./script_context.js";
import server from "./server.js";
import toastService, { showError } from "./toast.js";
import froca from "./froca.js";
import utils from "./utils.js";
import { t } from "./i18n.js";
import type { Entity } from "./frontend_script_api.js";
import toastService, { showErrorForScriptNote } from "./toast.js";
import utils, { getErrorMessage } from "./utils.js";
// TODO: Deduplicate with server.
export interface Bundle {
@@ -14,9 +19,13 @@ export interface Bundle {
allNoteIds: string[];
}
interface Widget {
type LegacyWidget = (BasicWidget | RightPanelWidget) & {
parentWidget?: string;
}
};
type WithNoteId<T> = T & {
_noteId: string;
};
export type Widget = WithNoteId<(LegacyWidget | WidgetDefinitionWithType)>;
async function getAndExecuteBundle(noteId: string, originEntity = null, script = null, params = null) {
const bundle = await server.post<Bundle>(`script/bundle/${noteId}`, {
@@ -27,6 +36,8 @@ async function getAndExecuteBundle(noteId: string, originEntity = null, script =
return await executeBundle(bundle, originEntity);
}
export type ParentName = "left-pane" | "center-pane" | "note-detail-pane" | "right-pane";
export async function executeBundle(bundle: Bundle, originEntity?: Entity | null, $container?: JQuery<HTMLElement>) {
const apiContext = await ScriptContext(bundle.noteId, bundle.allNoteIds, originEntity, $container);
@@ -35,24 +46,14 @@ export async function executeBundle(bundle: Bundle, originEntity?: Entity | null
return eval(`const apiContext = this; (async function() { ${bundle.script}\r\n})()`);
}.call(apiContext);
} catch (e: any) {
const note = await froca.getNote(bundle.noteId);
toastService.showPersistent({
id: `custom-script-failure-${note?.noteId}`,
title: t("toast.bundle-error.title"),
icon: "bx bx-error-circle",
message: t("toast.bundle-error.message", {
id: note?.noteId,
title: note?.title,
message: e.message
})
});
showErrorForScriptNote(bundle.noteId, t("toast.bundle-error.message", { message: e.message }));
logError("Widget initialization failed: ", e);
}
}
async function executeStartupBundles() {
const isMobile = utils.isMobile();
const scriptBundles = await server.get<Bundle[]>("script/startup" + (isMobile ? "?mobile=true" : ""));
const scriptBundles = await server.get<Bundle[]>(`script/startup${ isMobile ? "?mobile=true" : ""}`);
for (const bundle of scriptBundles) {
await executeBundle(bundle);
@@ -60,68 +61,99 @@ async function executeStartupBundles() {
}
export class WidgetsByParent {
private byParent: Record<string, Widget[]>;
private legacyWidgets: Record<string, WithNoteId<LegacyWidget>[]>;
private preactWidgets: Record<string, WithNoteId<WidgetDefinitionWithType>[]>;
constructor() {
this.byParent = {};
this.legacyWidgets = {};
this.preactWidgets = {};
}
add(widget: Widget) {
if (!widget.parentWidget) {
console.log(`Custom widget does not have mandatory 'parentWidget' property defined`);
return;
let hasParentWidget = false;
let isPreact = false;
if ("type" in widget && widget.type === "preact-widget") {
// React-based script.
const reactWidget = widget as WithNoteId<WidgetDefinitionWithType>;
this.preactWidgets[reactWidget.parent] = this.preactWidgets[reactWidget.parent] || [];
this.preactWidgets[reactWidget.parent].push(reactWidget);
isPreact = true;
hasParentWidget = !!reactWidget.parent;
} else if ("parentWidget" in widget && widget.parentWidget) {
this.legacyWidgets[widget.parentWidget] = this.legacyWidgets[widget.parentWidget] || [];
this.legacyWidgets[widget.parentWidget].push(widget);
hasParentWidget = !!widget.parentWidget;
}
this.byParent[widget.parentWidget] = this.byParent[widget.parentWidget] || [];
this.byParent[widget.parentWidget].push(widget);
if (!hasParentWidget) {
showErrorForScriptNote(widget._noteId, t("toast.widget-missing-parent", {
property: isPreact ? "parent" : "parentWidget"
}));
}
}
get(parentName: string) {
if (!this.byParent[parentName]) {
return [];
get(parentName: ParentName) {
const widgets: (BasicWidget | VNode)[] = this.getLegacyWidgets(parentName);
for (const preactWidget of this.getPreactWidgets(parentName)) {
const el = h(preactWidget.render, {});
const widget = new ReactWrappedWidget(el);
widget.contentSized();
if (preactWidget.position) {
widget.position = preactWidget.position;
}
widgets.push(widget);
}
return widgets;
}
getLegacyWidgets(parentName: ParentName): (BasicWidget | RightPanelWidget)[] {
if (!this.legacyWidgets[parentName]) return [];
return (
this.byParent[parentName]
this.legacyWidgets[parentName]
// previously, custom widgets were provided as a single instance, but that has the disadvantage
// for splits where we actually need multiple instaces and thus having a class to instantiate is better
// https://github.com/zadam/trilium/issues/4274
.map((w: any) => (w.prototype ? new w() : w))
);
}
getPreactWidgets(parentName: ParentName) {
return this.preactWidgets[parentName] ?? [];
}
}
async function getWidgetBundlesByParent() {
const scriptBundles = await server.get<Bundle[]>("script/widgets");
const widgetsByParent = new WidgetsByParent();
for (const bundle of scriptBundles) {
let widget;
try {
const scriptBundles = await server.get<Bundle[]>("script/widgets");
try {
widget = await executeBundle(bundle);
if (widget) {
widget._noteId = bundle.noteId;
widgetsByParent.add(widget);
for (const bundle of scriptBundles) {
let widget;
try {
widget = await executeBundle(bundle);
if (widget) {
widget._noteId = bundle.noteId;
widgetsByParent.add(widget);
}
} catch (e: any) {
const noteId = bundle.noteId;
showErrorForScriptNote(noteId, t("toast.bundle-error.message", { message: e.message }));
logError("Widget initialization failed: ", e);
continue;
}
} catch (e: any) {
const noteId = bundle.noteId;
const note = await froca.getNote(noteId);
toastService.showPersistent({
id: `custom-script-failure-${noteId}`,
title: t("toast.bundle-error.title"),
icon: "bx bx-error-circle",
message: t("toast.bundle-error.message", {
id: noteId,
title: note?.title,
message: e.message
})
});
logError("Widget initialization failed: ", e);
continue;
}
} catch (e) {
toastService.showPersistent({
id: `custom-widget-list-failure`,
title: t("toast.widget-list-error.title"),
message: getErrorMessage(e),
icon: "bx bx-error-circle"
});
}
return widgetsByParent;

View File

@@ -1,18 +1,19 @@
import renderService from "./render.js";
import { normalizeMimeTypeForCKEditor } from "@triliumnext/commons";
import WheelZoom from 'vanilla-js-wheel-zoom';
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 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 openService from "./open.js";
import utils from "./utils.js";
import FNote from "../entities/fnote.js";
import FAttachment from "../entities/fattachment.js";
import imageContextMenuService from "../menus/image_context_menu.js";
import renderService from "./render.js";
import { applySingleBlockSyntaxHighlight } from "./syntax_highlight.js";
import { loadElkIfNeeded, postprocessMermaidSvg } from "./mermaid.js";
import renderDoc from "./doc_renderer.js";
import { t } from "../services/i18n.js";
import WheelZoom from 'vanilla-js-wheel-zoom';
import { normalizeMimeTypeForCKEditor } from "@triliumnext/commons";
import renderText from "./content_renderer_text.js";
import utils from "./utils.js";
let idCounter = 1;
@@ -22,6 +23,12 @@ export interface RenderOptions {
imageHasZoom?: boolean;
/** If enabled, it will prevent the default behavior in which an empty note would display a list of children. */
noChildrenList?: boolean;
/** If enabled, it will prevent rendering of included notes. */
noIncludedNotes?: boolean;
/** If enabled, it will include archived notes when rendering children list. */
includeArchivedNotes?: boolean;
/** Set of note IDs that have already been seen during rendering to prevent infinite recursion. */
seenNoteIds?: Set<string>;
}
const CODE_MIME_TYPES = new Set(["application/json"]);
@@ -152,7 +159,7 @@ function renderImage(entity: FNote | FAttachment, $renderedContent: JQuery<HTMLE
const $img = $("<img>")
.attr("src", url || "")
.attr("id", "attachment-image-" + idCounter++)
.attr("id", `attachment-image-${idCounter++}`)
.css("max-width", "100%");
$renderedContent.append($img);
@@ -193,7 +200,7 @@ function renderFile(entity: FNote | FAttachment, type: string, $renderedContent:
if (type === "pdf") {
const $pdfPreview = $('<iframe class="pdf-preview" style="width: 100%; flex-grow: 100;"></iframe>');
$pdfPreview.attr("src", openService.getUrlForDownload(`api/${entityType}/${entityId}/open`));
$pdfPreview.attr("src", openService.getUrlForDownload(`pdfjs/web/viewer.html?file=../../api/${entityType}/${entityId}/open`));
$content.append($pdfPreview);
} else if (type === "audio") {
@@ -217,28 +224,28 @@ function renderFile(entity: FNote | FAttachment, type: string, $renderedContent:
// in attachment list
const $downloadButton = $(`
<button class="file-download btn btn-primary" type="button">
<span class="bx bx-download"></span>
<span class="tn-icon bx bx-download"></span>
${t("file_properties.download")}
</button>
`);
const $openButton = $(`
<button class="file-open btn btn-primary" type="button">
<span class="bx bx-link-external"></span>
<span class="tn-icon bx bx-link-external"></span>
${t("file_properties.open")}
</button>
`);
$downloadButton.on("click", (e) => {
e.stopPropagation();
openService.downloadFileNote(entity.noteId)
openService.downloadFileNote(entity, null, null);
});
$openButton.on("click", async (e) => {
const iconEl = $openButton.find("> .bx");
iconEl.removeClass("bx bx-link-external");
iconEl.addClass("bx bx-loader spin");
e.stopPropagation();
await openService.openNoteExternally(entity.noteId, entity.mime)
await openService.openNoteExternally(entity.noteId, entity.mime);
iconEl.removeClass("bx bx-loader spin");
iconEl.addClass("bx bx-link-external");
});
@@ -266,7 +273,7 @@ async function renderMermaid(note: FNote | FAttachment, $renderedContent: JQuery
try {
await loadElkIfNeeded(mermaid, content);
const { svg } = await mermaid.mermaidAPI.render("in-mermaid-graph-" + idCounter++, content);
const { svg } = await mermaid.mermaidAPI.render(`in-mermaid-graph-${idCounter++}`, content);
$renderedContent.append($(postprocessMermaidSvg(svg)));
} catch (e) {

View File

@@ -0,0 +1,132 @@
import { trimIndentation } from "@triliumnext/commons";
import { describe, expect, it } from "vitest";
import { buildNote } from "../test/easy-froca";
import renderText from "./content_renderer_text";
describe("Text content renderer", () => {
it("renders included note", async () => {
const contentEl = document.createElement("div");
const includedNote = buildNote({
title: "Included note",
content: "<p>This is the included note.</p>"
});
const note = buildNote({
title: "New note",
content: trimIndentation`
<p>
Hi there
</p>
<section class="include-note" data-note-id="${includedNote.noteId}" data-box-size="medium">
&nbsp;
</section>
`
});
await renderText(note, $(contentEl));
expect(contentEl.querySelectorAll("section.include-note").length).toBe(1);
expect(contentEl.querySelectorAll("section.include-note p").length).toBe(1);
});
it("skips rendering included note", async () => {
const contentEl = document.createElement("div");
const includedNote = buildNote({
title: "Included note",
content: "<p>This is the included note.</p>"
});
const note = buildNote({
title: "New note",
content: trimIndentation`
<p>
Hi there
</p>
<section class="include-note" data-note-id="${includedNote.noteId}" data-box-size="medium">
&nbsp;
</section>
`
});
await renderText(note, $(contentEl), { noIncludedNotes: true });
expect(contentEl.querySelectorAll("section.include-note").length).toBe(0);
});
it("doesn't enter infinite loop on direct recursion", async () => {
const contentEl = document.createElement("div");
const note = buildNote({
title: "New note",
id: "Y7mBwmRjQyb4",
content: trimIndentation`
<p>
Hi there
</p>
<section class="include-note" data-note-id="Y7mBwmRjQyb4" data-box-size="medium">
&nbsp;
</section>
<section class="include-note" data-note-id="Y7mBwmRjQyb4" data-box-size="medium">
&nbsp;
</section>
`
});
await renderText(note, $(contentEl));
expect(contentEl.querySelectorAll("section.include-note").length).toBe(0);
});
it("doesn't enter infinite loop on indirect recursion", async () => {
const contentEl = document.createElement("div");
buildNote({
id: "first",
title: "Included note",
content: trimIndentation`\
<p>This is the included note.</p>
<section class="include-note" data-note-id="second" data-box-size="medium">
&nbsp;
</section>
`
});
const note = buildNote({
id: "second",
title: "New note",
content: trimIndentation`
<p>
Hi there
</p>
<section class="include-note" data-note-id="first" data-box-size="medium">
&nbsp;
</section>
`
});
await renderText(note, $(contentEl));
expect(contentEl.querySelectorAll("section.include-note").length).toBe(1);
});
it("renders children list when note is empty", async () => {
const contentEl = document.createElement("div");
const parentNote = buildNote({
title: "Parent note",
children: [
{ title: "Child note 1" },
{ title: "Child note 2" }
]
});
await renderText(parentNote, $(contentEl));
const items = contentEl.querySelectorAll("a");
expect(items.length).toBe(2);
expect(items[0].textContent).toBe("Child note 1");
expect(items[1].textContent).toBe("Child note 2");
});
it("skips archived notes in children list", async () => {
const contentEl = document.createElement("div");
const parentNote = buildNote({
title: "Parent note",
children: [
{ title: "Child note 1" },
{ title: "Child note 2", "#archived": "" },
{ title: "Child note 3" }
]
});
await renderText(parentNote, $(contentEl));
const items = contentEl.querySelectorAll("a");
expect(items.length).toBe(2);
expect(items[0].textContent).toBe("Child note 1");
expect(items[1].textContent).toBe("Child note 3");
});
});

View File

@@ -1,13 +1,13 @@
import { formatCodeBlocks } from "./syntax_highlight.js";
import { getMermaidConfig } from "./mermaid.js";
import { renderMathInElement } from "./math.js";
import FNote from "../entities/fnote.js";
import FAttachment from "../entities/fattachment.js";
import tree from "./tree.js";
import FNote from "../entities/fnote.js";
import { default as content_renderer, type RenderOptions } from "./content_renderer.js";
import froca from "./froca.js";
import link from "./link.js";
import { renderMathInElement } from "./math.js";
import { getMermaidConfig } from "./mermaid.js";
import { formatCodeBlocks } from "./syntax_highlight.js";
import tree from "./tree.js";
import { isHtmlEmpty } from "./utils.js";
import { default as content_renderer, type RenderOptions } from "./content_renderer.js";
export default async function renderText(note: FNote | FAttachment, $renderedContent: JQuery<HTMLElement>, options: RenderOptions = {}) {
// entity must be FNote
@@ -15,29 +15,38 @@ export default async function renderText(note: FNote | FAttachment, $renderedCon
if (blob && !isHtmlEmpty(blob.content)) {
$renderedContent.append($('<div class="ck-content">').html(blob.content));
await renderIncludedNotes($renderedContent[0]);
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("a.reference-link");
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) {
await link.loadReferenceLinkTitle($(el));
const innerSpan = document.createElement("span");
await link.loadReferenceLinkTitle($(innerSpan), el.href);
el.replaceChildren(innerSpan);
}
await rewriteMermaidDiagramsInContainer($renderedContent[0] as HTMLDivElement);
await formatCodeBlocks($renderedContent);
} else if (note instanceof FNote && !options.noChildrenList) {
await renderChildrenList($renderedContent, note);
await renderChildrenList($renderedContent, note, options.includeArchivedNotes ?? false);
}
}
async function renderIncludedNotes(contentEl: HTMLElement) {
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");
@@ -64,7 +73,15 @@ async function renderIncludedNotes(contentEl: HTMLElement) {
continue;
}
const renderedContent = (await content_renderer.getRenderedContent(note)).$renderedContent;
if (seenNoteIds.has(noteId)) {
console.warn(`Skipping inclusion of ${noteId} to avoid circular reference.`);
includeNoteEl.remove();
continue;
}
const renderedContent = (await content_renderer.getRenderedContent(note, {
seenNoteIds
})).$renderedContent;
includeNoteEl.replaceChildren(...renderedContent);
}
}
@@ -96,7 +113,7 @@ export async function applyInlineMermaid(container: HTMLDivElement) {
}
}
async function renderChildrenList($renderedContent: JQuery<HTMLElement>, note: FNote) {
async function renderChildrenList($renderedContent: JQuery<HTMLElement>, note: FNote, includeArchivedNotes: boolean) {
let childNoteIds = note.getChildNoteIds();
if (!childNoteIds.length) {
@@ -106,14 +123,16 @@ async function renderChildrenList($renderedContent: JQuery<HTMLElement>, note: F
$renderedContent.css("padding", "10px");
$renderedContent.addClass("text-with-ellipsis");
// just load the first 10 child notes
if (childNoteIds.length > 10) {
childNoteIds = childNoteIds.slice(0, 10);
}
// just load the first 10 child notes
const childNotes = await froca.getNotes(childNoteIds);
for (const childNote of childNotes) {
if (childNote.isArchived && !includeArchivedNotes) continue;
$renderedContent.append(
await link.createLink(`${note.noteId}/${childNote.noteId}`, {
showTooltip: false,

View File

@@ -0,0 +1,14 @@
import { describe, expect, it } from "vitest";
import { getReadableTextColor } from "./css_class_manager";
describe("getReadableTextColor", () => {
it("doesn't crash for invalid color", () => {
expect(getReadableTextColor("RandomColor")).toBe("#000");
});
it("tolerates different casing", () => {
expect(getReadableTextColor("Blue"))
.toBe(getReadableTextColor("blue"));
});
});

View File

@@ -1,21 +1,22 @@
import clsx from "clsx";
import {readCssVar} from "../utils/css-var";
import Color, { ColorInstance } from "color";
import {readCssVar} from "../utils/css-var";
const registeredClasses = new Set<string>();
const colorsWithHue = new Set<string>();
// Read the color lightness limits defined in the theme as CSS variables
const lightThemeColorMaxLightness = readCssVar(
document.documentElement,
"tree-item-light-theme-max-color-lightness"
).asNumber(70);
document.documentElement,
"tree-item-light-theme-max-color-lightness"
).asNumber(70);
const darkThemeColorMinLightness = readCssVar(
document.documentElement,
"tree-item-dark-theme-min-color-lightness"
).asNumber(50);
document.documentElement,
"tree-item-dark-theme-min-color-lightness"
).asNumber(50);
function createClassForColor(colorString: string | null) {
if (!colorString?.trim()) return "";
@@ -27,7 +28,7 @@ function createClassForColor(colorString: string | null) {
if (!registeredClasses.has(className)) {
const adjustedColor = adjustColorLightness(color, lightThemeColorMaxLightness!,
darkThemeColorMinLightness!);
darkThemeColorMinLightness!);
const hue = getHue(color);
$("head").append(`<style>
@@ -50,7 +51,7 @@ function createClassForColor(colorString: string | null) {
function parseColor(color: string) {
try {
return Color(color);
return Color(color.toLowerCase());
} catch (ex) {
console.error(ex);
}
@@ -84,8 +85,8 @@ function getHue(color: ColorInstance) {
}
export function getReadableTextColor(bgColor: string) {
const colorInstance = Color(bgColor);
return colorInstance.isLight() ? "#000" : "#fff";
const colorInstance = parseColor(bgColor);
return !colorInstance || colorInstance?.isLight() ? "#000" : "#fff";
}
export default {

View File

@@ -0,0 +1,60 @@
import { t } from "./i18n";
import options from "./options";
export interface ExperimentalFeature {
id: string;
name: string;
description: string;
}
export const experimentalFeatures = [
{
id: "new-layout",
name: t("experimental_features.new_layout_name"),
description: t("experimental_features.new_layout_description"),
}
] as const satisfies ExperimentalFeature[];
export type ExperimentalFeatureId = typeof experimentalFeatures[number]["id"];
let enabledFeatures: Set<ExperimentalFeatureId> | null = null;
export function isExperimentalFeatureEnabled(featureId: ExperimentalFeatureId): boolean {
if (featureId === "new-layout") {
return options.is("newLayout");
}
return getEnabledFeatures().has(featureId);
}
export function getEnabledExperimentalFeatureIds() {
const values = [ ...getEnabledFeatures().values() ];
if (options.is("newLayout")) {
values.push("new-layout");
}
return values;
}
export async function toggleExperimentalFeature(featureId: ExperimentalFeatureId, enable: boolean) {
const features = new Set(getEnabledFeatures());
if (enable) {
features.add(featureId);
} else {
features.delete(featureId);
}
await options.save("experimentalFeatures", JSON.stringify(Array.from(features)));
}
function getEnabledFeatures() {
if (!enabledFeatures) {
let features: ExperimentalFeatureId[] = [];
try {
features = JSON.parse(options.get("experimentalFeatures")) as ExperimentalFeatureId[];
} catch (e) {
console.warn("Failed to parse experimental features from options:", e);
}
enabledFeatures = new Set(features);
enabledFeatures.delete("new-layout"); // handled separately.
}
return enabledFeatures;
}

View File

@@ -27,10 +27,6 @@ async function processEntityChanges(entityChanges: EntityChange[]) {
loadResults.addRevision(ec.entityId, ec.noteId, ec.componentId);
} else if (ec.entityName === "options") {
const attributeEntity = ec.entity as FAttributeRow;
if (attributeEntity.name === "openNoteContexts") {
continue; // only noise
}
options.set(attributeEntity.name as OptionNames, attributeEntity.value);
loadResults.addOption(attributeEntity.name as OptionNames);
} else if (ec.entityName === "attachments") {

View File

@@ -1,26 +1,27 @@
import server from "./server.js";
import utils from "./utils.js";
import toastService from "./toast.js";
import linkService from "./link.js";
import { dayjs, formatLogMessage } from "@triliumnext/commons";
import appContext from "../components/app_context.js";
import type Component from "../components/component.js";
import type NoteContext from "../components/note_context.js";
import type FNote from "../entities/fnote.js";
import BasicWidget, { ReactWrappedWidget } from "../widgets/basic_widget.js";
import NoteContextAwareWidget from "../widgets/note_context_aware_widget.js";
import RightPanelWidget from "../widgets/right_panel_widget.js";
import dateNotesService from "./date_notes.js";
import dialogService from "./dialog.js";
import froca from "./froca.js";
import { preactAPI } from "./frontend_script_api_preact.js";
import { t } from "./i18n.js";
import linkService from "./link.js";
import noteTooltipService from "./note_tooltip.js";
import protectedSessionService from "./protected_session.js";
import dateNotesService from "./date_notes.js";
import searchService from "./search.js";
import RightPanelWidget from "../widgets/right_panel_widget.js";
import ws from "./ws.js";
import appContext from "../components/app_context.js";
import NoteContextAwareWidget from "../widgets/note_context_aware_widget.js";
import BasicWidget, { ReactWrappedWidget } from "../widgets/basic_widget.js";
import SpacedUpdate from "./spaced_update.js";
import server from "./server.js";
import shortcutService from "./shortcuts.js";
import dialogService from "./dialog.js";
import type FNote from "../entities/fnote.js";
import { t } from "./i18n.js";
import { dayjs } from "@triliumnext/commons";
import type NoteContext from "../components/note_context.js";
import type Component from "../components/component.js";
import { formatLogMessage } from "@triliumnext/commons";
import SpacedUpdate from "./spaced_update.js";
import toastService from "./toast.js";
import utils from "./utils.js";
import ws from "./ws.js";
/**
* A whole number
@@ -464,6 +465,8 @@ export interface Api {
* Log given message to the log pane in UI
*/
log(message: string | object): void;
preact: typeof preactAPI;
}
/**
@@ -533,9 +536,8 @@ function FrontendScriptApi(this: Api, startNote: FNote, currentNote: FNote, orig
return params.map((p) => {
if (typeof p === "function") {
return `!@#Function: ${p.toString()}`;
} else {
return p;
}
return p;
});
}
@@ -562,9 +564,8 @@ function FrontendScriptApi(this: Api, startNote: FNote, currentNote: FNote, orig
await ws.waitForMaxKnownEntityChangeId();
return ret.executionResult;
} else {
throw new Error(`server error: ${ret.error}`);
}
throw new Error(`server error: ${ret.error}`);
};
this.runOnBackend = async (func, params = []) => {
@@ -721,6 +722,8 @@ function FrontendScriptApi(this: Api, startNote: FNote, currentNote: FNote, orig
this.logMessages[noteId].push(message);
this.logSpacedUpdates[noteId].scheduleUpdate();
};
this.preact = preactAPI;
}
export default FrontendScriptApi as any as {

View File

@@ -0,0 +1,101 @@
import { Fragment, h, VNode } from "preact";
import * as hooks from "preact/hooks";
import ActionButton from "../widgets/react/ActionButton";
import Admonition from "../widgets/react/Admonition";
import Button from "../widgets/react/Button";
import CKEditor from "../widgets/react/CKEditor";
import Collapsible from "../widgets/react/Collapsible";
import Dropdown from "../widgets/react/Dropdown";
import FormCheckbox from "../widgets/react/FormCheckbox";
import FormDropdownList from "../widgets/react/FormDropdownList";
import { FormFileUploadActionButton, FormFileUploadButton } from "../widgets/react/FormFileUpload";
import FormGroup from "../widgets/react/FormGroup";
import { FormDropdownDivider, FormDropdownSubmenu, FormListItem } from "../widgets/react/FormList";
import FormRadioGroup from "../widgets/react/FormRadioGroup";
import FormText from "../widgets/react/FormText";
import FormTextArea from "../widgets/react/FormTextArea";
import FormTextBox from "../widgets/react/FormTextBox";
import FormToggle from "../widgets/react/FormToggle";
import * as triliumHooks from "../widgets/react/hooks";
import Icon from "../widgets/react/Icon";
import LinkButton from "../widgets/react/LinkButton";
import LoadingSpinner from "../widgets/react/LoadingSpinner";
import Modal from "../widgets/react/Modal";
import NoteAutocomplete from "../widgets/react/NoteAutocomplete";
import NoteLink from "../widgets/react/NoteLink";
import RawHtml from "../widgets/react/RawHtml";
import Slider from "../widgets/react/Slider";
import RightPanelWidget from "../widgets/sidebar/RightPanelWidget";
export interface WidgetDefinition {
parent: "right-pane",
render: () => VNode,
position?: number,
}
export interface WidgetDefinitionWithType extends WidgetDefinition {
type: "preact-widget"
}
export interface LauncherWidgetDefinitionWithType {
type: "preact-launcher-widget"
render: () => VNode
}
export const preactAPI = Object.freeze({
// Core
h,
Fragment,
/**
* 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.
*
* @param definition the widget definition.
*/
defineWidget(definition: WidgetDefinition) {
return {
type: "preact-widget",
...definition
};
},
defineLauncherWidget(definition: Omit<LauncherWidgetDefinitionWithType, "type">) {
return {
type: "preact-launcher-widget",
...definition
};
},
// Basic widgets
ActionButton,
Admonition,
Button,
CKEditor,
Collapsible,
Dropdown,
FormCheckbox,
FormDropdownList,
FormFileUploadButton, FormFileUploadActionButton,
FormGroup,
FormListItem, FormDropdownDivider, FormDropdownSubmenu,
FormRadioGroup,
FormText,
FormTextArea,
FormTextBox,
FormToggle,
Icon,
LinkButton,
LoadingSpinner,
Modal,
NoteAutocomplete,
NoteLink,
RawHtml,
Slider,
// Specialized widgets
RightPanelWidget,
...hooks,
...triliumHooks
});

View File

@@ -1,10 +1,11 @@
import treeService from "./tree.js";
import linkContextMenuService from "../menus/link_context_menu.js";
import appContext, { type NoteCommandData } from "../components/app_context.js";
import froca from "./froca.js";
import utils from "./utils.js";
import { ALLOWED_PROTOCOLS } from "@triliumnext/commons";
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 treeService from "./tree.js";
import utils from "./utils.js";
function getNotePathFromUrl(url: string) {
const notePathMatch = /#(root[A-Za-z0-9_/]*)$/.exec(url);
@@ -27,7 +28,7 @@ async function getLinkIcon(noteId: string, viewMode: ViewMode | undefined) {
return icon;
}
export type ViewMode = "default" | "source" | "attachments" | "contextual-help";
export type ViewMode = "default" | "source" | "attachments" | "contextual-help" | "note-map";
export interface ViewScope {
/**
@@ -122,7 +123,7 @@ async function createLink(notePath: string | undefined, options: CreateLinkOptio
const $container = $("<span>");
if (showNoteIcon) {
let icon = await getLinkIcon(noteId, viewMode);
const icon = await getLinkIcon(noteId, viewMode);
if (icon) {
$container.append($("<span>").addClass(`bx ${icon}`)).append(" ");
@@ -131,7 +132,7 @@ async function createLink(notePath: string | undefined, options: CreateLinkOptio
const hash = calculateHash({
notePath,
viewScope: viewScope
viewScope
});
const $noteLink = $("<a>", {
@@ -171,11 +172,11 @@ async function createLink(notePath: string | undefined, options: CreateLinkOptio
return $container;
}
function calculateHash({ notePath, ntxId, hoistedNoteId, viewScope = {} }: NoteCommandData) {
export function calculateHash({ notePath, ntxId, hoistedNoteId, viewScope = {} }: NoteCommandData) {
notePath = notePath || "";
const params = [
ntxId ? { ntxId: ntxId } : null,
hoistedNoteId && hoistedNoteId !== "root" ? { hoistedNoteId: hoistedNoteId } : null,
ntxId ? { ntxId } : null,
hoistedNoteId && hoistedNoteId !== "root" ? { hoistedNoteId } : null,
viewScope.viewMode && viewScope.viewMode !== "default" ? { viewMode: viewScope.viewMode } : null,
viewScope.attachmentId ? { attachmentId: viewScope.attachmentId } : null
].filter((p) => !!p);
@@ -219,7 +220,7 @@ export function parseNavigationStateFromUrl(url: string | undefined) {
}
const hash = url.substr(hashIdx + 1); // strip also the initial '#'
let [notePath, paramString] = hash.split("?");
const [notePath, paramString] = hash.split("?");
const viewScope: ViewScope = {
viewMode: "default"
@@ -252,7 +253,7 @@ export function parseNavigationStateFromUrl(url: string | undefined) {
}
if (searchString) {
return { searchString }
return { searchString };
}
if (!notePath.match(/^[_a-z0-9]{4,}(\/[_a-z0-9]{4,})*$/i)) {
@@ -334,7 +335,7 @@ export function goToLinkExt(evt: MouseEvent | JQuery.ClickEvent | JQuery.MouseDo
window.open(hrefLink, "_blank");
} else {
// Enable protocols supported by CKEditor 5 to be clickable.
if (ALLOWED_PROTOCOLS.some((protocol) => hrefLink.toLowerCase().startsWith(protocol + ":"))) {
if (ALLOWED_PROTOCOLS.some((protocol) => hrefLink.toLowerCase().startsWith(`${protocol}:`))) {
if ( utils.isElectron()) {
const electron = utils.dynamicRequire("electron");
electron.shell.openExternal(hrefLink);
@@ -395,7 +396,7 @@ async function loadReferenceLinkTitle($el: JQuery<HTMLElement>, href: string | n
href = href || $link.attr("href");
if (!href) {
console.warn("Empty URL for parsing: " + $el[0].outerHTML);
console.warn(`Empty URL for parsing: ${$el[0].outerHTML}`);
return;
}
@@ -438,9 +439,9 @@ async function getReferenceLinkTitle(href: string) {
const attachment = await note.getAttachmentById(viewScope.attachmentId);
return attachment ? attachment.title : "[missing attachment]";
} else {
return note.title;
}
return note.title;
}
function getReferenceLinkTitleSync(href: string) {
@@ -462,9 +463,9 @@ function getReferenceLinkTitleSync(href: string) {
const attachment = note.attachments.find((att) => att.attachmentId === viewScope.attachmentId);
return attachment ? attachment.title : "[missing attachment]";
} else {
return note.title;
}
return note.title;
}
if (glob.device !== "print") {

View File

@@ -1,4 +1,5 @@
import type { AttachmentRow, EtapiTokenRow, NoteType, OptionNames } from "@triliumnext/commons";
import type { AttributeType } from "../entities/fattribute.js";
import type { EntityChange } from "../server_types.js";
@@ -135,7 +136,14 @@ export default class LoadResults {
}
getBranchRows() {
return this.branchRows.map((row) => this.getEntityRow("branches", row.branchId)).filter((branch) => !!branch);
return this.branchRows.map((row) => {
const branch = this.getEntityRow("branches", row.branchId);
if (branch) {
// Merge the componentId from the tracked row with the entity data
return { ...branch, componentId: row.componentId };
}
return null;
}).filter((branch) => !!branch) as BranchRow[];
}
addNoteReordering(parentNoteId: string, componentId: string) {
@@ -153,7 +161,14 @@ export default class LoadResults {
getAttributeRows(componentId = "none"): AttributeRow[] {
return this.attributeRows
.filter((row) => row.componentId !== componentId)
.map((row) => this.getEntityRow("attributes", row.attributeId))
.map((row) => {
const attr = this.getEntityRow("attributes", row.attributeId);
if (attr) {
// Merge the componentId from the tracked row with the entity data
return { ...attr, componentId: row.componentId };
}
return null;
})
.filter((attr) => !!attr) as AttributeRow[];
}

View File

@@ -1,6 +1,8 @@
import utils from "./utils.js";
import Component from "../components/component.js";
import FNote from "../entities/fnote.js";
import options from "./options.js";
import server from "./server.js";
import utils from "./utils.js";
type ExecFunction = (command: string, cb: (err: string, stdout: string, stderror: string) => void) => void;
@@ -36,9 +38,14 @@ function download(url: string) {
}
}
export function downloadFileNote(noteId: string) {
const url = `${getFileUrl("notes", noteId)}?${Date.now()}`; // don't use cache
export function downloadFileNote(note: FNote, parentComponent: Component | null, ntxId: string | null | undefined) {
if (note.type === "file" && note.mime === "application/pdf" && parentComponent) {
// Special handling, manages its own downloading process.
parentComponent.triggerEvent("customDownload", { ntxId });
return;
}
const url = `${getFileUrl("notes", note.noteId)}?${Date.now()}`; // don't use cache
download(url);
}
@@ -97,7 +104,7 @@ async function openCustom(type: string, entityId: string, mime: string) {
// Note that the path separator must be \ instead of /
filePath = filePath.replace(/\//g, "\\");
}
const command = `rundll32.exe shell32.dll,OpenAs_RunDLL ` + filePath;
const command = `rundll32.exe shell32.dll,OpenAs_RunDLL ${filePath}`;
exec(command, (err, stdout, stderr) => {
if (err) {
console.error("Open Note custom: ", err);
@@ -131,10 +138,10 @@ export function getUrlForDownload(url: string) {
if (utils.isElectron()) {
// electron needs absolute URL, so we extract current host, port, protocol
return `${getHost()}/${url}`;
} else {
// web server can be deployed on subdomain, so we need to use a relative path
return url;
}
// web server can be deployed on subdomain, so we need to use a relative path
return url;
}
function canOpenInBrowser(mime: string) {

View File

@@ -1,6 +1,10 @@
import server from "./server.js";
import bundleService, { type Bundle } from "./bundle.js";
import { h, VNode } from "preact";
import type FNote from "../entities/fnote.js";
import { renderReactWidgetAtElement } from "../widgets/react/react_utils.jsx";
import bundleService, { type Bundle } from "./bundle.js";
import froca from "./froca.js";
import server from "./server.js";
async function render(note: FNote, $el: JQuery<HTMLElement>) {
const relations = note.getRelations("renderNote");
@@ -17,12 +21,34 @@ async function render(note: FNote, $el: JQuery<HTMLElement>) {
$scriptContainer.append(bundle.html);
// async so that scripts cannot block trilium execution
bundleService.executeBundle(bundle, note, $scriptContainer);
bundleService.executeBundle(bundle, note, $scriptContainer).then(result => {
// Render JSX
if (bundle.html === "") {
renderIfJsx(bundle, result, $el);
}
});
}
return renderNoteIds.length > 0;
}
async function renderIfJsx(bundle: Bundle, result: unknown, $el: JQuery<HTMLElement>) {
// Ensure the root script note is actually a JSX.
const rootScriptNoteId = await froca.getNote(bundle.noteId);
if (rootScriptNoteId?.mime !== "text/jsx") return;
// Ensure the output is a valid el.
if (typeof result !== "function") return;
// Obtain the parent component.
const closestComponent = glob.getComponentByEl($el.closest(".component")[0]);
if (!closestComponent) return;
// Render the element.
const el = h(result as () => VNode, {});
renderReactWidgetAtElement(closestComponent, el, $el[0]);
}
export default {
render
};

View File

@@ -85,13 +85,15 @@ async function remove<T>(url: string, componentId?: string) {
return await call<T>("DELETE", url, componentId);
}
async function upload(url: string, fileToUpload: File) {
async function upload(url: string, fileToUpload: File, componentId?: string) {
const formData = new FormData();
formData.append("upload", fileToUpload);
return await $.ajax({
url: window.glob.baseApiUrl + url,
headers: await getHeaders(),
headers: await getHeaders(componentId ? {
"trilium-component-id": componentId
} : undefined),
data: formData,
type: "PUT",
timeout: 60 * 60 * 1000,
@@ -133,11 +135,11 @@ async function call<T>(method: string, url: string, componentId?: string, option
};
ipc.send("server-request", {
requestId: requestId,
headers: headers,
method: method,
requestId,
headers,
method,
url: `/${window.glob.baseApiUrl}${url}`,
data: data
data
});
})) as any;
} else {
@@ -161,7 +163,7 @@ function ajax(url: string, method: string, data: unknown, headers: Headers, sile
const options: JQueryAjaxSettings = {
url: window.glob.baseApiUrl + url,
type: method,
headers: headers,
headers,
timeout: 60000,
success: (body, textStatus, jqXhr) => {
const respHeaders: Headers = {};
@@ -288,8 +290,8 @@ async function reportError(method: string, url: string, statusCode: number, resp
t("server.unknown_http_error_content", { statusCode, method, url, message: messageStr }),
15_000);
}
const { throwError } = await import("./ws.js");
throwError(`${statusCode} ${method} ${url} - ${message}`);
const { logError } = await import("./ws.js");
logError(`${statusCode} ${method} ${url} - ${message}`);
}
}

View File

@@ -100,6 +100,20 @@ describe("shortcuts", () => {
expect(consoleSpy).toHaveBeenCalled();
consoleSpy.mockRestore();
});
it("should match letter keys using code when key is a special character (macOS Alt behavior)", () => {
// On macOS, pressing Option/Alt + A produces 'å' as the key, but code is still 'KeyA'
const macOSAltAEvent = createKeyboardEvent("å", "KeyA");
expect(keyMatches(macOSAltAEvent, "a")).toBe(true);
// Option + H produces '˙'
const macOSAltHEvent = createKeyboardEvent("˙", "KeyH");
expect(keyMatches(macOSAltHEvent, "h")).toBe(true);
// Option + S produces 'ß'
const macOSAltSEvent = createKeyboardEvent("ß", "KeyS");
expect(keyMatches(macOSAltSEvent, "s")).toBe(true);
});
});
describe("matchesShortcut", () => {
@@ -200,6 +214,33 @@ describe("shortcuts", () => {
expect(consoleSpy).toHaveBeenCalled();
consoleSpy.mockRestore();
});
it("should match Alt+letter shortcuts on macOS where key is a special character", () => {
// On macOS, pressing Option/Alt + A produces 'å' but code remains 'KeyA'
const macOSAltAEvent = createKeyboardEvent({
key: "å",
code: "KeyA",
altKey: true
});
expect(matchesShortcut(macOSAltAEvent, "alt+a")).toBe(true);
// Option/Alt + H produces '˙'
const macOSAltHEvent = createKeyboardEvent({
key: "˙",
code: "KeyH",
altKey: true
});
expect(matchesShortcut(macOSAltHEvent, "alt+h")).toBe(true);
// Combined with Ctrl: Ctrl+Alt+S where Alt produces 'ß'
const macOSCtrlAltSEvent = createKeyboardEvent({
key: "ß",
code: "KeyS",
ctrlKey: true,
altKey: true
});
expect(matchesShortcut(macOSCtrlAltSEvent, "ctrl+alt+s")).toBe(true);
});
});
describe("bindGlobalShortcut", () => {

View File

@@ -213,8 +213,11 @@ export function keyMatches(e: KeyboardEvent, key: string): boolean {
}
// For letter keys, use the physical key code for consistency
// On macOS, Option/Alt key produces special characters, so we must use e.code
if (key.length === 1 && key >= 'a' && key <= 'z') {
return e.key.toLowerCase() === key.toLowerCase();
// e.code is like "KeyA", "KeyB", etc.
const expectedCode = `Key${key.toUpperCase()}`;
return e.code === expectedCode || e.key.toLowerCase() === key.toLowerCase();
}
// For regular keys, check both key and code as fallback

View File

@@ -1,22 +1,30 @@
import type { SaveState } from "../components/note_context";
import { getErrorMessage } from "./utils";
type Callback = () => Promise<void> | void;
export type StateCallback = (state: SaveState) => void;
export default class SpacedUpdate {
private updater: Callback;
private lastUpdated: number;
private changed: boolean;
private updateInterval: number;
private changeForbidden?: boolean;
private stateCallback?: StateCallback;
constructor(updater: Callback, updateInterval = 1000) {
constructor(updater: Callback, updateInterval = 1000, stateCallback?: StateCallback) {
this.updater = updater;
this.lastUpdated = Date.now();
this.changed = false;
this.updateInterval = updateInterval;
this.stateCallback = stateCallback;
}
scheduleUpdate() {
if (!this.changeForbidden) {
this.changed = true;
this.stateCallback?.("unsaved");
setTimeout(() => this.triggerUpdate());
}
}
@@ -26,10 +34,13 @@ export default class SpacedUpdate {
this.changed = false; // optimistic...
try {
this.stateCallback?.("saving");
await this.updater();
this.stateCallback?.("saved");
} catch (e) {
this.changed = true;
this.stateCallback?.("error");
logError(getErrorMessage(e));
throw e;
}
}
@@ -59,15 +70,22 @@ export default class SpacedUpdate {
this.updateInterval = interval;
}
triggerUpdate() {
async triggerUpdate() {
if (!this.changed) {
return;
}
if (Date.now() - this.lastUpdated > this.updateInterval) {
this.updater();
this.stateCallback?.("saving");
try {
await this.updater();
this.stateCallback?.("saved");
this.changed = false;
} catch (e) {
this.stateCallback?.("error");
logError(getErrorMessage(e));
}
this.lastUpdated = Date.now();
this.changed = false;
} else {
// update isn't triggered but changes are still pending, so we need to schedule another check
this.scheduleUpdate();

View File

@@ -1,6 +1,9 @@
import { signal } from "@preact/signals";
import utils from "./utils.js";
import appContext from "../components/app_context.js";
import froca from "./froca.js";
import { t } from "./i18n.js";
import utils, { randomString } from "./utils.js";
export interface ToastOptions {
id?: string;
@@ -61,11 +64,29 @@ function showErrorTitleAndMessage(title: string, message: string, timeout = 1000
});
}
export async function showErrorForScriptNote(noteId: string, message: string) {
const note = await froca.getNote(noteId, true);
showPersistent({
id: `custom-widget-failure-${noteId}`,
title: t("toast.scripting-error", { title: note?.title ?? "" }),
icon: note?.getIcon() ?? "bx bx-error-circle",
message,
timeout: 15_000,
buttons: [
{
text: t("toast.open-script-note"),
onClick: () => appContext.tabManager.openInNewTab(noteId, null, true)
}
]
});
}
//#region Toast store
export const toasts = signal<ToastOptionsWithRequiredId[]>([]);
function addToast(opts: ToastOptions) {
const id = opts.id ?? crypto.randomUUID();
const id = opts.id ?? randomString();
const toast = { ...opts, id };
toasts.value = [ ...toasts.value, toast ];
return id;
@@ -74,7 +95,7 @@ function addToast(opts: ToastOptions) {
function updateToast(id: string, partial: Partial<ToastOptions>) {
toasts.value = toasts.value.map(toast => {
if (toast.id === id) {
return { ...toast, ...partial }
return { ...toast, ...partial };
}
return toast;
});

View File

@@ -1,8 +1,9 @@
import { dayjs } from "@triliumnext/commons";
import type { ViewScope } from "./link.js";
import FNote from "../entities/fnote";
import { snapdom } from "@zumer/snapdom";
import FNote from "../entities/fnote";
import type { ViewMode, ViewScope } from "./link.js";
const SVG_MIME = "image/svg+xml";
export const isShare = !window.glob;
@@ -113,9 +114,8 @@ function formatDateISO(date: Date) {
export function formatDateTime(date: Date, userSuppliedFormat?: string): string {
if (userSuppliedFormat?.trim()) {
return dayjs(date).format(userSuppliedFormat);
} else {
return `${formatDate(date)} ${formatTime(date)}`;
}
return `${formatDate(date)} ${formatTime(date)}`;
}
function localNowDateTime() {
@@ -187,13 +187,15 @@ export function formatSize(size: number | null | undefined) {
return "";
}
size = Math.max(Math.round(size / 1024), 1);
if (size < 1024) {
return `${size} KiB`;
} else {
return `${Math.round(size / 102.4) / 10} MiB`;
if (size === 0) {
return "0 B";
}
const k = 1024;
const sizes = ["B", "KiB", "MiB", "GiB"];
const i = Math.floor(Math.log(size) / Math.log(k));
return `${Math.round((size / Math.pow(k, i)) * 100) / 100} ${sizes[i]}`;
}
function toObject<T, R>(array: T[], fn: (arg0: T) => [key: string, value: R]) {
@@ -208,7 +210,7 @@ function toObject<T, R>(array: T[], fn: (arg0: T) => [key: string, value: R]) {
return obj;
}
export function randomString(len: number) {
export function randomString(len: number = 16) {
let text = "";
const possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
@@ -297,18 +299,18 @@ function formatHtml(html: string) {
let indent = "\n";
const tab = "\t";
let i = 0;
let pre: { indent: string; tag: string }[] = [];
const pre: { indent: string; tag: string }[] = [];
html = html
.replace(new RegExp("<pre>([\\s\\S]+?)?</pre>"), function (x) {
.replace(new RegExp("<pre>([\\s\\S]+?)?</pre>"), (x) => {
pre.push({ indent: "", tag: x });
return "<--TEMPPRE" + i++ + "/-->";
return `<--TEMPPRE${i++}/-->`;
})
.replace(new RegExp("<[^<>]+>[^<]?", "g"), function (x) {
.replace(new RegExp("<[^<>]+>[^<]?", "g"), (x) => {
let ret;
const tagRegEx = /<\/?([^\s/>]+)/.exec(x);
let tag = tagRegEx ? tagRegEx[1] : "";
let p = new RegExp("<--TEMPPRE(\\d+)/-->").exec(x);
const tag = tagRegEx ? tagRegEx[1] : "";
const p = new RegExp("<--TEMPPRE(\\d+)/-->").exec(x);
if (p) {
const pInd = parseInt(p[1]);
@@ -318,24 +320,22 @@ function formatHtml(html: string) {
if (["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "menuitem", "meta", "param", "source", "track", "wbr"].indexOf(tag) >= 0) {
// self closing tag
ret = indent + x;
} else if (x.indexOf("</") < 0) {
//open tag
if (x.charAt(x.length - 1) !== ">") ret = indent + x.substr(0, x.length - 1) + indent + tab + x.substr(x.length - 1, x.length);
else ret = indent + x;
!p && (indent += tab);
} else {
if (x.indexOf("</") < 0) {
//open tag
if (x.charAt(x.length - 1) !== ">") ret = indent + x.substr(0, x.length - 1) + indent + tab + x.substr(x.length - 1, x.length);
else ret = indent + x;
!p && (indent += tab);
} else {
//close tag
indent = indent.substr(0, indent.length - 1);
if (x.charAt(x.length - 1) !== ">") ret = indent + x.substr(0, x.length - 1) + indent + x.substr(x.length - 1, x.length);
else ret = indent + x;
}
//close tag
indent = indent.substr(0, indent.length - 1);
if (x.charAt(x.length - 1) !== ">") ret = indent + x.substr(0, x.length - 1) + indent + x.substr(x.length - 1, x.length);
else ret = indent + x;
}
return ret;
});
for (i = pre.length; i--;) {
html = html.replace("<--TEMPPRE" + i + "/-->", pre[i].tag.replace("<pre>", "<pre>\n").replace("</pre>", pre[i].indent + "</pre>"));
html = html.replace(`<--TEMPPRE${i}/-->`, pre[i].tag.replace("<pre>", "<pre>\n").replace("</pre>", `${pre[i].indent}</pre>`));
}
return html.charAt(0) === "\n" ? html.substr(1, html.length - 1) : html;
@@ -364,11 +364,11 @@ type dynamicRequireMappings = {
export function dynamicRequire<T extends keyof dynamicRequireMappings>(moduleName: T): Awaited<dynamicRequireMappings[T]>{
if (typeof __non_webpack_require__ !== "undefined") {
return __non_webpack_require__(moduleName);
} else {
// explicitly pass as string and not as expression to suppress webpack warning
// 'Critical dependency: the request of a dependency is an expression'
return require(`${moduleName}`);
}
// explicitly pass as string and not as expression to suppress webpack warning
// 'Critical dependency: the request of a dependency is an expression'
return require(`${moduleName}`);
}
function timeLimit<T>(promise: Promise<T>, limitMs: number, errorMessage?: string) {
@@ -439,7 +439,20 @@ async function openInAppHelp($button: JQuery<HTMLElement>) {
* @param inAppHelpPage the ID of the help note (excluding the `_help_` prefix).
* @returns a promise that resolves once the help has been opened.
*/
export async function openInAppHelpFromUrl(inAppHelpPage: string) {
export function openInAppHelpFromUrl(inAppHelpPage: string) {
return openInReusableSplit(`_help_${inAppHelpPage}`, "contextual-help");
}
/**
* Similar to opening a new note in a split, but re-uses an existing split if there is already one open with the same view mode.
*
* @param targetNoteId the note ID to open in the split.
* @param targetViewMode the view mode of the split to open the note in.
* @param openOpts additional options for opening the note.
*/
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();
@@ -447,23 +460,20 @@ export async function openInAppHelpFromUrl(inAppHelpPage: string) {
return;
}
const subContexts = activeContext.getSubContexts();
const targetNote = `_help_${inAppHelpPage}`;
const helpSubcontext = subContexts.find((s) => s.viewScope?.viewMode === "contextual-help");
const viewScope: ViewScope = {
viewMode: "contextual-help",
};
if (!helpSubcontext) {
// The help is not already open, open a new split with it.
const existingSubcontext = subContexts.find((s) => s.viewScope?.viewMode === targetViewMode);
const viewScope: ViewScope = { viewMode: 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", {
ntxId,
notePath: targetNote,
hoistedNoteId: "_help",
notePath: targetNoteId,
hoistedNoteId: openOpts.hoistedNoteId,
viewScope
})
});
} else {
// There is already a help window open, make sure it opens on the right note.
helpSubcontext.setNote(targetNote, { viewScope });
// There is already a target split open, make sure it opens on the right note.
existingSubcontext.setNote(targetNoteId, { viewScope });
}
}
@@ -499,8 +509,8 @@ export function escapeRegExp(str: string) {
function areObjectsEqual(...args: unknown[]) {
let i;
let l;
let leftChain: Object[];
let rightChain: Object[];
let leftChain: object[];
let rightChain: object[];
function compare2Objects(x: unknown, y: unknown) {
let p;
@@ -685,9 +695,9 @@ async function downloadAsSvg(nameWithoutExtension: string, svgSource: string | S
try {
const result = await snapdom(element, {
backgroundColor: "transparent",
scale: 2
});
backgroundColor: "transparent",
scale: 2
});
triggerDownload(`${nameWithoutExtension}.svg`, result.url);
} finally {
cleanup();
@@ -723,9 +733,9 @@ async function downloadAsPng(nameWithoutExtension: string, svgSource: string | S
try {
const result = await snapdom(element, {
backgroundColor: "transparent",
scale: 2
});
backgroundColor: "transparent",
scale: 2
});
const pngImg = await result.toPng();
await triggerDownload(`${nameWithoutExtension}.png`, pngImg.src);
} finally {
@@ -753,11 +763,11 @@ export function getSizeFromSvg(svgContent: string) {
return {
width: parseFloat(width),
height: parseFloat(height)
}
} else {
console.warn("SVG export error", svgDocument.documentElement);
return null;
};
}
console.warn("SVG export error", svgDocument.documentElement);
return null;
}
/**
@@ -886,9 +896,9 @@ export function mapToKeyValueArray<K extends string | number | symbol, V>(map: R
export function getErrorMessage(e: unknown) {
if (e && typeof e === "object" && "message" in e && typeof e.message === "string") {
return e.message;
} else {
return "Unknown error";
}
return "Unknown error";
}
/**

View File

@@ -0,0 +1,498 @@
.bx-ul
{
margin-left: 2em;
padding-left: 0;
list-style: none;
}
.bx-ul > li
{
position: relative;
}
.bx-ul .bx
{
font-size: inherit;
line-height: inherit;
position: absolute;
left: -2em;
width: 2em;
text-align: center;
}
@-webkit-keyframes spin
{
0%
{
-webkit-transform: rotate(0);
transform: rotate(0);
}
100%
{
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
@keyframes spin
{
0%
{
-webkit-transform: rotate(0);
transform: rotate(0);
}
100%
{
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
@-webkit-keyframes burst
{
0%
{
-webkit-transform: scale(1);
transform: scale(1);
opacity: 1;
}
90%
{
-webkit-transform: scale(1.5);
transform: scale(1.5);
opacity: 0;
}
}
@keyframes burst
{
0%
{
-webkit-transform: scale(1);
transform: scale(1);
opacity: 1;
}
90%
{
-webkit-transform: scale(1.5);
transform: scale(1.5);
opacity: 0;
}
}
@-webkit-keyframes flashing
{
0%
{
opacity: 1;
}
45%
{
opacity: 0;
}
90%
{
opacity: 1;
}
}
@keyframes flashing
{
0%
{
opacity: 1;
}
45%
{
opacity: 0;
}
90%
{
opacity: 1;
}
}
@-webkit-keyframes fade-left
{
0%
{
-webkit-transform: translateX(0);
transform: translateX(0);
opacity: 1;
}
75%
{
-webkit-transform: translateX(-20px);
transform: translateX(-20px);
opacity: 0;
}
}
@keyframes fade-left
{
0%
{
-webkit-transform: translateX(0);
transform: translateX(0);
opacity: 1;
}
75%
{
-webkit-transform: translateX(-20px);
transform: translateX(-20px);
opacity: 0;
}
}
@-webkit-keyframes fade-right
{
0%
{
-webkit-transform: translateX(0);
transform: translateX(0);
opacity: 1;
}
75%
{
-webkit-transform: translateX(20px);
transform: translateX(20px);
opacity: 0;
}
}
@keyframes fade-right
{
0%
{
-webkit-transform: translateX(0);
transform: translateX(0);
opacity: 1;
}
75%
{
-webkit-transform: translateX(20px);
transform: translateX(20px);
opacity: 0;
}
}
@-webkit-keyframes fade-up
{
0%
{
-webkit-transform: translateY(0);
transform: translateY(0);
opacity: 1;
}
75%
{
-webkit-transform: translateY(-20px);
transform: translateY(-20px);
opacity: 0;
}
}
@keyframes fade-up
{
0%
{
-webkit-transform: translateY(0);
transform: translateY(0);
opacity: 1;
}
75%
{
-webkit-transform: translateY(-20px);
transform: translateY(-20px);
opacity: 0;
}
}
@-webkit-keyframes fade-down
{
0%
{
-webkit-transform: translateY(0);
transform: translateY(0);
opacity: 1;
}
75%
{
-webkit-transform: translateY(20px);
transform: translateY(20px);
opacity: 0;
}
}
@keyframes fade-down
{
0%
{
-webkit-transform: translateY(0);
transform: translateY(0);
opacity: 1;
}
75%
{
-webkit-transform: translateY(20px);
transform: translateY(20px);
opacity: 0;
}
}
@-webkit-keyframes tada
{
from
{
-webkit-transform: scale3d(1, 1, 1);
transform: scale3d(1, 1, 1);
}
10%,
20%
{
-webkit-transform: scale3d(.95, .95, .95) rotate3d(0, 0, 1, -10deg);
transform: scale3d(.95, .95, .95) rotate3d(0, 0, 1, -10deg);
}
30%,
50%,
70%,
90%
{
-webkit-transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, 10deg);
transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, 10deg);
}
40%,
60%,
80%
{
-webkit-transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, -10deg);
transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, -10deg);
}
to
{
-webkit-transform: scale3d(1, 1, 1);
transform: scale3d(1, 1, 1);
}
}
@keyframes tada
{
from
{
-webkit-transform: scale3d(1, 1, 1);
transform: scale3d(1, 1, 1);
}
10%,
20%
{
-webkit-transform: scale3d(.95, .95, .95) rotate3d(0, 0, 1, -10deg);
transform: scale3d(.95, .95, .95) rotate3d(0, 0, 1, -10deg);
}
30%,
50%,
70%,
90%
{
-webkit-transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, 10deg);
transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, 10deg);
}
40%,
60%,
80%
{
-webkit-transform: rotate3d(0, 0, 1, -10deg);
transform: rotate3d(0, 0, 1, -10deg);
}
to
{
-webkit-transform: scale3d(1, 1, 1);
transform: scale3d(1, 1, 1);
}
}
.bx-spin
{
-webkit-animation: spin 2s linear infinite;
animation: spin 2s linear infinite;
}
.bx-spin-hover:hover
{
-webkit-animation: spin 2s linear infinite;
animation: spin 2s linear infinite;
}
.bx-tada
{
-webkit-animation: tada 1.5s ease infinite;
animation: tada 1.5s ease infinite;
}
.bx-tada-hover:hover
{
-webkit-animation: tada 1.5s ease infinite;
animation: tada 1.5s ease infinite;
}
.bx-flashing
{
-webkit-animation: flashing 1.5s infinite linear;
animation: flashing 1.5s infinite linear;
}
.bx-flashing-hover:hover
{
-webkit-animation: flashing 1.5s infinite linear;
animation: flashing 1.5s infinite linear;
}
.bx-burst
{
-webkit-animation: burst 1.5s infinite linear;
animation: burst 1.5s infinite linear;
}
.bx-burst-hover:hover
{
-webkit-animation: burst 1.5s infinite linear;
animation: burst 1.5s infinite linear;
}
.bx-fade-up
{
-webkit-animation: fade-up 1.5s infinite linear;
animation: fade-up 1.5s infinite linear;
}
.bx-fade-up-hover:hover
{
-webkit-animation: fade-up 1.5s infinite linear;
animation: fade-up 1.5s infinite linear;
}
.bx-fade-down
{
-webkit-animation: fade-down 1.5s infinite linear;
animation: fade-down 1.5s infinite linear;
}
.bx-fade-down-hover:hover
{
-webkit-animation: fade-down 1.5s infinite linear;
animation: fade-down 1.5s infinite linear;
}
.bx-fade-left
{
-webkit-animation: fade-left 1.5s infinite linear;
animation: fade-left 1.5s infinite linear;
}
.bx-fade-left-hover:hover
{
-webkit-animation: fade-left 1.5s infinite linear;
animation: fade-left 1.5s infinite linear;
}
.bx-fade-right
{
-webkit-animation: fade-right 1.5s infinite linear;
animation: fade-right 1.5s infinite linear;
}
.bx-fade-right-hover:hover
{
-webkit-animation: fade-right 1.5s infinite linear;
animation: fade-right 1.5s infinite linear;
}
.bx-xs
{
font-size: 1rem!important;
}
.bx-sm
{
font-size: 1.55rem!important;
}
.bx-md
{
font-size: 2.25rem!important;
}
.bx-lg
{
font-size: 3.0rem!important;
}
.bx-fw
{
font-size: 1.2857142857em;
line-height: .8em;
width: 1.2857142857em;
height: .8em;
margin-top: -.2em!important;
vertical-align: middle;
}
.bx-pull-left
{
float: left;
margin-right: .3em!important;
}
.bx-pull-right
{
float: right;
margin-left: .3em!important;
}
.bx-rotate-90
{
transform: rotate(90deg);
-ms-filter: 'progid:DXImageTransform.Microsoft.BasicImage(rotation=1)';
}
.bx-rotate-180
{
transform: rotate(180deg);
-ms-filter: 'progid:DXImageTransform.Microsoft.BasicImage(rotation=2)';
}
.bx-rotate-270
{
transform: rotate(270deg);
-ms-filter: 'progid:DXImageTransform.Microsoft.BasicImage(rotation=3)';
}
.bx-flip-horizontal
{
transform: scaleX(-1);
-ms-filter: 'progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)';
}
.bx-flip-vertical
{
transform: scaleY(-1);
-ms-filter: 'progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)';
}
.bx-border
{
padding: .25em;
border: .07em solid rgba(0,0,0,.1);
border-radius: .25em;
}
.bx-border-circle
{
padding: .25em;
border: .07em solid rgba(0,0,0,.1);
border-radius: 50%;
}
/** Custom icon **/
.bx-empty {
width: 1em;
display: inline-block;
}

View File

@@ -1,3 +1,5 @@
@import "./boxicons-compat.css";
@font-face {
font-family: Montserrat;
src: url(../fonts/Montserrat-Light.ttf);
@@ -423,20 +425,19 @@ body.desktop .tabulator-popup-container,
pointer-events: none;
}
.dropdown-menu .disabled .disabled-tooltip {
.dropdown-menu .disabled .contextual-help {
pointer-events: all;
margin-inline-start: 8px;
font-size: 0.75rem;
color: var(--disabled-tooltip-icon-color);
color: var(--contextual-help-icon-color);
cursor: help;
opacity: 0.75;
}
.dropdown-menu .disabled .disabled-tooltip:hover {
.dropdown-menu .disabled .contextual-help:hover {
opacity: 1;
}
.dropdown-menu a:hover:not(.disabled),
.dropdown-item:hover:not(.disabled, .dropdown-container-item),
.tabulator-menu-item:hover,
:root .excalidraw .context-menu .context-menu-item:hover {
@@ -458,6 +459,7 @@ body.desktop .tabulator-popup-container,
}
body.desktop .dropdown-menu:not(#context-menu-container) .dropdown-item,
body.desktop .dropdown-menu .dropdown-toggle,
body #context-menu-container .dropdown-item > span,
body.mobile .dropdown .dropdown-submenu > span {
display: flex;
@@ -521,9 +523,7 @@ body.mobile .dropdown .dropdown-submenu > span {
.cm-editor {
height: 100%;
outline: none !important;
border-radius: 6px;
overflow: hidden;
margin: 4px;
font-size: var(--monospace-font-size);
}
@@ -629,6 +629,11 @@ pre:not(.hljs) {
padding: var(--padding-size);
}
pre:has(> .cm-editor) {
padding: 0;
margin: 0;
}
pre > button.copy-button {
position: absolute;
top: var(--copy-button-margin-size);
@@ -720,6 +725,10 @@ table.promoted-attributes-in-tooltip th {
z-index: 32767 !important;
}
.pre-wrap-text {
white-space: pre-wrap;
}
.bs-tooltip-bottom .tooltip-arrow::before {
border-bottom-color: var(--main-border-color) !important;
}
@@ -1121,11 +1130,6 @@ a.external:not(.no-arrow):after, a[href^="http://"]:not(.no-arrow):after, a[href
border-color: var(--main-border-color) !important;
}
.bx-empty {
width: 1em;
display: inline-block;
}
.modal-header {
padding: 0.5rem 1rem 0.5rem 1rem !important; /* make modal header padding slightly smaller */
}
@@ -1315,12 +1319,21 @@ body.desktop li.dropdown-submenu:hover > ul.dropdown-menu {
top: 0;
inset-inline-start: calc(100% - 2px); /* -2px, otherwise there's a small gap between menu and submenu where the hover can disappear */
margin-top: -10px;
min-width: 15rem;
/* to make submenu scrollable https://github.com/zadam/trilium/issues/3136 */
max-height: 600px;
overflow: auto;
}
body.desktop .dropdown-submenu > .dropdown-menu {
min-width: max-content;
max-width: 300px;
}
.dropdown-submenu.dropstart > .dropdown-menu {
inset-inline-start: auto;
inset-inline-end: calc(100% - 2px);
}
body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu {
inset-inline-start: calc(-100% + 10px);
}
@@ -1783,7 +1796,7 @@ button.close:hover {
display: none;
}
.reference-link .bx {
.reference-link .tn-icon {
position: relative;
top: 1px;
margin-inline-end: 3px;
@@ -1935,6 +1948,10 @@ body.electron.platform-darwin:not(.native-titlebar) .tab-row-container {
padding-inline-start: 1em;
}
.tab-row-widget {
contain: inline-size;
}
#tab-row-left-spacer {
width: env(titlebar-area-x);
-webkit-app-region: drag;
@@ -1944,7 +1961,7 @@ body.electron.platform-darwin:not(.native-titlebar):not(.full-screen) #tab-row-l
width: 80px;
}
.tab-row-widget {
body.electron:not(.platform-darwin) .tab-row-container {
padding-inline-end: calc(100vw - env(titlebar-area-width, 100vw));
}
@@ -1995,8 +2012,10 @@ body.zen .shared-info-widget,
body.zen .ribbon-container:not(:has(.classic-toolbar-widget)),
body.zen .ribbon-container:has(.classic-toolbar-widget) .ribbon-top-row,
body.zen .ribbon-container .ribbon-body:not(:has(.classic-toolbar-widget)),
body.zen .note-icon-widget,
body.zen .title-row .icon-action,
body.zen .note-badges > *:not(.read-only-badge),
body.zen .ribbon-button-container,
body.zen .inline-title,
body.zen .promoted-attributes-widget,
body.zen .floating-buttons-children > *:not(.bx-edit-alt),
body.zen .action-button,
@@ -2019,11 +2038,11 @@ body.zen #launcher-pane {
}
body.zen .title-row {
display: block !important;
height: unset !important;
-webkit-app-region: drag;
padding-inline-start: env(titlebar-area-x);
padding-inline-end: calc(100vw - env(titlebar-area-width, 100vw) + 2.5em);
border-bottom: none !important;
}
body.zen .floating-buttons {
@@ -2043,8 +2062,6 @@ body.zen .floating-buttons-children .button-widget {
body.zen .note-title-widget,
body.zen .note-title-widget input {
font-size: 1rem !important;
background: transparent !important;
pointer-events: none;
}
body.zen #detail-container {
@@ -2104,58 +2121,107 @@ body.zen:not(.backdrop-effects-disabled) .note-split.type-text .scrolling-contai
/* Fixed formatting toolbar */
body.zen .note-split .ribbon-container {
position: fixed;
left: 0;
bottom: 20px;
width: 100%;
z-index: 1000;
opacity: 0; /* Hidden unless the current note split is focused */
pointer-events: none;
transition: opacity 100ms linear;
}
body.zen .note-split:focus-within .ribbon-container {
opacity: 1; /* Show when the note split is focused */
}
body.zen .note-split .ribbon-container .ribbon-body {
border: 0;
}
body.zen .note-split .ribbon-container .classic-toolbar-widget {
margin: auto;
width: fit-content;
box-shadow: 0px 10px 20px rgba(0, 0, 0, .1);
border-radius: 8px;
border: 1px solid var(--main-border-color);
padding: 4px;
background: var(--menu-background-color);
}
body.zen .note-split .ribbon-container .classic-toolbar-widget:not(:has(> .ck-toolbar)) {
/* Hide the toolbar wrapper if the toolbar is missing */
display: none;
}
body.zen .note-split:focus-within .ribbon-container .classic-toolbar-widget {
pointer-events: all;
}
@media (max-width: 1300px) {
body.zen .note-split .ribbon-container .classic-toolbar-widget {
/* Set the toolbar to full with */
body.zen:not(.experimental-feature-new-layout) {
.note-split .ribbon-container {
position: fixed;
left: 0;
bottom: 20px;
width: 100%;
z-index: 1000;
opacity: 0; /* Hidden unless the current note split is focused */
pointer-events: none;
transition: opacity 100ms linear;
}
body.zen .classic-toolbar-widget .ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_se,
body.zen .classic-toolbar-widget .ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sw,
body.zen .classic-toolbar-widget .ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_smw,
body.zen .classic-toolbar-widget .ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sme,
body.zen .classic-toolbar-widget .ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_s {
/* Force toolbar items overflow dropdowns open upwards */
top: auto;
bottom: 100%;
.note-split:focus-within .ribbon-container {
opacity: 1; /* Show when the note split is focused */
}
.note-split .ribbon-container .ribbon-body {
border: 0;
}
.note-split .ribbon-container .classic-toolbar-widget {
margin: auto;
width: fit-content;
box-shadow: 0px 10px 20px rgba(0, 0, 0, .1);
border-radius: 8px;
border: 1px solid var(--main-border-color);
padding: 4px;
background: var(--menu-background-color);
}
.note-split .ribbon-container .classic-toolbar-widget:not(:has(> .ck-toolbar)) {
/* Hide the toolbar wrapper if the toolbar is missing */
display: none;
}
.note-split:focus-within .ribbon-container .classic-toolbar-widget {
pointer-events: all;
}
@media (max-width: 1300px) {
.note-split .ribbon-container .classic-toolbar-widget {
/* Set the toolbar to full with */
width: 100%;
}
.classic-toolbar-widget .ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_se,
.classic-toolbar-widget .ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sw,
.classic-toolbar-widget .ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_smw,
.classic-toolbar-widget .ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sme,
.classic-toolbar-widget .ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_s {
/* Force toolbar items overflow dropdowns open upwards */
top: auto;
bottom: 100%;
}
}
}
body.zen.experimental-feature-new-layout {
.status-bar {
display: none;
}
.classic-toolbar-widget {
position: fixed;
left: 50%;
bottom: 20px;
z-index: 1000;
opacity: 0; /* Hidden unless the current note split is focused */
pointer-events: none;
transition: opacity 100ms linear;
width: fit-content;
box-shadow: 0px 10px 20px rgba(0, 0, 0, .1);
border-radius: 8px;
border: 1px solid var(--main-border-color);
padding: 4px;
background: var(--menu-background-color) !important;
transform: translateX(-50%);
backdrop-filter: blur(6px);
}
#root-widget:has(.note-split.type-text:focus-within) .classic-toolbar-widget,
.classic-toolbar-widget:focus-within {
opacity: 1; /* Show when the note split is focused */
pointer-events: all;
}
@media (max-width: 1300px) {
.classic-toolbar-widget {
/* Set the toolbar to full with */
width: 100%;
}
.classic-toolbar-widget .ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_se,
.classic-toolbar-widget .ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sw,
.classic-toolbar-widget .ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_smw,
.classic-toolbar-widget .ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sme,
.classic-toolbar-widget .ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_s {
/* Force toolbar items overflow dropdowns open upwards */
top: auto;
bottom: 100%;
}
}
}
@@ -2349,7 +2415,7 @@ footer.webview-footer button {
gap: 5px;
}
.right-pane-tab .tab-title .bx {
.right-pane-tab .tab-title .tn-icon {
font-size: 1.1em;
}
@@ -2462,6 +2528,11 @@ footer.webview-footer button {
inset-inline-start: 10px;
}
.content-floating-buttons.top-right {
top: 10px;
inset-inline-end: 10px;
}
.content-floating-buttons.bottom-left {
bottom: 10px;
inset-inline-start: 10px;
@@ -2472,18 +2543,11 @@ footer.webview-footer button {
inset-inline-end: 10px;
}
.content-floating-buttons button.bx {
.content-floating-buttons button.tn-icon {
font-size: 130%;
padding: 1px 10px 1px 10px;
}
/* Customized icons */
.bx-tn-toc::before {
content: "\ec24";
transform: rotate(180deg);
}
/* CK Editor */
/* Insert text snippet: limit the width of the listed items to avoid overly long names */

View File

@@ -19,7 +19,7 @@
--dropdown-border-color: #555;
--dropdown-shadow-opacity: 0.4;
--dropdown-item-icon-destructive-color: #de6e5b;
--disabled-tooltip-icon-color: #7fd2ef;
--contextual-help-icon-color: #7fd2ef;
--accented-background-color: #555;
--more-accented-background-color: #777;
@@ -114,4 +114,8 @@ body .todo-list input[type="checkbox"]:not(:checked):before {
.use-note-color {
--custom-color: var(--dark-theme-custom-color);
}
}
span.fancytree-active {
color: var(--dark-theme-custom-color, var(--active-item-text-color));
}

View File

@@ -23,7 +23,7 @@ html {
--dropdown-border-color: #ccc;
--dropdown-shadow-opacity: 0.2;
--dropdown-item-icon-destructive-color: #ec5138;
--disabled-tooltip-icon-color: #004382;
--contextual-help-icon-color: #004382;
--accented-background-color: #f5f5f5;
--more-accented-background-color: #ddd;
@@ -89,13 +89,17 @@ html {
--custom-color: var(--light-theme-custom-color);
}
:root .reference-link,
:root .reference-link:hover,
.ck-content a.reference-link > span,
.board-note {
:root .reference-link.use-note-color,
:root .reference-link.use-note-color:hover,
.ck-content a.reference-link.use-note-color > span,
.board-note.use-note-color {
color: var(--light-theme-custom-color, inherit);
}
.use-note-color {
--custom-color: var(--light-theme-custom-color);
}
}
span.fancytree-active {
color: var(--light-theme-custom-color, var(--active-item-text-color));
}

View File

@@ -6,7 +6,7 @@
*/
:root {
/*
/*
* ⚠️ NOTICE: This theme is currently in the beta stage of development.
* The names and purposes of these CSS variables are subject to frequent changes.
*/
@@ -21,8 +21,8 @@
--subtle-border-color: #313131;
--dropdown-border-color: #404040;
--dropdown-shadow-opacity: 0.6;
--dropdown-item-icon-destructive-color: #de6e5b;
--disabled-tooltip-icon-color: #7fd2ef;
--dropdown-item-icon-destructive-color: #d58477;
--contextual-help-icon-color: #7fd2ef;
--accented-background-color: #555;
@@ -74,11 +74,13 @@
--select-arrow-svg: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='transparent' stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/></svg>");
--select-group-heading-text-color: gray;
--link-hover-background: #ffffff26;
--link-hover-color: white;
--link-color: #95c3d9;
--link-hover-background: #75c2e324;
--link-hover-color: var(--link-color);
--link-selection-outline-color: #75c2e385;
--hover-item-text-color: #efefef;
--hover-item-background-color: #ffffff24;
--hover-item-background-color: #ffffff16;
--hover-item-border-color: transparent;
--active-item-text-color: var(--left-pane-text-color);
@@ -170,6 +172,9 @@
--protected-session-active-icon-color: #8edd8e;
--sync-status-error-pulse-color: #f47871;
--classic-toolbar-vert-layout-background-color: #ffffff0d;
--classic-toolbar-horiz-layout-background-color: var(--main-background-color);
--center-pane-vert-layout-background-color-bgfx: #0c0c0c69;
--center-pane-horiz-layout-background-color-bgfx: #1e1e1ec7;
@@ -182,7 +187,7 @@
--tab-close-button-hover-background: #a45353;
--tab-close-button-hover-color: white;
--active-tab-background-color: #ffffff1c;
--active-tab-hover-background-color: var(--active-tab-background-color);
--active-tab-icon-color: #a9a9a9;
@@ -199,9 +204,19 @@
--badge-background-color: #ffffff1a;
--badge-text-color: var(--muted-text-color);
--badge-temporaraily-editable-background-color: #297331;
--badge-read-only-background-color: #af4340;
--badge-share-background-color: #4d4d4d;
--badge-clipped-note-background-color: #295773;
--badge-execute-background-color: #604180;
--note-icon-background-color: #444444;
--note-icon-color: #d4d4d4;
--note-icon-hover-background-color: #555555;
--promoted-attribute-card-background-color: #ffffff21;
--promoted-attribute-card-shadow: none;
--floating-button-shadow-color: #00000080;
--floating-button-background-color: #494949d2;
--floating-button-color: var(--button-text-color);
@@ -220,14 +235,17 @@
--right-pane-item-hover-background: #ffffff26;
--right-pane-item-hover-color: white;
--bottom-panel-background-color: #11111180;
--bottom-panel-title-bar-background-color: #3F3F3F80;
--status-bar-border-color: var(--main-border-color);
--scrollbar-thumb-color: #fdfdfd5c;
--scrollbar-thumb-hover-color: #ffffff7d;
--scrollbar-background-color: transparent;
--scrollbar-border-color: unset; /* Deprecated */
--selection-background-color: #3399FF70;
--link-color: lightskyblue;
--mermaid-theme: dark;
@@ -293,10 +311,10 @@
--custom-bg-color: hsl(var(--custom-color-hue), 20%, 33%, 0.4);
}
:root .reference-link,
:root .reference-link:hover,
.ck-content a.reference-link > span,
.board-note {
:root .reference-link.use-note-color,
:root .reference-link.use-note-color:hover,
.ck-content a.reference-link.use-note-color > span,
.board-note.use-note-color {
color: var(--dark-theme-custom-color, inherit);
}
@@ -320,4 +338,16 @@ body .todo-list input[type="checkbox"]:not(:checked):before {
.use-note-color {
--custom-color: var(--dark-theme-custom-color);
}
.note-split.with-hue,
.quick-edit-dialog-wrapper.with-hue {
--note-icon-custom-background-color: hsl(var(--custom-color-hue), 15.8%, 30.9%);
--note-icon-custom-color: hsl(var(--custom-color-hue), 100%, 76.5%);
--note-icon-hover-custom-background-color: hsl(var(--custom-color-hue), 28.3%, 36.7%);
}
.note-split.with-hue *::selection,
.quick-edit-dialog-wrapper.with-hue *::selection {
--selection-background-color: hsl(var(--custom-color-hue), 49.2%, 35%);
}

View File

@@ -6,7 +6,7 @@
*/
:root {
/*
/*
* ⚠️ NOTICE: This theme is currently in the beta stage of development.
* The names and purposes of these CSS variables are subject to frequent changes.
*/
@@ -21,8 +21,8 @@
--subtle-border-color: rgba(0, 0, 0, 0.1);
--dropdown-border-color: #ccc;
--dropdown-shadow-opacity: 0.2;
--dropdown-item-icon-destructive-color: #ec5138;
--disabled-tooltip-icon-color: #004382;
--dropdown-item-icon-destructive-color: #de4027;
--contextual-help-icon-color: #004382;
--accented-background-color: #f5f5f5;
@@ -74,8 +74,10 @@
--select-arrow-svg: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='transparent' stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/></svg>");
--select-group-heading-text-color: gray;
--link-hover-background: #00000012;
--link-hover-color: black;
--link-color: #0076af;
--link-hover-background: #3c7fa017;
--link-hover-color: var(--link-color);
--link-selection-outline-color: #95c3d9db;
--hover-item-text-color: black;
--hover-item-background-color: #0000001a;
@@ -138,7 +140,7 @@
/* Deprecated: now local variables in #launcher, with the values dependent on the current layout. */
--launcher-pane-background-color: unset;
--launcher-pane-text-color: unset;
--launcher-pane-vert-background-color: #e8e8e8;
--launcher-pane-vert-text-color: #000000bd;
--launcher-pane-vert-button-hover-color: black;
@@ -162,6 +164,9 @@
--protected-session-active-icon-color: #16b516;
--sync-status-error-pulse-color: #ff5528;
--classic-toolbar-vert-layout-background-color: #ffffffa1;
--classic-toolbar-horiz-layout-background-color: var(--main-background-color);
--center-pane-vert-layout-background-color-bgfx: #ffffff75;
--center-pane-horiz-layout-background-color-bgfx: #ffffffd6;
@@ -174,7 +179,7 @@
--tab-close-button-hover-background: #c95a5a;
--tab-close-button-hover-color: white;
--active-tab-background-color: white;
--active-tab-hover-background-color: var(--active-tab-background-color);
--active-tab-icon-color: gray;
@@ -191,6 +196,16 @@
--badge-background-color: #00000011;
--badge-text-color: var(--muted-text-color);
--badge-temporaraily-editable-background-color: #35a64c;
--badge-read-only-background-color: #c8302c;
--badge-share-background-color: #6b6b6b;
--badge-clipped-note-background-color: #2284c0;
--badge-execute-background-color: #7b47af;
--note-icon-background-color: #4f4f4f;
--note-icon-color: white;
--note-icon-hover-background-color: #737373;
--promoted-attribute-card-background-color: #00000014;
--promoted-attribute-card-shadow: none;
@@ -218,6 +233,11 @@
--right-pane-item-hover-background: #00000013;
--right-pane-item-hover-color: inherit;
--bottom-panel-background-color: #ffffff8c;
--bottom-panel-title-bar-background-color: #94949414;
--status-bar-border-color: #0000003a;
--scrollbar-thumb-color: #0000005c;
--scrollbar-thumb-hover-color: #00000066;
--scrollbar-background-color: transparent;
@@ -225,8 +245,6 @@
--selection-background-color: #3399FF70;
--link-color: blue;
--mermaid-theme: default;
--code-block-box-shadow: 4px 4px 8px rgba(0, 0, 0, 0.1), 0px 0px 2px rgba(0, 0, 0, 0.2);
@@ -291,4 +309,16 @@
--modal-background-color: hsl(var(--custom-color-hue), 56%, 96%);
--modal-border-color: hsl(var(--custom-color-hue), 33%, 41%);
--promoted-attribute-card-background-color: hsl(var(--custom-color-hue), 40%, 88%);
}
.note-split.with-hue,
.quick-edit-dialog-wrapper.with-hue {
--note-icon-custom-background-color: hsl(var(--custom-color-hue), 44.5%, 43.1%);
--note-icon-custom-color: hsl(var(--custom-color-hue), 91.3%, 91%);
--note-icon-hover-custom-background-color: hsl(var(--custom-color-hue), 55.1%, 50.2%);
}
.note-split.with-hue *::selection,
.quick-edit-dialog-wrapper.with-hue *::selection {
--selection-background-color: hsl(var(--custom-color-hue), 60%, 90%);
}

View File

@@ -17,6 +17,8 @@
*/
:root {
color-scheme: var(--theme-style);
--main-font-family: "Inter", sans-serif;
--main-font-size: normal;
@@ -50,7 +52,7 @@
--tab-bar-height: 50px;
--tab-height: 36px;
--tab-first-item-horiz-offset: 1px;
--tab-first-item-horiz-offset: 0;
--new-tab-button-size: 24px;
--center-pane-border-radius: 10px;
@@ -89,13 +91,13 @@
* the color is adjusted based on the current color scheme (light or dark). The lightness
* component of the color represented in the CIELAB color space, will be
* constrained to a certain percentage defined below.
*
*
* Note: the tree background may vary when background effects are enabled, so it is recommended
* to maintain a higher contrast margin than on the usual note tree solid background. */
/* The maximum perceptual lightness for the custom color in the light theme (%): */
--tree-item-light-theme-max-color-lightness: 60;
/* The minimum perceptual lightness for the custom color in the dark theme (%): */
--tree-item-dark-theme-min-color-lightness: 65;
}
@@ -128,6 +130,22 @@ body.backdrop-effects-disabled {
font-size: 0.9rem !important;
}
/* Use this class for non-legacy menus */
.dropdown-menu.tn-dropdown-menu {
--menu-item-icon-vert-offset: 0;
white-space-collapse: discard;
}
.dropdown-menu.tn-dropdown-menu .dropdown-item .tn-icon {
margin-inline-end: 6px;
}
.dropdown-menu.tn-dropdown-menu-scrollable {
/* Note: scrollable dropdowns does not support submenus */
max-height: 90vh;
overflow-y: auto;
}
body.desktop .dropdown-menu::before,
:root .ck.ck-dropdown__panel::before,
:root .excalidraw .popover::before,
@@ -147,14 +165,14 @@ body.desktop .dropdown-menu.tn-dropdown-list {
backdrop-filter: var(--dropdown-backdrop-filter);
}
body.desktop .dropdown-menu.tn-dropdown-list::before {
display: none;
}
body.desktop .dropdown-submenu .dropdown-menu::before {
content: unset;
}
body.desktop .dropdown-menu.tn-dropdown-list::before {
display: none;
}
body.desktop .dropdown-submenu .dropdown-menu {
backdrop-filter: var(--dropdown-backdrop-filter);
background: transparent;
@@ -165,17 +183,35 @@ body.desktop .dropdown-submenu .dropdown-menu {
--menu-item-start-padding: 8px;
--menu-item-end-padding: 22px;
--menu-item-vertical-padding: 2px;
padding-top: var(--menu-item-vertical-padding) !important;
padding-bottom: var(--menu-item-vertical-padding) !important;
padding-inline-start: var(--menu-item-start-padding) !important;
padding-inline-end: var(--menu-item-end-padding) !important;
/* Note: the right padding should also accommodate the submenu arrow. */
border-radius: 6px;
cursor: default !important;
}
.dropdown-item:not(.dropdown-submenu),
body.desktop .dropdown-item.dropdown-submenu .dropdown-toggle,
.excalidraw .context-menu .context-menu-item {
padding-top: var(--menu-item-vertical-padding) !important;
padding-bottom: var(--menu-item-vertical-padding) !important;
padding-inline-start: var(--menu-item-start-padding) !important;
padding-inline-end: var(--menu-item-end-padding) !important;
}
.dropdown-item.dropdown-submenu {
padding: 0 !important;
.dropdown-toggle {
flex-grow: 1;
}
}
body.desktop .dropdown-menu:has(> .dropdown-submenu.dropstart) > .dropdown-item:not(.dropdown-submenu),
body.desktop .dropdown-menu:has(> .dropdown-submenu.dropstart) > .dropdown-item.dropdown-submenu .dropdown-toggle {
padding-inline-end: var(--menu-item-start-padding) !important;
padding-inline-start: var(--menu-item-end-padding) !important;
}
:root .dropdown-item:focus-visible {
outline: 2px solid var(--input-focus-outline-color) !important;
background-color: transparent;
@@ -200,6 +236,10 @@ html body .dropdown-item[disabled] {
opacity: var(--menu-item-disabled-opacity);
}
.dropdown-item:not(.disabled) .destructive-action-icon,
.dropdown-item:not(.disabled) .bx-trash {
--menu-item-icon-color: var(--dropdown-item-icon-destructive-color);
}
/* Badges */
:root .badge {
--bs-badge-color: var(--badge-text-color);
@@ -211,7 +251,7 @@ html body .dropdown-item[disabled] {
}
/* Menu item icon */
.dropdown-item .bx {
.dropdown-item .tn-icon {
translate: 0 var(--menu-item-icon-vert-offset);
color: var(--menu-item-icon-color) !important;
font-size: 1.1em;
@@ -249,7 +289,8 @@ html body .dropdown-item[disabled] {
}
/* Menu item arrow */
.dropdown-menu .dropdown-toggle::after {
body.mobile .dropdown-submenu .dropdown-toggle::after,
body.desktop .dropdown-submenu:not(.dropstart) .dropdown-toggle::after {
content: "\ed3b" !important;
position: absolute;
display: flex !important;
@@ -265,6 +306,26 @@ html body .dropdown-item[disabled] {
color: var(--menu-item-arrow-color) !important;
}
body.mobile .dropdown-submenu.dropstart .dropdown-toggle::before {
content: unset;
}
body.desktop .dropdown-submenu.dropstart .dropdown-toggle::before {
content: "\ea4d" !important;
position: absolute;
display: flex !important;
align-items: center;
justify-content: center;
top: 0;
inset-inline-start: 0;
margin: unset !important;
border: unset !important;
padding: 0 4px;
font-family: boxicons;
font-size: 1.2em;
color: var(--menu-item-arrow-color) !important;
}
body[dir=rtl] .dropdown-menu:not([data-popper-placement="bottom-start"]) .dropdown-toggle::after {
content: "\ea4d" !important;
}
@@ -339,7 +400,7 @@ body.mobile .dropdown-menu {
font-size: 1em !important;
backdrop-filter: var(--dropdown-backdrop-filter);
position: relative;
.dropdown-toggle::after {
top: 0.5em;
right: var(--dropdown-menu-padding-horizontal);
@@ -356,7 +417,7 @@ body.mobile .dropdown-menu {
padding: var(--dropdown-menu-padding-vertical) var(--dropdown-menu-padding-horizontal) !important;
background: var(--card-background-color);
border-bottom: 1px solid var(--menu-item-delimiter-color) !important;
border-radius: 0;
border-radius: 0;
}
.dropdown-item:first-of-type,
@@ -367,9 +428,9 @@ body.mobile .dropdown-menu {
border-top-right-radius: 6px;
}
.dropdown-item:last-of-type,
.dropdown-item:last-of-type,
.dropdown-item:has(+ .dropdown-divider),
.dropdown-custom-item:last-of-type,
.dropdown-custom-item:last-of-type,
.dropdown-custom-item:has(+ .dropdown-divider) {
border-bottom-left-radius: 6px;
border-bottom-right-radius: 6px;
@@ -392,10 +453,10 @@ body.mobile .dropdown-menu {
--menu-background-color: --menu-submenu-mobile-background-color;
--bs-dropdown-divider-margin-y: 0.25rem;
border-radius: 0;
max-height: 0;
max-height: 0;
transition: max-height 100ms ease-in;
display: block !important;
display: block !important;
&.show {
max-height: 1000px;
padding: 0.5rem 0.75rem !important;
@@ -405,7 +466,7 @@ body.mobile .dropdown-menu {
&.submenu-open {
.dropdown-toggle {
padding-bottom: var(--dropdown-menu-padding-vertical);
}
}
}
}
@@ -437,7 +498,7 @@ li.dropdown-item a.dropdown-item-button {
border: unset;
}
li.dropdown-item a.dropdown-item-button.bx {
li.dropdown-item a.dropdown-item-button.tn-icon {
color: var(--menu-text-color) !important;
}
@@ -498,13 +559,13 @@ li.dropdown-item a.dropdown-item-button:focus-visible {
padding-top: 0;
}
#toast-container .toast:not(.no-title) .bx {
#toast-container .toast:not(.no-title) .tn-icon {
margin-inline-end: 0.5em;
font-size: 1.1em;
opacity: 0.85;
}
#toast-container .toast.no-title .bx {
#toast-container .toast.no-title .tn-icon {
margin-inline-end: 0;
font-size: 1.3em;
}
@@ -695,7 +756,7 @@ li.dropdown-item a.dropdown-item-button:focus-visible {
margin-bottom: 0;
}
.note-list-wrapper .note-book-card .bx {
.note-list-wrapper .note-book-card .tn-icon {
color: var(--left-pane-icon-color) !important;
}
@@ -703,11 +764,6 @@ li.dropdown-item a.dropdown-item-button:focus-visible {
filter: contrast(105%);
}
.note-list.grid-view .note-book-card img {
object-fit: cover !important;
width: 100%;
}
.note-list.grid-view .ck-content {
line-height: 1.3;
}
@@ -743,4 +799,4 @@ li.dropdown-item a.dropdown-item-button:focus-visible {
.note-detail-empty .aa-suggestions div.aa-cursor {
background: var(--hover-item-background-color);
color: var(--hover-item-text-color);
}
}

View File

@@ -423,6 +423,6 @@ div.tn-tool-dialog {
font-size: unset;
}
.note-type-chooser-dialog div.note-type-dropdown .dropdown-item span.bx {
.note-type-chooser-dialog div.note-type-dropdown .dropdown-item span.tn-icon {
margin-inline-end: .25em;
}
}

View File

@@ -56,15 +56,16 @@ button.btn.btn-primary:focus-visible,
button.btn.btn-secondary:focus-visible,
button.btn.btn-sm:not(.select-button):focus-visible,
button.btn.btn-success:focus-visible,
button.ck.ck-button:is(.ck-button-action, .ck-button-save, .ck-button-cancel, .ck-button-replaceall, .ck-button-replace).ck-button_with-text:not(.ck-disabled):focus-visible {
button.ck.ck-button:is(.ck-button-action, .ck-button-save, .ck-button-cancel, .ck-button-replaceall, .ck-button-replace).ck-button_with-text:not(.ck-disabled):focus-visible,
.tn-focusable-button:focus-visible {
outline: 2px solid var(--input-focus-outline-color);
}
/* Button's icon */
button.btn.btn-primary span.bx,
button.btn.btn-secondary span.bx,
button.btn.btn-sm span.bx,
button.btn.btn-success span.bx {
button.btn.btn-primary span.tn-icon,
button.btn.btn-secondary span.tn-icon,
button.btn.btn-sm span.tn-icon,
button.btn.btn-success span.tn-icon {
color: var(--cmd-button-icon-color);
padding-inline-end: 0.35em;
font-size: 1.2em;
@@ -154,7 +155,7 @@ button.btn.btn-success kbd {
color: var(--button-group-active-button-text-color);
}
/*
/*
* Input boxes
*/
@@ -352,6 +353,11 @@ label.input-group.tn-number-unit-pair input {
padding-inline-end: 0;
}
:root .input-group > pre[aria-hidden="true"] {
margin: 0;
padding: 0;
}
/* Combo box-like dropdown buttons */
.select-button.dropdown-toggle::after {
@@ -399,7 +405,8 @@ button.select-button.dropdown-toggle.btn:active {
select:focus,
select.form-select:focus,
select.form-control:focus,
.select-button.dropdown-toggle.btn:focus {
.select-button.dropdown-toggle.btn:focus,
.select-button.focus-outline:focus {
box-shadow: unset;
outline: 3px solid var(--input-focus-outline-color);
outline-offset: 0;
@@ -422,7 +429,7 @@ optgroup {
line-height: 40px;
}
/*
/*
* File input
*
* <label class="tn-file-input tn-input-field">
@@ -635,8 +642,8 @@ body a.tn-link:visited,
border-radius: 4px;
background: var(--background);
color: var(--link-color);
font-weight: normal;
text-decoration: underline;
font-weight: 500;
text-decoration: none;
transition:
background-color 200ms ease-out,
@@ -651,10 +658,12 @@ body a.tn-link:focus-visible,
}
body a.tn-link:hover,
.use-tn-links a:hover {
.use-tn-links a:hover,
.use-tn-links a.ck-widget_selected {
box-shadow: 0 0 0 4px var(--link-hover-background);
--background: var(--link-hover-background);
color: var(--link-hover-color);
text-decoration: underline;
transition:
background-color 100ms ease-in,
@@ -784,4 +793,4 @@ input[type="range"] {
scrollbar-color: unset;
scrollbar-width: unset;
}
}
}

View File

@@ -22,7 +22,7 @@
--ck-color-button-on-background: transparent;
--ck-color-button-on-hover-background: var(--hover-item-background-color);
--ck-color-button-default-active-background: var(--hover-item-background-color);
--ck-color-split-button-hover-background: var(--ck-editor-toolbar-dropdown-button-open-background);
--ck-focus-ring: 1px solid transparent;
@@ -77,7 +77,7 @@
visibility: collapse;
}
/*
/*
* Dropdowns
*/
@@ -85,7 +85,7 @@
:root .ck.ck-dropdown__panel,
:root .ck-balloon-panel {
--ck-editor-popup-padding: 4px;
--ck-color-panel-background: var(--menu-background-color);
--ck-color-panel-border: var(--ck-editor-popup-border-color);
@@ -487,7 +487,7 @@ button.ck.ck-button:is(.ck-button-action, .ck-button-save, .ck-button-cancel).ck
.ck.ck-labeled-field-view > .ck.ck-labeled-field-view__input-wrapper > label.ck.ck-label {
/* Move the label above the text box regardless of the text box state */
transform: translate(0, calc(-.2em - var(--ck-input-label-height))) !important;
padding-inline-start: 0 !important;
background: transparent;
font-size: .85em;
@@ -518,7 +518,7 @@ button.ck.ck-button:is(.ck-button-action, .ck-button-save, .ck-button-cancel).ck
*/
/*
* Code Blocks
* Code Blocks
*/
.attachment-content-wrapper pre,
@@ -526,10 +526,14 @@ button.ck.ck-button:is(.ck-button-action, .ck-button-save, .ck-button-cancel).ck
.ck-mermaid__editing-view {
border: 0;
border-radius: 6px;
box-shadow: var(--code-block-box-shadow);
box-shadow: var(--code-block-box-shadow);
margin-top: 2px !important;
}
.attachment-content-wrapper pre {
border-radius: var(--dropdown-border-radius);
}
:root .ck-content pre:has(> code) {
padding: 0;
}
@@ -542,7 +546,7 @@ button.ck.ck-button:is(.ck-button-action, .ck-button-save, .ck-button-cancel).ck
* for single-line code blocks */
--copy-button-margin-size: calc((1em * 1.5 + var(--padding-size) * 2 - var(--icon-button-size)) / 2);
/* Where: │ └ Line height
* └───────── Font size
*/
@@ -630,6 +634,10 @@ html .note-detail-editable-text :not(figure, .include-note, hr):first-child {
font-weight: 300;
}
.ck-content strong {
font-weight: 600;
}
.ck-content hr {
margin: 5px 0;
height: 1px;
@@ -666,16 +674,33 @@ html .note-detail-editable-text :not(figure, .include-note, hr):first-child {
color: var(--main-text-color);
}
/* Links */
.ck-content a.ck-widget {
outline: none;
}
.ck-content a.ck-widget.ck-widget_selected,
.ck-content a.ck-link_selected {
outline: none;
box-shadow: 0 0 0 2px var(--link-selection-outline-color);
background: var(--link-hover-background);
}
/* Reference link */
.ck-content a.reference-link,
.ck-content a.reference-link:hover {
/* Apply underline only to the span inside the link so it can follow the
* target note's user defined color */
text-decoration: none;
text-decoration: none;
}
.ck-content a.reference-link > span {
.ck-content a.reference-link > span.use-note-color {
color: var(--custom-color, inherit);
}
.ck-content a.reference-link:hover > span {
text-decoration: underline;
}
@@ -690,4 +715,4 @@ html .note-detail-editable-text :not(figure, .include-note, hr):first-child {
.note-list-widget {
outline: 0 !important;
}
}

View File

@@ -151,6 +151,11 @@
--options-title-font-size: .75rem;
--options-title-offset: 13px;
}
.note-split.options {
--preferred-max-content-width: var(--options-card-max-width);
}
/* Create a gap at the top of the option pages */
.note-detail-content-widget-content.options>*:first-child {
margin-top: var(--options-first-item-top-margin, 1em);
@@ -172,6 +177,10 @@
height: 0;
}
body.experimental-feature-new-layout .note-detail-content-widget-content.options {
padding-inline: 25px;
}
.options-section:not(.tn-no-card) {
margin-bottom: calc(var(--options-title-offset) + 26px) !important;
box-shadow: var(--card-box-shadow);
@@ -181,10 +190,6 @@
padding: var(--options-card-padding);
}
body.prefers-centered-content .options-section:not(.tn-no-card) {
margin-inline: auto;
}
body.desktop .options-section:not(.tn-no-card) {
min-width: var(--options-card-min-width);
max-width: var(--options-card-max-width);

View File

@@ -168,25 +168,7 @@ ul.editability-dropdown li.dropdown-item > div {
* Note info
*/
:root .note-info-widget-table button.calculate-button {
min-width: 0;
padding: 4px 10px !important;
font-size: 0.8em;
}
/* Narrow width layout */
.note-info-widget {
container: info-section / inline-size;
}
/*
* Styling as a floating toolbar
*/
.ribbon-container {
position: sticky;
top: 0;
left: 0;
right: 0;
background: var(--main-background-color);
z-index: 997;
}

View File

@@ -497,7 +497,7 @@ div.bookmark-folder-widget .note-link:hover a {
}
/* The item's icon */
div.bookmark-folder-widget .note-link .bx {
div.bookmark-folder-widget .note-link .tn-icon {
color: var(--menu-item-icon-color);
font-size: 1.2em;
}
@@ -767,7 +767,7 @@ body.mobile .fancytree-node > span {
background: var(--left-pane-item-hover-background);
}
#left-pane span.fancytree-node.shared .fancytree-title::after {
#left-pane .note-indicator-icon.shared-indicator {
opacity: 0.5;
}
@@ -1029,7 +1029,7 @@ body.layout-vertical.electron.platform-darwin .tab-row-container {
}
body.layout-horizontal .tab-row-container {
padding-top: calc((var(--tab-bar-height) - var(--tab-height)));
padding-top: calc(var(--tab-bar-height) - var(--tab-height));
}
/* Define extra drag areas for Electron windows */
@@ -1069,8 +1069,9 @@ body.desktop:not(.background-effects.platform-win32) #root-widget.horizontal-lay
border-bottom-color: transparent;
}
.tab-row-widget .note-tab .note-tab-wrapper {
:root div.tab-row-widget div.note-tab div.note-tab-wrapper {
height: var(--tab-height) !important;
border-radius: 8px;
transition:
background 75ms ease-in,
box-shadow 75ms ease-in;
@@ -1084,7 +1085,7 @@ body.desktop:not(.background-effects.platform-win32) #root-widget.horizontal-lay
margin-top: calc((var(--tab-bar-height) - var(--tab-height)) * -1);
}
body.layout-horizontal .tab-row-widget .note-tab .note-tab-wrapper {
body.layout-horizontal div.tab-row-widget div.note-tab div.note-tab-wrapper {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
@@ -1221,20 +1222,53 @@ body.layout-vertical .tab-row-widget-is-sorting .note-tab.note-tab-is-dragging .
top: 0;
}
/*
* CLASSIC FORMATTING TOOLBAR
*/
#rest-pane > .classic-toolbar-widget {
margin-bottom: 2px;
}
body.layout-vertical #rest-pane > .classic-toolbar-widget {
border-start-start-radius: var(--center-pane-border-radius);
}
body.layout-vertical #rest-pane > .classic-toolbar-widget {
background: var(--classic-toolbar-vert-layout-background-color);
}
body.layout-horizontal #rest-pane > .classic-toolbar-widget {
background: var(--classic-toolbar-horiz-layout-background-color);
}
.classic-toolbar-widget:not(.hidden-ext) + #vertical-main-container {
/* Remove the center panel border radius when the toolbar is visible */
--center-pane-border-radius: 0;
}
/*
* CENTER PANE
*/
/* The first visible note split */
.vertical-layout #center-pane .note-split:not(.visible ~ .visible) {
border-radius: var(--center-pane-border-radius) 0 0 0;
border-start-start-radius: var(--center-pane-border-radius);
}
#center-pane .note-split {
padding-top: 2px;
background-color: var(--note-split-background-color, var(--main-background-color));
transition: border-color 250ms ease-in;
border: 2px solid transparent;
}
/* The active split in a multi-split view */
#center-pane > .split-note-container-widget:has(> .note-split.visible ~ .note-split.visible) > .note-split.active {
border-color: var(--link-selection-outline-color);
}
body:not(.background-effects) #center-pane .note-split {
animation: note-entrance 100ms linear;
}
@@ -1348,6 +1382,10 @@ body.mobile .note-title {
border-bottom: 2px solid #0000001c !important;
}
body.experimental-feature-new-layout #center-pane .note-split > div.alert {
margin-top: 0;
}
/*
* Promoted attributes
*/
@@ -1773,6 +1811,10 @@ div.find-replace-widget div.find-widget-found-wrapper > span {
background: var(--right-pane-background-color);
}
#right-pane > * {
animation: fade-in 200ms ease-in;
}
#right-pane div.card-header {
align-items: center;
border: 0;

View File

@@ -148,22 +148,26 @@ span.fancytree-node.protected > span.fancytree-custom-icon {
filter: drop-shadow(2px 2px 2px var(--main-text-color));
}
span.fancytree-node.multiple-parents.shared .fancytree-title::after {
/* Note indicator icons (clone, shared) - real DOM elements for tooltip support */
.note-indicator-icon {
font-family: "boxicons" !important;
font-size: smaller;
content: " \eb3d\ec03";
margin-inline-start: 4px;
opacity: 0.8;
cursor: help;
}
span.fancytree-node.multiple-parents .fancytree-title::after {
font-family: "boxicons" !important;
font-size: smaller;
content: " \eb3d"; /* lookup code for "link-alt" in boxicons.css */
.note-indicator-icon.clone-indicator::before {
content: "\eb3d"; /* bx-link-alt */
}
span.fancytree-node.shared .fancytree-title::after {
font-family: "boxicons" !important;
font-size: smaller;
content: " \ec03"; /* lookup code for "share-alt" in boxicons.css */
.note-indicator-icon.shared-indicator::before {
content: "\ec03"; /* bx-share-alt */
}
body.experimental-feature-new-layout .note-indicator-icon.clone-indicator::before {
content: "\ed82";
opacity: 0.5;
}
span.fancytree-node.fancytree-active-clone:not(.fancytree-active) .fancytree-title {
@@ -224,11 +228,11 @@ span.fancytree-node.archived {
opacity: 0.6;
}
.fancytree-node:hover .bx.tree-item-button {
.fancytree-node:hover .tn-icon.tree-item-button {
display: inline-block;
}
.bx.tree-item-button {
.tn-icon.tree-item-button {
display: none;
font-size: 120%;
cursor: pointer;
@@ -238,7 +242,7 @@ span.fancytree-node.archived {
border-radius: 5px;
}
.unhoist-button.bx.tree-item-button {
.unhoist-button.tn-icon.tree-item-button {
margin-inline-start: 0; /* unhoist button is on the left and doesn't need more margin */
display: block; /* keep always visible */
}

View File

@@ -1,10 +1,12 @@
import utils from "../services/utils.js";
import { NoteType } from "@triliumnext/commons";
import FAttribute from "../entities/fattribute.js";
import FBlob from "../entities/fblob.js";
import FBranch from "../entities/fbranch.js";
import FNote from "../entities/fnote.js";
import froca from "../services/froca.js";
import FAttribute from "../entities/fattribute.js";
import noteAttributeCache from "../services/note_attribute_cache.js";
import FBranch from "../entities/fbranch.js";
import FBlob from "../entities/fblob.js";
import utils from "../services/utils.js";
type AttributeDefinitions = { [key in `#${string}`]: string; };
type RelationDefinitions = { [key in `~${string}`]: string; };
@@ -12,6 +14,7 @@ type RelationDefinitions = { [key in `~${string}`]: string; };
interface NoteDefinition extends AttributeDefinitions, RelationDefinitions {
id?: string | undefined;
title: string;
type?: NoteType;
children?: NoteDefinition[];
content?: string;
}
@@ -45,7 +48,7 @@ export function buildNote(noteDef: NoteDefinition) {
const note = new FNote(froca, {
noteId: noteDef.id ?? utils.randomString(12),
title: noteDef.title,
type: "text",
type: noteDef.type ?? "text",
mime: "text/html",
isProtected: false,
blobId: ""
@@ -66,24 +69,6 @@ export function buildNote(noteDef: NoteDefinition) {
});
note.getBlob = async () => blob;
// Manage children.
if (noteDef.children) {
for (const childDef of noteDef.children) {
const childNote = buildNote(childDef);
const branchId = `${note.noteId}_${childNote.noteId}`;
const branch = new FBranch(froca, {
branchId,
noteId: childNote.noteId,
parentNoteId: note.noteId,
notePosition: childNotePosition,
fromSearchNote: false
});
froca.branches[branchId] = branch;
note.addChild(childNote.noteId, branchId, false);
childNotePosition += 10;
}
}
let position = 0;
for (const [ key, value ] of Object.entries(noteDef)) {
const attributeId = utils.randomString(12);
@@ -133,5 +118,25 @@ export function buildNote(noteDef: NoteDefinition) {
}
noteAttributeCache.attributes[note.noteId].push(attribute);
}
// Manage children.
if (noteDef.children) {
for (const childDef of noteDef.children) {
const childNote = buildNote(childDef);
const branchId = `${note.noteId}_${childNote.noteId}`;
const branch = new FBranch(froca, {
branchId,
noteId: childNote.noteId,
parentNoteId: note.noteId,
notePosition: childNotePosition,
fromSearchNote: false
});
froca.branches[branchId] = branch;
note.addChild(childNote.noteId, branchId, false);
childNote.addParent(note.noteId, branchId, false);
childNotePosition += 10;
}
}
return note;
}

View File

@@ -13,7 +13,8 @@ function injectGlobals() {
uncheckedWindow.$ = $;
uncheckedWindow.WebSocket = () => {};
uncheckedWindow.glob = {
isMainWindow: true
isMainWindow: true,
windowId: "main"
};
}

View File

@@ -11,11 +11,25 @@
},
"toast": {
"critical-error": {
"title": "خطأ فادح"
"title": "خطأ فادح",
"message": "حدث خطأ حرج يمنع تشغيل تطبيق العميل:\n\n{{message}}\n\nيُرجّح أن يكون سبب هذا الخطأ هو تعطل أحد البرامج النصية بشكل غير متوقع. حاول تشغيل التطبيق في الوضع الآمن لحل المشكلة."
},
"widget-error": {
"title": "فشل في البدء بعنصر الواجهة"
}
"title": "فشل في البدء بعنصر الواجهة",
"message-custom": "تعذر تهيئة عنصر واجهة المستخدم المخصص من الملاحظة ذات المعرّف \"{{id}}\" والعنوان \"{{title}}\" بسبب:\n\n{{message}}",
"message-unknown": "تعذر تهيئة عنصر واجهة المستخدم غير المعروف بسبب:\n\n{{message}}"
},
"bundle-error": {
"title": "فشل تحميل البرنامج النصي المخصص",
"message": "تعذر تنفيذ البرنامج النصي بسبب:\n\n{{message}}"
},
"widget-list-error": {
"title": "فشل في الحصول على قائمة الأدوات من الخادم"
},
"widget-render-error": {
"title": "فشل عرض عنصر واجهة مستخدم React مخصص"
},
"widget-missing-parent": "لا تحتوي الأداة المخصصة على خاصية إلزامية '{{property}}'.\n\nإذا كان من المفترض تشغيل هذا البرنامج النصي بدون عنصر واجهة مستخدم، فاستخدم '#run=frontendStartup' بدلاً من ذلك."
},
"add_link": {
"add_link": "أضافة رابط",
@@ -209,7 +223,6 @@
"backlink_other": ""
},
"note_icon": {
"category": "الفئة:",
"search": "بحث:",
"change_note_icon": "تغيير ايقونة الملاحظة",
"reset-default": "اعادة تعيين الى الايقونة الافتراضية"
@@ -471,7 +484,6 @@
"delete_button": "حذف",
"download_button": "تنزيل",
"restore_button": "أستعادة",
"preview": "معاينة:",
"note_revisions": "مراجعات الملاحظة",
"diff_on": "عرض الفروقات",
"diff_off": "عرض المحتوى",

View File

@@ -0,0 +1 @@
{}

View File

@@ -64,8 +64,7 @@
"restore_button": "Restaura",
"delete_button": "Suprimeix",
"download_button": "Descarrega",
"mime": "MIME: ",
"preview": "Vista prèvia:"
"mime": "MIME: "
},
"sort_child_notes": {
"title": "títol",
@@ -146,7 +145,6 @@
"relation": "relació"
},
"note_icon": {
"category": "Categoria:",
"search": "Cerca:"
},
"basic_properties": {

View File

@@ -21,8 +21,17 @@
},
"bundle-error": {
"title": "加载自定义脚本失败",
"message": "来自 ID 为 \"{{id}}\"、标题为 \"{{title}}\" 的笔记的脚本因以下原因无法执行:\n\n{{message}}"
}
"message": "脚本因以下原因无法执行:\n\n{{message}}"
},
"widget-list-error": {
"title": "无法从服务器取得小部件清单"
},
"widget-render-error": {
"title": "渲染自定义 React 小部件失败"
},
"widget-missing-parent": "自定义小部件未定义强制性的 \"{{property}}\" 属性。\n\n如果此脚本需要在没有 UI 元素的情况下运行,请改用“#run=frontendStartup”。",
"open-script-note": "打开脚本笔记",
"scripting-error": "自定义脚本错误:{{title}}"
},
"add_link": {
"add_link": "添加链接",
@@ -281,7 +290,6 @@
"download_button": "下载",
"mime": "MIME 类型: ",
"file_size": "文件大小:",
"preview": "预览:",
"preview_not_available": "无法预览此类型的笔记。",
"diff_on": "显示差异",
"diff_off": "显示内容",
@@ -693,7 +701,13 @@
"convert_into_attachment_successful": "笔记 '{{title}}' 已成功转换为附件。",
"convert_into_attachment_prompt": "确定要将笔记 '{{title}}' 转换为父笔记的附件吗?",
"print_pdf": "导出为 PDF...",
"open_note_on_server": "在服务器上打开笔记"
"open_note_on_server": "在服务器上打开笔记",
"view_revisions": "笔记修订...",
"note_map": "笔记地图",
"advanced": "高级",
"export_as_image": "导出为图像",
"export_as_image_png": "PNG栅格",
"export_as_image_svg": "SVG矢量图"
},
"onclick_button": {
"no_click_handler": "按钮组件'{{componentId}}'没有定义点击处理程序"
@@ -749,9 +763,15 @@
},
"note_icon": {
"change_note_icon": "更改笔记图标",
"category": "类别:",
"search": "搜索:",
"reset-default": "重置为默认图标"
"reset-default": "重置为默认图标",
"search_placeholder_other": "在 {{count}} 个图标包中搜索 {{number}} 个图标",
"search_placeholder_filtered": "在 {{name}} 中搜索 {{number}} 个图标",
"filter": "筛选",
"filter-none": "所有图标",
"filter-default": "默认图标",
"icon_tooltip": "{{name}}\n图标包{{iconPack}}",
"no_results": "没有找到图标。"
},
"basic_properties": {
"note_type": "笔记类型",
@@ -778,7 +798,8 @@
"expand_tooltip": "展开此集合的直接子代(单层深度)。点击右方箭头以查看更多选项。",
"expand_first_level": "展开直接子代",
"expand_nth_level": "展开 {{depth}} 层",
"expand_all_levels": "展开所有层级"
"expand_all_levels": "展开所有层级",
"hide_child_notes": "隐藏树中的子笔记"
},
"edited_notes": {
"no_edited_notes_found": "今天还没有编辑过的笔记...",
@@ -791,7 +812,7 @@
"file_type": "文件类型",
"file_size": "文件大小",
"download": "下载",
"open": "打开",
"open": "用外部程序打开",
"upload_new_revision": "上传新修订版本",
"upload_success": "新文件修订版本已上传。",
"upload_failed": "新文件修订版本上传失败。",
@@ -811,7 +832,8 @@
},
"inherited_attribute_list": {
"title": "继承的属性",
"no_inherited_attributes": "没有继承的属性。"
"no_inherited_attributes": "没有继承的属性。",
"none": "无"
},
"note_info_widget": {
"note_id": "笔记 ID",
@@ -822,7 +844,9 @@
"note_size_info": "笔记大小提供了该笔记存储需求的粗略估计。它考虑了笔记的内容及其笔记修订历史的内容。",
"calculate": "计算",
"subtree_size": "(子树大小: {{size}}, 共计 {{count}} 个笔记)",
"title": "笔记信息"
"title": "笔记信息",
"show_similar_notes": "显示相似的笔记",
"mime": "文件类型"
},
"note_map": {
"open_full": "展开显示",
@@ -885,7 +909,8 @@
"search_parameters": "搜索参数",
"unknown_search_option": "未知的搜索选项 {{searchOptionName}}",
"search_note_saved": "搜索笔记已保存到 {{- notePathTitle}}",
"actions_executed": "操作已执行。"
"actions_executed": "操作已执行。",
"view_options": "查看选项:"
},
"similar_notes": {
"title": "相似笔记",
@@ -1427,7 +1452,7 @@
"will_be_deleted_in": "此附件将在 {{time}} 后自动删除",
"will_be_deleted_soon": "该附件在不久后将被自动删除",
"deletion_reason": ",因为该附件未链接在笔记的内容中。为防止被删除,请将附件链接重新添加到内容中或将附件转换为笔记。",
"role_and_size": "角色:{{role}},大小:{{size}}",
"role_and_size": "角色:{{role}},大小:{{size}},文件类型:{{- mimeType}}",
"link_copied": "附件链接已复制到剪贴板。",
"unrecognized_role": "无法识别的附件角色 '{{role}}'。"
},
@@ -1481,7 +1506,10 @@
"duplicate": "复制",
"open-in-popup": "快速编辑",
"archive": "归档",
"unarchive": "解压"
"unarchive": "解压",
"open-in-a-new-window": "在新窗口中打开",
"hide-subtree": "隐藏子树",
"show-subtree": "显示子树"
},
"shared_info": {
"help_link": "访问 <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a> 获取帮助。",
@@ -1542,7 +1570,11 @@
},
"highlights_list_2": {
"title": "高亮列表",
"options": "选项"
"options": "选项",
"title_with_count_other": "{{count}} 处高亮",
"modal_title": "配置高亮列表",
"menu_configure": "配置高亮列表...",
"no_highlights": "未找到高亮内容。"
},
"quick-search": {
"placeholder": "快速搜索",
@@ -1566,7 +1598,15 @@
"create-child-note": "创建子笔记",
"unhoist": "取消聚焦",
"toggle-sidebar": "切换侧边栏",
"dropping-not-allowed": "不允许移动笔记到此处。"
"dropping-not-allowed": "不允许移动笔记到此处。",
"shared-indicator-tooltip": "此笔记已公开分享",
"shared-indicator-tooltip-with-url": "此笔记已公开分享至:{{- url}}",
"clone-indicator-tooltip": "此笔记有 {{- count}} 个父级: {{- parents}}",
"clone-indicator-tooltip-single": "此笔记已克隆1 个额外的父级:{{- parent}}",
"subtree-hidden-tooltip_other": "从树中隐藏的 {{count}} 篇子笔记",
"subtree-hidden-moved-title": "已添加到 {{title}}",
"subtree-hidden-moved-description-collection": "此集合隐藏其树中的子笔记。",
"subtree-hidden-moved-description-other": "子笔记隐藏于此笔记的树中。"
},
"title_bar_buttons": {
"window-on-top": "保持此窗口置顶"
@@ -1574,10 +1614,22 @@
"note_detail": {
"could_not_find_typewidget": "找不到类型为 '{{type}}' 的 typeWidget",
"printing": "正在打印…",
"printing_pdf": "正在导出为PDF…"
"printing_pdf": "正在导出为PDF…",
"print_report_title": "打印报告",
"print_report_collection_content_other": "集合中的 {{count}} 篇笔记无法打印,因为它们不受支持或受到保护。",
"print_report_collection_details_button": "查看详情",
"print_report_collection_details_ignored_notes": "忽略的笔记"
},
"note_title": {
"placeholder": "请输入笔记标题..."
"placeholder": "请输入笔记标题...",
"created_on": "建立于 <Value />",
"last_modified": "修改于 <Value />",
"note_type_switcher_label": "从 {{type}} 切换到:",
"note_type_switcher_others": "其他笔记类型",
"note_type_switcher_templates": "模板",
"note_type_switcher_collection": "集合",
"edited_notes": "今天编辑过的笔记",
"promoted_attributes": "升级属性"
},
"search_result": {
"no_notes_found": "没有找到符合搜索条件的笔记。",
@@ -1606,7 +1658,8 @@
},
"toc": {
"table_of_contents": "目录",
"options": "选项"
"options": "选项",
"no_headings": "无标题。"
},
"watched_file_update_status": {
"file_last_modified": "文件 <code class=\"file-path\"></code> 最后修改时间为 <span class=\"file-last-modified\"></span>。",
@@ -1939,8 +1992,9 @@
"unknown_widget": "未知组件:\"{{id}}\"."
},
"note_language": {
"not_set": "设置",
"configure-languages": "设置语言..."
"not_set": "设置语言",
"configure-languages": "设置语言...",
"help-on-languages": "内容语言帮助..."
},
"content_language": {
"title": "内容语言",
@@ -2007,7 +2061,7 @@
"book_properties_config": {
"hide-weekends": "隐藏周末",
"display-week-numbers": "显示周数",
"map-style": "地图样式",
"map-style": "地图样式",
"max-nesting-depth": "最大嵌套深度:",
"raster": "栅格",
"vector_light": "矢量(浅色)",
@@ -2051,7 +2105,7 @@
"configure_launch_bar_description": "打开启动栏配置,添加或移除项目。"
},
"content_renderer": {
"open_externally": "外部打开"
"open_externally": "外部程序打开"
},
"modal": {
"close": "关闭",
@@ -2064,14 +2118,20 @@
"next_theme_title": "试用新 Trilium 主题",
"next_theme_message": "当前使用旧版主题,要试用新主题吗?",
"next_theme_button": "试用新主题",
"dismiss": "关闭"
"dismiss": "关闭",
"new_layout_message": "我们为 Trilium 引入了现代化的布局。Ribbon 界面已被移除并无缝集成到主界面中,新的状态栏和可展开部分(例如“已提升属性”)取代了其主要功能。\n\n新布局默认启用您可以通过“选项”→“外观”暂时禁用它。",
"new_layout_button": "更多信息",
"new_layout_title": "新布局"
},
"settings": {
"related_settings": "相关设置"
},
"settings_appearance": {
"related_code_blocks": "文本笔记中代码块的色彩方案",
"related_code_notes": "代码笔记的色彩方案"
"related_code_notes": "代码笔记的色彩方案",
"ui": "用户界面",
"ui_old_layout": "旧布局",
"ui_new_layout": "新布局"
},
"units": {
"percentage": "%"
@@ -2086,7 +2146,7 @@
},
"pagination": {
"page_title": "第 {{startIndex}} 页 - 第 {{endIndex}} 页",
"total_notes": "{{count}} 笔记"
"total_notes": "{{count}} 笔记"
},
"collections": {
"rendering_error": "出现错误无法显示内容。"
@@ -2116,5 +2176,78 @@
"unknown_http_error_title": "与服务器通讯错误",
"unknown_http_error_content": "状态码: {{statusCode}}\n地址: {{method}} {{url}}\n信息: {{message}}",
"traefik_blocks_requests": "如果您使用 Traefik 反向代理,它引入了一项影响与服务器的通信重大更改。"
},
"experimental_features": {
"title": "实验选项",
"disclaimer": "这些选项处于实验阶段,可能导致系统不稳定。请谨慎使用。",
"new_layout_name": "新布局",
"new_layout_description": "尝试全新布局,呈现更现代的外观并提升易用性。后续版本将进行重大调整。"
},
"tab_history_navigation_buttons": {
"go-back": "返回前一笔记",
"go-forward": "前往下一笔记"
},
"breadcrumb_badges": {
"read_only_explicit": "只读",
"read_only_auto": "自动只读",
"shared_publicly": "公开共享",
"shared_locally": "本地共享",
"read_only_explicit_description": "此笔记已被手动设置为只读。\n点击可临时编辑。",
"read_only_auto_description": "出于性能原因,此笔记已被自动设置为只读模式。此自动限制可以在设置中调整。\n\n点击可临时编辑。",
"read_only_temporarily_disabled": "临时编辑",
"read_only_temporarily_disabled_description": "此笔记当前可编辑,但通常是只读的。一旦你切换到其他笔记,该笔记将恢复为只读模式。\n\n点击以重新启用只读模式。",
"clipped_note": "网页剪辑",
"clipped_note_description": "此笔记最初来自 {{url}}。\n\n点击即可跳转至源网页。",
"execute_script": "运行脚本",
"execute_script_description": "这是一篇脚本笔记。点击即可执行脚本。",
"execute_sql": "运行SQL",
"execute_sql_description": "这是一篇 SQL 笔记。点击即可执行 SQL 查询。",
"shared_copy_to_clipboard": "复制链接到剪贴板",
"shared_open_in_browser": "在浏览器中打开链接",
"shared_unshare": "取消共享",
"save_status_saved": "已保存",
"save_status_saving": "保存中...",
"save_status_unsaved": "未保存",
"save_status_error": "保存失败",
"save_status_unsaved_tooltip": "还有一些更改尚未保存。它们将稍后自动保存。",
"save_status_error_tooltip": "保存笔记时出错。如果可以,请尝试将笔记内容复制到其他位置并重新加载应用程序。",
"save_status_saving_tooltip": "更改正在保存。"
},
"status_bar": {
"language_title": "更改内容语言",
"note_info_title": "查看笔记信息(例如日期,笔记大小)",
"backlinks_title_other": "查看反链",
"attachments_title_other": "在新标签页中查看附件",
"attributes_other": "{{count}} 个属性",
"attributes_title": "拥有的属性和继承的属性",
"note_paths_title": "笔记路径",
"code_note_switcher": "更改语言模式",
"backlinks_other": "{{count}} 个反链",
"attachments_other": "{{count}} 个附件",
"note_paths_other": "{{count}} 条路径"
},
"breadcrumb": {
"workspace_badge": "工作空间",
"scroll_to_top_title": "跳转到笔记开始",
"hoisted_badge_title": "取消聚焦",
"hoisted_badge": "聚焦",
"create_new_note": "新建子笔记",
"empty_hide_archived_notes": "隐藏已存档的笔记"
},
"right_pane": {
"empty_button": "隐藏面板",
"toggle": "切换右侧面板",
"custom_widget_go_to_source": "跳转到源码",
"empty_message": "这篇笔记没有展示内容"
},
"attributes_panel": {
"title": "笔记属性"
},
"pdf": {
"attachments_other": "{{count}} 个附件",
"pages_other": "共{{count}}页",
"pages_alt": "第{{pageNumber}}页",
"pages_loading": "加载中...",
"layers_other": "{{count}} 层"
}
}

View File

@@ -108,6 +108,11 @@
"cloned_note_prefix_title": "Klonovaná poznámka se zobrazí ve stromu poznámek s danou předponou",
"clone_to_selected_note": "Klonovat vybranou poznámku",
"no_path_to_clone_to": "Žádná cest pro klonování.",
"note_cloned": "Poznámka: „{{clonedTitle}}“ bylo naklonováno do „{{targetTitle}}“"
"note_cloned": "Poznámka „{{clonedTitle}}“ bylo naklonována do „{{targetTitle}}“"
},
"zpetne_odkazy": {
"backlink_one": "{{count}} zpětný odkaz",
"backlink_few": "{{count}} zpětné odkazy",
"backlink_other": "{{count}} zpětných odkazů"
}
}

View File

@@ -1,6 +1,6 @@
{
"about": {
"title": "Über Trilium Notes",
"title": "Über Trilium Notizen",
"homepage": "Startseite:",
"app_version": "App-Version:",
"db_version": "DB-Version:",
@@ -21,8 +21,17 @@
},
"bundle-error": {
"title": "Benutzerdefiniertes Skript konnte nicht geladen werden",
"message": "Skript aus der Notiz \"{{title}}\" mit der ID \"{{id}}\", konnte nicht ausgeführt werden wegen:\n\n{{message}}"
}
"message": "Skript konnte nicht ausgeführt werden wegen:\n\n{{message}}"
},
"widget-list-error": {
"title": "Abruf der Liste von Widgets vom Server ist fehlgeschlagen"
},
"open-script-note": "Script-Notiz öffnen",
"widget-render-error": {
"title": "Eine externe React Integration konnte nicht dargestellt werden"
},
"widget-missing-parent": "Der externen Integration fehlt die erforderliche Eigenschaft '{{property}}'\n\nFalls dieses Skript ohne UI-Element ausgeführt werden soll, benutze stattdessen '#run=frontendStartup'.",
"scripting-error": "Benutzerdefinierter Skriptfehler: {{title}}"
},
"add_link": {
"add_link": "Link hinzufügen",
@@ -205,7 +214,8 @@
"info": {
"modalTitle": "Infonachricht",
"closeButton": "Schließen",
"okButton": "OK"
"okButton": "OK",
"copy_to_clipboard": "In Zwischenablage kopieren"
},
"jump_to_note": {
"search_button": "Suche im Volltext",
@@ -278,7 +288,6 @@
"download_button": "Herunterladen",
"mime": "MIME: ",
"file_size": "Dateigröße:",
"preview": "Vorschau:",
"preview_not_available": "Für diesen Notiztyp ist keine Vorschau verfügbar.",
"restore_button": "Wiederherstellen",
"delete_button": "Löschen",
@@ -689,7 +698,13 @@
"convert_into_attachment_successful": "Notiz '{{title}}' wurde als Anhang konvertiert.",
"convert_into_attachment_prompt": "Bist du dir sicher, dass du die Notiz '{{title}}' in ein Anhang der übergeordneten Notiz konvertieren möchtest?",
"print_pdf": "Export als PDF...",
"open_note_on_server": "Öffne Notiz auf dem Server"
"open_note_on_server": "Öffne Notiz auf dem Server",
"export_as_image": "Als Bild exportieren",
"export_as_image_png": "PNG (Raster)",
"export_as_image_svg": "SVG (Vektor)",
"note_map": "Notizen Karte",
"view_revisions": "Änderungshistorie...",
"advanced": "Fortgeschritten"
},
"onclick_button": {
"no_click_handler": "Das Schaltflächen-Widget „{{componentId}}“ hat keinen definierten Klick-Handler"
@@ -746,9 +761,16 @@
},
"note_icon": {
"change_note_icon": "Notiz-Icon ändern",
"category": "Kategorie:",
"search": "Suche:",
"reset-default": "Standard wiederherstellen"
"reset-default": "Standard wiederherstellen",
"search_placeholder_one": "Suche {{number}} Icons über {{count}} Pakete",
"search_placeholder_other": "Suche {{number}} Icons über {{count}} Pakete",
"search_placeholder_filtered": "Suche {{number}} Icons in {{name}}",
"filter": "Filter",
"filter-none": "Alle Icons",
"filter-default": "Standard Icons",
"icon_tooltip": "{{name}}\nIcon Paket: {{iconPack}}",
"no_results": "Keine Icons gefunden."
},
"basic_properties": {
"note_type": "Notiztyp",
@@ -775,7 +797,8 @@
"expand_all_levels": "Alle Ebenen erweitern",
"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"
"expand_nth_level": "{{depth}} Ebenen erweitern",
"hide_child_notes": "Unterknoten im Baum ausblenden"
},
"edited_notes": {
"no_edited_notes_found": "An diesem Tag wurden noch keine Notizen bearbeitet...",
@@ -788,7 +811,7 @@
"file_type": "Dateityp",
"file_size": "Dateigröße",
"download": "Herunterladen",
"open": "Offen",
"open": "Extern öffnen",
"upload_new_revision": "Neue Revision hochladen",
"upload_success": "Neue Dateirevision wurde hochgeladen.",
"upload_failed": "Das Hochladen einer neuen Dateirevision ist fehlgeschlagen.",
@@ -808,7 +831,8 @@
},
"inherited_attribute_list": {
"title": "Geerbte Attribute",
"no_inherited_attributes": "Keine geerbten Attribute."
"no_inherited_attributes": "Keine geerbten Attribute.",
"none": "Keine"
},
"note_info_widget": {
"note_id": "Notiz-ID",
@@ -819,7 +843,9 @@
"note_size_info": "Die Notizgröße bietet eine grobe Schätzung des Speicherbedarfs für diese Notiz. Es berücksichtigt den Inhalt der Notiz und den Inhalt ihrer Notizrevisionen.",
"calculate": "berechnen",
"subtree_size": "(Teilbaumgröße: {{size}} in {{count}} Notizen)",
"title": "Notizinfo"
"title": "Notizinfo",
"mime": "MIME Typ",
"show_similar_notes": "Zeige ähnliche Notizen"
},
"note_map": {
"open_full": "Vollständig erweitern",
@@ -882,7 +908,8 @@
"search_parameters": "Suchparameter",
"unknown_search_option": "Unbekannte Suchoption {{searchOptionName}}",
"search_note_saved": "Suchnotiz wurde in {{-notePathTitle}} gespeichert",
"actions_executed": "Aktionen wurden ausgeführt."
"actions_executed": "Aktionen wurden ausgeführt.",
"view_options": "Optionen anzeigen:"
},
"similar_notes": {
"title": "Ähnliche Notizen",
@@ -986,7 +1013,12 @@
"editable_text": {
"placeholder": "Gebe hier den Inhalt deiner Notiz ein...",
"auto-detect-language": "Automatisch erkannt",
"keeps-crashing": "Die Bearbeitungskomponente stürzt immer wieder ab. Bitte starten Sie Trilium neu. Wenn das Problem weiterhin besteht, erstellen Sie einen Fehlerbericht."
"keeps-crashing": "Die Bearbeitungskomponente stürzt immer wieder ab. Bitte starten Sie Trilium neu. Wenn das Problem weiterhin besteht, erstellen Sie einen Fehlerbericht.",
"editor_crashed_title": "Der Text Editor ist abgestürzt",
"editor_crashed_content": "Ihr Inhalt wurde erfolgreich wiederhergestellt, aber kürzlich gemachte Änderungen wurden unter Umständen nicht gespeichert.",
"editor_crashed_details_button": "Mehr Details anzeigen...",
"editor_crashed_details_intro": "Falls dieser Fehler häufiger auftritt, ziehen Sie in Betracht uns diesen über GitHub zu melden, indem Sie die folgenden Informationen bereitstellen.",
"editor_crashed_details_title": "Technische Informationen"
},
"empty": {
"open_note_instruction": "Öffne eine Notiz, indem du den Titel der Notiz in die Eingabe unten eingibst oder eine Notiz in der Baumstruktur auswählst.",
@@ -1386,7 +1418,7 @@
"will_be_deleted_in": "Dieser Anhang wird in {{time}} automatisch gelöscht",
"will_be_deleted_soon": "Dieser Anhang wird bald automatisch gelöscht",
"deletion_reason": ", da der Anhang nicht im Inhalt der Notiz verlinkt ist. Um das Löschen zu verhindern, füge den Anhangslink wieder in den Inhalt ein oder wandel den Anhang in eine Notiz um.",
"role_and_size": "Rolle: {{role}}, Größe: {{size}}",
"role_and_size": "Rolle: {{role}}, Größe: {{size}}, MIME: {{- mimeType}}",
"link_copied": "Anhangslink in die Zwischenablage kopiert.",
"unrecognized_role": "Unbekannte Anhangsrolle „{{role}}“."
},
@@ -1437,10 +1469,13 @@
"import-into-note": "In Notiz importieren",
"apply-bulk-actions": "Massenaktionen anwenden",
"converted-to-attachments": "{{count}} Notizen wurden als Anhang konvertiert.",
"convert-to-attachment-confirm": "Bist du sicher, dass du die ausgewählten Notizen in Anhänge ihrer übergeordneten Notizen umwandeln möchtest?",
"convert-to-attachment-confirm": "Bist du sicher, dass du die ausgewählten Notizen in Anhänge ihrer übergeordneten Notizen umwandeln möchtest? Diese Operation wird nur auf Bildnotizes angewandt. Andere Notizen werden übersprungen.",
"open-in-popup": "Schnellbearbeitung",
"archive": "Archiviere",
"unarchive": "Entarchivieren"
"unarchive": "Entarchivieren",
"open-in-a-new-window": "In neuem Fenster öffnen",
"hide-subtree": "Teilbaum ausblenden",
"show-subtree": "Teilbaum anzeigen"
},
"shared_info": {
"shared_publicly": "Diese Notiz ist öffentlich geteilt auf {{- link}}.",
@@ -1501,7 +1536,12 @@
},
"highlights_list_2": {
"title": "Hervorhebungs-Liste",
"options": "Optionen"
"options": "Optionen",
"title_with_count_one": "{{count}} Highlight",
"title_with_count_other": "{{count}} Highlights",
"modal_title": "Highlight Liste konfigurieren",
"menu_configure": "Highlight Liste konfigurieren…",
"no_highlights": "Keine Highlights gefunden."
},
"quick-search": {
"placeholder": "Schnellsuche",
@@ -1525,7 +1565,16 @@
"create-child-note": "Unternotiz anlegen",
"unhoist": "Fokus verlassen",
"toggle-sidebar": "Seitenleiste ein-/ausblenden",
"dropping-not-allowed": "Ablegen von Notizen an dieser Stelle ist nicht zulässig."
"dropping-not-allowed": "Ablegen von Notizen an dieser Stelle ist nicht zulässig.",
"clone-indicator-tooltip": "Diese Notiz hat {{- count}} Elterknoten: {{- parents}}",
"clone-indicator-tooltip-single": "Diese Notiz ist geklont (1 weiterer Elternknoten: {{- parent}})",
"shared-indicator-tooltip": "Diese Notiz ist öffentlich einsehbar",
"shared-indicator-tooltip-with-url": "Diese Notiz ist unter {{- url}} öffentlich einsehbar",
"subtree-hidden-tooltip_one": "{{count}} Unterknoten, der im Baum ausgeblendet ist",
"subtree-hidden-tooltip_other": "{{count}} Unterknoten, die im Baum ausgeblendet sind",
"subtree-hidden-moved-title": "Zu {{title}} hinzugefügt",
"subtree-hidden-moved-description-collection": "Diese Sammlung blendet ihre Unternotizem im Baum aus.",
"subtree-hidden-moved-description-other": "Diese Sammlung blendet ihre Unterknoten im Baum aus."
},
"title_bar_buttons": {
"window-on-top": "Dieses Fenster immer oben halten"
@@ -1533,10 +1582,23 @@
"note_detail": {
"could_not_find_typewidget": "Konnte typeWidget für Typ {{type}} nicht finden",
"printing": "Druckvorgang läuft…",
"printing_pdf": "PDF-Export läuft…"
"printing_pdf": "PDF-Export läuft…",
"print_report_title": "Druckreport",
"print_report_collection_details_button": "Details anzeigen",
"print_report_collection_details_ignored_notes": "Ignorierte Notizen",
"print_report_collection_content_one": "{{count}} Notiz in der Sammlung konnte nicht gedruckt werden, weil sie nicht unterstützt ist oder geschützt ist.",
"print_report_collection_content_other": "{{count}} Notizen in der Sammlung konnten nicht gedruckt werden, weil sie nicht unterstützt sind oder geschützt sind."
},
"note_title": {
"placeholder": "Titel der Notiz hier eingeben…"
"placeholder": "Titel der Notiz hier eingeben…",
"created_on": "Erstellt am <Value />",
"last_modified": "Bearbeitet am <Value />",
"note_type_switcher_label": "Ändere von {{type}} zu:",
"note_type_switcher_others": "Andere Notizart",
"note_type_switcher_templates": "Template",
"note_type_switcher_collection": "Sammlung",
"edited_notes": "Notizen, bearbeitet an diesem Tag",
"promoted_attributes": "Hervorgehobene Attribute"
},
"search_result": {
"no_notes_found": "Es wurden keine Notizen mit den angegebenen Suchparametern gefunden.",
@@ -1565,7 +1627,8 @@
},
"toc": {
"table_of_contents": "Inhaltsverzeichnis",
"options": "Optionen"
"options": "Optionen",
"no_headings": "Keine Überschriften."
},
"watched_file_update_status": {
"file_last_modified": "Datei <code class=\"file-path\"></code> wurde zuletzt geändert am <span class=\"file-last-modified\"></span>.",
@@ -1677,7 +1740,8 @@
"open_note_in_new_tab": "Notiz in neuen Tab öffnen",
"open_note_in_new_split": "Notiz in neuen geteilten Tab öffnen",
"open_note_in_new_window": "Notiz in neuen Fenster öffnen",
"open_note_in_popup": "Schnellbearbeitung"
"open_note_in_popup": "Schnellbearbeitung",
"open_note_in_other_split": "Notiz in neuer Spalte öffnen"
},
"electron_integration": {
"desktop-application": "Desktop Anwendung",
@@ -1945,8 +2009,9 @@
"unknown_widget": "Unbekanntes Widget für '{{id}}'."
},
"note_language": {
"not_set": "Nicht gesetzt",
"configure-languages": "Konfiguriere Sprachen..."
"not_set": "Keine Sprache ausgewählt",
"configure-languages": "Konfiguriere Sprachen...",
"help-on-languages": "Zu Übersetzungen beitragen..."
},
"content_language": {
"title": "Inhaltssprachen",
@@ -1964,7 +2029,8 @@
"button_title": "Exportiere Diagramm als PNG"
},
"svg": {
"export_to_png": "Das Diagramm konnte als PNG nicht exportiert werden."
"export_to_png": "Das Diagramm konnte als PNG nicht exportiert werden.",
"export_to_svg": "Das Diagramm konnte nicht als SVG exportiert werden."
},
"code_theme": {
"title": "Aussehen",
@@ -2012,7 +2078,7 @@
"book_properties_config": {
"hide-weekends": "Wochenenden ausblenden",
"display-week-numbers": "Zeige Kalenderwoche",
"map-style": "Kartenstil:",
"map-style": "Kartenstil",
"max-nesting-depth": "Maximale Verschachtelungstiefe:",
"raster": "Raster",
"vector_light": "Vektor (Hell)",
@@ -2065,14 +2131,20 @@
"background_effects_title": "Hintergrundeffekte sind jetzt zuverlässig nutzbar",
"background_effects_message": "Auf Windows-Geräten sind die Hintergrundeffekte nun vollständig stabil. Die Hintergrundeffekte verleihen der Benutzeroberfläche einen Farbakzent, indem der Hintergrund dahinter weichgezeichnet wird. Diese Technik wird auch in anderen Anwendungen wie dem Windows-Explorer eingesetzt.",
"background_effects_button": "Aktiviere Hintergrundeffekte",
"dismiss": "Ablehnen"
"dismiss": "Ablehnen",
"new_layout_title": "Neues Layout",
"new_layout_message": "Wir haben ein modernisiertes Layout für Trilium eingeführt. Die Multifunktionsleiste wurde entfernt und als neue Statusanzeige und ausklappbaren Sektionen (wie hervorgehobenen Attributen), welche Schlüsselfunktionen übernehmen, nahtlos in das Hauptinterface integriert.\n\nDas neue Layout ist standardmäßig aktiviert und kann temporär in Optionen → Anzeige deaktiviert werden.",
"new_layout_button": "Mehr Informationen"
},
"settings": {
"related_settings": "Ähnliche Einstellungen"
},
"settings_appearance": {
"related_code_blocks": "Farbschema für Code-Blöcke in Textnotizen",
"related_code_notes": "Farbschema für Code-Notizen"
"related_code_notes": "Farbschema für Code-Notizen",
"ui": "Benutzeroberfläche",
"ui_old_layout": "Altes Layout",
"ui_new_layout": "Neues Layout"
},
"units": {
"percentage": "%"
@@ -2104,5 +2176,92 @@
},
"popup-editor": {
"maximize": "Wechsele zum vollständigen Editor"
},
"experimental_features": {
"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."
},
"server": {
"unknown_http_error_title": "Bei der Kommunikation mit dem Server ist ein Fehler aufgetreten",
"unknown_http_error_content": "Statuscode: {{statusCode}}\nURL: {{method}} {{url}}\nNachricht: {{message}}",
"traefik_blocks_requests": "Der Traefik Reverse-Proxy hat ein fatales Update bekommen, welche die Kommunikation mit dem Server stört."
},
"tab_history_navigation_buttons": {
"go-back": "Zur vorherigen Notiz zurück kehren",
"go-forward": "Zur nächsten Notiz"
},
"breadcrumb": {
"hoisted_badge": "Gehoben",
"hoisted_badge_title": "Abgesenkt",
"workspace_badge": "Arbeitsfläche",
"scroll_to_top_title": "Zum Anfang der Notiz springen",
"create_new_note": "Neue Unternotiz erstellen",
"empty_hide_archived_notes": "Archivierte Notizen ausblenden"
},
"breadcrumb_badges": {
"read_only_explicit": "Nicht Änderbar",
"read_only_explicit_description": "Diese Notiz wurde händisch als nicht änderbar markiert.\nKlicke hier um sie temporär zu bearbeiten.",
"read_only_auto": "Automatisch nicht änderbar",
"read_only_auto_description": "Diese Notiz wurde automatisch aus Leistungsgründen als nicht änderbar markiert. Dieses automatische Limit kann in den Einstellungen angepasst werden.\n\nKlicke hier, um sie temporär zu bearbeiten.",
"read_only_temporarily_disabled": "Temporär bearbeitbar",
"read_only_temporarily_disabled_description": "Diese Notiz ist aktuell bearbeitbar, ist aber normalerweise nicht änderbar. Sobald du zu einer anderen Notiz navigierst, kehrt diese Notiz in ihren Normalzustand zurück.\n\nKlicke hier, um die Notiz wieder nicht änderbar zu machen.",
"shared_publicly": "Öffentlich geteilt",
"shared_locally": "Lokal geteilt",
"shared_copy_to_clipboard": "Link in die Zwischenablage kopieren",
"shared_open_in_browser": "Link öffnen",
"shared_unshare": "Teilen aufheben",
"clipped_note": "Internetschnellverweis",
"clipped_note_description": "Diese Notiz wurde von {{url}} übernommen.\n\nKlicke hier, um zum Ursprung zu gehen.",
"execute_script": "Skript ausführen",
"execute_script_description": "Diese Notiz ist eine Skriptnotiz. Klicke hier, um das Skript auszuführen.",
"execute_sql": "SQL ausführen",
"execute_sql_description": "Diese Notiz ist eine SQL-Notiz. Klicke hier, um die SQL-Abfrage auszuführen.",
"save_status_saved": "Gespeichert",
"save_status_saving": "Speichern...",
"save_status_unsaved": "Nicht gespeichert",
"save_status_error": "Speichern fehlgeschlagen",
"save_status_saving_tooltip": "Änderungen werden gespeichert.",
"save_status_unsaved_tooltip": "Es gibt ungespeicherte Änderungen, welche gleich automatisch gespeichert werden.",
"save_status_error_tooltip": "Beim speichern der Notiz ist ein Fehler aufgetreten. Wenn möglich, versuche die Notiz woandershin zu kopieren und die Applikation neu zu laden."
},
"status_bar": {
"language_title": "Inhaltssprache ändern",
"note_info_title": "Notizinfo anzeigen (z.B.: Datum, Notizgröße)",
"backlinks_one": "{{count}} Rücklink",
"backlinks_other": "{{count}} Rücklinks",
"backlinks_title_one": "Rücklink anzeigen",
"backlinks_title_other": "Rücklinks anzeigen",
"attachments_one": "{{count}} Anhang",
"attachments_other": "{{count}} Anhänge",
"attachments_title_one": "Anhang in einem neuen Tab öffnen",
"attachments_title_other": "Anhänge in einem neuen Tab öffnen",
"attributes_one": "{{count}} Eigenschaft",
"attributes_other": "{{count}} Eigenschaften",
"attributes_title": "Eigene und gererbte Eigenschaften",
"note_paths_one": "{{count}} Pfad",
"note_paths_other": "{{count}} Pfade",
"note_paths_title": "Notizpfade",
"code_note_switcher": "Sprachmodus ändern"
},
"attributes_panel": {
"title": "Notizeigenschaften"
},
"right_pane": {
"empty_message": "Für diese Notiz gibt es nichts anzuzeigen",
"empty_button": "Anzeige ausblenden",
"toggle": "Rechte Anzeige umschalten",
"custom_widget_go_to_source": "Zum Ursprungscode"
},
"pdf": {
"attachments_one": "{{count}} Anhang",
"attachments_other": "{{count}} Anhänge",
"layers_one": "{{count}} Ebene",
"layers_other": "{{count}} Ebenen",
"pages_one": "{{count}} Seite",
"pages_other": "{{count}} Seiten",
"pages_alt": "Seite {{pageNumber}}",
"pages_loading": "Laden..."
}
}

View File

@@ -69,5 +69,8 @@
"clear-color": "Clear note colour",
"set-color": "Set note colour",
"set-custom-color": "Set custom note colour"
},
"about": {
"title": "About Trilium Notes"
}
}

View File

@@ -21,8 +21,17 @@
},
"bundle-error": {
"title": "Failed to load a custom script",
"message": "Script from note with ID \"{{id}}\", titled \"{{title}}\" could not be executed due to:\n\n{{message}}"
}
"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",
@@ -286,7 +295,6 @@
"download_button": "Download",
"mime": "MIME: ",
"file_size": "File size:",
"preview": "Preview:",
"preview_not_available": "Preview isn't available for this note type."
},
"sort_child_notes": {
@@ -689,11 +697,17 @@
"export_note": "Export note",
"delete_note": "Delete note",
"print_note": "Print note",
"view_revisions": "Note revisions...",
"save_revision": "Save revision",
"advanced": "Advanced",
"convert_into_attachment_failed": "Converting note '{{title}}' failed.",
"convert_into_attachment_successful": "Note '{{title}}' has been converted to attachment.",
"convert_into_attachment_prompt": "Are you sure you want to convert note '{{title}}' into an attachment of the parent note?",
"print_pdf": "Export as PDF..."
"print_pdf": "Export as PDF...",
"export_as_image": "Export as image",
"export_as_image_png": "PNG (raster)",
"export_as_image_svg": "SVG (vector)",
"note_map": "Note map"
},
"onclick_button": {
"no_click_handler": "Button widget '{{componentId}}' has no defined click handler"
@@ -750,9 +764,16 @@
},
"note_icon": {
"change_note_icon": "Change note icon",
"category": "Category:",
"search": "Search:",
"reset-default": "Reset to default icon"
"search_placeholder_one": "Search {{number}} icons across {{count}} packs",
"search_placeholder_other": "Search {{number}} icons across {{count}} packs",
"search_placeholder_filtered": "Search {{number}} icons in {{name}}",
"reset-default": "Reset to default icon",
"filter": "Filter",
"filter-none": "All icons",
"filter-default": "Default icons",
"icon_tooltip": "{{name}}\nIcon pack: {{iconPack}}",
"no_results": "No icons found."
},
"basic_properties": {
"note_type": "Note type",
@@ -779,7 +800,8 @@
"geo-map": "Geo Map",
"board": "Board",
"presentation": "Presentation",
"include_archived_notes": "Show archived notes"
"include_archived_notes": "Show archived notes",
"hide_child_notes": "Hide child notes in tree"
},
"edited_notes": {
"no_edited_notes_found": "No edited notes on this day yet...",
@@ -792,7 +814,7 @@
"file_type": "File type",
"file_size": "File size",
"download": "Download",
"open": "Open",
"open": "Open externally",
"upload_new_revision": "Upload new revision",
"upload_success": "New file revision has been uploaded.",
"upload_failed": "Upload of a new file revision failed.",
@@ -812,18 +834,21 @@
},
"inherited_attribute_list": {
"title": "Inherited Attributes",
"no_inherited_attributes": "No inherited attributes."
"no_inherited_attributes": "No inherited attributes.",
"none": "none"
},
"note_info_widget": {
"note_id": "Note ID",
"created": "Created",
"modified": "Modified",
"type": "Type",
"mime": "MIME type",
"note_size": "Note size",
"note_size_info": "Note size provides rough estimate of storage requirements for this note. It takes into account note's content and content of its note revisions.",
"calculate": "calculate",
"subtree_size": "(subtree size: {{size}} in {{count}} notes)",
"title": "Note Info"
"title": "Note Info",
"show_similar_notes": "Show similar notes"
},
"note_map": {
"open_full": "Expand to full",
@@ -886,7 +911,8 @@
"search_parameters": "Search Parameters",
"unknown_search_option": "Unknown search option {{searchOptionName}}",
"search_note_saved": "Search note has been saved into {{- notePathTitle}}",
"actions_executed": "Actions have been executed."
"actions_executed": "Actions have been executed.",
"view_options": "View options:"
},
"similar_notes": {
"title": "Similar Notes",
@@ -1096,6 +1122,12 @@
"vacuuming_database": "Vacuuming database...",
"database_vacuumed": "Database has been vacuumed"
},
"experimental_features": {
"title": "Experimental Options",
"disclaimer": "These options are experimental and may cause instability. Use with caution.",
"new_layout_name": "New Layout",
"new_layout_description": "Try out the new layout for a more modern look and improved usability. Subject to heavy change in the upcoming releases."
},
"fonts": {
"theme_defined": "Theme defined",
"fonts": "Fonts",
@@ -1588,7 +1620,7 @@
"will_be_deleted_in": "This attachment will be automatically deleted in {{time}}",
"will_be_deleted_soon": "This attachment will be automatically deleted soon",
"deletion_reason": ", because the attachment is not linked in the note's content. To prevent deletion, add the attachment link back into the content or convert the attachment into note.",
"role_and_size": "Role: {{role}}, Size: {{size}}",
"role_and_size": "Role: {{role}}, size: {{size}}, MIME: {{- mimeType}}",
"link_copied": "Attachment link copied to clipboard.",
"unrecognized_role": "Unrecognized attachment role '{{role}}'."
},
@@ -1612,6 +1644,7 @@
"tree-context-menu": {
"open-in-a-new-tab": "Open in a new tab",
"open-in-a-new-split": "Open in a new split",
"open-in-a-new-window": "Open in a new window",
"insert-note-after": "Insert note after",
"insert-child-note": "Insert child note",
"archive": "Archive",
@@ -1624,6 +1657,8 @@
"advanced": "Advanced",
"expand-subtree": "Expand subtree",
"collapse-subtree": "Collapse subtree",
"hide-subtree": "Hide subtree",
"show-subtree": "Show subtree",
"sort-by": "Sort by...",
"recent-changes-in-subtree": "Recent changes in subtree",
"convert-to-attachment": "Convert to attachment",
@@ -1708,7 +1743,12 @@
},
"highlights_list_2": {
"title": "Highlights List",
"options": "Options"
"title_with_count_one": "{{count}} highlight",
"title_with_count_other": "{{count}} highlights",
"options": "Options",
"modal_title": "Configure Highlights List",
"menu_configure": "Configure highlights list...",
"no_highlights": "No highlights found."
},
"quick-search": {
"placeholder": "Quick search",
@@ -1732,7 +1772,16 @@
"create-child-note": "Create child note",
"unhoist": "Unhoist",
"toggle-sidebar": "Toggle sidebar",
"dropping-not-allowed": "Dropping notes into this location is not allowed."
"dropping-not-allowed": "Dropping notes into this location is not allowed.",
"clone-indicator-tooltip": "This note has {{- count}} parents: {{- parents}}",
"clone-indicator-tooltip-single": "This note is cloned (1 additional parent: {{- parent}})",
"shared-indicator-tooltip": "This note is shared publicly",
"shared-indicator-tooltip-with-url": "This note is shared publicly at: {{- url}}",
"subtree-hidden-tooltip_one": "{{count}} child note that is hidden from the tree",
"subtree-hidden-tooltip_other": "{{count}} child notes that are hidden from the tree",
"subtree-hidden-moved-title": "Added to {{title}}",
"subtree-hidden-moved-description-collection": "This collection hides its child notes in the tree.",
"subtree-hidden-moved-description-other": "Child notes are hidden in the tree for this note."
},
"title_bar_buttons": {
"window-on-top": "Keep Window on Top"
@@ -1740,10 +1789,23 @@
"note_detail": {
"could_not_find_typewidget": "Could not find typeWidget for type '{{type}}'",
"printing": "Printing in progress...",
"printing_pdf": "Exporting to PDF in progress..."
"printing_pdf": "Exporting to PDF in progress...",
"print_report_title": "Print report",
"print_report_collection_content_one": "{{count}} note in the collection could not be printed because they are not supported or they are protected.",
"print_report_collection_content_other": "{{count}} notes in the collection could not be printed because they are not supported or they are protected.",
"print_report_collection_details_button": "See details",
"print_report_collection_details_ignored_notes": "Ignored notes"
},
"note_title": {
"placeholder": "type note's title here..."
"placeholder": "type note's title here...",
"created_on": "Created on <Value />",
"last_modified": "Modified on <Value />",
"note_type_switcher_label": "Switch from {{type}} to:",
"note_type_switcher_others": "Other note type",
"note_type_switcher_templates": "Template",
"note_type_switcher_collection": "Collection",
"edited_notes": "Notes edited on this day",
"promoted_attributes": "Promoted attributes"
},
"search_result": {
"no_notes_found": "No notes have been found for given search parameters.",
@@ -1772,7 +1834,8 @@
},
"toc": {
"table_of_contents": "Table of Contents",
"options": "Options"
"options": "Options",
"no_headings": "No headings."
},
"watched_file_update_status": {
"file_last_modified": "File <code class=\"file-path\"></code> has been last modified on <span class=\"file-last-modified\"></span>.",
@@ -1953,8 +2016,9 @@
"unknown_widget": "Unknown widget for \"{{id}}\"."
},
"note_language": {
"not_set": "Not set",
"configure-languages": "Configure languages..."
"not_set": "No language set",
"configure-languages": "Configure languages...",
"help-on-languages": "Help on content languages..."
},
"content_language": {
"title": "Content languages",
@@ -2021,7 +2085,7 @@
"book_properties_config": {
"hide-weekends": "Hide weekends",
"display-week-numbers": "Display week numbers",
"map-style": "Map style:",
"map-style": "Map style",
"max-nesting-depth": "Max nesting depth:",
"raster": "Raster",
"vector_light": "Vector (Light)",
@@ -2086,6 +2150,9 @@
"background_effects_title": "Background effects are now stable",
"background_effects_message": "On Windows devices, background effects are now fully stable. The background effects adds a touch of color to the user interface by blurring the background behind it. This technique is also used in other applications such as Windows Explorer.",
"background_effects_button": "Enable background effects",
"new_layout_title": "New layout",
"new_layout_message": "Weve introduced a modernized layout for Trilium. The ribbon has been removed and seamlessly integrated into the main interface, with a new status bar and expandable sections (such as promoted attributes) taking over key functions.\n\nThe new layout is enabled by default, and can be temporarily disabled via Options → Appearance.",
"new_layout_button": "More info",
"dismiss": "Dismiss"
},
"settings": {
@@ -2093,7 +2160,10 @@
},
"settings_appearance": {
"related_code_blocks": "Color scheme for code blocks in text notes",
"related_code_notes": "Color scheme for code notes"
"related_code_notes": "Color scheme for code notes",
"ui": "User interface",
"ui_old_layout": "Old layout",
"ui_new_layout": "New layout"
},
"units": {
"percentage": "%"
@@ -2121,5 +2191,77 @@
"tab_history_navigation_buttons": {
"go-back": "Go back to previous note",
"go-forward": "Go forward to next note"
},
"breadcrumb": {
"hoisted_badge": "Hoisted",
"hoisted_badge_title": "Unhoist",
"workspace_badge": "Workspace",
"scroll_to_top_title": "Jump to the beginning of the note",
"create_new_note": "Create new child note",
"empty_hide_archived_notes": "Hide archived notes"
},
"breadcrumb_badges": {
"read_only_explicit": "Read-only",
"read_only_explicit_description": "This note has been manually set to read-only.\nClick to edit it temporarily.",
"read_only_auto": "Auto read-only",
"read_only_auto_description": "This note was set automatically to read-only mode for performance reasons. This automatic limit is adjustable from settings.\n\nClick to edit it temporarily.",
"read_only_temporarily_disabled": "Temporarily editable",
"read_only_temporarily_disabled_description": "This note is currently editable, but it is normally read-only. The note will go back to being read-only as soon as you navigate to another note.\n\nClick to re-enable read-only mode.",
"shared_publicly": "Shared publicly",
"shared_locally": "Shared locally",
"shared_copy_to_clipboard": "Copy link to clipboard",
"shared_open_in_browser": "Open link in browser",
"shared_unshare": "Remove share",
"clipped_note": "Web clip",
"clipped_note_description": "This note was originally taken from {{url}}.\n\nClick to navigate to the source webpage.",
"execute_script": "Run script",
"execute_script_description": "This note is a script note. Click to execute the script.",
"execute_sql": "Run SQL",
"execute_sql_description": "This note is a SQL note. Click to execute the SQL query.",
"save_status_saved": "Saved",
"save_status_saving": "Saving...",
"save_status_unsaved": "Unsaved",
"save_status_error": "Save failed",
"save_status_saving_tooltip": "Changes are being saved.",
"save_status_unsaved_tooltip": "There are unsaved changes. They will be saved automatically in a moment.",
"save_status_error_tooltip": "An error occurred while saving the note. If possible, try copying the note content elsewhere and reloading the application."
},
"status_bar": {
"language_title": "Change content language",
"note_info_title": "View note info (e.g., dates, note size)",
"backlinks_one": "{{count}} backlink",
"backlinks_other": "{{count}} backlinks",
"backlinks_title_one": "View backlink",
"backlinks_title_other": "View backlinks",
"attachments_one": "{{count}} attachment",
"attachments_other": "{{count}} attachments",
"attachments_title_one": "View attachment in a new tab",
"attachments_title_other": "View attachments in a new tab",
"attributes_one": "{{count}} attribute",
"attributes_other": "{{count}} attributes",
"attributes_title": "Owned attributes and inherited attributes",
"note_paths_one": "{{count}} path",
"note_paths_other": "{{count}} paths",
"note_paths_title": "Note paths",
"code_note_switcher": "Change language mode"
},
"attributes_panel": {
"title": "Note Attributes"
},
"right_pane": {
"empty_message": "Nothing to show for this note",
"empty_button": "Hide the panel",
"toggle": "Toggle right panel",
"custom_widget_go_to_source": "Go to source code"
},
"pdf": {
"attachments_one": "{{count}} attachment",
"attachments_other": "{{count}} attachments",
"layers_one": "{{count}} layer",
"layers_other": "{{count}} layers",
"pages_one": "{{count}} page",
"pages_other": "{{count}} pages",
"pages_alt": "Page {{pageNumber}}",
"pages_loading": "Loading..."
}
}

View File

@@ -21,7 +21,13 @@
},
"bundle-error": {
"title": "Hubo un fallo al cargar un script personalizado",
"message": "El script de la nota con ID \"{{id}}\", titulado \"{{title}}\" no pudo ser ejecutado debido a:\n\n{{message}}"
"message": "El script no pudo ser ejecutado debido a:\n\n{{message}}"
},
"widget-list-error": {
"title": "Hubo un fallo al obtener la lista de widgets del servidor"
},
"widget-render-error": {
"title": "Hubo un fallo al renderizar un widget personalizado de React"
}
},
"add_link": {
@@ -162,7 +168,8 @@
"other": "Otro",
"quickSearch": "centrarse en la entrada de búsqueda rápida",
"inPageSearch": "búsqueda en la página",
"title": "Hoja de ayuda"
"title": "Hoja de ayuda",
"editShortcuts": "Editar atajos de teclado"
},
"import": {
"importIntoNote": "Importar a nota",
@@ -279,7 +286,6 @@
"download_button": "Descargar",
"mime": "MIME: ",
"file_size": "Tamaño del archivo:",
"preview": "Vista previa:",
"preview_not_available": "La vista previa no está disponible para este tipo de notas.",
"diff_off": "Mostrar contenido",
"diff_on": "Mostrar diferencia",
@@ -691,7 +697,7 @@
"convert_into_attachment_successful": "La nota '{{title}}' ha sido convertida a un archivo adjunto.",
"convert_into_attachment_prompt": "¿Está seguro que desea convertir la nota '{{title}}' en un archivo adjunto de la nota padre?",
"print_pdf": "Exportar como PDF...",
"open_note_on_server": "Abrir nota en el servidor"
"open_note_on_server": "Abrir nota en servidor"
},
"onclick_button": {
"no_click_handler": "El widget de botón '{{componentId}}' no tiene un controlador de clics definido"
@@ -737,7 +743,7 @@
"zpetne_odkazy": {
"relation": "relación",
"backlink_one": "{{count}} Vínculo de retroceso",
"backlink_many": "",
"backlink_many": "{{count}} Vínculos de retroceso",
"backlink_other": "{{count}} vínculos de retroceso"
},
"mobile_detail_menu": {
@@ -749,9 +755,11 @@
},
"note_icon": {
"change_note_icon": "Cambiar icono de nota",
"category": "Categoría:",
"search": "Búsqueda:",
"reset-default": "Restablecer a icono por defecto"
"reset-default": "Restablecer a icono por defecto",
"search_placeholder_one": "Buscar {{number}} icono a través de {{count}} paquetes",
"search_placeholder_many": "Buscar {{number}} iconos a través de {{count}} paquetes",
"search_placeholder_other": "Buscar {{number}} iconos a través de {{count}} paquetes"
},
"basic_properties": {
"note_type": "Tipo de nota",
@@ -791,7 +799,7 @@
"file_type": "Tipo de archivo",
"file_size": "Tamaño del archivo",
"download": "Descargar",
"open": "Abrir",
"open": "Abrir externamente",
"upload_new_revision": "Subir nueva revisión",
"upload_success": "Se ha subido una nueva revisión de archivo.",
"upload_failed": "Error al cargar una nueva revisión de archivo.",
@@ -1304,11 +1312,11 @@
"code_mime_types": {
"title": "Tipos MIME disponibles en el menú desplegable",
"tooltip_syntax_highlighting": "Resaltado de sintaxis",
"tooltip_code_block_syntax": "Bloques de código en notas de texto",
"tooltip_code_note_syntax": "Notas de código"
"tooltip_code_block_syntax": "Bloques de Código en notas de Texto",
"tooltip_code_note_syntax": "Notas de Código"
},
"vim_key_bindings": {
"use_vim_keybindings_in_code_notes": "Atajos de teclas de Vim",
"use_vim_keybindings_in_code_notes": "Combinaciones de teclas Vim",
"enable_vim_keybindings": "Habilitar los atajos de teclas de Vim en la notas de código (no es modo ex)"
},
"wrap_lines": {
@@ -1573,7 +1581,7 @@
"will_be_deleted_in": "Este archivo adjunto se eliminará automáticamente en {{time}}",
"will_be_deleted_soon": "Este archivo adjunto se eliminará automáticamente pronto",
"deletion_reason": ", porque el archivo adjunto no está vinculado en el contenido de la nota. Para evitar la eliminación, vuelva a agregar el enlace del archivo adjunto al contenido o convierta el archivo adjunto en una nota.",
"role_and_size": "Rol: {{role}}, Tamaño: {{size}}",
"role_and_size": "Rol: {{role}}, tamaño: {{size}}, MIME: {{- mimeType}}",
"link_copied": "Enlace del archivo adjunto copiado al portapapeles.",
"unrecognized_role": "Rol de archivo adjunto no reconocido '{{role}}'."
},
@@ -1624,7 +1632,7 @@
"import-into-note": "Importar a nota",
"apply-bulk-actions": "Aplicar acciones en lote",
"converted-to-attachments": "{{count}} notas han sido convertidas en archivos adjuntos.",
"convert-to-attachment-confirm": "¿Está seguro que desea convertir las notas seleccionadas en archivos adjuntos de sus notas padres?",
"convert-to-attachment-confirm": "¿Está seguro que desea convertir las notas seleccionadas en archivos adjuntos de sus notas padres? Esta operación solo aplica a notas de Imagen, otras notas serán omitidas.",
"open-in-popup": "Edición rápida",
"archive": "Archivar",
"unarchive": "Desarchivar"
@@ -1719,7 +1727,10 @@
"note_detail": {
"could_not_find_typewidget": "No se pudo encontrar typeWidget para el tipo '{{type}}'",
"printing": "Impresión en curso...",
"printing_pdf": "Exportando a PDF en curso.."
"printing_pdf": "Exportando a PDF en curso..",
"print_report_collection_content_one": "{{count}} nota en la colección no se puede imprimir porque no son compatibles o está protegida.",
"print_report_collection_content_many": "{{count}} notas en la colección no se pueden imprimir porque no son compatibles o están protegidas.",
"print_report_collection_content_other": "{{count}} notas en la colección no se pueden imprimir porque no son compatibles o están protegidas."
},
"note_title": {
"placeholder": "escriba el título de la nota aquí..."
@@ -1931,7 +1942,7 @@
"unknown_widget": "Widget desconocido para \"{{id}}\"."
},
"note_language": {
"not_set": "No establecido",
"not_set": "Idioma no establecido",
"configure-languages": "Configurar idiomas..."
},
"content_language": {
@@ -1970,7 +1981,7 @@
"hide-weekends": "Ocultar fines de semana",
"show-scale": "Mostrar escala",
"display-week-numbers": "Mostrar números de semana",
"map-style": "Estilo de mapa:",
"map-style": "Estilo de mapa",
"max-nesting-depth": "Máxima profundidad de anidamiento:",
"vector_light": "Vector (claro)",
"vector_dark": "Vector (oscuro)",
@@ -2099,5 +2110,36 @@
"clear-color": "Borrar color de nota",
"set-color": "Asignar color de nota",
"set-custom-color": "Asignar color de nota personalizado"
},
"status_bar": {
"backlinks_one": "{{count}} vínculo de retroceso",
"backlinks_many": "{{count}} vínculos de retroceso",
"backlinks_other": "{{count}} vínculos de retroceso",
"backlinks_title_one": "Ver vínculo de retroceso",
"backlinks_title_many": "Ver vínculos de retroceso",
"backlinks_title_other": "Ver vínculos de retroceso",
"attachments_one": "{{count}} adjunto",
"attachments_many": "{{count}} adjuntos",
"attachments_other": "{{count}} adjuntos",
"attachments_title_one": "Ver adjunto en una nueva pestaña",
"attachments_title_many": "Ver adjuntos en una nueva pestaña",
"attachments_title_other": "Ver adjuntos en una nueva pestaña",
"attributes_one": "{{count}} atributo",
"attributes_many": "{{count}} atributos",
"attributes_other": "{{count}} atributos",
"note_paths_one": "{{count}} ruta",
"note_paths_many": "{{count}} rutas",
"note_paths_other": "{{count}} rutas"
},
"pdf": {
"attachments_one": "{{count}} adjunto",
"attachments_many": "{{count}} adjuntos",
"attachments_other": "{{count}} adjuntos",
"layers_one": "{{count}} capa",
"layers_many": "{{count}} capas",
"layers_other": "{{count}} capas",
"pages_one": "{{count}} página",
"pages_many": "{{count}} páginas",
"pages_other": "{{count}} páginas"
}
}

View File

@@ -21,7 +21,13 @@
},
"bundle-error": {
"title": "Echec du chargement d'un script personnalisé",
"message": "Le script de la note avec l'ID \"{{id}}\", intitulé \"{{title}}\" n'a pas pu être exécuté à cause de\n\n{{message}}"
"message": "Le script n'a pas pu être exécuté à cause de\n\n{{message}}"
},
"widget-list-error": {
"title": "Impossible d'obtenir la liste des widgets depuis le serveur"
},
"widget-render-error": {
"title": "Rendu impossible d'un widget React custom"
}
},
"add_link": {
@@ -107,7 +113,8 @@
"export_status": "Statut d'exportation",
"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."
"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."
},
"help": {
"noteNavigation": "Navigation dans les notes",
@@ -161,7 +168,8 @@
"quickSearch": "aller à la recherche rapide",
"inPageSearch": "recherche sur la page",
"title": "Aide-mémoire",
"newTabWithActivationNoteLink": "Lorsquon clique sur un lien de note, celle-ci souvre et devient active dans un nouvel onglet"
"newTabWithActivationNoteLink": "Lorsquon clique sur un lien de note, celle-ci souvre et devient active dans un nouvel onglet",
"editShortcuts": "Modifier les raccourcis clavier"
},
"import": {
"importIntoNote": "Importer dans la note",
@@ -203,7 +211,8 @@
"info": {
"modalTitle": "Message d'information",
"closeButton": "Fermer",
"okButton": "OK"
"okButton": "OK",
"copy_to_clipboard": "Copier dans le presse-papiers"
},
"jump_to_note": {
"search_button": "Rechercher dans le texte intégral",
@@ -276,7 +285,6 @@
"download_button": "Télécharger",
"mime": "MIME : ",
"file_size": "Taille du fichier :",
"preview": "Aperçu :",
"preview_not_available": "L'aperçu n'est pas disponible pour ce type de note.",
"restore_button": "Restaurer",
"delete_button": "Supprimer",
@@ -689,7 +697,13 @@
"convert_into_attachment_failed": "La conversion de la note '{{title}}' a échoué.",
"convert_into_attachment_successful": "La note '{{title}}' a été convertie en pièce jointe.",
"convert_into_attachment_prompt": "Êtes-vous sûr de vouloir convertir la note '{{title}}' en une pièce jointe de la note parente ?",
"print_pdf": "Exporter en PDF..."
"print_pdf": "Exporter en PDF...",
"open_note_on_server": "Ouvrir la note sur le serveur",
"view_revisions": "Révisions...",
"advanced": "Avancé",
"export_as_image": "Exporter en tant qu'image",
"export_as_image_png": "PNG",
"export_as_image_svg": "SVG (vectoriel)"
},
"onclick_button": {
"no_click_handler": "Le widget bouton '{{componentId}}' n'a pas de gestionnaire de clic défini"
@@ -747,9 +761,12 @@
},
"note_icon": {
"change_note_icon": "Changer l'icône de note",
"category": "Catégorie :",
"search": "Recherche :",
"reset-default": "Réinitialiser l'icône par défaut"
"reset-default": "Réinitialiser l'icône par défaut",
"filter": "Filtre",
"filter-none": "Toutes les icônes",
"filter-default": "Icônes par défaut",
"icon_tooltip": "{{name}}\nPack d'icônes : {{iconPack}}"
},
"basic_properties": {
"note_type": "Type de note",
@@ -772,7 +789,11 @@
"geo-map": "Carte géographique",
"board": "Tableau de bord",
"include_archived_notes": "Afficher les notes archivées",
"presentation": "Présentation"
"presentation": "Présentation",
"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"
},
"edited_notes": {
"no_edited_notes_found": "Aucune note modifiée ce jour-là...",
@@ -816,7 +837,9 @@
"note_size_info": "La taille de la note fournit une estimation approximative des besoins de stockage pour cette note. Il prend en compte le contenu de la note et de ses versions.",
"calculate": "calculer",
"subtree_size": "(taille du sous-arbre : {{size}} pour {{count}} notes)",
"title": "Infos sur la Note"
"title": "Infos sur la Note",
"mime": "type MIME",
"show_similar_notes": "Afficher des notes similaires"
},
"note_map": {
"open_full": "Développer au maximum",
@@ -879,7 +902,8 @@
"search_parameters": "Paramètres de recherche",
"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."
"actions_executed": "Les actions ont été exécutées.",
"view_options": "Afficher les options:"
},
"similar_notes": {
"title": "Notes similaires",
@@ -982,7 +1006,13 @@
},
"editable_text": {
"placeholder": "Saisir le contenu de votre note ici...",
"auto-detect-language": "Détecté automatiquement"
"auto-detect-language": "Détecté automatiquement",
"editor_crashed_title": "L'éditeur de texte a cessé de fonctionner",
"editor_crashed_content": "Votre contenu a été récupéré avec succès, mais certaines de vos modifications les plus récentes n'ont peut-être pas été enregistrées.",
"editor_crashed_details_button": "Afficher plus de détails...",
"editor_crashed_details_intro": "Si cette erreur se produit plusieurs fois, pensez à la signaler sur GitHub en collant les informations ci-dessous.",
"editor_crashed_details_title": "Informations techniques",
"keeps-crashing": "Le composant d'édition cesse de fonctionner. Veuillez essayer de redémarrer Trilium. Si le problème persiste, envisager de créer un rapport de bogue."
},
"empty": {
"open_note_instruction": "Ouvrez une note en tapant son titre dans la zone ci-dessous ou choisissez une note dans l'arborescence.",
@@ -1077,9 +1107,9 @@
"failed": "Échec de la synchronisation : {{message}}"
},
"vacuum_database": {
"title": "Nettoyage la base de donnée",
"title": "Nettoyage de la base de données",
"description": "Cela reconstruira la base de données, ce qui générera un fichier de base de données généralement plus petit. Aucune donnée ne sera réellement modifiée.",
"button_text": "Nettoyer de la base de donnée",
"button_text": "Nettoyer la base de données",
"vacuuming_database": "Nettoyage de la base de données en cours...",
"database_vacuumed": "La base de données a été nettoyée"
},
@@ -1110,7 +1140,8 @@
"title": "Largeur du contenu",
"default_description": "Trilium limite par défaut la largeur maximale du contenu pour améliorer la lisibilité sur des écrans larges.",
"max_width_label": "Largeur maximale du contenu en pixels",
"max_width_unit": "Pixels"
"max_width_unit": "Pixels",
"centerContent": "Garder le contenu centré"
},
"native_title_bar": {
"title": "Barre de titre native (nécessite le redémarrage de l'application)",
@@ -1149,7 +1180,10 @@
"unit": "caractères"
},
"code_mime_types": {
"title": "Types MIME disponibles dans la liste déroulante"
"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_code_note_syntax": "Notes de code"
},
"vim_key_bindings": {
"use_vim_keybindings_in_code_notes": "Raccourcis clavier Vim",
@@ -1516,7 +1550,8 @@
"refresh-saved-search-results": "Rafraîchir les résultats de recherche enregistrée",
"create-child-note": "Créer une note enfant",
"unhoist": "Désactiver le focus",
"toggle-sidebar": "Basculer la barre latérale"
"toggle-sidebar": "Basculer la barre latérale",
"dropping-not-allowed": "Lâcher des notes à cet endroit n'est pas autorisé"
},
"title_bar_buttons": {
"window-on-top": "Épingler cette fenêtre au premier plan"
@@ -1524,10 +1559,19 @@
"note_detail": {
"could_not_find_typewidget": "Impossible de trouver typeWidget pour le type '{{type}}'",
"printing": "Impression en cours...",
"printing_pdf": "Export au format PDF en cours..."
"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"
},
"note_title": {
"placeholder": "saisir le titre de la note ici..."
"placeholder": "saisir le titre de la note ici...",
"created_on": "Créé le <Value />",
"last_modified": "Modifié le <Value />",
"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"
},
"search_result": {
"no_notes_found": "Aucune note n'a été trouvée pour les paramètres de recherche donnés.",
@@ -1556,7 +1600,8 @@
},
"toc": {
"table_of_contents": "Table des matières",
"options": "Options"
"options": "Options",
"no_headings": "Pas d'en-tête."
},
"watched_file_update_status": {
"file_last_modified": "Le fichier <code class=\"file-path\"></code> a été modifié pour la dernière fois le <span class=\"file-last-modified\"></span>.",
@@ -1657,7 +1702,8 @@
"copy-link": "Copier le lien",
"paste": "Coller",
"paste-as-plain-text": "Coller comme texte brut",
"search_online": "Rechercher «{{term}}» avec {{searchEngine}}"
"search_online": "Rechercher «{{term}}» avec {{searchEngine}}",
"search_in_trilium": "Rechercher \"{{term}}\" dans Trilium"
},
"image_context_menu": {
"copy_reference_to_clipboard": "Copier la référence dans le presse-papiers",
@@ -1966,7 +2012,8 @@
"add-column": "Ajouter une colonne",
"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"
"edit-column-title": "Cliquez pour modifier le titre de la colonne",
"column-already-exists": "Cette colonne existe déjà dans le tableau."
},
"presentation_view": {
"edit-slide": "Modifier cette diapositive",
@@ -2050,7 +2097,8 @@
"button_title": "Exporter le diagramme au format PNG"
},
"svg": {
"export_to_png": "Le diagramme n'a pas pu être exporté au format PNG."
"export_to_png": "Le diagramme n'a pas pu être exporté au format PNG.",
"export_to_svg": "Le diagramme n'a pas pu être exporté en SVG."
},
"code_theme": {
"title": "Apparence",
@@ -2074,5 +2122,19 @@
"note_completion_description": "Si cette option est activée, des liens vers des notes peuvent être créés en tapant `@` suivi du titre d'une note.",
"slash_commands_enabled": "Activer les commandes slash",
"slash_commands_description": "Si cette option est activée, les commandes d'édition telles que l'insertion de sauts de ligne ou d'en-têtes peuvent être activées en tapant `/`."
},
"experimental_features": {
"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."
},
"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"
},
"calendar_view": {
"delete_note": "Effacer la note..."
}
}

View File

@@ -1,5 +1,50 @@
{
"about": {
"title": "ट्रिलियम नोट्स के बारें में"
"title": "ट्रिलियम नोट्स के बारें में",
"build_date": "निर्माण की तारीख:",
"app_version": "ऐप वर्ज़न:",
"db_version": "DB वर्ज़न:",
"build_revision": "बिल्ड रिविज़न:"
},
"toast": {
"widget-error": {
"title": "एक विजेट को इनिशियलाइज़ करने में विफल रहा"
},
"bundle-error": {
"title": "एक कस्टम स्क्रिप्ट लोड करने में विफल रहा"
},
"widget-list-error": {
"title": "सर्वर से विजेट्स की सूची प्राप्त करने में विफल"
},
"open-script-note": "स्क्रिप्ट नोट खोलें"
},
"update_available": {
"update_available": "उपलब्ध अद्यतन"
},
"code_buttons": {
"execute_button_title": "स्क्रिप्ट एक्सीक्यूट करें",
"trilium_api_docs_button_title": "ट्रिलियम एपीआई डॉक्स खोलें",
"save_to_note_button_title": "नोट में सेव करें"
},
"hide_floating_buttons_button": {
"button_title": "बटन छुपाएं"
},
"show_floating_buttons_button": {
"button_title": "बटन दिखाएं"
},
"add_link": {
"note": "नोट"
},
"bulk_actions": {
"other": "अन्य"
},
"clone_to": {
"search_for_note_by_its_name": "नोट क नाम से नोट खोजें"
},
"confirm": {
"also_delete_note": "नोट भी डिलीट करें"
},
"delete_notes": {
"delete_notes_preview": "नोट्स प्रिव्यू डिलीट करें"
}
}

View File

@@ -21,7 +21,13 @@
},
"bundle-error": {
"title": "Nem sikerült betölteni az egyéni szkriptet",
"message": "A(z) \"{{id}}\" azonosítójú, \"{{title}}\" című jegyzetből származó szkript nem hajtható végre a következő ok miatt:\n\n{{message}}"
"message": "A skript nem hajtható végre a következő ok miatt:\n\n{{message}}"
},
"widget-list-error": {
"title": "A Widget-ek letöltése sikertelen volt"
},
"widget-render-error": {
"title": "Nem sikerült renderelni a React widget-et"
}
},
"add_link": {

View File

@@ -16,13 +16,22 @@
},
"bundle-error": {
"title": "Non si è riusciti a caricare uno script personalizzato",
"message": "Lo script della nota con ID \"{{id}}\", dal titolo \"{{title}}\" non è stato inizializzato a causa di:\n\n{{message}}"
"message": "Impossibile eseguire lo script a causa di:\n\n{{message}}"
},
"widget-error": {
"title": "Impossibile inizializzare un widget",
"message-custom": "Il widget personalizzato dalla nota con ID “{{id}}”, intitolato “{{title}}”, non è stato possibile inizializzare a causa di:\n\n{{message}}",
"message-unknown": "Un widget sconosciuto non è stato inizializzato a causa di:\n\n{{message}}"
}
},
"widget-list-error": {
"title": "Impossibile ottenere l'elenco dei widget dal server"
},
"widget-render-error": {
"title": "Impossibile eseguire il rendering di un widget React personalizzato"
},
"widget-missing-parent": "Il widget personalizzato non ha la proprietà obbligatoria '{{property}}' definita.\n\nSe questo script deve essere eseguito senza un elemento dell'interfaccia utente, utilizzare invece '#run=frontendStartup'.",
"open-script-note": "Apri script note",
"scripting-error": "Errore script personalizzato: {{title}}"
},
"add_link": {
"add_link": "Aggiungi un collegamento",
@@ -94,7 +103,8 @@
"info": {
"okButton": "OK",
"closeButton": "Chiudi",
"modalTitle": "Messaggio informativo"
"modalTitle": "Messaggio informativo",
"copy_to_clipboard": "Copia negli appunti"
},
"export": {
"close": "Chiudi",
@@ -314,7 +324,7 @@
"import-into-note": "Importa nella nota",
"apply-bulk-actions": "Applica azioni in blocco",
"converted-to-attachments": "{{count}} note sono state convertite in allegati.",
"convert-to-attachment-confirm": "Sei sicuro di voler convertire le note selezionate in allegati delle note padre?",
"convert-to-attachment-confirm": "Sei sicuro di voler convertire le note selezionate in allegati delle note principali? Questa operazione si applica solo alle note immagine, le altre note verranno ignorate.",
"open-in-popup": "Modifica rapida"
},
"electron_context_menu": {
@@ -408,7 +418,8 @@
"search_parameters": "Parametri di ricerca",
"unknown_search_option": "Opzione di ricerca sconosciuta {{searchOptionName}}",
"search_note_saved": "La nota di ricerca è stata salvata in {{- notePathTitle}}",
"actions_executed": "Le azioni sono state eseguite."
"actions_executed": "Le azioni sono state eseguite.",
"view_options": "Opzioni di visualizzazione:"
},
"modal": {
"close": "Chiudi",
@@ -521,7 +532,8 @@
},
"toc": {
"table_of_contents": "Sommario",
"options": "Opzioni"
"options": "Opzioni",
"no_headings": "Nessun titolo."
},
"table_of_contents": {
"title": "Sommario",
@@ -554,7 +566,13 @@
},
"highlights_list_2": {
"title": "Punti salienti",
"options": "Opzioni"
"options": "Opzioni",
"title_with_count_one": "{{count}} evidenza",
"title_with_count_many": "{{count}} evidenze",
"title_with_count_other": "{{count}} evidenze",
"modal_title": "Configura elenco dei punti salienti",
"menu_configure": "Configura elenco dei punti salienti...",
"no_highlights": "Nessun punto saliente trovato."
},
"quick-search": {
"placeholder": "Ricerca rapida",
@@ -884,7 +902,6 @@
"download_button": "Scarica",
"mime": "MIME: ",
"file_size": "Dimensione del file:",
"preview": "Anteprima:",
"preview_not_available": "L'anteprima non è disponibile per questo tipo di nota."
},
"sort_child_notes": {
@@ -1260,7 +1277,13 @@
"convert_into_attachment_successful": "Nota '{{title}}' è stato convertito in allegato.",
"convert_into_attachment_prompt": "Sei sicuro di voler convertire la nota '{{title}}' in un allegato della nota padre?",
"print_pdf": "Esporta come PDF...",
"open_note_on_server": "Apri una nota sul server"
"open_note_on_server": "Apri una nota sul server",
"view_revisions": "Revisioni...",
"advanced": "Avanzato",
"export_as_image": "Esporta come immagine",
"export_as_image_png": "PNG (raster)",
"export_as_image_svg": "SVG (vector)",
"note_map": "Mappa"
},
"onclick_button": {
"no_click_handler": "Il widget pulsante '{{componentId}}' non ha un gestore di clic definito"
@@ -1318,9 +1341,17 @@
},
"note_icon": {
"change_note_icon": "Cambia icona nota",
"category": "Categoria:",
"search": "Ricerca:",
"reset-default": "Ripristina l'icona predefinita"
"reset-default": "Ripristina l'icona predefinita",
"search_placeholder_one": "Cerca {{number}} icona in {{count}} pacchetto",
"search_placeholder_many": "Cerca {{number}} icone in {{count}} pacchetti",
"search_placeholder_other": "Cerca {{number}} icone in {{count}} pacchetti",
"search_placeholder_filtered": "Cerca {{number}} icone in {{name}}",
"filter": "Filtro",
"filter-none": "Tutte le icone",
"filter-default": "Icone predefinite",
"icon_tooltip": "{{name}}\nPacchetto icone: {{iconPack}}",
"no_results": "Nessuna icona trovata."
},
"basic_properties": {
"note_type": "Tipo di nota",
@@ -1360,7 +1391,7 @@
"file_type": "Tipo di file",
"file_size": "Dimensione del file",
"download": "Scaricamento",
"open": "Aprire",
"open": "Aprire esternamente",
"upload_new_revision": "Carica nuova revisione",
"upload_success": "È stata caricata una nuova revisione del file.",
"upload_failed": "Caricamento di una nuova revisione del file non riuscito.",
@@ -1380,7 +1411,8 @@
},
"inherited_attribute_list": {
"title": "Attributi ereditati",
"no_inherited_attributes": "Nessun attributo ereditato."
"no_inherited_attributes": "Nessun attributo ereditato.",
"none": "nessuno"
},
"note_info_widget": {
"note_id": "ID nota",
@@ -1391,7 +1423,9 @@
"note_size_info": "La dimensione della nota fornisce una stima approssimativa dei requisiti di archiviazione per questa nota. Tiene conto del contenuto della nota e del contenuto delle sue revisioni.",
"calculate": "calcolare",
"subtree_size": "(dimensione del sottoalbero: {{size}} in {{count}} note)",
"title": "Nota informativa"
"title": "Nota informativa",
"show_similar_notes": "Mostra note simili",
"mime": "Tipo MIME"
},
"note_map": {
"open_full": "Espandi completamente",
@@ -1493,7 +1527,12 @@
"editable_text": {
"placeholder": "Digita qui il contenuto della tua nota...",
"auto-detect-language": "Rilevato automaticamente",
"keeps-crashing": "Il componente di modifica continua a bloccarsi. Prova a riavviare Trilium. Se il problema persiste, valuta la possibilità di creare una segnalazione di bug."
"keeps-crashing": "Il componente di modifica continua a bloccarsi. Prova a riavviare Trilium. Se il problema persiste, valuta la possibilità di creare una segnalazione di bug.",
"editor_crashed_title": "L'editor di testo si è bloccato",
"editor_crashed_content": "I tuoi contenuti sono stati recuperati con successo, ma alcune delle modifiche più recenti potrebbero non essere state salvate.",
"editor_crashed_details_button": "Visualizza ulteriori dettagli...",
"editor_crashed_details_intro": "Se questo errore si verifica più volte, valuta la possibilità di segnalarlo su GitHub incollando le informazioni riportate di seguito.",
"editor_crashed_details_title": "Informazioni tecniche"
},
"empty": {
"open_note_instruction": "Apri una nota digitandone il titolo nel campo sottostante oppure scegli una nota nell'albero.",
@@ -1770,7 +1809,7 @@
"will_be_deleted_in": "Questo allegato verrà eliminato automaticamente tra {{time}}",
"will_be_deleted_soon": "Questo allegato verrà eliminato automaticamente a breve",
"deletion_reason": ", perché l'allegato non è collegato al contenuto della nota. Per impedirne l'eliminazione, aggiungi nuovamente il collegamento all'allegato nel contenuto o converti l'allegato in nota.",
"role_and_size": "Ruolo: {{role}}, Dimensione: {{size}}",
"role_and_size": "Ruolo: {{role}}, dimensione: {{size}}, MIME: {{- mimeType}}",
"link_copied": "Link all'allegato copiato negli appunti.",
"unrecognized_role": "Ruolo di allegato non riconosciuto '{{role}}'."
},
@@ -1856,7 +1895,11 @@
"create-child-note": "Crea nota figlio",
"unhoist": "Sganciare",
"toggle-sidebar": "Attiva/disattiva la barra laterale",
"dropping-not-allowed": "Non è consentito lasciare appunti in questa posizione."
"dropping-not-allowed": "Non è consentito lasciare appunti in questa posizione.",
"clone-indicator-tooltip": "Questa nota ha {{- count}} genitori: {{- parents}}",
"clone-indicator-tooltip-single": "Questa nota è stata clonata (1 genitore aggiuntivo: {{- parent}})",
"shared-indicator-tooltip": "Questa nota è condivisa pubblicamente",
"shared-indicator-tooltip-with-url": "Questa nota è condivisa pubblicamente all'indirizzo: {{- url}}"
},
"title_bar_buttons": {
"window-on-top": "Mantieni la finestra in primo piano"
@@ -1864,10 +1907,24 @@
"note_detail": {
"could_not_find_typewidget": "Impossibile trovare typeWidget per il tipo '{{type}}'",
"printing": "Stampa in corso...",
"printing_pdf": "Esportazione in PDF in corso..."
"printing_pdf": "Esportazione in PDF in corso...",
"print_report_title": "Stampa rapporto",
"print_report_collection_content_one": "{{count}} la note nella raccolta non può essere stampata perché non è supportata o è protetta.",
"print_report_collection_content_many": "{{count}} le note nella raccolta non possono essere stampate perché non sono supportate o sono protette.",
"print_report_collection_content_other": "{{count}} le note nella raccolta non possono essere stampate perché non sono supportate o sono protette.",
"print_report_collection_details_button": "Vedi dettagli",
"print_report_collection_details_ignored_notes": "Note ignorate"
},
"note_title": {
"placeholder": "scrivi qui il titolo della nota..."
"placeholder": "scrivi qui il titolo della nota...",
"created_on": "Creato il <Value />",
"last_modified": "Modificato il <Value />",
"note_type_switcher_label": "Passa da {{type}} a:",
"note_type_switcher_others": "Altro tipo di nota",
"note_type_switcher_templates": "Modello",
"note_type_switcher_collection": "Collezione",
"edited_notes": "Note modificate in questo giorno",
"promoted_attributes": "Attributi promossi"
},
"search_result": {
"no_notes_found": "Non sono state trovate note per i parametri di ricerca specificati.",
@@ -2003,8 +2060,9 @@
"unknown_widget": "Widget sconosciuto per \"{{id}}\"."
},
"note_language": {
"not_set": "Non impostato",
"configure-languages": "Configura le lingue..."
"not_set": "Nessuna lingua impostata",
"configure-languages": "Configura le lingue...",
"help-on-languages": "Aiuto sulle lingue dei contenuti..."
},
"content_language": {
"title": "Lingue dei contenuti",
@@ -2022,7 +2080,8 @@
"button_title": "Esporta diagramma come PNG"
},
"svg": {
"export_to_png": "Non è stato possibile esportare il diagramma in formato PNG."
"export_to_png": "Non è stato possibile esportare il diagramma in formato PNG.",
"export_to_svg": "Il diagramma non può essere esportato in formato SVG."
},
"code_theme": {
"title": "Aspetto",
@@ -2032,7 +2091,7 @@
"book_properties_config": {
"hide-weekends": "Nascondi i fine settimana",
"display-week-numbers": "Visualizza i numeri delle settimane",
"map-style": "Stile mappa:",
"map-style": "Stile mappa",
"max-nesting-depth": "Profondità massima di nidificazione:",
"raster": "Trama",
"vector_light": "Vettore (Luce)",
@@ -2072,14 +2131,20 @@
"background_effects_title": "Gli effetti di sfondo sono ora stabili",
"background_effects_message": "Sui dispositivi Windows, gli effetti di sfondo sono ora completamente stabili. Gli effetti di sfondo aggiungono un tocco di colore all'interfaccia utente sfocando lo sfondo retrostante. Questa tecnica è utilizzata anche in altre applicazioni come Esplora risorse di Windows.",
"background_effects_button": "Abilita gli effetti di sfondo",
"dismiss": "Congedare"
"dismiss": "Congedare",
"new_layout_title": "Nuovo layout",
"new_layout_message": "Abbiamo introdotto un layout modernizzato per Trilium. La barra multifunzione è stata rimossa e integrata perfettamente nell'interfaccia principale, con una nuova barra di stato e sezioni espandibili (come gli attributi promossi) che assumono le funzioni chiave.\n\nIl nuovo layout è abilitato di default e può essere temporaneamente disabilitato tramite Opzioni → Aspetto.",
"new_layout_button": "Maggiori informazioni"
},
"settings": {
"related_settings": "Impostazioni correlate"
},
"settings_appearance": {
"related_code_blocks": "Schema di colori per i blocchi di codice nelle note di testo",
"related_code_notes": "Schema di colori per le note del codice"
"related_code_notes": "Schema di colori per le note del codice",
"ui": "Interfaccia utente",
"ui_old_layout": "Vecchio layout",
"ui_new_layout": "Nuovo layout"
},
"units": {
"percentage": "%"
@@ -2106,5 +2171,101 @@
},
"popup-editor": {
"maximize": "Passa all'editor completo"
},
"experimental_features": {
"title": "Opzioni sperimentali",
"disclaimer": "Queste opzioni sono sperimentali e potrebbero causare instabilità. Usare con cautela.",
"new_layout_name": "Nuovo layout",
"new_layout_description": "Prova il nuovo layout per un look più moderno e una maggiore usabilità. Soggetto a modifiche significative nelle prossime versioni."
},
"server": {
"unknown_http_error_title": "Errore di comunicazione con il server",
"unknown_http_error_content": "Codice di stato: {{statusCode}}\nURL: {{method}} {{url}}\nMessaggio: {{message}}",
"traefik_blocks_requests": "Se si utilizza il proxy inverso Traefik, è stata introdotta una modifica sostanziale che influisce sulla comunicazione con il server."
},
"tab_history_navigation_buttons": {
"go-back": "Torna alla nota precedente",
"go-forward": "Passa alla nota successiva"
},
"breadcrumb_badges": {
"read_only_explicit": "Sola lettura",
"read_only_explicit_description": "Questa nota è stata impostata manualmente come di sola lettura.\nClicca per modificarla temporaneamente.",
"read_only_auto": "Solo lettura automatica",
"read_only_auto_description": "Questa nota è stata impostata automaticamente in modalità di sola lettura per motivi di prestazioni. Questo limite automatico è modificabile dalle impostazioni.\n\nClicca per modificarla temporaneamente.",
"read_only_temporarily_disabled": "Modificabile temporaneamente",
"read_only_temporarily_disabled_description": "Questa nota è attualmente modificabile, ma normalmente è di sola lettura. La nota tornerà ad essere di sola lettura non appena passerai a un'altra nota.\n\nClicca per riattivare la modalità di sola lettura.",
"shared_publicly": "Condiviso pubblicamente",
"shared_locally": "Condiviso localmente",
"clipped_note": "Clip web",
"clipped_note_description": "Questa nota è stata originariamente presa da {{url}}.\n\nClicca per andare alla pagina web di origine.",
"execute_script": "Esegui script",
"execute_script_description": "Questa nota è una nota di script. Clicca per eseguire lo script.",
"execute_sql": "Esegui SQL",
"execute_sql_description": "Questa nota è una nota SQL. Clicca per eseguire la query SQL.",
"shared_copy_to_clipboard": "Copia link negli appunti",
"shared_open_in_browser": "Apri il link nel browser",
"shared_unshare": "Rimuovi condivisione",
"save_status_saved": "Salvato",
"save_status_saving": "Salvataggio in corso...",
"save_status_unsaved": "Non salvato",
"save_status_error": "Salvataggio non riuscito",
"save_status_saving_tooltip": "Le modifiche sono state salvate.",
"save_status_unsaved_tooltip": "Ci sono modifiche non salvate. Verranno salvate automaticamente tra un attimo.",
"save_status_error_tooltip": "Si è verificato un errore durante il salvataggio della nota. Se possibile, prova a copiare il contenuto della nota altrove e a ricaricare l'applicazione."
},
"breadcrumb": {
"workspace_badge": "Area di lavoro",
"scroll_to_top_title": "Vai all'inizio della nota",
"hoisted_badge": "Sollevato",
"hoisted_badge_title": "Abbassato",
"create_new_note": "Crea nuova nota secondaria",
"empty_hide_archived_notes": "Nascondi note archiviate"
},
"status_bar": {
"language_title": "Cambia lingua dei contenuti",
"note_info_title": "Visualizza informazioni sulla nota (ad es. date, dimensioni della nota)",
"backlinks_one": "{{count}} backlink",
"backlinks_many": "{{count}} backlinks",
"backlinks_other": "{{count}} backlinks",
"backlinks_title_one": "Visualizza backlink",
"backlinks_title_many": "Visualizza backlinks",
"backlinks_title_other": "Visualizza backlinks",
"attachments_one": "{{count}} allegato",
"attachments_many": "{{count}} allegati",
"attachments_other": "{{count}} allegati",
"attachments_title_one": "Visualizza allegato in una nuova scheda",
"attachments_title_many": "Visualizza allegati in una nuova scheda",
"attachments_title_other": "Visualizza allegati in una nuova scheda",
"attributes_one": "{{count}} attributo",
"attributes_many": "{{count}} attributi",
"attributes_other": "{{count}} attributi",
"attributes_title": "Attributi posseduti e attributi ereditati",
"note_paths_one": "{{count}} percorso",
"note_paths_many": "{{count}} percorsi",
"note_paths_other": "{{count}} percorsi",
"note_paths_title": "Nota percorsi",
"code_note_switcher": "Cambia modalità lingua"
},
"attributes_panel": {
"title": "Attributi delle note"
},
"right_pane": {
"empty_message": "Nulla da segnalare per questa nota",
"empty_button": "Nascondi il pannello",
"toggle": "Attiva/disattiva pannello destro",
"custom_widget_go_to_source": "Vai al codice sorgente"
},
"pdf": {
"attachments_one": "{{count}} allegato",
"attachments_many": "{{count}} allegati",
"attachments_other": "{{count}} allegati",
"layers_one": "{{count}} livello",
"layers_many": "{{count}} livelli",
"layers_other": "{{count}} livelli",
"pages_one": "{{count}} pagina",
"pages_many": "{{count}} pagine",
"pages_other": "{{count}} pagine",
"pages_alt": "Pagina {{pageNumber}}",
"pages_loading": "Caricamento in corso..."
}
}

View File

@@ -21,8 +21,17 @@
},
"bundle-error": {
"title": "カスタムスクリプトの読み込みに失敗しました",
"message": "ートID”{{id}}”, ノートタイトル “{{title}}” のスクリプトを実行できませんでした。理由は以下の通りです:\n\n{{message}}"
}
"message": "次の理由によりスクリプトを実行できませんでした:\n\n{{message}}"
},
"widget-list-error": {
"title": "サーバーからウィジェットのリストを取得できませんでした"
},
"widget-render-error": {
"title": "カスタム React ウィジェットのレンダリングに失敗しました"
},
"widget-missing-parent": "カスタムウィジェットに必須の '{{property}}' プロパティが定義されていません。\n\nこのスクリプトを UI 要素なしで実行する場合は、代わりに '#run=frontendStartup' を使用してください。",
"open-script-note": "スクリプトノートを開く",
"scripting-error": "カスタムスクリプトエラー: {{title}}"
},
"add_link": {
"add_link": "リンクを追加",
@@ -143,16 +152,22 @@
},
"note_icon": {
"change_note_icon": "ノートアイコンの変更",
"category": "カテゴリー:",
"search": "検索:",
"reset-default": "アイコンをデフォルトに戻す"
"reset-default": "アイコンをデフォルトに戻す",
"search_placeholder_other": "{{count}} 個のパックから {{number}} 個のアイコンを検索",
"search_placeholder_filtered": "{{name}} で {{number}} 個のアイコンを検索",
"filter": "フィルター",
"filter-none": "すべてのアイコン",
"filter-default": "デフォルトアイコン",
"icon_tooltip": "{{name}}\nアイコンパック: {{iconPack}}",
"no_results": "アイコンが見つかりません。"
},
"basic_properties": {
"note_type": "ノートタイプ",
"editable": "編集可能",
"basic_properties": "基本プロパティ",
"language": "言語",
"configure_code_notes": "コードノートを設定しています..."
"configure_code_notes": "コードノートを設定..."
},
"i18n": {
"title": "ローカライゼーション",
@@ -218,7 +233,8 @@
"unknown_search_option": "不明な検索オプション {{searchOptionName}}",
"search_note_saved": "検索ノートが {{- notePathTitle}} に保存されました",
"actions_executed": "アクションが実行されました。",
"ancestor": "祖先:"
"ancestor": "祖先:",
"view_options": "表示オプション:"
},
"shortcuts": {
"multiple_shortcuts": "同じアクションに対して複数のショートカットを設定する場合、カンマで区切ることができます。",
@@ -258,7 +274,7 @@
"export_in_progress": "エクスポート処理中: {{progressCount}}",
"export_finished_successfully": "エクスポートが正常に完了しました。",
"format_pdf": "PDF - 印刷または共有目的に。",
"share-format": "Web 公開用の HTML - 共有ノートで使用されるのと同じテーマを使用しますが、静的 Web サイトとして公開できます。"
"share-format": "web 公開用の HTML - 共有ノートで使用されるのと同じテーマを使用しますが、静的 web サイトとして公開できます。"
},
"help": {
"title": "チートシート",
@@ -386,7 +402,7 @@
"show_toc": "目次を表示"
},
"show_highlights_list_widget_button": {
"show_highlights_list": "ハイライト一覧を表示"
"show_highlights_list": "ハイライトリストを表示"
},
"relation_map_buttons": {
"zoom_out_title": "ズームアウト",
@@ -424,10 +440,13 @@
"convert-to-attachment-confirm": "選択したノートを親ノートの添付ファイルに変換してもよろしいですか?この操作は画像ノートにのみ適用され、その他のノートはスキップされます。",
"open-in-popup": "クイック編集",
"hoist-note": "ホイストノート",
"unhoist-note": "ノートホイストしない",
"unhoist-note": "ノートホイストを解除",
"edit-branch-prefix": "ブランチの接頭辞を編集",
"archive": "アーカイブ",
"unarchive": "アーカイブ解除"
"unarchive": "アーカイブ解除",
"open-in-a-new-window": "新しいウィンドウで開く",
"hide-subtree": "サブツリーを非表示",
"show-subtree": "サブツリーを表示"
},
"zen_mode": {
"button_exit": "禅モードを退出"
@@ -458,7 +477,13 @@
"convert_into_attachment_successful": "ノート '{{title}}' は添付ファイルに変換されました。",
"convert_into_attachment_prompt": "本当にノート '{{title}}' を親ノートの添付ファイルに変換しますか?",
"note_attachments": "ノートの添付ファイル",
"open_note_on_server": "サーバー上のノートを開く"
"open_note_on_server": "サーバー上のノートを開く",
"view_revisions": "ノートの変更履歴...",
"note_map": "ノートマップ",
"advanced": "高度",
"export_as_image": "画像としてエクスポート",
"export_as_image_png": "PNG (raster)",
"export_as_image_svg": "SVG (vector)"
},
"command_palette": {
"export_note_title": "ノートをエクスポート",
@@ -546,7 +571,8 @@
"expand_tooltip": "このコレクションの直下の子1階層下を展開します。その他のオプションについては、右側の矢印を押してください。",
"expand_first_level": "直下の子を展開",
"expand_nth_level": "{{depth}} 階層下まで展開",
"expand_all_levels": "すべての階層を展開"
"expand_all_levels": "すべての階層を展開",
"hide_child_notes": "ツリー内の子ノートを非表示"
},
"note_types": {
"geo-map": "ジオマップ",
@@ -583,7 +609,7 @@
"file_type": "ファイルタイプ",
"file_size": "ファイルサイズ",
"download": "ダウンロード",
"open": "開く",
"open": "外部で開く",
"title": "ファイル",
"upload_new_revision": "編集履歴をアップロード",
"original_file_name": "元のファイル名",
@@ -599,7 +625,9 @@
"calculate": "計算",
"subtree_size": "(サブツリーサイズ: {{size}}、ノード数: {{count}}",
"title": "ノート情報",
"note_size_info": "ノートのサイズは、このノートに必要なストレージの概算を示します。これは、ノートの内容とそのノートの編集履歴の内容を考慮したものです。"
"note_size_info": "ノートのサイズは、このノートに必要なストレージの概算を示します。これは、ノートの内容とそのノートの編集履歴の内容を考慮したものです。",
"show_similar_notes": "類似のノートを表示",
"mime": "MIME タイプ"
},
"image_properties": {
"file_type": "ファイルタイプ",
@@ -630,7 +658,6 @@
"revision_deleted": "ノートの変更履歴は削除されました。",
"settings": "ノートの変更履歴の設定",
"file_size": "ファイルサイズ:",
"preview": "プレビュー:",
"preview_not_available": "このノートタイプではプレビューは利用できません。",
"diff_on": "差分を表示",
"diff_off": "内容を表示",
@@ -799,7 +826,7 @@
},
"web_view": {
"web_view": "Web ビュー",
"embed_websites": "Web ビュータイプでは、ウェブサイトをTriliumに埋め込むことができます。",
"embed_websites": "Web ビュータイプでは、web サイトを Trilium に埋め込むことができます。",
"create_label": "まず始めに、埋め込みたいURLアドレスのラベルを作成してください。例: #webViewSrc=\"https://www.google.com\""
},
"backend_log": {
@@ -910,7 +937,7 @@
"underline": "下線",
"color": "カラーテキスト",
"bg_color": "背景色付きテキスト",
"visibility_title": "ハイライトリスト表示",
"visibility_title": "ハイライトリスト表示",
"visibility_description": "#hideHighlightWidget ラベルを追加することで、ノートごとにハイライトウィジェットを非表示にできます。",
"shortcut_info": "設定 -> ショートカット(右ペイン切り替え)で、右ペイン(ハイライトを含む)を素早く切り替えるキーボードショートカットを設定できます。"
},
@@ -923,7 +950,8 @@
},
"toc": {
"table_of_contents": "目次",
"options": "オプション"
"options": "オプション",
"no_headings": "見出しはありません。"
},
"text_auto_read_only_size": {
"title": "自動読み取り専用のサイズ",
@@ -961,7 +989,7 @@
"password": {
"wiki": "wiki",
"heading": "パスワード",
"alert_message": "新しいパスワードは大切に保管してください。パスワードはウェブインターフェースへのログインや、保護されたノートの暗号化に使用されます。パスワードを忘れると、保護されたノートはすべて永久に失われます。",
"alert_message": "新しいパスワードは大切に保管してください。パスワードは web インターフェースへのログインや、保護されたノートの暗号化に使用されます。パスワードを忘れると、保護されたノートはすべて永久に失われます。",
"reset_link": "リセットするにはここをクリック。",
"old_password": "旧パスワード",
"new_password": "新パスワード",
@@ -1107,7 +1135,7 @@
"sql_console_home": "SQLコンソールートのデフォルトの場所",
"bookmark_folder": "このラベルの付いたノートは、ブックマークにフォルダとして表示されます(子フォルダへのアクセスを許可します)",
"share_hidden_from_tree": "このートは左側のナビゲーションツリーには表示されていませんが、URL からアクセスできます",
"share_external_link": "ノートは共有ツリー内で外部ウェブサイトへのリンクとして機能します",
"share_external_link": "ノートは共有ツリー内で外部 web サイトへのリンクとして機能します",
"share_alias": "https://your_trilium_host/share/[your_alias] でノートを利用できるようにエイリアスを定義します",
"share_omit_default_css": "デフォルトの共有ページのCSSは省略されます。スタイルを大幅に変更する場合に使用してください。",
"share_root": "/share root で提供されるノートをマークする。",
@@ -1192,7 +1220,11 @@
},
"highlights_list_2": {
"title": "ハイライトリスト",
"options": "オプション"
"options": "オプション",
"title_with_count_other": "{{count}} ハイライト",
"modal_title": "ハイライトリストの設定",
"menu_configure": "ハイライトリストの設定...",
"no_highlights": "ハイライトが見つかりません。"
},
"quick-search": {
"placeholder": "クイック検索",
@@ -1216,7 +1248,15 @@
"saved-search-note-refreshed": "保存した検索ノートが更新されました。",
"refresh-saved-search-results": "保存した検索結果を更新",
"toggle-sidebar": "サイドバーを切り替え",
"dropping-not-allowed": "この場所にノートをドロップすることはできません。"
"dropping-not-allowed": "この場所にノートをドロップすることはできません。",
"clone-indicator-tooltip": "このノートには {{- count}} 個の親があります: {{- parents}}",
"clone-indicator-tooltip-single": "このノートは複製されています (親が 1 件追加: {{- parent}})",
"shared-indicator-tooltip": "このノートは公開されています",
"shared-indicator-tooltip-with-url": "このノートは以下で公開されています: {{- url}}",
"subtree-hidden-tooltip_other": "{{count}} 個の子ノートがツリーで非表示になっています",
"subtree-hidden-moved-title": "{{title}} に追加されました",
"subtree-hidden-moved-description-collection": "このコレクションはツリー内の子ノートを非表示にします。",
"subtree-hidden-moved-description-other": "このノートのツリーでは子ノートは非表示になっています。"
},
"bulk_actions": {
"bulk_actions": "一括操作",
@@ -1233,7 +1273,15 @@
"none_yet": "アクションを上のリストからクリックして追加。"
},
"note_title": {
"placeholder": "ここにノートのタイトルを入力..."
"placeholder": "ここにノートのタイトルを入力...",
"created_on": "<Value /> に作成",
"last_modified": "<Value /> に変更",
"note_type_switcher_label": "{{type}} から切り替え:",
"note_type_switcher_others": "その他のノートタイプ",
"note_type_switcher_templates": "テンプレート",
"note_type_switcher_collection": "コレクション",
"edited_notes": "この日に編集されたノート",
"promoted_attributes": "プロモート属性"
},
"search_result": {
"no_notes_found": "指定された検索パラメータに該当するノートは見つかりませんでした。",
@@ -1330,8 +1378,9 @@
"minimum_input": "入力された時間値は {{minimumSeconds}} 秒以上である必要があります。"
},
"note_language": {
"not_set": "未設定",
"configure-languages": "言語を設定..."
"not_set": "言語が設定されていません",
"configure-languages": "言語を設定...",
"help-on-languages": "コンテンツの言語に関するヘルプ..."
},
"content_language": {
"title": "コンテンツの言語",
@@ -1599,7 +1648,8 @@
},
"inherited_attribute_list": {
"title": "継承属性",
"no_inherited_attributes": "継承属性はありません。"
"no_inherited_attributes": "継承属性はありません。",
"none": "なし"
},
"note_map": {
"open_full": "拡大表示",
@@ -1620,7 +1670,7 @@
"remove_this_attribute": "この属性を削除",
"remove_color": "このカラーラベルを削除",
"promoted_attributes": "プロモート属性",
"url_placeholder": "http://ウェブサイト..."
"url_placeholder": "http://web サイト..."
},
"relation_map": {
"open_in_new_tab": "新しいタブで開く",
@@ -1779,7 +1829,7 @@
"placeholder": "ここにノートの内容を入力...",
"auto-detect-language": "自動検出",
"keeps-crashing": "編集コンポーネントがクラッシュし続けます。Trilium を再起動してください。問題が解決しない場合は、バグレポートの作成をご検討ください。",
"editor_crashed_title": "テキストエディタがクラッシュしました",
"editor_crashed_title": "テキストエディタがクラッシュしました",
"editor_crashed_content": "コンテンツは正常に復元されましたが、最近の変更の一部が保存されていない可能性があります。",
"editor_crashed_details_button": "詳細を見る...",
"editor_crashed_details_intro": "このエラーが何度も発生する場合は、以下の情報を貼り付けて GitHub に報告することを検討してください。",
@@ -1897,7 +1947,11 @@
"note_detail": {
"could_not_find_typewidget": "タイプ {{type}} の typeWidget が見つかりませんでした",
"printing": "印刷中です...",
"printing_pdf": "PDF へのエクスポート中です..."
"printing_pdf": "PDF へのエクスポート中です...",
"print_report_title": "レポートを印刷",
"print_report_collection_content_other": "コレクション内の {{count}} 件のノートは、サポートされていないか保護されているため、印刷できませんでした。",
"print_report_collection_details_button": "詳細を見る",
"print_report_collection_details_ignored_notes": "無視されたノート"
},
"watched_file_update_status": {
"ignore_this_change": "この変更を無視する",
@@ -1974,7 +2028,7 @@
"book_properties_config": {
"hide-weekends": "週末を非表示",
"display-week-numbers": "週番号を表示",
"map-style": "マップスタイル:",
"map-style": "マップスタイル",
"max-nesting-depth": "最大階層の深さ:",
"show-scale": "スケールを表示",
"raster": "Raster",
@@ -1988,14 +2042,20 @@
"background_effects_title": "背景効果が安定しました",
"background_effects_message": "Windowsデバイスでは、背景効果が完全に安定しました。背景効果は、背景をぼかすことでユーザーインターフェースに彩りを添えます。この技術は、Windowsエクスプローラーなどの他のアプリケーションでも使用されています。",
"background_effects_button": "背景効果を有効にする",
"dismiss": "却下"
"dismiss": "却下",
"new_layout_title": "新しいレイアウト",
"new_layout_message": "Trilium のレイアウトを刷新しました。リボンは廃止され、メインインターフェースにシームレスに統合されました。主要な機能は、新しいステータスバーと展開可能なセクション(プロモート属性など)に集約されています。\n\n新しいレイアウトはデフォルトで有効になっていますが、「オプション」→「外観」から一時的に無効にすることもできます。",
"new_layout_button": "詳細情報"
},
"settings": {
"related_settings": "関連設定"
},
"settings_appearance": {
"related_code_blocks": "テキストノート内のコードブロックの配色",
"related_code_notes": "コードノートの配色"
"related_code_notes": "コードノートの配色",
"ui": "ユーザーインターフェース",
"ui_old_layout": "旧レイアウト",
"ui_new_layout": "新しいレイアウト"
},
"units": {
"percentage": "%"
@@ -2069,7 +2129,7 @@
"recovery_keys_used": "使用日: {{date}}",
"recovery_keys_unused": "回復コード {{index}} は未使用です",
"oauth_title": "OAuth/OpenID",
"oauth_description": "OpenIDは、Googleなどの他のサービスのアカウントを使用してウェブサイトにログインし、本人確認を行うための標準化された方法です。デフォルトの発行者はGoogleですが、他のOpenIDプロバイダに変更できます。詳しくは<a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">こちら</a>をご覧ください。Google経由でOpenIDサービスを設定するには、<a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">こちらの手順</a>に従ってください。",
"oauth_description": "OpenIDは、Googleなどの他のサービスのアカウントを使用して web サイトにログインし、本人確認を行うための標準化された方法です。デフォルトの発行者はGoogleですが、他のOpenIDプロバイダに変更できます。詳しくは<a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">こちら</a>をご覧ください。Google経由でOpenIDサービスを設定するには、<a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">こちらの手順</a>に従ってください。",
"oauth_description_warning": "OAuth/OpenIDを有効にするには、config.iniファイルにOAuth/OpenIDのベースURL、クライアントID、クライアントシークレットを設定し、アプリケーションを再起動する必要があります。環境変数から設定する場合は、TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID and TRILIUM_OAUTH_CLIENT_SECRET を設定してください。",
"oauth_missing_vars": "設定がありません: {{-variables}}",
"oauth_user_account": "ユーザーアカウント: ",
@@ -2087,7 +2147,7 @@
"will_be_deleted_in": "この添付ファイルは {{time}} 後に自動的に削除されます",
"will_be_deleted_soon": "この添付ファイルはすぐに自動的に削除されます",
"deletion_reason": "、添付ファイルがノートのコンテンツにリンクされていないためです。削除されないようにするには、添付ファイルのリンクをコンテンツに再度追加するか、添付ファイルをノートに変換してください。",
"role_and_size": "ロール: {{role}},サイズ: {{size}}",
"role_and_size": "ロール: {{role}},サイズ: {{size}}, MIME: {{- mimeType}}",
"link_copied": "添付ファイルのリンクをクリップボードにコピーしました。",
"unrecognized_role": "添付ファイルのロール「{{role}}」は認識されません。"
},
@@ -2116,5 +2176,78 @@
"unknown_http_error_title": "サーバーとの通信エラー",
"unknown_http_error_content": "ステータスコード: {{statusCode}}\nURL: {{method}} {{url}}\nメッセージ: {{message}}",
"traefik_blocks_requests": "Traefik リバース プロキシを使用している場合、サーバーとの通信に影響する重大な変更が導入されました。"
},
"tab_history_navigation_buttons": {
"go-back": "前のノートに戻る",
"go-forward": "次のノートに進む"
},
"experimental_features": {
"title": "実験オプション",
"disclaimer": "これらのオプションは試験的なもので、動作が不安定になる可能性があります。注意してご使用ください。",
"new_layout_name": "新しいレイアウト",
"new_layout_description": "よりモダンな外観と使いやすさが向上した新しいレイアウトをお試しください。今後のリリースで大幅な変更が加えられる可能性があります。"
},
"breadcrumb_badges": {
"read_only_explicit": "読み取り専用",
"read_only_auto": "自動的に読み取り専用",
"shared_publicly": "公開で共有",
"shared_locally": "ローカルで共有",
"read_only_explicit_description": "このノートは手動で読み取り専用に設定されています。\nクリックすると一時的に編集できます。",
"read_only_temporarily_disabled": "一時的に編集可能",
"read_only_auto_description": "このノートはパフォーマンス上の理由により、自動的に読み取り専用モードに設定されました。この自動制限は設定から調整できます。\n\n一時的に編集するにはクリックしてください。",
"read_only_temporarily_disabled_description": "このノートは現在編集可能ですが、通常は読み取り専用です。別のノートに移動すると読み取り専用に戻ります。\n\nクリックすると読み取り専用モードが再度有効になります。",
"clipped_note": "Web クリップ",
"clipped_note_description": "このノートは {{url}} から取得されました。\n\nクリックすると元の web ページに移動します。",
"execute_script": "スクリプトを実行",
"execute_script_description": "このノートはスクリプトノートです。クリックするとスクリプトが実行されます。",
"execute_sql": "SQL を実行",
"execute_sql_description": "このノートは SQL ノートです。クリックすると SQL クエリが実行されます。",
"shared_copy_to_clipboard": "リンクをクリップボードにコピー",
"shared_open_in_browser": "ブラウザでリンクを開く",
"shared_unshare": "共有を削除",
"save_status_saved": "保存されました",
"save_status_saving": "保存中...",
"save_status_unsaved": "未保存",
"save_status_error": "保存に失敗しました",
"save_status_saving_tooltip": "変更を保存しています。",
"save_status_unsaved_tooltip": "未保存の変更があります。すぐに自動的に保存されます。",
"save_status_error_tooltip": "ノートの保存中にエラーが発生しました。可能であれば、ノートの内容を別の場所にコピーして、アプリケーションを再読み込みしてください。"
},
"status_bar": {
"language_title": "コンテンツの言語を変更",
"note_info_title": "ノート情報を表示(例: 日付、ノートのサイズなど)",
"backlinks_title_other": "バックリンクを表示",
"attachments_title_other": "添付ファイルを新しいタブで表示",
"attributes_other": "{{count}} 個の属性",
"attributes_title": "所有属性と継承属性",
"note_paths_title": "ノートパス",
"code_note_switcher": "言語モードを変更",
"backlinks_other": "{{count}} バックリンク",
"attachments_other": "{{count}} 件の添付ファイル",
"note_paths_other": "{{count}} 個のパス"
},
"breadcrumb": {
"hoisted_badge": "ホイスト",
"hoisted_badge_title": "ホイスト解除",
"workspace_badge": "ワークスペース",
"scroll_to_top_title": "ノートの先頭にジャンプ",
"create_new_note": "新しい子ノートを作成",
"empty_hide_archived_notes": "アーカイブされたノートを非表示"
},
"right_pane": {
"empty_message": "このノートには何も表示されません",
"empty_button": "パネルを非表示",
"toggle": "右パネルを切り替え",
"custom_widget_go_to_source": "ソースコードへ移動"
},
"attributes_panel": {
"title": "ノート属性"
},
"pdf": {
"attachments_other": "{{count}} 添付ファイル",
"layers_other": "{{count}} 層",
"pages_other": "{{count}} ページ",
"pages_alt": "ページ {{pageNumber}}",
"pages_loading": "読み込み中..."
}
}

View File

@@ -1 +1,82 @@
{}
{
"about": {
"title": "Om Trilium Notes",
"app_version": "App versjon:",
"db_version": "DB versjon:",
"sync_version": "Synk versjon:",
"build_date": "Byggdato:",
"build_revision": "Bygg versjon:",
"data_directory": "Datamappe:",
"homepage": "Hjemmeside:"
},
"experimental_features": {
"new_layout_description": "Prøv det nye grensesnittet for et mer moderne utseende og forbedret brukervenlighet. Det må påregnes betydelige endringer i kommende versjoner."
},
"cpu_arch_warning": {
"recommendation": "For den beste brukeropplevelsen, vennligst last ned den tilpassede ARM64-versjonen av TriliumNext fra siden for utgivelser."
},
"zpetne_odkazy": {
"backlink_one": "{{count}} Tilbakelenke",
"backlink_other": "{{count}} Tilbakelenker"
},
"add_link": {
"note": "Notat"
},
"branch_prefix": {
"prefix": "Prefiks : ",
"save": "Lagre"
},
"bulk_actions": {
"labels": "Etiketter",
"relations": "Relasjoner",
"notes": "Notater",
"other": "Andre"
},
"confirm": {
"confirmation": "Bekreftelse",
"cancel": "Avbryt",
"ok": "OK"
},
"delete_notes": {
"close": "Lukk",
"cancel": "Avbryt",
"ok": "OK"
},
"export": {
"close": "Lukk",
"export": "Eksporter"
},
"note_type_chooser": {
"templates": "Maler"
},
"help": {
"title": "Hurtigveiledning",
"troubleshooting": "Feilsøking",
"other": "Andre"
},
"import": {
"options": "Alternativer",
"import": "Importer"
},
"include_note": {
"label_note": "Notat"
},
"prompt": {
"title": "Ledetekst",
"ok": "OK",
"defaultTitle": "Ledetekst"
},
"info": {
"closeButton": "Lukk",
"okButton": "OK"
},
"markdown_import": {
"import_button": "Importer"
},
"protected_session_password": {
"close_label": "Lukk"
},
"recent_changes": {
"undelete_link": "gjenopprett"
}
}

View File

@@ -12,7 +12,7 @@
"toast": {
"critical-error": {
"title": "Kritische Error",
"message": "Een kritieke fout heeft plaatsgevonden waardoor de cliënt zich aanmeldt vanaf het begin:\n\n84X\n\nDit is waarschijnlijk veroorzaakt door een script dat op een onverwachte manier faalt. Probeer de sollicitatie in veilige modus te starten en de kwestie aan te spreken."
"message": "Een kritieke fout heeft plaatsgevonden waardoor de applicatie niet kon opstarten:\n\n{{message}}\n\nDit is waarschijnlijk veroorzaakt door een onverwachte fout in een script. Probeer de applicatie op te starten in veilige modus en het probleem op te lossen."
},
"widget-error": {
"title": "Starten widget mislukt",
@@ -22,7 +22,16 @@
"bundle-error": {
"title": "Custom script laden mislukt",
"message": "Script van notitie met ID \"{{id}}\", getiteld \"{{title}}\" kon niet worden uitgevoerd vanwege:\n\n{{message}}"
}
},
"scripting-error": "Error met script: {{title}}",
"widget-list-error": {
"title": "Kon geen lijst met widgets ophalen van de server"
},
"widget-render-error": {
"title": "React-widget kon niet geladen worden"
},
"widget-missing-parent": "Widget heeft niet het verplichte '{{property}}'-veld gedefinieerd.\n\nAls dit script is bedoeld om zonder interface te draaien, gebruik dan in plaats daarvan '#run=frontendStartup'.",
"open-script-note": "Open scriptnotitie"
},
"add_link": {
"add_link": "Voeg link toe",
@@ -41,7 +50,8 @@
"help_on_tree_prefix": "Help bij boomvoorvoegsel",
"prefix": "Voorvoegsel: ",
"edit_branch_prefix_multiple": "Bewerk zijtakvoorvoegsel voor {{count}} zijtakken",
"branch_prefix_saved_multiple": "Vertakkingsvoorvoegsel opgeslagen voor {{count}} vertakkingen."
"branch_prefix_saved_multiple": "Vertakkingsvoorvoegsel opgeslagen voor {{count}} vertakkingen.",
"affected_branches": "Aangetaste takken ({{count}}):"
},
"bulk_actions": {
"bulk_actions": "Bulk acties",
@@ -54,7 +64,8 @@
"labels": "Labels",
"relations": "Relaties",
"notes": "Notities",
"other": "Andere"
"other": "Andere",
"include_descendants": "Tel afstammelingen van de geselecteerde notities mee"
},
"calendar": {
"april": "April",
@@ -78,5 +89,35 @@
},
"show_toc_widget_button": {
"show_toc": "Laat Inhoudsopgave zien"
},
"status_bar": {
"note_paths_one": "{{count}} pad",
"note_paths_other": "{{count}} paden",
"note_paths_title": "Notitiepaden",
"code_note_switcher": "Verander de taalmodus"
},
"attributes_panel": {
"title": "Notitie-attributen"
},
"right_pane": {
"empty_message": "Geen informatie voor deze notitie",
"empty_button": "Verberg dit paneel",
"toggle": "Schakel rechterpaneel in/uit",
"custom_widget_go_to_source": "Go naar de broncode"
},
"pdf": {
"attachments_one": "{{count}} bijlage",
"attachments_other": "{{count}} bijlagen",
"layers_one": "{{count}} laag",
"layers_other": "{{count}} lagen",
"pages_one": "{{count}} pagina",
"pages_other": "{{count}} pagina's",
"pages_alt": "Pagina {{pageNumber}}",
"pages_loading": "Laden..."
},
"clone_to": {
"clone_notes_to": "Kloon de notities naar...",
"help_on_links": "Hulp op links",
"notes_to_clone": "Notities om te klonen"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -22,7 +22,16 @@
"bundle-error": {
"title": "Falha para carregar o script customizado",
"message": "O script da nota com ID \"{{id}}\", intitulada \"{{title}}\", não pôde ser executado devido a:\n\n{{message}}"
}
},
"widget-list-error": {
"title": "Falha ao obter a lista de widgets do servidor"
},
"scripting-error": "Erro do script específicado: {{title}}",
"open-script-note": "Abrir script da nota",
"widget-render-error": {
"title": "Falha do renderizar um widget React personalizado"
},
"widget-missing-parent": "Widget adaptado não tem a propriedade '{{property}}' mandatória definida.\n\nSe este script é para ser executado sem um element de UI, usar '#run=frontendStartup'."
},
"add_link": {
"add_link": "Adicionar ligação",
@@ -39,7 +48,10 @@
"help_on_tree_prefix": "Ajuda sobre o prefixo da árvore de notas",
"prefix": "Prefixo: ",
"save": "Gravar",
"branch_prefix_saved": "O prefixo de ramificação foi gravado."
"branch_prefix_saved": "O prefixo de ramificação foi gravado.",
"edit_branch_prefix_multiple": "Editar prefixo para {{count}} branches",
"branch_prefix_saved_multiple": "Prefixo dos branches foi editado para {{count}} branches.",
"affected_branches": "Alterados ({{count}}) branches:"
},
"bulk_actions": {
"bulk_actions": "Ações em massa",
@@ -104,7 +116,8 @@
"export_status": "Estado da exportação",
"export_in_progress": "Exportação em andamento: {{progressCount}}",
"export_finished_successfully": "Exportação concluída com sucesso.",
"format_pdf": "PDF para impressão ou compartilhamento."
"format_pdf": "PDF para impressão ou compartilhamento.",
"share-format": "HTML para publicação web - usa o mesmo tema que é usado para notas partilhadas, mas pode ser publicado como um site estatico."
},
"help": {
"title": "Folha de Dicas",
@@ -158,7 +171,8 @@
"showSQLConsole": "mostrar console SQL",
"other": "Outros",
"quickSearch": "focar no campo de pesquisa rápida",
"inPageSearch": "pesquisa na página"
"inPageSearch": "pesquisa na página",
"editShortcuts": "Editar atalhos do teclado"
},
"import": {
"importIntoNote": "Importar para a nota",
@@ -184,7 +198,8 @@
},
"import-status": "Estado da importação",
"in-progress": "Importação em andamento: {{progress}}",
"successful": "Importação concluída com sucesso."
"successful": "Importação concluída com sucesso.",
"importZipRecommendation": "Quando a importar ficheiro ZIP, a hierarquia de notas vai reflectir a estrutura da sub directoria dentro do ficheiro."
},
"include_note": {
"dialog_title": "Incluir nota",
@@ -199,7 +214,8 @@
"info": {
"modalTitle": "Mensagem informativa",
"closeButton": "Fechar",
"okButton": "OK"
"okButton": "OK",
"copy_to_clipboard": "Copiar para a área de transferência"
},
"jump_to_note": {
"search_placeholder": "Pesquise uma nota pelo nome ou digite > para comandos...",
@@ -274,8 +290,12 @@
"download_button": "Descarregar",
"mime": "MIME: ",
"file_size": "Tamanho do ficheiro:",
"preview": "Visualizar:",
"preview_not_available": "A visualização não está disponível para este tipo de nota."
"preview_not_available": "A visualização não está disponível para este tipo de nota.",
"diff_on": "Mostrar diferenças",
"diff_off": "Mostrar conteúdos",
"diff_on_hint": "Carregar para mostrar diferenças da fonte da nota",
"diff_off_hint": "Carregar para mostrar conteúdos da nota",
"diff_not_available": "Diferenças não disponível."
},
"sort_child_notes": {
"sort_children_by": "Ordenar notas filhas por...",
@@ -586,7 +606,18 @@
"september": "Setembro",
"october": "Outubro",
"november": "Novembro",
"december": "Dezembro"
"december": "Dezembro",
"week": "Semana",
"week_previous": "Semana anterior",
"week_next": "Próxima semana",
"month": "Mês",
"month_previous": "Mês anterior",
"month_next": "Próximo mês",
"year": "Ano",
"year_previous": "Ano anterior",
"year_next": "Próximo ano",
"list": "Lista",
"today": "Hoje"
},
"close_pane_button": {
"close_this_pane": "Fechar este painel"
@@ -629,7 +660,9 @@
"about": "Sobre o Trilium Notes",
"logout": "Sair",
"show-cheatsheet": "Exibir Cheatsheet",
"toggle-zen-mode": "Modo Zen"
"toggle-zen-mode": "Modo Zen",
"new-version-available": "Nova actualização disponível",
"download-update": "Obter versão {{latestVersion}}"
},
"zen_mode": {
"button_exit": "Sair do Modo Zen"
@@ -667,7 +700,14 @@
"convert_into_attachment_failed": "A conversão da nota '{{title}}' falhou.",
"convert_into_attachment_successful": "A nota '{{title}}' foi convertida para anexo.",
"convert_into_attachment_prompt": "Tem certeza que quer converter a nota '{{title}}' num anexo da nota pai?",
"print_pdf": "Exportar como PDF…"
"print_pdf": "Exportar como PDF…",
"open_note_on_server": "Abrir nota no servidor",
"export_as_image": "Exportar como imagem",
"note_map": "Mapa de notas",
"advanced": "Avançadas",
"view_revisions": "Revisões da nota...",
"export_as_image_svg": "SVG (vectorial)",
"export_as_image_png": "PNG (matricial)"
},
"onclick_button": {
"no_click_handler": "Componente de botão '{{componentId}}' não possui manipulador de clique definido"
@@ -713,20 +753,29 @@
"zpetne_odkazy": {
"relation": "relação",
"backlink_one": "{{count}} Ligação Reversa",
"backlink_many": "",
"backlink_many": "{{count}} Ligações Reversas",
"backlink_other": "{{count}} Ligações Reversas"
},
"mobile_detail_menu": {
"insert_child_note": "Inserir nota filha",
"delete_this_note": "Apagar esta nota",
"error_cannot_get_branch_id": "Não foi possível obter o branchId para o notePath '{{notePath}} '",
"error_unrecognized_command": "Comando não reconhecido {{command}}"
"error_unrecognized_command": "Comando não reconhecido {{command}}",
"note_revisions": "Revisões da nota"
},
"note_icon": {
"change_note_icon": "Alterar ícone da nota",
"category": "Categoria:",
"search": "Pesquisa:",
"reset-default": "Redefinir para o ícone padrão"
"reset-default": "Redefinir para o ícone padrão",
"filter": "Filtrar",
"filter-none": "Todos os icons",
"filter-default": "Icons default",
"no_results": "Não foram encontrados icons.",
"search_placeholder_filtered": "Procurar {{number}} icons no {{name}}",
"icon_tooltip": "{{name}}\nPacote de icons: {{iconPack}}",
"search_placeholder_one": "Procurar {{number}} icon nos {{count}} pacotes",
"search_placeholder_many": "Procurar {{number}} icons em {{count}} pacotes",
"search_placeholder_other": "Procurar {{number}} icons nos {{count}} pacotes"
},
"basic_properties": {
"note_type": "Tipo da nota",
@@ -747,7 +796,14 @@
"calendar": "Calendário",
"table": "Tabela",
"geo-map": "Mapa geográfico",
"board": "Quadro"
"board": "Quadro",
"expand_first_level": "Expandir descendentes directos",
"presentation": "Apresentação",
"expand_nth_level": "Expandir {{depth}} níveis",
"expand_all_levels": "Expandir todos os níveis",
"include_archived_notes": "Mostrar notas arquivadas",
"expand_tooltip": "Expande a direcção dos descendentes desta colecção (um nível). Para mais opções, carregar na seta à direita.",
"hide_child_notes": "Esconder notas descendentes na árvore"
},
"edited_notes": {
"no_edited_notes_found": "Ainda não há nenhuma nota editada neste dia…",
@@ -780,7 +836,8 @@
},
"inherited_attribute_list": {
"title": "Atributos Herdados",
"no_inherited_attributes": "Nenhum atributo herdado."
"no_inherited_attributes": "Nenhum atributo herdado.",
"none": "Nenhum"
},
"note_info_widget": {
"note_id": "ID da Nota",
@@ -791,7 +848,9 @@
"note_size_info": "O tamanho da nota fornece uma estimativa aproximada dos requisitos de armazenamento para esta nota. Leva em conta o conteúdo e o conteúdo das suas revisões de nota.",
"calculate": "calcular",
"subtree_size": "(tamanho da subárvore: {{size}} em {{count}} notas)",
"title": "Informações da nota"
"title": "Informações da nota",
"mime": "Tipo MIME",
"show_similar_notes": "Mostrar notas semelhantes"
},
"note_map": {
"open_full": "Expandir completamente",
@@ -854,7 +913,8 @@
"search_parameters": "Parâmetros de Pesquisa",
"unknown_search_option": "Opção de pesquisa desconhecida {{searchOptionName}}",
"search_note_saved": "Nota de pesquisa foi gravada em {{- notePathTitle}}",
"actions_executed": "As ações foram executadas."
"actions_executed": "As ações foram executadas.",
"view_options": "Ver opções:"
},
"similar_notes": {
"title": "Notas Similares",
@@ -948,14 +1008,22 @@
"no_attachments": "Esta nota não possuí anexos."
},
"book": {
"no_children_help": "Esta coleção não possui nenhum nota filha, então não há nada para exibir. Veja <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a> para pormenores."
"no_children_help": "Esta coleção não possui nenhum nota filha, então não há nada para exibir. Veja <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a> para pormenores.",
"drag_locked_title": "Bloqueado para edição",
"drag_locked_message": "Arrastar não permitida pois a coleção está bloqueada para edição."
},
"editable_code": {
"placeholder": "Digite o conteúdo da sua nota de código aqui…"
},
"editable_text": {
"placeholder": "Digite o conteúdo da sua nota aqui…",
"auto-detect-language": "Detetado automaticamente"
"auto-detect-language": "Detetado automaticamente",
"editor_crashed_title": "O editor de texto quebrou",
"editor_crashed_details_button": "Ver mais detalhes...",
"editor_crashed_details_title": "Informação técnica",
"editor_crashed_details_intro": "Se teve este erro várias vezes, considerer reportar no GitHub disponibilizando a informação abaixo.",
"editor_crashed_content": "O seu conteudo foi recuperado com sucesso, mas alguns das alterações mais recentes podem não ter sido gravadas.",
"keeps-crashing": "Componente de edição a rebentar continuamente. Por favor tentar reiniciar Trilium. Se o problema persistir, considere abrir um bug report."
},
"empty": {
"open_note_instruction": "Abra uma nota a digitar o título da nota no campo abaixo ou escolha uma nota na árvore.",
@@ -1083,7 +1151,8 @@
"title": "Largura do Conteúdo",
"default_description": "Por padrão, o Trilium limita a largura máxima do conteúdo para melhorar a legibilidade em janelas maximizadas em ecrãs largos.",
"max_width_label": "Largura máxima do conteúdo",
"max_width_unit": "pixels"
"max_width_unit": "pixels",
"centerContent": "Manter conteúdo centrado"
},
"native_title_bar": {
"title": "Barra de Título Nativa (requer recarregar a app)",
@@ -1115,7 +1184,9 @@
"title": "Desempenho",
"enable-motion": "Ativar transições e animações",
"enable-shadows": "Ativar sombras",
"enable-backdrop-effects": "Ativar efeitos de fundo para menus, popups e painéis"
"enable-backdrop-effects": "Ativar efeitos de fundo para menus, popups e painéis",
"enable-smooth-scroll": "Activar deslocamento suave",
"app-restart-required": "(é necessário reiniciar a aplicação para aplicar as alterações)"
},
"ai_llm": {
"not_started": "Não iniciado",
@@ -1274,7 +1345,10 @@
"title": "Editor"
},
"code_mime_types": {
"title": "Tipos MIME disponíveis no dropdown"
"title": "Tipos MIME disponíveis no dropdown",
"tooltip_syntax_highlighting": "Destaque de sintaxe",
"tooltip_code_block_syntax": "Blocos de código nas notas de texto",
"tooltip_code_note_syntax": "Notas de código"
},
"vim_key_bindings": {
"use_vim_keybindings_in_code_notes": "Atribuições de teclas do Vim",
@@ -1394,7 +1468,13 @@
"min-days-in-first-week": "Mínimo de dias da primeira semana",
"first-week-info": "Primeira semana que contenha a primeira Quinta-feira do ano é baseado na <a href=\"https://en.wikipedia.org/wiki/ISO_week_date#First_week\">ISO 8601</a>.",
"first-week-warning": "Alterar as opções de primeira semana pode causar duplicidade nas Notas Semanais existentes e estas Notas não serão atualizadas de acordo.",
"formatting-locale": "Formato de data e número"
"formatting-locale": "Formato de data e número",
"tuesday": "Terça-feira",
"wednesday": "Quarta-feira",
"thursday": "Quinta-feira",
"friday": "Sexta-feira",
"saturday": "Sábado",
"formatting-locale-auto": "Baseado na linguagem da aplicação"
},
"backup": {
"automatic_backup": "Backup automático",
@@ -1487,7 +1567,8 @@
"oauth_description_warning": "Para ativar o OAuth/OpenID, precisa definir a URL base do OAuth/OpenID, o client ID e o client secret no ficheiro config.ini e reiniciar a aplicação. Se quiser configurar via variáveis de ambiente, defina TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID e TRILIUM_OAUTH_CLIENT_SECRET.",
"oauth_user_account": "Conta do Utilizador: ",
"oauth_user_email": "E-mail do Utilizador: ",
"oauth_user_not_logged_in": "Não está logado!"
"oauth_user_not_logged_in": "Não está logado!",
"oauth_missing_vars": "Configurações em falta: {{-variables}}"
},
"shortcuts": {
"keyboard_shortcuts": "Atalhos de Teclado",
@@ -1587,7 +1668,12 @@
"apply-bulk-actions": "Aplicar ações em massa",
"converted-to-attachments": "{{count}} notas foram convertidas em anexos.",
"convert-to-attachment-confirm": "Tem certeza que deseja converter as notas selecionadas em anexos das suas notas-pai?",
"open-in-popup": "Edição rápida"
"open-in-popup": "Edição rápida",
"open-in-a-new-window": "Abrir numa nova janela",
"archive": "Arquivar",
"unarchive": "Retirar do arquivo",
"hide-subtree": "Esconder sub-árvore",
"show-subtree": "Mostrar sub-árvore"
},
"shared_info": {
"shared_publicly": "Esta nota é partilhada publicamente em {{- link}}.",
@@ -1648,7 +1734,13 @@
},
"highlights_list_2": {
"title": "Lista de Destaques",
"options": "Opções"
"options": "Opções",
"no_highlights": "Sem destaques encontrados.",
"menu_configure": "Configurar lista de destaques...",
"modal_title": "Configurar list de destaques",
"title_with_count_one": "{{count}} destaque",
"title_with_count_many": "{{count}} destaques",
"title_with_count_other": "{{count}} destaques"
},
"quick-search": {
"placeholder": "Pesquisa rápida",
@@ -1671,16 +1763,43 @@
"refresh-saved-search-results": "Atualizar resultados de pesquisa gravados",
"create-child-note": "Criar nota filha",
"unhoist": "Desafixar",
"toggle-sidebar": "Alternar barra lateral"
"toggle-sidebar": "Alternar barra lateral",
"dropping-not-allowed": "Largar notas nesta localização não é permitida",
"clone-indicator-tooltip": "Esta nota tem {{- count}} ascendentes: {{- parents}}",
"shared-indicator-tooltip": "Esta nota está partilhada publicamente",
"shared-indicator-tooltip-with-url": "Esta nota está partilhada publicamente em: {{- url}}",
"subtree-hidden-moved-title": "Adicionar ao {{title}}",
"subtree-hidden-moved-description-collection": "Esta colecção esconde as notas descendentes na árvore.",
"subtree-hidden-moved-description-other": "Notas descendentes estão escondidades na árvore para esta nota.",
"subtree-hidden-tooltip_one": "{{count}} nota descendentes escondidas da árvore",
"subtree-hidden-tooltip_many": "{{count}} notas descendentes escondidas da árvore",
"subtree-hidden-tooltip_other": "{{count}} notas descendentes escondidas da árvore",
"clone-indicator-tooltip-single": "Esta nota está clonada (1 additional parent: {{- parent}})"
},
"title_bar_buttons": {
"window-on-top": "Manter Janela no Topo"
},
"note_detail": {
"could_not_find_typewidget": "Não foi possível encontrar typeWidget para o tipo '{{type}}'"
"could_not_find_typewidget": "Não foi possível encontrar typeWidget para o tipo '{{type}}'",
"print_report_collection_details_button": "Ver detalhes",
"printing": "Impressão em progresso...",
"printing_pdf": "Exportação PDF em progresso...",
"print_report_title": "Imprimir relatório",
"print_report_collection_details_ignored_notes": "Ignorar notas",
"print_report_collection_content_one": "{{count}} nota na colecção não pode ser impressa porque não é suportado ou está protegida.",
"print_report_collection_content_many": "{{count}} notas na colecção não podem ser impressas porque não é suportado ou estão protegidas.",
"print_report_collection_content_other": "{{count}} notas na colecção não podem ser impressas porque não é suportado ou estão protegidas."
},
"note_title": {
"placeholder": "digite o título da nota aqui..."
"placeholder": "digite o título da nota aqui...",
"promoted_attributes": "Atributos destacados",
"created_on": "Criado em <Value />",
"last_modified": "Modificado em <Value />",
"note_type_switcher_label": "Alterar de {{type}} para:",
"note_type_switcher_others": "Outro tipo de nota",
"note_type_switcher_templates": "Template",
"note_type_switcher_collection": "Colecção",
"edited_notes": "Notas editadas neste dia"
},
"search_result": {
"no_notes_found": "Nenhuma nota encontrada para os parâmetros de pesquisa digitados.",
@@ -1709,7 +1828,8 @@
},
"toc": {
"table_of_contents": "Tabela de Conteúdos",
"options": "Opções"
"options": "Opções",
"no_headings": "Sem cabeçalhos."
},
"watched_file_update_status": {
"file_last_modified": "O ficheiro <code class=\"file-path\"></code> foi modificado pela última vez em <span class=\"file-last-modified\"></span>.",
@@ -1752,7 +1872,9 @@
"ws": {
"sync-check-failed": "A verificação de sincronização falhou!",
"consistency-checks-failed": "A verificação de consistência falhou! Veja os logs para pormenores.",
"encountered-error": "Encontrado o erro \"{{message}}\", verifique o console."
"encountered-error": "Encontrado o erro \"{{message}}\", verifique o console.",
"lost-websocket-connection-title": "Perdida conexão com o servidor",
"lost-websocket-connection-message": "Verifique a configuração da proxy inversa (e.g. nginx ou Apache) para assegurar conexões WebSocket estão permitidas e não bloqueadas."
},
"hoisted_note": {
"confirm_unhoisting": "A nota solicitada '{{requestedNote}}' está fora da árvore da nota fixada '{{hoistedNote}}' e precisa desafixar para aceder a nota. Quer prosseguir e desafixar?"
@@ -1808,7 +1930,8 @@
"copy-link": "Copiar ligação",
"paste": "Colar",
"paste-as-plain-text": "Colar como texto sem formatação",
"search_online": "Pesquisar por \"{{term}}\" com {{searchEngine}}"
"search_online": "Pesquisar por \"{{term}}\" com {{searchEngine}}",
"search_in_trilium": "A procurar \"{{term}}\" no Trilium"
},
"image_context_menu": {
"copy_reference_to_clipboard": "Copiar referência para a área de transferência",
@@ -1818,7 +1941,8 @@
"open_note_in_new_tab": "Abrir nota em nova guia",
"open_note_in_new_split": "Abrir nota em nova divisão",
"open_note_in_new_window": "Abrir nota em nova janela",
"open_note_in_popup": "Edição rápida"
"open_note_in_popup": "Edição rápida",
"open_note_in_other_split": "Abrir nota noutro separador"
},
"electron_integration": {
"desktop-application": "Aplicação Desktop",
@@ -1826,7 +1950,8 @@
"native-title-bar-description": "Para Windows e macOS, manter a barra de título nativa desativada faz a aplicação parecer mais compacta. No Linux, manter a barra de título nativa ativada faz a aplicação se integrar melhor com o restante do sistema.",
"background-effects": "Ativar efeitos de fundo (apenas Windows 11)",
"restart-app-button": "Reiniciar a aplicação para ver as alterações",
"zoom-factor": "Fator de Zoom"
"zoom-factor": "Fator de Zoom",
"background-effects-description": "O Mica adiciona um desfoque, fundo estiloso as janelas da aplicação, criando uma profundidade e aspecto moderno. \"Barra de titulo nativa\" deve estar inactiva."
},
"note_autocomplete": {
"search-for": "Pesquisar por \"{{term}}\"",
@@ -1886,7 +2011,8 @@
},
"note_language": {
"not_set": "Não atribuído",
"configure-languages": "Configurar idiomas..."
"configure-languages": "Configurar idiomas...",
"help-on-languages": "Ajuda nas linguagens de conteúdos..."
},
"content_language": {
"title": "Idiomas do conteúdo",
@@ -1904,7 +2030,8 @@
"button_title": "Exportar diagrama como PNG"
},
"svg": {
"export_to_png": "O diagrama não pôde ser exportado como PNG."
"export_to_png": "O diagrama não pôde ser exportado como PNG.",
"export_to_svg": "O diagrama não pode ser exportado para SVG."
},
"code_theme": {
"title": "Aparência",
@@ -1923,7 +2050,11 @@
"editorfeatures": {
"title": "Recursos",
"emoji_completion_enabled": "Ativar auto-completar de Emoji",
"note_completion_enabled": "Ativar auto-completar de notas"
"note_completion_enabled": "Ativar auto-completar de notas",
"emoji_completion_description": "Se activo, emojis podem ser facilmente inseridos em texto ao pressionar `:`, seguido do nome de um emoji.",
"note_completion_description": "Se activo, links para notas podem ser criadas ao escrever `@` seguido do titulo de uma nota.",
"slash_commands_enabled": "Activar comentários simples",
"slash_commands_description": "Se activo, editar comandos como inserir quebras de linha ou cabeçalhos podem ser activado/inactivado ao escrever `/`."
},
"table_view": {
"new-row": "Nova linha",
@@ -1965,7 +2096,16 @@
"delete-column": "Apagar coluna",
"delete-column-confirmation": "Tem certeza que deseja apagar esta coluna? O atributo correspondente também será apagado de todas as notas abaixo desta coluna.",
"new-item": "Novo elemento",
"add-column": "Adicionar Coluna"
"add-column": "Adicionar Coluna",
"delete-note": "Apagar nota...",
"remove-from-board": "Remover do quadro",
"archive-note": "Arquivar nota",
"new-item-placeholder": "Inserir titulo da nota...",
"add-column-placeholder": "Inserir nome da coluna...",
"edit-note-title": "Clicar para editar o titulo da nota",
"unarchive-note": "Remover nota do arquivo",
"edit-column-title": "Click para editar titulo da coluna",
"column-already-exists": "Esta coluna já existe no quadro."
},
"command_palette": {
"tree-action-name": "Árvore: {{name}}",
@@ -1996,16 +2136,146 @@
"background_effects_title": "Efeitos de fundo estão estáveis agora",
"background_effects_message": "Em dispositivos Windows, efeitos de fundo estão estáveis agora. Os efeitos de fundo adicionam um toque de cor à interface do utilizador borrando o plano de fundo atrás dela. Esta técnica também é usada noutras aplicações como o Windows Explorer.",
"background_effects_button": "Ativar os efeitos de fundo",
"dismiss": "Dispensar"
"dismiss": "Dispensar",
"new_layout_title": "Novo titulo do layout",
"new_layout_button": "Mais informação",
"new_layout_message": "Estamos a introduzir um layout modernizado para o Trilium. A faixa foi removida e está integrada na interface principal, com uma nota barra de estado e secções expansíveis (como as propriedades próprias) a tomar papéis principais.\n\nO novo layout está activo por defeito, e pode ser temporáriamente disabilidade em Opções → Aparência."
},
"settings": {
"related_settings": "Configurações relacionadas"
},
"settings_appearance": {
"related_code_blocks": "Esquema de cores para blocos de código em notas de texto",
"related_code_notes": "Esquema de cores para notas de código"
"related_code_notes": "Esquema de cores para notas de código",
"ui": "Interface do utilizador",
"ui_old_layout": "Layout antigo",
"ui_new_layout": "Nova aparência"
},
"units": {
"percentage": "%"
},
"experimental_features": {
"title": "Opções experimentais",
"new_layout_name": "Novo layout",
"new_layout_description": "Experimente o novo layout para um aspecto moderno e melhor estabilidade. Sujeito a grandes alterações nas próximas publicações.",
"disclaimer": "Estas opções são experimentais e podem causar instabilidade. Usar com cuidado."
},
"read-only-info": {
"read-only-note": "Actualmente a ver em modo de leitura.",
"edit-note": "Editar nota",
"auto-read-only-note": "Esta nota está a ser mostrada em modo de leitura para um carregamento mais rápido."
},
"presentation_view": {
"edit-slide": "Editar este slide",
"start-presentation": "Iniciar apresentação",
"slide-overview": "Alternar visão geral dos slides"
},
"calendar_view": {
"delete_note": "Apagar nota..."
},
"pagination": {
"page_title": "Página {{startIndex}} - {{endIndex}}",
"total_notes": "{{count}} notas"
},
"collections": {
"rendering_error": "Sem possíbilidade de mostrar conteúdos devido a um erro."
},
"note-color": {
"clear-color": "Remover cor da nota",
"set-color": "Atribuir cor da nota",
"set-custom-color": "Afectar cor personalizada da nota"
},
"popup-editor": {
"maximize": "Alterar para editor completo"
},
"server": {
"unknown_http_error_title": "Erro na comunicação com servidor",
"unknown_http_error_content": "Código de estado: {{statusCode}}\nURL: {{method}} {{url}}\nMessagem: {{message}}",
"traefik_blocks_requests": "Se está a usar o Traefik, este introduz uma alteração que afecta a comunicação com o servidor."
},
"tab_history_navigation_buttons": {
"go-back": "Ir para a nota anterior",
"go-forward": "Ir para nota seguinte"
},
"breadcrumb": {
"hoisted_badge": "Içado",
"workspace_badge": "Área de trabalho",
"scroll_to_top_title": "Saltar para o início da nota",
"create_new_note": "Criar nova nota descendente",
"empty_hide_archived_notes": "Esconder notas arquivadas",
"hoisted_badge_title": "Retirar de içado"
},
"breadcrumb_badges": {
"read_only_explicit": "Modo de leitura",
"read_only_auto": "Modo de leitura automático",
"read_only_temporarily_disabled": "Editável temporáriamente",
"read_only_auto_description": "Esta nota foi automaticamente colocada em modo de leitura por razões de performance. Este limite automatico é ajustável nas configurações.\n\nClicar para editar temporáriamente.",
"read_only_temporarily_disabled_description": "Esta nota está editável, mas normalmente está em modo de leitura. A nova vai regressar para mode de leitura assim que navegar para outra nota.\n\nClicar para reactivar o modo de leitura.",
"read_only_explicit_description": "Esta nota foi manualmente colocada em modo de leitura.\nClicar para editar temporáriamente.",
"shared_publicly": "Partilhado publicamente",
"shared_locally": "Partilhado localmente",
"shared_copy_to_clipboard": "Copiar link para a área de transferência",
"shared_open_in_browser": "Abrir link no browser",
"shared_unshare": "Remover partilha",
"clipped_note_description": "Esta nota foi retirar do {{url}}.\n\nClicar para navegar no código fonte da página.",
"clipped_note": "Web clipe",
"execute_script": "Correr script",
"execute_script_description": "Esta nota é uma nota de script. Clicar para executar o script.",
"execute_sql": "Correr SQL",
"execute_sql_description": "Esta nota é uma nota de SQL. Clicar para executar script SQL.",
"save_status_saved": "Guardar",
"save_status_saving": "A guardar...",
"save_status_unsaved": "Não gravado",
"save_status_error": "Gravar falhou",
"save_status_saving_tooltip": "Alterações estão a ser guardadas",
"save_status_unsaved_tooltip": "Existem alterações não guardadas. Serão guardadas automaticamente em breve.",
"save_status_error_tooltip": "Ocorreu um erro ao guardar a nota. Se possível, tente copiar os conteúdos da nota para outro local e reiniciar a aplicação."
},
"status_bar": {
"language_title": "Alterar lingua do conteúdo",
"note_info_title": "Ver informação da nota (e.g., datas, tamanho da nota)",
"backlinks_one": "{{count}} backlink",
"backlinks_many": "{{count}} backlinks",
"backlinks_other": "{{count}} backlinks",
"backlinks_title_one": "Ver backlink",
"backlinks_title_many": "Ver backlinks",
"backlinks_title_other": "Ver backlinks",
"attachments_one": "{{count}} anexo",
"attachments_many": "{{count}} anexos",
"attachments_other": "{{count}} anexos",
"attachments_title_one": "Ver anexo num novo separador",
"attachments_title_many": "Ver anexos num novo separador",
"attachments_title_other": "Ver anexos num novo separador",
"attributes_one": "{{count}} atributo",
"attributes_many": "{{count}} atributos",
"attributes_other": "{{count}} atributos",
"attributes_title": "Atributos próprios e herdados",
"note_paths_one": "{{count}} caminho",
"note_paths_many": "{{count}} caminhos",
"note_paths_other": "{{count}} caminhos",
"note_paths_title": "Caminhos da nota",
"code_note_switcher": "Alterar modo de linguagem"
},
"attributes_panel": {
"title": "Atributos da nota"
},
"right_pane": {
"empty_message": "Nada para mostrar nesta nota",
"empty_button": "Esconder painél",
"toggle": "Alterar painel direito",
"custom_widget_go_to_source": "Ir para código fonte"
},
"pdf": {
"attachments_one": "{{count}} anexo pdf",
"attachments_many": "{{count}} anexos pdf",
"attachments_other": "{{count}} anexos pdf",
"layers_one": "{{count}} camada",
"layers_many": "{{count}} camadas",
"layers_other": "{{count}} camadas",
"pages_one": "{{count}} página",
"pages_many": "{{count}} páginas",
"pages_other": "{{count}} páginas",
"pages_alt": "Página {{pageNumber}}",
"pages_loading": "A carregar..."
}
}

View File

@@ -29,7 +29,15 @@
"bundle-error": {
"title": "Falha para carregar o script customizado",
"message": "O script da nota com ID \"{{id}}\", intitulada \"{{title}}\", não pôde ser executado devido a:\n\n{{message}}"
}
},
"widget-list-error": {
"title": "Falha ao obter a lista de widgets do servidor"
},
"widget-render-error": {
"title": "Falha ao renderizar um widget React personalizado"
},
"widget-missing-parent": "O widget personalizado não possui a propriedade obrigatória '{{property}}' definida.",
"open-script-note": "Abrir nota de script"
},
"add_link": {
"add_link": "Adicionar link",
@@ -46,7 +54,10 @@
"save": "Salvar",
"edit_branch_prefix": "Editar Prefixo do Branch",
"help_on_tree_prefix": "Ajuda sobre o prefixo da árvore de notas",
"branch_prefix_saved": "O prefixo de ramificação foi salvo."
"branch_prefix_saved": "O prefixo de ramificação foi salvo.",
"edit_branch_prefix_multiple": "Editar prefixo do ramo para {{count}} ramos",
"branch_prefix_saved_multiple": "O prefixo do ramo foi salvo para {{count}} ramos.",
"affected_branches": "Ramos afetados ({{count}}):"
},
"bulk_actions": {
"bulk_actions": "Ações em massa",
@@ -254,7 +265,8 @@
"export_status": "Status da exportação",
"export_in_progress": "Exportação em andamento: {{progressCount}}",
"export_finished_successfully": "Exportação concluída com sucesso.",
"format_pdf": "PDF para impressão ou compartilhamento."
"format_pdf": "PDF para impressão ou compartilhamento.",
"share-format": "HTML para publicação na web — usa o mesmo tema das notas compartilhadas, mas pode ser publicado como um site estático."
},
"help": {
"noteNavigation": "Navegação de notas",
@@ -308,7 +320,8 @@
"other": "Outros",
"quickSearch": "focar no campo de pesquisa rápida",
"inPageSearch": "pesquisa na página",
"title": "Folha de Dicas"
"title": "Folha de Dicas",
"editShortcuts": "Editar atalhos de teclado"
},
"import": {
"importIntoNote": "Importar para a nota",
@@ -334,7 +347,8 @@
},
"import-status": "Status da importação",
"in-progress": "Importação em andamento: {{progress}}",
"successful": "Importação concluída com sucesso."
"successful": "Importação concluída com sucesso.",
"importZipRecommendation": "Ao importar um arquivo ZIP, a hierarquia de notas refletirá a estrutura de subdiretórios dentro do arquivo."
},
"include_note": {
"dialog_title": "Incluir nota",
@@ -349,7 +363,8 @@
"info": {
"modalTitle": "Mensagem informativa",
"closeButton": "Fechar",
"okButton": "OK"
"okButton": "OK",
"copy_to_clipboard": "Copiar para a área de transferência"
},
"jump_to_note": {
"search_placeholder": "Pesquise uma nota pelo nome ou digite > para comandos...",
@@ -424,7 +439,6 @@
"download_button": "Download",
"mime": "MIME: ",
"file_size": "Tamanho do arquivo:",
"preview": "Visualizar:",
"preview_not_available": "A visualização não está disponível para este tipo de nota.",
"diff_on": "Exibir diferença",
"diff_off": "Exibir conteúdo",
@@ -771,7 +785,7 @@
"import-into-note": "Importar na nota",
"apply-bulk-actions": "Aplicar ações em massa",
"converted-to-attachments": "{{count}} notas foram convertidas em anexos.",
"convert-to-attachment-confirm": "Tem certeza de que deseja converter as notas selecionadas em anexos de suas notas-pai?",
"convert-to-attachment-confirm": "Tem certeza de que deseja converter as notas selecionadas em anexos de suas notas pai? Esta operação se aplica apenas a notas de imagem; outras notas serão ignoradas.",
"open-in-popup": "Edição rápida",
"archive": "Ficheiro",
"unarchive": "Desarquivar"
@@ -789,7 +803,7 @@
"show_attachments_description": "Exibir anexos da nota",
"search_notes_title": "Buscar Notas",
"search_notes_description": "Abrir busca avançada",
"configure_launch_bar_description": "Abrir a configuração da barra de lançamento, para adicionar ou remover itens."
"configure_launch_bar_description": "Abrir a configuração da barra de atalho, para adicionar ou remover itens."
},
"delete_note": {
"delete_note": "Excluir nota",
@@ -882,7 +896,7 @@
"zoom_out": "Reduzir",
"reset_zoom_level": "Redefinir Zoom",
"zoom_in": "Aumentar",
"configure_launchbar": "Configurar Barra de Lançamento",
"configure_launchbar": "Configurar Barra de Atalhos",
"show_shared_notes_subtree": "Exibir Subárvore de Notas Compartilhadas",
"advanced": "Avançado",
"open_dev_tools": "Abrir Ferramentas de Desenvolvedor",
@@ -897,7 +911,9 @@
"logout": "Sair",
"show-cheatsheet": "Exibir Cheatsheet",
"toggle-zen-mode": "Modo Zen",
"reload_hint": "Recarregar pode ajudar com alguns problemas visuais sem reiniciar toda a aplicação."
"reload_hint": "Recarregar pode ajudar com alguns problemas visuais sem reiniciar toda a aplicação.",
"new-version-available": "Nova atualização disponível",
"download-update": "Obter a versão {{latestVersion}}"
},
"zen_mode": {
"button_exit": "Sair do Modo Zen"
@@ -935,7 +951,14 @@
"convert_into_attachment_successful": "A nota '{{title}}' foi convertida para anexo.",
"print_pdf": "Exportar como PDF…",
"open_note_externally_title": "O arquivo será aberto em uma aplicação externa e monitorado por alterações. Você então poderá enviar a versão modificada de volta para o Trilium.",
"convert_into_attachment_prompt": "Você tem certeza que quer converter a nota '{{title}}' em um anexo da nota pai?"
"convert_into_attachment_prompt": "Você tem certeza que quer converter a nota '{{title}}' em um anexo da nota pai?",
"open_note_on_server": "Abrir nota no servidor",
"view_revisions": "Revisões da nota…",
"advanced": "Avançado",
"export_as_image": "Exportar como imagem",
"export_as_image_png": "PNG (raster)",
"export_as_image_svg": "SVG (vetorial)",
"note_map": "Mapa de notas"
},
"protected_session_status": {
"inactive": "Clique para entrar na sessão protegida",
@@ -979,11 +1002,11 @@
"insert_child_note": "Inserir nota filha",
"delete_this_note": "Excluir essa nota",
"error_unrecognized_command": "Comando não reconhecido {{command}}",
"error_cannot_get_branch_id": "Não foi possível obter o branchId para o notePath '{{notePath}} '"
"error_cannot_get_branch_id": "Não foi possível obter o branchId para o notePath '{{notePath}} '",
"note_revisions": "Revisões de notas"
},
"note_icon": {
"change_note_icon": "Alterar ícone da nota",
"category": "Categoria:",
"search": "Busca:",
"reset-default": "Redefinir para o ícone padrão"
},
@@ -1007,7 +1030,12 @@
"table": "Tabela",
"geo-map": "Mapa geográfico",
"board": "Quadro",
"include_archived_notes": "Exibir notas arquivadas"
"include_archived_notes": "Exibir notas arquivadas",
"expand_tooltip": "Expande os filhos diretos desta coleção (um nível). Para mais opções, pressione a seta à direita.",
"expand_first_level": "Expandir filhos diretos",
"expand_nth_level": "Expandir {{depth}} níveis",
"expand_all_levels": "Expandir todos os níveis",
"presentation": "Apresentação"
},
"edited_notes": {
"no_edited_notes_found": "Ainda não há nenhuma nota editada neste dia…",
@@ -1020,7 +1048,7 @@
"file_type": "Tipo do arquivo",
"file_size": "Tamanho do arquivo",
"download": "Baixar",
"open": "Abrir",
"open": "Abrir externamente",
"upload_new_revision": "Enviar nova revisão",
"upload_success": "Uma nova revisão de arquivo foi enviada.",
"upload_failed": "O envio de uma nova revisão de arquivo falhou.",
@@ -1040,7 +1068,8 @@
},
"inherited_attribute_list": {
"title": "Atributos Herdados",
"no_inherited_attributes": "Nenhum atributo herdado."
"no_inherited_attributes": "Nenhum atributo herdado.",
"none": "nenhum"
},
"note_info_widget": {
"note_id": "ID da Nota",
@@ -1051,7 +1080,9 @@
"calculate": "calcular",
"title": "Informações da nota",
"subtree_size": "(tamanho da subárvore: {{size}} em {{count}} notas)",
"note_size_info": "O tamanho da nota fornece uma estimativa aproximada dos requisitos de armazenamento para esta nota. Leva em conta o conteúdo e o conteúdo de suas revisões de nota."
"note_size_info": "O tamanho da nota fornece uma estimativa aproximada dos requisitos de armazenamento para esta nota. Leva em conta o conteúdo e o conteúdo de suas revisões de nota.",
"mime": "Tipo MIME",
"show_similar_notes": "Mostrar notas semelhantes"
},
"note_map": {
"open_full": "Expandir completamente",
@@ -1111,7 +1142,8 @@
"search_note_saved": "Nota de pesquisa foi salva em {{- notePathTitle}}",
"fast_search_description": "A opção de pesquisa rápida desabilita a pesquisa de texto completo do conteúdo de nota, o que pode acelerar a pesquisa em grandes bancos de dados.",
"include_archived_notes_description": "As notas arquivadas são por padrão excluídas dos resultados da pesquisa, com esta opção elas serão incluídas.",
"debug_description": "A depuração irá imprimir informações adicionais no console para ajudar na depuração de consultas complexas"
"debug_description": "A depuração irá imprimir informações adicionais no console para ajudar na depuração de consultas complexas",
"view_options": "Ver opções:"
},
"similar_notes": {
"title": "Notas Similares",
@@ -1192,7 +1224,13 @@
},
"editable_text": {
"placeholder": "Digite o conteúdo da sua nota aqui…",
"auto-detect-language": "Detectado automaticamente"
"auto-detect-language": "Detectado automaticamente",
"editor_crashed_title": "O editor de texto travou",
"editor_crashed_content": "Seu conteúdo foi recuperado com sucesso, mas algumas das suas alterações mais recentes podem não ter sido salvas.",
"editor_crashed_details_button": "Veja mais detalhes...",
"editor_crashed_details_intro": "Se você encontrar este erro várias vezes, considere relatá-lo no GitHub colando as informações abaixo.",
"editor_crashed_details_title": "Informação técnica",
"keeps-crashing": "O componente de edição continua travando. Tente reiniciar o Trilium. Se o problema persistir, considere criar um relatório de bug."
},
"empty": {
"search_placeholder": "buscar uma nota pelo nome",
@@ -1299,7 +1337,8 @@
"title": "Largura do Conteúdo",
"max_width_label": "Largura máxima do conteúdo",
"max_width_unit": "pixels",
"default_description": "Por padrão, o Trilium limita a largura máxima do conteúdo para melhorar a legibilidade em janelas maximizadas em telas wide."
"default_description": "Por padrão, o Trilium limita a largura máxima do conteúdo para melhorar a legibilidade em janelas maximizadas em telas wide.",
"centerContent": "Manter conteúdo centralizado"
},
"native_title_bar": {
"title": "Barra de Título Nativa (requer recarregar o app)",
@@ -1319,11 +1358,11 @@
"layout": "Layout",
"layout-vertical-title": "Vertical",
"layout-horizontal-title": "Horizontal",
"layout-vertical-description": "barra de lançamento está a esquerda (padrão)",
"layout-horizontal-description": "barra de lançamento está abaixo da barra de abas, a barra de abas agora tem a largura total."
"layout-vertical-description": "barra de atalho está a esquerda (padrão)",
"layout-horizontal-description": "barra de atalho está abaixo da barra de abas, a barra de abas agora tem a largura total."
},
"note_launcher": {
"this_launcher_doesnt_define_target_note": "Este lançador não define uma nota destino."
"this_launcher_doesnt_define_target_note": "Este atalho não define uma nota destino."
},
"copy_image_reference_button": {
"button_title": "Copiar referência da imagem para a área de transferência, pode ser colado em uma nota de texto."
@@ -1378,7 +1417,10 @@
"title": "Editor"
},
"code_mime_types": {
"title": "Tipos MIME disponíveis no dropdown"
"title": "Tipos MIME disponíveis no dropdown",
"tooltip_syntax_highlighting": "Realce de sintaxe",
"tooltip_code_block_syntax": "Blocos de código em notas de texto",
"tooltip_code_note_syntax": "Notas de código"
},
"vim_key_bindings": {
"use_vim_keybindings_in_code_notes": "Atribuições de teclas do Vim",
@@ -1498,7 +1540,13 @@
"min-days-in-first-week": "Mínimo de dias da primeira semana",
"first-week-info": "Primeira semana que contenha a primeira Quinta-feira do ano é baseado na <a href=\"https://en.wikipedia.org/wiki/ISO_week_date#First_week\">ISO 8601</a>.",
"first-week-warning": "Alterar as opções de primeira semana pode causar duplicidade nas Notas Semanais existentes e estas Notas não serão atualizadas de acordo.",
"formatting-locale": "Formato de data e número"
"formatting-locale": "Formato de data e número",
"tuesday": "Terça-feira",
"wednesday": "Quarta-feira",
"thursday": "Quinta-feira",
"friday": "Sexta-feira",
"saturday": "Sábado",
"formatting-locale-auto": "Com base no idioma do aplicativo"
},
"backup": {
"automatic_backup": "Backup automático",
@@ -1526,7 +1574,7 @@
"mind-map": "Mapa Mental",
"file": "Arquivo",
"image": "Imagem",
"launcher": "Lançador",
"launcher": "Atalho",
"doc": "Documento",
"widget": "Widget",
"confirm-change": "Não é recomentado alterar o tipo da nota quando o conteúdo da nota não está vazio. Quer continuar assim mesmo?",
@@ -1569,7 +1617,13 @@
},
"highlights_list_2": {
"title": "Lista de Destaques",
"options": "Opções"
"options": "Opções",
"title_with_count_one": "{{count}} destaque",
"title_with_count_many": "{{count}} destaques",
"title_with_count_other": "{{count}} destaques",
"modal_title": "Configurar lista de destaques",
"menu_configure": "Configurar lista de destaques…",
"no_highlights": "Nenhum destaque encontrado."
},
"quick-search": {
"placeholder": "Busca rápida",
@@ -1592,23 +1646,33 @@
"refresh-saved-search-results": "Atualizar resultados de pesquisa salvos",
"create-child-note": "Criar nota filha",
"unhoist": "Desafixar",
"toggle-sidebar": "Alternar barra lateral"
"toggle-sidebar": "Alternar barra lateral",
"dropping-not-allowed": "Não é permitido soltar notas neste local."
},
"title_bar_buttons": {
"window-on-top": "Manter Janela no Topo"
},
"note_detail": {
"could_not_find_typewidget": "Não foi possível encontrar typeWidget para o tipo '{{type}}'"
"could_not_find_typewidget": "Não foi possível encontrar typeWidget para o tipo '{{type}}'",
"printing": "Impressão em andamento…",
"printing_pdf": "Exportação para PDF em andamento…"
},
"note_title": {
"placeholder": "digite o título da nota aqui..."
"placeholder": "digite o título da nota aqui...",
"created_on": "Criado em <Value />",
"last_modified": "Modificado em <Value />",
"note_type_switcher_label": "Alternar de {{type}} para:",
"note_type_switcher_others": "Outro tipo de nota",
"note_type_switcher_templates": "Modelo",
"note_type_switcher_collection": "Coleção",
"edited_notes": "Notas editadas"
},
"search_result": {
"no_notes_found": "Nenhuma nota encontrada para os parâmetros de busca digitados.",
"search_not_executed": "A busca ainda não foi executada. Clique no botão \"Buscar\" acima para ver os resultados."
},
"spacer": {
"configure_launchbar": "Configurar Barra de Lançamento"
"configure_launchbar": "Configurar Barra de Atalhos"
},
"sql_result": {
"no_rows": "Nenhum linha foi retornada para esta consulta"
@@ -1630,7 +1694,8 @@
},
"toc": {
"table_of_contents": "Tabela de Conteúdos",
"options": "Opções"
"options": "Opções",
"no_headings": "Nenhum título."
},
"watched_file_update_status": {
"file_last_modified": "O arquivo <code class=\"file-path\"></code> foi modificado pela última vez em <span class=\"file-last-modified\"></span>.",
@@ -1673,22 +1738,24 @@
"ws": {
"sync-check-failed": "A verificação de sincronização falhou!",
"consistency-checks-failed": "A verificação de consistência falhou! Veja os logs para detalhes.",
"encountered-error": "Encontrado o erro \"{{message}}\", verifique o console."
"encountered-error": "Encontrado o erro \"{{message}}\", verifique o console.",
"lost-websocket-connection-title": "Conexão com o servidor perdida",
"lost-websocket-connection-message": "Verifique a configuração do seu proxy reverso (por exemplo, nginx ou Apache) para garantir que as conexões WebSocket estejam devidamente permitidas e não estejam sendo bloqueadas."
},
"hoisted_note": {
"confirm_unhoisting": "A nota solicitada '{{requestedNote}}' está fora da árvore da nota fixada '{{hoistedNote}}' e você precisa desafixar para acessar a nota. Quer prosseguir e desafixar?"
},
"launcher_context_menu": {
"reset_launcher_confirm": "Você deseja realmente reiniciar \"{{title}}\"? Todos os dados / configurações desta nota (e suas filhas) serão perdidos o lançador irá retornar para sua localização original.",
"add-note-launcher": "Adicionar um lançador de nota",
"add-script-launcher": "Adicionar um lançador de script",
"reset_launcher_confirm": "Você deseja realmente reiniciar \"{{title}}\"? Todos os dados / configurações desta nota (e suas filhas) serão perdidos o atalho irá retornar para sua localização original.",
"add-note-launcher": "Adicionar um atalho de nota",
"add-script-launcher": "Adicionar um atalho de script",
"add-custom-widget": "Adicionar um componente personalizado",
"add-spacer": "Adicionar um espaçador",
"delete": "Excluir <kbd data-command=\"deleteNotes\"></kbd>",
"reset": "Reiniciar",
"move-to-visible-launchers": "Mover para lançadores visíveis",
"move-to-available-launchers": "Mover para lançadores disponíveis",
"duplicate-launcher": "Duplicar o lançador <kbd data-command=\"duplicateSubtree\">"
"move-to-visible-launchers": "Mover para atalhos visíveis",
"move-to-available-launchers": "Mover para atalhos disponíveis",
"duplicate-launcher": "Duplicar o atalho <kbd data-command=\"duplicateSubtree\">"
},
"highlighting": {
"title": "Blocos de Código",
@@ -1722,7 +1789,8 @@
"copy-link": "Copiar link",
"paste": "Colar",
"paste-as-plain-text": "Colar como texto sem formatação",
"search_online": "Buscar por \"{{term}}\" usando {{searchEngine}}"
"search_online": "Buscar por \"{{term}}\" usando {{searchEngine}}",
"search_in_trilium": "Pesquisar por \"{{term}}\" no Trilium"
},
"image_context_menu": {
"copy_reference_to_clipboard": "Copiar referência para a área de transferência",
@@ -1732,7 +1800,8 @@
"open_note_in_new_tab": "Abrir nota em nova aba",
"open_note_in_new_split": "Abrir nota em nova divisão",
"open_note_in_new_window": "Abrir nota em nova janela",
"open_note_in_popup": "Edição rápida"
"open_note_in_popup": "Edição rápida",
"open_note_in_other_split": "Abrir nota no outro painel dividido"
},
"electron_integration": {
"desktop-application": "Aplicação Desktop",
@@ -1800,8 +1869,9 @@
"unknown_widget": "Componente desconhecido para \"{{id}}\"."
},
"note_language": {
"not_set": "Não atribuído",
"configure-languages": "Configurar idiomas..."
"not_set": "Nenhum idioma definido",
"configure-languages": "Configurar idiomas...",
"help-on-languages": "Ajuda sobre idiomas de conteúdo…"
},
"content_language": {
"title": "Idiomas do conteúdo",
@@ -1819,7 +1889,8 @@
"button_title": "Exportar diagrama como PNG"
},
"svg": {
"export_to_png": "O diagrama não pôde ser exportado como PNG."
"export_to_png": "O diagrama não pôde ser exportado como PNG.",
"export_to_svg": "O diagrama não pôde ser exportado para SVG."
},
"code_theme": {
"title": "Aparência",
@@ -1838,7 +1909,11 @@
"editorfeatures": {
"title": "Recursos",
"emoji_completion_enabled": "Habilitar auto-completar de Emoji",
"note_completion_enabled": "Habilitar auto-completar de notas"
"note_completion_enabled": "Habilitar auto-completar de notas",
"emoji_completion_description": "Se ativado, emojis podem ser inseridos facilmente no texto digitando`:`, seguido do nome do emoji.",
"note_completion_description": "Se ativado, links para notas podem ser criados digitando `@` seguido do título de uma nota.",
"slash_commands_enabled": "Ativar comandos de barra",
"slash_commands_description": "Se ativado, comandos de edição como inserir quebras de linha ou títulos podem ser acionados digitando`/`."
},
"table_view": {
"new-row": "Nova linha",
@@ -1863,7 +1938,7 @@
"book_properties_config": {
"hide-weekends": "Ocultar fins de semana",
"display-week-numbers": "Exibir números de semana",
"map-style": "Estilo do mapa:",
"map-style": "Estilo do mapa",
"max-nesting-depth": "Profundidade máxima de aninhamento:",
"vector_light": "Vetor (Claro)",
"vector_dark": "Vetor (Escuro)",
@@ -1888,7 +1963,8 @@
"new-item-placeholder": "Escreva o título da nota...",
"add-column-placeholder": "Escreva o nome da coluna...",
"edit-note-title": "Clique para editar o título da nota",
"edit-column-title": "Clique para editar o título da coluna"
"edit-column-title": "Clique para editar o título da coluna",
"column-already-exists": "Esta coluna já existe no quadro."
},
"call_to_action": {
"next_theme_title": "Testar no novo tema do Trilium",
@@ -1897,14 +1973,20 @@
"background_effects_title": "Efeitos de fundo estão estáveis agora",
"background_effects_message": "Em dispositivos Windows, efeitos de fundo estão estáveis agora. Os efeitos de fundo adicionam um toque de cor à interface do usuário borrando o plano de fundo atrás dela. Esta técnica também é usada em outras aplicações como o Windows Explorer.",
"background_effects_button": "Habilitar os efeitos de fundo",
"dismiss": "Dispensar"
"dismiss": "Dispensar",
"new_layout_title": "Novo layout",
"new_layout_message": "Introduzimos um layout modernizado para o Trilium. A faixa de opções foi removida e integrada de forma contínua à interface principal, com uma nova barra de status e seções expansíveis (como atributos promovidos) assumindo funções importantes.\n\nO novo layout vem ativado por padrão e pode ser desativado temporariamente em Opções → Aparência.",
"new_layout_button": "Mais informações"
},
"settings": {
"related_settings": "Configurações relacionadas"
},
"settings_appearance": {
"related_code_blocks": "Esquema de cores para blocos de código em notas de texto",
"related_code_notes": "Esquema de cores para notas de código"
"related_code_notes": "Esquema de cores para notas de código",
"ui": "Interface do usuário",
"ui_old_layout": "Layout antigo",
"ui_new_layout": "Novo Layout"
},
"units": {
"percentage": "%"
@@ -2047,5 +2129,102 @@
},
"collections": {
"rendering_error": "Não foi possível exibir o conteúdo devido a um erro."
},
"experimental_features": {
"title": "Opções experimentais",
"disclaimer": "Essas opções são experimentais e podem causar instabilidade. Use com cautela.",
"new_layout_name": "Novo Layout",
"new_layout_description": "Experimente o novo layout para um visual mais moderno e melhor usabilidade. Pode sofrer alterações significativas nas próximas versões."
},
"read-only-info": {
"read-only-note": "Você está visualizando uma nota somente leitura.",
"auto-read-only-note": "Esta nota é exibida em modo somente leitura para carregamento mais rápido.",
"edit-note": "Editar nota"
},
"presentation_view": {
"edit-slide": "Editar este slide",
"start-presentation": "Iniciar apresentação",
"slide-overview": "Alternar a visualização geral dos slides"
},
"calendar_view": {
"delete_note": "Excluir nota…"
},
"note-color": {
"clear-color": "Limpar cor da nota",
"set-color": "Definir cor da nota",
"set-custom-color": "Definir cor personalizada da nota"
},
"popup-editor": {
"maximize": "Alternar para editor completo"
},
"server": {
"unknown_http_error_title": "Erro de comunicação com o servidor",
"unknown_http_error_content": "Código de status: {{statusCode}}\nURL: {{method}} {{url}}\nMensagem: {{message}}",
"traefik_blocks_requests": "Se você estiver usando o proxy reverso Traefik, ele introduziu uma alteração que afeta a comunicação com o servidor."
},
"tab_history_navigation_buttons": {
"go-back": "Voltar para a nota anterior",
"go-forward": "Avançar para a próxima nota"
},
"breadcrumb": {
"hoisted_badge": "Destacado",
"hoisted_badge_title": "Remover destaque",
"workspace_badge": "Espaço de trabalho",
"scroll_to_top_title": "Ir para o início da nota",
"create_new_note": "Criar nova nota filha",
"empty_hide_archived_notes": "Ocultar notas arquivadas"
},
"breadcrumb_badges": {
"read_only_explicit": "Somente leitura",
"read_only_explicit_description": "Esta nota foi definida manualmente como somente leitura.\nClique para editá-la temporariamente.",
"read_only_auto": "Auto Somente leitura",
"read_only_auto_description": "Esta nota foi definida automaticamente como somente leitura por motivos de desempenho. Esse limite automático pode ser ajustado nas configurações.\n\nClique para editá-la temporariamente.",
"read_only_temporarily_disabled": "Editável temporariamente",
"read_only_temporarily_disabled_description": "Esta nota está atualmente editável, mas normalmente é somente leitura. A nota voltará a ser somente leitura assim que você navegar para outra nota.\n\nClique para reativar o modo somente leitura.",
"shared_publicly": "Compartilhado publicamente",
"shared_locally": "Compartilhado localmente",
"shared_copy_to_clipboard": "Copiar link para a área de transferência",
"shared_open_in_browser": "Abrir link no navegador",
"shared_unshare": "Remover compartilhamento",
"clipped_note": "Recorte da web",
"clipped_note_description": "Esta nota foi originalmente obtida de {{url}}.\n\nClique para navegar até a página de origem.",
"execute_script": "Executar script",
"execute_script_description": "Esta nota é uma nota de script. Clique para executar o script.",
"execute_sql": "Executar SQL",
"execute_sql_description": "Esta nota é uma nota SQL. Clique para executar a consulta SQL."
},
"status_bar": {
"language_title": "Alterar idioma do conteúdo",
"note_info_title": "Ver informações da nota (por exemplo, datas, tamanho da nota)",
"backlinks_one": "{{count}} referência inversa",
"backlinks_many": "{{count}} referências inversas",
"backlinks_other": "{{count}} referências inversas",
"backlinks_title_one": "Ver referência inversa",
"backlinks_title_many": "Ver referências inversas",
"backlinks_title_other": "Ver referências inversas",
"attachments_one": "{{count}} anexo",
"attachments_many": "{{count}} anexos",
"attachments_other": "{{count}} anexos",
"attachments_title_one": "Visualizar anexo em uma nova aba",
"attachments_title_many": "Visualizar anexos em uma nova aba",
"attachments_title_other": "Visualizar anexos em uma nova aba",
"attributes_one": "{{count}} atributo",
"attributes_many": "{{count}} atributos",
"attributes_other": "{{count}} atributos",
"attributes_title": "Atributos próprios e atributos herdados",
"note_paths_one": "{{count}} caminho",
"note_paths_many": "{{count}} caminhos",
"note_paths_other": "{{count}} caminhos",
"note_paths_title": "Caminhos da nota",
"code_note_switcher": "Alterar modo de idioma"
},
"attributes_panel": {
"title": "Atributos da nota"
},
"right_pane": {
"empty_message": "Nada para exibir nesta nota",
"empty_button": "Ocultar o painel",
"toggle": "Alternar painel direito",
"custom_widget_go_to_source": "Ir para o código-fonte"
}
}

View File

@@ -493,7 +493,12 @@
"editable_text": {
"placeholder": "Scrieți conținutul notiței aici...",
"auto-detect-language": "Automat",
"keeps-crashing": "Componenta de editare se blochează în continuu. Încercați să reporniți Trilium. Dacă problema persistă, luați în considerare să raportați această problemă."
"keeps-crashing": "Componenta de editare se blochează în continuu. Încercați să reporniți Trilium. Dacă problema persistă, luați în considerare să raportați această problemă.",
"editor_crashed_title": "Editorul text a avut o eroare",
"editor_crashed_content": "Conținutul a fost recuperat cu succes, dar este posibil ca o parte din cele mai recente modificări ale dvs. să nu se fi salvat.",
"editor_crashed_details_button": "Mai multe detalii...",
"editor_crashed_details_intro": "Dacă întâmpinați frecvent această eroare, considerați să o raportați pe GitHub copiând informația de mai jos.",
"editor_crashed_details_title": "Informații tehnice"
},
"edited_notes": {
"deleted": "(șters)",
@@ -785,7 +790,8 @@
"info": {
"closeButton": "Închide",
"modalTitle": "Mesaj informativ",
"okButton": "OK"
"okButton": "OK",
"copy_to_clipboard": "Copiază în clipboard"
},
"inherited_attribute_list": {
"no_inherited_attributes": "Niciun atribut moștenit.",
@@ -867,12 +873,14 @@
"print_note": "Imprimare notiță",
"re_render_note": "Reinterpretare notiță",
"save_revision": "Salvează o nouă revizie",
"advanced": "Advansat",
"search_in_note": "Caută în notiță",
"convert_into_attachment_failed": "Nu s-a putut converti notița „{{title}}”.",
"convert_into_attachment_successful": "Notița „{{title}}” a fost convertită în atașament.",
"convert_into_attachment_prompt": "Doriți convertirea notiței „{{title}}” într-un atașament al notiței părinte?",
"print_pdf": "Exportare ca PDF...",
"open_note_on_server": "Deschide notița pe server"
"open_note_on_server": "Deschide notița pe server",
"view_revisions": "Revizii ale notițelor..."
},
"note_erasure_timeout": {
"deleted_notes_erased": "Notițele șterse au fost eliminate permanent.",
@@ -1095,7 +1103,6 @@
"mime": "MIME: ",
"no_revisions": "Nu există încă nicio revizie pentru această notiță...",
"note_revisions": "Revizii ale notiței",
"preview": "Previzualizare:",
"preview_not_available": "Nu este disponibilă o previzualizare pentru acest tip de notiță.",
"restore_button": "Restaurează",
"revision_deleted": "Revizia notiței a fost ștearsă.",
@@ -1407,7 +1414,7 @@
"hoist-note": "Focalizează notița",
"unhoist-note": "Defocalizează notița",
"converted-to-attachments": "{{count}} notițe au fost convertite în atașamente.",
"convert-to-attachment-confirm": "Doriți convertirea notițelor selectate în atașamente ale notiței părinte?",
"convert-to-attachment-confirm": "Doriți convertirea notițelor selectate în atașamente ale notiței părinte? Această operațiune se aplică doar notițelor de tip imagine, celelalte vor fi ignorate.",
"open-in-popup": "Editare rapidă",
"archive": "Arhivează",
"unarchive": "Dezarhivează"
@@ -1475,7 +1482,6 @@
},
"note_icon": {
"change_note_icon": "Schimbă iconița notiței",
"category": "Categorie:",
"reset-default": "Resetează la iconița implicită",
"search": "Căutare:"
},
@@ -1526,7 +1532,9 @@
"printing_pdf": "Exportare ca PDF în curs..."
},
"note_title": {
"placeholder": "introduceți titlul notiței aici..."
"placeholder": "introduceți titlul notiței aici...",
"created_on": "Creată la <Value />",
"last_modified": "Modificată la <Value />"
},
"revisions_snapshot_limit": {
"erase_excess_revision_snapshots": "Șterge acum reviziile excesive",
@@ -1758,7 +1766,8 @@
},
"note_language": {
"configure-languages": "Configurează limbile...",
"not_set": "Nedefinită"
"not_set": "Nicio limbă setată",
"help-on-languages": "Informații despre limba conținutului..."
},
"png_export_button": {
"button_title": "Exportă diagrama ca PNG"
@@ -1954,7 +1963,8 @@
"oauth_user_not_logged_in": "Neautentificat!"
},
"svg": {
"export_to_png": "Diagrama nu a putut fi exportată în PNG."
"export_to_png": "Diagrama nu a putut fi exportată în PNG.",
"export_to_svg": "Diagrama nu a putut fi exportată în SVG."
},
"code_theme": {
"title": "Afișare",
@@ -2106,5 +2116,30 @@
},
"popup-editor": {
"maximize": "Comută la editorul principal"
},
"experimental_features": {
"title": "Opțiuni experimentale",
"disclaimer": "Aceste opțiuni sunt experimentale și pot cauza instabilitate. Folosiți cu prudență.",
"new_layout_name": "Aspect nou",
"new_layout_description": "Încercați noul aspect pentru un design mai modern și mai ușor de utilizat. Poate surveni modificări semnificative în următoarele release-uri."
},
"server": {
"unknown_http_error_title": "Eroare de comunicare cu server-ul",
"unknown_http_error_content": "Cod: {{statusCode}}\nURL: {{method}} {{url}}\nMesaj: {{message}}",
"traefik_blocks_requests": "Dacă utilizați reverse proxy-ul Traefik, acesta a introdus o schimbare majoră ce afectează comunicarea cu server-ul."
},
"tab_history_navigation_buttons": {
"go-back": "Înapoi la notița anterioară",
"go-forward": "Înainte către notița următoare"
},
"breadcrumb_badges": {
"read_only_explicit": "Mod citire",
"read_only_explicit_description": "Această notiță a fost setată explicit să fie doar în citire.\nClick pentru a o edita temporar.",
"read_only_auto": "Mod citire auto",
"read_only_auto_description": "Această notița a fost setată automată să fie în mod doar de citire din motive de performanță. Această limită automată este ajustabilă din setări.\n\nClick pentru a o edita temporar.",
"read_only_temporarily_disabled": "Editabilă temporar",
"read_only_temporarily_disabled_description": "Această notiță se poate modifica, deși în mod normal ea este doar în citire. Notița va reveni la modul doar în citire imediat ce navigați către altă notiță.\n\nClick pentru a re-activa modul doar în citire.",
"shared_publicly": "Partajată public",
"shared_locally": "Partajată local"
}
}

View File

@@ -21,8 +21,17 @@
},
"bundle-error": {
"title": "Не удалось загрузить пользовательский скрипт",
"message": "Скрипт из заметки с идентификатором \"{{id}}\" и названием \"{{title}}\" не может быть выполнен по следующим причинам:\n\n{{message}}"
}
"message": "Скрипт не может быть выполнен. Причина:\n\n{{message}}"
},
"widget-list-error": {
"title": "Не удалось получить список виджетов с сервера"
},
"widget-render-error": {
"title": "Не удалось отобразить пользовательский React виджет"
},
"widget-missing-parent": "В пользовательском виджете не определено обязательное свойство '{{property}}'.\n\nЕсли этот скрипт предназначен для запуска без элемента пользовательского интерфейса, используйте '#run=frontendStartup'.",
"open-script-note": "Открыть заметку со скриптом",
"scripting-error": "Ошибка пользовательского скрипта: {{title}}"
},
"add_link": {
"add_link": "Добавить ссылку",
@@ -39,7 +48,10 @@
"edit_branch_prefix": "Редактировать префикс ветки",
"prefix": "Префикс: ",
"branch_prefix_saved": "Префикс ветки сохранен.",
"help_on_tree_prefix": "Помощь по префиксу дерева"
"help_on_tree_prefix": "Помощь по префиксу дерева",
"affected_branches": "Затронутые ветки ({{count}}):",
"branch_prefix_saved_multiple": "Префикс сохранен для {{count}} ветвей.",
"edit_branch_prefix_multiple": "Изменить префикс для {{count}} ветвей"
},
"bulk_actions": {
"available_actions": "Доступные действия",
@@ -236,7 +248,8 @@
"export_status": "Статус экспорта",
"export_in_progress": "Экспорт: {{progressCount}}",
"export_finished_successfully": "Экспорт завершился успешно.",
"format_pdf": "PDF - для печати или обмена."
"format_pdf": "PDF - для печати или обмена.",
"share-format": "HTML для веб-публикаций — использует ту же тему оформления, что и общие заметки, но может быть опубликован как статический веб-сайт."
},
"help": {
"noteNavigation": "Навигация по заметке",
@@ -290,7 +303,8 @@
"blockQuote": "начните строку с <code>></code>, а затем пробела для блока цитаты",
"quickSearch": "сфокусироваться на поле ввода быстрого поиска",
"editNoteTitle": "в области дерева переключится с области дерева на заголовок заметки. Сочетание клавиш Enter из области заголовка заметки переключит фокус на текстовый редактор. <kbd>Ctrl+.</kbd> переключит обратно с редактора на область дерева.",
"title": "Справка"
"title": "Справка",
"editShortcuts": "Редактировать сочетания клавиш"
},
"modal": {
"close": "Закрыть",
@@ -373,7 +387,6 @@
"revision_deleted": "Версия заметки была удалена.",
"download_button": "Скачать",
"file_size": "Размер файла:",
"preview": "Предпросмотр:",
"preview_not_available": "Предпосмотр недоступен для заметки этого типа.",
"mime": "MIME: ",
"settings": "Настройка версионирования заметок",
@@ -472,13 +485,13 @@
"app_css": "отмечает заметки CSS, которые загружаются в приложение Trilium и, таким образом, могут использоваться для изменения внешнего вида Trilium.",
"app_theme_base": "установите значение \"next\", \"next-light\" или \"next-dark\", чтобы использовать соответствующую тему TriliumNext (автоматическую, светлую или темную) в качестве основы для пользовательской темы вместо устаревшей.",
"exclude_from_note_map": "Заметки с этой меткой будут скрыты на карте заметок",
"workspace": "отмечает эту заметку как рабочее пространство, для удобного закрепления",
"workspace_icon_class": "определяет CSS-класс значка поля, который будет использоваться во вкладке при закреплении этой заметки",
"workspace_tab_background_color": "Цвет CSS, используемый во вкладке заметки при ее закреплении",
"workspace_template": "Эта заметка появится в списке доступных шаблонов при создании новой заметки, но только если она будет перемещена в рабочую область, содержащую этот шаблон",
"workspace_search_home": "новые заметки поиска будут созданы как дочерние записи этой заметки при перемещении их к какому-либо предку этой заметки рабочей области",
"workspace": "отмечает эту заметку как рабочее пространство, для удобной установки фокуса",
"workspace_icon_class": "определяет CSS-класс значка поля, который будет использоваться во вкладке при установке фокуса на этой заметке",
"workspace_tab_background_color": "Цвет CSS, используемый во вкладке заметки при установке на нее фокуса",
"workspace_template": "Эта заметка появится в списке доступных шаблонов при создании новой заметки, но только если будет установлен фокус на рабочую область с этим шаблоном",
"workspace_search_home": "новые заметки поиска будут созданы как дочерние записи этой заметки, когда установлен фокус на какую-либо родительскую заметку этого рабочего пространство",
"workspace_calendar_root": "Определяет корень календаря для каждого рабочего пространства",
"hide_highlight_widget": "Скрыть виджет «Выделенное»",
"hide_highlight_widget": "Скрыть виджет «Акценты»",
"is_owned_by_note": "принадлежит заметке",
"and_more": "... и ещё {{count}}.",
"app_theme": "отмечает заметки CSS, которые являются полноценными темами Trilium и, таким образом, доступны в опциях Trilium.",
@@ -503,7 +516,7 @@
"custom_resource_provider": "см. <a href=\"javascript:\" data-help-page=\"custom-request-handler.html\">Пользовательский обработчик запросов</a>",
"widget": "отмечает эту заметку как пользовательский виджет, который будет добавлен в дерево компонентов Trilium",
"search_home": "новые заметки поиска будут созданы как дочерние записи этой заметки",
"workspace_inbox": "расположение в папке «Входящие» по умолчанию для новых заметок при перемещении их в некую родственную папку этой заметки в рабочей области",
"workspace_inbox": "расположение в папке «Входящие» по умолчанию для новых заметок, когда установлен фокус на какую-либо родительскую заметку этого рабочего пространство",
"sql_console_home": "расположение заметок консоли SQL по умолчанию",
"css_class": "значение этой метки затем добавляется как CSS-класс к узлу, представляющему данную заметку в дереве. Это может быть полезно для изменения внешнего вида заметки. Может использоваться в шаблонах заметок.",
"bookmark_folder": "заметка с этой меткой появится в закладках как папка (с предоставлением доступа к ее дочерним элементам)",
@@ -519,7 +532,7 @@
"share_index": "заметка с этой меткой будет содержать список всех корневых узлов общедоступных заметок",
"toc": "<code>#toc</code> или <code>#toc=show</code> принудительно отобразят оглавление, <code>#toc=hide</code> — скроют его. Если метка отсутствует, применяется глобальная настройка",
"color": "определяет цвет заметки в дереве заметок, ссылках и т. д. Используйте любое допустимое значение цвета CSS, например «red» или #a13d5f",
"keep_current_hoisting": "Открытие этой ссылки не изменит закрепление, даже если заметка не отображается в текущем закрепленном поддереве.",
"keep_current_hoisting": "Открытие этой ссылки не изменит фокус, даже если заметка не отображается в текущем закрепленном поддереве.",
"execute_description": "Более подробное описание текущей заметки типа \"Код\", отображаемое вместе с кнопкой \"Выполнить\"",
"run_on_note_creation": "выполняется при создании заметки на сервере. Используйте это отношение, если хотите запустить скрипт для всех заметок, созданных в определённом поддереве. В этом случае создайте его в корневой заметке поддерева и сделайте его наследуемым. Новая заметка, созданная в поддереве (любой глубины), запустит скрипт.",
"run_on_child_note_creation": "выполняется, когда создается новая заметка под заметкой, в которой определено это отношение",
@@ -567,7 +580,8 @@
"edit-column-title": "Нажмите, чтобы изменить заголовок столбца",
"edit-note-title": "Нажмите, чтобы изменить название заметки",
"add-column-placeholder": "Введите имя столбца...",
"new-item-placeholder": "Введите название заметки..."
"new-item-placeholder": "Введите название заметки...",
"column-already-exists": "Такая колонка уже добавлена на доску."
},
"table_context_menu": {
"delete_row": "Удалить строку"
@@ -576,7 +590,7 @@
"vector_dark": "Vector (Темная)",
"vector_light": "Vector (Светлая)",
"max-nesting-depth": "Максимальная глубина вложенности:",
"map-style": "Стиль карты:",
"map-style": "Стиль карты",
"display-week-numbers": "Отображать номера недель",
"hide-weekends": "Скрыть выходные",
"raster": "Растр",
@@ -606,7 +620,8 @@
"title": "Внешний вид"
},
"svg": {
"export_to_png": "Диаграмму не может быть экспортирована в PNG."
"export_to_png": "Диаграмму не может быть экспортирована в PNG.",
"export_to_svg": "Не удалось экспортировать диаграмму в SVG."
},
"png_export_button": {
"button_title": "Экспортировать диаграмму как PNG"
@@ -621,7 +636,8 @@
},
"note_language": {
"configure-languages": "Настроить языки...",
"not_set": "Не установлен"
"not_set": "Язык не установлен",
"help-on-languages": "Помощь по языкам содержимого..."
},
"time_selector": {
"invalid_input": "Введенное значение времени не является допустимым числом.",
@@ -679,7 +695,8 @@
"open_note_in_popup": "Быстрое редактирование",
"open_note_in_new_window": "Открыть заметку в новом окне",
"open_note_in_new_tab": "Открыть заметку в новой вкладке",
"open_note_in_new_split": "Открыть заметку в новой панели"
"open_note_in_new_split": "Открыть заметку в новой панели",
"open_note_in_other_split": "Открыть заметку в другой панели"
},
"image_context_menu": {
"copy_image_to_clipboard": "Копировать изображение в буфер обмена",
@@ -692,7 +709,8 @@
"copy": "Скопировать",
"cut": "Вырезать",
"search_online": "Поиск \"{{term}}\" в {{searchEngine}}",
"add-term-to-dictionary": "Добавить \"{{term}}\" в словарь"
"add-term-to-dictionary": "Добавить \"{{term}}\" в словарь",
"search_in_trilium": "Искать \"{{term}}\" в Trilium"
},
"editing": {
"editor_type": {
@@ -740,23 +758,25 @@
},
"toc": {
"table_of_contents": "Оглавление",
"options": "Параметры"
"options": "Параметры",
"no_headings": "Заголовки не найдены."
},
"note_tree": {
"hide-archived-notes": "Скрыть архивные заметки",
"automatically-collapse-notes": "Автоматически сворачивать заметки",
"tree-settings-title": "Настройки дерева",
"unhoist": "Открепить",
"unhoist": "Убрать фокус",
"scroll-active-title": "Прокрутить к активной заметке",
"collapse-title": "Свернуть дерево",
"hoist-this-note-workspace": "Закрепить заметку (рабочая область)",
"hoist-this-note-workspace": "Фокус на заметке (рабочая область)",
"auto-collapsing-notes-after-inactivity": "Автоматическое сворачивание заметок после бездействия...",
"create-child-note": "Создать дочернюю заметку",
"save-changes": "Сохранить и применить изменения",
"saved-search-note-refreshed": "Сохраненная поисковая заметка обновлена.",
"refresh-saved-search-results": "Обновить сохраненные результаты поиска",
"automatically-collapse-notes-title": "Заметки будут свернуты после определенного периода бездействия, чтобы навести порядок в дереве.",
"toggle-sidebar": "Переключить боковую панель"
"toggle-sidebar": "Переключить боковую панель",
"dropping-not-allowed": "Перетаскивание заметок в эту область не разрешено."
},
"quick-search": {
"no-results": "Результаты не найдены",
@@ -793,7 +813,7 @@
"text": "Текст",
"launcher": "Лаунчер",
"doc": "Документация",
"relation-map": "Карта отношений",
"relation-map": "Карта связей",
"note-map": "Карта заметок",
"render-note": "Рендеринг заметки",
"web-view": "Веб-страница",
@@ -812,8 +832,8 @@
"export": "Экспорт",
"open-in-a-new-tab": "Открыть в новой вкладке",
"open-in-a-new-split": "Открыть в новой панели",
"unhoist-note": "Открепить заметку",
"hoist-note": "Закрепить заметку",
"unhoist-note": "Снять фокус",
"hoist-note": "Фокус на заметке",
"protect-subtree": "Защитить поддерево",
"unprotect-subtree": "Снять защиту с поддерева",
"copy-clone": "Скопировать / Склонировать",
@@ -833,7 +853,7 @@
"apply-bulk-actions": "Применить массовые действия",
"recent-changes-in-subtree": "Последние изменения в поддереве",
"copy-note-path-to-clipboard": "Копировать путь к заметке в буфер обмена",
"convert-to-attachment-confirm": "Вы уверены, что хотите преобразовать выбранные заметки во вложения их родительских заметок?",
"convert-to-attachment-confirm": "Вы уверены, что хотите преобразовать выбранные заметки во вложения их родительских заметок? Эта операция применяется только к заметкам в виде изображений; другие заметки будут пропущены.",
"converted-to-attachments": "{{count}} заметок были преобразованы во вложения.",
"archive": "Архивировать",
"unarchive": "Разархивировать"
@@ -841,7 +861,8 @@
"info": {
"closeButton": "Закрыть",
"okButton": "ОК",
"modalTitle": "Информация"
"modalTitle": "Информация",
"copy_to_clipboard": "Скопировать в буфер обмена"
},
"jump_to_note": {
"search_placeholder": "Найдите заметку по ее названию или введите > для команд...",
@@ -978,19 +999,28 @@
"show_shared_notes_subtree": "Поддерево общедоступных заметок",
"switch_to_mobile_version": "Перейти на мобильную версию",
"switch_to_desktop_version": "Переключиться на версию для ПК",
"new-version-available": "Доступно обновление"
"new-version-available": "Доступно обновление",
"download-update": "Обновить до {{latestVersion}}"
},
"zpetne_odkazy": {
"relation": "отношение",
"backlink_one": "{{count}} ссылки",
"backlink_few": "",
"backlink_many": "{{count}} ссылок"
"backlink_one": "{{count}} обратная ссылка",
"backlink_few": "{{count}} обратные ссылки",
"backlink_many": "{{count}} обратных ссылок"
},
"note_icon": {
"category": "Категория:",
"search": "Поиск:",
"change_note_icon": "Изменить иконку заметки",
"reset-default": "Сбросить к значку по умолчанию"
"reset-default": "Сбросить к значку по умолчанию",
"no_results": "Иконки не найдены.",
"icon_tooltip": "{{name}}\nНабор иконок: {{iconPack}}",
"filter-default": "Иконки по-умолчанию",
"filter-none": "Все иконки",
"filter": "Фильтр",
"search_placeholder_filtered": "Поиск {{number}} иконок в {{name}}",
"search_placeholder_one": "Поиск {{number}} иконки среди {{count}} наборов",
"search_placeholder_few": "Поиск {{number}} иконок среди {{count}} наборов",
"search_placeholder_many": "Поиск {{number}} иконок среди {{count}} наборов"
},
"basic_properties": {
"editable": "Изменяемое",
@@ -1012,7 +1042,12 @@
"geo-map": "Карта",
"invalid_view_type": "Недопустимый тип представления '{{type}}'",
"collapse_all_notes": "Свернуть все заметки",
"include_archived_notes": "Показать заархивированные заметки"
"include_archived_notes": "Показать заархивированные заметки",
"presentation": "Презентация",
"expand_all_levels": "Развернуть все вложенные уровни",
"expand_nth_level": "Развернуть уровни: {{depth}} шт.",
"expand_first_level": "Развернуть прямые дочерние уровни",
"expand_tooltip": "Разщвернуть дочерние элементы этой коллекции (на один уровень вложенности). Для получения дополнительных параметров нажмите стрелку справа."
},
"edited_notes": {
"deleted": "(удалено)",
@@ -1052,7 +1087,9 @@
"title": "Информация",
"calculate": "подсчитать",
"note_size_info": "Размер заметки позволяет приблизительно оценить требования к объёму хранилища для данной заметки. Он учитывает её содержание и содержание её сохраненных версий.",
"subtree_size": "(размер поддерева: {{size}} в {{count}} заметках)"
"subtree_size": "(размер поддерева: {{size}} в {{count}} заметках)",
"mime": "MIME тип",
"show_similar_notes": "Похожие заметки"
},
"note_paths": {
"search": "Поиск",
@@ -1060,7 +1097,7 @@
"clone_button": "Клонировать заметку в новое место...",
"intro_placed": "Эта заметка размещена по следующим путям:",
"intro_not_placed": "Эта заметка еще не помещена в дерево заметок.",
"outside_hoisted": "Этот путь находится за пределами закрепленной заметки, и вам придется снять закрепление.",
"outside_hoisted": "Этот путь находится за пределами сфокусированной заметки, и вам придется снять фокус.",
"archived": "Архивировано"
},
"note_properties": {
@@ -1105,7 +1142,8 @@
"save_to_note": "Сохранить в заметку",
"search_note_saved": "Заметка с настройкой поиска сохранена в {{- notePathTitle}}",
"unknown_search_option": "Неизвестный параметр поиска {{searchOptionName}}",
"actions_executed": "Действия выполнены."
"actions_executed": "Действия выполнены.",
"view_options": "Просмотреть опции:"
},
"ancestor": {
"depth_label": "глубина",
@@ -1201,7 +1239,8 @@
"max_width_unit": "пикселей",
"title": "Ширина контентной области",
"default_description": "Trilium по умолчанию ограничивает максимальную ширину контента, чтобы улучшить читаемость на широких экранах.",
"max_width_label": "Максимальная ширина контентной области"
"max_width_label": "Максимальная ширина контентной области",
"centerContent": "Размещать контент по центру"
},
"native_title_bar": {
"enabled": "включено",
@@ -1409,7 +1448,13 @@
"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": "Формат даты и числа"
"formatting-locale": "Формат даты и числа",
"formatting-locale-auto": "Выбирать на основе языка приложения",
"saturday": "Суббота",
"friday": "Пятница",
"thursday": "Четверг",
"wednesday": "Среда",
"tuesday": "Вторник"
},
"backup": {
"path": "Путь",
@@ -1534,7 +1579,13 @@
},
"highlights_list_2": {
"options": "Параметры",
"title": "Список выделенного"
"title": "Акценты",
"modal_title": "Настроить акценты",
"menu_configure": "Настроить акценты...",
"no_highlights": "Акценты в тексте не найдены.",
"title_with_count_one": "{{count}} акцент",
"title_with_count_few": "{{count}} акцента",
"title_with_count_many": "{{count}} акцентов"
},
"include_note": {
"dialog_title": "Вставить заметку",
@@ -1609,7 +1660,14 @@
"convert_into_attachment_failed": "Не удалось преобразовать заметку '{{title}}'.",
"open_note_externally_title": "Файл будет открыт во внешнем приложении и отслеживается на наличие изменений. После этого вы сможете загрузить изменённую версию обратно в Trilium.",
"open_note_externally": "Открыть заметку вне приложения",
"open_note_custom": "Открыть заметку как..."
"open_note_custom": "Открыть заметку как...",
"export_as_image_svg": "SVG (вектор)",
"export_as_image_png": "PNG (растр)",
"export_as_image": "Экспорт изображения",
"open_note_on_server": "Открыть заметку на сервере",
"view_revisions": "История изменений...",
"note_map": "Карта заметок",
"advanced": "Дополнительно"
},
"revisions_button": {
"note_revisions": "Версии заметки"
@@ -1634,7 +1692,7 @@
"zoom_in_title": "Увеличить масштаб",
"zoom_out_title": "Уменьшить масштаб",
"reset_pan_zoom_title": "Сбросить панорамирование и масштабирование",
"create_child_note_title": "Создать новую дочернюю заметку и добавить ее в эту карту отношений"
"create_child_note_title": "Создать новую дочернюю заметку и добавить ее в эту карту связей"
},
"code_auto_read_only_size": {
"unit": "символов",
@@ -1644,7 +1702,8 @@
},
"inherited_attribute_list": {
"title": "Унаследованные атрибуты",
"no_inherited_attributes": "Нет унаследованных атрибутов."
"no_inherited_attributes": "Нет унаследованных атрибутов.",
"none": "нет"
},
"note_map": {
"title": "Карта заметок",
@@ -1689,7 +1748,7 @@
"remove_relation": "Удалить отношение",
"default_new_note_title": "новая заметка",
"open_in_new_tab": "Открыть в новой вкладке",
"confirm_remove_relation": "Вы уверены, что хотите удалить отношение?",
"confirm_remove_relation": "Вы уверены, что хотите удалить связь?",
"enter_new_title": "Введите новое название заметки:",
"note_not_found": "Заметка {{noteId}} не найдена!",
"cannot_match_transform": "Невозможно сопоставить преобразование: {{transform}}",
@@ -1697,7 +1756,7 @@
"click_on_canvas_to_place_new_note": "Щелкните по холсту, чтобы разместить новую заметку",
"note_already_in_diagram": "Заметка \"{{title}}\" уже есть на диаграмме.",
"connection_exists": "Связь '{{name}}' между этими заметками уже существует.",
"specify_new_relation_name": "Укажите новое имя отношения (допустимые символы: буквы, цифры, двоеточие и подчеркивание):",
"specify_new_relation_name": "Укажите новое имя связи (допустимые символы: буквы, цифры, двоеточие и подчеркивание):",
"start_dragging_relations": "Начните перетягивать отношения отсюда на другую заметку."
},
"vacuum_database": {
@@ -1720,15 +1779,15 @@
"enable_tray": "Включить отображение иконки в системном трее (чтобы изменения вступили в силу, необходимо перезапустить Trilium)"
},
"highlights_list": {
"title": "Список выделенного",
"title": "Акценты",
"bold": "Жирный текст",
"italic": "Наклонный текст",
"underline": "Подчеркнутый текст",
"color": "Цветной текст",
"description": "Вы можете настроить список выделенного, отображаемый на правой панели:",
"description": "Вы можете настроить список акцентов, отображаемый на правой панели:",
"bg_color": "Текст с заливкой фона",
"visibility_title": "Видимость списка выделений",
"visibility_description": "Вы можете скрыть виджет списка выделенного, добавив атрибут #hideHighlightWidget к заметке.",
"visibility_title": "Видимость списка акцентов",
"visibility_description": "Вы можете скрыть виджет списка акцентов, добавив атрибут #hideHighlightWidget к заметке.",
"shortcut_info": "Вы можете настроить сочетание клавиш для быстрого переключения правой панели (включая список выделенного) в меню Параметры -> Сочетания клавиш (название \"toggleRightPane\")."
},
"custom_date_time_format": {
@@ -1773,7 +1832,7 @@
"edit_this_note": "Редактировать заметку"
},
"show_highlights_list_widget_button": {
"show_highlights_list": "Показать список выделенного"
"show_highlights_list": "Показать список акцентов"
},
"zen_mode": {
"button_exit": "Покинуть режим \"дзен\""
@@ -1785,7 +1844,8 @@
"error_unrecognized_command": "Нераспознанная команда {{command}}",
"error_cannot_get_branch_id": "Невозможно получить branchId для notePath '{{notePath}}'",
"delete_this_note": "Удалить эту заметку",
"insert_child_note": "Вставить дочернюю заметку"
"insert_child_note": "Вставить дочернюю заметку",
"note_revisions": "История изменений"
},
"svg_export_button": {
"button_title": "Экспортировать диаграмму как SVG"
@@ -1842,7 +1902,10 @@
"next_theme_button": "Попробовать новую тему",
"background_effects_message": "На устройствах Windows фоновые эффекты теперь полностью стабильны. Они добавляют цвет в пользовательский интерфейс, размывая фон за ним. Этот приём также используется в других приложениях, например, в проводнике Windows.",
"background_effects_title": "Фоновые эффекты теперь стабильны",
"next_theme_title": "Попробуйте новую тему Trilium"
"next_theme_title": "Попробуйте новую тему Trilium",
"new_layout_button": "Подробнее",
"new_layout_message": "Мы обновили интерфейс Trilium. Старая лента инструментов была удалена и органично интегрирована в основной интерфейс, а ключевые функции теперь выполняет новая строка состояния и разворачиваемые разделы.\n\nНовый интерфейс включен по умолчанию и может быть временно отключен через «Параметры» → «Внешний вид».",
"new_layout_title": "Новый дизайн"
},
"zoom_factor": {
"description": "Масштабированием также можно управлять с помощью сочетаний клавиш CTRL+- и CTRL+=.",
@@ -1852,7 +1915,10 @@
"show_toc": "Показать оглавление"
},
"code_mime_types": {
"title": "Доступные типы в выпадающем списке"
"title": "Доступные типы в выпадающем списке",
"tooltip_syntax_highlighting": "Подсветка синтаксиса",
"tooltip_code_note_syntax": "Заметки с кодом",
"tooltip_code_block_syntax": "Блоки кода в текстовых заметках"
},
"search_result": {
"no_notes_found": "По заданным параметрам поиска заметки не найдены.",
@@ -1967,7 +2033,7 @@
"lost-websocket-connection-message": "Проверьте конфигурацию обратного прокси (например, nginx или Apache), чтобы убедиться, что соединения WebSocket должным образом разрешены и не заблокированы."
},
"attachment_detail_2": {
"role_and_size": "Роль: {{role}}, Размер: {{size}}",
"role_and_size": "Роль: {{role}}, размер: {{size}}, MIME: {{- mimeType}}",
"unrecognized_role": "Нераспознанная роль вложения '{{role}}'.",
"link_copied": "Ссылка на вложение скопирована в буфер обмена.",
"will_be_deleted_soon": "Это вложение скоро будет автоматически удалено",
@@ -1975,7 +2041,15 @@
"deletion_reason": ", поскольку вложение не связано с содержимым заметки. Чтобы предотвратить удаление, добавьте ссылку на вложение обратно в содержимое или преобразуйте вложение в заметку."
},
"note_title": {
"placeholder": "введите здесь название заметки..."
"placeholder": "введите здесь название заметки...",
"edited_notes": "Измененные в этот день заметки",
"note_type_switcher_collection": "Коллекция",
"note_type_switcher_templates": "Шаблон",
"note_type_switcher_others": "Другой тип заметки",
"note_type_switcher_label": "Переключить с {{type}} на:",
"last_modified": "Изменена <Value />",
"created_on": "Создана в <Value />",
"promoted_attributes": "Продвигаемые атрибуты"
},
"units": {
"percentage": "%"
@@ -2014,7 +2088,10 @@
},
"settings_appearance": {
"related_code_blocks": "Цветовая схема для блоков кода в текстовых заметках",
"related_code_notes": "Цветовая схема для заметок типа \"Код\""
"related_code_notes": "Цветовая схема для заметок типа \"Код\"",
"ui_new_layout": "Новый дизайн",
"ui_old_layout": "Старый дизайн",
"ui": "Пользовательский интерфейс"
},
"sql_result": {
"no_rows": "По этому запросу не возвращено ни одной строки"
@@ -2024,17 +2101,31 @@
},
"editable_text": {
"placeholder": "Введите содержимое для заметки...",
"auto-detect-language": "Определен автоматически"
"auto-detect-language": "Определен автоматически",
"keeps-crashing": "Компонент редактирования вылетает. Пожалуйста, попробуйте перезапустить Trilium. Если проблема сохраняется, пожалуйста, создайте отчет об ошибке.",
"editor_crashed_details_title": "Техническая информация",
"editor_crashed_details_intro": "Если эта ошибка возникает несколько раз, пожалуйста, сообщите о ней на GitHub, сопроводив информаций ниже.",
"editor_crashed_content": "Ваши данные были успешно восстановлены, но некоторые из последних изменений могли не быть сохранены.",
"editor_crashed_details_button": "Подробнее...",
"editor_crashed_title": "Возникла ошибка в текстовом редакторе"
},
"hoisted_note": {
"confirm_unhoisting": "Запрошенная заметка «{{requestedNote}}» находится за пределами поддерева закрепленной заметки \"{{hoistedNote}}\", и для доступа к ней необходимо снять закрепление. Открепить заметку?"
"confirm_unhoisting": "Запрошенная заметка «{{requestedNote}}» находится за пределами поддерева закрепленной заметки \"{{hoistedNote}}\", и для доступа к ней необходимо снять фокус. Снять фокус с заметки?"
},
"frontend_script_api": {
"sync_warning": "Вы передаете синхронную функцию в `api.runAsyncOnBackendWithManualTransactionHandling()`, \\nхотя вместо этого вам, скорее всего, следует использовать `api.runOnBackend()`.",
"async_warning": "Вы передаете асинхронную функцию в `api.runOnBackend()`, которая, скорее всего, не будет работать так, как вы предполагали.\\nЛибо сделайте функцию синхронной (удалив ключевое слово `async`), либо используйте `api.runAsyncOnBackendWithManualTransactionHandling()`."
},
"note_detail": {
"could_not_find_typewidget": "Не удалось найти typeWidget для типа '{{type}}'"
"could_not_find_typewidget": "Не удалось найти typeWidget для типа '{{type}}'",
"printing_pdf": "Выполняется экспорт PDF...",
"printing": "Выполняется печать...",
"print_report_title": "Отчет по печати",
"print_report_collection_content_one": "{{count}} заметка в коллекции не удалось распечатать, поскольку она не поддерживается или защищена.",
"print_report_collection_content_few": "{{count}} заметки в коллекции не удалось распечатать, поскольку они не поддерживаются или защищены.",
"print_report_collection_content_many": "{{count}} заметок в коллекции не удалось распечатать, поскольку они не поддерживаются или защищены.",
"print_report_collection_details_button": "Подробнее",
"print_report_collection_details_ignored_notes": "Пропущенные заметки"
},
"book": {
"no_children_help": "В этой коллекции нет дочерних заметок, поэтому отображать нечего. Подробности см. в <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a>.",
@@ -2055,5 +2146,102 @@
"pagination": {
"total_notes": "{{count}} заметок",
"page_title": "Страница {{startIndex}} - {{endIndex}}"
},
"status_bar": {
"attributes_one": "{{count}} атрибут",
"attributes_few": "{{count}} атрибута",
"attributes_many": "{{count}} атрибутов",
"note_info_title": "Просмотр информации о заметке, (даты, размер)",
"language_title": "Изменить язык содержимого",
"code_note_switcher": "Изменить режим языка",
"note_paths_title": "Расположения заметки",
"note_paths_one": "{{count}} место",
"note_paths_few": "{{count}} места",
"note_paths_many": "{{count}} мест",
"attributes_title": "Собственные и унаследованные атрибуты",
"attachments_title_one": "Открыть вложение в новой вкладке",
"attachments_title_few": "Открыть вложения в новой вкладке",
"attachments_title_many": "Открыть вложения в новой вкладке",
"attachments_one": "{{count}} вложение",
"attachments_few": "{{count}} вложения",
"attachments_many": "{{count}} вложений",
"backlinks_one": "{{count}} обратная ссылка",
"backlinks_few": "{{count}} обратные ссылки",
"backlinks_many": "{{count}} обратных ссылок",
"backlinks_title_one": "Обратная ссылка",
"backlinks_title_few": "Обратные ссылки",
"backlinks_title_many": "Обратные ссылки"
},
"breadcrumb_badges": {
"execute_sql_description": "Эта заметка - SQL-запрос. Нажмите, чтобы выполнить его.",
"execute_sql": "Выполнить SQL",
"execute_script_description": "Это заметка содержит скрипт. Нажмите, чтобы выполнить его.",
"execute_script": "Выполнить скрипт",
"clipped_note_description": "Эта заметка первоначально взята с сайта {{url}}.\n\nНажмите, чтобы перейти на исходную веб-страницу.",
"shared_publicly": "Доступно публично",
"shared_locally": "Доступно локально",
"clipped_note": "Web фрагмент",
"shared_unshare": "Убрать публичный доступ",
"shared_open_in_browser": "Открыть ссылку в браузере",
"shared_copy_to_clipboard": "Скопировать ссылку",
"read_only_temporarily_disabled_description": "В данный момент эта заметка доступна для редактирования, но обычно она находится только в режиме чтения. Заметка снова станет доступна только для чтения, как только вы перейдете к другой заметке.\n\nНажмите, чтобы снова включить режим только для чтения.",
"read_only_temporarily_disabled": "Временное редактирование",
"read_only_auto_description": "Эта заметка была автоматически переведена в режим только для чтения по соображениям производительности. Это автоматическое ограничение можно изменить в настройках.\n\nНажмите, чтобы временно отредактировать её.",
"read_only_auto": "Автоматический режим \"только для чтения\"",
"read_only_explicit_description": "Эта заметка была вручную установлена в режим «только для чтения».\nНажмите, чтобы временно отредактировать её.",
"read_only_explicit": "Только для чтения"
},
"breadcrumb": {
"hoisted_badge_title": "Снять фокус",
"hoisted_badge": "Фокус",
"empty_hide_archived_notes": "Скрыть заметки в архиве",
"create_new_note": "Новая дочерняя заметка",
"scroll_to_top_title": "К началу заметки",
"workspace_badge": "Рабочее пространство"
},
"tab_history_navigation_buttons": {
"go-forward": "Перейти к следующей заметке",
"go-back": "Перейти к предыдущей заметке"
},
"server": {
"traefik_blocks_requests": "Если вы используете обратный прокси-сервер Traefik, то следует учитывать, что в него внесены критические изменения, влияющие на связь с сервером.",
"unknown_http_error_content": "Код: {{statusCode}}\nURL: {{method}} {{url}}\nСообщение: {{message}}",
"unknown_http_error_title": "Ошибка связи с сервером"
},
"note-color": {
"set-color": "Установить цвет заметки",
"clear-color": "Убрать цвет заметки",
"set-custom-color": "Установить другой цвет"
},
"calendar_view": {
"delete_note": "Удалить заметку..."
},
"presentation_view": {
"start-presentation": "Начать презентацию",
"edit-slide": "Редактировать слайд",
"slide-overview": "Переключить общий просмотр слайдов"
},
"read-only-info": {
"edit-note": "Изменить заметку",
"auto-read-only-note": "Заметка отображена в режиме \"только для чтения\" для быстрой загрузки.",
"read-only-note": "Заметка отображается в режиме \"только для чтения\"."
},
"experimental_features": {
"new_layout_description": "Попробуйте новый современный и удобный дизайн. В будущих обновлениях возможны его существенные изменения.",
"new_layout_name": "Новый дизайн",
"title": "Экспериментальные параметры",
"disclaimer": "Эти параметры экспериментальные и могут повлиять на стабильность. Используйте с осторожностью."
},
"popup-editor": {
"maximize": "Переключить на полный редактор"
},
"right_pane": {
"custom_widget_go_to_source": "Исходный код",
"toggle": "Переключить панель справа",
"empty_button": "Скрыть панель",
"empty_message": "Нечего отобразить для текущей заметки"
},
"attributes_panel": {
"title": "Атрибуты заметки"
}
}

View File

@@ -271,7 +271,6 @@
"download_button": "Preuzmi",
"mime": "MIME: ",
"file_size": "Veličina datoteke:",
"preview": "Pregled:",
"preview_not_available": "Pregled nije dostupan za ovaj tip beleške."
},
"sort_child_notes": {

View File

@@ -21,8 +21,17 @@
},
"bundle-error": {
"title": "載入自訂腳本失敗",
"message": "來自 ID 為 \"{{id}}\"、標題為 \"{{title}}\" 的筆記的腳本因以下原因無法執行:\n\n{{message}}"
}
"message": "腳本因以下原因無法執行:\n\n{{message}}"
},
"widget-list-error": {
"title": "無法從伺服器取得元件清單"
},
"widget-render-error": {
"title": "無法渲染自訂 React 元件"
},
"widget-missing-parent": "自訂元件未定義強制性的 \"{{property}}\" 屬性。\n\n若此腳本需在無 UI 的情況下執行,請改用 \"#run=frontendStartup\"。",
"open-script-note": "打開腳本筆記",
"scripting-error": "自訂腳本錯誤:{{title}}"
},
"add_link": {
"add_link": "新增連結",
@@ -205,7 +214,8 @@
"info": {
"modalTitle": "資訊消息",
"closeButton": "關閉",
"okButton": "確定"
"okButton": "確定",
"copy_to_clipboard": "複製到剪貼簿"
},
"jump_to_note": {
"search_button": "全文搜尋",
@@ -278,7 +288,6 @@
"download_button": "下載",
"mime": "MIME類型 ",
"file_size": "檔案大小:",
"preview": "預覽:",
"preview_not_available": "無法預覽此類型的筆記。",
"restore_button": "還原",
"delete_button": "刪除",
@@ -689,7 +698,13 @@
"convert_into_attachment_successful": "筆記 '{{title}}' 已成功轉換為附件。",
"convert_into_attachment_prompt": "確定要將筆記 '{{title}}' 轉換為父級筆記的附件嗎?",
"print_pdf": "匯出為 PDF…",
"open_note_on_server": "在伺服器上開啟筆記"
"open_note_on_server": "在伺服器上開啟筆記",
"view_revisions": "筆記歷史版本...",
"advanced": "進階",
"export_as_image": "匯出為圖片",
"export_as_image_png": "PNG (點陣)",
"export_as_image_svg": "SVG (向量)",
"note_map": "筆記地圖"
},
"onclick_button": {
"no_click_handler": "按鈕元件'{{componentId}}'沒有定義點擊時的處理方式"
@@ -746,9 +761,16 @@
},
"note_icon": {
"change_note_icon": "更改筆記圖標",
"category": "類別:",
"search": "搜尋:",
"reset-default": "重置為預設圖標"
"reset-default": "重置為預設圖標",
"search_placeholder_one": "在 {{count}} 個圖示包中搜尋 {{number}} 個圖示",
"search_placeholder_other": "",
"search_placeholder_filtered": "在 {{name}} 中搜尋 {{number}} 個圖示",
"filter": "篩選",
"filter-none": "所有圖示",
"filter-default": "預設圖示",
"icon_tooltip": "{{name}}\n圖示包{{iconPack}}",
"no_results": "找不到圖示。"
},
"basic_properties": {
"note_type": "筆記類型",
@@ -775,7 +797,8 @@
"expand_tooltip": "展開此集合的直接子級(單層深度)。按下右側箭頭以查看更多選項。",
"expand_first_level": "展開直接子級",
"expand_nth_level": "展開 {{depth}} 層",
"expand_all_levels": "展開所有層級"
"expand_all_levels": "展開所有層級",
"hide_child_notes": "隱藏樹中的子筆記"
},
"edited_notes": {
"no_edited_notes_found": "今天還沒有編輯過的筆記...",
@@ -788,7 +811,7 @@
"file_type": "檔案類型",
"file_size": "檔案大小",
"download": "下載",
"open": "打開",
"open": "以外部程式打開",
"upload_new_revision": "上傳新版本",
"upload_success": "已上傳新檔案版本。",
"upload_failed": "新檔案版本上傳失敗。",
@@ -808,7 +831,8 @@
},
"inherited_attribute_list": {
"title": "繼承的屬性",
"no_inherited_attributes": "沒有繼承的屬性。"
"no_inherited_attributes": "沒有繼承的屬性。",
"none": "無"
},
"note_info_widget": {
"note_id": "筆記 ID",
@@ -819,7 +843,9 @@
"note_size_info": "筆記大小提供了該筆記儲存需求的粗略估計。它考慮了筆記及其歷史的內容。",
"calculate": "計算",
"subtree_size": "(子階層大小: {{size}}, 共計 {{count}} 個筆記)",
"title": "筆記資訊"
"title": "筆記資訊",
"mime": "MIME 類型",
"show_similar_notes": "顯示相似筆記"
},
"note_map": {
"open_full": "展開顯示",
@@ -882,7 +908,8 @@
"search_parameters": "搜尋參數",
"unknown_search_option": "未知的搜尋選項 {{searchOptionName}}",
"search_note_saved": "搜尋筆記已儲存至 {{- notePathTitle}}",
"actions_executed": "已執行操作。"
"actions_executed": "已執行操作。",
"view_options": "查看選項:"
},
"similar_notes": {
"title": "相似筆記",
@@ -986,7 +1013,12 @@
"editable_text": {
"placeholder": "在這裡輸入您的筆記內容…",
"auto-detect-language": "自動檢測",
"keeps-crashing": "編輯元件持續發生崩潰。請嘗試重新啟動 Trilium。若問題仍存在請考慮提交錯誤報告。"
"keeps-crashing": "編輯元件持續發生崩潰。請嘗試重新啟動 Trilium。若問題仍存在請考慮提交錯誤報告。",
"editor_crashed_title": "文字編輯器崩潰",
"editor_crashed_content": "您的內容已成功恢復,但最近的幾項變更可能未被儲存。",
"editor_crashed_details_button": "檢視更多資訊⋯",
"editor_crashed_details_intro": "若您多次遇到此錯誤,請考慮在 GitHub 回報以下資訊。",
"editor_crashed_details_title": "技術資訊"
},
"empty": {
"open_note_instruction": "透過在下面的輸入框中輸入筆記標題或在樹中選擇筆記來打開筆記。",
@@ -1381,7 +1413,7 @@
"will_be_deleted_in": "此附件將在 {{time}} 後自動刪除",
"will_be_deleted_soon": "該附件即將被自動刪除",
"deletion_reason": ",因為該附件未連結在筆記的內容中。為防止被刪除,請將附件連結重新新增至內容中或將附件轉換為筆記。",
"role_and_size": "角色:{{role}},大小:{{size}}",
"role_and_size": "角色:{{role}},大小:{{size}}MIME{{- mimeType}}",
"link_copied": "已複製附件連結到剪貼簿。",
"unrecognized_role": "無法識別的附件角色 '{{role}}'。"
},
@@ -1435,7 +1467,10 @@
"duplicate": "複製副本",
"open-in-popup": "快速編輯",
"archive": "封存",
"unarchive": "解除封存"
"unarchive": "解除封存",
"open-in-a-new-window": "在新視窗打開",
"hide-subtree": "隱藏子階層",
"show-subtree": "顯示子階層"
},
"shared_info": {
"help_link": "如需幫助,請訪問 <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a>。",
@@ -1496,7 +1531,12 @@
},
"highlights_list_2": {
"title": "高亮列表",
"options": "選項"
"options": "選項",
"title_with_count_one": "{{count}} 處高亮",
"title_with_count_other": "{{count}} 處高亮",
"modal_title": "設定高亮列表",
"menu_configure": "設定高亮列表…",
"no_highlights": "未找到高亮內容。"
},
"quick-search": {
"placeholder": "快速搜尋",
@@ -1520,7 +1560,15 @@
"create-child-note": "建立子筆記",
"unhoist": "取消聚焦",
"toggle-sidebar": "切換側邊欄",
"dropping-not-allowed": "不允許移動筆記至此處。"
"dropping-not-allowed": "不允許移動筆記至此處。",
"clone-indicator-tooltip": "此筆記有 {{- count}} 個父級:{{- parents}}",
"clone-indicator-tooltip-single": "此筆記已克隆(新增 1 個父級:{{- parent}}",
"shared-indicator-tooltip": "此筆記已公開分享",
"shared-indicator-tooltip-with-url": "此筆記已公開分享至:{{- url}}",
"subtree-hidden-tooltip_one": "從樹中隱藏的 {{count}} 篇子筆記",
"subtree-hidden-moved-title": "已新增至 {{title}}",
"subtree-hidden-moved-description-collection": "此集合隱藏其樹中的子筆記。",
"subtree-hidden-moved-description-other": "子筆記隱藏於此筆記的樹中。"
},
"title_bar_buttons": {
"window-on-top": "保持此視窗置頂"
@@ -1528,10 +1576,23 @@
"note_detail": {
"could_not_find_typewidget": "找不到類型為 '{{type}}' 的 typeWidget",
"printing": "正在列印…",
"printing_pdf": "正在匯出為 PDF…"
"printing_pdf": "正在匯出為 PDF…",
"print_report_title": "列印報告",
"print_report_collection_content_one": "集合中的 {{count}} 篇筆記無法列印,因為它們不被支援或受到保護。",
"print_report_collection_content_other": "",
"print_report_collection_details_button": "查看詳情",
"print_report_collection_details_ignored_notes": "忽略的筆記"
},
"note_title": {
"placeholder": "請輸入筆記標題..."
"placeholder": "請輸入筆記標題...",
"created_on": "建立於 <Value />",
"last_modified": "修改於 <Value />",
"note_type_switcher_label": "從 {{type}} 切換至:",
"note_type_switcher_others": "其他筆記類型",
"note_type_switcher_templates": "模板",
"note_type_switcher_collection": "集合",
"edited_notes": "今天編輯過的筆記",
"promoted_attributes": "升級屬性"
},
"search_result": {
"no_notes_found": "沒有找到符合搜尋條件的筆記。",
@@ -1560,7 +1621,8 @@
},
"toc": {
"table_of_contents": "目錄",
"options": "選項"
"options": "選項",
"no_headings": "無標題。"
},
"watched_file_update_status": {
"file_last_modified": "檔案 <code class=\"file-path\"></code> 最後修改時間為 <span class=\"file-last-modified\"></span>。",
@@ -1934,8 +1996,9 @@
"unknown_widget": "未知元件:\"{{id}}\"。"
},
"note_language": {
"not_set": "設定",
"configure-languages": "設定語言…"
"not_set": "設定語言",
"configure-languages": "設定語言…",
"help-on-languages": "設定內容語言說明…"
},
"content_language": {
"title": "內文語言",
@@ -2002,7 +2065,7 @@
"book_properties_config": {
"hide-weekends": "隱藏週末",
"display-week-numbers": "顯示週數",
"map-style": "地圖樣式",
"map-style": "地圖樣式",
"max-nesting-depth": "最大嵌套深度:",
"raster": "柵格",
"vector_light": "向量(淺色)",
@@ -2059,14 +2122,20 @@
"next_theme_title": "試用新 Trilium 主題",
"next_theme_message": "您正在使用舊版主題,要試用新主題嗎?",
"next_theme_button": "試用新主題",
"dismiss": "關閉"
"dismiss": "關閉",
"new_layout_title": "新版面配置",
"new_layout_button": "更多資訊",
"new_layout_message": "我們為 Trilium 推出了現代化版面配置。功能區分頁已移除並無縫整合至主介面,取而代之的是全新狀態列與可擴展區塊(例如提升屬性)承擔其主要功能。\n\n新版面配置預設為啟用狀態您可透過「選項 → 外觀」暫時停用。"
},
"settings": {
"related_settings": "相關設定"
},
"settings_appearance": {
"related_code_blocks": "文字筆記中程式碼區塊的配色方案",
"related_code_notes": "程式碼筆記的配色方案"
"related_code_notes": "程式碼筆記的配色方案",
"ui": "使用者介面",
"ui_old_layout": "舊版面配置",
"ui_new_layout": "新版面配置"
},
"units": {
"percentage": "%"
@@ -2106,5 +2175,92 @@
},
"popup-editor": {
"maximize": "切換至完整編輯器"
},
"experimental_features": {
"title": "實驗性選項",
"disclaimer": "這些選項屬實驗性質,可能導致系統不穩定。請謹慎使用。",
"new_layout_name": "新版面配置",
"new_layout_description": "體驗全新版面配置,呈現更現代的外觀與更佳的使用體驗。在未來版本將進行大幅調整。"
},
"server": {
"unknown_http_error_title": "與伺服器通訊錯誤",
"unknown_http_error_content": "狀態碼:{{statusCode}}\n網址{{method}} {{url}}\n訊息{{message}}",
"traefik_blocks_requests": "若您正在使用 Traefik 反向代理,該代理已引入一項重大變更影響與伺服器的通訊。"
},
"tab_history_navigation_buttons": {
"go-back": "返回前一筆記",
"go-forward": "前往下一筆記"
},
"breadcrumb_badges": {
"read_only_explicit": "唯讀",
"read_only_auto": "自動唯讀",
"shared_publicly": "公開分享",
"shared_locally": "本地分享",
"read_only_explicit_description": "此筆記已被手動設定為唯讀。\n點擊以臨時編輯。",
"read_only_temporarily_disabled": "臨時編輯",
"shared_copy_to_clipboard": "複製連結至剪貼簿",
"shared_open_in_browser": "在瀏覽器中打開連結",
"shared_unshare": "取消分享",
"clipped_note": "網頁擷取",
"execute_script": "運行腳本",
"execute_sql": "運行 SQL",
"read_only_auto_description": "基於效能考量,此筆記已自動設定為唯讀模式。此自動限制可於設定中調整。\n\n點擊此處可臨時編輯。",
"read_only_temporarily_disabled_description": "此筆記目前可編輯,但通常為唯讀狀態。當您切換至其他筆記時,本筆記將立即恢復為唯讀模式。\n\n點擊此處重新啟用唯讀模式。",
"clipped_note_description": "本筆記原始來源為 {{url}}。\n\n點擊此處前往原網頁。",
"execute_script_description": "此筆記為腳本筆記。點擊以執行腳本。",
"execute_sql_description": "此筆記為 SQL 筆記。點擊以執行 SQL 查詢。",
"save_status_saved": "已儲存",
"save_status_saving": "正在儲存…",
"save_status_unsaved": "未儲存",
"save_status_error": "儲存失敗",
"save_status_saving_tooltip": "正在儲存更動。",
"save_status_unsaved_tooltip": "仍有更動尚未儲存。它們將在稍後自動儲存。",
"save_status_error_tooltip": "在儲存筆記時發生錯誤。如果可以,請嘗試將筆記內容複製至他處並重新載入應用程式。"
},
"breadcrumb": {
"hoisted_badge": "聚焦",
"hoisted_badge_title": "取消聚焦",
"workspace_badge": "工作空間",
"scroll_to_top_title": "跳轉至筆記開頭",
"create_new_note": "新增子筆記",
"empty_hide_archived_notes": "隱藏已歸檔的筆記"
},
"status_bar": {
"language_title": "更改內容語言",
"note_info_title": "查看筆記資訊(如日期、筆記大小)",
"backlinks_one": "{{count}} 個反連結",
"backlinks_other": "",
"backlinks_title_one": "查看反連結",
"backlinks_title_other": "",
"attachments_one": "{{count}} 個附件",
"attachments_other": "",
"attachments_title_one": "在新分頁中查看附件",
"attachments_title_other": "",
"attributes_one": "{{count}} 個屬性",
"attributes_other": "",
"attributes_title": "自有屬性及繼承屬性",
"note_paths_one": "{{count}} 條路徑",
"note_paths_other": "",
"note_paths_title": "筆記路徑",
"code_note_switcher": "更改語言模式"
},
"right_pane": {
"empty_button": "隱藏面板",
"toggle": "切換右側面板",
"custom_widget_go_to_source": "跳轉至原始碼",
"empty_message": "此筆記無內容可顯示"
},
"attributes_panel": {
"title": "筆記屬性"
},
"pdf": {
"attachments_one": "{{count}} 個附件",
"attachments_other": "",
"layers_one": "{{count}} 層",
"layers_other": "",
"pages_one": "共 {{count}} 頁",
"pages_other": "",
"pages_alt": "第 {{pageNumber}} 頁",
"pages_loading": "正在載入…"
}
}

View File

@@ -321,7 +321,6 @@
"download_button": "Завантажити",
"mime": "МІМЕ: ",
"file_size": "Розмір файлу:",
"preview": "Попередній перегляд:",
"preview_not_available": "Попередній перегляд недоступний для цього типу нотатки.",
"diff_on": "Показати різницю",
"diff_off": "Показати вміст",
@@ -849,7 +848,6 @@
},
"note_icon": {
"change_note_icon": "Змінити значок нотатки",
"category": "Категорія:",
"search": "Пошук:",
"reset-default": "Скинути значок до стандартного значення"
},

View File

@@ -17,5 +17,3 @@ declare module "*?raw" {
var content: string;
export default content;
}
declare module "boxicons/css/boxicons.min.css" { }

View File

@@ -69,7 +69,7 @@ declare namespace Fancytree {
debug(msg: any): void;
/** Expand (or collapse) all parent nodes. */
expandAll(flag?: boolean, options?: Object): void;
expandAll(flag?: boolean, options?: object): void;
/** [ext-filter] Dimm or hide whole branches.
* @returns {integer} count
@@ -221,6 +221,7 @@ declare namespace Fancytree {
branchId: string;
isProtected: boolean;
noteType: NoteType;
subtreeHidden: boolean;
}
interface FancytreeNewNode extends FancytreeNodeData {
@@ -369,7 +370,7 @@ declare namespace Fancytree {
* @param mode 'before', 'after', or 'child' (default='child')
* @param init NodeData (or simple title string)
*/
editCreateNode(mode?: string, init?: Object): void;
editCreateNode(mode?: string, init?: object): void;
/** [ext-edit] Stop inline editing.
*
@@ -526,7 +527,7 @@ declare namespace Fancytree {
*
* @param opts passed to `setExpanded()`. Defaults to {noAnimation: false, noEvents: false, scrollIntoView: true}
*/
makeVisible(opts?: Object): JQueryPromise<any>;
makeVisible(opts?: object): JQueryPromise<any>;
/** Move this node to targetNode.
*
@@ -589,25 +590,25 @@ declare namespace Fancytree {
* @param effects animation options.
* @param options {topNode: null, effects: ..., parent: ...} this node will remain visible in any case, even if `this` is outside the scroll pane.
*/
scrollIntoView(effects?: boolean, options?: Object): JQueryPromise<any>;
scrollIntoView(effects?: boolean, options?: object): JQueryPromise<any>;
/**
* @param effects animation options.
* @param options {topNode: null, effects: ..., parent: ...} this node will remain visible in any case, even if `this` is outside the scroll pane.
*/
scrollIntoView(effects?: Object, options?: Object): JQueryPromise<any>;
scrollIntoView(effects?: object, options?: object): JQueryPromise<any>;
/**
* @param flag pass false to deactivate
* @param opts additional options. Defaults to {noEvents: false}
*/
setActive(flag?: boolean, opts?: Object): JQueryPromise<any>;
setActive(flag?: boolean, opts?: object): JQueryPromise<any>;
/**
* @param flag pass false to collapse.
* @param opts additional options. Defaults to {noAnimation:false, noEvents:false}
*/
setExpanded(flag?: boolean, opts?: Object): JQueryPromise<any>;
setExpanded(flag?: boolean, opts?: object): JQueryPromise<any>;
/**
* Set keyboard focus to this node.
@@ -1109,7 +1110,7 @@ declare namespace Fancytree {
/** class names added to the node markup (separate with space) */
extraClasses?: string | undefined;
/** all properties from will be copied to `node.data` */
data?: Object | undefined;
data?: object | undefined;
/** Will be added as title attribute of the node's icon span,thus enabling a tooltip. */
iconTooltip?: string | undefined;
@@ -1160,7 +1161,7 @@ declare namespace Fancytree {
escapeHtml(s: string): string;
getEventTarget(event: Event): Object;
getEventTarget(event: Event): object;
getEventTargetType(event: Event): string;
@@ -1179,7 +1180,7 @@ declare namespace Fancytree {
parseHtml($ul: JQuery): NodeData[];
/** Add Fancytree extension definition to the list of globally available extensions. */
registerExtension(definition: Object): void;
registerExtension(definition: object): void;
unescapeHtml(s: string): string;

121
apps/client/src/types-pdfjs.d.ts vendored Normal file
View File

@@ -0,0 +1,121 @@
type HistoryData = {
files: {
fingerprint: string;
page: number;
zoom: string;
scrollLeft: number;
scrollTop: number;
rotation: number;
sidebarView: number;
}[];
};
interface Window {
/**
* By default, pdf.js will try to store information about the opened PDFs such as zoom and scroll position in local storage.
* The Trilium alternative is to use attachments stored at note level.
* This variable represents the direct content used by the pdf.js viewer in its local storage key, but in plain JS object format.
* The variable must be set early at startup, before pdf.js fully initializes.
*/
TRILIUM_VIEW_HISTORY_STORE?: HistoryData;
/**
* If set to true, hides the pdf.js viewer default sidebar containing the outline, page navigation, etc.
* This needs to be set early in the main method.
*/
TRILIUM_HIDE_SIDEBAR?: boolean;
TRILIUM_NOTE_ID: string;
TRILIUM_NTX_ID: string | null | undefined;
}
interface PdfOutlineItem {
title: string;
level: number;
dest: unknown;
id: string;
items: PdfOutlineItem[];
}
interface WithContext {
ntxId: string;
noteId: string | null | undefined;
}
interface PdfDocumentModifiedMessage extends WithContext {
type: "pdfjs-viewer-document-modified";
}
interface PdfDocumentBlobResultMessage extends WithContext {
type: "pdfjs-viewer-blob";
data: Uint8Array<ArrayBufferLike>;
}
interface PdfSaveViewHistoryMessage extends WithContext {
type: "pdfjs-viewer-save-view-history";
data: string;
}
interface PdfViewerTocMessage {
type: "pdfjs-viewer-toc";
data: PdfOutlineItem[];
}
interface PdfViewerActiveHeadingMessage {
type: "pdfjs-viewer-active-heading";
headingId: string;
}
interface PdfViewerPageInfoMessage {
type: "pdfjs-viewer-page-info";
totalPages: number;
currentPage: number;
}
interface PdfViewerCurrentPageMessage {
type: "pdfjs-viewer-current-page";
currentPage: number;
}
interface PdfViewerThumbnailMessage {
type: "pdfjs-viewer-thumbnail";
pageNumber: number;
dataUrl: string;
}
interface PdfAttachment {
filename: string;
size: number;
}
interface PdfViewerAttachmentsMessage {
type: "pdfjs-viewer-attachments";
attachments: PdfAttachment[];
downloadAttachment?: (fileName: string) => void;
}
interface PdfLayer {
id: string;
name: string;
visible: boolean;
}
interface PdfViewerLayersMessage {
type: "pdfjs-viewer-layers";
layers: PdfLayer[];
toggleLayer?: (layerId: string, visible: boolean) => void;
}
type PdfMessageEvent = MessageEvent<
PdfDocumentModifiedMessage
| PdfSaveViewHistoryMessage
| PdfViewerTocMessage
| PdfViewerActiveHeadingMessage
| PdfViewerPageInfoMessage
| PdfViewerCurrentPageMessage
| PdfViewerThumbnailMessage
| PdfViewerAttachmentsMessage
| PdfViewerLayersMessage
| PdfDocumentBlobResultMessage
>;

View File

@@ -1,12 +1,14 @@
import type FNote from "./entities/fnote";
import type { Froca } from "./services/froca-interface";
import { Suggestion } from "./services/note_autocomplete";
import utils from "./services/utils";
import { IconRegistry, Locale } from "@triliumnext/commons";
import appContext, { AppContext } from "./components/app_context";
import server from "./services/server";
import library_loader, { Library } from "./services/library_loader";
import type FNote from "./entities/fnote";
import type { PrintReport } from "./print";
import type { lint } from "./services/eslint";
import type { Mermaid, MermaidConfig } from "mermaid";
import type { Froca } from "./services/froca-interface";
import { Library } from "./services/library_loader";
import { Suggestion } from "./services/note_autocomplete";
import server from "./services/server";
import utils from "./services/utils";
interface ElectronProcess {
type: string;
@@ -34,6 +36,7 @@ interface CustomGlobals {
isProtectedSessionAvailable: boolean;
isDev: boolean;
isMainWindow: boolean;
windowId: string;
maxEntityChangeIdAtLoad: number;
maxEntityChangeSyncIdAtLoad: number;
assetPath: string;
@@ -45,13 +48,25 @@ interface CustomGlobals {
platform?: typeof process.platform;
linter: typeof lint;
hasNativeTitleBar: boolean;
hasBackgroundEffects: boolean;
isElectron: boolean;
isRtl: boolean;
iconRegistry: IconRegistry;
themeCssUrl: string;
themeUseNextAsBase?: "next" | "next-light" | "next-dark";
iconPackCss: string;
headingStyle: "plain" | "underline" | "markdown";
layoutOrientation: "vertical" | "horizontal";
currentLocale: Locale;
}
type RequireMethod = (moduleName: string) => any;
declare global {
interface Window {
$: JQueryStatic;
jQuery: JQueryStatic;
logError(message: string);
logInfo(message: string);
@@ -59,7 +74,7 @@ declare global {
glob?: CustomGlobals;
/** On the printing endpoint, set to true when the note has fully loaded and is ready to be printed/exported as PDF. */
_noteReady?: boolean;
_noteReady?: PrintReport;
EXCALIDRAW_ASSET_PATH?: string;
}

View File

@@ -1,55 +0,0 @@
.breadcrumb-row {
position: relative;
}
.component.breadcrumb {
contain: none;
display: flex;
margin: 0;
align-items: center;
font-size: 0.9em;
gap: 0.25em;
flex-wrap: nowrap;
overflow: hidden;
max-width: 85%;
> span,
> span > span {
display: flex;
align-items: center;
min-width: 0;
a {
color: inherit;
text-decoration: none;
min-width: 0;
max-width: 150px;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
display: block;
flex-shrink: 2;
}
}
> span:last-of-type a {
max-width: 300px;
flex-shrink: 1;
}
ul {
flex-direction: column;
list-style-type: none;
margin: 0;
padding: 0;
}
.dropdown-item span,
.dropdown-item strong {
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
display: block;
max-width: 300px;
}
}

View File

@@ -1,166 +0,0 @@
import "./Breadcrumb.css";
import { useMemo } from "preact/hooks";
import { Fragment } from "preact/jsx-runtime";
import NoteContext from "../components/note_context";
import froca from "../services/froca";
import ActionButton from "./react/ActionButton";
import Dropdown from "./react/Dropdown";
import { FormListItem } from "./react/FormList";
import { useChildNotes, useNoteContext, useNoteLabel, useNoteProperty } from "./react/hooks";
import Icon from "./react/Icon";
import NoteLink from "./react/NoteLink";
import link_context_menu from "../menus/link_context_menu";
const COLLAPSE_THRESHOLD = 5;
const INITIAL_ITEMS = 2;
const FINAL_ITEMS = 2;
export default function Breadcrumb() {
const { note, noteContext } = useNoteContext();
const notePath = buildNotePaths(noteContext?.notePathArray);
return (
<div className="breadcrumb">
{notePath.length > COLLAPSE_THRESHOLD ? (
<>
{notePath.slice(0, INITIAL_ITEMS).map((item, index) => (
<Fragment key={item}>
{index === 0
? <BreadcrumbRoot noteContext={noteContext} />
: <BreadcrumbItem notePath={item} />
}
<BreadcrumbSeparator notePath={item} activeNotePath={notePath[index + 1]} noteContext={noteContext} />
</Fragment>
))}
<BreadcrumbCollapsed items={notePath.slice(INITIAL_ITEMS, -FINAL_ITEMS)} noteContext={noteContext} />
{notePath.slice(-FINAL_ITEMS).map((item, index) => (
<Fragment key={item}>
<BreadcrumbSeparator notePath={notePath[notePath.length - FINAL_ITEMS - (1 - index)]} activeNotePath={item} noteContext={noteContext} />
<BreadcrumbItem notePath={item} />
</Fragment>
))}
</>
) : (
notePath.map((item, index) => (
<Fragment key={item}>
{index === 0
? <BreadcrumbRoot noteContext={noteContext} />
: <BreadcrumbItem notePath={item} />
}
{(index < notePath.length - 1 || note?.hasChildren()) &&
<BreadcrumbSeparator notePath={item} activeNotePath={notePath[index + 1]} noteContext={noteContext} />}
</Fragment>
))
)}
</div>
);
}
function BreadcrumbRoot({ noteContext }: { noteContext: NoteContext | undefined }) {
const note = useMemo(() => froca.getNoteFromCache("root"), []);
useNoteLabel(note, "iconClass");
const title = useNoteProperty(note, "title");
return (note &&
<ActionButton
icon={note.getIcon()}
text={title ?? ""}
onClick={() => noteContext?.setNote("root")}
onContextMenu={(e) => {
e.preventDefault();
link_context_menu.openContextMenu(note.noteId, e);
}}
/>
);
}
function BreadcrumbItem({ notePath }: { notePath: string }) {
return (
<NoteLink
notePath={notePath}
noPreview
/>
);
}
function BreadcrumbSeparator({ notePath, noteContext, activeNotePath }: { notePath: string, activeNotePath: string, noteContext: NoteContext | undefined }) {
return (
<Dropdown
text={<Icon icon="bx bx-chevron-right" />}
noSelectButtonStyle
buttonClassName="icon-action"
hideToggleArrow
dropdownOptions={{ popperConfig: { strategy: "fixed" } }}
>
<BreadcrumbSeparatorDropdownContent notePath={notePath} noteContext={noteContext} activeNotePath={activeNotePath} />
</Dropdown>
);
}
function BreadcrumbSeparatorDropdownContent({ notePath, noteContext, activeNotePath }: { notePath: string, activeNotePath: string, noteContext: NoteContext | undefined }) {
const notePathComponents = notePath.split("/");
const parentNoteId = notePathComponents.at(-1);
const childNotes = useChildNotes(parentNoteId);
return (
<ul className="breadcrumb-child-list">
{childNotes.map((note) => {
const childNotePath = `${notePath}/${note.noteId}`;
return <li key={note.noteId}>
<FormListItem
icon={note.getIcon()}
onClick={() => noteContext?.setNote(childNotePath)}
>
{childNotePath !== activeNotePath
? <span>{note.title}</span>
: <strong>{note.title}</strong>}
</FormListItem>
</li>;
})}
</ul>
);
}
function BreadcrumbCollapsed({ items, noteContext }: { items: string[], noteContext: NoteContext | undefined }) {
return (
<Dropdown
text={<Icon icon="bx bx-dots-horizontal-rounded" />}
noSelectButtonStyle
buttonClassName="icon-action"
hideToggleArrow
dropdownOptions={{ popperConfig: { strategy: "fixed" } }}
>
<ul className="breadcrumb-child-list">
{items.map((notePath) => {
const notePathComponents = notePath.split("/");
const noteId = notePathComponents[notePathComponents.length - 1];
const note = froca.getNoteFromCache(noteId);
if (!note) return null;
return <li key={note.noteId}>
<FormListItem
icon={note.getIcon()}
onClick={() => noteContext?.setNote(notePath)}
>
<span>{note.title}</span>
</FormListItem>
</li>;
})}
</ul>
</Dropdown>
);
}
function buildNotePaths(notePathArray: string[] | undefined) {
if (!notePathArray) return [];
let prefix = "";
const output: string[] = [];
for (const notePath of notePathArray) {
output.push(`${prefix}${notePath}`);
prefix += `${notePath}/`;
}
return output;
}

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