Porównaj commity
425 Commity
Autor | SHA1 | Data |
---|---|---|
![]() |
22e3be13cb | |
![]() |
97f9c10872 | |
![]() |
053af951bc | |
![]() |
e0fbc804cc | |
![]() |
6a9028afe0 | |
![]() |
2289637543 | |
![]() |
8766852c9d | |
![]() |
75cd8bb25a | |
![]() |
7050e7b735 | |
![]() |
f42eb8fd28 | |
![]() |
15d59f96ea | |
![]() |
6889c46fc0 | |
![]() |
2522f3f05c | |
![]() |
0e20ff2f98 | |
![]() |
f23e7be502 | |
![]() |
95ec910c99 | |
![]() |
b6e75774b9 | |
![]() |
90ad7818f4 | |
![]() |
0276c2e06a | |
![]() |
8926e8ad80 | |
![]() |
80cbbdf631 | |
![]() |
79a2e068a0 | |
![]() |
8a347f3afd | |
![]() |
7e56a3dc86 | |
![]() |
5508847693 | |
![]() |
5f2ebeaa43 | |
![]() |
34a1e3964c | |
![]() |
5c4f23ac75 | |
![]() |
7f6fd11715 | |
![]() |
e87bd47439 | |
![]() |
8624ca560f | |
![]() |
222b6b9809 | |
![]() |
999b0ded7b | |
![]() |
89f4d7d423 | |
![]() |
d59b6d0ea5 | |
![]() |
df1115891d | |
![]() |
e1b24eeb11 | |
![]() |
1d77003d08 | |
![]() |
6c9209ce61 | |
![]() |
f600741d1f | |
![]() |
b9aa91c130 | |
![]() |
b1fa9f1f94 | |
![]() |
115ba5503a | |
![]() |
c734b16252 | |
![]() |
dfff64b98c | |
![]() |
4bc6b568df | |
![]() |
ababef902c | |
![]() |
6a83649c98 | |
![]() |
712e0c08c5 | |
![]() |
2d9a99ead3 | |
![]() |
2c99b76e41 | |
![]() |
e2d0ec34a6 | |
![]() |
3a5809d73d | |
![]() |
379b67569b | |
![]() |
7d774079ef | |
![]() |
de4f1ad1dd | |
![]() |
1b545b7750 | |
![]() |
3aed3ee81c | |
![]() |
608e336141 | |
![]() |
85dab0ce6a | |
![]() |
d99d7bf48c | |
![]() |
4616f38bda | |
![]() |
65f560b110 | |
![]() |
2dbce769f0 | |
![]() |
42f51bd72a | |
![]() |
4e296ec9dc | |
![]() |
5c3a948907 | |
![]() |
8f2450f79b | |
![]() |
4718d82610 | |
![]() |
6ccd307c6e | |
![]() |
ff0a65943e | |
![]() |
0efe348b1d | |
![]() |
9321998193 | |
![]() |
e6bee33825 | |
![]() |
250e0b0ec0 | |
![]() |
73ccc91136 | |
![]() |
627df5c0ed | |
![]() |
145326f783 | |
![]() |
77b565e1b2 | |
![]() |
76f0369816 | |
![]() |
e7bc57fea7 | |
![]() |
683de3ca4b | |
![]() |
b95443bb90 | |
![]() |
279a0ca275 | |
![]() |
eabecbd5fa | |
![]() |
9badcc11f1 | |
![]() |
f8ceb4c460 | |
![]() |
16d55bb4f9 | |
![]() |
6634889224 | |
![]() |
d20db0faa6 | |
![]() |
af0922ce77 | |
![]() |
efec20c9c4 | |
![]() |
d4e7d4fb98 | |
![]() |
d953ceb87f | |
![]() |
43d670445a | |
![]() |
3626ca6258 | |
![]() |
013d476497 | |
![]() |
60cf9ceb7c | |
![]() |
9645dfb8b3 | |
![]() |
69041eccd5 | |
![]() |
a26c0d2d02 | |
![]() |
ddc8ac999a | |
![]() |
3ae11ff11d | |
![]() |
348e5d1a05 | |
![]() |
d598921006 | |
![]() |
be17b4f2b1 | |
![]() |
411dc65573 | |
![]() |
c95fe569dc | |
![]() |
847d102ccd | |
![]() |
feb4a190d8 | |
![]() |
d4553d9a2b | |
![]() |
5fdf6b8e10 | |
![]() |
dd8d12ee93 | |
![]() |
7897b103b0 | |
![]() |
92edc61702 | |
![]() |
e8895def61 | |
![]() |
075c02fec0 | |
![]() |
2d1f136e32 | |
![]() |
1895733271 | |
![]() |
7888ab570a | |
![]() |
bfb30e4692 | |
![]() |
4d2b765e89 | |
![]() |
d9beb0a657 | |
![]() |
318b08a189 | |
![]() |
0820562ffe | |
![]() |
4b53bd2328 | |
![]() |
c6b1f19b98 | |
![]() |
5b02bebf91 | |
![]() |
4c130e1c8d | |
![]() |
c49b105dfa | |
![]() |
67336af3ef | |
![]() |
35c0947fd1 | |
![]() |
0af4ea7c7f | |
![]() |
ef86ed4fc5 | |
![]() |
17d877da37 | |
![]() |
06524ab364 | |
![]() |
ffe1f53dc4 | |
![]() |
e746f92989 | |
![]() |
886e8ccb19 | |
![]() |
b418357700 | |
![]() |
89c45189a6 | |
![]() |
db1f1bdafb | |
![]() |
8cf600ea10 | |
![]() |
63164a8744 | |
![]() |
fa1179db58 | |
![]() |
f03474f2e1 | |
![]() |
753d28f437 | |
![]() |
dbf1813adf | |
![]() |
37e680ba0e | |
![]() |
1fab1087ca | |
![]() |
880e37c3bc | |
![]() |
472b74a9f9 | |
![]() |
e56b55104e | |
![]() |
9a086c5103 | |
![]() |
4c7b58ccd9 | |
![]() |
323ee20f3e | |
![]() |
a933f477de | |
![]() |
bdbf7d9844 | |
![]() |
c7934d7764 | |
![]() |
ed042a2cbc | |
![]() |
193fd81fe6 | |
![]() |
23ae56febd | |
![]() |
38aea8bd54 | |
![]() |
21e1c9e6f5 | |
![]() |
fc33786629 | |
![]() |
2321f231bf | |
![]() |
c8bf3de1f7 | |
![]() |
6f5966c12f | |
![]() |
9307658da3 | |
![]() |
d2d4432c93 | |
![]() |
40ff29ba61 | |
![]() |
73e3ce7f32 | |
![]() |
581512637e | |
![]() |
a70e78b1cb | |
![]() |
f91299fcc7 | |
![]() |
989bd1edd9 | |
![]() |
9239c4d94e | |
![]() |
2d199bf9c5 | |
![]() |
5de973252a | |
![]() |
bf53f3a052 | |
![]() |
db33da9d56 | |
![]() |
b41091cc64 | |
![]() |
85e492a720 | |
![]() |
c5b7025b9c | |
![]() |
21113d5003 | |
![]() |
4cb6859b24 | |
![]() |
8e2c3e8117 | |
![]() |
24cddb94d0 | |
![]() |
35f694d7b0 | |
![]() |
d2fb6a7e47 | |
![]() |
4f5935fc12 | |
![]() |
158e296235 | |
![]() |
8669587ae6 | |
![]() |
d47f7e8dd6 | |
![]() |
4c8eb02408 | |
![]() |
b53f3b541d | |
![]() |
bd90cb739a | |
![]() |
9df0580ecb | |
![]() |
29b2a3eb44 | |
![]() |
2eb92a2144 | |
![]() |
71096aaa58 | |
![]() |
a4a1f53e27 | |
![]() |
3ed84f62f6 | |
![]() |
4d58ede540 | |
![]() |
6cda68136a | |
![]() |
a1b104dc4c | |
![]() |
e6ad94f56d | |
![]() |
2ead60e1ac | |
![]() |
c2ef9bcc0b | |
![]() |
16480459de | |
![]() |
44e432a495 | |
![]() |
c63fcd09be | |
![]() |
300878524e | |
![]() |
f0625f5539 | |
![]() |
f2bb2d66a4 | |
![]() |
153709a1e0 | |
![]() |
146277f48c | |
![]() |
2cd3980b26 | |
![]() |
ff679cfcb1 | |
![]() |
aed03fe157 | |
![]() |
12f6ad5957 | |
![]() |
eb38cf87de | |
![]() |
0de9849e13 | |
![]() |
28861bfe9a | |
![]() |
df7def4bf8 | |
![]() |
37c11ad81f | |
![]() |
17e395b345 | |
![]() |
0ae4a47c65 | |
![]() |
4587d3273e | |
![]() |
478a2b1101 | |
![]() |
8a5f988318 | |
![]() |
55cf4b698e | |
![]() |
52a912617c | |
![]() |
8e417dd312 | |
![]() |
d82e91ab24 | |
![]() |
c5efcb503f | |
![]() |
b5d44100d8 | |
![]() |
60ed0d9193 | |
![]() |
a79eb9470f | |
![]() |
4e769c310f | |
![]() |
2ba1591318 | |
![]() |
33bb5a7e3d | |
![]() |
a9bd0e2fbb | |
![]() |
ba59570af1 | |
![]() |
7125cd13af | |
![]() |
a9294381cc | |
![]() |
ef7be033c7 | |
![]() |
2fad401b95 | |
![]() |
e33a220408 | |
![]() |
e03d1c944a | |
![]() |
8becef3986 | |
![]() |
a9f30e9441 | |
![]() |
7d6288af0f | |
![]() |
3745497f8f | |
![]() |
9ea5cf0286 | |
![]() |
087113252d | |
![]() |
173097a840 | |
![]() |
f0793c7615 | |
![]() |
895f5a1f6f | |
![]() |
e5779e4757 | |
![]() |
c05c40d083 | |
![]() |
96b1660d51 | |
![]() |
cc673c36e3 | |
![]() |
7a0839ec49 | |
![]() |
20fd98abb5 | |
![]() |
8490a54789 | |
![]() |
7d01ebc1fc | |
![]() |
78221bb29d | |
![]() |
5d2f143d56 | |
![]() |
8fad97e34a | |
![]() |
060d4a140b | |
![]() |
6fe7611283 | |
![]() |
7d71e32b32 | |
![]() |
259be19793 | |
![]() |
1810d1b284 | |
![]() |
8e970d48fd | |
![]() |
8db622cd48 | |
![]() |
fb39185e11 | |
![]() |
459ada7158 | |
![]() |
53c2c9d668 | |
![]() |
38ba5a1cee | |
![]() |
7728a9fe36 | |
![]() |
dab260f989 | |
![]() |
d7bd152b3e | |
![]() |
39e072b1b0 | |
![]() |
b39d278ac5 | |
![]() |
04a2d781bd | |
![]() |
3af30ecaf5 | |
![]() |
2241983dae | |
![]() |
9e954bd92e | |
![]() |
aec4218b89 | |
![]() |
e57292f075 | |
![]() |
3bff8ba4b5 | |
![]() |
dfcab51e7e | |
![]() |
5175c49f5d | |
![]() |
c7377720aa | |
![]() |
264ff49689 | |
![]() |
66e3dc771b | |
![]() |
c7594a9d3d | |
![]() |
80f1796d6e | |
![]() |
383c04298d | |
![]() |
3332106a6f | |
![]() |
a7f5a1dc69 | |
![]() |
7aea2f6608 | |
![]() |
cd421e5964 | |
![]() |
dbf8919a3e | |
![]() |
9d736958b1 | |
![]() |
2a61ebe54d | |
![]() |
7e5b20c5fa | |
![]() |
297208c4ce | |
![]() |
94d6ed8fba | |
![]() |
55bce0c0ab | |
![]() |
8867b3934e | |
![]() |
2060fa642d | |
![]() |
af65def548 | |
![]() |
50348216dc | |
![]() |
5db8bbec91 | |
![]() |
2ebe99c43f | |
![]() |
6dcd4de393 | |
![]() |
8084a57480 | |
![]() |
4b59ebf4ef | |
![]() |
5b4711bb1f | |
![]() |
7abb7c0b43 | |
![]() |
db0db2951e | |
![]() |
98f48c7949 | |
![]() |
4ba54f149a | |
![]() |
0c9eb199cb | |
![]() |
7e61128e52 | |
![]() |
0a78a9c095 | |
![]() |
a5bea05d8a | |
![]() |
48030ead29 | |
![]() |
c4ad3a87c5 | |
![]() |
ae1f9436c5 | |
![]() |
98be4e7380 | |
![]() |
d52b936efd | |
![]() |
c0b60456f7 | |
![]() |
466182f2b7 | |
![]() |
3c3378b444 | |
![]() |
332c51034d | |
![]() |
877c074434 | |
![]() |
d0e9f687c0 | |
![]() |
f40635b6e4 | |
![]() |
20ac4961ce | |
![]() |
e8b8c9ea80 | |
![]() |
cf05af5501 | |
![]() |
b2fa67a3b6 | |
![]() |
70b150e3f1 | |
![]() |
92e6a51ac4 | |
![]() |
254909113d | |
![]() |
641d7c2041 | |
![]() |
4056802a34 | |
![]() |
453e354c0e | |
![]() |
194c9720f5 | |
![]() |
f8594e0eaf | |
![]() |
7854b03a9c | |
![]() |
64160d6a96 | |
![]() |
56b59d5dcb | |
![]() |
e2ac2e30f5 | |
![]() |
2da41a9331 | |
![]() |
eafd8c7952 | |
![]() |
1cc0e9a6fc | |
![]() |
7ef7cffb84 | |
![]() |
71fc1e055f | |
![]() |
50139edbd1 | |
![]() |
1ff7e41978 | |
![]() |
252e7c5a93 | |
![]() |
a503f3d821 | |
![]() |
0b8ad7fe9a | |
![]() |
6846dc8589 | |
![]() |
87f49cd509 | |
![]() |
cff2b6ea62 | |
![]() |
c1a9b4eb2c | |
![]() |
7bccca3ca7 | |
![]() |
f8c624c119 | |
![]() |
f926486fc9 | |
![]() |
968b462bab | |
![]() |
93644c81d5 | |
![]() |
0c471a514c | |
![]() |
06021449c0 | |
![]() |
cc7c6b953f | |
![]() |
7dfa755fb9 | |
![]() |
b01a68103d | |
![]() |
737ab47c31 | |
![]() |
cf80457cb5 | |
![]() |
a1d5d89cdd | |
![]() |
ef4fceae18 | |
![]() |
6d1568a032 | |
![]() |
b2cf301bb9 | |
![]() |
683c0aa7b1 | |
![]() |
d59d69798f | |
![]() |
3bd824a931 | |
![]() |
6e3f83a56d | |
![]() |
35a3ac5312 | |
![]() |
387c3f0874 | |
![]() |
289ff279e4 | |
![]() |
756e29b90e | |
![]() |
b0e58392a8 | |
![]() |
1c2f5acc50 | |
![]() |
985363aeef | |
![]() |
4f58675182 | |
![]() |
e6562885b5 | |
![]() |
af04913a4d | |
![]() |
ac44f60c14 | |
![]() |
58e8ba2cb1 | |
![]() |
82fc473f40 | |
![]() |
2e082ab196 | |
![]() |
68936ec831 | |
![]() |
757d6a852e | |
![]() |
6b7e447aac | |
![]() |
e409d2aa51 | |
![]() |
6fb6829fe2 | |
![]() |
b16e0d4aed | |
![]() |
0cb501a508 | |
![]() |
01c0552eaf | |
![]() |
8029a0e34a | |
![]() |
224722acd1 | |
![]() |
dfd690635a | |
![]() |
0c11a3382c | |
![]() |
baee8ff432 | |
![]() |
e93a8b05f3 | |
![]() |
da5d6c680b | |
![]() |
1e5ab0b9aa | |
![]() |
8e26effabb | |
![]() |
681be61e0a | |
![]() |
224afddbfb |
|
@ -1,2 +1,2 @@
|
|||
firefox/firefox.zip
|
||||
chrome.zip
|
||||
*.zip
|
||||
NOTES.md
|
||||
|
|
214
README.md
|
@ -1,98 +1,156 @@
|
|||
# FediFollow (Beta)
|
||||
A Chrome/Firefox extension that simplifies following and post interactions on other Mastodon instances than your own by intelligently redirecting you to your instance and utilizing the local API to resolve the content.
|
||||
> **Note**
|
||||
> LOOKING FOR AN ACTIVE MAINTAINER TO TAKE CARE OF THIS PROJECT!
|
||||
> FediAct requires some major updates/rewriting to resolve issues, increase performance/reliability and to be easier to maintain, for which I do not have time currently. Please leave a message/issue.
|
||||
|
||||
Should work for all updated Chromium browsers, updated Firefox, as well as Kiwi browser on Android. Currently only Mastodon 3 + 4 in different flavors are supported as far as I tested. Support for other Fediverse software / versions / flavors might be added in the future. Feel free to create pull requests / issues. This is my first proper browser extension so please bear with my awful JS skills.
|
||||
# FediAct (v0.9.8)
|
||||
A Chrome/Firefox extension that simplifies follow and post interactions on Mastodon servers other than your own.
|
||||
|
||||
**Important**: Your data will never leave your machine by using this addon.
|
||||
**Features**:
|
||||
- Supports Mastodon v3 + v4 (some features v4 only)
|
||||
- Follow, boost, bookmark, reply, fav, vote polls and mute/block on external servers while only being logged in to your home server
|
||||
- Show following state and toot state (boosted, faved, bookmarked, voted) on external servers
|
||||
- Single click to execute action only, double click to redirect to content on home server
|
||||
- Reply button on external servers always redirects to home server and enters reply-mode
|
||||
- Hide muted content on external servers if enabled
|
||||
- Needs nothing more than your home server domain to work
|
||||
|
||||
* [Installation](#installation)
|
||||
* [Setup](#setup)
|
||||
* [Screenshots / GIFs](#screenshots--gifs)
|
||||
* [How it works](#how-it-works)
|
||||
* [Todos / Planned features](#todos--planned-features)
|
||||
## Navigation
|
||||
- [Installation](#installation)
|
||||
- [Setup](#setup)
|
||||
- [FAQ](#faq)
|
||||
- [Screenshots / GIFs](#screenshots--gifs)
|
||||
- [Manual installation](#manual-installation)
|
||||
- [Install in Firefox for Android](#install-in-firefox-for-android)
|
||||
- [Additional notes](#additional-notes)
|
||||
- [Todos / Planned features](#todos--planned-features)
|
||||
- [Contributing](#contributing)
|
||||
|
||||
## Installation
|
||||
Right now, this needs to be installed in debugging / developer mode. Soon it will be available on Chrome Webstore / Firefox addon store.
|
||||
1. Download the [latest release](https://github.com/Lartsch/FediFollow-Chrome/releases/latest) for your browser (chrome or firefox)
|
||||
|
||||
[link-chrome]: https://chrome.google.com/webstore/detail/fediact/lmpcajpkjcclkjbliapfjfolocffednm 'Version published on Chrome Web Store'
|
||||
[link-firefox]: https://addons.mozilla.org/en-US/firefox/addon/fediact/ 'Version published on Mozilla Add-ons'
|
||||
|
||||
[<img src="https://raw.githubusercontent.com/alrra/browser-logos/90fdf03c/src/chrome/chrome.svg" width="48" alt="Chrome" valign="middle">][link-chrome] [<img valign="middle" src="https://img.shields.io/chrome-web-store/v/lmpcajpkjcclkjbliapfjfolocffednm.svg?label=%20"> Chrome Webstore][link-chrome]
|
||||
All up-to-date Chromium browsers, including Kiwi and Yandex browsers on Android
|
||||
|
||||
[<img src="https://raw.githubusercontent.com/alrra/browser-logos/90fdf03c/src/firefox/firefox.svg" width="48" alt="Firefox" valign="middle">][link-firefox] [<img valign="middle" src="https://img.shields.io/amo/v/fediact.svg?label=%20%20"> Mozilla Addon Store][link-firefox]
|
||||
Up-to-date Firefox (v107+), including Firefox Nightly on Android
|
||||
|
||||
**Please note:**
|
||||
- If webstore release is outdated, use the [manual installation method](#manual-installation) to install the latest version
|
||||
- Special installation steps for [Firefox on Android](#install-in-firefox-for-android)
|
||||
- Chrome store updates take 1-2 days longer
|
||||
- If you like this addon, please consider donating: [paypal.me/lartsch](https://paypal.me/lartsch)
|
||||
|
||||
## Setup
|
||||
|
||||
1. Make sure you are logged in to your home server
|
||||
2. Click the extension icon or open its settings page
|
||||
3. Set your home server domain (required)
|
||||
4. Check out the other settings (optional)
|
||||
5. Click the "Save" button to save
|
||||
|
||||
If you have set your home server correctly, you can now interact on other Mastodon servers.
|
||||
|
||||
**Please note:**
|
||||
- If FediAct is running, a small icon will be displayed in the bottom right corner
|
||||
- Also, it is indicated while content is resolving or when it could not be resolved
|
||||
- Performance depends on your home server and the external server you are browsing (read more [below](#additional-notes))
|
||||
- Some toots can't be resolved to your home (e.g. when searching the post manually wouldn't work either)
|
||||
- It's NOT recommended to disable the API delay (servers use rate limiting and might block your IP)
|
||||
|
||||
## FAQ
|
||||
**Why does it need permission for all websites?**
|
||||
|
||||
> The addon needs to determine whether or not the site you are currently browsing is a Mastodon server. For that to work, it requires access to all sites. Otherwise, each existing Mastodon server would have to be explicitly added.
|
||||
|
||||
**Can I use this on Android?**
|
||||
|
||||
> Yes! There are three options that I am aware of: Kiwi Browser, Yandex Browser and Firefox Nightly (see [below](#install-in-firefox-for-android))
|
||||
|
||||
**Can I use this on iOS?**
|
||||
|
||||
> Currently not in a reliable way, but:
|
||||
> - It's possible that Orion Browser can soon be used (see issue [#16](https://github.com/Lartsch/FediAct/issues/16))
|
||||
> - There are plans for Safari support (see issue [#17](https://github.com/Lartsch/FediAct/issues/17))
|
||||
|
||||
**Can you add feature XY?**
|
||||
|
||||
> Feel free to create an issue here on GitHub and I will look into it.
|
||||
|
||||
**Is this safe to use?**
|
||||
|
||||
> This project is open source. Anyone with some programming knowledge can check out the source code, either here on GitHub or by extracting the addon file from the addon stores. You can also make improvements.
|
||||
> Considering the implementation, I am not aware of any risks. Efforts were made to prevent servers from abusing this addon to perform actions on the user's behalf. It does not require your username or password. All data is stored in your browser locally, with the API token being the only sensitive data. This token is **only** sent to your home server. No other data ever leaves your device. All requests are made from the background script, out-of-scope for websites you visit.
|
||||
|
||||
## Screenshots / GIFs
|
||||
v0.9.8
|
||||
<details>
|
||||
<summary>Extension popup / settings</summary>
|
||||
<img src="https://github.com/lartsch/FediAct/blob/main/img/settings.png?raw=true">
|
||||
</details>
|
||||
<details>
|
||||
<summary>Showcase</summary>
|
||||
<img src="https://github.com/lartsch/FediAct/blob/main/img/showcase.gif?raw=true">
|
||||
</details>
|
||||
|
||||
## Manual installation
|
||||
1. Download the [latest GitHub release](https://github.com/Lartsch/FediAct/releases/latest) for your browser (Chrome or Firefox)
|
||||
### Chrome
|
||||
2. Unzip the downloaded file somewhere
|
||||
3. Go to your Chrome extension page (URL: chrome://extensions) and enable developer mode
|
||||
4. Click the "Load unpacked" button and then select the unzipped folder (should be "fedifollow-X.X.X-chrome")
|
||||
4. Click the "Load unpacked" button and then select the unzipped folder
|
||||
|
||||
Note: Some Chromium browsers allow you to directly load a .zip file - you can use it if available
|
||||
|
||||
### Firefox
|
||||
2. Open the debugging page (URL: about:debugging)
|
||||
3. Select "This Firefox"
|
||||
4. Click the "Load Temporary Add-on" button and then select the downloaded Firefox ZIP file
|
||||
|
||||
## Setup
|
||||
**You might need to allow popups if your browser asks for it.**
|
||||
### Install in Firefox for Android
|
||||
For a while now, Firefox on Android has only allowed installing from a [curated list](https://addons.mozilla.org/en-US/android/search/?promoted=recommended&sort=random&type=extension) of addons, preventing installation of anything else. The following instructions will guide you through installing it from the webstore anyway.
|
||||
|
||||
- Required: Click the extension icon to set your Mastodon instance
|
||||
- Only set the domain name (like "infosec.exchange") without http/https or URL)
|
||||
- Optional: Change whether to redirect in current or new tab
|
||||
- Optional: Change the mode (all sites except those on blacklist (default) / no sites but those on whitelist)
|
||||
- Optional: Add domain names to the blacklist/whitelist textarea, one per line, for ex.
|
||||
```
|
||||
mastodon.social
|
||||
bbq.snoot.com
|
||||
```
|
||||
- Required: Hit "Submit" to update your settings
|
||||
**Requirements:**
|
||||
- Firefox [**Nightly**](https://play.google.com/store/apps/details?id=org.mozilla.fenix) for Android
|
||||
|
||||
**Steps:**
|
||||
1. In Firefox, go to Settings > About Firefox Nightly
|
||||
2. Click the Firefox logo 5 times to enable Developer options
|
||||
3. Go back to Settings > Custom Add-on Collection
|
||||
4. Enter the following data:
|
||||
- ID: 17665294
|
||||
- Name: FediAct
|
||||
5. Click OK, Firefox will close - reopen it
|
||||
6. FediAct will now be available in the Add-ons menu of Firefox Nightly
|
||||
|
||||
> **Note**
|
||||
> 1. Currently supports different flavours of Mastodon 3 + 4
|
||||
> 2. The whitelist mode can be useful if you do not want the extension to run basic checks on every site (since it needs to determine if it is a Mastodon site). Not sure if the blacklist feature is good for anything but I still included it.
|
||||
> 3. It can have several reasons why a redirection/instance might not work:
|
||||
> - You are not logged in to your home instance
|
||||
> - There are instances that use custom layouts/flavours (additional identifiers need to be added to extension)
|
||||
> - Instance chose to hide the follow button when not logged in (not supported yet)
|
||||
> - It's not a Mastodon instance (not supported yet)
|
||||
> - Element identifiers might change over time (extension needs to be updated)
|
||||
>
|
||||
> So please be aware, that this extension can fail in some cases. Feel free to submit pull requests / issues.
|
||||
To update the addon instantly, simply remove and re-install it. I don't know if or when auto-update triggers in Firefox.
|
||||
|
||||
I included all of the default add-ons in the custom collection, so you will not miss out on any of those. Of course, you can create [your own collection](https://support.mozilla.org/en-US/kb/how-use-collections-addonsmozillaorg) as well.
|
||||
|
||||
## Screenshots / GIFs
|
||||
![Extension Popup](https://github.com/lartsch/FediFollow-Chrome/blob/main/img/screenshot1.PNG?raw=true)
|
||||
![Follow Redirect](https://github.com/lartsch/FediFollow-Chrome/blob/main/img/follow-interaction.gif?raw=true)
|
||||
![Follow Redirect](https://github.com/lartsch/FediFollow-Chrome/blob/main/img/post-interaction.gif?raw=true)
|
||||
|
||||
## How it works
|
||||
Some basic explanations how the addon works...
|
||||
### General
|
||||
- Addon performs basic checks on the URL and site content to determine if and what scripts to run
|
||||
- On external instances, depending on the interaction, a search string is built for the content you wish to interact with
|
||||
- You are then redirected to your local instance with the search string as value for an URL parameter that the addon checks for
|
||||
- If the home instance is opened with this parameter...
|
||||
- Your authorization token is extracted from the DOM
|
||||
- Then the parameter value is used to perform a search for it with the search API endpoint (with resolving, so auth is needed)
|
||||
- If a match for a user or post was found, you are then redirected to the content
|
||||
- Using the search API gives best compatibility for resolving content (for ex. Toot IDs differ on instances for the same toot)
|
||||
### Follow interactions
|
||||
- Addon uses a list of DOM identifiers of follow buttons (for different views / flavors)
|
||||
- All default actions for clicking the button are prevented
|
||||
- Addon extracts the handle and handle domain from the profile view
|
||||
- The handle domain is then searched for with the external instance's search API endpoint (without resolving, so no authorization needed)
|
||||
- This is to ensure we grab the correct instance URL for this user, since it can differ from the domain handle (also, the domain handle does not always resolve)
|
||||
- If all worked out, we build our search string and redirect to your home instance with the value as URL parameter then continue as explained in "General"
|
||||
### Post interactions
|
||||
- Addon uses a list of allowed URLs and DOM identifiers for interaction buttons
|
||||
- It then grabs the Toot ID using different methods, depending on the Mastodon version / flavor
|
||||
- The Toot ID is then searched for using the external instance's status API
|
||||
- This gives us the actual URL of the post on its home instance for using as the search string (even if the post is from another external instance than the external instance it is viewed on)
|
||||
- If all worked out, we build our search string and redirect to your home instance with the value as URL parameter then continue as explained in "General"
|
||||
## Additional notes
|
||||
1. Support for other Fedi software is planned
|
||||
2. There are several reasons why resolving/interacting might not work including:
|
||||
- Not being logged in to your home server
|
||||
- Element identifiers have changed / the server uses an unsupported flavour
|
||||
- The external server you are browsing or the originating server of a toot is not Mastodon
|
||||
- Your home server has strong rate limiting and limited your IP
|
||||
- Your home server / the external server / the original server of a toot have defederated / are moderated
|
||||
- The toot has not yet federated to your home instace (follow the account and toots should start federating)
|
||||
- The server you are browsing does not use 302 redirects for external toots
|
||||
- The network conditions of your home server or the external server are bad (slow speed)
|
||||
- That a toot is set to unlisted on its original server may play a role
|
||||
3. There can be delays because API calls have to be made and it is tries to avoid error 429 (too many requests). Especially if a page has many toots or you are scrolling through a feed really fast.
|
||||
4. If the extension fails to resolve content, the affected buttons will behave as if the extension weren't active (popup modal) and a notice ("Unresolved") is added to the toot
|
||||
5. If "Collect errors" is enabled (Chrome), there can be uncatched errors being displayed for FediAct. This is not relevant to functionality.
|
||||
|
||||
## Todos / Planned features
|
||||
- Add support for post interactions (DONE)
|
||||
- Support executing the intended action after redirect
|
||||
- Add support for other implementations (Plemora, GNU Social, ...)
|
||||
- Publish to Chrome Webstore (IN PROGRESS)
|
||||
- Publish to Firefox addon store (IN PROGRESS)
|
||||
- Find additional layouts/flavours to add identifiers for
|
||||
- Support for profiles views with follow button disabled
|
||||
- Add support for Firefox (DONE)
|
||||
- Fix some rare cases where an instance runs on a subdomain but the handle uses the domain without subdomain (need to get the handle directly from the profile instead of URL + domain name) (DONE)
|
||||
- Add support for whitelist/blacklist (DONE)
|
||||
- Add feature to indicate if you are already following a user when browsing his profile on another instance (this requires calls to the home instance, will look into it soon)
|
||||
- Review if permissions in current manifest are actually needed like that (DONE)
|
||||
- If I find myself to be bored, probably more
|
||||
Check out the [GitHub project](https://github.com/users/Lartsch/projects/2) to see planned features and todos. They are sorted from most important to least important.
|
||||
|
||||
## Contributing
|
||||
Feel free to create [issues](https://github.com/Lartsch/FediAct/issues) for bugs and feature suggestions. Even better: Create pull requests for whatever improvements you can make! :)
|
||||
|
||||
## Thanks to...
|
||||
@raikasdev because I stole his fix for cross-browser storage API support
|
||||
- @raikasdev because I stole his fix for cross-browser storage API support
|
||||
- @rosemarydotworld because I customized and use his awesome jQuery.DOMNodeAppear where MutationObservers and delegation failed
|
||||
- All the direct [contributors](https://github.com/Lartsch/FediAct/graphs/contributors) to this repository!
|
||||
|
|
|
@ -1,27 +1,45 @@
|
|||
{
|
||||
"name": "FediFollow",
|
||||
"version": "0.5.0",
|
||||
"description": "Simplifies interactions on other Mastodon instances than your own. Visit https://github.com/lartsch/FediFollow-Chrome for more.",
|
||||
"name": "FediAct",
|
||||
"version": "0.9.8.7",
|
||||
"description": "Simplifies interactions on other Mastodon instances than your own. Visit https://github.com/lartsch/FediAct for more.",
|
||||
"manifest_version": 2,
|
||||
"content_scripts": [
|
||||
{
|
||||
"matches": ["*://*/*"],
|
||||
"js": ["src/lib/jquery-3.6.1.min.js","src/inject.js"],
|
||||
"run_at": "document_start"
|
||||
}
|
||||
{
|
||||
"matches": [
|
||||
"*://*/*"
|
||||
],
|
||||
"js": [
|
||||
"src/lib/jquery-3.6.1.min.js",
|
||||
"src/inject.min.js"
|
||||
],
|
||||
"css": [
|
||||
"src/content_styles.min.css"
|
||||
],
|
||||
"run_at": "document_start"
|
||||
}
|
||||
],
|
||||
"background": {
|
||||
"scripts": [
|
||||
"src/background.min.js"
|
||||
],
|
||||
"persistent": false
|
||||
},
|
||||
"permissions": [
|
||||
"storage",
|
||||
"storage",
|
||||
"alarms",
|
||||
"tabs",
|
||||
"https://*/*",
|
||||
"http://*/*"
|
||||
],
|
||||
"browser_action":
|
||||
{
|
||||
"default_popup": "src/popup.html",
|
||||
"default_icon": "src/icon/48.png",
|
||||
"default_title": "FediFollow settings"
|
||||
"options_ui": {
|
||||
"page": "src/popup.html"
|
||||
},
|
||||
"browser_action": {
|
||||
"default_popup": "src/popup.html",
|
||||
"default_icon": "src/icon/48.png",
|
||||
"default_title": "FediAct settings"
|
||||
},
|
||||
"icons": {
|
||||
"48": "src/icon/48.png"
|
||||
}
|
||||
}
|
||||
}
|
Przed Szerokość: | Wysokość: | Rozmiar: 4.8 MiB |
Przed Szerokość: | Wysokość: | Rozmiar: 5.8 MiB |
Przed Szerokość: | Wysokość: | Rozmiar: 17 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 15 KiB |
Po Szerokość: | Wysokość: | Rozmiar: 2.4 MiB |
|
@ -1,27 +1,42 @@
|
|||
{
|
||||
"name": "FediFollow",
|
||||
"version": "0.5.0",
|
||||
"description": "Simplifies interactions on other Mastodon instances than your own. Visit https://github.com/lartsch/FediFollow-Chrome for more.",
|
||||
"name": "FediAct",
|
||||
"version": "0.9.8.7",
|
||||
"description": "Simplifies interactions on other Mastodon instances than your own. Visit https://github.com/lartsch/FediAct for more.",
|
||||
"manifest_version": 3,
|
||||
"content_scripts": [
|
||||
{
|
||||
"matches": ["*://*/*"],
|
||||
"js": ["src/lib/jquery-3.6.1.min.js","src/inject.js"],
|
||||
"run_at": "document_start"
|
||||
}
|
||||
{
|
||||
"matches": [
|
||||
"*://*/*"
|
||||
],
|
||||
"js": [
|
||||
"src/lib/jquery-3.6.1.min.js",
|
||||
"src/inject.min.js"
|
||||
],
|
||||
"css": [
|
||||
"src/content_styles.min.css"
|
||||
],
|
||||
"run_at": "document_start"
|
||||
}
|
||||
],
|
||||
"background": {
|
||||
"service_worker": "src/background.min.js"
|
||||
},
|
||||
"permissions": [
|
||||
"storage"
|
||||
"storage",
|
||||
"alarms",
|
||||
"tabs"
|
||||
],
|
||||
"host_permissions": [
|
||||
"https://*/*",
|
||||
"http://*/*"
|
||||
],
|
||||
"action":
|
||||
{
|
||||
"default_popup": "src/popup.html",
|
||||
"default_icon": "src/icon/48.png",
|
||||
"default_title": "FediFollow settings"
|
||||
"options_ui": {
|
||||
"page": "src/popup.html"
|
||||
},
|
||||
"action": {
|
||||
"default_popup": "src/popup.html",
|
||||
"default_icon": "src/icon/48.png",
|
||||
"default_title": "FediAct settings"
|
||||
},
|
||||
"icons": {
|
||||
"48": "src/icon/48.png"
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
# RUN FROM MAIN DIR
|
||||
# USE ./pack.sh <VERSION>
|
||||
# NOTE: requires uglifyjs and uglifycss in PATH
|
||||
|
||||
# remove all minified files (excluding lib folder) and zip files
|
||||
find . -type d -name lib -prune -o -type f -name "*.min.js" -o -type f -name "*.min.css" -o -type f -name "*.zip" | grep -v "/lib" | tr '\n' '\0' | xargs -r0 rm
|
||||
# minify all js files, excluding lib folder (and mangle toplevel without browser, chrome variable scopes)
|
||||
find . -type d -name lib -prune -o -type f -name "*.js" -exec bash -c 'uglifyjs $1 --compress -m toplevel,reserved=["chrome","browser"] -o "$(echo $1 | rev | cut -f 2- -d '.' | rev).min.js"' _ {} \;
|
||||
# minify all css files, excluding lib folder
|
||||
find . -type d -name lib -prune -o -type f -name "*.css" -exec bash -c 'uglifycss $1 > "$(echo $1 | rev | cut -f 2- -d '.' | rev).min.css"' _ {} \;
|
||||
# zip release files
|
||||
zip -r "fediact-$1-chrome.zip" ./ -x "firefox/*" -x "img/*" -x ".git/*" -x "README.md" -x "NOTES.md" -x ".gitignore" -x "pack.sh" -x "LICENSE" -x "src/background.js" -x "src/inject.js" -x "src/popup.js" -x "src/content_styles.css" -x "src/popup_styles.css" 1>/dev/null
|
||||
cd firefox && zip -r "../fediact-$1-firefox.zip" ./ -x "src/background.js" -x "src/inject.js" -x "src/popup.js" -x "src/content_styles.css" -x "src/popup_styles.css" 1>/dev/null
|
|
@ -0,0 +1,252 @@
|
|||
var browser, chrome, settings
|
||||
const enableConsoleLog = false
|
||||
const logPrepend = "[FediAct]"
|
||||
const tokenInterval = 1 // minutes
|
||||
const mutesApi = "/api/v1/mutes"
|
||||
const blocksApi = "/api/v1/blocks"
|
||||
const domainBlocksApi = "/api/v1/domain_blocks"
|
||||
const timeout = 15000
|
||||
const tokenRegex = /"access_token":".*?",/gm
|
||||
// required settings keys with defauls
|
||||
const settingsDefaults = {
|
||||
fediact_homeinstance: null,
|
||||
fediact_token: null
|
||||
}
|
||||
|
||||
// wrapper to prepend to log messages
|
||||
function log(text) {
|
||||
if (enableConsoleLog) {
|
||||
console.log(logPrepend + ' ' + text)
|
||||
}
|
||||
}
|
||||
|
||||
// get redirect url (it will be the url on the toot authors home instance)
|
||||
async function resolveExternalTootHome(url) {
|
||||
return new Promise(async function(resolve) {
|
||||
try {
|
||||
const controller = new AbortController()
|
||||
const timeoutId = setTimeout(() => {
|
||||
log("Timed out")
|
||||
controller.abort()
|
||||
}, timeout)
|
||||
var res = await fetch(url, {method: 'HEAD', signal: controller.signal})
|
||||
clearTimeout(timeoutId)
|
||||
if (res.redirected) {
|
||||
resolve(res.url)
|
||||
} else {
|
||||
resolve(false)
|
||||
}
|
||||
} catch(e) {
|
||||
log(e)
|
||||
resolve(false)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// get redirect url (it will be the url on the toot authors home instance)
|
||||
async function generalRequest(data) {
|
||||
return new Promise(async function(resolve) {
|
||||
try {
|
||||
const controller = new AbortController()
|
||||
const timeoutId = setTimeout(() => {
|
||||
log("Timed out")
|
||||
controller.abort()
|
||||
}, timeout)
|
||||
if (data[3]) {
|
||||
// json body provided, post as body to target
|
||||
data[2]["User-Agent"] = "FediAct Service"
|
||||
data[2]["Content-Type"] = "application/json"
|
||||
var res = await fetch(data[1], {
|
||||
method: data[0],
|
||||
signal: controller.signal,
|
||||
// if json body is provided, there is also header data
|
||||
headers: data[2],
|
||||
body: JSON.stringify(data[3])
|
||||
})
|
||||
} else if (data[2]) {
|
||||
// header data provided
|
||||
data[2]["User-Agent"] = "FediAct Service"
|
||||
var res = await fetch(data[1], {
|
||||
method: data[0],
|
||||
signal: controller.signal,
|
||||
headers: data[2]
|
||||
})
|
||||
} else {
|
||||
var res = await fetch(data[1], {
|
||||
method: data[0],
|
||||
signal: controller.signal,
|
||||
headers: {"User-Agent": "FediAct Service"}
|
||||
})
|
||||
}
|
||||
clearTimeout(timeoutId)
|
||||
if (res.status >= 200 && res.status < 300 ) {
|
||||
const contentType = res.headers.get("content-type")
|
||||
if (contentType && contentType.indexOf("application/json") !== -1) {
|
||||
var restext = await res.text()
|
||||
resolve(restext)
|
||||
} else {
|
||||
resolve(false)
|
||||
}
|
||||
} else {
|
||||
resolve(false)
|
||||
}
|
||||
} catch(e) {
|
||||
log(e)
|
||||
resolve(false)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// fetch API token here (will use logged in session automatically)
|
||||
async function fetchBearerToken() {
|
||||
return new Promise(async function(resolve) {
|
||||
var url = "https://" + settings.fediact_homeinstance
|
||||
try {
|
||||
var res = await fetch(url)
|
||||
var text = await res.text()
|
||||
} catch(e) {
|
||||
log(e)
|
||||
resolve(false)
|
||||
return
|
||||
}
|
||||
if (text) {
|
||||
// dom parser is not available in background workers, so we use regex to parse the html....
|
||||
// for some reason, regex groups do also not seem to work in chrome background workers... the following is ugly but should work fine
|
||||
var content = text.match(tokenRegex)
|
||||
if (content) {
|
||||
var indexOne = content[0].search(/"access_token":"/)
|
||||
var indexTwo = content[0].search(/",/)
|
||||
if (indexOne > -1 && indexTwo > -1) {
|
||||
indexOne = indexOne + 16
|
||||
var token = content[0].substring(indexOne, indexTwo)
|
||||
if (token.length > 16) {
|
||||
settings.fediact_token = token
|
||||
resolve(true)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// reset token for inject.js to know
|
||||
settings.fediact_token = null
|
||||
log("Token could not be found.")
|
||||
resolve(false)
|
||||
})
|
||||
}
|
||||
|
||||
// grab all accounts/instances that are muted/blocked by the user
|
||||
// this is only done here in the bg script so we have data available on load of pages without first performing 3 (!) requests
|
||||
// otherwise this would lead to problems with element detection / low performance (espcially v3 instances)
|
||||
// mutes/blocks are updated in content script on page context changes and after performing mutes/block actions
|
||||
function fetchMutesAndBlocks() {
|
||||
return new Promise(async function(resolve) {
|
||||
try {
|
||||
// set empty initially
|
||||
[settings.fediact_mutes, settings.fediact_blocks, settings.fediact_domainblocks] = [[],[],[]]
|
||||
var [mutes, blocks, domainblocks] = await Promise.all([
|
||||
fetch("https://" + settings.fediact_homeinstance + mutesApi, {headers: {"Authorization": "Bearer "+settings.fediact_token}}).then((response) => response.json()),
|
||||
fetch("https://" + settings.fediact_homeinstance + blocksApi, {headers: {"Authorization": "Bearer "+settings.fediact_token}}).then((response) => response.json()),
|
||||
fetch("https://" + settings.fediact_homeinstance + domainBlocksApi, {headers: {"Authorization": "Bearer "+settings.fediact_token}}).then((response) => response.json())
|
||||
])
|
||||
if (mutes.length) {
|
||||
settings.fediact_mutes.push(...mutes.map(acc => acc.acct))
|
||||
}
|
||||
if (blocks.length) {
|
||||
settings.fediact_blocks.push(...blocks.map(acc => acc.acct))
|
||||
}
|
||||
if (domainblocks.length) {
|
||||
settings.fediact_domainblocks = domainblocks
|
||||
}
|
||||
resolve(true)
|
||||
} catch {
|
||||
resolve(false)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
async function fetchData(token, mutesblocks) {
|
||||
return new Promise(async function(resolve) {
|
||||
var resolved = false
|
||||
try {
|
||||
settings = await (browser || chrome).storage.local.get(settingsDefaults)
|
||||
if (settings.fediact_homeinstance) {
|
||||
if (token || mutesblocks) {
|
||||
if (token || !(settings.fediact_token)) {
|
||||
await fetchBearerToken()
|
||||
}
|
||||
if (mutesblocks) {
|
||||
await fetchMutesAndBlocks()
|
||||
}
|
||||
try {
|
||||
await (browser || chrome).storage.local.set(settings)
|
||||
resolved = true
|
||||
} catch {
|
||||
log(e)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
log("Home instance not set")
|
||||
}
|
||||
} catch(e) {
|
||||
log(e)
|
||||
}
|
||||
resolve(resolved)
|
||||
})
|
||||
}
|
||||
|
||||
async function reloadListeningScripts() {
|
||||
chrome.tabs.query({}, async function(tabs) {
|
||||
for (var i=0; i<tabs.length; ++i) {
|
||||
try {
|
||||
chrome.tabs.sendMessage(tabs[i].id, {updatedfedisettings: true})
|
||||
} catch(e) {
|
||||
// all non-listening tabs will throw an error, we can ignore it
|
||||
continue
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// fetch api token right after install (mostly for debugging, when the ext. is reloaded)
|
||||
chrome.runtime.onInstalled.addListener(function(){fetchData(true, true)})
|
||||
// and also every 3 minutes
|
||||
chrome.alarms.create('refresh', { periodInMinutes: tokenInterval })
|
||||
chrome.alarms.onAlarm.addListener(function(){fetchData(true, true)})
|
||||
|
||||
// different listeners for inter-script communication
|
||||
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
|
||||
// the content script gave us an url to perform a 302 redirect with
|
||||
if(request.externaltoot) {
|
||||
resolveExternalTootHome(request.externaltoot).then(sendResponse)
|
||||
return true
|
||||
}
|
||||
// the content script gave us an url to perform a 302 redirect with
|
||||
if(request.requestdata) {
|
||||
generalRequest(request.requestdata).then(sendResponse)
|
||||
return true
|
||||
}
|
||||
// immediately fetch api token after settings are updated
|
||||
if (request.updatedsettings) {
|
||||
fetchData(true, true).then(reloadListeningScripts)
|
||||
return true
|
||||
}
|
||||
if (request.updatemutedblocked) {
|
||||
fetchData(false, true).then(sendResponse)
|
||||
return true
|
||||
}
|
||||
// when the content script starts to process on a site, listen for tab changes (url)
|
||||
if (request.running) {
|
||||
chrome.tabs.onUpdated.addListener(async function(tabId, changeInfo, tab) {
|
||||
// chrome tabs api does not support listener filters here
|
||||
// if the tabId of the update event is the same like the tabId that started the listener in the first place AND when the update event is an URL
|
||||
if (tabId === sender.tab.id && changeInfo.url) {
|
||||
// ... then let the content script know about the change
|
||||
try {
|
||||
await chrome.tabs.sendMessage(tabId, {urlchanged: changeInfo.url})
|
||||
} catch(e) {
|
||||
log(e)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
|
@ -0,0 +1 @@
|
|||
var browser,chrome,c;const a=!1,n="[FediAct]",t=1,i="/api/v1/mutes",s="/api/v1/blocks",o="/api/v1/domain_blocks",r=15e3,d=/"access_token":".*?",/gm,u={fediact_homeinstance:null,fediact_token:null};function h(t){a&&console.log(n+" "+t)}async function f(i){return new Promise(async function(e){try{const n=new AbortController;var t=setTimeout(()=>{h("Timed out"),n.abort()},r),a=await fetch(i,{method:"HEAD",signal:n.signal});clearTimeout(t),a.redirected?e(a.url):e(!1)}catch(t){h(t),e(!1)}})}async function l(c){return new Promise(async function(e){try{const i=new AbortController;var t,a,n=setTimeout(()=>{h("Timed out"),i.abort()},r);t=c[3]?(c[2]["User-Agent"]="FediAct Service",c[2]["Content-Type"]="application/json",await fetch(c[1],{method:c[0],signal:i.signal,headers:c[2],body:JSON.stringify(c[3])})):c[2]?(c[2]["User-Agent"]="FediAct Service",await fetch(c[1],{method:c[0],signal:i.signal,headers:c[2]})):await fetch(c[1],{method:c[0],signal:i.signal,headers:{"User-Agent":"FediAct Service"}}),clearTimeout(n),200<=t.status&&t.status<300&&(a=t.headers.get("content-type"))&&-1!==a.indexOf("application/json")?e(await t.text()):e(!1)}catch(t){h(t),e(!1)}})}async function m(){return new Promise(async function(e){var t="https://"+c.fediact_homeinstance;try{var a=await(await fetch(t)).text()}catch(t){return h(t),void e(!1)}if(a){t=a.match(d);if(t){var a=t[0].search(/"access_token":"/),n=t[0].search(/",/);if(-1<a&&-1<n){t=t[0].substring(a+=16,n);if(16<t.length)return c.fediact_token=t,void e(!0)}}}c.fediact_token=null,h("Token could not be found."),e(!1)})}function g(){return new Promise(async function(t){try{[c.fediact_mutes,c.fediact_blocks,c.fediact_domainblocks]=[[],[],[]];var[e,a,n]=await Promise.all([fetch("https://"+c.fediact_homeinstance+i,{headers:{Authorization:"Bearer "+c.fediact_token}}).then(t=>t.json()),fetch("https://"+c.fediact_homeinstance+s,{headers:{Authorization:"Bearer "+c.fediact_token}}).then(t=>t.json()),fetch("https://"+c.fediact_homeinstance+o,{headers:{Authorization:"Bearer "+c.fediact_token}}).then(t=>t.json())]);e.length&&c.fediact_mutes.push(...e.map(t=>t.acct)),a.length&&c.fediact_blocks.push(...a.map(t=>t.acct)),n.length&&(c.fediact_domainblocks=n),t(!0)}catch{t(!1)}})}async function y(n,i){return new Promise(async function(t){var a=!1;try{if((c=await(browser||chrome).storage.local.get(u)).fediact_homeinstance){if(n||i){!n&&c.fediact_token||await m(),i&&await g();try{await(browser||chrome).storage.local.set(c),a=!0}catch{h(e)}}}else h("Home instance not set")}catch(t){h(t)}t(a)})}async function p(){chrome.tabs.query({},async function(t){for(var e=0;e<t.length;++e)try{chrome.tabs.sendMessage(t[e].id,{updatedfedisettings:!0})}catch(t){continue}})}chrome.runtime.onInstalled.addListener(function(){y(!0,!0)}),chrome.alarms.create("refresh",{periodInMinutes:t}),chrome.alarms.onAlarm.addListener(function(){y(!0,!0)}),chrome.runtime.onMessage.addListener((t,n,e)=>t.externaltoot?(f(t.externaltoot).then(e),!0):t.requestdata?(l(t.requestdata).then(e),!0):t.updatedsettings?(y(!0,!0).then(p),!0):t.updatemutedblocked?(y(!1,!0).then(e),!0):void(t.running&&chrome.tabs.onUpdated.addListener(async function(t,e,a){if(t===n.tab.id&&e.url)try{await chrome.tabs.sendMessage(t,{urlchanged:e.url})}catch(t){h(t)}})));
|
|
@ -0,0 +1,299 @@
|
|||
/*
|
||||
Normal stylings
|
||||
*/
|
||||
|
||||
:root { /* Modal Vars */
|
||||
--bg: #eee;
|
||||
--fg: #494949;
|
||||
--border: rgba(120,120,130,0.3);
|
||||
--hover: rgba(100,100,130,0.2);
|
||||
--confirmation: rgb(38, 133, 0);
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--bg: #24262d;
|
||||
--fg: white;
|
||||
}
|
||||
}
|
||||
|
||||
/* Styles for the mute/block modal popup */
|
||||
|
||||
.fediactmodal {
|
||||
position: fixed;
|
||||
z-index: 99999;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: auto;
|
||||
background-color: rgba(0,0,0,0.4);
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
font-size: 1rem;
|
||||
-webkit-animation: fa_fadeIn .2s;
|
||||
animation: fa_fadeIn .2s;
|
||||
}
|
||||
|
||||
.fediactmodalinner {
|
||||
background-color: var(--bg);
|
||||
border: 1px solid var(--border);
|
||||
width: 80%;
|
||||
max-width: 300px;
|
||||
margin: auto;
|
||||
padding: .4em;
|
||||
border-radius: 8px;
|
||||
-webkit-animation: fa_scaleInSmall .2s;
|
||||
animation: fa_scaleInSmall .2s;
|
||||
}
|
||||
.fediactmodalitem {
|
||||
position: relative;
|
||||
display: block;
|
||||
padding: .7em;
|
||||
border-radius: 6px;
|
||||
cursor: pointer;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
-webkit-transition: background-color .4s;
|
||||
-o-transition: background-color .4s;
|
||||
transition: background-color .4s;
|
||||
}
|
||||
.fediactmodalitem:hover, .fediactmodalitem:focus-within {
|
||||
background-color: var(--hover);
|
||||
}
|
||||
.fediactmodallink {
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
-webkit-box-align: center;
|
||||
-ms-flex-align: center;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
text-decoration: none;
|
||||
color: var(--fg);
|
||||
margin: -.7em;
|
||||
padding: .7em;
|
||||
border-radius: inherit;
|
||||
-webkit-box-shadow: inset 0 0 0 var(--confirmation);
|
||||
box-shadow: inset 0 0 0 var(--confirmation);
|
||||
-webkit-transition: padding .2s, color .2s, -webkit-box-shadow .2s cubic-bezier(.2,.2,0,1);
|
||||
transition: padding .2s, color .2s, -webkit-box-shadow .2s cubic-bezier(.2,.2,0,1);
|
||||
-o-transition: padding .2s, color .2s, box-shadow .2s cubic-bezier(.2,.2,0,1);
|
||||
transition: padding .2s, color .2s, box-shadow .2s cubic-bezier(.2,.2,0,1);
|
||||
transition: padding .2s, color .2s, box-shadow .2s cubic-bezier(.2,.2,0,1), -webkit-box-shadow .2s cubic-bezier(.2,.2,0,1);
|
||||
}
|
||||
.fediactmodallink span:not(:first-of-type) {
|
||||
position: absolute;
|
||||
right: .7em;
|
||||
font-size: .8em;
|
||||
padding: .2em .4em;
|
||||
border-radius: 4px;
|
||||
background-color: white;
|
||||
color: var(--confirmation);
|
||||
-webkit-animation: fa_scaleInFadeSmall .2s;
|
||||
animation: fa_scaleInFadeSmall .2s;
|
||||
}
|
||||
.fediactmodallink.activated {
|
||||
-webkit-box-shadow: inset 300px 0 0 var(--confirmation);
|
||||
box-shadow: inset 300px 0 0 var(--confirmation);
|
||||
color: white;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
/* Styles for "resolving..." indicator */
|
||||
.fediactprocessing {
|
||||
display: inline-block;
|
||||
height: 1.2em;
|
||||
width: 1.2em;
|
||||
background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8c3ZnIHdpZHRoPSI0MHB4IiBoZWlnaHQ9IjQwcHgiIHZpZXdCb3g9IjAgMCA0MCA0MCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEuNDE0MjE7IiB4PSIwcHgiIHk9IjBweCI+CiAgICA8ZGVmcz4KICAgICAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhW0NEQVRBWwogICAgICAgICAgICBALXdlYmtpdC1rZXlmcmFtZXMgc3BpbiB7CiAgICAgICAgICAgICAgZnJvbSB7CiAgICAgICAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDBkZWcpCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRvIHsKICAgICAgICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTM1OWRlZykKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQGtleWZyYW1lcyBzcGluIHsKICAgICAgICAgICAgICBmcm9tIHsKICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRvIHsKICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC0zNTlkZWcpCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHN2ZyB7CiAgICAgICAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IDUwJSA1MCU7CiAgICAgICAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogc3BpbiAxLjVzIGxpbmVhciBpbmZpbml0ZTsKICAgICAgICAgICAgICAgIC13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICAgICAgICAgICAgYW5pbWF0aW9uOiBzcGluIDEuNXMgbGluZWFyIGluZmluaXRlOwogICAgICAgICAgICB9CiAgICAgICAgXV0+PC9zdHlsZT4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSJvdXRlciI+CiAgICAgICAgPGc+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMCwwQzIyLjIwNTgsMCAyMy45OTM5LDEuNzg4MTMgMjMuOTkzOSwzLjk5MzlDMjMuOTkzOSw2LjE5OTY4IDIyLjIwNTgsNy45ODc4MSAyMCw3Ljk4NzgxQzE3Ljc5NDIsNy45ODc4MSAxNi4wMDYxLDYuMTk5NjggMTYuMDA2MSwzLjk5MzlDMTYuMDA2MSwxLjc4ODEzIDE3Ljc5NDIsMCAyMCwwWiIgc3R5bGU9ImZpbGw6YmxhY2s7Ii8+CiAgICAgICAgPC9nPgogICAgICAgIDxnPgogICAgICAgICAgICA8cGF0aCBkPSJNNS44NTc4Niw1Ljg1Nzg2QzcuNDE3NTgsNC4yOTgxNSA5Ljk0NjM4LDQuMjk4MTUgMTEuNTA2MSw1Ljg1Nzg2QzEzLjA2NTgsNy40MTc1OCAxMy4wNjU4LDkuOTQ2MzggMTEuNTA2MSwxMS41MDYxQzkuOTQ2MzgsMTMuMDY1OCA3LjQxNzU4LDEzLjA2NTggNS44NTc4NiwxMS41MDYxQzQuMjk4MTUsOS45NDYzOCA0LjI5ODE1LDcuNDE3NTggNS44NTc4Niw1Ljg1Nzg2WiIgc3R5bGU9ImZpbGw6cmdiKDIxMCwyMTAsMjEwKTsiLz4KICAgICAgICA8L2c+CiAgICAgICAgPGc+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMCwzMi4wMTIyQzIyLjIwNTgsMzIuMDEyMiAyMy45OTM5LDMzLjgwMDMgMjMuOTkzOSwzNi4wMDYxQzIzLjk5MzksMzguMjExOSAyMi4yMDU4LDQwIDIwLDQwQzE3Ljc5NDIsNDAgMTYuMDA2MSwzOC4yMTE5IDE2LjAwNjEsMzYuMDA2MUMxNi4wMDYxLDMzLjgwMDMgMTcuNzk0MiwzMi4wMTIyIDIwLDMyLjAxMjJaIiBzdHlsZT0iZmlsbDpyZ2IoMTMwLDEzMCwxMzApOyIvPgogICAgICAgIDwvZz4KICAgICAgICA8Zz4KICAgICAgICAgICAgPHBhdGggZD0iTTI4LjQ5MzksMjguNDkzOUMzMC4wNTM2LDI2LjkzNDIgMzIuNTgyNCwyNi45MzQyIDM0LjE0MjEsMjguNDkzOUMzNS43MDE5LDMwLjA1MzYgMzUuNzAxOSwzMi41ODI0IDM0LjE0MjEsMzQuMTQyMUMzMi41ODI0LDM1LjcwMTkgMzAuMDUzNiwzNS43MDE5IDI4LjQ5MzksMzQuMTQyMUMyNi45MzQyLDMyLjU4MjQgMjYuOTM0MiwzMC4wNTM2IDI4LjQ5MzksMjguNDkzOVoiIHN0eWxlPSJmaWxsOnJnYigxMDEsMTAxLDEwMSk7Ii8+CiAgICAgICAgPC9nPgogICAgICAgIDxnPgogICAgICAgICAgICA8cGF0aCBkPSJNMy45OTM5LDE2LjAwNjFDNi4xOTk2OCwxNi4wMDYxIDcuOTg3ODEsMTcuNzk0MiA3Ljk4NzgxLDIwQzcuOTg3ODEsMjIuMjA1OCA2LjE5OTY4LDIzLjk5MzkgMy45OTM5LDIzLjk5MzlDMS43ODgxMywyMy45OTM5IDAsMjIuMjA1OCAwLDIwQzAsMTcuNzk0MiAxLjc4ODEzLDE2LjAwNjEgMy45OTM5LDE2LjAwNjFaIiBzdHlsZT0iZmlsbDpyZ2IoMTg3LDE4NywxODcpOyIvPgogICAgICAgIDwvZz4KICAgICAgICA8Zz4KICAgICAgICAgICAgPHBhdGggZD0iTTUuODU3ODYsMjguNDkzOUM3LjQxNzU4LDI2LjkzNDIgOS45NDYzOCwyNi45MzQyIDExLjUwNjEsMjguNDkzOUMxMy4wNjU4LDMwLjA1MzYgMTMuMDY1OCwzMi41ODI0IDExLjUwNjEsMzQuMTQyMUM5Ljk0NjM4LDM1LjcwMTkgNy40MTc1OCwzNS43MDE5IDUuODU3ODYsMzQuMTQyMUM0LjI5ODE1LDMyLjU4MjQgNC4yOTgxNSwzMC4wNTM2IDUuODU3ODYsMjguNDkzOVoiIHN0eWxlPSJmaWxsOnJnYigxNjQsMTY0LDE2NCk7Ii8+CiAgICAgICAgPC9nPgogICAgICAgIDxnPgogICAgICAgICAgICA8cGF0aCBkPSJNMzYuMDA2MSwxNi4wMDYxQzM4LjIxMTksMTYuMDA2MSA0MCwxNy43OTQyIDQwLDIwQzQwLDIyLjIwNTggMzguMjExOSwyMy45OTM5IDM2LjAwNjEsMjMuOTkzOUMzMy44MDAzLDIzLjk5MzkgMzIuMDEyMiwyMi4yMDU4IDMyLjAxMjIsMjBDMzIuMDEyMiwxNy43OTQyIDMzLjgwMDMsMTYuMDA2MSAzNi4wMDYxLDE2LjAwNjFaIiBzdHlsZT0iZmlsbDpyZ2IoNzQsNzQsNzQpOyIvPgogICAgICAgIDwvZz4KICAgICAgICA8Zz4KICAgICAgICAgICAgPHBhdGggZD0iTTI4LjQ5MzksNS44NTc4NkMzMC4wNTM2LDQuMjk4MTUgMzIuNTgyNCw0LjI5ODE1IDM0LjE0MjEsNS44NTc4NkMzNS43MDE5LDcuNDE3NTggMzUuNzAxOSw5Ljk0NjM4IDM0LjE0MjEsMTEuNTA2MUMzMi41ODI0LDEzLjA2NTggMzAuMDUzNiwxMy4wNjU4IDI4LjQ5MzksMTEuNTA2MUMyNi45MzQyLDkuOTQ2MzggMjYuOTM0Miw3LjQxNzU4IDI4LjQ5MzksNS44NTc4NloiIHN0eWxlPSJmaWxsOnJnYig1MCw1MCw1MCk7Ii8+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4K') no-repeat center center;
|
||||
background-size: 1em 1em;
|
||||
padding-left: 10px; /* for instances where action bar is not full width */
|
||||
padding-right: 10px;
|
||||
}
|
||||
|
||||
/* Styles for unresolved indicator */
|
||||
|
||||
.fediactunresolved {
|
||||
display: inline-block;
|
||||
height: 1.2em;
|
||||
width: 1.2em;
|
||||
color: orange;
|
||||
font-weight: bold;
|
||||
padding-right: 10px;
|
||||
padding-left: 10px
|
||||
}
|
||||
|
||||
/* Styles for after a poll was voted */
|
||||
|
||||
.fediactvoted {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.fediactvoted > a {
|
||||
font-weight: bold !important;
|
||||
color: orange !important;
|
||||
}
|
||||
|
||||
/* Inserted in the bottom right of any external instance where FediAct is running */
|
||||
|
||||
.fediacticon {
|
||||
height: 32px;
|
||||
width: 32px;
|
||||
position: fixed;
|
||||
z-index: 99998;
|
||||
bottom: 50px;
|
||||
right: 20px;
|
||||
background: url('data:image/png;base64,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');
|
||||
background-size: 32px 32px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.fediactsettings_onsite {
|
||||
position: fixed;
|
||||
z-index: 99998;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: auto;
|
||||
background-color: rgba(0,0,0,0.4);
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.fediactsettings_onsite .fediactsettings_onsite_inner {
|
||||
position: absolute;
|
||||
bottom: 15px;
|
||||
right: 15px;
|
||||
padding: 10px 15px;
|
||||
background: white;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.fediactsettings_onsite .fediactsettings_onsite_inner a {
|
||||
color: blue !important;
|
||||
}
|
||||
|
||||
/* keyframes fa_*/
|
||||
|
||||
@-webkit-keyframes fa_fadeIn {
|
||||
from {
|
||||
-webkit-filter: opacity(0);
|
||||
filter: opacity(0);
|
||||
}
|
||||
}
|
||||
@keyframes fa_fadeIn {
|
||||
from {
|
||||
-webkit-filter: opacity(0);
|
||||
filter: opacity(0);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes fa_fadeOut {
|
||||
to {
|
||||
-webkit-filter: opacity(0);
|
||||
filter: opacity(0);
|
||||
}
|
||||
}
|
||||
@keyframes fa_fadeOut {
|
||||
to {
|
||||
-webkit-filter: opacity(0);
|
||||
filter: opacity(0);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes fa_scaleInSmall {
|
||||
from {
|
||||
-webkit-transform: scale(.98);
|
||||
transform: scale(.98);
|
||||
}
|
||||
}
|
||||
@keyframes fa_scaleInSmall {
|
||||
from {
|
||||
-webkit-transform: scale(.98);
|
||||
transform: scale(.98);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes fa_scaleInFadeSmall {
|
||||
from {
|
||||
-webkit-transform: scale(.98);
|
||||
transform: scale(.98);
|
||||
-webkit-filter: opacity(0);
|
||||
filter: opacity(0);
|
||||
}
|
||||
}
|
||||
@keyframes fa_scaleInFadeSmall {
|
||||
from {
|
||||
-webkit-transform: scale(.98);
|
||||
transform: scale(.98);
|
||||
-webkit-filter: opacity(0);
|
||||
filter: opacity(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
We insert these styles for the DOMNodeAppeared function as separate stylesheet (see manifest) to fix
|
||||
Firefox blocking script-inserted <style> elements due to the site's CSP (long time bug)
|
||||
*/
|
||||
|
||||
@-moz-keyframes fa_nodeInserted {
|
||||
from {
|
||||
opacity: 1;
|
||||
} to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes fa_nodeInserted {
|
||||
from {
|
||||
opacity: 1;
|
||||
} to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@-ms-keyframes fa_nodeInserted {
|
||||
from {
|
||||
opacity: 1;
|
||||
} to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@-o-keyframes fa_nodeInserted {
|
||||
from {
|
||||
opacity: 1;
|
||||
} to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
@keyframes fa_nodeInserted {
|
||||
from {
|
||||
opacity: 1;
|
||||
} to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
div.status,
|
||||
div.detailed-status,
|
||||
div.detailed-status__action-bar,
|
||||
div.account__header button.logo-button,
|
||||
div.account__header button.button--follow,
|
||||
div.public-account-header a.logo-button,
|
||||
div.account-card a.logo-button,
|
||||
div.directory-card a.icon-button,
|
||||
div.detailed-status a.logo-button,
|
||||
button.remote-button,
|
||||
script#initial-state {
|
||||
-webkit-animation-name: fa_nodeInserted !important;
|
||||
-webkit-animation-duration: 0.001s !important;
|
||||
-ms-animation-name: fa_nodeInserted !important;
|
||||
-ms-animation-duration: 0.001s !important;
|
||||
-moz-animation-name: fa_nodeInserted !important;
|
||||
-moz-animation-duration: 0.001s !important;
|
||||
-o-animation-name: fa_nodeInserted !important;
|
||||
-o-animation-duration: 0.001s !important;
|
||||
animation-name: fa_nodeInserted !important;
|
||||
animation-duration: 0.001s !important;
|
||||
}
|
BIN
src/icon/48.png
Przed Szerokość: | Wysokość: | Rozmiar: 2.0 KiB Po Szerokość: | Wysokość: | Rozmiar: 3.4 KiB |
1966
src/inject.js
154
src/popup.html
|
@ -1,47 +1,129 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
.hide {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
<link rel="stylesheet" href="chrome://browser/content/extension.css">
|
||||
<meta name="color-scheme" content="dark light">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<script src="lib/jquery-3.6.1.min.js"></script>
|
||||
<script src="popup.min.js"></script>
|
||||
<link rel="stylesheet" href="popup_styles.min.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="mhi-wrapper">
|
||||
<div id="mhi-containers">
|
||||
<form id="fedifollow-settings">
|
||||
<label for="homeinstance">Home instance (make sure you are logged in):</label><br>
|
||||
<input type="text" id="homeinstance" name="homeinstance" placeholder="mastodon.social"><br>
|
||||
<label for="alert">Alert on redirect:</label><br>
|
||||
<input type="checkbox" id="alert" name="alert"><br>
|
||||
<label for="alert">Auto-action:</label><br>
|
||||
<input type="checkbox" id="autoaction" name="autoaction"><br>
|
||||
<label for="target">Open in:</label><br>
|
||||
<select name="target" id="target" selected="_blank">
|
||||
<option id="target_blank" value="_blank">New tab</option>
|
||||
<option id="target_self" value="_self">Same tab</option>
|
||||
</select><br>
|
||||
<label for="mode">Mode:</label><br>
|
||||
<select name="mode" id="mode" selected="blacklist">
|
||||
<option id="blacklist" value="blacklist">All (with blacklist)</option>
|
||||
<option id="whitelist" value="whitelist">Whitelist</option>
|
||||
</select><br>
|
||||
<div class="hide" id="blacklist_input">
|
||||
<label for="blacklist_content">Blacklist (one per line):</label><br>
|
||||
<textarea id="blacklist_content" name="blacklist_content" placeholder="mastodon.social infosec.exchange"></textarea><br>
|
||||
<div id="mhi-wrapper">
|
||||
<div id="mhi-containers">
|
||||
<form id="fediact-settings">
|
||||
<div class="scroller">
|
||||
<fieldset aria-labelledby="homeServerDomainLabel">
|
||||
<div class="row">
|
||||
<label for="homeinstance">
|
||||
<legend id="homeServerDomainLabel"><h1>Home Server Domain</h1></legend>
|
||||
<span>
|
||||
Make sure you are logged in to your home server
|
||||
</span>
|
||||
</label>
|
||||
<div class="text-input-container">
|
||||
<span>https://</span>
|
||||
<input type="text" id="homeinstance" name="homeinstance" placeholder="example.social">
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>Redirect Settings</legend>
|
||||
<div class="row">
|
||||
<label for="redirects">Enable
|
||||
<span>
|
||||
Redirect on double click and reply
|
||||
</span>
|
||||
</label>
|
||||
<input type="checkbox" id="redirects" name="redirects">
|
||||
</div>
|
||||
<div class="row">
|
||||
<label for="alert">Prompt
|
||||
<span>
|
||||
Show confirmation dialog before redirecting
|
||||
</span>
|
||||
</label>
|
||||
<input type="checkbox" id="alert" name="alert">
|
||||
</div>
|
||||
<div class="row">
|
||||
<label for="target">Open in...</label>
|
||||
<select name="target" id="target" selected="_blank">
|
||||
<option id="target_blank" value="_blank">New tab </option>
|
||||
<option id="target_self" value="_self">Same tab </option>
|
||||
</select>
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>Other Settings</legend>
|
||||
<div class="row">
|
||||
<label for="autoaction">Actions
|
||||
<span>
|
||||
Enable follow, boost, etc. on other servers
|
||||
</span>
|
||||
</label>
|
||||
<input type="checkbox" id="autoaction" name="autoaction">
|
||||
</div>
|
||||
<div class="row">
|
||||
<label for="hidemuted">Hide muted/blocked
|
||||
<span>
|
||||
Can fail / decrease performance in some cases
|
||||
</span>
|
||||
</label>
|
||||
<input type="checkbox" id="hidemuted" name="hidemuted">
|
||||
</div>
|
||||
<div class="row">
|
||||
<label for="delay">API delay
|
||||
<span>
|
||||
Only allow one API request every 500ms
|
||||
</span>
|
||||
</label>
|
||||
<input type="checkbox" id="delay" name="delay">
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>Mode</legend>
|
||||
<div class="row">
|
||||
<label for="runifloggedin">Ignore sessions
|
||||
<span>
|
||||
Run FediAct on instances where I'm logged in
|
||||
</span>
|
||||
</label>
|
||||
<input type="checkbox" id="runifloggedin" name="runifloggedin">
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>Filtered servers</legend>
|
||||
<div class="row">
|
||||
<label for="mode">Mode
|
||||
<span class="hide" id="allowlabel">
|
||||
Only run on the following domains...
|
||||
</span>
|
||||
<span class="hide" id="denylabel">
|
||||
Run on all domains except the following...
|
||||
</span>
|
||||
</label>
|
||||
<select name="mode" id="mode" selected="blacklist">
|
||||
<option id="blacklist" value="blacklist">Denylist </option>
|
||||
<option id="whitelist" value="whitelist">Allowlist </option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="hide textarea-container" id="blacklist_input">
|
||||
<textarea id="blacklist_content" name="blacklist_content" placeholder="example.social example2.social"></textarea>
|
||||
</div>
|
||||
<div class="hide textarea-container" id="whitelist_input">
|
||||
<textarea id="whitelist_content" name="whitelist_content" placeholder="example.social example2.social"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
<div class="footer">
|
||||
<input type="submit" value="Save">
|
||||
<span id="indicator" style="display:none">Settings saved!</span>
|
||||
<span><a target="_blank" href="https://github.com/lartsch/FediAct">More info / help on Github</a></span>
|
||||
</div>
|
||||
<div class="hide" id="whitelist_input">
|
||||
<label for="whitelist_content">Whitelist (one per line):</label><br>
|
||||
<textarea id="whitelist_content" name="whitelist_content" placeholder="mastodon.social infosec.exchange"></textarea><br>
|
||||
</div><br>
|
||||
<input type="submit" value="Submit">
|
||||
<span id="indicator" style="display:none">Settings saved!</span>
|
||||
<br><br><span>Made by <a target="_blank" href="https://github.com/lartsch">github.com/lartsch</a></span>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<script src="lib/jquery-3.6.1.min.js"></script>
|
||||
<script src="popup.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
147
src/popup.js
|
@ -1,86 +1,129 @@
|
|||
|
||||
// settings keys with defauls
|
||||
var settings = {
|
||||
fedifollow_homeinstance: null,
|
||||
fedifollow_alert: false,
|
||||
fedifollow_mode: "blacklist",
|
||||
fedifollow_whitelist: null,
|
||||
fedifollow_blacklist: null,
|
||||
fedifollow_target: "_blank",
|
||||
fedifollow_autoaction: true
|
||||
// required settings keys with defauls
|
||||
const settingsDefaults = {
|
||||
fediact_homeinstance: null,
|
||||
fediact_alert: false,
|
||||
fediact_mode: "blacklist",
|
||||
fediact_whitelist: null,
|
||||
fediact_blacklist: null,
|
||||
fediact_target: "_self",
|
||||
fediact_autoaction: true,
|
||||
fediact_redirects: true,
|
||||
fediact_enabledelay: true,
|
||||
fediact_hidemuted: false,
|
||||
fediact_runifloggedin: false,
|
||||
}
|
||||
|
||||
// fix for cross-browser storage api compatibility
|
||||
var browser, chrome;
|
||||
var browser, chrome, settings
|
||||
const enableConsoleLog = true
|
||||
const logPrepend = "[FediAct]"
|
||||
|
||||
function onError(error){
|
||||
console.error(`[FediFollow] Error: ${error}`)
|
||||
// wrapper to prepend to log messages
|
||||
function log(text) {
|
||||
if (enableConsoleLog) {
|
||||
console.log(logPrepend + ' ' + text)
|
||||
}
|
||||
}
|
||||
|
||||
// this performs loading the settings into the popup, reacting to changes and saving changes
|
||||
function popupTasks(settings) {
|
||||
|
||||
function popupTasks() {
|
||||
// function to show confirmation when settings were updated successfully
|
||||
function showConfirmation() {
|
||||
$("span#indicator").show();
|
||||
$("span#indicator").show()
|
||||
setTimeout(function() {
|
||||
$("span#indicator").hide();
|
||||
}, 1500);
|
||||
$("span#indicator").hide()
|
||||
}, 1500)
|
||||
}
|
||||
|
||||
function updateSettings(){
|
||||
// get all current values and write them to the local storage
|
||||
async function updateSettings(){
|
||||
// update settings values
|
||||
settings.fedifollow_homeinstance = $("input#homeinstance").val().trim();
|
||||
settings.fedifollow_alert = $("input#alert").is(':checked');
|
||||
settings.fedifollow_mode = $("select#mode").val();
|
||||
settings.fedifollow_whitelist = $("textarea#whitelist_content").val();
|
||||
settings.fedifollow_blacklist = $("textarea#blacklist_content").val();
|
||||
settings.fedifollow_target = $("select#target").val();
|
||||
settings.fedifollow_autoaction = $("input#autoaction").is(':checked');
|
||||
settings.fediact_homeinstance = $("input#homeinstance").val().trim().toLowerCase()
|
||||
settings.fediact_alert = $("input#alert").is(':checked')
|
||||
settings.fediact_mode = $("select#mode").val()
|
||||
settings.fediact_whitelist = $("textarea#whitelist_content").val()
|
||||
settings.fediact_blacklist = $("textarea#blacklist_content").val()
|
||||
settings.fediact_target = $("select#target").val()
|
||||
settings.fediact_autoaction = $("input#autoaction").is(':checked')
|
||||
settings.fediact_redirects = $("input#redirects").is(':checked')
|
||||
settings.fediact_enabledelay = $("input#delay").is(':checked')
|
||||
settings.fediact_hidemuted = $("input#hidemuted").is(':checked')
|
||||
settings.fediact_runifloggedin = $("input#runifloggedin").is(':checked')
|
||||
// write to storage
|
||||
const waitForSaved = (browser || chrome).storage.local.set(settings);
|
||||
try {
|
||||
await (browser || chrome).storage.local.set(settings)
|
||||
} catch {
|
||||
log(e)
|
||||
return false
|
||||
}
|
||||
// show saved indicator after successful save
|
||||
waitForSaved.then(showConfirmation(), onError);
|
||||
showConfirmation()
|
||||
}
|
||||
|
||||
// restore form based on loaded settings
|
||||
function restoreForm() {
|
||||
// set all default/configured values and show fields accordingly
|
||||
$("input#homeinstance").val(settings.fedifollow_homeinstance);
|
||||
$("textarea#blacklist_content").val(settings.fedifollow_blacklist);
|
||||
$("textarea#whitelist_content").val(settings.fedifollow_whitelist);
|
||||
$("select#mode").val(settings.fedifollow_mode);
|
||||
$("select#target").val(settings.fedifollow_target);
|
||||
$("input#alert").prop('checked', settings.fedifollow_alert);
|
||||
$("input#autoaction").prop('checked', settings.fedifollow_autoaction);
|
||||
$("input#homeinstance").val(settings.fediact_homeinstance)
|
||||
$("textarea#blacklist_content").val(settings.fediact_blacklist)
|
||||
$("textarea#whitelist_content").val(settings.fediact_whitelist)
|
||||
$("select#mode").val(settings.fediact_mode)
|
||||
$("select#target").val(settings.fediact_target)
|
||||
$("input#alert").prop('checked', settings.fediact_alert)
|
||||
$("input#autoaction").prop('checked', settings.fediact_autoaction)
|
||||
$("input#redirects").prop('checked', settings.fediact_redirects)
|
||||
$("input#delay").prop('checked', settings.fediact_enabledelay)
|
||||
$("input#hidemuted").prop('checked', settings.fediact_hidemuted)
|
||||
$("input#runifloggedin").prop('checked', settings.fediact_runifloggedin)
|
||||
// both containers are hidden by default
|
||||
if ($("select#mode").val() == "whitelist") {
|
||||
$("div#whitelist_input").show();
|
||||
$("div#whitelist_input").removeClass("hide")
|
||||
$("span#allowlabel").removeClass("hide")
|
||||
} else {
|
||||
$("div#blacklist_input").show();
|
||||
$("div#blacklist_input").removeClass("hide")
|
||||
$("span#denylabel").removeClass("hide")
|
||||
}
|
||||
// check changes of the select to update whitelist/blacklist input
|
||||
$("select#mode").change(function() {
|
||||
if ($("select#mode").val() == "whitelist") {
|
||||
$("div#blacklist_input").hide();
|
||||
$("div#whitelist_input").show();
|
||||
$("div#blacklist_input").addClass("hide")
|
||||
$("span#denylabel").addClass("hide")
|
||||
$("div#whitelist_input").removeClass("hide")
|
||||
$("span#allowlabel").removeClass("hide")
|
||||
} else {
|
||||
$("div#whitelist_input").hide();
|
||||
$("div#blacklist_input").show();
|
||||
$("div#whitelist_input").addClass("hide")
|
||||
$("span#allowlabel").addClass("hide")
|
||||
$("div#blacklist_input").removeClass("hide")
|
||||
$("span#denylabel").removeClass("hide")
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
// restore the form values
|
||||
restoreForm();
|
||||
restoreForm()
|
||||
// perform storage actions on form submit
|
||||
$("form#fedifollow-settings").on('submit', function(e){
|
||||
$("form#fediact-settings").on('submit', async function(e){
|
||||
// prevent default
|
||||
e.preventDefault();
|
||||
e.preventDefault()
|
||||
// update settings
|
||||
updateSettings();
|
||||
});
|
||||
});
|
||||
|
||||
updateSettings()
|
||||
try {
|
||||
await chrome.runtime.sendMessage({updatedsettings: true})
|
||||
} catch(e) {
|
||||
log(e)
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
(browser || chrome).storage.local.get(settings).then(popupTasks, onError);
|
||||
async function loadAndRun() {
|
||||
try {
|
||||
settings = await (browser || chrome).storage.local.get(settingsDefaults)
|
||||
} catch(e) {
|
||||
log(e)
|
||||
return false
|
||||
}
|
||||
if (settings) {
|
||||
popupTasks()
|
||||
}
|
||||
}
|
||||
|
||||
loadAndRun()
|
|
@ -0,0 +1 @@
|
|||
const t={fediact_homeinstance:null,fediact_alert:!1,fediact_mode:"blacklist",fediact_whitelist:null,fediact_blacklist:null,fediact_target:"_self",fediact_autoaction:!0,fediact_redirects:!0,fediact_enabledelay:!0,fediact_hidemuted:!1,fediact_runifloggedin:!1};var browser,chrome,i;const a=!0,c="[FediAct]";function d(e){a&&console.log(c+" "+e)}function l(){async function t(){i.fediact_homeinstance=$("input#homeinstance").val().trim().toLowerCase(),i.fediact_alert=$("input#alert").is(":checked"),i.fediact_mode=$("select#mode").val(),i.fediact_whitelist=$("textarea#whitelist_content").val(),i.fediact_blacklist=$("textarea#blacklist_content").val(),i.fediact_target=$("select#target").val(),i.fediact_autoaction=$("input#autoaction").is(":checked"),i.fediact_redirects=$("input#redirects").is(":checked"),i.fediact_enabledelay=$("input#delay").is(":checked"),i.fediact_hidemuted=$("input#hidemuted").is(":checked"),i.fediact_runifloggedin=$("input#runifloggedin").is(":checked");try{await(browser||chrome).storage.local.set(i)}catch{return d(e),!1}$("span#indicator").show(),setTimeout(function(){$("span#indicator").hide()},1500)}$(document).ready(function(){$("input#homeinstance").val(i.fediact_homeinstance),$("textarea#blacklist_content").val(i.fediact_blacklist),$("textarea#whitelist_content").val(i.fediact_whitelist),$("select#mode").val(i.fediact_mode),$("select#target").val(i.fediact_target),$("input#alert").prop("checked",i.fediact_alert),$("input#autoaction").prop("checked",i.fediact_autoaction),$("input#redirects").prop("checked",i.fediact_redirects),$("input#delay").prop("checked",i.fediact_enabledelay),$("input#hidemuted").prop("checked",i.fediact_hidemuted),$("input#runifloggedin").prop("checked",i.fediact_runifloggedin),("whitelist"==$("select#mode").val()?($("div#whitelist_input").removeClass("hide"),$("span#allowlabel")):($("div#blacklist_input").removeClass("hide"),$("span#denylabel"))).removeClass("hide"),$("select#mode").change(function(){("whitelist"==$("select#mode").val()?($("div#blacklist_input").addClass("hide"),$("span#denylabel").addClass("hide"),$("div#whitelist_input").removeClass("hide"),$("span#allowlabel")):($("div#whitelist_input").addClass("hide"),$("span#allowlabel").addClass("hide"),$("div#blacklist_input").removeClass("hide"),$("span#denylabel"))).removeClass("hide")}),$("form#fediact-settings").on("submit",async function(e){e.preventDefault(),t();try{await chrome.runtime.sendMessage({updatedsettings:!0})}catch(e){d(e)}})})}async function n(){try{i=await(browser||chrome).storage.local.get(t)}catch(e){return d(e),!1}i&&l()}n();
|
|
@ -0,0 +1,227 @@
|
|||
html, body {
|
||||
margin: 0;
|
||||
height: var(--popup-height);
|
||||
min-width: 300px;
|
||||
max-height: 900px;
|
||||
}
|
||||
html {
|
||||
--highlight: rgba(130,130,150,0.1);
|
||||
--confirmation: rgb(38, 133, 0);
|
||||
--hover: rgba(120,120,130,0.15);
|
||||
--border: rgba(120,120,130,0.3);
|
||||
--border-2: rgba(130,130,150,0.3);
|
||||
--radius: 12px;
|
||||
--popup-height: 450px;
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-box-direction: normal;
|
||||
-ms-flex-direction: column;
|
||||
flex-direction: column;
|
||||
height: 100%;
|
||||
}
|
||||
body {
|
||||
-webkit-box-flex: 1;
|
||||
-ms-flex-positive: 1;
|
||||
flex-grow: 1;
|
||||
min-height: var(--popup-height);
|
||||
}
|
||||
.hide {
|
||||
display: none;
|
||||
}
|
||||
h1 {
|
||||
font-size: 1em;
|
||||
margin-block: .2em;
|
||||
}
|
||||
h2 {
|
||||
font-size: 1em;
|
||||
}
|
||||
#mhi-wrapper, #mhi-containers {
|
||||
display: contents;
|
||||
}
|
||||
form {
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-box-direction: normal;
|
||||
-ms-flex-direction: column;
|
||||
flex-direction: column;
|
||||
height: 100%;
|
||||
}
|
||||
.scroller {
|
||||
height: 0;
|
||||
overflow-y: auto;
|
||||
-webkit-box-flex: 1;
|
||||
-ms-flex-positive: 1;
|
||||
flex-grow: 1;
|
||||
padding: 10px;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
fieldset {
|
||||
all: unset;
|
||||
display: block;
|
||||
}
|
||||
legend {
|
||||
all: unset;
|
||||
}
|
||||
fieldset > legend, summary {
|
||||
margin-inline: .6em;
|
||||
padding-top: .6em;
|
||||
margin-bottom: .4em;
|
||||
font-weight: 700;
|
||||
}
|
||||
.row {
|
||||
background-color: var(--highlight);
|
||||
padding: .8em;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
-ms-flex-wrap: wrap;
|
||||
flex-wrap: wrap;
|
||||
margin-bottom: 2px;
|
||||
position: relative;
|
||||
gap: .4em;
|
||||
-webkit-transition: background-color .1s;
|
||||
-o-transition: background-color .1s;
|
||||
transition: background-color .1s;
|
||||
}
|
||||
.row:hover, .row:focus-within {
|
||||
background: var(--hover);
|
||||
}
|
||||
.row:first-of-type {
|
||||
border-top-left-radius: var(--radius);
|
||||
border-top-right-radius: var(--radius);
|
||||
}
|
||||
.row:last-of-type {
|
||||
border-bottom-left-radius: var(--radius);
|
||||
border-bottom-right-radius: var(--radius);
|
||||
}
|
||||
label {
|
||||
width: 0;
|
||||
-webkit-box-flex: 9999;
|
||||
-ms-flex-positive: 9999;
|
||||
flex-grow: 9999;
|
||||
}
|
||||
label::before { /* Make entire .row clickable */
|
||||
content: "";
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
}
|
||||
label span {
|
||||
display: block;
|
||||
font-size: .9em;
|
||||
opacity: .7;
|
||||
margin-top: .2em;
|
||||
}
|
||||
.text-input-container {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
border: 1px solid var(--border);
|
||||
border-radius: calc(var(--radius) / 2);
|
||||
overflow: hidden;
|
||||
}
|
||||
.text-input-container span {
|
||||
padding: .7em;
|
||||
background-color: var(--highlight);
|
||||
}
|
||||
.text-input-container input {
|
||||
border: 0 !important;
|
||||
border-radius: 0 !important;
|
||||
outline: 0;
|
||||
}
|
||||
.text-input-container:focus-within {
|
||||
outline: auto; /* This is the browser's default focus outline */
|
||||
}
|
||||
input, textarea, select {
|
||||
border: 1px solid var(--border);
|
||||
padding: .7em;
|
||||
border-radius: calc(var(--radius) / 2);
|
||||
font-size: inherit;
|
||||
-webkit-box-flex: 1;
|
||||
-ms-flex-positive: 1;
|
||||
flex-grow: 1;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
}
|
||||
.textarea-container {
|
||||
width: calc(100% - .14em);
|
||||
border-radius: inherit;
|
||||
}
|
||||
textarea {
|
||||
resize: vertical;
|
||||
width: 100%;
|
||||
}
|
||||
select {
|
||||
margin-block: -.8em;
|
||||
padding-block: .4em;
|
||||
border: 0;
|
||||
background: none;
|
||||
text-align: right;
|
||||
}
|
||||
.footer {
|
||||
padding: 10px;
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
-ms-flex-wrap: wrap;
|
||||
flex-wrap: wrap;
|
||||
-webkit-box-align: center;
|
||||
-ms-flex-align: center;
|
||||
align-items: center;
|
||||
-webkit-box-pack: justify;
|
||||
-ms-flex-pack: justify;
|
||||
justify-content: space-between;
|
||||
border-top: 1px dashed var(--border-2);
|
||||
position: relative;
|
||||
background-color: var(--highlight);
|
||||
-webkit-box-shadow: 0 0 24px rgba(0,0,0,0.1);
|
||||
box-shadow: 0 0 24px rgba(0,0,0,0.1);
|
||||
}
|
||||
[type="submit"] {
|
||||
-webkit-box-flex: 0;
|
||||
-ms-flex-positive: 0;
|
||||
flex-grow: 0;
|
||||
padding-inline: 2em;
|
||||
}
|
||||
[type="submit"]:not(:hover):not(:focus) {
|
||||
background: none;
|
||||
}
|
||||
.footer span {
|
||||
width: 0;
|
||||
-webkit-box-flex: 1;
|
||||
-ms-flex-positive: 1;
|
||||
flex-grow: 1;
|
||||
text-align: right;
|
||||
padding-inline: 1em;
|
||||
}
|
||||
.footer a {
|
||||
opacity: .7;
|
||||
text-underline-offset: .2em;
|
||||
color: inherit;
|
||||
}
|
||||
#indicator {
|
||||
-webkit-box-ordinal-group: 0;
|
||||
-ms-flex-order: -1;
|
||||
order: -1;
|
||||
width: calc(100% + 20px);
|
||||
font-weight: 600;
|
||||
padding: .7em;
|
||||
margin: -10px;
|
||||
margin-bottom: 8px;
|
||||
background-color: var(--confirmation);
|
||||
text-align: center;
|
||||
color: white;
|
||||
}
|
||||
@media (prefers-color-scheme: dark) {
|
||||
body {
|
||||
color: white;
|
||||
background-color: #1c1b22;
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
html,body{margin:0;height:var(--popup-height);min-width:300px;max-height:900px}html{--highlight:rgba(130,130,150,0.1);--confirmation:#268500;--hover:rgba(120,120,130,0.15);--border:rgba(120,120,130,0.3);--border-2:rgba(130,130,150,0.3);--radius:12px;--popup-height:450px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:100%}body{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;min-height:var(--popup-height)}.hide{display:none}h1{font-size:1em;margin-block:.2em}h2{font-size:1em}#mhi-wrapper,#mhi-containers{display:contents}form{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:100%}.scroller{height:0;overflow-y:auto;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;padding:10px;-webkit-box-sizing:border-box;box-sizing:border-box}fieldset{all:unset;display:block}legend{all:unset}fieldset>legend,summary{margin-inline:.6em;padding-top:.6em;margin-bottom:.4em;font-weight:700}.row{background-color:var(--highlight);padding:.8em;-webkit-box-sizing:border-box;box-sizing:border-box;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:2px;position:relative;gap:.4em;-webkit-transition:background-color .1s;-o-transition:background-color .1s;transition:background-color .1s}.row:hover,.row:focus-within{background:var(--hover)}.row:first-of-type{border-top-left-radius:var(--radius);border-top-right-radius:var(--radius)}.row:last-of-type{border-bottom-left-radius:var(--radius);border-bottom-right-radius:var(--radius)}label{width:0;-webkit-box-flex:9999;-ms-flex-positive:9999;flex-grow:9999}label::before{content:"";position:absolute;inset:0}label span{display:block;font-size:.9em;opacity:.7;margin-top:.2em}.text-input-container{width:100%;display:flex;border:1px solid var(--border);border-radius:calc(var(--radius) / 2);overflow:hidden}.text-input-container span{padding:.7em;background-color:var(--highlight)}.text-input-container input{border:0 !important;border-radius:0 !important;outline:0}.text-input-container:focus-within{outline:auto}input,textarea,select{border:1px solid var(--border);padding:.7em;border-radius:calc(var(--radius) / 2);font-size:inherit;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;z-index:2}.textarea-container{width:calc(100% - .14em);border-radius:inherit}textarea{resize:vertical;width:100%}select{margin-block:-.8em;padding-block:.4em;border:0;background:0;text-align:right}.footer{padding:10px;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;border-top:1px dashed var(--border-2);position:relative;background-color:var(--highlight);-webkit-box-shadow:0 0 24px rgba(0,0,0,0.1);box-shadow:0 0 24px rgba(0,0,0,0.1)}[type="submit"]{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;padding-inline:2em}[type="submit"]:not(:hover):not(:focus){background:0}.footer span{width:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;text-align:right;padding-inline:1em}.footer a{opacity:.7;text-underline-offset:.2em;color:inherit}#indicator{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1;width:calc(100% + 20px);font-weight:600;padding:.7em;margin:-10px;margin-bottom:8px;background-color:var(--confirmation);text-align:center;color:white}@media(prefers-color-scheme:dark){body{color:white;background-color:#1c1b22}}
|