mirror of
https://github.com/zadam/trilium.git
synced 2025-10-26 07:46:30 +01:00
Compare commits
988 Commits
v0.99.1
...
renovate/m
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4de523f37f | ||
|
|
b0f63c02c9 | ||
|
|
2480509811 | ||
|
|
7872193ed0 | ||
|
|
b8e17959ae | ||
|
|
c16a135efc | ||
|
|
cbc756ba06 | ||
|
|
64daeb0826 | ||
|
|
e15839db47 | ||
|
|
dcdffed003 | ||
|
|
48e85fad43 | ||
|
|
189071deb8 | ||
|
|
354f1d65c1 | ||
|
|
b78893b106 | ||
|
|
9310315c6a | ||
|
|
b3bc0572e5 | ||
|
|
253ce1f223 | ||
|
|
2f3bf94b47 | ||
|
|
d802caa03b | ||
|
|
e69751a8b3 | ||
|
|
0760ea22fb | ||
|
|
8a8f407e99 | ||
|
|
e030dd96da | ||
|
|
01abfc2528 | ||
|
|
042b929dc5 | ||
|
|
ab1d5e31fb | ||
|
|
d073e4c37f | ||
|
|
d60d965a42 | ||
|
|
1c87cfbbd9 | ||
|
|
fee333512a | ||
|
|
38a3f46506 | ||
|
|
bf7506fcd8 | ||
|
|
6fbba426de | ||
|
|
d5bdec13b5 | ||
|
|
cc1b6eb42d | ||
|
|
8baf496f96 | ||
|
|
23a20c4490 | ||
|
|
c8b98f2db6 | ||
|
|
3f36f515db | ||
|
|
892eb5b95d | ||
|
|
62a69a0da0 | ||
|
|
3588e38543 | ||
|
|
41450ab85a | ||
|
|
0526d99560 | ||
|
|
557d576b85 | ||
|
|
041c961cfa | ||
|
|
dcc35bd507 | ||
|
|
09c3e5b56e | ||
|
|
950793377d | ||
|
|
7dac61dc26 | ||
|
|
42dcb8f141 | ||
|
|
43dc8a4b87 | ||
|
|
35316a4c45 | ||
|
|
1366489f99 | ||
|
|
31ee78b1aa | ||
|
|
808ba75ee0 | ||
|
|
ac1399a139 | ||
|
|
1e4793351a | ||
|
|
f502fe41c7 | ||
|
|
0ec0091357 | ||
|
|
0e2196f872 | ||
|
|
32dee254cd | ||
|
|
d4a6a297f4 | ||
|
|
a64d8cd8e2 | ||
|
|
bf4cfb9c02 | ||
|
|
a99dfecf43 | ||
|
|
1530d96eca | ||
|
|
5dc066f4c6 | ||
|
|
1e8f179f81 | ||
|
|
54c906de8d | ||
|
|
114b3ef4d1 | ||
|
|
f6fa1e69b3 | ||
|
|
fcc8086f9c | ||
|
|
7eefff0a74 | ||
|
|
1b842e35ff | ||
|
|
c9021ca742 | ||
|
|
b229ab3c02 | ||
|
|
6825f28ba0 | ||
|
|
5e72f271ea | ||
|
|
9ad6dfd5e9 | ||
|
|
81031673c3 | ||
|
|
1a6423fd36 | ||
|
|
9b872617e6 | ||
|
|
57be2e2474 | ||
|
|
1d65afef53 | ||
|
|
b6385618d1 | ||
|
|
e3d7c7419f | ||
|
|
2a6c295967 | ||
|
|
f5f32df847 | ||
|
|
1f350b2730 | ||
|
|
386992255e | ||
|
|
eb505c4615 | ||
|
|
003d2b5354 | ||
|
|
b452f78242 | ||
|
|
7d1abee8e4 | ||
|
|
d503993a74 | ||
|
|
fe98ba8c8c | ||
|
|
18608ecb34 | ||
|
|
ab6da26a25 | ||
|
|
f95082ccdb | ||
|
|
e94b5ac07a | ||
|
|
5d0669b464 | ||
|
|
af95d85b73 | ||
|
|
aae90ede19 | ||
|
|
0fa1c0f5c4 | ||
|
|
d2b6014b49 | ||
|
|
94d62f810a | ||
|
|
e953f0cc1a | ||
|
|
347da8abde | ||
|
|
5ff07820d3 | ||
|
|
6eccaac4bb | ||
|
|
f5038a08e5 | ||
|
|
d1e6bd9c3a | ||
|
|
7911973a83 | ||
|
|
968b595aec | ||
|
|
704f2c2238 | ||
|
|
f6b86d725c | ||
|
|
a7e0866e0d | ||
|
|
2cb3b877d1 | ||
|
|
0b808b8db3 | ||
|
|
f02af893bb | ||
|
|
cb3f941760 | ||
|
|
93f145a20f | ||
|
|
d34e2a0246 | ||
|
|
9a0b4f67ed | ||
|
|
651e158e3a | ||
|
|
d11784a894 | ||
|
|
14db789b7f | ||
|
|
c4a4995da0 | ||
|
|
45de9da893 | ||
|
|
a6fce1b4c8 | ||
|
|
1d28a5e5b8 | ||
|
|
d4b05fa0a0 | ||
|
|
4bcf209072 | ||
|
|
4b34ae3fd4 | ||
|
|
8590ff1f46 | ||
|
|
c4e2c003de | ||
|
|
eee3aa2bb4 | ||
|
|
ce9f703e0c | ||
|
|
279ccec3ab | ||
|
|
ab3852678e | ||
|
|
65f7aaeee8 | ||
|
|
7a76b9dd0b | ||
|
|
e7b7afabea | ||
|
|
c072c1fd9d | ||
|
|
1f3d9db161 | ||
|
|
62852b8978 | ||
|
|
429767e45c | ||
|
|
87d6771c47 | ||
|
|
68033580a5 | ||
|
|
8a3b6ea694 | ||
|
|
ac269bb51e | ||
|
|
1d583a2d1f | ||
|
|
cdde69cc7c | ||
|
|
9e1e300c72 | ||
|
|
797741c7d0 | ||
|
|
10f844f232 | ||
|
|
5291649c50 | ||
|
|
fc57314905 | ||
|
|
1df0e7b2b0 | ||
|
|
6486c741a2 | ||
|
|
2aa9ddc026 | ||
|
|
d45177042c | ||
|
|
b24dbc6462 | ||
|
|
5dc2630d2a | ||
|
|
800c668962 | ||
|
|
b2955afa61 | ||
|
|
052f4f65cd | ||
|
|
f3df1c2f15 | ||
|
|
272ac1b990 | ||
|
|
c4af60480a | ||
|
|
ef94033908 | ||
|
|
78bb10b1df | ||
|
|
43ac3ac0fe | ||
|
|
bdc274ebba | ||
|
|
2baaf12d24 | ||
|
|
11e2632b61 | ||
|
|
70bc09b306 | ||
|
|
0f73cbeec3 | ||
|
|
ac28411b36 | ||
|
|
1dbfe0950b | ||
|
|
f02c499168 | ||
|
|
f9db642abb | ||
|
|
bd243e36e5 | ||
|
|
deb7eb4476 | ||
|
|
f64d52e9ca | ||
|
|
dddbbe64ea | ||
|
|
adfb268dd6 | ||
|
|
bc0750947e | ||
|
|
ad8135c2a9 | ||
|
|
bcb2daf9b6 | ||
|
|
8fc7a20220 | ||
|
|
00720ae58f | ||
|
|
51f559b332 | ||
|
|
a7a8f806e8 | ||
|
|
25e1c45562 | ||
|
|
d90e02d8f4 | ||
|
|
d4a46ed4da | ||
|
|
a664a58076 | ||
|
|
ca2cc38bad | ||
|
|
1c6b3fba03 | ||
|
|
77b0d541b1 | ||
|
|
e72dc5c5c3 | ||
|
|
d81fcef1f3 | ||
|
|
77ac0bfbdd | ||
|
|
434e3f6035 | ||
|
|
0d2dc86fb9 | ||
|
|
fa57966b01 | ||
|
|
29682cef49 | ||
|
|
b224267e3b | ||
|
|
6d09c7116f | ||
|
|
f36535d061 | ||
|
|
95987d474d | ||
|
|
1d8b55be5e | ||
|
|
5d66b7e66f | ||
|
|
f8066417d9 | ||
|
|
ee9c3f49da | ||
|
|
3743fff21c | ||
|
|
8939fac447 | ||
|
|
c7224bc0d1 | ||
|
|
929eee1350 | ||
|
|
e904feb179 | ||
|
|
44c379fce1 | ||
|
|
0ea7e9fc04 | ||
|
|
66896d6457 | ||
|
|
fffb8317cb | ||
|
|
cc09a450c9 | ||
|
|
04f6777627 | ||
|
|
3daa39cff8 | ||
|
|
8c6a497b79 | ||
|
|
274e1440d4 | ||
|
|
2cd6c01d1e | ||
|
|
0ce8fa1115 | ||
|
|
73c35111e0 | ||
|
|
942125d236 | ||
|
|
2296e5a089 | ||
|
|
453c29c160 | ||
|
|
e0aa49b36d | ||
|
|
551e54a958 | ||
|
|
acae069b9e | ||
|
|
29d6784c59 | ||
|
|
e6c8f238f9 | ||
|
|
e069d87fe8 | ||
|
|
1ae32c4547 | ||
|
|
7c08864444 | ||
|
|
74c26b42da | ||
|
|
f0fa55715c | ||
|
|
1514432f77 | ||
|
|
08d2cc2ae5 | ||
|
|
7a0a3182eb | ||
|
|
f6bd7035e6 | ||
|
|
7c7de37cfc | ||
|
|
ddbf12fa70 | ||
|
|
a63254ab12 | ||
|
|
9499e68132 | ||
|
|
2edf7c6fae | ||
|
|
593a415d2a | ||
|
|
d71250b38b | ||
|
|
994a9de378 | ||
|
|
7e6c391dc5 | ||
|
|
6cbac06267 | ||
|
|
07677b2784 | ||
|
|
21fcc544fd | ||
|
|
f88c0415af | ||
|
|
7ddecf3253 | ||
|
|
7fbff43f17 | ||
|
|
89de946254 | ||
|
|
7d521218cf | ||
|
|
bb7cde786f | ||
|
|
2d2e52f47b | ||
|
|
51e8c25236 | ||
|
|
f1774efce8 | ||
|
|
5d40921a38 | ||
|
|
b7f39899c0 | ||
|
|
e5db40c789 | ||
|
|
82d2894f5c | ||
|
|
b6284b1830 | ||
|
|
9b998a5b00 | ||
|
|
6d4a213800 | ||
|
|
bfcd11988b | ||
|
|
6e692afa1c | ||
|
|
f31be66730 | ||
|
|
d87fa7a7ed | ||
|
|
380b14d7df | ||
|
|
678018585f | ||
|
|
5957ce26f1 | ||
|
|
3cf7e709fc | ||
|
|
d1854d85ce | ||
|
|
fb0c3be7fa | ||
|
|
6404b2c7fd | ||
|
|
921dfe9cc5 | ||
|
|
c5abeafc70 | ||
|
|
de9314a271 | ||
|
|
d999d60302 | ||
|
|
61bdcf2a53 | ||
|
|
c160ab4721 | ||
|
|
76c337602b | ||
|
|
64576458b7 | ||
|
|
89dac52f49 | ||
|
|
44b9c6e0f6 | ||
|
|
c58c18d688 | ||
|
|
e04bd36dfe | ||
|
|
1aad2d8c09 | ||
|
|
75a79775f4 | ||
|
|
c95577c478 | ||
|
|
e0614d14f3 | ||
|
|
5b75d20c80 | ||
|
|
87f1cb23be | ||
|
|
f079c7aad2 | ||
|
|
21581c78f9 | ||
|
|
49cd8b2a24 | ||
|
|
b0234a75f8 | ||
|
|
df176c4e4a | ||
|
|
750c4104f7 | ||
|
|
55fde593a3 | ||
|
|
f6d7ecab40 | ||
|
|
0ae5270f5b | ||
|
|
a59f5ebc24 | ||
|
|
e374b31a1c | ||
|
|
177577e80f | ||
|
|
0390fadf34 | ||
|
|
93c7b8dea7 | ||
|
|
e416caffe3 | ||
|
|
62855f4bb1 | ||
|
|
2b460be63a | ||
|
|
54724b8c58 | ||
|
|
e83eacb18b | ||
|
|
63bcd80375 | ||
|
|
fac31ff8be | ||
|
|
0d94ae9f61 | ||
|
|
e5c7feb2aa | ||
|
|
27cc858b67 | ||
|
|
bfa1c2a2dd | ||
|
|
c04c38e61d | ||
|
|
82f4ea2dea | ||
|
|
0c3d225379 | ||
|
|
7e6231698c | ||
|
|
13f2061e75 | ||
|
|
e188702df8 | ||
|
|
566ff95540 | ||
|
|
d7a0255185 | ||
|
|
d10a4aed6a | ||
|
|
3e99648fb6 | ||
|
|
c7c8300979 | ||
|
|
70ff36a281 | ||
|
|
c5b878965b | ||
|
|
3e5cb7c423 | ||
|
|
addd8dc78d | ||
|
|
3ff5ba79f6 | ||
|
|
ceedcb1a2c | ||
|
|
9403ea2028 | ||
|
|
0f52e42017 | ||
|
|
7ce223451c | ||
|
|
cb275e5031 | ||
|
|
3194d848e1 | ||
|
|
3ec7ccd6dc | ||
|
|
bf53744609 | ||
|
|
0dd8be1599 | ||
|
|
d9b4f7345b | ||
|
|
bbda8d3357 | ||
|
|
f377df32ed | ||
|
|
3f3b8893a3 | ||
|
|
45a93d58c9 | ||
|
|
55b16872e4 | ||
|
|
cbba8e6933 | ||
|
|
867215c276 | ||
|
|
fba15ff16e | ||
|
|
8424c6d615 | ||
|
|
82bb86036e | ||
|
|
e6faac07c3 | ||
|
|
464aa71efb | ||
|
|
7b88d89868 | ||
|
|
5b1a066e2c | ||
|
|
4c4e5750ef | ||
|
|
cbd06b81ff | ||
|
|
9cc5b98551 | ||
|
|
cd6b4f2428 | ||
|
|
e3178f6984 | ||
|
|
460d168d37 | ||
|
|
085b6fb0d0 | ||
|
|
b7f43e06e4 | ||
|
|
b728e1b288 | ||
|
|
fe7e301797 | ||
|
|
1ccbedd91d | ||
|
|
1e9bcf28c9 | ||
|
|
44b6533ceb | ||
|
|
489a6ec2b1 | ||
|
|
9713fa3bab | ||
|
|
519df30590 | ||
|
|
1f44c36590 | ||
|
|
6a738d12b7 | ||
|
|
56d5db79a9 | ||
|
|
be31fe310e | ||
|
|
f9a009c446 | ||
|
|
307591e9c1 | ||
|
|
414121d422 | ||
|
|
2f49d315c1 | ||
|
|
2d7f4290b7 | ||
|
|
d27d9bf7dc | ||
|
|
0a72133ca3 | ||
|
|
5d8ca1ecf7 | ||
|
|
04eeb28c09 | ||
|
|
88689f2987 | ||
|
|
60cee1f7dc | ||
|
|
7c2c89d4e2 | ||
|
|
8a86fdcd43 | ||
|
|
d801d8a053 | ||
|
|
6c4dcc6486 | ||
|
|
f9a24bf601 | ||
|
|
113061902e | ||
|
|
96f5b55d9f | ||
|
|
90e5193a97 | ||
|
|
c2d2ecc1d5 | ||
|
|
6ba729fd52 | ||
|
|
c8926a768c | ||
|
|
253ef633dc | ||
|
|
0958204779 | ||
|
|
5d961e1a9a | ||
|
|
4abd32b032 | ||
|
|
ca5ffd64ab | ||
|
|
b6788298b5 | ||
|
|
2aad4ce81b | ||
|
|
11ef486a70 | ||
|
|
dee22c4de9 | ||
|
|
54ea785a60 | ||
|
|
e5b18da35c | ||
|
|
2094ceab26 | ||
|
|
04c24fa64c | ||
|
|
02ed73828a | ||
|
|
278b889a4d | ||
|
|
487433f454 | ||
|
|
01442a93c5 | ||
|
|
18ad595300 | ||
|
|
022dbe78a2 | ||
|
|
856951690d | ||
|
|
4a359ffa0e | ||
|
|
ea0da91dbd | ||
|
|
24809d8bf5 | ||
|
|
b5f0aed7f4 | ||
|
|
f085e8048d | ||
|
|
6e1a502057 | ||
|
|
8af811ddcf | ||
|
|
e94f9ff0d9 | ||
|
|
5380945e3b | ||
|
|
fa976b63b3 | ||
|
|
b751175b95 | ||
|
|
79ffa17641 | ||
|
|
319e753e7e | ||
|
|
f9c0b94ecb | ||
|
|
be076a6609 | ||
|
|
55f9a3712c | ||
|
|
7f074390af | ||
|
|
3c5e0855d7 | ||
|
|
f33fe4266a | ||
|
|
4d772ab48d | ||
|
|
66ba4a596c | ||
|
|
c8b7322f1e | ||
|
|
b1babd62aa | ||
|
|
502e9b86bc | ||
|
|
c71cab4951 | ||
|
|
c5e68c8e80 | ||
|
|
a2f0ec6445 | ||
|
|
0c971cd4cc | ||
|
|
7ed82f9527 | ||
|
|
8a85edf2db | ||
|
|
3495ed82fb | ||
|
|
cd7a1af729 | ||
|
|
89c81f74b4 | ||
|
|
b9db6128cf | ||
|
|
8f9ee3c1a9 | ||
|
|
15fc98fca1 | ||
|
|
9f993363d7 | ||
|
|
9281cc9290 | ||
|
|
1a000fdb33 | ||
|
|
f9754cd82d | ||
|
|
6ba4b063f6 | ||
|
|
ecf29fa0e8 | ||
|
|
499c190632 | ||
|
|
c736fba1b7 | ||
|
|
b6045e0831 | ||
|
|
343f103126 | ||
|
|
56b8381680 | ||
|
|
e9aa37d049 | ||
|
|
81b2b18eb7 | ||
|
|
79a31421a4 | ||
|
|
92e43f5210 | ||
|
|
025f22553f | ||
|
|
e0e791d9b4 | ||
|
|
d9906a4a47 | ||
|
|
1e377df6da | ||
|
|
48c7411ce4 | ||
|
|
d4fa6153c4 | ||
|
|
210e001586 | ||
|
|
4b4d128856 | ||
|
|
9411f44e33 | ||
|
|
9ba6f0c202 | ||
|
|
33e22b6b94 | ||
|
|
6bf9caa253 | ||
|
|
508eb9e379 | ||
|
|
fcf6af2a4f | ||
|
|
772ff2d8e6 | ||
|
|
e8946d8d5e | ||
|
|
eb47170c7f | ||
|
|
8268a28997 | ||
|
|
c082b5eb38 | ||
|
|
46901cf3fb | ||
|
|
93af4f24e5 | ||
|
|
0cc05a8cba | ||
|
|
5fd7896e1e | ||
|
|
c5d494fbee | ||
|
|
400ff05a0b | ||
|
|
944b6993fa | ||
|
|
17f4e2a14a | ||
|
|
fcbcef8766 | ||
|
|
d7b085cfa0 | ||
|
|
bde658d2ac | ||
|
|
c9ae1445a4 | ||
|
|
e6a88ddb04 | ||
|
|
b3abd479ad | ||
|
|
755ec9ce96 | ||
|
|
db260547ad | ||
|
|
439e796074 | ||
|
|
04c0cdb048 | ||
|
|
5951072f03 | ||
|
|
7b24f7f57d | ||
|
|
8ef88f5e83 | ||
|
|
a68e4bdbec | ||
|
|
dd9d13b175 | ||
|
|
5693b59318 | ||
|
|
0c2b186e50 | ||
|
|
1cc0e686ea | ||
|
|
fa017fde62 | ||
|
|
067383a87d | ||
|
|
7e871c3b04 | ||
|
|
e0ef8bf1aa | ||
|
|
3c1f7baaae | ||
|
|
e992744101 | ||
|
|
f29b50ae41 | ||
|
|
ae1c5ebe47 | ||
|
|
140efce96f | ||
|
|
7c618ff33b | ||
|
|
555bda98d7 | ||
|
|
198308cd2a | ||
|
|
a5bdadd1f2 | ||
|
|
c968c13ae4 | ||
|
|
0022a135f6 | ||
|
|
893ab4539b | ||
|
|
502c60884d | ||
|
|
8788079599 | ||
|
|
d5c0134897 | ||
|
|
794521dcbd | ||
|
|
b475efb2d4 | ||
|
|
f1143c96c5 | ||
|
|
5aca1e72df | ||
|
|
b7f128ed20 | ||
|
|
a2345239d4 | ||
|
|
7f75e2738e | ||
|
|
8719cc414a | ||
|
|
32ea4844d2 | ||
|
|
71ac47b930 | ||
|
|
44ac3fb81f | ||
|
|
7e67cbdbc6 | ||
|
|
c4ea93f663 | ||
|
|
495415e631 | ||
|
|
499d07b713 | ||
|
|
ef01e3a363 | ||
|
|
9cebae5fd9 | ||
|
|
620748c7fc | ||
|
|
5cf3975686 | ||
|
|
4b054db235 | ||
|
|
fa66baa20b | ||
|
|
fb78807a02 | ||
|
|
0ac4b87ffb | ||
|
|
3a406a0de0 | ||
|
|
82f5fb3195 | ||
|
|
7ccf0428d6 | ||
|
|
fb2de3d149 | ||
|
|
754c2980f8 | ||
|
|
f89b1bd2e4 | ||
|
|
9bc91b31d3 | ||
|
|
08efa10f95 | ||
|
|
6aa21397e0 | ||
|
|
b98bde5eed | ||
|
|
a9def845df | ||
|
|
bf6d0e128f | ||
|
|
ccd4bf553b | ||
|
|
f83ce81cc8 | ||
|
|
b1715b60fb | ||
|
|
0b7e8e8efc | ||
|
|
6b7c71ba18 | ||
|
|
a072920f80 | ||
|
|
2ffda9e8ef | ||
|
|
04c4257dee | ||
|
|
e892b79f10 | ||
|
|
ab98e86fde | ||
|
|
cce927b6ec | ||
|
|
c7a9e585f8 | ||
|
|
7a44bdbe87 | ||
|
|
5c51891959 | ||
|
|
b003033f87 | ||
|
|
d87f626975 | ||
|
|
8d3c64dc54 | ||
|
|
86bc4a6046 | ||
|
|
fcc2e00f03 | ||
|
|
a68f351797 | ||
|
|
a95a2ea7dc | ||
|
|
fba51f2cd0 | ||
|
|
6fd37c4c8d | ||
|
|
2ef4aeb884 | ||
|
|
016ba1e617 | ||
|
|
51b00a5407 | ||
|
|
c28cf4da16 | ||
|
|
2b915a1217 | ||
|
|
d978c38b80 | ||
|
|
b129349236 | ||
|
|
d20ebd6b2d | ||
|
|
b9e1b46884 | ||
|
|
828ad79de2 | ||
|
|
d45e3a7a43 | ||
|
|
296b63d855 | ||
|
|
1fb95c5128 | ||
|
|
3b5c253672 | ||
|
|
3dcd176f35 | ||
|
|
e4d673e14e | ||
|
|
38c9b64bec | ||
|
|
fd11b34fe1 | ||
|
|
4f568d2870 | ||
|
|
36f5060855 | ||
|
|
5071f61174 | ||
|
|
985a54edd1 | ||
|
|
8c1914359a | ||
|
|
ef225704c3 | ||
|
|
1d95205503 | ||
|
|
6d5ff42225 | ||
|
|
41e395f1d7 | ||
|
|
901bbfeeaf | ||
|
|
2daa991c9d | ||
|
|
4a0afe68e9 | ||
|
|
22e6b96daa | ||
|
|
dcb086d203 | ||
|
|
f185eb1f5a | ||
|
|
0a6325cf8e | ||
|
|
a3cc54e199 | ||
|
|
804fd35774 | ||
|
|
e4b8c8caa2 | ||
|
|
5c2f5e92eb | ||
|
|
76ad386c70 | ||
|
|
c6b2044492 | ||
|
|
4a953fad72 | ||
|
|
f06d8f27a1 | ||
|
|
ffd4201a73 | ||
|
|
bc529e7089 | ||
|
|
f143cac61e | ||
|
|
e7657d4eb1 | ||
|
|
b6ad98e9ff | ||
|
|
128120ad12 | ||
|
|
efa8fef4cf | ||
|
|
f5db38950a | ||
|
|
d187da46a0 | ||
|
|
fb2afb5794 | ||
|
|
6fe261836e | ||
|
|
fc9f2bceb0 | ||
|
|
ce88afee1b | ||
|
|
07eb3f64e3 | ||
|
|
e32ba61a3c | ||
|
|
43e66fa4a6 | ||
|
|
ee9de82203 | ||
|
|
df3baf1a67 | ||
|
|
6968d213bd | ||
|
|
ffaa011c3e | ||
|
|
d56debaa9f | ||
|
|
2c71e995f2 | ||
|
|
4da47979d1 | ||
|
|
2751aecab9 | ||
|
|
1dccb6da31 | ||
|
|
8557bad242 | ||
|
|
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 | ||
|
|
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 | ||
|
|
b8851565eb | ||
|
|
888d0d1084 | ||
|
|
0a25d4db0d | ||
|
|
d483b6e840 | ||
|
|
a1ef80f5ae | ||
|
|
d9a350a003 | ||
|
|
3b9bb98d8d | ||
|
|
87e7449da2 | ||
|
|
a2c8695a6d | ||
|
|
2f74e84777 | ||
|
|
db9591a011 | ||
|
|
e56e29fd64 | ||
|
|
06e4a8bc50 | ||
|
|
d4a1905e73 | ||
|
|
bc583b0ceb | ||
|
|
d5b8666dee | ||
|
|
905e311e42 | ||
|
|
d3d4c88b47 | ||
|
|
7cdad71a8e | ||
|
|
4e2b331ba0 | ||
|
|
f0c0c6ec67 | ||
|
|
57656efacc | ||
|
|
a8b26cbe27 | ||
|
|
1c9ffe5378 | ||
|
|
47d3bb7575 | ||
|
|
03d6cb58db | ||
|
|
5d0f64db46 | ||
|
|
76a973ac8a | ||
|
|
0491f27d55 | ||
|
|
3caa7fcfa5 | ||
|
|
bfdb3caa50 | ||
|
|
f815c2ff8d | ||
|
|
7c654903f6 | ||
|
|
27bfaba5ec | ||
|
|
c2548cb4fa | ||
|
|
086fe79dd9 | ||
|
|
e8dfce7421 | ||
|
|
c55da9de12 | ||
|
|
ed5763d89a | ||
|
|
e49912e83c | ||
|
|
0b90bf460a | ||
|
|
cf5f5476df | ||
|
|
a12ba57de7 | ||
|
|
4574a233e6 | ||
|
|
6e9ebf75ad | ||
|
|
1e720d4810 | ||
|
|
2e2c20f8a3 | ||
|
|
f1b976d4e4 | ||
|
|
071e8a0cc1 | ||
|
|
c0006e961b | ||
|
|
7754829e1a | ||
|
|
a752e75409 | ||
|
|
61a9706b6a | ||
|
|
12a510c9c8 | ||
|
|
936d274f5a | ||
|
|
42fac91aed | ||
|
|
b934045cbd | ||
|
|
b77ebedf78 | ||
|
|
3c09f27676 | ||
|
|
c545a4c685 | ||
|
|
9f0c5bf123 | ||
|
|
22a1c4cc65 | ||
|
|
dcd51d64fb | ||
|
|
92f95e7288 | ||
|
|
31cbe99224 | ||
|
|
45aad74b01 | ||
|
|
f1b8a1b7f2 | ||
|
|
4356adcdfe | ||
|
|
8c1d9c27c2 | ||
|
|
52c593c54e | ||
|
|
977615aa2b | ||
|
|
58cc1280ce | ||
|
|
eaeb2f1bb2 | ||
|
|
f1d912e4bd | ||
|
|
7c3619675a |
2
.github/actions/build-server/action.yml
vendored
2
.github/actions/build-server/action.yml
vendored
@@ -10,7 +10,7 @@ runs:
|
||||
steps:
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Set up node & dependencies
|
||||
uses: actions/setup-node@v5
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: 22
|
||||
cache: "pnpm"
|
||||
|
||||
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}}"
|
||||
|
||||
5
.github/workflows/deploy-docs.yml
vendored
5
.github/workflows/deploy-docs.yml
vendored
@@ -55,7 +55,7 @@ jobs:
|
||||
- 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'
|
||||
|
||||
@@ -72,7 +72,7 @@ jobs:
|
||||
|
||||
# Setup Node.js with pnpm
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v5
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '22'
|
||||
cache: 'pnpm'
|
||||
@@ -118,6 +118,7 @@ jobs:
|
||||
|
||||
- name: Deploy
|
||||
uses: ./.github/actions/deploy-to-cloudflare-pages
|
||||
if: github.repository == ${{ vars.REPO_MAIN }}
|
||||
with:
|
||||
project_name: "trilium-docs"
|
||||
comment_body: "📚 Documentation preview is ready"
|
||||
|
||||
2
.github/workflows/dev.yml
vendored
2
.github/workflows/dev.yml
vendored
@@ -28,7 +28,7 @@ jobs:
|
||||
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Set up node & dependencies
|
||||
uses: actions/setup-node@v5
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: 22
|
||||
cache: "pnpm"
|
||||
|
||||
12
.github/workflows/main-docker.yml
vendored
12
.github/workflows/main-docker.yml
vendored
@@ -44,7 +44,7 @@ jobs:
|
||||
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Set up node & dependencies
|
||||
uses: actions/setup-node@v5
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: 22
|
||||
cache: "pnpm"
|
||||
@@ -86,12 +86,12 @@ jobs:
|
||||
|
||||
- name: Upload Playwright trace
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: Playwright trace (${{ matrix.dockerfile }})
|
||||
path: test-output/playwright/output
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
- uses: actions/upload-artifact@v5
|
||||
if: ${{ !cancelled() }}
|
||||
with:
|
||||
name: Playwright report (${{ matrix.dockerfile }})
|
||||
@@ -144,7 +144,7 @@ jobs:
|
||||
uses: actions/checkout@v5
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Set up node & dependencies
|
||||
uses: actions/setup-node@v5
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: 22
|
||||
cache: 'pnpm'
|
||||
@@ -209,7 +209,7 @@ jobs:
|
||||
touch "/tmp/digests/${digest#sha256:}"
|
||||
|
||||
- name: Upload digest
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: digests-${{ env.PLATFORM_PAIR }}-${{ matrix.dockerfile }}
|
||||
path: /tmp/digests/*
|
||||
@@ -223,7 +223,7 @@ jobs:
|
||||
- build
|
||||
steps:
|
||||
- name: Download digests
|
||||
uses: actions/download-artifact@v5
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
path: /tmp/digests
|
||||
pattern: digests-*
|
||||
|
||||
8
.github/workflows/nightly.yml
vendored
8
.github/workflows/nightly.yml
vendored
@@ -50,7 +50,7 @@ jobs:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Set up node & dependencies
|
||||
uses: actions/setup-node@v5
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: 22
|
||||
cache: 'pnpm'
|
||||
@@ -77,7 +77,7 @@ jobs:
|
||||
GPG_SIGNING_KEY: ${{ secrets.GPG_SIGN_KEY }}
|
||||
|
||||
- name: Publish release
|
||||
uses: softprops/action-gh-release@v2.3.4
|
||||
uses: softprops/action-gh-release@v2.4.1
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
with:
|
||||
make_latest: false
|
||||
@@ -89,7 +89,7 @@ jobs:
|
||||
name: Nightly Build
|
||||
|
||||
- name: Publish artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v5
|
||||
if: ${{ github.event_name == 'pull_request' }}
|
||||
with:
|
||||
name: TriliumNotes ${{ matrix.os.name }} ${{ matrix.arch }}
|
||||
@@ -118,7 +118,7 @@ jobs:
|
||||
arch: ${{ matrix.arch }}
|
||||
|
||||
- name: Publish release
|
||||
uses: softprops/action-gh-release@v2.3.4
|
||||
uses: softprops/action-gh-release@v2.4.1
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
with:
|
||||
make_latest: false
|
||||
|
||||
4
.github/workflows/playwright.yml
vendored
4
.github/workflows/playwright.yml
vendored
@@ -22,7 +22,7 @@ jobs:
|
||||
fetch-depth: 0
|
||||
|
||||
- uses: pnpm/action-setup@v4
|
||||
- uses: actions/setup-node@v5
|
||||
- uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: 22
|
||||
cache: 'pnpm'
|
||||
@@ -35,7 +35,7 @@ jobs:
|
||||
|
||||
- name: Upload test report
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: e2e report
|
||||
path: apps/server-e2e/test-output
|
||||
|
||||
10
.github/workflows/release.yml
vendored
10
.github/workflows/release.yml
vendored
@@ -48,7 +48,7 @@ jobs:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Set up node & dependencies
|
||||
uses: actions/setup-node@v5
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: 22
|
||||
cache: 'pnpm'
|
||||
@@ -73,7 +73,7 @@ jobs:
|
||||
GPG_SIGNING_KEY: ${{ secrets.GPG_SIGN_KEY }}
|
||||
|
||||
- name: Upload the artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: release-desktop-${{ matrix.os.name }}-${{ matrix.arch }}
|
||||
path: apps/desktop/upload/*.*
|
||||
@@ -100,7 +100,7 @@ jobs:
|
||||
arch: ${{ matrix.arch }}
|
||||
|
||||
- name: Upload the artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: release-server-linux-${{ matrix.arch }}
|
||||
path: upload/*.*
|
||||
@@ -120,14 +120,14 @@ jobs:
|
||||
docs/Release Notes
|
||||
|
||||
- name: Download all artifacts
|
||||
uses: actions/download-artifact@v5
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
merge-multiple: true
|
||||
pattern: release-*
|
||||
path: upload
|
||||
|
||||
- name: Publish stable release
|
||||
uses: softprops/action-gh-release@v2.3.4
|
||||
uses: softprops/action-gh-release@v2.4.1
|
||||
with:
|
||||
draft: false
|
||||
body_path: docs/Release Notes/Release Notes/${{ github.ref_name }}.md
|
||||
|
||||
5
.github/workflows/website.yml
vendored
5
.github/workflows/website.yml
vendored
@@ -11,6 +11,9 @@ on:
|
||||
paths:
|
||||
- "apps/website/**"
|
||||
|
||||
release:
|
||||
types: [ released ]
|
||||
|
||||
jobs:
|
||||
build-and-deploy:
|
||||
runs-on: ubuntu-latest
|
||||
@@ -25,7 +28,7 @@ jobs:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Set up node & dependencies
|
||||
uses: actions/setup-node@v5
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: 22
|
||||
cache: "pnpm"
|
||||
|
||||
1
.vscode/i18n-ally-custom-framework.yml
vendored
1
.vscode/i18n-ally-custom-framework.yml
vendored
@@ -14,6 +14,7 @@ usageMatchRegex:
|
||||
# the `{key}` will be placed by a proper keypath matching regex,
|
||||
# you can ignore it and use your own matching rules as well
|
||||
- "[^\\w\\d]t\\(['\"`]({key})['\"`]"
|
||||
- <Trans\s*i18nKey="({key})"[^>]*>
|
||||
|
||||
# A RegEx to set a custom scope range. This scope will be used as a prefix when detecting keys
|
||||
# and works like how the i18next framework identifies the namespace scope from the
|
||||
|
||||
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@@ -5,7 +5,8 @@
|
||||
"i18n-ally.keystyle": "nested",
|
||||
"i18n-ally.localesPaths": [
|
||||
"apps/server/src/assets/translations",
|
||||
"apps/client/src/translations"
|
||||
"apps/client/src/translations",
|
||||
"apps/website/public/translations"
|
||||
],
|
||||
"npm.exclude": [
|
||||
"**/dist",
|
||||
|
||||
17
README.md
17
README.md
@@ -1,3 +1,14 @@
|
||||
<div align="center">
|
||||
<sup>Special thanks to:</sup><br />
|
||||
<a href="https://go.warp.dev/Trilium" target="_blank">
|
||||
<img alt="Warp sponsorship" width="400" src="https://github.com/warpdotdev/brand-assets/blob/main/Github/Sponsor/Warp-Github-LG-03.png"><br />
|
||||
Warp, built for coding with multiple AI agents<br />
|
||||
</a>
|
||||
<sup>Available for macOS, Linux and Windows</sup>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
# Trilium Notes
|
||||
|
||||
 
|
||||
@@ -13,6 +24,10 @@ See [screenshots](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) for q
|
||||
|
||||
<a href="https://triliumnext.github.io/Docs/Wiki/screenshot-tour"><img src="./docs/app.png" alt="Trilium Screenshot" width="1000"></a>
|
||||
|
||||
## ⏬ Download
|
||||
- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – stable version, recommended for most users.
|
||||
- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – unstable development version, updated daily with the latest features and fixes.
|
||||
|
||||
## 📚 Documentation
|
||||
|
||||
**Visit our comprehensive documentation at [docs.triliumnotes.org](https://docs.triliumnotes.org/)**
|
||||
@@ -167,7 +182,7 @@ Please view the [documentation guide](https://github.com/TriliumNext/Trilium/blo
|
||||
## 👏 Shoutouts
|
||||
|
||||
* [zadam](https://github.com/zadam) for the original concept and implementation of the application.
|
||||
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
|
||||
* [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.
|
||||
|
||||
@@ -35,22 +35,22 @@
|
||||
"chore:generate-openapi": "tsx bin/generate-openapi.js"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@playwright/test": "1.55.1",
|
||||
"@stylistic/eslint-plugin": "5.4.0",
|
||||
"@playwright/test": "1.56.1",
|
||||
"@stylistic/eslint-plugin": "5.5.0",
|
||||
"@types/express": "5.0.3",
|
||||
"@types/node": "22.18.8",
|
||||
"@types/yargs": "17.0.33",
|
||||
"@vitest/coverage-v8": "3.2.4",
|
||||
"eslint": "9.37.0",
|
||||
"@types/node": "22.18.12",
|
||||
"@types/yargs": "17.0.34",
|
||||
"@vitest/coverage-v8": "4.0.3",
|
||||
"eslint": "9.38.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",
|
||||
"tslib": "2.8.1",
|
||||
"typedoc": "0.28.13",
|
||||
"typedoc-plugin-missing-exports": "4.1.0"
|
||||
"typedoc": "0.28.14",
|
||||
"typedoc-plugin-missing-exports": "4.1.2"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"appdmg": "0.6.6"
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import type child_process from "child_process";
|
||||
import { describe, beforeAll, afterAll } from "vitest";
|
||||
|
||||
let etapiAuthToken: string | undefined;
|
||||
@@ -12,8 +11,6 @@ type SpecDefinitionsFunc = () => void;
|
||||
|
||||
function describeEtapi(description: string, specDefinitions: SpecDefinitionsFunc): void {
|
||||
describe(description, () => {
|
||||
let appProcess: ReturnType<typeof child_process.spawn>;
|
||||
|
||||
beforeAll(async () => {});
|
||||
|
||||
afterAll(() => {});
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@triliumnext/client",
|
||||
"version": "0.99.1",
|
||||
"version": "0.99.3",
|
||||
"description": "JQuery-based client for TriliumNext, used for both web and desktop (via Electron)",
|
||||
"private": true,
|
||||
"license": "AGPL-3.0-only",
|
||||
@@ -15,7 +15,7 @@
|
||||
"circular-deps": "dpdm -T src/**/*.ts --tree=false --warning=false --skip-dynamic-imports=circular"
|
||||
},
|
||||
"dependencies": {
|
||||
"@eslint/js": "9.37.0",
|
||||
"@eslint/js": "9.38.0",
|
||||
"@excalidraw/excalidraw": "0.18.0",
|
||||
"@fullcalendar/core": "6.1.19",
|
||||
"@fullcalendar/daygrid": "6.1.19",
|
||||
@@ -32,33 +32,35 @@
|
||||
"@triliumnext/commons": "workspace:*",
|
||||
"@triliumnext/highlightjs": "workspace:*",
|
||||
"@triliumnext/share-theme": "workspace:*",
|
||||
"@triliumnext/split.js": "workspace:*",
|
||||
"autocomplete.js": "0.38.1",
|
||||
"bootstrap": "5.3.8",
|
||||
"boxicons": "2.1.4",
|
||||
"color": "5.0.2",
|
||||
"dayjs": "1.11.18",
|
||||
"dayjs-plugin-utc": "0.1.2",
|
||||
"debounce": "2.2.0",
|
||||
"draggabilly": "3.0.0",
|
||||
"force-graph": "1.51.0",
|
||||
"globals": "16.4.0",
|
||||
"i18next": "25.5.3",
|
||||
"i18next": "25.6.0",
|
||||
"i18next-http-backend": "3.0.2",
|
||||
"jquery": "3.7.1",
|
||||
"jquery.fancytree": "2.38.5",
|
||||
"jsplumb": "2.15.6",
|
||||
"katex": "0.16.23",
|
||||
"katex": "0.16.25",
|
||||
"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.1",
|
||||
"mermaid": "11.12.0",
|
||||
"mind-elixir": "5.1.1",
|
||||
"mind-elixir": "5.3.4",
|
||||
"normalize.css": "8.0.1",
|
||||
"panzoom": "9.4.3",
|
||||
"preact": "10.27.2",
|
||||
"react-i18next": "16.0.0",
|
||||
"split.js": "1.6.5",
|
||||
"react-i18next": "16.2.0",
|
||||
"reveal.js": "5.2.1",
|
||||
"svg-pan-zoom": "3.6.2",
|
||||
"tabulator-tables": "6.3.1",
|
||||
"vanilla-js-wheel-zoom": "9.0.4"
|
||||
@@ -68,13 +70,14 @@
|
||||
"@preact/preset-vite": "2.10.2",
|
||||
"@types/bootstrap": "5.2.10",
|
||||
"@types/jquery": "3.5.33",
|
||||
"@types/leaflet": "1.9.20",
|
||||
"@types/leaflet": "1.9.21",
|
||||
"@types/leaflet-gpx": "1.3.8",
|
||||
"@types/mark.js": "8.11.12",
|
||||
"@types/tabulator-tables": "6.2.11",
|
||||
"@types/reveal.js": "5.2.1",
|
||||
"@types/tabulator-tables": "6.3.0",
|
||||
"copy-webpack-plugin": "13.0.1",
|
||||
"happy-dom": "19.0.2",
|
||||
"happy-dom": "20.0.8",
|
||||
"script-loader": "0.7.2",
|
||||
"vite-plugin-static-copy": "3.1.3"
|
||||
"vite-plugin-static-copy": "3.1.4"
|
||||
}
|
||||
}
|
||||
@@ -326,9 +326,11 @@ class NoteContext extends Component implements EventListener<"entitiesReloaded">
|
||||
}
|
||||
|
||||
// Collections must always display a note list, even if no children.
|
||||
const viewType = note.getLabelValue("viewType") ?? "grid";
|
||||
if (!["list", "grid"].includes(viewType)) {
|
||||
return true;
|
||||
if (note.type === "book") {
|
||||
const viewType = note.getLabelValue("viewType") ?? "grid";
|
||||
if (!["list", "grid"].includes(viewType)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!note.hasChildren()) {
|
||||
@@ -438,4 +440,22 @@ class NoteContext extends Component implements EventListener<"entitiesReloaded">
|
||||
}
|
||||
}
|
||||
|
||||
export function openInCurrentNoteContext(evt: MouseEvent | JQuery.ClickEvent | JQuery.MouseDownEvent | React.PointerEvent<HTMLCanvasElement> | null, notePath: string, viewScope?: ViewScope) {
|
||||
const ntxId = $(evt?.target as Element)
|
||||
.closest("[data-ntx-id]")
|
||||
.attr("data-ntx-id");
|
||||
|
||||
const noteContext = ntxId ? appContext.tabManager.getNoteContextById(ntxId) : appContext.tabManager.getActiveContext();
|
||||
|
||||
if (noteContext) {
|
||||
noteContext.setNote(notePath, { viewScope }).then(() => {
|
||||
if (noteContext !== appContext.tabManager.getActiveContext()) {
|
||||
appContext.tabManager.activateNoteContext(noteContext.ntxId);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
appContext.tabManager.openContextWithNote(notePath, { viewScope, activate: true });
|
||||
}
|
||||
}
|
||||
|
||||
export default NoteContext;
|
||||
|
||||
@@ -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";
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import server from "../services/server.js";
|
||||
import noteAttributeCache from "../services/note_attribute_cache.js";
|
||||
import ws from "../services/ws.js";
|
||||
import protectedSessionHolder from "../services/protected_session_holder.js";
|
||||
import cssClassManager from "../services/css_class_manager.js";
|
||||
import type { Froca } from "../services/froca-interface.js";
|
||||
@@ -586,7 +585,7 @@ export default class FNote {
|
||||
let childBranches = this.getChildBranches();
|
||||
|
||||
if (!childBranches) {
|
||||
ws.logError(`No children for '${this.noteId}'. This shouldn't happen.`);
|
||||
console.error(`No children for '${this.noteId}'. This shouldn't happen.`);
|
||||
return [];
|
||||
}
|
||||
|
||||
|
||||
@@ -138,7 +138,7 @@ export default class DesktopLayout {
|
||||
.child(new PromotedAttributesWidget())
|
||||
.child(<SqlTableSchemas />)
|
||||
.child(new NoteDetailWidget())
|
||||
.child(<NoteList />)
|
||||
.child(<NoteList media="screen" />)
|
||||
.child(<SearchResult />)
|
||||
.child(<SqlResults />)
|
||||
.child(<ScrollPadding />)
|
||||
|
||||
@@ -29,8 +29,9 @@ 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 FormattingToolbar from "../widgets/ribbon/FormattingToolbar.js";
|
||||
import NoteList from "../widgets/collections/NoteList.jsx";
|
||||
import StandaloneRibbonAdapter from "../widgets/ribbon/components/StandaloneRibbonAdapter.jsx";
|
||||
|
||||
export function applyModals(rootContainer: RootContainer) {
|
||||
rootContainer
|
||||
@@ -63,9 +64,9 @@ export function applyModals(rootContainer: RootContainer) {
|
||||
.cssBlock(".title-row > * { margin: 5px; }")
|
||||
.child(<NoteIconWidget />)
|
||||
.child(<NoteTitleWidget />))
|
||||
.child(<PopupEditorFormattingToolbar />)
|
||||
.child(<StandaloneRibbonAdapter component={FormattingToolbar} />)
|
||||
.child(new PromotedAttributesWidget())
|
||||
.child(new NoteDetailWidget())
|
||||
.child(<NoteList displayOnlyCollections />))
|
||||
.child(<NoteList media="screen" displayOnlyCollections />))
|
||||
.child(<CallToActionDialog />);
|
||||
}
|
||||
|
||||
@@ -24,6 +24,9 @@ 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 StandaloneRibbonAdapter from "../widgets/ribbon/components/StandaloneRibbonAdapter.jsx";
|
||||
import SearchDefinitionTab from "../widgets/ribbon/SearchDefinitionTab.jsx";
|
||||
import SearchResult from "../widgets/search_result.jsx";
|
||||
|
||||
const MOBILE_CSS = `
|
||||
<style>
|
||||
@@ -40,8 +43,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 +62,7 @@ const FANCYTREE_CSS = `
|
||||
margin-top: 0px;
|
||||
overflow-y: auto;
|
||||
contain: content;
|
||||
padding-left: 10px;
|
||||
padding-inline-start: 10px;
|
||||
}
|
||||
|
||||
.fancytree-custom-icon {
|
||||
@@ -68,7 +71,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 +84,7 @@ const FANCYTREE_CSS = `
|
||||
|
||||
span.fancytree-expander {
|
||||
width: 24px !important;
|
||||
margin-right: 5px;
|
||||
margin-inline-end: 5px;
|
||||
}
|
||||
|
||||
.fancytree-loading span.fancytree-expander {
|
||||
@@ -101,7 +104,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 +129,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)))
|
||||
)
|
||||
@@ -154,7 +157,9 @@ export default class MobileLayout {
|
||||
.filling()
|
||||
.contentSized()
|
||||
.child(new NoteDetailWidget())
|
||||
.child(<NoteList />)
|
||||
.child(<NoteList media="screen" />)
|
||||
.child(<StandaloneRibbonAdapter component={SearchDefinitionTab} />)
|
||||
.child(<SearchResult />)
|
||||
.child(<FilePropertiesWrapper />)
|
||||
)
|
||||
.child(<MobileEditorToolbar />)
|
||||
|
||||
@@ -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";
|
||||
|
||||
|
||||
155
apps/client/src/print.css
Normal file
155
apps/client/src/print.css
Normal file
@@ -0,0 +1,155 @@
|
||||
:root {
|
||||
--print-font-size: 11pt;
|
||||
--ck-content-color-image-caption-background: transparent !important;
|
||||
}
|
||||
|
||||
html,
|
||||
body {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
color: black;
|
||||
}
|
||||
|
||||
@page {
|
||||
margin: 2cm;
|
||||
}
|
||||
|
||||
.note-list-widget.full-height,
|
||||
.note-list-widget.full-height .note-list-widget-content {
|
||||
height: unset !important;
|
||||
}
|
||||
|
||||
.component {
|
||||
contain: none !important;
|
||||
}
|
||||
|
||||
body[data-note-type="text"] .ck-content {
|
||||
font-size: var(--print-font-size);
|
||||
text-align: justify;
|
||||
}
|
||||
|
||||
.ck-content figcaption {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.ck-content a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.ck-content a:not([href^="#root/"]) {
|
||||
text-decoration: underline;
|
||||
color: #374a75;
|
||||
}
|
||||
|
||||
.ck-content .todo-list__label * {
|
||||
-webkit-print-color-adjust: exact;
|
||||
print-color-adjust: exact;
|
||||
}
|
||||
|
||||
@supports selector(.todo-list__label__description:has(*)) and (height: 1lh) {
|
||||
.ck-content .todo-list__label__description {
|
||||
/* The percentage of the line height that the check box occupies */
|
||||
--box-ratio: 0.75;
|
||||
/* The size of the gap between the check box and the caption */
|
||||
--box-text-gap: 0.25em;
|
||||
|
||||
--box-size: calc(1lh * var(--box-ratio));
|
||||
--box-vert-offset: calc((1lh - var(--box-size)) / 2);
|
||||
|
||||
display: inline-block;
|
||||
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);
|
||||
background-size: var(--box-size);
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
.ck-content .todo-list__label:has(input[type="checkbox"]:checked) .todo-list__label__description {
|
||||
/* Source: https://pictogrammers.com/library/mdi/icon/checkbox-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%2c3H5A2%2c2 0 0%2c0 3%2c5V19A2%2c2 0 0%2c0 5%2c21H19A2%2c2 0 0%2c0 21%2c19V5A2%2c2 0 0%2c0 19%2c3M19%2c5V19H5V5H19M10%2c17L6%2c13L7.41%2c11.58L10%2c14.17L16.59%2c7.58L18%2c9' /%3e%3c/svg%3e");
|
||||
}
|
||||
|
||||
.ck-content .todo-list__label input[type="checkbox"] {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
/* #region Footnotes */
|
||||
.footnote-reference a,
|
||||
.footnote-back-link a {
|
||||
text-decoration: none !important;
|
||||
}
|
||||
|
||||
li.footnote-item {
|
||||
position: relative;
|
||||
width: fit-content;
|
||||
}
|
||||
|
||||
.ck-content .footnote-back-link {
|
||||
margin-right: 0.25em;
|
||||
}
|
||||
|
||||
.ck-content .footnote-content {
|
||||
display: inline-block;
|
||||
width: unset;
|
||||
}
|
||||
/* #endregion */
|
||||
|
||||
/* #region Widows and orphans */
|
||||
p,
|
||||
blockquote {
|
||||
widows: 4;
|
||||
orphans: 4;
|
||||
}
|
||||
|
||||
pre > code {
|
||||
widows: 6;
|
||||
orphans: 6;
|
||||
overflow: auto;
|
||||
white-space: pre-wrap !important;
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
page-break-after: avoid;
|
||||
break-after: avoid;
|
||||
}
|
||||
/* #endregion */
|
||||
|
||||
/* #region Tables */
|
||||
.table thead th,
|
||||
.table td,
|
||||
.table th {
|
||||
/* Fix center vertical alignment of table cells */
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
pre {
|
||||
box-shadow: unset !important;
|
||||
border: 0.75pt solid gray !important;
|
||||
border-radius: 2pt !important;
|
||||
}
|
||||
|
||||
th,
|
||||
span[style] {
|
||||
print-color-adjust: exact;
|
||||
-webkit-print-color-adjust: exact;
|
||||
}
|
||||
/* #endregion */
|
||||
|
||||
/* #region Page breaks */
|
||||
.page-break {
|
||||
page-break-after: always;
|
||||
break-after: always;
|
||||
}
|
||||
|
||||
.page-break > *,
|
||||
.page-break::after {
|
||||
display: none !important;
|
||||
}
|
||||
/* #endregion */
|
||||
92
apps/client/src/print.tsx
Normal file
92
apps/client/src/print.tsx
Normal file
@@ -0,0 +1,92 @@
|
||||
import FNote from "./entities/fnote";
|
||||
import { render } from "preact";
|
||||
import { CustomNoteList } from "./widgets/collections/NoteList";
|
||||
import { useCallback, useLayoutEffect, useRef } from "preact/hooks";
|
||||
import content_renderer from "./services/content_renderer";
|
||||
|
||||
interface RendererProps {
|
||||
note: FNote;
|
||||
onReady: () => void;
|
||||
}
|
||||
|
||||
async function main() {
|
||||
const notePath = window.location.hash.substring(1);
|
||||
const noteId = notePath.split("/").at(-1);
|
||||
if (!noteId) return;
|
||||
|
||||
await import("./print.css");
|
||||
const froca = (await import("./services/froca")).default;
|
||||
const note = await froca.getNote(noteId);
|
||||
|
||||
render(<App note={note} noteId={noteId} />, document.body);
|
||||
}
|
||||
|
||||
function App({ note, noteId }: { note: FNote | null | undefined, noteId: string }) {
|
||||
const sentReadyEvent = useRef(false);
|
||||
const onReady = useCallback(() => {
|
||||
if (sentReadyEvent.current) return;
|
||||
window.dispatchEvent(new Event("note-ready"));
|
||||
window._noteReady = true;
|
||||
sentReadyEvent.current = true;
|
||||
}, []);
|
||||
const props: RendererProps | undefined | null = note && { note, onReady };
|
||||
|
||||
if (!note || !props) return <Error404 noteId={noteId} />
|
||||
|
||||
useLayoutEffect(() => {
|
||||
document.body.dataset.noteType = note.type;
|
||||
}, [ note ]);
|
||||
|
||||
return (
|
||||
<>
|
||||
{note.type === "book"
|
||||
? <CollectionRenderer {...props} />
|
||||
: <SingleNoteRenderer {...props} />
|
||||
}
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
function SingleNoteRenderer({ note, onReady }: RendererProps) {
|
||||
const containerRef = useRef<HTMLDivElement>(null);
|
||||
|
||||
useLayoutEffect(() => {
|
||||
async function load() {
|
||||
if (note.type === "text") {
|
||||
await import("@triliumnext/ckeditor5/src/theme/ck-content.css");
|
||||
}
|
||||
const { $renderedContent } = await content_renderer.getRenderedContent(note, { noChildrenList: true });
|
||||
containerRef.current?.replaceChildren(...$renderedContent);
|
||||
}
|
||||
|
||||
load().then(() => requestAnimationFrame(onReady))
|
||||
}, [ note ]);
|
||||
|
||||
return <>
|
||||
<h1>{note.title}</h1>
|
||||
<main ref={containerRef} />
|
||||
</>;
|
||||
}
|
||||
|
||||
function CollectionRenderer({ note, onReady }: RendererProps) {
|
||||
return <CustomNoteList
|
||||
isEnabled
|
||||
note={note}
|
||||
notePath={note.getBestNotePath().join("/")}
|
||||
ntxId="print"
|
||||
highlightedTokens={null}
|
||||
media="print"
|
||||
onReady={onReady}
|
||||
/>;
|
||||
}
|
||||
|
||||
function Error404({ noteId }: { noteId: string }) {
|
||||
return (
|
||||
<main>
|
||||
<p>The note you are trying to print could not be found.</p>
|
||||
<small>{noteId}</small>
|
||||
</main>
|
||||
)
|
||||
}
|
||||
|
||||
main();
|
||||
@@ -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();
|
||||
|
||||
@@ -23,11 +23,13 @@ interface Options {
|
||||
tooltip?: boolean;
|
||||
trim?: boolean;
|
||||
imageHasZoom?: boolean;
|
||||
/** If enabled, it will prevent the default behavior in which an empty note would display a list of children. */
|
||||
noChildrenList?: boolean;
|
||||
}
|
||||
|
||||
const CODE_MIME_TYPES = new Set(["application/json"]);
|
||||
|
||||
async function getRenderedContent(this: {} | { ctx: string }, entity: FNote | FAttachment, options: Options = {}) {
|
||||
export async function getRenderedContent(this: {} | { ctx: string }, entity: FNote | FAttachment, options: Options = {}) {
|
||||
|
||||
options = Object.assign(
|
||||
{
|
||||
@@ -42,7 +44,7 @@ async function getRenderedContent(this: {} | { ctx: string }, entity: FNote | FA
|
||||
const $renderedContent = $('<div class="rendered-content">');
|
||||
|
||||
if (type === "text" || type === "book") {
|
||||
await renderText(entity, $renderedContent);
|
||||
await renderText(entity, $renderedContent, options);
|
||||
} else if (type === "code") {
|
||||
await renderCode(entity, $renderedContent);
|
||||
} else if (["image", "canvas", "mindMap"].includes(type)) {
|
||||
@@ -114,7 +116,7 @@ async function getRenderedContent(this: {} | { ctx: string }, entity: FNote | FA
|
||||
};
|
||||
}
|
||||
|
||||
async function renderText(note: FNote | FAttachment, $renderedContent: JQuery<HTMLElement>) {
|
||||
async function renderText(note: FNote | FAttachment, $renderedContent: JQuery<HTMLElement>, options: Options = {}) {
|
||||
// entity must be FNote
|
||||
const blob = await note.getBlob();
|
||||
|
||||
@@ -135,7 +137,7 @@ async function renderText(note: FNote | FAttachment, $renderedContent: JQuery<HT
|
||||
}
|
||||
|
||||
await formatCodeBlocks($renderedContent);
|
||||
} else if (note instanceof FNote) {
|
||||
} else if (note instanceof FNote && !options.noChildrenList) {
|
||||
await renderChildrenList($renderedContent, note);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,21 +1,39 @@
|
||||
import {readCssVar} from "../utils/css-var";
|
||||
import Color, { ColorInstance } from "color";
|
||||
|
||||
const registeredClasses = new Set<string>();
|
||||
|
||||
function createClassForColor(color: string | null) {
|
||||
if (!color?.trim()) {
|
||||
return "";
|
||||
}
|
||||
// Read the color lightness limits defined in the theme as CSS variables
|
||||
|
||||
const normalizedColorName = color.replace(/[^a-z0-9]/gi, "");
|
||||
const lightThemeColorMaxLightness = readCssVar(
|
||||
document.documentElement,
|
||||
"tree-item-light-theme-max-color-lightness"
|
||||
).asNumber(70);
|
||||
|
||||
if (!normalizedColorName.trim()) {
|
||||
return "";
|
||||
}
|
||||
const darkThemeColorMinLightness = readCssVar(
|
||||
document.documentElement,
|
||||
"tree-item-dark-theme-min-color-lightness"
|
||||
).asNumber(50);
|
||||
|
||||
const className = `color-${normalizedColorName}`;
|
||||
function createClassForColor(colorString: string | null) {
|
||||
if (!colorString?.trim()) return "";
|
||||
|
||||
const color = parseColor(colorString);
|
||||
if (!color) return "";
|
||||
|
||||
const className = `color-${color.hex().substring(1)}`;
|
||||
|
||||
if (!registeredClasses.has(className)) {
|
||||
// make the active fancytree selector more specific than the normal color setting
|
||||
$("head").append(`<style>.${className}, span.fancytree-active.${className} { color: ${color} !important; }</style>`);
|
||||
const adjustedColor = adjustColorLightness(color, lightThemeColorMaxLightness!,
|
||||
darkThemeColorMinLightness!);
|
||||
|
||||
$("head").append(`<style>
|
||||
.${className}, span.fancytree-active.${className} {
|
||||
--light-theme-custom-color: ${adjustedColor.lightThemeColor};
|
||||
--dark-theme-custom-color: ${adjustedColor.darkThemeColor};
|
||||
--custom-color-hue: ${getHue(color) ?? 'unset'};
|
||||
}
|
||||
</style>`);
|
||||
|
||||
registeredClasses.add(className);
|
||||
}
|
||||
@@ -23,6 +41,41 @@ function createClassForColor(color: string | null) {
|
||||
return className;
|
||||
}
|
||||
|
||||
function parseColor(color: string) {
|
||||
try {
|
||||
return Color(color);
|
||||
} catch (ex) {
|
||||
console.error(ex);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a pair of colors — one optimized for light themes and the other for dark themes, derived
|
||||
* from the specified color to maintain sufficient contrast with each theme.
|
||||
* The adjustment is performed by limiting the color’s lightness in the CIELAB color space,
|
||||
* according to the lightThemeMaxLightness and darkThemeMinLightness parameters.
|
||||
*/
|
||||
function adjustColorLightness(color: ColorInstance, lightThemeMaxLightness: number, darkThemeMinLightness: number) {
|
||||
const labColor = color.lab();
|
||||
const lightness = labColor.l();
|
||||
|
||||
// For the light theme, limit the maximum lightness
|
||||
const lightThemeColor = labColor.l(Math.min(lightness, lightThemeMaxLightness)).hex();
|
||||
|
||||
// For the dark theme, limit the minimum lightness
|
||||
const darkThemeColor = labColor.l(Math.max(lightness, darkThemeMinLightness)).hex();
|
||||
|
||||
return {lightThemeColor, darkThemeColor};
|
||||
}
|
||||
|
||||
/** Returns the hue of the specified color, or undefined if the color is grayscale. */
|
||||
function getHue(color: ColorInstance) {
|
||||
const hslColor = color.hsl();
|
||||
if (hslColor.saturationl() > 0) {
|
||||
return hslColor.hue();
|
||||
}
|
||||
}
|
||||
|
||||
export default {
|
||||
createClassForColor
|
||||
};
|
||||
|
||||
@@ -40,20 +40,23 @@ class FrocaImpl implements Froca {
|
||||
|
||||
constructor() {
|
||||
this.initializedPromise = this.loadInitialTree();
|
||||
this.#clear();
|
||||
}
|
||||
|
||||
async loadInitialTree() {
|
||||
const resp = await server.get<SubtreeResponse>("tree");
|
||||
|
||||
// clear the cache only directly before adding new content which is important for e.g., switching to protected session
|
||||
this.#clear();
|
||||
this.addResp(resp);
|
||||
}
|
||||
|
||||
#clear() {
|
||||
this.notes = {};
|
||||
this.branches = {};
|
||||
this.attributes = {};
|
||||
this.attachments = {};
|
||||
this.blobPromises = {};
|
||||
|
||||
this.addResp(resp);
|
||||
}
|
||||
|
||||
async loadSubTree(subTreeNoteId: string) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,8 @@ export const byBookType: Record<ViewTypeOptions, string | null> = {
|
||||
calendar: "xWbu3jpNWapp",
|
||||
table: "2FvYrpmOXm29",
|
||||
geoMap: "81SGnPGMk7Xc",
|
||||
board: "CtBQqbwXDx1w"
|
||||
board: "CtBQqbwXDx1w",
|
||||
presentation: null
|
||||
};
|
||||
|
||||
export function getHelpUrlForNote(note: FNote | null | undefined) {
|
||||
|
||||
@@ -3,16 +3,8 @@ 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";
|
||||
import { openInCurrentNoteContext } from "../components/note_context.js";
|
||||
|
||||
function getNotePathFromUrl(url: string) {
|
||||
const notePathMatch = /#(root[A-Za-z0-9_/]*)$/.exec(url);
|
||||
@@ -325,21 +317,7 @@ function goToLinkExt(evt: MouseEvent | JQuery.ClickEvent | JQuery.MouseDownEvent
|
||||
viewScope
|
||||
});
|
||||
} else if (isLeftClick) {
|
||||
const ntxId = $(evt?.target as any)
|
||||
.closest("[data-ntx-id]")
|
||||
.attr("data-ntx-id");
|
||||
|
||||
const noteContext = ntxId ? appContext.tabManager.getNoteContextById(ntxId) : appContext.tabManager.getActiveContext();
|
||||
|
||||
if (noteContext) {
|
||||
noteContext.setNote(notePath, { viewScope }).then(() => {
|
||||
if (noteContext !== appContext.tabManager.getActiveContext()) {
|
||||
appContext.tabManager.activateNoteContext(noteContext.ntxId);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
appContext.tabManager.openContextWithNote(notePath, { viewScope, activate: true });
|
||||
}
|
||||
openInCurrentNoteContext(evt, notePath, viewScope);
|
||||
}
|
||||
} else if (hrefLink) {
|
||||
const withinEditLink = $link?.hasClass("ck-link-actions__preview");
|
||||
|
||||
@@ -168,7 +168,8 @@ async function getBuiltInTemplates(title: string | null, command: TreeCommandNam
|
||||
}
|
||||
|
||||
for (const templateNote of childNotes) {
|
||||
if (templateNote.hasLabel("collection") !== filterCollections) {
|
||||
if (templateNote.hasLabel("collection") !== filterCollections ||
|
||||
!templateNote.hasLabel("template")) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import options from "./options.js";
|
||||
import Split from "split.js"
|
||||
import Split from "@triliumnext/split.js";
|
||||
|
||||
export const DEFAULT_GUTTER_SIZE = 5;
|
||||
|
||||
@@ -46,6 +46,7 @@ function setupLeftPaneResizer(leftPaneVisible: boolean) {
|
||||
sizes: [leftPaneWidth, restPaneWidth],
|
||||
gutterSize: DEFAULT_GUTTER_SIZE,
|
||||
minSize: [150, 300],
|
||||
rtl: glob.isRtl,
|
||||
onDragEnd: (sizes) => {
|
||||
leftPaneWidth = Math.round(sizes[0]);
|
||||
options.save("leftPaneWidth", Math.round(sizes[0]));
|
||||
@@ -79,6 +80,7 @@ function setupRightPaneResizer() {
|
||||
sizes: [100 - rightPaneWidth, rightPaneWidth],
|
||||
gutterSize: DEFAULT_GUTTER_SIZE,
|
||||
minSize: [300, 180],
|
||||
rtl: glob.isRtl,
|
||||
onDragEnd: (sizes) => {
|
||||
rightPaneWidth = Math.round(sizes[1]);
|
||||
options.save("rightPaneWidth", Math.round(sizes[1]));
|
||||
@@ -99,7 +101,7 @@ function setupNoteSplitResizer(ntxIds: string[]) {
|
||||
let targetNtxIds: string[] | undefined;
|
||||
for (const ntxId of ntxIds) {
|
||||
targetNtxIds = findKeyByNtxId(ntxId);
|
||||
if (targetNtxIds) break;
|
||||
if (targetNtxIds) break;
|
||||
}
|
||||
|
||||
if (targetNtxIds) {
|
||||
@@ -154,6 +156,7 @@ function createSplitInstance(targetNtxIds: string[]) {
|
||||
const splitPanels = [...splitNoteContainer.querySelectorAll<HTMLElement>(':scope > .note-split')]
|
||||
.filter(el => targetNtxIds.includes(el.getAttribute('data-ntx-id') ?? ""));
|
||||
const splitInstance = Split(splitPanels, {
|
||||
rtl: glob.isRtl,
|
||||
gutterSize: DEFAULT_GUTTER_SIZE,
|
||||
minSize: 150,
|
||||
});
|
||||
|
||||
@@ -61,7 +61,11 @@ export async function applySingleBlockSyntaxHighlight($codeBlock: JQuery<HTMLEle
|
||||
highlightedText = highlightAuto(text);
|
||||
} else if (normalizedMimeType) {
|
||||
await ensureMimeTypesForHighlighting(normalizedMimeType);
|
||||
highlightedText = highlight(text, { language: normalizedMimeType });
|
||||
try {
|
||||
highlightedText = highlight(text, { language: normalizedMimeType });
|
||||
} catch (e) {
|
||||
console.warn("Unable to apply syntax highlight.", e);
|
||||
}
|
||||
}
|
||||
|
||||
if (highlightedText) {
|
||||
@@ -76,7 +80,7 @@ export async function ensureMimeTypesForHighlighting(mimeTypeHint?: string) {
|
||||
|
||||
// Load theme.
|
||||
const currentThemeName = String(options.get("codeBlockTheme"));
|
||||
loadHighlightingTheme(currentThemeName);
|
||||
await loadHighlightingTheme(currentThemeName);
|
||||
|
||||
// Load mime types.
|
||||
let mimeTypes: MimeType[];
|
||||
@@ -98,17 +102,16 @@ export async function ensureMimeTypesForHighlighting(mimeTypeHint?: string) {
|
||||
highlightingLoaded = true;
|
||||
}
|
||||
|
||||
export function loadHighlightingTheme(themeName: string) {
|
||||
export async function loadHighlightingTheme(themeName: string) {
|
||||
const themePrefix = "default:";
|
||||
let theme: Theme | null = null;
|
||||
if (themeName.includes(themePrefix)) {
|
||||
if (glob.device === "print") {
|
||||
theme = Themes.vs;
|
||||
} else if (themeName.includes(themePrefix)) {
|
||||
theme = Themes[themeName.substring(themePrefix.length)];
|
||||
}
|
||||
if (!theme) {
|
||||
theme = Themes.default;
|
||||
}
|
||||
|
||||
loadTheme(theme);
|
||||
await loadTheme(theme ?? Themes.default);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -4,9 +4,6 @@ import froca from "./froca.js";
|
||||
import hoistedNoteService from "./hoisted_note.js";
|
||||
import appContext from "../components/app_context.js";
|
||||
|
||||
/**
|
||||
* @returns {string|null}
|
||||
*/
|
||||
async function resolveNotePath(notePath: string, hoistedNoteId = "root") {
|
||||
const runPath = await resolveNotePathToSegments(notePath, hoistedNoteId);
|
||||
|
||||
|
||||
@@ -869,6 +869,18 @@ export function getErrorMessage(e: unknown) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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,
|
||||
|
||||
@@ -304,6 +304,8 @@ async function sendPing() {
|
||||
}
|
||||
|
||||
setTimeout(() => {
|
||||
if (glob.device === "print") return;
|
||||
|
||||
ws = connectWebSocket();
|
||||
|
||||
lastPingTs = Date.now();
|
||||
|
||||
@@ -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%;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,322 +0,0 @@
|
||||
:root {
|
||||
--main-background-color: white;
|
||||
--root-background: var(--main-background-color);
|
||||
--launcher-pane-background-color: var(--main-background-color);
|
||||
--main-text-color: black;
|
||||
--input-text-color: var(--main-text-color);
|
||||
|
||||
--print-font-size: 11pt;
|
||||
}
|
||||
|
||||
@page {
|
||||
margin: 2cm;
|
||||
}
|
||||
|
||||
.ck-content {
|
||||
font-size: var(--print-font-size);
|
||||
text-align: justify;
|
||||
}
|
||||
|
||||
.note-detail-readonly-text {
|
||||
padding: 0 !important;
|
||||
}
|
||||
|
||||
.no-print,
|
||||
.no-print *,
|
||||
.tab-row-container,
|
||||
.tab-row-widget,
|
||||
.title-bar-buttons,
|
||||
#launcher-pane,
|
||||
#left-pane,
|
||||
#center-pane > *:not(.split-note-container-widget),
|
||||
#right-pane,
|
||||
.title-row .note-icon-widget,
|
||||
.title-row .icon-action,
|
||||
.ribbon-container,
|
||||
.promoted-attributes-widget,
|
||||
.scroll-padding-widget,
|
||||
.note-list-widget,
|
||||
.spacer {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
body.mobile #mobile-sidebar-wrapper,
|
||||
body.mobile .classic-toolbar-widget,
|
||||
body.mobile .action-button {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
body.mobile #detail-container {
|
||||
max-height: unset;
|
||||
}
|
||||
|
||||
body.mobile .note-title-widget {
|
||||
padding: 0 !important;
|
||||
}
|
||||
|
||||
body,
|
||||
#root-widget,
|
||||
#rest-pane > div.component:first-child,
|
||||
.note-detail-printable,
|
||||
.note-detail-editable-text-editor {
|
||||
height: unset !important;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.ck.ck-editor__editable_inline {
|
||||
overflow: hidden !important;
|
||||
}
|
||||
|
||||
.note-title-widget input,
|
||||
.note-detail-editable-text,
|
||||
.note-detail-editable-text-editor {
|
||||
padding: 0 !important;
|
||||
}
|
||||
|
||||
html,
|
||||
body {
|
||||
width: unset !important;
|
||||
height: unset !important;
|
||||
overflow: visible;
|
||||
position: unset;
|
||||
/* https://github.com/zadam/trilium/issues/3202 */
|
||||
color: black;
|
||||
}
|
||||
|
||||
#root-widget,
|
||||
#horizontal-main-container,
|
||||
#rest-pane,
|
||||
#vertical-main-container,
|
||||
#center-pane,
|
||||
.split-note-container-widget,
|
||||
.note-split:not(.hidden-ext),
|
||||
body.mobile #mobile-rest-container {
|
||||
display: block !important;
|
||||
overflow: auto;
|
||||
border-radius: 0 !important;
|
||||
}
|
||||
|
||||
#center-pane,
|
||||
#rest-pane,
|
||||
.note-split,
|
||||
body.mobile #detail-container {
|
||||
width: unset !important;
|
||||
max-width: unset !important;
|
||||
}
|
||||
|
||||
.component {
|
||||
contain: none !important;
|
||||
}
|
||||
|
||||
/* Respect page breaks */
|
||||
.page-break {
|
||||
page-break-after: always;
|
||||
break-after: always;
|
||||
}
|
||||
|
||||
.page-break > * {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.relation-map-wrapper {
|
||||
height: 100vh !important;
|
||||
}
|
||||
|
||||
.table thead th,
|
||||
.table td,
|
||||
.table th {
|
||||
/* Fix center vertical alignment of table cells */
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
pre {
|
||||
box-shadow: unset !important;
|
||||
border: 0.75pt solid gray !important;
|
||||
border-radius: 2pt !important;
|
||||
}
|
||||
|
||||
th,
|
||||
span[style] {
|
||||
print-color-adjust: exact;
|
||||
-webkit-print-color-adjust: exact;
|
||||
}
|
||||
|
||||
/*
|
||||
* Text note specific fixes
|
||||
*/
|
||||
.ck-widget {
|
||||
outline: none !important;
|
||||
}
|
||||
|
||||
.ck-placeholder,
|
||||
.ck-widget__type-around,
|
||||
.ck-widget__selection-handle {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.ck-widget.table td.ck-editor__nested-editable.ck-editor__nested-editable_focused,
|
||||
.ck-widget.table td.ck-editor__nested-editable:focus,
|
||||
.ck-widget.table th.ck-editor__nested-editable.ck-editor__nested-editable_focused,
|
||||
.ck-widget.table th.ck-editor__nested-editable:focus {
|
||||
background: unset !important;
|
||||
outline: unset !important;
|
||||
}
|
||||
|
||||
.include-note .include-note-content {
|
||||
max-height: unset !important;
|
||||
overflow: unset !important;
|
||||
}
|
||||
|
||||
/* TODO: This will break once we translate the language */
|
||||
.ck-content pre[data-language="Auto-detected"]:after {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/*
|
||||
* Code note specific fixes.
|
||||
*/
|
||||
.note-detail-code pre {
|
||||
border: unset !important;
|
||||
border-radius: unset !important;
|
||||
}
|
||||
|
||||
/*
|
||||
* Links
|
||||
*/
|
||||
|
||||
.note-detail-printable a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.note-detail-printable a:not([href^="#root/"]) {
|
||||
text-decoration: underline;
|
||||
color: #374a75;
|
||||
}
|
||||
|
||||
.note-detail-printable a::after {
|
||||
/* Hide the external link trailing arrow */
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/*
|
||||
* TODO list check boxes
|
||||
*/
|
||||
|
||||
.note-detail-printable .todo-list__label * {
|
||||
-webkit-print-color-adjust: exact;
|
||||
print-color-adjust: exact;
|
||||
}
|
||||
|
||||
@supports selector(.todo-list__label__description:has(*)) and (height: 1lh) {
|
||||
.note-detail-printable .todo-list__label__description {
|
||||
/* The percentage of the line height that the check box occupies */
|
||||
--box-ratio: 0.75;
|
||||
/* The size of the gap between the check box and the caption */
|
||||
--box-text-gap: 0.25em;
|
||||
|
||||
--box-size: calc(1lh * var(--box-ratio));
|
||||
--box-vert-offset: calc((1lh - var(--box-size)) / 2);
|
||||
|
||||
display: inline-block;
|
||||
padding-left: 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);
|
||||
background-size: var(--box-size);
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
.note-detail-printable .todo-list__label:has(input[type="checkbox"]:checked) .todo-list__label__description {
|
||||
/* Source: https://pictogrammers.com/library/mdi/icon/checkbox-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%2c3H5A2%2c2 0 0%2c0 3%2c5V19A2%2c2 0 0%2c0 5%2c21H19A2%2c2 0 0%2c0 21%2c19V5A2%2c2 0 0%2c0 19%2c3M19%2c5V19H5V5H19M10%2c17L6%2c13L7.41%2c11.58L10%2c14.17L16.59%2c7.58L18%2c9' /%3e%3c/svg%3e");
|
||||
}
|
||||
|
||||
.note-detail-printable .todo-list__label input[type="checkbox"] {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Blockquotes
|
||||
*/
|
||||
|
||||
.note-detail-printable blockquote {
|
||||
box-shadow: unset;
|
||||
}
|
||||
|
||||
/*
|
||||
* Figures
|
||||
*/
|
||||
|
||||
.note-detail-printable figcaption {
|
||||
--accented-background-color: transparent;
|
||||
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/*
|
||||
* Footnotes
|
||||
*/
|
||||
|
||||
.note-detail-printable .footnote-reference a,
|
||||
.footnote-back-link a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* Make the "^" link cover the whole area of the footnote item */
|
||||
|
||||
.footnote-section {
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.note-detail-printable li.footnote-item {
|
||||
position: relative;
|
||||
width: fit-content;
|
||||
}
|
||||
|
||||
.note-detail-printable .footnote-back-link,
|
||||
.note-detail-printable .footnote-back-link *,
|
||||
.note-detail-printable .footnote-back-link a {
|
||||
display: block;
|
||||
position: absolute;
|
||||
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.note-detail-printable .footnote-back-link a {
|
||||
color: transparent;
|
||||
}
|
||||
|
||||
.note-detail-printable .footnote-content {
|
||||
display: inline-block;
|
||||
width: unset;
|
||||
}
|
||||
|
||||
/*
|
||||
* Widows and orphans
|
||||
*/
|
||||
p,
|
||||
blockquote {
|
||||
widows: 4;
|
||||
orphans: 4;
|
||||
}
|
||||
|
||||
pre > code {
|
||||
widows: 6;
|
||||
orphans: 6;
|
||||
overflow: auto;
|
||||
white-space: pre-wrap !important;
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
page-break-after: avoid;
|
||||
break-after: avoid;
|
||||
}
|
||||
@@ -62,7 +62,7 @@
|
||||
.note-detail-relation-map .endpoint {
|
||||
position: absolute;
|
||||
bottom: 37%;
|
||||
right: 5px;
|
||||
inset-inline-end: 5px;
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
background-color: #333;
|
||||
|
||||
@@ -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 {
|
||||
@@ -360,7 +360,8 @@ button kbd {
|
||||
}
|
||||
|
||||
.dropdown-menu,
|
||||
.tabulator-popup-container {
|
||||
.tabulator-popup-container,
|
||||
:root .excalidraw .popover {
|
||||
color: var(--menu-text-color) !important;
|
||||
font-size: inherit;
|
||||
background: var(--menu-background-color) !important;
|
||||
@@ -371,7 +372,9 @@ button kbd {
|
||||
}
|
||||
|
||||
body.desktop .dropdown-menu,
|
||||
body.desktop .tabulator-popup-container {
|
||||
body.desktop .tabulator-popup-container,
|
||||
:root .excalidraw .dropdown-menu .dropdown-menu-container,
|
||||
:root .excalidraw .popover {
|
||||
border: 1px solid var(--dropdown-border-color);
|
||||
column-rule: 1px solid var(--dropdown-border-color);
|
||||
box-shadow: 0px 10px 20px rgba(0, 0, 0, var(--dropdown-shadow-opacity));
|
||||
@@ -392,7 +395,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,7 +406,7 @@ body.desktop .tabulator-popup-container {
|
||||
|
||||
.dropdown-menu .disabled .disabled-tooltip {
|
||||
pointer-events: all;
|
||||
margin-left: 8px;
|
||||
margin-inline-start: 8px;
|
||||
font-size: 0.5em;
|
||||
color: var(--disabled-tooltip-icon-color);
|
||||
cursor: help;
|
||||
@@ -416,7 +419,8 @@ body.desktop .tabulator-popup-container {
|
||||
|
||||
.dropdown-menu a:hover:not(.disabled),
|
||||
.dropdown-item:hover:not(.disabled, .dropdown-container-item),
|
||||
.tabulator-menu-item:hover {
|
||||
.tabulator-menu-item:hover,
|
||||
:root .excalidraw .context-menu .context-menu-item:hover {
|
||||
color: var(--hover-item-text-color) !important;
|
||||
background-color: var(--hover-item-background-color) !important;
|
||||
border-color: var(--hover-item-border-color) !important;
|
||||
@@ -443,7 +447,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;
|
||||
}
|
||||
|
||||
@@ -457,7 +461,8 @@ body #context-menu-container .dropdown-item > span {
|
||||
}
|
||||
|
||||
.dropdown-item,
|
||||
.dropdown-header {
|
||||
.dropdown-header,
|
||||
:root .excalidraw .context-menu .context-menu-item:hover {
|
||||
color: var(--menu-text-color) !important;
|
||||
border: 1px solid transparent !important;
|
||||
}
|
||||
@@ -504,7 +509,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 +591,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 +613,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 +643,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 +680,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 +713,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 +726,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 +748,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 +762,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 +776,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 +797,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 +830,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 +850,7 @@ table.promoted-attributes-in-tooltip th {
|
||||
}
|
||||
|
||||
.tooltip-inner figure.image-style-side {
|
||||
float: right;
|
||||
float: inline-end;
|
||||
}
|
||||
|
||||
.tooltip.show {
|
||||
@@ -890,7 +899,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 +925,7 @@ table.promoted-attributes-in-tooltip th {
|
||||
}
|
||||
|
||||
.help-button {
|
||||
float: right;
|
||||
float: inline-end;
|
||||
background: none;
|
||||
font-weight: 900;
|
||||
color: orange;
|
||||
@@ -1004,7 +1013,7 @@ svg.ck-icon .note-icon {
|
||||
--ck-content-line-height: var(--bs-body-line-height);
|
||||
}
|
||||
|
||||
.ck-content .table table th {
|
||||
:root .ck-content .table table:not(.layout-table) th {
|
||||
background-color: var(--accented-background-color);
|
||||
}
|
||||
|
||||
@@ -1033,7 +1042,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 +1050,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 +1064,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 +1081,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 {
|
||||
@@ -1153,8 +1162,8 @@ a.external:not(.no-arrow):after, a[href^="http://"]:not(.no-arrow):after, a[href
|
||||
}
|
||||
|
||||
.toast.no-title .toast-body {
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
padding-inline-start: 0;
|
||||
padding-inline-end: 0;
|
||||
}
|
||||
|
||||
.toast.no-title .toast-header {
|
||||
@@ -1274,8 +1283,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);
|
||||
@@ -1288,8 +1297,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;
|
||||
@@ -1339,7 +1348,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 */
|
||||
@@ -1348,7 +1357,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 {
|
||||
@@ -1414,7 +1423,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;
|
||||
}
|
||||
|
||||
@@ -1445,8 +1454,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;
|
||||
}
|
||||
|
||||
@@ -1492,7 +1501,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;
|
||||
}
|
||||
|
||||
@@ -1533,16 +1542,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;
|
||||
@@ -1557,7 +1566,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);
|
||||
@@ -1589,8 +1598,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;
|
||||
@@ -1748,8 +1757,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 {
|
||||
@@ -1789,7 +1798,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;
|
||||
}
|
||||
|
||||
@@ -1800,8 +1809,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 {
|
||||
@@ -1820,7 +1829,7 @@ button.close:hover {
|
||||
.reference-link .bx {
|
||||
position: relative;
|
||||
top: 1px;
|
||||
margin-right: 3px;
|
||||
margin-inline-end: 3px;
|
||||
}
|
||||
|
||||
.options-section:first-of-type h4 {
|
||||
@@ -1858,7 +1867,7 @@ textarea {
|
||||
|
||||
.attachment-help-button {
|
||||
display: inline-block;
|
||||
margin-left: 10px;
|
||||
margin-inline-start: 10px;
|
||||
vertical-align: middle;
|
||||
font-size: 1em;
|
||||
}
|
||||
@@ -1966,7 +1975,7 @@ textarea {
|
||||
}
|
||||
|
||||
body.electron.platform-darwin:not(.native-titlebar) .tab-row-container {
|
||||
padding-left: 1em;
|
||||
padding-inline-start: 1em;
|
||||
}
|
||||
|
||||
#tab-row-left-spacer {
|
||||
@@ -1974,8 +1983,12 @@ body.electron.platform-darwin:not(.native-titlebar) .tab-row-container {
|
||||
-webkit-app-region: drag;
|
||||
}
|
||||
|
||||
body.electron.platform-darwin:not(.native-titlebar) #tab-row-left-spacer {
|
||||
width: 80px;
|
||||
}
|
||||
|
||||
.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 {
|
||||
@@ -2038,7 +2051,7 @@ body.zen .split-note-container-widget > .gutter {
|
||||
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;
|
||||
@@ -2049,8 +2062,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 {
|
||||
@@ -2058,7 +2071,7 @@ body.zen .floating-buttons {
|
||||
}
|
||||
|
||||
body.zen .floating-buttons-children {
|
||||
right: 0;
|
||||
inset-inline-end: 0;
|
||||
}
|
||||
|
||||
body.zen .floating-buttons-children .button-widget {
|
||||
@@ -2217,7 +2230,7 @@ footer.webview-footer button {
|
||||
.chat-input {
|
||||
width: 100%;
|
||||
resize: none;
|
||||
padding-right: 40px;
|
||||
padding-inline-end: 40px;
|
||||
}
|
||||
|
||||
.chat-buttons {
|
||||
@@ -2273,14 +2286,13 @@ footer.webview-footer button {
|
||||
|
||||
.admonition {
|
||||
--accent-color: var(--card-border-color);
|
||||
background: color-mix(in srgb, var(--accent-color) 15%, transparent);
|
||||
border: 1px solid var(--accent-color);
|
||||
box-shadow: var(--card-box-shadow);
|
||||
background: var(--card-background-color);
|
||||
border-radius: 0.5em;
|
||||
padding: 1em;
|
||||
margin: 1.25em 0;
|
||||
position: relative;
|
||||
padding-left: 2.5em;
|
||||
padding-inline-start: 2.5em;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
@@ -2293,7 +2305,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); }
|
||||
@@ -2319,18 +2331,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;
|
||||
@@ -2338,23 +2350,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;
|
||||
}
|
||||
|
||||
@@ -2369,17 +2381,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 {
|
||||
@@ -2410,4 +2422,18 @@ footer.webview-footer button {
|
||||
.revision-diff-removed {
|
||||
background: rgba(255, 100, 100, 0.5);
|
||||
text-decoration: line-through;
|
||||
}
|
||||
|
||||
iframe.print-iframe {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: -600px;
|
||||
right: -600px;
|
||||
bottom: 0;
|
||||
width: 0;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.excalidraw.theme--dark canvas {
|
||||
--theme-filter: invert(100%) hue-rotate(180deg);
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -82,6 +82,17 @@ body ::-webkit-calendar-picker-indicator {
|
||||
filter: invert(1);
|
||||
}
|
||||
|
||||
#left-pane .fancytree-node.tinted {
|
||||
--custom-color: var(--dark-theme-custom-color);
|
||||
}
|
||||
|
||||
:root .reference-link,
|
||||
:root .reference-link:hover,
|
||||
.ck-content a.reference-link > span,
|
||||
.board-note {
|
||||
color: var(--dark-theme-custom-color, inherit);
|
||||
}
|
||||
|
||||
.excalidraw.theme--dark {
|
||||
--theme-filter: invert(80%) hue-rotate(180deg) !important;
|
||||
}
|
||||
@@ -97,3 +108,4 @@ body .todo-list input[type="checkbox"]:not(:checked):before {
|
||||
.ck-content pre {
|
||||
box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.6) !important;
|
||||
}
|
||||
|
||||
|
||||
@@ -81,3 +81,14 @@ html {
|
||||
--mermaid-theme: default;
|
||||
--native-titlebar-background: #ffffff00;
|
||||
}
|
||||
|
||||
#left-pane .fancytree-node.tinted {
|
||||
--custom-color: var(--light-theme-custom-color);
|
||||
}
|
||||
|
||||
:root .reference-link,
|
||||
:root .reference-link:hover,
|
||||
.ck-content a.reference-link > span,
|
||||
.board-note {
|
||||
color: var(--light-theme-custom-color, inherit);
|
||||
}
|
||||
@@ -160,6 +160,9 @@
|
||||
--launcher-pane-horiz-background-color-bgfx: #ffffff17; /* When background effects enabled */
|
||||
--launcher-pane-horiz-border-color-bgfx: #00000080; /* When background effects enabled */
|
||||
|
||||
--global-menu-update-available-badge-background-color: #7dbe61;
|
||||
--global-menu-update-available-badge-color: black;
|
||||
|
||||
--protected-session-active-icon-color: #8edd8e;
|
||||
--sync-status-error-pulse-color: #f47871;
|
||||
|
||||
@@ -265,6 +268,22 @@
|
||||
* Dark color scheme tweaks
|
||||
*/
|
||||
|
||||
#left-pane .fancytree-node.tinted {
|
||||
--custom-color: var(--dark-theme-custom-color);
|
||||
|
||||
/* The background color of the active item in the note tree.
|
||||
* The --custom-color-hue variable contains the hue of the user-selected note color.
|
||||
* This value is unset for gray tones. */
|
||||
--custom-bg-color: hsl(var(--custom-color-hue), 20%, 33%, 0.4);
|
||||
}
|
||||
|
||||
:root .reference-link,
|
||||
:root .reference-link:hover,
|
||||
.ck-content a.reference-link > span,
|
||||
.board-note {
|
||||
color: var(--dark-theme-custom-color, inherit);
|
||||
}
|
||||
|
||||
body ::-webkit-calendar-picker-indicator {
|
||||
filter: invert(1);
|
||||
}
|
||||
@@ -275,4 +294,4 @@ body ::-webkit-calendar-picker-indicator {
|
||||
|
||||
body .todo-list input[type="checkbox"]:not(:checked):before {
|
||||
border-color: var(--muted-text-color) !important;
|
||||
}
|
||||
}
|
||||
@@ -127,7 +127,7 @@
|
||||
--left-pane-item-selected-color: black;
|
||||
--left-pane-item-selected-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2);
|
||||
--left-pane-item-action-button-background: rgba(0, 0, 0, 0.11);
|
||||
--left-pane-item-action-button-color: inherit;
|
||||
--left-pane-item-action-button-color: var(--left-pane-text-color);
|
||||
--left-pane-item-action-button-hover-background: white;
|
||||
--left-pane-item-action-button-hover-shadow: 2px 2px 3px rgba(0, 0, 0, 0.15);
|
||||
--left-pane-item-selected-action-button-hover-shadow: 2px 2px 10px rgba(0, 0, 0, 0.25);
|
||||
@@ -153,6 +153,9 @@
|
||||
--launcher-pane-horiz-background-color-bgfx: #ffffffb3; /* When background effects enabled */
|
||||
--launcher-pane-horiz-border-color-bgfx: #00000026; /* When background effects enabled */
|
||||
|
||||
--global-menu-update-available-badge-background-color: #4fa450;
|
||||
--global-menu-update-available-badge-color: white;
|
||||
|
||||
--protected-session-active-icon-color: #16b516;
|
||||
--sync-status-error-pulse-color: #ff5528;
|
||||
|
||||
@@ -258,5 +261,13 @@
|
||||
--ck-editor-toolbar-button-on-color: black;
|
||||
--ck-editor-toolbar-button-on-shadow: none;
|
||||
--ck-editor-toolbar-dropdown-button-open-background: #0000000f;
|
||||
|
||||
}
|
||||
|
||||
#left-pane .fancytree-node.tinted {
|
||||
--custom-color: var(--light-theme-custom-color);
|
||||
|
||||
/* The background color of the active item in the note tree.
|
||||
* The --custom-color-hue variable contains the hue of the user-selected note color.
|
||||
* This value is unset for gray tones. */
|
||||
--custom-bg-color: hsl(var(--custom-color-hue), 37%, 89%, 1);
|
||||
}
|
||||
@@ -4,6 +4,7 @@
|
||||
@import url(./pages.css);
|
||||
@import url(./ribbon.css);
|
||||
@import url(./notes/text.css);
|
||||
@import url(./notes/canvas.css);
|
||||
@import url(./notes/collections/table.css);
|
||||
|
||||
@font-face {
|
||||
@@ -81,6 +82,20 @@
|
||||
|
||||
/* Theme capabilities */
|
||||
--tab-note-icons: true;
|
||||
|
||||
/* To ensure that a tree item's custom color remains sufficiently contrasted and readable,
|
||||
* the color is adjusted based on the current color scheme (light or dark). The lightness
|
||||
* component of the color represented in the CIELAB color space, will be
|
||||
* constrained to a certain percentage defined below.
|
||||
*
|
||||
* Note: the tree background may vary when background effects are enabled, so it is recommended
|
||||
* to maintain a higher contrast margin than on the usual note tree solid background. */
|
||||
|
||||
/* The maximum perceptual lightness for the custom color in the light theme (%): */
|
||||
--tree-item-light-theme-max-color-lightness: 60;
|
||||
|
||||
/* The minimum perceptual lightness for the custom color in the dark theme (%): */
|
||||
--tree-item-dark-theme-min-color-lightness: 65;
|
||||
}
|
||||
|
||||
body.backdrop-effects-disabled {
|
||||
@@ -96,9 +111,10 @@ body.backdrop-effects-disabled {
|
||||
* supported when this class is used.
|
||||
*/
|
||||
|
||||
.dropdown-menu:not(.static) {
|
||||
.dropdown-menu:not(.static),
|
||||
:root .excalidraw .popover {
|
||||
border-radius: var(--dropdown-border-radius);
|
||||
padding: var(--menu-padding-size) !important;
|
||||
padding: var(--padding, var(--menu-padding-size)) !important;
|
||||
font-size: 0.9rem !important;
|
||||
}
|
||||
|
||||
@@ -114,14 +130,15 @@ body.mobile .dropdown-menu .dropdown-menu {
|
||||
}
|
||||
|
||||
body.desktop .dropdown-menu::before,
|
||||
:root .ck.ck-dropdown__panel::before {
|
||||
:root .ck.ck-dropdown__panel::before,
|
||||
:root .excalidraw .popover::before {
|
||||
content: "";
|
||||
backdrop-filter: var(--dropdown-backdrop-filter);
|
||||
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;
|
||||
}
|
||||
@@ -148,9 +165,17 @@ body.desktop .dropdown-submenu .dropdown-menu {
|
||||
}
|
||||
|
||||
.dropdown-item,
|
||||
body.mobile .dropdown-submenu .dropdown-toggle {
|
||||
padding: 2px 2px 2px 8px !important;
|
||||
padding-inline-end: 22px !important;
|
||||
body.mobile .dropdown-submenu .dropdown-toggle,
|
||||
.excalidraw .context-menu .context-menu-item {
|
||||
--menu-item-start-padding: 8px;
|
||||
--menu-item-end-padding: 22px;
|
||||
--menu-item-vertical-padding: 2px;
|
||||
|
||||
padding-top: var(--menu-item-vertical-padding) !important;
|
||||
padding-bottom: var(--menu-item-vertical-padding) !important;
|
||||
padding-inline-start: var(--menu-item-start-padding) !important;
|
||||
padding-inline-end: var(--menu-item-end-padding) !important;
|
||||
|
||||
/* Note: the right padding should also accommodate the submenu arrow. */
|
||||
border-radius: 6px;
|
||||
cursor: default !important;
|
||||
@@ -202,7 +227,8 @@ html body .dropdown-item[disabled] {
|
||||
}
|
||||
|
||||
/* Menu item keyboard shortcut */
|
||||
.dropdown-item kbd {
|
||||
.dropdown-item kbd,
|
||||
.excalidraw .context-menu-item__shortcut {
|
||||
font-family: unset !important;
|
||||
font-size: unset !important;
|
||||
color: var(--menu-item-keyboard-shortcut-color) !important;
|
||||
@@ -211,21 +237,23 @@ 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 {
|
||||
.dropdown-divider,
|
||||
.excalidraw .context-menu hr {
|
||||
position: relative;
|
||||
border-color: transparent !important;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
.dropdown-divider::after {
|
||||
.dropdown-divider::after,
|
||||
.excalidraw .context-menu hr::before {
|
||||
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 +265,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,10 +274,16 @@ 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 */
|
||||
.dropdown-menu h6 {
|
||||
.dropdown-menu h6,
|
||||
.excalidraw .dropdown-menu-container .dropdown-menu-group-title,
|
||||
.excalidraw .dropdown-menu-container div[data-testid="canvas-background-label"] {
|
||||
position: relative;
|
||||
background: transparent;
|
||||
padding: 1em 8px 14px 8px;
|
||||
@@ -260,12 +294,14 @@ html body .dropdown-item[disabled] {
|
||||
}
|
||||
|
||||
/* The delimiter line */
|
||||
.dropdown-menu h6::before {
|
||||
.dropdown-menu h6::before,
|
||||
.excalidraw .dropdown-menu-container .dropdown-menu-group-title::before,
|
||||
.excalidraw .dropdown-menu-container div[data-testid="canvas-background-label"]::before {
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -357,13 +393,13 @@ li.dropdown-item a.dropdown-item-button:focus-visible {
|
||||
}
|
||||
|
||||
#toast-container .toast:not(.no-title) .bx {
|
||||
margin-right: 0.5em;
|
||||
margin-inline-end: 0.5em;
|
||||
font-size: 1.1em;
|
||||
opacity: 0.85;
|
||||
}
|
||||
|
||||
#toast-container .toast.no-title .bx {
|
||||
margin-right: 0;
|
||||
margin-inline-end: 0;
|
||||
font-size: 1.3em;
|
||||
}
|
||||
|
||||
|
||||
@@ -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,8 @@ div.tn-tool-dialog {
|
||||
}
|
||||
|
||||
.delete-notes-list .note-path {
|
||||
padding-left: 8px;
|
||||
padding-inline-start: 8px;
|
||||
color: var(--muted-text-color)
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -401,7 +402,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 +420,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 {
|
||||
|
||||
261
apps/client/src/stylesheets/theme-next/notes/canvas.css
Normal file
261
apps/client/src/stylesheets/theme-next/notes/canvas.css
Normal file
@@ -0,0 +1,261 @@
|
||||
:root .excalidraw {
|
||||
--ui-font: var(--main-font-family);
|
||||
|
||||
|
||||
/* Button hover background color */
|
||||
--button-hover-bg: var(--hover-item-background-color);
|
||||
--color-surface-high: var(--hover-item-background-color);
|
||||
|
||||
|
||||
--button-active-border: transparent;
|
||||
--color-brand-active: transparent;
|
||||
|
||||
--color-surface-mid: transparent;
|
||||
--color-surface-low: transparent;
|
||||
|
||||
/* Slider colors */
|
||||
--color-slider-track: var(--menu-item-delimiter-color);
|
||||
--color-slider-thumb: var(--muted-text-color);
|
||||
|
||||
/* Selected button icon fill color */
|
||||
--color-on-primary-container: var(--ck-editor-toolbar-button-on-color);
|
||||
--color-primary: var(--ck-editor-toolbar-button-on-color);
|
||||
|
||||
/* Selected button icon background color */
|
||||
--color-surface-primary-container: var(--ck-editor-toolbar-button-on-background);
|
||||
--color-primary-light: var(--ck-editor-toolbar-button-on-background);
|
||||
|
||||
--island-bg-color: var(--floating-button-background-color);
|
||||
|
||||
}
|
||||
|
||||
/* Dark theme tweaks */
|
||||
|
||||
:root body .excalidraw.theme--dark {
|
||||
--color-surface-high: transparent;
|
||||
--color-brand-hover: transparent;
|
||||
}
|
||||
|
||||
:root .excalidraw.theme--dark.excalidraw .App-mobile-menu,
|
||||
:root .excalidraw.theme--dark.excalidraw .App-menu__left {
|
||||
--button-hover-bg: var(--hover-item-background-color);
|
||||
}
|
||||
|
||||
:root .excalidraw.theme--dark.excalidraw .dropdown-menu-button:hover {
|
||||
--background: var(--hover-item-background-color);
|
||||
}
|
||||
|
||||
/* Backdrop blur pseudo-element */
|
||||
.Island:not(.App-menu__left)::before,
|
||||
.excalidraw .picker::before,
|
||||
:root .App-menu__left > .panelColumn > fieldset::before,
|
||||
:root .App-menu__left > .panelColumn > label::before,
|
||||
:root .App-menu__left > .panelColumn > div:has(> *)::before {
|
||||
display: block;
|
||||
position: absolute;
|
||||
content: "";
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border-radius: inherit;
|
||||
backdrop-filter: blur(10px) saturate(6);
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
/* Note's root */
|
||||
|
||||
:root .type-canvas {
|
||||
--floating-buttons-vert-offset: 20px;
|
||||
}
|
||||
|
||||
|
||||
/* Context menus */
|
||||
|
||||
/* Context menu - outer wrapper */
|
||||
:root .excalidraw .popover {
|
||||
--padding: 0;
|
||||
|
||||
max-width: unset;
|
||||
overflow: hidden;
|
||||
font-family: var(--main-font-family);
|
||||
}
|
||||
|
||||
/* Context menu - inner wrapper */
|
||||
:root .excalidraw .popover > .context-menu {
|
||||
margin: 0;
|
||||
padding: 8px !important;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
height: 100%;
|
||||
border: none;
|
||||
padding: 0;
|
||||
box-shadow: none;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
/* Context menu item */
|
||||
:root .excalidraw .context-menu .context-menu-item {
|
||||
--menu-item-start-padding: 22px;
|
||||
|
||||
border: 1px solid transparent;
|
||||
}
|
||||
|
||||
/* Context menu item icon */
|
||||
:root .excalidraw .dropdown-menu-item__icon {
|
||||
color: var(--menu-item-icon-color);
|
||||
}
|
||||
|
||||
/* Context menu item label */
|
||||
:root .excalidraw .context-menu-item__label,
|
||||
:root .excalidraw .context-menu-item.dangerous .context-menu-item__label {
|
||||
color: var(--menu-text-color);
|
||||
}
|
||||
|
||||
:root .excalidraw .context-menu-item:hover .context-menu-item__label {
|
||||
color: var(--hover-item-text-color);
|
||||
}
|
||||
|
||||
/* Context menu item keyboard shortcut */
|
||||
:root .excalidraw .context-menu-item__shortcut {
|
||||
padding: 0;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
/* Context menu separator */
|
||||
.excalidraw .context-menu .context-menu-item-separator {
|
||||
margin: 8px 0;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
/* Main menu */
|
||||
|
||||
/* Hide separators - no longer needed as the menu group headers feature a delimiter line */
|
||||
.excalidraw .Island.dropdown-menu-container>div:not(:has(>*)) {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Menu group header */
|
||||
.excalidraw .dropdown-menu-container .dropdown-menu-group-title,
|
||||
.excalidraw .Island.dropdown-menu-container div[data-testid="canvas-background-label"] {
|
||||
margin: 0 !important;
|
||||
}
|
||||
|
||||
/* Header */
|
||||
|
||||
.excalidraw .App-menu.App-menu_top {
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.excalidraw .App-menu.App-menu_top .App-menu_top__left {
|
||||
/* Fixes a layout glitch with the header when the options panel is visbile */
|
||||
--gap: 0 !important;
|
||||
}
|
||||
|
||||
/* The parent element of the "Library" button */
|
||||
.excalidraw .App-menu.App-menu_top > div:nth-child(3) {
|
||||
flex-direction: row-reverse;
|
||||
}
|
||||
|
||||
/* Panels */
|
||||
|
||||
.excalidraw .zoom-actions,
|
||||
.undo-redo-buttons {
|
||||
box-shadow: 1px 1px 1px var(--floating-button-shadow-color);
|
||||
backdrop-filter: blur(10px) saturate(6);
|
||||
}
|
||||
|
||||
:root .excalidraw .main-menu-trigger,
|
||||
:root .excalidraw .sidebar-trigger,
|
||||
:root .excalidraw .help-icon {
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
/* Selected color outline */
|
||||
:root .excalidraw .color-picker__button.active .color-picker__button-outline {
|
||||
box-shadow: 0 0 0 2px var(--input-focus-outline-color);
|
||||
}
|
||||
|
||||
:root .excalidraw .buttonList label.active {
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
/* Options panel */
|
||||
|
||||
.excalidraw .Island.App-menu__left {
|
||||
box-shadow: none;
|
||||
background: transparent;
|
||||
backdrop-filter: none;
|
||||
width: 13.2em;
|
||||
}
|
||||
|
||||
body[dir=ltr] .excalidraw .Island.App-menu__left {
|
||||
right: 0;
|
||||
}
|
||||
|
||||
body[dir=rtl] .excalidraw .Island.App-menu__left {
|
||||
left: 0;
|
||||
}
|
||||
|
||||
:root .App-menu__left > .panelColumn {
|
||||
row-gap: 5px;
|
||||
}
|
||||
|
||||
/* Options panel card */
|
||||
:root .App-menu__left > .panelColumn > fieldset,
|
||||
:root .App-menu__left > .panelColumn > label,
|
||||
:root .App-menu__left > .panelColumn > div:has(> *) {
|
||||
position: relative;
|
||||
margin: 0;
|
||||
border-radius: 4px;
|
||||
box-shadow: 1px 1px 1px var(--floating-button-shadow-color);
|
||||
background: var(--floating-button-background-color);
|
||||
padding: 8px 12px;
|
||||
|
||||
/* backdrop: blur() creates a new stacking context that prevents some popovers like the
|
||||
* arrowheads picker from being positioned correctly. To workaround this, the backdrop blur
|
||||
* effect is applyed using a pseudo-element instead. */
|
||||
}
|
||||
|
||||
/* Options panel card title */
|
||||
:root .App-menu__left fieldset > legend,
|
||||
:root .App-menu__left div > h3,
|
||||
:root .App-menu__left > .panelColumn > label {
|
||||
text-transform: uppercase;
|
||||
font-size: .65rem;
|
||||
letter-spacing: 1pt;
|
||||
color: var(--muted-text-color);
|
||||
}
|
||||
|
||||
/* Options panel button bar */
|
||||
:root .excalidraw .App-menu__left .buttonList {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/* Picker */
|
||||
body[dir=ltr] .excalidraw .App-menu__left .buttonList .picker {
|
||||
translate: -80% 0;
|
||||
}
|
||||
|
||||
/* Properties panel */
|
||||
|
||||
body[dir=ltr] .excalidraw .exc-stats {
|
||||
left: 0;
|
||||
}
|
||||
|
||||
body[dir=rtl] .excalidraw .exc-stats {
|
||||
right: 0;
|
||||
}
|
||||
|
||||
/* Sidebar */
|
||||
|
||||
.split-note-container-widget > .component.type-canvas:has(.excalidraw-container > .Island.default-sidebar) > .floating-buttons {
|
||||
/* Hide the floating buttons when the sidebar is open */
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Pickers */
|
||||
|
||||
.excalidraw .picker {
|
||||
position: relative;
|
||||
}
|
||||
@@ -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,8 @@
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
margin: 4px;
|
||||
padding-right: 2em;
|
||||
background: color-mix(in srgb, var(--accent) 15%, var(--main-background-color));
|
||||
padding-inline-end: 2em;
|
||||
border: 1px solid var(--accent);
|
||||
border-radius: 6px;
|
||||
}
|
||||
@@ -492,7 +493,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 +557,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 +616,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,
|
||||
@@ -665,4 +666,17 @@ html .note-detail-editable-text :not(figure, .include-note, hr):first-child {
|
||||
.ck-content .table > figcaption {
|
||||
background: var(--accented-background-color);
|
||||
color: var(--main-text-color);
|
||||
}
|
||||
|
||||
/* Reference link */
|
||||
|
||||
.ck-content a.reference-link,
|
||||
.ck-content a.reference-link:hover {
|
||||
/* Apply underline only to the span inside the link so it can follow the
|
||||
* target note's user defined color */
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.ck-content a.reference-link > span {
|
||||
text-decoration: underline;
|
||||
}
|
||||
@@ -52,7 +52,7 @@
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
.google-login-btn img {
|
||||
margin-right: 10px;
|
||||
margin-inline-end: 10px;
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
}
|
||||
@@ -63,7 +63,7 @@
|
||||
|
||||
/* Button bar */
|
||||
.search-definition-widget .search-setting-table tbody:last-child div {
|
||||
justify-content: flex-end !important;
|
||||
justify-content: flex-end;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
body {
|
||||
--native-titlebar-darwin-x-offset: 10;
|
||||
--native-titlebar-darwin-y-offset: 17 !important;
|
||||
--native-titlebar-darwin-y-offset: 12 !important;
|
||||
}
|
||||
|
||||
body.layout-horizontal {
|
||||
@@ -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 {
|
||||
@@ -100,7 +100,7 @@ body.layout-horizontal > .horizontal {
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
#launcher-container {
|
||||
body[dir=ltr] #launcher-container {
|
||||
scrollbar-gutter: stable both-edges;
|
||||
}
|
||||
|
||||
@@ -279,14 +279,11 @@ body.layout-horizontal > .horizontal {
|
||||
animation: sync-status-pulse 1s ease-in-out alternate-reverse infinite;
|
||||
}
|
||||
|
||||
#launcher-pane .global-menu-button {
|
||||
--hover-item-background-color: transparent;
|
||||
}
|
||||
#launcher-pane button.global-menu-button {
|
||||
--update-badge-x-offset: 3%;
|
||||
--update-badge-y-offset: -12%;
|
||||
|
||||
#launcher-pane.horizontal .global-menu-button .global-menu-button-update-available {
|
||||
right: -23px;
|
||||
bottom: -22px;
|
||||
transform: scale(0.85);
|
||||
--hover-item-background-color: transparent;
|
||||
}
|
||||
|
||||
.tooltip .tooltip-arrow {
|
||||
@@ -400,9 +397,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 +447,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 +468,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 +477,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 +493,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 +517,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 +536,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,18 +628,18 @@ 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 {
|
||||
position: relative;
|
||||
background: transparent !important;
|
||||
color: var(--left-pane-item-selected-color) !important;
|
||||
color: var(--custom-color, var(--left-pane-item-selected-color));
|
||||
}
|
||||
|
||||
@keyframes left-pane-item-select {
|
||||
@@ -658,10 +655,10 @@ 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);
|
||||
background: var(--left-pane-item-selected-background) !important;
|
||||
inset-inline-end: var(--left-pane-item-selected-shadow-size);
|
||||
background: var(--custom-bg-color, var(--left-pane-item-selected-background)) !important;
|
||||
box-shadow: var(--left-pane-item-selected-shadow);
|
||||
border-radius: 6px;
|
||||
animation: left-pane-item-select 200ms ease-out;
|
||||
@@ -676,7 +673,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 +682,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 +700,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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -717,9 +718,6 @@ body.mobile .fancytree-node > span {
|
||||
margin-top: 0; /* Use this to align the icon with the tree view item's caption */
|
||||
}
|
||||
|
||||
#left-pane span .fancytree-title {
|
||||
margin-top: -5px;
|
||||
}
|
||||
|
||||
#left-pane span.fancytree-active .fancytree-title {
|
||||
font-weight: normal;
|
||||
@@ -734,7 +732,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 +766,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 +815,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 +904,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 +916,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 +931,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 +942,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 +954,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 +1043,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 +1099,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 +1112,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 +1137,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 +1219,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 +1310,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 +1324,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 +1333,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 +1348,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,15 +1398,15 @@ 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;
|
||||
}
|
||||
@@ -1436,6 +1434,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;
|
||||
@@ -1547,7 +1549,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);
|
||||
}
|
||||
@@ -1637,12 +1639,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 */
|
||||
@@ -1662,13 +1664,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 > * {
|
||||
@@ -1700,7 +1702,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 {
|
||||
@@ -1743,7 +1745,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;
|
||||
@@ -1782,10 +1784,6 @@ div.find-replace-widget div.find-widget-found-wrapper > span {
|
||||
--border-radius-lg: 6px;
|
||||
}
|
||||
|
||||
.excalidraw .Island {
|
||||
backdrop-filter: var(--dropdown-backdrop-filter);
|
||||
}
|
||||
|
||||
.excalidraw .Island.App-toolbar {
|
||||
--island-bg-color: var(--floating-button-background-color);
|
||||
--shadow-island: 1px 1px 1px var(--floating-button-shadow-color);
|
||||
@@ -1806,8 +1804,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,10 +15,8 @@ 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;
|
||||
}
|
||||
|
||||
.fancytree-expander {
|
||||
@@ -42,6 +40,7 @@ span.fancytree-node.fancytree-hide {
|
||||
text-overflow: ellipsis;
|
||||
user-select: none !important;
|
||||
-webkit-user-select: none !important;
|
||||
color: var(--custom-color, inherit);
|
||||
}
|
||||
|
||||
.fancytree-node:not(.fancytree-loading) .fancytree-expander {
|
||||
@@ -59,7 +58,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 +83,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,15 +172,15 @@ 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 {
|
||||
color: var(--active-item-text-color) !important;
|
||||
color: var(--active-item-text-color);
|
||||
background-color: var(--active-item-background-color) !important;
|
||||
border-color: transparent; /* invisible border */
|
||||
border-radius: 5px;
|
||||
@@ -229,14 +232,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 */
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,8 @@ import FNote from "../entities/fnote.js";
|
||||
import froca from "../services/froca.js";
|
||||
import FAttribute from "../entities/fattribute.js";
|
||||
import noteAttributeCache from "../services/note_attribute_cache.js";
|
||||
import FBranch from "../entities/fbranch.js";
|
||||
import FBlob from "../entities/fblob.js";
|
||||
|
||||
type AttributeDefinitions = { [key in `#${string}`]: string; };
|
||||
type RelationDefinitions = { [key in `~${string}`]: string; };
|
||||
@@ -10,6 +12,8 @@ type RelationDefinitions = { [key in `~${string}`]: string; };
|
||||
interface NoteDefinition extends AttributeDefinitions, RelationDefinitions {
|
||||
id?: string | undefined;
|
||||
title: string;
|
||||
children?: NoteDefinition[];
|
||||
content?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -47,6 +51,38 @@ export function buildNote(noteDef: NoteDefinition) {
|
||||
blobId: ""
|
||||
});
|
||||
froca.notes[note.noteId] = note;
|
||||
let childNotePosition = 0;
|
||||
|
||||
// Manage content.
|
||||
const content = noteDef.content ?? "";
|
||||
note.getContent = async () => content;
|
||||
|
||||
const blob = new FBlob({
|
||||
blobId: utils.randomString(10),
|
||||
content,
|
||||
contentLength: content.length,
|
||||
dateModified: new Date().toISOString(),
|
||||
utcDateModified: new Date().toISOString()
|
||||
});
|
||||
note.getBlob = async () => blob;
|
||||
|
||||
// Manage children.
|
||||
if (noteDef.children) {
|
||||
for (const childDef of noteDef.children) {
|
||||
const childNote = buildNote(childDef);
|
||||
const branchId = `${note.noteId}_${childNote.noteId}`;
|
||||
const branch = new FBranch(froca, {
|
||||
branchId,
|
||||
noteId: childNote.noteId,
|
||||
parentNoteId: note.noteId,
|
||||
notePosition: childNotePosition,
|
||||
fromSearchNote: false
|
||||
});
|
||||
froca.branches[branchId] = branch;
|
||||
note.addChild(childNote.noteId, branchId, false);
|
||||
childNotePosition += 10;
|
||||
}
|
||||
}
|
||||
|
||||
let position = 0;
|
||||
for (const [ key, value ] of Object.entries(noteDef)) {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -646,7 +646,9 @@
|
||||
"about": "关于 TriliumNext 笔记",
|
||||
"logout": "登出",
|
||||
"show-cheatsheet": "显示快捷帮助",
|
||||
"toggle-zen-mode": "禅模式"
|
||||
"toggle-zen-mode": "禅模式",
|
||||
"new-version-available": "新更新可用",
|
||||
"download-update": "取得版本 {{latestVersion}}"
|
||||
},
|
||||
"zen_mode": {
|
||||
"button_exit": "退出禅模式"
|
||||
@@ -736,7 +738,8 @@
|
||||
"insert_child_note": "插入子笔记",
|
||||
"delete_this_note": "删除此笔记",
|
||||
"error_cannot_get_branch_id": "无法获取 notePath '{{notePath}}' 的 branchId",
|
||||
"error_unrecognized_command": "无法识别的命令 {{command}}"
|
||||
"error_unrecognized_command": "无法识别的命令 {{command}}",
|
||||
"note_revisions": "笔记历史版本"
|
||||
},
|
||||
"note_icon": {
|
||||
"change_note_icon": "更改笔记图标",
|
||||
@@ -749,7 +752,7 @@
|
||||
"editable": "可编辑",
|
||||
"basic_properties": "基本属性",
|
||||
"language": "语言",
|
||||
"configure_code_notes": "配置代码注释..."
|
||||
"configure_code_notes": "配置代码笔记…"
|
||||
},
|
||||
"book_properties": {
|
||||
"view_type": "视图类型",
|
||||
@@ -765,7 +768,8 @@
|
||||
"table": "表格",
|
||||
"geo-map": "地理地图",
|
||||
"board": "看板",
|
||||
"include_archived_notes": "展示归档笔记"
|
||||
"include_archived_notes": "展示归档笔记",
|
||||
"presentation": "演示"
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "今天还没有编辑过的笔记...",
|
||||
@@ -1258,7 +1262,13 @@
|
||||
"min-days-in-first-week": "第一周的最小天数",
|
||||
"first-week-info": "第一周包含一年的第一个周四,基于 <a href=\"https://en.wikipedia.org/wiki/ISO_week_date#First_week\">ISO 8601</a> 标准。",
|
||||
"first-week-warning": "更改第一周选项可能会导致与现有周笔记重复,已创建的周笔记将不会相应更新。",
|
||||
"formatting-locale": "日期和数字格式"
|
||||
"formatting-locale": "日期和数字格式",
|
||||
"tuesday": "周二",
|
||||
"wednesday": "周三",
|
||||
"thursday": "周四",
|
||||
"friday": "周五",
|
||||
"saturday": "周六",
|
||||
"formatting-locale-auto": "依应用的语言设置"
|
||||
},
|
||||
"backup": {
|
||||
"automatic_backup": "自动备份",
|
||||
@@ -2065,5 +2075,10 @@
|
||||
},
|
||||
"collections": {
|
||||
"rendering_error": "出现错误无法显示内容。"
|
||||
},
|
||||
"presentation_view": {
|
||||
"edit-slide": "编辑此幻灯片",
|
||||
"start-presentation": "开始演示",
|
||||
"slide-overview": "切换幻灯片概览"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"homepage": "Domovská stránka:",
|
||||
"app_version": "Verze aplikace:",
|
||||
"db_version": "Verze DB:",
|
||||
"sync_version": "Verze sync:",
|
||||
"sync_version": "Verze synchronizace:",
|
||||
"build_date": "Datum sestavení:",
|
||||
"build_revision": "Revize sestavení:",
|
||||
"data_directory": "Datový adresář:"
|
||||
@@ -36,6 +36,29 @@
|
||||
"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"
|
||||
"search_note": "hledat poznámku podle názvu",
|
||||
"link_title": "Název odkazu",
|
||||
"button_add_link": "Přidat odkaz"
|
||||
},
|
||||
"branch_prefix": {
|
||||
"prefix": "Prefix: ",
|
||||
"save": "Uložit"
|
||||
},
|
||||
"bulk_actions": {
|
||||
"bulk_actions": "Hromadné akce",
|
||||
"affected_notes": "Ovlivněné poznámky",
|
||||
"notes": "Poznámky"
|
||||
},
|
||||
"confirm": {
|
||||
"cancel": "Zrušit",
|
||||
"ok": "OK"
|
||||
},
|
||||
"delete_notes": {
|
||||
"cancel": "Zrušit",
|
||||
"ok": "OK",
|
||||
"close": "Zavřít"
|
||||
},
|
||||
"export": {
|
||||
"close": "Zavřít"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -184,7 +184,8 @@
|
||||
},
|
||||
"import-status": "Importstatus",
|
||||
"in-progress": "Import läuft: {{progress}}",
|
||||
"successful": "Import erfolgreich abgeschlossen."
|
||||
"successful": "Import erfolgreich abgeschlossen.",
|
||||
"importZipRecommendation": "Beim Import einer ZIP-Datei wird die Notizhierarchie aus der Ordnerstruktur im Archiv übernommen."
|
||||
},
|
||||
"include_note": {
|
||||
"dialog_title": "Notiz beifügen",
|
||||
@@ -646,7 +647,8 @@
|
||||
"about": "Über Trilium Notes",
|
||||
"logout": "Abmelden",
|
||||
"show-cheatsheet": "Cheatsheet anzeigen",
|
||||
"toggle-zen-mode": "Zen Modus"
|
||||
"toggle-zen-mode": "Zen Modus",
|
||||
"new-version-available": "Neues Update verfügbar"
|
||||
},
|
||||
"sync_status": {
|
||||
"unknown": "<p>Der Synchronisations-Status wird bekannt, sobald der nächste Synchronisierungsversuch gestartet wird.</p><p>Klicke, um eine Synchronisierung jetzt auszulösen.</p>",
|
||||
@@ -733,7 +735,8 @@
|
||||
"insert_child_note": "Untergeordnete Notiz einfügen",
|
||||
"delete_this_note": "Diese Notiz löschen",
|
||||
"error_cannot_get_branch_id": "BranchId für notePath „{{notePath}}“ kann nicht abgerufen werden",
|
||||
"error_unrecognized_command": "Unbekannter Befehl {{command}}"
|
||||
"error_unrecognized_command": "Unbekannter Befehl {{command}}",
|
||||
"note_revisions": "Notiz Revisionen"
|
||||
},
|
||||
"note_icon": {
|
||||
"change_note_icon": "Notiz-Icon ändern",
|
||||
@@ -762,7 +765,8 @@
|
||||
"table": "Tabelle",
|
||||
"geo-map": "Weltkarte",
|
||||
"board": "Tafel",
|
||||
"include_archived_notes": "Zeige archivierte Notizen"
|
||||
"include_archived_notes": "Zeige archivierte Notizen",
|
||||
"presentation": "Präsentation"
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "An diesem Tag wurden noch keine Notizen bearbeitet...",
|
||||
@@ -1255,7 +1259,13 @@
|
||||
"min-days-in-first-week": "Mindestanzahl an Tagen in erster Woche",
|
||||
"first-week-info": "Die erste Woche, die den ersten Donnerstag des Jahres enthält, basiert auf dem Standard <a href=\"https://en.wikipedia.org/wiki/ISO_week_date#First_week\">ISO 8601</a>.",
|
||||
"first-week-warning": "Das Ändern der Optionen für die erste Woche kann zu Duplikaten mit bestehenden Wochen-Notizen führen. Bestehende Wochen-Notizen werden nicht entsprechend aktualisiert.",
|
||||
"formatting-locale": "Datums- und Zahlenformat"
|
||||
"formatting-locale": "Datums- und Zahlenformat",
|
||||
"tuesday": "Dienstag",
|
||||
"wednesday": "Mittwoch",
|
||||
"thursday": "Donnerstag",
|
||||
"friday": "Freitag",
|
||||
"saturday": "Samstag",
|
||||
"formatting-locale-auto": "Basierend auf die Anwendungssprache"
|
||||
},
|
||||
"backup": {
|
||||
"automatic_backup": "Automatische Sicherung",
|
||||
@@ -1512,7 +1522,9 @@
|
||||
"window-on-top": "Dieses Fenster immer oben halten"
|
||||
},
|
||||
"note_detail": {
|
||||
"could_not_find_typewidget": "Konnte typeWidget für Typ ‚{{type}}‘ nicht finden"
|
||||
"could_not_find_typewidget": "Konnte typeWidget für Typ ‚{{type}}‘ nicht finden",
|
||||
"printing": "Druckvorgang läuft…",
|
||||
"printing_pdf": "PDF-Export läuft…"
|
||||
},
|
||||
"note_title": {
|
||||
"placeholder": "Titel der Notiz hier eingeben…"
|
||||
@@ -2067,5 +2079,9 @@
|
||||
},
|
||||
"collections": {
|
||||
"rendering_error": "Aufgrund eines Fehlers können keine Inhalte angezeigt werden."
|
||||
},
|
||||
"presentation_view": {
|
||||
"edit-slide": "Folie bearbeiten",
|
||||
"start-presentation": "Präsentation starten"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,18 +1,24 @@
|
||||
{
|
||||
"about": {
|
||||
"title": "Πληροφορίες για το Trilium Notes",
|
||||
"homepage": "Αρχική Σελίδα:",
|
||||
"app_version": "Έκδοση εφαρμογής:",
|
||||
"db_version": "Έκδοση βάσης δεδομένων:",
|
||||
"sync_version": "Έκδοση πρωτοκόλου συγχρονισμού:",
|
||||
"build_date": "Ημερομηνία χτισίματος εφαρμογής:",
|
||||
"build_revision": "Αριθμός αναθεώρησης χτισίματος:",
|
||||
"data_directory": "Φάκελος δεδομένων:"
|
||||
},
|
||||
"toast": {
|
||||
"critical-error": {
|
||||
"title": "Κρίσιμο σφάλμα",
|
||||
"message": "Συνέβη κάποιο κρίσιμο σφάλμα, το οποίο δεν επιτρέπει στην εφαρμογή χρήστη να ξεκινήσει:\n\n{{message}}\n\nΤο πιθανότερο είναι να προκλήθηκε από κάποιο script που απέτυχε απρόοπτα. Δοκιμάστε να ξεκινήσετε την εφαρμογή σε ασφαλή λειτουργία για να λύσετε το πρόβλημα."
|
||||
}
|
||||
"about": {
|
||||
"title": "Πληροφορίες για το Trilium Notes",
|
||||
"homepage": "Αρχική Σελίδα:",
|
||||
"app_version": "Έκδοση εφαρμογής:",
|
||||
"db_version": "Έκδοση βάσης δεδομένων:",
|
||||
"sync_version": "Έκδοση πρωτοκόλου συγχρονισμού:",
|
||||
"build_date": "Ημερομηνία χτισίματος εφαρμογής:",
|
||||
"build_revision": "Αριθμός αναθεώρησης χτισίματος:",
|
||||
"data_directory": "Φάκελος δεδομένων:"
|
||||
},
|
||||
"toast": {
|
||||
"critical-error": {
|
||||
"title": "Κρίσιμο σφάλμα",
|
||||
"message": "Συνέβη κάποιο κρίσιμο σφάλμα, το οποίο δεν επιτρέπει στην εφαρμογή χρήστη να ξεκινήσει:\n\n{{message}}\n\nΤο πιθανότερο είναι να προκλήθηκε από κάποιο script που απέτυχε απρόοπτα. Δοκιμάστε να ξεκινήσετε την εφαρμογή σε ασφαλή λειτουργία για να λύσετε το πρόβλημα."
|
||||
}
|
||||
},
|
||||
"ai_llm": {
|
||||
"n_notes_queued": "{{ count }} σημείωση στην ουρά για εύρεση",
|
||||
"n_notes_queued_plural": "{{ count }} σημειώσεις στην ουρά για εύρεση",
|
||||
"notes_indexed": "{{ count }} σημείωση με ευρετήριο",
|
||||
"notes_indexed_plural": "{{ count }} σημειώσεις με ευρετήριο"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,6 +164,7 @@
|
||||
"importIntoNote": "Import into note",
|
||||
"chooseImportFile": "Choose import file",
|
||||
"importDescription": "Content of the selected file(s) will be imported as child note(s) into",
|
||||
"importZipRecommendation": "When importing a ZIP file, the note hierarchy will reflect the subdirectory structure within the archive.",
|
||||
"options": "Options",
|
||||
"safeImportTooltip": "Trilium <code>.zip</code> export files can contain executable scripts which may contain harmful behavior. Safe import will deactivate automatic execution of all imported scripts. Uncheck \"Safe import\" only if the imported archive is supposed to contain executable scripts and you completely trust the contents of the import file.",
|
||||
"safeImport": "Safe import",
|
||||
@@ -646,7 +647,9 @@
|
||||
"about": "About Trilium Notes",
|
||||
"logout": "Logout",
|
||||
"show-cheatsheet": "Show Cheatsheet",
|
||||
"toggle-zen-mode": "Zen Mode"
|
||||
"toggle-zen-mode": "Zen Mode",
|
||||
"new-version-available": "New Update Available",
|
||||
"download-update": "Get Version {{latestVersion}}"
|
||||
},
|
||||
"zen_mode": {
|
||||
"button_exit": "Exit Zen Mode"
|
||||
@@ -735,6 +738,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}}"
|
||||
},
|
||||
@@ -765,6 +769,7 @@
|
||||
"table": "Table",
|
||||
"geo-map": "Geo Map",
|
||||
"board": "Board",
|
||||
"presentation": "Presentation",
|
||||
"include_archived_notes": "Show archived notes"
|
||||
},
|
||||
"edited_notes": {
|
||||
@@ -1413,8 +1418,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 +1432,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",
|
||||
@@ -1712,7 +1723,9 @@
|
||||
"window-on-top": "Keep Window on Top"
|
||||
},
|
||||
"note_detail": {
|
||||
"could_not_find_typewidget": "Could not find typeWidget for type '{{type}}'"
|
||||
"could_not_find_typewidget": "Could not find typeWidget for type '{{type}}'",
|
||||
"printing": "Printing in progress...",
|
||||
"printing_pdf": "Exporting to PDF in progress..."
|
||||
},
|
||||
"note_title": {
|
||||
"placeholder": "type note's title here..."
|
||||
@@ -2020,6 +2033,11 @@
|
||||
"edit-note-title": "Click to edit note title",
|
||||
"edit-column-title": "Click to edit column title"
|
||||
},
|
||||
"presentation_view": {
|
||||
"edit-slide": "Edit this slide",
|
||||
"start-presentation": "Start presentation",
|
||||
"slide-overview": "Toggle an overview of the slides"
|
||||
},
|
||||
"command_palette": {
|
||||
"tree-action-name": "Tree: {{name}}",
|
||||
"export_note_title": "Export Note",
|
||||
|
||||
@@ -354,7 +354,7 @@
|
||||
"calendar_root": "marca la nota que debe usarse como raíz para las notas del día. Sólo uno debe estar marcado como tal.",
|
||||
"archived": "las notas con esta etiqueta no serán visibles de forma predeterminada en los resultados de búsqueda (tampoco en los cuadros de diálogo Saltar a, Agregar vínculo, etc.).",
|
||||
"exclude_from_export": "las notas (con su subárbol) no se incluirán en ninguna exportación de notas",
|
||||
"run": "define en qué eventos debe ejecutarse el script. Los valores posibles son:\n<ul>\n<li>frontendStartup - cuando el frontend de Trilium inicia (o es recargado), pero no en dispositivos móviles. </li>\n<li>backendStartup - cuando el backend de Trilium se inicia </li>\n<li>hourly - se ejecuta una vez cada hora. Puede usar etiqueta adicional <code>runAtHour</code> para especificar a la hora. </li>\n<li>daily - ejecutar una vez al día </li>\n</ul>",
|
||||
"run": "define en qué eventos debe ejecutarse el script. Los valores posibles son:\n<ul>\n<li>frontendStartup - cuando Trilium frontend se inicia (o se actualiza), pero no en móvil.</li>\n<li>mobileStartup - cuando Trilium frontend se inicia (o se actualiza), en móvil.</li>\n<li>backendStartup - cuando Trilium backend se inicia</li>\n<li>hourly - se ejecuta una vez por hora. Se puede usar la etiqueta adicional <code>runAtHour</code> para especificar a qué hora.</li>\n<li>daily - se ejecuta una vez al día</li>\n</ul>",
|
||||
"run_on_instance": "Definir en qué instancia de Trilium se debe ejecutar esto. Predeterminado para todas las instancias.",
|
||||
"run_at_hour": "¿A qué hora debería funcionar? Debe usarse junto con <code>#run=hourly</code>. Se puede definir varias veces para varias ejecuciones durante el día.",
|
||||
"disable_inclusion": "los scripts con esta etiqueta no se incluirán en la ejecución del script principal.",
|
||||
@@ -384,7 +384,7 @@
|
||||
"inbox": "ubicación predeterminada de la bandeja de entrada para nuevas notas - cuando crea una nota usando el botón \"nueva nota\" en la barra lateral, las notas serán creadas como subnotas de la nota marcada con la etiqueta <code>#inbox</code>.",
|
||||
"workspace_inbox": "ubicación predeterminada de la bandeja de entrada para nuevas notas cuando se anclan a algún antecesor de esta nota del espacio de trabajo",
|
||||
"sql_console_home": "ubicación predeterminada de las notas de la consola SQL",
|
||||
"bookmark_folder": "la nota con esta etiqueta aparecerá en los marcadores como carpeta (permitiendo el acceso a sus elementos hijos).",
|
||||
"bookmark_folder": "la nota con esta etiqueta aparecerá en los marcadores como carpeta (permitiendo el acceso a sus elementos hijos)",
|
||||
"share_hidden_from_tree": "esta nota está oculta en el árbol de navegación izquierdo, pero aún se puede acceder a ella con su URL",
|
||||
"share_external_link": "la nota actuará como un enlace a un sitio web externo en el árbol compartido",
|
||||
"share_alias": "define un alias que al usar la nota va a estar disponible en https://your_trilium_host/share/[tu_alias]",
|
||||
@@ -646,7 +646,9 @@
|
||||
"about": "Acerca de Trilium Notes",
|
||||
"logout": "Cerrar sesión",
|
||||
"show-cheatsheet": "Mostrar hoja de trucos",
|
||||
"toggle-zen-mode": "Modo Zen"
|
||||
"toggle-zen-mode": "Modo Zen",
|
||||
"new-version-available": "Nueva actualización disponible",
|
||||
"download-update": "Obtener versión {{latestVersion}}"
|
||||
},
|
||||
"zen_mode": {
|
||||
"button_exit": "Salir del modo Zen"
|
||||
@@ -736,7 +738,8 @@
|
||||
"insert_child_note": "Insertar subnota",
|
||||
"delete_this_note": "Eliminar esta nota",
|
||||
"error_cannot_get_branch_id": "No se puede obtener el branchID del notePath '{{notePath}}'",
|
||||
"error_unrecognized_command": "Comando no reconocido {{command}}"
|
||||
"error_unrecognized_command": "Comando no reconocido {{command}}",
|
||||
"note_revisions": "Revisiones de notas"
|
||||
},
|
||||
"note_icon": {
|
||||
"change_note_icon": "Cambiar icono de nota",
|
||||
@@ -765,7 +768,8 @@
|
||||
"table": "Tabla",
|
||||
"geo-map": "Mapa Geo",
|
||||
"board": "Tablero",
|
||||
"include_archived_notes": "Mostrar notas archivadas"
|
||||
"include_archived_notes": "Mostrar notas archivadas",
|
||||
"presentation": "Presentación"
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "Aún no hay notas editadas en este día...",
|
||||
@@ -1010,7 +1014,7 @@
|
||||
"start_dragging_relations": "Empiece a arrastrar relaciones desde aquí y suéltelas en otra nota.",
|
||||
"note_not_found": "¡Nota {{noteId}} no encontrada!",
|
||||
"cannot_match_transform": "No se puede coincidir con la transformación: {{transform}}",
|
||||
"note_already_in_diagram": "Note \"{{title}}\" is already in the diagram.",
|
||||
"note_already_in_diagram": "La nota \"{{title}}\" ya está en el diagrama.",
|
||||
"enter_title_of_new_note": "Ingrese el título de la nueva nota",
|
||||
"default_new_note_title": "nueva nota",
|
||||
"click_on_canvas_to_place_new_note": "Haga clic en el lienzo para colocar una nueva nota"
|
||||
@@ -1252,8 +1256,9 @@
|
||||
"indexing_stopped": "Indexado detenido",
|
||||
"indexing_in_progress": "Indexado en progreso...",
|
||||
"last_indexed": "Último indexado",
|
||||
"n_notes_queued": "{{ count }} nota agregada a la cola para indexado",
|
||||
"n_notes_queued_plural": "{{ count }} notas agregadas a la cola para indexado",
|
||||
"n_notes_queued_0": "{{ count }} nota agregada a la cola para indexar",
|
||||
"n_notes_queued_1": "{{ count }} notas agregadas a la cola para indexar",
|
||||
"n_notes_queued_2": "",
|
||||
"note_chat": "Chat de nota",
|
||||
"notes_indexed": "{{ count }} nota indexada",
|
||||
"notes_indexed_plural": "{{ count }} notas indexadas",
|
||||
@@ -1414,7 +1419,13 @@
|
||||
"min-days-in-first-week": "Días mínimos en la primer semana",
|
||||
"first-week-info": "Primer semana que contiene al primer jueves del año está basado en el estándar<a href=\"https://en.wikipedia.org/wiki/ISO_week_date#First_week\">ISO 8601</a>.",
|
||||
"first-week-warning": "Cambiar las opciones de primer semana puede causar duplicados con las Notas Semanales existentes y las Notas Semanales existentes no serán actualizadas respectivamente.",
|
||||
"formatting-locale": "Fecha y formato de número"
|
||||
"formatting-locale": "Fecha y formato de número",
|
||||
"tuesday": "Martes",
|
||||
"wednesday": "Miércoles",
|
||||
"thursday": "Jueves",
|
||||
"friday": "Viernes",
|
||||
"saturday": "Sábado",
|
||||
"formatting-locale-auto": "Basado en el idioma de la aplicación"
|
||||
},
|
||||
"backup": {
|
||||
"automatic_backup": "Copia de seguridad automática",
|
||||
@@ -1507,7 +1518,7 @@
|
||||
"recovery_keys_used": "Usado: {{date}}",
|
||||
"recovery_keys_unused": "El código de recuperación {{index}} está sin usar",
|
||||
"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": "OpenID es un método estandarizado que permite iniciar sesión en sitios web usando una cuenta de otro servicio, como Google, para verificar tu identidad. El emisor predeterminado es Google, pero se puede cambiar a cualquier otro proveedor de OpenID. Consulta <a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">aquí</a> para más información. Sigue 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_user_account": "Cuenta de usuario: ",
|
||||
@@ -1617,8 +1628,8 @@
|
||||
"unarchive": "Desarchivar"
|
||||
},
|
||||
"shared_info": {
|
||||
"shared_publicly": "Esta nota está compartida públicamente en {{- link}}",
|
||||
"shared_locally": "Esta nota está compartida localmente en {{- link}}",
|
||||
"shared_publicly": "Esta nota está compartida públicamente en {{- link}}.",
|
||||
"shared_locally": "Esta nota está compartida localmente en {{- link}}.",
|
||||
"help_link": "Para obtener ayuda visite <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a>."
|
||||
},
|
||||
"note_types": {
|
||||
@@ -1980,7 +1991,8 @@
|
||||
"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"
|
||||
"edit-column-title": "Haga clic para editar el título de la columna",
|
||||
"remove-from-board": "Eliminar del tablero"
|
||||
},
|
||||
"content_renderer": {
|
||||
"open_externally": "Abrir externamente"
|
||||
@@ -2035,7 +2047,7 @@
|
||||
},
|
||||
"call_to_action": {
|
||||
"next_theme_title": "Prueba el nuevo tema de Trilium",
|
||||
"next_theme_message": "Estas usando actualmente el tema heredado, ¿Te gustaría probar el nuevo tema?",
|
||||
"next_theme_message": "Estás usando actualmente el tema heredado. ¿Te gustaría probar el nuevo tema?",
|
||||
"next_theme_button": "Prueba el nuevo tema",
|
||||
"background_effects_title": "Los efectos de fondo son ahora estables",
|
||||
"background_effects_message": "En los dispositivos Windows, los efectos de fondo ya son totalmente estables. Los efectos de fondo añaden un toque de color a la interfaz de usuario difuminando el fondo que hay detrás. Esta técnica también se utiliza en otras aplicaciones como el Explorador de Windows.",
|
||||
@@ -2063,5 +2075,13 @@
|
||||
"pagination": {
|
||||
"total_notes": "{{count}} notas",
|
||||
"page_title": "Página de {{startIndex}} - {{endIndex}}"
|
||||
},
|
||||
"presentation_view": {
|
||||
"edit-slide": "Editar este slide",
|
||||
"start-presentation": "Iniciar presentación",
|
||||
"slide-overview": "Alternar vista general de los slides"
|
||||
},
|
||||
"collections": {
|
||||
"rendering_error": "No se puede mostrar contenido debido a un error."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -184,7 +184,8 @@
|
||||
},
|
||||
"import-status": "Statut de l'importation",
|
||||
"in-progress": "Importation en cours : {{progress}}",
|
||||
"successful": "Importation terminée avec succès."
|
||||
"successful": "Importation terminée avec succès.",
|
||||
"importZipRecommendation": "Lors de l'importation d'un fichier ZIP, la hiérarchie des notes reflétera la structure des sous-répertoires au sein de l'archive."
|
||||
},
|
||||
"include_note": {
|
||||
"dialog_title": "Inclure une note",
|
||||
@@ -276,7 +277,12 @@
|
||||
"preview": "Aperçu :",
|
||||
"preview_not_available": "L'aperçu n'est pas disponible pour ce type de note.",
|
||||
"restore_button": "Restaurer",
|
||||
"delete_button": "Supprimer"
|
||||
"delete_button": "Supprimer",
|
||||
"diff_on": "Afficher les différences",
|
||||
"diff_off": "Afficher le contenu",
|
||||
"diff_on_hint": "Cliquer pour afficher les différences avec la note d'origine",
|
||||
"diff_off_hint": "Cliquer pour afficher le contenu de la note",
|
||||
"diff_not_available": "La comparaison n'est pas disponible."
|
||||
},
|
||||
"sort_child_notes": {
|
||||
"sort_children_by": "Trier les enfants par...",
|
||||
@@ -641,7 +647,9 @@
|
||||
"about": "À propos de Trilium Notes",
|
||||
"logout": "Déconnexion",
|
||||
"show-cheatsheet": "Afficher l'aide rapide",
|
||||
"toggle-zen-mode": "Zen Mode"
|
||||
"toggle-zen-mode": "Zen Mode",
|
||||
"new-version-available": "Nouvelle mise à jour disponible",
|
||||
"download-update": "Obtenir la version {{latestVersion}}"
|
||||
},
|
||||
"zen_mode": {
|
||||
"button_exit": "Sortir du Zen mode"
|
||||
@@ -668,7 +676,7 @@
|
||||
"search_in_note": "Rechercher dans la note",
|
||||
"note_source": "Code source",
|
||||
"note_attachments": "Pièces jointes",
|
||||
"open_note_externally": "Ouverture externe",
|
||||
"open_note_externally": "Ouvrir la note en externe",
|
||||
"open_note_externally_title": "Le fichier sera ouvert dans une application externe et les modifications apportées seront surveillées. Vous pourrez ensuite téléverser la version modifiée dans Trilium.",
|
||||
"open_note_custom": "Ouvrir la note avec",
|
||||
"import_files": "Importer des fichiers",
|
||||
@@ -731,7 +739,8 @@
|
||||
"insert_child_note": "Insérer une note enfant",
|
||||
"delete_this_note": "Supprimer cette note",
|
||||
"error_cannot_get_branch_id": "Impossible d'obtenir branchId pour notePath '{{notePath}}'",
|
||||
"error_unrecognized_command": "Commande non reconnue {{command}}"
|
||||
"error_unrecognized_command": "Commande non reconnue {{command}}",
|
||||
"note_revisions": "Révision de la note"
|
||||
},
|
||||
"note_icon": {
|
||||
"change_note_icon": "Changer l'icône de note",
|
||||
@@ -760,7 +769,8 @@
|
||||
"table": "Tableau",
|
||||
"geo-map": "Carte géographique",
|
||||
"board": "Tableau de bord",
|
||||
"include_archived_notes": "Afficher les notes archivées"
|
||||
"include_archived_notes": "Afficher les notes archivées",
|
||||
"presentation": "Présentation"
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "Aucune note modifiée ce jour-là...",
|
||||
@@ -1135,7 +1145,8 @@
|
||||
"code_auto_read_only_size": {
|
||||
"title": "Taille pour la lecture seule automatique",
|
||||
"description": "La taille pour la lecture seule automatique est le seuil au-delà de laquelle les notes seront affichées en mode lecture seule (pour optimiser les performances).",
|
||||
"label": "Taille pour la lecture seule automatique (notes de code)"
|
||||
"label": "Taille pour la lecture seule automatique (notes de code)",
|
||||
"unit": "caractères"
|
||||
},
|
||||
"code_mime_types": {
|
||||
"title": "Types MIME disponibles dans la liste déroulante"
|
||||
@@ -1154,7 +1165,8 @@
|
||||
"download_images_description": "Le HTML collé peut contenir des références à des images en ligne, Trilium trouvera ces références et téléchargera les images afin qu'elles soient disponibles hors ligne.",
|
||||
"enable_image_compression": "Activer la compression des images",
|
||||
"max_image_dimensions": "Largeur/hauteur maximale d'une image en pixels (l'image sera redimensionnée si elle dépasse ce paramètre).",
|
||||
"jpeg_quality_description": "Qualité JPEG (10 - pire qualité, 100 - meilleure qualité, 50 - 85 est recommandé)"
|
||||
"jpeg_quality_description": "Qualité JPEG (10 - pire qualité, 100 - meilleure qualité, 50 - 85 est recommandé)",
|
||||
"max_image_dimensions_unit": "pixels"
|
||||
},
|
||||
"attachment_erasure_timeout": {
|
||||
"attachment_erasure_timeout": "Délai d'effacement des pièces jointes",
|
||||
@@ -1186,7 +1198,8 @@
|
||||
"note_revisions_snapshot_limit_description": "La limite du nombre de versions de note désigne le nombre maximum de versions pouvant être enregistrées pour chaque note. -1 signifie aucune limite, 0 signifie supprimer toutes les versions. Vous pouvez définir le nombre maximal de versions pour une seule note avec le label #versioningLimit.",
|
||||
"snapshot_number_limit_label": "Nombre limite de versions de note :",
|
||||
"erase_excess_revision_snapshots": "Effacer maintenant les versions en excès",
|
||||
"erase_excess_revision_snapshots_prompt": "Les versions en excès ont été effacées."
|
||||
"erase_excess_revision_snapshots_prompt": "Les versions en excès ont été effacées.",
|
||||
"snapshot_number_limit_unit": "instantanés"
|
||||
},
|
||||
"search_engine": {
|
||||
"title": "Moteur de recherche",
|
||||
@@ -1228,19 +1241,35 @@
|
||||
"title": "Table des matières",
|
||||
"description": "La table des matières apparaîtra dans les notes textuelles lorsque la note comporte plus d'un nombre défini de titres. Vous pouvez personnaliser ce nombre :",
|
||||
"disable_info": "Vous pouvez également utiliser cette option pour désactiver la table des matières en définissant un nombre très élevé.",
|
||||
"shortcut_info": "Vous pouvez configurer un raccourci clavier pour afficher/masquer le volet de droite (y compris la table des matières) dans Options -> Raccourcis (nom « toggleRightPane »)."
|
||||
"shortcut_info": "Vous pouvez configurer un raccourci clavier pour afficher/masquer le volet de droite (y compris la table des matières) dans Options -> Raccourcis (nom « toggleRightPane »).",
|
||||
"unit": "titres"
|
||||
},
|
||||
"text_auto_read_only_size": {
|
||||
"title": "Taille automatique en lecture seule",
|
||||
"description": "La taille automatique des notes en lecture seule est la taille au-delà de laquelle les notes seront affichées en mode lecture seule (pour des raisons de performances).",
|
||||
"label": "Taille automatique en lecture seule (notes de texte)"
|
||||
"label": "Taille automatique en lecture seule (notes de texte)",
|
||||
"unit": "caractères"
|
||||
},
|
||||
"i18n": {
|
||||
"title": "Paramètres régionaux",
|
||||
"language": "Langue",
|
||||
"first-day-of-the-week": "Premier jour de la semaine",
|
||||
"sunday": "Dimanche",
|
||||
"monday": "Lundi"
|
||||
"monday": "Lundi",
|
||||
"tuesday": "Mardi",
|
||||
"wednesday": "Mercredi",
|
||||
"thursday": "Jeudi",
|
||||
"friday": "Vendredi",
|
||||
"saturday": "Samedi",
|
||||
"first-week-of-the-year": "Première semaine de l'année",
|
||||
"first-week-contains-first-day": "La première semaine contient le premier jour de l'année",
|
||||
"first-week-contains-first-thursday": "La première semaine contient le premier jeudi de l'année",
|
||||
"first-week-has-minimum-days": "La première semaine a un nombre minimum de jours",
|
||||
"min-days-in-first-week": "Nombre minimum de jours dans la première semaine",
|
||||
"first-week-info": "La première semaine contient le premier jeudi de l'année et est basée sur la norme <a href=\"https://en.wikipedia.org/wiki/ISO_week_date#First_week\">ISO 8601</a> .",
|
||||
"first-week-warning": "La modification des options de la première semaine peut entraîner des doublons avec les notes de semaine existantes et les notes de semaine existantes ne seront pas mises à jour en conséquence.",
|
||||
"formatting-locale": "Format de date et de nombre",
|
||||
"formatting-locale-auto": "En fonction de la langue de l'application"
|
||||
},
|
||||
"backup": {
|
||||
"automatic_backup": "Sauvegarde automatique",
|
||||
@@ -1278,7 +1307,9 @@
|
||||
"delete_token": "Supprimer/désactiver ce token",
|
||||
"rename_token_title": "Renommer le jeton",
|
||||
"rename_token_message": "Veuillez saisir le nom du nouveau jeton",
|
||||
"delete_token_confirmation": "Êtes-vous sûr de vouloir supprimer le jeton ETAPI « {{name}} » ?"
|
||||
"delete_token_confirmation": "Êtes-vous sûr de vouloir supprimer le jeton ETAPI « {{name}} » ?",
|
||||
"see_more": "Voir plus de détails dans le {{- link_to_wiki}} et le {{- link_to_openapi_spec}} ou le {{- link_to_swagger_ui }}.",
|
||||
"swagger_ui": "Interface utilisateur ETAPI Swagger"
|
||||
},
|
||||
"options_widget": {
|
||||
"options_status": "Statut des options",
|
||||
@@ -1341,7 +1372,8 @@
|
||||
"test_title": "Test de synchronisation",
|
||||
"test_description": "Testera la connexion et la prise de contact avec le serveur de synchronisation. Si le serveur de synchronisation n'est pas initialisé, cela le configurera pour qu'il se synchronise avec le document local.",
|
||||
"test_button": "Tester la synchronisation",
|
||||
"handshake_failed": "Échec de la négociation avec le serveur de synchronisation, erreur : {{message}}"
|
||||
"handshake_failed": "Échec de la négociation avec le serveur de synchronisation, erreur : {{message}}",
|
||||
"timeout_unit": "millisecondes"
|
||||
},
|
||||
"api_log": {
|
||||
"close": "Fermer"
|
||||
@@ -1401,11 +1433,14 @@
|
||||
"import-into-note": "Importer dans la note",
|
||||
"apply-bulk-actions": "Appliquer des Actions groupées",
|
||||
"converted-to-attachments": "Les notes {{count}} ont été converties en pièces jointes.",
|
||||
"convert-to-attachment-confirm": "Êtes-vous sûr de vouloir convertir les notes sélectionnées en pièces jointes de leurs notes parentes ?"
|
||||
"convert-to-attachment-confirm": "Êtes-vous sûr de vouloir convertir les notes sélectionnées en pièces jointes de leurs notes parentes ?",
|
||||
"archive": "Archive",
|
||||
"unarchive": "Désarchiver",
|
||||
"open-in-popup": "Modification rapide"
|
||||
},
|
||||
"shared_info": {
|
||||
"shared_publicly": "Cette note est partagée publiquement sur {{- link}}",
|
||||
"shared_locally": "Cette note est partagée localement sur {{- link}}",
|
||||
"shared_publicly": "Cette note est partagée publiquement sur {{- link}}.",
|
||||
"shared_locally": "Cette note est partagée localement sur {{- link}}.",
|
||||
"help_link": "Pour obtenir de l'aide, visitez le <a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a>."
|
||||
},
|
||||
"note_types": {
|
||||
@@ -1427,7 +1462,11 @@
|
||||
"confirm-change": "Il n'est pas recommandé de modifier le type de note lorsque son contenu n'est pas vide. Voulez-vous continuer ?",
|
||||
"geo-map": "Carte géo",
|
||||
"beta-feature": "Beta",
|
||||
"task-list": "Liste de tâches"
|
||||
"task-list": "Liste de tâches",
|
||||
"book": "Collection",
|
||||
"ai-chat": "Chat IA",
|
||||
"new-feature": "Nouveau",
|
||||
"collections": "Collections"
|
||||
},
|
||||
"protect_note": {
|
||||
"toggle-on": "Protéger la note",
|
||||
@@ -1480,13 +1519,16 @@
|
||||
"hoist-this-note-workspace": "Focus cette note (espace de travail)",
|
||||
"refresh-saved-search-results": "Rafraîchir les résultats de recherche enregistrée",
|
||||
"create-child-note": "Créer une note enfant",
|
||||
"unhoist": "Désactiver le focus"
|
||||
"unhoist": "Désactiver le focus",
|
||||
"toggle-sidebar": "Basculer la barre latérale"
|
||||
},
|
||||
"title_bar_buttons": {
|
||||
"window-on-top": "Épingler cette fenêtre au premier plan"
|
||||
},
|
||||
"note_detail": {
|
||||
"could_not_find_typewidget": "Impossible de trouver typeWidget pour le type '{{type}}'"
|
||||
"could_not_find_typewidget": "Impossible de trouver typeWidget pour le type '{{type}}'",
|
||||
"printing": "Impression en cours...",
|
||||
"printing_pdf": "Export au format PDF en cours..."
|
||||
},
|
||||
"note_title": {
|
||||
"placeholder": "saisir le titre de la note ici..."
|
||||
@@ -1537,7 +1579,9 @@
|
||||
},
|
||||
"clipboard": {
|
||||
"cut": "Les note(s) ont été coupées dans le presse-papiers.",
|
||||
"copied": "Les note(s) ont été coupées dans le presse-papiers."
|
||||
"copied": "Les note(s) ont été coupées dans le presse-papiers.",
|
||||
"copy_failed": "Impossible de copier dans le presse-papiers en raison de problèmes d'autorisation.",
|
||||
"copy_success": "Copié dans le presse-papiers."
|
||||
},
|
||||
"entrypoints": {
|
||||
"note-revision-created": "La version de la note a été créée.",
|
||||
@@ -1559,7 +1603,9 @@
|
||||
"ws": {
|
||||
"sync-check-failed": "Le test de synchronisation a échoué !",
|
||||
"consistency-checks-failed": "Les tests de cohérence ont échoué ! Consultez les journaux pour plus de détails.",
|
||||
"encountered-error": "Erreur \"{{message}}\", consultez la console."
|
||||
"encountered-error": "Erreur \"{{message}}\", consultez la console.",
|
||||
"lost-websocket-connection-title": "Connexion au serveur perdue",
|
||||
"lost-websocket-connection-message": "Vérifiez la configuration de votre proxy inverse (par exemple nginx ou Apache) pour vous assurer que les connexions WebSocket sont correctement autorisées et ne sont pas bloquées."
|
||||
},
|
||||
"hoisted_note": {
|
||||
"confirm_unhoisting": "La note demandée «{{requestedNote}}» est en dehors du sous-arbre de la note focus «{{hoistedNote}}». Le focus doit être désactivé pour accéder à la note. Voulez-vous enlever le focus ?"
|
||||
@@ -1581,13 +1627,15 @@
|
||||
},
|
||||
"highlighting": {
|
||||
"description": "Contrôle la coloration syntaxique des blocs de code à l'intérieur des notes texte, les notes de code ne seront pas affectées.",
|
||||
"color-scheme": "Jeu de couleurs"
|
||||
"color-scheme": "Jeu de couleurs",
|
||||
"title": "Blocs de code"
|
||||
},
|
||||
"code_block": {
|
||||
"word_wrapping": "Saut à la ligne automatique suivant la largeur",
|
||||
"theme_none": "Pas de coloration syntaxique",
|
||||
"theme_group_light": "Thèmes clairs",
|
||||
"theme_group_dark": "Thèmes sombres"
|
||||
"theme_group_dark": "Thèmes sombres",
|
||||
"copy_title": "Copier dans le presse-papiers"
|
||||
},
|
||||
"classic_editor_toolbar": {
|
||||
"title": "Mise en forme"
|
||||
@@ -1625,7 +1673,8 @@
|
||||
"link_context_menu": {
|
||||
"open_note_in_new_tab": "Ouvrir la note dans un nouvel onglet",
|
||||
"open_note_in_new_split": "Ouvrir la note dans une nouvelle division",
|
||||
"open_note_in_new_window": "Ouvrir la note dans une nouvelle fenêtre"
|
||||
"open_note_in_new_window": "Ouvrir la note dans une nouvelle fenêtre",
|
||||
"open_note_in_popup": "Édition rapide"
|
||||
},
|
||||
"electron_integration": {
|
||||
"desktop-application": "Application de bureau",
|
||||
@@ -1645,7 +1694,8 @@
|
||||
"full-text-search": "Recherche dans le texte"
|
||||
},
|
||||
"note_tooltip": {
|
||||
"note-has-been-deleted": "La note a été supprimée."
|
||||
"note-has-been-deleted": "La note a été supprimée.",
|
||||
"quick-edit": "Edition rapide"
|
||||
},
|
||||
"geo-map": {
|
||||
"create-child-note-title": "Créer une nouvelle note enfant et l'ajouter à la carte",
|
||||
@@ -1654,7 +1704,8 @@
|
||||
},
|
||||
"geo-map-context": {
|
||||
"open-location": "Ouvrir la position",
|
||||
"remove-from-map": "Retirer de la carte"
|
||||
"remove-from-map": "Retirer de la carte",
|
||||
"add-note": "Ajouter un marqueur à cet endroit"
|
||||
},
|
||||
"help-button": {
|
||||
"title": "Ouvrir la page d'aide correspondante"
|
||||
@@ -1681,10 +1732,41 @@
|
||||
"minimum_input": "La valeur de temps saisie doit être d'au moins {{minimumSeconds}} secondes."
|
||||
},
|
||||
"multi_factor_authentication": {
|
||||
"oauth_user_email": "Courriel de l'utilisateur : "
|
||||
"oauth_user_email": "Courriel de l'utilisateur : ",
|
||||
"title": "Authentification multifacteur",
|
||||
"description": "L'authentification multifacteur (MFA) renforce la sécurité de votre compte. Au lieu de simplement saisir un mot de passe pour vous connecter, le MFA vous demande de fournir une ou plusieurs preuves supplémentaires pour vérifier votre identité. Ainsi, même si quelqu'un obtient votre mot de passe, il ne peut accéder à votre compte sans cette deuxième information. C'est comme ajouter une serrure supplémentaire à votre porte, rendant l'effraction beaucoup plus difficile.<br><br>Veuillez suivre les instructions ci-dessous pour activer le MFA. Si vous ne configurez pas correctement, la connexion se fera uniquement par mot de passe.",
|
||||
"mfa_enabled": "Activer l'authentification multifacteur",
|
||||
"mfa_method": "Méthode MFA",
|
||||
"electron_disabled": "L'authentification multifacteur n'est actuellement pas prise en charge dans la version de bureau.",
|
||||
"totp_title": "Mot de passe à usage unique basé sur le temps (TOTP)",
|
||||
"totp_description": "Le TOTP (Time-Based One-Time Password) est une fonctionnalité de sécurité qui génère un code unique et temporaire, modifié toutes les 30 secondes. Vous utilisez ce code, associé à votre mot de passe, pour vous connecter à votre compte, ce qui rend l'accès à celui-ci beaucoup plus difficile.",
|
||||
"totp_secret_title": "Générer un secret TOTP",
|
||||
"totp_secret_generate": "Générer un secret TOTP",
|
||||
"totp_secret_regenerate": "Re-générer un secret TOTP",
|
||||
"no_totp_secret_warning": "Pour activer TOTP, vous devez d’abord générer un secret TOTP.",
|
||||
"totp_secret_description_warning": "Après avoir généré un nouveau secret TOTP, vous devrez vous reconnecter avec le nouveau secret TOTP.",
|
||||
"totp_secret_generated": "Secret TOTP généré",
|
||||
"totp_secret_warning": "Veuillez conserver le secret généré dans un endroit sûr. Il ne sera plus affiché.",
|
||||
"totp_secret_regenerate_confirm": "Voulez-vous vraiment régénérer le secret TOTP ? Cela invalidera le secret TOTP précédent et tous les codes de récupération existants.",
|
||||
"recovery_keys_title": "Clés de récupération d'authentification unique",
|
||||
"recovery_keys_description": "Les clés de récupération d'authentification unique sont utilisées pour vous connecter même si vous ne pouvez pas accéder à vos codes d'authentification.",
|
||||
"recovery_keys_description_warning": "Les clés de récupération ne seront plus affichées après avoir quitté la page, conservez-les dans un endroit sûr et sécurisé.<br>Une fois qu'une clé de récupération a été utilisée, elle devient inutilisable.",
|
||||
"recovery_keys_error": "Erreur lors de la génération des codes de récupération",
|
||||
"recovery_keys_no_key_set": "Aucun code de récupération défini",
|
||||
"recovery_keys_generate": "Générer des codes de récupération",
|
||||
"recovery_keys_regenerate": "Re-générer des codes de récupération",
|
||||
"recovery_keys_used": "Utilisé : {{date}}",
|
||||
"recovery_keys_unused": "Le code de récupération {{index}} n'est pas utilisé",
|
||||
"oauth_title": "OAuth/OpenID",
|
||||
"oauth_description": "OpenID est un moyen standardisé de vous connecter à des sites web avec un compte d'un autre service, comme Google, afin de vérifier votre identité. L'émetteur par défaut est Google, mais vous pouvez le modifier pour n'importe quel autre fournisseur OpenID. Consultez <a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">ici</a> pour plus d'informations. Suivez ces <a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">instructions</a> pour configurer un service OpenID via Google.",
|
||||
"oauth_description_warning": "Pour activer OAuth/OpenID, vous devez définir l'URL de base, l'ID client et le secret client OAuth/OpenID dans le fichier config.ini, puis redémarrer l'application. Pour les définir à partir des variables d'environnement, définissez TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID et TRILIUM_OAUTH_CLIENT_SECRET.",
|
||||
"oauth_missing_vars": "Paramètres manquants : {{-variables}}",
|
||||
"oauth_user_account": "Compte utilisateur: ",
|
||||
"oauth_user_not_logged_in": "Pas connecté !"
|
||||
},
|
||||
"modal": {
|
||||
"close": "Fermer"
|
||||
"close": "Fermer",
|
||||
"help_title": "Afficher plus d'informations sur cet écran"
|
||||
},
|
||||
"ai_llm": {
|
||||
"not_started": "Non démarré",
|
||||
@@ -1763,7 +1845,77 @@
|
||||
"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"
|
||||
"reprocess_index_error": "Erreur dans le rafraichissement de l'indice de recherche",
|
||||
"failed_notes": "Notes en erreur",
|
||||
"last_processed": "Dernier traitement",
|
||||
"restore_provider": "Restaurer le fournisseur de recherche",
|
||||
"index_rebuild_progress": "Progression de la reconstruction de l'index",
|
||||
"index_rebuilding": "Optimisation de l'index ({{percentage}}%)",
|
||||
"index_rebuild_complete": "Optimisation de l'index terminée",
|
||||
"index_rebuild_status_error": "Erreur lors de la vérification de l'état de reconstruction de l'index",
|
||||
"provider_precedence": "Priorité du fournisseur",
|
||||
"never": "Jamais",
|
||||
"processing": "Traitement en cours ({{percentage}}%)",
|
||||
"incomplete": "Incomplet ({{percentage}}%)",
|
||||
"complete": "Terminé (100%)",
|
||||
"refreshing": "Mise à jour...",
|
||||
"auto_refresh_notice": "Actualisation automatique toutes les {{seconds}} secondes",
|
||||
"note_queued_for_retry": "Note mise en file d'attente pour une nouvelle tentative",
|
||||
"failed_to_retry_note": "Échec de la nouvelle tentative de note",
|
||||
"all_notes_queued_for_retry": "Toutes les notes ayant échoué sont mises en file d'attente pour une nouvelle tentative",
|
||||
"failed_to_retry_all": "Échec du ré essai des notes",
|
||||
"ai_settings": "Paramètres IA",
|
||||
"api_key_tooltip": "Clé API pour accéder au service",
|
||||
"empty_key_warning": {
|
||||
"anthropic": "La clé API Anthropic est vide. Veuillez saisir une clé API valide.",
|
||||
"openai": "La clé API OpenAI est vide. Veuillez saisir une clé API valide.",
|
||||
"voyage": "La clé API Voyage est vide. Veuillez saisir une clé API valide.",
|
||||
"ollama": "La clé API Ollama est vide. Veuillez saisir une clé API valide."
|
||||
},
|
||||
"agent": {
|
||||
"processing": "Traitement...",
|
||||
"thinking": "Réflexion...",
|
||||
"loading": "Chargement...",
|
||||
"generating": "Génération..."
|
||||
},
|
||||
"name": "IA",
|
||||
"openai": "OpenAI",
|
||||
"use_enhanced_context": "Utiliser un contexte amélioré",
|
||||
"enhanced_context_description": "Fournit à l'IA plus de contexte à partir de la note et de ses notes associées pour de meilleures réponses",
|
||||
"show_thinking": "Montrer la réflexion",
|
||||
"show_thinking_description": "Montrer la chaîne de pensée de l'IA",
|
||||
"enter_message": "Entrez votre message...",
|
||||
"error_contacting_provider": "Erreur lors de la connexion au fournisseur d'IA. Veuillez vérifier vos paramètres et votre connexion Internet.",
|
||||
"error_generating_response": "Erreur lors de la génération de la réponse de l'IA",
|
||||
"index_all_notes": "Indexer toutes les notes",
|
||||
"index_status": "Statut de l'index",
|
||||
"indexed_notes": "Notes indexées",
|
||||
"indexing_stopped": "Arrêt de l'indexation",
|
||||
"indexing_in_progress": "Indexation en cours...",
|
||||
"last_indexed": "Dernière indexée",
|
||||
"note_chat": "Note discussion",
|
||||
"sources": "Sources",
|
||||
"start_indexing": "Démarrage de l'indexation",
|
||||
"use_advanced_context": "Utiliser le contexte avancé",
|
||||
"ollama_no_url": "Ollama n'est pas configuré. Veuillez saisir une URL valide.",
|
||||
"chat": {
|
||||
"root_note_title": "Discussions IA",
|
||||
"root_note_content": "Cette note contient vos conversations de chat IA enregistrées.",
|
||||
"new_chat_title": "Nouvelle discussion",
|
||||
"create_new_ai_chat": "Créer une nouvelle discussion IA"
|
||||
},
|
||||
"create_new_ai_chat": "Créer une nouvelle discussion IA",
|
||||
"configuration_warnings": "Il y a quelques problèmes avec la configuration de votre IA. Veuillez vérifier vos paramètres.",
|
||||
"experimental_warning": "La fonctionnalité LLM est actuellement expérimentale – vous êtes prévenu.",
|
||||
"selected_provider": "Fournisseur sélectionné",
|
||||
"selected_provider_description": "Choisissez le fournisseur d’IA pour les fonctionnalités de discussion et de complétion",
|
||||
"select_model": "Sélectionner le modèle...",
|
||||
"select_provider": "Sélectionnez un fournisseur...",
|
||||
"ai_enabled": "Fonctionnalités d'IA activées",
|
||||
"ai_disabled": "Fonctionnalités d'IA désactivées",
|
||||
"no_models_found_online": "Aucun modèle trouvé. Veuillez vérifier votre clé API et vos paramètres.",
|
||||
"no_models_found_ollama": "Aucun modèle Ollama trouvé. Veuillez vérifier si Ollama est en cours d'exécution.",
|
||||
"error_fetching": "Erreur lors de la récupération des modèles : {{error}}"
|
||||
},
|
||||
"ui-performance": {
|
||||
"title": "Performance",
|
||||
@@ -1772,5 +1924,168 @@
|
||||
"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)"
|
||||
},
|
||||
"custom_date_time_format": {
|
||||
"title": "Format de date/heure personnalisé",
|
||||
"description": "Personnalisez le format de la date et de l'heure insérées via <shortcut /> ou la barre d'outils. Consultez la <doc>Day.js docs</doc> pour connaître les formats disponibles.",
|
||||
"format_string": "Chaîne de format :",
|
||||
"formatted_time": "Date/heure formatée :"
|
||||
},
|
||||
"table_view": {
|
||||
"delete_column_confirmation": "Êtes-vous sûr de vouloir supprimer cette colonne ? L'attribut correspondant sera supprimé de toutes les notes.",
|
||||
"delete-column": "Supprimer la colonne",
|
||||
"new-column-label": "Étiquette",
|
||||
"new-column-relation": "Relation",
|
||||
"edit-column": "Editer la colonne",
|
||||
"add-column-to-the-right": "Ajouter une colonne à droite",
|
||||
"new-row": "Nouvelle ligne",
|
||||
"new-column": "Nouvelle colonne",
|
||||
"sort-column-by": "Trier par « {{title}} »",
|
||||
"sort-column-ascending": "Ascendant",
|
||||
"sort-column-descending": "Descendant",
|
||||
"sort-column-clear": "Annuler le tri",
|
||||
"hide-column": "Masquer la colonne \"{{title}}\"",
|
||||
"show-hide-columns": "Afficher/masquer les colonnes",
|
||||
"row-insert-above": "Insérer une ligne au-dessus",
|
||||
"row-insert-below": "Insérer une ligne au-dessous",
|
||||
"row-insert-child": "Insérer une note enfant",
|
||||
"add-column-to-the-left": "Ajouter une colonne à gauche"
|
||||
},
|
||||
"book_properties_config": {
|
||||
"hide-weekends": "Masquer les week-ends",
|
||||
"display-week-numbers": "Afficher les numéros de semaine",
|
||||
"map-style": "Style de carte :",
|
||||
"max-nesting-depth": "Profondeur d'imbrication maximale :",
|
||||
"raster": "Trame",
|
||||
"vector_light": "Vecteur (clair)",
|
||||
"vector_dark": "Vecteur (foncé)",
|
||||
"show-scale": "Afficher l'échelle"
|
||||
},
|
||||
"table_context_menu": {
|
||||
"delete_row": "Supprimer la ligne"
|
||||
},
|
||||
"board_view": {
|
||||
"delete-note": "Supprimer la note...",
|
||||
"remove-from-board": "Retirer du tableau",
|
||||
"archive-note": "Note archivée",
|
||||
"unarchive-note": "Note désarchivée",
|
||||
"move-to": "Déplacer vers",
|
||||
"insert-above": "Insérer au-dessus",
|
||||
"insert-below": "Insérer au-dessous",
|
||||
"delete-column": "Supprimer la colonne",
|
||||
"delete-column-confirmation": "Êtes-vous sûr de vouloir supprimer cette colonne ? L'attribut correspondant sera également supprimé dans les notes sous cette colonne.",
|
||||
"new-item": "Nouvel article",
|
||||
"new-item-placeholder": "Entrez le titre de note...",
|
||||
"add-column": "Ajouter une colonne",
|
||||
"add-column-placeholder": "Entrez le nom de la colonne...",
|
||||
"edit-note-title": "Cliquez pour modifier le titre de la note",
|
||||
"edit-column-title": "Cliquez pour modifier le titre de la colonne"
|
||||
},
|
||||
"presentation_view": {
|
||||
"edit-slide": "Modifier cette diapositive",
|
||||
"start-presentation": "Démarrer la présentation",
|
||||
"slide-overview": "Afficher un aperçu des diapositives"
|
||||
},
|
||||
"command_palette": {
|
||||
"tree-action-name": "Arborescence : {{name}}",
|
||||
"export_note_title": "Exporter la note",
|
||||
"export_note_description": "Exporter la note actuelle",
|
||||
"show_attachments_title": "Afficher les pièces jointes",
|
||||
"show_attachments_description": "Afficher les pièces jointes des notes",
|
||||
"search_notes_title": "Rechercher des notes",
|
||||
"search_notes_description": "Ouvrir la recherche avancée",
|
||||
"search_subtree_title": "Rechercher dans la sous-arborescence",
|
||||
"search_subtree_description": "Rechercher dans la sous-arborescence actuelle",
|
||||
"search_history_title": "Afficher l'historique de recherche",
|
||||
"search_history_description": "Afficher les recherches précédentes",
|
||||
"configure_launch_bar_title": "Configurer la barre de lancement",
|
||||
"configure_launch_bar_description": "Ouvrir la configuration de la barre de lancement pour ajouter ou supprimer des éléments."
|
||||
},
|
||||
"content_renderer": {
|
||||
"open_externally": "Ouverture externe"
|
||||
},
|
||||
"call_to_action": {
|
||||
"next_theme_title": "Essayez le nouveau thème Trilium",
|
||||
"next_theme_message": "Vous utilisez actuellement le thème hérité de l'ancienne version, souhaitez-vous essayer le nouveau thème ?",
|
||||
"next_theme_button": "Essayez le nouveau thème",
|
||||
"background_effects_title": "Les effets d'arrière-plan sont désormais stables",
|
||||
"background_effects_message": "Sur les appareils Windows, les effets d'arrière-plan sont désormais parfaitement stables. Ils ajoutent une touche de couleur à l'interface utilisateur en floutant l'arrière-plan. Cette technique est également utilisée dans d'autres applications comme l'Explorateur Windows.",
|
||||
"background_effects_button": "Activer les effets d'arrière-plan",
|
||||
"dismiss": "Rejeter"
|
||||
},
|
||||
"settings": {
|
||||
"related_settings": "Paramètres associés"
|
||||
},
|
||||
"settings_appearance": {
|
||||
"related_code_blocks": "Schéma de coloration syntaxique pour les blocs de code dans les notes de texte",
|
||||
"related_code_notes": "Schéma de couleurs pour les notes de code"
|
||||
},
|
||||
"units": {
|
||||
"percentage": "%"
|
||||
},
|
||||
"pagination": {
|
||||
"page_title": "Page de {{startIndex}} - {{endIndex}}",
|
||||
"total_notes": "{{count}} notes"
|
||||
},
|
||||
"collections": {
|
||||
"rendering_error": "Impossible d'afficher le contenu en raison d'une erreur."
|
||||
},
|
||||
"code-editor-options": {
|
||||
"title": "Éditeur"
|
||||
},
|
||||
"tasks": {
|
||||
"due": {
|
||||
"today": "Aujourd'hui",
|
||||
"tomorrow": "Demain",
|
||||
"yesterday": "Hier"
|
||||
}
|
||||
},
|
||||
"content_widget": {
|
||||
"unknown_widget": "Widget inconnu pour « {{id}} »."
|
||||
},
|
||||
"note_language": {
|
||||
"not_set": "Non défini",
|
||||
"configure-languages": "Configurer les langues..."
|
||||
},
|
||||
"content_language": {
|
||||
"title": "Contenu des langues",
|
||||
"description": "Sélectionnez une ou plusieurs langues à afficher dans la section « Propriétés de base » d'une note textuelle en lecture seule ou modifiable. Cela permettra d'utiliser des fonctionnalités telles que la vérification orthographique ou la prise en charge de l'écriture de droite à gauche."
|
||||
},
|
||||
"switch_layout_button": {
|
||||
"title_vertical": "Déplacer le volet d'édition vers le bas",
|
||||
"title_horizontal": "Déplacer le panneau d'édition vers la gauche"
|
||||
},
|
||||
"toggle_read_only_button": {
|
||||
"unlock-editing": "Déverrouiller l'édition",
|
||||
"lock-editing": "Verrouiller l'édition"
|
||||
},
|
||||
"png_export_button": {
|
||||
"button_title": "Exporter le diagramme au format PNG"
|
||||
},
|
||||
"svg": {
|
||||
"export_to_png": "Le diagramme n'a pas pu être exporté au format PNG."
|
||||
},
|
||||
"code_theme": {
|
||||
"title": "Apparence",
|
||||
"word_wrapping": "retour à la ligne automatique",
|
||||
"color-scheme": "Jeu de couleurs"
|
||||
},
|
||||
"cpu_arch_warning": {
|
||||
"title": "Veuillez télécharger la version ARM64",
|
||||
"message_macos": "TriliumNext fonctionne actuellement sous Rosetta 2, ce qui signifie que vous utilisez la version Intel (x64) sur un Mac Apple Silicon. Cela aura un impact significatif sur les performances et l'autonomie de la batterie.",
|
||||
"message_windows": "TriliumNext fonctionne actuellement en mode émulation, ce qui signifie que vous utilisez la version Intel (x64) sur un appareil Windows sur ARM. Cela aura un impact significatif sur les performances et l'autonomie de la batterie.",
|
||||
"recommendation": "Pour une expérience optimale, veuillez télécharger la version ARM64 native de TriliumNext depuis notre page de versions.",
|
||||
"download_link": "Télécharger la version native",
|
||||
"continue_anyway": "Continuer quand même",
|
||||
"dont_show_again": "Ne plus afficher cet avertissement"
|
||||
},
|
||||
"editorfeatures": {
|
||||
"title": "Caractéristiques",
|
||||
"emoji_completion_enabled": "Activer la saisie semi-automatique des emojis",
|
||||
"emoji_completion_description": "Si cette option est activée, les emojis peuvent être facilement insérés dans le texte en tapant `:` , suivi du nom d'un emoji.",
|
||||
"note_completion_enabled": "Activer la saisie semi-automatique des notes",
|
||||
"note_completion_description": "Si cette option est activée, des liens vers des notes peuvent être créés en tapant `@` suivi du titre d'une note.",
|
||||
"slash_commands_enabled": "Activer les commandes slash",
|
||||
"slash_commands_description": "Si cette option est activée, les commandes d'édition telles que l'insertion de sauts de ligne ou d'en-têtes peuvent être activées en tapant `/`."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,50 @@
|
||||
{}
|
||||
{
|
||||
"about": {
|
||||
"title": "A Trilium Notes-ról",
|
||||
"homepage": "Kezdőlap:",
|
||||
"app_version": "Alkalmazás verziója:",
|
||||
"db_version": "Adatbázis verzió:",
|
||||
"sync_version": "Verzió szinkronizálás :",
|
||||
"build_revision": "Build revízió:",
|
||||
"data_directory": "Adatkönyvtár:",
|
||||
"build_date": "Build dátum:"
|
||||
},
|
||||
"toast": {
|
||||
"critical-error": {
|
||||
"title": "Kritikus hiba",
|
||||
"message": "Kritikus hiba történt, amely megakadályozza a kliensalkalmazás indítását:\n\n{{message}}\n\nEzt valószínűleg egy váratlan szkripthiba okozza. Próbálja meg biztonságos módban elindítani az alkalmazást, és hárítsa el a problémát."
|
||||
},
|
||||
"widget-error": {
|
||||
"title": "Nem sikerült inicializálni egy widgetet",
|
||||
"message-custom": "A(z) \"{{id}}\" azonosítójú, \"{{title}}\" című jegyzetből származó egyéni widget inicializálása sikertelen volt a következő ok miatt:\n\n{{message}}",
|
||||
"message-unknown": "Ismeretlen widget inicializálása sikertelen volt a következő ok miatt:\n\n{{message}}"
|
||||
},
|
||||
"bundle-error": {
|
||||
"title": "Nem sikerült betölteni az egyéni szkriptet",
|
||||
"message": "A(z) \"{{id}}\" azonosítójú, \"{{title}}\" című jegyzetből származó szkript nem hajtható végre a következő ok miatt:\n\n{{message}}"
|
||||
}
|
||||
},
|
||||
"add_link": {
|
||||
"add_link": "Link hozzáadása",
|
||||
"help_on_links": "Segítség a linkekhez",
|
||||
"note": "Jegyzet",
|
||||
"search_note": "név szerinti jegyzetkeresés",
|
||||
"link_title_mirrors": "A link cím tükrözi a jegyzet aktuális címét",
|
||||
"link_title_arbitrary": "link cím önkényesen módosítható",
|
||||
"link_title": "Link cím",
|
||||
"button_add_link": "Link hozzáadása"
|
||||
},
|
||||
"branch_prefix": {
|
||||
"edit_branch_prefix": "Az elágazás előtagjának szerkesztése",
|
||||
"help_on_tree_prefix": "Segítség a fa előtagján",
|
||||
"prefix": "Az előtag: ",
|
||||
"save": "Mentés"
|
||||
},
|
||||
"bulk_actions": {
|
||||
"bulk_actions": "Tömeges akciók",
|
||||
"affected_notes": "Érintett jegyzetek",
|
||||
"labels": "Címkék",
|
||||
"relations": "Kapcsolatok",
|
||||
"notes": "Jegyzetek"
|
||||
}
|
||||
}
|
||||
|
||||
32
apps/client/src/translations/id/translation.json
Normal file
32
apps/client/src/translations/id/translation.json
Normal file
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"about": {
|
||||
"title": "Tentang Trilium Notes",
|
||||
"homepage": "Halaman utama:",
|
||||
"app_version": "Versi Aplikasi:",
|
||||
"db_version": "Versi DB:",
|
||||
"sync_version": "Versi sinkronisasi:",
|
||||
"build_date": "Tanggal pembuatan:",
|
||||
"build_revision": "Revisi pembuatan:",
|
||||
"data_directory": "Direktori data:"
|
||||
},
|
||||
"toast": {
|
||||
"critical-error": {
|
||||
"title": "Kesalahan kritis",
|
||||
"message": "Telah terjadi kesalahan kritis yang mencegah aplikasi klien untuk memulai:\n\n{{message}}\n\nHal ini kemungkinan besar disebabkan oleh skrip yang gagal secara tidak terduga. Coba jalankan aplikasi dalam mode aman dan atasi masalahnya."
|
||||
},
|
||||
"widget-error": {
|
||||
"title": "Gagal menginisialisasi widget",
|
||||
"message-custom": "Widget kustom dari catatan dengan ID \"{{id}}\", berjudul \"{{title}}\" tidak dapat diinisialisasi karena:\n\n{{message}}",
|
||||
"message-unknown": "Widget tidak dikenal tidak dapat diinisialisasi karena:\n\n{{message}}"
|
||||
},
|
||||
"bundle-error": {
|
||||
"title": "Gagal memuat skrip kustom",
|
||||
"message": "Skrip dari catatan dengan ID \"{{id}}\", berjudul \"{{title}}\" tidak dapat dijalankan karena:\n\n{{message}}"
|
||||
}
|
||||
},
|
||||
"add_link": {
|
||||
"add_link": "Tambah tautan",
|
||||
"help_on_links": "Bantuan pada tautan",
|
||||
"note": "Catatan"
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -67,11 +67,13 @@
|
||||
"switch_to_mobile_version": "モバイル版に切り替え",
|
||||
"switch_to_desktop_version": "デスクトップ版に切り替え",
|
||||
"configure_launchbar": "ランチャーバーの設定",
|
||||
"show_shared_notes_subtree": "共有ノートのサブツリーを表示"
|
||||
"show_shared_notes_subtree": "共有ノートのサブツリーを表示",
|
||||
"new-version-available": "新しいアップデートが利用可能",
|
||||
"download-update": "{{latestVersion}} をバージョンを入手"
|
||||
},
|
||||
"left_pane_toggle": {
|
||||
"show_panel": "パネルを表示",
|
||||
"hide_panel": "パネルを隠す"
|
||||
"hide_panel": "パネルを非表示"
|
||||
},
|
||||
"move_pane_button": {
|
||||
"move_left": "左に移動",
|
||||
@@ -79,7 +81,7 @@
|
||||
},
|
||||
"clone_to": {
|
||||
"notes_to_clone": "クローンするノート",
|
||||
"target_parent_note": "ターゲットの親ノート",
|
||||
"target_parent_note": "対象の親ノート",
|
||||
"search_for_note_by_its_name": "ノート名で検索",
|
||||
"cloned_note_prefix_title": "クローンされたノートは、指定された接頭辞を付けてノートツリーに表示されます",
|
||||
"prefix_optional": "接頭辞(任意)",
|
||||
@@ -162,7 +164,13 @@
|
||||
"min-days-in-first-week": "最初の週の最低日数",
|
||||
"first-week-info": "最初の週は、その年の最初の木曜日を含む週を指し、<a href=\"https://en.wikipedia.org/wiki/ISO_week_date#First_week\">ISO 8601</a>規格に基づいています。",
|
||||
"first-week-warning": "最初の週のオプションを変更すると、既存のウィークノートと重複する可能性があり、既存のウィークノートはそれに応じて更新されません。",
|
||||
"formatting-locale": "日付と数値のフォーマット"
|
||||
"formatting-locale": "日付と数値のフォーマット",
|
||||
"formatting-locale-auto": "アプリケーションの言語に基づいて",
|
||||
"tuesday": "火曜日",
|
||||
"wednesday": "水曜日",
|
||||
"thursday": "木曜日",
|
||||
"friday": "金曜日",
|
||||
"saturday": "土曜日"
|
||||
},
|
||||
"tab_row": {
|
||||
"close_tab": "タブを閉じる",
|
||||
@@ -251,12 +259,12 @@
|
||||
"help": {
|
||||
"title": "チートシート",
|
||||
"noteNavigation": "ノートナビゲーション",
|
||||
"collapseExpand": "ノードの格納/展開",
|
||||
"collapseExpand": "ノードを折りたたむ / 展開",
|
||||
"goBackForwards": "履歴を戻る/進む",
|
||||
"scrollToActiveNote": "アクティブノートまでスクロール",
|
||||
"jumpToParentNote": "親ノートへ移動",
|
||||
"collapseWholeTree": "すべてのノートツリーを格納",
|
||||
"collapseSubTree": "サブツリーを格納",
|
||||
"collapseWholeTree": "すべてのノートツリーを折りたたむ",
|
||||
"collapseSubTree": "サブツリーを折りたたむ",
|
||||
"tabShortcuts": "タブショートカット",
|
||||
"newTabNoteLink": "ノートのリンクをクリックすると、新しいタブで開く",
|
||||
"newTabWithActivationNoteLink": "ノートのリンクをクリックすると、新しいタブで開き、アクティブにします",
|
||||
@@ -274,11 +282,11 @@
|
||||
"selectAllNotes": "現在のレベルのノートをすべて選択",
|
||||
"selectNote": "ノートを選択",
|
||||
"copyNotes": "アクティブなノート(または現在の選択範囲)をクリップボードにコピーする(<a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">クローン</a>に使用)",
|
||||
"cutNotes": "アクティブなノート(または現在の選択範囲)をクリップボードにカットする(ノートの移動に使用)",
|
||||
"pasteNotes": "ノートをサブノートとしてアクティブノートに貼り付ける(コピーされたかカットされたかに よって、移動またはクローンになる)",
|
||||
"cutNotes": "アクティブなノート(または現在の選択範囲)をクリップボードに切り取り(ノートの移動に使用)",
|
||||
"pasteNotes": "ノートをサブノートとしてアクティブノートに貼り付ける(コピーされたか切り取りされたかに よって、移動またはクローンになる)",
|
||||
"deleteNotes": "ノート/サブツリーを削除",
|
||||
"editingNotes": "ノート編集",
|
||||
"editNoteTitle": "押下するとツリーペインからタイトルの編集に移ります。タイトルの編集からEnterキーを押すと、本文の編集に移動します。<kbd>Ctrl+.</kbd> で本文の編集からツリーペインに戻ります。",
|
||||
"editNoteTitle": "ツリーペインでEnterキーを押すと、ツリーペインからノートタイトルに切り替わります。ノートタイトルだとテキストエディタにフォーカスが切り替わります。<kbd>Ctrl+.</kbd> を押すと、エディタからツリーペインに戻ります。",
|
||||
"createEditLink": "外部リンクの作成/編集",
|
||||
"createInternalLink": "内部リンクの作成",
|
||||
"followLink": "カーソル下のリンクをたどる",
|
||||
@@ -294,7 +302,7 @@
|
||||
"showDevTools": "開発者ツールを表示",
|
||||
"showSQLConsole": "SQLコンソールを表示",
|
||||
"other": "その他",
|
||||
"quickSearch": "クイックサーチにフォーカス",
|
||||
"quickSearch": "クイック検索にフォーカス",
|
||||
"inPageSearch": "ページ内検索",
|
||||
"showJumpToNoteDialog": "<a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/note-navigation.html#jump-to-note\">「ジャンプ先」ダイアログ</a>を表示",
|
||||
"moveNoteUpDown": "ノートリストでノートを上/下に移動",
|
||||
@@ -326,7 +334,8 @@
|
||||
"import-status": "インポート状況",
|
||||
"in-progress": "インポート中: {{progress}}",
|
||||
"successful": "インポートは正常に終了しました。",
|
||||
"explodeArchives": "<code>.zip</code>, <code>.enex</code> および <code>.opml</code> アーカイブの内容を読み取ります。"
|
||||
"explodeArchives": "<code>.zip</code>, <code>.enex</code> および <code>.opml</code> アーカイブの内容を読み取ります。",
|
||||
"importZipRecommendation": "ZIP ファイルをインポートすると、ノートの階層はアーカイブ内のサブディレクトリ構造を反映します。"
|
||||
},
|
||||
"password_not_set": {
|
||||
"title": "パスワードが設定されていない",
|
||||
@@ -344,18 +353,18 @@
|
||||
},
|
||||
"sort_child_notes": {
|
||||
"sort_children_by": "子ノートの並び替え...",
|
||||
"sorting_criteria": "ソート基準",
|
||||
"sorting_criteria": "並べ替えの基準",
|
||||
"title": "タイトル",
|
||||
"date_created": "作成日",
|
||||
"date_modified": "更新日",
|
||||
"sorting_direction": "ソート方向",
|
||||
"sorting_direction": "並べ替えの方向",
|
||||
"ascending": "昇順",
|
||||
"descending": "降順",
|
||||
"folders": "フォルダ",
|
||||
"sort_folders_at_top": "フォルダーを一番上にソートする",
|
||||
"sort_folders_at_top": "フォルダーを上にして並べ替える",
|
||||
"natural_sort": "自然順",
|
||||
"sort_with_respect_to_different_character_sorting": "言語や地域によって異なる文字の並べ替えや照合順序の規則に従ってソートする。",
|
||||
"sort": "ソート",
|
||||
"sort_with_respect_to_different_character_sorting": "言語や地域によって異なる文字の並べ替えや照合順序の規則に従って並べ替える。",
|
||||
"sort": "並べ替え",
|
||||
"natural_sort_language": "自然順言語",
|
||||
"the_language_code_for_natural_sort": "自然順の言語コード。例えば、中国語の場合は \"zh-CN\"。"
|
||||
},
|
||||
@@ -396,9 +405,9 @@
|
||||
"protect-subtree": "サブツリーを保護",
|
||||
"unprotect-subtree": "サブツリーの保護を解除",
|
||||
"copy-clone": "コピー/クローン",
|
||||
"clone-to": "クローン先...",
|
||||
"cut": "カット",
|
||||
"move-to": "移動先...",
|
||||
"clone-to": "クローン...",
|
||||
"cut": "切り取り",
|
||||
"move-to": "移動...",
|
||||
"paste-into": "貼り付け",
|
||||
"paste-after": "後ろに貼り付け",
|
||||
"duplicate": "複製",
|
||||
@@ -408,7 +417,7 @@
|
||||
"converted-to-attachments": "{{count}}ノートが添付ファイルに変換されました。",
|
||||
"convert-to-attachment": "添付ファイルに変換",
|
||||
"convert-to-attachment-confirm": "選択したノートを親ノートの添付ファイルに変換しますか?",
|
||||
"open-in-popup": "クイックエディット",
|
||||
"open-in-popup": "クイック編集",
|
||||
"hoist-note": "ホイストノート",
|
||||
"unhoist-note": "ノートをホイストしない",
|
||||
"edit-branch-prefix": "ブランチの接頭辞を編集",
|
||||
@@ -515,9 +524,9 @@
|
||||
"book_properties": {
|
||||
"grid": "グリッド",
|
||||
"list": "リスト",
|
||||
"collapse_all_notes": "すべてのノートを格納",
|
||||
"collapse_all_notes": "すべてのノートを折りたたむ",
|
||||
"expand_all_children": "すべての子を展開",
|
||||
"collapse": "格納",
|
||||
"collapse": "折りたたむ",
|
||||
"expand": "展開",
|
||||
"book_properties": "コレクションプロパティ",
|
||||
"invalid_view_type": "無効なビュータイプ '{{type}}'",
|
||||
@@ -526,7 +535,8 @@
|
||||
"table": "テーブル",
|
||||
"geo-map": "ジオマップ",
|
||||
"board": "ボード",
|
||||
"include_archived_notes": "アーカイブされたノートを表示"
|
||||
"include_archived_notes": "アーカイブされたノートを表示",
|
||||
"presentation": "プレゼンテーション"
|
||||
},
|
||||
"note_types": {
|
||||
"geo-map": "ジオマップ",
|
||||
@@ -550,7 +560,7 @@
|
||||
"beta-feature": "Beta",
|
||||
"ai-chat": "AI チャット",
|
||||
"task-list": "タスクリスト",
|
||||
"new-feature": "新しい",
|
||||
"new-feature": "New",
|
||||
"collections": "コレクション"
|
||||
},
|
||||
"edited_notes": {
|
||||
@@ -731,7 +741,7 @@
|
||||
"new-column": "新しい列",
|
||||
"sort-column-by": "\"{{title}}\" で並べ替え",
|
||||
"sort-column-clear": "並べ替えをクリア",
|
||||
"hide-column": "列 \"{{title}}\" を隠す",
|
||||
"hide-column": "列 \"{{title}}\" を非表示",
|
||||
"show-hide-columns": "列を表示/非表示",
|
||||
"row-insert-above": "上に行を挿入",
|
||||
"row-insert-below": "下に行を挿入",
|
||||
@@ -767,7 +777,7 @@
|
||||
"placeholder": "ノート名で検索",
|
||||
"label": "祖先",
|
||||
"depth_label": "深さ",
|
||||
"depth_doesnt_matter": "関係ない",
|
||||
"depth_doesnt_matter": "関係なし",
|
||||
"depth_eq": "ちょうど {{count}} つ下の階層",
|
||||
"direct_children": "直接の子",
|
||||
"depth_gt": "{{count}} より下の階層",
|
||||
@@ -830,7 +840,7 @@
|
||||
"max_width_label": "最大コンテンツ幅",
|
||||
"max_width_unit": "ピクセル",
|
||||
"apply_changes_description": "コンテンツ幅の変更を適用するには、クリックしてください",
|
||||
"reload_description": "外観オプションからの変更"
|
||||
"reload_description": "外観設定から変更"
|
||||
},
|
||||
"theme": {
|
||||
"title": "アプリのテーマ",
|
||||
@@ -899,14 +909,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": "目次",
|
||||
@@ -1045,7 +1055,7 @@
|
||||
"inheritable": "継承",
|
||||
"related_notes_title": "このラベルが付いた他のノート",
|
||||
"attr_detail_title": "属性の詳細なタイトル",
|
||||
"target_note_title": "リレーションは、ソースノートとターゲットノート間の名前付き接続です。",
|
||||
"target_note_title": "リレーションは、ソースノートと対象のノート間の名前付き接続です。",
|
||||
"target_note": "対象のノート",
|
||||
"promoted_title": "プロモート属性はノートに目立つように表示されます。",
|
||||
"promoted": "プロモート",
|
||||
@@ -1068,12 +1078,12 @@
|
||||
"sorted": "子ノートをアルファベット順に並べ替える",
|
||||
"sort_direction": "ASC(デフォルト)または DESC",
|
||||
"sort_folders_first": "フォルダ(子を持つノート)を上にして並べる",
|
||||
"top": "指定されたノートをその親ノートの一番上に表示します(ソートされた親ノートにのみ適用されます)",
|
||||
"top": "指定されたノートをその親ノートの一番上に表示します(並べ替えらた親ノートにのみ適用されます)",
|
||||
"hide_promoted_attributes": "このノートのプロモート属性を非表示にする",
|
||||
"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 から取得されます。テンプレートノートで使用できます。",
|
||||
@@ -1142,13 +1152,13 @@
|
||||
"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": "クイックエディット",
|
||||
"open_note_in_popup": "クイック編集",
|
||||
"open_note_in_new_tab": "新しいタブでノートを開く",
|
||||
"open_note_in_new_split": "新しく分割してノートを開く",
|
||||
"open_note_in_new_window": "新しいウィンドウでノートを開く"
|
||||
},
|
||||
"note_tooltip": {
|
||||
"quick-edit": "クイックエディット",
|
||||
"quick-edit": "クイック編集",
|
||||
"note-has-been-deleted": "ノートは削除されました。"
|
||||
},
|
||||
"protect_note": {
|
||||
@@ -1180,7 +1190,7 @@
|
||||
"options": "オプション"
|
||||
},
|
||||
"quick-search": {
|
||||
"placeholder": "クイックサーチ",
|
||||
"placeholder": "クイック検索",
|
||||
"searching": "検索中...",
|
||||
"no-results": "結果は見つかりませんでした",
|
||||
"more-results": "... および {{number}} 件の他の結果。",
|
||||
@@ -1190,7 +1200,7 @@
|
||||
"collapse-title": "ノートツリーを折りたたむ",
|
||||
"scroll-active-title": "アクティブノートまでスクロール",
|
||||
"tree-settings-title": "ツリーの設定",
|
||||
"hide-archived-notes": "アーカイブノートを隠す",
|
||||
"hide-archived-notes": "アーカイブノートを非表示",
|
||||
"automatically-collapse-notes": "ノートを自動的に折りたたむ",
|
||||
"automatically-collapse-notes-title": "一定期間使用されないと、ツリーを整理するためにノートは折りたたまれます。",
|
||||
"save-changes": "変更を保存して適用",
|
||||
@@ -1204,7 +1214,7 @@
|
||||
},
|
||||
"bulk_actions": {
|
||||
"bulk_actions": "一括操作",
|
||||
"affected_notes": "影響されたノート",
|
||||
"affected_notes": "影響されるノート",
|
||||
"include_descendants": "選択したノートの子ノートを含む",
|
||||
"available_actions": "利用可能なアクション",
|
||||
"chosen_actions": "選択されたアクション",
|
||||
@@ -1236,7 +1246,7 @@
|
||||
"duplicated": "ノート \"{{title}}\" は複製されました。"
|
||||
},
|
||||
"clipboard": {
|
||||
"cut": "ノートはクリップボードにカットされました。",
|
||||
"cut": "ノートはクリップボードに切り取りとられました。",
|
||||
"copied": "ノートはクリップボードにコピーされました。",
|
||||
"copy_failed": "権限の問題で、クリップボードにコピーできません。",
|
||||
"copy_success": "クリップボードにコピーしました。"
|
||||
@@ -1275,7 +1285,7 @@
|
||||
"editor_type": {
|
||||
"label": "書式設定ツールバー",
|
||||
"floating": {
|
||||
"description": "編集ツールがカーソル付近に表示されます;",
|
||||
"description": "編集ツールがカーソル付近に表示されます。",
|
||||
"title": "フローティング"
|
||||
},
|
||||
"fixed": {
|
||||
@@ -1287,10 +1297,10 @@
|
||||
},
|
||||
"electron_context_menu": {
|
||||
"add-term-to-dictionary": "辞書に \"{{term}}\" を追加",
|
||||
"cut": "カット",
|
||||
"cut": "切り取り",
|
||||
"copy": "コピー",
|
||||
"copy-link": "リンクをコピー",
|
||||
"paste": "ペースト",
|
||||
"paste": "貼り付け",
|
||||
"paste-as-plain-text": "プレーンテキストで貼り付け",
|
||||
"search_online": "{{searchEngine}} で \"{{term}}\" を検索"
|
||||
},
|
||||
@@ -1582,7 +1592,8 @@
|
||||
"delete_this_note": "このノートを削除",
|
||||
"error_unrecognized_command": "認識されないコマンド {{command}}",
|
||||
"insert_child_note": "子ノートを挿入",
|
||||
"error_cannot_get_branch_id": "ノートパス 「{{notePath}} のbranchIdを取得できません"
|
||||
"error_cannot_get_branch_id": "ノートパス 「{{notePath}} のbranchIdを取得できません",
|
||||
"note_revisions": "ノートの変更履歴"
|
||||
},
|
||||
"inherited_attribute_list": {
|
||||
"title": "継承属性",
|
||||
@@ -1749,7 +1760,7 @@
|
||||
"target_parent_note": "対象の親ノート",
|
||||
"move_note_new_parent": "ノートに親が 1 つしかない場合は、ノートを新しい親に移動します (つまり、古いブランチが削除され、新しい親に新しいブランチが作成されます)",
|
||||
"clone_note_new_parent": "ノートに複数のクローン/ブランチがある場合、ノートを新しい親にクローンします(どのブランチを削除すべきか不明なため)",
|
||||
"nothing_will_happen": "ノートをターゲットノートに移動できない場合は何も起こりません(つまり、ツリーサイクルが生じるため)",
|
||||
"nothing_will_happen": "ノートを対象のノートに移動できない場合は何も起こりません(つまり、ツリーサイクルが生じるため)",
|
||||
"to": "次へ"
|
||||
},
|
||||
"onclick_button": {
|
||||
@@ -1872,7 +1883,9 @@
|
||||
"window-on-top": "ウィンドウを最前面に維持"
|
||||
},
|
||||
"note_detail": {
|
||||
"could_not_find_typewidget": "タイプ {{type}} の typeWidget が見つかりませんでした"
|
||||
"could_not_find_typewidget": "タイプ {{type}} の typeWidget が見つかりませんでした",
|
||||
"printing": "印刷中です...",
|
||||
"printing_pdf": "PDF へのエクスポート中です..."
|
||||
},
|
||||
"watched_file_update_status": {
|
||||
"ignore_this_change": "この変更を無視する",
|
||||
@@ -2065,5 +2078,10 @@
|
||||
"role_and_size": "ロール: {{role}},サイズ: {{size}}",
|
||||
"link_copied": "添付ファイルのリンクをクリップボードにコピーしました。",
|
||||
"unrecognized_role": "添付ファイルのロール「{{role}}」は認識されません。"
|
||||
},
|
||||
"presentation_view": {
|
||||
"edit-slide": "このスライドを編集",
|
||||
"start-presentation": "プレゼンテーションを開始",
|
||||
"slide-overview": "スライドの概要を切り替え"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,5 +49,11 @@
|
||||
"chosen_actions": "선택한 액션들",
|
||||
"execute_bulk_actions": "대량 액션들 실행",
|
||||
"bulk_actions_executed": "대량 액션들이 성공적으로 실행되었습니다."
|
||||
},
|
||||
"i18n": {
|
||||
"saturday": "토요일",
|
||||
"sunday": "일요일",
|
||||
"first-week-of-the-year": "일년의 첫째 주",
|
||||
"first-week-contains-first-day": "첫 번째 주에는 올해의 첫날이 포함됩니다"
|
||||
}
|
||||
}
|
||||
|
||||
1
apps/client/src/translations/md/translation.json
Normal file
1
apps/client/src/translations/md/translation.json
Normal file
@@ -0,0 +1 @@
|
||||
{}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -289,7 +289,8 @@
|
||||
"table": "Tabel",
|
||||
"geo-map": "Hartă geografică",
|
||||
"board": "Tablă Kanban",
|
||||
"include_archived_notes": "Afișează notițele arhivate"
|
||||
"include_archived_notes": "Afișează notițele arhivate",
|
||||
"presentation": "Prezentare"
|
||||
},
|
||||
"bookmark_switch": {
|
||||
"bookmark": "Semn de carte",
|
||||
@@ -611,7 +612,9 @@
|
||||
"zoom_in": "Mărește",
|
||||
"zoom_out": "Micșorează",
|
||||
"show-cheatsheet": "Afișează ghidul rapid",
|
||||
"toggle-zen-mode": "Mod zen"
|
||||
"toggle-zen-mode": "Mod zen",
|
||||
"new-version-available": "Actualizare nouă disponibilă",
|
||||
"download-update": "Obțineți versiunea {{latestVersion}}"
|
||||
},
|
||||
"heading_style": {
|
||||
"markdown": "Stil Markdown",
|
||||
@@ -701,7 +704,13 @@
|
||||
"first-week-has-minimum-days": "Prima săptămână are numărul minim de zile",
|
||||
"min-days-in-first-week": "Numărul minim de zile pentru prima săptămână",
|
||||
"first-week-info": "Opțiunea de prima săptămână conține prima zi de joi din an este bazată pe standardul <a href=\"https://en.wikipedia.org/wiki/ISO_week_date#First_week\">ISO 8601</a>.",
|
||||
"first-week-warning": "Schimbarea opțiunii primei săptămâni poate cauza duplicate cu notițele săptămânale existente deoarece acestea nu vor fi actualizate retroactiv."
|
||||
"first-week-warning": "Schimbarea opțiunii primei săptămâni poate cauza duplicate cu notițele săptămânale existente deoarece acestea nu vor fi actualizate retroactiv.",
|
||||
"tuesday": "Marți",
|
||||
"wednesday": "Miercuri",
|
||||
"thursday": "Joi",
|
||||
"friday": "Vineri",
|
||||
"saturday": "Sâmbătă",
|
||||
"formatting-locale-auto": "În funcție de limba aplicației"
|
||||
},
|
||||
"image_properties": {
|
||||
"copy_reference_to_clipboard": "Copiază referință în clipboard",
|
||||
@@ -803,7 +812,8 @@
|
||||
"delete_this_note": "Șterge această notiță",
|
||||
"error_cannot_get_branch_id": "Nu s-a putut obține branchId-ul pentru calea „{{notePath}}”",
|
||||
"error_unrecognized_command": "Comandă nerecunoscută „{{command}}”",
|
||||
"insert_child_note": "Inserează subnotiță"
|
||||
"insert_child_note": "Inserează subnotiță",
|
||||
"note_revisions": "Revizuiri ale notițelor"
|
||||
},
|
||||
"move_note": {
|
||||
"clone_note_new_parent": "clonează notița la noul părinte dacă notița are mai multe clone/ramuri (când nu este clar care ramură trebuie ștearsă)",
|
||||
@@ -2069,5 +2079,10 @@
|
||||
},
|
||||
"collections": {
|
||||
"rendering_error": "Nu a putut fi afișat conținutul din cauza unei erori."
|
||||
},
|
||||
"presentation_view": {
|
||||
"edit-slide": "Editați acest slide",
|
||||
"start-presentation": "Începeți prezentarea",
|
||||
"slide-overview": "Afișați o imagine de ansamblu a slide-urilor"
|
||||
}
|
||||
}
|
||||
|
||||
8
apps/client/src/translations/sv/translation.json
Normal file
8
apps/client/src/translations/sv/translation.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"about": {
|
||||
"title": "Om Trilium Notes",
|
||||
"homepage": "Hemsida:",
|
||||
"app_version": "App version:",
|
||||
"db_version": "DB version:"
|
||||
}
|
||||
}
|
||||
@@ -184,7 +184,8 @@
|
||||
},
|
||||
"import-status": "匯入狀態",
|
||||
"in-progress": "正在匯入:{{progress}}",
|
||||
"successful": "匯入成功。"
|
||||
"successful": "匯入成功。",
|
||||
"importZipRecommendation": "匯入 ZIP 檔案時,筆記層級將反映壓縮檔內的子目錄結構。"
|
||||
},
|
||||
"include_note": {
|
||||
"dialog_title": "內嵌筆記",
|
||||
@@ -646,7 +647,9 @@
|
||||
"about": "關於 TriliumNext 筆記",
|
||||
"logout": "登出",
|
||||
"show-cheatsheet": "顯示快捷鍵說明",
|
||||
"toggle-zen-mode": "禪模式"
|
||||
"toggle-zen-mode": "禪模式",
|
||||
"new-version-available": "發現新更新",
|
||||
"download-update": "取得版本 {{latestVersion}}"
|
||||
},
|
||||
"sync_status": {
|
||||
"unknown": "<p>同步狀態將在下一次同步嘗試開始後顯示。</p><p>點擊以立即觸發同步。</p>",
|
||||
@@ -733,7 +736,8 @@
|
||||
"insert_child_note": "插入子筆記",
|
||||
"delete_this_note": "刪除此筆記",
|
||||
"error_cannot_get_branch_id": "無法獲取 notePath '{{notePath}}' 的 branchId",
|
||||
"error_unrecognized_command": "無法識別的命令 {{command}}"
|
||||
"error_unrecognized_command": "無法識別的命令 {{command}}",
|
||||
"note_revisions": "筆記歷史版本"
|
||||
},
|
||||
"note_icon": {
|
||||
"change_note_icon": "更改筆記圖標",
|
||||
@@ -746,7 +750,7 @@
|
||||
"editable": "可編輯",
|
||||
"basic_properties": "基本屬性",
|
||||
"language": "語言",
|
||||
"configure_code_notes": "配寘代碼注釋..."
|
||||
"configure_code_notes": "設定程式碼筆記…"
|
||||
},
|
||||
"book_properties": {
|
||||
"view_type": "視圖類型",
|
||||
@@ -762,7 +766,8 @@
|
||||
"table": "表格",
|
||||
"geo-map": "地理地圖",
|
||||
"board": "看板",
|
||||
"include_archived_notes": "顯示已封存筆記"
|
||||
"include_archived_notes": "顯示已封存筆記",
|
||||
"presentation": "簡報"
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "今天還沒有編輯過的筆記...",
|
||||
@@ -1250,7 +1255,13 @@
|
||||
"min-days-in-first-week": "第一週的最少天數",
|
||||
"first-week-info": "年度第一週包含第一個週四是基於 <a href=\"https://en.wikipedia.org/wiki/ISO_week_date#First_week\">ISO 8601</a> 標準。",
|
||||
"first-week-warning": "變更第一週選項可能導致與現有的「週筆記」重複,現有的「週筆記」將不會相應更新。",
|
||||
"formatting-locale": "日期和數字格式"
|
||||
"formatting-locale": "日期和數字格式",
|
||||
"tuesday": "週二",
|
||||
"wednesday": "週三",
|
||||
"thursday": "週四",
|
||||
"friday": "週五",
|
||||
"saturday": "週六",
|
||||
"formatting-locale-auto": "根據應用程式的語言設定"
|
||||
},
|
||||
"backup": {
|
||||
"automatic_backup": "自動備份",
|
||||
@@ -1431,7 +1442,7 @@
|
||||
"relation-map": "關聯圖",
|
||||
"note-map": "筆記地圖",
|
||||
"render-note": "渲染筆記",
|
||||
"mermaid-diagram": "美人魚圖(Mermaid)",
|
||||
"mermaid-diagram": "美人魚圖",
|
||||
"canvas": "畫布",
|
||||
"web-view": "網頁顯示",
|
||||
"mind-map": "心智圖",
|
||||
@@ -1507,7 +1518,9 @@
|
||||
"window-on-top": "保持此視窗置頂"
|
||||
},
|
||||
"note_detail": {
|
||||
"could_not_find_typewidget": "找不到類型為 '{{type}}' 的 typeWidget"
|
||||
"could_not_find_typewidget": "找不到類型為 '{{type}}' 的 typeWidget",
|
||||
"printing": "正在列印…",
|
||||
"printing_pdf": "正在匯出為 PDF…"
|
||||
},
|
||||
"note_title": {
|
||||
"placeholder": "請輸入筆記標題..."
|
||||
@@ -1627,7 +1640,7 @@
|
||||
"label": "格式工具欄",
|
||||
"floating": {
|
||||
"title": "浮動",
|
||||
"description": "編輯工具出現在遊標附近;"
|
||||
"description": "編輯工具出現在游標附近;"
|
||||
},
|
||||
"fixed": {
|
||||
"title": "固定",
|
||||
@@ -2065,5 +2078,10 @@
|
||||
},
|
||||
"collections": {
|
||||
"rendering_error": "發現錯誤,無法顯示內容。"
|
||||
},
|
||||
"presentation_view": {
|
||||
"edit-slide": "編輯此投影片",
|
||||
"start-presentation": "開始簡報",
|
||||
"slide-overview": "切換投影片概覽"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,11 +4,15 @@
|
||||
"title": "Về Trilium Notes",
|
||||
"app_version": "Phiên bản:",
|
||||
"db_version": "Phiên bản DB:",
|
||||
"sync_version": "Phiên bản liên kết:"
|
||||
"sync_version": "Phiên bản liên kết:",
|
||||
"build_date": "Ngày build:",
|
||||
"build_revision": "Xây dựng bản sửa đổi:",
|
||||
"data_directory": "Đường dẫn dữ liệu:"
|
||||
},
|
||||
"add_link": {
|
||||
"add_link": "Thêm liên kết",
|
||||
"button_add_link": "Thêm liên kết"
|
||||
"button_add_link": "Thêm liên kết",
|
||||
"help_on_links": "Trợ giúp về các liên kết"
|
||||
},
|
||||
"bulk_actions": {
|
||||
"other": "Khác"
|
||||
@@ -34,7 +38,17 @@
|
||||
},
|
||||
"toast": {
|
||||
"critical-error": {
|
||||
"title": "Lỗi nghiêm trọng"
|
||||
"title": "Lỗi nghiêm trọng",
|
||||
"message": "Đã xảy ra lỗi nghiêm trọng ngăn ứng dụng client khởi động\n\n{{message}}\n\nĐiều này có khả năng bị gây ra bởi một script hoạt động không như mong đợi. Hãy thử khởi động ứng dụng ở chế độ an toàn và giải quyết vấn đề."
|
||||
},
|
||||
"widget-error": {
|
||||
"title": "Khởi tạo widget thất bại",
|
||||
"message-custom": "Tiện ích tùy chỉnh từ ghi chú với ID \"{{id}}\", tiêu đề \"{{title}}\" không thể khởi tạo vì:\n\n{{message}}",
|
||||
"message-unknown": "Tiện ích chưa biết không thể được khởi tạo vì:\n\n{{message}}"
|
||||
},
|
||||
"bundle-error": {
|
||||
"title": "Tải script tùy chọn thất bại",
|
||||
"message": "Script từ ghi chú ID \"{{id}}\", tiêu đề \"{{title}}\" không thể chạy được vì:\n\n{{message}}"
|
||||
}
|
||||
},
|
||||
"import": {
|
||||
|
||||
6
apps/client/src/types.d.ts
vendored
6
apps/client/src/types.d.ts
vendored
@@ -16,7 +16,7 @@ interface ElectronProcess {
|
||||
interface CustomGlobals {
|
||||
isDesktop: typeof utils.isDesktop;
|
||||
isMobile: typeof utils.isMobile;
|
||||
device: "mobile" | "desktop";
|
||||
device: "mobile" | "desktop" | "print";
|
||||
getComponentByEl: typeof appContext.getComponentByEl;
|
||||
getHeaders: typeof server.getHeaders;
|
||||
getReferenceLinkTitle: (href: string) => Promise<string>;
|
||||
@@ -46,6 +46,7 @@ interface CustomGlobals {
|
||||
platform?: typeof process.platform;
|
||||
linter: typeof lint;
|
||||
hasNativeTitleBar: boolean;
|
||||
isRtl: boolean;
|
||||
}
|
||||
|
||||
type RequireMethod = (moduleName: string) => any;
|
||||
@@ -58,6 +59,9 @@ declare global {
|
||||
process?: ElectronProcess;
|
||||
glob?: CustomGlobals;
|
||||
|
||||
/** On the printing endpoint, set to true when the note has fully loaded and is ready to be printed/exported as PDF. */
|
||||
_noteReady?: boolean;
|
||||
|
||||
EXCALIDRAW_ASSET_PATH?: string;
|
||||
}
|
||||
|
||||
|
||||
45
apps/client/src/utils/css-var.ts
Normal file
45
apps/client/src/utils/css-var.ts
Normal file
@@ -0,0 +1,45 @@
|
||||
export function readCssVar(element: HTMLElement, varName: string) {
|
||||
return new CssVarReader(getComputedStyle(element).getPropertyValue("--" + varName));
|
||||
}
|
||||
|
||||
export class CssVarReader {
|
||||
protected value: string;
|
||||
|
||||
constructor(rawValue: string) {
|
||||
this.value = rawValue;
|
||||
}
|
||||
|
||||
asString(defaultValue?: string) {
|
||||
return (this.value) ? this.value : defaultValue;
|
||||
}
|
||||
|
||||
asNumber(defaultValue?: number) {
|
||||
let number: Number = NaN;
|
||||
|
||||
if (this.value) {
|
||||
number = parseFloat(this.value);
|
||||
}
|
||||
|
||||
return (!isNaN(number.valueOf()) ? number.valueOf() : defaultValue)
|
||||
}
|
||||
|
||||
asEnum<T>(enumType: T, defaultValue?: T[keyof T]): T[keyof T] | undefined {
|
||||
let result: T[keyof T] | undefined;
|
||||
|
||||
result = enumType[this.value as keyof T];
|
||||
|
||||
if (result === undefined) {
|
||||
result = defaultValue;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
asArray(delimiter: string = " "): CssVarReader[] {
|
||||
// Note: ignoring delimiters inside quotation marks is currently unsupported
|
||||
let values = this.value.split(delimiter);
|
||||
|
||||
return values.map((v) => new CssVarReader(v));
|
||||
}
|
||||
|
||||
}
|
||||
19
apps/client/src/utils/formatters.spec.ts
Normal file
19
apps/client/src/utils/formatters.spec.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import options from "../services/options";
|
||||
import { formatDateTime, normalizeLocale } from "./formatters";
|
||||
|
||||
describe("formatters", () => {
|
||||
it("tolerates incorrect locale", () => {
|
||||
options.set("formattingLocale", "cn_TW");
|
||||
|
||||
expect(formatDateTime(new Date())).toBeTruthy();
|
||||
expect(formatDateTime(new Date(), "full", "none")).toBeTruthy();
|
||||
expect(formatDateTime(new Date(), "none", "full")).toBeTruthy();
|
||||
});
|
||||
|
||||
it("normalizes locale", () => {
|
||||
expect(normalizeLocale("zh_CN")).toBe("zh-CN");
|
||||
expect(normalizeLocale("cn")).toBe("zh-CN");
|
||||
expect(normalizeLocale("tw")).toBe("zh-TW");
|
||||
});
|
||||
});
|
||||
@@ -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 = normalizeLocale(options.get("formattingLocale") || options.get("locale") || navigator.language);
|
||||
|
||||
let parsedDate;
|
||||
if (typeof date === "string" || typeof date === "number") {
|
||||
@@ -24,15 +26,37 @@ 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 });
|
||||
return formatter.format(parsedDate);
|
||||
try {
|
||||
const formatter = new Intl.DateTimeFormat(locale, { dateStyle, timeStyle });
|
||||
return formatter.format(parsedDate);
|
||||
} catch (e) {
|
||||
const formatter = new Intl.DateTimeFormat(undefined, { dateStyle, timeStyle });
|
||||
return formatter.format(parsedDate);
|
||||
}
|
||||
} else if (timeStyle === "none" && dateStyle !== "none") {
|
||||
// Format only the date
|
||||
return parsedDate.toLocaleDateString(locale, { dateStyle });
|
||||
try {
|
||||
return parsedDate.toLocaleDateString(locale, { dateStyle });
|
||||
} catch (e) {
|
||||
return parsedDate.toLocaleDateString(undefined, { dateStyle });
|
||||
}
|
||||
} else if (dateStyle === "none" && timeStyle !== "none") {
|
||||
// Format only the time
|
||||
return parsedDate.toLocaleTimeString(locale, { timeStyle });
|
||||
try {
|
||||
return parsedDate.toLocaleTimeString(locale, { timeStyle });
|
||||
} catch (e) {
|
||||
return parsedDate.toLocaleTimeString(undefined, { timeStyle });
|
||||
}
|
||||
}
|
||||
|
||||
throw new Error("Incorrect state.");
|
||||
}
|
||||
|
||||
export function normalizeLocale(locale: string) {
|
||||
locale = locale.replaceAll("_", "-");
|
||||
switch (locale) {
|
||||
case "cn": return "zh-CN";
|
||||
case "tw": return "zh-TW";
|
||||
default: return locale;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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%;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -23,6 +23,6 @@
|
||||
color: var(--button-text-color);
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
right: 10px;
|
||||
inset-inline-end: 10px;
|
||||
cursor: pointer;
|
||||
}
|
||||
@@ -30,7 +30,7 @@ const TPL = /*html*/`
|
||||
}
|
||||
|
||||
.attachment-details {
|
||||
margin-left: 10px;
|
||||
margin-inline-start: 10px;
|
||||
}
|
||||
|
||||
.attachment-content-wrapper {
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -76,7 +76,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 +89,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) {
|
||||
|
||||
@@ -28,7 +28,7 @@ const TPL = /*html*/`
|
||||
position: relative;
|
||||
top: 3px;
|
||||
font-size: 120%;
|
||||
margin-right: 5px;
|
||||
margin-inline-end: 5px;
|
||||
}
|
||||
|
||||
.attachment-actions .dropdown-item[disabled], .attachment-actions .dropdown-item[disabled]:hover {
|
||||
|
||||
@@ -35,7 +35,7 @@ const DROPDOWN_TPL = `
|
||||
}
|
||||
|
||||
.bookmark-folder-widget li .note-link {
|
||||
padding-left: 35px;
|
||||
padding-inline-start: 35px;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
@@ -8,13 +8,15 @@ 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"),
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,9 @@
|
||||
}
|
||||
|
||||
button.global-menu-button {
|
||||
--update-badge-x-offset: 4%;
|
||||
--update-badge-y-offset: -16%;
|
||||
|
||||
position: relative;
|
||||
width: 100% !important;
|
||||
height: 100% !important;
|
||||
@@ -55,13 +58,26 @@ button.global-menu-button {
|
||||
|
||||
.global-menu-button-update-available {
|
||||
position: absolute;
|
||||
right: -30px;
|
||||
bottom: -30px;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
right: calc(0px - var(--update-badge-x-offset));
|
||||
bottom: calc(0px - var(--update-badge-y-offset));
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
border-radius: 50%;
|
||||
background: var(--global-menu-update-available-badge-background-color, var(--admonition-tip-accent-color));
|
||||
color: var(--global-menu-update-available-badge-color, var(--main-background-color));
|
||||
font-size: 16px;
|
||||
transition: transform 200ms ease-in-out;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.global-menu-button.show .global-menu-button-update-available {
|
||||
transform: scale(.75);
|
||||
transform-origin: center;
|
||||
}
|
||||
|
||||
.global-menu .zoom-container {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
@@ -69,7 +85,7 @@ button.global-menu-button {
|
||||
}
|
||||
|
||||
.global-menu .zoom-buttons {
|
||||
margin-left: 2em;
|
||||
margin-inline-start: 2em;
|
||||
}
|
||||
|
||||
.global-menu .zoom-buttons a {
|
||||
@@ -79,7 +95,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,32 +104,17 @@ 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 */
|
||||
.global-menu-button-update-available-button {
|
||||
width: 21px !important;
|
||||
height: 21px !important;
|
||||
padding: 0 !important;
|
||||
|
||||
border-radius: var(--button-border-radius);
|
||||
transform: scale(0.9);
|
||||
border: none;
|
||||
opacity: 0.8;
|
||||
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.global-menu-button-wrapper:hover .global-menu-button-update-available-button {
|
||||
opacity: 1;
|
||||
|
||||
@@ -3,7 +3,7 @@ import "./global_menu.css";
|
||||
import { useStaticTooltip, useStaticTooltipWithKeyboardShortcut, useTriliumOption, useTriliumOptionBool, useTriliumOptionInt } from "../react/hooks";
|
||||
import { useContext, useEffect, useRef, useState } from "preact/hooks";
|
||||
import { t } from "../../services/i18n";
|
||||
import { FormDropdownDivider, FormDropdownSubmenu, FormListItem } from "../react/FormList";
|
||||
import { FormDropdownDivider, FormDropdownSubmenu, FormListHeader, FormListItem } from "../react/FormList";
|
||||
import { CommandNames } from "../../components/app_context";
|
||||
import KeyboardShortcut from "../react/KeyboardShortcut";
|
||||
import { KeyboardActionNames } from "@triliumnext/commons";
|
||||
@@ -26,7 +26,7 @@ export default function GlobalMenu({ isHorizontalLayout }: { isHorizontalLayout:
|
||||
const isVerticalLayout = !isHorizontalLayout;
|
||||
const parentComponent = useContext(ParentComponent);
|
||||
const { isUpdateAvailable, latestVersion } = useTriliumUpdateStatus();
|
||||
|
||||
|
||||
return (
|
||||
<Dropdown
|
||||
className="global-menu"
|
||||
@@ -34,7 +34,7 @@ export default function GlobalMenu({ isHorizontalLayout }: { isHorizontalLayout:
|
||||
text={<>
|
||||
{isVerticalLayout && <VerticalLayoutIcon />}
|
||||
{isUpdateAvailable && <div class="global-menu-button-update-available">
|
||||
<span className="bx bx-sync global-menu-button-update-available-button" title={t("update_available.update_available")}></span>
|
||||
<span className="bx bxs-down-arrow-alt global-menu-button-update-available-button" title={t("update_available.update_available")}></span>
|
||||
</div>}
|
||||
</>}
|
||||
noDropdownListStyle
|
||||
@@ -58,7 +58,14 @@ 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 && <>
|
||||
<FormListHeader text={t("global_menu.new-version-available")} />
|
||||
<MenuItem command={() => window.open("https://github.com/TriliumNext/Trilium/releases/latest")}
|
||||
icon="bx bx-download"
|
||||
text={t("global_menu.download-update", {latestVersion})} />
|
||||
</>}
|
||||
|
||||
{!isElectron() && <BrowserOnlyOptions />}
|
||||
</Dropdown>
|
||||
)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user