Compare commits

..

873 Commits

Author SHA1 Message Date
3498915234 added min-height 2022-09-30 22:39:24 +02:00
fa22d4596e implement comment handlers 2022-09-30 22:35:06 +02:00
e781efc5ae added Post model 2022-09-30 22:32:56 +02:00
b88dcddf56 implement Comments logic to server 2022-09-30 22:32:31 +02:00
1e6a076b34 fix PostCreator keydown handler logic 2022-09-30 22:32:20 +02:00
7c015f04af implement CommentCreator logic 2022-09-30 21:49:30 +02:00
6baeeb794f advise if user is not logged in 2022-09-30 16:26:52 +02:00
6524520436 added search item to sidebar 2022-09-30 16:26:36 +02:00
ce07ba04f5 bump version 2022-09-30 15:56:08 +02:00
bdd4c57bd7 use model register 2022-09-30 15:54:14 +02:00
0d55c5ddf7 implement register 2022-09-30 15:53:58 +02:00
400274bb4e handle app.openRegister 2022-09-30 15:53:44 +02:00
9744c172ea remove administration pages 2022-09-30 15:53:16 +02:00
4a8f80c75c fix: submit form when next is called but has no more steps 2022-09-30 15:52:59 +02:00
efe9035fc0 update gitignore 2022-09-30 00:33:13 +02:00
0dd8182c05 improve release script 2022-09-30 00:32:56 +02:00
bab6ae0a99 added 7zip-min 2022-09-30 00:32:48 +02:00
5a8226b149 update .gitignore 2022-09-30 00:02:34 +02:00
ed7932e9c3 bump version 2022-09-29 23:58:47 +02:00
7e2765cf97 added release script 2022-09-29 23:58:28 +02:00
383c8af40e added example.env 2022-09-29 23:14:51 +02:00
a2943b3dbe added authPath 2022-09-29 23:14:44 +02:00
9c20aa82f9 added electron-builder 2022-09-29 23:14:33 +02:00
bdb6c10597 remove desktop package 2022-09-29 23:14:22 +02:00
ec5836d5a4 Added package description 2022-09-29 22:01:00 +02:00
ee2c8952e8 non logged users navs to login on "/" route 2022-09-29 22:00:51 +02:00
fd69c27bd5 fix login style 2022-09-29 21:44:13 +02:00
e61937622f fix const 2022-09-29 21:42:57 +02:00
abd6f24135 update linebridge 2022-09-29 21:01:35 +02:00
d013cf104b fix paths 2022-09-29 19:55:30 +02:00
21690676e1 implement desktop versions 2022-09-29 16:59:56 +02:00
f1b9a36885 added min-height 2022-09-29 16:03:52 +02:00
a59d9a4671 update .gitignore 2022-09-29 14:14:48 +02:00
1e67cb7c80 fix width 2022-09-29 14:14:01 +02:00
9be707f843 support disabled creators 2022-09-29 13:39:28 +02:00
83afd0b0e6 added inline todo's 2022-09-29 13:33:51 +02:00
f07e0060ea fix title word break 2022-09-29 13:33:42 +02:00
df7a661d4d format 2022-09-29 13:28:38 +02:00
4fec089f72 fix uploader colors 2022-09-29 12:49:18 +02:00
6320f76f3b added Playlist Creator 2022-09-29 12:31:14 +02:00
cd0f121c65 show message on playlist 2022-09-29 12:31:07 +02:00
7c041aa68f fix buttons style 2022-09-29 11:53:20 +02:00
36af24d555 fix primary button disabled color 2022-09-29 11:46:38 +02:00
c6030368bf fix default button color & margin 2022-09-29 11:39:17 +02:00
562ec6561a move creators to folders 2022-09-29 10:10:23 +02:00
98929af2de remove unwanted log 2022-09-29 10:08:06 +02:00
9edfa9a12b clear default theme 2022-09-29 10:07:40 +02:00
1a751c7c30 fix colors 2022-09-28 23:42:03 +02:00
160b2312ba clean some 2022-09-28 23:41:53 +02:00
95d2154e07 Merge branch 'master' of https://github.com/ragestudio/comty 2022-09-26 15:54:46 +02:00
0088b2f371 added Creator 2022-09-26 15:54:42 +02:00
srgooglo
7fb3997d66
Merge pull request #65 from ragestudio/posts-comments
0.20.0
2022-09-26 15:53:45 +02:00
83af4ca70a implement Modal to default layout 2022-09-26 15:48:36 +02:00
494ded2069 added Modal to layout 2022-09-26 15:48:20 +02:00
2ef7259767 handle onPost 2022-09-26 15:46:29 +02:00
630e64b4d7 bump version 2022-09-21 22:12:32 +02:00
ef881800a4 handle custom events on click 2022-09-21 22:12:18 +02:00
79cb7aa2a9 fix text color 2022-09-21 22:12:08 +02:00
aa6a24dce6 format 2022-09-21 22:11:59 +02:00
511e0a9444 added minio dep 2022-09-21 19:09:31 +02:00
71c37a1e5c use StorageClient 2022-09-21 19:09:22 +02:00
0a55547e3e added PlaylistController 2022-09-21 19:07:48 +02:00
d1d5cc15ae implement s3 2022-09-21 19:07:39 +02:00
6050aab515 added videoTranscode lib 2022-09-21 19:03:43 +02:00
1c6a777e58 added toBoolean 2022-09-21 19:02:47 +02:00
c1e38700c6 added StorageClient 2022-09-21 19:02:35 +02:00
a9467902dd implement AudioPlayer core 2022-09-20 00:52:33 +02:00
1d96dab892 implement media player 2022-09-20 00:52:20 +02:00
0386efefd1 added post types 2022-09-20 00:51:56 +02:00
aea5601acd support post types 2022-09-20 00:51:37 +02:00
f1cd2b2ced show no data 2022-09-20 00:51:26 +02:00
9a7dde3f7e update antd 2022-09-20 00:51:17 +02:00
7f7aa51912 added no_song asset 2022-09-20 00:51:09 +02:00
db309eff08 cover expands on click 2022-09-19 15:23:46 +02:00
3b07c8f25a fullfill nullish 2022-09-19 15:23:30 +02:00
srgooglo
c6953bdc6a
Merge pull request #64 from ragestudio/posts-comments
Posts comments
2022-09-16 15:06:47 +02:00
d95898dfa3 added CommentsCards 2022-09-16 15:03:15 +02:00
79f22acd62 update exports 2022-09-16 15:03:00 +02:00
7afb980e77 added CommentsCards to components 2022-09-16 15:02:52 +02:00
6711a2c2c9 improve fullmode post layout 2022-09-16 15:02:40 +02:00
5b8ca313fe expose CommentsControllers to api 2022-09-16 15:02:22 +02:00
6b10e4f778 implement CommentsController basics 2022-09-16 15:02:11 +02:00
decf416dd9 update schema 2022-09-16 15:01:50 +02:00
4439b6693c added CommentCreator 2022-09-16 15:01:36 +02:00
6b26762faa added text-color 2022-09-16 15:00:56 +02:00
d89c2a1c7a added customRequest to api core 2022-09-13 17:49:23 +02:00
01339a175f fix endpoint 2022-09-09 20:38:27 +02:00
4913dedb30 added PostSave methods 2022-09-09 20:38:18 +02:00
adeb82629e added withOptionalAuthentication middleware 2022-09-09 18:57:31 +02:00
ff5f156ed0 fix signLifetime 2022-09-09 17:48:46 +02:00
4a2c852547 app now not automatly open login drawer 2022-09-09 17:44:06 +02:00
97e959f9d7 reimplement authentification process and regeneration system 2022-09-09 17:42:21 +02:00
12938553d7 fix endpoints 2022-09-09 17:41:39 +02:00
b29f51332c update linebridge 2022-09-09 17:41:06 +02:00
eb1f349cb4 fix DeletePost method 2022-09-09 13:12:19 +02:00
5ad8dbed87 reimplement PostController 2022-09-09 12:23:24 +02:00
7cf549d65f update comment schema 2022-09-08 20:41:02 +02:00
7ce1677b30 implement delete and put methods 2022-09-08 20:40:44 +02:00
54867d7eb1 fix style 2022-09-08 20:35:24 +02:00
6234cae12c format 2022-09-08 19:08:57 +02:00
07d99cd68d added notifications page 2022-09-08 19:05:38 +02:00
a7f47ea059 remove streams page 2022-09-08 19:05:28 +02:00
45d646e609 added more cards 2022-09-08 19:05:20 +02:00
c3d8b47c61 update font-family for h1,h2 2022-09-08 19:05:12 +02:00
927be26ece update administration 2022-09-08 19:04:26 +02:00
429a12cbf4 added Notification bottom sidebar item 2022-09-08 19:04:15 +02:00
f3d1029502 update export 2022-09-08 19:03:39 +02:00
c78141a622 added TODO 2022-09-08 19:03:33 +02:00
ff6ba48f8a added HashtagTrendings component 2022-09-08 19:03:24 +02:00
3a6a7b3fcc remove unnecesary sidebar keys 2022-09-08 19:03:05 +02:00
aaf5454b3a added panels to home 2022-09-08 18:41:04 +02:00
44db4fc2c7 added LivestreamsBrowser 2022-09-08 18:40:54 +02:00
d14af06f09 improve account page 2022-09-08 16:52:54 +02:00
1c6e460d25 remove justify-content 2022-09-08 16:52:06 +02:00
71491750d2 expose BadgesController to api 2022-09-08 16:51:25 +02:00
fc751a101d added react-loadable dep 2022-09-08 16:51:12 +02:00
f11f30a7dc fix badge schema 2022-09-08 16:50:54 +02:00
83dc6bb2f0 added BadgesController 2022-09-08 16:50:44 +02:00
4d4b9b3050 format 2022-09-07 17:44:11 +02:00
1d42463c85 remove unwanted log 2022-09-07 17:43:57 +02:00
49e43a37d2 added author to schema 2022-09-07 17:35:25 +02:00
48bfa5da4d fix new_featured_wallpaper 2022-09-07 17:35:17 +02:00
b9381982d2 added login page 2022-09-07 17:35:04 +02:00
861e2485d9 fix style 2022-09-07 16:31:34 +02:00
c030bafb8a remove no_session event 2022-09-07 16:31:21 +02:00
7224f3dec7 fix copyright 2022-09-07 16:31:02 +02:00
aeffda6ea1 split author and copyright 2022-09-07 16:30:53 +02:00
27333be7ac implement featuredWallpaper endpoints 2022-09-07 15:18:56 +02:00
e39225b338 added featuredWallpaper model 2022-09-07 15:18:42 +02:00
80aae3b17b added Space Grotesk to fonts 2022-09-07 15:18:12 +02:00
90b126db68 moved backgroundDecorator to layout 2022-09-07 15:17:53 +02:00
d2e3c6008f remove antd.Layout 2022-09-07 15:17:29 +02:00
f25a5a9541 added Footer component 2022-09-07 15:17:12 +02:00
54242ada92 added footerLinks to config 2022-09-07 15:17:02 +02:00
aee251c692 fix withAuthentication 2022-09-07 13:51:20 +02:00
7b311834ab fix session.created logic 2022-09-07 13:32:45 +02:00
b67e3a6db0 handle transitions behavior when not exist an transitionLayer 2022-09-07 13:27:31 +02:00
f43a20548e improve sessions.created behavior 2022-09-07 13:26:37 +02:00
0726833e9b added login layout 2022-09-07 13:26:19 +02:00
be8bc6f633 improve layouts 2022-09-07 13:17:17 +02:00
0ff3ac3016 remove unwanted logs 2022-09-07 12:43:42 +02:00
f50d3aeb24 add page title 2022-09-07 12:29:22 +02:00
ef5ef4c90f improve router and page transition logic 2022-09-07 12:29:06 +02:00
1c534a3946 update debug profiles 2022-09-07 12:28:21 +02:00
c8155ad435 added post page 2022-09-07 11:15:54 +02:00
f1c2c38700 open post when double click 2022-09-07 11:15:38 +02:00
7b655a9a65 added fullmode 2022-09-07 11:15:25 +02:00
adbb5fca95 fix router setLocation 2022-09-07 11:14:36 +02:00
94228561b1 fix middlewares withAuthentication 2022-09-05 04:40:15 +02:00
eb75941d52 declare middlewares every endpoint 2022-09-04 03:28:01 +02:00
3d034e9ccf added administration page 2022-09-03 04:58:02 +02:00
54f8cbfb53 remove capacitor storage support 2022-09-03 04:54:08 +02:00
a1a1a460a6 clean 2022-09-03 04:53:59 +02:00
da6c1837cf check permissions route 2022-09-03 04:53:46 +02:00
e1ca4f5b31 added permissions core 2022-09-03 04:53:29 +02:00
7f144e8053 update routes 2022-09-03 04:53:19 +02:00
eab2c8d91f move explore page to home 2022-09-03 03:47:41 +02:00
480d5eefd6 index move to mainPath 2022-09-03 03:46:44 +02:00
89a5f9ffae attach to content api 2022-09-03 03:45:34 +02:00
2000562659 added extension tab settings 2022-09-03 03:34:50 +02:00
75e35b234d check if data is array 2022-09-03 03:27:03 +02:00
aa9211e75c split controller init 2022-08-05 20:04:02 +02:00
9290fc0a5d fix route 2022-08-05 20:03:43 +02:00
dfcf086d6c remove serverStatus component 2022-08-04 17:35:12 +02:00
2cb806fde9 remove websocketApi 2022-08-04 17:30:17 +02:00
f44b07b8e6 update linebridge dep 2022-08-04 17:29:29 +02:00
503c1f0772 added auth_api 2022-08-04 17:06:24 +02:00
0ece8d3cab update to linebridge 0.12.0 2022-08-04 17:06:00 +02:00
6d99264686 bump version 2022-08-04 12:48:36 +02:00
srgooglo
16c418f2b1
Merge pull request #63 from ragestudio/apis-controller
reimplement api, with namespaces
2022-08-04 12:47:03 +02:00
a09b79aaea reimplement api, with namespaces 2022-08-04 12:46:20 +02:00
8d42494f10 added early mediaPlayer 2022-08-04 11:57:45 +02:00
9f8f66391a set classname atribute on new DomWindow 2022-08-04 11:57:14 +02:00
4e57d40bcb implement attached elements 2022-08-04 11:56:41 +02:00
3336107811 added cors origin 2022-08-04 11:56:22 +02:00
bba2e31a6b update linebridge 2022-07-01 05:43:05 +02:00
f441a9a02c update default remotes 2022-07-01 05:42:34 +02:00
bd8285762a added multiple envOrigins depending on env 2022-07-01 05:42:25 +02:00
8c67d78d45 rewrited live player 2022-07-01 05:39:40 +02:00
2ed179e918 improve api connection details error 2022-06-29 20:13:29 +02:00
14b302c598 fix development streamingApi address 2022-06-29 19:32:57 +02:00
8425a7b906 fix style apply for live 2022-06-29 19:31:46 +02:00
6bdf9161b5 improve style.autoDarkModeToogle method naming 2022-06-29 19:31:17 +02:00
9b356584eb added style.compactMode handler 2022-06-29 19:30:39 +02:00
424b6bcc1f added getValue to methods 2022-06-29 19:30:24 +02:00
6bf6b8f9a4 added default style.compactMode 2022-06-29 19:29:27 +02:00
c598869675 added layoutMargin & layoutPadding to defaultTheme 2022-06-29 19:29:04 +02:00
d1d4479838 use layoutMargin & layoutPadding from root vars 2022-06-29 19:28:37 +02:00
6f6b7a39e3 remove compactMode logic from layout 2022-06-29 19:28:11 +02:00
59b6a205af move stream player to live page 2022-06-27 08:30:58 +02:00
6607f182ff update linebridge 2022-06-27 08:30:36 +02:00
59523637f3 fix publics envs 2022-06-10 05:40:41 +02:00
bbf7d32ad0 added fix_posts_data endpoint 2022-06-10 05:40:18 +02:00
1b9e005b6d export resolveToUrl 2022-06-06 23:32:47 +02:00
d4812d44cc use express static to server /storage 2022-06-06 23:24:24 +02:00
9fd287bc48 added TODO 2022-06-06 18:42:41 +02:00
9451d8a12f added failed array 2022-06-06 18:42:35 +02:00
8f1155a6d0 added a little padding on top and bottom 2022-06-06 17:29:48 +02:00
0307e866c4 use concurrent map for processing 2022-06-06 17:28:41 +02:00
f67f7152c0 added utils 2022-06-06 17:28:21 +02:00
ba35218f3c improve pending additions process 2022-06-06 17:28:14 +02:00
85477efb8d use class component for PostAdditions 2022-06-06 17:27:58 +02:00
b3bc39daef remove unwanted log 2022-06-06 16:23:47 +02:00
752703a664 fix url prop 2022-06-06 16:19:28 +02:00
445f6552bc disable visibilities on submit 2022-06-06 16:11:07 +02:00
76a038e395 bump version 2022-06-06 16:10:15 +02:00
49999e8acb rewrite component & support additions uploads 2022-06-06 16:09:54 +02:00
a0f641957f fix fetchingData is on false by default 2022-06-06 16:09:34 +02:00
bef9d7552f split PostAdditions component & new addition model 2022-06-06 16:09:11 +02:00
eec2f03ccb support additions 2022-06-06 16:08:49 +02:00
ec7de4b52f increase max files per req 2022-06-06 16:08:26 +02:00
fd9687bef0 remove unnecesary import 2022-06-06 14:54:24 +02:00
bee41497ae added className to bottom 2022-06-06 14:52:43 +02:00
35f7098a14 better loadingIcon style 2022-06-06 14:52:24 +02:00
7def0add0c use display flex to center items 2022-06-06 14:52:15 +02:00
fd5b6b675d remove dep 2022-06-06 14:45:56 +02:00
98ecda8751 fix LoadingComponent was causing memory leaks 2022-06-06 14:45:51 +02:00
1b085aabd6 observer.disconnect when unmount 2022-06-06 14:44:48 +02:00
srgooglo
666b6b2817
Merge pull request #62 from ragestudio/files-controller
Files controller
2022-06-06 12:55:31 +02:00
a938016cea videoTranscode support options 2022-06-06 12:52:54 +02:00
657b557880 use formidable & video transcoder 2022-06-06 12:49:45 +02:00
8107926b4a added uploads dir to gitignore 2022-06-06 12:17:40 +02:00
4f3194141e added express json & urlencoded body parser 2022-06-06 12:16:41 +02:00
98fee074d0 fix middlewares position 2022-06-06 12:07:39 +02:00
23ac71c95e added uploadCachePath 2022-06-06 12:07:09 +02:00
7b7b5650be update deps 2022-06-06 11:32:29 +02:00
573c515860 use express as http engine 2022-06-06 11:32:24 +02:00
e13193f39c disable key toLowerCase 2022-06-06 10:30:03 +02:00
171235bdb9 added todo 2022-06-06 10:29:48 +02:00
c705f11b7e refactor to use functional component 2022-06-06 10:29:42 +02:00
9e8bb06921 fix query trim feed 2022-06-06 10:00:49 +02:00
0b836b2bc9 added deps 2022-06-06 10:00:37 +02:00
fb99301a3c load more posts on feed 2022-06-06 10:00:32 +02:00
fbba723c2c added LoadMore component 2022-06-06 09:59:57 +02:00
ecb43e1a4c added feed_max_fetch setting 2022-06-06 09:59:44 +02:00
b09b82a627 fix mimeType and set extension with lower case 2022-06-05 11:43:32 +02:00
9b3fd166b9 bump version 2022-06-05 11:12:55 +02:00
2aa5c70de6 use new tab methods 2022-06-05 11:09:54 +02:00
089f0826a8 fix renderError style 2022-06-05 10:52:11 +02:00
f06ab1d598 cleanup 2022-06-04 21:19:08 +02:00
e060be2fb9 fix border radius 2022-06-04 21:18:45 +02:00
1a3235013c remove Swipper.Item 2022-06-04 21:18:36 +02:00
d59cae979a implement autoCarrousel & expansibleActions support 2022-06-04 21:15:06 +02:00
a85c157003 implement forceUpdate event 2022-06-04 21:14:19 +02:00
9171b9fa03 update default settinmgs 2022-06-04 21:14:03 +02:00
094770b782 added postCard_expansible_actions setting 2022-06-04 21:13:56 +02:00
00dea75988 added postCard_carrusel_auto 2022-06-04 07:42:29 +02:00
a3006708c4 added posts 2022-06-04 07:42:07 +02:00
f94720c34b added compactWidth setting 2022-06-04 07:06:38 +02:00
e426d7a90b fix message color 2022-06-04 06:28:39 +02:00
c12cb48a48 fix arrows 2022-06-04 06:26:31 +02:00
b7f560e867 clean up 2022-06-04 06:23:28 +02:00
dbd483e768 use new carrusel 2022-06-04 06:07:43 +02:00
4ca1d27138 force build 2022-06-03 23:55:57 +02:00
ac7419ece3 bump version 2022-06-03 21:15:38 +02:00
78c69e6711 use React.createElement 2022-06-03 21:15:23 +02:00
8a6335762d added processString util 2022-06-03 21:13:19 +02:00
f04b4994d6 added message parsing 2022-06-03 21:12:32 +02:00
31733fcd72 added cors options 2022-06-03 20:56:20 +02:00
de775f07a8 fix media render 2022-06-03 20:32:26 +02:00
2b66a44d28 update scripts 2022-06-03 19:35:53 +02:00
394e327430 added cors to server 2022-06-03 19:34:16 +02:00
c3ec2845f1 use savePostData method 2022-06-03 06:26:41 +02:00
ceb4bb9406 remove react-virtualized 2022-06-03 06:26:29 +02:00
4359a1b1b3 added unlisten method 2022-06-03 06:26:08 +02:00
d47f07fe8b pass props.key 2022-06-03 06:25:50 +02:00
b4b2094253 use new PostCard component & use new listing method 2022-06-03 06:25:40 +02:00
85a0d206bb fix style 2022-06-03 06:25:07 +02:00
3bc42bff3c Rewrite in order to use react hooks 2022-06-03 06:03:31 +02:00
e1f68623dc implement toogleLike & cleanup 2022-06-03 05:54:29 +02:00
d69c18e02e handle post.delete events 2022-06-02 21:08:01 +02:00
d590906bb0 fix onDelete prop 2022-06-02 21:07:23 +02:00
eb9b2f4277 format 2022-06-02 20:50:02 +02:00
b8436056c8 added not implemented messages 2022-06-02 20:48:08 +02:00
14937817a4 bump version 2022-06-02 00:59:30 +02:00
0c2ecb5def fix goToAccount 2022-06-02 00:57:16 +02:00
8b7d4b7443 bump version 2022-06-02 00:45:20 +02:00
8ef36e0d40 remove header calls 2022-06-02 00:44:47 +02:00
7068ac021b remove header from layout 2022-06-02 00:44:37 +02:00
18b9fea6b8 implement background images supports 2022-06-02 00:37:03 +02:00
8a032790cd update antd 2022-06-02 00:36:43 +02:00
3a229d2874 pass ctx props 2022-06-02 00:36:31 +02:00
a3995eb988 implement background settings 2022-06-02 00:36:10 +02:00
74168bab9d moved to each folder 2022-06-02 00:35:53 +02:00
48fa9dc010 update default theme 2022-06-02 00:34:43 +02:00
17596ea54a use Image component 2022-06-01 22:43:37 +02:00
54c5472d86 added Cover & Avatar update settings 2022-06-01 21:42:22 +02:00
27c2a26f27 added cover to AllowedPublicUpdateFields 2022-06-01 21:42:05 +02:00
6341247ee5 update deps 2022-06-01 21:41:50 +02:00
81fb5c9d9c avatar more bigger 2022-06-01 21:41:25 +02:00
2af42b80e7 added Image to components 2022-06-01 21:41:01 +02:00
f46b3a4bf7 update deps 2022-06-01 21:14:07 +02:00
021e08a163 force install 2022-06-01 21:03:38 +02:00
ce8bdc8510 added react to peerDependencies 2022-06-01 21:02:50 +02:00
1b10769cee remove capacitor from package 2022-06-01 20:58:04 +02:00
3a1811f5ac fix install dev 2022-06-01 20:56:57 +02:00
8039280ba5 bump version 2022-06-01 20:56:08 +02:00
6017b91a95 stop method if user is not existent 2022-06-01 20:55:57 +02:00
68631f27bf cleanup 2022-06-01 20:55:09 +02:00
a366565d7c support user indexation in url 2022-06-01 20:55:02 +02:00
3aeebbcead handle not existent user 2022-06-01 20:54:31 +02:00
06fe19f684 not update isOnTransition when reduceAnimations is enabled 2022-06-01 20:38:49 +02:00
7b7e0445ea added PageLoad static render 2022-06-01 20:36:52 +02:00
64076a21da fix props 2022-06-01 20:36:32 +02:00
4686fb6bfe install only dev deps 2022-06-01 20:27:46 +02:00
131a2d3d6b force binstall 2022-06-01 20:25:05 +02:00
3d8c25c7cc remove peerdeps 2022-06-01 20:25:00 +02:00
6ca00bf474 install deps on build 2022-06-01 20:24:01 +02:00
d5a8e1b71a copy entire package 2022-06-01 20:23:09 +02:00
0fa964414b fix set locations on events 2022-06-01 20:19:02 +02:00
9f3a538492 Render layout even when has renderlock 2022-06-01 20:18:55 +02:00
6c1699447f disable config.build 2022-06-01 20:17:55 +02:00
751a1ffa01 update Dockerfile 2022-06-01 20:17:46 +02:00
c305661c89 bump version 2022-06-01 19:52:23 +02:00
97d55ff324 update aliases 2022-06-01 19:48:57 +02:00
87625f99a6 update deps 2022-06-01 19:48:51 +02:00
5227b947a4 remote pages plugin 2022-06-01 19:48:44 +02:00
c16586e701 added router 2022-06-01 19:48:34 +02:00
c3dd462113 remove render core 2022-06-01 19:48:23 +02:00
dbcb39357c toggleVisibility on mount instead event 2022-06-01 19:48:14 +02:00
c460f95775 Use new Router & Layout 2022-06-01 19:47:54 +02:00
8cbd891993 added build config 2022-06-01 05:07:02 +02:00
bd844f7be8 fix ant result content flex direction 2022-06-01 05:04:26 +02:00
f0de3fa1cf use SidedrawerController 2022-06-01 03:16:29 +02:00
7dbeeba2a7 move order 2022-06-01 03:15:51 +02:00
48dc8a2493 support elevation 2022-06-01 03:15:44 +02:00
40b78237fe set string lenght limits 2022-06-01 03:15:34 +02:00
dc740d7a8f set 150 ms transition 2022-06-01 03:14:11 +02:00
954d231da4 rewrite new Sidedrawer controller 2022-06-01 03:11:23 +02:00
5ba73d13eb update default remotes 2022-05-31 22:02:00 +02:00
79feaa0608 create a substring if exceed maximung lenght 2022-05-31 21:55:11 +02:00
de78da3f47 close drawer when clicked about 2022-05-31 21:49:46 +02:00
af0fcf52d8 change default websocket api port 2022-05-31 21:46:47 +02:00
663029066b fix events 2022-05-31 21:44:58 +02:00
f7a9635c72 move order 2022-05-31 21:44:52 +02:00
77f5f61461 update evite 2022-05-31 21:44:43 +02:00
22065de20f select text on crash code 2022-05-31 21:44:38 +02:00
5f6a1738e3 implement MaxStringLenghts 2022-05-31 21:16:53 +02:00
ee120f0cd0 fix routes 2022-05-31 21:16:42 +02:00
b8c1680418 bump version 2022-05-31 21:03:21 +02:00
de725f42b0 fix open animation 2022-05-31 21:02:51 +02:00
ee5daf47ce added default crash details 2022-05-31 20:15:53 +02:00
e3ea0bf1ef fix Mask 2022-05-31 04:45:20 +02:00
2963298f63 go to /about when about button is clicked 2022-05-31 04:29:46 +02:00
5a02fe4ad2 added build script 2022-05-31 04:07:37 +02:00
b173f81678 added static deployment 2022-05-31 02:47:36 +02:00
be63bbad3d added Dockerfile and docker-compose 2022-05-31 02:29:50 +02:00
a0dcff4922 use dotenv 2022-05-31 02:28:13 +02:00
54bcad1790 bump version 2022-05-31 02:27:14 +02:00
aea40be34e fix methods namings 2022-05-31 02:26:04 +02:00
8353de34a2 fix events namigs 2022-05-31 02:25:57 +02:00
2b262f3e47 improve Splash style 2022-05-31 02:13:55 +02:00
ae5760f800 correct toggle methods namings 2022-05-31 02:10:35 +02:00
fa56bf33eb format 2022-05-31 02:09:53 +02:00
f59b6748ed correct toggle 2022-05-31 02:09:48 +02:00
1b8aab1bf9 set default auto_darkMode to false 2022-05-31 01:56:28 +02:00
20c5adec71 update evite 2022-05-31 01:54:21 +02:00
36262132f3 fix publicEvents and eventHandlers 2022-05-31 01:53:03 +02:00
ade7db35dc handle auto color scheme 2022-05-31 01:29:09 +02:00
1562ac7555 disable depensOn for auto_darkMode 2022-05-31 01:29:00 +02:00
srgooglo
cfbbafac7d
Merge pull request #60 from ragestudio/core-integration
Fix forgotten changes
2022-05-31 01:13:00 +02:00
srgooglo
e970a892f2
Merge branch 'master' into core-integration 2022-05-31 01:12:56 +02:00
63613e58f2 fix cores initialization 2022-05-31 01:09:36 +02:00
78a7ac018d handle auto prefered color scheme 2022-05-31 01:09:24 +02:00
8590a364d2 fix render core 2022-05-31 01:04:01 +02:00
aa84b5d006 fix depends validation & unsubscribe update events for unmounted items 2022-05-31 00:51:04 +02:00
4f19250d07 added auto_darkMode 2022-05-31 00:46:02 +02:00
3aaf668903 dependsOn now should check every update 2022-05-31 00:45:47 +02:00
5e9678aa3b support custom components 2022-05-31 00:32:04 +02:00
321131d529 update streamingApi remote 2022-05-31 00:19:49 +02:00
srgooglo
b48450e92f
Merge pull request #59 from ragestudio/core-integration
Core integration
2022-05-31 00:18:53 +02:00
eb17c036a2 fix setLocation 2022-05-30 22:29:53 +02:00
4f1098af9e use correct cores to initialize app 2022-05-30 22:28:17 +02:00
b020f4018b fix bindContext 2022-05-30 22:28:00 +02:00
c9c13e895c fix constructor 2022-05-30 22:27:50 +02:00
30d0b8044d use new evite model 2022-05-30 22:08:50 +02:00
611558abbb update evite 2022-05-30 22:08:35 +02:00
27f6480be4 remove extensions 2022-05-30 22:08:29 +02:00
7d98769806 implemented cores 2022-05-30 22:08:23 +02:00
0e402fad56 only render code details if has that prop 2022-05-30 22:08:15 +02:00
a13a0a50cf added cores alias 2022-05-30 21:40:29 +02:00
956dcec7f3 update crash style 2022-05-30 21:35:57 +02:00
54c08e99a1 fix events 2022-05-30 16:50:18 +02:00
30aadbd5d6 improve initialization crash process 2022-05-30 16:49:51 +02:00
f398358afc use display:flex 2022-05-30 16:49:03 +02:00
dfcd9829e8 added CrashWrapper 2022-05-30 16:48:31 +02:00
26d7e1bc03 use development remotes 2022-05-30 16:47:52 +02:00
00ab91453b added streaming information inputs placeholders 2022-05-29 18:35:45 +02:00
2478ee31ea Merge branch 'master' of https://github.com/ragestudio/comty 2022-05-29 18:27:04 +02:00
14d6ac9954 added initialization steps finish events 2022-05-29 18:26:55 +02:00
1be4ed3c61 emit initialization steps error on eventBus 2022-05-29 18:25:15 +02:00
2664548fac added about page 2022-05-29 18:24:43 +02:00
bba10b30e3 split modalCard 2022-05-29 18:24:35 +02:00
db2c511e64 use padding instead margin 2022-05-29 18:12:51 +02:00
fc6bf55f86 use and button 2022-05-29 18:08:32 +02:00
52a7eca414 space 2022-05-29 17:49:52 +02:00
130097f5df update build cmds 2022-05-28 20:43:26 +02:00
672b778ae4 added corenode dep & added build script 2022-05-28 20:39:09 +02:00
6f939105d2 update ports 2022-05-28 20:37:12 +02:00
da689b31dd added dotenv 2022-05-28 20:37:07 +02:00
be1ae1c5bd added docker-compose and Dockerfile 2022-05-28 20:26:11 +02:00
c5f3713d28 rename streamingKey 2022-05-28 20:25:33 +02:00
srgooglo
f2c75d1e2a
Merge pull request #58 from ragestudio/login-drawer
Login drawer
2022-05-19 20:31:05 +02:00
7de4f21222 remove parentesis 2022-05-19 20:28:54 +02:00
992f0ac259 use initialize method 2022-05-19 20:24:53 +02:00
16c97b51ab Merge branch 'login-drawer' of https://github.com/ragestudio/comty into login-drawer 2022-05-19 19:51:50 +02:00
0b3997c3cc fix import 2022-05-19 19:48:33 +02:00
9def7a31b0 emit session.logout 2022-05-19 19:48:33 +02:00
5e23aa1642 bump version 2022-05-19 19:48:33 +02:00
4e56b2af76 added Login component 2022-05-19 19:48:33 +02:00
1f2831e47a added app.createLogin & app.logout handlers 2022-05-19 19:48:33 +02:00
7106b43e30 remove login from pages 2022-05-19 19:48:33 +02:00
704500f50a added formWrapper style 2022-05-19 19:48:33 +02:00
f42a05c3c6 fix authMechanism 2022-05-19 19:45:04 +02:00
56b8d8b44a split DB manager to a external class 2022-05-19 19:44:54 +02:00
12c2dd3e49 use getConnectionConfig 2022-05-14 19:44:38 +02:00
c4d8d34b00 use getConnectionConfig 2022-05-14 19:43:55 +02:00
94400bbd53 fix import 2022-05-13 22:23:19 +02:00
e94d8bd351 emit session.logout 2022-05-13 22:09:16 +02:00
4bf49f4050 bump version 2022-05-13 21:48:27 +02:00
b9638f0c2c added Login component 2022-05-13 21:48:06 +02:00
61bcdff5fb added app.createLogin & app.logout handlers 2022-05-13 21:47:57 +02:00
5ae5c73b23 remove login from pages 2022-05-13 21:47:27 +02:00
3bfd9b2117 added formWrapper style 2022-05-13 21:35:49 +02:00
e5a0ce109d bump version 2022-05-13 20:31:08 +02:00
a54304ec54 player events 2022-05-13 20:30:38 +02:00
0293a5cd6f return response if only has data 2022-05-13 20:13:06 +02:00
b579890c0c update settings 2022-05-13 20:12:18 +02:00
10a316c64d generate settings tabs from one object 2022-05-13 20:12:11 +02:00
e09c050a53 remove unused imports 2022-05-13 15:16:39 +02:00
db726c2c61 added internal-nms 2022-05-13 15:13:02 +02:00
5971e5bb2c get server status from internal server 2022-05-13 15:10:06 +02:00
b5396530fd added /**/**/cache to git ignore 2022-05-13 15:06:30 +02:00
b16b7a9fa4 added mediaroot 2022-05-13 14:58:53 +02:00
bcaf757894 Merge branch 'master' of https://github.com/ragestudio/comty 2022-05-13 14:56:35 +02:00
eb5911b32c added deps 2022-05-13 14:56:10 +02:00
8694d65b2e display empty 2022-05-13 14:56:06 +02:00
0a3eb7eba0 added plyr options 2022-05-13 14:55:48 +02:00
12f2b9be67 use internal media server 2022-05-13 14:46:54 +02:00
7f75d988c2 added cpu lib 2022-05-13 14:46:43 +02:00
15751617e7 write head on stream flv mode 2022-05-13 14:46:21 +02:00
c11505bacf write head on stream flv mode 2022-05-13 09:53:55 +02:00
7c39556ae1 expose methods to window 2022-05-13 09:53:39 +02:00
52062b1897 use direct piping instead create a buffer 2022-05-13 09:42:33 +02:00
eff643a445 update style 2022-05-12 21:15:39 +02:00
cb562d1c65 find by id instead query 2022-05-12 21:04:51 +02:00
7691702c10 fix query 2022-05-12 21:04:16 +02:00
fa0768c803 update default remotes 2022-05-12 20:24:56 +02:00
908201519e update default remotes 2022-05-12 20:15:27 +02:00
6ca59b24b3 fix websocket remote address 2022-05-12 19:35:13 +02:00
c5dd2b3525 , 2022-05-12 19:32:39 +02:00
srgooglo
dcc3eb2151
Merge pull request #57 from ragestudio/streaming-server
Streaming server
2022-05-12 19:32:03 +02:00
c49283243b added streams to default sidebar keys 2022-05-12 19:30:47 +02:00
0c0b47527c added basic streaming control 2022-05-12 19:30:16 +02:00
223b8d36f4 get streams from username 2022-05-12 19:28:13 +02:00
b976a595df update StreamViewer 2022-05-12 19:28:01 +02:00
ec249b70db added get/stream_config_from_username endpoint 2022-05-12 19:27:26 +02:00
fd31478636 get remote addresses from remotes config 2022-05-12 19:26:09 +02:00
a099cff27a set default language to en 2022-05-12 19:25:22 +02:00
f6bbeb5c66 update remotes config 2022-05-12 19:25:08 +02:00
046dd43831 fix methods & added missings 2022-05-12 19:03:40 +02:00
b02bf6877c fix ant-result colors 2022-05-12 19:02:59 +02:00
9175befcfc format 2022-05-12 19:02:39 +02:00
c5a020a899 apply variant only storage variant from eventBus 2022-05-12 17:22:04 +02:00
21bbb5c9df update darkMode setting 2022-05-12 17:21:30 +02:00
ff50b5d4f3 make border 0 on hidden mode 2022-05-12 17:00:31 +02:00
c33003b3c6 added withEvent method 2022-05-12 16:52:08 +02:00
ac6e8c9129 added compact mode 2022-05-12 16:51:59 +02:00
735b4dbbb4 added rxjs dep 2022-05-12 16:51:43 +02:00
d3169737b1 added layout_page modes 2022-05-12 16:51:34 +02:00
c4de104b0a added lodash lib 2022-05-12 16:24:53 +02:00
3acc8cca8b extend get/streams with internal api details 2022-05-12 16:24:46 +02:00
618f951aa2 fetch list of streams 2022-05-12 15:00:52 +02:00
5cb5f85b45 get public streams methods 2022-05-12 14:59:14 +02:00
2f717a179e generate keys with username 2022-05-12 14:58:54 +02:00
86d2bce01f update streamingKey schema 2022-05-12 14:58:33 +02:00
182040d37a stream pipe with streamingUserspace username resolver 2022-05-12 14:58:09 +02:00
a86918d3b9 fix addresses 2022-05-12 11:05:52 +02:00
27972f3f5f initialize http server 2022-05-12 10:53:43 +02:00
ff34d2900b added publishStream & unpublishStream methods 2022-05-12 10:53:30 +02:00
bb2cd23c4b fetch data from media server api 2022-05-12 10:53:15 +02:00
0ae6cbc0d9 added streaming routes 2022-05-12 10:40:16 +02:00
1a0a53445e added basic streaming server classes 2022-05-12 10:40:00 +02:00
bbd0c1d5bb added @ffmpeg-installer/ffmpeg dep 2022-05-12 10:39:41 +02:00
10eb64692f reject client session when session is removed or ended 2022-05-12 10:39:30 +02:00
d295ddda53 fix streamingKey schema 2022-05-12 10:39:05 +02:00
39ecbf3ee3 added StreamingController with basic methods 2022-05-12 10:38:44 +02:00
f149060dff added streamingKey to models 2022-05-12 10:38:24 +02:00
9b44010bc3 added basic streaming control panel 2022-05-12 10:38:09 +02:00
06f38164b3 added mongoose dep 2022-05-10 20:45:55 +02:00
d154c36062 added StreamingKeys schema 2022-05-10 20:45:45 +02:00
fa2e40c75d added StreamingKeys model 2022-05-10 20:45:40 +02:00
f00a15548b add managers 2022-05-10 20:45:24 +02:00
df151c5a0a add lib 2022-05-10 20:45:15 +02:00
65a5ecc3b6 added streaming-server package 2022-05-10 20:04:49 +02:00
50f6ca2c14 added todo 2022-05-10 19:58:10 +02:00
srgooglo
b7837284a9
Merge pull request #56 from ragestudio/linebridge-update
Linebridge update
2022-05-06 19:01:21 +02:00
7eb67cc124 update linebridge dep 2022-05-06 19:00:43 +02:00
9e4721579a added comments 2022-05-06 19:00:29 +02:00
0105d79977 remove unwanted log 2022-05-06 19:00:12 +02:00
08928cdae9 update linebridge dep 2022-05-06 18:48:47 +02:00
07e01c7471 Merge branch 'linebridge-update' of https://github.com/ragestudio/comty into linebridge-update 2022-05-06 17:43:29 +02:00
88101b767e update linebridge dep 2022-05-06 17:43:21 +02:00
efaabf8cf2 update linebridge imports 2022-05-06 17:43:12 +02:00
srgooglo
aac047423e
Merge pull request #55 from RubenPX/linebridge-update
fix typo `autocapitalize` & `autoCorrect`
2022-05-06 15:00:37 +02:00
b7739080ab fix typo autocapitalize & autoCorrect 2022-05-06 14:57:31 +02:00
80cc6e0721 update linebridge dep 2022-05-06 13:56:57 +02:00
2674438c4e dont encode login body payload 2022-05-06 13:27:15 +02:00
db5a0bfcac update linebridge dep 2022-05-06 13:26:07 +02:00
d498a03505 not decode password username on passport stratergy 2022-05-06 12:27:17 +02:00
3190fba4b7 remove req type checking 2022-05-06 12:12:37 +02:00
cdb752dd1b update linebridge dep 2022-05-06 12:10:49 +02:00
85667624b3 update linebridge lib 2022-05-06 11:40:09 +02:00
b7864e7a39 update linebridge dep 2022-05-06 11:36:47 +02:00
2a9f086f14 use res.json to parse responses 2022-05-06 11:17:13 +02:00
402f0d4557 update linebridge dep 2022-05-06 11:16:50 +02:00
f9acfa8de9 update linebridge 2022-05-05 10:45:19 +02:00
f3f02e8095 disable upload endpoints 2022-05-05 10:45:10 +02:00
dddee4009b remove @nanoexpress/middleware-file-upload/cjs from middlewares 2022-05-05 10:45:01 +02:00
302fbe301b added plyr-react 2022-04-04 21:43:38 +02:00
7c49505551 early implement media viewer & self menu 2022-04-04 21:43:28 +02:00
c08fc6cf8e pass initial props from feed controller 2022-04-04 21:43:00 +02:00
03ce741235 added additions to schemas 2022-04-04 21:42:48 +02:00
cac10348f6 added delete methods 2022-04-04 21:42:37 +02:00
c80e3b9763 clean 2022-03-28 19:53:54 +02:00
58148d6c3e temporaly disable build config 2022-03-16 04:44:12 +01:00
171ac2596a remove unused import 2022-03-16 04:43:52 +01:00
ea34632669 fix entry 2022-03-16 04:42:43 +01:00
a47c7c4593 remove index 2022-03-16 04:42:13 +01:00
3fc8720d81 bump version 2022-03-16 04:34:51 +01:00
eefac29eba fix versions 2022-03-16 04:34:46 +01:00
d0b16d2abb added basic style 2022-03-16 04:29:31 +01:00
34d18dd464 added text to tabs 2022-03-16 04:29:19 +01:00
eb97bbbaf9 fix session controller 2022-03-16 04:28:57 +01:00
2745104b7c reimplement with evite extension v2 2022-03-16 04:28:44 +01:00
e41cf70b51 refactor for use evite 2022-03-16 04:28:26 +01:00
76ab58d388 added splash style 2022-03-16 04:28:13 +01:00
74ab0045e5 use App.jsx as vite entry 2022-03-16 04:25:57 +01:00
6d14778682 update evite 2022-03-16 04:25:47 +01:00
aa48ae1a78 fix wrap style 2022-03-15 19:13:26 +01:00
14c036862d fix style of tabs 2022-03-15 18:42:02 +01:00
79231d2c6a reimplement account style 2022-03-15 04:24:48 +01:00
fbb1f9a62b restyle ant-avatar to set border-radius 2022-03-15 04:24:37 +01:00
925e5ee673 added FollowersList 2022-03-15 04:24:00 +01:00
c4c3defc4a set white color 2022-03-15 04:23:51 +01:00
c94a4a47e2 delete local components 2022-03-15 03:15:01 +01:00
36d28e7b06 splitted to account.profile settings group 2022-03-15 03:14:13 +01:00
b48c48a0c4 added update profile description field 2022-03-15 03:11:33 +01:00
8b165ae8d3 fix preventDefault 2022-03-15 03:11:16 +01:00
3586ba9d8b added TextArea 2022-03-15 03:10:47 +01:00
3e52ff1699 added counter 2022-03-15 03:10:37 +01:00
5f1b11569a fix AllowedPublicUpdateFields for only apply to public methods 2022-03-15 03:10:22 +01:00
76c9e905b9 extend user schema 2022-03-15 03:09:56 +01:00
d7cca6ce27 include createdAt 2022-03-15 03:09:43 +01:00
4379c6e0da followers 2022-03-15 01:54:00 +01:00
ebc0909c15 implement follow methods 2022-03-15 01:05:09 +01:00
9fc04da329 update models 2022-03-15 01:05:01 +01:00
703e133054 update exports 2022-03-15 01:04:26 +01:00
88bd3269fa added Badge schema 2022-03-15 01:04:20 +01:00
b3c3e7e1d8 added UserFollow schema 2022-03-15 01:03:54 +01:00
15186e4f1a reimplement follow methods & styling 2022-03-15 01:03:36 +01:00
10a471343c added FollowButton 2022-03-15 01:03:21 +01:00
423e305072 implement follow methods 2022-03-15 00:15:47 +01:00
c69584dc15 target node 16 2022-03-14 23:19:06 +01:00
cfce86db1f update readme 2022-03-14 23:13:26 +01:00
68023b1915 remove trash 2022-03-14 23:07:15 +01:00
bbbc0ea86a update gitignore 2022-03-14 23:07:00 +01:00
a75200a751 temporary delete wrapper 2022-03-14 23:06:30 +01:00
srgooglo
928552454d
Merge pull request #54 from ragestudio/rewrite
Rewrite
2022-03-14 23:03:39 +01:00
6411a79e6f added mongo db service to docker-compose on server 2022-03-14 22:59:42 +01:00
a3b5558749 remove skip 2022-03-14 22:59:23 +01:00
9ba5039e93 register keybinds depending of navigator useragent 2022-03-14 22:58:31 +01:00
f5826fdb9d added deps 2022-03-14 22:58:11 +01:00
819fdb070f added build config 2022-03-14 22:58:05 +01:00
9aceb9bc8a use rc-virtual-list 2022-03-14 22:57:53 +01:00
c0ada28b7a update remotes 2022-03-14 22:57:29 +01:00
1dc446d5d1 AnimatedPostCard 2022-03-14 22:57:23 +01:00
0115e34c5d added desktop package 2022-03-14 22:57:09 +01:00
19df441d1c await to save 2022-03-14 22:56:51 +01:00
28c655882c added esc keybind 2022-03-14 22:06:25 +01:00
61452bfb7d use PostsFeed component 2022-03-14 22:06:13 +01:00
d77145e1e3 use Shortcuts extension 2022-03-14 22:05:50 +01:00
fea6a88a1d format 2022-03-14 22:05:37 +01:00
5ef619b68b added Shortcuts extension 2022-03-14 22:05:32 +01:00
f045c38cb4 implement server setup 2022-03-14 18:45:33 +01:00
0b3619e901 added server setup scripts 2022-03-14 18:45:23 +01:00
00b125f575 update Config schema 2022-03-14 18:45:03 +01:00
446813f51e added Comment model & schema 2022-03-14 18:44:54 +01:00
1fbaef76a9 use lib 2022-03-14 18:44:35 +01:00
cde9caa24b added createUser to lib 2022-03-14 18:44:26 +01:00
81167c455e use PostsFeed component 2022-03-11 22:52:44 +01:00
4da1a0b506 added PostsFeed component 2022-03-11 22:52:25 +01:00
b34b2f9b90 change remotes origin 2022-03-11 22:42:58 +01:00
64edf048e2 use methods 2022-03-11 01:07:38 +01:00
c2a2e2ff25 update user schema 2022-03-11 01:07:33 +01:00
771989b7c9 set routeStyle to next 2022-03-11 01:07:25 +01:00
2f01fe7291 update antd 2022-03-11 01:07:07 +01:00
dc0983010e use theme var to set font family 2022-03-11 01:06:54 +01:00
72c377032b added Recursive font 2022-03-11 01:06:36 +01:00
009ccda2c6 remove unused const 2022-03-11 01:06:24 +01:00
dd4e38175f use " 2022-03-11 01:06:09 +01:00
3f259e5531 fix styling 2022-03-11 01:05:58 +01:00
16a7e8454b added debugComponents 2022-03-11 01:05:40 +01:00
9d99ad4002 goToProfile & verified badge 2022-03-11 01:05:30 +01:00
0634e24b8c added custom icons 2022-03-11 01:05:03 +01:00
dd7524385e added tabs to settings 2022-03-11 01:04:47 +01:00
751cb23683 update default theme 2022-03-11 01:04:18 +01:00
67ce4a9f61 added back Debug extension 2022-03-11 01:04:06 +01:00
779e9c763a use color 2022-03-03 18:16:10 +01:00
e85500a00f improve setting update event 2022-03-03 18:16:00 +01:00
6c3f918109 update primaryColor setting on reset default theme 2022-03-03 18:15:30 +01:00
3a122674ae fix selfMenu icon 2022-03-03 16:21:32 +01:00
3cf8758ef4 switch share action to save 2022-03-02 22:12:55 +01:00
5a753e6be7 update routes 2022-03-02 22:12:35 +01:00
fa9604abdb use primarycolor 2022-03-02 22:06:33 +01:00
e3e5444d9c improve shadow-color 2022-03-02 22:06:04 +01:00
6a3e0658e5 added actions indicator notch 2022-03-02 21:53:49 +01:00
b52dd47375 moved post statistics to post header 2022-03-02 21:40:44 +01:00
bbf51f1f7d improve night mode 2022-03-02 21:40:23 +01:00
5a83e2c11c mix opacity with actions bar when hover the card 2022-03-02 21:05:53 +01:00
85f24c973b improve color & outline color & shadow color 2022-03-02 20:56:32 +01:00
53e5c8302e added shadow color 2022-03-02 20:56:18 +01:00
c8b1263a6f listen collapse settings change 2022-03-02 20:36:51 +01:00
f8701a22c9 format 2022-03-02 20:36:41 +01:00
0ac5a3f3e8 fix locked items can be deleted 2022-03-02 20:36:32 +01:00
b1b1a7fc38 handle dependsOn 2022-03-02 20:36:16 +01:00
9a6a0d937e use max-width 2022-03-02 20:34:44 +01:00
a6d7fd6d54 use like logic 2022-03-02 20:34:17 +01:00
501983f615 added LikeButton 2022-03-02 20:34:06 +01:00
af86376e79 update settings 2022-03-02 20:33:52 +01:00
5646e847da update routes 2022-03-02 19:25:06 +01:00
4083a618af update default settings 2022-03-02 19:25:01 +01:00
6f87790979 update default color 2022-03-02 19:24:54 +01:00
7c93bf4ca2 added fullLogo 2022-03-02 19:24:48 +01:00
12ddf3b3ae improve like action & await to server response 2022-03-02 17:14:13 +01:00
fe25d6d54f added like button logic 2022-03-02 17:01:22 +01:00
154cc51274 added ´like´ & ´unlike´ methods 2022-03-02 17:01:15 +01:00
cf16e3343e update post schema 2022-03-02 16:08:46 +01:00
44eb21a777 added like method 2022-03-02 16:08:33 +01:00
c90b924a00 fetch methods 2022-03-02 16:08:20 +01:00
a46902bb1e update exports 2022-03-02 16:08:02 +01:00
dd17cbe0ff added basis 2022-03-02 16:07:57 +01:00
b4ee145e33 added rc-virtual-list dep 2022-03-02 16:07:37 +01:00
587e5b2f32 use createIconRender 2022-03-02 16:07:20 +01:00
c1ced9e4c1 added PostCreator 2022-03-02 16:07:11 +01:00
4c225c6014 update remotes 2022-03-02 16:07:02 +01:00
083b42340e use defaultRemotes 2022-03-02 16:06:52 +01:00
e3d06b7823 rewrite to new models 2022-02-22 20:22:41 +01:00
5467192ef2 implement PostController 2022-02-22 20:22:25 +01:00
a2f825fe10 update constants 2022-02-22 20:22:13 +01:00
238ea51427 update config 2022-02-22 19:44:55 +01:00
ba94adfa18 update assets 2022-02-22 19:44:41 +01:00
67577485b0 rewrite for use linebridge 0.10.x 2022-02-22 19:44:27 +01:00
7207cf5388 update package 2022-01-03 18:37:44 +01:00
775b3ea2e9 refactor controllers 2022-01-03 18:37:38 +01:00
6f50106fd3 refactor lib 2022-01-03 18:37:29 +01:00
cbc791db35 update repo 2022-01-03 18:37:15 +01:00
a7f01730eb refactor App with evite scattfold 2022-01-03 18:36:51 +01:00
9becc55879 update package 2022-01-03 18:36:33 +01:00
d7c4ee039e remove assets 2022-01-03 18:36:26 +01:00
a8653211b4 added vite support 2022-01-03 18:36:20 +01:00
5be9229456 update public assets 2022-01-03 18:35:47 +01:00
1fa3e720e7 update config 2022-01-03 18:35:35 +01:00
3b5c67937f added constants 2022-01-03 18:35:25 +01:00
270ae41104 update all 2021-12-06 18:06:51 +01:00
1e49c9bd84 remove unused 2021-11-17 18:38:33 +01:00
815d591b83 clean 2021-11-17 18:36:56 +01:00
dc96cf271b initialize basic scatfold 2021-11-17 18:35:55 +01:00
44eceb487b use evite as engine 2021-11-17 17:58:04 +01:00
08fbde4f7f rename folder 2021-11-16 17:53:34 +01:00
e08da3942b cleanup & upgrade 2021-11-16 17:51:00 +01:00
89943a6446 updated splash screen 2021-07-01 10:46:37 +02:00
srgooglo
326c63b457 updated packages 2021-05-11 13:25:16 +02:00
srgooglo
f975406092 ✳ added server package 2021-01-11 06:48:26 +01:00
srgooglo
ac3d2e67cc cleaun packages 2021-01-05 09:56:04 +01:00
srgooglo
3ec1ac1997 updated: general settings code cuality 2021-01-05 09:43:39 +01:00
srgooglo
028448cc32 config cleanup 2021-01-05 08:50:24 +01:00
srgooglo
239e7eca68 removed debug from pages 2021-01-05 08:17:20 +01:00
srgooglo
9941d9ea95 refactor settings components 2021-01-05 08:16:31 +01:00
srgooglo
b5c9ce90a4 removed: debuggers 2021-01-05 08:14:35 +01:00
srgooglo
bbcc181ee4 clean 2021-01-05 08:11:21 +01:00
srgooglo
0980990d0e clean 2021-01-05 08:11:12 +01:00
srgooglo
3a5af895a3 updated packages 2021-01-05 08:07:16 +01:00
srgooglo
a39a70e4cb added: wrapper to packages, update: code quality, update: changed verbosity lib to @nodecorejs 2021-01-05 07:57:55 +01:00
srgooglo
362284690b boostrap new proyect model 2020-12-14 20:29:29 +01:00
srgooglo
3c10943ba6 new scaffolding 2020-12-14 19:48:49 +01:00
srgooglo
e78154ea09 update packages 2020-12-08 01:31:13 +01:00
srgooglo
d7362ce479
Update README.md 2020-11-29 15:49:20 +01:00
srgooglo
413487a154 Merge branch 'master' of https://github.com/srgooglo/comty 2020-11-29 12:34:28 +01:00
srgooglo
773b6343f0 add newStreaming 2020-11-29 12:33:18 +01:00
srgooglo
89348aa1db
Merge pull request #40 from srgooglo/snyk-upgrade-e9230396cf7c227ac6ea2555c769e13b
[Snyk] Upgrade @ragestudio/nodecore-utils from 0.1.18 to 0.1.19
2020-11-28 13:57:13 +01:00
snyk-bot
9dcb2e4419
fix: upgrade @ragestudio/nodecore-utils from 0.1.18 to 0.1.19
Snyk has created this PR to upgrade @ragestudio/nodecore-utils from 0.1.18 to 0.1.19.

See this package in npm:
https://www.npmjs.com/package/@ragestudio/nodecore-utils

See this project in Snyk:
https://app.snyk.io/org/srgooglo/project/32d7496a-6bfa-4eab-978c-5bc618fd2e41?utm_source=github&utm_medium=upgrade-pr
2020-11-28 00:56:33 +00:00
srgooglo
daa0f31c24
Merge pull request #39 from srgooglo/snyk-upgrade-2edc1f1b3e94a1bacbb012f11926c0b1
[Snyk] Upgrade @types/lodash from 4.14.164 to 4.14.165
2020-11-27 07:35:06 +01:00
snyk-bot
a036fe4239
fix: upgrade @types/lodash from 4.14.164 to 4.14.165
Snyk has created this PR to upgrade @types/lodash from 4.14.164 to 4.14.165.

See this package in npm:
https://www.npmjs.com/package/@types/lodash

See this project in Snyk:
https://app.snyk.io/org/srgooglo/project/32d7496a-6bfa-4eab-978c-5bc618fd2e41?utm_source=github&utm_medium=upgrade-pr
2020-11-27 00:48:53 +00:00
srgooglo
cd6ea940ed add cloudlink to core 2020-11-26 14:57:22 +01:00
srgooglo
f8c6b8a6ab
Merge pull request #38 from srgooglo/snyk-upgrade-2a8f3fe2575798b270bfa8e965199751
[Snyk] Upgrade electron-log from 4.2.4 to 4.3.0
2020-11-24 06:13:01 +01:00
snyk-bot
d4b9bca4b0
fix: upgrade electron-log from 4.2.4 to 4.3.0
Snyk has created this PR to upgrade electron-log from 4.2.4 to 4.3.0.

See this package in npm:
https://www.npmjs.com/package/electron-log

See this project in Snyk:
https://app.snyk.io/org/srgooglo/project/32d7496a-6bfa-4eab-978c-5bc618fd2e41?utm_source=github&utm_medium=upgrade-pr
2020-11-24 00:47:04 +00:00
srgooglo
cad1e93ec8
Merge pull request #36 from srgooglo/snyk-upgrade-b3e199c7c3c1c24334ae383ddd13a1c3
[Snyk] Upgrade react-color from 2.18.1 to 2.19.3
2020-11-23 06:02:17 +01:00
srgooglo
2ceea7d154
Merge pull request #35 from srgooglo/snyk-upgrade-a6eb8b4985a80daf891453238820fa18
[Snyk] Upgrade @types/lodash from 4.14.162 to 4.14.164
2020-11-23 06:02:02 +01:00
srgooglo
95b1405b95
Merge pull request #37 from srgooglo/snyk-upgrade-c002ca3d765fc0297fc88d8548585602
[Snyk] Upgrade react-redux from 7.2.1 to 7.2.2
2020-11-23 06:01:47 +01:00
snyk-bot
fb72ee89fd
fix: upgrade react-redux from 7.2.1 to 7.2.2
Snyk has created this PR to upgrade react-redux from 7.2.1 to 7.2.2.

See this package in npm:
https://www.npmjs.com/package/react-redux

See this project in Snyk:
https://app.snyk.io/org/srgooglo/project/32d7496a-6bfa-4eab-978c-5bc618fd2e41?utm_source=github&utm_medium=upgrade-pr
2020-11-23 00:52:59 +00:00
snyk-bot
5cf9760540
fix: upgrade react-color from 2.18.1 to 2.19.3
Snyk has created this PR to upgrade react-color from 2.18.1 to 2.19.3.

See this package in npm:
https://www.npmjs.com/package/react-color

See this project in Snyk:
https://app.snyk.io/org/srgooglo/project/32d7496a-6bfa-4eab-978c-5bc618fd2e41?utm_source=github&utm_medium=upgrade-pr
2020-11-23 00:52:52 +00:00
snyk-bot
8ce213f863
fix: upgrade @types/lodash from 4.14.162 to 4.14.164
Snyk has created this PR to upgrade @types/lodash from 4.14.162 to 4.14.164.

See this package in npm:
https://www.npmjs.com/package/@types/lodash

See this project in Snyk:
https://app.snyk.io/org/srgooglo/project/32d7496a-6bfa-4eab-978c-5bc618fd2e41?utm_source=github&utm_medium=upgrade-pr
2020-11-23 00:52:45 +00:00
srgooglo
72859c2fbd fixed unused props 2020-11-22 04:11:14 +01:00
srgooglo
dc1e364b25 fixed missing package 2020-11-22 00:04:37 +01:00
srgooglo
281757a187 Merge branch 'master' of https://github.com/srgooglo/comty 2020-11-21 23:33:24 +01:00
srgooglo
8aa8fd405e changed overlaySwapper method 2020-11-21 23:33:17 +01:00
srgooglo
96d2a3ae8b
Update README.md 2020-11-18 18:47:13 +01:00
srgooglo
94fa7f2ce6
Merge pull request #34 from srgooglo/master-cf-autofix
Apply fixes from CodeFactor
2020-11-17 18:58:50 +01:00
codefactor-io
82d2809ccb [CodeFactor] Apply fixes to commit d50aeb1 2020-11-17 17:58:00 +00:00
srgooglo
d50aeb14fc updated & cleaned layout components, other refactors 2020-11-17 18:57:40 +01:00
srgooglo
89ebf3e4e8 clean themes 2020-11-17 15:09:09 +01:00
srgooglo
a801bab8a1
Merge pull request #32 from srgooglo/snyk-upgrade-bcb6569fb23be5395d6e6125978562ee
[Snyk] Upgrade ts-jest from 26.4.2 to 26.4.3
2020-11-17 14:43:43 +01:00
srgooglo
4b6916cad2
Merge pull request #33 from srgooglo/snyk-upgrade-79f0d1dc239a858e6b636a0d2328c4e8
[Snyk] Upgrade react-redux from 7.2.1 to 7.2.2
2020-11-17 14:43:00 +01:00
snyk-bot
1c3899c97d
fix: upgrade react-redux from 7.2.1 to 7.2.2
Snyk has created this PR to upgrade react-redux from 7.2.1 to 7.2.2.

See this package in npm:
https://www.npmjs.com/package/react-redux

See this project in Snyk:
https://app.snyk.io/org/srgooglo/project/32d7496a-6bfa-4eab-978c-5bc618fd2e41?utm_source=github&utm_medium=upgrade-pr
2020-11-17 00:52:02 +00:00
snyk-bot
5b788f0e51
fix: upgrade ts-jest from 26.4.2 to 26.4.3
Snyk has created this PR to upgrade ts-jest from 26.4.2 to 26.4.3.

See this package in npm:
https://www.npmjs.com/package/ts-jest

See this project in Snyk:
https://app.snyk.io/org/srgooglo/project/32d7496a-6bfa-4eab-978c-5bc618fd2e41?utm_source=github&utm_medium=upgrade-pr
2020-11-17 00:51:53 +00:00
srgooglo
417522367e
Merge pull request #31 from srgooglo/snyk-upgrade-f707a48ab939f3daa5c75a6f47f81887
[Snyk] Upgrade howler from 2.2.0 to 2.2.1
2020-11-16 07:24:07 +01:00
snyk-bot
035246c248
fix: upgrade howler from 2.2.0 to 2.2.1
Snyk has created this PR to upgrade howler from 2.2.0 to 2.2.1.

See this package in npm:
https://www.npmjs.com/package/howler

See this project in Snyk:
https://app.snyk.io/org/srgooglo/project/32d7496a-6bfa-4eab-978c-5bc618fd2e41?utm_source=github&utm_medium=upgrade-pr
2020-11-16 00:47:34 +00:00
srgooglo
96ac872a30 replace app_config schema to app runtime 2020-11-15 12:43:11 +01:00
srgooglo
5023e8dee6
Merge pull request #30 from srgooglo/snyk-upgrade-8fc24f95beebd1d0619557e4d45303c5
[Snyk] Upgrade ts-jest from 26.4.1 to 26.4.2
2020-11-15 11:07:03 +01:00
srgooglo
05b39ad532
Merge pull request #29 from srgooglo/snyk-upgrade-b5b2198d002d220455f06b28e01b22aa
[Snyk] Upgrade axios from 0.20.0 to 0.21.0
2020-11-15 11:06:47 +01:00
snyk-bot
efceb8fd85
fix: upgrade ts-jest from 26.4.1 to 26.4.2
Snyk has created this PR to upgrade ts-jest from 26.4.1 to 26.4.2.

See this package in npm:
https://www.npmjs.com/package/ts-jest

See this project in Snyk:
https://app.snyk.io/org/srgooglo/project/32d7496a-6bfa-4eab-978c-5bc618fd2e41?utm_source=github&utm_medium=upgrade-pr
2020-11-14 01:12:17 +00:00
snyk-bot
5452ed4930
fix: upgrade axios from 0.20.0 to 0.21.0
Snyk has created this PR to upgrade axios from 0.20.0 to 0.21.0.

See this package in npm:
https://www.npmjs.com/package/axios

See this project in Snyk:
https://app.snyk.io/org/srgooglo/project/32d7496a-6bfa-4eab-978c-5bc618fd2e41?utm_source=github&utm_medium=upgrade-pr
2020-11-14 01:12:09 +00:00
srgooglo
e17a8d9b82
Merge pull request #28 from srgooglo/snyk-upgrade-cd3a985465ccde75fe904f67661b52fd
[Snyk] Upgrade @types/jest from 26.0.14 to 26.0.15
2020-11-11 17:51:17 +01:00
snyk-bot
f20804f7bd
fix: upgrade @types/jest from 26.0.14 to 26.0.15
Snyk has created this PR to upgrade @types/jest from 26.0.14 to 26.0.15.

See this package in npm:
https://www.npmjs.com/package/@types/jest

See this project in Snyk:
https://app.snyk.io/org/srgooglo/project/32d7496a-6bfa-4eab-978c-5bc618fd2e41?utm_source=github&utm_medium=upgrade-pr
2020-11-11 00:43:13 +00:00
srgooglo
0e7c94db0c added moreMenu on postCard & updated to antd 4.8 2020-11-02 19:16:21 +01:00
srgooglo
3bb5646713 added saved and post 2020-11-02 18:41:14 +01:00
srgooglo
f7c48a6228 changed fit-content 2020-11-02 17:31:08 +01:00
srgooglo
d8fb515afd refactor & clean icons 2020-11-02 17:22:31 +01:00
srgooglo
eb833b6412 fix offset 2020-11-02 15:39:16 +01:00
srgooglo
57aedb84d4 added follow support 2020-10-30 19:35:38 +01:00
srgooglo
7f28f854b1 fixed likeBtn blur animation & profile avatar & followers count 2020-10-30 14:15:34 +01:00
srgooglo
1b557a49af added user posts in profile & collapse sidebar 2020-10-30 13:49:06 +01:00
srgooglo
7f43427cb8 fixed overlay & primaryLayout on mobile mode 2020-10-30 13:04:45 +01:00
srgooglo
94015e7f1e changed like method & added post_autoposition setting 2020-10-30 12:36:48 +01:00
srgooglo
736f933ce5 add persistent mode to use & other changes 2020-10-29 20:29:09 +01:00
srgooglo
878143c515 fixed missing user_id & fix fadeclock 2020-10-29 15:39:31 +01:00
srgooglo
b3c48b9fdd removed console.logs 2020-10-29 14:57:17 +01:00
srgooglo
636eaaaf83 added splash loader 2020-10-29 14:56:06 +01:00
srgooglo
03709378f3 fixed socket token refresh 2020-10-29 13:33:01 +01:00
srgooglo
01bbafcd4a fixed broked refreshToken 2020-10-29 10:30:54 +01:00
srgooglo
7957e6bea4 update version 2020-10-29 09:14:46 +01:00
srgooglo
f41f565e93 updated login method 2020-10-28 19:17:28 +01:00
srgooglo
6fda7a5ef3 format code 2020-10-28 18:22:40 +01:00
srgooglo
340b673080 format & fix bad ts typing 2020-10-28 18:21:56 +01:00
srgooglo
1c90adcd3f added __proto__filterSchematizedArray to core & refactor components 2020-10-28 18:20:20 +01:00
srgooglo
0fbba17316 splitted code from function & added decyle to core 2020-10-28 18:15:21 +01:00
srgooglo
6eb8db9f20 removed v3api debbuger due to poor code quality 2020-10-28 18:08:42 +01:00
srgooglo
ca9a56c330 refactor render, fixed complexity, exceding lines 2020-10-28 18:05:39 +01:00
srgooglo
ebba5828e8 refactors for #27 & removed unused code 2020-10-28 17:56:45 +01:00
srgooglo
0c9c5007c8 Merge branch 'master' of https://github.com/srgooglo/comty 2020-10-28 14:44:22 +01:00
srgooglo
c15e92e386 changed auth method to ws 2020-10-28 14:44:15 +01:00
srgooglo
bef884fe2d
Create callback_codes.md 2020-10-28 09:19:58 +01:00
srgooglo
04a591d278
Merge pull request #23 from srgooglo/master-cf-autofix
Apply fixes from CodeFactor
2020-10-27 18:25:41 +01:00
srgooglo
ac69e2fec7 changed ?? operators values on socket debugger 2020-10-27 18:25:13 +01:00
srgooglo
d328d612b2 update explore request method 2020-10-27 18:24:43 +01:00
codefactor-io
82d426697a [CodeFactor] Apply fixes to commit 5564e8e 2020-10-27 17:23:31 +00:00
srgooglo
9ea418b99d Merge branch 'master' of https://github.com/srgooglo/comty 2020-10-27 18:23:05 +01:00
srgooglo
5564e8e323 added locked state & use method to socket 2020-10-27 18:22:55 +01:00
srgooglo
6af0d092d9
Update README.md
added maintainability badge
2020-10-27 11:17:56 +01:00
srgooglo
79ecb69f16
Update README.md 2020-10-25 20:46:19 +01:00
srgooglo
273bd10b8d
Merge pull request #22 from srgooglo/master-cf-autofix
Apply fixes from CodeFactor
2020-10-23 20:04:38 +02:00
codefactor-io
21c120c95f [CodeFactor] Apply fixes to commit 9cf915d 2020-10-23 18:01:42 +00:00
srgooglo
9cf915dfaa added headerNode & headerReset 2020-10-23 18:01:20 +02:00
srgooglo
ca1bbf0dd2 added temporaly socket debugger 2020-10-23 16:13:52 +02:00
srgooglo
f7535ae7c0 manage sockets by nodes, supporting multiplexing 2020-10-23 16:13:29 +02:00
srgooglo
c1b764be06 Changed nested content generation length minimun depth 2020-10-23 15:17:56 +02:00
srgooglo
20faeea409 multiple changes 2020-10-22 18:50:58 +02:00
srgooglo
030027b2a1 fixed bas typing updateListener 2020-10-22 17:20:59 +02:00
srgooglo
a12a1372ff updated socket init methods 2020-10-22 17:12:35 +02:00
srgooglo
bdc19546fe changed socketinit method 2020-10-21 17:53:13 +02:00
srgooglo
cc184378af added sockets listeners handlers & update debuggers 2020-10-21 17:35:31 +02:00
srgooglo
d9315c6d93 added selectedKeys storage 2020-10-21 13:02:48 +02:00
srgooglo
d43d23fbc1 Merge branch 'master' of https://github.com/srgooglo/comty 2020-10-21 12:31:42 +02:00
srgooglo
f601a01672 update redux debugger from support decyle/serialize 2020-10-21 12:31:29 +02:00
srgooglo
6f1e3d001f
Merge pull request #21 from srgooglo/snyk-fix-4eac0b1560decc7b0968ddbe4c96b988
[Snyk] Security upgrade react-scripts from 3.4.3 to 3.4.4
2020-10-21 08:26:21 +02:00
snyk-bot
8150528ced
fix: package.json & package-lock.json to reduce vulnerabilities
The following vulnerabilities are fixed with an upgrade:
- https://snyk.io/vuln/SNYK-JS-OBJECTPATH-1017036
2020-10-21 00:45:29 +00:00
srgooglo
fb03a2cef1
Merge pull request #20 from srgooglo/master-cf-autofix
Apply fixes from CodeFactor
2020-10-20 21:51:10 +02:00
codefactor-io
18262638fc [CodeFactor] Apply fixes to commit 674d270 2020-10-20 19:49:44 +00:00
srgooglo
674d270fa6 socket init on query model 2020-10-20 21:49:25 +02:00
srgooglo
052d3b58c7 remove unused modules 2020-10-20 21:48:53 +02:00
srgooglo
aa424fb420 updated redux debugger, added ParamsList to component 2020-10-20 21:48:18 +02:00
srgooglo
06455f6412 other changes 2020-10-20 16:31:38 +02:00
srgooglo
b39b0cea56 changed Sider render method 2020-10-20 16:31:06 +02:00
srgooglo
cc9396b5b6 removed RenderComponent object 2020-10-20 16:30:34 +02:00
srgooglo
b6295785af updated some dependencies 2020-10-20 14:14:38 +02:00
srgooglo
7b1962d778 updated ie target version 2020-10-20 14:14:14 +02:00
srgooglo
63bb85cf5c added Provider to FloatComponent 2020-10-20 14:13:53 +02:00
srgooglo
a7a9b887e1 add socket model to app models 2020-10-19 16:47:17 +02:00
srgooglo
f327225db2 changed method of import for verbosity 2020-10-19 16:46:57 +02:00
srgooglo
c06ffe5e0d added FloatComponent prototype to components 2020-10-19 16:45:42 +02:00
srgooglo
1c1acb9a2b updated versions 2020-10-19 16:44:27 +02:00
srgooglo
45e4d2cd96 changed debugger directories 2020-10-19 16:43:14 +02:00
srgooglo
2aa02a5009 refactorized Loader 2020-10-16 13:39:12 +02:00
srgooglo
7b0bcf7bf6 updated gitignore, including package-lock 2020-10-16 13:24:27 +02:00
srgooglo
a2993d4eab fix #18, refactor objectToArray to legacy util 2020-10-16 13:14:24 +02:00
srgooglo
572eb5f5bc change app_info object from core to clientInfo, added getBuild function and tidy up, remplazed local utils methods to nodecore-utils lib 2020-10-16 13:12:53 +02:00
srgooglo
4e76cb0db6 updated get_user_data endpoints 2020-10-14 22:32:08 +02:00
srgooglo
bb5daa7c84
Merge pull request #19 from srgooglo/master-cf-autofix
Apply fixes from CodeFactor
2020-10-12 20:50:48 +02:00
srgooglo
ecbd3d50c9 fixed auto close when no valid events 2020-10-12 20:38:06 +02:00
srgooglo
d484cefa92 refactor and clean some 2020-10-12 19:14:50 +02:00
codefactor-io
6f4a5943a8 [CodeFactor] Apply fixes to commit 4720ed2 2020-10-12 17:14:49 +00:00
srgooglo
4720ed240a update model for contextMenu and render method 2020-10-12 19:14:31 +02:00
srgooglo
c8d7809106 changed to global api requireQuery 2020-10-12 16:00:49 +02:00
srgooglo
c646d18c1a refactorized verbosity with the correct array schema 2020-10-12 15:59:37 +02:00
srgooglo
1838682c2a Merge branch 'master' of https://github.com/srgooglo/comty 2020-10-12 12:07:18 +02:00
srgooglo
c9aa8ad4f8 fixed duplicated queryIndexer & fixed bad schema for ipcInvoke in windowNavbar 2020-10-12 12:07:09 +02:00
srgooglo
eb53751f4f
Update trello_issue.yml 2020-10-12 11:50:41 +02:00
srgooglo
f9d83647cb
Update trello_issue.yml 2020-10-12 11:45:06 +02:00
srgooglo
d3576e23b9
Create trello_issue.yml 2020-10-12 11:41:53 +02:00
srgooglo
bbfe6f31cf add feature issue template 2020-10-12 11:20:54 +02:00
srgooglo
8badcbaa2e added Issues_Templates & added electron script 2020-10-12 11:12:11 +02:00
srgooglo
d094673bde updated api debugger for invalid import cause render crash and for stringify results 2020-10-12 09:02:10 +02:00
srgooglo
e5a5243dbe updated versions and added jest for tests 2020-10-12 08:57:34 +02:00
srgooglo
dbb752651b update nodecore-api-lib 2020-10-09 19:47:57 +02:00
srgooglo
821d183ef4 refactor DynamicSDCP lib for core 2020-10-09 19:16:05 +02:00
srgooglo
dfdbe2fc73 remove PageTransition and HeaderIconRender deprecated components 2020-10-09 19:14:48 +02:00
srgooglo
bd2b1fdbb4
Merge pull request #14 from srgooglo/apiv3-model-nodecore
Apiv3 model nodecore
2020-10-09 19:13:19 +02:00
codefactor-io
82404cc32a [CodeFactor] Apply fixes 2020-10-09 17:10:08 +00:00
srgooglo
dae830a7ce change api_v3 model with new @nodecore-api-lib 2020-10-09 19:07:14 +02:00
srgooglo
90ddeca69b this missed too 2020-10-09 17:45:35 +02:00
srgooglo
789c03cecf
Merge pull request #13 from srgooglo/added-user-model
Add user model to app models
2020-10-09 16:08:44 +02:00
codefactor-io
f5722f044d [CodeFactor] Apply fixes 2020-10-09 14:05:41 +00:00
srgooglo
91e7a162af Add user model to app models, user layout updated for gathering data from model instead local functions 2020-10-09 16:03:10 +02:00
srgooglo
5841296cd7 move verbosity call outside condition for avoid misbehaviors 2020-10-09 16:01:37 +02:00
srgooglo
5c6836245b wooups i forgot this again -.- 2020-10-09 15:28:50 +02:00
srgooglo
b59aef5d12 Merge branch 'master' of https://github.com/srgooglo/comty 2020-10-09 15:27:28 +02:00
srgooglo
c141c3d689 updated ErrorHandler with new flags, component Invalid now supports typeByCode, also refactor dependents components and fix some methods, like returning and CustomInvalid when nothing to return render 2020-10-09 15:27:16 +02:00
srgooglo
d954b78f79
Update changelog.yml 2020-10-09 13:28:18 +02:00
srgooglo
22a888d51f
Create changelog.yml 2020-10-09 13:27:17 +02:00
srgooglo
477fe6608b
Merge pull request #11 from srgooglo/master-cf-autofix
Apply fixes from CodeFactor
2020-10-09 13:16:41 +02:00
srgooglo
ca669bf042
Merge pull request #12 from srgooglo/improve-error-handler
Better error handler
2020-10-09 13:10:29 +02:00
srgooglo
5e372157a4 better error handler 2020-10-09 13:01:13 +02:00
srgooglo
10d2138027 removed invalid props 2020-10-09 12:59:43 +02:00
codefactor-io
ad5e38ead1 [CodeFactor] Apply fixes to commit 95a74eb 2020-10-08 18:52:43 +00:00
srgooglo
95a74eb3a2 Add user profile layout 2020-10-08 20:52:28 +02:00
srgooglo
b500171b01 Added basicData endpoint & refactorize profileData 2020-10-08 20:51:42 +02:00
srgooglo
005b6a41c9 woops i miss that one 2020-10-08 20:03:11 +02:00
srgooglo
0cae935aab refactor core "helpers" to "models" 2020-10-08 20:02:07 +02:00
srgooglo
296f12c67e Merge branch 'master' of https://github.com/srgooglo/comty 2020-10-08 18:45:08 +02:00
srgooglo
d27d7e70a4 wtf 2020-10-08 18:43:34 +02:00
srgooglo
b58128519d
Update codeql-analysis.yml 2020-10-08 16:40:21 +02:00
srgooglo
95a8010042
Update codeql-analysis.yml 2020-10-08 16:39:26 +02:00
srgooglo
2e6db0c645
Update README.md 2020-10-08 16:27:40 +02:00
srgooglo
b7f6223ded added to core queryIndexer, used for index an input rules and returns parsed string with callback 2020-10-08 16:17:05 +02:00
srgooglo
4ce2564a50 woops 2020-10-08 15:15:15 +02:00
srgooglo
5012174297 Updated InvalidComponents with Custom, InvalidIndex classes 2020-10-08 15:14:58 +02:00
srgooglo
794e11c9eb remove some trash 2020-10-08 15:12:38 +02:00
srgooglo
dfeb56c8ea refactorize ListedMenu to .tsx and update methods on dependents components 2020-10-08 15:11:54 +02:00
srgooglo
69df0eb9d6 Added ListedMenu component for menu menu generation with applied schema(41) 2020-10-08 14:47:44 +02:00
srgooglo
d34614d178 Merge branch 'master' of https://github.com/srgooglo/comty 2020-10-08 13:57:23 +02:00
srgooglo
a918c5821e switch to window.requireQuery method, also include URLSearchParams support for key indexing 2020-10-08 13:57:13 +02:00
srgooglo
a8fe322432
Update README.md 2020-10-07 18:36:00 +02:00
srgooglo
0d2e9eb907 added events handlers to basics events (" disconnect, connect... etc ") 2020-10-07 18:19:26 +02:00
srgooglo
b94eda6b7e added to lib global (wip) 2020-10-07 18:17:44 +02:00
srgooglo
5f6dee7988 added window.openLink() for support electron desktop to open new window with the default os browser 2020-10-07 18:17:15 +02:00
srgooglo
69bf50712d added new schemas for functional modules (schema-21) 2020-10-07 16:36:20 +02:00
srgooglo
007ebcc0ed
Merge pull request #9 from srgooglo/master-cf-autofix
Apply fixes from CodeFactor
2020-10-07 15:14:44 +02:00
codefactor-io
a403a7008c [CodeFactor] Apply fixes to commit f493c83 2020-10-07 13:13:23 +00:00
srgooglo
06cedf9887 Merge branch 'master' of https://github.com/srgooglo/Comty-Development 2020-10-07 15:12:51 +02:00
srgooglo
f493c830b5 refactor & other changes 2020-10-07 15:11:43 +02:00
srgooglo
0c864e6246 updated verbosity module with fixed method 2020-10-07 15:06:12 +02:00
srgooglo
f5898f6f92
Merge pull request #7 from srgooglo/master-cf-autofix
Apply fixes from CodeFactor
2020-10-07 11:18:57 +02:00
srgooglo
f349519678 [update] improved render methods for childrens with selectKey 2020-10-07 11:16:26 +02:00
srgooglo
e350d16b81 [added] GetPropertyValue => to core functions 2020-10-07 11:13:19 +02:00
srgooglo
2f84bedfd3 created new snippets for vscode, with create componets schema & switched (RPC) rich presence discord to "enabled" 2020-10-07 11:12:28 +02:00
srgooglo
991511f58d Merge branch 'master' of https://github.com/srgooglo/Comty-Development 2020-10-07 11:07:49 +02:00
srgooglo
95b80bd35c [update] verbosity removed legacy & refactor components, also tweaked string concat for support spread multiple data inputs 2020-10-07 11:07:36 +02:00
srgooglo
e2b89ce113
Merge pull request #8 from srgooglo/snyk-upgrade-448a54d0755f796663ec3bbcbdd9047c
[Snyk] Upgrade axios from 0.19.2 to 0.20.0
2020-10-07 10:22:12 +02:00
snyk-bot
268e1b75bc
fix: upgrade axios from 0.19.2 to 0.20.0
Snyk has created this PR to upgrade axios from 0.19.2 to 0.20.0.

See this package in npm:
https://www.npmjs.com/package/axios

See this project in Snyk:
https://app.snyk.io/org/srgooglo/project/32d7496a-6bfa-4eab-978c-5bc618fd2e41?utm_source=github&utm_medium=upgrade-pr
2020-10-07 00:44:05 +00:00
srgooglo
956d36edaa updated node-sass 2020-10-06 20:33:18 +02:00
srgooglo
d229001944 Merge branch 'master' of https://github.com/srgooglo/Comty-Development 2020-10-06 20:30:05 +02:00
srgooglo
471deba2d6
Create codeql-analysis.yml 2020-10-06 20:23:19 +02:00
1429 changed files with 33422 additions and 72289 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

3
.corenode Executable file
View File

@ -0,0 +1,3 @@
{
"version": "0.20.2"
}

3
.github/funding.yml vendored
View File

@ -1,3 +0,0 @@
open_collective: ragestudio
patreon: ragestudio
custom: ["https://www.paypal.com/donate/?hosted_button_id=S4TWMAN79KC76"]

13
.github/workflows/changelog.yml vendored Executable file
View File

@ -0,0 +1,13 @@
name: Create Changelogs
on:
push:
branches: [ master ]
jobs:
create_changelog:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Create Changelogs
uses: heineiuo/create-changelogs@v0.2.8

68
.github/workflows/codeql-analysis.yml vendored Executable file
View File

@ -0,0 +1,68 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
name: "CodeQL"
on:
pull_request:
branches: [master]
schedule:
- cron: '0 0 * * *'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
# Override automatic language detection by changing the below list
# Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python']
language: ['javascript']
# Learn more...
# https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection
steps:
- name: Checkout repository
uses: actions/checkout@v2
with:
# We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head.
fetch-depth: 2
# If this run was triggered by a pull request event, then checkout
# the head of the pull request instead of the merge commit.
- run: git checkout HEAD^2
if: ${{ github.event_name == 'pull_request' }}
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v1
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1

View File

@ -1,37 +0,0 @@
name: Release App
on:
workflow_dispatch:
push:
branches:
- master
permissions:
contents: write
jobs:
release:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
fetch-depth: 0
submodules: recursive
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: "22"
- name: Install dependencies
run: |
npm install
npm i @rollup/rollup-linux-x64-gnu
working-directory: ./packages/app
- name: Run release script
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: node scripts/release.js --ignore-commits
working-directory: ./packages/app

18
.github/workflows/trello_issue.yml vendored Executable file
View File

@ -0,0 +1,18 @@
name: Trello Issue List
on:
issues:
types: [opened]
env:
TRELLO_KEY: ${{ secrets.TRELLO_KEY }}
TRELLO_TOKEN: ${{ secrets.TRELLO_TOKEN }}
jobs:
issue_send:
name: Send Issue to Trello
runs-on: ubuntu-latest
steps:
- name: Runs trello manage
uses: sisodiya2421/trello-manage@master
with:
repo-name: Comty Development
trello-username: ${{ secrets.TRELLO_USERNAME }}

17
.github/workflows/validate.yml vendored Executable file
View File

@ -0,0 +1,17 @@
name: Validate code
on:
push:
branches:
- '**'
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
with:
node-version: 12
- run: npm ci
- run: npm test

7
.gitignore vendored Executable file → Normal file
View File

@ -3,11 +3,6 @@
/**/**/origin.server
/**/**/server.manifest
/**/**/server.registry
/**/**/.ssl
# Temporal
/**/**/_shared
/**/**/_research
# Trash
/**/**/*.log
@ -27,11 +22,9 @@
/**/**/.evite
/**/**/uploads
/**/**/d_data
/**/**/redis_data
/**/**/*.tar
/**/**/*.7z
/**/**/*.zip
/**/**/*.env
# Logs
/**/**/npm-debug.log*

9
.gitmodules vendored
View File

@ -1,9 +0,0 @@
[submodule "vessel"]
path = vessel
url = https://github.com/ragestudio/vessel
[submodule "linebridge"]
path = linebridge
url = https://github.com/ragestudio/linebridge
[submodule "comty.js"]
path = comty.js
url = https://github.com/ragestudio/comty.js

View File

@ -1,3 +0,0 @@
rtengine
wrapper
comty.js

23
.vscode/components_schemas.code-snippets vendored Executable file
View File

@ -0,0 +1,23 @@
{
"[schema-31] New Connected Component with decorators": {
"scope": "javascript",
"prefix": "newConnectedComponent",
"description": "Create a new react component with default schema for ycore-schema31",
"body": [
"import React from 'react'",
"import * as antd from 'antd'",
"import { connect } from 'umi'",
"",
"@connect(({ app }) => ({ app }))",
"export default class ${1:NewComponent} extends React.Component{",
"\trender(){",
"\t\treturn(",
"\t\t\t<div>",
"\t\t\t\t",
"\t\t\t</div>",
"\t\t)",
"\t}",
"}",
]
}
}

30
.vscode/functions_schemas.code-snippets vendored Executable file
View File

@ -0,0 +1,30 @@
{
"[schema-21] New api v3 based functions": {
"scope": "javascript",
"prefix": "newApiFunctional21",
"description": "Create a new functional core module with default schema for ycore-schema21",
"body": [
"import verbosity from 'core/libs/verbosity'",
"import handle from 'core/libs/errorhandler'",
"import { notify } from 'core/libs/ui'",
"import settings from 'core/libs/settings'",
"import endpoints from 'config/endpoints'",
"import { v3_model } from 'core/libs'",
"",
"export function ${1:NewFunction}(payload, callback){",
"\tif (!payload) return false",
"\tconst { data } = payload",
"\t\t",
"\treturn callback(false, null)",
"}",
"",
"export const ${2:ObjectFunction} = {",
"\tsomething: (payload, callback) => {",
"\t\treturn callback(false, null)",
"\t}",
"}",
"",
"export default ${1:NewFunction}",
]
}
}

48
.vscode/launch.json vendored
View File

@ -8,7 +8,53 @@
"skipFiles": [
"<node_internals>/**"
],
"type": "node"
"type": "pwa-node"
},
{
"name": "Attach to Chrome",
"port": 8000,
"request": "attach",
"type": "pwa-chrome",
"webRoot": "${workspaceFolder}"
},
{
"name": "Attach by Process ID",
"processId": "${command:PickProcess}",
"request": "attach",
"skipFiles": [
"<node_internals>/**"
],
"type": "pwa-node"
},
{
"name": "Electron Main",
"program": "${workspaceFolder}/main/index.js",
"request": "launch",
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron",
"skipFiles": [
"<node_internals>/**"
],
"type": "pwa-node"
},
{
"name": "Launch via NPM",
"request": "launch",
"runtimeArgs": [
"run-script",
"debug"
],
"runtimeExecutable": "npm",
"skipFiles": [
"<node_internals>/**"
],
"type": "pwa-node"
},
{
"name": "Launch WEB APP",
"type": "pwa-chrome",
"name": "http://192.168.0.2:8000",
"request": "launch",
"url": "http://192.168.0.2:8000"
}
]
}

21
.vscode/settings.json vendored
View File

@ -1,22 +1,3 @@
{
"peacock.remoteColor": "#ff6064",
"workbench.colorCustomizations": {
"activityBar.activeBackground": "#ff9396",
"activityBar.background": "#ff9396",
"activityBar.foreground": "#15202b",
"activityBar.inactiveForeground": "#15202b99",
"activityBarBadge.background": "#048000",
"activityBarBadge.foreground": "#e7e7e7",
"commandCenter.border": "#15202b99",
"sash.hoverBorder": "#ff9396",
"statusBar.background": "#ff6064",
"statusBar.foreground": "#15202b",
"statusBarItem.hoverBackground": "#ff2d32",
"statusBarItem.remoteBackground": "#ff6064",
"statusBarItem.remoteForeground": "#15202b",
"titleBar.activeBackground": "#ff6064",
"titleBar.activeForeground": "#15202b",
"titleBar.inactiveBackground": "#ff606499",
"titleBar.inactiveForeground": "#15202b99"
}
"discord.enabled": false
}

View File

@ -1,45 +0,0 @@
# Code of Conduct
## Our Promise
Comty is a space for creativity, learning, and collaboration. We are committed to making our community a welcoming and inclusive space for everyone, regardless of their background or identity. We promise to:
- Respect everyone's opinions, backgrounds, and experiences
- Foster a safe environment for all members to participate and contribute
- Encourage constructive criticism and feedback
- Be open-minded and willing to learn from one another
- Not tolerate any form of discrimination, harassment, or hate speech
## Our standards
To uphold our promise, we expect all members of our community to adhere to the following standards:
- Be respectful and considerate towards others
- Refrain from using discriminatory or offensive language or behavior
- Avoid personal attacks or harassment of any kind
- Listen to and consider the opinions of others, even if they differ from your own
- Report any violations of this Code of Conduct to the Comty team
## Consequences of Unacceptable Behavior
We take violations of this Code of Conduct seriously and will take appropriate action, which may include:
- A warning from the Comty team
- Suspension or removal from the community
- Reporting to relevant authorities, if necessary
- Contact Information
- If you experience or witness any violations of this Code of Conduct, please contact the Comty team at support@ragestudio.net or contact us on Discord.
> We will take all reports seriously and handle them confidentially.
## Acknowledgements
This Code of Conduct is adapted from the Contributor Covenant, version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.

View File

@ -1,45 +0,0 @@
# Code Style Guide
## Introduction
This document outlines the code style guidelines for the Comty project. The goal of these guidelines is to create readable, consistent, and maintainable code across the entire codebase.
## General Principles
- Always prioritize code readability and maintainability over cleverness or brevity.
- Write code that is easy to understand by other developers and your future self.
- Follow established patterns and conventions in the codebase, even if it means deviating from personal preferences.
- Write code that is compatible with the latest stable version of the language being used.
- Refactor code as needed to maintain readability and avoid duplication.
## Language-specific Guidelines
### JavaScript
- Use ES6 syntax and features whenever possible.
- Use double quotes for strings, including for JSX.
- Use const and let instead of var.
- Always use strict equality (=== and !==) for comparisons.
- Avoid using eval() and with().
- Use camelCase for variable and function names.
- Use PascalCase for class and component names.
- Use four spaces for indentation.
- Use a CSS preprocessor like LESS to organize styles. (We recommend use LESS cause it's used in the project, we prefer to no include another dependency)
- Use kebab-case for ID names.
- Use a consistent naming convention for classes and IDs, and avoid using inline styles.
- Use the :hover, :focus, and :active pseudo-classes as needed.
- Use descriptive class and ID names that clearly indicate their purpose.
## Conclusion
By following these code style guidelines, we can create code that is easy to read, understand, and maintain. These guidelines are not exhaustive, and there may be cases where they don't apply or conflict with other guidelines. In such cases, use your best judgement and work with the team to come to a consensus.

View File

@ -1,35 +0,0 @@
# Contributing to Comty
Oh wow! That's gonna be great! thank you for your interest in contributing to Comty! 👍🎉
>The following is a set of guidelines for contributing to Comty. These are just guidelines, not rules, so please use your best judgment and feel free to propose changes to this document in a pull request.
## Code of Conduct
This project and everyone participating in it is governed by the Comty Code of Conduct. By participating, you are expected to uphold this code.
> Please report unacceptable behavior to `support@ragestudio.net` or contact to an administrator on our Discord server.
## How to contribute
- Fork the repository and clone it to your local machine.
- Create a new branch for your changes: ```git checkout -b my-new-feature```
- Make changes and commit them: ```git commit -am 'Add some feature'```
- Push to the branch: ```git push origin my-new-feature```
- Submit a pull request.
- Pull Request Guidelines
- Before you submit a pull request, please make sure your changes meet the following guidelines:
- Your changes **should be** thoroughly tested and include passing test cases. (🙏 We gonna to thank you if you write tests for your code)
- Your code must follow the Comty Code Style.
- Your can document your code to make it easier to understand and review for other developers.
- Your changes must not introduce any critical errors in the build.
- Your changes must be approved by at least one of the maintainers.
## Reporting Bugs
If you find a bug, please open an issue on the GitHub repository. Please include a clear description of the bug, steps to reproduce it, and any relevant error messages.
## Feature Requests
If you have an idea for a new feature, please open an issue on the GitHub repository. Please include a clear description of the feature and why it would be useful.

513
LICENSE
View File

@ -1,29 +1,504 @@
Comty License
Version 1.0
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Issued on: 01/01/2024
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
1. Grant of Rights
Under this Comty License, permission is hereby granted, free of charge, to any person obtaining a copy of the software and associated documentation files (the "Software"), to use, copy, modify, merge, publish, and distribute copies of the Software, subject to the following conditions:
(This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.)
2. Non-Commercial Use
The use of the Software is restricted solely to non-commercial purposes. The sale, leasing, renting, sublicensing, or any other form of commercial exploitation of the Software or its derivatives is not permitted.
Preamble
3. Distribution
a. You may redistribute the Software in its original form or with modifications, provided that you retain this copyright notice and this Comty License in all copies or substantial portions of the Software.
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
b. If you distribute modified versions of the Software, you must include a clear notice indicating the changes you made and the date of those changes.
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.
4. Derivatives
a. The creation of derivative works based on the Software is permitted, provided that these derivative works are distributed under this same Comty License.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
b. Derivative works must clearly indicate that they have been modified from the original Software.
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
5. Limitation of Liability
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
6. Termination
This license and the rights granted herein will terminate automatically if you breach any of the terms of this Comty License. Upon termination, you must cease all use of the Software and destroy all copies you possess, whether modified or unmodified.
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
7. Governing Law
This Comty License shall be governed by and construed in accordance with the laws of Spain, without regard to its conflict of law principles.
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard. To achieve this, non-free programs must be
allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
e) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).
To apply these terms, attach the following notices to the library. It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
Comty-Development
Copyright (C) 2020 srgooglo
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James Random
Hacker.
{signature of Ty Coon}, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!

View File

@ -1,64 +1,44 @@
<p align="center">
<img
alt="Comty logo"
src="https://storage.ragestudio.net/rstudio/branding/comty/iso/basic_alt.svg"
height="150px"
/>
</p>
# Comty™
[![CodeFactor](https://www.codefactor.io/repository/github/ragestudio/comty/badge)](https://www.codefactor.io/repository/github/ragestudio/comty)
[![Maintainability](https://api.codeclimate.com/v1/badges/f89a278695d0a1301fe5/maintainability)](https://codeclimate.com/github/srgooglo/comty/maintainability)
[![Discord](https://img.shields.io/discord/769176303978938389?label=Discord)](https://discord.gg/yxQR6EXf2F)
# Comty - An prototype of an social network
![CodeQL](https://github.com/srgooglo/comty/workflows/CodeQL/badge.svg?branch=master)
[![CodeFactor](https://www.codefactor.io/repository/github/ragestudio/comty/badge)](https://www.codefactor.io/repository/github/ragestudio/comty)[![Maintainability](https://api.codeclimate.com/v1/badges/f89a278695d0a1301fe5/maintainability)](https://codeclimate.com/github/srgooglo/comty/maintainability)
[![Code Alerts](https://img.shields.io/lgtm/alerts/g/srgooglo/comty.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/srgooglo/comty/alerts/)
[![Grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/srgooglo/comty.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/srgooglo/comty/context:javascript)
[![Discord](https://img.shields.io/badge/dynamic/json?color=blue&label=Discord&query=name&url=https%3A%2F%2Fdiscord.com%2Fapi%2Fguilds%2F769176303978938389%2Fwidget.json)](https://discord.gg/NmnJexe)
The platform to hold all your creative.
A prototype of a platform inside of application focused on microservices, extensible and modular, in which the application adapts to your needs, where you will find tools and services allowing you to facilitate communication with other people in a social way.
> 👋 We have a official beta instance, you can access it from [https://comty.app](https://comty.app)
## Getting Started
>Its needed to have installed NodeJS ( v13^ ), Git, and a dependency manager (npm, yarn...)
## 🌟 Some of the features
📝 A microblogging system similar to Twitter allows users to post short messages with attachments and more.
- Getting the repository
```shell
git clone https://github.com/ragestudio/comty && cd comty
yarn
```
🎥 Comty TV is a live video streaming feature that allows users to stream their videos, events, or anything else in real-time to other users. It provides "playback anywhere™" URL's, including HLS, RTMP, RTSP without vendor lock-in.
- Starting web development server
```shell
cd packages/app
yarn start
```
- Starting api development server
```shell
cd packages/server
yarn start
```
> Now supports restreams! Easily push your streams to whatever you want.
## Status
This project is in a **early** design phase, there are still many phases to go through.
🎶 Comty Music lets users publish their music masterpieces, share their playlists with other users, and synchronize their music with other platforms. A powerful music player is also included in the application.
At the moment the ***development is slow but without pause***, because being a very complicated and important phase, we are **prioritizing quality** so that the project base can be preserved for a **long time**.
🧩 Modular and Extensible architecture allows developers to create and publish extensions for the platform using the powerful API provided by Comty.
Now **we are looking** for a team too.
Anyway, anyone interested, we are **looking for you**.
## 🌐 Available platforms
We have official public services that you can find on these platforms!
***Soon*** new updates adding much more information about this project.
🌐 Web | [https://comty.app](https://comty.app)
***Any contribution is very grateful, we need you more than ever!***
📱 (Outdated) Android APK (unsigned) (bundle auto update) | [https://github.com/ragestudio/comty/releases/download/0.50.4/app-release.apk](https://github.com/ragestudio/comty/releases/download/0.50.4/app-release.apk)
## 🚀 Development
Check the [getting-started.md](./docs/development/getting-started.md) document to get started with the development.
## 🤝 Contributions
Contributions to Comty are welcome. If you want to contribute, please follow the instructions mentioned in the [CONTRIBUTING.md](./CONTRIBUTING.md) file.
## 💅 Code Style
Please read the related document [CODE_STYLE.md](./CODE_STYLE.md) for more details.
## 🧑‍💻 Code of Conduct
We provide a [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md) file to help you understand what behavior is expected and unacceptable in the project.
## 📜 License
Comty is licensed under the Comty license. See the [LICENSE](./LICENSE) file for more details.
## 🧑‍🔬 Status
The project is in alpha design phase, and the development is slow but continuous, prioritizing quality to ensure the project base is preserved for a long time.
> 👥 The Comty team is looking for new members, and any contribution to the project is very welcome.
> If you are interested in more depth in the project, you can join our [Discord server](https://discord.gg/yxQR6EXf2F) and talk to us.
## :heart: Thanks to our supporters
<kbd><img src="https://avatars.githubusercontent.com/u/94137617?v=4" href="https://github.com/SoyRage" height="64" width="64" border="1px" align="center"></kbd>
<kbd><img src="https://avatars.githubusercontent.com/u/84641340?v=4" href="https://github.com/FoxasFoxVulpes" height="64" width="64" border="1px" align="center"></kbd>
<kbd><img src="https://avatars.githubusercontent.com/u/179495972?v=4" href="https://github.com/asiersinmasdev" height="64" width="64" border="1px" align="center"></kbd>
## Special Sponsors
[![Plenix Network - Cheap Hosting Solutions](https://storage.ragestudio.net/comty-static-assets/sponsors/plenix_board.png)](https://plenix.net)
## Tech
![tech](https://dl.ragestudio.net/persistent/CbEWXaE3cB35Rm2TFhY4Hnezr2P7qbtGDG86MPWUa6.png)

@ -1 +0,0 @@
Subproject commit cbb45df2ef42205022e38e4c7d33a001e162c383

View File

@ -1,31 +0,0 @@
services:
wrapper:
build: packages/wrapper
restart: unless-stopped
networks:
- internal_network
ports:
- "5000:5000"
env_file:
- ./.env
api:
build: packages/server
restart: unless-stopped
networks:
- internal_network
ports:
- "9000:9000"
env_file:
- ./.env
redis:
image: docker.dragonflydb.io/dragonflydb/dragonfly:latest
restart: unless-stopped
ulimits:
memlock: -1
networks:
- internal_network
command: "dragonfly --logtostderr --cache_mode=true --maxmemory=8gb --cluster_mode=emulated --lock_on_hashtags --default_lua_flags=allow-undeclared-keys"
networks:
internal_network:

View File

@ -1,7 +0,0 @@
{
"label": "Comty CLI",
"position": 3,
"link": {
"type": "generated-index"
}
}

View File

@ -1,5 +0,0 @@
---
sidebar_position: 1
---
# Getting Started

View File

@ -1,7 +0,0 @@
{
"label": "Comty.JS",
"position": 2,
"link": {
"type": "generated-index"
}
}

View File

@ -1,44 +0,0 @@
---
id: index
title: Comty.js Library
sidebar_label: Introduction
---
Welcome to the documentation for the `comty.js` library. This library provides a set of modules and classes for interacting with the Comty platform.
## Core Models
The following are the core models available in the `comty.js` library:
* [AddonsManager](models/addons): Manages addons within the library.
* [AuthModel](models/auth): Handles user authentication and session management.
* [MusicModel](models/music): Handles Music Data.
* [Post](models/post): Handles Post Data.
* [Search](models/search): Handles Search requests.
* [SessionModel](models/session): Manages user sessions and tokens.
* [UserModel](models/user): Manages User Data.
## Helpers
* [Remotes](remotes): Describes all the remotes.
* [Settings](settings): Describes all the settings.
* [Storage](storage): Describes all the storage.
* [WebsocketManager](ws): Handles websocket connections.
## Getting Started
To get started with the `comty.js` library, you can install it using npm:
```bash
npm install comty.js
```
Then, you can import the modules you need into your project:
```javascript
import { AuthModel, SessionModel } from 'comty.js';
// Use the modules
AuthModel.login({ username: 'myuser', password: 'mypassword' })
.then(data => console.log(data));
```

View File

@ -1,46 +0,0 @@
---
id: addons
title: AddonsManager
sidebar_label: AddonsManager
---
## AddonsManager
The `AddonsManager` class provides a way to register, retrieve, and manage addons within the comty.js library.
**Class Overview:**
The `AddonsManager` class allows you to register addons, retrieve them by name, and find addons that implement specific operations. It uses a `Map` internally to store the registered addons.
### Properties
* `addons`: A `Map` that stores the registered addons. The keys are the addon names, and the values are the addon instances.
### Methods
* `register(name, addon)`
* Registers a new addon with the specified name.
* Parameters:
* `name`: *string* The name of the addon.
* `addon`: *object* The addon instance.
* Returns: void
* `get(name)`
* Retrieves an addon by its name.
* Parameters:
* `name`: *string* The name of the addon to retrieve.
* Returns: *object | undefined* The addon instance if found, otherwise `undefined`.
* `getByOperation(operation)`
* Searches all registered addons and returns an array of addons that have a function for the specified operation.
* Parameters:
* `operation`: *string* The name of the operation to search for.
* Returns: *Array[object]* An array of objects, where each object contains the addon's ID and the corresponding function for the specified operation. Each object has the following structure:
* `id`: *string* The ID of the addon (addon.constructor.id).
* `fn`: *function* The addon's function for the specified operation (addon[operation]).
### API Reference
* `register(name: string, addon: object)`: void - Registers a new addon.
* `get(name: string)`: object | undefined - Retrieves an addon by name.
* `getByOperation(operation: string)`: Array[object] - Gets addons by operation.

View File

@ -1,101 +0,0 @@
---
id: auth
title: AuthModel
sidebar_label: AuthModel
---
## AuthModel
The `AuthModel` class provides static methods for handling user authentication, registration, and session management.
**Class Overview:**
The `AuthModel` class provides methods for user login, logout, registration, token verification, username validation, password management, and account activation/disabling.
### Methods
* `login(payload, callback)`
* Asynchronously handles the login process.
* Parameters:
* `payload`: *object* An object containing the username, password, and MFA code if required.
* `callback`: *function, optional* A callback function to handle further actions after login.
* Returns: *Promise[object | boolean]* A Promise that resolves with the response data if login is successful. Returns `false` if MFA is required.
* `logout()`
* Asynchronously logs out the user by destroying the current session and emitting an event for successful logout.
* Returns: *Promise[void]* A Promise that resolves after the logout process is completed.
* `register(payload)`
* Registers a new user with the provided payload.
* Parameters:
* `payload`: *object* An object containing the user's information username, password, email, tos.
* Returns: *Promise[object]* A Promise that resolves with the response data if registration is successful.
* Throws: Error if the registration fails.
* `authToken(token)`
* Verifies the given token and returns the user data associated with it.
* Parameters:
* `token`: *string, optional* The token to verify. If not provided, the stored token is used.
* Returns: *Promise[object]* A Promise that resolves with the user data if the token is valid.
* Throws: Error if there was an issue with the request.
* `usernameValidation(username)`
* Validates the existence of a username.
* Parameters:
* `username`: *string* The username to validate.
* Returns: *Promise[boolean | object]* A Promise that resolves with the response data if the validation is successful, or `false` if there was an error.
* Throws: Error if the validation fails.
* `availability(payload)`
* Retrieves the availability of a username and email.
* Parameters:
* `payload`: *object* An object containing the username and email to check availability for.
* Returns: *Promise[object | boolean]* A Promise that resolves with the availability data if successful, or `false` if an error occurred.
* `changePassword(payload)`
* Changes the user's password.
* Parameters:
* `payload`: *object* An object containing the currentPassword, newPassword, and code optional.
* Returns: *Promise[object]* The data response after changing the password.
* `activateAccount(user_id, code)`
* Activates a user account using the provided activation code.
* Parameters:
* `user_id`: *string* The ID of the user to activate.
* `code`: *string* The activation code sent to the user's email.
* Returns: *Promise[object]* A Promise that resolves with the response data after activation.
* Throws: Error if the activation process fails.
* `resendActivationCode(user_id)`
* Resends the activation code to the user.
* Parameters:
* `user_id`: *string* The ID of the user to resend the activation code to.
* Returns: *Promise[object]* A Promise that resolves with the response data after sending the activation code.
* Throws: Error if the resend activation code process fails.
* `disableAccount(options)`
* Disables the user's account.
* Parameters:
* `options`: *object, optional* An object containing options for disabling the account.
* `confirm`: *boolean* Confirmation to disable the account.
* Returns: *Promise[object]* A Promise that resolves with the response data after disabling the account.
* `recoverPassword(usernameOrEmail)`
* Recovers the password for a user account.
* Parameters:
* `usernameOrEmail`: *string* The username or email associated with the account to recover.
* Returns: *Promise[object]* A Promise that resolves with the response data after initiating the password recovery process.
### API Reference
* `login(payload: object, callback: function | undefined)`: *Promise[object | boolean]* - Asynchronously handles the login process.
* `logout()`: *Promise[void]* - Asynchronously logs out the user.
* `register(payload: object)`: *Promise[object]* - Registers a new user.
* `authToken(token: string | undefined)`: *Promise[object]* - Verifies the given token.
* `usernameValidation(username: string)`: *Promise[boolean | object]* - Validates the existence of a username.
* `availability(payload: object)`: *Promise[object | boolean]* - Retrieves the availability of a username and email.
* `changePassword(payload: object)`: *Promise[object]* - Changes the user's password.
* `activateAccount(user_id: string, code: string)`: *Promise[object]* - Activates a user account.
* `resendActivationCode(user_id: string)`: *Promise[object]* - Resends the activation code.
* `disableAccount(options: object | undefined)`: *Promise[object]* - Disables the user's account.
* `recoverPassword(usernameOrEmail: string)`: *Promise[object]* - Recovers the password for a user account.

View File

@ -1,29 +0,0 @@
---
id: chats
title: ChatsService
sidebar_label: ChatsService
---
## ChatsService
The `ChatsService` class provides static methods for interacting with chat data.
**Class Overview:**
The `ChatsService` class offers methods for retrieving chat history and recent chats for a user.
### Static Methods
* `getChatHistory(chat_id)`
Retrieves the chat history for a given chat ID.
* `chat_id`: *string* The ID of the chat.
* Returns: A Promise that resolves with the chat history data.
* Throws: Error if the chat_id is not provided.
* `getRecentChats()`
Retrieves the recent chats for the current user.
* Returns: A Promise that resolves with the chat history data.

View File

@ -1,31 +0,0 @@
---
id: e2e
title: E2EModel
sidebar_label: E2EModel
---
## E2EModel
The `E2EModel` class provides static methods for managing end-to-end encryption keys.
**Class Overview:**
The `E2EModel` class offers methods for retrieving and updating key pairs.
### Static Methods
* `getKeyPair()`
Retrieves the key pair for the current user.
* Returns: A Promise that resolves with the key pair data.
* `updateKeyPair(str, { imSure = false } = {})`
Updates the key pair for the current user.
* `str`: *string* The new key pair, encoded as a string.
* `{ imSure = false }`: *object, optional* Options for the update.
* `imSure`: *boolean, optional* Confirmation to update the keypair. Must be set to `true` to proceed.
* Returns: A Promise that resolves with the updated key pair data.
* Throws: Error if confirmation is missing.

View File

@ -1,28 +0,0 @@
---
id: events
title: EventsModel
sidebar_label: EventsModel
---
## EventsModel
The `EventsModel` class provides static methods for retrieving event data.
**Class Overview:**
The `EventsModel` class offers methods for retrieving featured events and data for a specific event.
### Static Methods
* `getFeatured()`
Retrieves featured events.
* Returns: A Promise that resolves with the featured events data.
* `data(id)`
Retrieves data for a specific event.
* `id`: *string* The ID of the event.
* Returns: A Promise that resolves with the event data.

View File

@ -1,51 +0,0 @@
---
id: feed
title: FeedModel
sidebar_label: FeedModel
---
## FeedModel
The `FeedModel` class provides static methods for retrieving feed data.
**Class Overview:**
The `FeedModel` class offers methods for retrieving music, global music, timeline, and global timeline feeds.
### Static Methods
* `getMusicFeed({ page, limit } = {})`
Retrieves music feed.
* `{ page, limit }`: *object, optional* An object containing the page and limit.
* `page`: *number, optional* The number of items to page from the feed.
* `limit`: *number, optional* The maximum number of items to fetch from the feed.
* Returns: A Promise that resolves with the music feed data.
* `getGlobalMusicFeed({ page, limit } = {})`
Retrieves global music feed.
* `{ page, limit }`: *object, optional* An object containing the page and limit.
* `page`: *number, optional* The number of items to page from the feed.
* `limit`: *number, optional* The maximum number of items to fetch from the feed.
* Returns: A Promise that resolves with the global music feed data.
* `getTimelineFeed({ page, limit } = {})`
Retrieves timeline feed.
* `{ page, limit }`: *object, optional* An object containing the page and limit.
* `page`: *number, optional* The number of feed items to page.
* `limit`: *number, optional* The maximum number of feed items to retrieve.
* Returns: A Promise that resolves with the timeline feed data.
* `getGlobalTimelineFeed({ page, limit } = {})`
Retrieves global timeline feed.
* `{ page, limit }`: *object, optional* An object containing the page and limit.
* `page`: *number, optional* The number of items to page from the feed.
* `limit`: *number, optional* The maximum number of posts to fetch from the feed.
* Returns: A Promise that resolves with the posts feed data.

View File

@ -1,38 +0,0 @@
---
id: follows
title: FollowsModel
sidebar_label: FollowsModel
---
## FollowsModel
The `FollowsModel` class provides static methods for interacting with user follow relationships.
**Class Overview:**
The `FollowsModel` class offers methods for checking if a user is following another user, retrieving followers, and toggling the follow status.
### Static Methods
* `imFollowing(user_id)`
Checks if the current user is following the specified user.
* `user_id`: *string* The ID of the user to check if the current user is following.
* Returns: A Promise that resolves with the response data indicating if the current user is following the specified user.
* Throws: Error if the user_id parameter is not provided.
* `getFollowers(user_id, fetchData)`
Retrieves the list of followers for a given user.
* `user_id`: *string, optional* The ID of the user. If not provided, the current user ID will be used.
* `fetchData`: *boolean* Whether to fetch additional data for each follower. Defaults to false.
* Returns: A promise that resolves with the list of followers and their data.
* `toggleFollow({ user_id })`
Toggles the follow status for a user.
* `user_id`: *string* The ID of the user to toggle follow status.
* Returns: A promise that resolves with the response data after toggling follow status.

View File

@ -1,159 +0,0 @@
---
id: music
title: MusicModel
sidebar_label: MusicModel
---
## MusicModel
The `MusicModel` class provides static methods for interacting with music-related data. It encapsulates various getters and setters for tracks, releases, library management, and search functionalities.
**Class Overview:**
The `MusicModel` class acts as a facade, providing a simplified interface to access and manipulate music data through its nested `Getters` and `Setters` classes.
### Static Properties
* `Getters`: An object containing static getter methods for retrieving music data.
* `Setters`: An object containing static setter methods for modifying music data.
### Track Related Methods
* `getAllTracks( { user_id, limit, page } )`
* Retrieves tracks for a given user.
* Parameters:
* `user_id`: *String* The ID of the user.
* `limit`: *Number* The number of tracks to retrieve per page.
* `page`: *Number* The page number to retrieve.
* Returns: *Promise[object]*
* `getTrackData(id: String, options: Object)`
* Retrieves data for a specific track.
* Parameters:
* `id`: *String* The ID of the track.
* `options`: *Object* Additional options for the request.
* Returns: *Promise[object]*
* `putTrack(track)`
* Creates/Updates a track.
* Parameters:
* `track`: *Object* The track object to create/update.
* Returns: *Promise[object]*
### Lyrics Related Methods
* `getTrackLyrics(id: String, options = { preferTranslation: false })`
* Retrieves lyrics for a specific track.
* Parameters:
* `id`: *String* The ID of the track.
* `options`: *Object*
* `preferTranslation`: *Boolean* If true, attempts to retrieve lyrics in the user's preferred language.
* Returns: *Promise[object]*
* `putTrackLyrics(track_id, data)`
* Updates lyrics for a specific track.
* Parameters:
* `track_id`: *String* The ID of the track.
* `data`: *Object* The lyrics data to update.
* Returns: *Promise[object]*
### Release Related Methods
* `getMyReleases({ limit, offset, keywords })`
* Retrieves the user's releases.
* Parameters:
* `limit`: *Number* The number of releases to retrieve.
* `offset`: *Number* The offset to start retrieving from.
* `keywords`: *String* Keywords to search for.
* Returns: *Promise[object]*
* `getAllReleases({ user_id, limit, page })`
* Retrieves releases for a given user.
* Parameters:
* `user_id`: *String* The ID of the user.
* `limit`: *Number* The number of releases to retrieve per page.
* `page`: *Number* The page number to retrieve.
* Returns: *Promise[object]*
* `getReleaseData(id: String)`
* Retrieves data for a specific release.
* Parameters:
* `id`: *String* The ID of the release.
* Returns: *Promise[object]*
* `putRelease(release)`
* Creates/Updates a release.
* Parameters:
* `release`: *Object* The release object to create/update.
* Returns: *Promise[object]*
* `deleteRelease(release_id)`
* Deletes a release.
* Parameters:
* `release_id`: *String* The ID of the release to delete.
* Returns: *Promise[object]*
### Library Related Methods
* `getMyLibrary({ limit = 100, offset = 0, order = "desc", kind })`
* Retrieves the user's music library.
* Parameters:
* `limit`: *Number* The number of items to retrieve.
* `offset`: *Number* The offset to start retrieving from.
* `order`: *String* The order to sort the items in ("asc" or "desc").
* `kind`: *String* Filter the library by kind (e.g., "track", "release").
* Returns: *Promise[object]*
* `toggleItemFavorite(type, item_id, to)`
* Toggles the favorite status of an item in the library.
* Parameters:
* `type`: *String* The type of item ("track", "release", etc.).
* `item_id`: *String* The ID of the item.
* `to`: *Boolean* Whether to add to favorites (true) or remove (false).
* Returns: *Promise[object]*
* `isItemFavorited(type, item_id)`
* Checks if an item is favorited in the library.
* Parameters:
* `type`: *String* The type of item ("track", "release", etc.).
* `item_id`: *String* The ID of the item.
* Returns: *Promise[object]*
### Other Methods
* `getRecentyPlayed(params)`
* Retrieves recently played tracks.
* Parameters:
* `params`: *Object* Additional parameters for the request.
* Returns: *Promise[object]*
* `search({ keywords, limit, offset })`
* Searches for music items.
* Parameters:
* `keywords`: *String* The search keywords.
* `limit`: *Number* The number of results to return.
* `offset`: *Number* The offset to start the search from.
* Returns: *Promise[object]*
### Aliases
* `toggleItemFavourite`: Alias for `toggleItemFavorite`.
* `isItemFavourited`: Alias for `isItemFavorited`.
### API Reference
* `getAllTracks( { user_id: String, limit: Number, page: Number } )`: *Promise[object]*
* `getTrackData(id: String, options: Object)`: *Promise[object]*
* `putTrack(track: Object)`: *Promise[object]*
* `getTrackLyrics(id: String, options: Object)`: *Promise[object]*
* `putTrackLyrics(track_id: String, data: Object)`: *Promise[object]*
* `getMyReleases({ limit: Number, offset: Number, keywords: String })`: *Promise[object]*
* `getAllReleases({ user_id: String, limit: Number, page: Number })`: *Promise[object]*
* `getReleaseData(id: String)`: *Promise[object]*
* `putRelease(release: Object)`: *Promise[object]*
* `deleteRelease(release_id: String)`: *Promise[object]*
* `getMyLibrary({ limit: Number, offset: Number, order: String, kind: String })`: *Promise[object]*
* `toggleItemFavorite(type: String, item_id: String, to: Boolean)`: *Promise[object]*
* `isItemFavorited(type: String, item_id: String)`: *Promise[object]*
* `getRecentyPlayed(params: Object)`: *Promise[object]*
* `search({ keywords: String, limit: Number, offset: Number })`: *Promise[object]*

View File

@ -1,54 +0,0 @@
---
id: nfc
title: NFCModel
sidebar_label: NFCModel
---
## NFCModel
The `NFCModel` class provides static methods for interacting with NFC tags.
**Class Overview:**
The `NFCModel` class offers methods for retrieving, registering, and deleting NFC tags.
### Static Methods
* `getOwnTags()`
Retrieves the list of tags owned by the current user.
* Returns: A Promise that resolves with the data of the tags.
* `getTagById(id)`
Retrieves a tag by its ID.
* `id`: *string* The ID of the tag to retrieve.
* Returns: The data of the retrieved tag.
* Throws: Error if the ID is not provided.
* `getTagBySerial(serial)`
Retrieves a tag by its serial number.
* `serial`: *string* The serial number of the tag to retrieve.
* Returns: A Promise that resolves with the data of the tag.
* Throws: Error if the serial number is not provided.
* `registerTag(serial, payload)`
Registers a tag with the given serial number and payload.
* `serial`: *string* The serial number of the tag.
* `payload`: *object* The payload data for the tag.
* Returns: The data of the registered tag.
* Throws: Error if the serial or payload is not provided.
* `deleteTag(id)`
Deletes a tag.
* `id`: *string* The ID of the tag to delete.
* Returns: A Promise that resolves with the data of the deleted tag.
* Throws: Error if the ID is not provided.

View File

@ -1,21 +0,0 @@
---
id: payments
title: PaymentsModel
sidebar_label: PaymentsModel
---
## PaymentsModel
The `PaymentsModel` class provides static methods for interacting with payment information.
**Class Overview:**
The `PaymentsModel` class offers methods for retrieving payment data.
### Static Methods
* `fetchBalance()`
Fetches the current balance.
* Returns: A promise that resolves with the balance data received from the server.

View File

@ -1,114 +0,0 @@
---
id: post
title: Post
sidebar_label: Post
---
## Post
The `Post` class provides static methods for interacting with posts and related data on the Comty platform.
### API Reference
**Class Overview:**
The `Post` class offers a comprehensive set of methods for retrieving, creating, updating, deleting, liking, saving, and voting on posts. It also provides functionalities for retrieving trending hashtags and posts.
### Static Properties
* `maxPostTextLength`: *number* The maximum length allowed for the post text (3200).
* `maxCommentLength`: *number* The maximum length allowed for a comment (1200).
### Static Methods
* `getPostingPolicy()`
* Retrieves the posting policy from the server.
* Returns: *Promise[object]* The posting policy data.
* `post(options)`
* Retrieves the data of a post by its ID.
* Parameters:
* `options`: *object* An object containing the post_id.
* `post_id`: *string* The ID of the post to retrieve.
* Returns: *Promise[object]* The data of the post.
* Throws: Error if the post_id is not provided.
* `replies(options)`
* Retrieves the replies of a post by its ID.
* Parameters:
* `options`: *object* An object containing the post_id, page, and limit.
* `post_id`: *string* The ID of the post to retrieve replies for.
* `page`: *number, optional* The number of characters to page the reply content (default: 0).
* `limit`: *number, optional* The maximum number of replies to fetch (default: Settings.get("feed_max_fetch")).
* Returns: *Promise[object]* The data of the replies.
* Throws: Error if the post_id is not provided.
* `getSavedPosts(options)`
* Retrieves the saved posts with optional trimming and limiting.
* Parameters:
* `options`: *object* An object containing the page and limit.
* `page`: *number, optional* The number of posts to page from the result (default: 0).
* `limit`: *number, optional* The maximum number of posts to fetch (default: Settings.get("feed_max_fetch")).
* Returns: *Promise[object]* The data of the liked posts.
* `getUserPosts(options)`
* Retrieves the liked posts with optional trimming and limiting.
* Parameters:
* `options`: *object* An object containing the page and limit.
* `page`: *number, optional* The number of posts to page from the result (default: 0).
* `limit`: *number, optional* The maximum number of posts to fetch (default: Settings.get("feed_max_fetch")).
* Returns: *Promise[object]* The data of the liked posts.
* `getUserPosts(options)`
* Retrieves the posts of a user with optional trimming and limiting.
* Parameters:
* `options`: *object* An object containing the user_id, page, and limit.
* `user_id`: *string, optional* The ID of the user whose posts to retrieve. If not provided, the current user's ID will be used.
* `page`: *number, optional* The number of characters to page the post content (default: 0).
* `limit`: *number, optional* The maximum number of posts to fetch (default: Settings.get("feed_max_fetch")).
* Returns: *Promise[object]* The data of the user's posts.
* `toggleLike(options)`
* Toggles the like status of a post.
* Parameters:
* `options`: *object* An object containing the post_id.
* `post_id`: *string* The ID of the post to toggle the like status.
* Returns: *Promise[object]* The response data after toggling the like status.
* Throws: Error if the post_id is not provided.
* `toggleSave(options)`
* Toggles the save status of a post.
* Parameters:
* `options`: *object* An object containing the post_id.
* `post_id`: *string* The ID of the post to toggle the save status.
* Returns: *Promise[object]* The response data after toggling the save status.
* Throws: Error if the post_id is not provided.
* `create(payload)`
* Creates a new post with the given payload.
* Parameters:
* `payload`: *object* The data to create the post with.
* Returns: *Promise[object]* The response data after creating the post.
* `update(post_id, update)`
* Updates a post with the given post ID and update payload.
* Parameters:
* `post_id`: *string* The ID of the post to update.
* `update`: *object* The data to update the post with.
* Returns: *Promise[object]* The response data after updating the post.
* Throws: Error if the post_id is not provided.
* `delete(options)`
* Deletes a post with the given post ID.
* Parameters:
* `options`: *object* An object containing the post_id.
* `post_id`: *string* The ID of the post to delete.
* Returns: *Promise[object]* The response data after deleting the post.
* Throws: Error if the post_id is not provided.
* `votePoll(options)`
* Votes for a poll with the given post ID and option ID.
* Parameters:
* `options`: *object* An object containing the post_id and option_id.
* `post_id`: *string* The ID of the post to vote for.
* `

View File

@ -1,30 +0,0 @@
---
id: radio
title: Radio
sidebar_label: Radio
---
## Radio
The `Radio` class provides static methods for retrieving radio data.
**Class Overview:**
The `Radio` class offers methods for retrieving radio lists and trending radio stations.
### Static Methods
* `getRadioList({ limit = 50, offset = 0 } = {})`
Retrieves a list of radio stations.
* `{ limit, offset }`: *object, optional* An object containing the limit and offset for pagination.
* `limit`: *number, optional* The maximum number of radio stations to retrieve (default: 50).
* `offset`: *number, optional* The offset to start retrieving from (default: 0).
* Returns: A promise that resolves with the radio list data.
* `getTrendings()`
Retrieves trending radio stations.
* Returns: A promise that resolves with the trending radio stations data.

View File

@ -1,32 +0,0 @@
---
id: search
title: Search
sidebar_label: Search
---
## Search
The `Search` class provides a static method for performing searches using the Comty API.
**Class Overview:**
The `Search` class encapsulates the search functionality, allowing you to search for content using keywords and optional parameters. It also supports external addons to extend the search functionality.
### Static Methods
* `search(keywords, params, returnFields)`
Performs a search using the provided keywords and optional parameters.
* `keywords`: *string* The keywords to search for.
* `params`: *object, optional* Optional parameters for the search.
* `limit`: *number, optional* The maximum number of results to return default: 50.
* `offset`: *number, optional* The offset to start the search from default: 0.
* `sort`: *string, optional* The sort order "asc" or "desc" default: "desc".
* `fields`: *array, optional* An array of fields to return in the results. If empty, all fields will be returned.
* `returnFields`: *array, optional* An array of fields to return in the results. If empty, all fields will be returned.
* Returns: A promise that resolves with the search results.
### API Reference
* `search(keywords: string, params: object, returnFields: array)`: Promise[object] - Performs a search using the provided keywords and optional parameters.

View File

@ -1,97 +0,0 @@
---
id: spectrum
title: Streaming
sidebar_label: Streaming
---
## Streaming
The `Streaming` class provides static methods for interacting with streaming data on the Comty platform.
**Class Overview:**
The `Streaming` class offers methods for managing streaming profiles, streams, and websocket connections.
### Static Methods
* `getStream(stream_id)`
Retrieves data for a specific stream.
* `stream_id`: *string* The ID of the stream.
* Returns: A promise that resolves with the stream data.
* `getOwnProfiles()`
Retrieves the streaming profiles owned by the current user.
* Returns: A promise that resolves with the profiles data.
* `getProfile(profile_id)`
Retrieves data for a specific streaming profile.
* `profile_id`: *string* The ID of the profile.
* Returns: A promise that resolves with the profile data.
* `createProfile(payload)`
Creates a new streaming profile.
* `payload`: *object* The data for the new profile.
* Returns: A promise that resolves with the created profile data.
* `updateProfile(profile_id, update)`
Updates a streaming profile.
* `profile_id`: *string* The ID of the profile to update.
* `update`: *object* The data to update the profile with.
* Returns: A promise that resolves with the updated profile data.
* `deleteProfile(profile_id)`
Deletes a streaming profile.
* `profile_id`: *string* The ID of the profile to delete.
* Returns: A promise that resolves with the response data after deleting the profile.
* `addRestreamToProfile(profileId, restreamData)`
Adds a restream to a profile.
* `profileId`: *string* The ID of the profile to add the restream to.
* `restreamData`: *object* The data for the restream.
* Returns: A promise that resolves with the response data.
* `deleteRestreamFromProfile(profileId, restreamIndexData)`
Deletes a restream from a profile.
* `profileId`: *string* The ID of the profile to delete the restream from.
* `restreamIndexData`: *object* The index data for the restream to delete.
* Returns: A promise that resolves with the response data.
* `list({ limit, offset } = {})`
Lists streaming entries.
* `{ limit, offset }`: *object, optional* An object containing pagination parameters.
* `limit`: *number, optional* The maximum number of items to retrieve.
* `offset`: *number, optional* The offset to start retrieving from.
* Returns: A promise that resolves with the streaming entries data.
* `createWebsocket(params = {})`
Creates a websocket connection.
* `params`: *object, optional* Additional parameters for the websocket connection.
* Returns: A `RTEngineClient` websocket client.
* `createStreamWebsocket(stream_id, params = {})`
Creates a stream-specific websocket connection.
* `stream_id`: *string* The ID of the stream.
* `params`: *object, optional* Additional parameters for the websocket connection.
* Returns: A `RTEngineClient` websocket client.

View File

@ -1,63 +0,0 @@
---
id: spotify
title: SpotifySyncModel
sidebar_label: SpotifySyncModel
---
## SpotifySyncModel
The `SpotifySyncModel` class provides static methods for linking and interacting with the Spotify service.
**Class Overview:**
The `SpotifySyncModel` class offers methods for authorizing, linking, unlinking, and retrieving data from the Spotify service.
### Static Properties
* `spotify_redirect_uri`: *string* The redirect URI for Spotify authorization.
* `spotify_authorize_endpoint`: *string* The Spotify authorization endpoint.
### Static Methods
* `authorizeAccount()`
Opens a new tab to authorize the user's Spotify account.
* Returns: void
* `get_client_id()`
Retrieves the Spotify client ID.
* Returns: A Promise that resolves with the client ID data.
* `syncAuthCode(code)`
Syncs the Spotify authorization code.
* `code`: *string* The Spotify authorization code.
* Returns: A Promise that resolves with the sync data.
* `unlinkAccount()`
Unlinks the user's Spotify account.
* Returns: A Promise that resolves with the unlink data.
* `isAuthorized()`
Checks if the user is authorized with Spotify.
* Returns: A Promise that resolves with a boolean indicating whether the user is authorized.
* `getData()`
Retrieves Spotify data.
* Returns: A Promise that resolves with the Spotify data.
* `getCurrentPlaying()`
Retrieves the currently playing track from Spotify.
* Returns: A Promise that resolves with the currently playing track data.

View File

@ -1,108 +0,0 @@
---
id: tidal
title: TidalService
sidebar_label: TidalService
---
## TidalService
The `TidalService` class provides static methods for linking and interacting with the Tidal service.
**Class Overview:**
The `TidalService` class offers methods for linking and unlinking accounts, checking the connection status, and retrieving data from the Tidal service.
### Static Properties
* `api_instance`: Returns the API instance for the Tidal service.
### Static Methods
* `linkAccount()`
Opens a new tab to link the user's Tidal account.
* Returns: A Promise that resolves with the link data.
* Throws: Error if not running in a browser environment
* `unlinkAccount()`
Unlinks the user's Tidal account.
* Returns: A Promise that resolves with the unlink data.
* Throws: Error if not running in a browser environment
* `isActive()`
Checks if the user's Tidal account is linked.
* Returns: A Promise that resolves with a boolean indicating whether the account is linked.
* Throws: Error if not running in a browser environment
* `getCurrentUser()`
Retrieves the current Tidal user.
* Returns: A Promise that resolves with the current user data.
* `getPlaybackUrl(track_id)`
Retrieves the playback URL for a given Tidal track ID.
* `track_id`: *string* The ID of the Tidal track.
* Returns: A Promise that resolves with the playback URL data.
* `getTrackManifest(track_id)`
Retrieves the track manifest for a given Tidal track ID.
* `track_id`: *string* The ID of the Tidal track.
* Returns: A Promise that resolves with the track manifest data.
* `getMyFavoriteTracks({ limit = 50, offset = 0 } = {})`
Retrieves the user's favorite Tidal tracks.
* `{ limit, offset }`: *object, optional* An object containing pagination parameters.
* `limit`: *number* The maximum number of tracks to retrieve.
* `offset`: *number* The offset to start retrieving from.
* Returns: A Promise that resolves with the favorite tracks data.
* `getMyFavoritePlaylists({ limit = 50, offset = 0 } = {})`
Retrieves the user's favorite Tidal playlists.
* `{ limit, offset }`: *object, optional* An object containing pagination parameters.
* `limit`: *number* The maximum number of playlists to retrieve.
* `offset`: *number* The offset to start retrieving from.
* Returns: A Promise that resolves with the favorite playlists data.
* `getPlaylistData({ playlist_id, resolve_items = false, limit = 50, offset = 0 })`
Retrieves Tidal playlist data.
* `playlist_id`: *string* The ID of the Tidal playlist.
* `{ resolve_items, limit, offset }`: *object, optional* An object containing playlist options.
* `resolve_items`: *boolean* Whether to resolve playlist items.
* `limit`: *number* The maximum number of items to retrieve.
* `offset`: *number* The offset to start retrieving from.
* Returns: A Promise that resolves with the playlist data.
* `getPlaylistItems({ playlist_id, resolve_items = false, limit = 50, offset = 0 })`
Retrieves Tidal playlist items.
* `playlist_id`: *string* The ID of the Tidal playlist.
* `{ resolve_items, limit, offset }`: *object, optional* An object containing playlist options.
* `resolve_items`: *boolean* Whether to resolve playlist items.
* `limit`: *number* The maximum number of items to retrieve.
* `offset`: *number* The offset to start retrieving from.
* Returns: A Promise that resolves with the playlist items data.
* `toggleTrackLike({ track_id, to })`
Toggles a Tidal track like.
* `track_id`: *string* The ID of the Tidal track.
* `to`: *boolean* Whether to like or unlike the track.
* Returns: A Promise that resolves with the response data.

View File

@ -1,80 +0,0 @@
---
id: user
title: UserModel
sidebar_label: UserModel
---
## UserModel
The `UserModel` class provides static methods for interacting with user data on the Comty platform.
**Class Overview:**
The `UserModel` class offers a set of methods for retrieving and updating user data, including profile information, roles, badges, and configuration settings.
### Static Methods
* `data(payload)`
Retrieves the data of a user.
* `payload`: *object, optional* An object containing the username and user_id.
* `username`: *string, optional* The username of the user.
* `user_id`: *string, optional* The ID of the user.
* `basic`: *boolean, optional* Whether to fetch only basic user information default: false.
* Returns: A promise that resolves with the data of the user.
* `updateData(payload)`
Updates the user data with the given payload.
* `payload`: *object* The data to update the user with.
* Returns: A promise that resolves with the updated user data.
* `unsetPublicName()`
Update the public name to null in the user data.
* Returns: A Promise that resolves with the response data after updating the public name
* `getRoles(user_id)`
Retrieves the roles of a user.
* `user_id`: *string, optional* The ID of the user. If not provided, the current user ID will be used.
* Returns: A promise that resolves with an array of roles for the user.
* `getBadges(user_id)`
Retrieves the badges for a given user.
* `user_id`: *string, optional* The ID of the user. If not provided, the current session user ID will be used.
* Returns: A promise that resolves with an array of badges for the user.
* `getConfig(key)`
Retrive user config from server
* `key`: *string* A key of config
* Returns: A Promise that resolves with a config object
* `updateConfig(update)`
Update the configuration with the given update.
* `update`: *Object* The object containing the updated configuration data
* Returns: A Promise that resolves with the response data after the configuration is updated
* `getPublicKey(user_id)`
Retrieves the public key for a given user.
* `user_id`: *string, optional* The ID of the user. If not provided, the current session user ID will be used.
* Returns: A promise that resolves with the public key for the user.
* `updatePublicKey(public_key)`
Updates the public key for the current user.
* `public_key`: *string* The new public key to set.
* Returns: A promise that resolves with the response data after updating the public key.

View File

@ -1,7 +0,0 @@
{
"label": "Development",
"position": 1,
"link": {
"type": "generated-index"
}
}

View File

@ -1,64 +0,0 @@
---
sidebar_position: 1
---
# Getting Started
We strongly recommend using Linux or macOS for development. Other platforms, such as Windows, can cause multiple issues.
Using Docker dev containers is also a nice choice.
## Dependencies
- Node.js (v18 or higher)
> Install [manually](https://nodejs.org/en/download/) or use [nvm](https://github.com/nvm-sh/nvm) tool (or similar tools).
- Python (3.10 or higher)
- [node-gyp](https://github.com/nodejs/node-gyp#installation) Install globally `npm install -g node-gyp`
- FFmpeg & FFprobe (^6.0 or higher)
> On Linux you can use built-in script to install it in your system-wide `packages/server/scripts/installLatestFfmpeg.sh` (uses CURL)
- (Recomended) Use [npm](https://docs.npmjs.com/cli/v11/configuring-npm/install) package manager.
- (Optional) [Docker](https://docs.docker.com/get-docker/), used for develop/building/deploy.
## Getting files
- Getting the repository
```shell
git clone --recurse-submodules https://github.com/ragestudio/comty && cd comty
```
- Installing all dependencies
```shell
npm install
```
## Setup Gateway
Comty uses a custom gateway to handle all requests and manage backend services. This gateway has two available engines for serving requests:
- `nginx`: Currently recommended.
- `http_proxy`: Obsolete, used in previous versions. Probably broken.
You can select an available engine by setting the `GATEWAY_MODE="<engine>"` environment variable. This can also be declared in the `.env` file.
By default, the gateway uses NGINX (as a proxy) to handle requests, so you'll need to set up this dependency.
It can be installed system-wide or by linking a static binary to `packages/server/nginx-bin`
> On Linux you can use built-in script to statically install
`packages/server/scripts/installNginxStatic.sh` (needs CURL)
## First Setup
This will execute some tasks to initialize for first time your resources, like S3, Databases...etc.
If you already initialized previously, skip this step.
- Run server setup script (if needed)
```shell
npm run setup:server
```
Also can you use the `--force` flag to force the execution of this tasks again.
### Starting the development server
- You can use the command `npm run dev` to start all development servers.
```shell
npm run dev
```

20
docusaurus/.gitignore vendored
View File

@ -1,20 +0,0 @@
# Dependencies
/node_modules
# Production
/build
# Generated files
.docusaurus
.cache-loader
# Misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*

View File

@ -1,41 +0,0 @@
# Website
This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator.
### Installation
```
$ yarn
```
### Local Development
```
$ yarn start
```
This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.
### Build
```
$ yarn build
```
This command generates static content into the `build` directory and can be served using any static contents hosting service.
### Deployment
Using SSH:
```
$ USE_SSH=true yarn deploy
```
Not using SSH:
```
$ GIT_USER=<Your GitHub username> yarn deploy
```
If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch.

View File

@ -1,3 +0,0 @@
module.exports = {
presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
};

View File

@ -1,135 +0,0 @@
// @ts-check
// `@type` JSDoc annotations allow editor autocompletion and type checking
// (when paired with `@ts-check`).
// There are various equivalent ways to declare your Docusaurus config.
// See: https://docusaurus.io/docs/api/docusaurus-config
import { themes as prismThemes } from "prism-react-renderer"
/** @type {import("@docusaurus/types").Config} */
const config = {
title: "Comty Documentation",
tagline: "The place for developers",
favicon: "img/favicon.ico",
// Set the production url of your site here
url: "https://comty.app",
// Set the /<baseUrl>/ pathname under which your site is served
// For GitHub pages deployment, it is often "/<projectName>/"
baseUrl: "/",
// GitHub pages deployment config.
// If you aren"t using GitHub pages, you don"t need these.
organizationName: "ragestudio", // Usually your GitHub org/user name.
projectName: "comty", // Usually your repo name.
onBrokenLinks: "throw",
onBrokenMarkdownLinks: "warn",
// Even if you don"t use internationalization, you can use this field to set
// useful metadata like html lang. For example, if your site is Chinese, you
// may want to replace "en" with "zh-Hans".
i18n: {
defaultLocale: "en",
locales: ["en"],
},
presets: [
[
"classic",
{
docs: {
path: "../docs",
sidebarPath: "./sidebars.js",
},
theme: {
customCss: "./src/css/custom.css",
},
},
],
],
plugins: [
[
"docusaurus-plugin-openapi-docs",
{
id: "api", // plugin id
docsPluginId: "classic", // configured for preset-classic
config: {
petstore: {
specPath: "examples/petstore.yaml",
outputDir: "docs/petstore",
sidebarOptions: {
groupPathsBy: "tag",
},
},
},
},
],
],
themeConfig:
/** @type {import("@docusaurus/preset-classic").ThemeConfig} */
({
// Replace with your project"s social card
image: "img/docusaurus-social-card.jpg",
navbar: {
title: "Comty Developers",
logo: {
alt: "Comty Logo",
src: "https://storage.ragestudio.net/rstudio/branding/comty/iso/logo_alt.svg",
},
items: [
{
type: "docSidebar",
sidebarId: "docs",
position: "left",
label: "Docs",
},
// {
// type: "docSidebar",
// sidebarId: "legal",
// position: "left",
// label: "Legal",
// },
{
href: "https://github.com/ragestudio/comty",
label: "GitHub",
position: "right",
},
],
},
footer: {
style: "dark",
links: [
{
title: "Community",
items: [
{
label: "Discord",
href: "https://discordapp.com/invite/docusaurus",
},
{
label: "GitHub",
href: "https://github.com/ragestudio/comty",
},
{
label: "Comty",
href: "https://comty.app/@ragestudio",
},
],
},
],
copyright: `Copyright © ${new Date().getFullYear()} RageStudio. Built with Docusaurus.`,
},
prism: {
theme: prismThemes.github,
darkTheme: prismThemes.dracula,
},
colorMode: {
defaultMode: "dark",
},
}),
}
export default config

View File

@ -1,46 +0,0 @@
{
"name": "docs",
"version": "0.0.0",
"private": true,
"scripts": {
"docusaurus": "docusaurus",
"start": "docusaurus start",
"build": "docusaurus build",
"swizzle": "docusaurus swizzle",
"deploy": "docusaurus deploy",
"clear": "docusaurus clear",
"serve": "docusaurus serve",
"write-translations": "docusaurus write-translations",
"write-heading-ids": "docusaurus write-heading-ids"
},
"dependencies": {
"@docusaurus/core": "3.5.2",
"@docusaurus/preset-classic": "3.5.2",
"@mdx-js/react": "^3.0.0",
"clsx": "^2.0.0",
"docusaurus-plugin-openapi-docs": "^4.4.0",
"prism-react-renderer": "^2.3.0",
"react": "^18.0.0",
"react-dom": "^18.0.0"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "3.5.2",
"@docusaurus/types": "3.5.2",
"jsdoc-to-mdx": "^1.2.1"
},
"browserslist": {
"production": [
">0.5%",
"not dead",
"not op_mini all"
],
"development": [
"last 3 chrome version",
"last 3 firefox version",
"last 5 safari version"
]
},
"engines": {
"node": ">=18.0"
}
}

View File

@ -1,20 +0,0 @@
/**
* Creating a sidebar enables you to:
- create an ordered group of docs
- render a sidebar for each doc of that group
- provide next/previous navigation
The sidebars can be generated from the filesystem, or explicitly defined here.
Create as many sidebars as you want.
*/
// @ts-check
/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */
const sidebars = {
// By default, Docusaurus generates a sidebar from the docs folder structure
docs: [{ type: "autogenerated", dirName: "." }],
}
export default sidebars

View File

@ -1,64 +0,0 @@
import clsx from 'clsx';
import Heading from '@theme/Heading';
import styles from './styles.module.css';
const FeatureList = [
{
title: 'Easy to Use',
Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default,
description: (
<>
Docusaurus was designed from the ground up to be easily installed and
used to get your website up and running quickly.
</>
),
},
{
title: 'Focus on What Matters',
Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default,
description: (
<>
Docusaurus lets you focus on your docs, and we&apos;ll do the chores. Go
ahead and move your docs into the <code>docs</code> directory.
</>
),
},
{
title: 'Powered by React',
Svg: require('@site/static/img/undraw_docusaurus_react.svg').default,
description: (
<>
Extend or customize your website layout by reusing React. Docusaurus can
be extended while reusing the same header and footer.
</>
),
},
];
function Feature({Svg, title, description}) {
return (
<div className={clsx('col col--4')}>
<div className="text--center">
<Svg className={styles.featureSvg} role="img" />
</div>
<div className="text--center padding-horiz--md">
<Heading as="h3">{title}</Heading>
<p>{description}</p>
</div>
</div>
);
}
export default function HomepageFeatures() {
return (
<section className={styles.features}>
<div className="container">
<div className="row">
{FeatureList.map((props, idx) => (
<Feature key={idx} {...props} />
))}
</div>
</div>
</section>
);
}

View File

@ -1,11 +0,0 @@
.features {
display: flex;
align-items: center;
padding: 2rem 0;
width: 100%;
}
.featureSvg {
height: 200px;
width: 200px;
}

View File

@ -1,40 +0,0 @@
/**
* Any CSS included here will be global. The classic template
* bundles Infima by default. Infima is a CSS framework designed to
* work well for content-centric websites.
*/
/* You can override the default Infima variables here. */
:root {
--ifm-color-primary: #ff6064;
--ifm-color-primary-dark: #ff60644c;
--ifm-color-primary-darker: #ff6064;
--ifm-color-primary-darkest: #ff6064;
--ifm-color-primary-light: #ff6064;
--ifm-color-primary-lighter: #ff6064;
--ifm-color-primary-lightest: #ff6064;
--ifm-code-font-size: 95%;
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);
}
/* For readability concerns, you should choose a lighter palette in dark mode. */
[data-theme='dark'] {
--ifm-color-primary: #ff6064;
--ifm-color-primary-dark: #ff6064;
--ifm-color-primary-darker: #ff6064;
--ifm-color-primary-darkest: #ff6064;
--ifm-color-primary-light: #ff6064;
--ifm-color-primary-lighter: #ff6064;
--ifm-color-primary-lightest: #ff6064;
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
}
.divider {
width: 100%;
height: 2px;
border-radius: 12px;
background-color: #E5E5E5;
}

View File

@ -1,32 +0,0 @@
import clsx from "clsx"
import Link from "@docusaurus/Link"
import useDocusaurusContext from "@docusaurus/useDocusaurusContext"
import Layout from "@theme/Layout"
import HomepageFeatures from "@site/src/components/HomepageFeatures"
import Heading from "@theme/Heading"
import styles from "./index.module.css"
function HomepageHeader() {
const { siteConfig } = useDocusaurusContext()
return <header className={clsx("hero hero--primary", styles.heroBanner)}>
<div className="container">
<Heading as="h1" className="hero__title">
{siteConfig.title}
</Heading>
<p className="hero__subtitle">{siteConfig.tagline}</p>
</div>
</header>
}
export default function Home() {
return <Layout>
<HomepageHeader />
<main>
<HomepageFeatures />
</main>
</Layout>
}

View File

@ -1,23 +0,0 @@
/**
* CSS files with the .module.css suffix will be treated as CSS modules
* and scoped locally.
*/
.heroBanner {
padding: 4rem 0;
text-align: center;
position: relative;
overflow: hidden;
}
@media screen and (max-width: 996px) {
.heroBanner {
padding: 2rem;
}
}
.buttons {
display: flex;
align-items: center;
justify-content: center;
}

View File

@ -1,7 +0,0 @@
---
title: Markdown page example
---
# Markdown page example
You don't need React to write simple standalone pages.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 6.3 KiB

View File

@ -1,171 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1088" height="687.962" viewBox="0 0 1088 687.962">
<title>Easy to Use</title>
<g id="Group_12" data-name="Group 12" transform="translate(-57 -56)">
<g id="Group_11" data-name="Group 11" transform="translate(57 56)">
<path id="Path_83" data-name="Path 83" d="M1017.81,560.461c-5.27,45.15-16.22,81.4-31.25,110.31-20,38.52-54.21,54.04-84.77,70.28a193.275,193.275,0,0,1-27.46,11.94c-55.61,19.3-117.85,14.18-166.74,3.99a657.282,657.282,0,0,0-104.09-13.16q-14.97-.675-29.97-.67c-15.42.02-293.07,5.29-360.67-131.57-16.69-33.76-28.13-75-32.24-125.27-11.63-142.12,52.29-235.46,134.74-296.47,155.97-115.41,369.76-110.57,523.43,7.88C941.15,276.621,1036.99,396.031,1017.81,560.461Z" transform="translate(-56 -106.019)" fill="#3f3d56"/>
<path id="Path_84" data-name="Path 84" d="M986.56,670.771c-20,38.52-47.21,64.04-77.77,80.28a193.272,193.272,0,0,1-27.46,11.94c-55.61,19.3-117.85,14.18-166.74,3.99a657.3,657.3,0,0,0-104.09-13.16q-14.97-.675-29.97-.67-23.13.03-46.25,1.72c-100.17,7.36-253.82-6.43-321.42-143.29L382,283.981,444.95,445.6l20.09,51.59,55.37-75.98L549,381.981l130.2,149.27,36.8-81.27L970.78,657.9l14.21,11.59Z" transform="translate(-56 -106.019)" fill="#f2f2f2"/>
<path id="Path_85" data-name="Path 85" d="M302,282.962l26-57,36,83-31-60Z" opacity="0.1"/>
<path id="Path_86" data-name="Path 86" d="M610.5,753.821q-14.97-.675-29.97-.67L465.04,497.191Z" transform="translate(-56 -106.019)" opacity="0.1"/>
<path id="Path_87" data-name="Path 87" d="M464.411,315.191,493,292.962l130,150-132-128Z" opacity="0.1"/>
<path id="Path_88" data-name="Path 88" d="M908.79,751.051a193.265,193.265,0,0,1-27.46,11.94L679.2,531.251Z" transform="translate(-56 -106.019)" opacity="0.1"/>
<circle id="Ellipse_11" data-name="Ellipse 11" cx="3" cy="3" r="3" transform="translate(479 98.962)" fill="#f2f2f2"/>
<circle id="Ellipse_12" data-name="Ellipse 12" cx="3" cy="3" r="3" transform="translate(396 201.962)" fill="#f2f2f2"/>
<circle id="Ellipse_13" data-name="Ellipse 13" cx="2" cy="2" r="2" transform="translate(600 220.962)" fill="#f2f2f2"/>
<circle id="Ellipse_14" data-name="Ellipse 14" cx="2" cy="2" r="2" transform="translate(180 265.962)" fill="#f2f2f2"/>
<circle id="Ellipse_15" data-name="Ellipse 15" cx="2" cy="2" r="2" transform="translate(612 96.962)" fill="#f2f2f2"/>
<circle id="Ellipse_16" data-name="Ellipse 16" cx="2" cy="2" r="2" transform="translate(736 192.962)" fill="#f2f2f2"/>
<circle id="Ellipse_17" data-name="Ellipse 17" cx="2" cy="2" r="2" transform="translate(858 344.962)" fill="#f2f2f2"/>
<path id="Path_89" data-name="Path 89" d="M306,121.222h-2.76v-2.76h-1.48v2.76H299V122.7h2.76v2.759h1.48V122.7H306Z" fill="#f2f2f2"/>
<path id="Path_90" data-name="Path 90" d="M848,424.222h-2.76v-2.76h-1.48v2.76H841V425.7h2.76v2.759h1.48V425.7H848Z" fill="#f2f2f2"/>
<path id="Path_91" data-name="Path 91" d="M1144,719.981c0,16.569-243.557,74-544,74s-544-57.431-544-74,243.557,14,544,14S1144,703.413,1144,719.981Z" transform="translate(-56 -106.019)" fill="#3f3d56"/>
<path id="Path_92" data-name="Path 92" d="M1144,719.981c0,16.569-243.557,74-544,74s-544-57.431-544-74,243.557,14,544,14S1144,703.413,1144,719.981Z" transform="translate(-56 -106.019)" opacity="0.1"/>
<ellipse id="Ellipse_18" data-name="Ellipse 18" cx="544" cy="30" rx="544" ry="30" transform="translate(0 583.962)" fill="#3f3d56"/>
<path id="Path_93" data-name="Path 93" d="M624,677.981c0,33.137-14.775,24-33,24s-33,9.137-33-24,33-96,33-96S624,644.844,624,677.981Z" transform="translate(-56 -106.019)" fill="#ff6584"/>
<path id="Path_94" data-name="Path 94" d="M606,690.66c0,15.062-6.716,10.909-15,10.909s-15,4.153-15-10.909,15-43.636,15-43.636S606,675.6,606,690.66Z" transform="translate(-56 -106.019)" opacity="0.1"/>
<rect id="Rectangle_97" data-name="Rectangle 97" width="92" height="18" rx="9" transform="translate(489 604.962)" fill="#2f2e41"/>
<rect id="Rectangle_98" data-name="Rectangle 98" width="92" height="18" rx="9" transform="translate(489 586.962)" fill="#2f2e41"/>
<path id="Path_95" data-name="Path 95" d="M193,596.547c0,55.343,34.719,100.126,77.626,100.126" transform="translate(-56 -106.019)" fill="#3f3d56"/>
<path id="Path_96" data-name="Path 96" d="M270.626,696.673c0-55.965,38.745-101.251,86.626-101.251" transform="translate(-56 -106.019)" fill="#6c63ff"/>
<path id="Path_97" data-name="Path 97" d="M221.125,601.564c0,52.57,22.14,95.109,49.5,95.109" transform="translate(-56 -106.019)" fill="#6c63ff"/>
<path id="Path_98" data-name="Path 98" d="M270.626,696.673c0-71.511,44.783-129.377,100.126-129.377" transform="translate(-56 -106.019)" fill="#3f3d56"/>
<path id="Path_99" data-name="Path 99" d="M254.3,697.379s11.009-.339,14.326-2.7,16.934-5.183,17.757-1.395,16.544,18.844,4.115,18.945-28.879-1.936-32.19-3.953S254.3,697.379,254.3,697.379Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
<path id="Path_100" data-name="Path 100" d="M290.716,710.909c-12.429.1-28.879-1.936-32.19-3.953-2.522-1.536-3.527-7.048-3.863-9.591l-.368.014s.7,8.879,4.009,10.9,19.761,4.053,32.19,3.953c3.588-.029,4.827-1.305,4.759-3.2C294.755,710.174,293.386,710.887,290.716,710.909Z" transform="translate(-56 -106.019)" opacity="0.2"/>
<path id="Path_101" data-name="Path 101" d="M777.429,633.081c0,38.029,23.857,68.8,53.341,68.8" transform="translate(-56 -106.019)" fill="#3f3d56"/>
<path id="Path_102" data-name="Path 102" d="M830.769,701.882c0-38.456,26.623-69.575,59.525-69.575" transform="translate(-56 -106.019)" fill="#6c63ff"/>
<path id="Path_103" data-name="Path 103" d="M796.755,636.528c0,36.124,15.213,65.354,34.014,65.354" transform="translate(-56 -106.019)" fill="#6c63ff"/>
<path id="Path_104" data-name="Path 104" d="M830.769,701.882c0-49.139,30.773-88.9,68.8-88.9" transform="translate(-56 -106.019)" fill="#3f3d56"/>
<path id="Path_105" data-name="Path 105" d="M819.548,702.367s7.565-.233,9.844-1.856,11.636-3.562,12.2-.958,11.368,12.949,2.828,13.018-19.844-1.33-22.119-2.716S819.548,702.367,819.548,702.367Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
<path id="Path_106" data-name="Path 106" d="M844.574,711.664c-8.54.069-19.844-1.33-22.119-2.716-1.733-1.056-2.423-4.843-2.654-6.59l-.253.01s.479,6.1,2.755,7.487,13.579,2.785,22.119,2.716c2.465-.02,3.317-.9,3.27-2.2C847.349,711.159,846.409,711.649,844.574,711.664Z" transform="translate(-56 -106.019)" opacity="0.2"/>
<path id="Path_107" data-name="Path 107" d="M949.813,724.718s11.36-1.729,14.5-4.591,16.89-7.488,18.217-3.667,19.494,17.447,6.633,19.107-30.153,1.609-33.835-.065S949.813,724.718,949.813,724.718Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
<path id="Path_108" data-name="Path 108" d="M989.228,734.173c-12.86,1.659-30.153,1.609-33.835-.065-2.8-1.275-4.535-6.858-5.2-9.45l-.379.061s1.833,9.109,5.516,10.783,20.975,1.725,33.835.065c3.712-.479,4.836-1.956,4.529-3.906C993.319,732.907,991.991,733.817,989.228,734.173Z" transform="translate(-56 -106.019)" opacity="0.2"/>
<path id="Path_109" data-name="Path 109" d="M670.26,723.9s9.587-1.459,12.237-3.875,14.255-6.32,15.374-3.095,16.452,14.725,5.6,16.125-25.448,1.358-28.555-.055S670.26,723.9,670.26,723.9Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
<path id="Path_110" data-name="Path 110" d="M703.524,731.875c-10.853,1.4-25.448,1.358-28.555-.055-2.367-1.076-3.827-5.788-4.39-7.976l-.32.051s1.547,7.687,4.655,9.1,17.7,1.456,28.555.055c3.133-.4,4.081-1.651,3.822-3.3C706.977,730.807,705.856,731.575,703.524,731.875Z" transform="translate(-56 -106.019)" opacity="0.2"/>
<path id="Path_111" data-name="Path 111" d="M178.389,719.109s7.463-1.136,9.527-3.016,11.1-4.92,11.969-2.409,12.808,11.463,4.358,12.553-19.811,1.057-22.23-.043S178.389,719.109,178.389,719.109Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
<path id="Path_112" data-name="Path 112" d="M204.285,725.321c-8.449,1.09-19.811,1.057-22.23-.043-1.842-.838-2.979-4.506-3.417-6.209l-.249.04s1.2,5.984,3.624,7.085,13.781,1.133,22.23.043c2.439-.315,3.177-1.285,2.976-2.566C206.973,724.489,206.1,725.087,204.285,725.321Z" transform="translate(-56 -106.019)" opacity="0.2"/>
<path id="Path_113" data-name="Path 113" d="M439.7,707.337c0,30.22-42.124,20.873-93.7,20.873s-93.074,9.347-93.074-20.873,42.118-36.793,93.694-36.793S439.7,677.117,439.7,707.337Z" transform="translate(-56 -106.019)" opacity="0.1"/>
<path id="Path_114" data-name="Path 114" d="M439.7,699.9c0,30.22-42.124,20.873-93.7,20.873s-93.074,9.347-93.074-20.873S295.04,663.1,346.616,663.1,439.7,669.676,439.7,699.9Z" transform="translate(-56 -106.019)" fill="#3f3d56"/>
</g>
<g id="docusaurus_keytar" transform="translate(312.271 493.733)">
<path id="Path_40" data-name="Path 40" d="M99,52h91.791V89.153H99Z" transform="translate(5.904 -14.001)" fill="#fff" fill-rule="evenodd"/>
<path id="Path_41" data-name="Path 41" d="M24.855,163.927A21.828,21.828,0,0,1,5.947,153a21.829,21.829,0,0,0,18.908,32.782H46.71V163.927Z" transform="translate(-3 -4.634)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_42" data-name="Path 42" d="M121.861,61.1l76.514-4.782V45.39A21.854,21.854,0,0,0,176.52,23.535H78.173L75.441,18.8a3.154,3.154,0,0,0-5.464,0l-2.732,4.732L64.513,18.8a3.154,3.154,0,0,0-5.464,0l-2.732,4.732L53.586,18.8a3.154,3.154,0,0,0-5.464,0L45.39,23.535c-.024,0-.046,0-.071,0l-4.526-4.525a3.153,3.153,0,0,0-5.276,1.414l-1.5,5.577-5.674-1.521a3.154,3.154,0,0,0-3.863,3.864L26,34.023l-5.575,1.494a3.155,3.155,0,0,0-1.416,5.278l4.526,4.526c0,.023,0,.046,0,.07L18.8,48.122a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,59.05a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,69.977a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,80.9a3.154,3.154,0,0,0,0,5.464L23.535,89.1,18.8,91.832a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,102.76a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,113.687a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,124.615a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,135.542a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,146.469a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,157.4a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,168.324a3.154,3.154,0,0,0,0,5.464l4.732,2.732A21.854,21.854,0,0,0,45.39,198.375H176.52a21.854,21.854,0,0,0,21.855-21.855V89.1l-76.514-4.782a11.632,11.632,0,0,1,0-23.219" transform="translate(-1.681 -17.226)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_43" data-name="Path 43" d="M143,186.71h32.782V143H143Z" transform="translate(9.984 -5.561)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_44" data-name="Path 44" d="M196.71,159.855a5.438,5.438,0,0,0-.7.07c-.042-.164-.081-.329-.127-.493a5.457,5.457,0,1,0-5.4-9.372q-.181-.185-.366-.367a5.454,5.454,0,1,0-9.384-5.4c-.162-.046-.325-.084-.486-.126a5.467,5.467,0,1,0-10.788,0c-.162.042-.325.08-.486.126a5.457,5.457,0,1,0-9.384,5.4,21.843,21.843,0,1,0,36.421,21.02,5.452,5.452,0,1,0,.7-10.858" transform="translate(10.912 -6.025)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_45" data-name="Path 45" d="M153,124.855h32.782V103H153Z" transform="translate(10.912 -9.271)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_46" data-name="Path 46" d="M194.855,116.765a2.732,2.732,0,1,0,0-5.464,2.811,2.811,0,0,0-.349.035c-.022-.082-.04-.164-.063-.246a2.733,2.733,0,0,0-1.052-5.253,2.7,2.7,0,0,0-1.648.566q-.09-.093-.184-.184a2.7,2.7,0,0,0,.553-1.633,2.732,2.732,0,0,0-5.245-1.07,10.928,10.928,0,1,0,0,21.031,2.732,2.732,0,0,0,5.245-1.07,2.7,2.7,0,0,0-.553-1.633q.093-.09.184-.184a2.7,2.7,0,0,0,1.648.566,2.732,2.732,0,0,0,1.052-5.253c.023-.081.042-.164.063-.246a2.814,2.814,0,0,0,.349.035" transform="translate(12.767 -9.377)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_47" data-name="Path 47" d="M65.087,56.891a2.732,2.732,0,0,1-2.732-2.732,8.2,8.2,0,0,0-16.391,0,2.732,2.732,0,0,1-5.464,0,13.659,13.659,0,0,1,27.319,0,2.732,2.732,0,0,1-2.732,2.732" transform="translate(0.478 -15.068)" fill-rule="evenodd"/>
<path id="Path_48" data-name="Path 48" d="M103,191.347h65.565a21.854,21.854,0,0,0,21.855-21.855V93H124.855A21.854,21.854,0,0,0,103,114.855Z" transform="translate(6.275 -10.199)" fill="#ffff50" fill-rule="evenodd"/>
<path id="Path_49" data-name="Path 49" d="M173.216,129.787H118.535a1.093,1.093,0,1,1,0-2.185h54.681a1.093,1.093,0,0,1,0,2.185m0,21.855H118.535a1.093,1.093,0,1,1,0-2.186h54.681a1.093,1.093,0,0,1,0,2.186m0,21.855H118.535a1.093,1.093,0,1,1,0-2.185h54.681a1.093,1.093,0,0,1,0,2.185m0-54.434H118.535a1.093,1.093,0,1,1,0-2.185h54.681a1.093,1.093,0,0,1,0,2.185m0,21.652H118.535a1.093,1.093,0,1,1,0-2.186h54.681a1.093,1.093,0,0,1,0,2.186m0,21.855H118.535a1.093,1.093,0,1,1,0-2.186h54.681a1.093,1.093,0,0,1,0,2.186M189.585,61.611c-.013,0-.024-.007-.037-.005-3.377.115-4.974,3.492-6.384,6.472-1.471,3.114-2.608,5.139-4.473,5.078-2.064-.074-3.244-2.406-4.494-4.874-1.436-2.835-3.075-6.049-6.516-5.929-3.329.114-4.932,3.053-6.346,5.646-1.5,2.762-2.529,4.442-4.5,4.364-2.106-.076-3.225-1.972-4.52-4.167-1.444-2.443-3.112-5.191-6.487-5.1-3.272.113-4.879,2.606-6.3,4.808-1.5,2.328-2.552,3.746-4.551,3.662-2.156-.076-3.27-1.65-4.558-3.472-1.447-2.047-3.077-4.363-6.442-4.251-3.2.109-4.807,2.153-6.224,3.954-1.346,1.709-2.4,3.062-4.621,2.977a1.093,1.093,0,0,0-.079,2.186c3.3.11,4.967-1.967,6.417-3.81,1.286-1.635,2.4-3.045,4.582-3.12,2.1-.09,3.091,1.218,4.584,3.327,1.417,2,3.026,4.277,6.263,4.394,3.391.114,5.022-2.42,6.467-4.663,1.292-2,2.406-3.734,4.535-3.807,1.959-.073,3.026,1.475,4.529,4.022,1.417,2.4,3.023,5.121,6.324,5.241,3.415.118,5.064-2.863,6.5-5.5,1.245-2.282,2.419-4.437,4.5-4.509,1.959-.046,2.981,1.743,4.492,4.732,1.412,2.79,3.013,5.95,6.365,6.071l.185,0c3.348,0,4.937-3.36,6.343-6.331,1.245-2.634,2.423-5.114,4.444-5.216Z" transform="translate(7.109 -13.11)" fill-rule="evenodd"/>
<path id="Path_50" data-name="Path 50" d="M83,186.71h43.71V143H83Z" transform="translate(4.42 -5.561)" fill="#3ecc5f" fill-rule="evenodd"/>
<g id="Group_8" data-name="Group 8" transform="matrix(0.966, -0.259, 0.259, 0.966, 109.327, 91.085)">
<rect id="Rectangle_3" data-name="Rectangle 3" width="92.361" height="36.462" rx="2" transform="translate(0 0)" fill="#d8d8d8"/>
<g id="Group_2" data-name="Group 2" transform="translate(1.531 23.03)">
<rect id="Rectangle_4" data-name="Rectangle 4" width="5.336" height="5.336" rx="1" transform="translate(16.797 0)" fill="#4a4a4a"/>
<rect id="Rectangle_5" data-name="Rectangle 5" width="5.336" height="5.336" rx="1" transform="translate(23.12 0)" fill="#4a4a4a"/>
<rect id="Rectangle_6" data-name="Rectangle 6" width="5.336" height="5.336" rx="1" transform="translate(29.444 0)" fill="#4a4a4a"/>
<rect id="Rectangle_7" data-name="Rectangle 7" width="5.336" height="5.336" rx="1" transform="translate(35.768 0)" fill="#4a4a4a"/>
<rect id="Rectangle_8" data-name="Rectangle 8" width="5.336" height="5.336" rx="1" transform="translate(42.091 0)" fill="#4a4a4a"/>
<rect id="Rectangle_9" data-name="Rectangle 9" width="5.336" height="5.336" rx="1" transform="translate(48.415 0)" fill="#4a4a4a"/>
<rect id="Rectangle_10" data-name="Rectangle 10" width="5.336" height="5.336" rx="1" transform="translate(54.739 0)" fill="#4a4a4a"/>
<rect id="Rectangle_11" data-name="Rectangle 11" width="5.336" height="5.336" rx="1" transform="translate(61.063 0)" fill="#4a4a4a"/>
<rect id="Rectangle_12" data-name="Rectangle 12" width="5.336" height="5.336" rx="1" transform="translate(67.386 0)" fill="#4a4a4a"/>
<path id="Path_51" data-name="Path 51" d="M1.093,0H14.518a1.093,1.093,0,0,1,1.093,1.093V4.243a1.093,1.093,0,0,1-1.093,1.093H1.093A1.093,1.093,0,0,1,0,4.243V1.093A1.093,1.093,0,0,1,1.093,0ZM75,0H88.426a1.093,1.093,0,0,1,1.093,1.093V4.243a1.093,1.093,0,0,1-1.093,1.093H75a1.093,1.093,0,0,1-1.093-1.093V1.093A1.093,1.093,0,0,1,75,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
</g>
<g id="Group_3" data-name="Group 3" transform="translate(1.531 10.261)">
<path id="Path_52" data-name="Path 52" d="M1.093,0H6.218A1.093,1.093,0,0,1,7.31,1.093V4.242A1.093,1.093,0,0,1,6.218,5.335H1.093A1.093,1.093,0,0,1,0,4.242V1.093A1.093,1.093,0,0,1,1.093,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<rect id="Rectangle_13" data-name="Rectangle 13" width="5.336" height="5.336" rx="1" transform="translate(8.299 0)" fill="#4a4a4a"/>
<rect id="Rectangle_14" data-name="Rectangle 14" width="5.336" height="5.336" rx="1" transform="translate(14.623 0)" fill="#4a4a4a"/>
<rect id="Rectangle_15" data-name="Rectangle 15" width="5.336" height="5.336" rx="1" transform="translate(20.947 0)" fill="#4a4a4a"/>
<rect id="Rectangle_16" data-name="Rectangle 16" width="5.336" height="5.336" rx="1" transform="translate(27.271 0)" fill="#4a4a4a"/>
<rect id="Rectangle_17" data-name="Rectangle 17" width="5.336" height="5.336" rx="1" transform="translate(33.594 0)" fill="#4a4a4a"/>
<rect id="Rectangle_18" data-name="Rectangle 18" width="5.336" height="5.336" rx="1" transform="translate(39.918 0)" fill="#4a4a4a"/>
<rect id="Rectangle_19" data-name="Rectangle 19" width="5.336" height="5.336" rx="1" transform="translate(46.242 0)" fill="#4a4a4a"/>
<rect id="Rectangle_20" data-name="Rectangle 20" width="5.336" height="5.336" rx="1" transform="translate(52.565 0)" fill="#4a4a4a"/>
<rect id="Rectangle_21" data-name="Rectangle 21" width="5.336" height="5.336" rx="1" transform="translate(58.888 0)" fill="#4a4a4a"/>
<rect id="Rectangle_22" data-name="Rectangle 22" width="5.336" height="5.336" rx="1" transform="translate(65.212 0)" fill="#4a4a4a"/>
<rect id="Rectangle_23" data-name="Rectangle 23" width="5.336" height="5.336" rx="1" transform="translate(71.536 0)" fill="#4a4a4a"/>
<rect id="Rectangle_24" data-name="Rectangle 24" width="5.336" height="5.336" rx="1" transform="translate(77.859 0)" fill="#4a4a4a"/>
<rect id="Rectangle_25" data-name="Rectangle 25" width="5.336" height="5.336" rx="1" transform="translate(84.183 0)" fill="#4a4a4a"/>
</g>
<g id="Group_4" data-name="Group 4" transform="translate(91.05 9.546) rotate(180)">
<path id="Path_53" data-name="Path 53" d="M1.093,0H6.219A1.093,1.093,0,0,1,7.312,1.093v3.15A1.093,1.093,0,0,1,6.219,5.336H1.093A1.093,1.093,0,0,1,0,4.243V1.093A1.093,1.093,0,0,1,1.093,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<rect id="Rectangle_26" data-name="Rectangle 26" width="5.336" height="5.336" rx="1" transform="translate(8.299 0)" fill="#4a4a4a"/>
<rect id="Rectangle_27" data-name="Rectangle 27" width="5.336" height="5.336" rx="1" transform="translate(14.623 0)" fill="#4a4a4a"/>
<rect id="Rectangle_28" data-name="Rectangle 28" width="5.336" height="5.336" rx="1" transform="translate(20.947 0)" fill="#4a4a4a"/>
<rect id="Rectangle_29" data-name="Rectangle 29" width="5.336" height="5.336" rx="1" transform="translate(27.271 0)" fill="#4a4a4a"/>
<rect id="Rectangle_30" data-name="Rectangle 30" width="5.336" height="5.336" rx="1" transform="translate(33.594 0)" fill="#4a4a4a"/>
<rect id="Rectangle_31" data-name="Rectangle 31" width="5.336" height="5.336" rx="1" transform="translate(39.918 0)" fill="#4a4a4a"/>
<rect id="Rectangle_32" data-name="Rectangle 32" width="5.336" height="5.336" rx="1" transform="translate(46.242 0)" fill="#4a4a4a"/>
<rect id="Rectangle_33" data-name="Rectangle 33" width="5.336" height="5.336" rx="1" transform="translate(52.565 0)" fill="#4a4a4a"/>
<rect id="Rectangle_34" data-name="Rectangle 34" width="5.336" height="5.336" rx="1" transform="translate(58.889 0)" fill="#4a4a4a"/>
<rect id="Rectangle_35" data-name="Rectangle 35" width="5.336" height="5.336" rx="1" transform="translate(65.213 0)" fill="#4a4a4a"/>
<rect id="Rectangle_36" data-name="Rectangle 36" width="5.336" height="5.336" rx="1" transform="translate(71.537 0)" fill="#4a4a4a"/>
<rect id="Rectangle_37" data-name="Rectangle 37" width="5.336" height="5.336" rx="1" transform="translate(77.86 0)" fill="#4a4a4a"/>
<rect id="Rectangle_38" data-name="Rectangle 38" width="5.336" height="5.336" rx="1" transform="translate(84.183 0)" fill="#4a4a4a"/>
<rect id="Rectangle_39" data-name="Rectangle 39" width="5.336" height="5.336" rx="1" transform="translate(8.299 0)" fill="#4a4a4a"/>
<rect id="Rectangle_40" data-name="Rectangle 40" width="5.336" height="5.336" rx="1" transform="translate(14.623 0)" fill="#4a4a4a"/>
<rect id="Rectangle_41" data-name="Rectangle 41" width="5.336" height="5.336" rx="1" transform="translate(20.947 0)" fill="#4a4a4a"/>
<rect id="Rectangle_42" data-name="Rectangle 42" width="5.336" height="5.336" rx="1" transform="translate(27.271 0)" fill="#4a4a4a"/>
<rect id="Rectangle_43" data-name="Rectangle 43" width="5.336" height="5.336" rx="1" transform="translate(33.594 0)" fill="#4a4a4a"/>
<rect id="Rectangle_44" data-name="Rectangle 44" width="5.336" height="5.336" rx="1" transform="translate(39.918 0)" fill="#4a4a4a"/>
<rect id="Rectangle_45" data-name="Rectangle 45" width="5.336" height="5.336" rx="1" transform="translate(46.242 0)" fill="#4a4a4a"/>
<rect id="Rectangle_46" data-name="Rectangle 46" width="5.336" height="5.336" rx="1" transform="translate(52.565 0)" fill="#4a4a4a"/>
<rect id="Rectangle_47" data-name="Rectangle 47" width="5.336" height="5.336" rx="1" transform="translate(58.889 0)" fill="#4a4a4a"/>
<rect id="Rectangle_48" data-name="Rectangle 48" width="5.336" height="5.336" rx="1" transform="translate(65.213 0)" fill="#4a4a4a"/>
<rect id="Rectangle_49" data-name="Rectangle 49" width="5.336" height="5.336" rx="1" transform="translate(71.537 0)" fill="#4a4a4a"/>
<rect id="Rectangle_50" data-name="Rectangle 50" width="5.336" height="5.336" rx="1" transform="translate(77.86 0)" fill="#4a4a4a"/>
<rect id="Rectangle_51" data-name="Rectangle 51" width="5.336" height="5.336" rx="1" transform="translate(84.183 0)" fill="#4a4a4a"/>
</g>
<g id="Group_6" data-name="Group 6" transform="translate(1.531 16.584)">
<path id="Path_54" data-name="Path 54" d="M1.093,0h7.3A1.093,1.093,0,0,1,9.485,1.093v3.15A1.093,1.093,0,0,1,8.392,5.336h-7.3A1.093,1.093,0,0,1,0,4.243V1.094A1.093,1.093,0,0,1,1.093,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<g id="Group_5" data-name="Group 5" transform="translate(10.671 0)">
<rect id="Rectangle_52" data-name="Rectangle 52" width="5.336" height="5.336" rx="1" fill="#4a4a4a"/>
<rect id="Rectangle_53" data-name="Rectangle 53" width="5.336" height="5.336" rx="1" transform="translate(6.324 0)" fill="#4a4a4a"/>
<rect id="Rectangle_54" data-name="Rectangle 54" width="5.336" height="5.336" rx="1" transform="translate(12.647 0)" fill="#4a4a4a"/>
<rect id="Rectangle_55" data-name="Rectangle 55" width="5.336" height="5.336" rx="1" transform="translate(18.971 0)" fill="#4a4a4a"/>
<rect id="Rectangle_56" data-name="Rectangle 56" width="5.336" height="5.336" rx="1" transform="translate(25.295 0)" fill="#4a4a4a"/>
<rect id="Rectangle_57" data-name="Rectangle 57" width="5.336" height="5.336" rx="1" transform="translate(31.619 0)" fill="#4a4a4a"/>
<rect id="Rectangle_58" data-name="Rectangle 58" width="5.336" height="5.336" rx="1" transform="translate(37.942 0)" fill="#4a4a4a"/>
<rect id="Rectangle_59" data-name="Rectangle 59" width="5.336" height="5.336" rx="1" transform="translate(44.265 0)" fill="#4a4a4a"/>
<rect id="Rectangle_60" data-name="Rectangle 60" width="5.336" height="5.336" rx="1" transform="translate(50.589 0)" fill="#4a4a4a"/>
<rect id="Rectangle_61" data-name="Rectangle 61" width="5.336" height="5.336" rx="1" transform="translate(56.912 0)" fill="#4a4a4a"/>
<rect id="Rectangle_62" data-name="Rectangle 62" width="5.336" height="5.336" rx="1" transform="translate(63.236 0)" fill="#4a4a4a"/>
</g>
<path id="Path_55" data-name="Path 55" d="M1.094,0H8A1.093,1.093,0,0,1,9.091,1.093v3.15A1.093,1.093,0,0,1,8,5.336H1.093A1.093,1.093,0,0,1,0,4.243V1.094A1.093,1.093,0,0,1,1.093,0Z" transform="translate(80.428 0)" fill="#4a4a4a" fill-rule="evenodd"/>
</g>
<g id="Group_7" data-name="Group 7" transform="translate(1.531 29.627)">
<rect id="Rectangle_63" data-name="Rectangle 63" width="5.336" height="5.336" rx="1" transform="translate(0 0)" fill="#4a4a4a"/>
<rect id="Rectangle_64" data-name="Rectangle 64" width="5.336" height="5.336" rx="1" transform="translate(6.324 0)" fill="#4a4a4a"/>
<rect id="Rectangle_65" data-name="Rectangle 65" width="5.336" height="5.336" rx="1" transform="translate(12.647 0)" fill="#4a4a4a"/>
<rect id="Rectangle_66" data-name="Rectangle 66" width="5.336" height="5.336" rx="1" transform="translate(18.971 0)" fill="#4a4a4a"/>
<path id="Path_56" data-name="Path 56" d="M1.093,0H31.515a1.093,1.093,0,0,1,1.093,1.093V4.244a1.093,1.093,0,0,1-1.093,1.093H1.093A1.093,1.093,0,0,1,0,4.244V1.093A1.093,1.093,0,0,1,1.093,0ZM34.687,0h3.942a1.093,1.093,0,0,1,1.093,1.093V4.244a1.093,1.093,0,0,1-1.093,1.093H34.687a1.093,1.093,0,0,1-1.093-1.093V1.093A1.093,1.093,0,0,1,34.687,0Z" transform="translate(25.294 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<rect id="Rectangle_67" data-name="Rectangle 67" width="5.336" height="5.336" rx="1" transform="translate(66.003 0)" fill="#4a4a4a"/>
<rect id="Rectangle_68" data-name="Rectangle 68" width="5.336" height="5.336" rx="1" transform="translate(72.327 0)" fill="#4a4a4a"/>
<rect id="Rectangle_69" data-name="Rectangle 69" width="5.336" height="5.336" rx="1" transform="translate(84.183 0)" fill="#4a4a4a"/>
<path id="Path_57" data-name="Path 57" d="M5.336,0V1.18A1.093,1.093,0,0,1,4.243,2.273H1.093A1.093,1.093,0,0,1,0,1.18V0Z" transform="translate(83.59 2.273) rotate(180)" fill="#4a4a4a"/>
<path id="Path_58" data-name="Path 58" d="M5.336,0V1.18A1.093,1.093,0,0,1,4.243,2.273H1.093A1.093,1.093,0,0,1,0,1.18V0Z" transform="translate(78.255 3.063)" fill="#4a4a4a"/>
</g>
<rect id="Rectangle_70" data-name="Rectangle 70" width="88.927" height="2.371" rx="1.085" transform="translate(1.925 1.17)" fill="#4a4a4a"/>
<rect id="Rectangle_71" data-name="Rectangle 71" width="4.986" height="1.581" rx="0.723" transform="translate(4.1 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_72" data-name="Rectangle 72" width="4.986" height="1.581" rx="0.723" transform="translate(10.923 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_73" data-name="Rectangle 73" width="4.986" height="1.581" rx="0.723" transform="translate(16.173 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_74" data-name="Rectangle 74" width="4.986" height="1.581" rx="0.723" transform="translate(21.421 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_75" data-name="Rectangle 75" width="4.986" height="1.581" rx="0.723" transform="translate(26.671 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_76" data-name="Rectangle 76" width="4.986" height="1.581" rx="0.723" transform="translate(33.232 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_77" data-name="Rectangle 77" width="4.986" height="1.581" rx="0.723" transform="translate(38.48 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_78" data-name="Rectangle 78" width="4.986" height="1.581" rx="0.723" transform="translate(43.73 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_79" data-name="Rectangle 79" width="4.986" height="1.581" rx="0.723" transform="translate(48.978 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_80" data-name="Rectangle 80" width="4.986" height="1.581" rx="0.723" transform="translate(55.54 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_81" data-name="Rectangle 81" width="4.986" height="1.581" rx="0.723" transform="translate(60.788 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_82" data-name="Rectangle 82" width="4.986" height="1.581" rx="0.723" transform="translate(66.038 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_83" data-name="Rectangle 83" width="4.986" height="1.581" rx="0.723" transform="translate(72.599 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_84" data-name="Rectangle 84" width="4.986" height="1.581" rx="0.723" transform="translate(77.847 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_85" data-name="Rectangle 85" width="4.986" height="1.581" rx="0.723" transform="translate(83.097 1.566)" fill="#d8d8d8" opacity="0.136"/>
</g>
<path id="Path_59" data-name="Path 59" d="M146.71,159.855a5.439,5.439,0,0,0-.7.07c-.042-.164-.081-.329-.127-.493a5.457,5.457,0,1,0-5.4-9.372q-.181-.185-.366-.367a5.454,5.454,0,1,0-9.384-5.4c-.162-.046-.325-.084-.486-.126a5.467,5.467,0,1,0-10.788,0c-.162.042-.325.08-.486.126a5.457,5.457,0,1,0-9.384,5.4,21.843,21.843,0,1,0,36.421,21.02,5.452,5.452,0,1,0,.7-10.858" transform="translate(6.275 -6.025)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_60" data-name="Path 60" d="M83,124.855h43.71V103H83Z" transform="translate(4.42 -9.271)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_61" data-name="Path 61" d="M134.855,116.765a2.732,2.732,0,1,0,0-5.464,2.811,2.811,0,0,0-.349.035c-.022-.082-.04-.164-.063-.246a2.733,2.733,0,0,0-1.052-5.253,2.7,2.7,0,0,0-1.648.566q-.09-.093-.184-.184a2.7,2.7,0,0,0,.553-1.633,2.732,2.732,0,0,0-5.245-1.07,10.928,10.928,0,1,0,0,21.031,2.732,2.732,0,0,0,5.245-1.07,2.7,2.7,0,0,0-.553-1.633q.093-.09.184-.184a2.7,2.7,0,0,0,1.648.566,2.732,2.732,0,0,0,1.052-5.253c.023-.081.042-.164.063-.246a2.811,2.811,0,0,0,.349.035" transform="translate(7.202 -9.377)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_62" data-name="Path 62" d="M143.232,42.33a2.967,2.967,0,0,1-.535-.055,2.754,2.754,0,0,1-.514-.153,2.838,2.838,0,0,1-.471-.251,4.139,4.139,0,0,1-.415-.339,3.2,3.2,0,0,1-.338-.415A2.7,2.7,0,0,1,140.5,39.6a2.968,2.968,0,0,1,.055-.535,3.152,3.152,0,0,1,.152-.514,2.874,2.874,0,0,1,.252-.47,2.633,2.633,0,0,1,.753-.754,2.837,2.837,0,0,1,.471-.251,2.753,2.753,0,0,1,.514-.153,2.527,2.527,0,0,1,1.071,0,2.654,2.654,0,0,1,.983.4,4.139,4.139,0,0,1,.415.339,4.019,4.019,0,0,1,.339.415,2.786,2.786,0,0,1,.251.47,2.864,2.864,0,0,1,.208,1.049,2.77,2.77,0,0,1-.8,1.934,4.139,4.139,0,0,1-.415.339,2.722,2.722,0,0,1-1.519.459m21.855-1.366a2.789,2.789,0,0,1-1.935-.8,4.162,4.162,0,0,1-.338-.415,2.7,2.7,0,0,1-.459-1.519,2.789,2.789,0,0,1,.8-1.934,4.139,4.139,0,0,1,.415-.339,2.838,2.838,0,0,1,.471-.251,2.752,2.752,0,0,1,.514-.153,2.527,2.527,0,0,1,1.071,0,2.654,2.654,0,0,1,.983.4,4.139,4.139,0,0,1,.415.339,2.79,2.79,0,0,1,.8,1.934,3.069,3.069,0,0,1-.055.535,2.779,2.779,0,0,1-.153.514,3.885,3.885,0,0,1-.251.47,4.02,4.02,0,0,1-.339.415,4.138,4.138,0,0,1-.415.339,2.722,2.722,0,0,1-1.519.459" transform="translate(9.753 -15.532)" fill-rule="evenodd"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 31 KiB

View File

@ -1,170 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1041.277" height="554.141" viewBox="0 0 1041.277 554.141">
<title>Powered by React</title>
<g id="Group_24" data-name="Group 24" transform="translate(-440 -263)">
<g id="Group_23" data-name="Group 23" transform="translate(439.989 262.965)">
<path id="Path_299" data-name="Path 299" d="M1040.82,611.12q-1.74,3.75-3.47,7.4-2.7,5.67-5.33,11.12c-.78,1.61-1.56,3.19-2.32,4.77-8.6,17.57-16.63,33.11-23.45,45.89A73.21,73.21,0,0,1,942.44,719l-151.65,1.65h-1.6l-13,.14-11.12.12-34.1.37h-1.38l-17.36.19h-.53l-107,1.16-95.51,1-11.11.12-69,.75H429l-44.75.48h-.48l-141.5,1.53-42.33.46a87.991,87.991,0,0,1-10.79-.54h0c-1.22-.14-2.44-.3-3.65-.49a87.38,87.38,0,0,1-51.29-27.54C116,678.37,102.75,655,93.85,629.64q-1.93-5.49-3.6-11.12C59.44,514.37,97,380,164.6,290.08q4.25-5.64,8.64-11l.07-.08c20.79-25.52,44.1-46.84,68.93-62,44-26.91,92.75-34.49,140.7-11.9,40.57,19.12,78.45,28.11,115.17,30.55,3.71.24,7.42.42,11.11.53,84.23,2.65,163.17-27.7,255.87-47.29,3.69-.78,7.39-1.55,11.12-2.28,66.13-13.16,139.49-20.1,226.73-5.51a189.089,189.089,0,0,1,26.76,6.4q5.77,1.86,11.12,4c41.64,16.94,64.35,48.24,74,87.46q1.37,5.46,2.37,11.11C1134.3,384.41,1084.19,518.23,1040.82,611.12Z" transform="translate(-79.34 -172.91)" fill="#f2f2f2"/>
<path id="Path_300" data-name="Path 300" d="M576.36,618.52a95.21,95.21,0,0,1-1.87,11.12h93.7V618.52Zm-78.25,62.81,11.11-.09V653.77c-3.81-.17-7.52-.34-11.11-.52ZM265.19,618.52v11.12h198.5V618.52ZM1114.87,279h-74V191.51q-5.35-2.17-11.12-4V279H776.21V186.58c-3.73.73-7.43,1.5-11.12,2.28V279H509.22V236.15c-3.69-.11-7.4-.29-11.11-.53V279H242.24V217c-24.83,15.16-48.14,36.48-68.93,62h-.07v.08q-4.4,5.4-8.64,11h8.64V618.52h-83q1.66,5.63,3.6,11.12h79.39v93.62a87,87,0,0,0,12.2,2.79c1.21.19,2.43.35,3.65.49h0a87.991,87.991,0,0,0,10.79.54l42.33-.46v-97H498.11v94.21l11.11-.12V629.64H765.09V721l11.12-.12V629.64H1029.7v4.77c.76-1.58,1.54-3.16,2.32-4.77q2.63-5.45,5.33-11.12,1.73-3.64,3.47-7.4v-321h76.42Q1116.23,284.43,1114.87,279ZM242.24,618.52V290.08H498.11V618.52Zm267,0V290.08H765.09V618.52Zm520.48,0H776.21V290.08H1029.7Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_301" data-name="Path 301" d="M863.09,533.65v13l-151.92,1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99L349.77,551.4h-.15l-44.65.42-.48.01-198.4,1.82v-15l46.65-28,93.6-.78,2-.01.66-.01,2-.03,44.94-.37,2.01-.01.64-.01,2-.01L315,509.3l.38-.01,35.55-.3h.29l277.4-2.34,6.79-.05h.68l5.18-.05,37.65-.31,2-.03,1.85-.02h.96l11.71-.09,2.32-.03,3.11-.02,9.75-.09,15.47-.13,2-.02,3.48-.02h.65l74.71-.64Z" fill="#65617d"/>
<path id="Path_302" data-name="Path 302" d="M863.09,533.65v13l-151.92,1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99L349.77,551.4h-.15l-44.65.42-.48.01-198.4,1.82v-15l46.65-28,93.6-.78,2-.01.66-.01,2-.03,44.94-.37,2.01-.01.64-.01,2-.01L315,509.3l.38-.01,35.55-.3h.29l277.4-2.34,6.79-.05h.68l5.18-.05,37.65-.31,2-.03,1.85-.02h.96l11.71-.09,2.32-.03,3.11-.02,9.75-.09,15.47-.13,2-.02,3.48-.02h.65l74.71-.64Z" opacity="0.2"/>
<path id="Path_303" data-name="Path 303" d="M375.44,656.57v24.49a6.13,6.13,0,0,1-3.5,5.54,6,6,0,0,1-2.5.6l-34.9.74a6,6,0,0,1-2.7-.57,6.12,6.12,0,0,1-3.57-5.57V656.57Z" transform="translate(-79.34 -172.91)" fill="#3f3d56"/>
<path id="Path_304" data-name="Path 304" d="M375.44,656.57v24.49a6.13,6.13,0,0,1-3.5,5.54,6,6,0,0,1-2.5.6l-34.9.74a6,6,0,0,1-2.7-.57,6.12,6.12,0,0,1-3.57-5.57V656.57Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_305" data-name="Path 305" d="M377.44,656.57v24.49a6.13,6.13,0,0,1-3.5,5.54,6,6,0,0,1-2.5.6l-34.9.74a6,6,0,0,1-2.7-.57,6.12,6.12,0,0,1-3.57-5.57V656.57Z" transform="translate(-79.34 -172.91)" fill="#3f3d56"/>
<rect id="Rectangle_137" data-name="Rectangle 137" width="47.17" height="31.5" transform="translate(680.92 483.65)" fill="#3f3d56"/>
<rect id="Rectangle_138" data-name="Rectangle 138" width="47.17" height="31.5" transform="translate(680.92 483.65)" opacity="0.1"/>
<rect id="Rectangle_139" data-name="Rectangle 139" width="47.17" height="31.5" transform="translate(678.92 483.65)" fill="#3f3d56"/>
<path id="Path_306" data-name="Path 306" d="M298.09,483.65v4.97l-47.17,1.26v-6.23Z" opacity="0.1"/>
<path id="Path_307" data-name="Path 307" d="M460.69,485.27v168.2a4,4,0,0,1-3.85,3.95l-191.65,5.1h-.05a4,4,0,0,1-3.95-3.95V485.27a4,4,0,0,1,3.95-3.95h191.6a4,4,0,0,1,3.95,3.95Z" transform="translate(-79.34 -172.91)" fill="#65617d"/>
<path id="Path_308" data-name="Path 308" d="M265.19,481.32v181.2h-.05a4,4,0,0,1-3.95-3.95V485.27a4,4,0,0,1,3.95-3.95Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_309" data-name="Path 309" d="M194.59,319.15h177.5V467.4l-177.5,4Z" fill="#39374d"/>
<path id="Path_310" data-name="Path 310" d="M726.09,483.65v6.41l-47.17-1.26v-5.15Z" opacity="0.1"/>
<path id="Path_311" data-name="Path 311" d="M867.69,485.27v173.3a4,4,0,0,1-4,3.95h0L672,657.42a4,4,0,0,1-3.85-3.95V485.27a4,4,0,0,1,3.95-3.95H863.7a4,4,0,0,1,3.99,3.95Z" transform="translate(-79.34 -172.91)" fill="#65617d"/>
<path id="Path_312" data-name="Path 312" d="M867.69,485.27v173.3a4,4,0,0,1-4,3.95h0V481.32h0a4,4,0,0,1,4,3.95Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_313" data-name="Path 313" d="M775.59,319.15H598.09V467.4l177.5,4Z" fill="#39374d"/>
<path id="Path_314" data-name="Path 314" d="M663.19,485.27v168.2a4,4,0,0,1-3.85,3.95l-191.65,5.1h0a4,4,0,0,1-4-3.95V485.27a4,4,0,0,1,3.95-3.95h191.6A4,4,0,0,1,663.19,485.27Z" transform="translate(-79.34 -172.91)" fill="#65617d"/>
<path id="Path_315" data-name="Path 315" d="M397.09,319.15h177.5V467.4l-177.5,4Z" fill="#4267b2"/>
<path id="Path_316" data-name="Path 316" d="M863.09,533.65v13l-151.92,1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99L349.77,551.4h-.15l-44.65.42-.48.01-198.4,1.82v-15l202.51-1.33h.48l40.99-.28h.19l283.08-1.87h.29l.17-.01h.47l4.79-.03h1.46l74.49-.5,4.4-.02.98-.01Z" opacity="0.1"/>
<circle id="Ellipse_111" data-name="Ellipse 111" cx="51.33" cy="51.33" r="51.33" transform="translate(435.93 246.82)" fill="#fbbebe"/>
<path id="Path_317" data-name="Path 317" d="M617.94,550.07s-99.5,12-90,0c3.44-4.34,4.39-17.2,4.2-31.85-.06-4.45-.22-9.06-.45-13.65-1.1-22-3.75-43.5-3.75-43.5s87-41,77-8.5c-4,13.13-2.69,31.57.35,48.88.89,5.05,1.92,10,3,14.7a344.66,344.66,0,0,0,9.65,33.92Z" transform="translate(-79.34 -172.91)" fill="#fbbebe"/>
<path id="Path_318" data-name="Path 318" d="M585.47,546c11.51-2.13,23.7-6,34.53-1.54,2.85,1.17,5.47,2.88,8.39,3.86s6.12,1.22,9.16,1.91c10.68,2.42,19.34,10.55,24.9,20s8.44,20.14,11.26,30.72l6.9,25.83c6,22.45,12,45.09,13.39,68.3a2437.506,2437.506,0,0,1-250.84,1.43c5.44-10.34,11-21.31,10.54-33s-7.19-23.22-4.76-34.74c1.55-7.34,6.57-13.39,9.64-20.22,8.75-19.52,1.94-45.79,17.32-60.65,6.92-6.68,17-9.21,26.63-8.89,12.28.41,24.85,4.24,37,6.11C555.09,547.48,569.79,548.88,585.47,546Z" transform="translate(-79.34 -172.91)" fill="#ff6584"/>
<path id="Path_319" data-name="Path 319" d="M716.37,657.17l-.1,1.43v.1l-.17,2.3-1.33,18.51-1.61,22.3-.46,6.28-1,13.44v.17l-107,1-175.59,1.9v.84h-.14v-1.12l.45-14.36.86-28.06.74-23.79.07-2.37a10.53,10.53,0,0,1,11.42-10.17c4.72.4,10.85.89,18.18,1.41l3,.22c42.33,2.94,120.56,6.74,199.5,2,1.66-.09,3.33-.19,5-.31,12.24-.77,24.47-1.76,36.58-3a10.53,10.53,0,0,1,11.6,11.23Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_320" data-name="Path 320" d="M429.08,725.44v-.84l175.62-1.91,107-1h.3v-.17l1-13.44.43-6,1.64-22.61,1.29-17.9v-.44a10.617,10.617,0,0,0-.11-2.47.3.3,0,0,0,0-.1,10.391,10.391,0,0,0-2-4.64,10.54,10.54,0,0,0-9.42-4c-12.11,1.24-24.34,2.23-36.58,3-1.67.12-3.34.22-5,.31-78.94,4.69-157.17.89-199.5-2l-3-.22c-7.33-.52-13.46-1-18.18-1.41a10.54,10.54,0,0,0-11.24,8.53,11,11,0,0,0-.18,1.64l-.68,22.16L429.54,710l-.44,14.36v1.12Z" transform="translate(-79.34 -172.91)" fill="#3f3d56"/>
<path id="Path_321" data-name="Path 321" d="M716.67,664.18l-1.23,15.33-1.83,22.85-.46,5.72-1,12.81-.06.64v.17h0l-.15,1.48.11-1.48h-.29l-107,1-175.65,1.9v-.28l.49-14.36,1-28.06.64-18.65A6.36,6.36,0,0,1,434.3,658a6.25,6.25,0,0,1,3.78-.9c2.1.17,4.68.37,7.69.59,4.89.36,10.92.78,17.94,1.22,13,.82,29.31,1.7,48,2.42,52,2,122.2,2.67,188.88-3.17,3-.26,6.1-.55,9.13-.84a6.26,6.26,0,0,1,3.48.66,5.159,5.159,0,0,1,.86.54,6.14,6.14,0,0,1,2,2.46,3.564,3.564,0,0,1,.25.61A6.279,6.279,0,0,1,716.67,664.18Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_322" data-name="Path 322" d="M377.44,677.87v3.19a6.13,6.13,0,0,1-3.5,5.54l-40.1.77a6.12,6.12,0,0,1-3.57-5.57v-3Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_323" data-name="Path 323" d="M298.59,515.57l-52.25,1V507.9l52.25-1Z" fill="#3f3d56"/>
<path id="Path_324" data-name="Path 324" d="M298.59,515.57l-52.25,1V507.9l52.25-1Z" opacity="0.1"/>
<path id="Path_325" data-name="Path 325" d="M300.59,515.57l-52.25,1V507.9l52.25-1Z" fill="#3f3d56"/>
<path id="Path_326" data-name="Path 326" d="M758.56,679.87v3.19a6.13,6.13,0,0,0,3.5,5.54l40.1.77a6.12,6.12,0,0,0,3.57-5.57v-3Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_327" data-name="Path 327" d="M678.72,517.57l52.25,1V509.9l-52.25-1Z" opacity="0.1"/>
<path id="Path_328" data-name="Path 328" d="M676.72,517.57l52.25,1V509.9l-52.25-1Z" fill="#3f3d56"/>
<path id="Path_329" data-name="Path 329" d="M534.13,486.79c.08,7-3.16,13.6-5.91,20.07a163.491,163.491,0,0,0-12.66,74.71c.73,11,2.58,22,.73,32.9s-8.43,21.77-19,24.9c17.53,10.45,41.26,9.35,57.76-2.66,8.79-6.4,15.34-15.33,21.75-24.11a97.86,97.86,0,0,1-13.31,44.75A103.43,103.43,0,0,0,637,616.53c4.31-5.81,8.06-12.19,9.72-19.23,3.09-13-1.22-26.51-4.51-39.5a266.055,266.055,0,0,1-6.17-33c-.43-3.56-.78-7.22.1-10.7,1-4.07,3.67-7.51,5.64-11.22,5.6-10.54,5.73-23.3,2.86-34.88s-8.49-22.26-14.06-32.81c-4.46-8.46-9.3-17.31-17.46-22.28-5.1-3.1-11-4.39-16.88-5.64l-25.37-5.43c-5.55-1.19-11.26-2.38-16.87-1.51-9.47,1.48-16.14,8.32-22,15.34-4.59,5.46-15.81,15.71-16.6,22.86-.72,6.59,5.1,17.63,6.09,24.58,1.3,9,2.22,6,7.3,11.52C532,478.05,534.07,482,534.13,486.79Z" transform="translate(-79.34 -172.91)" fill="#3f3d56"/>
</g>
<g id="docusaurus_keytar" transform="translate(670.271 615.768)">
<path id="Path_40" data-name="Path 40" d="M99,52h43.635V69.662H99Z" transform="translate(-49.132 -33.936)" fill="#fff" fill-rule="evenodd"/>
<path id="Path_41" data-name="Path 41" d="M13.389,158.195A10.377,10.377,0,0,1,4.4,153a10.377,10.377,0,0,0,8.988,15.584H23.779V158.195Z" transform="translate(-3 -82.47)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_42" data-name="Path 42" d="M66.967,38.083l36.373-2.273V30.615A10.389,10.389,0,0,0,92.95,20.226H46.2l-1.3-2.249a1.5,1.5,0,0,0-2.6,0L41,20.226l-1.3-2.249a1.5,1.5,0,0,0-2.6,0l-1.3,2.249-1.3-2.249a1.5,1.5,0,0,0-2.6,0l-1.3,2.249-.034,0-2.152-2.151a1.5,1.5,0,0,0-2.508.672L25.21,21.4l-2.7-.723a1.5,1.5,0,0,0-1.836,1.837l.722,2.7-2.65.71a1.5,1.5,0,0,0-.673,2.509l2.152,2.152c0,.011,0,.022,0,.033l-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6L20.226,41l-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3A10.389,10.389,0,0,0,30.615,103.34H92.95A10.389,10.389,0,0,0,103.34,92.95V51.393L66.967,49.12a5.53,5.53,0,0,1,0-11.038" transform="translate(-9.836 -17.226)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_43" data-name="Path 43" d="M143,163.779h15.584V143H143Z" transform="translate(-70.275 -77.665)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_44" data-name="Path 44" d="M173.779,148.389a2.582,2.582,0,0,0-.332.033c-.02-.078-.038-.156-.06-.234a2.594,2.594,0,1,0-2.567-4.455q-.086-.088-.174-.175a2.593,2.593,0,1,0-4.461-2.569c-.077-.022-.154-.04-.231-.06a2.6,2.6,0,1,0-5.128,0c-.077.02-.154.038-.231.06a2.594,2.594,0,1,0-4.461,2.569,10.384,10.384,0,1,0,17.314,9.992,2.592,2.592,0,1,0,.332-5.161" transform="translate(-75.08 -75.262)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_45" data-name="Path 45" d="M153,113.389h15.584V103H153Z" transform="translate(-75.08 -58.444)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_46" data-name="Path 46" d="M183.389,108.944a1.3,1.3,0,1,0,0-2.6,1.336,1.336,0,0,0-.166.017c-.01-.039-.019-.078-.03-.117a1.3,1.3,0,0,0-.5-2.5,1.285,1.285,0,0,0-.783.269q-.043-.044-.087-.087a1.285,1.285,0,0,0,.263-.776,1.3,1.3,0,0,0-2.493-.509,5.195,5.195,0,1,0,0,10,1.3,1.3,0,0,0,2.493-.509,1.285,1.285,0,0,0-.263-.776q.044-.043.087-.087a1.285,1.285,0,0,0,.783.269,1.3,1.3,0,0,0,.5-2.5c.011-.038.02-.078.03-.117a1.337,1.337,0,0,0,.166.017" transform="translate(-84.691 -57.894)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_47" data-name="Path 47" d="M52.188,48.292a1.3,1.3,0,0,1-1.3-1.3,3.9,3.9,0,0,0-7.792,0,1.3,1.3,0,1,1-2.6,0,6.493,6.493,0,0,1,12.987,0,1.3,1.3,0,0,1-1.3,1.3" transform="translate(-21.02 -28.41)" fill-rule="evenodd"/>
<path id="Path_48" data-name="Path 48" d="M103,139.752h31.168a10.389,10.389,0,0,0,10.389-10.389V93H113.389A10.389,10.389,0,0,0,103,103.389Z" transform="translate(-51.054 -53.638)" fill="#ffff50" fill-rule="evenodd"/>
<path id="Path_49" data-name="Path 49" d="M141.1,94.017H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0,10.389H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0,10.389H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0-25.877H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0,10.293H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0,10.389H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m7.782-47.993c-.006,0-.011,0-.018,0-1.605.055-2.365,1.66-3.035,3.077-.7,1.48-1.24,2.443-2.126,2.414-.981-.035-1.542-1.144-2.137-2.317-.683-1.347-1.462-2.876-3.1-2.819-1.582.054-2.344,1.451-3.017,2.684-.715,1.313-1.2,2.112-2.141,2.075-1-.036-1.533-.938-2.149-1.981-.686-1.162-1.479-2.467-3.084-2.423-1.555.053-2.319,1.239-2.994,2.286-.713,1.106-1.213,1.781-2.164,1.741-1.025-.036-1.554-.784-2.167-1.65-.688-.973-1.463-2.074-3.062-2.021a3.815,3.815,0,0,0-2.959,1.879c-.64.812-1.14,1.456-2.2,1.415a.52.52,0,0,0-.037,1.039,3.588,3.588,0,0,0,3.05-1.811c.611-.777,1.139-1.448,2.178-1.483,1-.043,1.47.579,2.179,1.582.674.953,1.438,2.033,2.977,2.089,1.612.054,2.387-1.151,3.074-2.217.614-.953,1.144-1.775,2.156-1.81.931-.035,1.438.7,2.153,1.912.674,1.141,1.437,2.434,3.006,2.491,1.623.056,2.407-1.361,3.09-2.616.592-1.085,1.15-2.109,2.14-2.143.931-.022,1.417.829,2.135,2.249.671,1.326,1.432,2.828,3.026,2.886l.088,0c1.592,0,2.347-1.6,3.015-3.01.592-1.252,1.152-2.431,2.113-2.479Z" transform="translate(-55.378 -38.552)" fill-rule="evenodd"/>
<path id="Path_50" data-name="Path 50" d="M83,163.779h20.779V143H83Z" transform="translate(-41.443 -77.665)" fill="#3ecc5f" fill-rule="evenodd"/>
<g id="Group_8" data-name="Group 8" transform="matrix(0.966, -0.259, 0.259, 0.966, 51.971, 43.3)">
<rect id="Rectangle_3" data-name="Rectangle 3" width="43.906" height="17.333" rx="2" transform="translate(0 0)" fill="#d8d8d8"/>
<g id="Group_2" data-name="Group 2" transform="translate(0.728 10.948)">
<rect id="Rectangle_4" data-name="Rectangle 4" width="2.537" height="2.537" rx="1" transform="translate(7.985 0)" fill="#4a4a4a"/>
<rect id="Rectangle_5" data-name="Rectangle 5" width="2.537" height="2.537" rx="1" transform="translate(10.991 0)" fill="#4a4a4a"/>
<rect id="Rectangle_6" data-name="Rectangle 6" width="2.537" height="2.537" rx="1" transform="translate(13.997 0)" fill="#4a4a4a"/>
<rect id="Rectangle_7" data-name="Rectangle 7" width="2.537" height="2.537" rx="1" transform="translate(17.003 0)" fill="#4a4a4a"/>
<rect id="Rectangle_8" data-name="Rectangle 8" width="2.537" height="2.537" rx="1" transform="translate(20.009 0)" fill="#4a4a4a"/>
<rect id="Rectangle_9" data-name="Rectangle 9" width="2.537" height="2.537" rx="1" transform="translate(23.015 0)" fill="#4a4a4a"/>
<rect id="Rectangle_10" data-name="Rectangle 10" width="2.537" height="2.537" rx="1" transform="translate(26.021 0)" fill="#4a4a4a"/>
<rect id="Rectangle_11" data-name="Rectangle 11" width="2.537" height="2.537" rx="1" transform="translate(29.028 0)" fill="#4a4a4a"/>
<rect id="Rectangle_12" data-name="Rectangle 12" width="2.537" height="2.537" rx="1" transform="translate(32.034 0)" fill="#4a4a4a"/>
<path id="Path_51" data-name="Path 51" d="M.519,0H6.9A.519.519,0,0,1,7.421.52v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.519A.519.519,0,0,1,.519,0ZM35.653,0h6.383a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H35.652a.519.519,0,0,1-.519-.519V.519A.519.519,0,0,1,35.652,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
</g>
<g id="Group_3" data-name="Group 3" transform="translate(0.728 4.878)">
<path id="Path_52" data-name="Path 52" d="M.519,0H2.956a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.519A.519.519,0,0,1,.519,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<rect id="Rectangle_13" data-name="Rectangle 13" width="2.537" height="2.537" rx="1" transform="translate(3.945 0)" fill="#4a4a4a"/>
<rect id="Rectangle_14" data-name="Rectangle 14" width="2.537" height="2.537" rx="1" transform="translate(6.951 0)" fill="#4a4a4a"/>
<rect id="Rectangle_15" data-name="Rectangle 15" width="2.537" height="2.537" rx="1" transform="translate(9.958 0)" fill="#4a4a4a"/>
<rect id="Rectangle_16" data-name="Rectangle 16" width="2.537" height="2.537" rx="1" transform="translate(12.964 0)" fill="#4a4a4a"/>
<rect id="Rectangle_17" data-name="Rectangle 17" width="2.537" height="2.537" rx="1" transform="translate(15.97 0)" fill="#4a4a4a"/>
<rect id="Rectangle_18" data-name="Rectangle 18" width="2.537" height="2.537" rx="1" transform="translate(18.976 0)" fill="#4a4a4a"/>
<rect id="Rectangle_19" data-name="Rectangle 19" width="2.537" height="2.537" rx="1" transform="translate(21.982 0)" fill="#4a4a4a"/>
<rect id="Rectangle_20" data-name="Rectangle 20" width="2.537" height="2.537" rx="1" transform="translate(24.988 0)" fill="#4a4a4a"/>
<rect id="Rectangle_21" data-name="Rectangle 21" width="2.537" height="2.537" rx="1" transform="translate(27.994 0)" fill="#4a4a4a"/>
<rect id="Rectangle_22" data-name="Rectangle 22" width="2.537" height="2.537" rx="1" transform="translate(31 0)" fill="#4a4a4a"/>
<rect id="Rectangle_23" data-name="Rectangle 23" width="2.537" height="2.537" rx="1" transform="translate(34.006 0)" fill="#4a4a4a"/>
<rect id="Rectangle_24" data-name="Rectangle 24" width="2.537" height="2.537" rx="1" transform="translate(37.012 0)" fill="#4a4a4a"/>
<rect id="Rectangle_25" data-name="Rectangle 25" width="2.537" height="2.537" rx="1" transform="translate(40.018 0)" fill="#4a4a4a"/>
</g>
<g id="Group_4" data-name="Group 4" transform="translate(43.283 4.538) rotate(180)">
<path id="Path_53" data-name="Path 53" d="M.519,0H2.956a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.519A.519.519,0,0,1,.519,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<rect id="Rectangle_26" data-name="Rectangle 26" width="2.537" height="2.537" rx="1" transform="translate(3.945 0)" fill="#4a4a4a"/>
<rect id="Rectangle_27" data-name="Rectangle 27" width="2.537" height="2.537" rx="1" transform="translate(6.951 0)" fill="#4a4a4a"/>
<rect id="Rectangle_28" data-name="Rectangle 28" width="2.537" height="2.537" rx="1" transform="translate(9.958 0)" fill="#4a4a4a"/>
<rect id="Rectangle_29" data-name="Rectangle 29" width="2.537" height="2.537" rx="1" transform="translate(12.964 0)" fill="#4a4a4a"/>
<rect id="Rectangle_30" data-name="Rectangle 30" width="2.537" height="2.537" rx="1" transform="translate(15.97 0)" fill="#4a4a4a"/>
<rect id="Rectangle_31" data-name="Rectangle 31" width="2.537" height="2.537" rx="1" transform="translate(18.976 0)" fill="#4a4a4a"/>
<rect id="Rectangle_32" data-name="Rectangle 32" width="2.537" height="2.537" rx="1" transform="translate(21.982 0)" fill="#4a4a4a"/>
<rect id="Rectangle_33" data-name="Rectangle 33" width="2.537" height="2.537" rx="1" transform="translate(24.988 0)" fill="#4a4a4a"/>
<rect id="Rectangle_34" data-name="Rectangle 34" width="2.537" height="2.537" rx="1" transform="translate(27.994 0)" fill="#4a4a4a"/>
<rect id="Rectangle_35" data-name="Rectangle 35" width="2.537" height="2.537" rx="1" transform="translate(31.001 0)" fill="#4a4a4a"/>
<rect id="Rectangle_36" data-name="Rectangle 36" width="2.537" height="2.537" rx="1" transform="translate(34.007 0)" fill="#4a4a4a"/>
<rect id="Rectangle_37" data-name="Rectangle 37" width="2.537" height="2.537" rx="1" transform="translate(37.013 0)" fill="#4a4a4a"/>
<rect id="Rectangle_38" data-name="Rectangle 38" width="2.537" height="2.537" rx="1" transform="translate(40.018 0)" fill="#4a4a4a"/>
<rect id="Rectangle_39" data-name="Rectangle 39" width="2.537" height="2.537" rx="1" transform="translate(3.945 0)" fill="#4a4a4a"/>
<rect id="Rectangle_40" data-name="Rectangle 40" width="2.537" height="2.537" rx="1" transform="translate(6.951 0)" fill="#4a4a4a"/>
<rect id="Rectangle_41" data-name="Rectangle 41" width="2.537" height="2.537" rx="1" transform="translate(9.958 0)" fill="#4a4a4a"/>
<rect id="Rectangle_42" data-name="Rectangle 42" width="2.537" height="2.537" rx="1" transform="translate(12.964 0)" fill="#4a4a4a"/>
<rect id="Rectangle_43" data-name="Rectangle 43" width="2.537" height="2.537" rx="1" transform="translate(15.97 0)" fill="#4a4a4a"/>
<rect id="Rectangle_44" data-name="Rectangle 44" width="2.537" height="2.537" rx="1" transform="translate(18.976 0)" fill="#4a4a4a"/>
<rect id="Rectangle_45" data-name="Rectangle 45" width="2.537" height="2.537" rx="1" transform="translate(21.982 0)" fill="#4a4a4a"/>
<rect id="Rectangle_46" data-name="Rectangle 46" width="2.537" height="2.537" rx="1" transform="translate(24.988 0)" fill="#4a4a4a"/>
<rect id="Rectangle_47" data-name="Rectangle 47" width="2.537" height="2.537" rx="1" transform="translate(27.994 0)" fill="#4a4a4a"/>
<rect id="Rectangle_48" data-name="Rectangle 48" width="2.537" height="2.537" rx="1" transform="translate(31.001 0)" fill="#4a4a4a"/>
<rect id="Rectangle_49" data-name="Rectangle 49" width="2.537" height="2.537" rx="1" transform="translate(34.007 0)" fill="#4a4a4a"/>
<rect id="Rectangle_50" data-name="Rectangle 50" width="2.537" height="2.537" rx="1" transform="translate(37.013 0)" fill="#4a4a4a"/>
<rect id="Rectangle_51" data-name="Rectangle 51" width="2.537" height="2.537" rx="1" transform="translate(40.018 0)" fill="#4a4a4a"/>
</g>
<g id="Group_6" data-name="Group 6" transform="translate(0.728 7.883)">
<path id="Path_54" data-name="Path 54" d="M.519,0h3.47a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.52A.519.519,0,0,1,.519,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<g id="Group_5" data-name="Group 5" transform="translate(5.073 0)">
<rect id="Rectangle_52" data-name="Rectangle 52" width="2.537" height="2.537" rx="1" transform="translate(0 0)" fill="#4a4a4a"/>
<rect id="Rectangle_53" data-name="Rectangle 53" width="2.537" height="2.537" rx="1" transform="translate(3.006 0)" fill="#4a4a4a"/>
<rect id="Rectangle_54" data-name="Rectangle 54" width="2.537" height="2.537" rx="1" transform="translate(6.012 0)" fill="#4a4a4a"/>
<rect id="Rectangle_55" data-name="Rectangle 55" width="2.537" height="2.537" rx="1" transform="translate(9.018 0)" fill="#4a4a4a"/>
<rect id="Rectangle_56" data-name="Rectangle 56" width="2.537" height="2.537" rx="1" transform="translate(12.025 0)" fill="#4a4a4a"/>
<rect id="Rectangle_57" data-name="Rectangle 57" width="2.537" height="2.537" rx="1" transform="translate(15.031 0)" fill="#4a4a4a"/>
<rect id="Rectangle_58" data-name="Rectangle 58" width="2.537" height="2.537" rx="1" transform="translate(18.037 0)" fill="#4a4a4a"/>
<rect id="Rectangle_59" data-name="Rectangle 59" width="2.537" height="2.537" rx="1" transform="translate(21.042 0)" fill="#4a4a4a"/>
<rect id="Rectangle_60" data-name="Rectangle 60" width="2.537" height="2.537" rx="1" transform="translate(24.049 0)" fill="#4a4a4a"/>
<rect id="Rectangle_61" data-name="Rectangle 61" width="2.537" height="2.537" rx="1" transform="translate(27.055 0)" fill="#4a4a4a"/>
<rect id="Rectangle_62" data-name="Rectangle 62" width="2.537" height="2.537" rx="1" transform="translate(30.061 0)" fill="#4a4a4a"/>
</g>
<path id="Path_55" data-name="Path 55" d="M.52,0H3.8a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.52A.519.519,0,0,1,.519,0Z" transform="translate(38.234 0)" fill="#4a4a4a" fill-rule="evenodd"/>
</g>
<g id="Group_7" data-name="Group 7" transform="translate(0.728 14.084)">
<rect id="Rectangle_63" data-name="Rectangle 63" width="2.537" height="2.537" rx="1" transform="translate(0 0)" fill="#4a4a4a"/>
<rect id="Rectangle_64" data-name="Rectangle 64" width="2.537" height="2.537" rx="1" transform="translate(3.006 0)" fill="#4a4a4a"/>
<rect id="Rectangle_65" data-name="Rectangle 65" width="2.537" height="2.537" rx="1" transform="translate(6.012 0)" fill="#4a4a4a"/>
<rect id="Rectangle_66" data-name="Rectangle 66" width="2.537" height="2.537" rx="1" transform="translate(9.018 0)" fill="#4a4a4a"/>
<path id="Path_56" data-name="Path 56" d="M.519,0H14.981A.519.519,0,0,1,15.5.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.018V.519A.519.519,0,0,1,.519,0Zm15.97,0h1.874a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H16.489a.519.519,0,0,1-.519-.519V.519A.519.519,0,0,1,16.489,0Z" transform="translate(12.024 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<rect id="Rectangle_67" data-name="Rectangle 67" width="2.537" height="2.537" rx="1" transform="translate(31.376 0)" fill="#4a4a4a"/>
<rect id="Rectangle_68" data-name="Rectangle 68" width="2.537" height="2.537" rx="1" transform="translate(34.382 0)" fill="#4a4a4a"/>
<rect id="Rectangle_69" data-name="Rectangle 69" width="2.537" height="2.537" rx="1" transform="translate(40.018 0)" fill="#4a4a4a"/>
<path id="Path_57" data-name="Path 57" d="M2.537,0V.561a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,.561V0Z" transform="translate(39.736 1.08) rotate(180)" fill="#4a4a4a"/>
<path id="Path_58" data-name="Path 58" d="M2.537,0V.561a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,.561V0Z" transform="translate(37.2 1.456)" fill="#4a4a4a"/>
</g>
<rect id="Rectangle_70" data-name="Rectangle 70" width="42.273" height="1.127" rx="0.564" transform="translate(0.915 0.556)" fill="#4a4a4a"/>
<rect id="Rectangle_71" data-name="Rectangle 71" width="2.37" height="0.752" rx="0.376" transform="translate(1.949 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_72" data-name="Rectangle 72" width="2.37" height="0.752" rx="0.376" transform="translate(5.193 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_73" data-name="Rectangle 73" width="2.37" height="0.752" rx="0.376" transform="translate(7.688 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_74" data-name="Rectangle 74" width="2.37" height="0.752" rx="0.376" transform="translate(10.183 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_75" data-name="Rectangle 75" width="2.37" height="0.752" rx="0.376" transform="translate(12.679 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_76" data-name="Rectangle 76" width="2.37" height="0.752" rx="0.376" transform="translate(15.797 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_77" data-name="Rectangle 77" width="2.37" height="0.752" rx="0.376" transform="translate(18.292 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_78" data-name="Rectangle 78" width="2.37" height="0.752" rx="0.376" transform="translate(20.788 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_79" data-name="Rectangle 79" width="2.37" height="0.752" rx="0.376" transform="translate(23.283 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_80" data-name="Rectangle 80" width="2.37" height="0.752" rx="0.376" transform="translate(26.402 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_81" data-name="Rectangle 81" width="2.37" height="0.752" rx="0.376" transform="translate(28.897 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_82" data-name="Rectangle 82" width="2.37" height="0.752" rx="0.376" transform="translate(31.393 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_83" data-name="Rectangle 83" width="2.37" height="0.752" rx="0.376" transform="translate(34.512 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_84" data-name="Rectangle 84" width="2.37" height="0.752" rx="0.376" transform="translate(37.007 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_85" data-name="Rectangle 85" width="2.37" height="0.752" rx="0.376" transform="translate(39.502 0.744)" fill="#d8d8d8" opacity="0.136"/>
</g>
<path id="Path_59" data-name="Path 59" d="M123.779,148.389a2.583,2.583,0,0,0-.332.033c-.02-.078-.038-.156-.06-.234a2.594,2.594,0,1,0-2.567-4.455q-.086-.088-.174-.175a2.593,2.593,0,1,0-4.461-2.569c-.077-.022-.154-.04-.231-.06a2.6,2.6,0,1,0-5.128,0c-.077.02-.154.038-.231.06a2.594,2.594,0,1,0-4.461,2.569,10.384,10.384,0,1,0,17.314,9.992,2.592,2.592,0,1,0,.332-5.161" transform="translate(-51.054 -75.262)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_60" data-name="Path 60" d="M83,113.389h20.779V103H83Z" transform="translate(-41.443 -58.444)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_61" data-name="Path 61" d="M123.389,108.944a1.3,1.3,0,1,0,0-2.6,1.338,1.338,0,0,0-.166.017c-.01-.039-.019-.078-.03-.117a1.3,1.3,0,0,0-.5-2.5,1.285,1.285,0,0,0-.783.269q-.043-.044-.087-.087a1.285,1.285,0,0,0,.263-.776,1.3,1.3,0,0,0-2.493-.509,5.195,5.195,0,1,0,0,10,1.3,1.3,0,0,0,2.493-.509,1.285,1.285,0,0,0-.263-.776q.044-.043.087-.087a1.285,1.285,0,0,0,.783.269,1.3,1.3,0,0,0,.5-2.5c.011-.038.02-.078.03-.117a1.335,1.335,0,0,0,.166.017" transform="translate(-55.859 -57.894)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_62" data-name="Path 62" d="M141.8,38.745a1.41,1.41,0,0,1-.255-.026,1.309,1.309,0,0,1-.244-.073,1.349,1.349,0,0,1-.224-.119,1.967,1.967,0,0,1-.2-.161,1.52,1.52,0,0,1-.161-.2,1.282,1.282,0,0,1-.218-.722,1.41,1.41,0,0,1,.026-.255,1.5,1.5,0,0,1,.072-.244,1.364,1.364,0,0,1,.12-.223,1.252,1.252,0,0,1,.358-.358,1.349,1.349,0,0,1,.224-.119,1.309,1.309,0,0,1,.244-.073,1.2,1.2,0,0,1,.509,0,1.262,1.262,0,0,1,.468.192,1.968,1.968,0,0,1,.2.161,1.908,1.908,0,0,1,.161.2,1.322,1.322,0,0,1,.12.223,1.361,1.361,0,0,1,.1.5,1.317,1.317,0,0,1-.379.919,1.968,1.968,0,0,1-.2.161,1.346,1.346,0,0,1-.223.119,1.332,1.332,0,0,1-.5.1m10.389-.649a1.326,1.326,0,0,1-.92-.379,1.979,1.979,0,0,1-.161-.2,1.282,1.282,0,0,1-.218-.722,1.326,1.326,0,0,1,.379-.919,1.967,1.967,0,0,1,.2-.161,1.351,1.351,0,0,1,.224-.119,1.308,1.308,0,0,1,.244-.073,1.2,1.2,0,0,1,.509,0,1.262,1.262,0,0,1,.468.192,1.967,1.967,0,0,1,.2.161,1.326,1.326,0,0,1,.379.919,1.461,1.461,0,0,1-.026.255,1.323,1.323,0,0,1-.073.244,1.847,1.847,0,0,1-.119.223,1.911,1.911,0,0,1-.161.2,1.967,1.967,0,0,1-.2.161,1.294,1.294,0,0,1-.722.218" transform="translate(-69.074 -26.006)" fill-rule="evenodd"/>
</g>
<g id="React-icon" transform="translate(906.3 541.56)">
<path id="Path_330" data-name="Path 330" d="M263.668,117.179c0-5.827-7.3-11.35-18.487-14.775,2.582-11.4,1.434-20.477-3.622-23.382a7.861,7.861,0,0,0-4.016-1v4a4.152,4.152,0,0,1,2.044.466c2.439,1.4,3.5,6.724,2.672,13.574-.2,1.685-.52,3.461-.914,5.272a86.9,86.9,0,0,0-11.386-1.954,87.469,87.469,0,0,0-7.459-8.965c5.845-5.433,11.332-8.41,15.062-8.41V78h0c-4.931,0-11.386,3.514-17.913,9.611-6.527-6.061-12.982-9.539-17.913-9.539v4c3.712,0,9.216,2.959,15.062,8.356a84.687,84.687,0,0,0-7.405,8.947,83.732,83.732,0,0,0-11.4,1.972c-.412-1.793-.717-3.532-.932-5.2-.843-6.85.2-12.175,2.618-13.592a3.991,3.991,0,0,1,2.062-.466v-4h0a8,8,0,0,0-4.052,1c-5.039,2.9-6.168,11.96-3.568,23.328-11.153,3.443-18.415,8.947-18.415,14.757,0,5.828,7.3,11.35,18.487,14.775-2.582,11.4-1.434,20.477,3.622,23.382a7.882,7.882,0,0,0,4.034,1c4.931,0,11.386-3.514,17.913-9.611,6.527,6.061,12.982,9.539,17.913,9.539a8,8,0,0,0,4.052-1c5.039-2.9,6.168-11.96,3.568-23.328C256.406,128.511,263.668,122.988,263.668,117.179Zm-23.346-11.96c-.663,2.313-1.488,4.7-2.421,7.083-.735-1.434-1.506-2.869-2.349-4.3-.825-1.434-1.7-2.833-2.582-4.2C235.517,104.179,237.974,104.645,240.323,105.219Zm-8.212,19.1c-1.4,2.421-2.833,4.716-4.321,6.85-2.672.233-5.379.359-8.1.359-2.708,0-5.415-.126-8.069-.341q-2.232-3.2-4.339-6.814-2.044-3.523-3.73-7.136c1.112-2.4,2.367-4.805,3.712-7.154,1.4-2.421,2.833-4.716,4.321-6.85,2.672-.233,5.379-.359,8.1-.359,2.708,0,5.415.126,8.069.341q2.232,3.2,4.339,6.814,2.044,3.523,3.73,7.136C234.692,119.564,233.455,121.966,232.11,124.315Zm5.792-2.331c.968,2.4,1.793,4.805,2.474,7.136-2.349.574-4.823,1.058-7.387,1.434.879-1.381,1.757-2.8,2.582-4.25C236.4,124.871,237.167,123.419,237.9,121.984ZM219.72,141.116a73.921,73.921,0,0,1-4.985-5.738c1.614.072,3.263.126,4.931.126,1.685,0,3.353-.036,4.985-.126A69.993,69.993,0,0,1,219.72,141.116ZM206.38,130.555c-2.546-.377-5-.843-7.352-1.417.663-2.313,1.488-4.7,2.421-7.083.735,1.434,1.506,2.869,2.349,4.3S205.5,129.192,206.38,130.555ZM219.63,93.241a73.924,73.924,0,0,1,4.985,5.738c-1.614-.072-3.263-.126-4.931-.126-1.686,0-3.353.036-4.985.126A69.993,69.993,0,0,1,219.63,93.241ZM206.362,103.8c-.879,1.381-1.757,2.8-2.582,4.25-.825,1.434-1.6,2.869-2.331,4.3-.968-2.4-1.793-4.805-2.474-7.136C201.323,104.663,203.8,104.179,206.362,103.8Zm-16.227,22.449c-6.348-2.708-10.454-6.258-10.454-9.073s4.106-6.383,10.454-9.073c1.542-.663,3.228-1.255,4.967-1.811a86.122,86.122,0,0,0,4.034,10.92,84.9,84.9,0,0,0-3.981,10.866C193.38,127.525,191.694,126.915,190.134,126.252Zm9.647,25.623c-2.439-1.4-3.5-6.724-2.672-13.574.2-1.686.52-3.461.914-5.272a86.9,86.9,0,0,0,11.386,1.954,87.465,87.465,0,0,0,7.459,8.965c-5.845,5.433-11.332,8.41-15.062,8.41A4.279,4.279,0,0,1,199.781,151.875Zm42.532-13.663c.843,6.85-.2,12.175-2.618,13.592a3.99,3.99,0,0,1-2.062.466c-3.712,0-9.216-2.959-15.062-8.356a84.689,84.689,0,0,0,7.405-8.947,83.731,83.731,0,0,0,11.4-1.972A50.194,50.194,0,0,1,242.313,138.212Zm6.9-11.96c-1.542.663-3.228,1.255-4.967,1.811a86.12,86.12,0,0,0-4.034-10.92,84.9,84.9,0,0,0,3.981-10.866c1.775.556,3.461,1.165,5.039,1.829,6.348,2.708,10.454,6.258,10.454,9.073C259.67,119.994,255.564,123.562,249.216,126.252Z" fill="#61dafb"/>
<path id="Path_331" data-name="Path 331" d="M320.8,78.4Z" transform="translate(-119.082 -0.328)" fill="#61dafb"/>
<circle id="Ellipse_112" data-name="Ellipse 112" cx="8.194" cy="8.194" r="8.194" transform="translate(211.472 108.984)" fill="#61dafb"/>
<path id="Path_332" data-name="Path 332" d="M520.5,78.1Z" transform="translate(-282.975 -0.082)" fill="#61dafb"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 35 KiB

View File

@ -1,40 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1129" height="663" viewBox="0 0 1129 663">
<title>Focus on What Matters</title>
<circle cx="321" cy="321" r="321" fill="#f2f2f2" />
<ellipse cx="559" cy="635.49998" rx="514" ry="27.50002" fill="#3f3d56" />
<ellipse cx="558" cy="627" rx="460" ry="22" opacity="0.2" />
<rect x="131" y="152.5" width="840" height="50" fill="#3f3d56" />
<path d="M166.5,727.3299A21.67009,21.67009,0,0,0,188.1701,749H984.8299A21.67009,21.67009,0,0,0,1006.5,727.3299V296h-840Z" transform="translate(-35.5 -118.5)" fill="#3f3d56" />
<path d="M984.8299,236H188.1701A21.67009,21.67009,0,0,0,166.5,257.6701V296h840V257.6701A21.67009,21.67009,0,0,0,984.8299,236Z" transform="translate(-35.5 -118.5)" fill="#3f3d56" />
<path d="M984.8299,236H188.1701A21.67009,21.67009,0,0,0,166.5,257.6701V296h840V257.6701A21.67009,21.67009,0,0,0,984.8299,236Z" transform="translate(-35.5 -118.5)" opacity="0.2" />
<circle cx="181" cy="147.5" r="13" fill="#3f3d56" />
<circle cx="217" cy="147.5" r="13" fill="#3f3d56" />
<circle cx="253" cy="147.5" r="13" fill="#3f3d56" />
<rect x="168" y="213.5" width="337" height="386" rx="5.33505" fill="#606060" />
<rect x="603" y="272.5" width="284" height="22" rx="5.47638" fill="#2e8555" />
<rect x="537" y="352.5" width="416" height="15" rx="5.47638" fill="#2e8555" />
<rect x="537" y="396.5" width="416" height="15" rx="5.47638" fill="#2e8555" />
<rect x="537" y="440.5" width="416" height="15" rx="5.47638" fill="#2e8555" />
<rect x="537" y="484.5" width="416" height="15" rx="5.47638" fill="#2e8555" />
<rect x="865" y="552.5" width="88" height="26" rx="7.02756" fill="#3ecc5f" />
<path d="M1088.60287,624.61594a30.11371,30.11371,0,0,0,3.98291-15.266c0-13.79652-8.54358-24.98081-19.08256-24.98081s-19.08256,11.18429-19.08256,24.98081a30.11411,30.11411,0,0,0,3.98291,15.266,31.248,31.248,0,0,0,0,30.53213,31.248,31.248,0,0,0,0,30.53208,31.248,31.248,0,0,0,0,30.53208,30.11408,30.11408,0,0,0-3.98291,15.266c0,13.79652,8.54353,24.98081,19.08256,24.98081s19.08256-11.18429,19.08256-24.98081a30.11368,30.11368,0,0,0-3.98291-15.266,31.248,31.248,0,0,0,0-30.53208,31.248,31.248,0,0,0,0-30.53208,31.248,31.248,0,0,0,0-30.53213Z" transform="translate(-35.5 -118.5)" fill="#3f3d56" />
<ellipse cx="1038.00321" cy="460.31783" rx="19.08256" ry="24.9808" fill="#3f3d56" />
<ellipse cx="1038.00321" cy="429.78574" rx="19.08256" ry="24.9808" fill="#3f3d56" />
<path d="M1144.93871,339.34489a91.61081,91.61081,0,0,0,7.10658-10.46092l-50.141-8.23491,54.22885.4033a91.566,91.566,0,0,0,1.74556-72.42605l-72.75449,37.74139,67.09658-49.32086a91.41255,91.41255,0,1,0-150.971,102.29805,91.45842,91.45842,0,0,0-10.42451,16.66946l65.0866,33.81447-69.40046-23.292a91.46011,91.46011,0,0,0,14.73837,85.83669,91.40575,91.40575,0,1,0,143.68892,0,91.41808,91.41808,0,0,0,0-113.02862Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M981.6885,395.8592a91.01343,91.01343,0,0,0,19.56129,56.51431,91.40575,91.40575,0,1,0,143.68892,0C1157.18982,436.82067,981.6885,385.60008,981.6885,395.8592Z" transform="translate(-35.5 -118.5)" opacity="0.1" />
<path d="M365.62,461.43628H477.094v45.12043H365.62Z" transform="translate(-35.5 -118.5)" fill="#fff" fill-rule="evenodd" />
<path d="M264.76252,608.74122a26.50931,26.50931,0,0,1-22.96231-13.27072,26.50976,26.50976,0,0,0,22.96231,39.81215H291.304V608.74122Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M384.17242,468.57061l92.92155-5.80726V449.49263a26.54091,26.54091,0,0,0-26.54143-26.54143H331.1161l-3.31768-5.74622a3.83043,3.83043,0,0,0-6.63536,0l-3.31768,5.74622-3.31767-5.74622a3.83043,3.83043,0,0,0-6.63536,0l-3.31768,5.74622L301.257,417.205a3.83043,3.83043,0,0,0-6.63536,0L291.304,422.9512c-.02919,0-.05573.004-.08625.004l-5.49674-5.49541a3.8293,3.8293,0,0,0-6.4071,1.71723l-1.81676,6.77338L270.607,424.1031a3.82993,3.82993,0,0,0-4.6912,4.69253l1.84463,6.89148-6.77072,1.81411a3.8315,3.8315,0,0,0-1.71988,6.40975l5.49673,5.49673c0,.02787-.004.05574-.004.08493l-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74621,3.31768L259.0163,466.081a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31767a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31767a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31768a3.83042,3.83042,0,0,0,0,6.63535l5.74622,3.31768-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768L259.0163,558.976a3.83042,3.83042,0,0,0,0,6.63535l5.74622,3.31768-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31768a3.83042,3.83042,0,0,0,0,6.63535l5.74622,3.31768-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768A26.54091,26.54091,0,0,0,291.304,635.28265H450.55254A26.5409,26.5409,0,0,0,477.094,608.74122V502.5755l-92.92155-5.80727a14.12639,14.12639,0,0,1,0-28.19762" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M424.01111,635.28265h39.81214V582.19979H424.01111Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M490.36468,602.10586a6.60242,6.60242,0,0,0-.848.08493c-.05042-.19906-.09821-.39945-.15393-.59852A6.62668,6.62668,0,1,0,482.80568,590.21q-.2203-.22491-.44457-.44589a6.62391,6.62391,0,1,0-11.39689-6.56369c-.1964-.05575-.39414-.10218-.59056-.15262a6.63957,6.63957,0,1,0-13.10086,0c-.1964.05042-.39414.09687-.59056.15262a6.62767,6.62767,0,1,0-11.39688,6.56369,26.52754,26.52754,0,1,0,44.23127,25.52756,6.6211,6.6211,0,1,0,.848-13.18579" transform="translate(-35.5 -118.5)" fill="#44d860" fill-rule="evenodd" />
<path d="M437.28182,555.65836H477.094V529.11693H437.28182Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M490.36468,545.70532a3.31768,3.31768,0,0,0,0-6.63536,3.41133,3.41133,0,0,0-.42333.04247c-.02655-.09953-.04911-.19907-.077-.29859a3.319,3.319,0,0,0-1.278-6.37923,3.28174,3.28174,0,0,0-2.00122.68742q-.10947-.11346-.22294-.22295a3.282,3.282,0,0,0,.67149-1.98265,3.31768,3.31768,0,0,0-6.37-1.2992,13.27078,13.27078,0,1,0,0,25.54082,3.31768,3.31768,0,0,0,6.37-1.2992,3.282,3.282,0,0,0-.67149-1.98265q.11347-.10947.22294-.22294a3.28174,3.28174,0,0,0,2.00122.68742,3.31768,3.31768,0,0,0,1.278-6.37923c.02786-.0982.05042-.19907.077-.29859a3.41325,3.41325,0,0,0,.42333.04246" transform="translate(-35.5 -118.5)" fill="#44d860" fill-rule="evenodd" />
<path d="M317.84538,466.081a3.31768,3.31768,0,0,1-3.31767-3.31768,9.953,9.953,0,1,0-19.90608,0,3.31768,3.31768,0,1,1-6.63535,0,16.58839,16.58839,0,1,1,33.17678,0,3.31768,3.31768,0,0,1-3.31768,3.31768" transform="translate(-35.5 -118.5)" fill-rule="evenodd" />
<path d="M370.92825,635.28265h79.62429A26.5409,26.5409,0,0,0,477.094,608.74122v-92.895H397.46968a26.54091,26.54091,0,0,0-26.54143,26.54143Z" transform="translate(-35.5 -118.5)" fill="#ffff50" fill-rule="evenodd" />
<path d="M457.21444,556.98543H390.80778a1.32707,1.32707,0,0,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0,26.54143H390.80778a1.32707,1.32707,0,1,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0,26.54143H390.80778a1.32707,1.32707,0,1,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0-66.10674H390.80778a1.32707,1.32707,0,0,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0,26.29459H390.80778a1.32707,1.32707,0,0,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0,26.54143H390.80778a1.32707,1.32707,0,0,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414M477.094,474.19076c-.01592,0-.0292-.008-.04512-.00663-4.10064.13934-6.04083,4.24132-7.75274,7.86024-1.78623,3.78215-3.16771,6.24122-5.43171,6.16691-2.50685-.09024-3.94007-2.92222-5.45825-5.91874-1.74377-3.44243-3.73438-7.34667-7.91333-7.20069-4.04227.138-5.98907,3.70784-7.70631,6.857-1.82738,3.35484-3.07084,5.39455-5.46887,5.30033-2.55727-.09289-3.91619-2.39536-5.48877-5.06013-1.75306-2.96733-3.77951-6.30359-7.8775-6.18946-3.97326.13669-5.92537,3.16507-7.64791,5.83912-1.82207,2.82666-3.09872,4.5492-5.52725,4.447-2.61832-.09289-3.9706-2.00388-5.53522-4.21611-1.757-2.4856-3.737-5.299-7.82308-5.16231-3.88567.13271-5.83779,2.61434-7.559,4.80135-1.635,2.07555-2.9116,3.71846-5.61218,3.615a1.32793,1.32793,0,1,0-.09555,2.65414c4.00377.134,6.03154-2.38873,7.79257-4.6275,1.562-1.9853,2.91027-3.69855,5.56441-3.78879,2.55594-.10882,3.75429,1.47968,5.56707,4.04093,1.7212,2.43385,3.67465,5.19416,7.60545,5.33616,4.11789.138,6.09921-2.93946,7.8536-5.66261,1.56861-2.43385,2.92221-4.53461,5.50734-4.62352,2.37944-.08892,3.67466,1.79154,5.50072,4.885,1.72121,2.91557,3.67069,6.21865,7.67977,6.36463,4.14709.14332,6.14965-3.47693,7.89475-6.68181,1.51155-2.77092,2.93814-5.38791,5.46621-5.4755,2.37944-.05573,3.62025,2.11668,5.45558,5.74622,1.71459,3.388,3.65875,7.22591,7.73019,7.37321l.22429.004c4.06614,0,5.99571-4.08074,7.70364-7.68905,1.51154-3.19825,2.94211-6.21069,5.3972-6.33411Z" transform="translate(-35.5 -118.5)" fill-rule="evenodd" />
<path d="M344.38682,635.28265h53.08286V582.19979H344.38682Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M424.01111,602.10586a6.60242,6.60242,0,0,0-.848.08493c-.05042-.19906-.09821-.39945-.15394-.59852A6.62667,6.62667,0,1,0,416.45211,590.21q-.2203-.22491-.44458-.44589a6.62391,6.62391,0,1,0-11.39689-6.56369c-.1964-.05575-.39413-.10218-.59054-.15262a6.63957,6.63957,0,1,0-13.10084,0c-.19641.05042-.39414.09687-.59055.15262a6.62767,6.62767,0,1,0-11.39689,6.56369,26.52755,26.52755,0,1,0,44.2313,25.52756,6.6211,6.6211,0,1,0,.848-13.18579" transform="translate(-35.5 -118.5)" fill="#44d860" fill-rule="evenodd" />
<path d="M344.38682,555.65836h53.08286V529.11693H344.38682Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M410.74039,545.70532a3.31768,3.31768,0,1,0,0-6.63536,3.41133,3.41133,0,0,0-.42333.04247c-.02655-.09953-.04911-.19907-.077-.29859a3.319,3.319,0,0,0-1.278-6.37923,3.28174,3.28174,0,0,0-2.00122.68742q-.10947-.11346-.22294-.22295a3.282,3.282,0,0,0,.67149-1.98265,3.31768,3.31768,0,0,0-6.37-1.2992,13.27078,13.27078,0,1,0,0,25.54082,3.31768,3.31768,0,0,0,6.37-1.2992,3.282,3.282,0,0,0-.67149-1.98265q.11347-.10947.22294-.22294a3.28174,3.28174,0,0,0,2.00122.68742,3.31768,3.31768,0,0,0,1.278-6.37923c.02786-.0982.05042-.19907.077-.29859a3.41325,3.41325,0,0,0,.42333.04246" transform="translate(-35.5 -118.5)" fill="#44d860" fill-rule="evenodd" />
<path d="M424.01111,447.8338a3.60349,3.60349,0,0,1-.65028-.06636,3.34415,3.34415,0,0,1-.62372-.18579,3.44679,3.44679,0,0,1-.572-.30522,5.02708,5.02708,0,0,1-.50429-.4114,3.88726,3.88726,0,0,1-.41007-.50428,3.27532,3.27532,0,0,1-.55737-1.84463,3.60248,3.60248,0,0,1,.06636-.65027,3.82638,3.82638,0,0,1,.18447-.62373,3.48858,3.48858,0,0,1,.30656-.57064,3.197,3.197,0,0,1,.91436-.91568,3.44685,3.44685,0,0,1,.572-.30523,3.344,3.344,0,0,1,.62372-.18578,3.06907,3.06907,0,0,1,1.30053,0,3.22332,3.22332,0,0,1,1.19436.491,5.02835,5.02835,0,0,1,.50429.41139,4.8801,4.8801,0,0,1,.41139.50429,3.38246,3.38246,0,0,1,.30522.57064,3.47806,3.47806,0,0,1,.25215,1.274A3.36394,3.36394,0,0,1,426.36,446.865a5.02708,5.02708,0,0,1-.50429.4114,3.3057,3.3057,0,0,1-1.84463.55737m26.54143-1.65884a3.38754,3.38754,0,0,1-2.35024-.96877,5.04185,5.04185,0,0,1-.41007-.50428,3.27532,3.27532,0,0,1-.55737-1.84463,3.38659,3.38659,0,0,1,.96744-2.34892,5.02559,5.02559,0,0,1,.50429-.41139,3.44685,3.44685,0,0,1,.572-.30523,3.3432,3.3432,0,0,1,.62373-.18579,3.06952,3.06952,0,0,1,1.30052,0,3.22356,3.22356,0,0,1,1.19436.491,5.02559,5.02559,0,0,1,.50429.41139,3.38792,3.38792,0,0,1,.96876,2.34892,3.72635,3.72635,0,0,1-.06636.65026,3.37387,3.37387,0,0,1-.18579.62373,4.71469,4.71469,0,0,1-.30522.57064,4.8801,4.8801,0,0,1-.41139.50429,5.02559,5.02559,0,0,1-.50429.41139,3.30547,3.30547,0,0,1-1.84463.55737" transform="translate(-35.5 -118.5)" fill-rule="evenodd" />
</svg>

Before

Width:  |  Height:  |  Size: 12 KiB

1
example.env Normal file
View File

@ -0,0 +1 @@
GITHUB_TOKEN=""

@ -1 +0,0 @@
Subproject commit fa61273d5b4b40a22d97c7773321d8ca6c985fd7

21
package.json Executable file → Normal file
View File

@ -1,13 +1,20 @@
{
"author": "RageStudio",
"license": "ComtyLicense",
"license": "LGPL-2.1",
"types": "index.d.ts",
"private": true,
"scripts": {
"dev": "npm run dev:client & npm run dev:server",
"dev:server": "cd packages/server && npm run dev",
"dev:client": "cd packages/app && npm run dev",
"setup:server": "cd packages/server && npm run setup",
"postinstall": "cd packages/app && npm install && cd ../server && npm install"
"release": "node ./scripts/release.js"
},
"_web_app_path": "packages/app"
"workspaces": [
"packages"
],
"dependencies": {
"corenode": "^0.28.26",
"@octokit/rest": "19.0.4",
"dotenv": "16.0.3",
"7zip-min": "1.4.3",
"axios": "0.21.1"
},
"version": "0.20.2"
}

BIN
packages/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,66 @@
const path = require("path")
const { builtinModules } = require("module")
const aliases = {
"~": __dirname,
"~/": `${path.resolve(__dirname, "src")}/`,
"@src": path.join(__dirname, "src"),
cores: path.join(__dirname, "src/cores"),
schemas: path.join(__dirname, "constants"),
config: path.join(__dirname, "config"),
extensions: path.resolve(__dirname, "src/extensions"),
pages: path.join(__dirname, "src/pages"),
theme: path.join(__dirname, "src/theme"),
components: path.join(__dirname, "src/components"),
models: path.join(__dirname, "src/models"),
utils: path.join(__dirname, "src/utils"),
layouts: path.join(__dirname, "src/layouts"),
}
module.exports = (config = {}) => {
if (!config.resolve) {
config.resolve = {}
}
if (!config.server) {
config.server = {}
}
config.resolve.alias = aliases
config.server.port = process.env.listenPort ?? 8000
config.server.host = "0.0.0.0"
config.server.fs = {
allow: [".."]
}
config.envDir = path.join(__dirname, "environments")
config.css = {
preprocessorOptions: {
less: {
javascriptEnabled: true,
}
}
}
// config.build = {
// sourcemap: "inline",
// target: `node16`,
// outDir: "dist",
// assetsDir: ".",
// minify: process.env.MODE !== "development",
// rollupOptions: {
// external: [
// "electron",
// "electron-devtools-installer",
// ...builtinModules.flatMap(p => [p, `node:16`]),
// ],
// output: {
// entryFileNames: "[name].js",
// },
// },
// emptyOutDir: true,
// brotliSize: false,
// }
return config
}

View File

@ -0,0 +1,12 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.ico" />
<meta name="viewport" content="viewport-fit=cover, width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/App.jsx"></script>
</body>
</html>

View File

@ -0,0 +1,68 @@
{
"name": "@comty/console",
"version": "0.20.2",
"license": "MIT",
"scripts": {
"build": "vite build",
"dev": "vite"
},
"peerDependencies": {
"react": "^16.8.6"
},
"dependencies": {
"@ant-design/icons": "4.7.0",
"@corenode/utils": "0.28.26",
"@foxify/events": "2.0.1",
"@loadable/component": "5.15.2",
"@vitejs/plugin-react": "^2.1.0",
"antd": "4.23.2",
"chart.js": "3.7.0",
"classnames": "2.3.1",
"evite": "0.12.3",
"feather-reactjs": "2.0.13",
"fuse.js": "6.5.3",
"global": "4.4.0",
"history": "5.2.0",
"js-cookie": "3.0.1",
"jwt-decode": "3.1.2",
"less": "4.1.2",
"linebridge": "0.13.0",
"moment": "2.29.1",
"nprogress": "^0.2.0",
"rc-animate": "^3.1.1",
"rc-util": "^5.19.3",
"rc-virtual-list": "^3.4.4",
"react-beautiful-dnd": "13.1.0",
"react-chartjs-2": "4.0.1",
"react-color": "2.19.3",
"react-contexify": "5.0.0",
"react-draggable": "4.4.4",
"react-helmet": "6.1.0",
"react-i18next": "11.15.3",
"react-icons": "4.3.1",
"react-intersection-observer": "8.33.1",
"react-json-view": "1.21.3",
"react-lazy-load-image-component": "^1.5.4",
"react-loadable": "^5.5.0",
"react-motion": "0.5.2",
"react-reveal": "1.2.2",
"react-rnd": "10.3.5",
"rxjs": "^7.5.5",
"store": "^2.0.12"
},
"devDependencies": {
"@types/jest": "^26.0.24",
"@types/node": "^16.4.10",
"@types/react": "^17.0.15",
"@types/react-dom": "^17.0.9",
"@types/react-router-config": "^5.0.3",
"@types/react-router-dom": "^5.1.8",
"@typescript-eslint/eslint-plugin": "^4.29.0",
"concurrently": "^7.4.0",
"corenode": "0.28.26",
"cors": "2.8.5",
"cross-env": "^7.0.3",
"express": "^4.17.1",
"vite": "3.1.4"
}
}

View File

@ -0,0 +1,366 @@
// Patch global prototypes
Array.prototype.findAndUpdateObject = function (discriminator, obj) {
let index = this.findIndex(item => item[discriminator] === obj[discriminator])
if (index !== -1) {
this[index] = obj
}
return index
}
Array.prototype.move = function (from, to) {
this.splice(to, 0, this.splice(from, 1)[0])
return this
}
String.prototype.toTitleCase = function () {
return this.replace(/\w\S*/g, function (txt) {
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase()
})
}
Promise.tasked = function (promises) {
return new Promise(async (resolve, reject) => {
let rejected = false
for await (let promise of promises) {
if (rejected) {
return
}
try {
await promise()
} catch (error) {
rejected = true
return reject(error)
}
}
if (!rejected) {
return resolve()
}
})
}
import React from "react"
import { EviteRuntime } from "evite"
import { Helmet } from "react-helmet"
import * as antd from "antd"
import { Translation } from "react-i18next"
import config from "config"
import { Session, User } from "models"
import { NotFound, RenderError, Crash, Login } from "components"
import { Icons } from "components/Icons"
import Layout from "./layout"
import * as Router from "./router"
import "theme/index.less"
class App extends React.Component {
sessionController = new Session()
userController = new User()
state = {
session: null,
user: null,
}
static async initialize() {
window.app.version = config.package.version
}
static publicEvents = {
"clearAllOverlays": function () {
window.app.DrawerController.closeAll()
},
}
eventsHandlers = {
"app.close": () => {
if (window.isElectron) {
window.electron.ipcRenderer.invoke("app.close")
}
},
"app.minimize": () => {
if (window.isElectron) {
window.electron.ipcRenderer.invoke("app.minimize")
}
},
"app.openCreator": (...args) => {
return App.publicMethods.openCreator(...args)
},
"app.createLogin": async () => {
app.DrawerController.open("login", Login, {
componentProps: {
sessionController: this.sessionController
}
})
},
"session.logout": async () => {
await this.sessionController.logout()
},
"session.created": async () => {
await this.flushState()
await this.initialization()
// if is `/login` move to `/`
if (window.location.pathname === "/login") {
app.setLocation("/")
}
},
"session.destroyed": async () => {
await this.flushState()
app.eventBus.emit("app.forceToLogin")
},
"session.regenerated": async () => {
//await this.flushState()
//await this.initialization()
},
"session.invalid": async (error) => {
const token = await Session.token
if (!this.state.session && !token) {
return false
}
await this.sessionController.forgetLocalSession()
await this.flushState()
app.eventBus.emit("app.forceToLogin")
antd.notification.open({
message: <Translation>
{(t) => t("Invalid Session")}
</Translation>,
description: <Translation>
{(t) => t(error)}
</Translation>,
icon: <Icons.MdOutlineAccessTimeFilled />,
})
},
"app.forceToLogin": () => {
window.app.setLocation("/login")
},
"websocket_connected": () => {
if (this.wsReconnecting) {
this.wsReconnectingTry = 0
this.wsReconnecting = false
this.initialization()
setTimeout(() => {
console.log("WS Reconnected")
}, 500)
}
},
"websocket_connection_error": () => {
if (!this.wsReconnecting) {
this.latencyWarning = null
this.wsReconnectingTry = 0
this.wsReconnecting = true
console.log("WS Reconnecting")
}
this.wsReconnectingTry = this.wsReconnectingTry + 1
if (this.wsReconnectingTry > 3 && app.settings.get("app.reloadOnWSConnectionError")) {
window.location.reload()
}
},
"websocket_latency_too_high": () => {
if (!this.latencyWarning) {
this.latencyWarning = true
antd.notification.open({
message: <Translation>
{(t) => t("Latency Warning")}
</Translation>,
description: <Translation>
{(t) => t("The latency between your computer and the server is too high. This may cause some issues. Please check your internet connection.")}
</Translation>,
icon: <Icons.MdOutlineAccessTimeFilled />,
})
}
},
"websocket_latency_normal": () => {
if (this.latencyWarning) {
this.latencyWarning = null
antd.notification.close("latency-warning")
}
},
}
static staticRenders = {
PageLoad: () => {
return <antd.Skeleton active />
},
NotFound: (props) => {
return <NotFound />
},
RenderError: (props) => {
return <RenderError {...props} />
},
Crash: Crash.CrashWrapper,
Initialization: () => {
return <div className="app_splash_wrapper">
<div className="splash_logo">
<img src={config.logo.alt} />
</div>
<div className="splash_label">
<Icons.LoadingOutlined />
</div>
</div>
}
}
static publicMethods = {
}
constructor(props) {
super(props)
Object.keys(this.eventsHandlers).forEach((event) => {
app.eventBus.on(event, this.eventsHandlers[event])
})
}
flushState = async () => {
await this.setState({ session: null, user: null })
}
componentDidMount = async () => {
app.eventBus.emit("app.initialization.start")
await this.initialization()
app.eventBus.emit("app.initialization.finish")
}
initialization = async () => {
console.debug(`[App] Initializing app`)
const initializationTasks = [
async () => {
try {
// get remotes origins from config
const defaultRemotes = config.remotes
// get storaged remotes origins
const storedRemotes = await app.settings.get("remotes") ?? {}
// mount main api bridge
await this.props.cores.ApiCore.connectBridge("main", {
origin: storedRemotes.mainApi ?? defaultRemotes.mainApi,
locked: true,
})
await this.props.cores.ApiCore.namespaces["main"].initialize()
app.eventBus.emit("app.initialization.api_success")
} catch (error) {
app.eventBus.emit("app.initialization.api_error", error)
console.error(`[App] Error while initializing api`, error)
throw {
cause: "Cannot connect to API",
details: `Sorry but we cannot connect to the API. Please try again later. [${config.remotes.mainApi}]`,
}
}
},
async () => {
try {
await this.__SessionInit()
app.eventBus.emit("app.initialization.session_success")
} catch (error) {
app.eventBus.emit("app.initialization.session_error", error)
throw {
cause: "Cannot initialize session",
details: error.message,
}
}
},
async () => {
try {
await this.__UserInit()
app.eventBus.emit("app.initialization.user_success")
} catch (error) {
app.eventBus.emit("app.initialization.user_error", error)
throw {
cause: "Cannot initialize user data",
details: error.message,
}
}
},
]
await Promise.tasked(initializationTasks).catch((reason) => {
console.error(`[App] Initialization failed: ${reason.cause}`)
app.eventBus.emit("runtime.crash", {
message: `App initialization failed (${reason.cause})`,
details: reason.details,
})
})
}
__SessionInit = async () => {
const token = await Session.token
if (!token || token == null) {
app.eventBus.emit("app.forceToLogin")
return false
}
const session = await this.sessionController.getCurrentSession().catch((error) => {
console.error(`[App] Cannot get current session: ${error.message}`)
return false
})
await this.setState({ session })
}
__UserInit = async () => {
if (!this.state.session) {
return false
}
const user = await User.data()
await this.setState({ user })
}
render() {
return <React.Fragment>
<Helmet>
<title>{config.app.siteName}</title>
</Helmet>
<Router.InternalRouter>
<Layout
user={this.state.user}
staticRenders={App.staticRenders}
bindProps={{
staticRenders: App.staticRenders,
user: this.state.user,
session: this.state.session,
sessionController: this.sessionController,
userController: this.userController,
}}
>
<Router.PageRender />
</Layout>
</Router.InternalRouter>
</React.Fragment>
}
}
export default new EviteRuntime(App)

View File

@ -0,0 +1,27 @@
import React from "react"
import classnames from "classnames"
import "./index.less"
export default (props) => {
const { children } = props
return <div
style={{
...props.style,
padding: props.padding,
}}
className={classnames(
"actionsBar",
[props.mode],
{["transparent"]: props.type === "transparent"},
{["spaced"]: props.spaced},
)}
>
<div
style={props.wrapperStyle}
className="wrapper"
>
{children}
</div>
</div>
}

View File

@ -0,0 +1,100 @@
@actionsBar_height: fit-content;
.actionsBar {
--ignore-dragger: true;
display: inline-block;
white-space: nowrap;
overflow-x: overlay;
padding: 15px;
width: 100%;
height: @actionsBar_height;
border: 1px solid #e0e0e0;
border-radius: 8px;
background-color: #0c0c0c15;
backdrop-filter: blur(10px);
--webkit-backdrop-filter: blur(10px);
transition: all 200ms ease-in-out;
::-webkit-scrollbar {
position: absolute;
display: none;
width: 0;
height: 0;
z-index: 0;
}
.wrapper {
display: flex;
flex-direction: row;
align-items: center;
height: 100%;
transition: all 200ms ease-in-out;
> div {
margin: 0 5px;
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: center;
--ignore-dragger: true;
span {
height: fit-content;
}
}
}
&.float {
z-index: 1000;
position: sticky;
bottom: 0;
top: 0;
right: 0;
width: 100%;
}
&.fixedBottom {
z-index: 1000;
position: fixed;
bottom: 0;
right: 0;
left: 0;
width: 100%;
margin-bottom: 10px;
}
&.fixedTop {
z-index: 1000;
position: fixed;
top: 0;
right: 0;
left: 0;
width: 100%;
margin-bottom: 10px;
}
&.transparent {
background-color: transparent;
border: none;
backdrop-filter: none;
--webkit-backdrop-filter: none;
}
&.spaced {
.wrapper {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
}
}
}

View File

@ -0,0 +1,38 @@
import React from "react"
import { Result, Button } from "antd"
import "./index.less"
export const CrashComponent = (props) => {
const {
crash = {
details: "Unknown error",
}
} = props
return <Result
status="error"
title="Well, we're sorry! The application has a fatal crash."
subTitle={crash.message}
extra={[
<Button type="primary" key="reload" onClick={() => window.location.reload()}>
Reload app
</Button>
]}
>
{crash.details &&
<div>
<code>{crash.details}</code>
</div>}
</Result>
}
export const CrashWrapper = (props) => {
const { crash } = props
return <div className="crashWrapper">
<CrashComponent crash={crash} />
</div>
}
export default CrashComponent

View File

@ -0,0 +1,62 @@
.crashWrapper {
position: absolute;
width: 100vw;
height: 100vh;
top: 0;
left: 0;
z-index: 10000;
background: rgba(0, 0, 0, 0.7);
backdrop-filter: blur(10px);
color: #fff;
.ant-result,
.ant-result-title,
.ant-result-subtitle,
.ant-result-extra {
color: #fff;
}
.ant-result-content {
background-color: rgba(0, 0, 0, 0.7) !important;
}
code {
user-select: text;
color: #fff;
font-family: "DM Mono", monospace;
}
h1,
h2,
h3,
h4,
h5,
h6,
p,
span,
pre {
color: #fff;
}
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
animation: opacity-fade-in 0.3s ease-in-out;
}
@keyframes opacity-fade-in {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}

View File

@ -0,0 +1,23 @@
import React from "react"
import { Button } from "antd"
import classnames from "classnames"
import "./index.less"
export default (props) => {
return <div className="followButton">
<div className="counter">
{props.count}
</div>
<Button
type="ghost"
onClick={props.onClick}
className={classnames(
"btn",
{ ["followed"]: props.followed }
)}
>
<span>{props.followed ? "Following" : "Follow"}</span>
</Button>
</div>
}

View File

@ -0,0 +1,82 @@
@borderRadius: 8px;
.followButton {
display: inline-flex;
flex-direction: row;
align-items: center;
transition: all 150ms ease-in-out;
outline: 1px solid var(--border-color);
border-radius: @borderRadius;
.counter {
padding: 5px 15px;
}
.btn {
cursor: pointer;
width: 100px;
padding: 5px 15px;
transition: all 150ms ease-in-out;
border-radius: @borderRadius;
border-left: 1.5px solid var(--border-color);
border-top: 0;
border-right: 0;
border-bottom: 0;
text-align: center;
letter-spacing: 1px;
span {
user-select: none !important;
transition: all 150ms ease-in-out;
color: white !important;
}
opacity: 0.9;
background : linear-gradient(120deg, #6559ae, #ff7159, #6559ae);
background-size : 400% 400%;
background-position: 14% 0%;
&:hover {
opacity: 1;
animation: gradientMove 2s forwards ease-in-out infinite;
background: linear-gradient(120deg, #6559ae, #ff7159, #6559ae);
background-size: 400% 400%;
background-position: 14% 0%;
}
// make an click animation transforming size
&:active {
transform: scale(0.95);
}
&.followed {
background: none;
span {
color: #7e7e7e !important;
}
}
}
}
@keyframes gradientMove {
0% {
background-position: 14% 0%;
}
50% {
background-position: 87% 100%;
}
100% {
background-position: 14% 0%;
}
}

View File

@ -0,0 +1,43 @@
import React from "react"
import * as antd from "antd"
import { Icons } from "components/Icons"
import "./index.less"
export default (props) => {
if (props.followers.length === 0) {
return <antd.Result
icon={<Icons.UserX style={{ fontSize: "50px" }} />}
>
<h2>
It's seems this user has no followers, yet.
</h2>
<h3>
Maybe you can help them out?
</h3>
</antd.Result>
}
return <div className="followersList">
{props.followers.map((follower) => {
return <div className="follower">
<div className="avatar">
<antd.Avatar shape="square" src={follower.avatar} />
</div>
<div className="names">
<div>
<h2>
{follower.fullName ?? follower.username}
</h2>
</div>
<div>
<span>
@{follower.username}
</span>
</div>
</div>
</div>
})}
</div>
}

View File

@ -0,0 +1,65 @@
@borderRadius: 12px;
.ant-result {
display : flex;
flex-direction: column;
align-items : center;
}
.ant-result-icon {
background-color: var(--background-color-accent);
border-radius : @borderRadius;
width : fit-content;
padding : 20px;
svg {
margin: 0;
color : var(--background-color-contrast);
}
}
.ant-result-content {
background-color: var(--background-color-accent);
border-radius : @borderRadius;
h2 {
color: var(--background-color-contrast);
}
h3 {
color : var(--background-color-contrast);
font-weight: 100;
}
}
.followersList {
.follower {
width : 100%;
//max-width: 50vw;
padding : 10px;
display : inline-flex;
align-items : center;
border-radius: 8px;
border : 1px solid var(--border-color);
h2 {
margin: 0;
font-size: 22px;
line-height: 26px;
}
>div {
margin-right: 10px;
}
.names {
}
}
>div {
margin-bottom: 20px;
}
}

View File

@ -0,0 +1,29 @@
import React from "react"
import config from "config"
import "./index.less"
export default (props) => {
const renderLinks = () => {
return config.footerLinks.map((link, index) => {
let linkProps = {
key: index,
}
if (link.url) {
linkProps.href = link.url
}
if (link.location) {
linkProps.onClick = () => {
app.setLocation(link.location)
}
}
return <>| <a {...linkProps}>{link.label}</a> {index === config.footerLinks.length - 1 ? "|" : ""} </>
})
}
return <div className="footer">
{config.app.copyright} {config.footerLinks ? renderLinks() : null}
</div>
}

View File

@ -0,0 +1,9 @@
.footer {
position: fixed;
bottom: 0;
padding: 10px;
font-family: "DM Mono", monospace;
font-size: 12px;
font-weight: 200;
}

View File

@ -0,0 +1,400 @@
import React from "react"
import { Icons } from "components/Icons"
import {
Form,
Input,
Button,
Checkbox,
Select,
Dropdown,
Slider,
InputNumber,
DatePicker,
AutoComplete,
Divider,
Switch,
} from "antd"
import HeadShake from "react-reveal/HeadShake"
import "./index.less"
const allComponents = {
Input,
Button,
Checkbox,
Select,
Dropdown,
Slider,
InputNumber,
DatePicker,
AutoComplete,
Divider,
Switch,
}
export default class FormGenerator extends React.Component {
ref = React.createRef()
fieldsReferences = {}
unsetValues = {}
discardedValues = []
state = {
validating: false,
shakeItem: false,
failed: {},
}
ctx = {
clearErrors: () => {
this.setState({ failed: {} })
},
clearForm: () => {
this.ctx.clearErrors()
this.ctx.toogleValidation(false)
this.ref.current.resetFields()
},
finish: () => this.ref.current.submit(),
error: (id, error) => {
this.handleFormError(id, error)
},
shake: (id) => {
this.formItemShake(id)
},
toogleValidation: (to) => {
if (typeof to !== "undefined") {
return this.setState({ validating: to })
}
this.setState({ validating: !this.state.validating })
return this.state.validating
},
formRef: this.ref,
}
handleFinish(payload) {
if (typeof this.props.onFinish !== "function") {
console.error(`onFinish is not an function`)
return false
}
// try to read unset values
Object.keys(this.fieldsReferences).forEach((key) => {
const ref = this.fieldsReferences[key].current
if (typeof ref.state !== "undefined") {
this.unsetValues[key] = ref.state?.value || ref.state?.checked
}
})
// filter discarded values
try {
const keys = Object.keys(payload)
this.discardedValues.forEach((id) => {
if (keys.includes(id)) {
delete payload[id]
}
})
} catch (error) {
// terrible
}
// fulfil unset values
payload = { ...payload, ...this.unsetValues }
return this.props.onFinish(payload, this.ctx)
}
formItemShake(id) {
this.setState({ shakeItem: id })
setTimeout(() => {
this.setState({ shakeItem: false })
}, 50)
}
handleFormError(item, error) {
let fails = this.state.failed
fails[item] = error ?? true
this.setState({ failed: fails })
this.formItemShake(item)
}
handleFailChange(event) {
const itemID = event.target.id
if (itemID) {
let fails = this.state.failed
if (fails["all"]) {
fails["all"] = false
this.setState({ failed: fails })
}
if (fails[itemID]) {
// try deactivate failed statement
fails[itemID] = false
this.setState({ failed: fails })
}
}
}
shouldShakeItem(id) {
try {
const mutation = false
if (this.state.shakeItem === "all") {
return mutation
}
if (this.state.shakeItem == id) {
return mutation
}
} catch (error) {
// not returning
}
}
discardValueFromId = (id) => {
let ids = []
if (Array.isArray(id)) {
ids = id
} else {
ids.push(id)
}
ids.forEach((_id) => {
const value = this.discardedValues ?? []
value.push(_id)
this.discardedValues = value
})
}
renderValidationIcon() {
if (this.props.renderLoadingIcon && this.state.validating) {
return <Icons.LoadingOutlined spin style={{ margin: 0 }} />
}
return null
}
renderElementPrefix = (element) => {
if (element.icon) {
let renderIcon = null
const iconType = typeof element.icon
switch (iconType) {
case "string": {
if (typeof Icons[element.icon] !== "undefined") {
renderIcon = React.createElement(Icons[element.icon])
} else {
console.warn("provided icon is not available on icons libs")
}
break
}
case "object": {
renderIcon = element.icon
break
}
default: {
console.warn(`cannot mutate icon cause type (${iconType}) is not handled`)
break
}
}
if (renderIcon) {
// try to generate icon with props
return React.cloneElement(renderIcon, element.iconProps ? { ...element.iconProps } : null)
}
} else {
return element.prefix ?? null
}
}
renderItems(elements) {
if (Array.isArray(elements)) {
try {
return elements.map((field) => {
let { item, element } = field
// if item has no id, return an uncontrolled field
if (typeof field.id === "undefined") {
return React.createElement(allComponents[element.component], element.props)
}
// fulfill
if (typeof item === "undefined") {
item = {}
}
if (typeof element === "undefined") {
element = {}
}
// check if component is available on library
if (typeof allComponents[element.component] === "undefined") {
console.warn(`[${element.component}] is not an valid component`)
return null
}
// handle groups
if (typeof field.group !== "undefined") {
return (
<div style={{ display: "flex" }} key={field.id}>
{this.renderItems(field.group)}
</div>
)
}
//* RENDER
const failStatement = this.state.failed["all"] ?? this.state.failed[field.id]
const rules = item.rules
const hasFeedback = item.hasFeedback ?? false
let elementProps = {
disabled: this.state.validating,
...element.props,
}
let itemProps = {
...item.props,
}
switch (element.component) {
case "Checkbox": {
elementProps.onChange = (e) => {
this.unsetValues[field.id] = e.target.checked
elementProps.checked = e.target.checked
elementProps.value = e.target.checked
}
break
}
case "Button": {
this.discardValueFromId(field.id)
if (field.withValidation) {
elementProps.icon = this.state.validating ? (
<Icons.LoadingOutlined spin style={{ marginRight: "7px" }} />
) : null
}
break
}
case "Input": {
itemProps = {
...itemProps,
hasFeedback,
rules,
onChange: (e) => this.handleFailChange(e),
help: failStatement ? failStatement : null,
validateStatus: failStatement ? "error" : null,
}
elementProps = {
...elementProps,
id: field.id,
prefix: this.renderElementPrefix(element) ?? null,
placeholder: element.placeholder,
}
break
}
case "Select": {
if (typeof element.renderItem !== "undefined") {
elementProps.children = element.renderItem
}
if (typeof element.options !== "undefined" && !element.renderItem) {
if (!Array.isArray(element.options)) {
console.warn(
`Invalid options data type, expecting Array > received ${typeof element.options}`,
)
return null
}
elementProps.children = element.options.map((option) => {
return (
<Select.Option key={option.id ?? Math.random} value={option.value ?? option.id}>
{option.name ?? null}
</Select.Option>
)
})
}
itemProps = {
...itemProps,
hasFeedback,
rules,
validateStatus: failStatement ? "error" : null,
help: failStatement ? failStatement : null,
}
break
}
default: {
itemProps = {
...itemProps,
hasFeedback,
rules,
validateStatus: failStatement ? "error" : null,
help: failStatement ? failStatement : null,
}
break
}
}
// set reference
this.fieldsReferences[field.id] = elementProps.ref = React.createRef()
// return field
return (
<div className={field.className} style={field.style} key={field.id}>
{field.title ?? null}
<HeadShake spy={this.shouldShakeItem(field.id)}>
<Form.Item label={field.label} name={field.id} key={field.id} {...itemProps}>
{React.createElement(allComponents[element.component], elementProps)}
</Form.Item>
</HeadShake>
</div>
)
})
} catch (error) {
console.log(error)
return null
}
}
}
componentDidMount() {
if (!this.props.items) {
console.warn(`items not provided, nothing to render`)
return null
}
// handle discardedValues
if (Array.isArray(this.props.items)) {
this.props.items.forEach((item) => {
if (item.ignoreValue) {
this.discardValueFromId(item.id)
}
})
}
}
render() {
const helpStatus = this.state.failed["all"] ?? this.state.failed["result"]
const validateStatus = this.state.failed["all"] || this.state.failed["result"] ? "error" : null
if (!this.props.items) {
console.warn(`Nothing to render`)
return null
}
return <div
key={this.props.id}
id={this.props.id}
className="formWrapper"
>
<Form
hideRequiredMark={this.props.hideRequiredMark ?? false}
name={this.props.name ?? "new_form"}
onFinish={(e) => this.handleFinish(e)}
ref={this.ref}
{...this.props.formProps}
>
{this.renderItems(this.props.items)}
<Form.Item key="result" help={helpStatus} validateStatus={validateStatus} />
</Form>
{this.renderValidationIcon()}
</div>
}
}

View File

@ -0,0 +1,5 @@
.formWrapper {
svg {
margin: 0;
}
}

View File

@ -0,0 +1,29 @@
import React from "react"
// import icons lib
import * as lib1 from "feather-reactjs"
import * as lib2 from "react-icons/md"
import * as lib3 from "@ant-design/icons"
const marginedStyle = { width: "1em", height: "1em", marginRight: "10px", verticalAlign: "-0.125em" }
const customs = {
verifiedBadge: () => <svg style={marginedStyle} xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24"> <path d="M23 12l-2.44-2.78.34-3.68-3.61-.82-1.89-3.18L12 3 8.6 1.54 6.71 4.72l-3.61.81.34 3.68L1 12l2.44 2.78-.34 3.69 3.61.82 1.89 3.18L12 21l3.4 1.46 1.89-3.18 3.61-.82-.34-3.68L23 12m-13 5l-4-4 1.41-1.41L10 14.17l6.59-6.59L18 9l-8 8z"></path></svg>,
}
export const Icons = {
...customs,
...lib1,
...lib2,
...lib3,
}
export function createIconRender(icon, props) {
if (typeof Icons[icon] !== "undefined") {
return React.createElement(Icons[icon], props)
}
return null
}
export default Icons

View File

@ -0,0 +1,6 @@
import React from "react"
import { LazyLoadImage } from "react-lazy-load-image-component"
import "react-lazy-load-image-component/src/effects/blur.css"
export default (props) => <LazyLoadImage {...props} effect="blur" />

View File

@ -0,0 +1,172 @@
import React from "react"
import { DraggableDrawer } from "components"
import EventEmitter from "@foxify/events"
import "./index.less"
export default class DrawerController extends React.Component {
constructor(props) {
super(props)
this.state = {
addresses: {},
refs: {},
drawers: [],
}
this.DrawerController = {
open: this.open,
close: this.close,
closeAll: this.closeAll,
}
window.app["DrawerController"] = this.DrawerController
}
sendEvent = (id, ...context) => {
const ref = this.state.refs[id]?.current
return ref.events.emit(...context)
}
open = (id, component, options) => {
const refs = this.state.refs ?? {}
const drawers = this.state.drawers ?? []
const addresses = this.state.addresses ?? {}
const instance = {
id,
key: id,
ref: React.createRef(),
children: component,
options,
controller: this,
}
if (typeof addresses[id] === "undefined") {
drawers.push(<Drawer {...instance} />)
addresses[id] = drawers.length - 1
refs[id] = instance.ref
} else {
const ref = refs[id].current
const isLocked = ref.state.locked
if (!isLocked) {
drawers[addresses[id]] = <Drawer {...instance} />
refs[id] = instance.ref
} else {
console.warn("Cannot update an locked drawer.")
}
}
this.setState({ refs, addresses, drawers })
}
destroy = (id) => {
let { addresses, drawers, refs } = this.state
const index = addresses[id]
if (typeof drawers[index] !== "undefined") {
drawers = drawers.filter((value, i) => i !== index)
}
delete addresses[id]
delete refs[id]
this.setState({ addresses, drawers })
}
close = (id) => {
const ref = this.state.refs[id]?.current
if (typeof ref !== "undefined") {
if (ref.state.locked && ref.state.visible) {
return console.warn("This drawer is locked and cannot be closed")
} else {
return ref.close()
}
} else {
return console.warn("This drawer not exists")
}
}
closeAll = () => {
this.state.drawers.forEach((drawer) => {
drawer.ref.current.close()
})
}
render() {
return this.state.drawers
}
}
export class Drawer extends React.Component {
options = this.props.options ?? {}
events = new EventEmitter()
state = {
visible: true,
}
componentDidMount = async () => {
if (typeof this.props.controller === "undefined") {
throw new Error(`Cannot mount an drawer without an controller`)
}
if (typeof this.props.children === "undefined") {
throw new Error(`Empty component`)
}
}
toogleVisibility = (to) => {
this.setState({ visible: to ?? !this.state.visible })
}
close = () => {
this.toogleVisibility(false)
this.events.emit("beforeClose")
setTimeout(() => {
if (typeof this.options.onClose === "function") {
this.options.onClose()
}
this.props.controller.destroy(this.props.id)
}, 500)
}
sendEvent = (...context) => {
return this.props.controller.sendEvent(this.props.id, ...context)
}
handleDone = (...context) => {
if (typeof this.options.onDone === "function") {
this.options.onDone(this, ...context)
}
}
handleFail = (...context) => {
if (typeof this.options.onFail === "function") {
this.options.onFail(this, ...context)
}
}
render() {
const drawerProps = {
...this.options.props,
ref: this.props.ref,
key: this.props.id,
onRequestClose: this.close,
open: this.state.visible,
containerElementClass: "drawer",
modalElementClass: "body",
}
const componentProps = {
...this.options.componentProps,
events: this.events,
close: this.close,
handleDone: this.handleDone,
handleFail: this.handleFail,
}
return <DraggableDrawer {...drawerProps}>
{React.createElement(this.props.children, componentProps)}
</DraggableDrawer>
}
}

View File

@ -0,0 +1,26 @@
.drawer {
.body {
position: absolute;
top: 50px;
padding: 30px 10px 10px 10px;
background-color: var(--background-color-primary);
width: 100%;
max-width: 700px;
min-height: 100%;
border-top-left-radius: 8px;
border-top-right-radius: 8px;
}
.body::before{
content: "";
background-color: var(--background-color-contrast);
width: 100px;
height: 8px;
position: absolute;
top: 10px;
left: 50%;
transform: translateX(-50%);
border-radius: 8px;
}
}

View File

@ -0,0 +1,49 @@
import React from "react"
import * as antd from "antd"
import { Icons } from "components/Icons"
import { AppSearcher } from "components"
import classnames from "classnames"
import "./index.less"
export default class Header extends React.Component {
controller = window.app["HeaderController"] = {
toggleVisibility: (to) => {
if (window.isMobile) {
to = true
}
this.setState({ visible: to ?? !this.state.visible })
},
isVisible: () => this.state.visible,
}
state = {
visible: false, // set by default to create an animation
}
componentDidMount = async () => {
setTimeout(() => {
this.controller.toggleVisibility(true)
}, 100)
}
render() {
return (
<antd.Layout.Header className={classnames(`app_header`, { ["hidden"]: !window.isMobile && !this.state.visible })}>
<div>
<antd.Button
onClick={window.app.openCreateNew}
type="primary"
shape="circle"
icon={<Icons.Plus style={{ margin: 0 }} />}
/>
</div>
{!window.isMobile &&
<div>
<AppSearcher />
</div>}
</antd.Layout.Header>
)
}
}

View File

@ -0,0 +1,32 @@
@import "theme/index.less";
.app_header {
user-select: none;
--webkit-user-select: none;
display: flex;
flex-direction: row;
align-items: center;
z-index: 100;
height: @app_header_height !important;
padding: 10px;
transition: all ease-in-out 150ms;
background-color: transparent;
background: transparent !important;
border-bottom: 1px var(--border-color) solid;
>div {
margin-right: 16px;
}
&.hidden {
opacity: 0;
height: 0 !important;
padding: 0 !important;
border: 0 !important;
}
}

View File

@ -0,0 +1,5 @@
export { default as Header } from "./header"
export { default as Drawer } from "./drawer"
export { default as Sidebar } from "./sidebar"
export { default as Sidedrawer } from "./sidedrawer"
export { default as Modal } from "./modal"

View File

@ -0,0 +1,74 @@
import React from "react"
import { Modal, Button } from "antd"
import { Icons } from "components/Icons"
import "./index.less"
export default class AppModal extends React.Component {
constructor(props) {
super(props)
this.controller = app.ModalController = {
open: this.open,
close: this.close,
modalRef: this.modalRef,
}
}
state = {
currentRender: null,
renderParams: {}
}
modalRef = React.createRef()
open = (render, params = {}) => {
this.setState({
currentRender: render,
renderParams: params
})
}
close = () => {
this.setState({
currentRender: null,
renderParams: {}
})
}
handleModalClose = () => {
this.close()
}
renderModal = () => {
return <div className="appModalWrapper">
<Button
icon={<Icons.X />}
className="closeButton"
onClick={this.handleModalClose}
shape="circle"
/>
<div className="appModal" ref={this.modalRef}>
{React.createElement(this.state.currentRender, {
...this.state.renderParams.props ?? {},
close: this.close,
})}
</div>
</div>
}
render() {
return <Modal
open={this.state.currentRender}
maskClosable={this.state.renderParams.maskClosable ?? true}
modalRender={this.renderModal}
maskStyle={{
backgroundColor: "rgba(0, 0, 0, 0.7)",
backdropFilter: "blur(5px)"
}}
destroyOnClose
centered
/>
}
}

View File

@ -0,0 +1,43 @@
.appModalWrapper {
.closeButton {
background-color: var(--background-color-primary);
pointer-events: all;
font-size: 1.2rem;
transform: translate(-25px, -10px);
svg {
margin: 0 !important;
color: var(--text-color);
}
&:hover {
background-color: var(--background-color-primary);
}
}
.appModal {
pointer-events: all;
display: flex;
flex-direction: column;
align-self: center;
border-radius: 8px;
width: fit-content;
height: fit-content;
min-height: 500px;
min-width: 600px;
padding: 30px;
background-color: var(--background-color-accent);
color: var(--text-color);
}
}

View File

@ -0,0 +1,266 @@
import React from "react"
import { Button } from "antd"
import { DragDropContext, Droppable, Draggable } from "react-beautiful-dnd"
import { ActionsBar } from "components"
import { Icons, createIconRender } from "components/Icons"
import sidebarItems from "schemas/routes.json"
import { sidebarKeys as defaultSidebarKeys } from "schemas/defaultSettings"
import Selector from "../selector"
import "./index.less"
const allItemsMap = [...sidebarItems].map((item, index) => {
item.key = index.toString()
item.index = index
return item
})
const getAllItems = () => {
let items = {}
allItemsMap.forEach((item) => {
items[item.id] = {
...item,
content: (
<>
{createIconRender(item.icon)} {item.title}
</>
),
}
})
return items
}
const allItems = getAllItems()
export default class SidebarEditor extends React.Component {
state = {
items: [],
lockedIndex: [],
}
componentDidMount() {
this.loadItems()
}
loadItems = () => {
const storagedKeys = window.app.settings.get("sidebarKeys") ?? defaultSidebarKeys
const active = []
const lockedIndex = []
// set current active items
storagedKeys.forEach((key) => {
if (typeof allItems[key] !== "undefined") {
if (allItems[key].locked) {
lockedIndex.push(allItems[key].index)
}
active.push(key)
}
})
this.setState({ items: active, lockedIndex })
}
onSave = () => {
window.app.settings.set("sidebarKeys", this.state.items)
window.app.SidebarController.toggleEdit(false)
}
onDiscard = () => {
window.app.SidebarController.toggleEdit(false)
}
onSetDefaults = () => {
window.app.settings.set("sidebarKeys", defaultSidebarKeys)
this.loadItems()
}
reorder = (list, startIndex, endIndex) => {
const result = Array.from(list)
const [removed] = result.splice(startIndex, 1)
result.splice(endIndex, 0, removed)
return result
}
onDragEnd = (result) => {
if (!result.destination) {
return false
}
if (this.state.lockedIndex.includes(result.destination.index)) {
return false
}
if (allItems[result.draggableId].locked) {
console.warn("Cannot move an locked item")
return false
}
const items = this.reorder(this.state.items, result.source.index, result.destination.index)
this.setState({ items })
}
deleteItem = (key) => {
// check if item is locked
if (allItems[key].locked) {
console.warn("Cannot delete an locked item")
return false
}
this.setState({ items: this.state.items.filter((item) => item !== key) })
}
addItem = () => {
const keys = []
// filter by active keys
allItemsMap.forEach((item) => {
if (!this.state.items.includes(item.id)) {
keys.push(item.id)
}
})
window.app.DrawerController.open("sidebar_item_selector", Selector, {
props: {
width: "65%",
},
componentProps: {
items: keys
},
onDone: (drawer, selectedKeys) => {
drawer.close()
if (Array.isArray(selectedKeys)) {
const update = this.state.items ?? []
selectedKeys.forEach((key) => {
if (update.includes(key)) {
return false
}
update.push(key)
})
this.setState({ items: update })
}
},
})
}
render() {
const grid = 6
const getItemStyle = (isDragging, draggableStyle, component, isDraggingOver) => ({
cursor: component.locked ? "not-allowed" : "grab",
userSelect: "none",
padding: grid * 2,
margin: `0 0 ${grid}px 0`,
borderRadius: "6px",
transition: "150ms all ease-in-out",
width: "100%",
border: isDraggingOver ? "2px dashed #e0e0e0" : "none",
color: component.locked ? "rgba(145,145,145,0.6)" : "#000",
background: component.locked
? "rgba(145, 145, 145, 0.2)"
: isDragging
? "rgba(145, 145, 145, 0.5)"
: "transparent",
...draggableStyle,
})
const getListStyle = (isDraggingOver) => ({
background: "transparent",
transition: "150ms all ease-in-out",
padding: grid,
width: "100%",
})
return (
<div>
<DragDropContext onDragEnd={this.onDragEnd}>
<Droppable droppableId="droppable">
{(droppableProvided, droppableSnapshot) => (
<div
ref={droppableProvided.innerRef}
style={getListStyle(droppableSnapshot.isDraggingOver)}
>
{this.state.items.map((key, index) => {
const itemComponent = allItems[key]
return (
<Draggable
isDragDisabled={itemComponent.locked}
key={key}
draggableId={key}
index={index}
>
{(draggableProvided, draggableSnapshot) => (
<div
ref={draggableProvided.innerRef}
{...draggableProvided.draggableProps}
{...draggableProvided.dragHandleProps}
style={getItemStyle(
draggableSnapshot.isDragging,
draggableProvided.draggableProps.style,
itemComponent,
droppableSnapshot.isDraggingOver,
)}
>
{!allItems[key].locked &&
<Icons.Trash
onClick={() => this.deleteItem(key)}
className="sidebar_editor_deleteBtn"
/>
}
{itemComponent.icon && createIconRender(itemComponent.icon)}
{itemComponent.title ?? itemComponent.id}
</div>
)}
</Draggable>
)
})}
{droppableProvided.placeholder}
</div>
)}
</Droppable>
</DragDropContext>
<ActionsBar
style={{ position: "absolute", bottom: 0, left: 0, width: "100%", borderRadius: "12px 12px 0 0" }}
>
<div>
<Button
style={{ lineHeight: 0 }}
icon={<Icons.Plus style={{ margin: 0, padding: 0 }} />}
onClick={this.addItem}
/>
</div>
<div>
<Button
style={{ lineHeight: 0 }}
icon={<Icons.Check />}
type="primary"
onClick={this.onSave}
>
Done
</Button>
</div>
<div>
<Button onClick={this.onDiscard} icon={<Icons.XCircle />} >Cancel</Button>
</div>
<div>
<Button type="link" onClick={this.onSetDefaults}>Set defaults</Button>
</div>
</ActionsBar>
</div>
)
}
}

View File

@ -0,0 +1,14 @@
.app_sidebar_sider_edit .ant-layout-sider-children{
margin-top: 15px!important;
.app_sidebar_menu_wrapper {
opacity: 0;
height: 0;
overflow: hidden;
}
}
.sidebar_editor_deleteBtn:hover{
color: red;
cursor: pointer;
}

View File

@ -0,0 +1 @@
export { default as SidebarEditor } from './editor';

View File

@ -0,0 +1,76 @@
import React from "react"
import { Icons, createIconRender } from "components/Icons"
import { SelectableList } from "components"
import { List } from "antd"
import sidebarItems from "schemas/routes.json"
import "./index.less"
const getStoragedKeys = () => {
return window.app.settings.get("sidebarKeys") ?? []
}
const getAllItems = () => {
const obj = {}
sidebarItems.forEach((item) => {
obj[item.id] = item
})
return obj
}
const allItems = getAllItems()
export default class SidebarItemSelector extends React.Component {
state = {
items: null,
}
componentDidMount = () => {
const source = (this.props.items ?? getStoragedKeys() ?? []).map((key) => {
return { key }
})
this.setState({ items: source })
}
handleDone = (selectedKeys) => {
if (typeof this.props.onDone === "function") {
this.props.onDone(selectedKeys)
}
}
render() {
return (
<div>
<h1>
<Icons.PlusCircle /> Select items to add
</h1>
{this.state.items && (
<SelectableList
itemLayout="vertical"
size="large"
pagination={{
pageSize: 10,
}}
onDone={this.handleDone}
items={this.state.items ?? []}
itemClassName="sidebar_selector_item"
renderItem={(i) => {
const item = allItems[i.key]
return (
<List.Item key={item.title} className="sidebar_selector_item">
{createIconRender(item.icon)}
{item.title ?? item.id}
</List.Item>
)
}}
/>
)}
</div>
)
}
}

View File

@ -0,0 +1,4 @@
.sidebar_selector_item{
height: fit-content;
padding: 0;
}

View File

@ -0,0 +1,381 @@
import React from "react"
import { Layout, Menu, Avatar } from "antd"
import classnames from "classnames"
import config from "config"
import { Icons, createIconRender } from "components/Icons"
import { sidebarKeys as defaultSidebarItems } from "schemas/defaultSettings"
import sidebarItems from "schemas/routes.json"
import { Translation } from "react-i18next"
import { SidebarEditor } from "./components"
import "./index.less"
const { Sider } = Layout
const onClickHandlers = {
settings: (event) => {
window.app.openSettings()
},
}
export default class Sidebar extends React.Component {
constructor(props) {
super(props)
this.controller = window.app["SidebarController"] = {
toggleVisibility: this.toggleVisibility,
toggleEdit: this.toggleEditMode,
toggleElevation: this.toggleElevation,
attachElement: this.attachElement,
isVisible: () => this.state.visible,
isEditMode: () => this.state.visible,
isCollapsed: () => this.state.collapsed,
}
this.state = {
editMode: false,
visible: false,
loading: true,
collapsed: window.app.settings.get("collapseOnLooseFocus") ?? false,
pathResolve: {},
menus: {},
extraItems: {
bottom: [],
top: [],
},
elevated: false,
additionalElements: [],
}
window.app.eventBus.on("edit_sidebar", () => this.toggleEditMode())
window.app.eventBus.on("settingChanged.sidebar_collapse", (value) => {
this.toggleCollapse(value)
})
// handle sidedrawer open/close
window.app.eventBus.on("sidedrawer.hasDrawers", () => {
this.toggleElevation(true)
})
window.app.eventBus.on("sidedrawer.noDrawers", () => {
this.toggleElevation(false)
})
}
collapseDebounce = null
componentDidMount = async () => {
await this.loadSidebarItems()
setTimeout(() => {
this.controller.toggleVisibility(true)
}, 100)
}
getStoragedKeys = () => {
return window.app.settings.get("sidebarKeys")
}
attachElement = (element) => {
this.setState({
additionalElements: [...this.state.additionalElements, element],
})
}
appendItem = (item = {}) => {
const { position } = item
if (typeof position === "undefined" && typeof this.state.extraItems[position] === "undefined") {
console.error("Invalid position")
return false
}
const state = this.state.extraItems
state[position].push(item)
this.setState({ extraItems: state })
}
loadSidebarItems = () => {
const items = {}
const itemsMap = []
// parse all items from schema
sidebarItems.forEach((item, index) => {
items[item.id] = {
...item,
index,
content: (
<>
{createIconRender(item.icon)} {item.title}
</>
),
}
})
// filter undefined to avoid error
let keys = (this.getStoragedKeys() ?? defaultSidebarItems).filter((key) => {
if (typeof items[key] !== "undefined") {
return true
}
})
// short items
keys.forEach((id, index) => {
const item = items[id]
if (item.locked) {
if (item.index !== index) {
keys = keys.move(index, item.index)
//update index
window.app.settings.set("sidebarKeys", keys)
}
}
})
// set items from scoped keys
keys.forEach((key, index) => {
const item = items[key]
try {
// avoid if item is duplicated
if (itemsMap.includes(item)) {
return false
}
let valid = true
if (typeof item.requireState === "object") {
const { key, value } = item.requireState
//* TODO: check global state
}
// end validation
if (!valid) {
return false
}
if (typeof item.path !== "undefined") {
let resolvers = this.state.pathResolve ?? {}
resolvers[item.id] = item.path
this.setState({ pathResolve: resolvers })
}
itemsMap.push(item)
} catch (error) {
return console.log(error)
}
})
// update states
this.setState({ items, menus: itemsMap, loading: false })
}
renderMenuItems(items) {
const handleRenderIcon = (icon) => {
if (typeof icon === "undefined") {
return null
}
return createIconRender(icon)
}
return items.map((item) => {
if (Array.isArray(item.children)) {
return (
<Menu.SubMenu
key={item.id}
icon={handleRenderIcon(item.icon)}
title={<span>
<Translation>
{t => t(item.title)}
</Translation>
</span>}
{...item.props}
>
{this.renderMenuItems(item.children)}
</Menu.SubMenu>
)
}
return (
<Menu.Item key={item.id} icon={handleRenderIcon(item.icon)} {...item.props}>
<Translation>
{t => t(item.title ?? item.id)}
</Translation>
</Menu.Item>
)
})
}
handleClick = (e) => {
if (e.item.props.overrideEvent) {
return app.eventBus.emit(e.item.props.overrideEvent, e.item.props.overrideEventProps)
}
if (typeof e.key === "undefined") {
window.app.eventBus.emit("invalidSidebarKey", e)
return false
}
if (typeof onClickHandlers[e.key] === "function") {
return onClickHandlers[e.key](e)
}
if (typeof this.state.pathResolve[e.key] !== "undefined") {
return window.app.setLocation(`/${this.state.pathResolve[e.key]}`, 150)
}
return window.app.setLocation(`/${e.key}`, 150)
}
toggleEditMode = (to) => {
if (typeof to === "undefined") {
to = !this.state.editMode
}
if (to) {
window.app.eventBus.emit("clearAllOverlays")
} else {
if (this.itemsMap !== this.getStoragedKeys()) {
this.loadSidebarItems()
}
}
this.setState({ editMode: to, collapsed: false })
}
toggleCollapse = (to) => {
if (!this.state.editMode) {
this.setState({ collapsed: to ?? !this.state.collapsed })
}
}
toggleVisibility = (to) => {
this.setState({ visible: to ?? !this.state.visible })
}
toggleElevation = (to) => {
this.setState({ elevated: to ?? !this.state.elevated })
}
onMouseEnter = () => {
if (window.app.settings.is("collapseOnLooseFocus", false)) {
return false
}
clearTimeout(this.collapseDebounce)
this.collapseDebounce = null
if (this.state.collapsed) {
this.toggleCollapse(false)
}
}
handleMouseLeave = () => {
if (window.app.settings.is("collapseOnLooseFocus", false)) {
return false
}
if (!this.state.collapsed) {
this.collapseDebounce = setTimeout(() => { this.toggleCollapse(true) }, window.app.settings.get("autoCollapseDelay") ?? 500)
}
}
renderExtraItems = (position) => {
return this.state.extraItems[position].map((item = {}) => {
if (typeof item.icon !== "undefined") {
if (typeof item.props !== "object") {
item.props = Object()
}
item.props["icon"] = createIconRender(item.icon)
}
return <Menu.Item key={item.id} {...item.props}>{item.children}</Menu.Item>
})
}
render() {
if (this.state.loading) return null
const { user } = this.props
return (
<Sider
onMouseEnter={this.onMouseEnter}
onMouseLeave={this.handleMouseLeave}
theme={this.props.theme}
width={this.state.editMode ? 400 : 200}
collapsed={this.state.editMode ? false : this.state.collapsed}
onCollapse={() => this.props.onCollapse()}
className={
classnames(
"sidebar",
{
["edit_mode"]: this.state.editMode,
["hidden"]: !this.state.visible,
["elevated"]: this.state.elevated
}
)
}
>
<div className="app_sidebar_header">
<div className={classnames("app_sidebar_header_logo", { ["collapsed"]: this.state.collapsed })}>
<img src={this.state.collapsed ? config.logo?.alt : config.logo?.full} />
</div>
</div>
{this.state.editMode && (
<div style={{ height: "100%" }}>
<SidebarEditor />
</div>
)}
{!this.state.editMode && (
<div key="menu" className="app_sidebar_menu">
<Menu selectable={true} mode="inline" theme={this.props.theme} onClick={this.handleClick}>
{this.renderMenuItems(this.state.menus)}
{this.renderExtraItems("top")}
</Menu>
</div>
)}
{!this.state.editMode && <div key="additionalElements" className="additionalElements">
{this.state.additionalElements}
</div>}
{!this.state.editMode && (
<div key="bottom" className="app_sidebar_bottom">
<Menu selectable={false} mode="inline" theme={this.props.theme} onClick={this.handleClick}>
<Menu.Item key="create" icon={<Icons.PlusCircle />} overrideEvent="app.openCreator" >
<Translation>
{(t) => t("Create")}
</Translation>
</Menu.Item>
<Menu.Item key="notifications" icon={<Icons.Bell />}>
<Translation>
{t => t("Notifications")}
</Translation>
</Menu.Item>
<Menu.Item key="settings" icon={<Icons.Settings />}>
<Translation>
{t => t("Settings")}
</Translation>
</Menu.Item>
<Menu.Item key="account">
<div className="user_avatar">
<Avatar shape="square" src={user?.avatar} />
</div>
</Menu.Item>
{this.renderExtraItems("bottom")}
</Menu>
</div>
)}
</Sider>
)
}
}

View File

@ -0,0 +1,160 @@
@import "theme/vars.less";
// SIDEBAR
.ant-layout-sider {
z-index: 50;
background: var(--sidebar-background-color) !important;
background-color: var(--sidebar-background-color) !important;
border-radius: 0 @app_sidebar_borderRadius @app_sidebar_borderRadius 0;
overflow: hidden;
border: 1px solid var(--sidebar-background-color);
transition: all 150ms ease-in-out;
&.hidden {
flex: 0 !important;
min-width: 0 !important;
background-color: transparent !important;
width: 0 !important;
}
&.elevated {
box-shadow: 0 0 5px 4px rgba(0, 0, 0, 0.1) !important;
}
}
.ant-menu-item {
color: var(--background-color-contrast);
h1,
h2,
h3,
h4,
h5,
h6,
span,
p {
color: var(--background-color-contrast);
}
}
.ant-menu,
.ant-menu ul {
background: transparent !important;
background-color: transparent !important;
border-right: 0 !important;
}
.sidebar .ant-layout-sider-children {
margin-top: 15px !important;
margin-bottom: 15px !important;
background: transparent !important;
background-color: transparent !important;
user-select: none;
--webkit-user-select: none;
transition: all 150ms ease-in-out;
height: 100%;
display: flex;
flex-direction: column;
&.edit_mode .ant-layout-sider-children {
background: transparent !important;
background-color: transparent !important;
margin-top: 15px !important;
.app_sidebar_menu_wrapper {
opacity: 0;
height: 0;
overflow: hidden;
}
}
}
.app_sidebar_menu_wrapper {
transition: all 450ms ease-in-out;
height: 100%;
width: 100%;
}
.app_sidebar_header {
background: transparent !important;
background-color: transparent !important;
user-select: none;
--webkit-user-select: none;
display: flex;
flex-direction: column;
height: 15%;
margin-top: 5%;
margin-bottom: 5%;
}
.app_sidebar_header_logo {
user-select: none;
--webkit-user-select: none;
display: flex;
align-items: center;
justify-content: center;
img {
user-select: none;
--webkit-user-select: none;
width: 80%;
max-height: 80px;
}
&.collapsed {
img {
max-width: 40px;
}
}
}
.app_sidebar_menu {
background: transparent !important;
background-color: transparent !important;
height: 65%;
overflow: overlay;
overflow-x: hidden;
}
.app_sidebar_bottom {
position: absolute;
bottom: 0;
padding-bottom: 30px;
z-index: 50;
left: 0;
background: transparent !important;
background-color: transparent !important;
backdrop-filter: blur(10px);
--webkit-backdrop-filter: blur(10px);
width: 100%;
height: fit-content;
.ant-menu,
ul {
background: transparent !important;
background-color: transparent !important;
}
}
.user_avatar {
display: flex;
align-items: center;
justify-content: center;
padding: 0 !important;
}

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