mirror of
https://github.com/zadam/trilium.git
synced 2025-10-26 15:56:29 +01:00
Compare commits
872 Commits
v0.99.0
...
react/type
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bca0846565 | ||
|
|
8557bad242 | ||
|
|
8fef28dcc7 | ||
|
|
040ffe945a | ||
|
|
f43dfc23c0 | ||
|
|
e2984ec2ab | ||
|
|
2e14d73c5b | ||
|
|
1afd00f7e8 | ||
|
|
23f5f57c92 | ||
|
|
d80d637cc2 | ||
|
|
b25ab3a988 | ||
|
|
62e978068a | ||
|
|
89879a6851 | ||
|
|
e1a0452448 | ||
|
|
c9f7d2a457 | ||
|
|
fd71a90a8e | ||
|
|
f06d6a4e92 | ||
|
|
6bb98c3eae | ||
|
|
cf21706f26 | ||
|
|
d0fbda50fc | ||
|
|
9abef88177 | ||
|
|
1a94e9637d | ||
|
|
e15ff806e5 | ||
|
|
7b01165970 | ||
|
|
fc3cc6ffec | ||
|
|
6d99ccefdb | ||
|
|
b055c7e2ef | ||
|
|
e488845d29 | ||
|
|
fcd71052c5 | ||
|
|
b465336d0a | ||
|
|
23e4fef078 | ||
|
|
32f360979c | ||
|
|
c1cc187a88 | ||
|
|
f7dbcfb77a | ||
|
|
52916a8bbb | ||
|
|
c8e311744a | ||
|
|
b87f0c1a57 | ||
|
|
3ebb4c3c9c | ||
|
|
10350b1a42 | ||
|
|
a5beb2ae41 | ||
|
|
b081d3fb2d | ||
|
|
7bc4c530e8 | ||
|
|
1002f01e57 | ||
|
|
f9bcc99bf9 | ||
|
|
2956c97983 | ||
|
|
8bf9544bea | ||
|
|
4ea2fdf471 | ||
|
|
492f481999 | ||
|
|
00b215c093 | ||
|
|
b84010318d | ||
|
|
63a08c4bd3 | ||
|
|
b34fbff6d1 | ||
|
|
e08a9e1915 | ||
|
|
519ada3a48 | ||
|
|
90524d99dc | ||
|
|
2936a537cf | ||
|
|
6f51d82f82 | ||
|
|
ea4fe3f290 | ||
|
|
6d9bdd5c6f | ||
|
|
3c2642e822 | ||
|
|
f4df7c1eec | ||
|
|
74d7191222 | ||
|
|
2c71a56324 | ||
|
|
3ab8627db8 | ||
|
|
9d7c513fb7 | ||
|
|
f880aa769c | ||
|
|
c64e695036 | ||
|
|
a500dc9067 | ||
|
|
08d6a49cb6 | ||
|
|
315f8b4503 | ||
|
|
9dc4de1366 | ||
|
|
a22796397a | ||
|
|
372297f829 | ||
|
|
f0908045f1 | ||
|
|
b431a70792 | ||
|
|
c14cdb618b | ||
|
|
f596080d06 | ||
|
|
c88f03f4fd | ||
|
|
8ca65edc70 | ||
|
|
5131c1d72c | ||
|
|
8fab4dd94d | ||
|
|
583c488b96 | ||
|
|
d16598c03d | ||
|
|
e6e8cdcec1 | ||
|
|
7561bd471b | ||
|
|
b9cc8015fe | ||
|
|
853be9000b | ||
|
|
9a7638cc73 | ||
|
|
10448a9f36 | ||
|
|
360a7f530d | ||
|
|
f457dbf7d4 | ||
|
|
3f6d93230e | ||
|
|
1b2be2c345 | ||
|
|
6d1faac772 | ||
|
|
a9fe48aa0a | ||
|
|
e2e58fee56 | ||
|
|
95ac70518b | ||
|
|
e95949e4d6 | ||
|
|
ae87b9e027 | ||
|
|
fe4e5286f7 | ||
|
|
b43a5252b1 | ||
|
|
a732487e7f | ||
|
|
112b847869 | ||
|
|
2fdcbc4726 | ||
|
|
e9aa215b95 | ||
|
|
6b6322798e | ||
|
|
a8011e4755 | ||
|
|
b2fcf5fa6c | ||
|
|
8ac0425ca5 | ||
|
|
f9a841245c | ||
|
|
a377a0ef15 | ||
|
|
ea3cf8078e | ||
|
|
13d2721696 | ||
|
|
b8f0fc722c | ||
|
|
3e54e0fc42 | ||
|
|
06d87dc94b | ||
|
|
d35f97d99a | ||
|
|
c4358d52d5 | ||
|
|
b8ffb004ce | ||
|
|
3a3cb0c68d | ||
|
|
d98e6fe88a | ||
|
|
b5f73874cb | ||
|
|
9d1e89268f | ||
|
|
d9bfa08672 | ||
|
|
8a8727e6df | ||
|
|
d19d05ec7b | ||
|
|
b0bb93975a | ||
|
|
09c5686cb7 | ||
|
|
42b1dcebcd | ||
|
|
1e78dd8296 | ||
|
|
3d9861f904 | ||
|
|
668e1dff4b | ||
|
|
c91a03834d | ||
|
|
20e293f5df | ||
|
|
87fb3c1e82 | ||
|
|
db1bcfda45 | ||
|
|
a8e44afd6d | ||
|
|
1b1bceebfe | ||
|
|
6faccd3b14 | ||
|
|
34117fa9ad | ||
|
|
6b93013674 | ||
|
|
247ab1aec3 | ||
|
|
adff36cf22 | ||
|
|
034ac59c9a | ||
|
|
80d805a807 | ||
|
|
39ca136c5d | ||
|
|
29dbfa6fc4 | ||
|
|
3e30870c87 | ||
|
|
ee1a11975c | ||
|
|
f0fc3e96ce | ||
|
|
cd75ff9a8a | ||
|
|
f196140210 | ||
|
|
a77c4e6dfa | ||
|
|
1d4d193552 | ||
|
|
3225f4c8f5 | ||
|
|
800c4dc012 | ||
|
|
d662882c03 | ||
|
|
31c8e96d70 | ||
|
|
1191421388 | ||
|
|
831a184c2a | ||
|
|
c671f91bca | ||
|
|
fa436c7ce6 | ||
|
|
d1367286c9 | ||
|
|
d10b0fa823 | ||
|
|
545c8648b7 | ||
|
|
d6e9acc149 | ||
|
|
26e14aff7b | ||
|
|
280ec5b406 | ||
|
|
26081ffd36 | ||
|
|
f106cbf6c0 | ||
|
|
f3877a52ab | ||
|
|
5becf60a63 | ||
|
|
2ea96dc8f8 | ||
|
|
e48724662e | ||
|
|
745ce7de76 | ||
|
|
997217861c | ||
|
|
44f8e8b833 | ||
|
|
99e2b63ff0 | ||
|
|
0139d90ac7 | ||
|
|
5b7484c27c | ||
|
|
71e64be44c | ||
|
|
639651329a | ||
|
|
a7a0d3584a | ||
|
|
f765441f1e | ||
|
|
10cd5bf130 | ||
|
|
d93c5dfeea | ||
|
|
b58aac1298 | ||
|
|
d662718a4a | ||
|
|
bebd3d430b | ||
|
|
2fca995725 | ||
|
|
caa1ea12f1 | ||
|
|
f25e4ea391 | ||
|
|
6c106300d4 | ||
|
|
05b433edb5 | ||
|
|
69a59f0935 | ||
|
|
fa7575ed00 | ||
|
|
b2174549c7 | ||
|
|
19f16274ab | ||
|
|
7f88ae5494 | ||
|
|
c820b5caa4 | ||
|
|
b1638e1ffc | ||
|
|
f2e60f52d2 | ||
|
|
d845343e97 | ||
|
|
ee2edc92e7 | ||
|
|
332216f5f5 | ||
|
|
4d4cd7d130 | ||
|
|
b3cc51ce63 | ||
|
|
05645d93ef | ||
|
|
a2d09efca4 | ||
|
|
1212f9a9e9 | ||
|
|
75f7986e36 | ||
|
|
4997543fc7 | ||
|
|
63c91b6741 | ||
|
|
27b6e26fa5 | ||
|
|
7930745a01 | ||
|
|
2447a6fc8d | ||
|
|
38a4a3e7b6 | ||
|
|
28240d549d | ||
|
|
5da46a1678 | ||
|
|
e592a37799 | ||
|
|
15d00b61dd | ||
|
|
5d0b6f9fad | ||
|
|
2a40ffd164 | ||
|
|
8c687de3c6 | ||
|
|
27415b4e16 | ||
|
|
ce0b39765e | ||
|
|
fafc4af237 | ||
|
|
76a283ed77 | ||
|
|
99500bca8f | ||
|
|
a982fc326f | ||
|
|
b16309d01a | ||
|
|
1bfc3d450f | ||
|
|
37b63d4ea9 | ||
|
|
e7315e7d35 | ||
|
|
718dffa672 | ||
|
|
c3dd9865e7 | ||
|
|
1702ec5644 | ||
|
|
dfddf044cf | ||
|
|
24a632056a | ||
|
|
dc7f4a6cf3 | ||
|
|
cd100f37fe | ||
|
|
984e8bbba0 | ||
|
|
fcc22cc212 | ||
|
|
4101acc2e3 | ||
|
|
f30bdd54b1 | ||
|
|
6ffe8a2eb5 | ||
|
|
0dcaa8719f | ||
|
|
608605af12 | ||
|
|
3f7b8447d0 | ||
|
|
d3594e4a05 | ||
|
|
156b4101a5 | ||
|
|
73213d2a17 | ||
|
|
763bcbd394 | ||
|
|
d90043e586 | ||
|
|
c209a699ea | ||
|
|
22069d0aef | ||
|
|
3248654820 | ||
|
|
269c7c9ce7 | ||
|
|
b0c984decd | ||
|
|
cebb54ddf6 | ||
|
|
22f8929da6 | ||
|
|
62bb8ac89a | ||
|
|
33dfcb1c6e | ||
|
|
5969815ed1 | ||
|
|
2b2125c702 | ||
|
|
7192d40e80 | ||
|
|
df9d481a93 | ||
|
|
85a4557bb0 | ||
|
|
cf37549f19 | ||
|
|
d2dda95654 | ||
|
|
0770f97010 | ||
|
|
3caaf2ab79 | ||
|
|
8f819a7786 | ||
|
|
0d9e4a1aa2 | ||
|
|
4a01181110 | ||
|
|
89dfc480f3 | ||
|
|
c178fc2957 | ||
|
|
0da66617a8 | ||
|
|
5efe05490d | ||
|
|
656b234740 | ||
|
|
e6e9cd3f35 | ||
|
|
845c76fc42 | ||
|
|
a4d6da72a1 | ||
|
|
35438d2599 | ||
|
|
9a1e7ca3ae | ||
|
|
2d29d1b41f | ||
|
|
ad5ff6e41a | ||
|
|
20dcbff68f | ||
|
|
c127e19cfa | ||
|
|
e32237559e | ||
|
|
09811d23f6 | ||
|
|
b41042fec4 | ||
|
|
08fae19d19 | ||
|
|
9cceff4f02 | ||
|
|
67d9154795 | ||
|
|
1eca9f6541 | ||
|
|
9d8c62caaf | ||
|
|
279f014c42 | ||
|
|
826e9c7114 | ||
|
|
384c8649b4 | ||
|
|
ecc8bc3866 | ||
|
|
bb4d723f18 | ||
|
|
e250510ab1 | ||
|
|
dc630f927f | ||
|
|
e47cb13b89 | ||
|
|
838ae315e3 | ||
|
|
58afa86a2b | ||
|
|
5b90ece12f | ||
|
|
afb2072b97 | ||
|
|
8e0ca56b85 | ||
|
|
8e4cf38840 | ||
|
|
cb872d3638 | ||
|
|
781be26833 | ||
|
|
0ad5f3493d | ||
|
|
15bb3acb31 | ||
|
|
a43ddf3f9f | ||
|
|
8417bfebb0 | ||
|
|
28e8ea2da9 | ||
|
|
393264b4a1 | ||
|
|
9306a28c87 | ||
|
|
77fef38009 | ||
|
|
c14ea42978 | ||
|
|
341cd62b13 | ||
|
|
9e6cfe7c1e | ||
|
|
9695dd404b | ||
|
|
5e6be01251 | ||
|
|
f367a1c776 | ||
|
|
c469fffb6e | ||
|
|
d076d54170 | ||
|
|
3256c14a20 | ||
|
|
460e01a2d6 | ||
|
|
1913355069 | ||
|
|
bce987c67a | ||
|
|
e7a9f9c566 | ||
|
|
33150e3a98 | ||
|
|
e1aead098e | ||
|
|
9f9a276a51 | ||
|
|
873df6da6c | ||
|
|
2e353afb98 | ||
|
|
d497688d9a | ||
|
|
2cf3a04482 | ||
|
|
e50fd6f540 | ||
|
|
5096163ae3 | ||
|
|
0d6640ae14 | ||
|
|
52ac93e99c | ||
|
|
674b0a8215 | ||
|
|
ec56b297dc | ||
|
|
f687d91201 | ||
|
|
a477cc22e6 | ||
|
|
119278b5f5 | ||
|
|
5414fbeacb | ||
|
|
a4b01bba9b | ||
|
|
bab536751a | ||
|
|
7657e17373 | ||
|
|
30f530abdb | ||
|
|
1d373bc7d5 | ||
|
|
9d3c5d04b9 | ||
|
|
ba91fbbe6b | ||
|
|
f6898779bb | ||
|
|
dbb90bdd2b | ||
|
|
f442c56ed6 | ||
|
|
e971a9cb03 | ||
|
|
b450a4faa0 | ||
|
|
e8e93e985d | ||
|
|
c5c304f85b | ||
|
|
58aea03114 | ||
|
|
4af842d2f2 | ||
|
|
3b2f5bb09d | ||
|
|
2d67aab288 | ||
|
|
838d761b50 | ||
|
|
9a2440942b | ||
|
|
c3151f9afa | ||
|
|
f277612444 | ||
|
|
1b92ad2f53 | ||
|
|
f96abe0e45 | ||
|
|
142a276cc4 | ||
|
|
a52b0a45fe | ||
|
|
6df40ec80a | ||
|
|
713340a9ba | ||
|
|
ee8b41c81b | ||
|
|
dd477258a9 | ||
|
|
7c30e2b4f6 | ||
|
|
37a3c00214 | ||
|
|
d30cdadb2d | ||
|
|
58f0d01944 | ||
|
|
d4791944b0 | ||
|
|
92a052674f | ||
|
|
d49ce7c289 | ||
|
|
5f38d52f20 | ||
|
|
6286745684 | ||
|
|
4f574f8aa4 | ||
|
|
a3e27248ad | ||
|
|
e48569245d | ||
|
|
473f7a83e6 | ||
|
|
1c622fa848 | ||
|
|
409e650506 | ||
|
|
d461f5474e | ||
|
|
36e731cc2c | ||
|
|
b77fbcb7ad | ||
|
|
7b7dc346ca | ||
|
|
b4f8a02ba6 | ||
|
|
9d6a5d1bb5 | ||
|
|
fa747c5c4b | ||
|
|
bc93f40cdb | ||
|
|
a9975798d7 | ||
|
|
4ea4404aba | ||
|
|
361848b518 | ||
|
|
8c46103f63 | ||
|
|
edcdecb720 | ||
|
|
e1ef02058d | ||
|
|
d9746df16b | ||
|
|
b4c20d9683 | ||
|
|
59955b7414 | ||
|
|
95b1c82ccb | ||
|
|
7cfebbabeb | ||
|
|
f412874c73 | ||
|
|
873c4c6636 | ||
|
|
efcd54be50 | ||
|
|
ae0bb78b1c | ||
|
|
29fa335a27 | ||
|
|
3a84a78cd1 | ||
|
|
df6bb7e6bf | ||
|
|
dfcaebc613 | ||
|
|
1ece35536b | ||
|
|
1a90548622 | ||
|
|
cc7e5bdb80 | ||
|
|
5c73b21ff7 | ||
|
|
e9078107ae | ||
|
|
6c24b18bc1 | ||
|
|
be7ff73142 | ||
|
|
63ac45d369 | ||
|
|
f164a4b786 | ||
|
|
806d601115 | ||
|
|
6b3cf49398 | ||
|
|
b8851565eb | ||
|
|
888d0d1084 | ||
|
|
0a25d4db0d | ||
|
|
4a72f2c6a7 | ||
|
|
446bdd6a5e | ||
|
|
cb26fac2ea | ||
|
|
3a45440c74 | ||
|
|
e115d6e275 | ||
|
|
fc614ccf83 | ||
|
|
17c9db7698 | ||
|
|
d483b6e840 | ||
|
|
032819e812 | ||
|
|
9d7d415756 | ||
|
|
e9d432b4bf | ||
|
|
be35584f9a | ||
|
|
80be4cc6b8 | ||
|
|
c74ba44b91 | ||
|
|
28a79baa01 | ||
|
|
5279601105 | ||
|
|
c2639951a5 | ||
|
|
6bfab1387d | ||
|
|
4212d208fc | ||
|
|
9e5bded4cf | ||
|
|
ce0763f03d | ||
|
|
e860b7aa32 | ||
|
|
0be9310450 | ||
|
|
d870a260e1 | ||
|
|
2de545be1c | ||
|
|
bf04e5a15b | ||
|
|
46d2d7e160 | ||
|
|
1775b22c7a | ||
|
|
ae022b6389 | ||
|
|
d4155102c5 | ||
|
|
3b1a25230f | ||
|
|
d8639793e0 | ||
|
|
06fec88214 | ||
|
|
da93928976 | ||
|
|
2314443d19 | ||
|
|
4b34047324 | ||
|
|
bc1d4de13d | ||
|
|
6bae4c8075 | ||
|
|
84a89fd0ba | ||
|
|
1447fa6f14 | ||
|
|
bc4937f9d2 | ||
|
|
43a7b828d9 | ||
|
|
d611591e1a | ||
|
|
7a2d91e7de | ||
|
|
082ea7b5c1 | ||
|
|
c58414bbc1 | ||
|
|
1c1243912b | ||
|
|
614fc66890 | ||
|
|
0937ef72e2 | ||
|
|
3571023685 | ||
|
|
2cd3e3f9c8 | ||
|
|
3d08f686cf | ||
|
|
d2bf972305 | ||
|
|
39bd236799 | ||
|
|
d8b9d14712 | ||
|
|
9d4127ba6d | ||
|
|
04b678ef4c | ||
|
|
286d7c8228 | ||
|
|
f7a565ec73 | ||
|
|
6b35e909ab | ||
|
|
53b9ce0f3d | ||
|
|
5e1cd7d6ac | ||
|
|
acb98061ce | ||
|
|
979ef6287f | ||
|
|
58a883797d | ||
|
|
f718e87673 | ||
|
|
4c6a742af7 | ||
|
|
848dc51a7a | ||
|
|
44541b66c4 | ||
|
|
3694018441 | ||
|
|
3874e54d76 | ||
|
|
10de141c00 | ||
|
|
806ba320a8 | ||
|
|
09ef24d27d | ||
|
|
236f3cada7 | ||
|
|
c2afef4832 | ||
|
|
b9fa7d70bb | ||
|
|
9ac31f2667 | ||
|
|
639d1befef | ||
|
|
b99c8d5cc1 | ||
|
|
0770398010 | ||
|
|
c3d24451b7 | ||
|
|
4db1a3bdec | ||
|
|
2a0410f597 | ||
|
|
7e79d907be | ||
|
|
c0ea441c59 | ||
|
|
290d134d88 | ||
|
|
517bfd2c9a | ||
|
|
31990a9992 | ||
|
|
151a2c284d | ||
|
|
614a8f177c | ||
|
|
8b5e53e579 | ||
|
|
1ad8b1bf85 | ||
|
|
a393584a2a | ||
|
|
804fc72ed8 | ||
|
|
3f8f05368c | ||
|
|
5a56ba2fd5 | ||
|
|
de7c1329f8 | ||
|
|
6fc5aa0090 | ||
|
|
2eaeccda05 | ||
|
|
56f970ab08 | ||
|
|
d1cb9e4a3f | ||
|
|
992adcab65 | ||
|
|
d3b3a83477 | ||
|
|
98ad371d01 | ||
|
|
3cdae245e1 | ||
|
|
887c78d893 | ||
|
|
e208497d71 | ||
|
|
dd744b4e0d | ||
|
|
647cbc7e7a | ||
|
|
cc93102859 | ||
|
|
5b673e753b | ||
|
|
bd2eb6fdbb | ||
|
|
c25f783980 | ||
|
|
9b37708f0c | ||
|
|
7386bb35e5 | ||
|
|
9274522877 | ||
|
|
1b444686af | ||
|
|
b3dfdacdc3 | ||
|
|
159fab41ce | ||
|
|
093f48f76a | ||
|
|
6998a3593e | ||
|
|
c3250cfd72 | ||
|
|
e52eb9bcb0 | ||
|
|
5ac2892e34 | ||
|
|
a15aab395a | ||
|
|
f991276152 | ||
|
|
1f71ceb611 | ||
|
|
92e14159b9 | ||
|
|
b8419604e5 | ||
|
|
096fd82e64 | ||
|
|
cbaae52a7e | ||
|
|
5905299331 | ||
|
|
2df0763141 | ||
|
|
fb7453f7b0 | ||
|
|
974d20b0ba | ||
|
|
c2f6d9aa07 | ||
|
|
6194386464 | ||
|
|
329ecd6894 | ||
|
|
150f470aee | ||
|
|
83b843f047 | ||
|
|
24043611c3 | ||
|
|
2c99ba64bc | ||
|
|
ffe30bed75 | ||
|
|
b6088f488f | ||
|
|
e04165a184 | ||
|
|
d7aa95ce8e | ||
|
|
28214ec9fb | ||
|
|
28952a5253 | ||
|
|
d66505e5bc | ||
|
|
c4354032b5 | ||
|
|
d23550d3ef | ||
|
|
894ec1e3c1 | ||
|
|
bdb03f8d51 | ||
|
|
61ea27c8f4 | ||
|
|
ac45617d8f | ||
|
|
35853ff988 | ||
|
|
80009f99e8 | ||
|
|
0b1d001c20 | ||
|
|
cb63e88cdc | ||
|
|
a5c7f4221b | ||
|
|
f61010a65e | ||
|
|
b99f5b2cbe | ||
|
|
9919d0cbfa | ||
|
|
fe8099d8d1 | ||
|
|
0da336c8e1 | ||
|
|
37f5d19739 | ||
|
|
2ac0d84cee | ||
|
|
e639961b68 | ||
|
|
adf29b4e6e | ||
|
|
b00cd032a3 | ||
|
|
60e8f46777 | ||
|
|
ef2860770f | ||
|
|
aa562e9c26 | ||
|
|
866ccc1696 | ||
|
|
dbe241dee7 | ||
|
|
bd32a08e11 | ||
|
|
8416dab870 | ||
|
|
6fda669307 | ||
|
|
c21a9223f5 | ||
|
|
4e4e65b462 | ||
|
|
5e07231d78 | ||
|
|
d71d1ce8b4 | ||
|
|
892e84deaa | ||
|
|
7a73af0299 | ||
|
|
65dae511e5 | ||
|
|
55c70b404c | ||
|
|
8117586548 | ||
|
|
3ce9c7ba3d | ||
|
|
ab162efab8 | ||
|
|
babfc3cfb9 | ||
|
|
3d780d7d02 | ||
|
|
5b81aff8be | ||
|
|
86b14a5763 | ||
|
|
14a2794d15 | ||
|
|
eef68aca0f | ||
|
|
f6f7445528 | ||
|
|
f7c0184a6b | ||
|
|
65bc599a16 | ||
|
|
b445bef74c | ||
|
|
93d7ba032d | ||
|
|
334e2c3949 | ||
|
|
a11797fe6e | ||
|
|
3cf0ec5740 | ||
|
|
40f578f43f | ||
|
|
428abb4591 | ||
|
|
4954fa89b5 | ||
|
|
10f7837a7f | ||
|
|
fca310cc31 | ||
|
|
cf58b511df | ||
|
|
9da1f52a71 | ||
|
|
5c8e674ddb | ||
|
|
f027b25bc2 | ||
|
|
cfe71a3426 | ||
|
|
70afb636ca | ||
|
|
818efe7fb0 | ||
|
|
3c2263db86 | ||
|
|
7c30bc9c72 | ||
|
|
ec8d719d41 | ||
|
|
5f884c4440 | ||
|
|
e6c806d462 | ||
|
|
4afceeca79 | ||
|
|
7990c60ce7 | ||
|
|
74c248bce2 | ||
|
|
2df646f80c | ||
|
|
768260782a | ||
|
|
4eff105af5 | ||
|
|
68ef6ea142 | ||
|
|
772d4ac5a1 | ||
|
|
b3e1a79d40 | ||
|
|
d7afa8526d | ||
|
|
b4a2a6c12b | ||
|
|
32c15f5e03 | ||
|
|
b5a491820c | ||
|
|
8a477c87e0 | ||
|
|
8bcae8cdb8 | ||
|
|
ea87161a91 | ||
|
|
f2bb6cb848 | ||
|
|
fecb677552 | ||
|
|
3ba9b56833 | ||
|
|
a329e7d72a | ||
|
|
2568f6bb53 | ||
|
|
23936596fa | ||
|
|
398db56fe7 | ||
|
|
423ef14ca6 | ||
|
|
9921d3e0a7 | ||
|
|
ac22fd8d60 | ||
|
|
ff065964e9 | ||
|
|
951dda50ac | ||
|
|
01bd2f1815 | ||
|
|
570f8fd155 | ||
|
|
5d348e3ad6 | ||
|
|
9573346d55 | ||
|
|
e4570a1bb0 | ||
|
|
b884aba244 | ||
|
|
9c73908560 | ||
|
|
b399d292a9 | ||
|
|
a557d9770f | ||
|
|
a11ebfeb42 | ||
|
|
4695c3726d | ||
|
|
324f79ceb9 | ||
|
|
fc5e459895 | ||
|
|
bdaba67859 | ||
|
|
2b01e2fdaf | ||
|
|
9967da6ea1 | ||
|
|
a56a00ba2f | ||
|
|
82df26031f | ||
|
|
b4af8e7339 | ||
|
|
e6180f427b | ||
|
|
9a95ec170d | ||
|
|
5547c3fc2b | ||
|
|
4381399978 | ||
|
|
5bfa0d13e3 | ||
|
|
5c21759de9 | ||
|
|
e2ef58ed50 | ||
|
|
7af610a5b4 | ||
|
|
8a442ba492 | ||
|
|
3ed399a888 | ||
|
|
37d33fb975 | ||
|
|
d443d79685 | ||
|
|
a975576214 | ||
|
|
3673162a48 | ||
|
|
0ac428b57a | ||
|
|
45bd9b72b9 | ||
|
|
cc6ac7d1da | ||
|
|
232fe4e63a | ||
|
|
597426f10d | ||
|
|
a0a904766f | ||
|
|
7be0507db5 | ||
|
|
1d324ab3b0 | ||
|
|
9e00ed7e14 | ||
|
|
02a6652b44 | ||
|
|
e19f7b286a | ||
|
|
50301a97f3 | ||
|
|
408e31079c | ||
|
|
bf81e159ca | ||
|
|
b1f89296ff | ||
|
|
1948302a64 | ||
|
|
187585b32f | ||
|
|
d351fd506a | ||
|
|
1cf29c985e | ||
|
|
04374540ad | ||
|
|
ce8f3a4f8f | ||
|
|
acb21b992d | ||
|
|
15f344fe4a | ||
|
|
120324c3f0 | ||
|
|
59ce8b912d | ||
|
|
619888847b | ||
|
|
06b782e91d | ||
|
|
1d7e0a193a | ||
|
|
2d815852e4 | ||
|
|
735a7104f1 | ||
|
|
e3e4772aab | ||
|
|
8bb65b94d0 | ||
|
|
b9edae4fc9 | ||
|
|
27aae18345 | ||
|
|
47db63d909 | ||
|
|
8ebeead32c | ||
|
|
09d43e710f | ||
|
|
7240f64a49 | ||
|
|
ab868d76db | ||
|
|
acdaf6a636 | ||
|
|
6dccef1689 | ||
|
|
f7ec726b15 | ||
|
|
781570f950 | ||
|
|
7774d41457 | ||
|
|
29c8bcaf6e | ||
|
|
2b3ae94f8d | ||
|
|
5c618abc79 | ||
|
|
220cf8aedd | ||
|
|
78f16ddc12 | ||
|
|
0048e95e0c | ||
|
|
db46ca0a76 | ||
|
|
a26ee0d769 | ||
|
|
46db047fa0 | ||
|
|
efaa1815ec | ||
|
|
2eab8b92d5 | ||
|
|
8a185262fb | ||
|
|
f6631b7b9a | ||
|
|
1e323de01b | ||
|
|
f00f2ee5e4 | ||
|
|
78b83cd17b | ||
|
|
adea3abff4 | ||
|
|
206618fd54 | ||
|
|
58a6d70cbb | ||
|
|
44b92a024c | ||
|
|
68bf5b7e68 | ||
|
|
8c85aa343c | ||
|
|
592a8b2232 | ||
|
|
e1ac319a7b | ||
|
|
763c489cd3 | ||
|
|
b990770e48 | ||
|
|
344607d437 | ||
|
|
70d0a5441a | ||
|
|
61278e1f5a | ||
|
|
b73ea6ac4f | ||
|
|
5d833c1ac4 | ||
|
|
2947682783 | ||
|
|
fb46e09428 | ||
|
|
ff941b2cb1 | ||
|
|
a8007b9063 | ||
|
|
2f3c2bbac8 | ||
|
|
e4eb96a1ae | ||
|
|
ffe4e9b8de | ||
|
|
f2b4f49be2 | ||
|
|
376ef0c679 | ||
|
|
b7574b3ca7 | ||
|
|
ae1954c320 | ||
|
|
3171413a18 | ||
|
|
dc73467d34 | ||
|
|
58b14ae31c | ||
|
|
e117fbd471 | ||
|
|
9a3f675950 | ||
|
|
26400f2590 | ||
|
|
7d99a92bd9 | ||
|
|
3417e37f16 | ||
|
|
143e6a556c | ||
|
|
02259c55f3 | ||
|
|
cc19a217ad | ||
|
|
d95ed4a5d2 | ||
|
|
469683f30f | ||
|
|
42d0cc12b5 | ||
|
|
b376842e2d | ||
|
|
145ff1a2a5 | ||
|
|
8e9f5fb486 | ||
|
|
3dd757a857 | ||
|
|
bde7b753a0 | ||
|
|
02017ebd9d | ||
|
|
8caaa99415 | ||
|
|
c49b90d33f | ||
|
|
6dd939df14 | ||
|
|
b19da81572 | ||
|
|
425ffc02d8 | ||
|
|
695e8489ad | ||
|
|
2f4e13b1bb | ||
|
|
c8a9b994d6 | ||
|
|
3d5b319eb2 | ||
|
|
bed3c2dc67 | ||
|
|
256d1863d2 | ||
|
|
4a4502dfea | ||
|
|
91f21e149b | ||
|
|
6ef468adc4 | ||
|
|
e576fa03da | ||
|
|
6bcce08042 | ||
|
|
f496caa92c | ||
|
|
43dcdf8925 | ||
|
|
2c014fb071 | ||
|
|
2273507ef4 | ||
|
|
70a710be79 | ||
|
|
7a3ee7971c | ||
|
|
c86123e3a9 | ||
|
|
9480227b69 | ||
|
|
79be13e6c7 | ||
|
|
63e3a27b34 | ||
|
|
9eae6620d0 | ||
|
|
6517dd1190 | ||
|
|
f72087acc3 | ||
|
|
77e7c414b6 | ||
|
|
3a68395ca7 | ||
|
|
0a0d9775b2 | ||
|
|
aa6e68ad39 | ||
|
|
034073a5e1 | ||
|
|
d83ff641d7 | ||
|
|
071fcb85c9 | ||
|
|
daa5ee93e9 | ||
|
|
db7cda3fe6 | ||
|
|
fa55c5720e | ||
|
|
d1a9890932 | ||
|
|
c9fe358811 | ||
|
|
bbb927c83f | ||
|
|
07b86c8cf7 | ||
|
|
3dbf20af52 | ||
|
|
1fb329565f | ||
|
|
06bfb0073a | ||
|
|
3d64c320fb |
103
.github/actions/deploy-to-cloudflare-pages/action.yml
vendored
Normal file
103
.github/actions/deploy-to-cloudflare-pages/action.yml
vendored
Normal file
@@ -0,0 +1,103 @@
|
||||
name: "Deploy to Cloudflare Pages"
|
||||
description: "Deploys to Cloudflare Pages on either a temporary branch with preview comment, or on the production version if on the main branch."
|
||||
inputs:
|
||||
project_name:
|
||||
description: "CloudFlare Pages project name"
|
||||
comment_body:
|
||||
description: "The message to display when deployment is ready"
|
||||
default: "Deployment is ready."
|
||||
required: false
|
||||
production_url:
|
||||
description: "The URL to mention as the production URL."
|
||||
required: true
|
||||
deploy_dir:
|
||||
description: "The directory from which to deploy."
|
||||
required: true
|
||||
cloudflare_api_token:
|
||||
description: "The Cloudflare API token to use for deployment."
|
||||
required: true
|
||||
cloudflare_account_id:
|
||||
description: "The Cloudflare account ID to use for deployment."
|
||||
required: true
|
||||
github_token:
|
||||
description: "The GitHub token to use for posting PR comments."
|
||||
required: true
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
# Install wrangler globally to avoid workspace issues
|
||||
- name: Install Wrangler
|
||||
shell: bash
|
||||
run: npm install -g wrangler
|
||||
|
||||
# Deploy using Wrangler (use pre-installed wrangler)
|
||||
- name: Deploy to Cloudflare Pages
|
||||
id: deploy
|
||||
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
|
||||
uses: cloudflare/wrangler-action@v3
|
||||
with:
|
||||
apiToken: ${{ inputs.cloudflare_api_token }}
|
||||
accountId: ${{ inputs.cloudflare_account_id }}
|
||||
command: pages deploy ${{ inputs.deploy_dir }} --project-name=${{ inputs.project_name}} --branch=${{ github.ref_name }}
|
||||
wranglerVersion: '' # Use pre-installed version
|
||||
|
||||
# Deploy preview for PRs
|
||||
- name: Deploy Preview to Cloudflare Pages
|
||||
id: preview-deployment
|
||||
if: github.event_name == 'pull_request'
|
||||
uses: cloudflare/wrangler-action@v3
|
||||
with:
|
||||
apiToken: ${{ inputs.cloudflare_api_token }}
|
||||
accountId: ${{ inputs.cloudflare_account_id }}
|
||||
command: pages deploy ${{ inputs.deploy_dir }} --project-name=${{ inputs.project_name}} --branch=pr-${{ github.event.pull_request.number }}
|
||||
wranglerVersion: '' # Use pre-installed version
|
||||
|
||||
# Post deployment URL as PR comment
|
||||
- name: Comment PR with Preview URL
|
||||
if: github.event_name == 'pull_request'
|
||||
uses: actions/github-script@v8
|
||||
env:
|
||||
COMMENT_BODY: ${{ inputs.comment_body }}
|
||||
PRODUCTION_URL: ${{ inputs.production_url }}
|
||||
PROJECT_NAME: ${{ inputs.project_name }}
|
||||
with:
|
||||
github-token: ${{ inputs.github_token }}
|
||||
script: |
|
||||
const prNumber = context.issue.number;
|
||||
// Construct preview URL based on Cloudflare Pages pattern
|
||||
const projectName = process.env.PROJECT_NAME;
|
||||
const previewUrl = `https://pr-${prNumber}.${projectName}.pages.dev`;
|
||||
|
||||
// Check if we already commented
|
||||
const comments = await github.rest.issues.listComments({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: prNumber
|
||||
});
|
||||
|
||||
const customMessage = process.env.COMMENT_BODY;
|
||||
const botComment = comments.data.find(comment =>
|
||||
comment.user.type === 'Bot' &&
|
||||
comment.body.includes(customMessage)
|
||||
);
|
||||
|
||||
const mainUrl = process.env.PRODUCTION_URL;
|
||||
const commentBody = `${customMessage}!\n\n🔗 Preview URL: ${previewUrl}\n📖 Production URL: ${mainUrl}\n\n✅ All checks passed\n\n_This preview will be updated automatically with new commits._`;
|
||||
|
||||
if (botComment) {
|
||||
// Update existing comment
|
||||
await github.rest.issues.updateComment({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
comment_id: botComment.id,
|
||||
body: commentBody
|
||||
});
|
||||
} else {
|
||||
// Create new comment
|
||||
await github.rest.issues.createComment({
|
||||
issue_number: prNumber,
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
body: commentBody
|
||||
});
|
||||
}
|
||||
2
.github/workflows/checks.yml
vendored
2
.github/workflows/checks.yml
vendored
@@ -12,7 +12,7 @@ jobs:
|
||||
steps:
|
||||
- name: Check if PRs have conflicts
|
||||
uses: eps1lon/actions-label-merge-conflict@v3
|
||||
if: github.repository == ${{ vars.REPO_MAIN }}
|
||||
if: github.repository == ${{ vars.REPO_MAIN }} && ${{secrets.MERGE_CONFLICT_LABEL_PAT}}
|
||||
with:
|
||||
dirtyLabel: "merge-conflicts"
|
||||
repoToken: "${{ secrets.MERGE_CONFLICT_LABEL_PAT }}"
|
||||
|
||||
4
.github/workflows/codeql.yml
vendored
4
.github/workflows/codeql.yml
vendored
@@ -67,7 +67,7 @@ jobs:
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v3
|
||||
uses: github/codeql-action/init@v4
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
build-mode: ${{ matrix.build-mode }}
|
||||
@@ -95,6 +95,6 @@ jobs:
|
||||
exit 1
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v3
|
||||
uses: github/codeql-action/analyze@v4
|
||||
with:
|
||||
category: "/language:${{matrix.language}}"
|
||||
|
||||
105
.github/workflows/deploy-docs.yml
vendored
105
.github/workflows/deploy-docs.yml
vendored
@@ -16,10 +16,10 @@ on:
|
||||
- 'requirements-docs.txt'
|
||||
- '.github/workflows/deploy-docs.yml'
|
||||
- 'scripts/fix-mkdocs-structure.ts'
|
||||
|
||||
|
||||
# Allow manual triggering from Actions tab
|
||||
workflow_dispatch:
|
||||
|
||||
|
||||
# Run on pull requests for preview deployments
|
||||
pull_request:
|
||||
branches:
|
||||
@@ -38,55 +38,55 @@ jobs:
|
||||
name: Build and Deploy MkDocs
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
|
||||
|
||||
# Required permissions for deployment
|
||||
permissions:
|
||||
contents: read
|
||||
deployments: write
|
||||
pull-requests: write # For PR preview comments
|
||||
id-token: write # For OIDC authentication (if needed)
|
||||
|
||||
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0 # Fetch all history for git info and mkdocs-git-revision-date plugin
|
||||
|
||||
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: '3.13'
|
||||
python-version: '3.14'
|
||||
cache: 'pip'
|
||||
cache-dependency-path: 'requirements-docs.txt'
|
||||
|
||||
|
||||
- name: Install MkDocs and Dependencies
|
||||
run: |
|
||||
pip install --upgrade pip
|
||||
pip install -r requirements-docs.txt
|
||||
env:
|
||||
PIP_DISABLE_PIP_VERSION_CHECK: 1
|
||||
|
||||
|
||||
# Setup pnpm before fixing docs structure
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
|
||||
|
||||
# Setup Node.js with pnpm
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v5
|
||||
with:
|
||||
node-version: '22'
|
||||
cache: 'pnpm'
|
||||
|
||||
|
||||
# Install Node.js dependencies for the TypeScript script
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
pnpm install --frozen-lockfile
|
||||
|
||||
|
||||
- name: Fix Documentation Structure
|
||||
run: |
|
||||
# Fix duplicate navigation entries by moving overview pages to index.md
|
||||
pnpm run chore:fix-mkdocs-structure
|
||||
|
||||
|
||||
- name: Build MkDocs Site
|
||||
run: |
|
||||
# Build with strict mode but allow expected warnings
|
||||
@@ -115,74 +115,15 @@ jobs:
|
||||
test -f site/sitemap.xml || (echo "ERROR: site/sitemap.xml not found" && exit 1)
|
||||
test -d site/assets || (echo "ERROR: site/assets directory not found" && exit 1)
|
||||
echo "✅ Site validation passed"
|
||||
|
||||
# Install wrangler globally to avoid workspace issues
|
||||
- name: Install Wrangler
|
||||
run: |
|
||||
npm install -g wrangler
|
||||
|
||||
# Deploy using Wrangler (use pre-installed wrangler)
|
||||
- name: Deploy to Cloudflare Pages
|
||||
id: deploy
|
||||
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
|
||||
uses: cloudflare/wrangler-action@v3
|
||||
|
||||
- name: Deploy
|
||||
uses: ./.github/actions/deploy-to-cloudflare-pages
|
||||
if: github.repository == ${{ vars.REPO_MAIN }} && ${{secrets.CLOUDFLARE_API_TOKEN}}
|
||||
with:
|
||||
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||
command: pages deploy site --project-name=trilium-docs --branch=${{ github.ref_name }}
|
||||
wranglerVersion: '' # Use pre-installed version
|
||||
|
||||
# Deploy preview for PRs
|
||||
- name: Deploy Preview to Cloudflare Pages
|
||||
id: preview-deployment
|
||||
if: github.event_name == 'pull_request'
|
||||
uses: cloudflare/wrangler-action@v3
|
||||
with:
|
||||
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||
command: pages deploy site --project-name=trilium-docs --branch=pr-${{ github.event.pull_request.number }}
|
||||
wranglerVersion: '' # Use pre-installed version
|
||||
|
||||
# Post deployment URL as PR comment
|
||||
- name: Comment PR with Preview URL
|
||||
if: github.event_name == 'pull_request'
|
||||
uses: actions/github-script@v8
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
script: |
|
||||
const prNumber = context.issue.number;
|
||||
// Construct preview URL based on Cloudflare Pages pattern
|
||||
const previewUrl = `https://pr-${prNumber}.trilium-docs.pages.dev`;
|
||||
const mainUrl = 'https://docs.triliumnotes.org';
|
||||
|
||||
// Check if we already commented
|
||||
const comments = await github.rest.issues.listComments({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: prNumber
|
||||
});
|
||||
|
||||
const botComment = comments.data.find(comment =>
|
||||
comment.user.type === 'Bot' &&
|
||||
comment.body.includes('Documentation preview is ready')
|
||||
);
|
||||
|
||||
const commentBody = `📚 Documentation preview is ready!\n\n🔗 Preview URL: ${previewUrl}\n📖 Production URL: ${mainUrl}\n\n✅ All checks passed\n\n_This preview will be updated automatically with new commits._`;
|
||||
|
||||
if (botComment) {
|
||||
// Update existing comment
|
||||
await github.rest.issues.updateComment({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
comment_id: botComment.id,
|
||||
body: commentBody
|
||||
});
|
||||
} else {
|
||||
// Create new comment
|
||||
await github.rest.issues.createComment({
|
||||
issue_number: prNumber,
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
body: commentBody
|
||||
});
|
||||
}
|
||||
project_name: "trilium-docs"
|
||||
comment_body: "📚 Documentation preview is ready"
|
||||
production_url: "https://docs.triliumnotes.org"
|
||||
deploy_dir: "site"
|
||||
cloudflare_api_token: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||
cloudflare_account_id: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
5
.github/workflows/nightly.yml
vendored
5
.github/workflows/nightly.yml
vendored
@@ -19,7 +19,6 @@ concurrency:
|
||||
cancel-in-progress: true
|
||||
|
||||
env:
|
||||
GITHUB_UPLOAD_URL: https://uploads.github.com/repos/TriliumNext/Notes/releases/179589950/assets{?name,label}
|
||||
GITHUB_RELEASE_ID: 179589950
|
||||
|
||||
permissions:
|
||||
@@ -78,7 +77,7 @@ jobs:
|
||||
GPG_SIGNING_KEY: ${{ secrets.GPG_SIGN_KEY }}
|
||||
|
||||
- name: Publish release
|
||||
uses: softprops/action-gh-release@v2.3.3
|
||||
uses: softprops/action-gh-release@v2.4.0
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
with:
|
||||
make_latest: false
|
||||
@@ -119,7 +118,7 @@ jobs:
|
||||
arch: ${{ matrix.arch }}
|
||||
|
||||
- name: Publish release
|
||||
uses: softprops/action-gh-release@v2.3.3
|
||||
uses: softprops/action-gh-release@v2.4.0
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
with:
|
||||
make_latest: false
|
||||
|
||||
2
.github/workflows/playwright.yml
vendored
2
.github/workflows/playwright.yml
vendored
@@ -4,6 +4,8 @@ on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths-ignore:
|
||||
- "apps/website/**"
|
||||
pull_request:
|
||||
|
||||
permissions:
|
||||
|
||||
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
@@ -127,7 +127,7 @@ jobs:
|
||||
path: upload
|
||||
|
||||
- name: Publish stable release
|
||||
uses: softprops/action-gh-release@v2.3.3
|
||||
uses: softprops/action-gh-release@v2.4.0
|
||||
with:
|
||||
draft: false
|
||||
body_path: docs/Release Notes/Release Notes/${{ github.ref_name }}.md
|
||||
|
||||
51
.github/workflows/website.yml
vendored
Normal file
51
.github/workflows/website.yml
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
name: Deploy website
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- "apps/website/**"
|
||||
|
||||
pull_request:
|
||||
paths:
|
||||
- "apps/website/**"
|
||||
|
||||
release:
|
||||
types: [ released ]
|
||||
|
||||
jobs:
|
||||
build-and-deploy:
|
||||
runs-on: ubuntu-latest
|
||||
name: Build & deploy website
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
deployments: write
|
||||
pull-requests: write # For PR preview comments
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Set up node & dependencies
|
||||
uses: actions/setup-node@v5
|
||||
with:
|
||||
node-version: 22
|
||||
cache: "pnpm"
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm install --filter website --frozen-lockfile
|
||||
|
||||
- name: Build the website
|
||||
run: pnpm website:build
|
||||
|
||||
- name: Deploy
|
||||
uses: ./.github/actions/deploy-to-cloudflare-pages
|
||||
with:
|
||||
project_name: "trilium-homepage"
|
||||
comment_body: "📚 Website preview is ready"
|
||||
production_url: "https://triliumnotes.org"
|
||||
deploy_dir: "apps/website/dist"
|
||||
cloudflare_api_token: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||
cloudflare_account_id: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
34
README.md
34
README.md
@@ -5,7 +5,7 @@
|
||||

|
||||
[](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) [](https://hosted.weblate.org/engage/trilium/)
|
||||
|
||||
[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | [Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README.ru.md) | [Japanese](./docs/README.ja.md) | [Italian](./docs/README.it.md) | [Spanish](./docs/README.es.md)
|
||||
[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | [Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) | [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | [Spanish](./docs/README-es.md)
|
||||
|
||||
Trilium Notes is a free and open-source, cross-platform hierarchical note taking application with focus on building large personal knowledge bases.
|
||||
|
||||
@@ -166,16 +166,34 @@ Please view the [documentation guide](https://github.com/TriliumNext/Trilium/blo
|
||||
|
||||
## 👏 Shoutouts
|
||||
|
||||
* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - best WYSIWYG editor on the market, very interactive and listening team
|
||||
* [FancyTree](https://github.com/mar10/fancytree) - very feature rich tree library without real competition. Trilium Notes would not be the same without it.
|
||||
* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with support for huge amount of languages
|
||||
* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library without competition. Used in [relation maps](https://triliumnext.github.io/Docs/Wiki/relation-map.html) and [link maps](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map)
|
||||
* [zadam](https://github.com/zadam) for the original concept and implementation of the application.
|
||||
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the application icon.
|
||||
* [nriver](https://github.com/nriver) for his work on internationalization.
|
||||
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
|
||||
* [antoniotejada](https://github.com/nriver) for the original syntax highlight widget.
|
||||
* [Dosu](https://dosu.dev/) for providing us with the automated responses to GitHub issues and discussions.
|
||||
* [Tabler Icons](https://tabler.io/icons) for the system tray icons.
|
||||
|
||||
Trilium would not be possible without the technologies behind it:
|
||||
|
||||
* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind text notes. We are grateful for being offered a set of the premium features.
|
||||
* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with support for huge amount of languages.
|
||||
* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite whiteboard used in Canvas notes.
|
||||
* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the mind map functionality.
|
||||
* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical maps.
|
||||
* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive table used in collections.
|
||||
* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library without real competition.
|
||||
* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. Used in [relation maps](https://triliumnext.github.io/Docs/Wiki/relation-map.html) and [link maps](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map)
|
||||
|
||||
## 🤝 Support
|
||||
|
||||
Support for the TriliumNext organization will be possible in the near future. For now, you can:
|
||||
- Support continued development on TriliumNext by supporting our developers: [eliandoran](https://github.com/sponsors/eliandoran) (See the [repository insights]([developers]([url](https://github.com/TriliumNext/trilium/graphs/contributors))) for a full list)
|
||||
- Show a token of gratitude to the original Trilium developer ([zadam](https://github.com/sponsors/zadam)) via [PayPal](https://paypal.me/za4am) or Bitcoin (bitcoin:bc1qv3svjn40v89mnkre5vyvs2xw6y8phaltl385d2).
|
||||
Trilium is built and maintained with [hundreds of hours of work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your support keeps it open-source, improves features, and covers costs such as hosting.
|
||||
|
||||
Consider supporting the main developer ([eliandoran](https://github.com/eliandoran)) of the application via:
|
||||
|
||||
- [GitHub Sponsors](https://github.com/sponsors/eliandoran)
|
||||
- [PayPal](https://paypal.me/eliandoran)
|
||||
- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran)
|
||||
|
||||
|
||||
## 🔑 License
|
||||
|
||||
@@ -35,16 +35,16 @@
|
||||
"chore:generate-openapi": "tsx bin/generate-openapi.js"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@playwright/test": "1.55.0",
|
||||
"@playwright/test": "1.56.0",
|
||||
"@stylistic/eslint-plugin": "5.4.0",
|
||||
"@types/express": "5.0.3",
|
||||
"@types/node": "22.18.6",
|
||||
"@types/node": "22.18.9",
|
||||
"@types/yargs": "17.0.33",
|
||||
"@vitest/coverage-v8": "3.2.4",
|
||||
"eslint": "9.36.0",
|
||||
"eslint": "9.37.0",
|
||||
"eslint-plugin-simple-import-sort": "12.1.1",
|
||||
"esm": "3.2.25",
|
||||
"jsdoc": "4.0.4",
|
||||
"jsdoc": "4.0.5",
|
||||
"lorem-ipsum": "2.0.8",
|
||||
"rcedit": "4.0.1",
|
||||
"rimraf": "6.0.1",
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
{
|
||||
"name": "@triliumnext/client",
|
||||
"version": "0.99.0",
|
||||
"version": "0.99.1",
|
||||
"description": "JQuery-based client for TriliumNext, used for both web and desktop (via Electron)",
|
||||
"private": true,
|
||||
"license": "AGPL-3.0-only",
|
||||
"author": {
|
||||
"name": "Trilium Notes Team",
|
||||
"email": "contact@eliandoran.me",
|
||||
"url": "https://github.com/TriliumNext/Notes"
|
||||
"url": "https://github.com/TriliumNext/Trilium"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "cross-env NODE_OPTIONS=--max-old-space-size=4096 vite build",
|
||||
@@ -15,7 +15,7 @@
|
||||
"circular-deps": "dpdm -T src/**/*.ts --tree=false --warning=false --skip-dynamic-imports=circular"
|
||||
},
|
||||
"dependencies": {
|
||||
"@eslint/js": "9.36.0",
|
||||
"@eslint/js": "9.37.0",
|
||||
"@excalidraw/excalidraw": "0.18.0",
|
||||
"@fullcalendar/core": "6.1.19",
|
||||
"@fullcalendar/daygrid": "6.1.19",
|
||||
@@ -41,23 +41,23 @@
|
||||
"draggabilly": "3.0.0",
|
||||
"force-graph": "1.51.0",
|
||||
"globals": "16.4.0",
|
||||
"i18next": "25.5.2",
|
||||
"i18next": "25.5.3",
|
||||
"i18next-http-backend": "3.0.2",
|
||||
"jquery": "3.7.1",
|
||||
"jquery.fancytree": "2.38.5",
|
||||
"jsplumb": "2.15.6",
|
||||
"katex": "0.16.22",
|
||||
"katex": "0.16.23",
|
||||
"knockout": "3.5.1",
|
||||
"leaflet": "1.9.4",
|
||||
"leaflet-gpx": "2.2.0",
|
||||
"mark.js": "8.11.1",
|
||||
"marked": "16.3.0",
|
||||
"marked": "16.4.0",
|
||||
"mermaid": "11.12.0",
|
||||
"mind-elixir": "5.2.0",
|
||||
"mind-elixir": "5.3.2",
|
||||
"normalize.css": "8.0.1",
|
||||
"panzoom": "9.4.3",
|
||||
"preact": "10.27.2",
|
||||
"react-i18next": "15.7.3",
|
||||
"react-i18next": "16.0.0",
|
||||
"split.js": "1.6.5",
|
||||
"svg-pan-zoom": "3.6.2",
|
||||
"tabulator-tables": "6.3.1",
|
||||
@@ -73,8 +73,8 @@
|
||||
"@types/mark.js": "8.11.12",
|
||||
"@types/tabulator-tables": "6.2.11",
|
||||
"copy-webpack-plugin": "13.0.1",
|
||||
"happy-dom": "18.0.1",
|
||||
"happy-dom": "20.0.0",
|
||||
"script-loader": "0.7.2",
|
||||
"vite-plugin-static-copy": "3.1.2"
|
||||
"vite-plugin-static-copy": "3.1.3"
|
||||
}
|
||||
}
|
||||
@@ -13,7 +13,6 @@ 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 NoteDetailWidget from "../widgets/note_detail.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";
|
||||
@@ -21,8 +20,6 @@ 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 TypeWidget from "../widgets/type_widgets/type_widget.js";
|
||||
import type EditableTextTypeWidget from "../widgets/type_widgets/editable_text.js";
|
||||
import type { NativeImage, TouchBar } from "electron";
|
||||
import TouchBarComponent from "./touch_bar.js";
|
||||
import type { CKTextEditor } from "@triliumnext/ckeditor5";
|
||||
@@ -33,6 +30,10 @@ 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 { ReactWrappedWidget } from "../widgets/basic_widget.js";
|
||||
import { TypeWidget } from "../widgets/note_types.jsx";
|
||||
|
||||
interface Layout {
|
||||
getRootWidget: (appContext: AppContext) => RootContainer;
|
||||
@@ -199,7 +200,7 @@ export type CommandMappings = {
|
||||
resetLauncher: ContextMenuCommandData;
|
||||
|
||||
executeInActiveNoteDetailWidget: CommandData & {
|
||||
callback: (value: NoteDetailWidget | PromiseLike<NoteDetailWidget>) => void;
|
||||
callback: (value: ReactWrappedWidget) => void;
|
||||
};
|
||||
executeWithTextEditor: CommandData &
|
||||
ExecuteCommandData<CKTextEditor> & {
|
||||
@@ -211,7 +212,7 @@ export type CommandMappings = {
|
||||
* Generally should not be invoked manually, as it is used by {@link NoteContext.getContentElement}.
|
||||
*/
|
||||
executeWithContentElement: CommandData & ExecuteCommandData<JQuery<HTMLElement>>;
|
||||
executeWithTypeWidget: CommandData & ExecuteCommandData<TypeWidget | null>;
|
||||
executeWithTypeWidget: CommandData & ExecuteCommandData<ReactWrappedWidget | null>;
|
||||
addTextToActiveEditor: CommandData & {
|
||||
text: string;
|
||||
};
|
||||
@@ -222,8 +223,8 @@ export type CommandMappings = {
|
||||
showPasswordNotSet: CommandData;
|
||||
showProtectedSessionPasswordDialog: CommandData;
|
||||
showUploadAttachmentsDialog: CommandData & { noteId: string };
|
||||
showIncludeNoteDialog: CommandData & { textTypeWidget: EditableTextTypeWidget };
|
||||
showAddLinkDialog: CommandData & { textTypeWidget: EditableTextTypeWidget, text: string };
|
||||
showIncludeNoteDialog: CommandData & IncludeNoteOpts;
|
||||
showAddLinkDialog: CommandData & AddLinkOpts;
|
||||
closeProtectedSessionPasswordDialog: CommandData;
|
||||
copyImageReferenceToClipboard: CommandData;
|
||||
copyImageToClipboard: CommandData;
|
||||
@@ -484,13 +485,8 @@ type EventMappings = {
|
||||
relationMapResetZoomIn: { ntxId: string | null | undefined };
|
||||
relationMapResetZoomOut: { ntxId: string | null | undefined };
|
||||
activeNoteChanged: {};
|
||||
showAddLinkDialog: {
|
||||
textTypeWidget: EditableTextTypeWidget;
|
||||
text: string;
|
||||
};
|
||||
showIncludeDialog: {
|
||||
textTypeWidget: EditableTextTypeWidget;
|
||||
};
|
||||
showAddLinkDialog: AddLinkOpts;
|
||||
showIncludeDialog: IncludeNoteOpts;
|
||||
openBulkActionsDialog: {
|
||||
selectedOrActiveNoteIds: string[];
|
||||
};
|
||||
@@ -665,6 +661,10 @@ export class AppContext extends Component {
|
||||
this.beforeUnloadListeners.push(obj);
|
||||
}
|
||||
}
|
||||
|
||||
removeBeforeUnloadListener(listener: (() => boolean)) {
|
||||
this.beforeUnloadListeners = this.beforeUnloadListeners.filter(l => l === listener);
|
||||
}
|
||||
}
|
||||
|
||||
const appContext = new AppContext(window.glob.isMainWindow);
|
||||
|
||||
@@ -165,6 +165,7 @@ export default class Entrypoints extends Component {
|
||||
return;
|
||||
}
|
||||
const { ntxId, note } = noteContext;
|
||||
console.log("Run active note");
|
||||
|
||||
// ctrl+enter is also used elsewhere, so make sure we're running only when appropriate
|
||||
if (!note || note.type !== "code") {
|
||||
|
||||
@@ -9,10 +9,11 @@ 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 TypeWidget from "../widgets/type_widgets/type_widget.js";
|
||||
import type { CKTextEditor } from "@triliumnext/ckeditor5";
|
||||
import type CodeMirror from "@triliumnext/codemirror";
|
||||
import { closeActiveDialog } from "../services/dialog.js";
|
||||
import { TypeWidget } from "../widgets/note_types.jsx";
|
||||
import { ReactWrappedWidget } from "../widgets/basic_widget.js";
|
||||
|
||||
export interface SetNoteOpts {
|
||||
triggerSwitchEvent?: unknown;
|
||||
@@ -395,7 +396,7 @@ class NoteContext extends Component implements EventListener<"entitiesReloaded">
|
||||
|
||||
async getTypeWidget() {
|
||||
return this.timeout(
|
||||
new Promise<TypeWidget | null>((resolve) =>
|
||||
new Promise<ReactWrappedWidget | null>((resolve) =>
|
||||
appContext.triggerCommand("executeWithTypeWidget", {
|
||||
resolve,
|
||||
ntxId: this.ntxId
|
||||
|
||||
@@ -10,7 +10,6 @@ import { t } from "./services/i18n.js";
|
||||
import options from "./services/options.js";
|
||||
import type ElectronRemote from "@electron/remote";
|
||||
import type Electron from "electron";
|
||||
import "bootstrap/dist/css/bootstrap.min.css";
|
||||
import "boxicons/css/boxicons.min.css";
|
||||
import "autocomplete.js/index_jquery.js";
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@ import TabRowWidget from "../widgets/tab_row.js";
|
||||
import LeftPaneContainer from "../widgets/containers/left_pane_container.js";
|
||||
import NoteTreeWidget from "../widgets/note_tree.js";
|
||||
import NoteTitleWidget from "../widgets/note_title.jsx";
|
||||
import NoteDetailWidget from "../widgets/note_detail.js";
|
||||
import PromotedAttributesWidget from "../widgets/promoted_attributes.js";
|
||||
import NoteIconWidget from "../widgets/note_icon.jsx";
|
||||
import ScrollingContainer from "../widgets/containers/scrolling_container.js";
|
||||
@@ -42,6 +41,7 @@ import ApiLog from "../widgets/api_log.jsx";
|
||||
import CloseZenModeButton from "../widgets/close_zen_button.jsx";
|
||||
import SharedInfo from "../widgets/shared_info.jsx";
|
||||
import NoteList from "../widgets/collections/NoteList.jsx";
|
||||
import NoteDetail from "../widgets/NoteDetail.jsx";
|
||||
|
||||
export default class DesktopLayout {
|
||||
|
||||
@@ -137,7 +137,7 @@ export default class DesktopLayout {
|
||||
.filling()
|
||||
.child(new PromotedAttributesWidget())
|
||||
.child(<SqlTableSchemas />)
|
||||
.child(new NoteDetailWidget())
|
||||
.child(<NoteDetail />)
|
||||
.child(<NoteList />)
|
||||
.child(<SearchResult />)
|
||||
.child(<SqlResults />)
|
||||
|
||||
@@ -26,11 +26,11 @@ import PopupEditorDialog from "../widgets/dialogs/popup_editor.js";
|
||||
import FlexContainer from "../widgets/containers/flex_container.js";
|
||||
import NoteIconWidget from "../widgets/note_icon";
|
||||
import PromotedAttributesWidget from "../widgets/promoted_attributes.js";
|
||||
import NoteDetailWidget from "../widgets/note_detail.js";
|
||||
import CallToActionDialog from "../widgets/dialogs/call_to_action.jsx";
|
||||
import NoteTitleWidget from "../widgets/note_title.jsx";
|
||||
import { PopupEditorFormattingToolbar } from "../widgets/ribbon/FormattingToolbar.js";
|
||||
import NoteList from "../widgets/collections/NoteList.jsx";
|
||||
import NoteDetail from "../widgets/NoteDetail.jsx";
|
||||
|
||||
export function applyModals(rootContainer: RootContainer) {
|
||||
rootContainer
|
||||
@@ -65,7 +65,7 @@ export function applyModals(rootContainer: RootContainer) {
|
||||
.child(<NoteTitleWidget />))
|
||||
.child(<PopupEditorFormattingToolbar />)
|
||||
.child(new PromotedAttributesWidget())
|
||||
.child(new NoteDetailWidget())
|
||||
.child(<NoteDetail />)
|
||||
.child(<NoteList displayOnlyCollections />))
|
||||
.child(<CallToActionDialog />);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import FlexContainer from "../widgets/containers/flex_container.js";
|
||||
import NoteTitleWidget from "../widgets/note_title.js";
|
||||
import NoteDetailWidget from "../widgets/note_detail.js";
|
||||
import QuickSearchWidget from "../widgets/quick_search.js";
|
||||
import NoteTreeWidget from "../widgets/note_tree.js";
|
||||
import ScreenContainer from "../widgets/mobile_widgets/screen_container.js";
|
||||
@@ -13,7 +12,7 @@ import PromotedAttributesWidget from "../widgets/promoted_attributes.js";
|
||||
import SidebarContainer from "../widgets/mobile_widgets/sidebar_container.js";
|
||||
import type AppContext from "../components/app_context.js";
|
||||
import TabRowWidget from "../widgets/tab_row.js";
|
||||
import MobileEditorToolbar from "../widgets/type_widgets/ckeditor/mobile_editor_toolbar.js";
|
||||
import MobileEditorToolbar from "../widgets/type_widgets/text/mobile_editor_toolbar.js";
|
||||
import { applyModals } from "./layout_commons.js";
|
||||
import FilePropertiesTab from "../widgets/ribbon/FilePropertiesTab.jsx";
|
||||
import { useNoteContext } from "../widgets/react/hooks.jsx";
|
||||
@@ -24,6 +23,7 @@ import CloseZenModeButton from "../widgets/close_zen_button.js";
|
||||
import NoteWrapperWidget from "../widgets/note_wrapper.js";
|
||||
import MobileDetailMenu from "../widgets/mobile_widgets/mobile_detail_menu.js";
|
||||
import NoteList from "../widgets/collections/NoteList.jsx";
|
||||
import NoteDetail from "../widgets/NoteDetail.jsx";
|
||||
|
||||
const MOBILE_CSS = `
|
||||
<style>
|
||||
@@ -40,8 +40,8 @@ kbd {
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
font-size: 1.25em;
|
||||
padding-left: 0.5em;
|
||||
padding-right: 0.5em;
|
||||
padding-inline-start: 0.5em;
|
||||
padding-inline-end: 0.5em;
|
||||
color: var(--main-text-color);
|
||||
}
|
||||
.quick-search {
|
||||
@@ -59,7 +59,7 @@ const FANCYTREE_CSS = `
|
||||
margin-top: 0px;
|
||||
overflow-y: auto;
|
||||
contain: content;
|
||||
padding-left: 10px;
|
||||
padding-inline-start: 10px;
|
||||
}
|
||||
|
||||
.fancytree-custom-icon {
|
||||
@@ -68,7 +68,7 @@ const FANCYTREE_CSS = `
|
||||
|
||||
.fancytree-title {
|
||||
font-size: 1.5em;
|
||||
margin-left: 0.6em !important;
|
||||
margin-inline-start: 0.6em !important;
|
||||
}
|
||||
|
||||
.fancytree-node {
|
||||
@@ -81,7 +81,7 @@ const FANCYTREE_CSS = `
|
||||
|
||||
span.fancytree-expander {
|
||||
width: 24px !important;
|
||||
margin-right: 5px;
|
||||
margin-inline-end: 5px;
|
||||
}
|
||||
|
||||
.fancytree-loading span.fancytree-expander {
|
||||
@@ -101,7 +101,7 @@ span.fancytree-expander {
|
||||
.tree-wrapper .scroll-to-active-note-button,
|
||||
.tree-wrapper .tree-settings-button {
|
||||
position: fixed;
|
||||
margin-right: 16px;
|
||||
margin-inline-end: 16px;
|
||||
display: none;
|
||||
}
|
||||
|
||||
@@ -126,8 +126,8 @@ export default class MobileLayout {
|
||||
.class("d-md-flex d-lg-flex d-xl-flex col-12 col-sm-5 col-md-4 col-lg-3 col-xl-3")
|
||||
.id("mobile-sidebar-wrapper")
|
||||
.css("max-height", "100%")
|
||||
.css("padding-left", "0")
|
||||
.css("padding-right", "0")
|
||||
.css("padding-inline-start", "0")
|
||||
.css("padding-inline-end", "0")
|
||||
.css("contain", "content")
|
||||
.child(new FlexContainer("column").filling().id("mobile-sidebar-wrapper").child(new QuickSearchWidget()).child(new NoteTreeWidget().cssBlock(FANCYTREE_CSS)))
|
||||
)
|
||||
@@ -153,7 +153,7 @@ export default class MobileLayout {
|
||||
new ScrollingContainer()
|
||||
.filling()
|
||||
.contentSized()
|
||||
.child(new NoteDetailWidget())
|
||||
.child(<NoteDetail />)
|
||||
.child(<NoteList />)
|
||||
.child(<FilePropertiesWrapper />)
|
||||
)
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
import "bootstrap/dist/css/bootstrap.min.css";
|
||||
|
||||
// @ts-ignore - module = undefined
|
||||
// Required for correct loading of scripts in Electron
|
||||
if (typeof module === 'object') {window.module = module; module = undefined;}
|
||||
|
||||
@@ -150,8 +150,8 @@ class ContextMenu {
|
||||
this.$widget
|
||||
.css({
|
||||
display: "block",
|
||||
top: top,
|
||||
left: left
|
||||
top,
|
||||
left
|
||||
})
|
||||
.addClass("show");
|
||||
}
|
||||
@@ -187,7 +187,7 @@ class ContextMenu {
|
||||
}
|
||||
|
||||
// Create a new group to avoid column breaks before and after the seaparator / header.
|
||||
// This is a workaround for Firefox not supporting break-before / break-after: avoid
|
||||
// This is a workaround for Firefox not supporting break-before / break-after: avoid
|
||||
// for columns.
|
||||
if (shouldStartNewGroup) {
|
||||
$group = $("<div class='dropdown-no-break'>");
|
||||
@@ -313,7 +313,7 @@ class ContextMenu {
|
||||
}
|
||||
|
||||
$group.append($item);
|
||||
|
||||
|
||||
// After adding a menu item, if the previous item was a separator or header,
|
||||
// reset the group so that the next item will be appended directly to the parent.
|
||||
if (shouldResetGroup) {
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import appContext from "./components/app_context.js";
|
||||
import noteAutocompleteService from "./services/note_autocomplete.js";
|
||||
import glob from "./services/glob.js";
|
||||
import "bootstrap/dist/css/bootstrap.min.css";
|
||||
import "boxicons/css/boxicons.min.css";
|
||||
import "autocomplete.js/index_jquery.js";
|
||||
|
||||
|
||||
@@ -1,5 +1,15 @@
|
||||
import $ from "jquery";
|
||||
|
||||
async function loadBootstrap() {
|
||||
if (document.body.dir === "rtl") {
|
||||
await import("bootstrap/dist/css/bootstrap.rtl.min.css");
|
||||
} else {
|
||||
await import("bootstrap/dist/css/bootstrap.min.css");
|
||||
}
|
||||
}
|
||||
|
||||
(window as any).$ = $;
|
||||
(window as any).jQuery = $;
|
||||
await loadBootstrap();
|
||||
|
||||
$("body").show();
|
||||
|
||||
@@ -11,7 +11,7 @@ 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 from "../widgets/basic_widget.js";
|
||||
import BasicWidget, { ReactWrappedWidget } from "../widgets/basic_widget.js";
|
||||
import SpacedUpdate from "./spaced_update.js";
|
||||
import shortcutService from "./shortcuts.js";
|
||||
import dialogService from "./dialog.js";
|
||||
@@ -19,8 +19,8 @@ import type FNote from "../entities/fnote.js";
|
||||
import { t } from "./i18n.js";
|
||||
import dayjs from "dayjs";
|
||||
import type NoteContext from "../components/note_context.js";
|
||||
import type NoteDetailWidget from "../widgets/note_detail.js";
|
||||
import type Component from "../components/component.js";
|
||||
import { formatLogMessage } from "@triliumnext/commons";
|
||||
|
||||
/**
|
||||
* A whole number
|
||||
@@ -316,7 +316,7 @@ export interface Api {
|
||||
* Get access to the widget handling note detail. Methods like `getWidgetType()` and `getTypeWidget()` to get to the
|
||||
* implementation of actual widget type.
|
||||
*/
|
||||
getActiveNoteDetailWidget(): Promise<NoteDetailWidget>;
|
||||
getActiveNoteDetailWidget(): Promise<ReactWrappedWidget>;
|
||||
/**
|
||||
* @returns returns a note path of active note or null if there isn't active note
|
||||
*/
|
||||
@@ -455,7 +455,7 @@ export interface Api {
|
||||
/**
|
||||
* Log given message to the log pane in UI
|
||||
*/
|
||||
log(message: string): void;
|
||||
log(message: string | object): void;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -696,7 +696,7 @@ function FrontendScriptApi(this: Api, startNote: FNote, currentNote: FNote, orig
|
||||
this.log = (message) => {
|
||||
const { noteId } = this.startNote;
|
||||
|
||||
message = `${utils.now()}: ${message}`;
|
||||
message = `${utils.now()}: ${formatLogMessage(message)}`;
|
||||
|
||||
console.log(`Script ${noteId}: ${message}`);
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ import { describe, expect, it } from "vitest";
|
||||
describe("i18n", () => {
|
||||
it("translations are valid JSON", () => {
|
||||
for (const locale of LOCALES) {
|
||||
if (locale.contentOnly) {
|
||||
if (locale.contentOnly || locale.id === "en_rtl") {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import server from "./server.js";
|
||||
import appContext, { type CommandNames } from "../components/app_context.js";
|
||||
import shortcutService from "./shortcuts.js";
|
||||
import appContext from "../components/app_context.js";
|
||||
import shortcutService, { ShortcutBinding } from "./shortcuts.js";
|
||||
import type Component from "../components/component.js";
|
||||
import type { ActionKeyboardShortcut } from "@triliumnext/commons";
|
||||
|
||||
@@ -30,12 +30,18 @@ async function getActionsForScope(scope: string) {
|
||||
|
||||
async function setupActionsForElement(scope: string, $el: JQuery<HTMLElement>, component: Component) {
|
||||
const actions = await getActionsForScope(scope);
|
||||
const bindings: ShortcutBinding[] = [];
|
||||
|
||||
for (const action of actions) {
|
||||
for (const shortcut of action.effectiveShortcuts ?? []) {
|
||||
shortcutService.bindElShortcut($el, shortcut, () => component.triggerCommand(action.actionName, { ntxId: appContext.tabManager.activeNtxId }));
|
||||
const binding = shortcutService.bindElShortcut($el, shortcut, () => component.triggerCommand(action.actionName, { ntxId: appContext.tabManager.activeNtxId }));
|
||||
if (binding) {
|
||||
bindings.push(binding);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return bindings;
|
||||
}
|
||||
|
||||
getActionsForScope("window").then((actions) => {
|
||||
|
||||
@@ -3,16 +3,7 @@ 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";
|
||||
|
||||
// Be consistent with `allowedSchemes` in `src\services\html_sanitizer.ts`
|
||||
// TODO: Deduplicate with server once we can.
|
||||
export const ALLOWED_PROTOCOLS = [
|
||||
'http', 'https', 'ftp', 'ftps', 'mailto', 'data', 'evernote', 'file', 'facetime', 'gemini', 'git',
|
||||
'gopher', 'imap', 'irc', 'irc6', 'jabber', 'jar', 'lastfm', 'ldap', 'ldaps', 'magnet', 'message',
|
||||
'mumble', 'nfs', 'onenote', 'pop', 'rmi', 's3', 'sftp', 'skype', 'sms', 'spotify', 'steam', 'svn', 'udp',
|
||||
'view-source', 'vlc', 'vnc', 'ws', 'wss', 'xmpp', 'jdbc', 'slack', 'tel', 'smb', 'zotero', 'geo',
|
||||
'mid'
|
||||
];
|
||||
import { ALLOWED_PROTOCOLS } from "@triliumnext/commons";
|
||||
|
||||
function getNotePathFromUrl(url: string) {
|
||||
const notePathMatch = /#(root[A-Za-z0-9_/]*)$/.exec(url);
|
||||
@@ -35,8 +26,7 @@ async function getLinkIcon(noteId: string, viewMode: ViewMode | undefined) {
|
||||
return icon;
|
||||
}
|
||||
|
||||
// TODO: Remove `string` once all the view modes have been mapped.
|
||||
type ViewMode = "default" | "source" | "attachments" | "contextual-help" | string;
|
||||
export type ViewMode = "default" | "source" | "attachments" | "contextual-help";
|
||||
|
||||
export interface ViewScope {
|
||||
/**
|
||||
@@ -289,7 +279,7 @@ function goToLink(evt: MouseEvent | JQuery.ClickEvent | JQuery.MouseDownEvent) {
|
||||
* @param $link the jQuery element of the link that was clicked, used to determine if the link is an anchor link (e.g., `#fn1` or `#fnref1`) and to handle it accordingly.
|
||||
* @returns `true` if the link was handled (i.e., the element was found and scrolled to), or a falsy value otherwise.
|
||||
*/
|
||||
function goToLinkExt(evt: MouseEvent | JQuery.ClickEvent | JQuery.MouseDownEvent | React.PointerEvent<HTMLCanvasElement> | null, hrefLink: string | undefined, $link?: JQuery<HTMLElement> | null) {
|
||||
export function goToLinkExt(evt: MouseEvent | JQuery.ClickEvent | JQuery.MouseDownEvent | React.PointerEvent<HTMLCanvasElement> | null, hrefLink: string | undefined, $link?: JQuery<HTMLElement> | null) {
|
||||
if (hrefLink?.startsWith("data:")) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -126,7 +126,7 @@ function downloadRevision(noteId: string, revisionId: string) {
|
||||
/**
|
||||
* @param url - should be without initial slash!!!
|
||||
*/
|
||||
function getUrlForDownload(url: string) {
|
||||
export function getUrlForDownload(url: string) {
|
||||
if (utils.isElectron()) {
|
||||
// electron needs absolute URL, so we extract current host, port, protocol
|
||||
return `${getHost()}/${url}`;
|
||||
|
||||
@@ -119,11 +119,6 @@ describe("shortcuts", () => {
|
||||
metaKey: options.metaKey || false
|
||||
} as KeyboardEvent);
|
||||
|
||||
it("should match simple key shortcuts", () => {
|
||||
const event = createKeyboardEvent({ key: "a", code: "KeyA" });
|
||||
expect(matchesShortcut(event, "a")).toBe(true);
|
||||
});
|
||||
|
||||
it("should match shortcuts with modifiers", () => {
|
||||
const event = createKeyboardEvent({ key: "a", code: "KeyA", ctrlKey: true });
|
||||
expect(matchesShortcut(event, "ctrl+a")).toBe(true);
|
||||
@@ -148,6 +143,28 @@ describe("shortcuts", () => {
|
||||
expect(matchesShortcut(event, "a")).toBe(false);
|
||||
});
|
||||
|
||||
it("should not match when no modifiers are used", () => {
|
||||
const event = createKeyboardEvent({ key: "a", code: "KeyA" });
|
||||
expect(matchesShortcut(event, "a")).toBe(false);
|
||||
});
|
||||
|
||||
it("should match some keys even with no modifiers", () => {
|
||||
// Bare function keys
|
||||
let event = createKeyboardEvent({ key: "F1", code: "F1" });
|
||||
expect(matchesShortcut(event, "F1")).toBeTruthy();
|
||||
expect(matchesShortcut(event, "f1")).toBeTruthy();
|
||||
|
||||
// Function keys with shift
|
||||
event = createKeyboardEvent({ key: "F1", code: "F1", shiftKey: true });
|
||||
expect(matchesShortcut(event, "Shift+F1")).toBeTruthy();
|
||||
|
||||
// Special keys
|
||||
for (const keyCode of [ "Delete", "Enter" ]) {
|
||||
event = createKeyboardEvent({ key: keyCode, code: keyCode });
|
||||
expect(matchesShortcut(event, keyCode), `Key ${keyCode}`).toBeTruthy();
|
||||
}
|
||||
});
|
||||
|
||||
it("should handle alternative modifier names", () => {
|
||||
const ctrlEvent = createKeyboardEvent({ key: "a", code: "KeyA", ctrlKey: true });
|
||||
expect(matchesShortcut(ctrlEvent, "control+a")).toBe(true);
|
||||
|
||||
@@ -3,7 +3,7 @@ import utils from "./utils.js";
|
||||
type ElementType = HTMLElement | Document;
|
||||
type Handler = (e: KeyboardEvent) => void;
|
||||
|
||||
interface ShortcutBinding {
|
||||
export interface ShortcutBinding {
|
||||
element: HTMLElement | Document;
|
||||
shortcut: string;
|
||||
handler: Handler;
|
||||
@@ -36,10 +36,19 @@ const keyMap: { [key: string]: string[] } = {
|
||||
};
|
||||
|
||||
// Function keys
|
||||
const functionKeyCodes: string[] = [];
|
||||
for (let i = 1; i <= 19; i++) {
|
||||
keyMap[`f${i}`] = [`F${i}`];
|
||||
const keyCode = `F${i}`;
|
||||
functionKeyCodes.push(keyCode);
|
||||
keyMap[`f${i}`] = [ keyCode ];
|
||||
}
|
||||
|
||||
const KEYCODES_WITH_NO_MODIFIER = new Set([
|
||||
"Delete",
|
||||
"Enter",
|
||||
...functionKeyCodes
|
||||
]);
|
||||
|
||||
/**
|
||||
* Check if IME (Input Method Editor) is composing
|
||||
* This is used to prevent keyboard shortcuts from firing during IME composition
|
||||
@@ -51,7 +60,7 @@ export function isIMEComposing(e: KeyboardEvent): boolean {
|
||||
if (!e) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Standard check for composition state
|
||||
// e.isComposing is true when IME is actively composing
|
||||
// e.keyCode === 229 is a fallback for older browsers where 229 indicates IME processing
|
||||
@@ -86,13 +95,13 @@ function bindElShortcut($el: JQuery<ElementType | Element>, keyboardShortcut: st
|
||||
}
|
||||
|
||||
const e = evt as KeyboardEvent;
|
||||
|
||||
|
||||
// Skip processing if IME is composing to prevent shortcuts from
|
||||
// interfering with text input in CJK languages
|
||||
if (isIMEComposing(e)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (matchesShortcut(e, keyboardShortcut)) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
@@ -117,10 +126,20 @@ function bindElShortcut($el: JQuery<ElementType | Element>, keyboardShortcut: st
|
||||
activeBindings.set(key, []);
|
||||
}
|
||||
activeBindings.get(key)!.push(binding);
|
||||
return binding;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export function removeIndividualBinding(binding: ShortcutBinding) {
|
||||
const key = binding.namespace ?? "global";
|
||||
const activeBindingsInNamespace = activeBindings.get(key);
|
||||
if (activeBindingsInNamespace) {
|
||||
activeBindings.set(key, activeBindingsInNamespace.filter(aBinding => aBinding.handler === binding.handler));
|
||||
}
|
||||
binding.element.removeEventListener("keydown", binding.listener);
|
||||
}
|
||||
|
||||
function removeNamespaceBindings(namespace: string) {
|
||||
const bindings = activeBindings.get(namespace);
|
||||
if (bindings) {
|
||||
@@ -162,6 +181,12 @@ export function matchesShortcut(e: KeyboardEvent, shortcut: string): boolean {
|
||||
const expectedShift = modifiers.includes('shift');
|
||||
const expectedMeta = modifiers.includes('meta') || modifiers.includes('cmd') || modifiers.includes('command');
|
||||
|
||||
// Refuse key combinations that don't include modifiers because they interfere with the normal usage of the application.
|
||||
// Some keys such as function keys are an exception.
|
||||
if (!(expectedCtrl || expectedAlt || expectedShift || expectedMeta) && !KEYCODES_WITH_NO_MODIFIER.has(e.code)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return e.ctrlKey === expectedCtrl &&
|
||||
e.altKey === expectedAlt &&
|
||||
e.shiftKey === expectedShift &&
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
import ws from "./ws.js";
|
||||
import utils from "./utils.js";
|
||||
|
||||
export interface ToastOptions {
|
||||
id?: string;
|
||||
icon: string;
|
||||
title: string;
|
||||
title?: string;
|
||||
message: string;
|
||||
delay?: number;
|
||||
autohide?: boolean;
|
||||
@@ -12,20 +11,32 @@ export interface ToastOptions {
|
||||
}
|
||||
|
||||
function toast(options: ToastOptions) {
|
||||
const $toast = $(
|
||||
`<div class="toast" role="alert" aria-live="assertive" aria-atomic="true">
|
||||
<div class="toast-header">
|
||||
<strong class="me-auto">
|
||||
const $toast = $(options.title
|
||||
? `\
|
||||
<div class="toast" role="alert" aria-live="assertive" aria-atomic="true">
|
||||
<div class="toast-header">
|
||||
<strong class="me-auto">
|
||||
<span class="bx bx-${options.icon}"></span>
|
||||
<span class="toast-title"></span>
|
||||
</strong>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="toast" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="toast-body"></div>
|
||||
</div>`
|
||||
: `
|
||||
<div class="toast" role="alert" aria-live="assertive" aria-atomic="true">
|
||||
<div class="toast-icon">
|
||||
<span class="bx bx-${options.icon}"></span>
|
||||
<span class="toast-title"></span>
|
||||
</strong>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="toast" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="toast-body"></div>
|
||||
</div>`
|
||||
</div>
|
||||
<div class="toast-body"></div>
|
||||
<div class="toast-header">
|
||||
<button type="button" class="btn-close" data-bs-dismiss="toast" aria-label="Close"></button>
|
||||
</div>
|
||||
</div>`
|
||||
);
|
||||
|
||||
$toast.find(".toast-title").text(options.title);
|
||||
$toast.toggleClass("no-title", !options.title);
|
||||
$toast.find(".toast-title").text(options.title ?? "");
|
||||
$toast.find(".toast-body").html(options.message);
|
||||
|
||||
if (options.id) {
|
||||
@@ -70,7 +81,6 @@ function showMessage(message: string, delay = 2000) {
|
||||
console.debug(utils.now(), "message:", message);
|
||||
|
||||
toast({
|
||||
title: "Info",
|
||||
icon: "check",
|
||||
message: message,
|
||||
autohide: true,
|
||||
@@ -82,7 +92,6 @@ export function showError(message: string, delay = 10000) {
|
||||
console.log(utils.now(), "error: ", message);
|
||||
|
||||
toast({
|
||||
title: "Error",
|
||||
icon: "alert",
|
||||
message: message,
|
||||
autohide: true,
|
||||
|
||||
@@ -169,7 +169,7 @@ const entityMap: Record<string, string> = {
|
||||
"=": "="
|
||||
};
|
||||
|
||||
function escapeHtml(str: string) {
|
||||
export function escapeHtml(str: string) {
|
||||
return str.replace(/[&<>"'`=\/]/g, (s) => entityMap[s]);
|
||||
}
|
||||
|
||||
@@ -869,6 +869,41 @@ export function getErrorMessage(e: unknown) {
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Deduplicate with server
|
||||
export interface DeferredPromise<T> extends Promise<T> {
|
||||
resolve: (value: T | PromiseLike<T>) => void;
|
||||
reject: (reason?: any) => void;
|
||||
}
|
||||
|
||||
// TODO: Deduplicate with server
|
||||
export function deferred<T>(): DeferredPromise<T> {
|
||||
return (() => {
|
||||
let resolve!: (value: T | PromiseLike<T>) => void;
|
||||
let reject!: (reason?: any) => void;
|
||||
|
||||
let promise = new Promise<T>((res, rej) => {
|
||||
resolve = res;
|
||||
reject = rej;
|
||||
}) as DeferredPromise<T>;
|
||||
|
||||
promise.resolve = resolve;
|
||||
promise.reject = reject;
|
||||
return promise as DeferredPromise<T>;
|
||||
})();
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles left or right placement of e.g. tooltips in case of right-to-left languages. If the current language is a RTL one, then left and right are swapped. Other directions are unaffected.
|
||||
* @param placement a string optionally containing a "left" or "right" value.
|
||||
* @returns a left/right value swapped if needed, or the same as input otherwise.
|
||||
*/
|
||||
export function handleRightToLeftPlacement<T extends string>(placement: T) {
|
||||
if (!glob.isRtl) return placement;
|
||||
if (placement === "left") return "right";
|
||||
if (placement === "right") return "left";
|
||||
return placement;
|
||||
}
|
||||
|
||||
export default {
|
||||
reloadFrontendApp,
|
||||
restartDesktopApp,
|
||||
|
||||
@@ -7,6 +7,7 @@ import appContext from "../components/app_context.js";
|
||||
import { t } from "./i18n.js";
|
||||
import type { EntityChange } from "../server_types.js";
|
||||
import { WebSocketMessage } from "@triliumnext/commons";
|
||||
import toast from "./toast.js";
|
||||
|
||||
type MessageHandler = (message: WebSocketMessage) => void;
|
||||
let messageHandlers: MessageHandler[] = [];
|
||||
@@ -278,13 +279,17 @@ function connectWebSocket() {
|
||||
|
||||
async function sendPing() {
|
||||
if (Date.now() - lastPingTs > 30000) {
|
||||
console.log(
|
||||
utils.now(),
|
||||
"Lost websocket connection to the backend. If you keep having this issue repeatedly, you might want to check your reverse proxy (nginx, apache) configuration and allow/unblock WebSocket."
|
||||
);
|
||||
console.warn(utils.now(), "Lost websocket connection to the backend");
|
||||
toast.showPersistent({
|
||||
id: "lost-websocket-connection",
|
||||
title: t("ws.lost-websocket-connection-title"),
|
||||
message: t("ws.lost-websocket-connection-message"),
|
||||
icon: "no-signal"
|
||||
});
|
||||
}
|
||||
|
||||
if (ws.readyState === ws.OPEN) {
|
||||
toast.closePersistent("lost-websocket-connection");
|
||||
ws.send(
|
||||
JSON.stringify({
|
||||
type: "ping",
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import "bootstrap/dist/css/bootstrap.min.css";
|
||||
import "./stylesheets/auth.css";
|
||||
|
||||
// @TriliumNextTODO: is this even needed anymore?
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import "jquery";
|
||||
import utils from "./services/utils.js";
|
||||
import ko from "knockout";
|
||||
import "bootstrap/dist/css/bootstrap.min.css";
|
||||
|
||||
// TriliumNextTODO: properly make use of below types
|
||||
// type SetupModelSetupType = "new-document" | "sync-from-desktop" | "sync-from-server" | "";
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
appearance: none;
|
||||
text-align: center;
|
||||
border: 0;
|
||||
border-left: unset;
|
||||
border-inline-start: unset;
|
||||
background-color: var(--menu-background-color);
|
||||
font-weight: bold;
|
||||
outline: 0;
|
||||
@@ -102,7 +102,7 @@
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
inset-inline-end: 0;
|
||||
bottom: 0;
|
||||
width: 1px;
|
||||
background-color: var(--main-border-color);
|
||||
|
||||
@@ -299,7 +299,7 @@
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: -100%;
|
||||
inset-inline-start: -100%;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: linear-gradient(90deg, transparent, var(--hover-item-background-color, rgba(0, 0, 0, 0.03)), transparent);
|
||||
@@ -406,10 +406,10 @@
|
||||
|
||||
@keyframes shimmer {
|
||||
0% {
|
||||
left: -100%;
|
||||
inset-inline-start: -100%;
|
||||
}
|
||||
100% {
|
||||
left: 100%;
|
||||
inset-inline-start: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
#center-pane > *:not(.split-note-container-widget),
|
||||
#right-pane,
|
||||
.title-row .note-icon-widget,
|
||||
.title-row .button-widget,
|
||||
.title-row .icon-action,
|
||||
.ribbon-container,
|
||||
.promoted-attributes-widget,
|
||||
.scroll-padding-widget,
|
||||
@@ -218,7 +218,7 @@ span[style] {
|
||||
--box-vert-offset: calc((1lh - var(--box-size)) / 2);
|
||||
|
||||
display: inline-block;
|
||||
padding-left: calc(var(--box-size) + var(--box-text-gap));
|
||||
padding-inline-start: calc(var(--box-size) + var(--box-text-gap));
|
||||
/* Source: https://pictogrammers.com/library/mdi/icon/checkbox-blank-outline/ */
|
||||
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='currentColor'%3e%3cpath d='M19%2c3H5C3.89%2c3 3%2c3.89 3%2c5V19A2%2c2 0 0%2c0 5%2c21H19A2%2c2 0 0%2c0 21%2c19V5C21%2c3.89 20.1%2c3 19%2c3M19%2c5V19H5V5H19Z' /%3e%3c/svg%3e");
|
||||
background-position: 0 var(--box-vert-offset);
|
||||
@@ -281,7 +281,7 @@ span[style] {
|
||||
position: absolute;
|
||||
|
||||
top: 0;
|
||||
left: 0;
|
||||
inset-inline-start: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
@@ -174,12 +174,12 @@ textarea,
|
||||
/* Add a gap between consecutive radios / check boxes */
|
||||
label.tn-radio + label.tn-radio,
|
||||
label.tn-checkbox + label.tn-checkbox {
|
||||
margin-left: 12px;
|
||||
margin-inline-start: 12px;
|
||||
}
|
||||
|
||||
label.tn-radio input[type="radio"],
|
||||
label.tn-checkbox input[type="checkbox"] {
|
||||
margin-right: .5em;
|
||||
margin-inline-end: .5em;
|
||||
}
|
||||
|
||||
#left-pane input,
|
||||
@@ -226,7 +226,7 @@ samp {
|
||||
.badge {
|
||||
--bs-badge-color: var(--muted-text-color);
|
||||
|
||||
margin-left: 8px;
|
||||
margin-inline-start: 8px;
|
||||
background: var(--accented-background-color);
|
||||
}
|
||||
|
||||
@@ -338,8 +338,8 @@ button kbd {
|
||||
}
|
||||
|
||||
.ui-menu kbd {
|
||||
margin-left: 30px;
|
||||
float: right;
|
||||
margin-inline-start: 30px;
|
||||
float: inline-end;
|
||||
}
|
||||
|
||||
.suppressed {
|
||||
@@ -392,7 +392,7 @@ body.desktop .tabulator-popup-container {
|
||||
}
|
||||
|
||||
.dropend .dropdown-toggle::after {
|
||||
margin-left: 0.5em;
|
||||
margin-inline-start: 0.5em;
|
||||
color: var(--muted-text-color);
|
||||
}
|
||||
|
||||
@@ -403,8 +403,8 @@ body.desktop .tabulator-popup-container {
|
||||
|
||||
.dropdown-menu .disabled .disabled-tooltip {
|
||||
pointer-events: all;
|
||||
margin-left: 8px;
|
||||
font-size: 0.5em;
|
||||
margin-inline-start: 8px;
|
||||
font-size: 0.75rem;
|
||||
color: var(--disabled-tooltip-icon-color);
|
||||
cursor: help;
|
||||
opacity: 0.75;
|
||||
@@ -443,7 +443,7 @@ body #context-menu-container .dropdown-item > span {
|
||||
.dropdown-item span.keyboard-shortcut,
|
||||
.dropdown-item *:not(.keyboard-shortcut) > kbd {
|
||||
flex-grow: 1;
|
||||
text-align: right;
|
||||
text-align: end;
|
||||
padding-inline-start: 12px;
|
||||
}
|
||||
|
||||
@@ -504,7 +504,7 @@ body #context-menu-container .dropdown-item > span {
|
||||
|
||||
body .cm-editor .cm-gutters {
|
||||
background-color: inherit !important;
|
||||
border-right: none;
|
||||
border-inline-end: none;
|
||||
}
|
||||
|
||||
body .cm-editor .cm-placeholder {
|
||||
@@ -586,6 +586,10 @@ button.btn-sm {
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
body[dir=rtl] .ck.ck-block-toolbar-button {
|
||||
transform: translateX(-7px);
|
||||
}
|
||||
|
||||
pre:not(.hljs) {
|
||||
color: var(--main-text-color) !important;
|
||||
white-space: pre-wrap;
|
||||
@@ -604,11 +608,11 @@ pre:not(.hljs) {
|
||||
pre > button.copy-button {
|
||||
position: absolute;
|
||||
top: var(--copy-button-margin-size);
|
||||
right: var(--copy-button-margin-size);
|
||||
inset-inline-end: var(--copy-button-margin-size);
|
||||
}
|
||||
|
||||
:root pre:has(> button.copy-button) {
|
||||
padding-right: calc(var(--copy-button-width) + (var(--copy-button-margin-size) * 2));
|
||||
padding-inline-end: calc(var(--copy-button-width) + (var(--copy-button-margin-size) * 2));
|
||||
}
|
||||
|
||||
pre > button.copy-button:hover {
|
||||
@@ -634,31 +638,31 @@ pre > button.copy-button:active {
|
||||
.full-text-search-button {
|
||||
cursor: pointer;
|
||||
font-size: 1.3em;
|
||||
padding-left: 5px;
|
||||
padding-right: 5px;
|
||||
padding-inline-start: 5px;
|
||||
padding-inline-end: 5px;
|
||||
}
|
||||
|
||||
.input-clearer-button {
|
||||
cursor: pointer;
|
||||
font-size: 1.3em;
|
||||
background: inherit !important;
|
||||
padding-left: 5px;
|
||||
padding-right: 5px;
|
||||
padding-inline-start: 5px;
|
||||
padding-inline-end: 5px;
|
||||
}
|
||||
|
||||
.open-external-link-button {
|
||||
cursor: pointer;
|
||||
font-size: 1.3em;
|
||||
padding-left: 5px;
|
||||
padding-right: 5px;
|
||||
padding-inline-start: 5px;
|
||||
padding-inline-end: 5px;
|
||||
padding-top: 8px;
|
||||
}
|
||||
|
||||
.go-to-selected-note-button {
|
||||
cursor: pointer;
|
||||
font-size: 1.3em;
|
||||
padding-left: 4px;
|
||||
padding-right: 3px;
|
||||
padding-inline-start: 4px;
|
||||
padding-inline-end: 3px;
|
||||
}
|
||||
|
||||
.go-to-selected-note-button.disabled,
|
||||
@@ -671,7 +675,7 @@ pre > button.copy-button:active {
|
||||
|
||||
.note-autocomplete-input {
|
||||
/* this is for seamless integration of "input clearer" button */
|
||||
border-right: 0;
|
||||
border-inline-end: 0;
|
||||
}
|
||||
|
||||
table.promoted-attributes-in-tooltip {
|
||||
@@ -704,10 +708,10 @@ table.promoted-attributes-in-tooltip th {
|
||||
border-top-color: var(--main-border-color) !important;
|
||||
}
|
||||
.bs-tooltip-left .tooltip-arrow::before {
|
||||
border-left-color: var(--main-border-color) !important;
|
||||
border-inline-start-color: var(--main-border-color) !important;
|
||||
}
|
||||
.bs-tooltip-right .tooltip-arrow::before {
|
||||
border-right-color: var(--main-border-color) !important;
|
||||
border-inline-end-color: var(--main-border-color) !important;
|
||||
}
|
||||
|
||||
.bs-tooltip-bottom .tooltip-arrow::after {
|
||||
@@ -717,17 +721,17 @@ table.promoted-attributes-in-tooltip th {
|
||||
border-top-color: var(--tooltip-background-color) !important;
|
||||
}
|
||||
.bs-tooltip-left .tooltip-arrow::after {
|
||||
border-left-color: var(--tooltip-background-color) !important;
|
||||
border-inline-start-color: var(--tooltip-background-color) !important;
|
||||
}
|
||||
.bs-tooltip-right .tooltip-arrow::after {
|
||||
border-right-color: var(--tooltip-background-color) !important;
|
||||
border-inline-end-color: var(--tooltip-background-color) !important;
|
||||
}
|
||||
|
||||
.bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow::before,
|
||||
.bs-tooltip-left .tooltip-arrow::before {
|
||||
left: -1px;
|
||||
inset-inline-start: -1px;
|
||||
border-width: 0.4rem 0 0.4rem 0.4rem;
|
||||
border-left-color: var(--main-border-color) !important;
|
||||
border-inline-start-color: var(--main-border-color) !important;
|
||||
}
|
||||
|
||||
.bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow::before,
|
||||
@@ -739,9 +743,9 @@ table.promoted-attributes-in-tooltip th {
|
||||
|
||||
.bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow::before,
|
||||
.bs-tooltip-right .tooltip-arrow::before {
|
||||
right: -1px;
|
||||
inset-inline-end: -1px;
|
||||
border-width: 0.4rem 0.4rem 0.4rem 0;
|
||||
border-right-color: var(--main-border-color) !important;
|
||||
border-inline-end-color: var(--main-border-color) !important;
|
||||
}
|
||||
|
||||
.bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow::before,
|
||||
@@ -753,9 +757,9 @@ table.promoted-attributes-in-tooltip th {
|
||||
|
||||
.bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow::after,
|
||||
.bs-tooltip-left .tooltip-arrow::after {
|
||||
left: -1px;
|
||||
inset-inline-start: -1px;
|
||||
border-width: 0.4rem 0 0.4rem 0.4rem;
|
||||
border-left-color: var(--tooltip-background-color) !important;
|
||||
border-inline-start-color: var(--tooltip-background-color) !important;
|
||||
}
|
||||
|
||||
.bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow::after,
|
||||
@@ -767,9 +771,9 @@ table.promoted-attributes-in-tooltip th {
|
||||
|
||||
.bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow::after,
|
||||
.bs-tooltip-right .tooltip-arrow::after {
|
||||
right: -1px;
|
||||
inset-inline-end: -1px;
|
||||
border-width: 0.4rem 0.4rem 0.4rem 0;
|
||||
border-right-color: var(--tooltip-background-color) !important;
|
||||
border-inline-end-color: var(--tooltip-background-color) !important;
|
||||
}
|
||||
|
||||
.bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow::after,
|
||||
@@ -788,7 +792,7 @@ table.promoted-attributes-in-tooltip th {
|
||||
background-color: var(--tooltip-background-color) !important;
|
||||
border: 1px solid var(--main-border-color);
|
||||
border-radius: 5px;
|
||||
text-align: left;
|
||||
text-align: start;
|
||||
color: var(--main-text-color) !important;
|
||||
max-width: 500px;
|
||||
box-shadow: 10px 10px 93px -25px #aaaaaa;
|
||||
@@ -821,7 +825,7 @@ table.promoted-attributes-in-tooltip th {
|
||||
|
||||
.note-tooltip-content .open-popup-button {
|
||||
position: absolute;
|
||||
right: 15px;
|
||||
inset-inline-end: 15px;
|
||||
bottom: 8px;
|
||||
font-size: 1.2em;
|
||||
color: inherit;
|
||||
@@ -841,7 +845,7 @@ table.promoted-attributes-in-tooltip th {
|
||||
}
|
||||
|
||||
.tooltip-inner figure.image-style-side {
|
||||
float: right;
|
||||
float: inline-end;
|
||||
}
|
||||
|
||||
.tooltip.show {
|
||||
@@ -890,7 +894,7 @@ table.promoted-attributes-in-tooltip th {
|
||||
.aa-dropdown-menu .aa-suggestion .text {
|
||||
display: inline-block;
|
||||
width: calc(100% - 20px);
|
||||
padding-left: 4px;
|
||||
padding-inline-start: 4px;
|
||||
}
|
||||
|
||||
.aa-dropdown-menu .aa-suggestion .search-result-title {
|
||||
@@ -916,7 +920,7 @@ table.promoted-attributes-in-tooltip th {
|
||||
}
|
||||
|
||||
.help-button {
|
||||
float: right;
|
||||
float: inline-end;
|
||||
background: none;
|
||||
font-weight: 900;
|
||||
color: orange;
|
||||
@@ -1033,7 +1037,7 @@ svg.ck-icon .note-icon {
|
||||
counter-increment: footnote-counter;
|
||||
display: flex;
|
||||
list-style: none;
|
||||
margin-left: 0.5em;
|
||||
margin-inline-start: 0.5em;
|
||||
}
|
||||
|
||||
.ck-content .footnote-item > * {
|
||||
@@ -1041,13 +1045,13 @@ svg.ck-icon .note-icon {
|
||||
}
|
||||
|
||||
.ck-content .footnote-back-link {
|
||||
margin-right: 0.1em;
|
||||
margin-inline-end: 0.1em;
|
||||
position: relative;
|
||||
top: -0.2em;
|
||||
}
|
||||
|
||||
.ck-content .footnotes .footnote-back-link > sup {
|
||||
margin-right: 0;
|
||||
margin-inline-end: 0;
|
||||
}
|
||||
|
||||
.ck-content .footnote-item:before {
|
||||
@@ -1055,8 +1059,8 @@ svg.ck-icon .note-icon {
|
||||
display: inline-block;
|
||||
min-width: fit-content;
|
||||
position: relative;
|
||||
right: 0.2em;
|
||||
text-align: right;
|
||||
inset-inline-end: 0.2em;
|
||||
text-align: end;
|
||||
}
|
||||
|
||||
.ck-content .footnote-content {
|
||||
@@ -1072,11 +1076,11 @@ svg.ck-icon .note-icon {
|
||||
}
|
||||
|
||||
#options-dialog input[type="number"] {
|
||||
text-align: right;
|
||||
text-align: end;
|
||||
}
|
||||
|
||||
.help-cards ul {
|
||||
padding-left: 20px;
|
||||
padding-inline-start: 20px;
|
||||
}
|
||||
|
||||
.help-cards kbd {
|
||||
@@ -1141,6 +1145,26 @@ a.external:not(.no-arrow):after, a[href^="http://"]:not(.no-arrow):after, a[href
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.toast.no-title {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.toast.no-title .toast-icon {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x);
|
||||
}
|
||||
|
||||
.toast.no-title .toast-body {
|
||||
padding-inline-start: 0;
|
||||
padding-inline-end: 0;
|
||||
}
|
||||
|
||||
.toast.no-title .toast-header {
|
||||
background-color: unset !important;
|
||||
}
|
||||
|
||||
.ck-mentions .ck-button {
|
||||
font-size: var(--detail-font-size) !important;
|
||||
padding: 5px;
|
||||
@@ -1254,8 +1278,8 @@ a.external:not(.no-arrow):after, a[href^="http://"]:not(.no-arrow):after, a[href
|
||||
#context-menu-cover.show {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
inset-inline-start: 0;
|
||||
inset-inline-end: 0;
|
||||
bottom: 0;
|
||||
z-index: 1000;
|
||||
background: rgba(0, 0, 0, 0.1);
|
||||
@@ -1268,8 +1292,8 @@ a.external:not(.no-arrow):after, a[href^="http://"]:not(.no-arrow):after, a[href
|
||||
|
||||
body.mobile #context-menu-container.mobile-bottom-menu {
|
||||
position: fixed !important;
|
||||
left: 0 !important;
|
||||
right: 0 !important;
|
||||
inset-inline-start: 0 !important;
|
||||
inset-inline-end: 0 !important;
|
||||
bottom: 0 !important;
|
||||
top: unset !important;
|
||||
max-height: 70vh;
|
||||
@@ -1319,7 +1343,7 @@ body.desktop li.dropdown-submenu:hover > ul.dropdown-menu {
|
||||
|
||||
.dropdown-submenu > .dropdown-menu {
|
||||
top: 0;
|
||||
left: calc(100% - 2px); /* -2px, otherwise there's a small gap between menu and submenu where the hover can disappear */
|
||||
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 */
|
||||
@@ -1328,7 +1352,7 @@ body.desktop li.dropdown-submenu:hover > ul.dropdown-menu {
|
||||
}
|
||||
|
||||
body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu {
|
||||
left: calc(-100% + 10px);
|
||||
inset-inline-start: calc(-100% + 10px);
|
||||
}
|
||||
|
||||
.right-dropdown-widget {
|
||||
@@ -1394,7 +1418,7 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu {
|
||||
|
||||
.ck.ck-slash-command-button__text-part,
|
||||
.ck.ck-template-form__text-part {
|
||||
margin-left: 0.5em;
|
||||
margin-inline-start: 0.5em;
|
||||
line-height: 1.2em !important;
|
||||
}
|
||||
|
||||
@@ -1425,8 +1449,8 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu {
|
||||
}
|
||||
|
||||
.area-expander-text {
|
||||
padding-left: 20px;
|
||||
padding-right: 20px;
|
||||
padding-inline-start: 20px;
|
||||
padding-inline-end: 20px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
@@ -1472,7 +1496,7 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu {
|
||||
cursor: pointer;
|
||||
border: none;
|
||||
color: var(--launcher-pane-text-color);
|
||||
background: transparent;
|
||||
background-color: transparent;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
@@ -1513,16 +1537,16 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu {
|
||||
position: fixed !important;
|
||||
bottom: calc(var(--mobile-bottom-offset) + var(--launcher-pane-size)) !important;
|
||||
top: unset !important;
|
||||
left: 0 !important;
|
||||
right: 0 !important;
|
||||
inset-inline-start: 0 !important;
|
||||
inset-inline-end: 0 !important;
|
||||
transform: unset !important;
|
||||
}
|
||||
|
||||
#mobile-sidebar-container {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
inset-inline-start: 0;
|
||||
inset-inline-end: 0;
|
||||
bottom: 0;
|
||||
z-index: 1000;
|
||||
transition: background-color 250ms ease-in-out;
|
||||
@@ -1537,7 +1561,7 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu {
|
||||
#mobile-sidebar-wrapper {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
inset-inline-start: 0;
|
||||
bottom: 0;
|
||||
width: 85vw;
|
||||
padding-top: env(safe-area-inset-top);
|
||||
@@ -1569,8 +1593,8 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu {
|
||||
body.mobile .modal-dialog {
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
inset-inline-start: 0;
|
||||
inset-inline-end: 0;
|
||||
margin: 0 !important;
|
||||
max-height: 85vh;
|
||||
display: flex;
|
||||
@@ -1728,8 +1752,8 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu {
|
||||
display: flex;
|
||||
flex-shrink: 0;
|
||||
flex-direction: column;
|
||||
margin-left: 10px;
|
||||
margin-right: 5px;
|
||||
margin-inline-start: 10px;
|
||||
margin-inline-end: 5px;
|
||||
}
|
||||
|
||||
#right-pane .card-header {
|
||||
@@ -1769,7 +1793,7 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu {
|
||||
}
|
||||
|
||||
#right-pane .card-body ul {
|
||||
padding-left: 25px;
|
||||
padding-inline-start: 25px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
@@ -1780,8 +1804,8 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu {
|
||||
}
|
||||
|
||||
.note-split {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
margin-inline-start: auto;
|
||||
margin-inline-end: auto;
|
||||
}
|
||||
|
||||
.note-split.full-content-width {
|
||||
@@ -1800,7 +1824,7 @@ button.close:hover {
|
||||
.reference-link .bx {
|
||||
position: relative;
|
||||
top: 1px;
|
||||
margin-right: 3px;
|
||||
margin-inline-end: 3px;
|
||||
}
|
||||
|
||||
.options-section:first-of-type h4 {
|
||||
@@ -1838,7 +1862,7 @@ textarea {
|
||||
|
||||
.attachment-help-button {
|
||||
display: inline-block;
|
||||
margin-left: 10px;
|
||||
margin-inline-start: 10px;
|
||||
vertical-align: middle;
|
||||
font-size: 1em;
|
||||
}
|
||||
@@ -1946,7 +1970,7 @@ textarea {
|
||||
}
|
||||
|
||||
body.electron.platform-darwin:not(.native-titlebar) .tab-row-container {
|
||||
padding-left: 1em;
|
||||
padding-inline-start: 1em;
|
||||
}
|
||||
|
||||
#tab-row-left-spacer {
|
||||
@@ -1955,7 +1979,7 @@ body.electron.platform-darwin:not(.native-titlebar) .tab-row-container {
|
||||
}
|
||||
|
||||
.tab-row-widget {
|
||||
padding-right: calc(100vw - env(titlebar-area-width, 100vw));
|
||||
padding-inline-end: calc(100vw - env(titlebar-area-width, 100vw));
|
||||
}
|
||||
|
||||
.tab-row-container .toggle-button {
|
||||
@@ -2005,16 +2029,20 @@ body.zen .ribbon-container:not(:has(.classic-toolbar-widget.visible)),
|
||||
body.zen .ribbon-container:has(.classic-toolbar-widget.visible) .ribbon-top-row,
|
||||
body.zen .ribbon-container .ribbon-body:not(:has(.classic-toolbar-widget.visible)),
|
||||
body.zen .note-icon-widget,
|
||||
body.zen .title-row .button-widget,
|
||||
body.zen .title-row .icon-action,
|
||||
body.zen .floating-buttons-children > *:not(.bx-edit-alt),
|
||||
body.zen .action-button {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
body.zen .split-note-container-widget > .gutter {
|
||||
display: unset !important;
|
||||
}
|
||||
|
||||
body.zen #launcher-pane {
|
||||
position: absolute !important;
|
||||
top: 0 !important;
|
||||
right: 0 !important;
|
||||
inset-inline-end: 0 !important;
|
||||
width: 64px !important;
|
||||
height: 64px !important;
|
||||
background: transparent !important;
|
||||
@@ -2025,8 +2053,8 @@ body.zen .title-row {
|
||||
display: block !important;
|
||||
height: unset !important;
|
||||
-webkit-app-region: drag;
|
||||
padding-left: env(titlebar-area-x);
|
||||
padding-right: calc(100vw - env(titlebar-area-width, 100vw) + 2.5em);
|
||||
padding-inline-start: env(titlebar-area-x);
|
||||
padding-inline-end: calc(100vw - env(titlebar-area-width, 100vw) + 2.5em);
|
||||
}
|
||||
|
||||
body.zen .floating-buttons {
|
||||
@@ -2034,7 +2062,7 @@ body.zen .floating-buttons {
|
||||
}
|
||||
|
||||
body.zen .floating-buttons-children {
|
||||
right: 0;
|
||||
inset-inline-end: 0;
|
||||
}
|
||||
|
||||
body.zen .floating-buttons-children .button-widget {
|
||||
@@ -2193,7 +2221,7 @@ footer.webview-footer button {
|
||||
.chat-input {
|
||||
width: 100%;
|
||||
resize: none;
|
||||
padding-right: 40px;
|
||||
padding-inline-end: 40px;
|
||||
}
|
||||
|
||||
.chat-buttons {
|
||||
@@ -2256,7 +2284,7 @@ footer.webview-footer button {
|
||||
padding: 1em;
|
||||
margin: 1.25em 0;
|
||||
position: relative;
|
||||
padding-left: 2.5em;
|
||||
padding-inline-start: 2.5em;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
@@ -2269,7 +2297,7 @@ footer.webview-footer button {
|
||||
font-family: boxicons !important;
|
||||
position: absolute;
|
||||
top: 1em;
|
||||
left: 1em;
|
||||
inset-inline-start: 1em;
|
||||
}
|
||||
|
||||
.admonition.note { --accent-color: var(--admonition-note-accent-color); }
|
||||
@@ -2295,18 +2323,18 @@ footer.webview-footer button {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-size: 0.9em;
|
||||
margin-right: 15px;
|
||||
margin-inline-end: 15px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.chat-option input[type="checkbox"] {
|
||||
margin-right: 5px;
|
||||
margin-inline-end: 5px;
|
||||
}
|
||||
|
||||
/* Style for thinking process in chat responses */
|
||||
.thinking-process {
|
||||
background-color: rgba(0, 0, 0, 0.05);
|
||||
border-left: 3px solid var(--main-text-color);
|
||||
border-inline-start: 3px solid var(--main-text-color);
|
||||
padding: 10px;
|
||||
margin: 10px 0;
|
||||
border-radius: 4px;
|
||||
@@ -2314,23 +2342,23 @@ footer.webview-footer button {
|
||||
|
||||
.thinking-step {
|
||||
margin-bottom: 8px;
|
||||
padding-left: 10px;
|
||||
padding-inline-start: 10px;
|
||||
}
|
||||
|
||||
.thinking-step.observation {
|
||||
border-left: 2px solid #69c7ff;
|
||||
border-inline-start: 2px solid #69c7ff;
|
||||
}
|
||||
|
||||
.thinking-step.hypothesis {
|
||||
border-left: 2px solid #9839f7;
|
||||
border-inline-start: 2px solid #9839f7;
|
||||
}
|
||||
|
||||
.thinking-step.evidence {
|
||||
border-left: 2px solid #40c025;
|
||||
border-inline-start: 2px solid #40c025;
|
||||
}
|
||||
|
||||
.thinking-step.conclusion {
|
||||
border-left: 2px solid #e2aa03;
|
||||
border-inline-start: 2px solid #e2aa03;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
@@ -2345,17 +2373,17 @@ footer.webview-footer button {
|
||||
|
||||
.content-floating-buttons.top-left {
|
||||
top: 10px;
|
||||
left: 10px;
|
||||
inset-inline-start: 10px;
|
||||
}
|
||||
|
||||
.content-floating-buttons.bottom-left {
|
||||
bottom: 10px;
|
||||
left: 10px;
|
||||
inset-inline-start: 10px;
|
||||
}
|
||||
|
||||
.content-floating-buttons.bottom-right {
|
||||
bottom: 10px;
|
||||
right: 10px;
|
||||
inset-inline-end: 10px;
|
||||
}
|
||||
|
||||
.content-floating-buttons button.bx {
|
||||
|
||||
@@ -67,13 +67,13 @@
|
||||
}
|
||||
|
||||
.tabulator div.tabulator-header .tabulator-frozen.tabulator-frozen-left {
|
||||
margin-left: var(--cell-editing-border-width);
|
||||
margin-inline-start: var(--cell-editing-border-width);
|
||||
}
|
||||
|
||||
.tabulator div.tabulator-header .tabulator-col,
|
||||
.tabulator div.tabulator-header .tabulator-frozen.tabulator-frozen-left {
|
||||
background: var(--col-header-background-color);
|
||||
border-right: var(--col-header-separator-border);
|
||||
border-inline-end: var(--col-header-separator-border);
|
||||
}
|
||||
|
||||
/* Table body */
|
||||
@@ -90,8 +90,8 @@
|
||||
}
|
||||
|
||||
.tabulator-row .tabulator-cell input {
|
||||
padding-left: var(--cell-horiz-padding-size) !important;
|
||||
padding-right: var(--cell-horiz-padding-size) !important;
|
||||
padding-inline-start: var(--cell-horiz-padding-size) !important;
|
||||
padding-inline-end: var(--cell-horiz-padding-size) !important;
|
||||
}
|
||||
|
||||
.tabulator-row {
|
||||
@@ -117,12 +117,12 @@
|
||||
/* Cell */
|
||||
|
||||
.tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-left {
|
||||
margin-right: var(--cell-editing-border-width);
|
||||
margin-inline-end: var(--cell-editing-border-width);
|
||||
}
|
||||
|
||||
.tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-left,
|
||||
.tabulator-row .tabulator-cell {
|
||||
border-right-color: transparent;
|
||||
border-inline-end-color: transparent;
|
||||
}
|
||||
|
||||
.tabulator-row .tabulator-cell:not(.tabulator-editable) {
|
||||
@@ -156,14 +156,14 @@
|
||||
/* Align items without children/expander to the ones with. */
|
||||
.tabulator-cell[tabulator-field="title"] > span:first-child, /* 1st level */
|
||||
.tabulator-cell[tabulator-field="title"] > div:first-child + span { /* sub-level */
|
||||
padding-left: 21px;
|
||||
padding-inline-start: 21px;
|
||||
}
|
||||
|
||||
/* Checkbox cells */
|
||||
|
||||
.tabulator .tabulator-cell:has(svg),
|
||||
.tabulator .tabulator-cell:has(input[type="checkbox"]) {
|
||||
padding-left: 8px;
|
||||
padding-inline-start: 8px;
|
||||
display: inline-flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
|
||||
@@ -120,8 +120,8 @@ body.desktop .dropdown-menu::before,
|
||||
border-radius: var(--dropdown-border-radius);
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
inset-inline-start: 0;
|
||||
inset-inline-end: 0;
|
||||
bottom: 0;
|
||||
z-index: -1;
|
||||
}
|
||||
@@ -211,7 +211,7 @@ html body .dropdown-item[disabled] {
|
||||
|
||||
.dropdown-item span.keyboard-shortcut {
|
||||
color: var(--menu-item-keyboard-shortcut-color) !important;
|
||||
margin-left: 16px;
|
||||
margin-inline-start: 16px;
|
||||
}
|
||||
|
||||
.dropdown-divider {
|
||||
@@ -224,8 +224,8 @@ html body .dropdown-item[disabled] {
|
||||
position: absolute;
|
||||
content: "";
|
||||
top: -1px;
|
||||
left: calc(0px - var(--menu-padding-size));
|
||||
right: calc(0px - var(--menu-padding-size));
|
||||
inset-inline-start: calc(0px - var(--menu-padding-size));
|
||||
inset-inline-end: calc(0px - var(--menu-padding-size));
|
||||
border-top: 1px solid var(--menu-item-delimiter-color);
|
||||
}
|
||||
|
||||
@@ -237,7 +237,7 @@ html body .dropdown-item[disabled] {
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
top: 0;
|
||||
right: 0;
|
||||
inset-inline-end: 0;
|
||||
margin: unset !important;
|
||||
border: unset !important;
|
||||
padding: 0 4px;
|
||||
@@ -246,6 +246,10 @@ html body .dropdown-item[disabled] {
|
||||
color: var(--menu-item-arrow-color) !important;
|
||||
}
|
||||
|
||||
body[dir=rtl] .dropdown-menu:not([data-popper-placement="bottom-start"]) .dropdown-toggle::after {
|
||||
content: "\ea4d" !important;
|
||||
}
|
||||
|
||||
/* Menu item group heading */
|
||||
|
||||
/* The heading body */
|
||||
@@ -264,8 +268,8 @@ html body .dropdown-item[disabled] {
|
||||
content: "";
|
||||
position: absolute;
|
||||
bottom: 8px;
|
||||
left: calc(0px - var(--menu-padding-size));
|
||||
right: calc(0px - var(--menu-padding-size));
|
||||
inset-inline-start: calc(0px - var(--menu-padding-size));
|
||||
inset-inline-end: calc(0px - var(--menu-padding-size));
|
||||
border-top: 1px solid var(--menu-item-delimiter-color);
|
||||
}
|
||||
|
||||
@@ -327,30 +331,49 @@ li.dropdown-item a.dropdown-item-button:focus-visible {
|
||||
--modal-control-button-color: var(--bs-toast-color);
|
||||
|
||||
display: flex;
|
||||
flex-direction: row-reverse;
|
||||
flex-direction: column;
|
||||
backdrop-filter: blur(6px);
|
||||
}
|
||||
|
||||
#toast-container .toast .toast-header {
|
||||
padding: 0 !important;
|
||||
background: transparent !important;
|
||||
border-bottom: none;
|
||||
color: var(--toast-text-color) !important;
|
||||
}
|
||||
|
||||
#toast-container .toast .toast-header strong {
|
||||
/* The title of the toast is no longer displayed */
|
||||
display: none;
|
||||
#toast-container .toast .toast-header strong > * {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
#toast-container .toast .toast-header .btn-close {
|
||||
margin: 0 var(--bs-toast-padding-x) 0 12px;
|
||||
margin: 0 0 0 12px;
|
||||
}
|
||||
|
||||
#toast-container .toast.no-title {
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
#toast-container .toast .toast-body {
|
||||
flex-grow: 1;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
padding-top: 0;
|
||||
}
|
||||
|
||||
#toast-container .toast:not(.no-title) .bx {
|
||||
margin-inline-end: 0.5em;
|
||||
font-size: 1.1em;
|
||||
opacity: 0.85;
|
||||
}
|
||||
|
||||
#toast-container .toast.no-title .bx {
|
||||
margin-inline-end: 0;
|
||||
font-size: 1.3em;
|
||||
}
|
||||
|
||||
#toast-container .toast.no-title .toast-body {
|
||||
padding-top: var(--bs-toast-padding-x);
|
||||
color: var(--toast-text-color);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -520,9 +543,14 @@ li.dropdown-item a.dropdown-item-button:focus-visible {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.note-list-wrapper .note-book-card .note-book-content.type-code {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.note-list-wrapper .note-book-card .note-book-content.type-code pre {
|
||||
height: 100%;
|
||||
padding: 1em;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.note-list-wrapper .note-book-card .bx {
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin-left: 8px;
|
||||
margin-inline-start: 8px;
|
||||
border: 0;
|
||||
border-radius: 50%;
|
||||
padding: 0;
|
||||
@@ -56,7 +56,7 @@
|
||||
}
|
||||
|
||||
.modal .modal-header .help-button {
|
||||
margin-right: 0;
|
||||
margin-inline-end: 0;
|
||||
font-size: calc(var(--modal-control-button-size) * .75);
|
||||
font-family: unset;
|
||||
font-weight: bold;
|
||||
@@ -141,7 +141,7 @@ div.tn-tool-dialog {
|
||||
|
||||
/* Search box wrapper */
|
||||
.jump-to-note-dialog .input-group {
|
||||
margin-right: 16px;
|
||||
margin-inline-end: 16px;
|
||||
}
|
||||
|
||||
.jump-to-note-dialog .input-group:hover {
|
||||
@@ -197,8 +197,8 @@ div.tn-tool-dialog {
|
||||
border: unset;
|
||||
padding-top: var(--timeline-item-top-padding);
|
||||
padding-bottom: var(--timeline-item-bottom-padding);
|
||||
padding-left: calc(var(--timeline-left-gap) + var(--timeline-right-gap));
|
||||
padding-right: var(--timeline-left-gap);
|
||||
padding-inline-start: calc(var(--timeline-left-gap) + var(--timeline-right-gap));
|
||||
padding-inline-end: var(--timeline-left-gap);
|
||||
color: var(--active-item-text-color);
|
||||
}
|
||||
|
||||
@@ -259,7 +259,7 @@ div.tn-tool-dialog {
|
||||
position: absolute;
|
||||
content: "";
|
||||
top: var(--connector-top, 0);
|
||||
left: calc(var(--timeline-left-gap) + ((var(--timeline-bullet-size) - var(--timeline-connector-size)) / 2));
|
||||
inset-inline-start: calc(var(--timeline-left-gap) + ((var(--timeline-bullet-size) - var(--timeline-connector-size)) / 2));
|
||||
bottom: var(--connector-bottom, 0);
|
||||
width: var(--timeline-connector-size);
|
||||
border-radius: var(--connector-radius, 0) var(--connector-radius, 0) 0 0;
|
||||
@@ -291,7 +291,7 @@ div.tn-tool-dialog {
|
||||
position: absolute;
|
||||
content: "";
|
||||
top: calc(var(--timeline-item-top-padding) + var(--timeline-bullet-vertical-pos));
|
||||
left: var(--timeline-left-gap);
|
||||
inset-inline-start: var(--timeline-left-gap);
|
||||
width: var(--timeline-bullet-size);
|
||||
height: var(--timeline-bullet-size);
|
||||
border-radius: 50%;
|
||||
@@ -374,7 +374,7 @@ div.tn-tool-dialog {
|
||||
}
|
||||
|
||||
.help-dialog .help-cards kbd:first-child {
|
||||
margin-left: 0;
|
||||
margin-inline-start: 0;
|
||||
}
|
||||
|
||||
/* Inline code - used for Markdown samples */
|
||||
@@ -392,7 +392,7 @@ div.tn-tool-dialog {
|
||||
}
|
||||
|
||||
.delete-notes-list .note-path {
|
||||
padding-left: 8px;
|
||||
padding-inline-end: 8px;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -401,7 +401,7 @@ div.tn-tool-dialog {
|
||||
|
||||
/* Labels */
|
||||
.attr-edit-table th {
|
||||
padding-right: 12px;
|
||||
padding-inline-end: 12px;
|
||||
font-weight: normal;
|
||||
white-space: nowrap;
|
||||
}
|
||||
@@ -419,5 +419,5 @@ div.tn-tool-dialog {
|
||||
}
|
||||
|
||||
.note-type-chooser-dialog div.note-type-dropdown .dropdown-item span.bx {
|
||||
margin-right: .25em;
|
||||
margin-inline-end: .25em;
|
||||
}
|
||||
@@ -62,7 +62,7 @@ button.btn.btn-secondary span.bx,
|
||||
button.btn.btn-sm span.bx,
|
||||
button.btn.btn-success span.bx {
|
||||
color: var(--cmd-button-icon-color);
|
||||
padding-right: 0.35em;
|
||||
padding-inline-end: 0.35em;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
@@ -71,7 +71,7 @@ button.btn.btn-primary kbd,
|
||||
button.btn.btn-secondary kbd,
|
||||
button.btn.btn-sm kbd,
|
||||
button.btn.btn-success kbd {
|
||||
margin-left: 0.5em;
|
||||
margin-inline-start: 0.5em;
|
||||
background: var(--cmd-button-keyboard-shortcut-background);
|
||||
color: var(--cmd-button-keyboard-shortcut-color);
|
||||
font-size: 0.6em;
|
||||
@@ -102,7 +102,7 @@ button.btn.btn-success kbd {
|
||||
}
|
||||
|
||||
.btn-group .tn-tool-button + .tn-tool-button {
|
||||
margin-left: 4px !important;
|
||||
margin-inline-start: 4px !important;
|
||||
}
|
||||
|
||||
/* The "x" icon button */
|
||||
@@ -237,7 +237,7 @@ input::selection,
|
||||
outline-offset: 6px;
|
||||
background: var(--input-background-color);
|
||||
border-radius: 6px;
|
||||
padding-right: 8px;
|
||||
padding-inline-end: 8px;
|
||||
color: var(--quick-search-color);
|
||||
flex-wrap: nowrap;
|
||||
}
|
||||
@@ -357,13 +357,20 @@ select.form-control,
|
||||
|
||||
outline: 3px solid transparent;
|
||||
outline-offset: 6px;
|
||||
padding-right: calc(15px + 1.5rem);
|
||||
background: var(--input-background-color) var(--dropdown-arrow);
|
||||
padding-inline-end: calc(15px + 1.5rem);
|
||||
background: var(--input-background-color) var(--dropdown-arrow);;
|
||||
color: var(--input-text-color);
|
||||
border: unset;
|
||||
border-radius: 0.375rem;
|
||||
}
|
||||
|
||||
body[dir=rtl] select,
|
||||
body[dir=rtl] select.form-select,
|
||||
body[dir=rtl] select.form-control,
|
||||
body[dir=rtl] .select-button.dropdown-toggle.btn {
|
||||
background-position: left 0.75rem center;
|
||||
}
|
||||
|
||||
select:hover,
|
||||
select.form-select:hover,
|
||||
select.form-control:hover,
|
||||
@@ -444,7 +451,7 @@ optgroup {
|
||||
content: "\eae1";
|
||||
width: 2em;
|
||||
height: 100%;
|
||||
right: 0;
|
||||
inset-inline-end: 0;
|
||||
top: 0;
|
||||
font-size: 1.2em;
|
||||
font-family: boxicons;
|
||||
@@ -462,7 +469,7 @@ optgroup {
|
||||
--box-label-gap: 0.5em;
|
||||
|
||||
position: relative;
|
||||
padding-left: calc(var(--box-size) + var(--box-label-gap)) !important;
|
||||
padding-inline-start: calc(var(--box-size) + var(--box-label-gap)) !important;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
@@ -471,7 +478,7 @@ optgroup {
|
||||
label.tn-checkbox > input[type="checkbox"] {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
inset-inline-start: 0;
|
||||
width: var(--box-size);
|
||||
height: 100%;
|
||||
margin: unset;
|
||||
@@ -485,7 +492,7 @@ optgroup {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 0;
|
||||
inset-inline-start: 0;
|
||||
translate: 0 -50%;
|
||||
width: var(--box-size);
|
||||
height: var(--box-size);
|
||||
|
||||
@@ -19,11 +19,11 @@
|
||||
}
|
||||
|
||||
.chat-message.user-message {
|
||||
margin-left: auto;
|
||||
margin-inline-start: auto;
|
||||
}
|
||||
|
||||
.chat-message.assistant-message {
|
||||
margin-right: auto;
|
||||
margin-inline-end: auto;
|
||||
}
|
||||
|
||||
.message-avatar {
|
||||
@@ -33,7 +33,7 @@
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-right: 8px;
|
||||
margin-inline-end: 8px;
|
||||
}
|
||||
|
||||
.user-message .message-avatar {
|
||||
|
||||
@@ -117,9 +117,9 @@
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: var(--negative-padding);
|
||||
right: var(--negative-padding);
|
||||
inset-inline-end: var(--negative-padding);
|
||||
bottom: var(--negative-padding);
|
||||
left: var(--negative-padding);
|
||||
inset-inline-start: var(--negative-padding);
|
||||
border-radius: var(--dropdown-border-radius);
|
||||
backdrop-filter: var(--dropdown-backdrop-filter);
|
||||
z-index: -1;
|
||||
@@ -210,7 +210,7 @@
|
||||
/* Separator */
|
||||
:root .ck .ck-list__separator {
|
||||
margin: .5em 0;
|
||||
margin-left: calc(0px - var(--ck-editor-popup-padding));
|
||||
margin-inline-start: calc(0px - var(--ck-editor-popup-padding));
|
||||
width: calc(100% + (var(--ck-editor-popup-padding) * 2));
|
||||
background: var(--menu-item-delimiter-color);
|
||||
}
|
||||
@@ -233,8 +233,8 @@
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: var(--negative-padding);
|
||||
left: var(--negative-padding);
|
||||
right: var(--negative-padding);
|
||||
inset-inline-start: var(--negative-padding);
|
||||
inset-inline-end: var(--negative-padding);
|
||||
border-top: 1px solid var(--ck-editor-popup-border-color);
|
||||
background: var(--menu-section-background-color);
|
||||
}
|
||||
@@ -255,7 +255,7 @@
|
||||
|
||||
:root .ck.ck-toolbar .ck.ck-toolbar__separator {
|
||||
background: transparent;
|
||||
border-left: 1px solid var(--ck-color-toolbar-border);
|
||||
border-inline-start: 1px solid var(--ck-color-toolbar-border);
|
||||
}
|
||||
|
||||
/* The last separator of the toolbar */
|
||||
@@ -354,7 +354,7 @@
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
margin: 4px;
|
||||
padding-right: 2em;
|
||||
padding-inline-end: 2em;
|
||||
border: 1px solid var(--accent);
|
||||
border-radius: 6px;
|
||||
}
|
||||
@@ -492,7 +492,7 @@ button.ck.ck-button:is(.ck-button-action, .ck-button-save, .ck-button-cancel).ck
|
||||
/* 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-left: 0 !important;
|
||||
padding-inline-start: 0 !important;
|
||||
background: transparent;
|
||||
font-size: .85em;
|
||||
font-weight: 600;
|
||||
@@ -556,7 +556,7 @@ pre button.copy-button.icon-action {
|
||||
}
|
||||
|
||||
:root pre:has(> button.copy-button) {
|
||||
padding-right: calc(var(--icon-button-size) + (var(--copy-button-margin-size) * 2));
|
||||
padding-inline-end: calc(var(--icon-button-size) + (var(--copy-button-margin-size) * 2));
|
||||
}
|
||||
|
||||
html .note-detail-editable-text :not(figure, .include-note, hr):first-child {
|
||||
@@ -615,12 +615,12 @@ html .note-detail-editable-text :not(figure, .include-note, hr):first-child {
|
||||
|
||||
.ck-content blockquote:before {
|
||||
content: "“";
|
||||
left: 0.2em;
|
||||
inset-inline-start: 0.2em;
|
||||
}
|
||||
|
||||
.ck-content blockquote:after {
|
||||
content: "”";
|
||||
right: 0.35em;
|
||||
inset-inline-end: 0.35em;
|
||||
}
|
||||
|
||||
.ck-content h2,
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
.google-login-btn img {
|
||||
margin-right: 10px;
|
||||
margin-inline-end: 10px;
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
}
|
||||
@@ -199,7 +199,7 @@ body.desktop .option-section:not(.tn-no-card) {
|
||||
color: var(--launcher-pane-text-color);
|
||||
margin-top: calc(-1 * var(--options-card-padding) - var(--options-title-font-size) - var(--options-title-offset)) !important;
|
||||
margin-bottom: calc(var(--options-title-offset) + var(--options-card-padding)) !important;
|
||||
margin-left: calc(-1 * var(--options-card-padding));
|
||||
margin-inline-start: calc(-1 * var(--options-card-padding));
|
||||
}
|
||||
|
||||
.options-section:not(.tn-no-card) h5 {
|
||||
@@ -216,8 +216,8 @@ body.desktop .option-section:not(.tn-no-card) {
|
||||
.options-section hr {
|
||||
--bs-border-width: 2px;
|
||||
|
||||
margin-left: calc(var(--options-card-padding) * -1);
|
||||
margin-right: calc(var(--options-card-padding) * -1);
|
||||
margin-inline-start: calc(var(--options-card-padding) * -1);
|
||||
margin-inline-end: calc(var(--options-card-padding) * -1);
|
||||
opacity: 1;
|
||||
color: var(--root-background);
|
||||
}
|
||||
|
||||
@@ -95,7 +95,7 @@ div.promoted-attributes-container {
|
||||
/* Note type dropdown */
|
||||
|
||||
ul.note-type-dropdown .check {
|
||||
margin-right: 6px;
|
||||
margin-inline-end: 6px;
|
||||
}
|
||||
|
||||
ul.note-type-dropdown li.dropdown-item {
|
||||
@@ -105,7 +105,7 @@ ul.note-type-dropdown li.dropdown-item {
|
||||
/* Editability dropdown */
|
||||
|
||||
ul.editability-dropdown li.dropdown-item > div {
|
||||
margin-left: 4px;
|
||||
margin-inline-start: 4px;
|
||||
}
|
||||
|
||||
.editability-dropdown .dropdown-item .description {
|
||||
@@ -142,12 +142,12 @@ ul.editability-dropdown li.dropdown-item > div {
|
||||
}
|
||||
|
||||
.attribute-list .save-attributes-button {
|
||||
right: 30px;
|
||||
inset-inline-end: 30px;
|
||||
}
|
||||
|
||||
/* Note path in attribute detail dialog */
|
||||
.attr-detail .note-path {
|
||||
margin-left: 8px;
|
||||
margin-inline-start: 8px;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -69,7 +69,7 @@ body.background-effects.platform-win32.layout-vertical #vertical-main-container
|
||||
|
||||
/* Add a border to the vertical launch bar if collapsed. */
|
||||
body.layout-vertical #horizontal-main-container.left-pane-hidden #launcher-pane.vertical {
|
||||
border-right: 2px solid var(--left-pane-collapsed-border-color);
|
||||
border-inline-end: 2px solid var(--left-pane-collapsed-border-color);
|
||||
}
|
||||
|
||||
body.background-effects.zen #root-widget {
|
||||
@@ -284,7 +284,7 @@ body.layout-horizontal > .horizontal {
|
||||
}
|
||||
|
||||
#launcher-pane.horizontal .global-menu-button .global-menu-button-update-available {
|
||||
right: -23px;
|
||||
inset-inline-end: -23px;
|
||||
bottom: -22px;
|
||||
transform: scale(0.85);
|
||||
}
|
||||
@@ -400,9 +400,9 @@ body.layout-horizontal > .horizontal {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: var(--vertical-margin);
|
||||
right: var(--horiz-margin);
|
||||
inset-inline-end: var(--horiz-margin);
|
||||
bottom: var(--vertical-margin);
|
||||
left: var(--horiz-margin);
|
||||
inset-inline-start: var(--horiz-margin);
|
||||
border-radius: 6px;
|
||||
background: var(--calendar-day-highlight-background);
|
||||
z-index: -1;
|
||||
@@ -450,7 +450,7 @@ div.bookmark-folder-widget .note-link:hover {
|
||||
}
|
||||
|
||||
div.bookmark-folder-widget .note-link a {
|
||||
padding-left: 8px;
|
||||
padding-inline-start: 8px;
|
||||
color: var(--menu-text-color);
|
||||
cursor: default;
|
||||
}
|
||||
@@ -471,8 +471,8 @@ div.bookmark-folder-widget .note-link .bx {
|
||||
|
||||
div.quick-search {
|
||||
--padding-top: 8px;
|
||||
--padding-left: 8px;
|
||||
--padding-right: 8px;
|
||||
--padding-inline-start: 8px;
|
||||
--padding-inline-end: 8px;
|
||||
--padding-bottom: 8px;
|
||||
|
||||
position: relative;
|
||||
@@ -480,7 +480,7 @@ div.quick-search {
|
||||
align-items: center;
|
||||
height: unset;
|
||||
contain: unset;
|
||||
padding: var(--padding-top) var(--padding-right) var(--padding-bottom) var(--padding-left);
|
||||
padding: var(--padding-top) var(--padding-inline-end) var(--padding-bottom) var(--padding-inline-start);
|
||||
}
|
||||
|
||||
div.quick-search,
|
||||
@@ -496,9 +496,9 @@ div.quick-search::before {
|
||||
position: absolute;
|
||||
content: "";
|
||||
top: var(--padding-top);
|
||||
left: var(--padding-left);
|
||||
inset-inline-start: var(--padding-inline-start);
|
||||
bottom: var(--padding-bottom);
|
||||
right: var(--padding-right);
|
||||
inset-inline-end: var(--padding-inline-end);
|
||||
z-index: 0;
|
||||
border: 2px solid transparent;
|
||||
border-radius: 6px;
|
||||
@@ -520,7 +520,7 @@ div.quick-search:focus-within:before {
|
||||
}
|
||||
|
||||
div.quick-search input {
|
||||
padding-left: 15px !important;
|
||||
padding-inline-start: 15px !important;
|
||||
box-shadow: unset !important;
|
||||
background: transparent !important;
|
||||
}
|
||||
@@ -539,7 +539,7 @@ div.quick-search .search-button {
|
||||
justify-content: center;
|
||||
width: 25px;
|
||||
height: 25px;
|
||||
margin-right: 8px;
|
||||
margin-inline-end: 8px;
|
||||
border-radius: 50%;
|
||||
padding: 0;
|
||||
color: var(--quick-search-color) !important;
|
||||
@@ -631,12 +631,12 @@ body.layout-vertical.background-effects div.quick-search .dropdown-menu {
|
||||
}
|
||||
|
||||
#left-pane .ui-fancytree ul {
|
||||
padding-left: 10px;
|
||||
padding-inline-start: 10px;
|
||||
}
|
||||
|
||||
/* The root element of the tree */
|
||||
#left-pane .fancytree-container > li:first-child > span {
|
||||
padding-left: 12px;
|
||||
padding-inline-start: 12px;
|
||||
}
|
||||
|
||||
#left-pane span.fancytree-node.fancytree-active {
|
||||
@@ -658,9 +658,9 @@ body.layout-vertical.background-effects div.quick-search .dropdown-menu {
|
||||
position: absolute;
|
||||
content: "";
|
||||
top: var(--left-pane-item-selected-shadow-size);
|
||||
left: var(--left-pane-item-selected-shadow-size);
|
||||
inset-inline-start: var(--left-pane-item-selected-shadow-size);
|
||||
bottom: var(--left-pane-item-selected-shadow-size);
|
||||
right: var(--left-pane-item-selected-shadow-size);
|
||||
inset-inline-end: var(--left-pane-item-selected-shadow-size);
|
||||
background: var(--left-pane-item-selected-background) !important;
|
||||
box-shadow: var(--left-pane-item-selected-shadow);
|
||||
border-radius: 6px;
|
||||
@@ -676,7 +676,7 @@ body.layout-vertical.background-effects div.quick-search .dropdown-menu {
|
||||
#left-pane span.fancytree-node.protected > span.fancytree-custom-icon:after {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
inset-inline-end: 0;
|
||||
font-size: 14px;
|
||||
content: "\eb4a";
|
||||
font-family: "boxicons";
|
||||
@@ -685,6 +685,10 @@ body.layout-vertical.background-effects div.quick-search .dropdown-menu {
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
body[dir=rtl] #left-pane span.fancytree-node.protected > span.fancytree-custom-icon:after {
|
||||
transform: translateX(-25%);
|
||||
}
|
||||
|
||||
body.mobile .fancytree-expander::before,
|
||||
body.mobile .fancytree-title,
|
||||
body.mobile .fancytree-node > span {
|
||||
@@ -699,7 +703,7 @@ body.mobile .fancytree-node > span {
|
||||
body.mobile:not(.force-fixed-tree) #mobile-sidebar-wrapper {
|
||||
border-top-right-radius: 12px;
|
||||
border-bottom-right-radius: 12px;
|
||||
border-right: 1px solid var(--subtle-border-color);
|
||||
border-inline-end: 1px solid var(--subtle-border-color);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -734,7 +738,7 @@ body.mobile .fancytree-node > span {
|
||||
}
|
||||
|
||||
#left-pane .tree-item-button {
|
||||
margin-right: 6px;
|
||||
margin-inline-end: 6px;
|
||||
border: unset;
|
||||
border-radius: 50%;
|
||||
background: var(--left-pane-item-action-button-background);
|
||||
@@ -768,12 +772,12 @@ body.mobile .fancytree-node > span {
|
||||
/* Toolbar container (collapsed state) */
|
||||
#left-pane .tree-actions {
|
||||
max-width: var(--tree-actions-toolbar-collapsed-width);
|
||||
right: var(--tree-actions-toolbar-horizontal-margin);
|
||||
inset-inline-end: var(--tree-actions-toolbar-horizontal-margin);
|
||||
bottom: var(--tree-actions-toolbar-vertical-margin);
|
||||
overflow: hidden;
|
||||
border: 1px solid transparent;
|
||||
padding: var(--tree-actions-toolbar-padding-size);
|
||||
padding-right: var(--tree-actions-toolbar-collapsed-width);
|
||||
padding-inline-end: var(--tree-actions-toolbar-collapsed-width);
|
||||
background: transparent;
|
||||
transition:
|
||||
max-width 400ms ease-out,
|
||||
@@ -817,7 +821,7 @@ body.mobile .fancytree-node > span {
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
top: 50%;
|
||||
right: calc((var(--tree-actions-toolbar-collapsed-width) - var(--tree-actions-toolbar-expand-button-size)) / 2);
|
||||
inset-inline-end: calc((var(--tree-actions-toolbar-collapsed-width) - var(--tree-actions-toolbar-expand-button-size)) / 2);
|
||||
width: var(--tree-actions-toolbar-expand-button-size);
|
||||
height: var(--tree-actions-toolbar-expand-button-size);
|
||||
box-shadow: 2px 2px 6px var(--left-pane-background-color);
|
||||
@@ -906,8 +910,8 @@ body.electron.background-effects.layout-horizontal .tab-row-container .toggle-bu
|
||||
content: "";
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: -10px;
|
||||
right: -10px;
|
||||
inset-inline-start: -10px;
|
||||
inset-inline-end: -10px;
|
||||
top: 32px;
|
||||
height: 1px;
|
||||
border-bottom: 1px solid var(--launcher-pane-horiz-border-color);
|
||||
@@ -918,13 +922,13 @@ body.electron.background-effects.layout-horizontal .tab-row-container .tab-scrol
|
||||
position: relative;
|
||||
}
|
||||
|
||||
body.electron.background-effects.layout-horizontal .tab-row-container .tab-scroll-button-left:after,
|
||||
body.electron.background-effects.layout-horizontal .tab-row-container .tab-scroll-button-right:after {
|
||||
body.electron.background-effects.layout-horizontal .tab-row-container .tab-scroll-button-inset-inline-start:after,
|
||||
body.electron.background-effects.layout-horizontal .tab-row-container .tab-scroll-button-inset-inline-end:after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
inset-inline-start: 0px;
|
||||
inset-inline-end: 0px;
|
||||
height: 1px;
|
||||
border-bottom: 1px solid var(--launcher-pane-horiz-border-color);
|
||||
}
|
||||
@@ -933,9 +937,9 @@ body.electron.background-effects.layout-horizontal .tab-row-container .note-tab[
|
||||
content: "";
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: -32768px;
|
||||
inset-inline-start: -32768px;
|
||||
top: var(--tab-height);
|
||||
right: calc(100% - 1px);
|
||||
inset-inline-end: calc(100% - 1px);
|
||||
height: 1px;
|
||||
border-bottom: 1px solid var(--launcher-pane-horiz-border-color);
|
||||
}
|
||||
@@ -944,9 +948,9 @@ body.electron.background-effects.layout-horizontal .tab-row-container .note-tab[
|
||||
content: "";
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 100%;
|
||||
inset-inline-start: 100%;
|
||||
top: var(--tab-height);
|
||||
right: 0;
|
||||
inset-inline-end: 0;
|
||||
width: 100vw;
|
||||
height: 1px;
|
||||
border-bottom: 1px solid var(--launcher-pane-horiz-border-color);
|
||||
@@ -956,9 +960,9 @@ body.electron.background-effects.layout-horizontal .tab-row-container .note-new-
|
||||
content: "";
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: -4px;
|
||||
inset-inline-start: -4px;
|
||||
top: calc(var(--tab-height), -1);
|
||||
right: 0;
|
||||
inset-inline-end: 0;
|
||||
width: 100vw;
|
||||
height: 1px;
|
||||
border-bottom: 1px solid var(--launcher-pane-horiz-border-color);
|
||||
@@ -1045,18 +1049,18 @@ body.layout-horizontal .tab-row-widget .note-tab .note-tab-wrapper {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
inset-inline-start: 0;
|
||||
inset-inline-end: 0;
|
||||
height: 3px;
|
||||
background-color: var(--workspace-tab-background-color);
|
||||
}
|
||||
|
||||
.tab-row-widget .note-tab:nth-child(1) {
|
||||
body:not([dir=rtl]) .tab-row-widget .note-tab:nth-child(1) {
|
||||
transform: translate3d(var(--tab-first-item-horiz-offset), 0, 0);
|
||||
}
|
||||
|
||||
:root .tab-row-widget .note-tab .note-tab-icon {
|
||||
padding-right: 5px; /* The gap between the icon and the title */
|
||||
padding-inline-end: 5px; /* The gap between the icon and the title */
|
||||
}
|
||||
|
||||
.tab-row-widget .note-tab[active] .note-tab-icon {
|
||||
@@ -1101,7 +1105,7 @@ body.layout-vertical .tab-row-widget-is-sorting .note-tab.note-tab-is-dragging .
|
||||
|
||||
.tab-row-widget .note-new-tab {
|
||||
position: relative;
|
||||
margin-left: 3px;
|
||||
margin-inline-start: 3px;
|
||||
color: transparent; /* Prevent the original "+" from being displayed */
|
||||
}
|
||||
|
||||
@@ -1114,7 +1118,7 @@ body.layout-vertical .tab-row-widget-is-sorting .note-tab.note-tab-is-dragging .
|
||||
position: absolute;
|
||||
content: "";
|
||||
top: calc((var(--tab-height) - var(--new-tab-button-size)) / 2);
|
||||
left: calc((var(--tab-height) - var(--new-tab-button-size)) / 2);
|
||||
inset-inline-start: calc((var(--tab-height) - var(--new-tab-button-size)) / 2);
|
||||
width: var(--new-tab-button-size);
|
||||
height: var(--new-tab-button-size);
|
||||
background: var(--new-tab-button-background);
|
||||
@@ -1139,7 +1143,7 @@ body.layout-vertical .tab-row-widget-is-sorting .note-tab.note-tab-is-dragging .
|
||||
display: flex;
|
||||
position: absolute;
|
||||
content: "\ebc0";
|
||||
left: 0;
|
||||
inset-inline-start: 0;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
@@ -1221,23 +1225,23 @@ body.mobile .note-title {
|
||||
}
|
||||
|
||||
.title-row > *:first-child {
|
||||
margin-right: 0;
|
||||
margin-inline-end: 0;
|
||||
}
|
||||
|
||||
.title-row > *:nth-child(2) {
|
||||
margin-left: 0;
|
||||
margin-inline-start: 0;
|
||||
}
|
||||
|
||||
.title-row {
|
||||
/* Aligns the "Create new split" button with the note menu button (the three dots button) */
|
||||
padding-right: 3px;
|
||||
padding-inline-end: 3px;
|
||||
}
|
||||
|
||||
.note-title-widget input {
|
||||
--input-background-color: transparent;
|
||||
|
||||
border-radius: 8px;
|
||||
padding-left: 12px;
|
||||
padding-inline-start: 12px;
|
||||
}
|
||||
|
||||
/* The "Change note icon" button */
|
||||
@@ -1312,7 +1316,7 @@ body.mobile .note-title {
|
||||
/* The promoted attributes section */
|
||||
div.promoted-attributes-container {
|
||||
display: flex;
|
||||
margin-right: 10%;
|
||||
margin-inline-end: 10%;
|
||||
padding: 6px 0;
|
||||
gap: 8px;
|
||||
align-items: stretch;
|
||||
@@ -1326,8 +1330,8 @@ div.promoted-attributes-container input {
|
||||
|
||||
/* A promoted attribute card */
|
||||
div.promoted-attribute-cell {
|
||||
--pa-card-padding-left: 16px;
|
||||
--pa-card-padding-right: 2px;
|
||||
--pa-card-padding-inline-start: 16px;
|
||||
--pa-card-padding-inline-end: 2px;
|
||||
--input-background-color: transparent;
|
||||
|
||||
box-shadow: 1px 1px 2px var(--promoted-attribute-card-shadow-color);
|
||||
@@ -1335,7 +1339,7 @@ div.promoted-attribute-cell {
|
||||
display: inline-flex;
|
||||
margin: 0;
|
||||
border-radius: 8px;
|
||||
padding: 2px var(--pa-card-padding-right) 2px var(--pa-card-padding-left);
|
||||
padding: 2px var(--pa-card-padding-inline-end) 2px var(--pa-card-padding-inline-start);
|
||||
background: var(--promoted-attribute-card-background-color);
|
||||
overflow-y: visible;
|
||||
}
|
||||
@@ -1350,7 +1354,7 @@ div.promoted-attribute-cell {
|
||||
/* A promoted attribute card (boolean attribute) */
|
||||
div.promoted-attribute-cell:has(input[type="checkbox"]):not(:has(.multiplicity > span)) {
|
||||
/* Checbox attribute, without multiplicity */
|
||||
padding-right: var(--pa-card-padding-left);
|
||||
padding-inline-end: var(--pa-card-padding-inline-start);
|
||||
}
|
||||
|
||||
div.promoted-attribute-cell > * {
|
||||
@@ -1400,16 +1404,23 @@ div.promoted-attribute-cell .tn-checkbox {
|
||||
/* Relocate the checkbox before the label */
|
||||
div.promoted-attribute-cell.promoted-attribute-label-boolean > div:first-of-type {
|
||||
order: -1;
|
||||
margin-right: 1.5em;
|
||||
margin-inline-end: 1.5em;
|
||||
}
|
||||
|
||||
/* The element containing the "new attribute" and "remove this attribute button" */
|
||||
div.promoted-attribute-cell .multiplicity:has(span) {
|
||||
--icon-button-size: 24px;
|
||||
|
||||
margin-left: 8px;
|
||||
margin-right: calc(var(--pa-card-padding-left) - var(--pa-card-padding-right));
|
||||
margin-inline-start: 8px;
|
||||
margin-inline-end: calc(var(--pa-card-padding-inline-start) - var(--pa-card-padding-inline-end));
|
||||
font-size: 0; /* Prevent whitespaces creating a gap between buttons */
|
||||
display: flex;
|
||||
}
|
||||
|
||||
div.promoted-attribute-cell .multiplicity:has(span) span {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1429,6 +1440,10 @@ div#center-pane .floating-buttons-children {
|
||||
opacity 250ms ease-out;
|
||||
}
|
||||
|
||||
body[dir=rtl] div#center-pane .floating-buttons-children {
|
||||
transform-origin: left;
|
||||
}
|
||||
|
||||
/* Floating buttons container (collapsed) */
|
||||
div#center-pane .floating-buttons-children.temporarily-hidden {
|
||||
display: flex !important;
|
||||
@@ -1540,7 +1555,7 @@ div.floating-buttons-children .close-floating-buttons {
|
||||
}
|
||||
|
||||
div.floating-buttons-children .close-floating-buttons {
|
||||
margin-left: 0 !important;
|
||||
margin-inline-start: 0 !important;
|
||||
background: var(--floating-button-hide-button-background);
|
||||
color: var(--floating-button-hide-button-color);
|
||||
}
|
||||
@@ -1630,12 +1645,12 @@ div.find-replace-widget div.find-widget-found-wrapper > span {
|
||||
}
|
||||
|
||||
.find-replace-widget .form-check {
|
||||
padding-left: 0;
|
||||
padding-inline-start: 0;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.find-replace-widget .form-check .form-check-input {
|
||||
margin-left: 0;
|
||||
margin-inline-start: 0;
|
||||
}
|
||||
|
||||
/* Narrow version */
|
||||
@@ -1655,13 +1670,13 @@ div.find-replace-widget div.find-widget-found-wrapper > span {
|
||||
|
||||
.find-widget-box,
|
||||
.replace-widget-box {
|
||||
padding-right: 3em !important;
|
||||
padding-inline-end: 3em !important;
|
||||
}
|
||||
|
||||
.find-widget-close-button {
|
||||
position: absolute;
|
||||
top: .85em;
|
||||
right: .5em;
|
||||
inset-inline-end: .5em;
|
||||
}
|
||||
|
||||
.find-widget-box > * {
|
||||
@@ -1693,7 +1708,7 @@ div.find-replace-widget div.find-widget-found-wrapper > span {
|
||||
}
|
||||
|
||||
.replace-widget-box > * {
|
||||
margin-right: unset !important;
|
||||
margin-inline-end: unset !important;
|
||||
}
|
||||
|
||||
div.replace-widget-box button.btn.btn-sm {
|
||||
@@ -1736,7 +1751,7 @@ div.find-replace-widget div.find-widget-found-wrapper > span {
|
||||
#right-pane .toc li,
|
||||
#right-pane .highlights-list li {
|
||||
padding-top: 2px;
|
||||
padding-right: 8px;
|
||||
padding-inline-end: 8px;
|
||||
padding-bottom: 2px;
|
||||
border-radius: 4px;
|
||||
text-align: unset;
|
||||
@@ -1799,8 +1814,8 @@ div.find-replace-widget div.find-widget-found-wrapper > span {
|
||||
}
|
||||
|
||||
.excalidraw .dropdown-menu .dropdown-menu-container > div:not([class]):not(:last-child) {
|
||||
margin-left: calc(var(--padding) * var(--space-factor) * -1) !important;
|
||||
margin-right: calc(var(--padding) * var(--space-factor) * -1) !important;
|
||||
margin-inline-start: calc(var(--padding) * var(--space-factor) * -1) !important;
|
||||
margin-inline-end: calc(var(--padding) * var(--space-factor) * -1) !important;
|
||||
}
|
||||
|
||||
.excalidraw .dropdown-menu:before {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
ul.fancytree-container {
|
||||
padding-left: 0;
|
||||
padding-inline-start: 0;
|
||||
}
|
||||
|
||||
ul.fancytree-container li {
|
||||
@@ -15,7 +15,7 @@ span.fancytree-node.fancytree-hide {
|
||||
flex-shrink: 1;
|
||||
flex-grow: 1;
|
||||
overflow: hidden;
|
||||
margin-left: 7px;
|
||||
margin-inline-start: 7px;
|
||||
outline: none;
|
||||
position: relative;
|
||||
top: 2px;
|
||||
@@ -59,7 +59,11 @@ span.fancytree-node.fancytree-hide {
|
||||
line-height: 1;
|
||||
position: relative;
|
||||
top: 2px;
|
||||
margin-right: 5px;
|
||||
margin-inline-end: 5px;
|
||||
}
|
||||
|
||||
body[dir=rtl] .fancytree-node:not(.fancytree-loading):not(.fancytree-expanded) .fancytree-expander:before {
|
||||
content: "\ea4d"; /* bx bx-chevron-left */
|
||||
}
|
||||
|
||||
.fancytree-loading span.fancytree-expander {
|
||||
@@ -80,7 +84,7 @@ span.fancytree-node.fancytree-hide {
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
margin-top: 2px;
|
||||
margin-left: 1px;
|
||||
margin-inline-start: 1px;
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
}
|
||||
@@ -169,11 +173,11 @@ span.fancytree-node.fancytree-active-clone:not(.fancytree-active) .fancytree-tit
|
||||
|
||||
/* first nesting level has lower left padding to avoid extra left padding. Other levels are not affected */
|
||||
.ui-fancytree > li > ul {
|
||||
padding-left: 5px;
|
||||
padding-inline-start: 5px;
|
||||
}
|
||||
|
||||
.ui-fancytree ul {
|
||||
padding-left: 20px;
|
||||
padding-inline-start: 20px;
|
||||
}
|
||||
|
||||
span.fancytree-active {
|
||||
@@ -229,14 +233,14 @@ span.fancytree-node.archived {
|
||||
display: none;
|
||||
font-size: 120%;
|
||||
cursor: pointer;
|
||||
margin-left: 8px;
|
||||
margin-inline-start: 8px;
|
||||
padding: 1px;
|
||||
border: 1px solid transparent;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.unhoist-button.bx.tree-item-button {
|
||||
margin-left: 0; /* unhoist button is on the left and doesn't need more margin */
|
||||
margin-inline-start: 0; /* unhoist button is on the left and doesn't need more margin */
|
||||
display: block; /* keep always visible */
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,968 @@
|
||||
{
|
||||
"about": {
|
||||
"title": "حول تريليوم للملاحظات"
|
||||
"title": "حول تريليوم للملاحظات",
|
||||
"homepage": "الصفحة الرئيسية:",
|
||||
"app_version": "اصدار التطبيق:",
|
||||
"sync_version": "اصدار المزامنه:",
|
||||
"build_date": "تاريخ الانشاء:",
|
||||
"build_revision": "مراجعة الاصدار:",
|
||||
"data_directory": "مجلد البيانات:",
|
||||
"db_version": "اصدار قاعدة البيانات:"
|
||||
},
|
||||
"toast": {
|
||||
"critical-error": {
|
||||
"title": "خطأ فادح"
|
||||
}
|
||||
},
|
||||
"add_link": {
|
||||
"add_link": "أضافة رابط",
|
||||
"note": "ملاحظة",
|
||||
"search_note": "البحث عن الملاحظة بالاسم",
|
||||
"link_title": "عنوان الرابط",
|
||||
"button_add_link": "اضافة رابط"
|
||||
},
|
||||
"branch_prefix": {
|
||||
"edit_branch_prefix": "تعديل بادئة الفرع",
|
||||
"prefix": "البادئة: ",
|
||||
"save": "حفظ"
|
||||
},
|
||||
"bulk_actions": {
|
||||
"bulk_actions": "اجراءات جماعية",
|
||||
"available_actions": "الاجراءات المتاحة",
|
||||
"chosen_actions": "الأجراءات المختارة",
|
||||
"execute_bulk_actions": "تنفيذ الأجراءات الجماعية",
|
||||
"bulk_actions_executed": "تم تنفيذ الاجراءات الجماعية بنجاح،",
|
||||
"none_yet": "لايوجد أجراء بعد... اضف اجراء بالنقر على احد الأجراءات المتاحة اعلاه.",
|
||||
"relations": "العلاقات",
|
||||
"notes": "الملاحظات",
|
||||
"other": "أخرى",
|
||||
"affected_notes": "الملاحظات المتأثرة",
|
||||
"labels": "التسميات"
|
||||
},
|
||||
"upload_attachments": {
|
||||
"options": "خيارات",
|
||||
"upload": "تحميل",
|
||||
"choose_files": "اختر الملفات",
|
||||
"shrink_images": "تصغير الصور"
|
||||
},
|
||||
"attribute_detail": {
|
||||
"name": "الاسم",
|
||||
"value": "قيمة",
|
||||
"promoted": "تمت ترقيته",
|
||||
"promoted_alias": "اسم مستعار",
|
||||
"label_type": "نوع",
|
||||
"text": "نص",
|
||||
"date": "تاريخ",
|
||||
"time": "وقت",
|
||||
"precision": "دفة",
|
||||
"digits": "رقم",
|
||||
"delete": "حذف",
|
||||
"color_type": "لون",
|
||||
"multiplicity": "تعددية",
|
||||
"number": "عدد",
|
||||
"boolean": "منطقي",
|
||||
"url": "عنوان الويب",
|
||||
"inheritable": "قابل للوراثة",
|
||||
"target_note": "الملاحظة الهدف",
|
||||
"single_value": "قيمة واحدة",
|
||||
"multi_value": "قيم متعددة",
|
||||
"inverse_relation": "العلاقة العكسية",
|
||||
"more_notes": "مزيد من الملاحظات",
|
||||
"label": "تفاصيل التسمية",
|
||||
"relation": "تفاصيل العلاقة"
|
||||
},
|
||||
"rename_label": {
|
||||
"to": "الى",
|
||||
"old_name_placeholder": "الاسم القديم",
|
||||
"new_name_placeholder": "الاسم الجديد",
|
||||
"rename_label": "اعادة تسمية التسمية"
|
||||
},
|
||||
"move_note": {
|
||||
"to": "الى",
|
||||
"move_note": "نقل الملاحظة"
|
||||
},
|
||||
"add_relation": {
|
||||
"to": "الى",
|
||||
"add_relation": "اضافة علاقة",
|
||||
"relation_name": "اسم العلاقة",
|
||||
"target_note": "الملاحظة الهدف"
|
||||
},
|
||||
"rename_relation": {
|
||||
"to": "الى",
|
||||
"rename_relation": "اعادة تسمية العلاقة",
|
||||
"old_name": "الاسم القديم",
|
||||
"new_name": "الاسم الجديد"
|
||||
},
|
||||
"update_relation_target": {
|
||||
"to": "الى",
|
||||
"update_relation": "تحديث العلاقة",
|
||||
"relation_name": "اسم العلاقة",
|
||||
"target_note": "الملاحظة الهدف"
|
||||
},
|
||||
"attachments_actions": {
|
||||
"download": "تنزيل",
|
||||
"open_externally": "فتح خارجي",
|
||||
"open_custom": "فتح مخصص",
|
||||
"rename_attachment": "اعادة تسمية المرفق",
|
||||
"delete_attachment": "حذف المرفق"
|
||||
},
|
||||
"calendar": {
|
||||
"week": "أسبوع",
|
||||
"month": "شهر",
|
||||
"year": "سنة",
|
||||
"list": "قائمة",
|
||||
"today": "اليوم",
|
||||
"mon": "الاثنين",
|
||||
"tue": "الثلاثاء",
|
||||
"wed": "الأربعاء",
|
||||
"thu": "الخميس",
|
||||
"fri": "الجمعة",
|
||||
"sat": "السبت",
|
||||
"sun": "الاحد",
|
||||
"january": "يناير",
|
||||
"march": "مارس",
|
||||
"april": "ابريل",
|
||||
"may": "مايو",
|
||||
"june": "يونيو",
|
||||
"july": "يوليو",
|
||||
"august": "أغسطس",
|
||||
"september": "سبتمبر",
|
||||
"october": "اكتوبر",
|
||||
"november": "نوفمبر",
|
||||
"december": "ديسمبر",
|
||||
"february": "فبراير",
|
||||
"week_previous": "الاسبوع السابق",
|
||||
"week_next": "الاسبوع التالي",
|
||||
"month_previous": "الشهر السابق",
|
||||
"month_next": "الشهر التالي",
|
||||
"year_previous": "السنة السابقة",
|
||||
"year_next": "السنة التالية"
|
||||
},
|
||||
"global_menu": {
|
||||
"menu": "القائمة",
|
||||
"options": "خيارات",
|
||||
"advanced": "متقدمة",
|
||||
"logout": "تسجيل خروج",
|
||||
"zoom": "تكبير/تصغير",
|
||||
"toggle_fullscreen": "تشغيل/ايقاف ملء الشاشة",
|
||||
"zoom_out": "تصغير",
|
||||
"zoom_in": "تكبير",
|
||||
"configure_launchbar": "اعداد شريط الاطلاق",
|
||||
"reload_frontend": "اعادة تحميل الواجهة",
|
||||
"show_help": "عرض المساعدة",
|
||||
"show-cheatsheet": "عرض دليل الاختصارات",
|
||||
"toggle-zen-mode": "وضع التركيز"
|
||||
},
|
||||
"zpetne_odkazy": {
|
||||
"relation": "العلاقة"
|
||||
},
|
||||
"note_icon": {
|
||||
"category": "الفئة:",
|
||||
"search": "بحث:"
|
||||
},
|
||||
"basic_properties": {
|
||||
"language": "اللغة",
|
||||
"editable": "قابل للتعديل",
|
||||
"note_type": "نوع الملاحظة",
|
||||
"basic_properties": "الخصائص الاساسية"
|
||||
},
|
||||
"book_properties": {
|
||||
"list": "قائمة",
|
||||
"expand": "توسيع",
|
||||
"calendar": "التقويم",
|
||||
"table": "جدول",
|
||||
"board": "لوحة",
|
||||
"grid": "خطوط شبكة",
|
||||
"collapse": "طي",
|
||||
"view_type": "نوع العرض",
|
||||
"book_properties": "خصائص المجموعة",
|
||||
"geo-map": "الخريطة الجغرافية"
|
||||
},
|
||||
"file_properties": {
|
||||
"download": "تنزيل",
|
||||
"open": "فتح",
|
||||
"title": "ملف",
|
||||
"note_id": "معرف الملاحظة",
|
||||
"file_type": "نوع الملف",
|
||||
"file_size": "حجم الملف"
|
||||
},
|
||||
"image_properties": {
|
||||
"download": "تنزيل",
|
||||
"open": "فتح",
|
||||
"title": "صورة",
|
||||
"file_type": "نوع الملف",
|
||||
"file_size": "حجم الملف"
|
||||
},
|
||||
"note_info_widget": {
|
||||
"created": "انشاء",
|
||||
"type": "نوع",
|
||||
"modified": "معدل",
|
||||
"calculate": "حساب",
|
||||
"note_id": "معرف الملاحظة",
|
||||
"note_size": "حجم الملاحظة",
|
||||
"title": "معلومات الملاحظة"
|
||||
},
|
||||
"note_paths": {
|
||||
"search": "بحث",
|
||||
"archived": "مؤرشف",
|
||||
"title": "مسارات الملاحظة"
|
||||
},
|
||||
"script_executor": {
|
||||
"query": "استعلام",
|
||||
"script": "برنامج نصي",
|
||||
"execute_query": "تنفيذ الاستعلام",
|
||||
"execute_script": "تنفيذ السكربت"
|
||||
},
|
||||
"search_definition": {
|
||||
"ancestor": "السلف",
|
||||
"limit": "الحد الاقصى",
|
||||
"action": "أجراء",
|
||||
"search_button": "بحث",
|
||||
"debug": "تصحيح الاخطاء",
|
||||
"search_string": "سلسة البحث",
|
||||
"search_script": "نص البحث",
|
||||
"fast_search": "بحث سريع",
|
||||
"include_archived": "تضمين العناصر المؤرشفة",
|
||||
"order_by": "ترتيب حسب",
|
||||
"search_parameters": "معايير البحث"
|
||||
},
|
||||
"ancestor": {
|
||||
"label": "السلف",
|
||||
"depth_label": "العمق",
|
||||
"depth_doesnt_matter": "لايهم",
|
||||
"direct_children": "العقد الفرعية المباشرة"
|
||||
},
|
||||
"limit": {
|
||||
"limit": "الحد الاقصى"
|
||||
},
|
||||
"debug": {
|
||||
"debug": "تصحيح الاخطاء"
|
||||
},
|
||||
"order_by": {
|
||||
"title": "عنوان",
|
||||
"desc": "تنازلي",
|
||||
"order_by": "ترتيب حسب",
|
||||
"relevancy": "الاهمية (افتراضيا)",
|
||||
"date_created": "تاريخ الانشاء",
|
||||
"random": "ترتيب عشوائي",
|
||||
"asc": "تصاعدي (افتراضيا)"
|
||||
},
|
||||
"search_string": {
|
||||
"search_prefix": "بحث:",
|
||||
"title_column": "سلسلة البحث:",
|
||||
"search_syntax": "صياغة البحث",
|
||||
"also_see": "انظر ايضا"
|
||||
},
|
||||
"sync": {
|
||||
"title": "مزامنة"
|
||||
},
|
||||
"fonts": {
|
||||
"fonts": "خطوط",
|
||||
"size": "حجم",
|
||||
"serif": "خط ومزخرف",
|
||||
"monospace": "خط بعرض ثابت",
|
||||
"theme_defined": "النسق المحدد",
|
||||
"main_font": "الخط الرئيسي",
|
||||
"font_family": "عائلة الخطوط",
|
||||
"reload_frontend": "اعادة تحميل الواجهة",
|
||||
"generic-fonts": "الخطوط العامة",
|
||||
"sans-serif": "خطوط بدون زوائد",
|
||||
"system-default": "الاعداد الافتراضي للنظام"
|
||||
},
|
||||
"confirm": {
|
||||
"confirmation": "تأكيد",
|
||||
"cancel": "الغاء",
|
||||
"ok": "نعم"
|
||||
},
|
||||
"delete_notes": {
|
||||
"close": "غلق",
|
||||
"cancel": "الغاء",
|
||||
"ok": "نعم"
|
||||
},
|
||||
"export": {
|
||||
"close": "غلق",
|
||||
"export": "تصدير",
|
||||
"export_note_title": "تصدير الملاحظة",
|
||||
"export_status": "حالة التصدير"
|
||||
},
|
||||
"help": {
|
||||
"troubleshooting": "أستكشاف الاخطاء واصلاحها",
|
||||
"other": "أخرى",
|
||||
"title": "ورقة المراجعة السريعة",
|
||||
"noteNavigation": "التنقل بين الملاحظات",
|
||||
"collapseExpand": "طي/توسيع العقدة",
|
||||
"notSet": "غير محدد",
|
||||
"collapseSubTree": "طي الشجرة الفرعية",
|
||||
"tabShortcuts": "أختصارات التبويب",
|
||||
"creatingNotes": "انشاء الملاحظات",
|
||||
"selectNote": "تحديد الملاحظة",
|
||||
"editingNotes": "تحرير الملاحظات",
|
||||
"inPageSearch": "البحث داخل الصفحة",
|
||||
"markdownAutoformat": "التنسيق التلقائي باسلوب Markdown"
|
||||
},
|
||||
"import": {
|
||||
"options": "خيارات",
|
||||
"import": "استيراد",
|
||||
"safeImport": "أستيراد آمن",
|
||||
"shrinkImages": "تقليل حجم الصور",
|
||||
"import-status": "حالة الاستبراد"
|
||||
},
|
||||
"include_note": {
|
||||
"label_note": "ملاحظة",
|
||||
"dialog_title": "تضمين ملاحظة",
|
||||
"button_include": "تضمين ملاحظة"
|
||||
},
|
||||
"info": {
|
||||
"closeButton": "أغلاق",
|
||||
"okButton": "نعم",
|
||||
"modalTitle": "رسالة معلومات"
|
||||
},
|
||||
"markdown_import": {
|
||||
"import_button": "أستيراد",
|
||||
"dialog_title": "استيراد Markdown"
|
||||
},
|
||||
"note_type_chooser": {
|
||||
"templates": "قوالب",
|
||||
"builtin_templates": "القوالب المدمجة"
|
||||
},
|
||||
"prompt": {
|
||||
"title": "ترقية",
|
||||
"ok": "نعم",
|
||||
"defaultTitle": "ترقية"
|
||||
},
|
||||
"protected_session_password": {
|
||||
"close_label": "أغلاق",
|
||||
"modal_title": "جلسة محمية"
|
||||
},
|
||||
"revisions": {
|
||||
"delete_button": "حذف",
|
||||
"download_button": "تنزيل",
|
||||
"restore_button": "أستعادة",
|
||||
"preview": "معاينة:",
|
||||
"note_revisions": "مراجعات الملاحظة",
|
||||
"diff_on": "عرض الفروقات",
|
||||
"diff_off": "عرض المحتوى",
|
||||
"file_size": "حجم الملف:",
|
||||
"mime": "MIME: "
|
||||
},
|
||||
"sort_child_notes": {
|
||||
"title": "عنوان",
|
||||
"ascending": "تصاعدي",
|
||||
"descending": "تنازلي",
|
||||
"folders": "مجلدات",
|
||||
"sort": "ترتيب",
|
||||
"sorting_criteria": "معايير الترتيب",
|
||||
"date_created": "تاريخ الانشاء",
|
||||
"date_modified": "تاريخ التعديل",
|
||||
"sorting_direction": "اتجاه الترتيب",
|
||||
"natural_sort": "الترتيب الطبيعي"
|
||||
},
|
||||
"recent_changes": {
|
||||
"undelete_link": "الغاء الحذف",
|
||||
"title": "التغيرات الاخيرة"
|
||||
},
|
||||
"edited_notes": {
|
||||
"deleted": "(حذف)",
|
||||
"title": "الملاحظات المعدلة"
|
||||
},
|
||||
"note_properties": {
|
||||
"info": "معلومات"
|
||||
},
|
||||
"backend_log": {
|
||||
"refresh": "تحديث"
|
||||
},
|
||||
"max_content_width": {
|
||||
"max_width_unit": "بكسل",
|
||||
"title": "عرض المحتوى",
|
||||
"reload_button": "اعادة تحميل الواجهة"
|
||||
},
|
||||
"native_title_bar": {
|
||||
"enabled": "مفعل",
|
||||
"disabled": "معطل"
|
||||
},
|
||||
"theme": {
|
||||
"theme_label": "السمة",
|
||||
"layout": "تخطيط",
|
||||
"layout-vertical-title": "عمودي",
|
||||
"layout-horizontal-title": "أفقي",
|
||||
"title": "نسق التطبيق",
|
||||
"light_theme": "النسق القديم (فاتح)",
|
||||
"dark_theme": "النسق القديم (داكن)",
|
||||
"triliumnext-light": "تريليوم (فاتح)",
|
||||
"triliumnext-dark": "تريليوم ( داكن)"
|
||||
},
|
||||
"ui-performance": {
|
||||
"title": "أداء",
|
||||
"enable-shadows": "تفعيل الضلال"
|
||||
},
|
||||
"ai_llm": {
|
||||
"progress": "تقدم",
|
||||
"openai_tab": "OpenAI",
|
||||
"actions": "أجراءات",
|
||||
"retry": "أعد المحاولة",
|
||||
"reprocessing_index": "جار اعادة البناء...",
|
||||
"never": "ابدٱ",
|
||||
"agent": {
|
||||
"processing": "جار المعالجة...",
|
||||
"thinking": "جار التفكير...",
|
||||
"loading": "جار التحميل...",
|
||||
"generating": "جار الانشاء..."
|
||||
},
|
||||
"name": "الذكاء الأصطناعي",
|
||||
"openai": "OpenAI",
|
||||
"sources": "مصادر",
|
||||
"temperature": "درجة الحرارة",
|
||||
"model": "نموذج",
|
||||
"refreshing_models": "جار التحديث...",
|
||||
"error": "خطأ",
|
||||
"refreshing": "جار التحديث...",
|
||||
"ollama_tab": "Ollama",
|
||||
"anthropic_tab": "انتروبيك",
|
||||
"not_started": "لم يبدأ بعد",
|
||||
"title": "اعدادات AI",
|
||||
"processed_notes": "الملاحظات المعالجة",
|
||||
"total_notes": "الملاحظات الكلية",
|
||||
"queued_notes": "الملاحظات في قائمة الانتظار",
|
||||
"failed_notes": "الملاحظات الفاشلة",
|
||||
"last_processed": "اخر معالجة",
|
||||
"refresh_stats": "تحديث الاحصائيات",
|
||||
"voyage_tab": "استكشاف AI",
|
||||
"provider_precedence": "اولوية المزود",
|
||||
"system_prompt": "موجه النظام",
|
||||
"openai_configuration": "اعدادات OpenAI",
|
||||
"openai_settings": "اعدادات OpenAI",
|
||||
"api_key": "مفتاح واجهة برمجة التطبيقات",
|
||||
"url": "عنوان URL الاساسي",
|
||||
"default_model": "النموذج الافتراضي",
|
||||
"base_url": "عنوان URL الأساسي",
|
||||
"openai_url_description": "افتراضيا: https://api.openai.com/v1",
|
||||
"anthropic_settings": "اعدادات انتروبيك",
|
||||
"ollama_settings": "اعدادات Ollama",
|
||||
"anthropic_configuration": "تهيئة انتروبيك",
|
||||
"voyage_url_description": "افتراضيا: https://api.voyageai.com/v1",
|
||||
"ollama_configuration": "تهيئة Ollama",
|
||||
"enable_ollama": "تمكين Ollama",
|
||||
"last_attempt": "اخر محاولة",
|
||||
"active_providers": "المزودون النشطون",
|
||||
"disabled_providers": "المزودون المعطلون",
|
||||
"similarity_threshold": "عتبة التشابه",
|
||||
"complete": "اكتمل (100%)",
|
||||
"ai_settings": "اعدادات AI",
|
||||
"show_thinking": "عرض التفكير",
|
||||
"index_status": "حالة الفهرس",
|
||||
"indexed_notes": "الملاحظات المفهرسة",
|
||||
"indexing_stopped": "تم ايقاف الفهرسة",
|
||||
"last_indexed": "اخر فهرسة",
|
||||
"note_chat": "دردشة الملاحظة",
|
||||
"start_indexing": "بدء الفهرسة",
|
||||
"chat": {
|
||||
"root_note_title": "دردشات AI",
|
||||
"new_chat_title": "دردشة جديدة"
|
||||
},
|
||||
"selected_provider": "المزود المحدد",
|
||||
"select_model": "اختر النموذج...",
|
||||
"select_provider": "اختى المزود...",
|
||||
"ollama_model": "نموذج Ollama",
|
||||
"refresh_models": "تحديث النماذج",
|
||||
"rebuild_index": "اعادة بناء الفهرس",
|
||||
"note_title": "عنوان الملاحظة",
|
||||
"processing": "جاري المعالجة ({{percentage}}%)",
|
||||
"incomplete": "غير مكتمل ({{percentage}}%)"
|
||||
},
|
||||
"code_auto_read_only_size": {
|
||||
"unit": "حروف"
|
||||
},
|
||||
"code-editor-options": {
|
||||
"title": "محرر"
|
||||
},
|
||||
"images": {
|
||||
"images_section_title": "صور",
|
||||
"max_image_dimensions_unit": "بكسل"
|
||||
},
|
||||
"revisions_snapshot_limit": {
|
||||
"snapshot_number_limit_unit": "لقطات"
|
||||
},
|
||||
"search_engine": {
|
||||
"bing": "Bing",
|
||||
"duckduckgo": "DuckDuckGo",
|
||||
"google": "جوجل",
|
||||
"save_button": "حفظ",
|
||||
"baidu": "Baidu",
|
||||
"title": "محرك البحث"
|
||||
},
|
||||
"heading_style": {
|
||||
"plain": "بسيط",
|
||||
"underline": "تسطير",
|
||||
"markdown": "نمط-Markdown",
|
||||
"title": "نمط العنوان"
|
||||
},
|
||||
"text_auto_read_only_size": {
|
||||
"unit": "حروف"
|
||||
},
|
||||
"i18n": {
|
||||
"language": "لغة",
|
||||
"sunday": "الاحد",
|
||||
"monday": "الاثنين",
|
||||
"title": "تعريب"
|
||||
},
|
||||
"backup": {
|
||||
"path": "مسار",
|
||||
"automatic_backup": "النسخ الاحتياطي التلقائي",
|
||||
"backup_now": "نسخ احتياطي الان",
|
||||
"existing_backups": "النسخ الاحتياطية الموجودة"
|
||||
},
|
||||
"etapi": {
|
||||
"wiki": "ويكي",
|
||||
"created": "تم الأنشاء",
|
||||
"actions": "أجراءات",
|
||||
"title": "ETAPI",
|
||||
"existing_tokens": "الرموز الموجوده",
|
||||
"token_name": "اسم الرمز",
|
||||
"default_token_name": "رمز جديد",
|
||||
"rename_token_title": "اعادة تسمية الرمز"
|
||||
},
|
||||
"password": {
|
||||
"heading": "كلمة المرور",
|
||||
"wiki": "ويكي",
|
||||
"old_password": "كلمة المرور القديمة",
|
||||
"new_password": "كلمة مرور جديدة",
|
||||
"change_password": "تغيير كلمة المرور",
|
||||
"change_password_heading": "تغيير كلمة المرور",
|
||||
"set_password_heading": "تعيين كلمة المرور",
|
||||
"set_password": "تعيين كلمة المرور"
|
||||
},
|
||||
"shortcuts": {
|
||||
"shortcuts": "أختصارات",
|
||||
"description": "الوصف",
|
||||
"keyboard_shortcuts": "اختصارات لوحة المفاتيح",
|
||||
"action_name": "اسم الاجراء",
|
||||
"default_shortcuts": "اختصارات افتراضية"
|
||||
},
|
||||
"sync_2": {
|
||||
"timeout_unit": "ميلي ثانية",
|
||||
"note": "ملاحظة",
|
||||
"save": "حفظ",
|
||||
"help": "المساعدة",
|
||||
"config_title": "تهيئة المزامنة",
|
||||
"timeout": "انتهاء مهلة المزامنة",
|
||||
"test_title": "اختبار المزامنة",
|
||||
"test_button": "اختبار المزامنة"
|
||||
},
|
||||
"api_log": {
|
||||
"close": "أغلاق"
|
||||
},
|
||||
"bookmark_switch": {
|
||||
"bookmark": "علامة مرجعية",
|
||||
"remove_bookmark": "ازالة الاشارة المرجعية"
|
||||
},
|
||||
"editability_select": {
|
||||
"auto": "تلقائي",
|
||||
"read_only": "قراءة-فقط",
|
||||
"always_editable": "قابل للتعديل دائما"
|
||||
},
|
||||
"tab_row": {
|
||||
"close": "اغلاق",
|
||||
"close_tab": "اغلاق التبويب",
|
||||
"new_tab": "تبويب جديد"
|
||||
},
|
||||
"toc": {
|
||||
"options": "خيارات"
|
||||
},
|
||||
"tasks": {
|
||||
"due": {
|
||||
"yesterday": "أمس",
|
||||
"today": "اليوم",
|
||||
"tomorrow": "غدٱ"
|
||||
}
|
||||
},
|
||||
"code_theme": {
|
||||
"title": "المظهر",
|
||||
"word_wrapping": "التفاف النص",
|
||||
"color-scheme": "نظام الالوان"
|
||||
},
|
||||
"table_view": {
|
||||
"sort-column-ascending": "تصاعدي",
|
||||
"sort-column-descending": "تنازلي",
|
||||
"new-column-relation": "العلاقة",
|
||||
"new-column-label": "تسمية",
|
||||
"new-row": "صف جديد",
|
||||
"new-column": "عمود جديد",
|
||||
"sort-column-clear": "ازالة الترتيب",
|
||||
"show-hide-columns": "اظهار/اخفاء الاعمدة",
|
||||
"edit-column": "تحرير العمود",
|
||||
"delete-column": "حذف العمود"
|
||||
},
|
||||
"modal": {
|
||||
"close": "اغلاق"
|
||||
},
|
||||
"call_to_action": {
|
||||
"dismiss": "تجاهل"
|
||||
},
|
||||
"units": {
|
||||
"percentage": "%"
|
||||
},
|
||||
"clone_to": {
|
||||
"prefix_optional": "بادئة (اختياري)"
|
||||
},
|
||||
"table_of_contents": {
|
||||
"unit": "عناوين"
|
||||
},
|
||||
"tree-context-menu": {
|
||||
"archive": "أرشفة",
|
||||
"unarchive": "الغاء الارشفة",
|
||||
"delete": "حذف",
|
||||
"advanced": "متقدمة",
|
||||
"cut": "قص",
|
||||
"duplicate": "استنساخ",
|
||||
"export": "تصدير",
|
||||
"expand-subtree": "توسيع الشجرة الفرعية",
|
||||
"collapse-subtree": "طي الشجرة الفرعية",
|
||||
"sort-by": "ترتيب بواسطة...",
|
||||
"protect-subtree": "الشجرة الفرعية المحمية",
|
||||
"unprotect-subtree": "الجرةةالفرعية الغير محمية",
|
||||
"clone-to": "استنساخ الى...",
|
||||
"move-to": "نقل الى...",
|
||||
"paste-into": "لصق في",
|
||||
"paste-after": "لصق بعد",
|
||||
"open-in-popup": "تحرير سريع"
|
||||
},
|
||||
"note_types": {
|
||||
"text": "نص",
|
||||
"code": "كود",
|
||||
"book": "مجموعة",
|
||||
"canvas": "مساحة العمل",
|
||||
"file": "ملف",
|
||||
"image": "صورة",
|
||||
"launcher": "مشغل",
|
||||
"doc": "مستند",
|
||||
"widget": "عنصر واجهة",
|
||||
"new-feature": "جديد",
|
||||
"collections": "مجاميع",
|
||||
"beta-feature": "اصدار تجريبي",
|
||||
"saved-search": "بحث محفوظ",
|
||||
"relation-map": "خريطة العلاقة",
|
||||
"note-map": "خريطة الملاحظة",
|
||||
"render-note": "عرض الملاحظة",
|
||||
"mermaid-diagram": "مخطط Mermaid",
|
||||
"web-view": "عرض الويب",
|
||||
"mind-map": "خريطة ذهنية",
|
||||
"geo-map": "خريطة جغرافية",
|
||||
"ai-chat": "دردشة AI",
|
||||
"task-list": "قائمة المهام"
|
||||
},
|
||||
"shared_switch": {
|
||||
"shared": "مشترك"
|
||||
},
|
||||
"template_switch": {
|
||||
"template": "قالب"
|
||||
},
|
||||
"find": {
|
||||
"replace": "استبدال",
|
||||
"case_sensitive": "حساسة لحالة الاحرف",
|
||||
"match_words": "مطابقة الكلمات",
|
||||
"replace_placeholder": "استبدال ب...",
|
||||
"replace_all": "استبدال الكل"
|
||||
},
|
||||
"highlights_list_2": {
|
||||
"options": "خيارات",
|
||||
"title": "قائمة التمييزات"
|
||||
},
|
||||
"quick-search": {
|
||||
"searching": "جار البحث...",
|
||||
"placeholder": "البحث السريع"
|
||||
},
|
||||
"note_tree": {
|
||||
"unhoist": "ارجاع الى الترتيب الطبيعي",
|
||||
"tree-settings-title": "اعدادات الشجرة",
|
||||
"toggle-sidebar": "اظهار/اخفاء الشريط الجانبي"
|
||||
},
|
||||
"sql_table_schemas": {
|
||||
"tables": "جداول"
|
||||
},
|
||||
"launcher_context_menu": {
|
||||
"reset": "اعادة ضبط",
|
||||
"add-spacer": "اضافة فاصل"
|
||||
},
|
||||
"editable-text": {
|
||||
"auto-detect-language": "تم اكتشافه تلقائيا"
|
||||
},
|
||||
"classic_editor_toolbar": {
|
||||
"title": "تنسيق"
|
||||
},
|
||||
"editor": {
|
||||
"title": "محرر"
|
||||
},
|
||||
"editing": {
|
||||
"editor_type": {
|
||||
"floating": {
|
||||
"title": "عائم"
|
||||
},
|
||||
"fixed": {
|
||||
"title": "مثبت"
|
||||
},
|
||||
"label": "شريط ادوات التنسيق"
|
||||
}
|
||||
},
|
||||
"electron_context_menu": {
|
||||
"cut": "قص",
|
||||
"copy": "نسخ",
|
||||
"paste": "لصق",
|
||||
"copy-link": "نسخ الرابط"
|
||||
},
|
||||
"promoted_attributes": {
|
||||
"url_placeholder": "http://website...",
|
||||
"promoted_attributes": "السمات المعززة",
|
||||
"unset-field-placeholder": "غير محدد"
|
||||
},
|
||||
"duration": {
|
||||
"seconds": "ثواني",
|
||||
"minutes": "دقائق",
|
||||
"hours": "ساعات",
|
||||
"days": "أيام"
|
||||
},
|
||||
"editorfeatures": {
|
||||
"title": "مميزات"
|
||||
},
|
||||
"book_properties_config": {
|
||||
"raster": "نقطي",
|
||||
"hide-weekends": "اخفاء عطلات نهايات الاسبوع",
|
||||
"map-style": "نمط الخريطة:",
|
||||
"vector_light": "متجه (فاتح)",
|
||||
"vector_dark": "متجه (داكن)",
|
||||
"show-scale": "اظهار المقياس"
|
||||
},
|
||||
"multi_factor_authentication": {
|
||||
"oauth_title": "OAuth/OpenID",
|
||||
"title": "المصادقة متعددة العوامل",
|
||||
"mfa_method": "طريقة المصادقة متعددة العوامل",
|
||||
"oauth_user_account": "حساب المستخدم: ",
|
||||
"oauth_user_email": "البريد الإلكتروني للمستخدم: "
|
||||
},
|
||||
"execute_script": {
|
||||
"execute_script": "تنفيذ السكريبت"
|
||||
},
|
||||
"add_label": {
|
||||
"add_label": "اضافة تسمية",
|
||||
"to_value": "الى القيمة",
|
||||
"new_value_placeholder": "قيمة جديدة",
|
||||
"label_name_placeholder": "اسم التسمية"
|
||||
},
|
||||
"delete_label": {
|
||||
"delete_label": "حذف التسمية",
|
||||
"label_name_placeholder": "اسم التسمية"
|
||||
},
|
||||
"update_label_value": {
|
||||
"to_value": "الى القيمة",
|
||||
"new_value_placeholder": "قيمة جديدة",
|
||||
"label_name_placeholder": "اسم التسمية"
|
||||
},
|
||||
"delete_note": {
|
||||
"delete_note": "حذف الملاحظة"
|
||||
},
|
||||
"rename_note": {
|
||||
"rename_note": "اعادة تسمية الملاحظة"
|
||||
},
|
||||
"delete_relation": {
|
||||
"delete_relation": "حذف العلاقة",
|
||||
"relation_name": "اسم العلاقة"
|
||||
},
|
||||
"left_pane_toggle": {
|
||||
"show_panel": "عرض اللوحة",
|
||||
"hide_panel": "اخفاء اللوحة"
|
||||
},
|
||||
"move_pane_button": {
|
||||
"move_left": "تحريك الى اليسار",
|
||||
"move_right": "تحريك الى اليمين"
|
||||
},
|
||||
"note_actions": {
|
||||
"re_render_note": "اعادة عرض الملاحظة",
|
||||
"note_source": "مصدر الملاحظة",
|
||||
"note_attachments": "مرفقات الملاحظة",
|
||||
"import_files": "استيراد الملفات",
|
||||
"export_note": "تصدير الملاحظة",
|
||||
"delete_note": "حذف الملاحظة",
|
||||
"print_note": "طباعة الملاحظة",
|
||||
"save_revision": "حفظ المراجعة"
|
||||
},
|
||||
"update_available": {
|
||||
"update_available": "تحديث متوفر"
|
||||
},
|
||||
"code_buttons": {
|
||||
"execute_button_title": "تنفيذ السكريبت"
|
||||
},
|
||||
"hide_floating_buttons_button": {
|
||||
"button_title": "اخفاء الازرار"
|
||||
},
|
||||
"show_floating_buttons_button": {
|
||||
"button_title": "عرض الازرار"
|
||||
},
|
||||
"relation_map_buttons": {
|
||||
"zoom_in_title": "تكبير",
|
||||
"zoom_out_title": "تصغير"
|
||||
},
|
||||
"inherited_attribute_list": {
|
||||
"title": "السمات الموروثة"
|
||||
},
|
||||
"note_map": {
|
||||
"title": "خريطة الملاحظة",
|
||||
"fix-nodes": "اصلاح العقد",
|
||||
"link-distance": "مسافة الرابط"
|
||||
},
|
||||
"owned_attribute_list": {
|
||||
"owned_attributes": "السمات المملوكة"
|
||||
},
|
||||
"similar_notes": {
|
||||
"title": "ملاحظات مشابهة"
|
||||
},
|
||||
"fast_search": {
|
||||
"fast_search": "بحث سريع"
|
||||
},
|
||||
"search_script": {
|
||||
"title": "نص البحث:"
|
||||
},
|
||||
"attachment_detail": {
|
||||
"owning_note": "الملاحظة المالكة: "
|
||||
},
|
||||
"attachment_list": {
|
||||
"owning_note": "الملاحظة المالكة: ",
|
||||
"upload_attachments": "رفع المرفقات"
|
||||
},
|
||||
"protected_session": {
|
||||
"wrong_password": "كلمة المرور خاطئة",
|
||||
"protecting-title": "الحالة المحمية",
|
||||
"unprotecting-title": "الحالة الغير محمية"
|
||||
},
|
||||
"relation_map": {
|
||||
"remove_note": "حذف الملاحظة",
|
||||
"edit_title": "تعديل العنوان",
|
||||
"rename_note": "اعادة تسمية الملاحظة",
|
||||
"remove_relation": "حذف العلاقة",
|
||||
"default_new_note_title": "ملاحظة جديدة"
|
||||
},
|
||||
"web_view": {
|
||||
"web_view": "عرض الويب"
|
||||
},
|
||||
"consistency_checks": {
|
||||
"title": "فحوصات التناسق"
|
||||
},
|
||||
"database_anonymization": {
|
||||
"title": "اخفاء هوية البيانات",
|
||||
"full_anonymization": "الاخفاء الكامل للهوية",
|
||||
"light_anonymization": "الاخفاء الجزئي للهوية"
|
||||
},
|
||||
"vacuum_database": {
|
||||
"title": "تحرير مساحة قاعدة البيانات",
|
||||
"button_text": "تحرير مساحة قاعدة البيانات",
|
||||
"vacuuming_database": "جار تحرير مساحة قاعدة الييانات..."
|
||||
},
|
||||
"ribbon": {
|
||||
"widgets": "ادوات الشريط"
|
||||
},
|
||||
"vim_key_bindings": {
|
||||
"use_vim_keybindings_in_code_notes": "اختصارات لوحة المفاتيح باسلوب Vim"
|
||||
},
|
||||
"network_connections": {
|
||||
"network_connections_title": "اتصالات الشبكة"
|
||||
},
|
||||
"tray": {
|
||||
"title": "شريط النظام"
|
||||
},
|
||||
"highlights_list": {
|
||||
"title": "قائمة النقاط المميزة",
|
||||
"bold": "نص عربض",
|
||||
"italic": "نص مائل",
|
||||
"underline": "خط تحت النص",
|
||||
"color": "نص ملون"
|
||||
},
|
||||
"revisions_button": {
|
||||
"note_revisions": "مراجعات الملاحظة"
|
||||
},
|
||||
"custom_date_time_format": {
|
||||
"format_string": "سلسلة التنسيق:",
|
||||
"formatted_time": "التاريخ/الوقت المنسق:"
|
||||
},
|
||||
"options_widget": {
|
||||
"options_status": "حالة الخيارات"
|
||||
},
|
||||
"spellcheck": {
|
||||
"title": "التدقيق الاملائي",
|
||||
"enable": "تفعيل التدقيق الاملائي"
|
||||
},
|
||||
"note-map": {
|
||||
"button-link-map": "خريطة الروابط",
|
||||
"button-tree-map": "خريطة الشجرة"
|
||||
},
|
||||
"spacer": {
|
||||
"configure_launchbar": "تهيئة شريط الاطلاق"
|
||||
},
|
||||
"entrypoints": {
|
||||
"note-executed": "تم تنفيذ الملاحظة."
|
||||
},
|
||||
"branches": {
|
||||
"delete-status": "حالة الحذف"
|
||||
},
|
||||
"highlighting": {
|
||||
"title": "كتل الكود",
|
||||
"color-scheme": "نظام الالوان"
|
||||
},
|
||||
"code_block": {
|
||||
"word_wrapping": "التفاف النص",
|
||||
"theme_group_light": "الثيمات الفاتحة",
|
||||
"theme_group_dark": "الثيمات الغامقة"
|
||||
},
|
||||
"link_context_menu": {
|
||||
"open_note_in_popup": "تحرير سريع"
|
||||
},
|
||||
"electron_integration": {
|
||||
"desktop-application": "تطبيقات سطح المكتبة",
|
||||
"zoom-factor": "عامل التكبير"
|
||||
},
|
||||
"note_tooltip": {
|
||||
"quick-edit": "التحرير السريع"
|
||||
},
|
||||
"geo-map-context": {
|
||||
"open-location": "فتح الموقع"
|
||||
},
|
||||
"share": {
|
||||
"title": "اعدادات المشاركة"
|
||||
},
|
||||
"note_language": {
|
||||
"not_set": "غير محدد",
|
||||
"configure-languages": "لغات التهيئة"
|
||||
},
|
||||
"content_language": {
|
||||
"title": "لغات المحتوى"
|
||||
},
|
||||
"toggle_read_only_button": {
|
||||
"unlock-editing": "الغاء قفل التحرير",
|
||||
"lock-editing": "قفل التحرير"
|
||||
},
|
||||
"cpu_arch_warning": {
|
||||
"continue_anyway": "المتابعة على اي حال"
|
||||
},
|
||||
"table_context_menu": {
|
||||
"delete_row": "حذف الصف"
|
||||
},
|
||||
"board_view": {
|
||||
"delete-note": "حذف الملاحظة...",
|
||||
"archive-note": "ارشفة الملاحظة",
|
||||
"unarchive-note": "الغاء ارشفة الملاحظة",
|
||||
"move-to": "نقل الى",
|
||||
"insert-above": "ادراج اعلاه",
|
||||
"insert-below": "ادراج ادناه",
|
||||
"delete-column": "حذف العمود",
|
||||
"new-item": "عنصر جديد",
|
||||
"add-column": "اضافة عمود"
|
||||
},
|
||||
"command_palette": {
|
||||
"export_note_title": "تصدير ملاحظة",
|
||||
"show_attachments_title": "عرض المرفقات",
|
||||
"search_notes_title": "البحث في الملاحظات"
|
||||
},
|
||||
"content_renderer": {
|
||||
"open_externally": "فتح خارجيا"
|
||||
},
|
||||
"settings": {
|
||||
"related_settings": "اعدادات متعلقة"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -121,7 +121,7 @@
|
||||
"sat": "Ds",
|
||||
"sun": "Dg",
|
||||
"january": "Gener",
|
||||
"febuary": "Febrer",
|
||||
"february": "Febrer",
|
||||
"march": "Març",
|
||||
"april": "Abril",
|
||||
"may": "Maig",
|
||||
|
||||
@@ -582,7 +582,7 @@
|
||||
"cannot_find_day_note": "无法找到日记",
|
||||
"cannot_find_week_note": "无法找到周记",
|
||||
"january": "一月",
|
||||
"febuary": "二月",
|
||||
"february": "二月",
|
||||
"march": "三月",
|
||||
"april": "四月",
|
||||
"may": "五月",
|
||||
@@ -987,7 +987,7 @@
|
||||
},
|
||||
"protected_session": {
|
||||
"enter_password_instruction": "显示受保护的笔记需要输入您的密码:",
|
||||
"start_session_button": "开始受保护的会话 <kbd>Enter</kbd>",
|
||||
"start_session_button": "开始受保护的会话",
|
||||
"started": "受保护的会话已启动。",
|
||||
"wrong_password": "密码错误。",
|
||||
"protecting-finished-successfully": "保护操作已成功完成。",
|
||||
@@ -1353,7 +1353,7 @@
|
||||
"oauth_title": "OAuth/OpenID 认证",
|
||||
"oauth_description": "OpenID 是一种标准化方式,允许您使用其他服务(如 Google)的账号登录网站来验证您的身份。默认的身份提供者是 Google,但您可以更改为任何其他 OpenID 提供者。点击<a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">这里</a>了解更多信息。请参阅这些 <a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">指南</a> 通过 Google 设置 OpenID 服务。",
|
||||
"oauth_description_warning": "要启用 OAuth/OpenID,您需要设置 config.ini 文件中的 OAuth/OpenID 基础 URL、客户端 ID 和客户端密钥,并重新启动应用程序。如果要从环境变量设置,请设置 TRILIUM_OAUTH_BASE_URL、TRILIUM_OAUTH_CLIENT_ID 和 TRILIUM_OAUTH_CLIENT_SECRET 环境变量。",
|
||||
"oauth_missing_vars": "缺少以下设置项:{{variables}}",
|
||||
"oauth_missing_vars": "缺少以下设置项:{{-variables}}",
|
||||
"oauth_user_account": "用户账号: ",
|
||||
"oauth_user_email": "用户邮箱: ",
|
||||
"oauth_user_not_logged_in": "未登录!"
|
||||
@@ -1623,7 +1623,9 @@
|
||||
"ws": {
|
||||
"sync-check-failed": "同步检查失败!",
|
||||
"consistency-checks-failed": "一致性检查失败!请查看日志了解详细信息。",
|
||||
"encountered-error": "遇到错误 \"{{message}}\",请查看控制台。"
|
||||
"encountered-error": "遇到错误 \"{{message}}\",请查看控制台。",
|
||||
"lost-websocket-connection-title": "与服务器的连线中断",
|
||||
"lost-websocket-connection-message": "检查您的反向代理(如 nginx 或 Apache)设置以确保 Websocket 连线没有被阻挡。"
|
||||
},
|
||||
"hoisted_note": {
|
||||
"confirm_unhoisting": "请求的笔记 '{{requestedNote}}' 位于聚焦的笔记 '{{hoistedNote}}' 的子树之外,您必须取消聚焦才能访问该笔记。是否继续取消聚焦?"
|
||||
@@ -1952,7 +1954,11 @@
|
||||
"editorfeatures": {
|
||||
"title": "功能",
|
||||
"emoji_completion_enabled": "启用表情自动补全",
|
||||
"note_completion_enabled": "启用笔记自动补全"
|
||||
"note_completion_enabled": "启用笔记自动补全",
|
||||
"emoji_completion_description": "如果启用,表情可以轻易地经由输入 `:` 加上表情名称来插入。",
|
||||
"note_completion_description": "如果启用,导向笔记的链接可以经由输入 `@` 加上笔记标题来创建。",
|
||||
"slash_commands_enabled": "启用斜杠命令",
|
||||
"slash_commands_description": "如果启用,可以经由输入 `/` 来触发命令,如插入换行符或标题。"
|
||||
},
|
||||
"table_view": {
|
||||
"new-row": "新增行",
|
||||
|
||||
@@ -1 +1,41 @@
|
||||
{}
|
||||
{
|
||||
"about": {
|
||||
"title": "O Trilium Notes",
|
||||
"homepage": "Domovská stránka:",
|
||||
"app_version": "Verze aplikace:",
|
||||
"db_version": "Verze DB:",
|
||||
"sync_version": "Verze sync:",
|
||||
"build_date": "Datum sestavení:",
|
||||
"build_revision": "Revize sestavení:",
|
||||
"data_directory": "Datový adresář:"
|
||||
},
|
||||
"toast": {
|
||||
"critical-error": {
|
||||
"title": "Kritická chyba",
|
||||
"message": "Nastala kritická chyba která aplikaci brání ve spuštění:\n\n{{message}}\n\nPravděpodobně neočekávaným způsobem selhal skript. Pokuste se restartovat aplikaci v safe módu a problém napravit."
|
||||
},
|
||||
"widget-error": {
|
||||
"title": "Nepodařilo se inicializovat widget",
|
||||
"message-custom": "Uživatelský widget z poznámky s ID \"{{id}}\" a názvem \"{{title}}\" nemohl být inicializován z důvodu: \n\n{{message}}",
|
||||
"message-unknown": "Neznámý widget nemohl být inicializován z důvodu:\n\n{{message}}"
|
||||
},
|
||||
"bundle-error": {
|
||||
"title": "Načtení uživatelského skriptu selhalo",
|
||||
"message": "Uživatelský skript z poznámky s ID \"{{id}}\" a názvem \"{{title}}\" nemohl být spuštěn z důvodu: \n\n{{message}}"
|
||||
}
|
||||
},
|
||||
"ai_llm": {
|
||||
"n_notes_queued_0": "{{ count }} poznámka ve frontě k indexaci",
|
||||
"n_notes_queued_1": "{{ count }} poznámky ve frontě k indexaci",
|
||||
"n_notes_queued_2": "{{ count }} poznámek ve frontě k indexaci",
|
||||
"notes_indexed_0": "{{ count }} poznámka indexována",
|
||||
"notes_indexed_1": "{{ count }} poznámky indexovány",
|
||||
"notes_indexed_2": "{{ count }} poznámek indexováno"
|
||||
},
|
||||
"add_link": {
|
||||
"add_link": "Přidat odkaz",
|
||||
"help_on_links": "Nápověda k odkazům",
|
||||
"note": "Poznámka",
|
||||
"search_note": "hledat poznámku podle názvu"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -581,7 +581,7 @@
|
||||
"sun": "So",
|
||||
"cannot_find_day_note": "Tagesnotiz kann nicht gefunden werden",
|
||||
"january": "Januar",
|
||||
"febuary": "Februar",
|
||||
"february": "Februar",
|
||||
"march": "März",
|
||||
"april": "April",
|
||||
"may": "Mai",
|
||||
@@ -984,7 +984,7 @@
|
||||
},
|
||||
"protected_session": {
|
||||
"enter_password_instruction": "Um die geschützte Notiz anzuzeigen, musst du dein Passwort eingeben:",
|
||||
"start_session_button": "Starte eine geschützte Sitzung <kbd>Eingabetaste</kbd>",
|
||||
"start_session_button": "Starte eine geschützte Sitzung",
|
||||
"started": "Geschützte Sitzung gestartet.",
|
||||
"wrong_password": "Passwort flasch.",
|
||||
"protecting-finished-successfully": "Geschützt erfolgreich beendet.",
|
||||
@@ -1587,7 +1587,9 @@
|
||||
"ws": {
|
||||
"sync-check-failed": "Synchronisationsprüfung fehlgeschlagen!",
|
||||
"consistency-checks-failed": "Konsistenzprüfung fehlgeschlagen! Siehe Logs für Details.",
|
||||
"encountered-error": "Fehler „{{message}}“ aufgetreten, siehe Konsole für Details."
|
||||
"encountered-error": "Fehler „{{message}}“ aufgetreten, siehe Konsole für Details.",
|
||||
"lost-websocket-connection-title": "Verbindung zum Server verloren",
|
||||
"lost-websocket-connection-message": "Überprüfe die Konfiguration des Reverse-Proxys (z. B. nginx oder Apache), um sicherzustellen, dass WebSocket-Verbindungen zugelassen und nicht blockiert werden."
|
||||
},
|
||||
"hoisted_note": {
|
||||
"confirm_unhoisting": "Die angeforderte Notiz ‚{{requestedNote}}‘ befindet sich außerhalb des hoisted Bereichs der Notiz ‚{{hoistedNote}}‘. Du musst sie unhoisten, um auf die Notiz zuzugreifen. Möchtest du mit dem Unhoisting fortfahren?"
|
||||
@@ -1901,7 +1903,7 @@
|
||||
"oauth_title": "OAuth/OpenID",
|
||||
"oauth_description": "OpenID ist ein standardisiertes Verfahren, mit dem Sie sich über ein Konto eines anderen Dienstes, beispielsweise Google, bei Websites anmelden können, um Ihre Identität zu bestätigen. Der Standardaussteller ist Google, Sie können jedoch jeden anderen OpenID-Anbieter auswählen. Weitere Informationen finden Sie <a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">hier</a>. Befolgen Sie diese <a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">Anweisungen</a>, um einen OpenID-Dienst über Google einzurichten.",
|
||||
"oauth_description_warning": "Um OAuth/OpenID zu aktivieren, müssen Sie die OAuth/OpenID-Basis-URL, die Client-ID und den Client-Secret in der Datei config.ini festlegen und die Anwendung neu starten. Wenn Sie die Einstellungen über Umgebungsvariablen vornehmen möchten, legen Sie bitte TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID und TRILIUM_OAUTH_CLIENT_SECRET fest.",
|
||||
"oauth_missing_vars": "Fehlende Einstellung: {{variables}}",
|
||||
"oauth_missing_vars": "Fehlende Einstellung: {{-variables}}",
|
||||
"oauth_user_account": "Benutzerkonto: ",
|
||||
"oauth_user_email": "Benutzer E-Mail: ",
|
||||
"oauth_user_not_logged_in": "Nicht eingeloggt!"
|
||||
@@ -1966,7 +1968,11 @@
|
||||
"editorfeatures": {
|
||||
"title": "Funktionen",
|
||||
"emoji_completion_enabled": "Emoji-Autovervollständigung aktivieren",
|
||||
"note_completion_enabled": "Automatisches Vervollständigen von Notizen aktivieren"
|
||||
"note_completion_enabled": "Automatisches Vervollständigen von Notizen aktivieren",
|
||||
"emoji_completion_description": "Wenn aktiviert, können Emojis ganz einfach in den Text eingefügt werden, indem man \":\" gefolgt vom Namen eines Emojis eingibt.",
|
||||
"note_completion_description": "Wenn aktiviert, können Links zu Notizen erstellt werden, indem man \"@\" gefolgt vom Titel einer Notiz eingibt.",
|
||||
"slash_commands_enabled": "Aktiviere Slash-Befehle",
|
||||
"slash_commands_description": "Wenn aktiviert, können Bearbeitungsbefehle wie das Einfügen von Zeilenumbrüchen oder Überschriften durch Eingabe von \"/\" aktiviert werden."
|
||||
},
|
||||
"table_view": {
|
||||
"new-row": "Neue Zeile",
|
||||
|
||||
@@ -582,7 +582,7 @@
|
||||
"cannot_find_day_note": "Cannot find day note",
|
||||
"cannot_find_week_note": "Cannot find week note",
|
||||
"january": "January",
|
||||
"febuary": "February",
|
||||
"february": "February",
|
||||
"march": "March",
|
||||
"april": "April",
|
||||
"may": "May",
|
||||
@@ -646,7 +646,8 @@
|
||||
"about": "About Trilium Notes",
|
||||
"logout": "Logout",
|
||||
"show-cheatsheet": "Show Cheatsheet",
|
||||
"toggle-zen-mode": "Zen Mode"
|
||||
"toggle-zen-mode": "Zen Mode",
|
||||
"update_available": "Version {{latestVersion}} is available, click to download."
|
||||
},
|
||||
"zen_mode": {
|
||||
"button_exit": "Exit Zen Mode"
|
||||
@@ -735,6 +736,7 @@
|
||||
"mobile_detail_menu": {
|
||||
"insert_child_note": "Insert child note",
|
||||
"delete_this_note": "Delete this note",
|
||||
"note_revisions": "Note revisions",
|
||||
"error_cannot_get_branch_id": "Cannot get branchId for notePath '{{notePath}}'",
|
||||
"error_unrecognized_command": "Unrecognized command {{command}}"
|
||||
},
|
||||
@@ -987,7 +989,7 @@
|
||||
},
|
||||
"protected_session": {
|
||||
"enter_password_instruction": "Showing protected note requires entering your password:",
|
||||
"start_session_button": "Start protected session <kbd>enter</kbd>",
|
||||
"start_session_button": "Start protected session",
|
||||
"started": "Protected session has been started.",
|
||||
"wrong_password": "Wrong password.",
|
||||
"protecting-finished-successfully": "Protecting finished successfully.",
|
||||
@@ -1413,8 +1415,13 @@
|
||||
"title": "Localization",
|
||||
"language": "Language",
|
||||
"first-day-of-the-week": "First day of the week",
|
||||
"sunday": "Sunday",
|
||||
"monday": "Monday",
|
||||
"tuesday": "Tuesday",
|
||||
"wednesday": "Wednesday",
|
||||
"thursday": "Thursday",
|
||||
"friday": "Friday",
|
||||
"saturday": "Saturday",
|
||||
"sunday": "Sunday",
|
||||
"first-week-of-the-year": "First week of the year",
|
||||
"first-week-contains-first-day": "First week contains first day of the year",
|
||||
"first-week-contains-first-thursday": "First week contains first Thursday of the year",
|
||||
@@ -1422,7 +1429,8 @@
|
||||
"min-days-in-first-week": "Minimum days in first week",
|
||||
"first-week-info": "First week contains first Thursday of the year is based on <a href=\"https://en.wikipedia.org/wiki/ISO_week_date#First_week\">ISO 8601</a> standard.",
|
||||
"first-week-warning": "Changing first week options may cause duplicate with existing Week Notes and the existing Week Notes will not be updated accordingly.",
|
||||
"formatting-locale": "Date & number format"
|
||||
"formatting-locale": "Date & number format",
|
||||
"formatting-locale-auto": "Based on the application's language"
|
||||
},
|
||||
"backup": {
|
||||
"automatic_backup": "Automatic backup",
|
||||
@@ -1517,7 +1525,7 @@
|
||||
"oauth_title": "OAuth/OpenID",
|
||||
"oauth_description": "OpenID is a standardized way to let you log into websites using an account from another service, like Google, to verify your identity. The default issuer is Google, but you can change it to any other OpenID provider. Check <a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">here</a> for more information. Follow these <a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">instructions</a> to setup an OpenID service through Google.",
|
||||
"oauth_description_warning": "To enable OAuth/OpenID, you need to set the OAuth/OpenID base URL, client ID and client secret in the config.ini file and restart the application. If you want to set from environment variables, please set TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID and TRILIUM_OAUTH_CLIENT_SECRET.",
|
||||
"oauth_missing_vars": "Missing settings: {{variables}}",
|
||||
"oauth_missing_vars": "Missing settings: {{-variables}}",
|
||||
"oauth_user_account": "User Account: ",
|
||||
"oauth_user_email": "User Email: ",
|
||||
"oauth_user_not_logged_in": "Not logged in!"
|
||||
@@ -1787,7 +1795,9 @@
|
||||
"ws": {
|
||||
"sync-check-failed": "Sync check failed!",
|
||||
"consistency-checks-failed": "Consistency checks failed! See logs for details.",
|
||||
"encountered-error": "Encountered error \"{{message}}\", check out the console."
|
||||
"encountered-error": "Encountered error \"{{message}}\", check out the console.",
|
||||
"lost-websocket-connection-title": "Lost connection to the server",
|
||||
"lost-websocket-connection-message": "Check your reverse proxy (e.g. nginx or Apache) configuration to ensure WebSocket connections are properly allowed and not being blocked."
|
||||
},
|
||||
"hoisted_note": {
|
||||
"confirm_unhoisting": "Requested note '{{requestedNote}}' is outside of hoisted note '{{hoistedNote}}' subtree and you must unhoist to access the note. Do you want to proceed with unhoisting?"
|
||||
|
||||
@@ -276,7 +276,12 @@
|
||||
"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."
|
||||
"preview_not_available": "La vista previa no está disponible para este tipo de notas.",
|
||||
"diff_off": "Mostrar contenido",
|
||||
"diff_on": "Mostrar diferencia",
|
||||
"diff_off_hint": "Haga clic para mostrar el contenido de la nota",
|
||||
"diff_not_available": "Diferencias no disponibles.",
|
||||
"diff_on_hint": "Haga clic para ver las diferencias"
|
||||
},
|
||||
"sort_child_notes": {
|
||||
"sort_children_by": "Ordenar hijos por...",
|
||||
@@ -577,7 +582,7 @@
|
||||
"cannot_find_day_note": "No se puede encontrar la nota del día",
|
||||
"cannot_find_week_note": "No se puede encontrar la nota de la semana",
|
||||
"january": "Enero",
|
||||
"febuary": "Febrero",
|
||||
"february": "Febrero",
|
||||
"march": "Marzo",
|
||||
"april": "Abril",
|
||||
"may": "Mayo",
|
||||
@@ -587,7 +592,18 @@
|
||||
"september": "Septiembre",
|
||||
"october": "Octubre",
|
||||
"november": "Noviembre",
|
||||
"december": "Diciembre"
|
||||
"december": "Diciembre",
|
||||
"week": "Semana",
|
||||
"week_previous": "Semana anterior",
|
||||
"week_next": "Semana siguiente",
|
||||
"month": "Mes",
|
||||
"month_previous": "Mes anterior",
|
||||
"month_next": "Mes siguiente",
|
||||
"year": "Año",
|
||||
"year_previous": "Año anterior",
|
||||
"year_next": "Año siguiente",
|
||||
"list": "Lista",
|
||||
"today": "Hoy"
|
||||
},
|
||||
"close_pane_button": {
|
||||
"close_this_pane": "Cerrar este panel"
|
||||
@@ -748,7 +764,8 @@
|
||||
"book_properties": "Propiedades de colección",
|
||||
"table": "Tabla",
|
||||
"geo-map": "Mapa Geo",
|
||||
"board": "Tablero"
|
||||
"board": "Tablero",
|
||||
"include_archived_notes": "Mostrar notas archivadas"
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "Aún no hay notas editadas en este día...",
|
||||
@@ -949,7 +966,9 @@
|
||||
"no_attachments": "Esta nota no tiene archivos adjuntos."
|
||||
},
|
||||
"book": {
|
||||
"no_children_help": "Esta nota de tipo libro no tiene ninguna subnota así que no hay nada que mostrar. Véa la <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a> para más detalles."
|
||||
"no_children_help": "Esta nota de tipo libro no tiene ninguna subnota así que no hay nada que mostrar. Véa la <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a> para más detalles.",
|
||||
"drag_locked_title": "Bloqueado para edición",
|
||||
"drag_locked_message": "No se permite Arrastrar pues la colección está bloqueada para edición."
|
||||
},
|
||||
"editable_code": {
|
||||
"placeholder": "Escriba el contenido de su nota de código aquí..."
|
||||
@@ -968,7 +987,7 @@
|
||||
},
|
||||
"protected_session": {
|
||||
"enter_password_instruction": "Para mostrar una nota protegida es necesario ingresar su contraseña:",
|
||||
"start_session_button": "Iniciar sesión protegida <kbd>Enter</kbd>",
|
||||
"start_session_button": "Iniciar sesión protegida",
|
||||
"started": "La sesión protegida ha iniciado.",
|
||||
"wrong_password": "Contraseña incorrecta.",
|
||||
"protecting-finished-successfully": "La protección finalizó exitosamente.",
|
||||
@@ -1490,7 +1509,7 @@
|
||||
"oauth_title": "OAuth/OpenID",
|
||||
"oauth_description": "OpenID es una forma estandarizada de permitirle iniciar sesión en sitios web utilizando una cuenta de otro servicio, como Google, para verificar su identidad. Siga estas <a href = \"https://developers.google.com/identity/openid-connect/openid-connect\">instrucciones</a> para configurar un servicio OpenID a través de Google.",
|
||||
"oauth_description_warning": "Para habilitar OAuth/OpenID, necesita establecer la URL base de OAuth/OpenID, ID de cliente y secreto de cliente en el archivo config.ini y reiniciar la aplicación. Si desea establecerlas desde variables de ambiente, por favor establezca TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID y TRILIUM_OAUTH_CLIENT_SECRET.",
|
||||
"oauth_missing_vars": "Ajustes faltantes: {{variables}}",
|
||||
"oauth_missing_vars": "Ajustes faltantes: {{-variables}}",
|
||||
"oauth_user_account": "Cuenta de usuario: ",
|
||||
"oauth_user_email": "Correo electrónico de usuario: ",
|
||||
"oauth_user_not_logged_in": "¡No ha iniciado sesión!"
|
||||
@@ -1593,7 +1612,9 @@
|
||||
"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?",
|
||||
"open-in-popup": "Edición rápida"
|
||||
"open-in-popup": "Edición rápida",
|
||||
"archive": "Archivar",
|
||||
"unarchive": "Desarchivar"
|
||||
},
|
||||
"shared_info": {
|
||||
"shared_publicly": "Esta nota está compartida públicamente en {{- link}}",
|
||||
@@ -1676,7 +1697,8 @@
|
||||
"hoist-this-note-workspace": "Anclar esta nota (espacio de trabajo)",
|
||||
"refresh-saved-search-results": "Refrescar resultados de búsqueda guardados",
|
||||
"create-child-note": "Crear subnota",
|
||||
"unhoist": "Desanclar"
|
||||
"unhoist": "Desanclar",
|
||||
"toggle-sidebar": "Alternar barra lateral"
|
||||
},
|
||||
"title_bar_buttons": {
|
||||
"window-on-top": "Mantener esta ventana en la parte superior"
|
||||
@@ -1751,13 +1773,15 @@
|
||||
"undeleting-notes-finished-successfully": "La recuperación de notas finalizó exitosamente."
|
||||
},
|
||||
"frontend_script_api": {
|
||||
"async_warning": "Está pasando una función asíncrona a `api.runOnBackend ()` que probablemente no funcionará como pretendía.",
|
||||
"sync_warning": "Estás pasando una función sincrónica a `api.runasynconbackendwithmanualTransactionHandling ()`, \\ n while debería usar `api.runonbackend ()` en su lugar."
|
||||
"async_warning": "Está pasando una función asíncrona a `api.runOnBackend ()` que probablemente no funcionará como pretendía.\\nO haga la función sincrónica (removiendo la palabra `async`), o use `api.runAsyncOnBackendWithManualTransactionHandling()`.",
|
||||
"sync_warning": "Estás pasando una función sincrónica a `api.runasynconbackendwithmanualTransactionHandling ()`, \\n while debería usar `api.runonbackend ()` en su lugar."
|
||||
},
|
||||
"ws": {
|
||||
"sync-check-failed": "¡La comprobación de sincronización falló!",
|
||||
"consistency-checks-failed": "¡Las comprobaciones de consistencia fallaron! Vea los registros para más detalles.",
|
||||
"encountered-error": "Error encontrado \"{{message}}\", compruebe la consola."
|
||||
"encountered-error": "Error encontrado \"{{message}}\", compruebe la consola.",
|
||||
"lost-websocket-connection-title": "Se ha perdido la conexión con el servidor",
|
||||
"lost-websocket-connection-message": "Compruebe la configuración de su proxy inverso (por ejemplo, nginx o Apache) para asegurarse de que las conexiones WebSocket están correctamente permitidas y no están bloqueadas."
|
||||
},
|
||||
"hoisted_note": {
|
||||
"confirm_unhoisting": "La nota requerida '{{requestedNote}}' está fuera del subárbol de la nota anclada '{{hoistedNote}}' y debe desanclarla para acceder a la nota. ¿Desea proceder con el desanclaje?"
|
||||
@@ -1833,7 +1857,7 @@
|
||||
"native-title-bar": "Barra de título nativa",
|
||||
"native-title-bar-description": "Para Windows y macOS, quitar la barra de título nativa hace que la aplicación se vea más compacta. En Linux, mantener la barra de título nativa hace que se integre mejor con el resto del sistema.",
|
||||
"background-effects": "Habilitar efectos de fondo (sólo en Windows 11)",
|
||||
"background-effects-description": "El efecto Mica agrega un fondo borroso y elegante a las ventanas de aplicaciones, creando profundidad y un aspecto moderno.",
|
||||
"background-effects-description": "El efecto Mica agrega un fondo borroso y elegante a las ventanas de la aplicación, creando profundidad y un aspecto moderno. \"Título nativo de la barra\" debe deshabilitarse.",
|
||||
"restart-app-button": "Reiniciar la aplicación para ver los cambios",
|
||||
"zoom-factor": "Factor de zoom"
|
||||
},
|
||||
@@ -1943,14 +1967,20 @@
|
||||
"delete_row": "Eliminar fila"
|
||||
},
|
||||
"board_view": {
|
||||
"delete-note": "Eliminar nota",
|
||||
"delete-note": "Eliminar nota...",
|
||||
"move-to": "Mover a",
|
||||
"insert-above": "Insertar arriba",
|
||||
"insert-below": "Insertar abajo",
|
||||
"delete-column": "Eliminar columna",
|
||||
"delete-column-confirmation": "¿Seguro que desea eliminar esta columna? El atributo correspondiente también se eliminará de las notas de esta columna.",
|
||||
"add-column": "Añadir columna",
|
||||
"new-item": "Nuevo elemento"
|
||||
"new-item": "Nuevo elemento",
|
||||
"archive-note": "Archivar nota",
|
||||
"unarchive-note": "Desarchivar nota",
|
||||
"new-item-placeholder": "Ingresar título de la nota...",
|
||||
"add-column-placeholder": "Ingresar título de la columna...",
|
||||
"edit-note-title": "Haga clic para editar el título de la nota",
|
||||
"edit-column-title": "Haga clic para editar el título de la columna"
|
||||
},
|
||||
"content_renderer": {
|
||||
"open_externally": "Abrir externamente"
|
||||
@@ -1978,7 +2008,11 @@
|
||||
"editorfeatures": {
|
||||
"note_completion_enabled": "Activar autocompletado de notas",
|
||||
"emoji_completion_enabled": "Activar autocompletado de emojis",
|
||||
"title": "Funciones"
|
||||
"title": "Funciones",
|
||||
"emoji_completion_description": "Si está habilitado, los emojis pueden fácilmente insertarse en el texto escribiendo `:`, seguido del nombre de un emoji.",
|
||||
"note_completion_description": "Si está habilitado, los vínculos a notas pueden crearse escribiendo `@` seguido del título de una nota.",
|
||||
"slash_commands_enabled": "Habilitar comandos de barra",
|
||||
"slash_commands_description": "Si está habilitado, editar comandos como insertar saltos de línea o títulos, puede alternarse escribiendo `/`."
|
||||
},
|
||||
"command_palette": {
|
||||
"tree-action-name": "Árbol:{{name}}",
|
||||
@@ -2012,7 +2046,9 @@
|
||||
"title": "Rendimiento",
|
||||
"enable-motion": "Habilitar transiciones y animaciones",
|
||||
"enable-shadows": "Activar sombras",
|
||||
"enable-backdrop-effects": "Habilitar efectos de fondo para menús, ventanas emergentes y paneles"
|
||||
"enable-backdrop-effects": "Habilitar efectos de fondo para menús, ventanas emergentes y paneles",
|
||||
"enable-smooth-scroll": "Habilitar desplazamiento suave",
|
||||
"app-restart-required": "(es necesario reiniciar la aplicación para que el cambio surta efecto)"
|
||||
},
|
||||
"settings": {
|
||||
"related_settings": "Configuración relacionada"
|
||||
@@ -2023,5 +2059,9 @@
|
||||
},
|
||||
"units": {
|
||||
"percentage": "%"
|
||||
},
|
||||
"pagination": {
|
||||
"total_notes": "{{count}} notas",
|
||||
"page_title": "Página de {{startIndex}} - {{endIndex}}"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,9 @@
|
||||
},
|
||||
"widget-error": {
|
||||
"title": "Widgetin luonti epäonnistui"
|
||||
},
|
||||
"bundle-error": {
|
||||
"title": "Mukautetun skriptin lataus epäonnistui"
|
||||
}
|
||||
},
|
||||
"add_link": {
|
||||
|
||||
@@ -576,7 +576,7 @@
|
||||
"sun": "Dim",
|
||||
"cannot_find_day_note": "Note journalière introuvable",
|
||||
"january": "Janvier",
|
||||
"febuary": "Février",
|
||||
"february": "Février",
|
||||
"march": "Mars",
|
||||
"april": "Avril",
|
||||
"may": "Mai",
|
||||
@@ -587,7 +587,18 @@
|
||||
"october": "Octobre",
|
||||
"november": "Novembre",
|
||||
"december": "Décembre",
|
||||
"cannot_find_week_note": "Impossible de trouver la note de la semaine"
|
||||
"cannot_find_week_note": "Impossible de trouver la note de la semaine",
|
||||
"week": "Semaine",
|
||||
"week_previous": "Semaine précédente",
|
||||
"week_next": "Semaine suivante",
|
||||
"month": "Mois",
|
||||
"month_previous": "Mois précédent",
|
||||
"month_next": "Mois suivant",
|
||||
"year": "Année",
|
||||
"year_previous": "Année précédente",
|
||||
"year_next": "Année suivante",
|
||||
"list": "Liste",
|
||||
"today": "Aujourd'hui"
|
||||
},
|
||||
"close_pane_button": {
|
||||
"close_this_pane": "Fermer ce volet"
|
||||
@@ -732,7 +743,8 @@
|
||||
"note_type": "Type de note",
|
||||
"editable": "Modifiable",
|
||||
"basic_properties": "Propriétés de base",
|
||||
"language": "Langage"
|
||||
"language": "Langage",
|
||||
"configure_code_notes": "Configurer les notes de code..."
|
||||
},
|
||||
"book_properties": {
|
||||
"view_type": "Type d'affichage",
|
||||
@@ -747,7 +759,8 @@
|
||||
"book_properties": "Propriétés de la collection",
|
||||
"table": "Tableau",
|
||||
"geo-map": "Carte géographique",
|
||||
"board": "Tableau de bord"
|
||||
"board": "Tableau de bord",
|
||||
"include_archived_notes": "Afficher les notes archivées"
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "Aucune note modifiée ce jour-là...",
|
||||
@@ -948,7 +961,9 @@
|
||||
"no_attachments": "Cette note ne contient aucune pièce jointe."
|
||||
},
|
||||
"book": {
|
||||
"no_children_help": "Cette note de type Livre n'a aucune note enfant, donc il n'y a rien à afficher. Consultez le <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a> pour plus de détails."
|
||||
"no_children_help": "Cette note de type Livre n'a aucune note enfant, donc il n'y a rien à afficher. Consultez le <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a> pour plus de détails.",
|
||||
"drag_locked_title": "Edition verrouillée",
|
||||
"drag_locked_message": "Le glisser-déposer n'est pas autorisé car l'édition de cette collection est verrouillé."
|
||||
},
|
||||
"editable_code": {
|
||||
"placeholder": "Saisir le contenu de votre note de code ici..."
|
||||
@@ -967,7 +982,7 @@
|
||||
},
|
||||
"protected_session": {
|
||||
"enter_password_instruction": "L'affichage de la note protégée nécessite la saisie de votre mot de passe :",
|
||||
"start_session_button": "Démarrer une session protégée <kbd>Entrée</kbd>",
|
||||
"start_session_button": "Démarrer une session protégée",
|
||||
"started": "La session protégée a démarré.",
|
||||
"wrong_password": "Mot de passe incorrect.",
|
||||
"protecting-finished-successfully": "La protection de la note s'est terminée avec succès.",
|
||||
@@ -1690,6 +1705,72 @@
|
||||
"anthropic_configuration": "Configuration Anthropic",
|
||||
"voyage_configuration": "Configuration IA Voyage",
|
||||
"voyage_url_description": "Défaut: https://api.voyageai.com/v1",
|
||||
"ollama_configuration": "Configuration Ollama"
|
||||
"ollama_configuration": "Configuration Ollama",
|
||||
"total_notes": "Notes totales",
|
||||
"progress": "Progrès",
|
||||
"queued_notes": "Notes dans la file d'attente",
|
||||
"refresh_stats": "Rafraîchir les statistiques",
|
||||
"enable_ai_features": "Activer les fonctionnalités IA/LLM",
|
||||
"enable_ai_description": "Activer les fonctionnalités IA telles que le résumé des notes, la génération de contenu et autres fonctionnalités LLM",
|
||||
"openai_tab": "OpenAI",
|
||||
"anthropic_tab": "Anthropic",
|
||||
"voyage_tab": "Voyage AI",
|
||||
"ollama_tab": "Ollama",
|
||||
"enable_ai": "Activer les fonctionnalités IA/LLM",
|
||||
"enable_ai_desc": "Activer les fonctionnalités IA telles que le résumé des notes, la génération de contenu et autres fonctionnalités LLM",
|
||||
"provider_configuration": "Configuration du fournisseur IA",
|
||||
"provider_precedence_description": "Liste de fournisseurs séparés par virgule, par ordre de préférence (ex. 'openai,anthopic,ollama')",
|
||||
"temperature": "Température",
|
||||
"temperature_description": "Contrôle de l'aléatoirité dans les réponses (0 = déterministe, 2 = hasard maximum)",
|
||||
"system_prompt": "Prompt système",
|
||||
"system_prompt_description": "Prompt système par défaut pour toutes les intéractions IA",
|
||||
"openai_configuration": "Configuration OpenAI",
|
||||
"openai_settings": "Options OpenAI",
|
||||
"api_key": "Clef API",
|
||||
"url": "URL de base",
|
||||
"model": "Modèle",
|
||||
"openai_api_key_description": "Votre clef API OpenAI pour accéder à leurs services IA",
|
||||
"anthropic_api_key_description": "Votre clef API Anthropic pour accéder aux modèles Claude",
|
||||
"default_model": "Modèle par défaut",
|
||||
"openai_model_description": "Exemples : gpt-4o, gpt-4-turbo, gpt-3.5-turbo",
|
||||
"base_url": "URL de base",
|
||||
"openai_url_description": "Défaut : https://api.openai.com/v1",
|
||||
"anthropic_settings": "Réglages Anthropic",
|
||||
"enable_ollama": "Activer Ollama",
|
||||
"enable_ollama_description": "Activer Ollama comme modèle d'IA local",
|
||||
"ollama_url": "URL Ollama",
|
||||
"ollama_model": "Modèle Ollama",
|
||||
"refresh_models": "Rafraîchir les modèles",
|
||||
"refreshing_models": "Mise à jour...",
|
||||
"enable_automatic_indexing": "Activer l'indexage automatique",
|
||||
"rebuild_index": "Rafraîchir l'index",
|
||||
"rebuild_index_error": "Erreur dans le démarrage du rafraichissement de l'index. Veuillez consulter les logs pour plus de détails.",
|
||||
"note_title": "Titre de la note",
|
||||
"error": "Erreur",
|
||||
"last_attempt": "Dernier essai",
|
||||
"actions": "Actions",
|
||||
"retry": "Réessayer",
|
||||
"partial": "Complété à {{ percentage }}%",
|
||||
"retry_queued": "Note ajoutée à la file d'attente",
|
||||
"retry_failed": "Echec de l'ajout de la note à la file d'attente",
|
||||
"max_notes_per_llm_query": "Notes maximum par requête",
|
||||
"max_notes_per_llm_query_description": "Nombre maximum de notes similaires à inclure dans le contexte IA",
|
||||
"active_providers": "Fournisseurs actifs",
|
||||
"disabled_providers": "Fournisseurs désactivés",
|
||||
"remove_provider": "Retirer le fournisseur de la recherche",
|
||||
"similarity_threshold": "Seuil de similarité",
|
||||
"similarity_threshold_description": "Seuil de similarité minimum (0-1) pour que inclure les notes dans le contexte d'une requête IA",
|
||||
"reprocess_index": "Rafraîchir l'index de recherche",
|
||||
"reprocessing_index": "Mise à jour...",
|
||||
"reprocess_index_started": "L'optimisation de l'indice de recherche à commencer en arrière-plan",
|
||||
"reprocess_index_error": "Erreur dans le rafraichissement de l'indice de recherche"
|
||||
},
|
||||
"ui-performance": {
|
||||
"title": "Performance",
|
||||
"enable-motion": "Activer les transitions et animations",
|
||||
"enable-shadows": "Activer les ombres",
|
||||
"enable-backdrop-effects": "Activer les effets d'arrière plan pour les menus, popups et panneaux",
|
||||
"enable-smooth-scroll": "Active le défilement fluide",
|
||||
"app-restart-required": "(redémarrer l'application pour appliquer les changements)"
|
||||
}
|
||||
}
|
||||
|
||||
1
apps/client/src/translations/hr/translation.json
Normal file
1
apps/client/src/translations/hr/translation.json
Normal file
@@ -0,0 +1 @@
|
||||
{}
|
||||
8
apps/client/src/translations/id/translation.json
Normal file
8
apps/client/src/translations/id/translation.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"about": {
|
||||
"title": "Tentang Trilium Notes",
|
||||
"homepage": "Halaman utama:",
|
||||
"app_version": "Versi Aplikasi:",
|
||||
"db_version": "Versi DB:"
|
||||
}
|
||||
}
|
||||
@@ -31,7 +31,7 @@
|
||||
"link_title_mirrors": "il titolo del collegamento rispecchia il titolo della nota corrente",
|
||||
"link_title_arbitrary": "il titolo del collegamento può essere modificato arbitrariamente",
|
||||
"link_title": "Titolo del collegamento",
|
||||
"button_add_link": "Aggiungi il collegamento <kbd>invio</kbd>",
|
||||
"button_add_link": "Aggiungi il collegamento",
|
||||
"help_on_links": "Aiuto sui collegamenti"
|
||||
},
|
||||
"branch_prefix": {
|
||||
|
||||
@@ -38,12 +38,12 @@
|
||||
"save": "保存",
|
||||
"edit_branch_prefix": "ブランチ接頭辞の編集",
|
||||
"help_on_tree_prefix": "ツリー接頭辞に関するヘルプ",
|
||||
"prefix": "接頭辞: ",
|
||||
"branch_prefix_saved": "ブランチ接頭辞が保存されました。"
|
||||
"prefix": "接頭辞: ",
|
||||
"branch_prefix_saved": "ブランチの接頭辞が保存されました。"
|
||||
},
|
||||
"global_menu": {
|
||||
"menu": "メニュー",
|
||||
"options": "オプション",
|
||||
"options": "設定",
|
||||
"open_new_window": "新しいウィンドウを開く",
|
||||
"zoom": "ズーム",
|
||||
"toggle_fullscreen": "フルスクリーンの切り替え",
|
||||
@@ -67,7 +67,8 @@
|
||||
"switch_to_mobile_version": "モバイル版に切り替え",
|
||||
"switch_to_desktop_version": "デスクトップ版に切り替え",
|
||||
"configure_launchbar": "ランチャーバーの設定",
|
||||
"show_shared_notes_subtree": "共有ノートのサブツリーを表示"
|
||||
"show_shared_notes_subtree": "共有ノートのサブツリーを表示",
|
||||
"update_available": "バージョン {{latestVersion}} が利用可能です。クリックしてダウンロードしてください。"
|
||||
},
|
||||
"left_pane_toggle": {
|
||||
"show_panel": "パネルを表示",
|
||||
@@ -86,7 +87,7 @@
|
||||
"clone_to_selected_note": "選択したノートにクローン",
|
||||
"no_path_to_clone_to": "クローン先のパスが存在しません。",
|
||||
"note_cloned": "ノート \"{{clonedTitle}}\" は \"{{targetTitle}}\" にクローンされました",
|
||||
"clone_notes_to": "ノートをクローンして...",
|
||||
"clone_notes_to": "ノートをクローン...",
|
||||
"help_on_links": "ヘルプへのリンク"
|
||||
},
|
||||
"delete_notes": {
|
||||
@@ -111,7 +112,7 @@
|
||||
"sat": "土",
|
||||
"sun": "日",
|
||||
"january": "1月",
|
||||
"febuary": "2月",
|
||||
"february": "2月",
|
||||
"march": "3月",
|
||||
"april": "4月",
|
||||
"may": "5月",
|
||||
@@ -123,7 +124,18 @@
|
||||
"november": "11月",
|
||||
"december": "12月",
|
||||
"cannot_find_day_note": "dayノートが見つかりません",
|
||||
"cannot_find_week_note": "weekノートが見つかりません"
|
||||
"cannot_find_week_note": "weekノートが見つかりません",
|
||||
"week": "週",
|
||||
"week_previous": "前の週",
|
||||
"week_next": "次の週",
|
||||
"month": "月",
|
||||
"month_previous": "前の月",
|
||||
"month_next": "次の月",
|
||||
"year": "年",
|
||||
"year_previous": "前の年",
|
||||
"year_next": "次の年",
|
||||
"list": "リスト",
|
||||
"today": "今日"
|
||||
},
|
||||
"note_icon": {
|
||||
"change_note_icon": "ノートアイコンの変更",
|
||||
@@ -135,7 +147,8 @@
|
||||
"note_type": "ノートタイプ",
|
||||
"editable": "編集可能",
|
||||
"basic_properties": "基本プロパティ",
|
||||
"language": "言語"
|
||||
"language": "言語",
|
||||
"configure_code_notes": "コードノートを設定しています..."
|
||||
},
|
||||
"i18n": {
|
||||
"title": "ローカライゼーション",
|
||||
@@ -150,7 +163,8 @@
|
||||
"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": "アプリケーションの言語に基づいて"
|
||||
},
|
||||
"tab_row": {
|
||||
"close_tab": "タブを閉じる",
|
||||
@@ -239,12 +253,12 @@
|
||||
"help": {
|
||||
"title": "チートシート",
|
||||
"noteNavigation": "ノートナビゲーション",
|
||||
"collapseExpand": "ノードの格納/展開",
|
||||
"collapseExpand": "ノードを折りたたむ / 展開",
|
||||
"goBackForwards": "履歴を戻る/進む",
|
||||
"scrollToActiveNote": "アクティブノートまでスクロール",
|
||||
"jumpToParentNote": "親ノートへ移動",
|
||||
"collapseWholeTree": "すべてのノートツリーを格納",
|
||||
"collapseSubTree": "サブツリーを格納",
|
||||
"collapseWholeTree": "すべてのノートツリーを折りたたむ",
|
||||
"collapseSubTree": "サブツリーを折りたたむ",
|
||||
"tabShortcuts": "タブショートカット",
|
||||
"newTabNoteLink": "ノートのリンクをクリックすると、新しいタブで開く",
|
||||
"newTabWithActivationNoteLink": "ノートのリンクをクリックすると、新しいタブで開き、アクティブにします",
|
||||
@@ -324,8 +338,8 @@
|
||||
},
|
||||
"recent_changes": {
|
||||
"title": "最近の変更",
|
||||
"erase_notes_button": "削除したメモを今すぐ消去する",
|
||||
"deleted_notes_message": "削除されたメモは完全に消去されました。",
|
||||
"erase_notes_button": "削除したノートを今すぐ消去",
|
||||
"deleted_notes_message": "削除されたノートは完全に消去されました。",
|
||||
"no_changes_message": "変更はまだありません...",
|
||||
"undelete_link": "削除を取り消す",
|
||||
"confirm_undelete": "このノートとサブノートを復元しますか?"
|
||||
@@ -384,9 +398,9 @@
|
||||
"protect-subtree": "サブツリーを保護",
|
||||
"unprotect-subtree": "サブツリーの保護を解除",
|
||||
"copy-clone": "コピー/クローン",
|
||||
"clone-to": "クローンして...",
|
||||
"clone-to": "クローン先...",
|
||||
"cut": "カット",
|
||||
"move-to": "移動して...",
|
||||
"move-to": "移動先...",
|
||||
"paste-into": "貼り付け",
|
||||
"paste-after": "後ろに貼り付け",
|
||||
"duplicate": "複製",
|
||||
@@ -399,7 +413,9 @@
|
||||
"open-in-popup": "クイックエディット",
|
||||
"hoist-note": "ホイストノート",
|
||||
"unhoist-note": "ノートをホイストしない",
|
||||
"edit-branch-prefix": "ブランチの接頭辞を編集"
|
||||
"edit-branch-prefix": "ブランチの接頭辞を編集",
|
||||
"archive": "アーカイブ",
|
||||
"unarchive": "アーカイブ解除"
|
||||
},
|
||||
"zen_mode": {
|
||||
"button_exit": "禅モードを退出"
|
||||
@@ -449,10 +465,12 @@
|
||||
"delete_note": {
|
||||
"delete_note": "ノートを削除",
|
||||
"delete_matched_notes": "一致したノートを削除",
|
||||
"delete_matched_notes_description": "これにより、一致したノートが削除されます。"
|
||||
"delete_matched_notes_description": "これにより、一致したノートが削除されます。",
|
||||
"undelete_notes_instruction": "削除後、「最近の変更」ダイアログから削除を取り消すことができます。",
|
||||
"erase_notes_instruction": "ノートを完全に消去するには、削除後に「設定」->「その他」に移動し、「削除したノートを今すぐ消去」ボタンをクリックします。"
|
||||
},
|
||||
"board_view": {
|
||||
"delete-note": "ノートを削除",
|
||||
"delete-note": "ノートを削除...",
|
||||
"insert-above": "上に挿入",
|
||||
"insert-below": "下に挿入",
|
||||
"delete-column": "列を削除",
|
||||
@@ -478,7 +496,8 @@
|
||||
"execute_script": {
|
||||
"execute_script": "スクリプトを実行",
|
||||
"help_text": "一致したノートに対して簡単なスクリプトを実行できます。",
|
||||
"example_2": "より複雑な例としては、一致したノートの属性をすべて削除することが挙げられます:"
|
||||
"example_2": "より複雑な例としては、一致したノートの属性をすべて削除することが挙げられます:",
|
||||
"example_1": "例えば、ノートのタイトルに文字列を追加するには、この小さなスクリプトを使用します:"
|
||||
},
|
||||
"script_executor": {
|
||||
"execute_script": "スクリプトを実行",
|
||||
@@ -498,9 +517,9 @@
|
||||
"book_properties": {
|
||||
"grid": "グリッド",
|
||||
"list": "リスト",
|
||||
"collapse_all_notes": "すべてのノートを格納",
|
||||
"collapse_all_notes": "すべてのノートを折りたたむ",
|
||||
"expand_all_children": "すべての子を展開",
|
||||
"collapse": "格納",
|
||||
"collapse": "折りたたむ",
|
||||
"expand": "展開",
|
||||
"book_properties": "コレクションプロパティ",
|
||||
"invalid_view_type": "無効なビュータイプ '{{type}}'",
|
||||
@@ -533,11 +552,11 @@
|
||||
"beta-feature": "Beta",
|
||||
"ai-chat": "AI チャット",
|
||||
"task-list": "タスクリスト",
|
||||
"new-feature": "新しい",
|
||||
"new-feature": "New",
|
||||
"collections": "コレクション"
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "この日の編集されたメモはまだありません...",
|
||||
"no_edited_notes_found": "この日の編集されたノートはまだありません...",
|
||||
"title": "編集されたノート",
|
||||
"deleted": "(削除済み)"
|
||||
},
|
||||
@@ -548,7 +567,10 @@
|
||||
"download": "ダウンロード",
|
||||
"open": "開く",
|
||||
"title": "ファイル",
|
||||
"upload_new_revision": "編集履歴をアップロード"
|
||||
"upload_new_revision": "編集履歴をアップロード",
|
||||
"original_file_name": "元のファイル名",
|
||||
"upload_success": "新しいファイルの変更がアップロードされました。",
|
||||
"upload_failed": "新しいファイルの変更のアップロードに失敗しました。"
|
||||
},
|
||||
"note_info_widget": {
|
||||
"note_id": "ノート ID",
|
||||
@@ -567,7 +589,11 @@
|
||||
"download": "ダウンロード",
|
||||
"open": "開く",
|
||||
"title": "画像",
|
||||
"upload_new_revision": "編集履歴をアップロード"
|
||||
"upload_new_revision": "編集履歴をアップロード",
|
||||
"original_file_name": "元のファイル名",
|
||||
"copy_reference_to_clipboard": "参照をクリップボードにコピー",
|
||||
"upload_success": "新しい画像の変更がアップロードされました。",
|
||||
"upload_failed": "新しい画像の変更のアップロードに失敗しました: {{message}}"
|
||||
},
|
||||
"revisions": {
|
||||
"download_button": "ダウンロード",
|
||||
@@ -595,7 +621,8 @@
|
||||
"diff_off_hint": "クリックしてノートの内容を表示",
|
||||
"diff_not_available": "差分は利用できません。",
|
||||
"snapshot_interval": "ノートの変更履歴の記録間隔: {{seconds}} 秒。",
|
||||
"maximum_revisions": "ノートの変更履歴の記録制限: {{number}}."
|
||||
"maximum_revisions": "ノートの変更履歴の記録制限: {{number}}.",
|
||||
"mime": "MIME: "
|
||||
},
|
||||
"attachments_actions": {
|
||||
"download": "ダウンロード",
|
||||
@@ -612,7 +639,11 @@
|
||||
"delete_confirm": "本当に添付ファイル '{{title}}' を削除しますか?",
|
||||
"delete_success": "添付ファイル '{{title}}' は削除されました。",
|
||||
"enter_new_name": "新しい添付ファイルの名前を入力してください",
|
||||
"upload_new_revision": "編集履歴をアップロード"
|
||||
"upload_new_revision": "編集履歴をアップロード",
|
||||
"upload_success": "新しい添付ファイルの変更がアップロードされました。",
|
||||
"upload_failed": "新しい添付ファイルの変更のアップロードに失敗しました。",
|
||||
"convert_confirm": "添付ファイル「{{title}}」を別のノートに変換してもよろしいですか?",
|
||||
"convert_success": "添付ファイル「{{title}}」がノートに変換されました。"
|
||||
},
|
||||
"etapi": {
|
||||
"created": "作成日時",
|
||||
@@ -642,21 +673,23 @@
|
||||
"note_paths": {
|
||||
"title": "ノートパス",
|
||||
"clone_button": "ノートを新しい場所にクローン...",
|
||||
"intro_placed": "このノートは以下のパスに置かれる:",
|
||||
"intro_placed": "このノートは以下のパスに置かれています:",
|
||||
"intro_not_placed": "このノートはまだノートツリーに配置されていません。",
|
||||
"archived": "アーカイブされた",
|
||||
"search": "検索",
|
||||
"outside_hoisted": "このパスはホイストされたノートの外側にあるため、ホイストを解除する必要があります。"
|
||||
},
|
||||
"note_properties": {
|
||||
"info": "情報"
|
||||
"info": "情報",
|
||||
"this_note_was_originally_taken_from": "このノートは元々以下から引用したものです:"
|
||||
},
|
||||
"similar_notes": {
|
||||
"title": "類似ノート",
|
||||
"no_similar_notes_found": "類似したノートが見つかりません。"
|
||||
},
|
||||
"abstract_search_option": {
|
||||
"remove_this_search_option": "この検索オプションを削除"
|
||||
"remove_this_search_option": "この検索オプションを削除",
|
||||
"failed_rendering": "検索オプションのレンダリングに失敗しました: {{dto}} エラー: {{error}}{{stack}}"
|
||||
},
|
||||
"debug": {
|
||||
"debug": "デバッグ",
|
||||
@@ -690,7 +723,8 @@
|
||||
"content_and_attachments_and_revisions_size": "添付ファイルと編集履歴を含むノート内容のサイズ",
|
||||
"revision_count": "編集履歴の回数",
|
||||
"owned_label_count": "ラベルの数",
|
||||
"owned_relation_count": "関係の数"
|
||||
"owned_relation_count": "リレーションの数",
|
||||
"target_relation_count": "ノートを対象とするリレーションの数"
|
||||
},
|
||||
"table_view": {
|
||||
"sort-column-descending": "降順",
|
||||
@@ -710,7 +744,7 @@
|
||||
"delete_column_confirmation": "この列を本当に削除してもよろしいですか?対応する属性はすべてのノートから削除されます。",
|
||||
"delete-column": "列を削除",
|
||||
"new-column-label": "ラベル",
|
||||
"new-column-relation": "関係"
|
||||
"new-column-relation": "リレーション"
|
||||
},
|
||||
"search_script": {
|
||||
"title": "検索スクリプト:",
|
||||
@@ -735,7 +769,7 @@
|
||||
"placeholder": "ノート名で検索",
|
||||
"label": "祖先",
|
||||
"depth_label": "深さ",
|
||||
"depth_doesnt_matter": "関係ない",
|
||||
"depth_doesnt_matter": "関係なし",
|
||||
"depth_eq": "ちょうど {{count}} つ下の階層",
|
||||
"direct_children": "直接の子",
|
||||
"depth_gt": "{{count}} より下の階層",
|
||||
@@ -759,7 +793,14 @@
|
||||
"refresh": "リフレッシュ"
|
||||
},
|
||||
"sync": {
|
||||
"title": "同期"
|
||||
"title": "同期",
|
||||
"force_full_sync_button": "完全同期を強制する",
|
||||
"fill_entity_changes_button": "エンティティ変更レコードを入力",
|
||||
"full_sync_triggered": "完全同期がトリガーされました",
|
||||
"filling_entity_changes": "エンティティ変更行を入力中...",
|
||||
"sync_rows_filled_successfully": "同期行が正常に入力されました",
|
||||
"finished-successfully": "同期が正常に完了しました。",
|
||||
"failed": "同期に失敗しました: {{message}}"
|
||||
},
|
||||
"fonts": {
|
||||
"fonts": "フォント",
|
||||
@@ -781,7 +822,8 @@
|
||||
"serif": "セリフ",
|
||||
"sans-serif": "サンセリフ",
|
||||
"monospace": "等幅",
|
||||
"system-default": "システムのデフォルト"
|
||||
"system-default": "システムのデフォルト",
|
||||
"theme_defined": "テーマが定義されました"
|
||||
},
|
||||
"max_content_width": {
|
||||
"reload_button": "フロントエンドをリロード",
|
||||
@@ -790,7 +832,7 @@
|
||||
"max_width_label": "最大コンテンツ幅",
|
||||
"max_width_unit": "ピクセル",
|
||||
"apply_changes_description": "コンテンツ幅の変更を適用するには、クリックしてください",
|
||||
"reload_description": "外観オプションからの変更"
|
||||
"reload_description": "外観設定から変更"
|
||||
},
|
||||
"theme": {
|
||||
"title": "アプリのテーマ",
|
||||
@@ -859,14 +901,14 @@
|
||||
"bg_color": "背景色付きテキスト",
|
||||
"visibility_title": "ハイライトリスト表示",
|
||||
"visibility_description": "#hideHighlightWidget ラベルを追加することで、ノートごとにハイライトウィジェットを非表示にできます。",
|
||||
"shortcut_info": "オプション -> ショートカット('右ペイン切り替え')で、右ペイン(ハイライトを含む)を素早く切り替えるキーボードショートカットを設定できます。"
|
||||
"shortcut_info": "設定 -> ショートカット(右ペイン切り替え)で、右ペイン(ハイライトを含む)を素早く切り替えるキーボードショートカットを設定できます。"
|
||||
},
|
||||
"table_of_contents": {
|
||||
"title": "目次",
|
||||
"description": "ノートに定義された数以上の見出しがある場合、テキストノートに目次が表示されます。この数はカスタマイズできます:",
|
||||
"unit": "見出し",
|
||||
"disable_info": "このオプションに非常に大きな数値を設定することで、目次を効果的に無効にすることもできる。",
|
||||
"shortcut_info": "オプション -> ショートカット('右ペイン切り替え')で、右ペイン(目次を含む)を素早く切り替えるキーボードショートカットを設定できます。"
|
||||
"disable_info": "このオプションに非常に大きな数値を設定することで、目次を効果的に無効にすることもできます。",
|
||||
"shortcut_info": "設定 -> ショートカット(右ペイン切り替え)で、右ペイン(目次を含む)を素早く切り替えるキーボードショートカットを設定できます。"
|
||||
},
|
||||
"toc": {
|
||||
"table_of_contents": "目次",
|
||||
@@ -1033,7 +1075,7 @@
|
||||
"read_only": "エディターは読み取り専用モードです。テキストとコードノートのみ機能します。",
|
||||
"auto_read_only_disabled": "テキスト/コードノートは、サイズが大きすぎる場合、自動的に読み取りモードに設定されます。このラベルをノートに追加することで、ノートごとにこの動作を無効にすることができます",
|
||||
"app_css": "Trilium アプリケーションに読み込まれ、Trilium の外観を変更するために使用できる CSS ノートをマークします。",
|
||||
"app_theme": "Trilium のフルテーマである CSS ノートをマークし、Trilium オプションで利用できるようにします。",
|
||||
"app_theme": "Trilium のフルテーマである CSS ノートをマークし、Trilium の設定で利用できるようにします。",
|
||||
"app_theme_base": "「next」、「next-light」、または「next-dark」に設定すると、従来のテーマではなく、対応する TriliumNext テーマ (auto、light、または dark) がカスタム テーマのベースとして使用されます。",
|
||||
"css_class": "このラベルの値は、ツリー内の特定のノートを表すノードにCSSクラスとして追加されます。これは高度なテーマ設定に役立ちます。テンプレートノートで使用できます。",
|
||||
"icon_class": "このラベルの値は、ツリー上のアイコンにCSSクラスとして追加され、ツリー内のノートを視覚的に区別するのに役立ちます。例えば、bx bx-home のように、アイコンは boxicons から取得されます。テンプレートノートで使用できます。",
|
||||
@@ -1064,7 +1106,7 @@
|
||||
"display_relations": "表示するリレーション名をカンマで区切って指定します。それ以外のリレーション名は非表示になります。",
|
||||
"hide_relations": "非表示にするリレーション名をカンマで区切って指定します。それ以外のリレーションは表示されます。",
|
||||
"template": "このノートは、新しいノートを作成するときに利用可能なテンプレートの選択肢に表示されます",
|
||||
"toc": "<code>#toc</code> または <code>#toc=show</code><code> は目次を強制的に表示し、<code>#toc=hide</code> は目次を強制的に非表示にします。ラベルが存在しない場合は、グローバル設定が適用されます",
|
||||
"toc": "<code>#toc</code> または <code>#toc=show</code> は目次を強制的に表示し、<code>#toc=hide</code> は目次を強制的に非表示にします。ラベルが存在しない場合は、グローバル設定が適用されます",
|
||||
"color": "ノートツリー、リンクなどのノートの色を定義します。 'red' や #a13d5f などの有効な CSS カラー値を使用します",
|
||||
"keyboard_shortcut": "このノートにすぐにジャンプするキーボードショートカットを定義します。例: 「ctrl+alt+e」。変更を有効にするには、フロントエンドをリロードする必要があります。",
|
||||
"keep_current_hoisting": "このリンクを開いても、ノートが現在のホイストされたサブツリーに表示できない場合でも、ホイストは変更されません。",
|
||||
@@ -1077,7 +1119,29 @@
|
||||
"run_on_child_note_creation": "このリレーションが定義されているノートの下に新しいノートが作成されたときに実行されます",
|
||||
"render_note": "「HTMLノートをレンダリング」タイプのノートは、コードノート(HTMLまたはスクリプト)を使用してレンダリングされます。このリレーションを使用して、どのノートをレンダリングするかを指定する必要があります",
|
||||
"other_notes_with_name": "{{attributeType}} の名前が「{{attributeName}}」であるその他のノート",
|
||||
"color_type": "色"
|
||||
"color_type": "色",
|
||||
"share_description": "説明用にHTMLメタタグに追加するテキストを定義します",
|
||||
"title_template": "このノートの子として作成されるノートのデフォルトのタイトルです。値は JavaScript 文字列として評価されるため、\n 挿入された <code>now</code> および <code>parentNote</code> 変数を介して動的なコンテンツを追加できます。例: \n \n <ul> \n <li><code>${parentNote.getLabelValue('authorName')} の文学作品</code></li> \n <li><code>${now.format('YYYY-MM-DD HH:mm:ss')} のログ</code></li> \n </ul> \n \n 詳細については <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\"> Wiki の詳細 </a> 、および <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> と <a href=\"https://day.js.org/docs/en/display/format\">now</a> の API ドキュメントを参照してください。",
|
||||
"run_on_note_title_change": "ノートのタイトルが変更されたときに実行されます(ノートの作成も含む)",
|
||||
"run_on_note_content_change": "ノートの内容が変更されたときに実行されます(ノートの作成も含む)。",
|
||||
"run_on_note_change": "ノートが変更されたときに実行されます(ノートの作成も含む)。内容の変更は含まれません",
|
||||
"run_on_note_deletion": "ノートが削除されたときに実行されます",
|
||||
"run_on_branch_creation": "ブランチが作成されたときに実行されます。ブランチは親ノートと子ノート間のリンクであり、例えばノートの複製や移動の際に作成されます。",
|
||||
"run_on_branch_change": "ブランチが更新されたときに実行されます。",
|
||||
"run_on_branch_deletion": "ブランチが削除されたときに実行されます。ブランチは親ノートと子ノート間のリンクであり、ノートを移動した場合などに削除されます(古いブランチ/リンクは削除されます)。",
|
||||
"run_on_attribute_creation": "このリレーションを定義するノートに新しい属性が作成された場合に実行されます",
|
||||
"run_on_attribute_change": " このリレーションを定義するノートの属性が変更されたときに実行されます。属性が削除された場合にも実行されます",
|
||||
"relation_template": "ノートの属性は親子関係がなくても継承されます。ノートの内容とサブツリーは、空の場合はインスタンスノートに追加されます。詳細はドキュメントをご覧ください。",
|
||||
"inherit": "親子関係がなくても、ノートの属性は継承されます。同様の概念については、テンプレートリレーションを参照してください。ドキュメントの属性継承を参照してください。",
|
||||
"widget_relation": "このリレーションのターゲットが実行され、サイドバーのウィジェットとしてレンダリングされます",
|
||||
"share_css": "共有ページに挿入されるCSSノートです。CSSノートは共有サブツリーにも含まれている必要があります。「share_hidden_from_tree」と「share_omit_default_css」の使用も検討してください。",
|
||||
"share_js": "共有ページに挿入されるJavaScriptノートです。JavaScriptノートは共有サブツリー内にも存在する必要があります。「share_hidden_from_tree」の使用を検討してください。",
|
||||
"share_template": "共有ノートを表示するためのテンプレートとして使用される埋め込みJavaScriptノートです。デフォルトのテンプレートにフォールバックします。「share_hidden_from_tree」の使用を検討してください。",
|
||||
"share_favicon": "共有ページに設定するファビコンのノートです。通常は共有ルートに設定し、継承可能にします。ファビコンのノートは共有サブツリーにも設定する必要があります。「share_hidden_from_tree」の使用を検討してください。",
|
||||
"is_owned_by_note": "ノートによって所有されています",
|
||||
"and_more": "...その他 {{count}} 件。",
|
||||
"print_landscape": "PDF にエクスポートするときに、ページの向きを縦向きではなく横向きに変更します。",
|
||||
"print_page_size": "PDF にエクスポートするときに、ページのサイズを変更します。サポートされる値: <code>A0</code>, <code>A1</code>, <code>A2</code>, <code>A3</code>, <code>A4</code>, <code>A5</code>, <code>A6</code>, <code>Legal</code>, <code>Letter</code>, <code>Tabloid</code>, <code>Ledger</code>。"
|
||||
},
|
||||
"link_context_menu": {
|
||||
"open_note_in_popup": "クイックエディット",
|
||||
@@ -1104,11 +1168,14 @@
|
||||
},
|
||||
"template_switch": {
|
||||
"template": "テンプレート",
|
||||
"toggle-on-hint": "ノートをテンプレート化する"
|
||||
"toggle-on-hint": "ノートをテンプレート化する",
|
||||
"toggle-off-hint": "テンプレートとしてのノートを削除する"
|
||||
},
|
||||
"open-help-page": "ヘルプページを開く",
|
||||
"shared_info": {
|
||||
"help_link": "ヘルプについては、<a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a>をご覧ください。"
|
||||
"help_link": "ヘルプについては、<a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a>をご覧ください。",
|
||||
"shared_locally": "このノートは {{- link}} でローカルに共有されています。",
|
||||
"shared_publicly": "このノートは {{- link}} で一般公開されています。"
|
||||
},
|
||||
"highlights_list_2": {
|
||||
"title": "ハイライトリスト",
|
||||
@@ -1132,7 +1199,10 @@
|
||||
"auto-collapsing-notes-after-inactivity": "非アクティブ状態が続いたためノートが自動で折りたたまれます...",
|
||||
"create-child-note": "子ノートを作成",
|
||||
"hoist-this-note-workspace": "このノートをホイストする(ワークスペース)",
|
||||
"unhoist": "ホイスト解除"
|
||||
"unhoist": "ホイスト解除",
|
||||
"saved-search-note-refreshed": "保存した検索ノートが更新されました。",
|
||||
"refresh-saved-search-results": "保存した検索結果を更新",
|
||||
"toggle-sidebar": "サイドバーを切り替え"
|
||||
},
|
||||
"bulk_actions": {
|
||||
"bulk_actions": "一括操作",
|
||||
@@ -1143,7 +1213,7 @@
|
||||
"execute_bulk_actions": "一括操作を実行",
|
||||
"bulk_actions_executed": "一括操作が成功に実行されました。",
|
||||
"labels": "ラベル",
|
||||
"relations": "関係",
|
||||
"relations": "リレーション",
|
||||
"notes": "ノート",
|
||||
"other": "その他",
|
||||
"none_yet": "アクションを上のリストからクリックして追加。"
|
||||
@@ -1207,7 +1277,7 @@
|
||||
"editor_type": {
|
||||
"label": "書式設定ツールバー",
|
||||
"floating": {
|
||||
"description": "編集ツールがカーソル付近に表示されます;",
|
||||
"description": "編集ツールがカーソル付近に表示されます。",
|
||||
"title": "フローティング"
|
||||
},
|
||||
"fixed": {
|
||||
@@ -1222,7 +1292,7 @@
|
||||
"cut": "カット",
|
||||
"copy": "コピー",
|
||||
"copy-link": "リンクをコピー",
|
||||
"paste": "ペースト",
|
||||
"paste": "貼り付け",
|
||||
"paste-as-plain-text": "プレーンテキストで貼り付け",
|
||||
"search_online": "{{searchEngine}} で \"{{term}}\" を検索"
|
||||
},
|
||||
@@ -1272,11 +1342,17 @@
|
||||
"continue_anyway": "とにかく続ける",
|
||||
"message_windows": "TriliumNext は現在エミュレーションを実行しています。つまり、ARM版WindowsデバイスでIntel(x64)版を使用していることになります。これはパフォーマンスとバッテリー寿命に重大な影響を及ぼします。",
|
||||
"recommendation": "最適なエクスペリエンスを得るには、リリース ページから TriliumNext のネイティブ ARM64 バージョンをダウンロードしてください。",
|
||||
"download_link": "ネイティブ版をダウンロード"
|
||||
"download_link": "ネイティブ版をダウンロード",
|
||||
"message_macos": "TriliumNext は現在、Rosetta 2による翻訳環境で実行されています。つまり、Apple Silicon MacではIntel (x64)バージョンを使用していることになります。これはパフォーマンスとバッテリー寿命に重大な影響を及ぼします。"
|
||||
},
|
||||
"editorfeatures": {
|
||||
"emoji_completion_enabled": "絵文字のオートコンプリートを有効",
|
||||
"note_completion_enabled": "ノートのオートコンプリートを有効"
|
||||
"note_completion_enabled": "ノートのオートコンプリートを有効",
|
||||
"emoji_completion_description": "有効にすると、「:」に続けて絵文字の名前を入力することで、テキストに絵文字を簡単に挿入できます。",
|
||||
"note_completion_description": "有効にすると、「@」 に続けてノートのタイトルを入力することで、ノートへのリンクを作成できます。",
|
||||
"slash_commands_enabled": "スラッシュコマンドを有効",
|
||||
"slash_commands_description": "有効にすると、改行や見出しの挿入などの編集コマンドは、「/」 と入力して切り替えることができます。",
|
||||
"title": "機能"
|
||||
},
|
||||
"table_context_menu": {
|
||||
"delete_row": "行を削除"
|
||||
@@ -1344,7 +1420,8 @@
|
||||
"agent": {
|
||||
"processing": "処理中...",
|
||||
"loading": "読み込み中...",
|
||||
"generating": "生成中..."
|
||||
"generating": "生成中...",
|
||||
"thinking": "考え中..."
|
||||
},
|
||||
"name": "AI",
|
||||
"openai": "OpenAI",
|
||||
@@ -1352,7 +1429,7 @@
|
||||
"ollama_no_url": "Ollamaは設定されていません。有効なURLを入力してください。",
|
||||
"chat": {
|
||||
"root_note_title": "AIチャット",
|
||||
"root_note_content": "このメモには、保存されたAIチャットの会話が含まれています。",
|
||||
"root_note_content": "このノートには、保存されたAIチャットの会話が含まれています。",
|
||||
"new_chat_title": "新しいチャット",
|
||||
"create_new_ai_chat": "新しいAIチャットを作成"
|
||||
},
|
||||
@@ -1362,7 +1439,71 @@
|
||||
"selected_provider_description": "チャットおよび補完機能のAIプロバイダーを選択する",
|
||||
"selected_provider": "プロバイダーを選択",
|
||||
"select_model": "モデルを選択...",
|
||||
"select_provider": "プロバイダーを選択..."
|
||||
"select_provider": "プロバイダーを選択...",
|
||||
"not_started": "開始されていません",
|
||||
"processed_notes": "処理済みノート",
|
||||
"total_notes": "ノートの総数",
|
||||
"progress": "進行状況",
|
||||
"queued_notes": "キューに登録されたノート",
|
||||
"failed_notes": "失敗したノート",
|
||||
"last_processed": "最終処理日時",
|
||||
"refresh_stats": "統計情報を更新",
|
||||
"temperature": "Temperature(温度)",
|
||||
"url": "ベースURL",
|
||||
"base_url": "ベースURL",
|
||||
"enable_automatic_indexing": "自動インデックス作成を有効にする",
|
||||
"rebuild_index": "インデックスの再構築",
|
||||
"rebuild_index_error": "インデックスの再構築開始時にエラーが発生しました。詳細はログをご確認ください。",
|
||||
"note_title": "ノートのタイトル",
|
||||
"last_attempt": "最終試行日時",
|
||||
"actions": "アクション",
|
||||
"retry_queued": "ノートが再試行キューに追加されました",
|
||||
"retry_failed": "ノートを再試行キューに追加できませんでした",
|
||||
"max_notes_per_llm_query": "クエリあたりの最大ノート数",
|
||||
"max_notes_per_llm_query_description": "AIコンテキストに含める類似ノートの最大数",
|
||||
"active_providers": "アクティブなプロバイダー",
|
||||
"disabled_providers": "無効なプロバイダー",
|
||||
"remove_provider": "検索からプロバイダーを削除",
|
||||
"restore_provider": "検索にプロバイダーを復元",
|
||||
"similarity_threshold": "類似度のしきい値",
|
||||
"similarity_threshold_description": "LLMクエリのコンテキストに含めるノートの最小類似度スコア(0~1)",
|
||||
"reprocess_index": "検索インデックスを再構築",
|
||||
"reprocessing_index": "再構築中...",
|
||||
"reprocess_index_started": "検索インデックスの最適化がバックグラウンドで開始されました",
|
||||
"reprocess_index_error": "検索インデックスの再構築中にエラーが発生しました",
|
||||
"index_rebuild_progress": "インデックスの再構築の進行状況",
|
||||
"index_rebuilding": "インデックスの最適化中({{percentage}}%)",
|
||||
"index_rebuild_complete": "インデックスの最適化が完了しました",
|
||||
"index_rebuild_status_error": "インデックスの再構築ステータスの確認中にエラーが発生しました",
|
||||
"never": "なし",
|
||||
"incomplete": "未完了 ({{percentage}}%)",
|
||||
"note_queued_for_retry": "ノートが再試行キューに追加されました",
|
||||
"failed_to_retry_note": "ノートの再試行に失敗しました",
|
||||
"all_notes_queued_for_retry": "失敗したすべてのノートは再試行のためにキューに入れられました",
|
||||
"failed_to_retry_all": "ノートの再試行に失敗しました",
|
||||
"use_enhanced_context": "拡張されたコンテキストを使用する",
|
||||
"enhanced_context_description": "ノートとその関連ノートからより多くのコンテキストをAIに提供し、より良い応答を実現します",
|
||||
"show_thinking": "思考を表示",
|
||||
"show_thinking_description": "AIの思考プロセスをチェーン表示",
|
||||
"enter_message": "メッセージを入力...",
|
||||
"error_generating_response": "AI応答の生成中にエラーが発生しました",
|
||||
"index_all_notes": "すべてのノートをインデックスに登録",
|
||||
"index_status": "インデックスのステータス",
|
||||
"indexed_notes": "インデックス登録済みのノート",
|
||||
"indexing_stopped": "インデックス登録を停止しました",
|
||||
"indexing_in_progress": "インデックス登録中です...",
|
||||
"last_indexed": "最終インデックス作成日時",
|
||||
"n_notes_queued_0": "{{ count }} 件のノートがインデックス作成待ちです",
|
||||
"note_chat": "ノートチャット",
|
||||
"notes_indexed_0": "{{ count }} 件のノートをインデックスしました",
|
||||
"sources": "ソース",
|
||||
"start_indexing": "インデックス作成を開始",
|
||||
"use_advanced_context": "高度なコンテキストを使用",
|
||||
"ai_enabled": "AI 機能が有効",
|
||||
"ai_disabled": "AI 機能が無効",
|
||||
"no_models_found_online": "モデルが見つかりません。API キーと設定を確認してください。",
|
||||
"no_models_found_ollama": "Ollama モデルが見つかりません。Ollama が実行中かどうかを確認してください。",
|
||||
"error_fetching": "モデルの取得エラー: {{error}}"
|
||||
},
|
||||
"add_label": {
|
||||
"add_label": "ラベルを追加",
|
||||
@@ -1370,7 +1511,10 @@
|
||||
"label_name_title": "英数字、アンダーバー、コロンが使用可能な文字です。",
|
||||
"new_value_placeholder": "新しい値",
|
||||
"help_text": "一致したすべてのノートに:",
|
||||
"help_text_note": "このメソッドを値なしで呼び出すこともできます。その場合、ラベルは値なしでノートに割り当てられます。"
|
||||
"help_text_note": "このメソッドを値なしで呼び出すこともできます。その場合、ラベルは値なしでノートに割り当てられます。",
|
||||
"to_value": "値",
|
||||
"help_text_item1": "ノートにまだラベルがない場合は、指定されたラベルを作成します",
|
||||
"help_text_item2": "または既存のラベルの値を変更する"
|
||||
},
|
||||
"delete_label": {
|
||||
"delete_label": "ラベルを削除",
|
||||
@@ -1391,32 +1535,39 @@
|
||||
"label_name_title": "英数字、アンダーバー、コロンが使用可能な文字です。",
|
||||
"new_value_placeholder": "新しい値",
|
||||
"help_text_note": "このメソッドは値なしで呼び出すこともできます。その場合、値なしでラベルがノートに割り当てられます。",
|
||||
"help_text": "一致したすべてのノートで、既存のラベルの値を変更する。"
|
||||
"help_text": "一致したすべてのノートで、既存のラベルの値を変更する。",
|
||||
"to_value": "値"
|
||||
},
|
||||
"add_relation": {
|
||||
"add_relation": "関係を追加",
|
||||
"relation_name": "関係の名前",
|
||||
"add_relation": "リレーションを追加",
|
||||
"relation_name": "リレーションの名前",
|
||||
"allowed_characters": "英数字、アンダーバー、コロンが使用可能な文字です。",
|
||||
"create_relation_on_all_matched_notes": "一致したすべてのノートに対して、指定されたリレーションを作成します。"
|
||||
"create_relation_on_all_matched_notes": "一致したすべてのノートに対して、指定されたリレーションを作成します。",
|
||||
"target_note": "対象のノート",
|
||||
"to": "を"
|
||||
},
|
||||
"delete_relation": {
|
||||
"delete_relation": "関係を削除",
|
||||
"relation_name": "関係の名前",
|
||||
"delete_relation": "リレーションを削除",
|
||||
"relation_name": "リレーションの名前",
|
||||
"allowed_characters": "英数字、アンダーバー、コロンが使用可能な文字です。"
|
||||
},
|
||||
"rename_relation": {
|
||||
"rename_relation": "関係の名前を変更",
|
||||
"rename_relation_from": "関係の名前を",
|
||||
"rename_relation": "リレーションの名前を変更",
|
||||
"rename_relation_from": "リレーションの名前を",
|
||||
"old_name": "古い名前",
|
||||
"to": "から",
|
||||
"new_name": "新しい名前",
|
||||
"allowed_characters": "英数字、アンダーバー、コロンが使用可能な文字です。"
|
||||
},
|
||||
"update_relation_target": {
|
||||
"update_relation": "関係の更新",
|
||||
"relation_name": "関係の名前",
|
||||
"update_relation": "リレーションの更新",
|
||||
"relation_name": "リレーションの名前",
|
||||
"allowed_characters": "英数字、アンダーバー、コロンが使用可能な文字です。",
|
||||
"on_all_matched_notes": "一致したすべてのノートに"
|
||||
"on_all_matched_notes": "一致したすべてのノートに",
|
||||
"target_note": "対象のノート",
|
||||
"change_target_note": "既存のリレーション対象のノートを変更する",
|
||||
"update_relation_target": "リレーション対象の更新",
|
||||
"to": "を"
|
||||
},
|
||||
"revisions_button": {
|
||||
"note_revisions": "ノートの変更履歴"
|
||||
@@ -1427,21 +1578,25 @@
|
||||
"zpetne_odkazy": {
|
||||
"backlink": "{{count}} バックリンク",
|
||||
"backlinks": "{{count}} バックリンク",
|
||||
"relation": "関係"
|
||||
"relation": "リレーション"
|
||||
},
|
||||
"mobile_detail_menu": {
|
||||
"delete_this_note": "このノートを削除",
|
||||
"error_unrecognized_command": "認識されないコマンド {{command}}"
|
||||
"error_unrecognized_command": "認識されないコマンド {{command}}",
|
||||
"insert_child_note": "子ノートを挿入",
|
||||
"error_cannot_get_branch_id": "ノートパス 「{{notePath}} のbranchIdを取得できません",
|
||||
"note_revisions": "ノートの変更履歴"
|
||||
},
|
||||
"inherited_attribute_list": {
|
||||
"title": "継承属性",
|
||||
"no_inherited_attributes": "継承属性ではありません。"
|
||||
"no_inherited_attributes": "継承属性はありません。"
|
||||
},
|
||||
"note_map": {
|
||||
"open_full": "拡大表示",
|
||||
"collapse": "通常サイズに折りたたむ",
|
||||
"title": "ノートマップ",
|
||||
"link-distance": "リンク距離"
|
||||
"link-distance": "リンク距離",
|
||||
"fix-nodes": "ノードを修正"
|
||||
},
|
||||
"owned_attribute_list": {
|
||||
"owned_attributes": "所有属性"
|
||||
@@ -1453,7 +1608,9 @@
|
||||
"unknown_attribute_type": "不明な属性タイプ '{{type}}'",
|
||||
"add_new_attribute": "新しい属性を追加",
|
||||
"remove_this_attribute": "この属性を削除",
|
||||
"remove_color": "このカラーラベルを削除"
|
||||
"remove_color": "このカラーラベルを削除",
|
||||
"promoted_attributes": "プロモート属性",
|
||||
"url_placeholder": "http://ウェブサイト..."
|
||||
},
|
||||
"relation_map": {
|
||||
"open_in_new_tab": "新しいタブで開く",
|
||||
@@ -1461,14 +1618,17 @@
|
||||
"edit_title": "タイトルを編集",
|
||||
"rename_note": "ノート名を変更",
|
||||
"enter_new_title": "新しいノート名を入力:",
|
||||
"remove_relation": "関係を削除",
|
||||
"confirm_remove_relation": "本当にこの関係を削除しますか?",
|
||||
"specify_new_relation_name": "新しい関係の名前(使用可能な文字: 英数字、コロン、アンダースコア)を指定:",
|
||||
"remove_relation": "リレーションを削除",
|
||||
"confirm_remove_relation": "本当にこのリレーションを削除しますか?",
|
||||
"specify_new_relation_name": "新しいリレーションの名前(使用可能な文字: 英数字、コロン、アンダースコア)を指定:",
|
||||
"note_not_found": "ノート {{noteId}} が見つかりません!",
|
||||
"enter_title_of_new_note": "新しいノートのタイトルを入力",
|
||||
"default_new_note_title": "新しいノート",
|
||||
"cannot_match_transform": "変換を一致させることができません: {{transform}}",
|
||||
"click_on_canvas_to_place_new_note": "キャンバスをクリックして新しいノートを配置"
|
||||
"click_on_canvas_to_place_new_note": "キャンバスをクリックして新しいノートを配置",
|
||||
"connection_exists": "これらのノート間の接続 '{{name}}' は既に存在します。",
|
||||
"start_dragging_relations": "ここからリレーションをドラッグして、別のノートにドロップします。",
|
||||
"note_already_in_diagram": "ノート「{{title}}」はすでに図に含まれています。"
|
||||
},
|
||||
"database_anonymization": {
|
||||
"title": "データベースの匿名化",
|
||||
@@ -1534,7 +1694,7 @@
|
||||
"native-title-bar": "ネイティブタイトルバー",
|
||||
"native-title-bar-description": "WindowsとmacOSでは、ネイティブタイトルバーをオフにしておくと、アプリケーションがよりコンパクトに見えます。Linuxでは、ネイティブタイトルバーを表示したままの方が、他のシステムとの統一性が高まります。",
|
||||
"background-effects": "背景効果を有効化(Windows 11のみ)",
|
||||
"background-effects-description": "Mica効果は、アプリのウィンドウにぼかされたスタイリッシュな背景を追加し、奥行きとモダンな外観を作り出します。",
|
||||
"background-effects-description": "Mica効果は、アプリのウィンドウにぼかされたスタイリッシュな背景を追加し、奥行きとモダンな外観を演出します。「ネイティブタイトルバー」を無効にする必要があります。",
|
||||
"restart-app-button": "アプリケーションを再起動して変更を反映",
|
||||
"zoom-factor": "ズーム倍率"
|
||||
},
|
||||
@@ -1577,10 +1737,23 @@
|
||||
"attribute_editor": {
|
||||
"help_text_body1": "ラベルを追加するには、例 <code>#rock</code> と入力します。値も追加したい場合は、例 <code>#year = 2020</code> と入力します",
|
||||
"help_text_body2": "リレーションについては、<code>~author = @</code> と入力すると、オートコンプリートが表示され、目的のノートを検索できるようになります。",
|
||||
"placeholder": "ここにラベルとリレーションを入力"
|
||||
"placeholder": "ここにラベルとリレーションを入力",
|
||||
"help_text_body3": "代わりに、右側の <code>+</code> ボタンを使用してラベルとリレーションを追加することもできます。",
|
||||
"save_attributes": "属性を保存 <enter>",
|
||||
"add_a_new_attribute": "新しい属性を追加",
|
||||
"add_new_label": "新しいラベルを追加 <kbd data-command=\"addNewLabel\"></kbd>",
|
||||
"add_new_relation": "新しいリレーションを追加 <kbd data-command=\"addNewRelation\"></kbd>",
|
||||
"add_new_label_definition": "新しいラベル定義を追加",
|
||||
"add_new_relation_definition": "新しいリレーション定義を追加"
|
||||
},
|
||||
"move_note": {
|
||||
"on_all_matched_notes": "一致したすべてのノートに"
|
||||
"on_all_matched_notes": "一致したすべてのノートに",
|
||||
"move_note": "ノートを移動",
|
||||
"target_parent_note": "対象の親ノート",
|
||||
"move_note_new_parent": "ノートに親が 1 つしかない場合は、ノートを新しい親に移動します (つまり、古いブランチが削除され、新しい親に新しいブランチが作成されます)",
|
||||
"clone_note_new_parent": "ノートに複数のクローン/ブランチがある場合、ノートを新しい親にクローンします(どのブランチを削除すべきか不明なため)",
|
||||
"nothing_will_happen": "ノートをターゲットノートに移動できない場合は何も起こりません(つまり、ツリーサイクルが生じるため)",
|
||||
"to": "次へ"
|
||||
},
|
||||
"onclick_button": {
|
||||
"no_click_handler": "ボタン ウィジェット '{{componentId}}' にはクリック ハンドラーが定義されていません"
|
||||
@@ -1596,20 +1769,35 @@
|
||||
"placeholder": "ここにノートの内容を入力..."
|
||||
},
|
||||
"empty": {
|
||||
"open_note_instruction": "以下の入力欄にノートのタイトルを入力するか、ツリー内のノートを選択してノートを開きます。"
|
||||
"open_note_instruction": "以下の入力欄にノートのタイトルを入力するか、ツリー内のノートを選択してノートを開きます。",
|
||||
"search_placeholder": "名前でノートを検索",
|
||||
"enter_workspace": "ワークスペース {{title}} に入る"
|
||||
},
|
||||
"file": {
|
||||
"too_big": "パフォーマンス上の理由により、プレビューではファイルの最初の {{maxNumChars}} 文字のみが表示されます。ファイル全体を表示するには、ファイルをダウンロードして外部で開いてください。"
|
||||
"too_big": "パフォーマンス上の理由により、プレビューではファイルの最初の {{maxNumChars}} 文字のみが表示されます。ファイル全体を表示するには、ファイルをダウンロードして外部で開いてください。",
|
||||
"file_preview_not_available": "このファイル形式ではファイルプレビューは利用できません。"
|
||||
},
|
||||
"protected_session": {
|
||||
"enter_password_instruction": "保護されたノートを表示するにはパスワードを入力する必要があります:"
|
||||
"enter_password_instruction": "保護されたノートを表示するにはパスワードを入力する必要があります:",
|
||||
"start_session_button": "保護されたセッションを開始 <kbd>enter</kbd>",
|
||||
"started": "保護されたセッションが開始されました。",
|
||||
"wrong_password": "パスワードが間違っています。",
|
||||
"protecting-finished-successfully": "保護が正常に完了しました。",
|
||||
"unprotecting-finished-successfully": "保護の解除が正常に完了しました。",
|
||||
"protecting-in-progress": "保護中: {{count}}",
|
||||
"unprotecting-in-progress-count": "保護解除中: {{count}}",
|
||||
"protecting-title": "保護の状態",
|
||||
"unprotecting-title": "保護解除の状態"
|
||||
},
|
||||
"render": {
|
||||
"note_detail_render_help_1": "このヘルプノートが表示されるのは、このノートの「HTML のレンダリング」タイプには、正常に機能するために必要なリレーションがないためです。"
|
||||
"note_detail_render_help_1": "このヘルプノートが表示されるのは、このノートの「HTML のレンダリング」タイプには、正常に機能するために必要なリレーションがないためです。",
|
||||
"note_detail_render_help_2": "レンダリングHTMLノートタイプは、<a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/scripts.html\">スクリプティング</a>に使用されます。簡単に言うと、HTMLコードノート(オプションでJavaScriptを含む)があり、このノートがそれをレンダリングします。これを動作させるには、レンダリングするHTMLノートを指す「renderNote」という<a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/attributes.html\">リレーション</a>を定義する必要があります。"
|
||||
},
|
||||
"consistency_checks": {
|
||||
"find_and_fix_button": "一貫性の問題を見つけて修正する",
|
||||
"finding_and_fixing_message": "一貫性の問題を見つけて修正中…"
|
||||
"finding_and_fixing_message": "一貫性の問題を見つけて修正中…",
|
||||
"title": "一貫性をチェック",
|
||||
"issues_fixed_message": "発見された可能性のある一貫性の問題はすべて修正されました。"
|
||||
},
|
||||
"vacuum_database": {
|
||||
"title": "データベースのバキューム",
|
||||
@@ -1620,12 +1808,16 @@
|
||||
},
|
||||
"ribbon": {
|
||||
"promoted_attributes_message": "プロモート属性がノートに存在する場合、プロモート属性のリボンタブが自動的に開きます",
|
||||
"edited_notes_message": "編集したノートのリボンタブは、dayノートで自動的に開きます"
|
||||
"edited_notes_message": "編集したノートのリボンタブは、dayノートで自動的に開きます",
|
||||
"widgets": "リボンウィジェット"
|
||||
},
|
||||
"ui-performance": {
|
||||
"enable-motion": "トランジションとアニメーションを有効にする",
|
||||
"enable-shadows": "影を有効にする",
|
||||
"enable-backdrop-effects": "メニュー、ポップアップ、パネルの背景効果を有効にする"
|
||||
"enable-backdrop-effects": "メニュー、ポップアップ、パネルの背景効果を有効にする",
|
||||
"title": "パフォーマンス",
|
||||
"enable-smooth-scroll": "スムーズスクロールを有効にする",
|
||||
"app-restart-required": "(変更を有効にするにはアプリケーションの再起動が必要です)"
|
||||
},
|
||||
"code_mime_types": {
|
||||
"title": "ドロップダウンで利用可能なMIMEタイプ"
|
||||
@@ -1664,7 +1856,12 @@
|
||||
"erase_excess_revision_snapshots_prompt": "余分な変更履歴が消去されました。"
|
||||
},
|
||||
"editability_select": {
|
||||
"note_is_read_only": "ノートは読み取り専用ですが、ボタンをクリックすると編集できます。"
|
||||
"note_is_read_only": "ノートは読み取り専用ですが、ボタンをクリックすると編集できます。",
|
||||
"auto": "自動",
|
||||
"read_only": "読み取り専用",
|
||||
"always_editable": "常に編集可能",
|
||||
"note_is_editable": "ノートは長すぎなければ編集可能です。",
|
||||
"note_is_always_editable": "ノートは長さに関係なく常に編集可能です。"
|
||||
},
|
||||
"find": {
|
||||
"case_sensitive": "大文字と小文字を区別",
|
||||
@@ -1681,7 +1878,9 @@
|
||||
"could_not_find_typewidget": "タイプ {{type}} の typeWidget が見つかりませんでした"
|
||||
},
|
||||
"watched_file_update_status": {
|
||||
"ignore_this_change": "この変更を無視する"
|
||||
"ignore_this_change": "この変更を無視する",
|
||||
"file_last_modified": "ファイル <code class=\"file-path\"></code> は <span class=\"file-last-modified\"></span> に最後に変更されました。",
|
||||
"upload_modified_file": "変更したファイルをアップロード"
|
||||
},
|
||||
"image": {
|
||||
"copied-to-clipboard": "画像への参照がクリップボードにコピーされました。これは任意のテキストノートに貼り付けることができます。",
|
||||
@@ -1689,7 +1888,8 @@
|
||||
},
|
||||
"entrypoints": {
|
||||
"note-revision-created": "ノートの改訂版が作成されました。",
|
||||
"sql-error": "SQL クエリの実行中にエラーが発生しました: {{message}}"
|
||||
"sql-error": "SQL クエリの実行中にエラーが発生しました: {{message}}",
|
||||
"note-executed": "ノートが実行されました。"
|
||||
},
|
||||
"branches": {
|
||||
"cannot-move-notes-here": "ここにノートを移動することはできません。",
|
||||
@@ -1706,7 +1906,9 @@
|
||||
"ws": {
|
||||
"sync-check-failed": "同期チェックに失敗しました!",
|
||||
"consistency-checks-failed": "整合性チェックに失敗しました! 詳細はログを参照してください。",
|
||||
"encountered-error": "エラー「{{message}}」が発生しました。コンソールを確認してください。"
|
||||
"encountered-error": "エラー「{{message}}」が発生しました。コンソールを確認してください。",
|
||||
"lost-websocket-connection-title": "サーバーへの接続が失われました",
|
||||
"lost-websocket-connection-message": "リバースプロキシ(例: nginx や Apache など)の設定を確認し、WebSocket 接続が適切に許可され、ブロックされていないことを確認してください。"
|
||||
},
|
||||
"hoisted_note": {
|
||||
"confirm_unhoisting": "要求されたノート「{{requestedNote}}」は、ホイストされたノート「{{hoistedNote}}」サブツリーの外部にあるため、ノートにアクセスするにはホイストを解除する必要があります。ホイスト解除を続行しますか?"
|
||||
@@ -1752,7 +1954,10 @@
|
||||
"display-week-numbers": "週番号を表示",
|
||||
"map-style": "マップスタイル:",
|
||||
"max-nesting-depth": "最大階層の深さ:",
|
||||
"show-scale": "スケールを表示"
|
||||
"show-scale": "スケールを表示",
|
||||
"raster": "Raster",
|
||||
"vector_light": "Vector(ライト)",
|
||||
"vector_dark": "Vector (ダーク)"
|
||||
},
|
||||
"call_to_action": {
|
||||
"next_theme_title": "新しいTriliumテーマをお試しください",
|
||||
@@ -1779,5 +1984,89 @@
|
||||
},
|
||||
"collections": {
|
||||
"rendering_error": "エラーのためコンテンツを表示できません。"
|
||||
},
|
||||
"abstract_bulk_action": {
|
||||
"remove_this_search_action": "この検索アクションを削除"
|
||||
},
|
||||
"update_available": {
|
||||
"update_available": "アップデートが利用可能"
|
||||
},
|
||||
"copy_image_reference_button": {
|
||||
"button_title": "画像参照をクリップボードにコピーし、テキストノートに貼り付けることができます。"
|
||||
},
|
||||
"attachment_detail": {
|
||||
"open_help_page": "添付ファイルのヘルプページを開く",
|
||||
"owning_note": "所有ノート: ",
|
||||
"you_can_also_open": "、開くこともできます ",
|
||||
"list_of_all_attachments": "すべての添付ファイルのリスト",
|
||||
"attachment_deleted": "この添付ファイルは削除されました。"
|
||||
},
|
||||
"attachment_list": {
|
||||
"open_help_page": "添付ファイルのヘルプページを開く",
|
||||
"owning_note": "所有ノート: ",
|
||||
"upload_attachments": "添付ファイルをアップロード",
|
||||
"no_attachments": "このノートには添付ファイルはありません。"
|
||||
},
|
||||
"book": {
|
||||
"no_children_help": "このコレクションには子ノートがないため、表示するものがありません。詳細は<a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a>をご覧ください。",
|
||||
"drag_locked_title": "編集をロック中",
|
||||
"drag_locked_message": "コレクションは編集がロックされているため、ドラッグは許可されていません。"
|
||||
},
|
||||
"native_title_bar": {
|
||||
"title": "ネイティブタイトルバー(アプリの再起動が必要です)",
|
||||
"enabled": "有効",
|
||||
"disabled": "無効"
|
||||
},
|
||||
"options_widget": {
|
||||
"options_change_saved": "オプションの変更が保存されました。",
|
||||
"options_status": "オプションステータス"
|
||||
},
|
||||
"multi_factor_authentication": {
|
||||
"title": "多要素認証",
|
||||
"description": "多要素認証(MFA)は、アカウントのセキュリティをさらに強化します。ログイン時にパスワードを入力するだけでなく、MFAでは本人確認のために1つ以上の追加情報の入力を求められます。これにより、たとえ誰かがパスワードを入手したとしても、2つ目の情報がなければアカウントにアクセスできません。まるでドアに鍵を追加したようなもので、他人が侵入するのがはるかに困難になります。<br><br>MFAを有効にするには、以下の手順に従ってください。正しく設定しないと、ログインはパスワードのみで行われます。",
|
||||
"mfa_enabled": "多要素認証を有効にする",
|
||||
"mfa_method": "MFAメソッド",
|
||||
"electron_disabled": "現在、デスクトップ ビルドでは多要素認証はサポートされていません。",
|
||||
"totp_title": "時間ベースのワンタイムパスワード (TOTP)",
|
||||
"totp_description": "TOTP(時間ベースのワンタイムパスワード)は、30秒ごとに変化する一意の一時的なコードを生成するセキュリティ機能です。このコードとパスワードを使用してアカウントにログインすることで、他人がアクセスするのを大幅に困難にします。",
|
||||
"totp_secret_title": "TOTPシークレットを生成する",
|
||||
"totp_secret_generate": "TOTPシークレットを生成する",
|
||||
"totp_secret_regenerate": "TOTPシークレットを再生成する",
|
||||
"no_totp_secret_warning": "TOTP を有効にするには、まず TOTP シークレットを生成する必要があります。",
|
||||
"totp_secret_description_warning": "新しい TOTP シークレットを生成したら、新しい TOTP シークレットを使用して再度ログインする必要があります。",
|
||||
"totp_secret_generated": "TOTPシークレットが生成されました",
|
||||
"totp_secret_warning": "生成されたシークレットは安全な場所に保存してください。再度表示されることはありません。",
|
||||
"totp_secret_regenerate_confirm": "OTP シークレットを再生成してもよろしいですか?これにより、以前の TOTP シークレットと既存のすべての回復コードが無効になります。",
|
||||
"recovery_keys_title": "シングルサインオン回復キー",
|
||||
"recovery_keys_description": "シングル サインオン回復キーは、認証コードにアクセスできない場合でもログインするために使用されます。",
|
||||
"recovery_keys_description_warning": "回復キーはページを離れた後は再度表示されませんので、安全な場所に保管してください。<br>回復キーは一度使用すると再度使用できなくなります。",
|
||||
"recovery_keys_error": "回復コードの生成中にエラーが発生しました",
|
||||
"recovery_keys_no_key_set": "回復コードが設定されていません",
|
||||
"recovery_keys_generate": "回復コードを生成する",
|
||||
"recovery_keys_regenerate": "回復コードの再生成",
|
||||
"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_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": "ユーザーアカウント: ",
|
||||
"oauth_user_email": "ユーザーEメール: ",
|
||||
"oauth_user_not_logged_in": "ログインしていません!"
|
||||
},
|
||||
"note-map": {
|
||||
"button-link-map": "リンクマップ",
|
||||
"button-tree-map": "ツリーマップ"
|
||||
},
|
||||
"spacer": {
|
||||
"configure_launchbar": "ランチャーバーを設定"
|
||||
},
|
||||
"attachment_detail_2": {
|
||||
"will_be_deleted_in": "この添付ファイルは {{time}} 後に自動的に削除されます",
|
||||
"will_be_deleted_soon": "この添付ファイルはすぐに自動的に削除されます",
|
||||
"deletion_reason": "、添付ファイルがノートのコンテンツにリンクされていないためです。削除されないようにするには、添付ファイルのリンクをコンテンツに再度追加するか、添付ファイルをノートに変換してください。",
|
||||
"role_and_size": "ロール: {{role}},サイズ: {{size}}",
|
||||
"link_copied": "添付ファイルのリンクをクリップボードにコピーしました。",
|
||||
"unrecognized_role": "添付ファイルのロール「{{role}}」は認識されません。"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,9 +29,25 @@
|
||||
"note": "노트",
|
||||
"search_note": "이름으로 노트 검색하기",
|
||||
"help_on_links": "링크 관련 도움말",
|
||||
"link_title_mirrors": "링크 제목은 노트의 현재 제목을 반영합니다"
|
||||
"link_title_mirrors": "링크 제목은 노트의 현재 제목을 반영합니다",
|
||||
"link_title_arbitrary": "링크 제목은 임의로 변경될 수 있습니다",
|
||||
"link_title": "링크 제목",
|
||||
"button_add_link": "링크 추가"
|
||||
},
|
||||
"branch_prefix": {
|
||||
"save": "저장"
|
||||
"save": "저장",
|
||||
"edit_branch_prefix": "브랜치 접두사 편집",
|
||||
"help_on_tree_prefix": "트리 접두사에 대한 도움말",
|
||||
"prefix": "접두사: ",
|
||||
"branch_prefix_saved": "브랜치 접두사가 저장되었습니다."
|
||||
},
|
||||
"bulk_actions": {
|
||||
"bulk_actions": "대량 작업",
|
||||
"affected_notes": "영향을 받은 노트들",
|
||||
"include_descendants": "선택한 노트의 자손 포함",
|
||||
"available_actions": "가능한 액션들",
|
||||
"chosen_actions": "선택한 액션들",
|
||||
"execute_bulk_actions": "대량 액션들 실행",
|
||||
"bulk_actions_executed": "대량 액션들이 성공적으로 실행되었습니다."
|
||||
}
|
||||
}
|
||||
|
||||
1
apps/client/src/translations/md/translation.json
Normal file
1
apps/client/src/translations/md/translation.json
Normal file
@@ -0,0 +1 @@
|
||||
{}
|
||||
1
apps/client/src/translations/nb-NO/translation.json
Normal file
1
apps/client/src/translations/nb-NO/translation.json
Normal file
@@ -0,0 +1 @@
|
||||
{}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -840,7 +840,7 @@
|
||||
"cannot_find_day_note": "Nota do dia não encontrada",
|
||||
"cannot_find_week_note": "Nota semanal não encontrada",
|
||||
"january": "Janeiro",
|
||||
"febuary": "Fevereiro",
|
||||
"february": "Fevereiro",
|
||||
"march": "Março",
|
||||
"april": "Abril",
|
||||
"may": "Maio",
|
||||
@@ -1219,7 +1219,7 @@
|
||||
"unprotecting-in-progress-count": "Remoções de proteção em andamento: {{count}}",
|
||||
"protecting-title": "Estado da proteção",
|
||||
"unprotecting-title": "Estado da remoção de proteção",
|
||||
"start_session_button": "Iniciar sessão protegida <kbd>enter</kbd>"
|
||||
"start_session_button": "Iniciar sessão protegida"
|
||||
},
|
||||
"relation_map": {
|
||||
"open_in_new_tab": "Abrir em nova aba",
|
||||
@@ -2008,7 +2008,7 @@
|
||||
"oauth_title": "OAuth/OpenID",
|
||||
"oauth_description": "OpenID é uma forma padronizada de permitir que você faça login em sites usando uma conta de outro serviço, como o Google, para verificar sua identidade. O emissor padrão é o Google, mas você pode alterá-lo para qualquer outro provedor OpenID. Consulte <a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">aqui</a> para mais informações. Siga estas <a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">instruções</a> para configurar um serviço OpenID através do Google.",
|
||||
"oauth_description_warning": "Para habilitar o OAuth/OpenID, você precisa definir a URL base do OAuth/OpenID, o client ID e o client secret no arquivo 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_missing_vars": "Configurações ausentes: {{variables}}",
|
||||
"oauth_missing_vars": "Configurações ausentes: {{-variables}}",
|
||||
"oauth_user_account": "Conta do Usuário: ",
|
||||
"oauth_user_email": "E-mail do Usuário: ",
|
||||
"oauth_user_not_logged_in": "Não está logado!"
|
||||
|
||||
@@ -322,7 +322,7 @@
|
||||
"august": "August",
|
||||
"cannot_find_day_note": "Nu se poate găsi notița acelei zile",
|
||||
"december": "Decembrie",
|
||||
"febuary": "Februarie",
|
||||
"february": "Februarie",
|
||||
"fri": "Vin",
|
||||
"january": "Ianuarie",
|
||||
"july": "Iulie",
|
||||
@@ -979,7 +979,7 @@
|
||||
},
|
||||
"protected_session": {
|
||||
"enter_password_instruction": "Afișarea notițelor protejate necesită introducerea parolei:",
|
||||
"start_session_button": "Deschide sesiunea protejată <kbd>enter</kbd>",
|
||||
"start_session_button": "Deschide sesiunea protejată",
|
||||
"started": "Sesiunea protejată este activă.",
|
||||
"wrong_password": "Parolă greșită.",
|
||||
"protecting-finished-successfully": "Protejarea a avut succes.",
|
||||
@@ -1587,7 +1587,9 @@
|
||||
"ws": {
|
||||
"consistency-checks-failed": "Au fost identificate erori de consistență! Vedeți mai multe detalii în loguri.",
|
||||
"encountered-error": "A fost întâmpinată o eroare: „{{message}}”. Vedeți în loguri pentru mai multe detalii.",
|
||||
"sync-check-failed": "Verificările de sincronizare au eșuat!"
|
||||
"sync-check-failed": "Verificările de sincronizare au eșuat!",
|
||||
"lost-websocket-connection-title": "S-a pierdut conexiunea la server",
|
||||
"lost-websocket-connection-message": "Verificați configurația reverse proxy-ului (e.g. nginx sau Apache) astfel încât să permită comunicarea prin WebSocket."
|
||||
},
|
||||
"hoisted_note": {
|
||||
"confirm_unhoisting": "Notița dorită „{{requestedNote}}” este în afara ierarhiei notiței focalizate „{{hoistedNote}}”. Doriți defocalizarea pentru a accesa notița?"
|
||||
@@ -1668,7 +1670,7 @@
|
||||
},
|
||||
"electron_integration": {
|
||||
"background-effects": "Activează efectele de fundal (doar pentru Windows 11)",
|
||||
"background-effects-description": "Efectul Mica adaugă un fundal estompat și elegant ferestrelor aplicațiilor, creând profunzime și un aspect modern.",
|
||||
"background-effects-description": "Efectul Mica adaugă un fundal estompat și elegant ferestrelor aplicațiilor, creând profunzime și un aspect modern. Opțiunea „Bară de titlu nativă” trebuie să fie dezactivată.",
|
||||
"desktop-application": "Aplicația desktop",
|
||||
"native-title-bar": "Bară de titlu nativă",
|
||||
"native-title-bar-description": "Pentru Windows și macOS, dezactivarea bării de titlu native face aplicația să pară mai compactă. Pe Linux, păstrarea bării integrează mai bine aplicația cu restul sistemului de operare.",
|
||||
@@ -1931,7 +1933,7 @@
|
||||
"oauth_title": "OAuth/OpenID",
|
||||
"oauth_description": "OpenID este o cale standardizată ce permite autentificarea într-un site folosind un cont dintr-un alt serviciu, precum Google, pentru a verifica identitatea. În mod implicit furnizorul este Google, dar se poate schimba cu orice furnizor OpenID. Pentru mai multe informații, consultați <a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">ghidul</a>. Urmați <a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">aceste instrucțiuni</a> pentru a putea configura OpenID prin Google.",
|
||||
"oauth_description_warning": "Pentru a activa OAuth sau OpenID, trebuie să configurați URL-ul de bază, ID-ul de client și secretul de client în fișierul config.ini și să reporniți aplicația. Dacă doriți să utilizați variabile de environment, puteți seta TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID și TRILIUM_OAUTH_CLIENT_SECRET.",
|
||||
"oauth_missing_vars": "Setări lipsă: {{variables}}",
|
||||
"oauth_missing_vars": "Setări lipsă: {{-variables}}",
|
||||
"oauth_user_account": "Cont: ",
|
||||
"oauth_user_email": "Email: ",
|
||||
"oauth_user_not_logged_in": "Neautentificat!"
|
||||
@@ -1956,7 +1958,11 @@
|
||||
"editorfeatures": {
|
||||
"title": "Funcții",
|
||||
"emoji_completion_enabled": "Activează auto-completarea pentru emoji-uri",
|
||||
"note_completion_enabled": "Activează auto-completarea pentru notițe"
|
||||
"note_completion_enabled": "Activează auto-completarea pentru notițe",
|
||||
"emoji_completion_description": "Dacă această funcție este pornită, emoji-urile pot fi inserate rapid prin tastarea caracterului „:”, urmat de denumirea emoji-ului.",
|
||||
"note_completion_description": "Dacă această funcție este pornită, se pot crea ușor legături către notițe prin tastarea „@”, urmată de titlul notiței dorite.",
|
||||
"slash_commands_enabled": "Activează comenzi rapide prin tasta slash",
|
||||
"slash_commands_description": "Dacă această funcție este pornită, se poate folosi tasta „/” pentru a rula rapid comenzi de editare precum inserarea de întreruperi de pagină sau titluri."
|
||||
},
|
||||
"table_view": {
|
||||
"new-row": "Rând nou",
|
||||
|
||||
@@ -282,13 +282,13 @@
|
||||
"editBranchPrefix": "изменить <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/tree-concepts.html#prefix\">префикс</a> клона активной заметки",
|
||||
"multiSelectNote": "множественный выбор заметки выше/ниже",
|
||||
"selectNote": "выбрать заметку",
|
||||
"copyNotes": "скопировать активную заметку (или выделение) в буфер обмер (используется для <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">клонирования</a>)",
|
||||
"copyNotes": "скопировать активную заметку (или выделение) в буфер обмена (используется для <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">клонирования</a>)",
|
||||
"createEditLink": "создать/редактировать внешнюю ссылку",
|
||||
"headings": "<code>##</code>, <code>###</code>, <code>####</code> и т. д., за которыми следует пробел для заголовков",
|
||||
"bulletList": "<code>*</code> или <code>-</code> с последующим пробелом для маркированного списка",
|
||||
"numberedList": "<code>1.</code> или <code>1)</code> с последующим пробелом для нумерованного списка",
|
||||
"blockQuote": "начните строку с <code>></code>, а затем пробела для блока цитаты",
|
||||
"quickSearch": "сфокусироваться на полее ввода быстрого поиска",
|
||||
"quickSearch": "сфокусироваться на поле ввода быстрого поиска",
|
||||
"editNoteTitle": "в области дерева переключится с области дерева на заголовок заметки. Сочетание клавиш Enter из области заголовка заметки переключит фокус на текстовый редактор. <kbd>Ctrl+.</kbd> переключит обратно с редактора на область дерева.",
|
||||
"title": "Справка"
|
||||
},
|
||||
@@ -370,7 +370,7 @@
|
||||
"confirm_delete": "Вы хотите удалить эту версию?",
|
||||
"revisions_deleted": "Версии заметки были удалены.",
|
||||
"revision_restored": "Версия заметки была восстановлена.",
|
||||
"revision_deleted": "Версия заметки были удалены.",
|
||||
"revision_deleted": "Версия заметки была удалена.",
|
||||
"download_button": "Скачать",
|
||||
"file_size": "Размер файла:",
|
||||
"preview": "Предпросмотр:",
|
||||
@@ -463,7 +463,7 @@
|
||||
"run_at_hour": "В какой час это должно выполняться? Следует использовать вместе с <code>#run=hourly</code>. Можно задать несколько раз для большего количества запусков в течение дня.",
|
||||
"disable_inclusion": "скрипты с этой меткой не будут включены в выполнение родительского скрипта.",
|
||||
"sorted": "сохраняет алфавитную сортировку дочерних заметок",
|
||||
"sort_direction": "ASC (по возрастани, по умолчанию) или DESC (по убыванию)",
|
||||
"sort_direction": "ASC (по возрастанию, по умолчанию) или DESC (по убыванию)",
|
||||
"sort_folders_first": "Папки (заметки, включая дочерние) должны быть отсортированы вверх",
|
||||
"top": "закрепить заданную заметку наверху в ее родителе (применяется только к отсортированным родительским заметкам)",
|
||||
"hide_promoted_attributes": "Скрыть продвигаемых атрибуты в этой заметке",
|
||||
@@ -479,7 +479,7 @@
|
||||
"workspace_search_home": "новые заметки поиска будут созданы как дочерние записи этой заметки при перемещении их к какому-либо предку этой заметки рабочей области",
|
||||
"workspace_calendar_root": "Определяет корень календаря для каждого рабочего пространства",
|
||||
"hide_highlight_widget": "Скрыть виджет «Выделенное»",
|
||||
"is_owned_by_note": "принадлежит записке",
|
||||
"is_owned_by_note": "принадлежит заметке",
|
||||
"and_more": "... и ещё {{count}}.",
|
||||
"app_theme": "отмечает заметки CSS, которые являются полноценными темами Trilium и, таким образом, доступны в опциях Trilium.",
|
||||
"title_template": "Заголовок по умолчанию для заметок, создаваемых как дочерние элементы данной заметки. Значение вычисляется как строка JavaScript\n и, таким образом, может быть дополнено динамическим контентом с помощью внедренных переменных <code>now</code> и <code>parentNote</code>. Примеры:\n \n <ul>\n <li><code>Литературные произведения ${parentNote.getLabelValue('authorName')}</code></li>\n <li><code>Лог для ${now.format('YYYY-MM-DD HH:mm:ss')}</code></li>\n </ul>\n \n Подробности см. в <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">вики</a>, документации API для <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> и <a href=\"https://day.js.org/docs/en/display/format\">now</a>.",
|
||||
@@ -528,7 +528,7 @@
|
||||
"run_on_note_deletion": "выполняется при удалении заметки",
|
||||
"run_on_branch_creation": "выполняется при создании ветви. Ветвь — это связующее звено между родительской и дочерней заметками и создаётся, например, при клонировании или перемещении заметки.",
|
||||
"run_on_branch_change": "выполняется при обновлении ветки.",
|
||||
"run_on_attribute_creation": "выполняется, когда создается новый атрибут для заметка, определяющей это отношение",
|
||||
"run_on_attribute_creation": "выполняется, когда создается новый атрибут для заметки, определяющей это отношение",
|
||||
"run_on_attribute_change": " выполняется при изменении атрибута заметки, определяющей это отношение. Также срабатывает при удалении атрибута",
|
||||
"relation_template": "атрибуты заметки будут унаследованы даже без родительско-дочерних отношений. Содержимое заметки и её поддерево будут добавлены к экземпляру заметки, если оно пустое. Подробности см. в документации.",
|
||||
"inherit": "атрибуты заметки будут унаследованы даже без родительско-дочерних отношений. См. описание шаблонных отношений для получения аналогичной информации. См. раздел «Наследование атрибутов» в документации.",
|
||||
@@ -585,7 +585,11 @@
|
||||
"editorfeatures": {
|
||||
"note_completion_enabled": "Включить автодополнение",
|
||||
"emoji_completion_enabled": "Включить автодополнение эмодзи",
|
||||
"title": "Особенности"
|
||||
"title": "Особенности",
|
||||
"slash_commands_description": "Если эта опция включена, команды редактирования, такие как вставка переносов строк или заголовков, можно переключать, вводя `/`.",
|
||||
"slash_commands_enabled": "Включить слэш-команды",
|
||||
"note_completion_description": "Если эта опция включена, ссылки на заметки можно создавать, вводя `@`, а затем название заметки.",
|
||||
"emoji_completion_description": "Если эта функция включена, эмодзи можно легко вставлять в текст, набрав `:`, а затем название эмодзи."
|
||||
},
|
||||
"cpu_arch_warning": {
|
||||
"dont_show_again": "Больше не показывать это предупреждение",
|
||||
@@ -712,7 +716,7 @@
|
||||
},
|
||||
"code_block": {
|
||||
"copy_title": "Копировать в буфер обмена",
|
||||
"theme_group_dark": "Темныце темы",
|
||||
"theme_group_dark": "Темные темы",
|
||||
"theme_group_light": "Светлые темы",
|
||||
"theme_none": "Нет подсветки синтаксиса",
|
||||
"word_wrapping": "Перенос слов"
|
||||
@@ -783,7 +787,7 @@
|
||||
"beta-feature": "Бета",
|
||||
"widget": "Виджет",
|
||||
"image": "Изображение",
|
||||
"file": "Файд",
|
||||
"file": "Файл",
|
||||
"canvas": "Холст",
|
||||
"mermaid-diagram": "Диаграмма Mermaid",
|
||||
"book": "Коллекция",
|
||||
@@ -811,7 +815,7 @@
|
||||
"export": "Экспорт",
|
||||
"open-in-a-new-tab": "Открыть в новой вкладке",
|
||||
"open-in-a-new-split": "Открыть в новой панели",
|
||||
"unhoist-note": "Отрепить заметку",
|
||||
"unhoist-note": "Открепить заметку",
|
||||
"hoist-note": "Закрепить заметку",
|
||||
"protect-subtree": "Защитить поддерево",
|
||||
"unprotect-subtree": "Снять защиту с поддерева",
|
||||
@@ -864,7 +868,7 @@
|
||||
"to": "в",
|
||||
"move_note": "Переместить заметку",
|
||||
"target_parent_note": "целевая версии заметки",
|
||||
"on_all_matched_notes": "На всех совпадающих нотах",
|
||||
"on_all_matched_notes": "На всех совпадающих заметках",
|
||||
"move_note_new_parent": "переместить заметку в новый родительский элемент, если у заметки есть только один родительский элемент (т. е. старая ветвь удаляется и создается новая ветвь в новом родительском элементе)",
|
||||
"clone_note_new_parent": "клонировать заметку в новый родительский элемент, если у заметки есть несколько клонов/ветвей (неясно, какую ветвь следует удалить)",
|
||||
"nothing_will_happen": "ничего не произойдет, если эту заметку невозможно переместить в целевую заметку (т.е. это создаст цикл дерева)"
|
||||
@@ -902,7 +906,7 @@
|
||||
"delete_attachment": "Удалить вложение",
|
||||
"upload_new_revision": "Загрузить новую версию",
|
||||
"open_custom": "Открыть как...",
|
||||
"open_custom_client_only": "Иной способ открытие вложений возможен только из десктопного приложения.",
|
||||
"open_custom_client_only": "Открытие вложений другим способом возможно только в десктопном приложении.",
|
||||
"open_externally_detail_page": "Открытие вложения извне доступно только из детальной страницы. Для этого сначала нажмите на сведения о вложении и повторите действие.",
|
||||
"open_custom_title": "Файл будет открыт во внешнем приложении и отслеживаться на наличие изменений. После этого вы сможете загрузить изменённую версию обратно в Trilium.",
|
||||
"open_externally_title": "Файл будет открыт во внешнем приложении и отслеживаться на наличие изменений. После этого вы сможете загрузить изменённую версию обратно в Trilium.",
|
||||
@@ -925,7 +929,7 @@
|
||||
"sat": "Сбт",
|
||||
"sun": "Вс",
|
||||
"january": "Январь",
|
||||
"febuary": "Февраль",
|
||||
"february": "Февраль",
|
||||
"march": "Март",
|
||||
"april": "Апрель",
|
||||
"may": "Май",
|
||||
@@ -1020,8 +1024,8 @@
|
||||
"file_properties": {
|
||||
"download": "Скачать",
|
||||
"open": "Открыть",
|
||||
"title": "Файд",
|
||||
"upload_success": "Загрузка новой версии файла не удалась.",
|
||||
"title": "Файл",
|
||||
"upload_success": "Новая версия файла успешно загружена.",
|
||||
"upload_new_revision": "Загрузить новую версию",
|
||||
"file_size": "Размер файла",
|
||||
"file_type": "Тип файла",
|
||||
@@ -1153,7 +1157,7 @@
|
||||
"label_abc": "возвращает заметки с меткой abc",
|
||||
"label_year": "ищет заметки с меткой year, имеющей значение 2019",
|
||||
"label_rock_pop": "соответствует заметкам с метками как rock, так и pop",
|
||||
"label_rock_or_pop": "должна присутствовать только одна из vtnjr",
|
||||
"label_rock_or_pop": "должна присутствовать только одна из меток",
|
||||
"label_year_comparison": "числовое сравнение (также >, >=, <).",
|
||||
"label_date_created": "заметки, созданные за последний месяц",
|
||||
"error": "Ошибка поиска: {{error}}",
|
||||
@@ -1413,7 +1417,7 @@
|
||||
"first-week-contains-first-day": "Первая неделя содержит первый день года",
|
||||
"first-week-contains-first-thursday": "Первая неделя содержит первый четверг года",
|
||||
"first-week-has-minimum-days": "Первая неделя имеет минимальное количество дней",
|
||||
"min-days-in-first-week": "Минимальное количество дней в первую неделю",
|
||||
"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": "Формат даты и числа"
|
||||
@@ -1475,7 +1479,7 @@
|
||||
"totp_secret_generated": "Создан секрет TOTP",
|
||||
"recovery_keys_generate": "Генерация кодов восстановления",
|
||||
"recovery_keys_regenerate": "Регенерация кодов восстановления",
|
||||
"oauth_missing_vars": "Отсутствуют настройки: {{variables}}",
|
||||
"oauth_missing_vars": "Отсутствуют настройки: {{-variables}}",
|
||||
"oauth_user_not_logged_in": "Не выполнен вход!",
|
||||
"totp_title": "Одноразовый пароль с ограничением по времени (TOTP)",
|
||||
"recovery_keys_title": "Ключи восстановления единого входа",
|
||||
@@ -1687,7 +1691,7 @@
|
||||
"unprotecting-title": "Статус снятия защиты",
|
||||
"protecting-finished-successfully": "Защита успешно завершена.",
|
||||
"unprotecting-finished-successfully": "Снятие защиты успешно завершено.",
|
||||
"start_session_button": "Начать защищенный сеанс <kbd>enter</kbd>",
|
||||
"start_session_button": "Начать защищенный сеанс",
|
||||
"protecting-in-progress": "Защита в процессе: {{count}}",
|
||||
"unprotecting-in-progress-count": "Снятие защиты в процессе: {{count}}",
|
||||
"started": "Защищенный сеанс запущен.",
|
||||
@@ -1719,7 +1723,7 @@
|
||||
"database_vacuumed": "База данных была сжата"
|
||||
},
|
||||
"vim_key_bindings": {
|
||||
"use_vim_keybindings_in_code_notes": "Раскладка клавиш VIM",
|
||||
"use_vim_keybindings_in_code_notes": "Сочетания клавиш Vim",
|
||||
"enable_vim_keybindings": "Включить сочетания клавиш Vim в заметках кода (без режима ex)"
|
||||
},
|
||||
"network_connections": {
|
||||
@@ -1802,7 +1806,7 @@
|
||||
"button_title": "Экспортировать диаграмму как SVG"
|
||||
},
|
||||
"copy_image_reference_button": {
|
||||
"button_title": "Скопировать ссылку на изображение в буфер обмена, можент быть вставлена в текстовую заметку."
|
||||
"button_title": "Скопировать ссылку на изображение в буфер обмена, может быть вставлена в текстовую заметку."
|
||||
},
|
||||
"note_launcher": {
|
||||
"this_launcher_doesnt_define_target_note": "Этот лаунчер не определяет целевую заметку."
|
||||
@@ -1973,7 +1977,9 @@
|
||||
"ws": {
|
||||
"sync-check-failed": "Проверка синхронизации не удалась!",
|
||||
"encountered-error": "Обнаружена ошибка \"{{message}}\", проверьте консоль.",
|
||||
"consistency-checks-failed": "Проверка целостности не пройдена! Подробности смотрите в логах."
|
||||
"consistency-checks-failed": "Проверка целостности не пройдена! Подробности смотрите в логах.",
|
||||
"lost-websocket-connection-title": "Потеряно соединение с сервером",
|
||||
"lost-websocket-connection-message": "Проверьте конфигурацию обратного прокси (например, nginx или Apache), чтобы убедиться, что соединения WebSocket должным образом разрешены и не заблокированы."
|
||||
},
|
||||
"attachment_detail_2": {
|
||||
"role_and_size": "Роль: {{role}}, Размер: {{size}}",
|
||||
@@ -2045,7 +2051,7 @@
|
||||
"could_not_find_typewidget": "Не удалось найти typeWidget для типа '{{type}}'"
|
||||
},
|
||||
"book": {
|
||||
"no_children_help": "В этой коллекции нет дочерних заметок, поэтому отображать нечего. Подробности см. на <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a>.",
|
||||
"no_children_help": "В этой коллекции нет дочерних заметок, поэтому отображать нечего. Подробности см. в <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a>.",
|
||||
"drag_locked_title": "Защищено от изменения",
|
||||
"drag_locked_message": "Перетаскивание не допускается, так как коллекция защищена от редактирования."
|
||||
},
|
||||
|
||||
@@ -581,7 +581,7 @@
|
||||
"sun": "日",
|
||||
"cannot_find_day_note": "無法找到日記",
|
||||
"january": "一月",
|
||||
"febuary": "二月",
|
||||
"february": "二月",
|
||||
"march": "三月",
|
||||
"april": "四月",
|
||||
"may": "五月",
|
||||
@@ -984,7 +984,7 @@
|
||||
},
|
||||
"protected_session": {
|
||||
"enter_password_instruction": "顯示受保護的筆記需要輸入您的密碼:",
|
||||
"start_session_button": "開始受保護的作業階段 <kbd>Enter</kbd>",
|
||||
"start_session_button": "開始受保護的作業階段",
|
||||
"started": "已啟動受保護的作業階段。",
|
||||
"wrong_password": "密碼錯誤。",
|
||||
"protecting-finished-successfully": "已成功完成保護操作。",
|
||||
@@ -1582,7 +1582,9 @@
|
||||
"ws": {
|
||||
"sync-check-failed": "同步檢查失敗!",
|
||||
"consistency-checks-failed": "一致性檢查失敗!請查看日誌以了解詳細資訊。",
|
||||
"encountered-error": "遇到錯誤 \"{{message}}\",請查看控制台。"
|
||||
"encountered-error": "遇到錯誤 \"{{message}}\",請查看控制台。",
|
||||
"lost-websocket-connection-title": "與伺服器的連線中斷",
|
||||
"lost-websocket-connection-message": "檢查您的反向代理(如 nginx 或 Apache)設定以確保 Websocket 連線沒有被阻擋。"
|
||||
},
|
||||
"hoisted_note": {
|
||||
"confirm_unhoisting": "請求的筆記 '{{requestedNote}}' 位於聚焦的筆記 '{{hoistedNote}}' 的子階層之外,您必須取消聚焦才能訪問該筆記。是否繼續取消聚焦?"
|
||||
@@ -1843,7 +1845,7 @@
|
||||
"oauth_title": "OAuth / OpenID 驗證",
|
||||
"oauth_description": "OpenID 是一種標準化的方式,可讓您使用其他服務(如 Google)的帳號登入網站,以驗證您的身份。預設的提供者是 Google,但您可以將其變更為任何其他 OpenID 提供者。查看<a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">此處</a>以瞭解更多資訊。依照這些 <a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">指示</a>以透過 Google 設定 OpenID 服務。",
|
||||
"oauth_description_warning": "要啟用 OAuth / OpenID,您需要設定 config.ini 文件中的 OAuth / OpenID 基礎 URL、客戶端 ID 和客戶端金鑰,並重新啟動應用程式。如果要從環境變數設置,請設定 TRILIUM_OAUTH_BASE_URL、TRILIUM_OAUTH_CLIENT_ID 和 TRILIUM_OAUTH_CLIENT_SECRET 環境變數。",
|
||||
"oauth_missing_vars": "缺少以下設定:{{variables}}",
|
||||
"oauth_missing_vars": "缺少以下設定:{{-variables}}",
|
||||
"oauth_user_account": "用戶帳號: ",
|
||||
"oauth_user_email": "用戶信箱: ",
|
||||
"oauth_user_not_logged_in": "尚未登入!"
|
||||
@@ -1952,7 +1954,11 @@
|
||||
"editorfeatures": {
|
||||
"title": "功能",
|
||||
"emoji_completion_enabled": "啟用 Emoji 自動完成",
|
||||
"note_completion_enabled": "啟用筆記自動完成"
|
||||
"note_completion_enabled": "啟用筆記自動完成",
|
||||
"emoji_completion_description": "如果啟用,emoji 可以輕易地經由輸入 `:` 加上 emoji 名稱來插入。",
|
||||
"note_completion_description": "如果啟用,導向筆記的連結可以經由輸入 `@` 加上筆記標題來建立。",
|
||||
"slash_commands_enabled": "啟用斜線命令",
|
||||
"slash_commands_description": "如果啟用,可以經由輸入 `/` 來觸發命令,如插入換行符或標題。"
|
||||
},
|
||||
"table_view": {
|
||||
"new-row": "新增列",
|
||||
|
||||
@@ -560,7 +560,7 @@
|
||||
"oauth_title": "OAuth/OpenID",
|
||||
"oauth_description": "OpenID – це стандартизований спосіб входу на веб-сайти за допомогою облікового запису з іншого сервісу, такого як Google, для підтвердження вашої особи. Емітентом за замовчуванням є Google, але ви можете змінити його на будь-якого іншого постачальника OpenID. Перегляньте <a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">тут</a> для отримання додаткової інформації. Дотримуйтесь цих <a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">інструкцій</a>, щоб налаштувати сервіс OpenID через Google.",
|
||||
"oauth_description_warning": "Щоб увімкнути OAuth/OpenID, потрібно встановити базову URL-адресу OAuth/OpenID, ідентифікатор клієнта та секрет клієнта у файлі config.ini та перезапустити програму. Якщо ви хочете встановити зі змінних середовища, встановіть TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID та TRILIUM_OAUTH_CLIENT_SECRET.",
|
||||
"oauth_missing_vars": "Відсутні налаштування: {{variables}}",
|
||||
"oauth_missing_vars": "Відсутні налаштування: {{-variables}}",
|
||||
"oauth_user_account": "Обліковий запис користувача: ",
|
||||
"oauth_user_email": "Електронна пошта користувача: ",
|
||||
"oauth_user_not_logged_in": "Ви не ввійшли в систему!"
|
||||
@@ -722,7 +722,7 @@
|
||||
"cannot_find_day_note": "Не вдається знайти денну нотатку",
|
||||
"cannot_find_week_note": "Не вдається знайти тижневу нотатку",
|
||||
"january": "Січень",
|
||||
"febuary": "Лютий",
|
||||
"february": "Лютий",
|
||||
"march": "Березень",
|
||||
"april": "Квітень",
|
||||
"may": "Травень",
|
||||
@@ -1090,7 +1090,7 @@
|
||||
},
|
||||
"protected_session": {
|
||||
"enter_password_instruction": "Для відображення захищеної нотатки потрібно ввести пароль:",
|
||||
"start_session_button": "Розпочати захищений сеанс <kbd>enter</kbd>",
|
||||
"start_session_button": "Розпочати захищений сеанс",
|
||||
"started": "Захищений сеанс розпочато.",
|
||||
"wrong_password": "Неправильний пароль.",
|
||||
"protecting-finished-successfully": "Захист успішно завершено.",
|
||||
@@ -1669,7 +1669,9 @@
|
||||
"ws": {
|
||||
"sync-check-failed": "Перевірка синхронізації не вдалася!",
|
||||
"consistency-checks-failed": "Перевірка узгодженості не вдалася! Див. logs для отримання інформації.",
|
||||
"encountered-error": "Виникла помилка \"{{message}}\", перевірте консоль."
|
||||
"encountered-error": "Виникла помилка \"{{message}}\", перевірте консоль.",
|
||||
"lost-websocket-connection-title": "Втрачено з'єднання із сервером",
|
||||
"lost-websocket-connection-message": "Перевірте конфігурацію вашого зворотного проксі-сервера (наприклад, nginx або Apache), щоб переконатися, що з’єднання WebSocket належним чином дозволені та не блокуються."
|
||||
},
|
||||
"hoisted_note": {
|
||||
"confirm_unhoisting": "Запитана нотатка '{{requestedNote}}' знаходиться поза піддеревом закріплених нотаток '{{hoistedNote}}', і вам потрібно відкріпити нотатку, щоб отримати до неї доступ. Ви хочете продовжити відкріплення?"
|
||||
@@ -1797,7 +1799,11 @@
|
||||
"editorfeatures": {
|
||||
"title": "Особливості",
|
||||
"emoji_completion_enabled": "Увімкнути автозаповнення емодзі",
|
||||
"note_completion_enabled": "Увімкнути автозаповнення нотаток"
|
||||
"note_completion_enabled": "Увімкнути автозаповнення нотаток",
|
||||
"emoji_completion_description": "Якщо цю функцію ввімкнено, емодзі можна легко вставляти в текст, ввівши `:`, а потім назву емодзі.",
|
||||
"note_completion_description": "Якщо ввімкнено, посилання на нотатки можна створювати, вводячи `@`, а потім назву нотатки.",
|
||||
"slash_commands_enabled": "Увімкнути команди зі слеш",
|
||||
"slash_commands_description": "Якщо ввімкнено, команди редагування, такі як вставка розривів рядків або заголовків, можна перемикати, натискаючи `/`."
|
||||
},
|
||||
"table_view": {
|
||||
"new-row": "Новий рядок",
|
||||
|
||||
11
apps/client/src/types-lib.d.ts
vendored
11
apps/client/src/types-lib.d.ts
vendored
@@ -60,3 +60,14 @@ declare global {
|
||||
windowControlsOverlay?: unknown;
|
||||
}
|
||||
}
|
||||
|
||||
declare module "preact" {
|
||||
namespace JSX {
|
||||
interface IntrinsicElements {
|
||||
webview: {
|
||||
src: string;
|
||||
class: string;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
9
apps/client/src/types.d.ts
vendored
9
apps/client/src/types.d.ts
vendored
@@ -46,6 +46,7 @@ interface CustomGlobals {
|
||||
platform?: typeof process.platform;
|
||||
linter: typeof lint;
|
||||
hasNativeTitleBar: boolean;
|
||||
isRtl: boolean;
|
||||
}
|
||||
|
||||
type RequireMethod = (moduleName: string) => any;
|
||||
@@ -115,11 +116,17 @@ declare global {
|
||||
filterKey: (e: { altKey: boolean }, dx: number, dy: number, dz: number) => void;
|
||||
});
|
||||
|
||||
interface PanZoomTransform {
|
||||
x: number;
|
||||
y: number;
|
||||
scale: number;
|
||||
}
|
||||
|
||||
interface PanZoom {
|
||||
zoomTo(x: number, y: number, scale: number);
|
||||
moveTo(x: number, y: number);
|
||||
on(event: string, callback: () => void);
|
||||
getTransform(): unknown;
|
||||
getTransform(): PanZoomTransform;
|
||||
dispose(): void;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import options from "../services/options";
|
||||
|
||||
type DateTimeStyle = "full" | "long" | "medium" | "short" | "none" | undefined;
|
||||
|
||||
/**
|
||||
@@ -8,7 +10,7 @@ export function formatDateTime(date: string | Date | number | null | undefined,
|
||||
return "";
|
||||
}
|
||||
|
||||
const locale = navigator.language;
|
||||
const locale = options.get("formattingLocale") || options.get("locale") || navigator.language;
|
||||
|
||||
let parsedDate;
|
||||
if (typeof date === "string" || typeof date === "number") {
|
||||
@@ -24,7 +26,7 @@ export function formatDateTime(date: string | Date | number | null | undefined,
|
||||
|
||||
if (timeStyle !== "none" && dateStyle !== "none") {
|
||||
// Format the date and time
|
||||
const formatter = new Intl.DateTimeFormat(navigator.language, { dateStyle, timeStyle });
|
||||
const formatter = new Intl.DateTimeFormat(locale, { dateStyle, timeStyle });
|
||||
return formatter.format(parsedDate);
|
||||
} else if (timeStyle === "none" && dateStyle !== "none") {
|
||||
// Format only the date
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
.show-floating-buttons {
|
||||
position: absolute;
|
||||
top: var(--floating-buttons-vert-offset, 10px);
|
||||
right: var(--floating-buttons-horiz-offset, 10px);
|
||||
inset-inline-end: var(--floating-buttons-horiz-offset, 10px);
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
z-index: 100;
|
||||
@@ -15,8 +15,7 @@
|
||||
|
||||
.note-split.rtl .floating-buttons-children,
|
||||
.note-split.rtl .show-floating-buttons {
|
||||
right: unset;
|
||||
left: 10px;
|
||||
inset-inline-end: 10px;
|
||||
}
|
||||
|
||||
.note-split.rtl .close-floating-buttons {
|
||||
@@ -74,7 +73,7 @@
|
||||
|
||||
.show-floating-buttons {
|
||||
/* display: none;*/
|
||||
margin-left: 5px !important;
|
||||
margin-inline-start: 5px !important;
|
||||
}
|
||||
|
||||
.show-floating-buttons-button {
|
||||
@@ -97,7 +96,7 @@
|
||||
|
||||
/* #region Close floating buttons */
|
||||
.close-floating-buttons {
|
||||
margin-left: 5px !important;
|
||||
margin-inline-start: 5px !important;
|
||||
}
|
||||
|
||||
.close-floating-buttons:first-child {
|
||||
@@ -140,7 +139,7 @@
|
||||
z-index: 10;
|
||||
position: absolute;
|
||||
top: 50px;
|
||||
right: 10px;
|
||||
inset-inline-end: 10px;
|
||||
width: 400px;
|
||||
border-radius: 10px;
|
||||
background-color: var(--accented-background-color);
|
||||
@@ -150,8 +149,8 @@
|
||||
}
|
||||
|
||||
.backlink-excerpt {
|
||||
border-left: 2px solid var(--main-border-color);
|
||||
padding-left: 10px;
|
||||
border-inline-start: 2px solid var(--main-border-color);
|
||||
padding-inline-start: 10px;
|
||||
opacity: 80%;
|
||||
font-size: 90%;
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ import { ViewTypeOptions } from "./collections/interface";
|
||||
|
||||
export interface FloatingButtonContext {
|
||||
parentComponent: Component;
|
||||
note: FNote;
|
||||
note: FNote;
|
||||
noteContext: NoteContext;
|
||||
isDefaultViewMode: boolean;
|
||||
isReadOnly: boolean;
|
||||
@@ -65,11 +65,11 @@ export const MOBILE_FLOATING_BUTTONS: FloatingButtonsList = [
|
||||
EditButton,
|
||||
RelationMapButtons,
|
||||
ExportImageButtons,
|
||||
Backlinks
|
||||
Backlinks
|
||||
]
|
||||
|
||||
function RefreshBackendLogButton({ note, parentComponent, noteContext, isDefaultViewMode }: FloatingButtonContext) {
|
||||
const isEnabled = note.noteId === "_backendLog" && isDefaultViewMode;
|
||||
const isEnabled = (note.noteId === "_backendLog" || note.type === "render") && isDefaultViewMode;
|
||||
return isEnabled && <FloatingButton
|
||||
text={t("backend_log.refresh")}
|
||||
icon="bx bx-refresh"
|
||||
@@ -84,14 +84,14 @@ function SwitchSplitOrientationButton({ note, isReadOnly, isDefaultViewMode }: F
|
||||
|
||||
return isEnabled && <FloatingButton
|
||||
text={upcomingOrientation === "vertical" ? t("switch_layout_button.title_vertical") : t("switch_layout_button.title_horizontal")}
|
||||
icon={upcomingOrientation === "vertical" ? "bx bxs-dock-bottom" : "bx bxs-dock-left"}
|
||||
icon={upcomingOrientation === "vertical" ? "bx bxs-dock-bottom" : "bx bxs-dock-left"}
|
||||
onClick={() => setSplitEditorOrientation(upcomingOrientation)}
|
||||
/>
|
||||
}
|
||||
|
||||
function ToggleReadOnlyButton({ note, viewType, isDefaultViewMode }: FloatingButtonContext) {
|
||||
const [ isReadOnly, setReadOnly ] = useNoteLabelBoolean(note, "readOnly");
|
||||
const isEnabled = (note.type === "mermaid" || viewType === "geoMap")
|
||||
const [ isReadOnly, setReadOnly ] = useNoteLabelBoolean(note, "readOnly");
|
||||
const isEnabled = ([ "mermaid", "mindMap", "canvas" ].includes(note.type) || viewType === "geoMap")
|
||||
&& note.isContentAvailable() && isDefaultViewMode;
|
||||
|
||||
return isEnabled && <FloatingButton
|
||||
@@ -218,8 +218,8 @@ function SaveToNoteButton({ note }: FloatingButtonContext) {
|
||||
/>
|
||||
}
|
||||
|
||||
function RelationMapButtons({ note, triggerEvent }: FloatingButtonContext) {
|
||||
const isEnabled = (note.type === "relationMap");
|
||||
function RelationMapButtons({ note, isDefaultViewMode, triggerEvent }: FloatingButtonContext) {
|
||||
const isEnabled = (note.type === "relationMap" && isDefaultViewMode);
|
||||
return isEnabled && (
|
||||
<>
|
||||
<FloatingButton
|
||||
@@ -264,7 +264,7 @@ function GeoMapButtons({ triggerEvent, viewType, isReadOnly }: FloatingButtonCon
|
||||
|
||||
function CopyImageReferenceButton({ note, isDefaultViewMode }: FloatingButtonContext) {
|
||||
const hiddenImageCopyRef = useRef<HTMLDivElement>(null);
|
||||
const isEnabled = ["mermaid", "canvas", "mindMap"].includes(note?.type ?? "")
|
||||
const isEnabled = ["mermaid", "canvas", "mindMap", "image"].includes(note?.type ?? "")
|
||||
&& note?.isContentAvailable() && isDefaultViewMode;
|
||||
|
||||
return isEnabled && (
|
||||
@@ -325,7 +325,7 @@ function Backlinks({ note, isDefaultViewMode }: FloatingButtonContext) {
|
||||
let [ backlinkCount, setBacklinkCount ] = useState(0);
|
||||
let [ popupOpen, setPopupOpen ] = useState(false);
|
||||
const backlinksContainerRef = useRef<HTMLDivElement>(null);
|
||||
|
||||
|
||||
useEffect(() => {
|
||||
if (!isDefaultViewMode) return;
|
||||
|
||||
@@ -338,7 +338,7 @@ function Backlinks({ note, isDefaultViewMode }: FloatingButtonContext) {
|
||||
const { windowHeight } = useWindowSize();
|
||||
useLayoutEffect(() => {
|
||||
const el = backlinksContainerRef.current;
|
||||
if (popupOpen && el) {
|
||||
if (popupOpen && el) {
|
||||
const box = el.getBoundingClientRect();
|
||||
const maxHeight = windowHeight - box.top - 10;
|
||||
el.style.maxHeight = `${maxHeight}px`;
|
||||
@@ -374,7 +374,7 @@ function BacklinksList({ noteId }: { noteId: string }) {
|
||||
.filter(bl => "noteId" in bl)
|
||||
.map((bl) => bl.noteId);
|
||||
await froca.getNotes(noteIds);
|
||||
setBacklinks(backlinks);
|
||||
setBacklinks(backlinks);
|
||||
});
|
||||
}, [ noteId ]);
|
||||
|
||||
@@ -395,4 +395,4 @@ function BacklinksList({ noteId }: { noteId: string }) {
|
||||
)}
|
||||
</div>
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
13
apps/client/src/widgets/NoteDetail.css
Normal file
13
apps/client/src/widgets/NoteDetail.css
Normal file
@@ -0,0 +1,13 @@
|
||||
.component.note-detail {
|
||||
font-family: var(--detail-font-family);
|
||||
font-size: var(--detail-font-size);
|
||||
contain: none;
|
||||
}
|
||||
|
||||
.note-detail.full-height {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.note-detail > * {
|
||||
contain: none;
|
||||
}
|
||||
276
apps/client/src/widgets/NoteDetail.tsx
Normal file
276
apps/client/src/widgets/NoteDetail.tsx
Normal file
@@ -0,0 +1,276 @@
|
||||
import { useNoteContext, useTriliumEvent, useTriliumEvents } from "./react/hooks"
|
||||
import FNote from "../entities/fnote";
|
||||
import protected_session_holder from "../services/protected_session_holder";
|
||||
import { useEffect, useRef, useState } from "preact/hooks";
|
||||
import NoteContext from "../components/note_context";
|
||||
import { isValidElement, VNode } from "preact";
|
||||
import { TypeWidgetProps } from "./type_widgets/type_widget";
|
||||
import "./NoteDetail.css";
|
||||
import attributes from "../services/attributes";
|
||||
import { ExtendedNoteType, TYPE_MAPPINGS, TypeWidget } from "./note_types";
|
||||
import { dynamicRequire, isMobile } from "../services/utils";
|
||||
|
||||
/**
|
||||
* The note detail is in charge of rendering the content of a note, by determining its type (e.g. text, code) and using the appropriate view widget.
|
||||
*
|
||||
* Apart from that, it:
|
||||
* - Applies a full-height style depending on the content type (e.g. canvas notes).
|
||||
* - Focuses the content when switching tabs.
|
||||
* - Caches the note type elements based on what the user has accessed, in order to quickly load it again.
|
||||
* - Fixes the tree for launch bar configurations on mobile.
|
||||
* - Provides scripting events such as obtaining the active note detail widget, or note type widget.
|
||||
* - Printing and exporting to PDF.
|
||||
*/
|
||||
export default function NoteDetail() {
|
||||
const containerRef = useRef<HTMLDivElement>(null);
|
||||
const { note, type, mime, noteContext, parentComponent } = useNoteInfo();
|
||||
const { ntxId, viewScope } = noteContext ?? {};
|
||||
const isFullHeight = checkFullHeight(noteContext, type);
|
||||
const noteTypesToRender = useRef<{ [ key in ExtendedNoteType ]?: (props: TypeWidgetProps) => VNode }>({});
|
||||
const [ activeNoteType, setActiveNoteType ] = useState<ExtendedNoteType>();
|
||||
|
||||
const props: TypeWidgetProps = {
|
||||
note: note!,
|
||||
viewScope,
|
||||
ntxId,
|
||||
parentComponent,
|
||||
noteContext
|
||||
};
|
||||
useEffect(() => {
|
||||
if (!type) return;
|
||||
|
||||
if (!noteTypesToRender.current[type]) {
|
||||
getCorrespondingWidget(type).then((el) => {
|
||||
if (!el) return;
|
||||
noteTypesToRender.current[type] = el;
|
||||
setActiveNoteType(type);
|
||||
});
|
||||
} else {
|
||||
setActiveNoteType(type);
|
||||
}
|
||||
}, [ note, viewScope, type ]);
|
||||
|
||||
// Detect note type changes.
|
||||
useTriliumEvent("entitiesReloaded", async ({ loadResults }) => {
|
||||
if (!note) return;
|
||||
|
||||
// we're detecting note type change on the note_detail level, but triggering the noteTypeMimeChanged
|
||||
// globally, so it gets also to e.g. ribbon components. But this means that the event can be generated multiple
|
||||
// times if the same note is open in several tabs.
|
||||
|
||||
if (note.noteId && loadResults.isNoteContentReloaded(note.noteId, parentComponent.componentId)) {
|
||||
// probably incorrect event
|
||||
// calling this.refresh() is not enough since the event needs to be propagated to children as well
|
||||
// FIXME: create a separate event to force hierarchical refresh
|
||||
|
||||
// this uses handleEvent to make sure that the ordinary content updates are propagated only in the subtree
|
||||
// to avoid the problem in #3365
|
||||
parentComponent.handleEvent("noteTypeMimeChanged", { noteId: note.noteId });
|
||||
} else if (note.noteId
|
||||
&& loadResults.isNoteReloaded(note.noteId, parentComponent.componentId)
|
||||
&& (type !== (await getWidgetType(note, noteContext)) || mime !== note?.mime)) {
|
||||
// this needs to have a triggerEvent so that e.g., note type (not in the component subtree) is updated
|
||||
parentComponent.triggerEvent("noteTypeMimeChanged", { noteId: note.noteId });
|
||||
} else {
|
||||
const attrs = loadResults.getAttributeRows();
|
||||
|
||||
const label = attrs.find(
|
||||
(attr) =>
|
||||
attr.type === "label" &&
|
||||
["readOnly", "autoReadOnlyDisabled", "cssClass", "displayRelations", "hideRelations"].includes(attr.name ?? "") &&
|
||||
attributes.isAffecting(attr, note)
|
||||
);
|
||||
|
||||
const relation = attrs.find((attr) => attr.type === "relation" && ["template", "inherit", "renderNote"]
|
||||
.includes(attr.name ?? "") && attributes.isAffecting(attr, note));
|
||||
|
||||
if (note.noteId && (label || relation)) {
|
||||
// probably incorrect event
|
||||
// calling this.refresh() is not enough since the event needs to be propagated to children as well
|
||||
parentComponent.triggerEvent("noteTypeMimeChanged", { noteId: note.noteId });
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Automatically focus the editor.
|
||||
useTriliumEvent("activeNoteChanged", () => {
|
||||
// Restore focus to the editor when switching tabs, but only if the note tree is not already focused.
|
||||
if (!document.activeElement?.classList.contains("fancytree-title")) {
|
||||
parentComponent.triggerCommand("focusOnDetail", { ntxId });
|
||||
}
|
||||
});
|
||||
|
||||
// Fixed tree for launch bar config on mobile.
|
||||
useEffect(() => {
|
||||
if (!isMobile) return;
|
||||
const hasFixedTree = noteContext?.hoistedNoteId === "_lbMobileRoot";
|
||||
document.body.classList.toggle("force-fixed-tree", hasFixedTree);
|
||||
}, [ note ]);
|
||||
|
||||
useTriliumEvent("executeInActiveNoteDetailWidget", ({ callback }) => {
|
||||
if (!noteContext?.isActive()) return;
|
||||
callback(parentComponent);
|
||||
});
|
||||
|
||||
useTriliumEvent("executeWithTypeWidget", ({ resolve, ntxId: eventNtxId }) => {
|
||||
if (eventNtxId !== ntxId || !activeNoteType || !containerRef.current) return;
|
||||
|
||||
const classNameToSearch = TYPE_MAPPINGS[activeNoteType].className;
|
||||
const componentEl = containerRef.current.querySelector<HTMLElement>(`.${classNameToSearch}`);
|
||||
if (!componentEl) return;
|
||||
|
||||
const component = glob.getComponentByEl(componentEl);
|
||||
resolve(component);
|
||||
});
|
||||
|
||||
useTriliumEvent("printActiveNote", () => {
|
||||
if (!noteContext?.isActive() || !note) return;
|
||||
|
||||
// Trigger in timeout to dismiss the menu while printing.
|
||||
setTimeout(window.print, 0);
|
||||
});
|
||||
|
||||
useTriliumEvent("exportAsPdf", () => {
|
||||
if (!noteContext?.isActive() || !note) return;
|
||||
const { ipcRenderer } = dynamicRequire("electron");
|
||||
ipcRenderer.send("export-as-pdf", {
|
||||
title: note.title,
|
||||
pageSize: note.getAttributeValue("label", "printPageSize") ?? "Letter",
|
||||
landscape: note.hasAttribute("label", "printLandscape")
|
||||
});
|
||||
});
|
||||
|
||||
return (
|
||||
<div
|
||||
ref={containerRef}
|
||||
class={`note-detail ${isFullHeight ? "full-height" : ""}`}
|
||||
>
|
||||
{Object.entries(noteTypesToRender.current).map(([ type, Element ]) => {
|
||||
return <NoteDetailWrapper
|
||||
Element={Element}
|
||||
key={type}
|
||||
type={type as ExtendedNoteType}
|
||||
isVisible={activeNoteType === type}
|
||||
isFullHeight={isFullHeight}
|
||||
props={props}
|
||||
/>
|
||||
})}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wraps a single note type widget, in order to keep it in the DOM even after the user has switched away to another note type. This allows faster loading of the same note type again. The properties are cached, so that they are updated only
|
||||
* while the widget is visible, to avoid rendering in the background. When not visible, the DOM element is simply hidden.
|
||||
*/
|
||||
function NoteDetailWrapper({ Element, type, isVisible, isFullHeight, props }: { Element: (props: TypeWidgetProps) => VNode, type: ExtendedNoteType, isVisible: boolean, isFullHeight: boolean, props: TypeWidgetProps }) {
|
||||
const [ cachedProps, setCachedProps ] = useState(props);
|
||||
|
||||
useEffect(() => {
|
||||
if (isVisible) {
|
||||
setCachedProps(props);
|
||||
} else {
|
||||
// Do nothing, keep the old props.
|
||||
}
|
||||
}, [ isVisible ]);
|
||||
|
||||
const typeMapping = TYPE_MAPPINGS[type];
|
||||
return (
|
||||
<div
|
||||
className={`${typeMapping.className} ${typeMapping.printable ? "note-detail-printable" : ""}`}
|
||||
style={{
|
||||
display: !isVisible ? "none" : "",
|
||||
height: isFullHeight ? "100%" : ""
|
||||
}}
|
||||
>
|
||||
{ <Element {...cachedProps} /> }
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
/** Manages both note changes and changes to the widget type, which are asynchronous. */
|
||||
function useNoteInfo() {
|
||||
const { note: actualNote, noteContext, parentComponent } = useNoteContext();
|
||||
const [ note, setNote ] = useState<FNote | null | undefined>();
|
||||
const [ type, setType ] = useState<ExtendedNoteType>();
|
||||
const [ mime, setMime ] = useState<string>();
|
||||
|
||||
function refresh() {
|
||||
getWidgetType(actualNote, noteContext).then(type => {
|
||||
setNote(actualNote);
|
||||
setType(type);
|
||||
setMime(actualNote?.mime);
|
||||
});
|
||||
}
|
||||
|
||||
useEffect(refresh, [ actualNote, noteContext, noteContext?.viewScope ]);
|
||||
useTriliumEvent("readOnlyTemporarilyDisabled", ({ noteContext: eventNoteContext }) => {
|
||||
if (eventNoteContext?.ntxId !== noteContext?.ntxId) return;
|
||||
refresh();
|
||||
});
|
||||
useTriliumEvent("noteTypeMimeChanged", refresh);
|
||||
|
||||
return { note, type, mime, noteContext, parentComponent };
|
||||
}
|
||||
|
||||
async function getCorrespondingWidget(type: ExtendedNoteType): Promise<null | TypeWidget> {
|
||||
const correspondingType = TYPE_MAPPINGS[type].view;
|
||||
if (!correspondingType) return null;
|
||||
|
||||
const result = await correspondingType();
|
||||
|
||||
if ("default" in result) {
|
||||
return result.default;
|
||||
} else if (isValidElement(result)) {
|
||||
// Direct VNode provided.
|
||||
return result;
|
||||
} else {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
async function getWidgetType(note: FNote | null | undefined, noteContext: NoteContext | undefined): Promise<ExtendedNoteType> {
|
||||
if (!note) {
|
||||
console.log("Returning empty because no note.");
|
||||
return "empty";
|
||||
}
|
||||
|
||||
const type = note.type;
|
||||
let resultingType: ExtendedNoteType;
|
||||
|
||||
if (noteContext?.viewScope?.viewMode === "source") {
|
||||
resultingType = "readOnlyCode";
|
||||
} else if (noteContext?.viewScope && noteContext.viewScope.viewMode === "attachments") {
|
||||
resultingType = noteContext.viewScope.attachmentId ? "attachmentDetail" : "attachmentList";
|
||||
} else if (type === "text" && (await noteContext?.isReadOnly())) {
|
||||
resultingType = "readOnlyText";
|
||||
} else if ((type === "code" || type === "mermaid") && (await noteContext?.isReadOnly())) {
|
||||
resultingType = "readOnlyCode";
|
||||
} else if (type === "text") {
|
||||
resultingType = "editableText";
|
||||
} else if (type === "code") {
|
||||
resultingType = "editableCode";
|
||||
} else if (type === "launcher") {
|
||||
resultingType = "doc";
|
||||
} else {
|
||||
resultingType = type;
|
||||
}
|
||||
|
||||
if (note.isProtected && !protected_session_holder.isProtectedSessionAvailable()) {
|
||||
resultingType = "protectedSession";
|
||||
}
|
||||
|
||||
return resultingType;
|
||||
}
|
||||
|
||||
function checkFullHeight(noteContext: NoteContext | undefined, type: ExtendedNoteType | undefined) {
|
||||
if (!noteContext) return false;
|
||||
|
||||
// https://github.com/zadam/trilium/issues/2522
|
||||
const isBackendNote = noteContext?.noteId === "_backendLog";
|
||||
const isSqlNote = noteContext.note?.mime === "text/x-sqlite;schema=trilium";
|
||||
const isFullHeightNoteType = type && TYPE_MAPPINGS[type].isFullHeight;
|
||||
return (!noteContext?.hasNoteList() && isFullHeightNoteType && !isSqlNote)
|
||||
|| noteContext?.viewScope?.viewMode === "attachments"
|
||||
|| isBackendNote;
|
||||
}
|
||||
@@ -23,6 +23,6 @@
|
||||
color: var(--button-text-color);
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
right: 10px;
|
||||
inset-inline-end: 10px;
|
||||
cursor: pointer;
|
||||
}
|
||||
@@ -1,207 +0,0 @@
|
||||
import { t } from "../services/i18n.js";
|
||||
import utils from "../services/utils.js";
|
||||
import AttachmentActionsWidget from "./buttons/attachments_actions.js";
|
||||
import BasicWidget from "./basic_widget.js";
|
||||
import options from "../services/options.js";
|
||||
import imageService from "../services/image.js";
|
||||
import linkService from "../services/link.js";
|
||||
import contentRenderer from "../services/content_renderer.js";
|
||||
import toastService from "../services/toast.js";
|
||||
import type FAttachment from "../entities/fattachment.js";
|
||||
import type { EventData } from "../components/app_context.js";
|
||||
|
||||
const TPL = /*html*/`
|
||||
<div class="attachment-detail-widget">
|
||||
<style>
|
||||
.attachment-detail-widget {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.attachment-detail-wrapper {
|
||||
margin-bottom: 20px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.attachment-title-line {
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
gap: 1em;
|
||||
}
|
||||
|
||||
.attachment-details {
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.attachment-content-wrapper {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.attachment-content-wrapper .rendered-content {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.attachment-content-wrapper pre {
|
||||
padding: 10px;
|
||||
margin-top: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.attachment-detail-wrapper.list-view .attachment-content-wrapper {
|
||||
max-height: 300px;
|
||||
}
|
||||
|
||||
.attachment-detail-wrapper.full-detail {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.attachment-detail-wrapper.full-detail .attachment-content-wrapper {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.attachment-detail-wrapper.list-view .attachment-content-wrapper pre {
|
||||
max-height: 400px;
|
||||
}
|
||||
|
||||
.attachment-content-wrapper img {
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
.attachment-detail-wrapper.list-view .attachment-content-wrapper img, .attachment-detail-wrapper.list-view .attachment-content-wrapper video {
|
||||
max-height: 300px;
|
||||
max-width: 90%;
|
||||
object-fit: contain;
|
||||
}
|
||||
|
||||
.attachment-detail-wrapper.full-detail .attachment-content-wrapper img {
|
||||
max-width: 90%;
|
||||
object-fit: contain;
|
||||
}
|
||||
|
||||
.attachment-detail-wrapper.scheduled-for-deletion .attachment-content-wrapper img {
|
||||
filter: contrast(10%);
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="attachment-detail-wrapper">
|
||||
<div class="attachment-title-line">
|
||||
<div class="attachment-actions-container"></div>
|
||||
<h4 class="attachment-title"></h4>
|
||||
<div class="attachment-details"></div>
|
||||
<div style="flex: 1 1;"></div>
|
||||
</div>
|
||||
|
||||
<div class="attachment-deletion-warning alert alert-info" style="margin-top: 15px;"></div>
|
||||
|
||||
<div class="attachment-content-wrapper"></div>
|
||||
</div>
|
||||
</div>`;
|
||||
|
||||
export default class AttachmentDetailWidget extends BasicWidget {
|
||||
attachment: FAttachment;
|
||||
attachmentActionsWidget: AttachmentActionsWidget;
|
||||
isFullDetail: boolean;
|
||||
$wrapper!: JQuery<HTMLElement>;
|
||||
|
||||
constructor(attachment: FAttachment, isFullDetail: boolean) {
|
||||
super();
|
||||
|
||||
this.contentSized();
|
||||
this.attachment = attachment;
|
||||
this.attachmentActionsWidget = new AttachmentActionsWidget(attachment, isFullDetail);
|
||||
this.isFullDetail = isFullDetail;
|
||||
this.child(this.attachmentActionsWidget);
|
||||
}
|
||||
|
||||
doRender() {
|
||||
this.$widget = $(TPL);
|
||||
this.refresh();
|
||||
|
||||
super.doRender();
|
||||
}
|
||||
|
||||
async refresh() {
|
||||
this.$widget.find(".attachment-detail-wrapper").empty().append($(TPL).find(".attachment-detail-wrapper").html());
|
||||
this.$wrapper = this.$widget.find(".attachment-detail-wrapper");
|
||||
this.$wrapper.addClass(this.isFullDetail ? "full-detail" : "list-view");
|
||||
|
||||
if (!this.isFullDetail) {
|
||||
const $link = await linkService.createLink(this.attachment.ownerId, {
|
||||
title: this.attachment.title,
|
||||
viewScope: {
|
||||
viewMode: "attachments",
|
||||
attachmentId: this.attachment.attachmentId
|
||||
}
|
||||
});
|
||||
$link.addClass("use-tn-links");
|
||||
|
||||
this.$wrapper.find(".attachment-title").append($link);
|
||||
} else {
|
||||
this.$wrapper.find(".attachment-title").text(this.attachment.title);
|
||||
}
|
||||
|
||||
const $deletionWarning = this.$wrapper.find(".attachment-deletion-warning");
|
||||
const { utcDateScheduledForErasureSince } = this.attachment;
|
||||
|
||||
if (utcDateScheduledForErasureSince) {
|
||||
this.$wrapper.addClass("scheduled-for-deletion");
|
||||
|
||||
const scheduledSinceTimestamp = utils.parseDate(utcDateScheduledForErasureSince)?.getTime();
|
||||
// use default value (30 days in seconds) from options_init as fallback, in case getInt returns null
|
||||
const intervalMs = options.getInt("eraseUnusedAttachmentsAfterSeconds") || 2592000 * 1000;
|
||||
const deletionTimestamp = scheduledSinceTimestamp + intervalMs;
|
||||
const willBeDeletedInMs = deletionTimestamp - Date.now();
|
||||
|
||||
$deletionWarning.show();
|
||||
|
||||
if (willBeDeletedInMs >= 60000) {
|
||||
$deletionWarning.text(t("attachment_detail_2.will_be_deleted_in", { time: utils.formatTimeInterval(willBeDeletedInMs) }));
|
||||
} else {
|
||||
$deletionWarning.text(t("attachment_detail_2.will_be_deleted_soon"));
|
||||
}
|
||||
|
||||
$deletionWarning.append(t("attachment_detail_2.deletion_reason"));
|
||||
} else {
|
||||
this.$wrapper.removeClass("scheduled-for-deletion");
|
||||
$deletionWarning.hide();
|
||||
}
|
||||
|
||||
this.$wrapper.find(".attachment-details").text(t("attachment_detail_2.role_and_size", { role: this.attachment.role, size: utils.formatSize(this.attachment.contentLength) }));
|
||||
this.$wrapper.find(".attachment-actions-container").append(this.attachmentActionsWidget.render());
|
||||
|
||||
const { $renderedContent } = await contentRenderer.getRenderedContent(this.attachment, { imageHasZoom: this.isFullDetail });
|
||||
this.$wrapper.find(".attachment-content-wrapper").append($renderedContent);
|
||||
}
|
||||
|
||||
async copyAttachmentLinkToClipboard() {
|
||||
if (this.attachment.role === "image") {
|
||||
imageService.copyImageReferenceToClipboard(this.$wrapper.find(".attachment-content-wrapper"));
|
||||
} else if (this.attachment.role === "file") {
|
||||
const $link = await linkService.createLink(this.attachment.ownerId, {
|
||||
referenceLink: true,
|
||||
viewScope: {
|
||||
viewMode: "attachments",
|
||||
attachmentId: this.attachment.attachmentId
|
||||
}
|
||||
});
|
||||
|
||||
utils.copyHtmlToClipboard($link[0].outerHTML);
|
||||
|
||||
toastService.showMessage(t("attachment_detail_2.link_copied"));
|
||||
} else {
|
||||
throw new Error(t("attachment_detail_2.unrecognized_role", { role: this.attachment.role }));
|
||||
}
|
||||
}
|
||||
|
||||
async entitiesReloadedEvent({ loadResults }: EventData<"entitiesReloaded">) {
|
||||
const attachmentRow = loadResults.getAttachmentRows().find((att) => att.attachmentId === this.attachment.attachmentId);
|
||||
|
||||
if (attachmentRow) {
|
||||
if (attachmentRow.isDeleted) {
|
||||
this.toggleInt(false);
|
||||
} else {
|
||||
this.refresh();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -36,7 +36,7 @@ const TPL = /*html*/`
|
||||
}
|
||||
|
||||
.related-notes-list {
|
||||
padding-left: 20px;
|
||||
padding-inline-start: 20px;
|
||||
margin-top: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
@@ -46,7 +46,7 @@ const TPL = /*html*/`
|
||||
}
|
||||
|
||||
.attr-edit-table th {
|
||||
text-align: left;
|
||||
text-align: start;
|
||||
}
|
||||
|
||||
.attr-edit-table td input[not(type="checkbox")] {
|
||||
@@ -150,7 +150,7 @@ const TPL = /*html*/`
|
||||
<th title="${t("attribute_detail.precision_title")}">${t("attribute_detail.precision")}</th>
|
||||
<td>
|
||||
<div class="input-group">
|
||||
<input type="number" class="form-control attr-input-number-precision" style="text-align: right">
|
||||
<input type="number" class="form-control attr-input-number-precision" style="text-align: end">
|
||||
<span class="input-group-text">${t("attribute_detail.digits")}</span>
|
||||
</div>
|
||||
</td>
|
||||
@@ -176,7 +176,7 @@ const TPL = /*html*/`
|
||||
|
||||
<div class="attr-save-delete-button-container">
|
||||
<button class="btn btn-primary btn-sm attr-save-changes-and-close-button"
|
||||
style="flex-grow: 1; margin-right: 20px">
|
||||
style="flex-grow: 1; margin-inline-end: 20px">
|
||||
${t("attribute_detail.save_and_close")}</button>
|
||||
|
||||
<button class="btn btn-secondary btn-sm attr-delete-button">
|
||||
|
||||
@@ -4,8 +4,6 @@ import froca from "../services/froca.js";
|
||||
import { t } from "../services/i18n.js";
|
||||
import toastService from "../services/toast.js";
|
||||
import { renderReactWidget } from "./react/react_utils.jsx";
|
||||
import { EventNames, EventData } from "../components/app_context.js";
|
||||
import { Handler } from "leaflet";
|
||||
|
||||
export class TypedBasicWidget<T extends TypedComponent<any>> extends TypedComponent<T> {
|
||||
protected attrs: Record<string, string>;
|
||||
@@ -76,7 +74,7 @@ export class TypedBasicWidget<T extends TypedComponent<any>> extends TypedCompon
|
||||
/**
|
||||
* Sets the CSS attribute of the given name to the given value.
|
||||
*
|
||||
* @param name the name of the CSS attribute to set (e.g. `padding-left`).
|
||||
* @param name the name of the CSS attribute to set (e.g. `padding-inline-start`).
|
||||
* @param value the value of the CSS attribute to set (e.g. `12px`).
|
||||
* @returns self for chaining.
|
||||
*/
|
||||
@@ -89,7 +87,7 @@ export class TypedBasicWidget<T extends TypedComponent<any>> extends TypedCompon
|
||||
* Sets the CSS attribute of the given name to the given value, but only if the condition provided is truthy.
|
||||
*
|
||||
* @param condition `true` in order to apply the CSS, `false` to ignore it.
|
||||
* @param name the name of the CSS attribute to set (e.g. `padding-left`).
|
||||
* @param name the name of the CSS attribute to set (e.g. `padding-inline-start`).
|
||||
* @param value the value of the CSS attribute to set (e.g. `12px`).
|
||||
* @returns self for chaining.
|
||||
*/
|
||||
|
||||
@@ -4,7 +4,7 @@ import AbstractBulkAction from "./abstract_bulk_action";
|
||||
import HelpRemoveButtons from "../react/HelpRemoveButtons";
|
||||
|
||||
interface BulkActionProps {
|
||||
label: string | ComponentChildren;
|
||||
label: string | ComponentChildren;
|
||||
children?: ComponentChildren;
|
||||
helpText?: ComponentChildren;
|
||||
bulkAction: AbstractBulkAction;
|
||||
@@ -12,8 +12,8 @@ interface BulkActionProps {
|
||||
|
||||
// Define styles as constants to prevent recreation
|
||||
const flexContainerStyle = { display: "flex", alignItems: "center" } as const;
|
||||
const labelStyle = { marginRight: "10px" } as const;
|
||||
const textStyle = { marginRight: "10px", marginLeft: "10px" } as const;
|
||||
const labelStyle = { marginInlineEnd: "10px" } as const;
|
||||
const textStyle = { marginInlineEnd: "10px", marginInlineStart: "10px" } as const;
|
||||
|
||||
const BulkAction = memo(({ label, children, helpText, bulkAction }: BulkActionProps) => {
|
||||
return (
|
||||
@@ -44,4 +44,4 @@ export const BulkActionText = memo(({ text }: { text: string }) => {
|
||||
{text}
|
||||
</div>
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { Tooltip } from "bootstrap";
|
||||
import NoteContextAwareWidget from "../note_context_aware_widget.js";
|
||||
import { handleRightToLeftPlacement } from "../../services/utils.js";
|
||||
|
||||
const TPL = /*html*/`<button class="button-widget bx"
|
||||
data-bs-toggle="tooltip"
|
||||
@@ -26,13 +27,14 @@ export default class AbstractButtonWidget<SettingsT extends AbstractButtonWidget
|
||||
|
||||
doRender() {
|
||||
this.$widget = $(TPL);
|
||||
|
||||
this.tooltip = new Tooltip(this.$widget[0], {
|
||||
html: true,
|
||||
// in case getTitle() returns null -> use empty string as fallback
|
||||
title: () => this.getTitle() || "",
|
||||
trigger: "hover",
|
||||
placement: this.settings.titlePlacement,
|
||||
fallbackPlacements: [this.settings.titlePlacement]
|
||||
placement: handleRightToLeftPlacement(this.settings.titlePlacement),
|
||||
fallbackPlacements: [ handleRightToLeftPlacement(this.settings.titlePlacement) ]
|
||||
});
|
||||
|
||||
if (this.settings.onContextMenu) {
|
||||
|
||||
@@ -1,195 +0,0 @@
|
||||
import { t } from "../../services/i18n.js";
|
||||
import BasicWidget from "../basic_widget.js";
|
||||
import server from "../../services/server.js";
|
||||
import dialogService from "../../services/dialog.js";
|
||||
import toastService from "../../services/toast.js";
|
||||
import ws from "../../services/ws.js";
|
||||
import appContext from "../../components/app_context.js";
|
||||
import openService from "../../services/open.js";
|
||||
import utils from "../../services/utils.js";
|
||||
import { Dropdown } from "bootstrap";
|
||||
import type FAttachment from "../../entities/fattachment.js";
|
||||
import type AttachmentDetailWidget from "../attachment_detail.js";
|
||||
import type { NoteRow } from "@triliumnext/commons";
|
||||
|
||||
const TPL = /*html*/`
|
||||
<div class="dropdown attachment-actions">
|
||||
<style>
|
||||
.attachment-actions {
|
||||
width: 35px;
|
||||
height: 35px;
|
||||
}
|
||||
|
||||
.attachment-actions .dropdown-menu {
|
||||
width: 20em;
|
||||
}
|
||||
|
||||
.attachment-actions .dropdown-item .bx {
|
||||
position: relative;
|
||||
top: 3px;
|
||||
font-size: 120%;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.attachment-actions .dropdown-item[disabled], .attachment-actions .dropdown-item[disabled]:hover {
|
||||
color: var(--muted-text-color) !important;
|
||||
background-color: transparent !important;
|
||||
pointer-events: none; /* makes it unclickable */
|
||||
}
|
||||
</style>
|
||||
|
||||
<button type="button" data-bs-toggle="dropdown" aria-haspopup="true"
|
||||
aria-expanded="false" class="icon-action icon-action-always-border bx bx-dots-vertical-rounded"
|
||||
style="position: relative; top: 3px;"></button>
|
||||
|
||||
<div class="dropdown-menu dropdown-menu-right">
|
||||
|
||||
<li data-trigger-command="openAttachment" class="dropdown-item"
|
||||
title="${t("attachments_actions.open_externally_title")}"><span class="bx bx-file-find"></span> ${t("attachments_actions.open_externally")}</li>
|
||||
|
||||
<li data-trigger-command="openAttachmentCustom" class="dropdown-item"
|
||||
title="${t("attachments_actions.open_custom_title")}"><span class="bx bx-customize"></span> ${t("attachments_actions.open_custom")}</li>
|
||||
|
||||
<li data-trigger-command="downloadAttachment" class="dropdown-item">
|
||||
<span class="bx bx-download"></span> ${t("attachments_actions.download")}</li>
|
||||
|
||||
<li data-trigger-command="copyAttachmentLinkToClipboard" class="dropdown-item"><span class="bx bx-link">
|
||||
</span> ${t("attachments_actions.copy_link_to_clipboard")}</li>
|
||||
|
||||
|
||||
<div class="dropdown-divider"></div>
|
||||
|
||||
|
||||
<li data-trigger-command="uploadNewAttachmentRevision" class="dropdown-item"><span class="bx bx-upload">
|
||||
</span> ${t("attachments_actions.upload_new_revision")}</li>
|
||||
|
||||
<li data-trigger-command="renameAttachment" class="dropdown-item">
|
||||
<span class="bx bx-rename"></span> ${t("attachments_actions.rename_attachment")}</li>
|
||||
|
||||
<li data-trigger-command="deleteAttachment" class="dropdown-item">
|
||||
<span class="bx bx-trash destructive-action-icon"></span> ${t("attachments_actions.delete_attachment")}</li>
|
||||
|
||||
|
||||
<div class="dropdown-divider"></div>
|
||||
|
||||
|
||||
<li data-trigger-command="convertAttachmentIntoNote" class="dropdown-item"><span class="bx bx-note">
|
||||
</span> ${t("attachments_actions.convert_attachment_into_note")}</li>
|
||||
|
||||
</div>
|
||||
|
||||
<input type="file" class="attachment-upload-new-revision-input" style="display: none">
|
||||
</div>`;
|
||||
|
||||
// TODO: Deduplicate
|
||||
interface AttachmentResponse {
|
||||
note: NoteRow;
|
||||
}
|
||||
|
||||
export default class AttachmentActionsWidget extends BasicWidget {
|
||||
$uploadNewRevisionInput!: JQuery<HTMLInputElement>;
|
||||
attachment: FAttachment;
|
||||
isFullDetail: boolean;
|
||||
dropdown!: Dropdown;
|
||||
|
||||
constructor(attachment: FAttachment, isFullDetail: boolean) {
|
||||
super();
|
||||
|
||||
this.attachment = attachment;
|
||||
this.isFullDetail = isFullDetail;
|
||||
}
|
||||
|
||||
get attachmentId() {
|
||||
return this.attachment.attachmentId;
|
||||
}
|
||||
|
||||
doRender() {
|
||||
this.$widget = $(TPL);
|
||||
this.dropdown = Dropdown.getOrCreateInstance(this.$widget.find("[data-bs-toggle='dropdown']")[0]);
|
||||
this.$widget.on("click", ".dropdown-item", () => this.dropdown.toggle());
|
||||
|
||||
this.$uploadNewRevisionInput = this.$widget.find(".attachment-upload-new-revision-input");
|
||||
this.$uploadNewRevisionInput.on("change", async () => {
|
||||
const fileToUpload = this.$uploadNewRevisionInput[0].files?.item(0); // copy to allow reset below
|
||||
this.$uploadNewRevisionInput.val("");
|
||||
if (fileToUpload) {
|
||||
const result = await server.upload(`attachments/${this.attachmentId}/file`, fileToUpload);
|
||||
if (result.uploaded) {
|
||||
toastService.showMessage(t("attachments_actions.upload_success"));
|
||||
} else {
|
||||
toastService.showError(t("attachments_actions.upload_failed"));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
const isElectron = utils.isElectron();
|
||||
if (!this.isFullDetail) {
|
||||
const $openAttachmentButton = this.$widget.find("[data-trigger-command='openAttachment']");
|
||||
$openAttachmentButton.addClass("disabled").append($('<span class="bx bx-info-circle disabled-tooltip" />').attr("title", t("attachments_actions.open_externally_detail_page")));
|
||||
if (isElectron) {
|
||||
const $openAttachmentCustomButton = this.$widget.find("[data-trigger-command='openAttachmentCustom']");
|
||||
$openAttachmentCustomButton.addClass("disabled").append($('<span class="bx bx-info-circle disabled-tooltip" />').attr("title", t("attachments_actions.open_externally_detail_page")));
|
||||
}
|
||||
}
|
||||
if (!isElectron) {
|
||||
const $openAttachmentCustomButton = this.$widget.find("[data-trigger-command='openAttachmentCustom']");
|
||||
$openAttachmentCustomButton.addClass("disabled").append($('<span class="bx bx-info-circle disabled-tooltip" />').attr("title", t("attachments_actions.open_custom_client_only")));
|
||||
}
|
||||
}
|
||||
|
||||
async openAttachmentCommand() {
|
||||
await openService.openAttachmentExternally(this.attachmentId, this.attachment.mime);
|
||||
}
|
||||
|
||||
async openAttachmentCustomCommand() {
|
||||
await openService.openAttachmentCustom(this.attachmentId, this.attachment.mime);
|
||||
}
|
||||
|
||||
async downloadAttachmentCommand() {
|
||||
await openService.downloadAttachment(this.attachmentId);
|
||||
}
|
||||
|
||||
async uploadNewAttachmentRevisionCommand() {
|
||||
this.$uploadNewRevisionInput.trigger("click");
|
||||
}
|
||||
|
||||
async copyAttachmentLinkToClipboardCommand() {
|
||||
if (this.parent && "copyAttachmentLinkToClipboard" in this.parent) {
|
||||
(this.parent as AttachmentDetailWidget).copyAttachmentLinkToClipboard();
|
||||
}
|
||||
}
|
||||
|
||||
async deleteAttachmentCommand() {
|
||||
if (!(await dialogService.confirm(t("attachments_actions.delete_confirm", { title: this.attachment.title })))) {
|
||||
return;
|
||||
}
|
||||
|
||||
await server.remove(`attachments/${this.attachmentId}`);
|
||||
toastService.showMessage(t("attachments_actions.delete_success", { title: this.attachment.title }));
|
||||
}
|
||||
|
||||
async convertAttachmentIntoNoteCommand() {
|
||||
if (!(await dialogService.confirm(t("attachments_actions.convert_confirm", { title: this.attachment.title })))) {
|
||||
return;
|
||||
}
|
||||
|
||||
const { note: newNote } = await server.post<AttachmentResponse>(`attachments/${this.attachmentId}/convert-to-note`);
|
||||
toastService.showMessage(t("attachments_actions.convert_success", { title: this.attachment.title }));
|
||||
await ws.waitForMaxKnownEntityChangeId();
|
||||
await appContext.tabManager.getActiveContext()?.setNote(newNote.noteId);
|
||||
}
|
||||
|
||||
async renameAttachmentCommand() {
|
||||
const attachmentTitle = await dialogService.prompt({
|
||||
title: t("attachments_actions.rename_attachment"),
|
||||
message: t("attachments_actions.enter_new_name"),
|
||||
defaultValue: this.attachment.title
|
||||
});
|
||||
|
||||
if (!attachmentTitle?.trim()) {
|
||||
return;
|
||||
}
|
||||
|
||||
await server.put(`attachments/${this.attachmentId}/rename`, { title: attachmentTitle });
|
||||
}
|
||||
}
|
||||
@@ -35,7 +35,7 @@ const DROPDOWN_TPL = `
|
||||
}
|
||||
|
||||
.bookmark-folder-widget li .note-link {
|
||||
padding-left: 35px;
|
||||
padding-inline-start: 35px;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
@@ -8,17 +8,19 @@ import options from "../../services/options.js";
|
||||
import { Dropdown } from "bootstrap";
|
||||
import type { EventData } from "../../components/app_context.js";
|
||||
import dayjs, { Dayjs } from "dayjs";
|
||||
import isoWeek from "dayjs/plugin/isoWeek.js";
|
||||
import utc from "dayjs/plugin/utc.js";
|
||||
import isSameOrAfter from "dayjs/plugin/isSameOrAfter.js";
|
||||
import "../../stylesheets/calendar.css";
|
||||
import type { AttributeRow } from "@triliumnext/commons";
|
||||
import type { AttributeRow, OptionDefinitions } from "@triliumnext/commons";
|
||||
|
||||
dayjs.extend(utc);
|
||||
dayjs.extend(isSameOrAfter);
|
||||
dayjs.extend(isoWeek);
|
||||
|
||||
const MONTHS = [
|
||||
t("calendar.january"),
|
||||
t("calendar.febuary"),
|
||||
t("calendar.february"),
|
||||
t("calendar.march"),
|
||||
t("calendar.april"),
|
||||
t("calendar.may"),
|
||||
@@ -69,7 +71,15 @@ const DROPDOWN_TPL = `
|
||||
<div class="calendar-body" data-calendar-area="month"></div>
|
||||
</div>`;
|
||||
|
||||
const DAYS_OF_WEEK = [t("calendar.sun"), t("calendar.mon"), t("calendar.tue"), t("calendar.wed"), t("calendar.thu"), t("calendar.fri"), t("calendar.sat")];
|
||||
const DAYS_OF_WEEK = [
|
||||
t("calendar.sun"),
|
||||
t("calendar.mon"),
|
||||
t("calendar.tue"),
|
||||
t("calendar.wed"),
|
||||
t("calendar.thu"),
|
||||
t("calendar.fri"),
|
||||
t("calendar.sat")
|
||||
];
|
||||
|
||||
interface DateNotesForMonth {
|
||||
[date: string]: string;
|
||||
@@ -90,7 +100,8 @@ export default class CalendarWidget extends RightDropdownButtonWidget {
|
||||
private $nextYear!: JQuery<HTMLElement>;
|
||||
private $previousYear!: JQuery<HTMLElement>;
|
||||
private monthDropdown!: Dropdown;
|
||||
private firstDayOfWeek!: number;
|
||||
// stored in ISO 1–7
|
||||
private firstDayOfWeekISO!: number;
|
||||
private weekCalculationOptions!: WeekCalculationOptions;
|
||||
private activeDate: Dayjs | null = null;
|
||||
private todaysDate!: Dayjs;
|
||||
@@ -126,6 +137,7 @@ export default class CalendarWidget extends RightDropdownButtonWidget {
|
||||
this.createMonth();
|
||||
}
|
||||
});
|
||||
|
||||
this.$next = this.$dropdownContent.find('[data-calendar-toggle="next"]');
|
||||
this.$next.on("click", () => {
|
||||
this.date = this.date.add(1, 'month');
|
||||
@@ -144,23 +156,24 @@ export default class CalendarWidget extends RightDropdownButtonWidget {
|
||||
this.date = this.date.year(parseInt(target.value));
|
||||
this.createMonth();
|
||||
});
|
||||
|
||||
this.$nextYear = this.$dropdownContent.find('[data-calendar-toggle="nextYear"]');
|
||||
this.$nextYear.on("click", () => {
|
||||
this.date = this.date.add(1, 'year');
|
||||
this.createMonth();
|
||||
});
|
||||
|
||||
this.$previousYear = this.$dropdownContent.find('[data-calendar-toggle="previousYear"]');
|
||||
this.$previousYear.on("click", () => {
|
||||
this.date = this.date.subtract(1, 'year');
|
||||
this.createMonth();
|
||||
});
|
||||
|
||||
// Date click
|
||||
this.$dropdownContent.on("click", ".calendar-date", async (ev) => {
|
||||
const date = $(ev.target).closest(".calendar-date").attr("data-calendar-date");
|
||||
|
||||
if (date) {
|
||||
const note = await dateNoteService.getDayNote(date);
|
||||
|
||||
if (note) {
|
||||
appContext.tabManager.getActiveContext()?.setNote(note.noteId);
|
||||
this.dropdown?.hide();
|
||||
@@ -168,10 +181,10 @@ export default class CalendarWidget extends RightDropdownButtonWidget {
|
||||
toastService.showError(t("calendar.cannot_find_day_note"));
|
||||
}
|
||||
}
|
||||
|
||||
ev.stopPropagation();
|
||||
});
|
||||
|
||||
// Week click
|
||||
this.$dropdownContent.on("click", ".calendar-week-number", async (ev) => {
|
||||
if (!this.weekNoteEnable) {
|
||||
return;
|
||||
@@ -218,23 +231,17 @@ export default class CalendarWidget extends RightDropdownButtonWidget {
|
||||
return;
|
||||
}
|
||||
const noteAttributes = await server.get<AttributeRow[]>(`notes/${noteId}/attributes`);
|
||||
|
||||
for (const attribute of noteAttributes) {
|
||||
if (attribute.name === 'enableWeekNote') {
|
||||
this.weekNoteEnable = true;
|
||||
return
|
||||
}
|
||||
}
|
||||
this.weekNoteEnable = false;
|
||||
this.weekNoteEnable = noteAttributes.some(a => a.name === 'enableWeekNote');
|
||||
}
|
||||
|
||||
// Store firstDayOfWeek as ISO (1–7)
|
||||
manageFirstDayOfWeek() {
|
||||
this.firstDayOfWeek = options.getInt("firstDayOfWeek") || 0;
|
||||
const rawFirstDayOfWeek = options.getInt("firstDayOfWeek") || 0;
|
||||
this.firstDayOfWeekISO = rawFirstDayOfWeek === 0 ? 7 : rawFirstDayOfWeek;
|
||||
|
||||
// Generate the list of days of the week taking into consideration the user's selected first day of week.
|
||||
let localeDaysOfWeek = [...DAYS_OF_WEEK];
|
||||
const daysToBeAddedAtEnd = localeDaysOfWeek.splice(0, this.firstDayOfWeek);
|
||||
localeDaysOfWeek = ['', ...localeDaysOfWeek, ...daysToBeAddedAtEnd];
|
||||
const shifted = localeDaysOfWeek.splice(0, rawFirstDayOfWeek);
|
||||
localeDaysOfWeek = ['', ...localeDaysOfWeek, ...shifted];
|
||||
this.$weekHeader.html(localeDaysOfWeek.map((el) => `<span>${el}</span>`).join(''));
|
||||
}
|
||||
|
||||
@@ -245,72 +252,15 @@ export default class CalendarWidget extends RightDropdownButtonWidget {
|
||||
};
|
||||
}
|
||||
|
||||
getWeekStartDate(date: Dayjs): Dayjs {
|
||||
const currentISO = date.isoWeekday();
|
||||
const diff = (currentISO - this.firstDayOfWeekISO + 7) % 7;
|
||||
return date.clone().subtract(diff, "day").startOf("day");
|
||||
}
|
||||
|
||||
getWeekNumber(date: Dayjs): number {
|
||||
const year = date.year();
|
||||
const dayOfWeek = (day: number) => (day - this.firstDayOfWeek + 7) % 7;
|
||||
|
||||
// Get first day of the year and adjust to first week start
|
||||
const jan1 = date.clone().year(year).month(0).date(1);
|
||||
const jan1Weekday = jan1.day();
|
||||
const dayOffset = dayOfWeek(jan1Weekday);
|
||||
let firstWeekStart = jan1.clone().subtract(dayOffset, 'day');
|
||||
|
||||
// Adjust based on week rule
|
||||
switch (this.weekCalculationOptions.firstWeekType) {
|
||||
case 1: { // ISO 8601: first week contains Thursday
|
||||
const thursday = firstWeekStart.clone().add(3, 'day'); // Monday + 3 = Thursday
|
||||
if (thursday.year() < year) {
|
||||
firstWeekStart = firstWeekStart.add(7, 'day');
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 2: { // minDaysInFirstWeek rule
|
||||
const daysInFirstWeek = 7 - dayOffset;
|
||||
if (daysInFirstWeek < this.weekCalculationOptions.minDaysInFirstWeek) {
|
||||
firstWeekStart = firstWeekStart.add(7, 'day');
|
||||
}
|
||||
break;
|
||||
}
|
||||
// default case 0: week containing Jan 1 → already handled
|
||||
}
|
||||
|
||||
const diffDays = date.startOf('day').diff(firstWeekStart.startOf('day'), 'day');
|
||||
const weekNumber = Math.floor(diffDays / 7) + 1;
|
||||
|
||||
// Handle case when date is before first week start → belongs to last week of previous year
|
||||
if (weekNumber <= 0) {
|
||||
return this.getWeekNumber(date.subtract(1, 'day'));
|
||||
}
|
||||
|
||||
// Handle case when date belongs to first week of next year
|
||||
const nextYear = year + 1;
|
||||
const jan1Next = date.clone().year(nextYear).month(0).date(1);
|
||||
const jan1WeekdayNext = jan1Next.day();
|
||||
const offsetNext = dayOfWeek(jan1WeekdayNext);
|
||||
let nextYearWeekStart = jan1Next.clone().subtract(offsetNext, 'day');
|
||||
|
||||
switch (this.weekCalculationOptions.firstWeekType) {
|
||||
case 1: {
|
||||
const thursday = nextYearWeekStart.clone().add(3, 'day');
|
||||
if (thursday.year() < nextYear) {
|
||||
nextYearWeekStart = nextYearWeekStart.add(7, 'day');
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 2: {
|
||||
const daysInFirstWeek = 7 - offsetNext;
|
||||
if (daysInFirstWeek < this.weekCalculationOptions.minDaysInFirstWeek) {
|
||||
nextYearWeekStart = nextYearWeekStart.add(7, 'day');
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (date.isSameOrAfter(nextYearWeekStart)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return weekNumber;
|
||||
const weekStart = this.getWeekStartDate(date);
|
||||
return weekStart.isoWeek();
|
||||
}
|
||||
|
||||
async dropdownShown() {
|
||||
@@ -320,32 +270,25 @@ export default class CalendarWidget extends RightDropdownButtonWidget {
|
||||
}
|
||||
|
||||
init(activeDate: string | null) {
|
||||
// attaching time fixes local timezone handling
|
||||
this.activeDate = activeDate ? dayjs(`${activeDate}T12:00:00`) : null;
|
||||
this.todaysDate = dayjs();
|
||||
this.date = dayjs(this.activeDate || this.todaysDate).startOf('month');
|
||||
|
||||
this.createMonth();
|
||||
}
|
||||
|
||||
createDay(dateNotesForMonth: DateNotesForMonth, num: number) {
|
||||
const $newDay = $("<a>").addClass("calendar-date").attr("data-calendar-date", this.date.local().format('YYYY-MM-DD'));
|
||||
const $newDay = $("<a>")
|
||||
.addClass("calendar-date")
|
||||
.attr("data-calendar-date", this.date.local().format('YYYY-MM-DD'));
|
||||
const $date = $("<span>").html(String(num));
|
||||
|
||||
const dateNoteId = dateNotesForMonth[this.date.local().format('YYYY-MM-DD')];
|
||||
|
||||
if (dateNoteId) {
|
||||
$newDay.addClass("calendar-date-exists");
|
||||
$newDay.attr("data-href", `#root/${dateNoteId}`);
|
||||
$newDay.addClass("calendar-date-exists").attr("data-href", `#root/${dateNoteId}`);
|
||||
}
|
||||
|
||||
if (this.date.isSame(this.activeDate, 'day')) {
|
||||
$newDay.addClass("calendar-date-active");
|
||||
}
|
||||
|
||||
if (this.date.isSame(this.todaysDate, 'day')) {
|
||||
$newDay.addClass("calendar-date-today");
|
||||
}
|
||||
if (this.date.isSame(this.activeDate, 'day')) $newDay.addClass("calendar-date-active");
|
||||
if (this.date.isSame(this.todaysDate, 'day')) $newDay.addClass("calendar-date-today");
|
||||
|
||||
$newDay.append($date);
|
||||
return $newDay;
|
||||
@@ -353,29 +296,26 @@ export default class CalendarWidget extends RightDropdownButtonWidget {
|
||||
|
||||
createWeekNumber(weekNumber: number) {
|
||||
const weekNoteId = this.date.local().format('YYYY-') + 'W' + String(weekNumber).padStart(2, '0');
|
||||
|
||||
let $newWeekNumber;
|
||||
|
||||
if (this.weekNoteEnable) {
|
||||
// Utilize the hover effect of calendar-date
|
||||
$newWeekNumber = $("<a>").addClass("calendar-date");
|
||||
|
||||
if (this.weekNotes.includes(weekNoteId)) {
|
||||
$newWeekNumber.addClass("calendar-date-exists");
|
||||
$newWeekNumber.attr("data-href", `#root/${weekNoteId}`);
|
||||
$newWeekNumber.addClass("calendar-date-exists").attr("data-href", `#root/${weekNoteId}`);
|
||||
}
|
||||
|
||||
} else {
|
||||
$newWeekNumber = $("<span>").addClass("calendar-week-number-disabled");
|
||||
}
|
||||
|
||||
$newWeekNumber.addClass("calendar-week-number").attr("data-calendar-week-number", weekNoteId);
|
||||
$newWeekNumber.append($("<span>").html(String(weekNumber)));
|
||||
|
||||
return $newWeekNumber;
|
||||
}
|
||||
|
||||
private getPrevMonthDays(firstDayOfWeek: number): { weekNumber: number, dates: Dayjs[] } {
|
||||
// Use isoWeekday() consistently
|
||||
private getPrevMonthDays(firstDayISO: number): { weekNumber: number, dates: Dayjs[] } {
|
||||
const prevMonthLastDay = this.date.subtract(1, 'month').endOf('month');
|
||||
const daysToAdd = (firstDayOfWeek - this.firstDayOfWeek + 7) % 7;
|
||||
const daysToAdd = (firstDayISO - this.firstDayOfWeekISO + 7) % 7;
|
||||
const dates: Dayjs[] = [];
|
||||
|
||||
const firstDay = this.date.startOf('month');
|
||||
@@ -389,18 +329,16 @@ export default class CalendarWidget extends RightDropdownButtonWidget {
|
||||
return { weekNumber, dates };
|
||||
}
|
||||
|
||||
private getNextMonthDays(lastDayOfWeek: number): Dayjs[] {
|
||||
private getNextMonthDays(lastDayISO: number): Dayjs[] {
|
||||
const nextMonthFirstDay = this.date.add(1, 'month').startOf('month');
|
||||
const dates: Dayjs[] = [];
|
||||
|
||||
const lastDayOfUserWeek = (this.firstDayOfWeek + 6) % 7;
|
||||
const daysToAdd = (lastDayOfUserWeek - lastDayOfWeek + 7) % 7;
|
||||
const lastDayOfUserWeek = ((this.firstDayOfWeekISO + 6 - 1) % 7) + 1; // ISO wrap
|
||||
const daysToAdd = (lastDayOfUserWeek - lastDayISO + 7) % 7;
|
||||
|
||||
// Get dates from next month
|
||||
for (let i = 0; i < daysToAdd; i++) {
|
||||
dates.push(nextMonthFirstDay.add(i, 'day'));
|
||||
}
|
||||
|
||||
return dates;
|
||||
}
|
||||
|
||||
@@ -411,12 +349,11 @@ export default class CalendarWidget extends RightDropdownButtonWidget {
|
||||
this.$month.empty();
|
||||
|
||||
const firstDay = this.date.startOf('month');
|
||||
const firstDayOfWeek = firstDay.day();
|
||||
|
||||
// Add dates from previous month
|
||||
if (firstDayOfWeek !== this.firstDayOfWeek) {
|
||||
const { weekNumber, dates } = this.getPrevMonthDays(firstDayOfWeek);
|
||||
const firstDayISO = firstDay.isoWeekday();
|
||||
|
||||
// Previous month filler
|
||||
if (firstDayISO !== this.firstDayOfWeekISO) {
|
||||
const { weekNumber, dates } = this.getPrevMonthDays(firstDayISO);
|
||||
const prevMonth = this.date.subtract(1, 'month').format('YYYY-MM');
|
||||
const dateNotesForPrevMonth: DateNotesForMonth = await server.get(`special-notes/notes-for-month/${prevMonth}`);
|
||||
|
||||
@@ -435,18 +372,16 @@ export default class CalendarWidget extends RightDropdownButtonWidget {
|
||||
|
||||
const currentMonth = this.date.month();
|
||||
|
||||
// Main month
|
||||
while (this.date.month() === currentMonth) {
|
||||
const weekNumber = this.getWeekNumber(this.date);
|
||||
|
||||
// Add week number if it's first day of week
|
||||
if (this.date.day() === this.firstDayOfWeek) {
|
||||
if (this.date.isoWeekday() === this.firstDayOfWeekISO) {
|
||||
const $weekNumber = this.createWeekNumber(weekNumber);
|
||||
this.$month.append($weekNumber);
|
||||
}
|
||||
|
||||
const $day = this.createDay(dateNotesForMonth, this.date.date());
|
||||
this.$month.append($day);
|
||||
|
||||
this.date = this.date.add(1, 'day');
|
||||
}
|
||||
// while loop trips over and day is at 30/31, bring it back
|
||||
@@ -454,11 +389,11 @@ export default class CalendarWidget extends RightDropdownButtonWidget {
|
||||
|
||||
// Add dates from next month
|
||||
const lastDayOfMonth = this.date.endOf('month');
|
||||
const lastDayOfWeek = lastDayOfMonth.day();
|
||||
const lastDayOfUserWeek = (this.firstDayOfWeek + 6) % 7;
|
||||
if (lastDayOfWeek !== lastDayOfUserWeek) {
|
||||
const dates = this.getNextMonthDays(lastDayOfWeek);
|
||||
const lastDayISO = lastDayOfMonth.isoWeekday();
|
||||
const lastDayOfUserWeek = ((this.firstDayOfWeekISO + 6 - 1) % 7) + 1;
|
||||
|
||||
if (lastDayISO !== lastDayOfUserWeek) {
|
||||
const dates = this.getNextMonthDays(lastDayISO);
|
||||
const nextMonth = this.date.add(1, 'month').format('YYYY-MM');
|
||||
const dateNotesForNextMonth: DateNotesForMonth = await server.get(`special-notes/notes-for-month/${nextMonth}`);
|
||||
|
||||
@@ -477,9 +412,12 @@ export default class CalendarWidget extends RightDropdownButtonWidget {
|
||||
}
|
||||
|
||||
async entitiesReloadedEvent({ loadResults }: EventData<"entitiesReloaded">) {
|
||||
if (!loadResults.getOptionNames().includes("firstDayOfWeek") &&
|
||||
!loadResults.getOptionNames().includes("firstWeekOfYear") &&
|
||||
!loadResults.getOptionNames().includes("minDaysInFirstWeek")) {
|
||||
const WEEK_OPTIONS: (keyof OptionDefinitions)[] = [
|
||||
"firstDayOfWeek",
|
||||
"firstWeekOfYear",
|
||||
"minDaysInFirstWeek",
|
||||
];
|
||||
if (!WEEK_OPTIONS.some(opt => loadResults.getOptionNames().includes(opt))) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ button.global-menu-button {
|
||||
|
||||
.global-menu-button-update-available {
|
||||
position: absolute;
|
||||
right: -30px;
|
||||
inset-inline-end: -30px;
|
||||
bottom: -30px;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
@@ -69,7 +69,7 @@ button.global-menu-button {
|
||||
}
|
||||
|
||||
.global-menu .zoom-buttons {
|
||||
margin-left: 2em;
|
||||
margin-inline-start: 2em;
|
||||
}
|
||||
|
||||
.global-menu .zoom-buttons a {
|
||||
@@ -79,7 +79,7 @@ button.global-menu-button {
|
||||
color: var(--button-text-color);
|
||||
background-color: var(--button-background-color);
|
||||
padding: 3px;
|
||||
margin-left: 3px;
|
||||
margin-inline-start: 3px;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
@@ -88,15 +88,15 @@ button.global-menu-button {
|
||||
}
|
||||
|
||||
.global-menu .zoom-state {
|
||||
margin-left: 5px;
|
||||
margin-right: 5px;
|
||||
margin-inline-start: 5px;
|
||||
margin-inline-end: 5px;
|
||||
}
|
||||
|
||||
.global-menu .dropdown-item .bx {
|
||||
position: relative;
|
||||
top: 3px;
|
||||
font-size: 120%;
|
||||
margin-right: 6px;
|
||||
margin-inline-end: 6px;
|
||||
}
|
||||
|
||||
/* #region Update available */
|
||||
|
||||
@@ -58,7 +58,7 @@ export default function GlobalMenu({ isHorizontalLayout }: { isHorizontalLayout:
|
||||
<KeyboardActionMenuItem command="showHelp" icon="bx bx-help-circle" text={t("global_menu.show_help")} />
|
||||
<KeyboardActionMenuItem command="showCheatsheet" icon="bx bxs-keyboard" text={t("global_menu.show-cheatsheet")} />
|
||||
<MenuItem command="openAboutDialog" icon="bx bx-info-circle" text={t("global_menu.about")} />
|
||||
{isUpdateAvailable && <MenuItem command={() => window.open("https://github.com/TriliumNext/Trilium/releases/latest")} icon="bx bx-sync" text={`Version ${latestVersion} is available, click to download.`} /> }
|
||||
{isUpdateAvailable && <MenuItem command={() => window.open("https://github.com/TriliumNext/Trilium/releases/latest")} icon="bx bx-sync" text={t("global_menu.update_available", { latestVersion })} /> }
|
||||
{!isElectron() && <BrowserOnlyOptions />}
|
||||
</Dropdown>
|
||||
)
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { handleRightToLeftPlacement } from "../../services/utils.js";
|
||||
import BasicWidget from "../basic_widget.js";
|
||||
import { Tooltip, Dropdown } from "bootstrap";
|
||||
type PopoverPlacement = Tooltip.PopoverPlacement;
|
||||
@@ -48,8 +49,8 @@ export default class RightDropdownButtonWidget extends BasicWidget {
|
||||
|
||||
this.$tooltip = this.$widget.find(".tooltip-trigger").attr("title", this.title);
|
||||
this.tooltip = new Tooltip(this.$tooltip[0], {
|
||||
placement: this.settings.titlePlacement,
|
||||
fallbackPlacements: [this.settings.titlePlacement]
|
||||
placement: handleRightToLeftPlacement(this.settings.titlePlacement),
|
||||
fallbackPlacements: [ handleRightToLeftPlacement(this.settings.titlePlacement) ]
|
||||
});
|
||||
|
||||
this.$widget
|
||||
|
||||
@@ -11,7 +11,7 @@ body.zen .close-zen-container {
|
||||
display: block;
|
||||
position: fixed;
|
||||
top: 2px;
|
||||
right: 2px;
|
||||
inset-inline-end: 2px;
|
||||
z-index: 9999;
|
||||
-webkit-app-region: no-drag;
|
||||
}
|
||||
@@ -21,6 +21,6 @@ body.zen.mobile .close-zen-container {
|
||||
}
|
||||
|
||||
body.zen.electron:not(.platform-darwin):not(.native-titlebar) .close-zen-container {
|
||||
left: calc(env(titlebar-area-width) - var(--zen-button-size) - 2px);
|
||||
right: unset;
|
||||
inset-inline-start: calc(env(titlebar-area-width) - var(--zen-button-size) - 2px);
|
||||
inset-inline-end: unset;
|
||||
}
|
||||
@@ -189,6 +189,7 @@ function useViewModeConfig<T extends object>(note: FNote | null | undefined, vie
|
||||
|
||||
useEffect(() => {
|
||||
if (!note || !viewType) return;
|
||||
setViewConfig(undefined);
|
||||
const viewStorage = new ViewModeStorage<T>(note, viewType);
|
||||
viewStorage.restore().then(config => {
|
||||
const storeFn = (config: T) => {
|
||||
|
||||
@@ -63,6 +63,14 @@ export default function Card({
|
||||
setBranchIdToEdit?.(branch.branchId);
|
||||
}, [ setBranchIdToEdit, branch ]);
|
||||
|
||||
const handleKeyDown = useCallback((e: KeyboardEvent) => {
|
||||
if (e.key === "Enter") {
|
||||
api.openNote(note.noteId);
|
||||
} else if (e.key === "F2") {
|
||||
setBranchIdToEdit?.(branch.branchId);
|
||||
}
|
||||
}, [ setBranchIdToEdit, note ]);
|
||||
|
||||
useEffect(() => {
|
||||
editorRef.current?.focus();
|
||||
}, [ isEditing ]);
|
||||
@@ -83,9 +91,11 @@ export default function Card({
|
||||
onDragEnd={handleDragEnd}
|
||||
onContextMenu={handleContextMenu}
|
||||
onClick={!isEditing ? handleOpen : undefined}
|
||||
onKeyDown={handleKeyDown}
|
||||
style={{
|
||||
display: !isVisible ? "none" : undefined
|
||||
}}
|
||||
tabIndex={300}
|
||||
>
|
||||
{!isEditing ? (
|
||||
<>
|
||||
|
||||
@@ -50,6 +50,12 @@ export default function Column({
|
||||
openColumnContextMenu(api, e, column);
|
||||
}, [ api, column ]);
|
||||
|
||||
const handleTitleKeyDown = useCallback((e: KeyboardEvent) => {
|
||||
if (e.key === "F2") {
|
||||
setColumnNameToEdit?.(column);
|
||||
}
|
||||
}, [ column ]);
|
||||
|
||||
/** Allow using mouse wheel to scroll inside card, while also maintaining column horizontal scrolling. */
|
||||
const handleScroll = useCallback((event: JSX.TargetedWheelEvent<HTMLDivElement>) => {
|
||||
const el = event.currentTarget;
|
||||
@@ -82,7 +88,6 @@ export default function Column({
|
||||
onDragOver={isAnyColumnDragging ? handleColumnDragOver : handleDragOver}
|
||||
onDragLeave={handleDragLeave}
|
||||
onDrop={handleDrop}
|
||||
onWheel={handleScroll}
|
||||
style={{
|
||||
display: !isVisible ? "none" : undefined
|
||||
}}
|
||||
@@ -93,6 +98,8 @@ export default function Column({
|
||||
onDragStart={handleColumnDragStart}
|
||||
onDragEnd={handleColumnDragEnd}
|
||||
onContextMenu={handleContextMenu}
|
||||
onKeyDown={handleTitleKeyDown}
|
||||
tabIndex={300}
|
||||
>
|
||||
{!isEditing ? (
|
||||
<>
|
||||
@@ -112,33 +119,35 @@ export default function Column({
|
||||
)}
|
||||
</h3>
|
||||
|
||||
{(columnItems ?? []).map(({ note, branch }, index) => {
|
||||
const showIndicatorBefore = dropPosition?.column === column &&
|
||||
dropPosition.index === index &&
|
||||
draggedCard?.noteId !== note.noteId;
|
||||
<div className="board-column-content" onWheel={handleScroll}>
|
||||
{(columnItems ?? []).map(({ note, branch }, index) => {
|
||||
const showIndicatorBefore = dropPosition?.column === column &&
|
||||
dropPosition.index === index &&
|
||||
draggedCard?.noteId !== note.noteId;
|
||||
|
||||
return (
|
||||
<>
|
||||
{showIndicatorBefore && (
|
||||
<div className="board-drop-placeholder show" />
|
||||
)}
|
||||
<Card
|
||||
key={note.noteId}
|
||||
api={api}
|
||||
note={note}
|
||||
branch={branch}
|
||||
column={column}
|
||||
index={index}
|
||||
isDragging={draggedCard?.noteId === note.noteId}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
})}
|
||||
{dropPosition?.column === column && dropPosition.index === (columnItems?.length ?? 0) && (
|
||||
<div className="board-drop-placeholder show" />
|
||||
)}
|
||||
return (
|
||||
<>
|
||||
{showIndicatorBefore && (
|
||||
<div className="board-drop-placeholder show" />
|
||||
)}
|
||||
<Card
|
||||
key={note.noteId}
|
||||
api={api}
|
||||
note={note}
|
||||
branch={branch}
|
||||
column={column}
|
||||
index={index}
|
||||
isDragging={draggedCard?.noteId === note.noteId}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
})}
|
||||
{dropPosition?.column === column && dropPosition.index === (columnItems?.length ?? 0) && (
|
||||
<div className="board-drop-placeholder show" />
|
||||
)}
|
||||
|
||||
<AddNewItem api={api} column={column} />
|
||||
<AddNewItem api={api} column={column} />
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -146,11 +155,18 @@ export default function Column({
|
||||
function AddNewItem({ column, api }: { column: string, api: BoardApi }) {
|
||||
const [ isCreatingNewItem, setIsCreatingNewItem ] = useState(false);
|
||||
const addItemCallback = useCallback(() => setIsCreatingNewItem(true), []);
|
||||
const handleKeyDown = useCallback((e: KeyboardEvent) => {
|
||||
if (!isCreatingNewItem && e.key === "Enter") {
|
||||
setIsCreatingNewItem(true);
|
||||
}
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<div
|
||||
className={`board-new-item ${isCreatingNewItem ? "editing" : ""}`}
|
||||
onClick={addItemCallback}
|
||||
onKeyDown={handleKeyDown}
|
||||
tabIndex={300}
|
||||
>
|
||||
{!isCreatingNewItem ? (
|
||||
<>
|
||||
|
||||
@@ -23,11 +23,12 @@
|
||||
flex-shrink: 0;
|
||||
border: 2px solid transparent;
|
||||
border-radius: 8px;
|
||||
padding: 0.5em;
|
||||
background-color: var(--accented-background-color);
|
||||
transition: border-color 0.2s ease;
|
||||
overflow-y: auto;
|
||||
max-height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.board-view-container .board-column.drag-over {
|
||||
@@ -37,7 +38,7 @@
|
||||
|
||||
.board-view-container .board-column h3 {
|
||||
font-size: 1em;
|
||||
margin-bottom: 0.75em;
|
||||
margin: 0;
|
||||
padding: 0.5em 0.5em 0.5em 0.5em;
|
||||
border-bottom: 1px solid var(--main-border-color);
|
||||
cursor: grab;
|
||||
@@ -92,12 +93,18 @@
|
||||
|
||||
.board-view-container .board-column .edit-icon {
|
||||
opacity: 0;
|
||||
margin-left: 0.5em;
|
||||
margin-inline-start: 0.5em;
|
||||
transition: opacity 0.2s ease;
|
||||
color: var(--muted-text-color);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.board-view-container .board-column > .board-column-content {
|
||||
flex-grow: 1;
|
||||
overflow: scroll;
|
||||
padding: 0.5em;
|
||||
}
|
||||
|
||||
.board-view-container .board-column h3:hover .edit-icon,
|
||||
.board-view-container .board-note:hover .edit-icon {
|
||||
opacity: 1;
|
||||
@@ -121,6 +128,15 @@
|
||||
font-size: var(--card-font-size);
|
||||
}
|
||||
|
||||
.board-view-container .board-note:first-of-type {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.board-view-container :focus {
|
||||
outline: 3px solid var(--input-focus-outline-color);
|
||||
outline-offset: 0;
|
||||
}
|
||||
|
||||
.board-view-container .board-note {
|
||||
transition: transform 0.2s ease, box-shadow 0.2s ease, opacity 0.15s ease, margin-top 0.2s ease;
|
||||
}
|
||||
@@ -130,14 +146,14 @@
|
||||
}
|
||||
|
||||
.board-view-container .board-note .icon {
|
||||
margin-right: 0.25em;
|
||||
margin-inline-end: 0.25em;
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.board-view-container .board-note > .edit-icon {
|
||||
position: absolute;
|
||||
top: 8px;
|
||||
right: 4px;
|
||||
inset-inline-end: 4px;
|
||||
padding: 2px;
|
||||
background-color: var(--main-background-color);
|
||||
}
|
||||
@@ -149,10 +165,10 @@
|
||||
.board-view-container .board-note:hover > .edit-icon {
|
||||
position: absolute;
|
||||
top: 8px;
|
||||
right: 4px;
|
||||
inset-inline-end: 4px;
|
||||
color: var(--main-text-color);
|
||||
background-color: var(--main-background-color);
|
||||
padding-left: 6px;
|
||||
padding-inline-start: 6px;
|
||||
}
|
||||
|
||||
.board-view-container .board-note.fade-in {
|
||||
@@ -253,7 +269,7 @@
|
||||
}
|
||||
|
||||
.board-new-item .icon {
|
||||
margin-right: 0.25em;
|
||||
margin-inline-end: 0.25em;
|
||||
}
|
||||
|
||||
.board-add-column {
|
||||
@@ -280,7 +296,7 @@
|
||||
}
|
||||
|
||||
.board-add-column .icon {
|
||||
margin-right: 0.5em;
|
||||
margin-inline-end: 0.5em;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
|
||||
@@ -227,10 +227,12 @@ export function TitleEditor({ currentValue, placeholder, save, dismiss, multilin
|
||||
isNewItem?: boolean;
|
||||
}) {
|
||||
const inputRef = useRef<any>(null);
|
||||
const focusElRef = useRef<Element>(null);
|
||||
const dismissOnNextRefreshRef = useRef(false);
|
||||
const shouldDismiss = useRef(false);
|
||||
|
||||
useEffect(() => {
|
||||
focusElRef.current = document.activeElement;
|
||||
inputRef.current?.focus();
|
||||
inputRef.current?.select();
|
||||
}, [ inputRef ]);
|
||||
@@ -254,8 +256,11 @@ export function TitleEditor({ currentValue, placeholder, save, dismiss, multilin
|
||||
onKeyDown={(e: TargetedKeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => {
|
||||
if (e.key === "Enter" || e.key === "Escape") {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
shouldDismiss.current = (e.key === "Escape");
|
||||
e.currentTarget.blur();
|
||||
if (focusElRef.current instanceof HTMLElement) {
|
||||
focusElRef.current.focus();
|
||||
}
|
||||
}
|
||||
}}
|
||||
onBlur={(newValue) => {
|
||||
|
||||
@@ -13,8 +13,8 @@
|
||||
.search-result-widget-content .calendar-view {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
inset-inline-start: 0;
|
||||
inset-inline-end: 0;
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
@@ -67,10 +67,10 @@
|
||||
}
|
||||
|
||||
body.desktop:not(.zen) .calendar-view .calendar-header {
|
||||
padding-right: 5em;
|
||||
padding-inline-end: 5em;
|
||||
}
|
||||
|
||||
.search-result-widget-content .calendar-view .calendar-header {
|
||||
padding-right: unset !important;
|
||||
padding-inline-end: unset !important;
|
||||
}
|
||||
/* #endregion */
|
||||
@@ -3,8 +3,8 @@ import { ViewModeProps } from "../interface";
|
||||
import Calendar from "./calendar";
|
||||
import { useCallback, useEffect, useMemo, useRef, useState } from "preact/hooks";
|
||||
import "./index.css";
|
||||
import { useNoteLabel, useNoteLabelBoolean, useResizeObserver, useSpacedUpdate, useTouchBar, useTriliumEvent, useTriliumOption, useTriliumOptionInt } from "../../react/hooks";
|
||||
import { LOCALE_IDS } from "@triliumnext/commons";
|
||||
import { useNoteLabel, useNoteLabelBoolean, useResizeObserver, useSpacedUpdate, useTriliumEvent, useTriliumOption, useTriliumOptionInt } from "../../react/hooks";
|
||||
import { DISPLAYABLE_LOCALE_IDS } from "@triliumnext/commons";
|
||||
import { Calendar as FullCalendar } from "@fullcalendar/core";
|
||||
import { parseStartEndDateFromEvent, parseStartEndTimeFromEvent } from "./utils";
|
||||
import dialog from "../../../services/dialog";
|
||||
@@ -62,7 +62,7 @@ const CALENDAR_VIEWS = [
|
||||
const SUPPORTED_CALENDAR_VIEW_TYPE = CALENDAR_VIEWS.map(v => v.type);
|
||||
|
||||
// Here we hard-code the imports in order to ensure that they are embedded by webpack without having to load all the languages.
|
||||
export const LOCALE_MAPPINGS: Record<LOCALE_IDS, (() => Promise<{ default: LocaleInput }>) | null> = {
|
||||
export const LOCALE_MAPPINGS: Record<DISPLAYABLE_LOCALE_IDS, (() => Promise<{ default: LocaleInput }>) | null> = {
|
||||
de: () => import("@fullcalendar/core/locales/de"),
|
||||
es: () => import("@fullcalendar/core/locales/es"),
|
||||
fr: () => import("@fullcalendar/core/locales/fr"),
|
||||
@@ -71,9 +71,12 @@ export const LOCALE_MAPPINGS: Record<LOCALE_IDS, (() => Promise<{ default: Local
|
||||
ro: () => import("@fullcalendar/core/locales/ro"),
|
||||
ru: () => import("@fullcalendar/core/locales/ru"),
|
||||
ja: () => import("@fullcalendar/core/locales/ja"),
|
||||
pt: () => import("@fullcalendar/core/locales/pt"),
|
||||
"pt_br": () => import("@fullcalendar/core/locales/pt-br"),
|
||||
uk: () => import("@fullcalendar/core/locales/uk"),
|
||||
en: null
|
||||
en: null,
|
||||
"en_rtl": null,
|
||||
ar: () => import("@fullcalendar/core/locales/ar")
|
||||
};
|
||||
|
||||
export default function CalendarView({ note, noteIds }: ViewModeProps<CalendarViewData>) {
|
||||
|
||||
@@ -36,14 +36,14 @@
|
||||
.geo-map-container .leaflet-div-icon .icon-shadow {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
inset-inline-start: 0;
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
.geo-map-container .leaflet-div-icon .bx {
|
||||
position: absolute;
|
||||
top: 3px;
|
||||
left: 2px;
|
||||
inset-inline-start: 2px;
|
||||
background-color: white;
|
||||
color: black;
|
||||
padding: 2px;
|
||||
@@ -55,7 +55,7 @@
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 50%;
|
||||
inset-inline-start: 50%;
|
||||
transform: translateX(-50%);
|
||||
font-size: 0.75rem;
|
||||
height: 1rem;
|
||||
@@ -68,6 +68,10 @@
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
body[dir=rtl] .geo-map-container .leaflet-div-icon .title-label {
|
||||
transform: translateX(50%);
|
||||
}
|
||||
|
||||
.geo-map-container .leaflet-div-icon .archived {
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import Map from "./map";
|
||||
import "./index.css";
|
||||
import { ViewModeProps } from "../interface";
|
||||
import { useNoteBlob, useNoteLabel, useNoteLabelBoolean, useNoteProperty, useNoteTreeDrag, useSpacedUpdate, useTouchBar, useTriliumEvent } from "../../react/hooks";
|
||||
import { useNoteBlob, useNoteLabel, useNoteLabelBoolean, useNoteProperty, useNoteTreeDrag, useSpacedUpdate, useTriliumEvent } from "../../react/hooks";
|
||||
import { DEFAULT_MAP_LAYER_NAME } from "./map_layer";
|
||||
import { divIcon, GPXOptions, LatLng, LeafletMouseEvent } from "leaflet";
|
||||
import { useCallback, useContext, useEffect, useMemo, useRef, useState } from "preact/hooks";
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user