Compare commits

...

232 Commits

Author SHA1 Message Date
mngshm
54ca415d73 fix: change table to allow null values 2025-02-24 17:07:08 +05:30
mngshm
32a6e8c700 fix Merge conflicts 2025-02-24 16:59:12 +05:30
mngshm
d0b83ff564 [server] remove storageLimit addition from the Member Invite flow 2025-02-24 16:40:11 +05:30
mngshm
0d4d25216f [server] allow null values on storage_limit in DB 2025-02-24 16:40:01 +05:30
Vishnu Mohandas
490a7221e7 [docs] Update (#5157) 2025-02-24 16:20:50 +05:30
vishnukvmd
1b98f782f1 Update 2025-02-24 16:19:54 +05:30
Vishnu Mohandas
a46a64e386 [docs] Update (#5156) 2025-02-24 16:03:54 +05:30
vishnukvmd
492ea61bb7 Update 2025-02-24 16:03:28 +05:30
Neeraj
9447f1c767 [server] Remove embeddings handler (#5154)
## Description

## Tests
2025-02-24 15:11:47 +05:30
Neeraj Gupta
76b2a73f9a clean up 2025-02-24 15:00:33 +05:30
Neeraj Gupta
4bbe1ae0d2 [server] Remove embeddings handler 2025-02-24 14:49:21 +05:30
Manav Rathi
b15b707600 [server] Limit support while fetching collections (#5148)
## Description
This endpoint let's us add limit which fetching collections.

## Tests
2025-02-24 14:18:44 +05:30
Neeraj
454363d772 [server] Minor refactor (#5152)
## Description
Moving few methods related to collection_files in diff file.
## Tests
2025-02-24 14:08:28 +05:30
Vishnu Mohandas
196fa2c8a4 [docs] Update (#5153)
## Description

## Tests
2025-02-24 14:05:34 +05:30
vishnukvmd
4c3ca8a565 Update 2025-02-24 14:05:02 +05:30
Neeraj Gupta
15aea42b96 [server] Minor refactor 2025-02-24 14:04:39 +05:30
Vishnu Mohandas
29c7f587f6 [docs] Update (#5151) 2025-02-24 13:55:36 +05:30
vishnukvmd
5f0bb21491 Update 2025-02-24 13:54:59 +05:30
Vishnu Mohandas
c882ce0f98 [docs] Update (#5149) 2025-02-24 13:07:25 +05:30
vishnukvmd
02dde7f6a2 Update 2025-02-24 13:07:04 +05:30
Neeraj Gupta
d268e1f309 Fix 2025-02-24 12:39:55 +05:30
Neeraj Gupta
245e78ac42 [server] Limit support while fetching collections 2025-02-24 12:29:20 +05:30
Neeraj
fa55bd88a2 [auth] New translations (#5144)
New translations from
[Crowdin](https://crowdin.com/project/ente-authenticator-app)
2025-02-24 11:13:56 +05:30
Neeraj
11538236c0 [auth] Upgrade dio (#5137)
## Description
Upgrade dio 5.4.0 -> 5.8.0+1
2025-02-24 11:12:56 +05:30
Manav Rathi
09996f77ea [web] [desktop] Enable Japanese translations (#5146) 2025-02-24 10:26:38 +05:30
Manav Rathi
3f512bc959 lf 2025-02-24 10:08:16 +05:30
Manav Rathi
8b0990bd6c [web] [desktop] Enable Japanese translations 2025-02-24 09:58:52 +05:30
Manav Rathi
70ff886252 [web] New translations (#5143)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2025-02-24 09:46:57 +05:30
Crowdin Bot
4314d42ab4 New Crowdin translations by GitHub Action 2025-02-24 01:17:26 +00:00
Crowdin Bot
8abe6957d7 New Crowdin translations by GitHub Action 2025-02-24 00:35:43 +00:00
Aman Raj Singh Mourya
d6ec6809c2 [auth] Use native dio adapter 2025-02-22 00:53:16 +05:30
Aman Raj Singh Mourya
8fe9b9571a [auth] Upgrade dio 2025-02-22 00:49:22 +05:30
Aman Raj Singh Mourya
d667cc4f98 [auth] Set cronetHttpNoPlay=true while building apk for droid 2025-02-22 00:48:53 +05:30
Manav Rathi
5806eb6e60 [web] Update storage card when family member's storage limit is configured (#5135)
Sibling of https://github.com/ente-io/ente/pull/5123
2025-02-21 17:42:21 +05:30
Manav Rathi
8830deb619 [web] Update storage card when family member's storage limit is configured
Sibling of https://github.com/ente-io/ente/pull/5123
2025-02-21 17:22:54 +05:30
Manav Rathi
5e32e975df [web] New translations (#5134)
New translations from
[Crowdin](https://crowdin.com/project/ente-photos-web)
2025-02-21 16:54:41 +05:30
Crowdin Bot
8633dabd92 New Crowdin translations by GitHub Action 2025-02-21 11:22:42 +00:00
Manav Rathi
c256f0a8c4 [web] Misc cleanup (#5133) 2025-02-21 16:52:01 +05:30
Manav Rathi
b150bbe15e Rename 2025-02-21 16:40:51 +05:30
Manav Rathi
7f69fa5d65 Reorder 2025-02-21 16:36:50 +05:30
Manav Rathi
3968dd93e9 R 2025-02-21 16:34:09 +05:30
Manav Rathi
557bdd142b R 2025-02-21 16:32:29 +05:30
Manav Rathi
b89da99c96 Rename 2025-02-21 16:29:54 +05:30
Manav Rathi
e79050a3b6 ann2 2025-02-21 16:28:42 +05:30
Manav Rathi
5e4707b695 ann 2025-02-21 16:28:42 +05:30
Manav Rathi
fd0c2866a2 Doc 2025-02-21 16:28:42 +05:30
Manav Rathi
69eee661d1 Prop 2025-02-21 16:28:42 +05:30
Manav Rathi
c78578fce5 [web] Speed up file selection for libraries with 100k+ files (#5132)
(Drastically!)
2025-02-21 16:15:51 +05:30
Manav Rathi
a0f103be9b Fix 2025-02-21 16:05:15 +05:30
Manav Rathi
04ede4326a Cleanup scaffolding 2025-02-21 15:59:57 +05:30
Manav Rathi
7cb9bc3eb7 Reduce some duplication 2025-02-21 15:53:29 +05:30
Manav Rathi
488402156f take 1 2025-02-21 15:45:46 +05:30
Manav Rathi
e80e602786 bespoke 1 2025-02-21 15:38:59 +05:30
Manav Rathi
5d553afea7 Rearrange 2025-02-21 15:28:29 +05:30
Neeraj
9a25356abf [mob] Update storage card when family member's storage limit is configured (#5123)
## Description

## Tests
2025-02-21 15:15:35 +05:30
Neeraj Gupta
5625733429 Merge remote-tracking branch 'origin/main' into family_limits 2025-02-21 14:59:18 +05:30
Manav Rathi
d2dd08391a Investigate speeding up the checkbox action too 2025-02-21 14:47:37 +05:30
Neeraj Gupta
9d06db2b6b [mob] Fix free storage calculation for mob upload 2025-02-21 14:44:50 +05:30
Neeraj Gupta
80049b11ba [mob] Handle null result 2025-02-21 14:42:59 +05:30
Manav Rathi
28160b04b9 Clean 2025-02-21 14:22:47 +05:30
Manav Rathi
02441239d5 fast 4 2025-02-21 14:11:11 +05:30
Manav Rathi
760b50b417 fast 3 2025-02-21 14:08:20 +05:30
Manav Rathi
d118e0e63e fast 1 2025-02-21 14:07:07 +05:30
Manav Rathi
49f9caac90 wip speed up 2025-02-21 14:05:38 +05:30
Prateek Sunal
ea875730dd [mob] streaming patches (#5122)
## Description

Quality of Life fixes:
- [x] Queue fixes
- [x] Android Impeller fix
- [x] No video_player_media_kit proxy, just using media_kit directory

Quality of Dev fixes:
- [x] Use master branch of media_kit
- [x] extract common functions from native player and media kit for
seconds to duration.
2025-02-21 13:34:01 +05:30
Neeraj
e3b03db06f [server] Clean up old logic for collection diff (#5130)
## Description
We still have some traffic from old mobile client v0.7.xx that is making
call to the v1 endpoint.
## Tests
2025-02-21 13:25:14 +05:30
Neeraj Gupta
b030c4e182 [server] Clean up old logic for collection diff 2025-02-21 13:22:45 +05:30
Manav Rathi
1a39846d25 Swap 2025-02-21 13:05:16 +05:30
Manav Rathi
e44020f93a Swap 2025-02-21 13:02:58 +05:30
Neeraj
435621496c [server] Move refactor (#5129)
## Description
Just grouping various actions inside different file to improve
readability
## Tests
2025-02-21 12:52:18 +05:30
Manav Rathi
8379162716 Fix 2025-02-21 12:51:21 +05:30
Manav Rathi
e8d9f4f6cf Conv 2025-02-21 12:45:12 +05:30
Manav Rathi
6724527c27 Another 2025-02-21 12:35:11 +05:30
Neeraj Gupta
6b65a974b5 [server] Refactor 2025-02-21 12:28:11 +05:30
Manav Rathi
1b90fa93ee Use 2025-02-21 12:20:12 +05:30
Neeraj Gupta
f907303c8b [server] move files 2025-02-21 12:08:16 +05:30
Manav Rathi
4317f819d8 mod 2025-02-21 12:07:31 +05:30
Manav Rathi
587da41f53 Dup 2025-02-21 11:56:23 +05:30
Manav Rathi
3214031a0c Reuse 2025-02-21 11:56:23 +05:30
Manav Rathi
0b1eee6c8e select all by date is the culprit
for 100k
t0: 291.615234375 ms
t1: 4.695068359375 ms
t2: 5.75 ms
t3: 5.9921875 ms
t4: 0.014892578125 ms
t5: 0.794921875 ms
t6: 0.0029296875 ms
2025-02-21 10:54:25 +05:30
Neeraj
7c679cd38b [auth] Add Custom Icons (ButterflyMX / FreeTaxUSA) (#5116)
## Description
New Icons: ButterFlyMX / FreeTaxUSA
2025-02-21 09:13:03 +05:30
Francis Geronimo
3669b6be09 Rename Butterflymx.svg to butterflymx.svg 2025-02-20 09:45:01 -07:00
Manav Rathi
88b0ecf472 [web] Trim the gallery context (#5124)
Code restructuring, no functional changes
2025-02-20 19:04:46 +05:30
Manav Rathi
ee2f03adca Fix 2025-02-20 18:56:48 +05:30
Manav Rathi
3e6c253a24 Uncontext 2025-02-20 18:45:17 +05:30
Manav Rathi
776b7488d3 Fin 2025-02-20 18:27:03 +05:30
Manav Rathi
371377d4d1 R 2025-02-20 18:16:26 +05:30
Manav Rathi
aad42b3c00 del 2 2025-02-20 18:10:00 +05:30
Manav Rathi
9ce0b43bfe del 1 2025-02-20 18:05:19 +05:30
Manav Rathi
f5ea565aa8 Combine visually single section 2025-02-20 17:57:25 +05:30
Manav Rathi
d41e177b3c ex 2025-02-20 17:53:00 +05:30
Manav Rathi
bc742f20e1 Use 3 2025-02-20 17:42:00 +05:30
Neeraj Gupta
898658f0ef [mob] Show memberLimit and usage when familyMember limit is set 2025-02-20 17:39:21 +05:30
Prateek Sunal
7743a4af98 chore: move date related utils to date_time_util.dart 2025-02-20 17:35:07 +05:30
Prateek Sunal
d2764fe7e1 chore: delete redundant files 2025-02-20 17:33:13 +05:30
Manav Rathi
35601956d2 Use 2025-02-20 17:30:28 +05:30
Manav Rathi
bc699b8f37 sys 2025-02-20 17:16:39 +05:30
Prateek Sunal
82df23a3b2 fix: bump build number 2025-02-20 15:24:09 +05:30
Prateek Sunal
00028e3a10 fix: queue addition logic 2025-02-20 15:23:53 +05:30
Prateek Sunal
c5dab37dfa feat: use media kit directly for preview, instead of video_player proxy 2025-02-20 15:23:31 +05:30
Neeraj
d20615002c [sever] Minor fixes in modify-storage endpoint (#5121)
## Description

## Tests
2025-02-20 14:39:05 +05:30
Neeraj Gupta
b44f844513 [server] Remove null resp 2025-02-20 14:27:18 +05:30
Neeraj Gupta
09d390bd38 [server] Return on err 2025-02-20 14:26:10 +05:30
Manav Rathi
e439e4a5f7 [web] Show an activity indicator when the user is selecting files/folders/drag-drop (#5119)
When selecting 100k+ files, the browser doesn't get back to us for
seconds, so let the user know something's happening.

> During this I found that the dd library is also doing some synchronous
processing of its own the further delays the callback, but there is
still a base delay anyways even when directly using the HTML inputs
elements.
2025-02-20 14:20:43 +05:30
Manav Rathi
3147800486 Fin 2025-02-20 14:11:40 +05:30
Natoshi
0a7984a0d2 [auth] Add Gate.io icon (#5107)
Add new icon to ente auth (gateio.svg)
and Add Gate.io icon to custom-icons.json
2025-02-20 14:01:21 +05:30
Manav Rathi
189a3ebc40 Take 1 2025-02-20 13:58:29 +05:30
Prateek Sunal
c37deecb96 chore: extract out some functions 2025-02-20 13:55:37 +05:30
Prateek Sunal
d2a4634f02 fix: callbacks 2025-02-20 13:55:22 +05:30
Manav Rathi
c0eeb7dd2f Maybe 2025-02-20 13:53:43 +05:30
Manav Rathi
4f271887fc dd 2025-02-20 13:50:42 +05:30
Manav Rathi
f46f063beb Disable backdrop clicks 2025-02-20 13:17:04 +05:30
Prateek Sunal
2275a47438 chore: bump deps changes 2025-02-20 13:14:47 +05:30
Prateek Sunal
80ab0a308f chore: bump locks 2025-02-20 13:14:32 +05:30
Prateek Sunal
ddb867d21f fix: correct sources 2025-02-20 13:14:21 +05:30
Prateek Sunal
c63cf362b6 Merge remote-tracking branch 'origin/main' into streaming-patched 2025-02-20 13:12:57 +05:30
Manav Rathi
270a628478 Use 2025-02-20 13:09:53 +05:30
Prateek Sunal
3f358b9511 fix: run preview creation after sync fd status 2025-02-20 13:08:56 +05:30
Manav Rathi
b5f850b3be Activity indicator 2025-02-20 13:06:37 +05:30
Manav Rathi
77d16e275d Also mark selection 2025-02-20 12:46:54 +05:30
Neeraj
098a4526ad [mob] Share only image for live photos (#5118)
## Description

## Tests
2025-02-20 12:08:49 +05:30
Manav Rathi
957c333cf3 Use the same enum throughout 2025-02-20 12:08:44 +05:30
Neeraj Gupta
c480dd71f1 [mob] Parse family member storage limit 2025-02-20 12:06:22 +05:30
Neeraj Gupta
101a9d4b5d [mob] Share only image for live photos 2025-02-20 12:00:27 +05:30
Manav Rathi
e3ef1e4628 Move 2025-02-20 11:51:53 +05:30
Manav Rathi
fd133d4023 Attach cancel callback 2025-02-20 11:42:30 +05:30
Neeraj
cdfdc83083 [mob] streaming feedbacks resolved (#5112)
## Description

This PR deals with following:

- [x] Android Artifacts fixes
- [x] Queuing Fixes
- [x] Document functions better
- [x] Make UX similar to native video player
- [x] Check for seekbar changes


## Tests
2025-02-20 11:36:39 +05:30
Manav Rathi
8618babc11 Attempt to intercept cancellation 2025-02-20 11:20:54 +05:30
Manav Rathi
ca28a3c595 Also 2025-02-20 11:05:57 +05:30
Manav Rathi
5eba06a269 Sublimate 2025-02-20 11:02:12 +05:30
Manav Rathi
91017969b3 Transplant 2025-02-20 10:49:42 +05:30
Francis Geronimo
d25e37e2ad New Icons
ButterFlyMX
FreeTaxUSA
2025-02-19 17:33:13 -07:00
Prateek Sunal
7b902a607a chore: bump version 2025-02-19 20:37:11 +05:30
Prateek Sunal
68bc6fac38 chore: bump locks 2025-02-19 20:36:38 +05:30
Prateek Sunal
82fdae9253 fix: seek bar & buffering 2025-02-19 20:36:30 +05:30
Manav Rathi
d78ffced78 [desktop] Improve error bifurcation during ML indexing (#5113) 2025-02-19 19:24:52 +05:30
Manav Rathi
7035d3ca90 Use 2025-02-19 19:02:42 +05:30
Manav Rathi
8920462b54 wrap 2025-02-19 18:59:59 +05:30
Manav Rathi
56f9f2a028 wrap 2025-02-19 18:58:00 +05:30
Prateek Sunal
94a77b7df1 chore: update lock files 2025-02-19 18:35:41 +05:30
Prateek Sunal
7fc42bed64 fix: add playbackCallback to hideStuff properly 2025-02-19 18:32:47 +05:30
Manav Rathi
8eb34503ac net 1 2025-02-19 18:32:25 +05:30
Prateek Sunal
2fe6df5d21 fix: sync previewIds after enabling streaming 2025-02-19 18:31:57 +05:30
Manav Rathi
d59d3c3b07 grandfather 2025-02-19 17:40:43 +05:30
Prateek Sunal
503c2506aa fix: put remote files at last, get file after updating status as compressing, 2025-02-19 15:21:38 +05:30
Prateek Sunal
e44405b46f feat: document more, better code 2025-02-19 14:54:18 +05:30
Prateek Sunal
cdaeec0e8e fix: skip errors in checking file for preview creation 2025-02-19 14:17:09 +05:30
Prateek Sunal
29671aa154 fix: use media kit in android too 2025-02-19 12:28:44 +05:30
Manav Rathi
370299d433 [desktop] Improve ML worker logging (#5111) 2025-02-19 12:14:33 +05:30
Manav Rathi
38d42c67fb Log in other workers too 2025-02-19 12:08:40 +05:30
Manav Rathi
802ad184d2 Log at top level to cover unknown scenarios too 2025-02-19 12:06:02 +05:30
Manav Rathi
55cff6f174 log ww unhandled 2025-02-19 11:41:31 +05:30
Manav Rathi
e5448685ca Tweak 2025-02-19 10:52:32 +05:30
Manav Rathi
bde8a17cb4 Tweak 2025-02-19 10:39:24 +05:30
Manav Rathi
fc3200af73 [desktop] Fix NaN% ML status for empty account (#5110) 2025-02-19 10:35:51 +05:30
Manav Rathi
d21ea0a5a6 Fix NaN% for empty account 2025-02-19 10:31:34 +05:30
Manav Rathi
a1fda786f5 Fix look (paper now has a default shadow) 2025-02-19 10:30:33 +05:30
Manav Rathi
bc0980eb8d [web] Code reorg (#5109)
Intermezzo between the photoswipe changes.
2025-02-19 10:08:46 +05:30
Manav Rathi
2cfc5d9c59 Unused 2025-02-19 09:58:25 +05:30
Manav Rathi
682710a8a8 Remove unneeded ignore
We no longer have any source in public
2025-02-19 09:56:42 +05:30
Manav Rathi
ed50e5a36c pkg json cleanup 2025-02-19 09:51:58 +05:30
Manav Rathi
f31a6f2401 Move 2025-02-19 09:51:58 +05:30
Manav Rathi
239f08b516 Fixes 2025-02-19 09:32:23 +05:30
Manav Rathi
8544f5e109 Fixes 2025-02-19 09:30:40 +05:30
Manav Rathi
1eaaafb8df Ditto 2025-02-19 08:58:25 +05:30
Manav Rathi
149196e7dd Rename 2025-02-19 08:45:38 +05:30
Manav Rathi
38a31b7492 5s 2025-02-19 08:41:56 +05:30
Manav Rathi
b14ad92b91 Improvements 2025-02-19 08:41:56 +05:30
Manav Rathi
872455cce2 [web] Use upstream PhotoSwipe - Part x/x (#5108)
- Error handling 
- Exif handling (partial)
2025-02-18 20:25:05 +05:30
Manav Rathi
65a5248338 Revert "Revert "Mainlineable""
This reverts commit d398838742.
2025-02-18 20:17:50 +05:30
Manav Rathi
fcf06cff57 Cleanup 2025-02-18 20:17:03 +05:30
Manav Rathi
13752654cd Retain original image URL 2025-02-18 19:59:56 +05:30
Manav Rathi
d5e8777e0d Take 1 2025-02-18 19:47:06 +05:30
Manav Rathi
7de2a47c51 Sketch 2025-02-18 19:23:13 +05:30
Manav Rathi
20bc84ca96 Doc 2025-02-18 18:24:47 +05:30
Manav Rathi
fd7c25029e Restructure 2025-02-18 16:52:39 +05:30
Manav Rathi
764add95c8 EP 1 2025-02-18 16:30:15 +05:30
Prateek Sunal
8c3fc0a879 [mob] remove internal user flag for media kit (#5106)
## Description

Remove internal user flag for media kit

## Tests
2025-02-18 15:11:55 +05:30
Prateek Sunal
37c467eb86 fix: remove internal user flag 2025-02-18 15:09:52 +05:30
Manav Rathi
931d7c8513 Close 2025-02-18 15:03:58 +05:30
Manav Rathi
132962b92f Exclusive 2025-02-18 14:48:51 +05:30
Manav Rathi
a5c4d9cc18 ff 2025-02-18 14:40:25 +05:30
Neeraj
39c31779a4 [mob] Lint fixes (#5103)
## Description

* Modified the analysis file and disabled all rules except
use_super_key.

Ran automatic fix command
❯ dart fix --apply

This also removed redundant cast warning. As the changes seemed
harmless, decided to keep them.

## Tests
2025-02-18 14:19:35 +05:30
Neeraj
d09613a946 [mob] video editor fixes (#5091)
## Description

Previously video editor was giving subpar quality videos, this fixes it
and also re-encodes videos using libx264 mp4 format.

This will also increase the time to process the edited video.

## Tests
2025-02-18 14:17:15 +05:30
Prateek Sunal
88e50982b2 [mob] streaming queue fixes (#5105)
## Description

## Tests
2025-02-18 14:16:57 +05:30
Prateek Sunal
ce5a8f0457 fix: logic for queuing and item removal 2025-02-18 14:09:39 +05:30
Neeraj Gupta
8c81a377c0 Lint fixes 2025-02-18 14:08:10 +05:30
Neeraj Gupta
a0025ab09b [mob] Lint fixes 2025-02-18 13:48:28 +05:30
Manav Rathi
324c156ea1 Use last best instead of thumbnail 2025-02-18 13:43:23 +05:30
Manav Rathi
4b87c9f3ac Thumb errs 2025-02-18 13:36:19 +05:30
Neeraj
dfda0c2c32 [mob] Extract ente_crypto plugin (#5102)
## Description

## Tests
2025-02-18 13:27:29 +05:30
Neeraj Gupta
c1a53bdfce Fix lint issues 2025-02-18 13:24:15 +05:30
Neeraj Gupta
0c8dc3af95 [mob] Extract ente_crypto plugin 2025-02-18 13:19:09 +05:30
Manav Rathi
b3100f098b Reset failures 2025-02-18 12:50:09 +05:30
Prateek Sunal
0e157a4e33 fix: still check 10mb preview limit 2025-02-18 12:19:16 +05:30
Prateek Sunal
04a5372f6e Merge branch 'main' into bumpversion 2025-02-18 11:47:52 +05:30
Manav Rathi
f47837f550 fin visually 2025-02-18 11:21:34 +05:30
Manav Rathi
1af8d7481d err 4 2025-02-18 11:09:39 +05:30
Manav Rathi
af91adeb72 err 3 2025-02-18 10:53:16 +05:30
Neeraj
8fd90651b1 [auth] Delete unused code (#5094)
## Description

## Tests
2025-02-18 10:31:47 +05:30
Edoardo Mileto
c3da41eee2 Create a custom icon for Deloitte (#5096)
## Description
followed [this
guide](https://github.com/ente-io/ente/blob/main/auth/docs/adding-icons.md)
2025-02-18 10:31:04 +05:30
Neeraj Gupta
ac94dccb90 remove oversize icon 2025-02-18 10:26:17 +05:30
Manav Rathi
89881975f2 err 2 2025-02-18 10:22:48 +05:30
Manav Rathi
e715d582ac err 1 2025-02-18 09:54:07 +05:30
Manav Rathi
808c611a92 Docs 2025-02-18 09:25:53 +05:30
Manav Rathi
fe5146ead8 Singleton => module 2025-02-18 09:15:25 +05:30
Manav Rathi
d398838742 Revert "Mainlineable"
This reverts commit 6ccca2114e.
2025-02-18 09:02:11 +05:30
Manav Rathi
717dc0996f [web] Use upstream PhotoSwipe (WIP) (#5097)
Continue https://github.com/ente-io/ente/pull/5066
2025-02-17 19:47:00 +05:30
Manav Rathi
00db3c0335 sp 2025-02-17 19:42:40 +05:30
Manav Rathi
6ccca2114e Mainlineable 2025-02-17 19:38:03 +05:30
Manav Rathi
0e3708ffdc LP resume 2025-02-17 19:38:03 +05:30
Manav Rathi
36e7dae2ee Simplify 2025-02-17 19:30:48 +05:30
Manav Rathi
9d76d93254 Integrate 2025-02-17 19:16:03 +05:30
Prateek Sunal
aab4bff6ff bump version 2025-02-17 18:54:20 +05:30
Manav Rathi
12a96b68ba wip ds 2025-02-17 18:39:27 +05:30
Manav Rathi
a851caf78f Another ARIA workaround 2025-02-17 17:11:14 +05:30
Neeraj Gupta
4bbac0ca66 [auth] Delete unused code 2025-02-17 17:08:22 +05:30
Manav Rathi
bb2bbb5655 Workaround for an aria issue...
...somewhere (In something we're doing? In PS? In Chrome? In ARIA?)
2025-02-17 16:32:13 +05:30
Neeraj Gupta
d36934ec0d remove 2025-02-17 16:27:50 +05:30
Neeraj Gupta
f922df304e [mob] Refactor 2025-02-17 16:27:50 +05:30
Manav Rathi
f6d949db38 wrap 2025-02-17 16:09:18 +05:30
Manav Rathi
e937027667 Title gets used as ariaLabel 2025-02-17 16:04:51 +05:30
Manav Rathi
84aeb79412 Move out icons 2025-02-17 15:44:05 +05:30
Manav Rathi
6140f35e69 Move 2025-02-17 15:27:39 +05:30
Manav Rathi
0eba6b9c98 Move 2025-02-17 15:07:30 +05:30
Manav Rathi
fe86075868 Namespace 2025-02-17 14:54:11 +05:30
Manav Rathi
e9d63dfea9 zi 2025-02-17 14:39:49 +05:30
Manav Rathi
1c322a9c62 Modal 2025-02-17 14:11:16 +05:30
Manav Rathi
dc0450b155 Modal 2025-02-17 14:05:55 +05:30
Manav Rathi
8e90541d87 Fix path for lps 2025-02-17 13:57:25 +05:30
Prateek Sunal
8df04b2363 fix: convert the edited video to mp4 with x264 2025-02-17 13:50:03 +05:30
Manav Rathi
43c0d8a6ad Revert "Revert "Workbench""
This reverts commit 20fea517ce.
2025-02-17 13:42:38 +05:30
617 changed files with 12738 additions and 24400 deletions

View File

@@ -4,7 +4,7 @@ on:
workflow_dispatch: # Allow manually running the action
env:
FLUTTER_VERSION: "3.24.3"
FLUTTER_VERSION: "3.27.2"
jobs:
build:
@@ -54,12 +54,3 @@ jobs:
packageName: io.ente.auth
releaseFiles: auth/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
track: internal
- name: Notify Discord
uses: sarisia/actions-status-discord@v1
with:
webhook: ${{ secrets.DISCORD_INTERNAL_RELEASE_WEBHOOK }}
nodetail: true
title: "🏆 Internal release available for Auth"
description: "[Download](https://play.google.com/store/apps/details?id=io.ente.auth)"
color: 0x800080

View File

@@ -8,7 +8,7 @@ on:
- ".github/workflows/auth-lint.yml"
env:
FLUTTER_VERSION: "3.24.3"
FLUTTER_VERSION: "3.27.2"
jobs:
lint:

View File

@@ -29,7 +29,7 @@ on:
- "auth-v*"
env:
FLUTTER_VERSION: "3.24.3"
FLUTTER_VERSION: "3.27.2"
jobs:
build-ubuntu:

View File

@@ -4,7 +4,7 @@ on:
workflow_dispatch: # Allow manually running the action
env:
FLUTTER_VERSION: "3.24.3"
FLUTTER_VERSION: "3.27.2"
jobs:
build:
@@ -40,7 +40,7 @@ jobs:
- name: Build PlayStore AAB
run: |
flutter build appbundle --dart-define=cronetHttpNoPlay=true --release --flavor playstore
flutter build appbundle --release --flavor playstore
env:
SIGNING_KEY_PATH: "/home/runner/work/_temp/keystore/ente_photos_key.jks"
SIGNING_KEY_ALIAS: ${{ secrets.SIGNING_KEY_ALIAS_PHOTOS }}
@@ -54,12 +54,3 @@ jobs:
packageName: io.ente.photos
releaseFiles: mobile/build/app/outputs/bundle/playstoreRelease/app-playstore-release.aab
track: internal
- name: Notify Discord
uses: sarisia/actions-status-discord@v1
with:
webhook: ${{ secrets.DISCORD_INTERNAL_RELEASE_WEBHOOK }}
nodetail: true
title: "🏆 Internal release available for Photos"
description: "[Download](https://play.google.com/store/apps/details?id=io.ente.photos)"
color: 0x00ff00

View File

@@ -9,7 +9,7 @@ on:
env:
FLUTTER_VERSION: "3.24.3"
FLUTTER_VERSION: "3.27.2"
jobs:
lint:

View File

@@ -9,7 +9,7 @@ on:
- "photos-v*"
env:
FLUTTER_VERSION: "3.24.3"
FLUTTER_VERSION: "3.27.2"
jobs:
build:
@@ -45,7 +45,7 @@ jobs:
- name: Build independent APK
run: |
flutter build apk --dart-define=cronetHttpNoPlay=true --release --flavor independent
flutter build apk --release --flavor independent
mv build/app/outputs/flutter-apk/app-independent-release.apk build/app/outputs/flutter-apk/ente-${{ github.ref_name }}.apk
env:
SIGNING_KEY_PATH: "/home/runner/work/_temp/keystore/ente_photos_key.jks"

View File

@@ -1,24 +1,27 @@
name: "Publish ghcr (server)"
on:
# Run automatically on 15th of every month, at 05:00 UTC.
schedule:
- cron: '0 5 15 * *'
# Run manually if needed to publish out of schedule.
# Run manually, providing it the commit.
#
# To obtain the commit from the currently deployed museum, do:
# curl -s https://api.ente.io/ping | jq -r '.id'
#
# See server/docs/publish.md for more details.
workflow_dispatch:
inputs:
commit:
description: "Commit to publish the image from"
type: string
required: true
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Determine commit from prod museum
run: |
echo "museum_commit=$(curl -s https://api.ente.io/ping | jq -r .id)" >> $GITHUB_ENV
- name: Checkout code
uses: actions/checkout@v4
with:
ref: ${{ env.museum_commit }}
ref: ${{ inputs.commit }}
- name: Build and push
uses: mr-smithers-excellent/docker-build-push@v6
@@ -31,8 +34,8 @@ jobs:
enableBuildKit: true
multiPlatform: true
platform: linux/amd64,linux/arm64
buildArgs: GIT_COMMIT=${{ env.museum_commit }}
tags: ${{ env.museum_commit }}, latest
buildArgs: GIT_COMMIT=${{ inputs.commit }}
tags: ${{ inputs.commit }}, latest
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -1,19 +1,24 @@
Ente Auth helps you generate and store 2 step verification (2FA) tokens on your mobile devices.
Ente Auth helps you generate and store 2 step verification (2FA)
tokens on your mobile devices.
FEATURES
- Secure Backups
Auth provides end-to-end encrypted cloud backups so that you don't have to worry about losing your tokens. We use the same protocols Ente Photos uses to encrypt and preserve your data.
Auth provides end-to-end encrypted cloud backups so that you don't have to worry
about losing your tokens. We use the same protocols Ente Photos uses to encrypt
and preserve your data.
- Multi Device Synchronization
Auth will automatically sync the 2FA tokens you add to your account, across all your devices. Every new device you sign into will have access to these tokens.
Auth will automatically sync the 2FA tokens you add to your account, across all
your devices. Every new device you sign into will have access to these tokens.
- Web access
You can access your 2FA code from any web browser by visiting https://auth.ente.io .
- Offline Mode
Auth generates 2FA tokens offline, so your network connectivity will not get in the way of your workflow.
Auth generates 2FA tokens offline, so your network connectivity will not get in
the way of your workflow.
- Import and Export Tokens
You can add tokens to Auth by one of the following methods:
@@ -25,7 +30,8 @@ otpauth://totp/provider.com:you@email.com?secret=YOUR_SECRET
The codes maybe separated by new lines or commas.
You can also export the codes you have added to Auth, to an **unencrypted** text file, that adheres to the above format.
You can also export the codes you have added to Auth, to an **unencrypted** text
file, that adheres to the above format.
SUPPORT

View File

@@ -21,11 +21,6 @@
"title": "airtm",
"hex": "000000"
},
{
"title": "AJ Bell",
"slug": "aj_bell",
"hex": "c41230"
},
{
"title": "aliyun",
"altNames": [
@@ -35,18 +30,9 @@
{
"title": "Amazon"
},
{
"title": "Ankama",
"slug": "ankama"
},
{
"title": "Anycoin Direct",
"slug": "anycoindirect"
},
{
"title": "Aruba",
"slug": "aruba",
"hex": "ef8a33"
},
{
"title": "AscendEX"
@@ -309,9 +295,6 @@
{
"title": "DMarket"
},
{
"title": "DocuSeal"
},
{
"title": "Doppler"
},
@@ -361,14 +344,6 @@
{
"title": "Estateguru"
},
{
"title": "EVEOnline",
"slug": "eve_online",
"altNames": [
"EVE Online"
],
"hex": "858585"
},
{
"title": "Fastmail"
},
@@ -514,12 +489,6 @@
{
"title": "Kagi"
},
{
"title": "Keygen",
"altNames": [
"keygen.sh"
]
},
{
"title": "Kick"
},
@@ -712,22 +681,6 @@
"title": "ngrok",
"hex": "858585"
},
{
"title": "NekoHosting",
"slug": "nekohosting",
"altNames": [
"NekoHosting Billing",
"NekoHosting Dashboard"
]
},
{
"title": "NekoHosting Gaming Panel",
"slug": "nekohosting_gp",
"altNames": [
"NekoHosting Game Panel",
"NekoHosting GamePanel"
]
},
{
"title": "Nelnet"
},
@@ -777,11 +730,6 @@
"altNames": [
"欧易"
]
},
{
"title": "OnShape",
"slug": "onshape",
"hex": "7abb5e"
},
{
"title": "Parqet",
@@ -879,11 +827,6 @@
{
"title": "RealMe",
"slug": "realme"
},
{
"title": "RealVNC",
"slug": "realvnc",
"hex": "488aec"
},
{
"title": "Registro br",
@@ -928,10 +871,6 @@
{
"title": "Samsung"
},
{
"title": "Seafile",
"slug": "seafile"
},
{
"title": "Sendgrid"
},
@@ -991,10 +930,6 @@
"PAYDAY 3"
]
},
{
"title": "STRATO",
"hex": "FF8800"
},
{
"title": "Surfshark"
},
@@ -1054,18 +989,15 @@
"title": "Termius",
"hex": "858585"
},
{
"title": "Titan"
},
{
"title": "tianyiyun",
"altNames": [
"天翼云"
]
},
{
"title": "TikTok"
},
{
"title": "Titan"
},
{
"title": "TorGuard"
},
@@ -1161,7 +1093,8 @@
"title": "WHMCS"
},
{
"title": "Windscribe"
"title": "Windscribe",
"hex": "858585"
},
{
"title": "Wise"
@@ -1175,24 +1108,11 @@
"Work OS"
]
},
{
"title": "World Cube Association",
"slug": "wca",
"altNames": [
"WCA",
"worldcubeassociation"
]
},
{
"title": "WYZE"
},
{
"title": "Xbox",
"hex": "107C10"
},
{
"title": "Yahoo",
"hex": "5F01D2"
"title": "yahoo"
},
{
"title": "Yandex",
@@ -1207,9 +1127,6 @@
"altNames": [
"You Need A Budget"
]
},
{
"title": "Zoom"
}
]
}

View File

@@ -1,7 +0,0 @@
<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1507 1556" width="1507" height="1556">
<title>logo_grey-svg</title>
<style>
.s0 { fill: #c41230 }
</style>
<path id="Layer" class="s0" d="m759.6 651c10.6 63.6 7.5 126.3-6.8 185.3-0.6-3.5-0.8-7-1.5-10.6-51.7-311.8-346.3-522.7-657.7-470.8-32.4 5.3-63.6 13.5-93.6 23.9 62.4-54.7 140.3-93.4 228.3-108.1 251.6-41.9 489.5 128.4 531.3 380.3zm84.2 340c-48.7 59.8-107.3 106.4-171.5 140 2.8-3.3 5.7-6.4 8.4-9.7 238.7-292.4 195.6-723.2-96.4-962.3-30.4-24.8-62.2-46.4-95.3-65.2 98.4 12.9 194.5 52.4 276.9 119.9 236 193.2 270.9 541.2 77.9 777.3zm409.3-532.7c66.8 402.8-204.2 783.4-605.6 852.1 313.4-230.6 489-625.2 420.9-1035.7-16.2-97.3-45.1-189.3-84.7-274.7 138.4 110.2 238.1 269.9 269.4 458.3zm241.5 84.5c78.6 473.9-241.4 921.9-714.8 1000.6-195.5 32.6-386.6-3.2-549.2-89.5 98.5 11.2 200.2 9.2 302.8-7.9 537.8-89.4 917.1-559.8 908.4-1089.5 23.9 58.8 41.9 121 52.8 186.3z"/>
</svg>

Before

Width:  |  Height:  |  Size: 943 B

View File

@@ -1,5 +0,0 @@
<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 720" width="720" height="720">
<title>ankama</title>
<path class="s0" d="m572.3 253.3c-0.3-1.4-0.5-3-1.1-4.4-15.1-46-59.7-76.2-107.9-71.5-31.2 3-55.6 18.9-73.4 44.7-3.8 5.7-7.1 12-10.1 18.4-9.4 19.5-19.5 38.7-24.7 59.7-0.5 1.6-1.1 3.5-1.9 4.9-2.5 4.6-5.5 6.3-10.1 4.1-11.7-5.7-23.8-5.2-36.1-4.4-20.3 1.1-37.9-5.7-52.9-19.5-36.1-33.1-35.3-91 1.9-123 26.8-23.3 43.3-52.1 49.3-86.8 3-16.5 3.3-33.4 0-49.9-0.5-2.7-0.8-5.5-1.4-8.7 7.4-1.4 14.3 0 20.8 2.2 42.8 12.4 69.3 40.6 81.6 82.7 0.5 2.2 1.1 4.4 1.6 6.8 0.8 3 2.7 4.9 5.7 5.5 3.3 0.5 6.3-0.5 7.9-3.5 3-6.3 5.7-12.7 8.2-19.2 3.3-9.7 3.8-10.5 14.3-10.6 58.3-0.8 111.7 15.4 159.4 49 60.5 42.9 98.4 101.4 115.7 173.4 0.8 3.5 0.8 7.6 0.5 11.6-4.6 68-26.8 129.6-68.8 183.5-49 63.1-112.4 104.4-190.7 121.4-72.6 15.8-141.7 4.9-207.1-30.1-1.4-0.8-2.7-1.6-3.8-2.5-0.3 0-0.5-0.8-1.6-2.2 8.7 3 17 5.5 24.7 8.6 13.9 5.7 28.5 8.7 43.6 8.6 14.3 0 28.2 0.8 42.5 0 63.9-3.8 119.5-27.4 166.2-70.7 23.6-21.9 32.8-50.7 30.7-82.4-1.9-32.3-16.5-58.6-42.2-78.3-18.9-14.6-32-33.1-38-56.4-4.1-15.8-4.6-32-0.8-48.2 5.7-24.7 27.7-41.7 52.3-40.6 17 0.8 29.6 9 39.5 22.5 1.4 1.9 2.7 4.1 4.1 6.3 0.5 0 0.8-0.5 1.4-0.8l0.8 0.3v-0.5zm-263.5-55.1c-14.7 0-26.3 12.4-26.3 27.7 0 15.3 11.6 27.4 26.6 27.4 15 0 26-12.4 26-27.1 0-14.7-12-27.9-26.3-27.9v-0.2z"/>
<path class="s0" d="m168.2 314.5c7.4 1.6 14.7 3.3 22.5 4.9 10.9 2.2 14.3 6.8 12 18.1-1.6 8.2-3 16.2-4.9 24.1-0.8 3.5 0 5.7 2.5 8.2 22.8 23.6 50.1 38.4 83.8 43.6-2.2-1.4-3-2.2-4.1-2.7-19.5-10.1-27.7-25.2-25.2-46.6 1.1-9.8 0-19.2-6-27.4-3.8-5.5-9-9.7-13.9-14.3-1.6-1.6-3.8-2.5-6-4.1 5.2-3.3 10.5-3.3 15.4-3 7.4 0.3 14.7 1.4 22.2 3 11.6 2.5 21.7 8.2 30.4 16.2 6.5 6 12.4 12.4 18.7 18.4 13.9 13.6 25.2 12.8 37.2-2.7 7.6-9.8 12.4-21.4 15.8-33.1 3.8-12.7 8.2-24.9 15.4-36.1 7.4-11.6 16.5-21.7 27.4-30.1 9.7-7.4 19.7-6.8 30.7-3.3v9.7c-1.1 27.1 5.2 52.6 19.5 75.9 1.1 1.9 2.2 4.1 3.5 6 4.1 6.3 3.3 12-0.5 18.1-5.5 8.7-13.5 13.2-23.8 13.5h-6.3c-12.7 0-23.3 8.2-26.8 20.6-3 10.9 1.9 23.3 11.7 29.6 10.9 6.8 24.1 5.7 33.4-3 10.1-9.8 16.5-21.7 18.9-35.7 0.3-1.9 0.8-4.1 1.1-6 17.3-0.3 39.8 16.6 48.2 37.2 10.1 24.1 6.3 46.6-10.1 68.8-0.8-5.2-1.4-9.4-2.2-12.8-2.2-9.7-8.6-15.7-18.1-17.7-6.8-1.6-9.8 0-13.6 5.7-1.9 3-3.5 6.3-5.2 9.7-2.5 4.9-4.6 9.8-7.1 14.6-13.6 27.1-34.9 45.8-63.2 55.6-27.1 9.7-55.2 13.2-83.5 10.1-16.5-1.6-29.3-10.5-39.8-23.6 1.9-1.4 3.3-2.7 4.9-3.8 7.4-5.5 12.8-12.7 16.6-20.8 1.1-2.2 1.6-4.9 1.9-7.4 0.5-5.2-2.7-9.4-7.6-9.8-4.6-0.5-8.7 2.5-10.1 7.6-0.8 3.3-1.1 6.5-2.5 9.7-3.8 7.1-9.7 12.8-16.5 17-7.4 4.4-14.6 3.8-20-1.4-5.5-5.5-6-11.7-1.9-19.7 0.3-0.5 0.5-1.4 1.4-3-2.5 1.1-4.1 1.4-5.5 2.2-17.7 10.6-25.8 31.5-19.2 51.5 18.7 56.7-6 119.5-54 151-3.3 2.2-7.1 4.1-11.6 6.8 0-3-0.5-5.2-0.5-7.4-2.5-57.8-30.1-98.9-82.4-122.8-32.8-14.7-53.7-39.5-62.1-74-12.4-50.1 13.9-102.2 61.2-122.8 1.9-0.8 4.1-1.4 7.6-2.7-15.1 28.8-18.7 57.2-9.4 86.8 5.5 17.3 14.7 32 29 45.5 0.3-12.4-0.8-23.6 7.6-33.4 2.7 6.3 5.5 12 8.2 17.7 4.9 10.9 12.7 19.5 23.3 24.9 12 6.3 24.1 6.8 36.5 1.1 8.6-3.8 15.8-9.4 22.2-16.2 8.6-9 8.6-24.9 0.3-35.7-5.5-7.1-8.6-14.7-7.4-23.6 1.9-15.4 15.1-26.8 32-28.2 4.6-0.3 9.4 0 13.6 0.5 4.1 0.8 8.2 2.5 12.7 3.3-3.5-3.8-7.9-6.5-12.7-8.2-8.2-2.7-16.6-3.3-25.2-1.6-14.7 3.3-24.9 16.2-26.3 33.4-0.5 6.3 0 12.8 1.1 19.2 3 16.5-0.8 30.4-13.2 42.8-1.9-1.6-3.8-2.7-5.7-4.4-43.9-37.6-69.6-84.6-75.6-142.2-10.1-95.9 42.5-184.9 130.9-223 28.5-12.4 46-33.8 53.4-63.9 0.3-1.4 0.8-2.7 1.9-3.8 1.9 10.1 1.4 20.3-1.1 30.1-6 24.1-19.5 42.8-41.4 55.3-21.4 12.4-38.4 29-51.5 50.1-2.5 4.1-2.7 7.1 0 10.9 2.7 3.5 5.2 7.6 7.6 11.6 4.4 7.4 3 13.9-4.1 18.9-6.3 4.4-13.2 8.2-19.5 12.7-1.6 1.1-3.5 3.3-3.8 5.2-1.6 18.7-0.5 36.9 5.5 55.3l1.4-0.3-0.2-0.2zm192.8 132c14.3 0 25.8-11.3 25.5-25.2 0-13.6-12-25.8-25.5-25.8-13.5 0-25.2 11.3-25.5 25.5 0 14.3 11.3 25.5 25.2 25.5z"/>
</svg>

Before

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path fill="#FF8300" fill-rule="evenodd" d="M12.1099561,17.3015551 C9.03598293,17.3015551 6.50849391,14.8423766 6.50849391,11.836714 C6.50849391,8.83105139 9.03598293,6.37187289 12.1099561,6.37187289 C15.1839292,6.37187289 17.7114182,8.83105139 17.7114182,11.836714 C17.7114182,14.8423766 15.1839292,17.3015551 12.1099561,17.3015551 L12.1099561,17.3015551 Z M12.1099561,2 C6.50849391,2 2,6.4401834 2,11.836714 C2,17.3015551 6.50849391,21.673428 12.1099561,21.673428 C14.4325135,21.673428 16.5501395,20.9220123 18.2579023,19.6241126 C19.28256,21.3318754 22.2199121,21.673428 22.2199121,21.673428 L22.2199121,11.836714 C22.2199121,6.4401834 17.7114182,2 12.1099561,2 L12.1099561,2 Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 901 B

View File

@@ -1,22 +1,47 @@
<?xml version='1.0' encoding='utf-8'?>
<svg xmlns="http://www.w3.org/2000/svg" width="312.4" height="356.75" data-name="Layer 1" version="1.1" viewBox="0 0 312.4 356.75">
<path d="m312.4 254.38v-151.8c0-9.6-5.1-18.4-13.3-23.2l-129.3-75.7c-8.4-4.9-18.8-4.9-27.2 0l-129.3 75.6c-8.3 4.8-13.3 13.7-13.3 23.2v151.8c0 9.6 5.1 18.4 13.3 23.2l129.3 75.6c8.4 4.9 18.8 4.9 27.2 0l129.3-75.6c8.3-4.8 13.3-13.7 13.3-23.2z" fill="#2caddc" />
<g transform="translate(-43.8,-21.525)">
<path d="m208.8 327.5c-0.4-0.8-1.7-4.2-2.8-7.4-1.8-5.3-2-5.6-2.3-3.1-0.1 1.5-0.6 2.7-1 2.7s-0.8 1.6-0.8 3.5c0 4-1 3.5-2.5-1.3l-1-3.3-2.6 5.6-0.5-5c-0.6-6.7-2.2-6.6-4.7 0.3-2.3 6.3-3.4 7.7-4.1 5.2-0.4-1.3-1.3-1.8-3-1.8s-2.6-0.4-3.4-3.3c-1.2-3.9-2-4.2-3.1-1l-0.8 2.3v-2.9c-0.2-2.6-0.3-2.7-1.2-1.3-1 1.5-2.1 2.9-3.2 4.2l-2.2 2.6-0.9-2.4c-0.5-1.3-0.8-2.8-0.9-4.2 0-1.7-0.3-3.4-0.5-5l-0.5-3.2-4.4 4.3-4.4 4.4-0.6-3.9c-0.6-4.3-1.5-4.7-5.5-2.6-1.4 0.7-2.7 1.2-2.8 1s-0.6-1.6-1-3.2c-0.7-2.8-0.9-3-5.8-3.7s-5.1-0.9-5.5-3.5c-0.8-5-3.1-8.7-5.3-8.7s-1.8-0.4-1.5-0.8c0.7-1.1-0.9-1.1-3.1 0-1.7 0.9-1.7 0.8-1.2-3 0.4-3 0.3-4-0.7-4.4-0.7-0.3-3.4-3.2-6-6.5l-5.3-6.6c-0.3-0.3-2.5 0-4.9 0.7s-4.5 1.2-4.7 1 0.6-3.1 1.7-6.5c2-6.4 2-7.6 0-7.6s-1.2-1.2-1.2-5 0-5-2.9-5.9l-2.9-0.9 1.2-3c1.7-4.1 1-5.3-3-5.3s-3.4-0.3-3.4-0.7 1.3-2.4 2.9-4.6 2.9-4 2.9-4.2-1.2-0.7-2.7-1-2.9-0.8-4.3-1.4c-1.4-0.8-1.3-1.1 1.6-4.1l3.2-3.3-2.7 0.5c-2.7 0.5-3.9-0.7-1.4-1.6 1.9-0.7 1.5-1.8-1.3-2.8-2-0.8-2.5-1.4-2.5-3.5s-0.6-2.9-1.3-3.3c-1.1-0.6-1.1-0.9 0.6-2 1.2-0.8 2.5-1.4 3.8-1.9 1.2-0.3 2-1.4 1.9-2.6 0-1.7-0.5-2-3.1-2.3l-3.1-0.3 2.3-1.2c2.7-1.4 2.9-2.3 0.6-3-2.2-0.7-2.2-2.1 0-2.1s2.1-3.8-1.3-5.9c-2.5-1.6-2.8-2-1.7-2.6 0.7-0.4 1.3-1.7 1.3-2.8 0-1.3 0.4-2.5 1-3.6 0.8-1.3 0.6-2.1-0.8-4.6-2.5-4.2-2.6-11.8-0.2-12.6 2.6-0.8 2.5-3.9-0.3-6.9l-2.5-2.7 2.6-0.9c2.6-0.9 4.1-3.3 3.1-5-0.3-0.5-0.1-1.9 0.4-3.1 0.6-1.5 1-3.1 1.2-4.8 0.1-1.3 0.4-2.5 0.8-3.8 2.5-6.8 3.2-10.3 2.4-12.4s-0.6-2.5 2.9-4.7c2.2-1.4 3.7-2.9 3.7-3.9s1-2.8 2.3-4.3 3.4-4.2 4.6-5.9c1.9-2.5 2.9-3.1 5.1-3.1s5.5-2 5.5-3.9 1.8-1 4-1.3 5.1-1.1 6.4-1.9 4-1.6 6-1.7 4.2-0.6 4.9-1.2 1.7-0.9 2.3-0.8c3.8 0.5 6.5-0.2 7-1.8s0.7-1.6 2-0.4c2.2 2 6.2 1.6 8.5-0.8l2-2.1 1.1 2.1c1.4 2.6 4.4 2.8 7.7 0.4 2-1.5 2.8-1.6 5.6-0.9 1.8 0.5 4.3 1.1 5.6 1.3 1.3 0.3 2.3 1.1 2.3 1.8 0 1.1 3.1 2.9 4.9 2.9 0.3 0 1.3-1.1 2.2-2.5l1.7-2.5 5.2 6.2 8.6-5.4 1.9 1.7c1.8 1.7 2.1 1.7 11.9 0.6 5.5-0.7 11.9-1.2 14.2-1.2 2.9-0.1 5.9-0.5 8.7-1.3 4.7-1.3 5.9-1.1 5.9 0.8s2.4 2.1 6.3 0l3.8-2.1-0.2 2.8c-0.2 2.7-0.1 2.8 3.1 3.1 1.8 0.1 4.4 1 5.7 2 1.5 1.1 4.4 1.9 7.7 2.3 5.3 0.5 8.7 2.4 8.7 4.8s1.6 2.3 3.6 3.7 4.1 3.6 4.7 4.8 3 4.2 5.3 6.5c3.9 4 4.1 4.3 2.4 4.9-2.9 0.9-2 2.9 2.2 4.6 3.7 1.5 4 2.3 1.8 4.7-1.8 1.9-1.8 2.1-0.4 3.1 1.2 0.9 1.3 1.5 0.6 2.7-1.3 2.4-0.2 6.2 2.2 8.3 2 1.7 2.1 1.9 0.7 3.8-1.8 2.6-1.8 3.7 0.5 6.7l1.9 2.5-1.8 1.4c-2.6 2-1.8 7.5 1.5 10.7 3 2.9 3 3.7 0 3.7s-2.5 0.4-2.8 2.5c-0.2 1.4 0 3 0.3 3.6s0.7 2.1 0.7 3.3 0.7 2.6 1.5 3.1c1.3 0.7 1.1 1-1.3 2.3-1.5 0.8-2.7 2-2.7 2.5 0 0.8-0.2 1.5-0.5 2.2-0.3 0.9 0.2 1.3 1.9 1.6l2.4 0.3-2.3 1.1c-1.3 0.6-2.3 1.4-2.3 1.7s1 1.1 2.3 1.7l2.3 1.2-2.7 0.3c-3.7 0.4-3.9 3.7-0.2 5.2 3.4 1.4 4.8 3.2 3 3.9-0.8 0.3-1.3 1.5-1.3 3s-0.5 2.7-2.3 3.4c-1.3 0.5-2.4 1.1-2.6 1.2s0.6 1 1.7 2l2 1.7-3.3-0.4-3.3-0.5 3.2 2.9c3.6 3.3 3.4 4-2 5.6l-3.6 1 3 3.9c1.6 2.2 3 4.3 3 4.8s-1.5 0.9-3.3 0.9c-4.1 0-4.6 0.8-3 4.7 0.7 1.7 1.3 3.2 1.3 3.3s-1.3 0.7-2.9 1.2c-2.9 1-2.9 1-2.9 5.9s-0.3 5-1.1 5-1.8 0.5-2.6 1.1c-1.4 1-1.4 1.4 0.4 7.5 1 3.5 1.6 6.7 1.4 7s-2.9 0-5.8-0.8l-5.3-1.3-9.6 9.6 1.1 5.2c0.6 2.9 0.9 5.2 0.6 5.2s-1.5-0.6-2.6-1.2c-5.2-2.9-8.2-1-10.1 6.3l-1 4-4.9 0.5c-4.8 0.5-4.9 0.6-5.8 3.9-0.5 1.8-1.1 3.3-1.2 3.3s-1.7-0.6-3.3-1.4-3.2-1.2-3.5-0.9-0.7 3.2-1 6.4-0.7 5.9-1 5.9-2.4-1.9-4.6-4.1c-2.2-2.3-4.4-3.9-4.8-3.7s-0.7 1.7-0.7 3.2-0.5 3.4-1.1 4.3c-1 1.4-1.3 1.3-3.5-1.7-3.9-5.3-4-5.3-3.4 0.5 0.5 5 0.4 5.3-0.7 3.8-0.7-0.9-1.3-1.9-1.3-2.3 0-2-1.5-0.3-2.2 2.5-0.6 2.6-1.2 3.2-3.1 3.4-1.3 0.1-2.8 1-3.5 2-1.1 1.6-1.2 1.6-2 0.2z" fill="#030303" />
<path d="m197.3 280c-1.3-4.3-2.3-4.9-4.4-2.3-0.9 1.2-2.4 2.2-3.3 2.2-1.6 0-2.3-1.2-5.1-8.3l-0.8-2.1-1.3 3.1c-1.6 4-3.3 3.3-4.1-1.6l-0.6-3.8-3.6 4.6-17.8-10.3c-17.1-9.9-17.8-10.4-19.4-14.1-1.7-3.9-6.9-10.1-8.6-10.1s-1.8-0.8-2.7-1.9l-1.8-1.9 8.2-10.8-7.8-1.6 8.2-4.4-4.4-2.3c-4.7-2.5-5.6-4.8-2.9-7.5 1.3-1.3 1.3-1.5-0.2-3-1.4-1.6-1.4-1.7 0-3.3 1.3-1.5 1.3-1.8 0.2-3-2.4-2.4-1.6-4.5 2.9-7.3l4.3-2.7-8-4.2 3.9-0.8 3.9-0.7-8.4-10.8 3.8-4 22.2 22.2v12.8l1.8-0.3c1.1-0.2 8.9-1.4 17.4-2.8 21-3.4 19.2-2.7 19.2-6.7v-3.3h25.9v3.3c0 3.9-1.9 3.3 19.2 6.8 8.5 1.4 16 2.5 17 2.7 0.7 0.2 2 0.3 2 0.3s0.2-2.3 0.2-6.2v-6.6l10-10c7.7-7.7 10.3-9.8 11-9 1.1 1.1 1.2 0.9-4.5 7.9l-3.2 3.9 8.6 1.2-8.8 4.6 4.7 2.7c2.6 1.4 4.7 3.2 4.7 3.8s-0.7 2.1-1.8 3.3l-1.8 2.2 2.2 1c2 0.9 2.9 2.3 1.5 2.4-0.3 0-1.3 0.6-2.2 1.2-1.5 1.1-1.4 1.3 0.3 2.9 2.6 2.6 1.8 4.3-3.3 7l-4.5 2.4 8.8 4.6-3.9 0.6c-2.2 0.3-3.9 0.8-3.9 1s1.7 2.6 3.7 5.3c2.1 2.7 3.8 5.2 3.7 5.6 0 0.4-2.7 2.9-5.9 5.6-4.1 3.5-6.5 6.3-8.2 9.7l-2.4 4.8-35.4 20.4-4-4.6v2.9c0 5.6-1.3 5.6-3.3 0-1-2.8-2-5.1-2.1-5.1s-1.4 3.1-2.9 6.9-3 7.2-3.3 7.6-1.7-0.3-2.9-1.5c-1.3-1.3-2.3-2.1-2.4-2s-0.8 1.3-1.4 2.6l-1.3 2.3-0.8-3.6zm-7.9-22.4 9.7-2.7 11.2 2.7c5.8 1.5 10.7 2 10.9 1.8 0.9-0.9-1.2-2-6.5-3.3-3-0.8-7.4-1.9-9.9-2.7l-4.4-1.7 0.3-8.8 0.2-9.3 12.4-7.8c6.8-4.3 12.6-7.9 12.9-8.2s-11.6-0.5-26.4-0.5-26.8 0.3-26.8 0.7 5.6 4 12.4 8.2l12.3 7.6v18.2l-9.5 3.4c-5.3 1.4-9.7 3-9.9 3.6-0.5 1.3-0.7 1.8 11.2-1.3zm-1.4-74.9v-5.3l-18.6-3.1c-10.3-1.7-19.5-2.9-19.8-3.1v9.5l-8.7-8.7c-4.8-4.8-8.6-9.2-8.5-9.8s0.8-1.8 1.4-2.6 2.7-3.7 4.3-6.3c2.5-3.9 3.6-4.8 6.1-5.3 1.7-0.3 4.5-1.8 6.4-3.4 2.6-2.1 3.9-2.7 5.4-2.4 1.9 0.5 3.2-0.5 8.3-6.9l1.5-1.9 10.8 8.6 1.8-8.2 2 4c1.1 2.2 2.2 4 2.5 4s1.4-1.9 2.5-4.2c2.2-4.6 4-5.3 6.9-2.7 1.6 1.4 1.7 1.3 3.6-1.1 1.1-1.3 2-2.1 2-1.6s0.5 1.6 1.1 2.3c1 1.4 1.3 1.4 4.1-0.3l3-1.8 5.4 10 4.4-8.6 0.6 4c0.3 2.2 0.8 4 0.9 4s2.7-1.8 5.7-4.2l5.3-4.2 3.8 4.5c3.3 3.8 4.3 4.5 6.7 4.4 2.1 0 3.5 0.6 5.4 2.5 1.6 1.6 3.8 2.8 5.8 3.1 2.8 0.5 3.6 1.2 6.7 6.1 1.9 3.1 5 6.7 6.8 7.9s3.3 2.6 3.3 2.9-3.4 3.9-7.5 8.1l-7.5 7.5v-4.7c0-2.7-0.3-4.8-0.7-4.8s-8.9 1.3-19.1 3l-18.8 3.3v4.8l-12.4 0.3c-6.7 0.3-11.8 0-13.3 0z" fill="#feb730" />
<circle cx="188.4" cy="236.7" r="1.7" fill="#71470d" />
<circle cx="181.7" cy="236.7" r="1.7" fill="#71470d" />
<circle cx="175" cy="236.7" r="1.7" fill="#71470d" />
<circle cx="181.7" cy="243.4" r="1.7" fill="#71470d" />
<circle cx="188.4" cy="243.4" r="1.7" fill="#71470d" />
<circle cx="175" cy="243.4" r="1.7" fill="#71470d" />
<circle cx="181.7" cy="250.1" r="1.7" fill="#71470d" />
<circle cx="208.5" cy="236.7" r="1.7" fill="#71470d" />
<circle cx="215.1" cy="236.7" r="1.7" fill="#71470d" />
<circle cx="221.8" cy="236.7" r="1.7" fill="#71470d" />
<circle cx="208.5" cy="243.4" r="1.7" fill="#71470d" />
<circle cx="215.1" cy="243.4" r="1.7" fill="#71470d" />
<circle cx="221.8" cy="243.4" r="1.7" fill="#71470d" />
<circle cx="215.1" cy="250.1" r="1.7" fill="#71470d" />
</g>
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 400 400">
<defs>
<style>
.cls-1 {
fill: #030303;
}
.cls-1, .cls-2, .cls-3, .cls-4 {
stroke-width: 0px;
}
.cls-2 {
fill: #71470d;
}
.cls-3 {
fill: #feb730;
}
.cls-4 {
fill: #2caddc;
}
</style>
</defs>
<path class="cls-4" d="M356.2,275.9V124.1c0-9.6-5.1-18.4-13.3-23.2L213.6,25.2c-8.4-4.9-18.8-4.9-27.2,0L57.1,100.8c-8.3,4.8-13.3,13.7-13.3,23.2v151.8c0,9.6,5.1,18.4,13.3,23.2l129.3,75.6c8.4,4.9,18.8,4.9,27.2,0l129.3-75.6c8.3-4.8,13.3-13.7,13.3-23.2Z"/>
<g>
<path class="cls-1" d="M208.8,327.5c-.4-.8-1.7-4.2-2.8-7.4-1.8-5.3-2-5.6-2.3-3.1-.1,1.5-.6,2.7-1,2.7s-.8,1.6-.8,3.5c0,4-1,3.5-2.5-1.3l-1-3.3-1.3,2.8-1.3,2.8-.5-5c-.6-6.7-2.2-6.6-4.7.3-2.3,6.3-3.4,7.7-4.1,5.2-.4-1.3-1.3-1.8-3-1.8s-2.6-.4-3.4-3.3c-1.2-3.9-2-4.2-3.1-1l-.8,2.3v-2.9c-.2-2.6-.3-2.7-1.2-1.3-1,1.5-2.1,2.9-3.2,4.2l-2.2,2.6-.9-2.4c-.5-1.3-.8-2.8-.9-4.2,0-1.7-.3-3.4-.5-5l-.5-3.2-4.4,4.3-4.4,4.4-.6-3.9c-.6-4.3-1.5-4.7-5.5-2.6-1.4.7-2.7,1.2-2.8,1s-.6-1.6-1-3.2c-.7-2.8-.9-3-5.8-3.7s-5.1-.9-5.5-3.5c-.8-5-3.1-8.7-5.3-8.7s-1.8-.4-1.5-.8c.7-1.1-.9-1.1-3.1,0-1.7.9-1.7.8-1.2-3,.4-3,.3-4-.7-4.4-.7-.3-3.4-3.2-6-6.5l-5.3-6.6c-.3-.3-2.5,0-4.9.7-2.4.7-4.5,1.2-4.7,1s.6-3.1,1.7-6.5c2-6.4,2-7.6,0-7.6s-1.2-1.2-1.2-5,0-5-2.9-5.9l-2.9-.9,1.2-3c1.7-4.1,1-5.3-3-5.3s-3.4-.3-3.4-.7,1.3-2.4,2.9-4.6,2.9-4,2.9-4.2-1.2-.7-2.7-1c-1.5-.3-2.9-.8-4.3-1.4-1.4-.8-1.3-1.1,1.6-4.1l3.2-3.3-2.7.5c-2.7.5-3.9-.7-1.4-1.6,1.9-.7,1.5-1.8-1.3-2.8-2-.8-2.5-1.4-2.5-3.5s-.6-2.9-1.3-3.3c-1.1-.6-1.1-.9.6-2,1.2-.8,2.5-1.4,3.8-1.9,1.2-.3,2-1.4,1.9-2.6,0-1.7-.5-2-3.1-2.3l-3.1-.3,2.3-1.2c2.7-1.4,2.9-2.3.6-3-2.2-.7-2.2-2.1,0-2.1s2.1-3.8-1.3-5.9c-2.5-1.6-2.8-2-1.7-2.6.7-.4,1.3-1.7,1.3-2.8,0-1.3.4-2.5,1-3.6.8-1.3.6-2.1-.8-4.6-2.5-4.2-2.6-11.8-.2-12.6,2.6-.8,2.5-3.9-.3-6.9l-2.5-2.7,2.6-.9c2.6-.9,4.1-3.3,3.1-5-.3-.5-.1-1.9.4-3.1.6-1.5,1-3.1,1.2-4.8.1-1.3.4-2.5.8-3.8,2.5-6.8,3.2-10.3,2.4-12.4s-.6-2.5,2.9-4.7c2.2-1.4,3.7-2.9,3.7-3.9s1-2.8,2.3-4.3,3.4-4.2,4.6-5.9c1.9-2.5,2.9-3.1,5.1-3.1s5.5-2,5.5-3.9,1.8-1,4-1.3,5.1-1.1,6.4-1.9,4-1.6,6-1.7,4.2-.6,4.9-1.2,1.7-.9,2.3-.8c3.8.5,6.5-.2,7-1.8s.7-1.6,2-.4c2.2,2,6.2,1.6,8.5-.8l2-2.1,1.1,2.1c1.4,2.6,4.4,2.8,7.7.4,2-1.5,2.8-1.6,5.6-.9,1.8.5,4.3,1.1,5.6,1.3,1.3.3,2.3,1.1,2.3,1.8,0,1.1,3.1,2.9,4.9,2.9.3,0,1.3-1.1,2.2-2.5l1.7-2.5,2.6,3.1,2.6,3.1,4.3-2.7,4.3-2.7,1.9,1.7c1.8,1.7,2.1,1.7,11.9.6,5.5-.7,11.9-1.2,14.2-1.2,2.9-.1,5.9-.5,8.7-1.3,4.7-1.3,5.9-1.1,5.9.8s2.4,2.1,6.3,0l3.8-2.1-.2,2.8c-.2,2.7-.1,2.8,3.1,3.1,1.8.1,4.4,1,5.7,2,1.5,1.1,4.4,1.9,7.7,2.3,5.3.5,8.7,2.4,8.7,4.8s1.6,2.3,3.6,3.7,4.1,3.6,4.7,4.8,3,4.2,5.3,6.5c3.9,4,4.1,4.3,2.4,4.9-2.9.9-2,2.9,2.2,4.6,3.7,1.5,4,2.3,1.8,4.7-1.8,1.9-1.8,2.1-.4,3.1,1.2.9,1.3,1.5.6,2.7-1.3,2.4-.2,6.2,2.2,8.3,2,1.7,2.1,1.9.7,3.8-1.8,2.6-1.8,3.7.5,6.7l1.9,2.5-1.8,1.4c-2.6,2-1.8,7.5,1.5,10.7,3,2.9,3,3.7,0,3.7s-2.5.4-2.8,2.5c-.2,1.4,0,3,.3,3.6s.7,2.1.7,3.3.7,2.6,1.5,3.1c1.3.7,1.1,1-1.3,2.3-1.5.8-2.7,2-2.7,2.5,0,.8-.2,1.5-.5,2.2-.3.9.2,1.3,1.9,1.6l2.4.3-2.3,1.1c-1.3.6-2.3,1.4-2.3,1.7s1,1.1,2.3,1.7l2.3,1.2-2.7.3c-3.7.4-3.9,3.7-.2,5.2,3.4,1.4,4.8,3.2,3,3.9-.8.3-1.3,1.5-1.3,3s-.5,2.7-2.3,3.4c-1.3.5-2.4,1.1-2.6,1.2s.6,1,1.7,2l2,1.7-3.3-.4-3.3-.5,3.2,2.9c3.6,3.3,3.4,4-2,5.6l-3.6,1,3,3.9c1.6,2.2,3,4.3,3,4.8s-1.5.9-3.3.9c-4.1,0-4.6.8-3,4.7.7,1.7,1.3,3.2,1.3,3.3s-1.3.7-2.9,1.2c-2.9,1-2.9,1-2.9,5.9s-.3,5-1.1,5-1.8.5-2.6,1.1c-1.4,1-1.4,1.4.4,7.5,1,3.5,1.6,6.7,1.4,7s-2.9,0-5.8-.8l-5.3-1.3-4.8,4.8-4.8,4.8,1.1,5.2c.6,2.9.9,5.2.6,5.2s-1.5-.6-2.6-1.2c-5.2-2.9-8.2-1-10.1,6.3l-1,4-4.9.5c-4.8.5-4.9.6-5.8,3.9-.5,1.8-1.1,3.3-1.2,3.3s-1.7-.6-3.3-1.4-3.2-1.2-3.5-.9-.7,3.2-1,6.4-.7,5.9-1,5.9-2.4-1.9-4.6-4.1c-2.2-2.3-4.4-3.9-4.8-3.7s-.7,1.7-.7,3.2-.5,3.4-1.1,4.3c-1,1.4-1.3,1.3-3.5-1.7-3.9-5.3-4-5.3-3.4.5.5,5,.4,5.3-.7,3.8-.7-.9-1.3-1.9-1.3-2.3,0-2-1.5-.3-2.2,2.5-.6,2.6-1.2,3.2-3.1,3.4-1.3.1-2.8,1-3.5,2-1.1,1.6-1.2,1.6-2,.2h0Z"/>
<path class="cls-3" d="M197.3,280c-1.3-4.3-2.3-4.9-4.4-2.3-.9,1.2-2.4,2.2-3.3,2.2-1.6,0-2.3-1.2-5.1-8.3l-.8-2.1-1.3,3.1c-1.6,4-3.3,3.3-4.1-1.6l-.6-3.8-1.8,2.3-1.8,2.3-17.8-10.3c-17.1-9.9-17.8-10.4-19.4-14.1-1.7-3.9-6.9-10.1-8.6-10.1s-1.8-.8-2.7-1.9l-1.8-1.9,4.1-5.4,4.1-5.4-3.9-.8-3.9-.8,4.1-2.2,4.1-2.2-4.4-2.3c-4.7-2.5-5.6-4.8-2.9-7.5,1.3-1.3,1.3-1.5-.2-3-1.4-1.6-1.4-1.7,0-3.3,1.3-1.5,1.3-1.8.2-3-2.4-2.4-1.6-4.5,2.9-7.3l4.3-2.7-4-2.1-4-2.1,3.9-.8,3.9-.7-4.2-5.4-4.2-5.4,1.9-2,1.9-2,11.1,11.1,11.1,11.1v12.8l1.8-.3c1.1-.2,8.9-1.4,17.4-2.8,21-3.4,19.2-2.7,19.2-6.7v-3.3h25.9v3.3c0,3.9-1.9,3.3,19.2,6.8,8.5,1.4,16,2.5,17,2.7.7.2,2,.3,2,.3,0,0,.2-2.3.2-6.2v-6.6l10-10c7.7-7.7,10.3-9.8,11-9,1.1,1.1,1.2.9-4.5,7.9l-3.2,3.9,4.3.6,4.3.6-4.4,2.3-4.4,2.3,4.7,2.7c2.6,1.4,4.7,3.2,4.7,3.8s-.7,2.1-1.8,3.3l-1.8,2.2,2.2,1c2,.9,2.9,2.3,1.5,2.4-.3,0-1.3.6-2.2,1.2-1.5,1.1-1.4,1.3.3,2.9,2.6,2.6,1.8,4.3-3.3,7l-4.5,2.4,4.4,2.3,4.4,2.3-3.9.6c-2.2.3-3.9.8-3.9,1s1.7,2.6,3.7,5.3c2.1,2.7,3.8,5.2,3.7,5.6,0,.4-2.7,2.9-5.9,5.6-4.1,3.5-6.5,6.3-8.2,9.7l-2.4,4.8-17.7,10.2-17.7,10.2-2-2.3-2-2.3v2.9c0,5.6-1.3,5.6-3.3,0-1-2.8-2-5.1-2.1-5.1s-1.4,3.1-2.9,6.9c-1.5,3.8-3,7.2-3.3,7.6s-1.7-.3-2.9-1.5c-1.3-1.3-2.3-2.1-2.4-2s-.8,1.3-1.4,2.6l-1.3,2.3-.8-3.6ZM189.4,257.6l9.7-2.7,11.2,2.7c5.8,1.5,10.7,2,10.9,1.8.9-.9-1.2-2-6.5-3.3-3-.8-7.4-1.9-9.9-2.7l-4.4-1.7.3-8.8.2-9.3,12.4-7.8c6.8-4.3,12.6-7.9,12.9-8.2s-11.6-.5-26.4-.5-26.8.3-26.8.7,5.6,4,12.4,8.2l12.3,7.6v18.2l-9.5,3.4c-5.3,1.4-9.7,3-9.9,3.6-.5,1.3-.7,1.8,11.2-1.3h0ZM188,182.7v-5.3l-18.6-3.1c-10.3-1.7-19.5-2.9-19.8-3.1v9.5l-8.7-8.7c-4.8-4.8-8.6-9.2-8.5-9.8s.8-1.8,1.4-2.6,2.7-3.7,4.3-6.3c2.5-3.9,3.6-4.8,6.1-5.3,1.7-.3,4.5-1.8,6.4-3.4,2.6-2.1,3.9-2.7,5.4-2.4,1.9.5,3.2-.5,8.3-6.9l1.5-1.9,5.4,4.3,5.4,4.3.9-4.1.9-4.1,2,4c1.1,2.2,2.2,4,2.5,4s1.4-1.9,2.5-4.2c2.2-4.6,4-5.3,6.9-2.7,1.6,1.4,1.7,1.3,3.6-1.1,1.1-1.3,2-2.1,2-1.6s.5,1.6,1.1,2.3c1,1.4,1.3,1.4,4.1-.3l3-1.8,2.7,5,2.7,5,2.2-4.3,2.2-4.3.6,4c.3,2.2.8,4,.9,4s2.7-1.8,5.7-4.2l5.3-4.2,3.8,4.5c3.3,3.8,4.3,4.5,6.7,4.4,2.1,0,3.5.6,5.4,2.5,1.6,1.6,3.8,2.8,5.8,3.1,2.8.5,3.6,1.2,6.7,6.1,1.9,3.1,5,6.7,6.8,7.9s3.3,2.6,3.3,2.9-3.4,3.9-7.5,8.1l-7.5,7.5v-4.7c0-2.7-.3-4.8-.7-4.8s-8.9,1.3-19.1,3l-18.8,3.3v4.8l-12.4.3c-6.7.3-11.8,0-13.3,0h0Z"/>
<g>
<circle class="cls-2" cx="188.4" cy="236.7" r="1.7"/>
<circle class="cls-2" cx="181.7" cy="236.7" r="1.7"/>
<circle class="cls-2" cx="175" cy="236.7" r="1.7"/>
<circle class="cls-2" cx="181.7" cy="243.4" r="1.7"/>
<circle class="cls-2" cx="188.4" cy="243.4" r="1.7"/>
<circle class="cls-2" cx="175" cy="243.4" r="1.7"/>
<circle class="cls-2" cx="181.7" cy="250.1" r="1.7"/>
<circle class="cls-2" cx="208.5" cy="236.7" r="1.7"/>
<circle class="cls-2" cx="215.1" cy="236.7" r="1.7"/>
<circle class="cls-2" cx="221.8" cy="236.7" r="1.7"/>
<circle class="cls-2" cx="208.5" cy="243.4" r="1.7"/>
<circle class="cls-2" cx="215.1" cy="243.4" r="1.7"/>
<circle class="cls-2" cx="221.8" cy="243.4" r="1.7"/>
<circle class="cls-2" cx="215.1" cy="250.1" r="1.7"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

View File

@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><defs><radialGradient id="a" cx="0" cy="0" r="1" gradientTransform="rotate(-49.415 25.434 5.598) scale(18.562)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#6420FF"/><stop offset="1" stop-color="#6420FF" stop-opacity="0"/></radialGradient><radialGradient id="b" cx="0" cy="0" r="1" gradientTransform="rotate(54.702 .54 7.506) scale(20.932)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#00C4CC"/><stop offset="1" stop-color="#00C4CC" stop-opacity="0"/></radialGradient><radialGradient id="c" cx="0" cy="0" r="1" gradientTransform="matrix(12.922 -13.011 5.9837 5.943 4.636 21.272)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#6420FF"/><stop offset="1" stop-color="#6420FF" stop-opacity="0"/></radialGradient><radialGradient id="d" cx="0" cy="0" r="1" gradientTransform="matrix(7.5284 17.331 -29.032 12.612 9.815 3.234)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#00C4CC" stop-opacity=".726"/><stop offset="0" stop-color="#00C4CC"/><stop offset="1" stop-color="#00C4CC" stop-opacity="0"/></radialGradient></defs><g stroke-width=".013"><path fill="#7d2ae7" d="M24 12a12 12 0 0 1-12 12A12 12 0 0 1 0 12 12 12 0 0 1 12 0a12 12 0 0 1 12 12z"/><path fill="url(#a)" d="M24 12a12 12 0 0 1-12 12A12 12 0 0 1 0 12 12 12 0 0 1 12 0a12 12 0 0 1 12 12z"/><path fill="url(#b)" d="M24 12a12 12 0 0 1-12 12A12 12 0 0 1 0 12 12 12 0 0 1 12 0a12 12 0 0 1 12 12z"/><path fill="url(#c)" d="M24 12a12 12 0 0 1-12 12A12 12 0 0 1 0 12 12 12 0 0 1 12 0a12 12 0 0 1 12 12z"/><path fill="url(#d)" d="M24 12a12 12 0 0 1-12 12A12 12 0 0 1 0 12 12 12 0 0 1 12 0a12 12 0 0 1 12 12z"/><path fill="#fff" d="M17.598 14.462c-.099 0-.186.084-.277.266-1.024 2.077-2.793 3.546-4.84 3.546-2.367 0-3.833-2.136-3.833-5.088 0-5 2.786-7.89 5.233-7.89 1.144 0 1.842.718 1.842 1.861 0 1.357-.771 2.076-.771 2.554 0 .215.133.345.398.345 1.065 0 2.315-1.223 2.315-2.951 0-1.676-1.459-2.908-3.906-2.908-4.043 0-7.637 3.75-7.637 8.937 0 4.015 2.292 6.668 5.83 6.668 3.755 0 5.927-3.736 5.927-4.948 0-.269-.138-.392-.28-.392z"/></g></svg>
<svg viewBox="0 0 508 508" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2"><g transform="matrix(.26718 0 0 .26718 0 0)"><circle cx="950" cy="950" r="950" fill="#7d2ae7"/><circle cx="950" cy="950" r="950" fill="url(#prefix___Radial1)"/><circle cx="950" cy="950" r="950" fill="url(#prefix___Radial2)"/><circle cx="950" cy="950" r="950" fill="url(#prefix___Radial3)"/><circle cx="950" cy="950" r="950" fill="url(#prefix___Radial4)"/></g><path d="M446.744 276.845c-.665 0-1.271.43-1.584 1.33-4.011 11.446-9.43 18.254-13.891 18.254-2.563 0-3.6-2.856-3.6-7.336 0-11.21 6.71-34.982 10.095-45.82.392-1.312.646-2.485.646-3.483 0-3.15-1.722-4.696-5.987-4.696-4.598 0-9.547 1.8-14.36 10.233-1.663-7.435-6.691-10.683-13.715-10.683-8.12 0-15.965 5.224-22.421 13.696-6.456 8.471-14.048 11.25-19.76 9.88 4.108-10.057 5.634-17.57 5.634-23.145 0-8.746-4.324-14.028-11.308-14.028-10.624 0-16.747 10.134-16.747 20.797 0 8.237 3.736 16.708 11.954 20.817-6.887 15.573-16.943 29.66-20.758 29.66-4.93 0-6.379-24.123-6.105-41.38.176-9.9.998-10.408.998-13.401 0-1.722-1.115-2.896-5.595-2.896-10.448 0-13.676 8.844-14.165 18.998a50.052 50.052 0 01-1.8 11.406c-4.363 15.573-13.363 27.39-19.232 27.39-2.72 0-3.463-2.72-3.463-6.28 0-11.21 6.28-25.219 6.28-37.173 0-8.784-3.854-14.34-11.112-14.34-8.55 0-19.858 10.173-30.56 29.229 3.521-14.595 4.97-28.721-5.459-28.721a14.115 14.115 0 00-6.476 1.683 3.689 3.689 0 00-2.113 3.56c.998 15.535-12.521 55.329-25.336 55.329-2.328 0-3.463-2.524-3.463-6.593 0-11.23 6.691-34.943 10.056-45.801.43-1.409.666-2.622.666-3.678 0-2.974-1.84-4.5-6.007-4.5-4.578 0-9.547 1.741-14.34 10.174-1.683-7.435-6.711-10.683-13.735-10.683-11.523 0-24.397 12.19-30.051 28.076-7.572 21.208-22.832 41.692-43.375 41.692-18.645 0-28.486-15.515-28.486-40.03 0-35.392 25.982-64.308 45.253-64.308 9.215 0 13.617 5.869 13.617 14.869 0 10.897-6.085 15.964-6.085 20.112 0 1.272 1.057 2.524 3.15 2.524 8.374 0 18.234-9.841 18.234-23.262 0-13.422-10.897-23.243-30.168-23.243-31.851 0-63.898 32.047-63.898 73.113 0 32.673 16.121 52.374 44 52.374 19.017 0 35.628-14.79 44.588-32.047 1.018 14.302 7.513 21.776 17.413 21.776 8.804 0 15.925-5.243 21.364-14.458 2.094 9.645 7.65 14.36 14.87 14.36 8.275 0 15.201-5.243 21.794-14.986-.097 7.65 1.644 14.85 8.276 14.85 3.13 0 6.867-.725 7.533-3.464 6.984-28.877 24.24-52.453 29.523-52.453 1.565 0 1.995 1.507 1.995 3.287 0 7.846-5.537 23.928-5.537 34.2 0 11.092 4.716 18.43 14.459 18.43 10.8 0 21.775-13.227 29.092-32.556 2.29 18.058 7.24 32.633 14.987 32.633 9.508 0 26.392-20.014 36.625-41.203 4.01.509 10.036.372 15.827-3.717-2.465 6.241-3.912 13.07-3.912 19.897 0 19.663 9.39 25.18 17.47 25.18 8.785 0 15.907-5.243 21.365-14.458 1.8 8.315 6.398 14.34 14.85 14.34 13.225 0 24.71-13.519 24.71-24.612 0-2.934-1.252-4.715-2.72-4.715zm-274.51 18.547c-5.342 0-7.435-5.38-7.435-13.401 0-13.93 9.528-37.193 19.604-37.193 4.402 0 6.065 5.185 6.065 11.524 0 14.145-9.059 39.07-18.235 39.07zm182.948-41.574c-3.189-3.796-4.343-8.961-4.343-13.559 0-5.673 2.074-10.467 4.558-10.467 2.485 0 3.248 2.446 3.248 5.85 0 5.693-2.035 14.008-3.463 18.176zm41.418 41.574c-5.34 0-7.434-6.182-7.434-13.401 0-13.441 9.528-37.193 19.682-37.193 4.402 0 5.967 5.146 5.967 11.524 0 14.145-8.902 39.07-18.215 39.07z" fill="#fff" fill-rule="nonzero"/><defs><radialGradient id="prefix___Radial1" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="scale(1469.491) rotate(-49.416 1.37 .302)"><stop offset="0" stop-color="#6420ff"/><stop offset="1" stop-color="#6420ff" stop-opacity="0"/></radialGradient><radialGradient id="prefix___Radial2" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="rotate(54.703 42.717 594.194) scale(1657.122)"><stop offset="0" stop-color="#00c4cc"/><stop offset="1" stop-color="#00c4cc" stop-opacity="0"/></radialGradient><radialGradient id="prefix___Radial3" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1023 -1030 473.711 470.491 367 1684)"><stop offset="0" stop-color="#6420ff"/><stop offset="1" stop-color="#6420ff" stop-opacity="0"/></radialGradient><radialGradient id="prefix___Radial4" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(595.999 1372 -2298.41 998.431 777 256)"><stop offset="0" stop-color="#00c4cc" stop-opacity=".73"/><stop offset="0" stop-color="#00c4cc"/><stop offset="1" stop-color="#00c4cc" stop-opacity="0"/></radialGradient></defs></svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><g stroke-width=".047"><path fill="#aa968c" d="M23.625 11.625c0 6.006-5.205 11.25-11.625 11.25S.375 17.631.375 11.625 5.58 1.125 12 1.125s11.625 4.494 11.625 10.5z"/><path fill="#aa968c" d="M12 1.125C5.58 1.125.375 5.619.375 11.625c0 1.155.194 2.28.55 3.347a6.546 6.546 0 0 0 5.263 2.653A6.558 6.558 0 0 0 12 14.103a6.558 6.558 0 0 0 5.813 3.522 6.546 6.546 0 0 0 5.262-2.653c.356-1.067.55-2.192.55-3.347 0-6.006-5.205-10.5-11.625-10.5z"/><path fill="#c8af9b" d="M18.375 16.5A6.375 6.375 0 0 1 12 22.875 6.375 6.375 0 0 1 5.625 16.5 6.375 6.375 0 0 1 12 10.125a6.375 6.375 0 0 1 6.375 6.375z"/></g><g fill="#464655" stroke-width=".047"><path d="M7.5 9.563a1.313 1.313 0 0 1-1.313 1.312 1.313 1.313 0 0 1-1.312-1.313A1.313 1.313 0 0 1 6.188 8.25 1.313 1.313 0 0 1 7.5 9.563zM19.125 9.563a1.313 1.313 0 0 1-1.313 1.312A1.313 1.313 0 0 1 16.5 9.562a1.313 1.313 0 0 1 1.313-1.312 1.313 1.313 0 0 1 1.312 1.313zM12.654 13.337c-.36.503-.948.503-1.308 0l-.567-.794c-.36-.504-.148-.916.471-.916h1.5c.619 0 .83.412.471.916z"/></g><path fill="#aa968c" d="M16.451 18.75c-1.61 0-2.435-2.25-4.457-2.25s-2.848 2.25-4.457 2.25c-.722 0-1.363-.274-1.883-1.181.514 3.01 3.153 5.306 6.34 5.306s5.826-2.295 6.34-5.306c-.52.907-1.16 1.181-1.883 1.181z"/><g fill="#8c7873" stroke-width=".047"><path d="M1.5 19.875a.375.375 0 0 1-.14-.723l7.501-3a.375.375 0 1 1 .278.697l-7.5 3a.375.375 0 0 1-.139.026zM.75 17.625a.375.375 0 0 1-.096-.738l7.125-1.875a.375.375 0 1 1 .192.726L.846 17.613a.377.377 0 0 1-.096.012zM.375 15.75a.375.375 0 0 1-.065-.744l6.375-1.125a.375.375 0 0 1 .13.738L.44 15.744a.385.385 0 0 1-.065.006zM22.5 19.875a.375.375 0 0 0 .14-.723l-7.501-3a.375.375 0 0 0-.278.697l7.5 3a.375.375 0 0 0 .139.026zM23.25 17.625a.375.375 0 0 0 .095-.738l-7.125-1.875a.375.375 0 1 0-.19.726l7.124 1.875a.378.378 0 0 0 .096.012zM23.625 15.75a.375.375 0 0 0 .065-.744l-6.375-1.125a.375.375 0 0 0-.13.738l6.374 1.125a.386.386 0 0 0 .066.006z"/></g></svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -1,3 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" width="198.4" height="198.4" xml:space="preserve">
<path transform="translate(0, 60)" d="M 0,0 0,13.88 10.97,13.88 10.97,10.31 60.69,10.31 60.69,0 0,0 z M 65.84,0 99.22,58.09 132.6,0 120.7,0 C 120.7,0 100.5,34.91 99.22,37.16 97.92,34.91 77.75,0 77.75,0 L 65.84,0 z M 137.8,0 137.8,13.88 148.7,13.88 148.7,10.31 198.4,10.31 198.4,0 137.8,0 z M 0,19.12 0,29.47 60.69,29.47 60.69,19.12 0,19.12 z M 137.8,19.12 137.8,29.47 198.4,29.47 198.4,19.12 137.8,19.12 z M 0,34.66 0,48.59 60.69,48.59 60.69,38.25 10.97,38.25 10.97,34.66 0,34.66 z M 137.8,34.66 137.8,48.59 198.4,48.59 198.4,38.25 148.7,38.25 148.7,34.66 137.8,34.66 z M 42.19,69.72 C 41.32,69.72 40.71,69.89 40.41,70.19 40.1,70.49 39.97,71.03 39.97,71.84 L 39.97,76.56 C 39.97,77.38 40.1,77.93 40.41,78.22 40.71,78.52 41.32,78.66 42.19,78.66 L 48.72,78.66 C 49.59,78.66 50.19,78.52 50.5,78.22 50.8,77.93 50.97,77.38 50.97,76.56 L 50.97,71.84 C 50.97,71.03 50.8,70.49 50.5,70.19 50.19,69.89 49.59,69.72 48.72,69.72 L 42.19,69.72 z M 64.37,69.72 64.37,78.66 66.25,78.66 66.25,73.84 C 66.25,73.66 66.23,73.43 66.22,73.19 66.2,72.94 66.18,72.69 66.16,72.41 66.26,72.53 66.38,72.67 66.5,72.78 66.62,72.89 66.75,73.01 66.91,73.16 L 73.47,78.66 74.88,78.66 74.88,69.72 73.03,69.72 73.03,74.41 C 73.03,74.52 73.05,74.7 73.06,74.91 73.07,75.11 73.09,75.47 73.12,75.97 72.99,75.81 72.82,75.66 72.66,75.5 72.49,75.35 72.31,75.18 72.09,75 L 65.81,69.72 64.37,69.72 z M 88.53,69.72 88.53,78.66 97.31,78.66 97.31,77 90.59,77 90.59,69.72 88.53,69.72 z M 109.4,69.72 109.4,78.66 111.5,78.66 111.5,69.72 109.4,69.72 z M 125.1,69.72 125.1,78.66 127,78.66 127,73.84 C 127,73.66 127,73.43 126.9,73.19 126.9,72.94 126.9,72.69 126.9,72.41 127,72.53 127.1,72.67 127.2,72.78 127.3,72.89 127.5,73.01 127.6,73.16 L 134.2,78.66 135.6,78.66 135.6,69.72 133.8,69.72 133.8,74.41 C 133.8,74.52 133.8,74.7 133.8,74.91 133.8,75.11 133.8,75.47 133.8,75.97 133.7,75.81 133.6,75.66 133.4,75.5 133.2,75.35 133,75.18 132.8,75 L 126.5,69.72 125.1,69.72 z M 149.3,69.72 149.3,78.66 158.5,78.66 158.5,77 151.3,77 151.3,74.78 155.4,74.78 155.4,73.25 151.3,73.25 151.3,71.25 158.4,71.25 158.4,69.72 149.3,69.72 z M 42.03,71.31 48.87,71.31 48.87,77 42.03,77 42.03,71.31 z" /></svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -1,8 +1,44 @@
<?xml version='1.0' encoding='utf-8'?>
<svg xmlns="http://www.w3.org/2000/svg" width="474.2" height="474.2" version="1.1" viewBox="0 0 474.2 474.2" xml:space="preserve">
<g transform="translate(-20.412 -2.725)">
<circle transform="matrix(.7071 -.7071 .7071 .7071 -94.131 252.34)" cx="257.5" cy="239.8" r="237.1" fill="#4D6BDD" />
<path d="m350.6 211.4c-8.9-9.6-12.2-30.5-12.2-30.5l-2.6-12s-3.1-11.3-5.4-14.6c-1-2.6-2.8-9.7 3.5-16.9 0 0 6.3-8.1-2.8-14.6 0 0-10-8.3-17.2 1.2 0 0-6.7 12.3-16.4 10.4-2.6-0.7-4.3-1-4.3-1s-21.7-4.2-35.7-4.3c-14 0-35.7 4.3-35.7 4.3s-1.6 0.3-4.3 1c-9.6 1.8-16.4-10.4-16.4-10.4-7.2-9.6-17.2-1.2-17.2-1.2-9.2 6.6-2.8 14.6-2.8 14.6 6.3 7.2 4.5 14.4 3.5 16.9-2.3 3.4-5.4 14.6-5.4 14.6l-2.6 12s-3.3 20.8-12.2 30.5c0 0-60.2 54.1-19.4 109.4 0 0 26.8 31.8 71 7.2 0 0 20.6-11.4 41.5-11.5 20.8 0 41.5 11.5 41.5 11.5 44.2 24.6 70.9-7.2 70.9-7.2 40.9-55.3-19.3-109.4-19.3-109.4zm-132.8 45.8c-4.2 5.6-14.6 5-23.2-1.4s-12.2-16.2-8-21.8 14.6-5 23.2 1.4 12.2 16.2 8 21.8zm7-60.5c-7.6 0-13.8-7.1-13.8-12.4h11.4c1.3 0 1.7-2.2 0.9-3.3l-7.2-9.6c2.4-1.9 5.4-3.4 8.7-3.4 7.6 0 13.8 6.7 13.8 14.3 0.1 7.7-6.1 14.4-13.8 14.4zm51.6-12.4h11.4c1.3 0 1.7-2.2 0.9-3.3l-7.2-9.6c2.4-1.9 5.4-3.4 8.7-3.4 7.6 0 13.8 6 13.8 13.6s-6.2 15.2-13.8 15.2-13.8-7.2-13.8-12.5zm44.1 70.1c-8.6 6.4-19 7-23.2 1.4-4.2-5.7-0.6-15.4 8-21.8s19-7 23.2-1.4 0.7 15.4-8 21.8z" fill="#FFF" />
<path d="m257.6 331.6c-27.6 0-39.9 15.3-39.9 15.3s-12.4 13.4 39.9 13.4 39.9-13.4 39.9-13.4-12.3-15.3-39.9-15.3z" fill="#FFF" />
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: $$$/GeneralStr/196=Adobe Illustrator 27.6.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 518.4 476.9" style="enable-background:new 0 0 518.4 476.9;" xml:space="preserve">
<style type="text/css">
.st0{fill:#4D6BDD;}
.st1{fill:#FFFFFF;}
.st2{fill:#FFD749;}
.st3{fill:#FF6B4A;}
.st4{fill:#89A3F4;}
.st5{fill:#FCE088;}
.st6{fill:#FC9381;}
.st7{fill:#C2D3FF;}
.st8{fill:#FCECC0;}
.st9{fill:#F9BEB7;}
</style>
<g>
<g>
<ellipse transform="matrix(0.7071 -0.7071 0.7071 0.7071 -94.1312 252.3384)" class="st0" cx="257.5" cy="239.8" rx="237.1" ry="237.1"/>
<g>
<g>
<g>
<path class="st1" d="M350.6,211.4c-8.9-9.6-12.2-30.5-12.2-30.5l-2.6-12c0,0-3.1-11.3-5.4-14.6c-1-2.6-2.8-9.7,3.5-16.9
c0,0,6.3-8.1-2.8-14.6c0,0-10-8.3-17.2,1.2c0,0-6.7,12.3-16.4,10.4c-2.6-0.7-4.3-1-4.3-1s-21.7-4.2-35.7-4.3
c-14,0-35.7,4.3-35.7,4.3s-1.6,0.3-4.3,1c-9.6,1.8-16.4-10.4-16.4-10.4c-7.2-9.6-17.2-1.2-17.2-1.2c-9.2,6.6-2.8,14.6-2.8,14.6
c6.3,7.2,4.5,14.4,3.5,16.9c-2.3,3.4-5.4,14.6-5.4,14.6l-2.6,12c0,0-3.3,20.8-12.2,30.5c0,0-60.2,54.1-19.4,109.4
c0,0,26.8,31.8,71,7.2c0,0,20.6-11.4,41.5-11.5c20.8,0,41.5,11.5,41.5,11.5c44.2,24.6,70.9-7.2,70.9-7.2
C410.8,265.5,350.6,211.4,350.6,211.4z M217.8,257.2c-4.2,5.6-14.6,5-23.2-1.4c-8.6-6.4-12.2-16.2-8-21.8
c4.2-5.6,14.6-5,23.2,1.4C218.4,241.8,222,251.6,217.8,257.2z M224.8,196.7c-7.6,0-13.8-7.1-13.8-12.4h11.4
c1.3,0,1.7-2.2,0.9-3.3l-7.2-9.6c2.4-1.9,5.4-3.4,8.7-3.4c7.6,0,13.8,6.7,13.8,14.3C238.7,190,232.5,196.7,224.8,196.7z
M276.4,184.3h11.4c1.3,0,1.7-2.2,0.9-3.3l-7.2-9.6c2.4-1.9,5.4-3.4,8.7-3.4c7.6,0,13.8,6,13.8,13.6c0,7.6-6.2,15.2-13.8,15.2
C282.6,196.8,276.4,189.6,276.4,184.3z M320.5,254.4c-8.6,6.4-19,7-23.2,1.4c-4.2-5.7-0.6-15.4,8-21.8c8.6-6.4,19-7,23.2-1.4
C332.7,238.2,329.2,248,320.5,254.4z"/>
</g>
<g>
<path class="st1" d="M257.6,331.6c-27.6,0-39.9,15.3-39.9,15.3s-12.4,13.4,39.9,13.4c52.3,0,39.9-13.4,39.9-13.4
S285.2,331.6,257.6,331.6z"/>
</g>
</g>
</g>
</g>
</svg>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -1,19 +0,0 @@
<svg width="100%" height="100%" viewBox="0 0 113 113" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g transform="matrix(1,0,0,1,-1298.97,-1016.72)">
<g transform="matrix(0.5,0,0,0.5,736.463,641.721)">
<g transform="matrix(0.834925,0,0,0.834925,161.667,288.323)">
<circle cx="1198.72" cy="777.527" r="44.914" style="fill:#000811;"/>
</g>
</g>
<g transform="matrix(0.5,0,0,0.5,736.463,641.721)">
<g transform="matrix(0.834925,0,0,0.834925,311.66,138.323)">
<circle cx="1198.72" cy="777.527" r="44.914" style="fill:#000811;"/>
</g>
</g>
<g transform="matrix(0.5,0,0,0.5,736.463,641.721)">
<g transform="matrix(1,0,0,1,281.792,137.715)">
<path d="M955.708,762.285C935.011,762.285 918.208,745.482 918.208,724.785C918.208,704.088 935.011,687.285 955.708,687.285C976.405,687.285 993.208,704.088 993.208,724.785C993.208,745.482 1010.01,762.285 1030.71,762.285C1051.4,762.285 1068.21,779.088 1068.21,799.785C1068.21,820.482 1051.4,837.285 1030.71,837.285C1010.01,837.285 993.208,820.482 993.208,799.785C993.208,779.088 976.405,762.285 955.708,762.285Z" style="fill:#000811;"/>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 15 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 19 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 33 KiB

View File

@@ -1,15 +1,30 @@
<?xml version='1.0' encoding='utf-8'?>
<svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" data-name="Layer 1" viewBox="0 0 943.11 911.62"><script />
<ellipse cx="471.56" cy="454.28" rx="471.56" ry="454.28" fill="#46509e" />
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 943.11 911.62"><script xmlns=""/>
<defs>
<style>
.cls-1 {
fill: #fff;
}
.cls-2 {
fill: #37474f;
}
.cls-3 {
fill: #46509e;
}
</style>
</defs>
<ellipse class="cls-3" cx="471.56" cy="454.28" rx="471.56" ry="454.28"/>
<g>
<g>
<ellipse cx="471.56" cy="390.28" rx="233.66" ry="207" fill="#37474f" />
<path d="m705.22,848.95c-36.69,21.14-123.09,64.33-240.64,62.57-109.54-1.63-190.04-41.45-226.68-62.57v-454.19h467.33v454.19Z" fill="#37474f" />
<ellipse class="cls-2" cx="471.56" cy="390.28" rx="233.66" ry="207"/>
<path class="cls-2" d="m705.22,848.95c-36.69,21.14-123.09,64.33-240.64,62.57-109.54-1.63-190.04-41.45-226.68-62.57v-454.19h467.33v454.19Z"/>
</g>
<path d="m658.81,397.7v475.8c-36.98,15.7-98.93,36.54-177.98,38.04-88.67,1.69-157.75-21.73-196.2-38.04v-475.8c0-95.55,83.77-173.02,187.09-173.02s187.09,77.47,187.09,173.02Z" fill="#fff" />
<polygon points="565.02 431.68 471.56 514.49 378.09 431.68 565.02 431.68" fill="#46509e" />
<ellipse cx="378.09" cy="369.58" rx="23.37" ry="20.7" fill="#37474f" />
<ellipse cx="565.02" cy="369.58" rx="23.37" ry="20.7" fill="#37474f" />
<path d="m658.49,400.63c0-40.04-36.59-72.45-81.78-72.45s-81.78,32.41-81.78,72.45c0,11.14,2.81,21.65,7.9,31.05h-62.54c5.1-9.4,7.9-19.91,7.9-31.05,0-40.04-36.59-72.45-81.78-72.45s-81.78,32.41-81.78,72.45l-46.73-10.35c0-114.32,104.63-207,233.66-207s233.66,92.69,233.66,207l-46.73,10.35Z" fill="#37474f" />
<path class="cls-1" d="m658.81,397.7v475.8c-36.98,15.7-98.93,36.54-177.98,38.04-88.67,1.69-157.75-21.73-196.2-38.04v-475.8c0-95.55,83.77-173.02,187.09-173.02s187.09,77.47,187.09,173.02Z"/>
<polygon class="cls-3" points="565.02 431.68 471.56 514.49 378.09 431.68 565.02 431.68"/>
<ellipse class="cls-2" cx="378.09" cy="369.58" rx="23.37" ry="20.7"/>
<ellipse class="cls-2" cx="565.02" cy="369.58" rx="23.37" ry="20.7"/>
<path class="cls-2" d="m658.49,400.63c0-40.04-36.59-72.45-81.78-72.45s-81.78,32.41-81.78,72.45c0,11.14,2.81,21.65,7.9,31.05h-62.54c5.1-9.4,7.9-19.91,7.9-31.05,0-40.04-36.59-72.45-81.78-72.45s-81.78,32.41-81.78,72.45l-46.73-10.35c0-114.32,104.63-207,233.66-207s233.66,92.69,233.66,207l-46.73,10.35Z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -1,13 +0,0 @@
<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 180 120" width="180" height="120">
<title>seafile</title>
<defs>
<linearGradient id="g1" x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,114.369,-177.525,0,89.989,2.834)">
<stop offset="0" stop-color="#fad956"/>
<stop offset="1" stop-color="#ffa10f"/>
</linearGradient>
</defs>
<style>
.s0 { fill: url(#g1) }
</style>
<path class="s0" d="m1.2 52.8c0-3 2.4-5.4 5.4-5.4 1.4 0 2.7 0.6 3.6 1.5q0-0.7 0-1.4c0-9.9 8-17.9 17.9-17.9 2.5 0 4.9 0.5 7.1 1.5q0-0.8 0-1.5c0-14.8 12-26.8 26.8-26.8 14.7 0 26.6 11.9 26.8 26.6-4.8 4.2-8.7 9.6-11.2 15.7-4.8-3-10.4-4.8-16.5-4.8-12.4 0-23.2 7.1-28.3 17.8h-19.1-7.1c-3 0-5.4-2.4-5.4-5.3zm141.2-16c-6.6-6.7-15.8-10.8-25.9-10.8-18.5 0-33.8 13.7-36.3 31.5-4.5-6.1-11.8-10-20-10-13.8 0-25 11.2-25 25 0 4 0.9 7.8 2.6 11.2-8.7 1.7-15.1 8.5-15.1 16.5 0 9.4 8.8 17 19.7 17 4.7 0 9.1-1.5 12.6-4l40.2-39.5c4.4-4.1 10.3-6.6 16.8-6.6 13.6 0 24.7 10.9 25.1 24.4q0 0-0.1-0.1c0.2 4-1.8 8.1-5.7 10.3-5.3 3.1-12 1.4-15-3.7-2.9-5.1-1-11.7 4.4-14.8q1.9-1.1 3.9-1.4-1.8-0.4-3.6-0.4c-9.9 0-17.9 8-17.9 17.9 0 9.9 8 17.9 17.9 17.9q0.6 0 1.3-0.1l0.5-0.1h35.1v0.2c10.7-0.5 20.9-10.4 20.9-22.5 0-12.3-10.6-22.4-22.9-22.4q-0.1 0-0.1 0c-2 3.6-4.4 5.7-7.1 7.9 2.8-5.2 4.5-11.2 4.5-17.6-0.1-10.1-4.2-19.2-10.8-25.8z"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -1,16 +1 @@
<?xml version='1.0' encoding='utf-8'?>
<svg xmlns="http://www.w3.org/2000/svg" id="Lager_1" data-name="Lager 1" viewBox="0 0 189.11 188.93">
<path d="M515.5,279.22a94.56,94.56,0,1,1-94.56-94.47A94.51,94.51,0,0,1,515.5,279.22Z" transform="translate(-326.39 -184.75)" fill="#000" />
<path d="M388.45,300.05c-1.94,8.41-12.59,1.73-15.15,12-2.42,9.71,7.54,19.77,1.62,19.42-8.11-.48-18-2.84-12.78,11.64-2.5-16.77,14.88-4.2,18.93-9.7s-5.92-19.23,2.81-19.12,11.89,2,15.58-3.46C395.14,308,392.36,305.21,388.45,300.05Z" transform="translate(-326.39 -184.75)" fill="#fff" />
<path d="M412.37,239.33c11.71-12.4-2.75-9.08-2.75-18.16.07-5.18,15.13-6.72,17.07-12s-20.14-9.51-5.84-18.11c-8.05,11.07,10.86,9.87,10.43,18.11-.36,6.62-11.08,9-11.08,12.07-.21,5.56,15.66,5.72,9.2,18.3A39.57,39.57,0,0,0,412.37,239.33Z" transform="translate(-326.39 -184.75)" fill="#fff" />
<path d="M442.81,245.1c1.86-4.54,6-10.44,14.59-8,14.41,4.09,1.48-9.39,10.51-14.21,7.66-4.11,11.06,6.13,20.79,3.31-6.61,7.84-14.16-4.16-18.5,2.24-3.85,5.66,3.15,11.12.91,15.22-3.51,6.36-10.36.78-13.8,3.33s-3,6.88-3,10.37C451.87,252.48,447.08,248.24,442.81,245.1Z" transform="translate(-326.39 -184.75)" fill="#fff" />
<path d="M459.71,270.1c10.31,9.5,11-3.49,17.62-3.5,5.78,0,8.12,17.32,14.11,17.51,6.79.2,10.64-15.69,18.73-5-9.61-5.29-11.14,9.84-18.53,10-10.84.18-11.22-12.56-14.53-12.56-4.54.22-4.5,17.44-17.9,10.43A36.93,36.93,0,0,0,459.71,270.1Z" transform="translate(-326.39 -184.75)" fill="#fff" />
<path d="M441.56,311.37c8.81,5.91.67,11.88,5.51,16.58,3.45,3.31,13.88-4,18.59-2.52,3,1-2.63,9.82,1.92,13.41,3.83,3,11.91,2.08,15.82-.8-5.36.62-11.13,1.45-13.45-3.86s3.81-12.27,1.3-15.35c-2.19-2.67-16,5.2-15-4.28.43-3.77,3.15-12-2.92-14.27A40.5,40.5,0,0,1,441.56,311.37Z" transform="translate(-326.39 -184.75)" fill="#fff" />
<path d="M412.93,316.48c-2.42,10.89,6.09,12.37,6.25,16.28.24,5.88-9.29,6.94-9.12,14.06.11,4.61,16.23,9.05,10.49,18.07,8.06-6.25-4-13.61-3.82-17.92.29-8,14.07-6.12,13.8-15.05-.21-7.85-6.11-5.67-.93-15.45A42.33,42.33,0,0,1,412.93,316.48Z" transform="translate(-326.39 -184.75)" fill="#fff" />
<path d="M382.27,270.8c-13.19-4.74-16.29,11-20,10.81S354,266,349.36,270.07c-8.09,7.13-6.68,12.48-14.61,9.24,7.33,7.23,9.09-1.91,15-5.25,5-2.8,4.85,16.63,12.69,16.83,4.33.11,9.5-7,12.18-7a11.29,11.29,0,0,1,8.15,3.9A39,39,0,0,1,382.27,270.8Z" transform="translate(-326.39 -184.75)" fill="#fff" />
<path d="M387.73,257.21c-8.38-2.34-6.54-10.82-5.79-16.22.72-5.23.37-8.75-8-3.9s-14.66-4.52-9.71-9.8c4.33-4.63-2-7.48-6.53-6.16,1.56-1.92,9.08-5.59,11.55,2,1.34,4.12-2.73,7.4-.53,9.09,4.09,3.13,9.78-8.44,16.32-6.12,5.79,2.06,3.4,6.33,5.69,13.72,1.09,3.47,3.89,5.43,7.74,5.77A38.31,38.31,0,0,0,387.73,257.21Z" transform="translate(-326.39 -184.75)" fill="#fff" />
<path d="M409.85,272.86c-2.28-.32-1.89-2.08-1.89-2.08l-2.61-1s-.83,5.07,4.25,5.06c4.82,0,5.61-2.24,5.68-2.75a31,31,0,0,0-3.14-.53C411.75,272.16,411.73,273.13,409.85,272.86Z" transform="translate(-326.39 -184.75)" fill="#fff" />
<path d="M434.69,270.35a1.63,1.63,0,0,1-1.34,2.51c-1.88.27-2.14-.57-2.41-1.42-1,.19-2.36.33-3.45.57.07.52,1.72,3.07,6.46,2.23,5.18-.92,3.34-5,3.34-5S435.55,270,434.69,270.35Z" transform="translate(-326.39 -184.75)" fill="#fff" />
<path d="M420.74,293.72c-14.62.21-22.05-3.89-23.72-5.91-.63,2.23,7,17.47,24.38,17.32C440.23,305,445,287.89,445,285.06,442.31,288.11,439.06,293.44,420.74,293.72Z" transform="translate(-326.39 -184.75)" fill="#fff" />
<path d="M420.91,241.27a36.51,36.51,0,1,0,36.51,36.51A36.5,36.5,0,0,0,420.91,241.27ZM422,267.54c1.51,3,.26,4.91,10.47,1.74,3.82-1.17,10.61-7.94,16.46-1.64-4.15-3.13-9.22-.58-8.93,1.15-.19.92.14,5-5.42,6.26-5.32,1.19-7.78-1.85-8.5-2.64C422.12,272.47,421.79,269.07,422,267.54Zm1.77,14.94c-1.27.94,1.15-2.3,2.81-1.6s-1,4.28-.31,2.09C426.83,281.18,425.19,281.39,423.74,282.48Zm-13-12.82c10,2.92,9.33.72,9.67-.19.11.66-.11,3-4.05,2.94-.71.79-.92,3.65-6.58,3.61-6.84,0-7.21-5.11-7.31-6.29-.21-2.68-5.71-2.67-8.31-2.09C400.29,264.68,406.86,268.54,410.7,269.66Zm6.4,14.28c.33,1.19-2.53-1.32-.3-2.14s3.53,1.73,3,1.33C418.21,282,416.5,281.71,417.1,283.94Zm29.71,0c-.65,7-5.71,21.68-25.34,21.87-16.91.16-25.79-11.3-26.29-18.11-1.12,1.22-1.7,3.22-1.68,5.77-.48-1.06-1.07-6,1.56-8a3.56,3.56,0,0,1,3.33-.23c-1.24.65-.88.25-1.34.72.66,1.63,8.88,7.06,23.49,7.05,16.14,0,22-5.63,24.36-10.67a4.44,4.44,0,0,0-2.6-1.14,5.06,5.06,0,0,1,4.78.25c1.65,1.14,2.74,4.23,2.6,7.56C449.46,287.4,448.4,284.46,446.81,284Z" transform="translate(-326.39 -184.75)" fill="#fff" />
</svg>
<svg id="Lager_1" data-name="Lager 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 189.11 188.93"><defs><style>.cls-1{fill:#fff;}</style></defs><path d="M515.5,279.22a94.56,94.56,0,1,1-94.56-94.47A94.51,94.51,0,0,1,515.5,279.22Z" transform="translate(-326.39 -184.75)"/><path class="cls-1" d="M388.45,300.05c-1.94,8.41-12.59,1.73-15.15,12-2.42,9.71,7.54,19.77,1.62,19.42-8.11-.48-18-2.84-12.78,11.64-2.5-16.77,14.88-4.2,18.93-9.7s-5.92-19.23,2.81-19.12,11.89,2,15.58-3.46C395.14,308,392.36,305.21,388.45,300.05Z" transform="translate(-326.39 -184.75)"/><path class="cls-1" d="M412.37,239.33c11.71-12.4-2.75-9.08-2.75-18.16.07-5.18,15.13-6.72,17.07-12s-20.14-9.51-5.84-18.11c-8.05,11.07,10.86,9.87,10.43,18.11-.36,6.62-11.08,9-11.08,12.07-.21,5.56,15.66,5.72,9.2,18.3A39.57,39.57,0,0,0,412.37,239.33Z" transform="translate(-326.39 -184.75)"/><path class="cls-1" d="M442.81,245.1c1.86-4.54,6-10.44,14.59-8,14.41,4.09,1.48-9.39,10.51-14.21,7.66-4.11,11.06,6.13,20.79,3.31-6.61,7.84-14.16-4.16-18.5,2.24-3.85,5.66,3.15,11.12.91,15.22-3.51,6.36-10.36.78-13.8,3.33s-3,6.88-3,10.37C451.87,252.48,447.08,248.24,442.81,245.1Z" transform="translate(-326.39 -184.75)"/><path class="cls-1" d="M459.71,270.1c10.31,9.5,11-3.49,17.62-3.5,5.78,0,8.12,17.32,14.11,17.51,6.79.2,10.64-15.69,18.73-5-9.61-5.29-11.14,9.84-18.53,10-10.84.18-11.22-12.56-14.53-12.56-4.54.22-4.5,17.44-17.9,10.43A36.93,36.93,0,0,0,459.71,270.1Z" transform="translate(-326.39 -184.75)"/><path class="cls-1" d="M441.56,311.37c8.81,5.91.67,11.88,5.51,16.58,3.45,3.31,13.88-4,18.59-2.52,3,1-2.63,9.82,1.92,13.41,3.83,3,11.91,2.08,15.82-.8-5.36.62-11.13,1.45-13.45-3.86s3.81-12.27,1.3-15.35c-2.19-2.67-16,5.2-15-4.28.43-3.77,3.15-12-2.92-14.27A40.5,40.5,0,0,1,441.56,311.37Z" transform="translate(-326.39 -184.75)"/><path class="cls-1" d="M412.93,316.48c-2.42,10.89,6.09,12.37,6.25,16.28.24,5.88-9.29,6.94-9.12,14.06.11,4.61,16.23,9.05,10.49,18.07,8.06-6.25-4-13.61-3.82-17.92.29-8,14.07-6.12,13.8-15.05-.21-7.85-6.11-5.67-.93-15.45A42.33,42.33,0,0,1,412.93,316.48Z" transform="translate(-326.39 -184.75)"/><path class="cls-1" d="M382.27,270.8c-13.19-4.74-16.29,11-20,10.81S354,266,349.36,270.07c-8.09,7.13-6.68,12.48-14.61,9.24,7.33,7.23,9.09-1.91,15-5.25,5-2.8,4.85,16.63,12.69,16.83,4.33.11,9.5-7,12.18-7a11.29,11.29,0,0,1,8.15,3.9A39,39,0,0,1,382.27,270.8Z" transform="translate(-326.39 -184.75)"/><path class="cls-1" d="M387.73,257.21c-8.38-2.34-6.54-10.82-5.79-16.22.72-5.23.37-8.75-8-3.9s-14.66-4.52-9.71-9.8c4.33-4.63-2-7.48-6.53-6.16,1.56-1.92,9.08-5.59,11.55,2,1.34,4.12-2.73,7.4-.53,9.09,4.09,3.13,9.78-8.44,16.32-6.12,5.79,2.06,3.4,6.33,5.69,13.72,1.09,3.47,3.89,5.43,7.74,5.77A38.31,38.31,0,0,0,387.73,257.21Z" transform="translate(-326.39 -184.75)"/><path class="cls-1" d="M409.85,272.86c-2.28-.32-1.89-2.08-1.89-2.08l-2.61-1s-.83,5.07,4.25,5.06c4.82,0,5.61-2.24,5.68-2.75a31,31,0,0,0-3.14-.53C411.75,272.16,411.73,273.13,409.85,272.86Z" transform="translate(-326.39 -184.75)"/><path class="cls-1" d="M434.69,270.35a1.63,1.63,0,0,1-1.34,2.51c-1.88.27-2.14-.57-2.41-1.42-1,.19-2.36.33-3.45.57.07.52,1.72,3.07,6.46,2.23,5.18-.92,3.34-5,3.34-5S435.55,270,434.69,270.35Z" transform="translate(-326.39 -184.75)"/><path class="cls-1" d="M420.74,293.72c-14.62.21-22.05-3.89-23.72-5.91-.63,2.23,7,17.47,24.38,17.32C440.23,305,445,287.89,445,285.06,442.31,288.11,439.06,293.44,420.74,293.72Z" transform="translate(-326.39 -184.75)"/><path class="cls-1" d="M420.91,241.27a36.51,36.51,0,1,0,36.51,36.51A36.5,36.5,0,0,0,420.91,241.27ZM422,267.54c1.51,3,.26,4.91,10.47,1.74,3.82-1.17,10.61-7.94,16.46-1.64-4.15-3.13-9.22-.58-8.93,1.15-.19.92.14,5-5.42,6.26-5.32,1.19-7.78-1.85-8.5-2.64C422.12,272.47,421.79,269.07,422,267.54Zm1.77,14.94c-1.27.94,1.15-2.3,2.81-1.6s-1,4.28-.31,2.09C426.83,281.18,425.19,281.39,423.74,282.48Zm-13-12.82c10,2.92,9.33.72,9.67-.19.11.66-.11,3-4.05,2.94-.71.79-.92,3.65-6.58,3.61-6.84,0-7.21-5.11-7.31-6.29-.21-2.68-5.71-2.67-8.31-2.09C400.29,264.68,406.86,268.54,410.7,269.66Zm6.4,14.28c.33,1.19-2.53-1.32-.3-2.14s3.53,1.73,3,1.33C418.21,282,416.5,281.71,417.1,283.94Zm29.71,0c-.65,7-5.71,21.68-25.34,21.87-16.91.16-25.79-11.3-26.29-18.11-1.12,1.22-1.7,3.22-1.68,5.77-.48-1.06-1.07-6,1.56-8a3.56,3.56,0,0,1,3.33-.23c-1.24.65-.88.25-1.34.72.66,1.63,8.88,7.06,23.49,7.05,16.14,0,22-5.63,24.36-10.67a4.44,4.44,0,0,0-2.6-1.14,5.06,5.06,0,0,1,4.78.25c1.65,1.14,2.74,4.23,2.6,7.56C449.46,287.4,448.4,284.46,446.81,284Z" transform="translate(-326.39 -184.75)"/></svg>

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17.143 8.572c0-.947-.768-1.715-1.714-1.715H1.715C.768 6.857 0 7.625 0 8.572v13.714C0 23.232.768 24 1.715 24h13.714c.946 0 1.714-.768 1.714-1.714V8.572M12 3.429A3.429 3.429 0 0 1 8.573 0h12A3.428 3.428 0 0 1 24 3.43v12A3.429 3.429 0 0 1 20.572 12V5.143c0-.946-.767-1.714-1.714-1.714H12"/></svg>

Before

Width:  |  Height:  |  Size: 363 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="#25f4ee" d="M9.844 20.069a3.323 3.323 0 0 0 2.295-.945c.616-.6.98-1.418 1.018-2.282l.008-15.815h2.843L16 .992A5.541 5.541 0 0 1 15.913 0h-3.92v15.846a3.342 3.342 0 0 1-.465 1.59 3.3 3.3 0 0 1-1.17 1.165 3.26 3.26 0 0 1-3.18.062c.302.43.702.782 1.166 1.027.463.244.978.374 1.5.379zM21.355 6.442v-.944a5.373 5.373 0 0 1-2.97-.896c.765.883 1.797 1.577 2.97 1.84z"/><g fill="#fe2c55" stroke-width="2"><path d="M18.386 4.602a5.507 5.507 0 0 1-1.34-3.606h-1.075c.14.734.427 1.432.842 2.052.415.62.95 1.149 1.573 1.554zM8.703 12.359a3.278 3.278 0 0 0-2.05.704c-.584.46-.999 1.107-1.175 1.835a3.362 3.362 0 0 0 .204 2.177 3.317 3.317 0 0 0 1.495 1.58 3.334 3.334 0 0 1-.013-3.89 3.28 3.28 0 0 1 1.633-1.21 3.247 3.247 0 0 1 2.025-.009V9.51a7.175 7.175 0 0 0-.971-.071h-.197v3.049a3.004 3.004 0 0 0-.951-.13z"/><path d="M21.355 6.375h-.021l-.01 3.044a9.23 9.23 0 0 1-5.437-1.781v8.08a7.34 7.34 0 0 1-1.054 3.755 7.241 7.241 0 0 1-2.822 2.667 7.151 7.151 0 0 1-7.432-.463 7.183 7.183 0 0 0 3.678 2.142 7.132 7.132 0 0 0 4.233-.323 7.212 7.212 0 0 0 3.316-2.676 7.324 7.324 0 0 0 1.248-4.099V8.678a9.254 9.254 0 0 0 5.446 1.768V6.498c-.385 0-.769-.041-1.146-.123z"/></g><path d="M15.913 15.714V7.68a9.249 9.249 0 0 0 5.446 1.768V6.375a5.444 5.444 0 0 1-2.973-1.773c-.62-.407-1.15-.936-1.56-1.556s-.692-1.318-.828-2.05h-2.863V16.84a3.338 3.338 0 0 1-.681 1.907c-.418.548-.996.95-1.652 1.15-.656.2-1.358.188-2.007-.035a3.287 3.287 0 0 1-1.611-1.208 3.309 3.309 0 0 1-1.473-1.577 3.353 3.353 0 0 1-.196-2.16 3.326 3.326 0 0 1 1.165-1.822 3.268 3.268 0 0 1 2.03-.707c.329.001.656.053.97.154v-3.1a7.149 7.149 0 0 0-3.884 1.259A7.255 7.255 0 0 0 3.21 13.89c-.539 1.292-.696 2.714-.453 4.095s.876 2.66 1.823 3.686a7.138 7.138 0 0 0 7.457.497 7.227 7.227 0 0 0 2.831-2.679 7.325 7.325 0 0 0 1.044-3.775z"/><path fill="#25f4ee" d="M9.674 9.484v-.976a7.14 7.14 0 0 0-4.62.934 7.253 7.253 0 0 0-3.059 3.62 7.341 7.341 0 0 0-.186 4.757 7.268 7.268 0 0 0 2.765 3.853l-.1-.11a7.31 7.31 0 0 1-1.704-3.678c-.212-1.364-.034-2.76.51-4.027s1.437-2.35 2.569-3.124a7.157 7.157 0 0 1 3.825-1.249z"/></svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -1 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M23.561 11.988C23.301-.304 6.954-4.89.656 6.634c.282.206.661.477.943.672a11.747 11.747 0 0 0-.976 3.067 11.885 11.885 0 0 0-.184 2.071C.439 18.818 5.621 24 12.005 24c6.385 0 11.556-5.17 11.556-11.556v-.455zm-20.27 2.06c-.152 1.246-.054 1.636-.054 1.788l-.282.098c-.108-.206-.37-.932-.488-1.908C2.163 10.308 4.7 6.96 8.57 6.33c3.544-.52 6.937 1.68 7.728 4.758l-.282.098c-.087-.087-.228-.336-.77-.878-4.281-4.281-11.002-2.32-11.956 3.74zm11.002 2.081a3.145 3.145 0 0 1-2.59 1.355 3.15 3.15 0 0 1-3.155-3.155 3.159 3.159 0 0 1 2.927-3.144c1.018-.043 1.972.51 2.416 1.398a2.58 2.58 0 0 1-.455 2.95c.293.205.575.4.856.595zm6.58.12c-1.669 3.782-5.106 5.766-8.77 5.712-7.034-.347-9.083-8.466-4.38-11.393l.207.206c-.076.108-.358.325-.791 1.182-.51 1.041-.672 2.081-.607 2.732.369 5.67 8.314 6.83 11.045 1.214C21.057 8.217 11.822.401 3.626 6.374l-.184-.184C5.599 2.808 9.816 1.3 13.837 2.309c6.147 1.55 9.453 7.956 7.035 13.94z"/></svg>
<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
<g style="mix-blend-mode:difference">
<path d="M234.915 0C79.5084 0 12.429 138.162 12.429 138.162L32.1744 152.281C32.1744 152.281 7.3264 199.477 8.01401 260.013C8.01401 383.59 106.503 500 251.486 500C383.198 500 492 392.923 492 260.317C492 87.3677 357.722 0 234.916 0H234.915ZM236.263 42.1591C357.682 42.1591 451.9 139.886 451.9 253.497C451.9 373.933 361.21 457.689 255.53 457.689C177.753 457.689 107.59 398.53 107.59 317.419C107.59 270.572 132.52 237.911 160.456 220.504L164.544 224.935C156.899 230.91 135.1 265.885 135.1 300.261C135.1 364.077 185.205 408.275 248.333 408.275C328.747 408.275 382.377 339.771 382.377 260.231C382.377 167.686 300.59 89.1181 202.165 89.1181C147.726 89.1181 101.521 112.502 74.9709 133.145L70.8393 129.41C105.574 75.9175 165.725 42.1591 236.263 42.1591ZM200.034 130.691C262.843 130.691 324.165 172.193 339.471 231.103L333.904 233.21C306.421 196.961 261.388 166.92 208.21 166.92C110.357 166.92 58.9672 255.732 66.5114 329.908L60.749 332.016C60.749 332.016 49.9411 308.197 49.9411 279.952C49.9411 198.161 117.19 130.691 200.034 130.691ZM241.548 233.34C271.284 233.34 295.066 257.414 295.066 285.991C295.066 309.639 279.864 323.654 279.864 323.654L297.87 336.229C297.87 336.229 280.015 364.227 243.57 364.227C208.707 364.227 177.875 336.122 177.875 298.327C177.875 259.384 211.412 233.34 241.548 233.34Z" fill="white"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 996 B

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -1,129 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="256"
height="256"
id="svg2"
sodipodi:version="0.32"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="WCA Logo Only Positive Primary.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
version="1.0"
xml:space="preserve"
inkscape:export-filename="WCA Logo Only Negative Primary.png"
inkscape:export-xdpi="1536"
inkscape:export-ydpi="1536"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"><defs
id="defs4"><inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 488.98764 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="744.09448 : 488.98764 : 1"
inkscape:persp3d-origin="372.04724 : 313.59394 : 1"
id="perspective10" /><inkscape:perspective
id="perspective2708"
inkscape:persp3d-origin="0.5 : -36.860118 : 1"
inkscape:vp_z="1 : -36.693451 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : -36.693451 : 1"
sodipodi:type="inkscape:persp3d" /></defs><sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
gridtolerance="10000"
guidetolerance="10"
objecttolerance="10"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="4"
inkscape:cx="210"
inkscape:cy="265.125"
inkscape:document-units="px"
inkscape:current-layer="g3312"
showgrid="false"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="2560"
inkscape:window-height="1369"
inkscape:window-x="-8"
inkscape:window-y="1432"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:window-maximized="1" /><metadata
id="metadata7"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-440.9061,488.30753)"><g
id="g3312"
transform="matrix(0.499989,0,0,0.499989,301.618,-244.854)"><g
id="g4"
transform="matrix(1.0018562,0,0,1,-0.51713006,0)"><path
style="fill:#ddda45;stroke-width:0.873144"
d="m 536.25328,-428.58851 c -0.021,-19.97227 -0.0227,-27.82159 -5e-4,-58.32991 105.40638,-0.17805 182.31227,64.21817 218.15501,126.42486 -45.15016,26.27039 -50.10755,29.12785 -50.10755,29.12785 -33.11708,-56.63926 -96.17928,-96.54551 -168.04696,-97.2228 z"
id="path8"
sodipodi:nodetypes="ccccc" /><path
style="fill:#ddda45;stroke-width:0.873144"
d="m 366.2197,-133.72782 0.0151,-192.06002 166.02237,95.88619 -0.17907,191.155551 C 476.51709,-69.927771 366.2197,-133.72782 366.2197,-133.72782 Z"
id="path2730" /><path
sodipodi:nodetypes="ccccc"
style="fill:#e7762a;stroke-width:0.873144"
d="m 706.37054,-133.96383 c 36.2716,-65.47593 30.50843,-138.95072 -0.0298,-193.85497 0.39613,-1.03249 33.46343,-19.33855 50.10377,-29.13739 51.21862,93.81548 36.51984,189.21677 0.1421,252.07328 -20.3537,-11.42655 -31.0669,-17.78432 -50.21605,-29.08092 z"
id="path2726" /><path
style="fill:#e02826;stroke-width:0.873144"
d="m 311.34759,-356.46181 50.35175,28.2771 c -35.18504,70.65751 -31.88557,124.21147 -0.28702,194.132 l -50.13488,28.72384 c -50.42479,-90.8489 -36.1234,-187.14573 0.0702,-251.13294 z"
id="path4" /><path
style="fill:#e02826;stroke-width:0.873144"
d="m 536.2423,-229.90781 c 56.13671,-32.73903 165.61719,-95.11799 165.61719,-95.11799 -0.67575,128.21382 0.0532,8.15816 -0.21804,191.35217 -54.38973,32.37299 -105.23267,61.003461 -165.50176,94.927531 -0.31544,-40.223801 0.10261,-46.61912 0.10261,-191.161711 z"
id="path2724"
sodipodi:nodetypes="ccccc" /><path
sodipodi:nodetypes="ccccc"
style="fill:#3d9c46;stroke-width:0.873144"
d="m 313.7727,-360.67732 c 38.71037,-70.10178 124.6252,-126.43919 218.12075,-126.24058 v 58.32974 c -79.9296,2.84524 -135.21709,43.39695 -168.14346,96.87297 -19.03513,-11.01192 -28.32282,-16.47474 -49.97729,-28.96213 z"
id="path2722" /><path
id="path2802"
d="m 363.46745,-130.48995 c 36.87186,61.386523 101.90167,96.576564 168.55822,97.399755 l 0.0525,58.183687 C 444.56118,25.630318 359.24663,-22.728811 313.43202,-101.575 Z"
style="fill:#eeeeec;stroke-width:0.873144"
sodipodi:nodetypes="ccccc" /><path
style="fill:#304a96;stroke-width:0.873144"
d="m 368.78398,-329.03858 165.28088,-95.18971 165.54442,95.6062 -165.35954,95.09314 z"
id="path5" /><path
style="fill:#304a96;stroke-width:0.873144"
d="m 536.25206,25.093492 c -0.14995,-22.2466531 -0.26346,-38.397197 -0.11279,-58.184006 78.82367,0.02164 144.07151,-53.088696 168.10562,-97.178966 21.6542,12.49748 29.7479,17.20359 50.23519,29.02341 C 683.82068,20.035204 554.37926,25.093492 536.25206,25.093492 Z"
id="path2720"
sodipodi:nodetypes="ccccc" /><path
style="fill:#ffffff;fill-opacity:1;stroke-width:0.873144"
d="m 494.47153,-109.23902 c 0,-11.24557 -0.16402,-13.10126 -1.27163,-14.3936 -0.69937,-0.81604 -15.49557,-9.23821 -32.88042,-18.71602 -34.42705,-18.76883 -37.64764,-20.6942 -42.21281,-25.23604 -5.5503,-5.52185 -5.57501,-5.66443 -5.85792,-33.80463 -0.24306,-24.17526 -0.20649,-24.97725 1.18835,-25.9983 2.91343,-2.13292 2.42236,-2.36343 44.5433,20.90507 36.85908,20.36163 34.92959,19.39131 35.80541,18.00702 0.36489,-0.57671 0.66848,-6.81646 0.67461,-13.86596 0.0107,-11.18148 -0.15111,-13.00198 -1.26052,-14.2642 -1.48226,-1.68665 -69.35219,-39.35146 -74.69152,-41.4505 -12.36338,-4.86053 -20.15829,-2.79877 -24.22969,6.40879 -2.51248,5.68199 -2.97922,11.7884 -2.97114,38.87079 0.0107,35.38896 1.46043,44.78242 8.86025,57.4045 3.60238,6.14475 13.57792,16.31539 20.27503,20.67168 2.64641,1.7214 19.97676,11.39689 38.51189,21.50099 24.61856,13.4204 33.94498,18.168905 34.60851,17.620833 0.66439,-0.548858 0.9083,-4.216849 0.9083,-13.660423 z"
id="path7" /><path
style="fill:#ffffff;fill-opacity:1;stroke-width:0.873144"
d="m 505.09984,-276.94542 c 1.62571,-0.8294 3.4446,-2.26258 4.04199,-3.18479 0.59738,-0.92222 6.23639,-11.5682 12.53121,-23.65766 6.29474,-12.08947 11.67266,-21.98079 11.95089,-21.98079 0.2782,0 5.72494,10.1654 12.10386,22.58972 7.96677,15.51716 12.33445,23.24274 13.95007,24.67522 4.82285,4.27605 13.93275,4.70162 19.40752,0.90658 2.71831,-1.88433 4.51003,-5.1519 23.16429,-42.24514 11.11996,-22.11158 20.04063,-40.66537 19.82372,-41.23064 -0.31784,-0.82827 -2.69013,-1.0256 -12.22507,-1.0166 -6.5069,0.009 -12.20035,0.25138 -12.65217,0.54501 -0.45185,0.29355 -6.76874,12.43017 -14.03759,26.97002 -7.35167,14.70566 -13.48862,26.15206 -13.83028,25.79573 -0.33785,-0.35232 -5.59609,-10.28669 -11.68508,-22.0764 -6.089,-11.78971 -11.88326,-22.53418 -12.87619,-23.87655 -4.87781,-6.5946 -16.58774,-6.78809 -21.98661,-0.36323 -0.98258,1.16931 -7.01834,12.16665 -13.41277,24.43842 -6.39441,12.27186 -11.80174,22.31573 -12.01628,22.31983 -0.21457,0.009 -6.08797,-11.51895 -13.05211,-25.60669 -6.9641,-14.08774 -13.13378,-26.18628 -13.71036,-26.88567 -0.91743,-1.11282 -2.46328,-1.27016 -12.38026,-1.26047 -6.23258,0.009 -11.79127,0.30193 -12.35263,0.6573 -1.12002,0.70908 4.58354,13.16491 26.31245,57.46273 11.69014,23.83212 13.1777,26.0988 18.40631,28.04573 3.75182,1.39712 10.7486,0.90493 14.52509,-1.02166 z"
id="path6" /><path
id="path2"
style="fill:#ffffff;fill-opacity:1;stroke-width:0.873144"
d="m 631.01971,-246.39217 c -0.47323,0.0208 -0.97529,0.0984 -1.52122,0.21829 -2.82269,0.61994 -7.13602,4.93796 -9.07953,9.08636 -0.83468,1.78164 -8.7296,23.67679 -17.54171,48.65496 -8.81211,24.97818 -19.81733,56.13532 -24.45539,69.2391 -4.63806,13.10378 -8.22951,24.152572 -7.98126,24.554305 0.44123,0.713882 6.65438,-2.39945 15.95229,-7.994895 l 4.35899,-2.6229 6.53849,-18.88216 6.5419,-18.87874 23.23432,-12.89962 c 12.78056,-7.09376 23.46988,-12.89621 23.75277,-12.89621 0.28285,0 2.86467,4.26279 5.73695,9.47518 2.87232,5.21241 5.79232,10.17904 6.48733,11.03733 l 1.262,1.56215 8.26776,-4.69325 c 4.54677,-2.58163 8.36975,-5.23035 8.49629,-5.88704 0.12637,-0.65668 -7.09396,-15.03901 -16.04438,-31.95912 -8.95039,-16.92012 -19.15933,-36.26049 -22.68859,-42.97941 -6.07668,-11.5688 -8.00443,-14.27992 -11.31701,-14.13433 z m -3.31189,35.64962 c 1.02361,0.32811 12.91735,22.28651 12.46645,23.01602 -0.40514,0.65556 -22.03366,12.56041 -24.52019,13.49651 -0.98208,0.36969 0.12893,-3.59332 5.0855,-18.12154 3.48879,-10.22634 6.62422,-18.50118 6.96824,-18.39099 z" /></g><g
id="g4-1"
transform="matrix(1.7463512,0,0,1.7463512,829.98941,-617.46454)"
style="stroke:#ffffff;stroke-opacity:1"><g
id="g2-7"
transform="matrix(0.12458447,0,0,0.12458447,-46.754768,344.21344)"
style="stroke:#ffffff;stroke-opacity:1"><g
id="g3-6"
transform="translate(-93.696521,-2082.5864)"
style="stroke:#ffffff;stroke-opacity:1"><path
id="circle1-2"
style="fill:none;stroke-width:20"
d="m 176.38791,2073.0198 a 88.5,88.5 0 0 1 -88.500001,88.5 88.5,88.5 0 0 1 -88.50000006,-88.5 88.5,88.5 0 0 1 88.50000006,-88.5 88.5,88.5 0 0 1 88.500001,88.5 z" /><path
d="m 82.487909,2065.0198 c 5.500001,0 9.500001,-1.1 11.900001,-3.2 2.4,-2 3.7,-5.4 3.7,-10.2 0,-4.7 -1.3,-8 -3.7,-10.1 -2.4,-2 -6.4,-3 -11.900001,-3 h -11.2 v 26.5 h 11.2 m -11.2,18.3 v 39 H 44.687911 v -103.1 h 40.599998 c 13.600001,0 23.500001,2.3 29.800001,6.9 6.4,4.5 9.5,11.7 9.5,21.6 0,6.8 -1.6,12.4 -4.9,16.8 -3.3,4.3 -8.2,7.6 -14.9,9.6 3.7,0.9 6.9,2.8 9.8,5.7 2.9,2.9 5.8,7.3 8.7,13.3 l 14.5,29.2 h -28.3 l -12.6,-25.6 c -2.5,-5.1 -5.1,-8.7 -7.7,-10.5 -2.600001,-1.9 -6.100001,-2.9 -10.400001,-2.9 h -7.5"
id="path1-5"
style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1.00334;stroke-dasharray:none;stroke-opacity:1" /></g></g></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -1 +1,15 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><g fill-rule="evenodd" clip-rule="evenodd"><path fill="#030407" d="M20.5 20.5 12 24l-8.5-3.5L0 12l3.5-8.5L12 0l8.5 3.5L24 12z"/><g fill="#fff"><path fill-opacity=".5" d="m3 12 2.75-6.25L12 3l6.25 2.75L21 12h-3V7h-2.5L14 8.5V12h-4V8.5L8.5 7H6v5z"/><path d="M6 7v10.5h2.75L12 14l3.25 3.5H18V7h-2.5v7.5L12 10.75 8.5 14.5V7z"/><path d="m19.25 4.75-7.25-3-7.25 3-3 7.25 3 7.25 7.25 3 7.25-3 3-7.25zM20.5 20.5 12 24l-8.5-3.5L0 12l3.5-8.5L12 0l8.5 3.5L24 12z"/></g></g></svg>
<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_191_1078)">
<g style="mix-blend-mode:difference">
<path d="M261.198 1.60387L416.423 70.2759C420.678 72.1581 424.082 75.5557 425.971 79.8079L498.384 242.732C499.414 245.05 499.963 247.552 499.998 250.089C500.033 252.625 499.553 255.142 498.587 257.487L432.481 418.019C430.609 422.563 427.028 426.191 422.508 428.122L257.746 498.494C255.471 499.465 253.026 499.977 250.552 500C248.078 500.022 245.624 499.555 243.332 498.625L84.66 434.251C80.1712 432.43 76.5614 428.942 74.587 424.519L1.628 261.068C0.585027 258.731 0.0312788 256.206 0.000838817 253.648C-0.0296012 251.089 0.463911 248.551 1.451 246.191L71.265 79.2509C72.2146 76.9794 73.6024 74.9172 75.3491 73.1822C77.0958 71.4472 79.1672 70.0732 81.445 69.1389L246.493 1.40487C248.831 0.444804 251.339 -0.0324825 253.866 0.00171599C256.393 0.0359145 258.887 0.580891 261.198 1.60387ZM253.336 39.1309L102.865 100.883L39.175 253.184L105.754 402.34L250.196 460.942L400.726 396.649L460.856 250.63L394.639 101.645L253.336 39.1329V39.1309Z" fill="white"/>
</g>
<g style="mix-blend-mode:difference">
<path d="M168.865 308.963L237.36 243.644C244.618 236.723 256.037 236.738 263.276 243.679L332.104 309.671V168.751C332.104 158.402 340.504 150.001 350.854 150.001C361.201 150.001 369.604 158.402 369.604 168.751V329.907C369.604 340.262 361.208 348.657 350.854 348.657H326.115C321.279 348.656 316.629 346.788 313.138 343.441L250.264 283.156L187.012 343.476C183.525 346.802 178.891 348.657 174.072 348.657H150.115C139.76 348.657 131.365 340.262 131.365 329.907V168.751C131.365 158.402 139.767 150.001 150.115 150.001C160.464 150.001 168.865 158.402 168.865 168.751V308.963Z" fill="white"/>
</g>
</g>
<defs>
<clipPath id="clip0_191_1078">
<rect width="500" height="500" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 528 B

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4.102 21.033A11.947 11.947 0 0 0 12 24a11.96 11.96 0 0 0 7.902-2.967c1.877-1.912-4.316-8.709-7.902-11.417-3.582 2.708-9.779 9.505-7.898 11.417zm11.16-14.406c2.5 2.961 7.484 10.313 6.076 12.912A11.942 11.942 0 0 0 24 12.004a11.95 11.95 0 0 0-3.57-8.536s-.027-.022-.082-.042a.824.824 0 0 0-.281-.045c-.592 0-1.985.434-4.805 3.246zM3.654 3.426c-.057.02-.082.041-.086.042A11.956 11.956 0 0 0 0 12.004c0 2.854.998 5.473 2.661 7.533-1.401-2.605 3.579-9.951 6.08-12.91-2.82-2.813-4.216-3.245-4.806-3.245a.725.725 0 0 0-.281.046v-.002zM12 3.551S9.055 1.828 6.755 1.746c-.903-.033-1.454.295-1.521.339C7.379.646 9.659 0 11.984 0H12c2.334 0 4.605.646 6.766 2.085-.068-.046-.615-.372-1.52-.339C14.946 1.828 12 3.545 12 3.545v.006z"/></svg>

Before

Width:  |  Height:  |  Size: 797 B

View File

@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m18.86 1.56-4.59 10.31h5.13L24 1.56h-5.14M0 6.71l5.15 11.56-1.85 4.17h4.53l6.86-15.73h-4.5l-2.8 6.73-2.77-6.73H0m15.62 6.16c-1.67 0-2.91 1.25-2.91 2.71 0 1.42 1.2 2.61 2.79 2.61 1.68 0 2.93-1.23 2.93-2.69 0-1.47-1.2-2.63-2.81-2.63Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024"><circle cx="512" cy="512" r="512" style="fill:#6001d2"/><path d="M256 390.61h101.45l59.06 151 59.83-151H575L426.38 748.15H327l40.66-94.74Zm332.7 143.54a61.36 61.36 0 1 0 61.37 61.35 61.36 61.36 0 0 0-61.37-61.35M768 275.85H657.83l-98.09 235.67h110.55Z" style="fill:#fff"/></svg>

Before

Width:  |  Height:  |  Size: 311 B

After

Width:  |  Height:  |  Size: 344 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><defs><linearGradient id="a" x1="7.573" x2="24.427" y1="30.596" y2="1.404" gradientTransform="scale(.75)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#0845BF"/><stop offset=".6" stop-color="#0B5CFF"/><stop offset="1" stop-color="#4F90EE"/></linearGradient></defs><path fill="url(#a)" d="M23.7 8.232A9.602 9.602 0 0 0 15.769.3a23.749 23.749 0 0 0-7.537 0A9.602 9.602 0 0 0 .3 8.232a23.749 23.749 0 0 0 0 7.536A9.602 9.602 0 0 0 8.232 23.7a23.751 23.751 0 0 0 7.537 0 9.602 9.602 0 0 0 7.931-7.932 23.752 23.752 0 0 0 0-7.536z"/><path fill="#fff" d="M10.204 15.721H4.265c-.417 0-.789-.249-.948-.634s-.073-.824.222-1.118l4.114-4.114H4.704c-.81 0-1.466-.657-1.466-1.467h5.477c.417 0 .789.249.948.634.16.385.073.824-.222 1.119l-4.114 4.114h3.41c.81 0 1.467.656 1.467 1.466zm10.559-4.583a2.863 2.863 0 0 0-2.86-2.86c-.843 0-1.602.368-2.126.95a2.853 2.853 0 0 0-2.127-.95 2.863 2.863 0 0 0-2.86 2.86v4.583c.81 0 1.467-.657 1.467-1.466v-3.117c0-.768.625-1.393 1.393-1.393s1.393.625 1.393 1.393v3.117c0 .81.657 1.466 1.467 1.466v-4.583c0-.768.625-1.393 1.393-1.393s1.393.625 1.393 1.393v3.117c0 .81.657 1.466 1.467 1.466z"/></svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -1,19 +1,24 @@
ente's Authenticator app helps you generate and store 2 step verification (2FA) tokens on your mobile devices.
ente's Authenticator app helps you generate and store 2 step verification (2FA)
tokens on your mobile devices.
FEATURES
- Secure Backups
ente provides end-to-end encrypted cloud backups so that you don't have to worry about losing your tokens. We use the same protocols Ente Photos uses to encrypt and preserve your data.
ente provides end-to-end encrypted cloud backups so that you don't have to worry
about losing your tokens. We use the same protocols Ente Photos uses to encrypt
and preserve your data.
- Multi Device Synchronization
ente will automatically sync the 2FA tokens you add to your account, across all your devices. Every new device you sign into will have access to these tokens.
ente will automatically sync the 2FA tokens you add to your account, across all
your devices. Every new device you sign into will have access to these tokens.
- Web access
You can access your 2FA code from any web browser by visiting https://auth.ente.io .
- Offline Mode
ente generates 2FA tokens offline, so your network connectivity will not get in the way of your workflow.
ente generates 2FA tokens offline, so your network connectivity will not get in
the way of your workflow.
- Import and Export Tokens
You can add tokens to ente by one of the following methods:
@@ -25,7 +30,8 @@ otpauth://totp/provider.com:you@email.com?secret=YOUR_SECRET
The codes maybe separated by new lines or commas.
You can also export the codes you have added to ente, to an **unencrypted** text file, that adheres to the above format.
You can also export the codes you have added to ente, to an **unencrypted** text
file, that adheres to the above format.
SUPPORT

View File

@@ -48,7 +48,6 @@
"nextTotpTitle": "التالي",
"deleteCodeTitle": "حذف الرمز؟",
"deleteCodeMessage": "هل أنت متأكد من أنك تريد حذف هذه الشيفرة؟ هذا الإجراء لا رجعة فيه.",
"trash": "سلة المهملات",
"viewLogsAction": "عرض السجلات",
"sendLogsDescription": "سوف يُرسل هذا السجلات لنا لمساعدتنا على تصحيح مشكلتك. بينما نتخذ الاحتياطات لضمان عدم تسجيل المعلومات الحساسة، نشجعك على رؤية هذه السجلات قبل مشاركتها.",
"preparingLogsTitle": "جارٍ إعداد السجلات...",
@@ -198,8 +197,6 @@
"enterDetailsManually": "أدخل التفاصيل يدوياً",
"edit": "تعديل",
"share": "مشاركة",
"shareCodes": "شارك الرموز",
"restore": "استعادة",
"copiedToClipboard": "تم النسخ إلى الحافظة",
"copiedNextToClipboard": "تم نسخ الرموز التالية إلى الحافظة",
"error": "خطأ",
@@ -251,10 +248,6 @@
"areYouSureYouWantToLogout": "هل أنت متأكد من أنك تريد تسجيل الخروج؟",
"yesLogout": "نعم، تسجيل الخروج",
"exit": "خروج",
"theme": "السمة",
"lightTheme": "فاتح",
"darkTheme": "داكن",
"systemTheme": "النظام",
"verifyingRecoveryKey": "التحقق من مفتاح الاسترداد...",
"recoveryKeyVerified": "تم التحقق من مفتاح الاسترداد",
"recoveryKeySuccessBody": "رائع! مفتاح الاسترداد الخاص بك صالح. شكرا لك على التحقق.\n\nيرجى تذكر الاحتفاظ بنسخة احتياطية من مفتاح الاسترداد بشكل آمن.",
@@ -325,9 +318,6 @@
}
}
},
"manualSort": "مخصّص",
"mostFrequentlyUsed": "مستخدم بكثرة",
"mostRecentlyUsed": "مستخدمة مؤخراً",
"activeSessions": "الجلسات النشطة",
"somethingWentWrongPleaseTryAgain": "حدث خطأ ما، يرجى المحاولة مرة أخرى",
"thisWillLogYouOutOfThisDevice": "سيؤدي هذا إلى تسجيل خروجك من هذا الجهاز!",
@@ -360,7 +350,6 @@
"sigInBackupReminder": "يرجى تصدير الرموز الخاصة بك للتأكد من أن لديك نسخة احتياطية يمكنك استعادتها منها.",
"offlineModeWarning": "لقد اخترت المضي قدما بدون نسخ احتياطية. يرجى أخذ نسخ احتياطية يدوية للتأكد من سلامة الرموز الخاصة بك.",
"showLargeIcons": "إظهار أيقونات كبيرة",
"compactMode": "الوضع المضغوط",
"shouldHideCode": "إخفاء الرموز",
"doubleTapToViewHiddenCode": "يمكنك النقر مرتين على أي عنصر لعرض الرمز",
"focusOnSearchBar": "التركيز على البحث عند بدء التطبيق",
@@ -479,11 +468,5 @@
"pinLock": "قفل رقم التعريف الشخصي",
"enterPin": "أدخل رقم التعريف الشخصي",
"setNewPin": "عين رقم تعريف شخصي جديد",
"importFailureDescNew": "تعذر إعراب الملف المنتقى.",
"duplicateCodes": "رموز مكررة",
"noDuplicates": "✨ لا تكرارات",
"youveNoDuplicateCodesThatCanBeCleared": "ليس لديك رموز مكررة يمكن مسحها",
"deselectAll": "ألغِ تحديد الكل",
"selectAll": "حدد الكل",
"deleteDuplicates": "احذف التكرار"
"importFailureDescNew": "تعذر إعراب الملف المنتقى."
}

View File

@@ -88,8 +88,6 @@
"useRecoveryKey": "Usa la clau de recuperació",
"incorrectPasswordTitle": "Contrasenya incorrecta",
"welcomeBack": "Benvingut de nou!",
"emailAlreadyRegistered": "El correu electrònic ja està registrat.",
"emailNotRegistered": "El correu electrònic no està registrat.",
"madeWithLoveAtPrefix": "fet amb ❤️ a ",
"supportDevs": "Subscriu-te a <bold-green>ente</bold-green> per donar-nos suport",
"supportDiscount": "Usa el codi de descompte \"AUTH\" per obtenir un 10% de descompte el primer any",
@@ -504,13 +502,5 @@
"deselectAll": "Desselecciona-ho tot",
"selectAll": "Seleccionar-ho tot",
"deleteDuplicates": "Elimina duplicats",
"plainHTML": "HTML pla",
"tellUsWhatYouThink": "Digueu-nos què us sembla",
"dropReview": "Deixa una ressenya a l'App/Play Store",
"supportEnte": "Donar suport a <bold-green>ente</bold-green>",
"giveUsAStarOnGithub": "Dona'ns una estrella a Github",
"free5GB": "5 GB gratuïts a <bold-green>ente</bold-green> Photos",
"loginWithAuthAccount": "Inicieu sessió amb el vostre compte Auth",
"freeStorageOffer": "10% de descompte a <bold-green>ente</bold-green> photos",
"freeStorageOfferDescription": "Utilitzeu el codi \"AUTH\" per obtenir un 10% de descompte el primer any"
"plainHTML": "HTML pla"
}

View File

@@ -88,8 +88,6 @@
"useRecoveryKey": "Wiederherstellungsschlüssel verwenden",
"incorrectPasswordTitle": "Falsches Passwort",
"welcomeBack": "Willkommen zurück!",
"emailAlreadyRegistered": "E-Mail ist bereits registriert.",
"emailNotRegistered": "E-Mail-Adresse nicht registriert.",
"madeWithLoveAtPrefix": "gemacht mit ❤️ bei ",
"supportDevs": "Bei <bold-green>ente</bold-green> registrieren, um das Projekt zu unterstützen",
"supportDiscount": "Benutzen Sie den Rabattcode \"AUTH\" für 10 % Rabatt im ersten Jahr",
@@ -257,8 +255,6 @@
"areYouSureYouWantToLogout": "Sind sie sicher, dass sie sich ausloggen möchten?",
"yesLogout": "Ja ausloggen",
"exit": "Schließen",
"theme": "Theme",
"systemTheme": "System",
"verifyingRecoveryKey": "Verifiziere Wiederherstellungsschlüssel...",
"recoveryKeyVerified": "Wiederherstellungsschlüssel verifiziert",
"recoveryKeySuccessBody": "Großartig! Ihr Wiederherstellungsschlüssel ist gültig. Vielen Dank für die Verifizierung.\n\nBitte denken sie daran, dass sie ihren Wiederherstellungsschlüssel sicher aufbewahren.",
@@ -329,7 +325,6 @@
}
}
},
"manualSort": "Benutzerdefiniert",
"activeSessions": "Aktive Sitzungen",
"somethingWentWrongPleaseTryAgain": "Ein Fehler ist aufgetreten, bitte versuche es erneut",
"thisWillLogYouOutOfThisDevice": "Dadurch wirst du von diesem Gerät abgemeldet!",
@@ -483,9 +478,5 @@
"setNewPin": "Neue PIN festlegen",
"importFailureDescNew": "Die ausgewählte Datei konnte nicht verarbeitet werden.",
"appLockNotEnabled": "App-Sperre nicht aktiviert",
"appLockNotEnabledDescription": "Bitte aktivieren Sie die App-Sperre über Security > App-Sperre",
"duplicateCodes": "Doppelte Codes",
"noDuplicates": "✨ Keine Duplikate",
"deselectAll": "Alle abwählen",
"selectAll": "Alles auswählen"
"appLockNotEnabledDescription": "Bitte aktivieren Sie die App-Sperre über Security > App-Sperre"
}

View File

@@ -504,13 +504,5 @@
"deselectAll": "Deselect all",
"selectAll": "Select all",
"deleteDuplicates": "Delete duplicates",
"plainHTML": "Plain HTML",
"tellUsWhatYouThink": "Tell us what you think",
"dropReview": "Drop a review on the App/Play Store",
"supportEnte": "Support <bold-green>ente</bold-green>",
"giveUsAStarOnGithub": "Give us a star on Github",
"free5GB": "5GB free on <bold-green>ente</bold-green> Photos",
"loginWithAuthAccount": "Login with your Auth account",
"freeStorageOffer": "10% off on <bold-green>ente</bold-green> photos",
"freeStorageOfferDescription": "Use code \"AUTH\" to get 10% off first year"
"plainHTML": "Plain HTML"
}

View File

@@ -88,8 +88,6 @@
"useRecoveryKey": "Usar clave de recuperación",
"incorrectPasswordTitle": "Contraseña incorrecta",
"welcomeBack": "¡Te damos la bienvenida otra vez!",
"emailAlreadyRegistered": "Correo electrónico ya registrado.",
"emailNotRegistered": "Correo electrónico no registrado.",
"madeWithLoveAtPrefix": "hecho con ❤️ en ",
"supportDevs": "Suscríbase a <bold-green>ente</bold-green> para apoyar este proyecto",
"supportDiscount": "Utiliza el cupón promocional \"AUTH\" para obtener un 10% de descuento en el primer año",
@@ -504,12 +502,5 @@
"deselectAll": "Deseleccionar todo",
"selectAll": "Seleccionar todo",
"deleteDuplicates": "Eliminar duplicados",
"plainHTML": "HTML plano",
"tellUsWhatYouThink": "Cuéntanos cuál es su opinión",
"dropReview": "Danos una reseña en la App/Play Store",
"supportEnte": "Apoya a <bold-green>ente</bold-green>",
"giveUsAStarOnGithub": "Danos una estrella en GitHub",
"free5GB": "5 GB gratis en <bold-green>ente</bold-green> Fotos",
"freeStorageOffer": "10% de descuento en <bold-green>ente</bold-green> fotos",
"freeStorageOfferDescription": "Usa el cupón \"AUTH\" para obtener un 10% de descuento en el primer año"
"plainHTML": "HTML plano"
}

View File

@@ -504,13 +504,5 @@
"deselectAll": "Tout désélectionner",
"selectAll": "Tout sélectionner",
"deleteDuplicates": "Supprimer les doublons",
"plainHTML": "HTML Pur",
"tellUsWhatYouThink": "Dites-nous ce que vous pensez",
"dropReview": "Déposez un avis sur l'App/Play Store",
"supportEnte": "Soutenir <bold-green>Ente</bold-green>",
"giveUsAStarOnGithub": "Donnez-nous une étoile sur Github",
"free5GB": "5 Go gratuits sur <bold-green>Ente</bold-green> Photos",
"loginWithAuthAccount": "Connectez-vous avec votre compte Auth",
"freeStorageOffer": "10% de réduction sur <bold-green>Ente</bold-green> Photos",
"freeStorageOfferDescription": "Utilisez le code coupon \"AUTH\" pour obtenir 10% de réduction la première année"
"plainHTML": "HTML Pur"
}

View File

@@ -8,13 +8,13 @@
},
"onBoardingGetStarted": "प्रारंभ करें",
"setupFirstAccount": "अपना पहला अकाउंट सेटअप करें",
"importScanQrCode": "एक QR कोड स्कैन करें",
"importScanQrCode": "QR कोड स्कैन करें",
"qrCode": "QR कोड",
"importEnterSetupKey": "",
"importAccountPageTitle": "अकाउंट विवरण डालें",
"incorrectDetails": "ग़लत विवरण",
"pleaseVerifyDetails": "कृपया विवरण सत्यापित करें और पुनः प्रयास करें",
"codeIssuerHint": "ारीकर्ता",
"codeIssuerHint": "ारीकर्ता",
"codeSecretKeyHint": "सीक्रेट कुंजी",
"secret": "सीक्रेट",
"all": "सभी",
@@ -39,10 +39,6 @@
"pleaseLoginAgain": "कृपया फिर से लॉगिन करें",
"loggingOut": "लॉग आउट हो रहा है...",
"saveAction": "सेव करें",
"deleteCodeMessage": "क्या आप वाकई इस कोड को हटाना चाहते हैं? इस क्रिया को वापस नहीं किया जा सकता",
"trashCode": "?",
"trashCodeMessage": "क्या आप वाकई {account} के लिए कोड नष्ट करना चाहते हैं?",
"trash": "नष्ट करें",
"viewLogsAction": "लॉग देखें",
"preparingLogsTitle": "लॉग तैयार किये जा रहे हैं...",
"emailLogsTitle": "लॉग ईमेल करें",
@@ -54,7 +50,6 @@
}
}
},
"copyEmailAction": "ईमेल कॉपी करें",
"exportLogsAction": "लॉग एक्सपोर्ट करें",
"reportABug": "बग रिपोर्ट करें",
"reportBug": "बग रिपोर्ट करें",
@@ -84,24 +79,5 @@
"cancel": "रद्द करें",
"yes": "हाँ",
"no": "नहीं",
"settings": "सेटिंग",
"pleaseTryAgain": "कृपया पुन: प्रयास करें",
"newUser": "एंटे में नए उपयोगकर्ता",
"delete": "हटाएं",
"enterYourPasswordHint": "अपना पासवर्ड दर्ज करें",
"forgotPassword": "पासवर्ड भूल गए",
"oops": "ओह",
"suggestFeatures": "विशेषताएं सुझाएं",
"faq": "अक्सर किये गए सवाल",
"somethingWentWrongMessage": "कुछ गड़बड़ हुई है, कृपया दोबारा प्रयास करें",
"leaveFamily": "परिवार छोड़ें",
"leaveFamilyMessage": "क्या आप सच में परिवार प्लान छोड़ना चाहते हैं?",
"inFamilyPlanMessage": "आप परिवार प्लान पर हैं!",
"hintForMobile": "कोड को संपादित करने या हटाने के लिए उसे लंबी देर तक दबाए।",
"hintForDesktop": "कोड को संपादित करने या हटाने के लिए उस पर राइट क्लिक करें।",
"scan": "स्कैन करें",
"scanACode": "कोड स्कैन करें",
"verify": "सत्यापित करें",
"verifyEmail": "ईमेल सत्यापित करें",
"twoFactorAuthTitle": "दो-चरणीय प्रमाणीकरण |"
"settings": "सेटिंग"
}

View File

@@ -504,13 +504,5 @@
"deselectAll": "Összes kijelölés megszüntetése",
"selectAll": "Összes kijelölése",
"deleteDuplicates": "Ismétlődések törlése",
"plainHTML": "Sima HTML kód",
"tellUsWhatYouThink": "Mondja el mit gondol",
"dropReview": "Írjon véleményt az App/Play Store-ban",
"supportEnte": "Támogassa <bold-green>ente <bold-green>",
"giveUsAStarOnGithub": "Adj nekünk egy csillagot a Githubon",
"free5GB": "5GB ingyen <bold-green>ente <bold-green> Photos",
"loginWithAuthAccount": "Jelentkezzen be Auth fiókjával",
"freeStorageOffer": "10% kedvezmény on <bold-green>ente<bold-green> photos",
"freeStorageOfferDescription": "Használja az \"AUTH\" kódot, hogy 10% kedvezményt kapjon az első évben"
"plainHTML": "Sima HTML kód"
}

View File

@@ -88,8 +88,6 @@
"useRecoveryKey": "回復キーを使用",
"incorrectPasswordTitle": "パスワードが正しくありません",
"welcomeBack": "おかえりなさい!",
"emailAlreadyRegistered": "メールアドレスはすでに登録されています。",
"emailNotRegistered": "メールアドレスはまだ登録されていません。",
"madeWithLoveAtPrefix": "made with ❤️ at ",
"supportDevs": "プロジェクト支援のために <bold-green>ente</bold-green> に登録",
"supportDiscount": "クーポンコード \"AUTH\" の使用で初年度が 10% オフに",
@@ -260,10 +258,6 @@
"areYouSureYouWantToLogout": "本当にログアウトしてよろしいですか?",
"yesLogout": "はい、ログアウトします",
"exit": "やめる",
"theme": "テーマ",
"lightTheme": "ライト",
"darkTheme": "ダーク",
"systemTheme": "システム",
"verifyingRecoveryKey": "回復キーを確認中...",
"recoveryKeyVerified": "回復キーが確認されました",
"recoveryKeySuccessBody": "素晴らしい!回復キーは有効です。ご確認いただきありがとうございます。\n\n回復キーを安全にバックアップしておいてください。",
@@ -496,21 +490,5 @@
"appLockNotEnabled": "アプリロックが有効になっていません",
"appLockNotEnabledDescription": "セキュリティ > アプリロック からアプリロックを有効化してください",
"authToViewPasskey": "パスキーを見るには認証してください",
"appLockOfflineModeWarning": "バックアップなしで進むことを選択しました。アプリロックを忘れると、データにアクセスできなくなります。",
"duplicateCodes": "重複コード",
"noDuplicates": "✨ 重複なし",
"youveNoDuplicateCodesThatCanBeCleared": "削除できる重複コードはありません",
"deduplicateCodes": "重複コード",
"deselectAll": "すべての選択を解除",
"selectAll": "すべて選択",
"deleteDuplicates": "重複を削除",
"plainHTML": "Plain HTML",
"tellUsWhatYouThink": "ご意見をお聞かせください",
"dropReview": "App/Playストアにレビューを投稿する",
"supportEnte": "<bold-green>ente</bold-green>をサポートする",
"giveUsAStarOnGithub": "Githubで星をつける",
"free5GB": "<bold-green>ente</bold-green>フォトで5GB無料",
"loginWithAuthAccount": "認証アカウントでログイン",
"freeStorageOffer": "<bold-green>ente</bold-green>の写真が10%オフ",
"freeStorageOfferDescription": "クーポンコード \"AUTH\" の使用で初年度が10%オフになります"
"appLockOfflineModeWarning": "バックアップなしで進むことを選択しました。アプリロックを忘れると、データにアクセスできなくなります。"
}

View File

@@ -16,7 +16,7 @@
"secretCanNotBeEmpty": "Paslaptis negali būti tuščia.",
"bothIssuerAndAccountCanNotBeEmpty": "Tiek išdavėjas ir paskyra negali būti tušti.",
"incorrectDetails": "Neteisingi duomenys",
"pleaseVerifyDetails": "Patvirtinkite duomenis ir bandykite dar kartą.",
"pleaseVerifyDetails": "Patikrinkite duomenis ir bandykite dar kartą.",
"codeIssuerHint": "Išdavėjas",
"codeSecretKeyHint": "Slaptasis raktas",
"secret": "Paslaptis",
@@ -504,6 +504,5 @@
"deselectAll": "Naikinti visų pasirinkimą",
"selectAll": "Pasirinkti viską",
"deleteDuplicates": "Ištrinti dublikatus",
"plainHTML": "Grynasis HTML",
"freeStorageOfferDescription": "Naudokite kodą „AUTH“, kad gautumėte 10 % nuolaida pirmiesiems metams. "
"plainHTML": "Grynasis HTML"
}

View File

@@ -1,28 +1 @@
{
"blog": "ബ്ലോഗ്",
"verifyPassword": "പാസ്‌വേഡ് സ്ഥിരീകരിക്കുക",
"recreatePassword": "പാസ്‌വേഡ് പുനഃസൃഷ്ടിക്കുക",
"incorrectPasswordTitle": "തെറ്റായ പാസ്‌വേഡ്",
"welcomeBack": "വീണ്ടും സ്വാഗതം!",
"emailAlreadyRegistered": "ഇമെയിൽ ഇതിനകം രജിസ്റ്റർ ചെയ്തിട്ടുണ്ട്.",
"emailNotRegistered": "ഇമെയിൽ രജിസ്റ്റർ ചെയ്തിട്ടില്ല.",
"changeEmail": "ഇമെയിൽ മാറ്റുക",
"changePassword": "പാസ്സ്‌വേർഡ് മാറ്റുക",
"ok": "ശരി",
"cancel": "റദ്ദാക്കുക",
"yes": "അതെ",
"no": "അല്ല",
"email": "ഇമെയിൽ",
"somethingWentWrongMessage": "എന്തോ കുഴപ്പമുണ്ടായി, ദയവായി വീണ്ടും ശ്രമിക്കുക",
"inFamilyPlanMessage": "നിങ്ങൾ ഒരു ഫാമിലി പ്ലാനിലാണ്!",
"scan": "സ്കാൻ ചെയ്യുക",
"scanACode": "കോഡ് സ്കാൻ ചെയ്യുക",
"verify": "പരിശോധിക്കുക",
"verifyEmail": "ഇമെയിൽ സ്ഥിരീകരിക്കുക",
"enterCodeHint": "നിങ്ങളുടെ ഓതന്റിക്കേറ്റർ ആപ്പിൽ നിന്നുള്ള 6 അക്ക കോഡ് നൽകുക",
"twoFactorAuthTitle": "ടു-ഫാക്ടർ ആധികാരികത",
"createNewAccount": "പുതിയ അക്കൗണ്ട് സൃഷ്ടിക്കുക",
"confirmPassword": "പാസ്വേഡ് സ്ഥിരീകരിക്കുക",
"language": "ഭാഷ",
"security": "സുരക്ഷ"
}
{}

View File

@@ -504,13 +504,5 @@
"deselectAll": "Alles deselecteren",
"selectAll": "Alles selecteren",
"deleteDuplicates": "Dubbelen verwijderen",
"plainHTML": "Alleen HTML",
"tellUsWhatYouThink": "Vertel ons wat je vindt",
"dropReview": "Laat een beoordeling achter in de App/Play Store",
"supportEnte": "Steun <bold-green>ente</bold-green>",
"giveUsAStarOnGithub": "Geef ons een ster op Github",
"free5GB": "5GB gratis op <bold-green>ente</bold-green> Photos",
"loginWithAuthAccount": "Log in met je Auth account",
"freeStorageOffer": "10% korting op <bold-green>ente</bold-green> photos",
"freeStorageOfferDescription": "Gebruik de code \"AUTH\" voor 10% korting op je eerste jaar"
"plainHTML": "Alleen HTML"
}

View File

@@ -504,13 +504,5 @@
"deselectAll": "Odznacz wszystko",
"selectAll": "Zaznacz wszystko",
"deleteDuplicates": "Usuń duplikaty",
"plainHTML": "Zwykły HTML",
"tellUsWhatYouThink": "Wyraź swoją opinię",
"dropReview": "Napisz recenzję w App Store/Play Store",
"supportEnte": "Wesprzyj <bold-green>ente</bold-green>",
"giveUsAStarOnGithub": "Daj nam gwiazdkę na Githubie",
"free5GB": "5 GB za darmo na zdjęcia <bold-green>ente</bold-green>",
"loginWithAuthAccount": "Zaloguj się przy użyciu konta Auth",
"freeStorageOffer": "10% zniżki na zdjęcia <bold-green>ente</bold-green>",
"freeStorageOfferDescription": "Użyj kodu „AUTH”, aby uzyskać 10% zniżki na pierwszy rok"
"plainHTML": "Zwykły HTML"
}

View File

@@ -6,7 +6,7 @@
"@counterAppBarTitle": {
"description": "Text shown in the AppBar of the Counter Page"
},
"onBoardingBody": "Salve com segurança seus códigos 2FA",
"onBoardingBody": "Copie com segurança seus códigos 2FA",
"onBoardingGetStarted": "Introdução",
"setupFirstAccount": "Configure sua primeira conta",
"importScanQrCode": "Escanear QR code",
@@ -19,7 +19,7 @@
"pleaseVerifyDetails": "Verifique os detalhes e tente novamente",
"codeIssuerHint": "Emissor",
"codeSecretKeyHint": "Chave secreta",
"secret": "Chave secreta",
"secret": "Segredo",
"all": "Todos",
"notes": "Notas",
"notesLengthLimit": "Notas tem um limite de até {count} caracteres",
@@ -504,13 +504,5 @@
"deselectAll": "Deselecionar tudo",
"selectAll": "Selecionar tudo",
"deleteDuplicates": "Excluir duplicados",
"plainHTML": "HTML simples",
"tellUsWhatYouThink": "Diga-nos o que pensa",
"dropReview": "Deixe uma avaliação na App/Play Store",
"supportEnte": "Apoie o <bold-green>ente.io</bold-green>",
"giveUsAStarOnGithub": "Dê-nos uma estrela no Github",
"free5GB": "5GB grátis no <bold-green>ente</bold-green> Photos",
"loginWithAuthAccount": "Registrar-se com sua conta Auth",
"freeStorageOffer": "10% de desconto no <bold-green>ente</bold-green> photos",
"freeStorageOfferDescription": "Use o cupom \"AUTH\" para obter 10% de desconto no primeiro ano"
"plainHTML": "HTML simples"
}

View File

@@ -88,8 +88,6 @@
"useRecoveryKey": "Использовать ключ восстановления",
"incorrectPasswordTitle": "Неправильный пароль",
"welcomeBack": "С возвращением!",
"emailAlreadyRegistered": "Адрес электронной почты уже зарегистрирован.",
"emailNotRegistered": "Адрес электронной почты не зарегистрирован.",
"madeWithLoveAtPrefix": "сделана с ❤️ в ",
"supportDevs": "Подпишитесь на <bold-green>ente</bold-green> для поддержки нашего проекта",
"supportDiscount": "Используйте код скидки \"AUTH\", чтобы получить скидку 10% на первый год",
@@ -259,10 +257,6 @@
"areYouSureYouWantToLogout": "Вы уверены, что хотите выйти?",
"yesLogout": "Да, выйти",
"exit": "Выйти",
"theme": "Тема",
"lightTheme": "Светлая",
"darkTheme": "Тёмная",
"systemTheme": "Системная",
"verifyingRecoveryKey": "Проверка ключа восстановления...",
"recoveryKeyVerified": "Ключ восстановления подтвержден",
"recoveryKeySuccessBody": "Отлично! Ваш ключ восстановления действителен. Спасибо за проверку.\n\nПожалуйста, не забудьте сохранить ключ восстановления безопасно.",
@@ -333,7 +327,6 @@
}
}
},
"mostRecentlyUsed": "Недавно использованные",
"activeSessions": "Активные сеансы",
"somethingWentWrongPleaseTryAgain": "Что-то пошло не так. Попробуйте еще раз",
"thisWillLogYouOutOfThisDevice": "Вы выйдете из этого устройства!",
@@ -489,9 +482,5 @@
"appLockNotEnabled": "Блокировка приложения отключена",
"appLockNotEnabledDescription": "Пожалуйста, включите блокировку приложения в безопасности > Блокировка приложений",
"authToViewPasskey": "Пожалуйста, авторизуйтесь, чтобы просмотреть пароль",
"appLockOfflineModeWarning": "Вы решили продолжить работу без резервного копирования. Если вы забудете свой пароль, доступ к вашим данным будет заблокирован.",
"duplicateCodes": "Дублировать коды",
"noDuplicates": "✨ Дубликатов нет",
"selectAll": "Выбрать все",
"plainHTML": "Обычный HTML"
"appLockOfflineModeWarning": "Вы решили продолжить работу без резервного копирования. Если вы забудете свой пароль, доступ к вашим данным будет заблокирован."
}

View File

@@ -88,8 +88,6 @@
"useRecoveryKey": "Kurtarma anahtarını kullan",
"incorrectPasswordTitle": "Yanlış şifre",
"welcomeBack": "Tekrar hoş geldiniz!",
"emailAlreadyRegistered": "E-posta zaten kayıtlı.",
"emailNotRegistered": "E-posta kayıtlı değil.",
"madeWithLoveAtPrefix": "❤️ ile şurada yapılmıştır ",
"supportDevs": "Bu projeyi desteklemek için <bold-green>ente</bold-green> kanalına abone olun",
"supportDiscount": "İlk yılda %10 indirim için \"AUTH\" kupon kodunu kullanın",
@@ -335,7 +333,6 @@
}
},
"manualSort": "Özel",
"editOrder": "Sıralamayı düzenle",
"mostFrequentlyUsed": "Sık kullanılan",
"mostRecentlyUsed": "Son kullanılan",
"activeSessions": "Aktif oturumlar",
@@ -504,6 +501,5 @@
"deselectAll": "Tümünün seçimini kaldır",
"selectAll": "Tümünü seç",
"deleteDuplicates": "Yinelenenleri sil",
"plainHTML": "Sade HTML",
"supportEnte": "<bold-Green>Ente</bold-Green>'yi destekle"
"plainHTML": "Sade HTML"
}

View File

@@ -504,13 +504,5 @@
"deselectAll": "取消全选",
"selectAll": "全选",
"deleteDuplicates": "删除重复项",
"plainHTML": "Plain HTML",
"tellUsWhatYouThink": "告诉我们您的想法",
"dropReview": "在 App Store/Play 商店上发表评测",
"supportEnte": "支持 <bold-green>ente</bold-green>",
"giveUsAStarOnGithub": "在 Github 上给我们一个星标",
"free5GB": "<bold-green>ente</bold-green> Photos 上 5GB 可用空间",
"loginWithAuthAccount": "使用您的认证账户登录",
"freeStorageOffer": "购买 <bold-green>ente</bold-green> Photos 可享受 10% 优惠",
"freeStorageOfferDescription": "使用优惠码“AUTH”可享受首年 10% 折扣"
"plainHTML": "Plain HTML"
}

View File

@@ -23,7 +23,6 @@ class PreferenceService {
static const kShouldAutoFocusOnSearchBar = "should_auto_focus_on_search_bar";
static const kShouldMinimizeOnCopy = "should_minimize_on_copy";
static const kCompactMode = "vi.compactMode";
static const kAppInstallTime = "appInstallTime";
Future<void> init() async {
_prefs = await SharedPreferences.getInstance();
@@ -104,14 +103,4 @@ class PreferenceService {
Future<void> setShouldMinimizeOnCopy(bool value) async {
await _prefs.setBool(kShouldMinimizeOnCopy, value);
}
int getAppInstalledTime() {
if (_prefs.containsKey(kAppInstallTime)) {
return _prefs.getInt(kAppInstallTime)!;
} else {
int installedTimeinMillis = DateTime.now().millisecondsSinceEpoch;
_prefs.setInt(kAppInstallTime, installedTimeinMillis).ignore();
return installedTimeinMillis;
}
}
}

View File

@@ -877,7 +877,6 @@ class UserService {
"twoFactorType": twoFactorTypeToString(type),
},
);
await dialog.hide();
if (response.statusCode == 200) {
// ignore: unawaited_futures
Navigator.of(context).pushAndRemoveUntil(
@@ -975,7 +974,6 @@ class UserService {
"twoFactorType": twoFactorTypeToString(type),
},
);
await dialog.hide();
if (response.statusCode == 200) {
showShortToast(
context,

View File

@@ -6,7 +6,7 @@ import 'package:shared_preferences/shared_preferences.dart';
import 'package:window_manager/window_manager.dart';
class WindowListenerService {
static const double minWindowHeight = 600.0;
static const double minWindowHeight = 320.0;
static const double minWindowWidth = 800.0;
static const double maxWindowHeight = 8192.0;
static const double maxWindowWidth = 8192.0;

View File

@@ -33,14 +33,12 @@ class CodeWidget extends StatefulWidget {
final Code code;
final bool isCompactMode;
final CodeSortKey? sortKey;
final bool isReordering;
const CodeWidget(
this.code, {
super.key,
required this.isCompactMode,
this.sortKey,
this.isReordering = false,
});
@override
@@ -224,27 +222,25 @@ class _CodeWidgetState extends State<CodeWidget> {
);
}
: null,
onLongPress: widget.isReordering
? null
: () {
showModalBottomSheet(
context: context,
builder: (_) {
return BottomActionBarWidget(
code: widget.code,
showPin: !ignorePin,
onEdit: () => _onEditPressed(true),
onShare: () => _onSharePressed(true),
onPin: () => _onPinPressed(true),
onTrashed: () => _onTrashPressed(true),
onDelete: () => _onDeletePressed(true),
onRestore: () => _onRestoreClicked(true),
onShowQR: () => _onShowQrPressed(true),
onCancel: () => Navigator.of(context).pop(),
);
},
);
},
onLongPress: () {
showModalBottomSheet(
context: context,
builder: (_) {
return BottomActionBarWidget(
code: widget.code,
showPin: !ignorePin,
onEdit: () => _onEditPressed(true),
onShare: () => _onSharePressed(true),
onPin: () => _onPinPressed(true),
onTrashed: () => _onTrashPressed(true),
onDelete: () => _onDeletePressed(true),
onRestore: () => _onRestoreClicked(true),
onShowQR: () => _onShowQrPressed(true),
onCancel: () => Navigator.of(context).pop(),
);
},
);
},
child: getCardContents(l10n),
),
),
@@ -651,8 +647,8 @@ class _CodeWidgetState extends State<CodeWidget> {
firstButtonOnTap: () async {
try {
await CodeStore.instance.removeCode(widget.code);
} catch (e, s) {
logger.severe('Failed to delete code', e, s);
} catch (e,s) {
logger.severe('Failed to delete code',e,s);
showGenericErrorDialog(context: context, error: e).ignore();
}
},

View File

@@ -1,11 +1,8 @@
import 'package:dotted_border/dotted_border.dart';
import 'package:ente_auth/services/update_service.dart';
import 'package:ente_auth/theme/ente_theme.dart';
import 'package:ente_auth/utils/platform_util.dart';
import 'package:flutter/material.dart';
import 'package:styled_text/tags/styled_text_tag.dart';
import 'package:styled_text/widgets/styled_text.dart';
import 'package:url_launcher/url_launcher.dart';
enum BannerType {
rateUs,
@@ -37,19 +34,9 @@ class BannerWidget extends StatelessWidget {
Color dashColor;
List<BoxShadow>? boxShadow;
String imagePath;
Uri? url;
final result = UpdateService.instance.getRateDetails();
final String rateUrl = result.item2;
switch (type) {
case BannerType.rateUs:
if (PlatformUtil.isMobile()) {
url = Uri.parse(rateUrl);
} else if (PlatformUtil.isDesktop()) {
url = Uri.parse(
"https://play.google.com/store/apps/details?id=io.ente.auth",
);
}
imagePath = "assets/rate_us.png";
dashColor = const Color.fromRGBO(255, 191, 12, 1);
boxShadow = [
@@ -64,9 +51,7 @@ class BannerWidget extends StatelessWidget {
),
];
break;
case BannerType.starUs:
url = Uri.parse("https://github.com/ente-io/ente");
imagePath = "assets/star_us.png";
dashColor = const Color.fromRGBO(233, 233, 233, 1);
boxShadow = [
@@ -80,7 +65,6 @@ class BannerWidget extends StatelessWidget {
blurRadius: 25,
),
];
break;
case BannerType.freeStorage:
imagePath = "assets/ente_5gb.png";
@@ -96,8 +80,6 @@ class BannerWidget extends StatelessWidget {
blurRadius: 25,
),
];
break;
case BannerType.discount:
dashColor = const Color.fromRGBO(29, 185, 84, 1);
imagePath = "assets/discount.png";
@@ -112,89 +94,83 @@ class BannerWidget extends StatelessWidget {
blurRadius: 25,
),
];
break;
}
return GestureDetector(
onTap: () {
url != null ? launchUrl(url) : null;
},
child: ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(50)),
child: DottedBorder(
borderType: BorderType.RRect,
radius: const Radius.circular(50),
dashPattern: const <double>[3, 3],
color: dashColor,
child: Stack(
children: [
if (BannerType.starUs == type)
Positioned(
right: 0,
top: 0,
bottom: 0,
child: ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(50)),
child: isLightMode
? Image.asset("assets/calender_banner_light.png")
: Image.asset("assets/calender_banner_dark.png"),
),
return ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(50)),
child: DottedBorder(
borderType: BorderType.RRect,
radius: const Radius.circular(50),
dashPattern: const <double>[3, 3],
color: dashColor,
child: Stack(
children: [
if (BannerType.starUs == type)
Positioned(
right: 0,
top: 0,
bottom: 0,
child: ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(50)),
child: isLightMode
? Image.asset("assets/calender_banner_light.png")
: Image.asset("assets/calender_banner_dark.png"),
),
Row(
children: [
Stack(
alignment: Alignment.center,
children: [
if (!isLightMode)
Container(
height: 80,
width: 80,
decoration: BoxDecoration(
shape: BoxShape.circle,
boxShadow: boxShadow,
),
),
Row(
children: [
Stack(
alignment: Alignment.center,
children: [
if (!isLightMode)
Container(
height: 80,
width: 80,
decoration: BoxDecoration(
shape: BoxShape.circle,
boxShadow: boxShadow,
),
Padding(
padding: const EdgeInsets.all(10.0),
child: SizedBox(
height: 60,
width: 60,
child: Image.asset(imagePath),
),
Padding(
padding: const EdgeInsets.all(10.0),
child: SizedBox(
height: 60,
width: 60,
child: Image.asset(imagePath),
),
),
],
),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
StyledText(
text: text,
style: getEnteTextTheme(context).large,
textAlign: TextAlign.left,
tags: {
'bold-green': StyledTextTag(
style: TextStyle(
fontWeight: FontWeight.bold,
color: colorScheme.primaryGreen,
),
),
},
),
const SizedBox(height: 5),
Text(
subText ?? "",
textAlign: TextAlign.left,
style: const TextStyle(
color: Colors.grey,
),
),
],
),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
StyledText(
text: text,
style: getEnteTextTheme(context).large,
textAlign: TextAlign.left,
tags: {
'bold-green': StyledTextTag(
style: TextStyle(
fontWeight: FontWeight.bold,
color: colorScheme.primaryGreen,
),
),
},
),
const SizedBox(height: 5),
Text(
subText ?? "",
textAlign: TextAlign.left,
style: const TextStyle(
color: Colors.grey,
),
),
],
),
),
],
),
],
),
),
],
),
],
),
),
);

View File

@@ -90,7 +90,6 @@ class _ReorderCodesPageState extends State<ReorderCodesPage> {
key: ValueKey(code.generatedID),
code,
isCompactMode: isCompactMode,
isReordering: true,
),
),
],

View File

@@ -1,111 +0,0 @@
import 'package:ente_auth/core/configuration.dart';
import 'package:ente_auth/l10n/l10n.dart';
import 'package:ente_auth/models/user_details.dart';
import 'package:ente_auth/services/preference_service.dart';
import 'package:ente_auth/services/user_service.dart';
import 'package:ente_auth/ui/components/banner_widget.dart';
import 'package:flutter/material.dart';
class NotificationBannerWidget extends StatelessWidget {
const NotificationBannerWidget({super.key});
@override
Widget build(BuildContext context) {
List<Widget> contents = [];
const sectionSpacing = SizedBox(height: 14);
final currentTime = DateTime.now();
final appInstallTime = PreferenceService.instance.getAppInstalledTime();
final differenceInDays = currentTime
.difference(DateTime.fromMillisecondsSinceEpoch(appInstallTime))
.inDays;
final l10n = context.l10n;
if (Configuration.instance.hasConfiguredAccount()) {
return FutureBuilder<UserDetails>(
future: UserService.instance.getUserDetailsV2(),
builder: (context, snapshot) {
if (snapshot.hasData) {
final userDetails = snapshot.data;
if (differenceInDays >= 0 && differenceInDays <= 3) {
return const SizedBox.shrink();
} else if (differenceInDays >= 4 && differenceInDays <= 7) {
contents.clear();
contents.addAll(
[
BannerWidget(
text: l10n.tellUsWhatYouThink,
subText: l10n.dropReview,
type: BannerType.rateUs,
),
sectionSpacing,
BannerWidget(
text: l10n.supportEnte,
subText: l10n.giveUsAStarOnGithub,
type: BannerType.starUs,
),
],
);
return buildWidget(context, contents);
} else if (differenceInDays >= 7 && differenceInDays <= 30) {
if (userDetails?.usage == 0) {
contents.clear();
contents.addAll(
[
BannerWidget(
text: l10n.free5GB,
subText: l10n.loginWithAuthAccount,
type: BannerType.freeStorage,
),
],
);
} else if (userDetails!.usage < 5 * 1024 * 1024 * 1024 ||
userDetails.subscription.productID == 'free') {
contents.addAll(
[
BannerWidget(
text: l10n.freeStorageOffer,
subText: l10n.freeStorageOfferDescription,
type: BannerType.discount,
),
],
);
}
return buildWidget(context, contents);
}
}
return const SizedBox.shrink();
},
);
} else {
if (differenceInDays >= 4 && differenceInDays <= 7) {
contents.clear();
contents.addAll(
[
BannerWidget(
text: l10n.tellUsWhatYouThink,
subText: l10n.dropReview,
type: BannerType.rateUs,
),
sectionSpacing,
BannerWidget(
text: l10n.supportEnte,
subText: l10n.giveUsAStarOnGithub,
type: BannerType.starUs,
),
],
);
}
return buildWidget(context, contents);
}
}
Widget buildWidget(
BuildContext context,
List<Widget> contents,
) {
return Column(
children: contents,
);
}
}

View File

@@ -18,9 +18,9 @@ import 'package:ente_auth/ui/settings/data/data_section_widget.dart';
import 'package:ente_auth/ui/settings/data/export_widget.dart';
import 'package:ente_auth/ui/settings/developer_settings_widget.dart';
import 'package:ente_auth/ui/settings/general_section_widget.dart';
import 'package:ente_auth/ui/settings/notification_banner_widget.dart';
import 'package:ente_auth/ui/settings/security_section_widget.dart';
import 'package:ente_auth/ui/settings/social_section_widget.dart';
import 'package:ente_auth/ui/settings/support_dev_widget.dart';
import 'package:ente_auth/ui/settings/support_section_widget.dart';
import 'package:ente_auth/ui/settings/theme_switch_widget.dart';
import 'package:ente_auth/ui/settings/title_bar_widget.dart';
@@ -162,7 +162,7 @@ class SettingsPage extends StatelessWidget {
const AboutSectionWidget(),
const AppVersionWidget(),
const DeveloperSettingsWidget(),
const NotificationBannerWidget(),
const SupportDevWidget(),
const Padding(
padding: EdgeInsets.only(bottom: 60),
),

View File

@@ -33,7 +33,8 @@ class _LockScreenState extends State<LockScreen> with WidgetsBindingObserver {
int remainingTimeInSeconds = 0;
final _lockscreenSetting = LockScreenSettings.instance;
late Brightness _platformBrightness;
final bool isLoggedIn = Configuration.instance.isLoggedIn();
final bool hasOptedForOfflineMode =
Configuration.instance.hasOptedForOfflineMode();
@override
void initState() {
@@ -55,15 +56,15 @@ class _LockScreenState extends State<LockScreen> with WidgetsBindingObserver {
return Scaffold(
appBar: AppBar(
elevation: 0,
leading: isLoggedIn
? IconButton(
leading: hasOptedForOfflineMode
? const SizedBox.shrink()
: IconButton(
icon: const Icon(Icons.logout_outlined),
color: Theme.of(context).iconTheme.color,
onPressed: () {
_onLogoutTapped(context);
},
)
: const SizedBox.shrink(),
),
),
body: GestureDetector(
onTap: () {

View File

@@ -1,7 +1,6 @@
import 'package:ente_auth/l10n/l10n.dart';
import 'package:ente_auth/models/account/two_factor.dart';
import 'package:ente_auth/services/user_service.dart';
import 'package:ente_auth/theme/ente_theme.dart';
import 'package:ente_auth/utils/email_util.dart';
import 'package:flutter/material.dart';
@@ -98,8 +97,7 @@ class _TwoFactorRecoveryPageState extends State<TwoFactorRecoveryPage> {
style: TextStyle(
decoration: TextDecoration.underline,
fontSize: 12,
color:
getEnteColorScheme(context).textBase.withOpacity(0.9),
color: Colors.white.withOpacity(0.9),
),
),
),

View File

@@ -27,6 +27,8 @@ PODS:
- path_provider_foundation (0.0.1):
- Flutter
- FlutterMacOS
- rive_common (0.0.1):
- FlutterMacOS
- screen_retriever (0.0.1):
- FlutterMacOS
- Sentry/HybridSDK (8.36.0)
@@ -82,6 +84,7 @@ DEPENDENCIES:
- local_auth_darwin (from `Flutter/ephemeral/.symlinks/plugins/local_auth_darwin/darwin`)
- package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`)
- path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`)
- rive_common (from `Flutter/ephemeral/.symlinks/plugins/rive_common/macos`)
- screen_retriever (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever/macos`)
- sentry_flutter (from `Flutter/ephemeral/.symlinks/plugins/sentry_flutter/macos`)
- share_plus (from `Flutter/ephemeral/.symlinks/plugins/share_plus/macos`)
@@ -124,6 +127,8 @@ EXTERNAL SOURCES:
:path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos
path_provider_foundation:
:path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin
rive_common:
:path: Flutter/ephemeral/.symlinks/plugins/rive_common/macos
screen_retriever:
:path: Flutter/ephemeral/.symlinks/plugins/screen_retriever/macos
sentry_flutter:
@@ -159,6 +164,7 @@ SPEC CHECKSUMS:
OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
package_info_plus: fa739dd842b393193c5ca93c26798dff6e3d0e0c
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
rive_common: 9580b9f1f08a8c85006083078e80479edf3db26a
screen_retriever: 59634572a57080243dd1bf715e55b6c54f241a38
Sentry: f8374b5415bc38dfb5645941b3ae31230fbeae57
sentry_flutter: 0eb93e5279eb41e2392212afe1ccd2fecb4f8cbe

View File

@@ -5,15 +5,15 @@ packages:
dependency: transitive
description:
name: _fe_analyzer_shared
sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834
sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab"
url: "https://pub.dev"
source: hosted
version: "72.0.0"
version: "76.0.0"
_macros:
dependency: transitive
description: dart
source: sdk
version: "0.3.2"
version: "0.3.3"
adaptive_theme:
dependency: "direct main"
description:
@@ -26,10 +26,10 @@ packages:
dependency: transitive
description:
name: analyzer
sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139
sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e"
url: "https://pub.dev"
source: hosted
version: "6.7.0"
version: "6.11.0"
ansicolor:
dependency: transitive
description:
@@ -250,10 +250,10 @@ packages:
dependency: "direct main"
description:
name: collection
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf
url: "https://pub.dev"
source: hosted
version: "1.18.0"
version: "1.19.0"
confetti:
dependency: "direct main"
description:
@@ -434,11 +434,12 @@ packages:
figma_squircle:
dependency: "direct main"
description:
name: figma_squircle
sha256: "790b91a9505e90d246f6efe2fa065ff7fffe658c7b44fe9b5b20c7b0ad3818c0"
url: "https://pub.dev"
source: hosted
version: "0.5.3"
path: "."
ref: HEAD
resolved-ref: "5f1ad5aaccdf31fc398fc141979ea845a0f45383"
url: "https://github.com/Ax0elz/figma_squircle.git"
source: git
version: "0.5.5"
file:
dependency: transitive
description:
@@ -913,18 +914,18 @@ packages:
dependency: transitive
description:
name: leak_tracker
sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06"
url: "https://pub.dev"
source: hosted
version: "10.0.5"
version: "10.0.7"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379"
url: "https://pub.dev"
source: hosted
version: "3.0.5"
version: "3.0.8"
leak_tracker_testing:
dependency: transitive
description:
@@ -993,10 +994,10 @@ packages:
dependency: transitive
description:
name: macros
sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536"
sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656"
url: "https://pub.dev"
source: hosted
version: "0.1.2-main.4"
version: "0.1.3-main.0"
matcher:
dependency: transitive
description:
@@ -1425,7 +1426,7 @@ packages:
dependency: transitive
description: flutter
source: sdk
version: "0.0.99"
version: "0.0.0"
sodium:
dependency: transitive
description:
@@ -1519,10 +1520,10 @@ packages:
dependency: transitive
description:
name: stack_trace
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377"
url: "https://pub.dev"
source: hosted
version: "1.11.1"
version: "1.12.0"
steam_totp:
dependency: "direct main"
description:
@@ -1559,10 +1560,10 @@ packages:
dependency: transitive
description:
name: string_scanner
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3"
url: "https://pub.dev"
source: hosted
version: "1.2.0"
version: "1.3.0"
styled_text:
dependency: "direct main"
description:
@@ -1591,10 +1592,10 @@ packages:
dependency: transitive
description:
name: test_api
sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c"
url: "https://pub.dev"
source: hosted
version: "0.7.2"
version: "0.7.3"
timezone:
dependency: transitive
description:
@@ -1759,10 +1760,10 @@ packages:
dependency: transitive
description:
name: vm_service
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b
url: "https://pub.dev"
source: hosted
version: "14.2.5"
version: "14.3.0"
watcher:
dependency: transitive
description:

View File

@@ -1,7 +1,7 @@
name: ente_auth
description: ente two-factor authenticator
version: 4.3.2+432
version: 4.3.1+431
publish_to: none
environment:
@@ -32,7 +32,9 @@ dependencies:
expandable: ^5.0.1
expansion_tile_card: ^3.0.0
ffi: ^2.1.0
figma_squircle: ^0.5.3
figma_squircle:
git:
url: https://github.com/Ax0elz/figma_squircle.git
file_picker: ^8.1.7
# https://github.com/incrediblezayed/file_saver/issues/86
file_saver: ^0.2.11

View File

@@ -10,7 +10,7 @@ DefaultDirName={{INSTALL_DIR_NAME}}
DisableProgramGroupPage=yes
OutputDir=.
OutputBaseFilename={{OUTPUT_BASE_FILENAME}}
Compression=zip
Compression=lzma
SolidCompression=yes
SetupIconFile={{SETUP_ICON_FILE}}
WizardStyle=modern

View File

@@ -15,7 +15,7 @@ import (
"strings"
)
var AppVersion = "0.2.3"
var AppVersion = "0.2.2"
func main() {
cliConfigDir, err := GetCLIConfigDir()
@@ -50,21 +50,18 @@ func main() {
}
}
// Define a set of commands that do not require KeyHolder or cli initialisation.
skipInitCommands := map[string]struct{}{"version": {}, "docs": {}, "help": {}}
// Define a set of commands that do not require KeyHolder initialisation.
skipKeyHolderCommands := map[string]struct{}{"version": {}, "docs": {}, "help": {}}
var keyHolder *secrets.KeyHolder
// Only initialise KeyHolder if the command isn't in the skip list.
shouldInit := len(os.Args) > 1
if len(os.Args) > 1 {
if _, skip := skipInitCommands[os.Args[1]]; skip {
shouldInit = false
if _, skip := skipKeyHolderCommands[os.Args[1]]; !skip {
keyHolder = secrets.NewKeyHolder(secrets.GetOrCreateClISecret())
}
}
if shouldInit {
keyHolder = secrets.NewKeyHolder(secrets.GetOrCreateClISecret())
}
ctrl := pkg.ClICtrl{
Client: api.NewClient(api.Params{
Debug: viper.GetBool("log.http"),
@@ -74,10 +71,16 @@ func main() {
KeyHolder: keyHolder,
}
if len(os.Args) == 1 {
// If no arguments are passed, show help
os.Args = append(os.Args, "help")
err = ctrl.Init()
if err != nil {
panic(err)
}
defer func() {
if err := db.Close(); err != nil {
panic(err)
}
}()
if len(os.Args) == 2 && os.Args[1] == "docs" {
log.Println("Generating docs")
err = cmd.GenerateDocs()
@@ -86,16 +89,9 @@ func main() {
}
return
}
if shouldInit {
err = ctrl.Init()
if err != nil {
panic(err)
}
defer func() {
if err := db.Close(); err != nil {
panic(err)
}
}()
if len(os.Args) == 1 {
// If no arguments are passed, show help
os.Args = append(os.Args, "help")
}
if os.Args[1] == "version" && viper.GetString("endpoint.api") != constants.EnteApiUrl {
log.Printf("Custom endpoint: %s\n", viper.GetString("endpoint.api"))
@@ -124,10 +120,10 @@ func initConfig(cliConfigDir string) {
func GetCLIConfigDir() (string, error) {
var configDir = os.Getenv("ENTE_CLI_CONFIG_DIR")
if configDir == "" {
// for backward compatibility, check for ENTE_CLI_CONFIG_PATH
configDir = os.Getenv("ENTE_CLI_CONFIG_PATH")
}
if configDir == "" {
// for backward compatibility, check for ENTE_CLI_CONFIG_PATH
configDir = os.Getenv("ENTE_CLI_CONFIG_PATH")
}
if configDir != "" {
// remove trailing slash (for all OS)

6
desktop/.gitignore vendored
View File

@@ -21,9 +21,5 @@ out
# electron-builder
dist/
# Legacy, people who checked out main for a brief while in Jan 2025 may have
# this. Can be removed in the future.
build/magick*
# We download it on demand, if needed for the particular OS/arch.
build/vips*
build/magick*

View File

@@ -1,15 +1,9 @@
# CHANGELOG
## v1.7.10 (Unreleased)
## v1.7.9 (Unreleased)
- .
## v1.7.9
- Light mode.
- Faster and more stable thumbnail generation.
- Support `.supplemental-metadata` JSON files in Google Takeout.
## v1.7.8
- Parse description from image metadata.

View File

@@ -38,8 +38,8 @@
</branding>
<releases>
<release version="1.7" date="2025-01-13">
<url type="details">https://github.com/ente-io/photos-desktop/releases</url>
<release version="1.7.8" date="2025-01-13">
<url type="details">https://github.com/ente-io/photos-desktop/releases/tag/v1.7.8</url>
</release>
</releases>
</component>

View File

@@ -108,13 +108,13 @@ For video conversions and metadata extraction, we use ffmpeg. To bundle a
[ffmpeg-static](https://github.com/eugeneware/ffmpeg-static).
> There is a significant (~20x) speed difference between using the compiled
> FFmpeg binary and using the Wasm one (that our renderer process already has).
> ffmpeg binary and using the wasm one (that our renderer process already has).
> Which is why we bundle it to speed up operations on the desktop app.
On Linux and Windows, we use `vips` for thumbnail generation and JPEG conversion
of unpreviewable images. A static OS/architecture specific binary of this is
bundled in our extra resources (`build`) folder by `scripts/vips.sh` and/or
`scripts/beforeBuild.js`. See "[Note: vips]" for more details.
On Linux and Windows, we use ImageMagick for thumbnail generation and JPEG
conversion of unpreviewable images. A static OS/architecture specific binary of
this is bundled in our extra resources (`build`) folder by `scripts/magick.sh`
and/or `scripts/beforeBuild.js`. See "[Note: ImageMagick]" for more details.
On macOS, we use the `sips` CLI tool for these tasks, but that is already
available on the host machine, and is not bundled with our app.

View File

@@ -1,6 +1,6 @@
{
"name": "ente",
"version": "1.7.10-beta",
"version": "1.7.9-beta",
"private": true,
"description": "Desktop client for Ente Photos",
"repository": "github:ente-io/photos-desktop",
@@ -19,7 +19,7 @@
"postinstall": "electron-builder install-app-deps",
"lint": "yarn prettier --check --log-level warn . && yarn eslint && yarn tsc",
"lint-fix": "yarn prettier --write --log-level warn . && yarn eslint && yarn tsc",
"prepare": "node scripts/vips.js"
"prepare": "node scripts/magick.js"
},
"resolutions": {
"jackspeak": "2.1.1"
@@ -31,9 +31,9 @@
"clip-bpe-js": "^0.0.6",
"comlink": "^4.4.2",
"compare-versions": "^6.1.1",
"electron-log": "^5.3.0",
"electron-log": "^5.2.4",
"electron-store": "^8.2.0",
"electron-updater": "^6.4.0",
"electron-updater": "^6.4.0-alpha.3",
"ffmpeg-static": "^5.2.0",
"lru-cache": "^11.0.2",
"next-electron-server": "^1.0.0",
@@ -41,7 +41,7 @@
"onnxruntime-node": "^1.20.1"
},
"devDependencies": {
"@eslint/js": "^9.19.0",
"@eslint/js": "^9.18.0",
"@tsconfig/node20": "^20.1.4",
"@types/auto-launch": "^5.0.5",
"@types/eslint__js": "^8.42.3",
@@ -49,15 +49,15 @@
"ajv": "^8.17.1",
"concurrently": "^9.1.2",
"cross-env": "^7.0.3",
"electron": "^34.1.1",
"electron-builder": "^26.0.0",
"electron": "^34.0.0",
"electron-builder": "^26.0.0-alpha.10",
"eslint": "^9",
"prettier": "3.4.2",
"prettier-plugin-organize-imports": "^4.1.0",
"prettier-plugin-packagejson": "^2.5.8",
"shx": "^0.3.4",
"typescript": "^5.7.2",
"typescript-eslint": "^8.23.0"
"typescript-eslint": "^8.21.0"
},
"packageManager": "yarn@1.22.22",
"productName": "ente"

View File

@@ -3,8 +3,8 @@ const fsp = require("fs/promises");
/**
* This hook is invoked during the initial build (e.g. when triggered by "yarn
* build"), and importantly, on each rebuild for a different architecture during
* the build. We use it to ensure that the vips binary is for the current
* architecture being built. See "[Note: vips]" for more details.
* the build. We use it to ensure that the magick binary is for the current
* architecture being built. See "[Note: ImageMagick]" for more details.
*
* The documentation for this hook is at:
* https://www.electron.build/app-builder-lib.interface.configuration#beforebuild
@@ -22,10 +22,8 @@ const fsp = require("fs/promises");
* },
* arch: 'arm64'
*
* Note that we must not return falsey from this function, because:
*
* > Resolving to false will skip dependencies install or rebuild.
*
* Note that we must not return falsey from this function, because
* > Resolving to false will skip dependencies install or rebuild.
*/
module.exports = async (context) => {
const { appDir, platform, arch } = context;
@@ -37,14 +35,14 @@ module.exports = async (context) => {
// https://github.com/electron-userland/electron-builder/blob/master/packages/builder-util/src/arch.ts#L9
// https://nodejs.org/api/process.html#processarch
if (arch == process.arch) {
// `vips.js` would've already downloaded the file, nothing to do.
// `magick.js` would've already downloaded the file, nothing to do.
return true;
}
const download = async (downloadName, outputName) => {
const out = `${appDir}/build/${outputName}`;
console.log(`Downloading ${downloadName}`);
const downloadPath = `https://github.com/ente-io/libvips-packaging/releases/download/v8.16.0/${downloadName}`;
const downloadPath = `https://github.com/ente-io/ImageMagick/releases/download/2025-01-21/${downloadName}`;
return fetch(downloadPath)
.then((res) => res.blob())
.then((blob) => fsp.writeFile(out, blob.stream()))
@@ -53,13 +51,13 @@ module.exports = async (context) => {
switch (`${platform.nodeName}-${arch}`) {
case "linux-x64":
await download("vips-x64", "vips");
await download("magick-x86_64", "magick");
case "linux-arm64":
await download("vips-arm64", "vips");
await download("magick-aarch64", "magick");
case "win32-x64":
await download("vips-x86_64.exe", "vips.exe");
await download("magick-x64.exe", "magick.exe");
case "linux-arm64":
await download("vips-aarch64.exe", "vips.exe");
await download("magick-arm64.exe", "magick.exe");
}
return true;

78
desktop/scripts/magick.js Executable file
View File

@@ -0,0 +1,78 @@
/**
* [Note: ImageMagick]
*
* We need static builds for Linux and Windows for both x64 and ARM. For this,
* we need a custom workflow because (as of writing):
*
* 1. Upstream doesn't publish ARM64 binaries for Linux
*
* 2. The Windows portable releases are not part of the artifacts attached to
* the upstream GitHub release.
*
* Our custom workflow is an adaption of the upstream release.yml - its goal is
* to have 4 standalone binaries - Linux x64, Linux ARM, Win x64, Win ARM -
* attached to a GitHub release from which we can pull them when building the
* desktop app.
*
* This is our custom workflow, which runs on a fork of upstream:
* https://github.com/ente-io/ImageMagick/commit/df895cce13d6a3f874a716c05ff2babeb33351b9
* (For reference, we also include a copy of it in this repo - `magick.yml`).
*
* The binaries it creates are available at
* https://github.com/ente-io/ImageMagick/releases/tag/2025-01-21.
*
* To integrate this ImageMagick binary, we need to modify two places:
*
* 1. This script, `magick.js`, runs during "yarn install" (it is set as the
* "prepare" step in our `package.json`). It downloads the relevant binary
* for the current OS/arch combination and places it in the `build` folder,
* allowing it to be used during development.
*
* 2. The sibling script, `beforeBuild.js`, runs during "yarn build" (it is set
* as the beforeBuild script in `electrons-builder.yml`). It downloads the
* relevant binary for the OS/arch combination being built.
*
* Note that `magick.js` would've already run once `beforeBuild.js` is run, but
* on our CI we prepare builds for multiple architectures in one go, so we need
* to unconditonally replace the binary with the relevant one for the current
* architecture being built (which might be different from the one we're running
* on). `beforeBuild.js` runs for each architecture being built.
*
* On macOS, we don't need ImageMagick since there we use the native `sips`.
*/
const fs = require("fs");
const fsp = require("fs/promises");
const main = () => {
switch (`${process.platform}-${process.arch}`) {
case "linux-x64":
return downloadIfNeeded("magick-x86_64", "magick");
case "linux-arm64":
return downloadIfNeeded("magick-aarch64", "magick");
case "win32-x64":
return downloadIfNeeded("magick-x64.exe", "magick.exe");
case "linux-arm64":
return downloadIfNeeded("magick-arm64.exe", "magick.exe");
}
};
const downloadIfNeeded = (downloadName, outputName) => {
const out = `build/${outputName}`;
try {
// Making the file executable is the last step, so if the file exists at
// this path and is executable, we assume it is the correct one.
fs.accessSync(out, fs.constants.X_OK);
return;
} catch {}
console.log(`Downloading ${downloadName}`);
const downloadPath = `https://github.com/ente-io/ImageMagick/releases/download/2025-01-21/${downloadName}`;
return fetch(downloadPath)
.then((res) => res.blob())
.then((blob) => fsp.writeFile(out, blob.stream()))
.then(() => fsp.chmod(out, "744"));
};
main();

127
desktop/scripts/magick.yml Normal file
View File

@@ -0,0 +1,127 @@
on:
workflow_dispatch:
push: # Push a tag to build and create a draft release
tags:
- "*"
name: binaries-for-ente
jobs:
create_magick_binary:
name: Create magick binary (Linux)
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-24.04, ubuntu-24.04-arm]
compiler: [gcc]
include:
- os: ubuntu-24.04
arch: x86_64
- os: ubuntu-24.04-arm
arch: aarch64
- compiler: gcc
cxx_compiler: g++
packages: gcc g++
steps:
- name: Install dependencies
run: |
set -e
export DEBIAN_FRONTEND=noninteractive
sudo apt update -y
sudo apt install -y autoconf curl fuse git kmod libbz2-dev libdjvulibre-dev libfontconfig-dev libfreetype6-dev libfribidi-dev libharfbuzz-dev liblcms-dev libopenexr-dev libopenjp2-7-dev libturbojpeg0-dev liblqr-dev libraqm-dev libtiff-dev libwebp-dev libx11-dev libxml2-dev liblzma-dev make software-properties-common wget ${{ matrix.packages }}
sudo add-apt-repository ppa:git-core/ppa -y
sudo apt install -y git
sudo add-apt-repository ppa:strukturag/libheif -y
sudo add-apt-repository ppa:strukturag/libde265 -y
sudo apt install libheif-dev -y
- name: Checkout
uses: actions/checkout@v4
# Avoid fatal: detected dubious ownership in repository at '/__w/ImageMagick/ImageMagick'
# Possible workaround: https://github.com/actions/runner/issues/2033#issuecomment-1598547465
- name: Flag current workspace as safe for git
run: git config --global --add safe.directory ${GITHUB_WORKSPACE}
- name: Download AppImage
run: |
set -e
sudo apt install -y file
mkdir -p out/app-image
cd out/app-image
wget -c https://github.com/$(wget -q https://github.com/probonopd/go-appimage/releases/expanded_assets/continuous -O - | grep "appimagetool-.*-${{ matrix.arch }}.AppImage" | head -n 1 | cut -d '"' -f 2)
chmod +x appimagetool-*.AppImage
- name: Build ImageMagick
env:
CFLAGS:
-Wno-deprecated-declarations -Wdeclaration-after-statement
-Wno-error=unused-variable
CC: ${{ matrix.compiler }}
CXX: ${{ matrix.cxx_compiler }}
run: |
set -e
./configure --with-quantum-depth=16 --without-magick-plus-plus --without-perl --without-x --disable-docs --prefix=/usr
make
make install DESTDIR=$(readlink -f out/appdir)
- name: Create ImageMagick AppImage
run: |
set -e
mkdir -p out/appdir/usr/share/applications/
cp app-image/imagemagick.desktop out/appdir/usr/share/applications/
mkdir -p out/appdir/usr/share/icons/hicolor/256x256/apps/
cp app-image/icon.png out/appdir/usr/share/icons/hicolor/256x256/apps/imagemagick.png
unset QTDIR
unset QT_PLUGIN_PATH
unset LD_LIBRARY_PATH
export VERSION=7
cd out
./app-image/appimagetool-*.AppImage --appimage-extract-and-run -s deploy appdir/usr/share/applications/*.desktop
chmod +x appdir/usr/lib/ld-linux-aarch64.so.1 || true
./app-image/appimagetool-*.AppImage --appimage-extract-and-run appdir
mkdir artifacts
cp ImageMagick*.AppImage artifacts/magick-${{ matrix.arch }}
- name: Upload ImageMagick AppImage
uses: actions/upload-artifact@v4
with:
name: magick-${{ matrix.arch }}
path: out/artifacts
- name: Create a draft GitHub release
uses: ncipollo/release-action@v1
with:
artifacts: "out/artifacts/*"
draft: true
allowUpdates: true
updateOnlyUnreleased: true
download_and_keep_windows_binaries:
name: Download magick binary (Windows)
runs-on: ubuntu-24.04
steps:
- name: Download
run: |
mkdir -p out/artifacts
curl -LO https://imagemagick.org/archive/binaries/ImageMagick-7.1.1-43-portable-Q16-x64.zip
unzip ImageMagick-7.1.1-43-portable-Q16-x64.zip
cp ImageMagick-7.1.1-43-portable-Q16-x64/magick.exe out/artifacts/magick-x64.exe
curl -LO https://imagemagick.org/archive/binaries/ImageMagick-7.1.1-43-portable-Q16-arm64.zip
unzip ImageMagick-7.1.1-43-portable-Q16-arm64.zip
cp ImageMagick-7.1.1-43-portable-Q16-arm64/magick.exe out/artifacts/magick-arm64.exe
- name: Upload ImageMagick exes
uses: actions/upload-artifact@v4
with:
name: magick-${{ matrix.arch }}
path: out/artifacts
- name: Create a draft GitHub release
uses: ncipollo/release-action@v1
with:
artifacts: "out/artifacts/*"
draft: true
allowUpdates: true
updateOnlyUnreleased: true

View File

@@ -1,68 +0,0 @@
/**
* [Note: vips]
*
* For use within our Electron app we need static builds for Linux and Windows
* for both x64 and ARM. For this, we need a custom workflow because (as of
* writing) upstream doesn't publish these.
*
* This is our custom workflow, which runs on a fork of upstream:
* https://github.com/ente-io/libvips-packaging/commit/a298aff3e1f25f713508d31d0c3a55a4f828fdd3
*
* The binaries it creates are available at
* https://github.com/ente-io/libvips-packaging/releases/tag/v8.16.0
*
* To integrate this binary, we need to modify two places:
*
* 1. This script, `vips.js`, runs during "yarn install" (it is set as the
* "prepare" step in our `package.json`). It downloads the relevant binary
* for the current OS/arch combination and places it in the `build` folder,
* allowing it to be used during development.
*
* 2. The sibling script, `beforeBuild.js`, runs during "yarn build" (it is set
* as the beforeBuild script in `electrons-builder.yml`). It downloads the
* relevant binary for the OS/arch combination being built.
*
* Note that `vips.js` would've already run once `beforeBuild.js` is run, but on
* our CI we prepare builds for multiple architectures in one go, so we need to
* unconditonally replace the binary with the relevant one for the current
* architecture being built (which might be different from the one we're running
* on). `beforeBuild.js` runs for each architecture being built.
*
* On macOS, we don't need `vips` since there we use the native `sips`.
*/
const fs = require("fs");
const fsp = require("fs/promises");
const main = () => {
switch (`${process.platform}-${process.arch}`) {
case "linux-x64":
return downloadIfNeeded("vips-x64", "vips");
case "linux-arm64":
return downloadIfNeeded("vips-arm64", "vips");
case "win32-x64":
return downloadIfNeeded("vips-x86_64.exe", "vips.exe");
case "linux-arm64":
return downloadIfNeeded("vips-aarch64.exe", "vips.exe");
}
};
const downloadIfNeeded = (downloadName, outputName) => {
const out = `build/${outputName}`;
try {
// Making the file executable is the last step, so if the file exists at
// this path and is executable, we assume it is the correct one.
fs.accessSync(out, fs.constants.X_OK);
return;
} catch {}
console.log(`Downloading ${downloadName}`);
const downloadPath = `https://github.com/ente-io/libvips-packaging/releases/download/v8.16.0/${downloadName}`;
return fetch(downloadPath)
.then((res) => res.blob())
.then((blob) => fsp.writeFile(out, blob.stream()))
.then(() => fsp.chmod(out, "744"));
};
main();

View File

@@ -10,15 +10,14 @@
*/
import { nativeImage, shell } from "electron/common";
import type { WebContents } from "electron/main";
import {
BrowserWindow,
Menu,
Tray,
app,
dialog,
nativeTheme,
protocol,
type WebContents,
} from "electron/main";
import serveNextAt from "next-electron-server";
import { existsSync } from "node:fs";
@@ -96,10 +95,10 @@ const main = () => {
/**
* Handle an open URL request, but ensuring that we have a mainWindow.
*/
const handleOpenEnteURLEnsuringWindow = (url: string) => {
const handleOpenURLEnsuringWindow = (url: string) => {
log.info(`Attempting to handle request to open URL: ${url}`);
if (mainWindow) handleEnteLinks(mainWindow, url);
else setTimeout(() => handleOpenEnteURLEnsuringWindow(url), 1000);
else setTimeout(() => handleOpenURLEnsuringWindow(url), 1000);
};
app.on("second-instance", (_, argv: string[]) => {
@@ -110,15 +109,9 @@ const main = () => {
mainWindow.focus();
}
// On Windows and Linux, this is how we get deeplinks.
//
// See: registerForEnteLinks
//
// Note that Chromium reserves the right to fudge with the order of the
// command line arguments, including inserting things in arbitrary
// places, so we need to go through the args to find the one that is
// pertinent to us (if any) instead of looking at a fixed position.
const url = argv.find((arg) => arg.startsWith("ente://app"));
if (url) handleOpenEnteURLEnsuringWindow(url);
const url = argv.pop();
if (url) handleOpenURLEnsuringWindow(url);
});
// Emitted once, when Electron has finished initializing.
@@ -152,7 +145,7 @@ const main = () => {
void mainWindow.loadURL(rendererURL);
// Continue on with the rest of the startup sequence.
Menu.setApplicationMenu(createApplicationMenu(mainWindow));
Menu.setApplicationMenu(await createApplicationMenu(mainWindow));
setupTrayItem(mainWindow);
setupAutoUpdater(mainWindow);
@@ -177,7 +170,7 @@ const main = () => {
});
// On macOS, this is how we get deeplinks. See: registerForEnteLinks
app.on("open-url", (_, url) => handleOpenEnteURLEnsuringWindow(url));
app.on("open-url", (_, url) => handleOpenURLEnsuringWindow(url));
};
/**
@@ -279,7 +272,7 @@ const handleEnteLinks = (mainWindow: BrowserWindow, url: string) => {
// - the protocol we're using to serve/ our bundled web app
//
// use the same scheme ("ente://"), so the URL can directly be forwarded.
mainWindow.webContents.send("openEnteURL", url);
mainWindow.webContents.send("openURL", url);
};
/** Attach handlers to the (node) process. */
@@ -348,41 +341,9 @@ const createMainWindow = () => {
...(bounds ?? {}),
// Enforce a minimum size
...minimumWindowSize(),
// [Note: Customize the desktop title bar]
//
// 1. Remove the default title bar.
// 2. Reintroduce the title bar controls.
// 3. Show a custom title bar in the renderer.
//
// For step 3, we use `app-region: drag` to allow dragging the window by
// the title bar, and use the Window Controls Overlay CSS environment
// variables to determine its dimensions. Note that these overlay CSS
// environment vars are only available when titleBarOverlay is true, so
// unlike the tutorial which enables it only for Windows and Linux, we
// do it (Step 2) unconditionally (i.e., on macOS too).
//
// https://www.electronjs.org/docs/latest/tutorial/custom-title-bar#create-a-custom-title-bar
//
// Note that by default on Windows, the color of the WCO title bar
// overlay (three buttons - minimize, maximize, close - on the top
// right) is static, and unlike Linux, doesn't adapt to the theme /
// content. Explicitly choosing a dark background, while it won't work
// always (if the user's theme is light), is better than picking a light
// background since the main image viewer is always dark.
titleBarStyle: "hidden",
titleBarOverlay:
process.platform == "win32"
? { color: "black", symbolColor: "#cdcdcd" }
: true,
// The color to show in the window until the web content gets loaded.
// https://www.electronjs.org/docs/latest/api/browser-window#setting-the-backgroundcolor-property
//
// To avoid a flash, we want to use the same background color as the
// theme of their choice. Unless the user has modified their preference
// to not follow the system, we can deduce it from the current OS theme.
//
// See: https://www.electronjs.org/docs/latest/tutorial/dark-mode
backgroundColor: nativeTheme.shouldUseDarkColors ? "black" : "white",
// See: https://www.electronjs.org/docs/latest/api/browser-window#setting-the-backgroundcolor-property
backgroundColor: "black",
// We'll show it conditionally depending on `wasAutoLaunched` later.
show: false,
});

View File

@@ -24,7 +24,6 @@ import {
updateAndRestart,
updateOnNextRestart,
} from "./services/app-update";
import autoLauncher from "./services/auto-launcher";
import {
openDirectory,
openLogDirectory,
@@ -118,10 +117,6 @@ export const attachIPCHandlers = () => {
setLastShownChangelogVersion(version),
);
ipcMain.handle("isAutoLaunchEnabled", () => autoLauncher.isEnabled());
ipcMain.handle("toggleAutoLaunch", () => autoLauncher.toggleAutoLaunch());
// - App update
ipcMain.on("updateAndRestart", () => updateAndRestart());

View File

@@ -7,14 +7,17 @@ import {
} from "electron";
import { allowWindowClose } from "../main";
import { forceCheckForAppUpdates } from "./services/app-update";
import autoLauncher from "./services/auto-launcher";
import { openLogDirectory } from "./services/dir";
import { userPreferences } from "./stores/user-preferences";
/** Create and return the entries in the app's main menu bar */
export const createApplicationMenu = (mainWindow: BrowserWindow) => {
export const createApplicationMenu = async (mainWindow: BrowserWindow) => {
// The state of checkboxes
//
// Whenever the menu is redrawn the current value of these variables is used
// to set the checked state for the various settings checkboxes.
let isAutoLaunchEnabled = await autoLauncher.isEnabled();
let shouldHideDockIcon = !!userPreferences.get("hideDockIcon");
const macOSOnly = (options: MenuItemConstructorOptions[]) =>
@@ -22,6 +25,16 @@ export const createApplicationMenu = (mainWindow: BrowserWindow) => {
const handleCheckForUpdates = () => forceCheckForAppUpdates(mainWindow);
const handleViewChangelog = () =>
void shell.openExternal(
"https://github.com/ente-io/ente/blob/main/desktop/CHANGELOG.md",
);
const toggleAutoLaunch = () => {
void autoLauncher.toggleAutoLaunch();
isAutoLaunchEnabled = !isAutoLaunchEnabled;
};
const toggleHideDockIcon = () => {
// Persist
userPreferences.set("hideDockIcon", !shouldHideDockIcon);
@@ -32,6 +45,13 @@ export const createApplicationMenu = (mainWindow: BrowserWindow) => {
const handleHelp = () =>
void shell.openExternal("https://help.ente.io/photos/");
const handleSupport = () =>
void shell.openExternal("mailto:support@ente.io");
const handleBlog = () => void shell.openExternal("https://ente.io/blog/");
const handleViewLogs = () => void openLogDirectory();
return Menu.buildFromTemplate([
{
label: "Ente Photos",
@@ -47,21 +67,31 @@ export const createApplicationMenu = (mainWindow: BrowserWindow) => {
label: "Check for Updates...",
click: handleCheckForUpdates,
},
{
label: "View Changelog",
click: handleViewChangelog,
},
{ type: "separator" },
...macOSOnly([
{
label: "Preferences",
submenu: [
{
label: "Preferences",
submenu: [
{
label: "Open Ente on Startup",
type: "checkbox",
checked: isAutoLaunchEnabled,
click: toggleAutoLaunch,
},
...macOSOnly([
{
label: "Hide Dock Icon",
type: "checkbox",
checked: shouldHideDockIcon,
click: toggleHideDockIcon,
},
],
},
]),
]),
],
},
{ type: "separator" },
...macOSOnly([
@@ -139,6 +169,20 @@ export const createApplicationMenu = (mainWindow: BrowserWindow) => {
label: "Ente Help",
click: handleHelp,
},
{ type: "separator" },
{
label: "Support",
click: handleSupport,
},
{
label: "Product Updates",
click: handleBlog,
},
{ type: "separator" },
{
label: "View Logs",
click: handleViewLogs,
},
],
},
]);
@@ -150,6 +194,7 @@ export const createApplicationMenu = (mainWindow: BrowserWindow) => {
*/
export const createTrayContextMenu = (mainWindow: BrowserWindow) => {
const handleOpen = () => {
mainWindow.maximize();
mainWindow.show();
};

View File

@@ -9,7 +9,7 @@ import {
makeTempFilePath,
} from "../utils/temp";
/* Ditto in the web app's code (used by the Wasm FFmpeg invocation). */
/* Ditto in the web app's code (used by the WASM FFmpeg invocation). */
const ffmpegPathPlaceholder = "FFMPEG";
const inputPathPlaceholder = "INPUT";
const outputPathPlaceholder = "OUTPUT";
@@ -19,7 +19,7 @@ const outputPathPlaceholder = "OUTPUT";
*
* [Note: FFmpeg in Electron]
*
* There is a Wasm build of FFmpeg, but that is currently 10-20 times slower
* There is a wasm build of FFmpeg, but that is currently 10-20 times slower
* that the native build. That is slow enough to be unusable for our purposes.
* https://ffmpegwasm.netlify.app/docs/performance
*

View File

@@ -14,6 +14,7 @@ export const convertToJPEG = async (imageData: Uint8Array) => {
const inputFilePath = await makeTempFilePath();
const outputFilePath = await makeTempFilePath("jpeg");
// Construct the command first, it may throw NotAvailable on win32.
const command = convertToJPEGCommand(inputFilePath, outputFilePath);
try {
@@ -44,7 +45,14 @@ const convertToJPEGCommand = (
case "linux":
case "win32":
return [vipsPath(), "copy", inputFilePath, outputFilePath];
return [
imageMagickPath(),
"convert",
inputFilePath,
"-quality",
"100%",
outputFilePath,
];
default:
throw new Error("Not available on the current OS/arch");
@@ -52,12 +60,12 @@ const convertToJPEGCommand = (
};
/**
* Path to the vips executable bundled with our app on Linux and Windows.
* Path to the magick executable bundled with our app on Linux and Windows.
*/
const vipsPath = () =>
const imageMagickPath = () =>
path.join(
isDev ? "build" : process.resourcesPath,
process.platform == "win32" ? "vips.exe" : "vips",
process.platform == "win32" ? "magick.exe" : "magick",
);
export const generateImageThumbnail = async (
@@ -131,11 +139,19 @@ const generateImageThumbnailCommand = (
case "linux":
case "win32":
return [
vipsPath(),
"thumbnail",
imageMagickPath(),
"convert",
inputFilePath,
`${outputFilePath}[Q=${quality}]`,
`${maxDimension}`,
"-define",
`jpeg:size=${2 * maxDimension}x${2 * maxDimension}`,
"-auto-orient",
"-thumbnail",
`${maxDimension}x${maxDimension}`,
"-unsharp",
"0x.5",
"-quality",
`${quality}`,
outputFilePath,
];
default:

View File

@@ -20,7 +20,7 @@ let _child: UtilityProcess | undefined;
* [Note: ML IPC]
*
* The primary reason for doing ML tasks in the Node.js layer is so that we can
* use the binary ONNX runtime, which is 10-20x faster than the Wasm one that
* use the binary ONNX runtime, which is 10-20x faster than the WASM one that
* can be used directly on the web layer.
*
* For this to work, the main and renderer process need to communicate with each

View File

@@ -56,6 +56,8 @@ export const execAsync = async (command: string | string[]) => {
const startTime = Date.now();
const result = await execAsync_(escapedCommand);
log.debug(() => `${escapedCommand} (${Date.now() - startTime} ms)`);
// TODO(MR): Temp for debugging in nightlies; Remove before release.
log.info(`${escapedCommand} (${Date.now() - startTime} ms)`);
return result;
};

View File

@@ -122,18 +122,14 @@ const lastShownChangelogVersion = () =>
const setLastShownChangelogVersion = (version: number) =>
ipcRenderer.invoke("setLastShownChangelogVersion", version);
const isAutoLaunchEnabled = () => ipcRenderer.invoke("isAutoLaunchEnabled");
const toggleAutoLaunch = () => ipcRenderer.invoke("toggleAutoLaunch");
const onMainWindowFocus = (cb: (() => void) | undefined) => {
ipcRenderer.removeAllListeners("mainWindowFocus");
if (cb) ipcRenderer.on("mainWindowFocus", cb);
};
const onOpenEnteURL = (cb: ((url: string) => void) | undefined) => {
ipcRenderer.removeAllListeners("openEnteURL");
if (cb) ipcRenderer.on("openEnteURL", (_, url: string) => cb(url));
const onOpenURL = (cb: ((url: string) => void) | undefined) => {
ipcRenderer.removeAllListeners("openURL");
if (cb) ipcRenderer.on("openURL", (_, url: string) => cb(url));
};
// - App update
@@ -351,10 +347,8 @@ contextBridge.exposeInMainWorld("electron", {
saveMasterKeyB64,
lastShownChangelogVersion,
setLastShownChangelogVersion,
isAutoLaunchEnabled,
toggleAutoLaunch,
onMainWindowFocus,
onOpenEnteURL,
onOpenURL,
// - App update

View File

@@ -177,10 +177,10 @@
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.9.1.tgz#4a97e85e982099d6c7ee8410aacb55adaa576f06"
integrity sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==
"@eslint/js@^9.19.0":
version "9.19.0"
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.19.0.tgz#51dbb140ed6b49d05adc0b171c41e1a8713b7789"
integrity sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==
"@eslint/js@^9.18.0":
version "9.18.0"
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.18.0.tgz#3356f85d18ed3627ab107790b53caf7e1e3d1e84"
integrity sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==
"@eslint/object-schema@^2.1.4":
version "2.1.4"
@@ -417,85 +417,85 @@
dependencies:
"@types/node" "*"
"@typescript-eslint/eslint-plugin@8.23.0":
version "8.23.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.23.0.tgz#7745f4e3e4a7ae5f6f73fefcd856fd6a074189b7"
integrity sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w==
"@typescript-eslint/eslint-plugin@8.21.0":
version "8.21.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.21.0.tgz#395014a75112ecdb81142b866ab6bb62e3be0f2a"
integrity sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==
dependencies:
"@eslint-community/regexpp" "^4.10.0"
"@typescript-eslint/scope-manager" "8.23.0"
"@typescript-eslint/type-utils" "8.23.0"
"@typescript-eslint/utils" "8.23.0"
"@typescript-eslint/visitor-keys" "8.23.0"
"@typescript-eslint/scope-manager" "8.21.0"
"@typescript-eslint/type-utils" "8.21.0"
"@typescript-eslint/utils" "8.21.0"
"@typescript-eslint/visitor-keys" "8.21.0"
graphemer "^1.4.0"
ignore "^5.3.1"
natural-compare "^1.4.0"
ts-api-utils "^2.0.1"
ts-api-utils "^2.0.0"
"@typescript-eslint/parser@8.23.0":
version "8.23.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.23.0.tgz#57acb3b65fce48d12b70d119436e145842a30081"
integrity sha512-h2lUByouOXFAlMec2mILeELUbME5SZRN/7R9Cw2RD2lRQQY08MWMM+PmVVKKJNK1aIwqTo9t/0CvOxwPbRIE2Q==
"@typescript-eslint/parser@8.21.0":
version "8.21.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.21.0.tgz#312c638aaba4f640d45bfde7c6795a9d75deb088"
integrity sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA==
dependencies:
"@typescript-eslint/scope-manager" "8.23.0"
"@typescript-eslint/types" "8.23.0"
"@typescript-eslint/typescript-estree" "8.23.0"
"@typescript-eslint/visitor-keys" "8.23.0"
"@typescript-eslint/scope-manager" "8.21.0"
"@typescript-eslint/types" "8.21.0"
"@typescript-eslint/typescript-estree" "8.21.0"
"@typescript-eslint/visitor-keys" "8.21.0"
debug "^4.3.4"
"@typescript-eslint/scope-manager@8.23.0":
version "8.23.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.23.0.tgz#ee3bb7546421ca924b9b7a8b62a77d388193ddec"
integrity sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw==
"@typescript-eslint/scope-manager@8.21.0":
version "8.21.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz#d08d94e2a34b4ccdcc975543c25bb62917437500"
integrity sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==
dependencies:
"@typescript-eslint/types" "8.23.0"
"@typescript-eslint/visitor-keys" "8.23.0"
"@typescript-eslint/types" "8.21.0"
"@typescript-eslint/visitor-keys" "8.21.0"
"@typescript-eslint/type-utils@8.23.0":
version "8.23.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.23.0.tgz#271e1eecece072d92679dfda5ccfceac3faa9f76"
integrity sha512-iIuLdYpQWZKbiH+RkCGc6iu+VwscP5rCtQ1lyQ7TYuKLrcZoeJVpcLiG8DliXVkUxirW/PWlmS+d6yD51L9jvA==
"@typescript-eslint/type-utils@8.21.0":
version "8.21.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.21.0.tgz#2e69d1a93cdbedc73fe694cd6ae4dfedd00430a0"
integrity sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ==
dependencies:
"@typescript-eslint/typescript-estree" "8.23.0"
"@typescript-eslint/utils" "8.23.0"
"@typescript-eslint/typescript-estree" "8.21.0"
"@typescript-eslint/utils" "8.21.0"
debug "^4.3.4"
ts-api-utils "^2.0.1"
ts-api-utils "^2.0.0"
"@typescript-eslint/types@8.23.0":
version "8.23.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.23.0.tgz#3355f6bcc5ebab77ef6dcbbd1113ec0a683a234a"
integrity sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ==
"@typescript-eslint/types@8.21.0":
version "8.21.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.21.0.tgz#58f30aec8db8212fd886835dc5969cdf47cb29f5"
integrity sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==
"@typescript-eslint/typescript-estree@8.23.0":
version "8.23.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.23.0.tgz#f633ef08efa656e386bc44b045ffcf9537cc6924"
integrity sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ==
"@typescript-eslint/typescript-estree@8.21.0":
version "8.21.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz#5ce71acdbed3b97b959f6168afba5a03c88f69a9"
integrity sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==
dependencies:
"@typescript-eslint/types" "8.23.0"
"@typescript-eslint/visitor-keys" "8.23.0"
"@typescript-eslint/types" "8.21.0"
"@typescript-eslint/visitor-keys" "8.21.0"
debug "^4.3.4"
fast-glob "^3.3.2"
is-glob "^4.0.3"
minimatch "^9.0.4"
semver "^7.6.0"
ts-api-utils "^2.0.1"
ts-api-utils "^2.0.0"
"@typescript-eslint/utils@8.23.0":
version "8.23.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.23.0.tgz#b269cbdc77129fd6e0e600b168b5ef740a625554"
integrity sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA==
"@typescript-eslint/utils@8.21.0":
version "8.21.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.21.0.tgz#bc4874fbc30feb3298b926e3b03d94570b3999c5"
integrity sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==
dependencies:
"@eslint-community/eslint-utils" "^4.4.0"
"@typescript-eslint/scope-manager" "8.23.0"
"@typescript-eslint/types" "8.23.0"
"@typescript-eslint/typescript-estree" "8.23.0"
"@typescript-eslint/scope-manager" "8.21.0"
"@typescript-eslint/types" "8.21.0"
"@typescript-eslint/typescript-estree" "8.21.0"
"@typescript-eslint/visitor-keys@8.23.0":
version "8.23.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.23.0.tgz#40405fd26a61d23f5f4c2ed0f016a47074781df8"
integrity sha512-oWWhcWDLwDfu++BGTZcmXWqpwtkwb5o7fxUIGksMQQDSdPW9prsSnfIOZMlsj4vBOSrcnjIUZMiIjODgGosFhQ==
"@typescript-eslint/visitor-keys@8.21.0":
version "8.21.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz#a89744c4cdc83b5c761eb5878befe6c33d1481b2"
integrity sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==
dependencies:
"@typescript-eslint/types" "8.23.0"
"@typescript-eslint/types" "8.21.0"
eslint-visitor-keys "^4.2.0"
"@xmldom/xmldom@^0.8.8":
@@ -609,10 +609,10 @@ app-builder-bin@5.0.0-alpha.12:
resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-5.0.0-alpha.12.tgz#2daf82f8badc698e0adcc95ba36af4ff0650dc80"
integrity sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==
app-builder-lib@26.0.0:
version "26.0.0"
resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-26.0.0.tgz#726b8b2c058f04f854aba70c7245d48454905980"
integrity sha512-vZTt6Nc401IHBHISqspcO9tUF80ddOP5ehh2B4goLefM+zdT75CvuQUuqz7yzRgW16pHLqCvKMws0FbJQfLB5w==
app-builder-lib@26.0.0-alpha.10:
version "26.0.0-alpha.10"
resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-26.0.0-alpha.10.tgz#3eb3f64ffa5e995595ad61497c5e7a0c2d64b817"
integrity sha512-9K3MulGK7j+En4KjH3aq7AzDqe8nn35x7O9l5kwl16nWFdBthcdy1IKsx9CgjMSF+eTNctOZlXwnYiPiGzY+GQ==
dependencies:
"@develar/schema-utils" "~2.6.5"
"@electron/asar" "3.2.18"
@@ -625,15 +625,15 @@ app-builder-lib@26.0.0:
"@types/fs-extra" "9.0.13"
async-exit-hook "^2.0.1"
bluebird-lst "^1.0.9"
builder-util "26.0.0"
builder-util-runtime "9.3.0"
builder-util "26.0.0-alpha.10"
builder-util-runtime "9.3.0-alpha.0"
chromium-pickle-js "^0.2.0"
config-file-ts "0.2.8-rc1"
debug "^4.3.4"
dotenv "^16.4.5"
dotenv-expand "^11.0.6"
ejs "^3.1.8"
electron-publish "26.0.0"
electron-publish "26.0.0-alpha.10"
fs-extra "^10.1.0"
hosted-git-info "^4.1.0"
is-ci "^3.0.0"
@@ -784,24 +784,24 @@ buffer@^5.1.0, buffer@^5.5.0:
base64-js "^1.3.1"
ieee754 "^1.1.13"
builder-util-runtime@9.3.0:
version "9.3.0"
resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.3.0.tgz#58d97c279bb8626a10d779e1cf22fea0eb25f5e8"
integrity sha512-wR81YIybr41JITLSltwtTsZXkgTwcpBol7LGOyB5A8fKCcZaYLDWgUqDwmsjhlgADD6sGD5ieyzS/5wbL2l/qQ==
builder-util-runtime@9.3.0-alpha.0:
version "9.3.0-alpha.0"
resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.3.0-alpha.0.tgz#c4639ae24a74d2e0f4eb324100af3040300bae62"
integrity sha512-EriE6Uf15niqdkyjBOS09OrXlhEV0HKhnATlI9n63vCoisnvvRTQNgoR2MV9vnBmNGhavBPZXPWPItv4QMDVfw==
dependencies:
debug "^4.3.4"
sax "^1.2.4"
builder-util@26.0.0:
version "26.0.0"
resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-26.0.0.tgz#e5bc122f3e9e94fa2e3afd2e837e81ce9f177359"
integrity sha512-iLN4R0UAzSz4MxPmz+6vnXMqaY5BMd2FSNlM9f7eHSRYqZrsoTHCSrd7W4Kr4qFIdUxLlRz3X2npATapXzomIg==
builder-util@26.0.0-alpha.10:
version "26.0.0-alpha.10"
resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-26.0.0-alpha.10.tgz#f445a530c28da6e3650b93e92263c06c6f89a2cc"
integrity sha512-RMVOAgdd+tzwpyF5C8gx9KjzwdUvkUEubpsHTvb2JwlQnBcyBc6hyVCU2gt2MivQCLbjCOEgsUX1/zHrWDqGfg==
dependencies:
"7zip-bin" "~5.2.0"
"@types/debug" "^4.1.6"
app-builder-bin "5.0.0-alpha.12"
bluebird-lst "^1.0.9"
builder-util-runtime "9.3.0"
builder-util-runtime "9.3.0-alpha.0"
chalk "^4.1.2"
cross-spawn "^7.0.6"
debug "^4.3.4"
@@ -1178,14 +1178,14 @@ dir-compare@^4.2.0:
minimatch "^3.0.5"
p-limit "^3.1.0 "
dmg-builder@26.0.0:
version "26.0.0"
resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-26.0.0.tgz#6dc81be31f7ffe9f8a5fc77ce7f83eba33ae9aa7"
integrity sha512-NyyTgm1U56ytpFvuGjj63PYug3v+oYYbPc8e08EiHP6G4TvMwYabmSzFtanfoO1iI7xOljpW/fW7SNCHHElsfw==
dmg-builder@26.0.0-alpha.10:
version "26.0.0-alpha.10"
resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-26.0.0-alpha.10.tgz#d4d908922005a0c852d0919a7dd0b8f77d3c4bd0"
integrity sha512-RWzCNLLu4dGIvBf8kBzjF/zI5aMOSA149S1V2NgAA4La8f8ghdJAm/DI5crSb2zDijFLyTNmUGTtvU6eHgiZyQ==
dependencies:
app-builder-lib "26.0.0"
builder-util "26.0.0"
builder-util-runtime "9.3.0"
app-builder-lib "26.0.0-alpha.10"
builder-util "26.0.0-alpha.10"
builder-util-runtime "9.3.0-alpha.0"
fs-extra "^10.1.0"
iconv-lite "^0.6.2"
js-yaml "^4.1.0"
@@ -1232,35 +1232,35 @@ ejs@^3.1.8:
dependencies:
jake "^10.8.5"
electron-builder@^26.0.0:
version "26.0.0"
resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-26.0.0.tgz#f5c03b049e3e9b0d3da7737f93bf1a830d1f17bb"
integrity sha512-R1ZNTCtwjApiELkE4LTNIF6UkV+FMgyDIjILlsVvFak8Jr60cI9gu4q3lVALYzGBcFyzHKn2RPp6j0gl5kuVow==
electron-builder@^26.0.0-alpha.10:
version "26.0.0-alpha.10"
resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-26.0.0-alpha.10.tgz#6f629f5f1f3340286af71cabd12d94edc53f15ea"
integrity sha512-QTitqOlP5aZ/8zhnxqjRb6BxSR7Kvwv07PoBGeIXADwSPHQhKhZ+S+GRFzUSYQrMTTJLGzUHbnAes6fZ3uThEA==
dependencies:
app-builder-lib "26.0.0"
builder-util "26.0.0"
builder-util-runtime "9.3.0"
app-builder-lib "26.0.0-alpha.10"
builder-util "26.0.0-alpha.10"
builder-util-runtime "9.3.0-alpha.0"
chalk "^4.1.2"
dmg-builder "26.0.0"
dmg-builder "26.0.0-alpha.10"
fs-extra "^10.1.0"
is-ci "^3.0.0"
lazy-val "^1.0.5"
simple-update-notifier "2.0.0"
yargs "^17.6.2"
electron-log@^5.3.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-5.3.0.tgz#503a911983db09156965595a7ee9a39f2d9d6384"
integrity sha512-ILgbh2k9IKbSaN8NAbQriVteEhmkdLo/e4J1dg+JIBTFzXS/kO8zNRZBh/4YPwIT/zeyxF1jP6Xz8GLsPE2IBQ==
electron-log@^5.2.4:
version "5.2.4"
resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-5.2.4.tgz#6b488d9db80aa3c6f3dc39bcd635fc9d1f79c8af"
integrity sha512-iX12WXc5XAaKeHg2QpiFjVwL+S1NVHPFd3V5RXtCmKhpAzXsVQnR3UEc0LovM6p6NkUQxDWnkdkaam9FNUVmCA==
electron-publish@26.0.0:
version "26.0.0"
resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-26.0.0.tgz#f37b9babe62885c2ee552af2817bf2048b566637"
integrity sha512-0MOeYp1IRDj+jdkWluEVMer8fpc/htwWJZdGQUMbbbhgMnX8AvDdwHuR0UdaPFLDJ076E9YHd2urkeFyLm7PUQ==
electron-publish@26.0.0-alpha.10:
version "26.0.0-alpha.10"
resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-26.0.0-alpha.10.tgz#16ac95acca2d796ca00c7a90ca27ebf31855f284"
integrity sha512-yUkCJD7MLN57d6PJ8PMcBCR35xytA+jHyrOiS/H0hlmTOWq1sXN+tIBylX4h0dD/C6mn75/y5eE156Pe2nccPw==
dependencies:
"@types/fs-extra" "^9.0.11"
builder-util "26.0.0"
builder-util-runtime "9.3.0"
builder-util "26.0.0-alpha.10"
builder-util-runtime "9.3.0-alpha.0"
chalk "^4.1.2"
form-data "^4.0.0"
fs-extra "^10.1.0"
@@ -1275,12 +1275,12 @@ electron-store@^8.2.0:
conf "^10.2.0"
type-fest "^2.17.0"
electron-updater@^6.4.0:
version "6.4.0"
resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-6.4.0.tgz#f413e5d1cb4fadde451eb7daa585ddb6332e2409"
integrity sha512-E2fqL3GrVaXGZm2w95s4kJuPIF633pi5GhEy1/ReOHjDW9h/C0mZ1LXcLq0LsyQ4vyVj9UsdRb4E+Zy/d7RKUw==
electron-updater@^6.4.0-alpha.3:
version "6.4.0-alpha.3"
resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-6.4.0-alpha.3.tgz#4c33647c79f7ea1bcd184aac8a0b15d5a2b37cf1"
integrity sha512-pqbEqfKVly49UO3QhnRnzghK75BW6v6ZrpW/2vs+ZVVxHmrdwEl1bTjJFQl1LSIBABpBEwT5W9uwf3cKfrD+Bg==
dependencies:
builder-util-runtime "9.3.0"
builder-util-runtime "9.3.0-alpha.0"
fs-extra "^10.1.0"
js-yaml "^4.1.0"
lazy-val "^1.0.5"
@@ -1289,10 +1289,10 @@ electron-updater@^6.4.0:
semver "^7.6.3"
tiny-typed-emitter "^2.1.0"
electron@^34.1.1:
version "34.1.1"
resolved "https://registry.yarnpkg.com/electron/-/electron-34.1.1.tgz#1fc766e406401834fedb9747c4ca58671d9a1e46"
integrity sha512-1aDYk9Gsv1/fFeClMrxWGoVMl7uCUgl1pe26BiTnLXmAoqEXCa3f3sCKFWV+cuDzUjQGAZcpkWhGYTgWUSQrLA==
electron@^34.0.0:
version "34.0.0"
resolved "https://registry.yarnpkg.com/electron/-/electron-34.0.0.tgz#30ccedbc02d2f036868b8278960fd0e438ec0e52"
integrity sha512-fpaPb0lifoUJ6UJa4Lk8/0B2Ku/xDZWdc1Gkj67jbygTCrvSon0qquju6Ltx1Kz23GRqqlIHXiy9EvrjpY7/Wg==
dependencies:
"@electron/get" "^2.0.0"
"@types/node" "^20.9.0"
@@ -3202,10 +3202,10 @@ truncate-utf8-bytes@^1.0.0:
dependencies:
utf8-byte-length "^1.0.1"
ts-api-utils@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.0.1.tgz#660729385b625b939aaa58054f45c058f33f10cd"
integrity sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==
ts-api-utils@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.0.0.tgz#b9d7d5f7ec9f736f4d0f09758b8607979044a900"
integrity sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==
tslib@^2.1.0, tslib@^2.6.2:
version "2.7.0"
@@ -3234,14 +3234,14 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==
typescript-eslint@^8.23.0:
version "8.23.0"
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.23.0.tgz#796deb48f040146b68fcc8cb07db68b87219a8d2"
integrity sha512-/LBRo3HrXr5LxmrdYSOCvoAMm7p2jNizNfbIpCgvG4HMsnoprRUOce/+8VJ9BDYWW68rqIENE/haVLWPeFZBVQ==
typescript-eslint@^8.21.0:
version "8.21.0"
resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.21.0.tgz#78bdb83a6d771f0312b128297d84a3111885fd08"
integrity sha512-txEKYY4XMKwPXxNkN8+AxAdX6iIJAPiJbHE/FpQccs/sxw8Lf26kqwC3cn0xkHlW8kEbLhkhCsjWuMveaY9Rxw==
dependencies:
"@typescript-eslint/eslint-plugin" "8.23.0"
"@typescript-eslint/parser" "8.23.0"
"@typescript-eslint/utils" "8.23.0"
"@typescript-eslint/eslint-plugin" "8.21.0"
"@typescript-eslint/parser" "8.21.0"
"@typescript-eslint/utils" "8.21.0"
typescript@^5.4.3:
version "5.5.4"

View File

@@ -8,13 +8,6 @@ export default defineConfig({
head: [["link", { rel: "icon", type: "image/png", href: "/favicon.png" }]],
cleanUrls: true,
ignoreDeadLinks: "localhostLinks",
vite: {
build: {
rollupOptions: {
external: ['client-museum-s3.png'] // Added to handle static asset import
}
}
},
themeConfig: {
// We use the default theme (with some CSS color overrides). This
// themeConfig block can be used to further customize the default theme.

View File

@@ -118,10 +118,6 @@ export const sidebar = [
text: "Export",
link: "/photos/faq/export",
},
{
text: "Metadata",
link: "/photos/faq/metadata",
},
{
text: "Security and privacy",
link: "/photos/faq/security-and-privacy",
@@ -135,12 +131,12 @@ export const sidebar = [
link: "/photos/faq/hidden-and-archive",
},
{
text: "Machine Learning",
link: "/photos/faq/machine-learning",
text: "Photo dates",
link: "/photos/faq/photo-dates",
},
{
text: "Video Streaming",
link: "/photos/faq/video-streaming",
text: "Machine Learning",
link: "/photos/faq/machine-learning",
},
],
},
@@ -251,6 +247,15 @@ export const sidebar = [
text: "Hosting the web app",
link: "/self-hosting/guides/web-app",
},
{
text: "Administering your server",
link: "/self-hosting/guides/admin",
},
{
text: "Mobile build",
link: "/self-hosting/guides/mobile-build",
},
{
text: "Configuring S3",
link: "/self-hosting/guides/configuring-s3",
@@ -271,15 +276,6 @@ export const sidebar = [
text: "Configure CLI for Self Hosted Instance",
link: "/self-hosting/guides/selfhost-cli",
},
{
text: "Administering your server",
link: "/self-hosting/guides/admin",
},
{
text: "Mobile build",
link: "/self-hosting/guides/mobile-build",
},
],
},
{

View File

@@ -31,7 +31,7 @@ album structure how you have set up within Ente.
Yes, the metadata is written out to a separate JSON file during export. Note
that the original is not modified. For more details, see the
[description of the exported metadata](/photos/faq/metadata#export).
[description of the exported metadata](/photos/faq/photo-dates#export).
## Can I do a 2-way sync?

View File

@@ -1,9 +1,9 @@
---
title: Metadata
title: Photo dates
description: Handling of metadata, in particular creation dates, in Ente Photos
---
# Metadata
# Photos dates
This document describes Ente's handling of metadata, in particular photo
creation dates.

View File

@@ -1,63 +0,0 @@
---
title: Video Streaming FAQ
description:
Frequently asked questions about Ente's Video Streaming feature
---
# Video Streaming
> [!NOTE]
>
> Video streaming is available in beta on mobile apps starting v0.9.98.
### How to enable video streaming?
- Open Settings -> General -> Advanced
- Switch on the toggle for `Video streaming`
### What happens when I enable video streaming?
Enabling video streaming will start processing videos captured in the last 30
days, generating streams for each. Both local and remote videos will be
processed, so this may consume bandwidth for downloading of remote files and
uploading of the generated streams.
### How can I view video streams?
Settings -> Backup > Backup status will show details regarding the processing
status for videos. Processed videos will have a green play button next to them.
You can open these videos by tapping on them.
Processed videos will show a `Play stream` button, clicking which will load and
play the stream.
Clicking on the `Info` icon within the original video will show details
about the generated stream.
### What is a stream?
Stream is an encrypted HLS file with an `.m3u8` playlist that helps play a video
with support for seeking **without** downloading the full file.
Currently it converts videos into `720p` with `2mbps` bitrate in `H.264` format.
The generated stream is single blob (encrypted with AES) while the playlist file
(`.m3u8`) is another blob (encrypted using XChaCha20).
We cannot read the contents, duration or the number of chunks within the
generated stream.
### Will streams consume space in my storage?
While this feature is in beta, we will not count the storage consumed by your
streams against your storage quota. This may change in the future. If it does,
we will provide an option to opt-in to one of the following:
1. Original videos only
2. Compressed streams only
3. Both
### Something doesn't seem right, what to do?
As video streaming is still in beta, some things might not work correctly.
Please create a thread within the `#feedback` channel on
[Discord](https://discord.com/channels/948937918347608085/1121126215995113552)
or reach out to [support@ente.io](mailto:support@ente.io).

View File

@@ -43,10 +43,6 @@ need to disable this "Optimize battery usage" mode in the system settings for
Ente if you wish for Ente to automatically back up your photos in the
background.
On Android versions 15 and later, if an app is in private space and the private
space is locked, Android doesnt allow the app to run any background processes.
As a result, background sync will not work.
### Desktop
In addition to our mobile apps, the background sync also works on our desktop

View File

@@ -54,6 +54,6 @@ duplicates across different albums, but wish to keep only one copy.
## Adding to Ente album creates symlinks
Note that once a file is in Ente, adding it to another Ente album will create a
Note that once a file in is Ente, adding it to another Ente album will create a
symlink, so that you can add it to as many albums as you wish but storage will
only be counted once.

View File

@@ -46,7 +46,7 @@ it with Ente.
> While the app supports uploading multiple ZIPs too, we recommend unzipping
> them all into a single folder and uploading that folder instead so that your
> photo dates are imported properly
> ([details](/photos/faq/metadata#importing-from-google-takeout)).
> ([details](/photos/faq/photo-dates#importing-from-google-takeout)).
>
> <br />
>

View File

@@ -20,25 +20,23 @@ the logs just make the process a bit faster and easier.
- Select for the option to _Report a Bug_.
- Tap on _Report a bug_.
## Desktop and Web
## Desktop
- Click on _Help_ menu at the top of your screen, and select the _View logs_
option.
- Open settings (click on the three horizontal lines button located at the top
left corner of the screen).
- Click on the _Help_ option towards the bottom of settings.
- Click on _View logs_. This will show you the location of the logs on your
system (desktop), or download them from the browser onto your computer (web).
- Go back to settings.
- Click on _Support_. This will open your email client where you can attach the
logs in the email and describe the issue.
## Desktop
## Web
On the desktop app, you can also directly view the logs on your computer at the
following locations:
- macOS: `~/Library/Logs/ente/ente.log`
- Linux: `~/.config/ente/logs/ente.log`
- Windows: `%USERPROFILE%\AppData\Roaming\ente\logs\ente.log`
- Open settings (click on the three horizontal lines button located at the top
left corner of the screen).
- Click on _Debug Logs_ towards the bottom of settings.
- Click on _Download logs_
- Click on _Support_. This will open your email client where you can attach the
logs in the email and describe the issue.
## Send email manually

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

View File

@@ -5,9 +5,7 @@ description:
from outside localhost
---
# Components of the Architecture
![Client, Museum, S3](/client-museum-s3.png)
# Configuring S3
There are three components involved in uploading:
@@ -26,8 +24,6 @@ interaction goes something like this:
The upshot of this is that _both_ the client and museum should be able to reach
your S3 bucket.
## Configuring S3
The URL for the S3 bucket is configured in
[scripts/compose/credentials.yaml](https://github.com/ente-io/ente/blob/main/server/scripts/compose/credentials.yaml#L10).
You can edit this file directly when testing, though it is just simpler and more
@@ -36,64 +32,61 @@ and put your custom configuration there (in your case, you can put an entire
`s3` config object in your `museum.yaml`).
> [!TIP]
>
> For more details about these configuration objects, see the documentation for
> the `s3` object in
> [configurations/local.yaml](https://github.com/ente-io/ente/blob/main/server/configurations/local.yaml).
By default, you only need to configure the endpoint for the first bucket.
The docker compose file is shipped with MinIO as the Self Hosted S3 Compatible Storage.
By default, MinIO server is served on `localhost:3200` and the MinIO UI on
`localhost:3201`.
For example, in a localhost network situation, the way this
connection works is, Museum (`1`) and MinIO (`2`) run on the same docker network and
the web app (`3`) which will also be hosted on the localhost. This enables all the
three components of the setup being able to communicate with each other seamlessly.
> [!NOTE]
>
> If you're wondering why there are 3 buckets - that's because our production
> instance uses these to perform replication.
>
> However, in a self hosted setup replication is off by default (you can turn it
> on if you want). When replication is turned off, only the first bucket (it
> must be named `b2-eu-cen`) is used, and you can ignore the other two. Use the
> `hot_bucket` option if you'd like to set one of the other predefined buckets
> as the "first" bucket.
The `endpoint` for the first bucket in the starter `credentials.yaml` is
`localhost:3200`. The way this works then is that both museum (`2`) and minio
(`3`) are running within the same Docker compose cluster, so are able to reach
each other. If at this point we were to run the web app (`1`) on localhost (say
using `yarn dev:photos`), it would also run on localhost and thus would be able
to reach `3`.
If you were to try and connect from a mobile app, this would not work since
`localhost:3200` would not resolve on your mobile. So you'll need to modify this
endpoint to a value, say `yourserverip:3200`, so that the mobile app can also
reach it.
The same principle applies if you're deploying to your custom domain.
## Replication
If you're wondering why there are 3 buckets on MinIO UI - that's because our
production instance uses these to perform [replication](https://ente.io/reliability/).
In a self hosted Ente Instance replication is turned off by default.
When replication is turned off, only the first bucket (`b2-eu-cen`) is used,
and you can ignore the other two. Use the `s3.hot_storage.primary` option
if you'd like to set one of the other predefined buckets as the primary bucket.
> [!IMPORTANT]
> As of now, Replication works only if all the 3 storage type
> needs are fulfilled (1 Hot, 1 Cold and 1 Glacier Storage).
>
> [Reference](https://github.com/ente-io/ente/discussions/3167#discussioncomment-10585970)
## SSL Configuration
> [!NOTE]
>
> If you need to configure SSL, for example if you're running over the internet,
> you'll need to turn off `s3.are_local_buckets` (which disables SSL in the
> default starter compose template).
>
> Disabling `s3.are_local_buckets` also switches to the subdomain style URLs for
> the buckets. However, not all S3 providers support these, in particular, minio
> does not work with these in default configuration. So in such cases you'll
> also need to then enable `s3.use_path_style_urls`.
Disabling `s3.are_local_buckets` also switches to the subdomain style URLs for
the buckets. However, not all S3 providers support these, in particular, minio
does not work with these in default configuration. So in such cases you'll
also need to then enable `s3.use_path_style_urls`.
## Summary
To summarize:
Set the S3 bucket `endpoint` in `credentials.yaml` to a `yourserverip:3200` or
some such IP/hostname that accessible from both where you are running the Ente
clients (e.g. the mobile app) and also from within the Docker compose cluster.
#### Example
### Example
An example `museum.yaml` when you're trying to connect to museum running on your
computer from your phone on the same WiFi network:
```yaml
```
s3:
are_local_buckets: true
b2-eu-cen:
@@ -104,20 +97,6 @@ s3:
bucket: b2-eu-cen
```
## FAE (Frequently Answered Errors)
Here are some Frequently Answered Errors from the Community Chat with the reasoning
for a particular error and its potential fix.
In most situations, the problem turns out to be some minute mistakes or misconfigurations
on the users end and that turns out to be the bottleneck of the whole problem.
Please make sure to `reverse_proxy` Museum to a domain as well as check your S3
Credentials and whole config for any minor mis-configurations.
It is also suggested that the user setups Bucket CORS on MinIO or any external
S3 Bucket they are connecting to. To setup Bucket CORS, help yourself by upload
[this](https://help.ente.io/self-hosting/guides/external-s3#_5-fix-potential-cors-issue-with-your-bucket).
### 403 Forbidden
If museum (`2`) is able to make a network connection to your S3 bucket (`3`) but
@@ -129,24 +108,11 @@ corresponding object exists in the S3 bucket.
To fix these, you should ensure the following:
1. The bucket CORS rules do not allow museum to access these objects.
- For uploading files from the browser, you will need to currently set
allowedOrigins to "\*", and allow the "X-Auth-Token", "X-Client-Package"
headers configuration too.
[Here is an example of a working configuration](https://github.com/ente-io/ente/discussions/1764#discussioncomment-9478204).
> For uploading files from the browser, you will need to currently set
> allowedOrigins to "\*", and allow the "X-Auth-Token", "X-Client-Package"
> headers configuration too.
> [Here is an example of a working configuration](https://github.com/ente-io/ente/discussions/1764#discussioncomment-9478204).
2. The credentials are not being picked up (you might be setting the correct
creds, but not in the place where museum picks them from).
### Mismatch in File Size
The "Mismatch in File Size" error mostly occurs in a situation where the client (`1`)
is re-uploading a file which is already in the bucket with a different File Size. The
reason for re-upload could be anything including Network issue, sudden killing of app
before the upload is complete and etc.
This is also one of Museums (`2`) Validation Checks for the size of file being
re-uploaded from the client to the size of the file which is already
uploaded to the S3 Bucket.
In most case, it is very unlikely that this error could be a cause of some mistake in
the configuration or Browser/Bucket CORS.

View File

@@ -51,8 +51,8 @@ COPY apps/ .
RUN corepack enable
# Endpoint for Ente Server
ENV NEXT_PUBLIC_ENTE_ENDPOINT=https://your-ente-endpoint.com
ENV NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT=https://your-albums-endpoint.com
NEXT_PUBLIC_ENTE_ENDPOINT=https://your-ente-endpoint.com
NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT=https://your-albums-endpoint.com
RUN yarn cache clean
RUN yarn install --network-timeout 1000000000

View File

@@ -24,10 +24,12 @@
.link-text {
display: flex;
align-items: center;
padding: 0 16px; /* Add padding for better appearance */
text-decoration: none; /* Remove underline */
color: inherit; /* Inherit color from parent */
font-weight: bold; /* Make the text bold */
font-size: 40px;
margin-bottom: 25px;
}
.duckie-container {
@@ -60,7 +62,7 @@
flex-direction: column;
align-items: center;
justify-content: space-around;
margin: 20px;
marign: 20px;
}
.horizontal-group {

View File

@@ -1,3 +1,4 @@
import { Link } from "@mui/material";
import Box from "@mui/material/Box";
import Button from "@mui/material/Button";
import CircularProgress from "@mui/material/CircularProgress";
@@ -232,6 +233,7 @@ const App: React.FC = () => {
) => {
setTabValue(newValue);
};
useEffect(() => {
const searchParam = new URLSearchParams(window.location.search);
const userToken = searchParam.get("token");
@@ -239,9 +241,23 @@ const App: React.FC = () => {
if (userToken) {
setLocalToken(userToken);
setToken(userToken);
const editToken = document.getElementById(":r1:");
if (editToken instanceof HTMLInputElement) {
editToken.readOnly = true;
}
}
}, []);
const updateToken = () => {
const editToken = document.getElementById(":r1:");
if (editToken instanceof HTMLInputElement) {
editToken.readOnly = false;
// Change focus to token field
editToken.focus();
}
};
return (
<div className="container">
<div>
@@ -256,6 +272,30 @@ const App: React.FC = () => {
staff.ente.io
</a>
<div className="text-fields">
<div
style={{
display: "flex",
flexDirection: "column",
}}
>
<TextField
label="Token"
value={localToken}
onChange={(e) => {
setLocalToken(e.target.value);
setToken(e.target.value);
}}
size="medium"
className="text-field-token"
style={{ maxWidth: "parent" }}
/>
<Link
style={{ textAlign: "left" }}
onClick={updateToken}
>
Update Token?
</Link>
</div>
<TextField
label="Email"
value={localEmail}

View File

@@ -22,10 +22,6 @@ interface Subscription {
originalTransactionID: string;
expiryTime: number;
userID: string;
attributes: {
customerID: string;
stripeAccountCountry: string;
};
}
interface UserDataResponse {
@@ -44,10 +40,6 @@ interface FormValues {
transactionId: string;
expiryTime: string | Date | null;
userId: string;
attributes: {
customerID: string;
stripeAccountCountry: string;
};
}
const UpdateSubscription: React.FC<UpdateSubscriptionProps> = ({
@@ -61,10 +53,6 @@ const UpdateSubscription: React.FC<UpdateSubscriptionProps> = ({
transactionId: "",
expiryTime: "",
userId: "",
attributes: {
"customerID": "",
"stripeAccountCountry": ""
},
});
const [isDatePickerOpen, setIsDatePickerOpen] = useState(false);
@@ -107,10 +95,6 @@ const UpdateSubscription: React.FC<UpdateSubscriptionProps> = ({
"",
expiryTime: expiryTime,
userId: userDataResponse.subscription.userID || "",
attributes: {
customerID: userDataResponse.subscription.attributes.customerID || "",
stripeAccountCountry: userDataResponse.subscription.attributes.stripeAccountCountry || ""
}
});
} catch (error) {
console.error("Error fetching data:", error);
@@ -172,10 +156,6 @@ const UpdateSubscription: React.FC<UpdateSubscriptionProps> = ({
productId: values.productId,
paymentProvider: values.provider,
transactionId: values.transactionId,
attributes: {
customerID: values.attributes.customerID,
stripeAccountCountry: values.attributes.stripeAccountCountry
}
};
try {

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