Compare commits

...

141 Commits

Author SHA1 Message Date
Jason McBrayer e6c5273a2f Bump version number for pleroma features 2020-07-08 13:26:11 -04:00
Jason McBrayer 012c0b74c1 Update intercooler.js 2020-07-08 13:24:00 -04:00
Jason McBrayer adc65f8d5a Upgrade jquery and remove zepto 2020-07-08 13:23:04 -04:00
Jason McBrayer d43d9cf6a6 Ignore yarn.lock 2020-07-08 13:21:34 -04:00
Jason McBrayer fd5e4874c8 Fix errors introduced in same_user, apply standard formatting 2020-07-08 12:58:38 -04:00
GCU Prosthetic Conscience b1a2c7f57d
Merge pull request #76 from cyisfor/handle_feature_set_errors
Handle feature set errors from Pleroma
2020-07-08 12:37:02 -04:00
GCU Prosthetic Conscience 8c5c48fd19
Merge pull request #79 from cyisfor/pleroma_account_search_workaround
Pleroma account search workaround
2020-07-08 12:16:27 -04:00
GCU Prosthetic Conscience ab5b734dbb
Merge pull request #77 from cyisfor/catch_session_expiration_error
Mastodon.py raises an error when session is expired
2020-07-01 08:37:40 -04:00
GCU Prosthetic Conscience a05d09289a
Merge pull request #74 from cyisfor/sophistifimacation
hiding, I mean, sophistimacatifying the instance url checking
2020-06-01 10:40:42 -04:00
GCU Prosthetic Conscience 9a99f34945
Merge pull request #73 from cyisfor/last_seen_index_error
random exception when viewing notifications
2020-06-01 10:36:23 -04:00
GCU Prosthetic Conscience 12f0fab3b2
Merge pull request #72 from cyisfor/dark_textareas
textareas and inputs in bulmaswatch-darkly were hurting my eyes.
2020-06-01 10:34:14 -04:00
Jason McBrayer b2d13e4520 Add help to preview_sensitive preference 2020-06-01 10:32:43 -04:00
Jason McBrayer b806d6c89d Reformat settings.html 2020-06-01 10:26:25 -04:00
Jason McBrayer 0971997ad3 Rearrange/reorganize settings 2020-06-01 10:25:43 -04:00
Jason McBrayer 391f31c76c Add migration for last config change 2020-06-01 10:22:28 -04:00
GCU Prosthetic Conscience a536c35dfd
Merge pull request #71 from cyisfor/preview_sensitive
Preview sensitive media
2020-06-01 10:15:25 -04:00
GCU Prosthetic Conscience 62362d8ab6
Merge pull request #70 from cyisfor/cohesive_preferences_code
Cohesive preferences code
2020-06-01 10:09:55 -04:00
Jason McBrayer 496d045356 Apparently we were missing a migration?
Hope this doesn't break anything for anyone else.
2020-06-01 09:53:58 -04:00
cyisfor 22036aa22c
Flake ids (#68)
This is a series of squashed commits from cysfor @ github.

* Pleroma base62 "flake_id" isn't a decimal integer

* Is it the path order?

Still learning Django, making sure it's not erroring out because the path order is backwards. /user/:id dies saying /user/:id/next/:thingy won't parse, so I thought they might be out of order. But actually the template main/user.html silently recurses when you do /user/:id sending another query for /user/:id/next/:etc.

* I figure out flake_ids

Go figure Pleroma can't even use hexadecimal numbers. Nope, base62 is clearly the way to go. They're working for me, at any rate.

Co-authored-by: Cy <autocommit>
Co-authored-by: Cy <email>
2020-06-01 09:43:54 -04:00
Jason McBrayer ae7be271c9 Update notification about github mirror 2020-06-01 09:41:33 -04:00
Jason McBrayer 9a89664baf Merge branch 'master' of github.com:jfmcbrayer/brutaldon 2020-06-01 09:40:02 -04:00
Cy 9b062437af
Oops, left some debugging in there 2020-06-01 08:39:16 +00:00
Cy f471cf656f
Missed a same_username
Making sure to check the username in the fallback too. Otherwise, seems to be working!
2020-06-01 08:34:39 +00:00
Cy 6d22b6fc66 Pleroma bug requires /search before /account_search works
Bluh... falling back to /search if /account_search fails.
2020-06-01 08:31:31 +00:00
Cy 9dd5e44e6f More debugging
Trying to understand what's coming over the wire again
2020-06-01 08:30:28 +00:00
Cy 0b418f985d Trying to figure out why it's not finding accounts
Refactoring the code to be a little more readable...
2020-06-01 08:25:01 +00:00
Cy dd19608b66
Mastodon.py raises an error when session is expired
Sometimes Brutaldon thinks it has a valid session key, but the upstream Fediverse server does not, and Brutaldon needs to handle that. Brutal probably should un-set its own internal logged-in state when that happens, but for now it just returns the same thing as if you weren't logged into Brutaldon, making you log in again, making Brutaldon get a new session token from upstream.
2020-06-01 00:21:38 +00:00
Cy 9415defede
whoops, left an old mistake in the code 2020-05-31 02:22:47 +00:00
Cy c0caab4919
Missed a few status_post calls 2020-05-31 01:04:43 +00:00
Cy 39f13d64fd
Allow previewing sensitive images
A setting to not censor sensitive images if you think you're not in danger for looking at them.
2020-05-30 23:23:36 +00:00
Cy 0439440f40
Foreign keys add magic members
Because when you add one field to a class, you clearly want to add two fields to a class, and there's no need to consider the field you never asked to add to be something other than a field.
2020-05-30 23:20:16 +00:00
Cy 0b93eb78f4
Refactoring preferences to be more cohesive
No need to list the preference fields three times in three places in the code. A class decorator ought to be able to sleuth them out from the model itself. Should make it easier to add new preferences.
2020-05-30 23:19:49 +00:00
Cy 12d7b4cb7d
Handle feature_set errors automatically
Recreate the mastodon object if there's an error complaining about a missing feature set. Only happens for status_post I think. Could be further generalized...
2020-05-30 23:10:50 +00:00
Cy 2dfdb0b859
Support feature_set= other than mainline for Mastodon
Pleroma will send records that cause brutaldon to make pleroma-specific responses, which the mastodon python module wigs out on claiming it doesn't support that "feature set" so allow for a feature set to be specified...
2020-05-30 23:07:38 +00:00
Cy c3f6503bec
random exception when viewing notifications
I think it's a rare occasion that there are no last seen notifications, in which case just ignoring it and setting account.note_seen later works fine.
2020-05-30 21:26:02 +00:00
Cy bf0394ca36
textareas and inputs in bulmaswatch-darkly were hurting my eyes.
(#fff) is not a good background color to compose posts in, that are then displayed with the dark background color.
2020-05-30 21:23:46 +00:00
Cy 17aae685ea
hiding, I mean, sophistimacatifying the instance url checking 2020-05-30 20:58:21 +00:00
Jason McBrayer 2354dadddb Catch MastodonNotFoundErrors that were not being caught
This will cause a much more sensible error message in the case of
trying to reply to or view the thread of deleted messages
2020-03-10 18:38:03 -04:00
GCU Prosthetic Conscience 00e35409ef
Merge pull request #66 from garbados/master
Bring Brutaldon mirror up to date

Note the primary repository is https://git.carcosa.net/jmcbray/brutaldon
2020-01-31 13:58:33 -05:00
Diana Thayer aa8585bb24
Merge branch 'master' of github.com:garbados/brutaldon 2020-01-31 03:15:21 +01:00
Jason McBrayer 72c7bbcc3d Bump patch level for bug fixes 2019-11-26 08:51:59 -05:00
Jason McBrayer 31c6d0b5f0 Fix rare crash in notifications 2019-11-26 08:48:50 -05:00
Jason McBrayer ecdaabff33 Fix accessibility issue with expand CW button 2019-11-08 10:38:46 -05:00
Jason McBrayer f6d0cfee61 Fix sorting of bundled notifications 2019-11-08 10:24:10 -05:00
Jason McBrayer 428c1e1508 Make bookmarklet available in footer of every page 2019-11-08 10:06:45 -05:00
Jason McBrayer fb2970af3b Fix a bug in bundling notes 2019-11-08 07:46:22 -05:00
Jason McBrayer 2da4fd0de2 Sharing bookmarklet works 2019-11-07 19:44:09 -05:00
Jason McBrayer da1de5ea32 Add share view 2019-11-07 13:32:51 -05:00
Jason McBrayer c836861027 Fix formatting of migrations 2019-11-07 13:32:41 -05:00
Jason McBrayer eaf0cbd46b Fix emojos in display names in notifications 2019-11-06 12:49:51 -05:00
Jason McBrayer 0604ddffe6 Bump minor version 2019-11-05 19:27:33 -05:00
Jason McBrayer cf13ad3790 Squashed commit of the following:
commit 0a80206abb8fae7785a59aab88043b2b1974756b
Author: Jason McBrayer <jmcbray@carcosa.net>
Date:   Tue Nov 5 19:22:00 2019 -0500

    Fix oxford comma in bundled notifications, remove unused dependency

commit e96bd22bdce996734aaaf1d5625e08add3c8fcf7
Author: Jason McBrayer <jmcbray@carcosa.net>
Date:   Tue Nov 5 19:19:42 2019 -0500

    Now template works with bundled or un-bundled notifications

commit 6f46bef7fdd0defe2f02e09e28558de882ce4456
Author: Jason McBrayer <jmcbray@carcosa.net>
Date:   Tue Nov 5 19:02:51 2019 -0500

    Bundled toots work; now fix unbundled case

commit 07d9de49f943d019d04a5a5203081e57dc0741d8
Author: Jason McBrayer <jmcbray@carcosa.net>
Date:   Tue Nov 5 14:09:14 2019 -0500

    Notifications are now sorted by groups, but not collapsed

commit f62666929f12cf0c7db4c68a1468f7e138318a5c
Author: Jason McBrayer <jmcbray@carcosa.net>
Date:   Tue Nov 5 13:58:41 2019 -0500

    Fix saving of bundle_notifications setting

commit 335d5f985c968bb84e4b459dabf77d1d7ecad646
Author: Jason McBrayer <jmcbray@carcosa.net>
Date:   Mon Nov 4 18:57:54 2019 -0500

    Forgot to include migration for bundle notifications preference

commit 0e8232591c4f1bb972e9694433c546c9f66b5419
Author: Jason McBrayer <jmcbray@carcosa.net>
Date:   Mon Nov 4 18:57:35 2019 -0500

    Bundle notifications setting front-end

commit 6e945f1ceb2ff19470e164a946a6a48de4142812
Author: Jason McBrayer <jmcbray@carcosa.net>
Date:   Mon Nov 4 18:54:49 2019 -0500

    Backend code to group notifications
2019-11-05 19:23:58 -05:00
Jason McBrayer 61f8d19879 Fix some formatting for vt240 themes 2019-10-30 08:49:58 -04:00
Jason McBrayer 11f4415788 Bump minor version 2019-10-29 13:44:29 -04:00
Jason McBrayer 0e4402e885 Fix custom emoji in display names 2019-10-29 13:43:51 -04:00
Jason McBrayer d6ca91999f Basically support 'poll' type notifications.
They could be better, e.g. discriminating between polls you created and polls
you voted in, but I'm disinclined to put in the effort.
2019-10-29 10:58:09 -04:00
Jason McBrayer 507157782d Truncate long card descriptions
This is useful for bots like the Onion repeater that stuff whole
articles into the description field.
2019-10-28 18:35:25 -04:00
Jason McBrayer 9af914db85 Visibility of replies now more restrictive by default
Formerly, the visibility of replies defaulted to the visibility of the post
they were in reply to. Now they default to the more restrictive of the
visibility of the post they were in reply to, or your account's default
visibility. This should be less surprising for people with more restrictive
default visibility settings.
2019-10-28 18:12:20 -04:00
Jason McBrayer be78053179 Add first draft of material theme 2019-10-15 20:45:56 -04:00
Jason McBrayer 0607dc52cf Upgrade js and css dependencies 2019-10-15 20:41:46 -04:00
Jason McBrayer 798e189815 Don't lazy-load brand image 2019-09-10 20:15:19 -04:00
Jason McBrayer d8a0e57190 Add polyfill for loading=lazy in Firefox.
Debug some of the issues that brings up, and use "less" lazy-loading on images.
2019-08-26 19:18:21 -04:00
Jason McBrayer 893a9c49d7 Use img loading="lazy" for most images (where available) 2019-08-07 09:21:07 -04:00
GCU Prosthetic Conscience 9744e6f647
Update README for github - moving to gitea. 2019-07-30 07:51:21 -04:00
Jason McBrayer e1d758765d Try pooling API requests 2019-07-23 09:33:09 -04:00
Jason McBrayer 0efbc552b7 Use DEC Terminal Modern in vt240-xxxx themes if available 2019-07-22 13:56:53 -04:00
Jason McBrayer ef94e057f7 Always load full threads
This is the first step in the real-threading mod that I'm
working on.
2019-07-19 09:56:52 -04:00
Jason McBrayer 5b7d4e0b68 Polls work with intercooler 2019-07-10 13:25:53 -04:00
Jason McBrayer 3439e8c22e Voting on polls works for both single and multiple 2019-07-10 12:57:58 -04:00
Jason McBrayer a5a67ccb54 View un-voted-in polls; can't vote in them just yet. 2019-07-09 20:27:09 -04:00
Jason McBrayer 83f46babe5 Support for viewing completed polls 2019-07-09 19:55:05 -04:00
Jason McBrayer 76b50cedd2 Redirect gab users to a configurable URL rather than logging them in.
The default URL is "Never Gonna Give You Up" on invidio.us.
2019-07-09 19:52:50 -04:00
Jason McBrayer afc62c51e3 Fix a bug in settings page 2019-07-09 12:18:16 -04:00
Jason McBrayer 255d084d57 Another small adjustment to timeline buttons css 2019-07-09 10:10:26 -04:00
McBrayer 8b49c5d373 Try fixing timeline paging button layout.
No actual testing was done.
2019-07-09 10:04:56 -04:00
Jason McBrayer 4927bf137b Also update accounts_dict on loading settings page 2019-07-01 13:11:19 -04:00
Jason McBrayer 272dd12b43 Update accounts_dict when switching users 2019-07-01 13:06:06 -04:00
Jason McBrayer 1e3cb20b2c Fix breakage of user_search_inner 2019-06-20 17:02:23 -04:00
Jason McBrayer cae6a1d2c5 Fix stale own account info when switching accounts 2019-06-20 16:41:20 -04:00
Jason McBrayer 7c3b1106d1 Make pagination buttons the same as each other on timeline 2019-05-21 14:17:07 -04:00
Jason McBrayer 426faa1c2e Make thread availability more visible 2019-05-20 13:40:21 -04:00
Jason McBrayer 5443b41c0e Reformat everything with black 2019-05-17 13:07:11 -04:00
Jason McBrayer 82404c98b6 Add Solar theme.
This is not recommended for users with low vision because of poor contrast.
But if it works for you, it looks nice.
2019-05-17 11:03:31 -04:00
Jason McBrayer 00ec38ccaf Bump patch level for bug fixes 2019-05-12 07:00:41 -04:00
Jason McBrayer 2dbb508fb4 Fix searching with new Mastodon.py 2019-05-12 06:55:25 -04:00
Jason McBrayer dc6260d406 Remove remaining usages of since_id 2019-05-06 13:14:19 -04:00
Jason McBrayer 0a7ac8d4e9 Maybe fix crash on user page back paging 2019-05-06 10:55:45 -04:00
Jason McBrayer 5843a7e053 Increase length of version field for Pleroma compatibility 2019-05-06 09:38:43 -04:00
Jason McBrayer e380382757 Fix accounts icon 2019-05-05 08:40:28 -04:00
Jason McBrayer 18ffeb4aa4 Fix color of bell icon (changed by fork-awesome?) 2019-05-05 08:38:23 -04:00
Jason McBrayer 5c11d3c871 Add back support for backwards paging 2019-05-04 20:20:59 -04:00
Jason McBrayer 8dbebea29a Catch KeyError where we currently catch AttributError
This fixes up some issues with the updated Mastodon.py
2019-05-03 09:56:19 -04:00
Jason McBrayer 4de237a1b5 Store instance version in the client table
It is updated on new login, on entering the settings page, and on
timeline load. The last may be too often, but I thought the other
two were not often enough.
2019-04-29 14:41:11 -04:00
Jason McBrayer 21da39c422 Bump minor version 2019-04-28 09:14:12 -04:00
Jason McBrayer 250837b2c9 Don't switch accounts if deleting not the active account 2019-04-27 20:51:41 -04:00
Jason McBrayer 0c3d4f8405 Fix permission issues after removing an account and refactor 2019-04-27 20:32:09 -04:00
Jason McBrayer 5612965b45 Forgetting the last account works 2019-04-27 20:28:03 -04:00
Jason McBrayer 59f2a9cf1e Forgetting a logged-in account now works 2019-04-27 20:22:27 -04:00
Jason McBrayer f11e816426 Revert an over-aggressive refactor 2019-04-24 09:41:45 -04:00
Jason McBrayer 1c13a9a04b Return a response in worst old_login case 2019-04-24 09:20:49 -04:00
Jason McBrayer f2abaaa885 Correct last commit 2019-04-24 09:18:51 -04:00
Jason McBrayer b1eb270881 Try to fix up account_id value in accounts_dict for mismatched logins 2019-04-24 09:13:12 -04:00
Jason McBrayer a427273f63 Hopefully fix issue with re-login with different method 2019-04-24 09:03:56 -04:00
Jason McBrayer 6ce142e11a Update fork-awesome 2019-04-24 06:41:50 -04:00
Jason McBrayer acd39378bb Replace logout with accounts in ui 2019-04-24 06:32:57 -04:00
Jason McBrayer d19abee083 Fix error in oath_callback 2019-04-24 06:26:11 -04:00
Jason McBrayer 372422f9a3 Make account switching work 2019-04-23 22:29:47 -04:00
Jason McBrayer 3289adde09 Add a template for accounts list 2019-04-23 21:53:21 -04:00
Jason McBrayer c1b5eb6359 Add an endpoint for /accounts
It still needs a template.
2019-04-23 19:20:37 -04:00
Jason McBrayer 90ff4927ef Implement switch_accounts helper function 2019-04-23 18:46:54 -04:00
Jason McBrayer b5f8175b0e Fix visibility of navbar entries when logged in 2019-04-23 18:29:30 -04:00
Jason McBrayer 8a33d255bd Fix a crash in login 2019-04-23 18:25:55 -04:00
Jason McBrayer ebf58264e8 Add accounts_dict to session, update it on logging in. 2019-04-23 18:18:11 -04:00
Jason McBrayer d911da51bc Rename some session variables
This is in preparation for adding the session dictionary of accounts
2019-04-23 18:06:57 -04:00
Jason McBrayer f76600ffed Make self avatar in post form a link to own profile 2019-04-06 19:57:19 -04:00
Jason McBrayer e76a644c27 Boost patch level for fix to unknown thread issue 2019-04-06 17:58:41 -04:00
Jason McBrayer a099738cbb Make thread() throw an error 404 rather than 500 on a missing status 2019-04-06 16:51:13 -04:00
Jason McBrayer 300040bdb4 Bump patch level for filter bug fix 2019-04-02 14:32:01 -04:00
Jason McBrayer b8d29ecc97 Turn off caching for notifications 2019-04-02 14:31:35 -04:00
Jason McBrayer 53a0938f7b Fix filters in notifications 2019-04-02 14:31:10 -04:00
Jason McBrayer 1a14dd8c3b Tweak cards on minimal small and dark 2019-03-28 08:45:48 -04:00
Jason McBrayer 79eea0eed1 Fix issue with poll frequency not saving 2019-03-28 08:24:28 -04:00
Jason McBrayer e0bc0eba26 Mess around with card formatting some more 2019-03-28 07:58:31 -04:00
Jason McBrayer 7e1ade6d70 Use minimal-ui for PWA 2019-03-27 22:35:50 -04:00
Jason McBrayer ce825a8612 Fix issue with card images in mobile view 2019-03-27 22:34:20 -04:00
Jason McBrayer f27451bb6f Add minimal dark theme 2019-03-22 19:02:05 -04:00
Jason McBrayer 3296e9b685 Limit size of card images 2019-03-22 12:03:19 -04:00
Jason McBrayer c9e49b5525 Include styling for lightbox even for brutalist themes
It may make sense to use the lightbox with a brutalist theme, and without the
included stylesheet, it may look like ass.
2019-03-22 08:31:31 -04:00
Jason McBrayer e4c0f42b14 Set font size in minimal-small in points
so that it is more consistent between devices
2019-03-19 19:10:37 -04:00
Jason McBrayer 0ffdc87c5d Fix width of container in minimal-small 2019-03-19 16:35:02 -04:00
Jason McBrayer 35d8f5b599 Fix navbar spacing in minimal-small theme 2019-03-19 15:53:32 -04:00
Jason McBrayer 4c51916d38 Add minimalist small css theme 2019-03-17 17:12:50 -04:00
Jason McBrayer 8202045158 Pack brutaldon header image with pngcrush 2019-03-17 17:01:14 -04:00
Jason McBrayer ba9b2d3d69 Bump minor version on account of follow requests support 2019-03-06 14:27:03 -05:00
Jason McBrayer 67f2ea8149 Finish adding support for follow requests 2019-03-06 14:26:00 -05:00
Jason McBrayer d3ed8eef27 View for handling follow requests 2019-03-05 18:45:14 -05:00
Jason McBrayer c192d0056e Bump patch level for bug fixes 2019-03-03 20:42:26 -05:00
Jason McBrayer 3a9f2b52e0 Fix mentions in redrafts
The obvious failure modes should be taken care of; there may be spacing changes.
2019-03-03 20:40:42 -05:00
Jason McBrayer 882a713788 Remove intercooler attributes from redraft link 2019-03-03 20:04:29 -05:00
Jason McBrayer 5877344c16 Fix (again) overflowing attachment boxes
This time, it makes them multiline.
2019-02-28 12:15:04 -05:00
Jason McBrayer 333976dae5 Fix filter list layout in brutstrap 2019-02-16 10:53:46 -05:00
84 changed files with 13315 additions and 3330 deletions

2
.gitignore vendored
View File

@ -112,3 +112,5 @@ pip-selfcheck.json
node_modules
/TAGS
.vscode
package-lock.json
yarn.lock

View File

@ -14,7 +14,7 @@ django-widget-tweaks = "*"
"html5lib" = "*"
idna = "*"
markdown = "*"
"mastodon.py" = "*"
"mastodon.py" = ">=1.4.2"
python-dateutil = "*"
pytz = "*"
requests = "*"
@ -27,4 +27,3 @@ inscriptis = "*"
lxml = "*"
[dev-packages]

View File

@ -1,5 +1,7 @@
# Brutaldon
Note: If you are seeing this on Github, this repo is a mirror that may not be up-to-date. Please go to https://git.carcosa.net/jmcbray/brutaldon for the latest code.
Brutaldon is a [brutalist][0], [Web 1.0][0.5] web interface for [Mastodon][1] and [Pleroma][p]. It is not a Mastodon-compatible social networking server; rather, it is just a client, like the Android or iOS client for Mastodon you may already be using, but it runs in a web server, and is accessed through a web browser. It works great in text-mode browsers such as [Lynx][2], [w3m][3], or [elinks][4], and also in more heavy-weight graphical browsers, such as Firefox. It works completely without JavaScript, but if JavaScript is available and enabled, it will be used to unobtrusively enhance the user experience.
[0]:http://brutalistwebsites.com/

View File

@ -0,0 +1,8 @@
from django.urls import reverse
def bookmarklet_url(request):
share_url = request.build_absolute_uri(reverse("share"))
return {
"bookmarklet_url": f"javascript:location.href='{share_url}?url='+encodeURIComponent(location.href)+';title='+encodeURIComponent(document.title)"
}

View File

@ -5,69 +5,80 @@ from pytz import common_timezones
from .models import Theme, Preference
PRIVACY_CHOICES = (('public', _('Public')),
('unlisted', _('Unlisted')),
('private', _('Private')),
('direct', _('Direct')))
PRIVACY_CHOICES = (
("public", _("Public")),
("unlisted", _("Unlisted")),
("private", _("Private")),
("direct", _("Direct")),
)
timezones = [(tz, tz) for tz in common_timezones]
timezones = [ (tz, tz) for tz in common_timezones]
class LoginForm(forms.Form):
instance = forms.CharField(label=_("Instance"),
max_length=256)
instance = forms.CharField(label=_("Instance"), max_length=256)
email = forms.EmailField(label=_("Email"))
password = forms.CharField(widget=forms.PasswordInput())
class OAuthLoginForm(forms.Form):
instance = forms.CharField(label=_("Instance"),
max_length=256)
instance = forms.CharField(label=_("Instance"), max_length=256)
class PreferencesForm(forms.ModelForm):
class Meta:
model = Preference
fields = ['theme', 'filter_replies', 'filter_boosts', 'timezone',
'no_javascript', 'notifications', 'click_to_load', 'lightbox',
'filter_notifications', 'poll_frequency']
fields = Preference._fields
class PostForm(forms.Form):
"""def status_post(self, status, in_reply_to_id=None, media_ids=None,
sensitive=False, visibility=None, spoiler_text=None):"""
status = forms.CharField(label="Toot", widget=forms.Textarea)
visibility = forms.ChoiceField(label=_("Toot visibility"), choices=PRIVACY_CHOICES,
required=False)
spoiler_text = forms.CharField(label=_("CW or Subject"),
required=False)
media_file_1 = forms.FileField(label = _("Media 1"),
required=False)
media_text_1 = forms.CharField(label=_("Describe media 1."),
required=False)
media_file_2 = forms.FileField(label = _("Media 2"),
required=False)
media_text_2 = forms.CharField(label=_("Describe media 2."),
required=False)
media_file_3 = forms.FileField(label = _("Media 3"),
required=False)
media_text_3 = forms.CharField(label=_("Describe media 3."),
required=False)
media_file_4 = forms.FileField(label = _("Media 4"),
required=False)
media_text_4 = forms.CharField(label=_("Describe media 4."),
required=False)
visibility = forms.ChoiceField(
label=_("Toot visibility"), choices=PRIVACY_CHOICES, required=False
)
spoiler_text = forms.CharField(label=_("CW or Subject"), required=False)
media_file_1 = forms.FileField(label=_("Media 1"), required=False)
media_text_1 = forms.CharField(label=_("Describe media 1."), required=False)
media_file_2 = forms.FileField(label=_("Media 2"), required=False)
media_text_2 = forms.CharField(label=_("Describe media 2."), required=False)
media_file_3 = forms.FileField(label=_("Media 3"), required=False)
media_text_3 = forms.CharField(label=_("Describe media 3."), required=False)
media_file_4 = forms.FileField(label=_("Media 4"), required=False)
media_text_4 = forms.CharField(label=_("Describe media 4."), required=False)
media_sensitive = forms.BooleanField(label=_("Sensitive media?"), required=False)
class FilterForm(forms.Form):
phrase = forms.CharField(label=_("Word or phrase to filter"))
context_home = forms.BooleanField(label=_("In home timeline"), required=False, initial=True)
context_public = forms.BooleanField(label=_("In public timelines"), required=False, initial=True)
context_notes = forms.BooleanField(label=_("In notifications"), required=False, initial=True)
context_thread = forms.BooleanField(label=_("In thread contexts"), required=False, initial=True)
whole_word = forms.BooleanField(label=_("Whole words only"), required=False, initial=True)
expires_in = forms.TypedChoiceField(label=_("Expires in"),
choices=(("", "Never"),
("1800", "30 minutes"),
("3600", "1 hour"),
("21600", "6 hours"),
("43200", "12 hours"),
("86400", "1 day"),
("604800", "1 week")),
coerce=int, required=False)
context_home = forms.BooleanField(
label=_("In home timeline"), required=False, initial=True
)
context_public = forms.BooleanField(
label=_("In public timelines"), required=False, initial=True
)
context_notes = forms.BooleanField(
label=_("In notifications"), required=False, initial=True
)
context_thread = forms.BooleanField(
label=_("In thread contexts"), required=False, initial=True
)
whole_word = forms.BooleanField(
label=_("Whole words only"), required=False, initial=True
)
expires_in = forms.TypedChoiceField(
label=_("Expires in"),
choices=(
("", "Never"),
("1800", "30 minutes"),
("3600", "1 hour"),
("21600", "6 hours"),
("43200", "12 hours"),
("86400", "1 day"),
("604800", "1 week"),
),
coerce=int,
required=False,
)

View File

@ -3,9 +3,10 @@ import pytz
from django.utils import timezone
from django.utils.deprecation import MiddlewareMixin
class TimezoneMiddleware(MiddlewareMixin):
def process_request(self, request):
tzname = request.session.get('timezone', "UTC")
tzname = request.session.get("timezone", "UTC")
if tzname:
timezone.activate(pytz.timezone(tzname))
else:

View File

@ -7,18 +7,25 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
]
dependencies = []
operations = [
migrations.CreateModel(
name='Client',
name="Client",
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.TextField(default='brutaldon')),
('api_base_id', models.URLField(default='mastodon.social')),
('client_id', models.TextField(blank=True, null=True)),
('client_secret', models.TextField(blank=True, null=True)),
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.TextField(default="brutaldon")),
("api_base_id", models.URLField(default="mastodon.social")),
("client_id", models.TextField(blank=True, null=True)),
("client_secret", models.TextField(blank=True, null=True)),
],
),
)
]

View File

@ -9,17 +9,32 @@ class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('brutaldon', '0001_initial'),
("brutaldon", "0001_initial"),
]
operations = [
migrations.CreateModel(
name='Account',
name="Account",
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('username', models.CharField(max_length=80)),
('access_token', models.TextField(blank=True, null=True)),
('django_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("username", models.CharField(max_length=80)),
("access_token", models.TextField(blank=True, null=True)),
(
"django_user",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
),
),
],
),
)
]

View File

@ -6,19 +6,21 @@ import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('brutaldon', '0002_account'),
]
dependencies = [("brutaldon", "0002_account")]
operations = [
migrations.AddField(
model_name='account',
name='client',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='brutaldon.Client'),
model_name="account",
name="client",
field=models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
to="brutaldon.Client",
),
),
migrations.AlterField(
model_name='client',
name='api_base_id',
field=models.URLField(default='https://mastodon.social'),
model_name="client",
name="api_base_id",
field=models.URLField(default="https://mastodon.social"),
),
]

View File

@ -5,14 +5,12 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('brutaldon', '0003_auto_20180424_1255'),
]
dependencies = [("brutaldon", "0003_auto_20180424_1255")]
operations = [
migrations.AlterField(
model_name='account',
name='username',
model_name="account",
name="username",
field=models.EmailField(max_length=254),
),
)
]

View File

@ -6,37 +6,62 @@ import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('brutaldon', '0004_auto_20180424_1424'),
]
dependencies = [("brutaldon", "0004_auto_20180424_1424")]
operations = [
migrations.CreateModel(
name='Preference',
name="Preference",
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('data_saver', models.BooleanField(default=False)),
('fix_emojos', models.BooleanField(default=False)),
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("data_saver", models.BooleanField(default=False)),
("fix_emojos", models.BooleanField(default=False)),
],
),
migrations.CreateModel(
name='Theme',
name="Theme",
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.TextField(max_length=80)),
('main_css', models.TextField(max_length=1024)),
('tweaks_css', models.TextField(blank=True, max_length=1024, null=True)),
('is_brutalist', models.BooleanField(default=False)),
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.TextField(max_length=80)),
("main_css", models.TextField(max_length=1024)),
(
"tweaks_css",
models.TextField(blank=True, max_length=1024, null=True),
),
("is_brutalist", models.BooleanField(default=False)),
],
),
migrations.AddField(
model_name='preference',
name='theme',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='brutaldon.Theme'),
model_name="preference",
name="theme",
field=models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
to="brutaldon.Theme",
),
),
migrations.AddField(
model_name='account',
name='preferences',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='brutaldon.Preference'),
model_name="account",
name="preferences",
field=models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
to="brutaldon.Preference",
),
),
]

View File

@ -5,14 +5,14 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('brutaldon', '0005_auto_20180618_2103'),
]
dependencies = [("brutaldon", "0005_auto_20180618_2103")]
operations = [
migrations.AlterField(
model_name='theme',
name='main_css',
field=models.TextField(blank=True, default='css/fullbrutalism.css', max_length=1024, null=True),
),
model_name="theme",
name="main_css",
field=models.TextField(
blank=True, default="css/fullbrutalism.css", max_length=1024, null=True
),
)
]

View File

@ -2,56 +2,87 @@
from django.db import migrations
def set_up_default_themes(apps, schema_editor):
Theme = apps.get_model('brutaldon', 'Theme')
default = Theme(name="default",
main_css="css/bulma.min.css",
tweaks_css="css/brutaldon.css",
is_brutalist=False)
Theme = apps.get_model("brutaldon", "Theme")
default = Theme(
name="default",
main_css="css/bulma.min.css",
tweaks_css="css/brutaldon.css",
is_brutalist=False,
)
default.save()
dark = Theme(name="default dark",
main_css="css/bulmaswatch-darkly.min.css",
tweaks_css="css/brutaldon-dark.css",
is_brutalist=False)
dark = Theme(
name="default dark",
main_css="css/bulmaswatch-darkly.min.css",
tweaks_css="css/brutaldon-dark.css",
is_brutalist=False,
)
dark.save()
lux = Theme(name="Lux",
main_css="css/bulmaswatch-lux.min.css",
tweaks_css="css/brutaldon.css",
is_brutalist=False)
lux = Theme(
name="Lux",
main_css="css/bulmaswatch-lux.min.css",
tweaks_css="css/brutaldon.css",
is_brutalist=False,
)
lux.save()
brutalism = Theme(name="FULLBRUTALISM",
main_css="css/fullbrutalism.css",
is_brutalist=True)
solar = Theme(
name="Solar",
main_css="css/bulmaswatch-solar.min.css",
tweaks_css="css/brutaldon.css",
is_brutalist=False,
)
solar.save()
material = Theme(
name="Material",
main_css="css/bulmaswatch-materia.min.css",
tweaks_css="css/brutaldon-material.css",
is_brutalist=False,
)
material.save()
brutalism = Theme(
name="FULLBRUTALISM", main_css="css/fullbrutalism.css", is_brutalist=True
)
brutalism.save()
brutstrap = Theme(name="Brutstrap",
main_css="css/brutstrap.css",
is_brutalist=True,
tweaks_css="css/brutstrap-tweaks.css")
brutstrap = Theme(
name="Brutstrap",
main_css="css/brutstrap.css",
is_brutalist=True,
tweaks_css="css/brutstrap-tweaks.css",
)
brutstrap.save()
large = Theme(name="Minimalist Large", main_css="css/minimal-large.css",
is_brutalist=True)
large = Theme(
name="Minimalist Large", main_css="css/minimal-large.css", is_brutalist=True
)
large.save()
vt240 = Theme(name="vt240 amber", main_css="css/vt240don-amber.css",
is_brutalist=True)
small = Theme(
name="Minimalist Small", main_css="css/minimal-small.css", is_brutalist=True
)
small.save()
dark2 = Theme(
name="Minimalist Dark", main_css="css/minimal-dark.css", is_brutalist=True
)
dark2.save()
vt240 = Theme(
name="vt240 amber", main_css="css/vt240don-amber.css", is_brutalist=True
)
vt240.save()
vt240_green = Theme(name="vt240 green", main_css="css/vt240don-green.css",
is_brutalist=True)
vt240_green = Theme(
name="vt240 green", main_css="css/vt240don-green.css", is_brutalist=True
)
vt240_green.save()
minimal = Theme(name="No styling at all", main_css=None, is_brutalist=True)
minimal.save()
def delete_themes(apps, schema_editor):
Theme = apps.get_model('brutaldon' 'Theme')
Theme = apps.get_model("brutaldon" "Theme")
for theme in Theme.objects.all():
theme.delete()
class Migration(migrations.Migration):
dependencies = [
('brutaldon', '0006_auto_20180618_2112'),
]
dependencies = [("brutaldon", "0006_auto_20180618_2112")]
operations = [
migrations.RunPython(set_up_default_themes, delete_themes)
]
operations = [migrations.RunPython(set_up_default_themes, delete_themes)]

View File

@ -5,14 +5,12 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('brutaldon', '0007_auto_20180618_2115'),
]
dependencies = [("brutaldon", "0007_auto_20180618_2115")]
operations = [
migrations.AlterField(
model_name='theme',
name='name',
model_name="theme",
name="name",
field=models.TextField(max_length=80, unique=True),
),
)
]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -5,14 +5,12 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('brutaldon', '0011_auto_20180825_1017'),
]
dependencies = [("brutaldon", "0011_auto_20180825_1017")]
operations = [
migrations.AlterField(
model_name='account',
name='username',
model_name="account",
name="username",
field=models.EmailField(max_length=254, unique=True),
),
)
]

View File

@ -6,14 +6,16 @@ import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('brutaldon', '0012_auto_20180826_1853'),
]
dependencies = [("brutaldon", "0012_auto_20180826_1853")]
operations = [
migrations.AlterField(
model_name='preference',
name='theme',
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='brutaldon.Theme'),
),
model_name="preference",
name="theme",
field=models.ForeignKey(
default=1,
on_delete=django.db.models.deletion.CASCADE,
to="brutaldon.Theme",
),
)
]

View File

@ -5,14 +5,10 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('brutaldon', '0013_auto_20180826_1935'),
]
dependencies = [("brutaldon", "0013_auto_20180826_1935")]
operations = [
migrations.AddField(
model_name='account',
name='note_seen',
field=models.IntegerField(null=True),
),
model_name="account", name="note_seen", field=models.IntegerField(null=True)
)
]

View File

@ -5,24 +5,22 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('brutaldon', '0014_account_note_seen'),
]
dependencies = [("brutaldon", "0014_account_note_seen")]
operations = [
migrations.AddField(
model_name='preference',
name='click_to_load',
model_name="preference",
name="click_to_load",
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name='preference',
name='no_javascript',
model_name="preference",
name="no_javascript",
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name='preference',
name='notifications',
model_name="preference",
name="notifications",
field=models.BooleanField(default=True),
),
]

View File

@ -5,29 +5,37 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('brutaldon', '0015_auto_20181001_1812'),
]
dependencies = [("brutaldon", "0015_auto_20181001_1812")]
operations = [
migrations.AddField(
model_name='preference',
name='lightbox',
field=models.BooleanField(default=False, help_text='Use a JavaScript lightbox to display media.'),
model_name="preference",
name="lightbox",
field=models.BooleanField(
default=False, help_text="Use a JavaScript lightbox to display media."
),
),
migrations.AlterField(
model_name='preference',
name='click_to_load',
field=models.BooleanField(default=False, help_text='Click to load more toots in the same page, rather than using pagination.'),
model_name="preference",
name="click_to_load",
field=models.BooleanField(
default=False,
help_text="Click to load more toots in the same page, rather than using pagination.",
),
),
migrations.AlterField(
model_name='preference',
name='no_javascript',
field=models.BooleanField(default=False, help_text='Disable all JavaScript. Overrides all other JavaScript options.'),
model_name="preference",
name="no_javascript",
field=models.BooleanField(
default=False,
help_text="Disable all JavaScript. Overrides all other JavaScript options.",
),
),
migrations.AlterField(
model_name='preference',
name='notifications',
field=models.BooleanField(default=True, help_text='Display live notifications in header.'),
model_name="preference",
name="notifications",
field=models.BooleanField(
default=True, help_text="Display live notifications in header."
),
),
]

View File

@ -5,14 +5,15 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('brutaldon', '0016_auto_20181009_1805'),
]
dependencies = [("brutaldon", "0016_auto_20181009_1805")]
operations = [
migrations.AddField(
model_name='preference',
name='poll_frequency',
field=models.IntegerField(default=300, help_text='Number of seconds to wait between checking notifications. Default: 300'),
),
model_name="preference",
name="poll_frequency",
field=models.IntegerField(
default=300,
help_text="Number of seconds to wait between checking notifications. Default: 300",
),
)
]

View File

@ -5,14 +5,15 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('brutaldon', '0017_preference_poll_frequency'),
]
dependencies = [("brutaldon", "0017_preference_poll_frequency")]
operations = [
migrations.AddField(
model_name='preference',
name='filter_notifications',
field=models.BooleanField(default=False, help_text='Exclude boosts and favs from your notifications.'),
),
model_name="preference",
name="filter_notifications",
field=models.BooleanField(
default=False,
help_text="Exclude boosts and favs from your notifications.",
),
)
]

File diff suppressed because one or more lines are too long

View File

@ -5,14 +5,12 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('brutaldon', '0019_auto_20190124_0813'),
]
dependencies = [("brutaldon", "0019_auto_20190124_0813")]
operations = [
migrations.AlterField(
model_name='account',
name='note_seen',
model_name="account",
name="note_seen",
field=models.CharField(blank=True, max_length=128, null=True),
),
)
]

View File

@ -0,0 +1,16 @@
# Generated by Django 2.1.5 on 2019-04-29 18:37
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [("brutaldon", "0020_auto_20190127_2159")]
operations = [
migrations.AddField(
model_name="client",
name="version",
field=models.CharField(default="1.0", max_length=8),
)
]

View File

@ -0,0 +1,16 @@
# Generated by Django 2.2.1 on 2019-05-06 13:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [("brutaldon", "0021_client_version")]
operations = [
migrations.AlterField(
model_name="client",
name="version",
field=models.CharField(default="1.0", max_length=80),
)
]

View File

@ -0,0 +1,19 @@
# Generated by Django 2.2.7 on 2019-11-04 23:53
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [("brutaldon", "0022_auto_20190506_0938")]
operations = [
migrations.AddField(
model_name="preference",
name="bundle_notifications",
field=models.BooleanField(
default=False,
help_text="Collapse together boosts or likes of the same toot in the notifications page.",
),
)
]

View File

@ -0,0 +1,474 @@
# Generated by Django 3.0.6 on 2020-06-01 13:45
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("brutaldon", "0023_preference_bundle_notifications"),
]
operations = [
migrations.AlterField(
model_name="preference",
name="timezone",
field=models.CharField(
blank=True,
choices=[
("Africa/Abidjan", "Africa/Abidjan"),
("Africa/Accra", "Africa/Accra"),
("Africa/Addis_Ababa", "Africa/Addis_Ababa"),
("Africa/Algiers", "Africa/Algiers"),
("Africa/Asmara", "Africa/Asmara"),
("Africa/Bamako", "Africa/Bamako"),
("Africa/Bangui", "Africa/Bangui"),
("Africa/Banjul", "Africa/Banjul"),
("Africa/Bissau", "Africa/Bissau"),
("Africa/Blantyre", "Africa/Blantyre"),
("Africa/Brazzaville", "Africa/Brazzaville"),
("Africa/Bujumbura", "Africa/Bujumbura"),
("Africa/Cairo", "Africa/Cairo"),
("Africa/Casablanca", "Africa/Casablanca"),
("Africa/Ceuta", "Africa/Ceuta"),
("Africa/Conakry", "Africa/Conakry"),
("Africa/Dakar", "Africa/Dakar"),
("Africa/Dar_es_Salaam", "Africa/Dar_es_Salaam"),
("Africa/Djibouti", "Africa/Djibouti"),
("Africa/Douala", "Africa/Douala"),
("Africa/El_Aaiun", "Africa/El_Aaiun"),
("Africa/Freetown", "Africa/Freetown"),
("Africa/Gaborone", "Africa/Gaborone"),
("Africa/Harare", "Africa/Harare"),
("Africa/Johannesburg", "Africa/Johannesburg"),
("Africa/Juba", "Africa/Juba"),
("Africa/Kampala", "Africa/Kampala"),
("Africa/Khartoum", "Africa/Khartoum"),
("Africa/Kigali", "Africa/Kigali"),
("Africa/Kinshasa", "Africa/Kinshasa"),
("Africa/Lagos", "Africa/Lagos"),
("Africa/Libreville", "Africa/Libreville"),
("Africa/Lome", "Africa/Lome"),
("Africa/Luanda", "Africa/Luanda"),
("Africa/Lubumbashi", "Africa/Lubumbashi"),
("Africa/Lusaka", "Africa/Lusaka"),
("Africa/Malabo", "Africa/Malabo"),
("Africa/Maputo", "Africa/Maputo"),
("Africa/Maseru", "Africa/Maseru"),
("Africa/Mbabane", "Africa/Mbabane"),
("Africa/Mogadishu", "Africa/Mogadishu"),
("Africa/Monrovia", "Africa/Monrovia"),
("Africa/Nairobi", "Africa/Nairobi"),
("Africa/Ndjamena", "Africa/Ndjamena"),
("Africa/Niamey", "Africa/Niamey"),
("Africa/Nouakchott", "Africa/Nouakchott"),
("Africa/Ouagadougou", "Africa/Ouagadougou"),
("Africa/Porto-Novo", "Africa/Porto-Novo"),
("Africa/Sao_Tome", "Africa/Sao_Tome"),
("Africa/Tripoli", "Africa/Tripoli"),
("Africa/Tunis", "Africa/Tunis"),
("Africa/Windhoek", "Africa/Windhoek"),
("America/Adak", "America/Adak"),
("America/Anchorage", "America/Anchorage"),
("America/Anguilla", "America/Anguilla"),
("America/Antigua", "America/Antigua"),
("America/Araguaina", "America/Araguaina"),
(
"America/Argentina/Buenos_Aires",
"America/Argentina/Buenos_Aires",
),
("America/Argentina/Catamarca", "America/Argentina/Catamarca"),
("America/Argentina/Cordoba", "America/Argentina/Cordoba"),
("America/Argentina/Jujuy", "America/Argentina/Jujuy"),
("America/Argentina/La_Rioja", "America/Argentina/La_Rioja"),
("America/Argentina/Mendoza", "America/Argentina/Mendoza"),
(
"America/Argentina/Rio_Gallegos",
"America/Argentina/Rio_Gallegos",
),
("America/Argentina/Salta", "America/Argentina/Salta"),
("America/Argentina/San_Juan", "America/Argentina/San_Juan"),
("America/Argentina/San_Luis", "America/Argentina/San_Luis"),
("America/Argentina/Tucuman", "America/Argentina/Tucuman"),
("America/Argentina/Ushuaia", "America/Argentina/Ushuaia"),
("America/Aruba", "America/Aruba"),
("America/Asuncion", "America/Asuncion"),
("America/Atikokan", "America/Atikokan"),
("America/Bahia", "America/Bahia"),
("America/Bahia_Banderas", "America/Bahia_Banderas"),
("America/Barbados", "America/Barbados"),
("America/Belem", "America/Belem"),
("America/Belize", "America/Belize"),
("America/Blanc-Sablon", "America/Blanc-Sablon"),
("America/Boa_Vista", "America/Boa_Vista"),
("America/Bogota", "America/Bogota"),
("America/Boise", "America/Boise"),
("America/Cambridge_Bay", "America/Cambridge_Bay"),
("America/Campo_Grande", "America/Campo_Grande"),
("America/Cancun", "America/Cancun"),
("America/Caracas", "America/Caracas"),
("America/Cayenne", "America/Cayenne"),
("America/Cayman", "America/Cayman"),
("America/Chicago", "America/Chicago"),
("America/Chihuahua", "America/Chihuahua"),
("America/Costa_Rica", "America/Costa_Rica"),
("America/Creston", "America/Creston"),
("America/Cuiaba", "America/Cuiaba"),
("America/Curacao", "America/Curacao"),
("America/Danmarkshavn", "America/Danmarkshavn"),
("America/Dawson", "America/Dawson"),
("America/Dawson_Creek", "America/Dawson_Creek"),
("America/Denver", "America/Denver"),
("America/Detroit", "America/Detroit"),
("America/Dominica", "America/Dominica"),
("America/Edmonton", "America/Edmonton"),
("America/Eirunepe", "America/Eirunepe"),
("America/El_Salvador", "America/El_Salvador"),
("America/Fort_Nelson", "America/Fort_Nelson"),
("America/Fortaleza", "America/Fortaleza"),
("America/Glace_Bay", "America/Glace_Bay"),
("America/Goose_Bay", "America/Goose_Bay"),
("America/Grand_Turk", "America/Grand_Turk"),
("America/Grenada", "America/Grenada"),
("America/Guadeloupe", "America/Guadeloupe"),
("America/Guatemala", "America/Guatemala"),
("America/Guayaquil", "America/Guayaquil"),
("America/Guyana", "America/Guyana"),
("America/Halifax", "America/Halifax"),
("America/Havana", "America/Havana"),
("America/Hermosillo", "America/Hermosillo"),
("America/Indiana/Indianapolis", "America/Indiana/Indianapolis"),
("America/Indiana/Knox", "America/Indiana/Knox"),
("America/Indiana/Marengo", "America/Indiana/Marengo"),
("America/Indiana/Petersburg", "America/Indiana/Petersburg"),
("America/Indiana/Tell_City", "America/Indiana/Tell_City"),
("America/Indiana/Vevay", "America/Indiana/Vevay"),
("America/Indiana/Vincennes", "America/Indiana/Vincennes"),
("America/Indiana/Winamac", "America/Indiana/Winamac"),
("America/Inuvik", "America/Inuvik"),
("America/Iqaluit", "America/Iqaluit"),
("America/Jamaica", "America/Jamaica"),
("America/Juneau", "America/Juneau"),
("America/Kentucky/Louisville", "America/Kentucky/Louisville"),
("America/Kentucky/Monticello", "America/Kentucky/Monticello"),
("America/Kralendijk", "America/Kralendijk"),
("America/La_Paz", "America/La_Paz"),
("America/Lima", "America/Lima"),
("America/Los_Angeles", "America/Los_Angeles"),
("America/Lower_Princes", "America/Lower_Princes"),
("America/Maceio", "America/Maceio"),
("America/Managua", "America/Managua"),
("America/Manaus", "America/Manaus"),
("America/Marigot", "America/Marigot"),
("America/Martinique", "America/Martinique"),
("America/Matamoros", "America/Matamoros"),
("America/Mazatlan", "America/Mazatlan"),
("America/Menominee", "America/Menominee"),
("America/Merida", "America/Merida"),
("America/Metlakatla", "America/Metlakatla"),
("America/Mexico_City", "America/Mexico_City"),
("America/Miquelon", "America/Miquelon"),
("America/Moncton", "America/Moncton"),
("America/Monterrey", "America/Monterrey"),
("America/Montevideo", "America/Montevideo"),
("America/Montserrat", "America/Montserrat"),
("America/Nassau", "America/Nassau"),
("America/New_York", "America/New_York"),
("America/Nipigon", "America/Nipigon"),
("America/Nome", "America/Nome"),
("America/Noronha", "America/Noronha"),
("America/North_Dakota/Beulah", "America/North_Dakota/Beulah"),
("America/North_Dakota/Center", "America/North_Dakota/Center"),
(
"America/North_Dakota/New_Salem",
"America/North_Dakota/New_Salem",
),
("America/Nuuk", "America/Nuuk"),
("America/Ojinaga", "America/Ojinaga"),
("America/Panama", "America/Panama"),
("America/Pangnirtung", "America/Pangnirtung"),
("America/Paramaribo", "America/Paramaribo"),
("America/Phoenix", "America/Phoenix"),
("America/Port-au-Prince", "America/Port-au-Prince"),
("America/Port_of_Spain", "America/Port_of_Spain"),
("America/Porto_Velho", "America/Porto_Velho"),
("America/Puerto_Rico", "America/Puerto_Rico"),
("America/Punta_Arenas", "America/Punta_Arenas"),
("America/Rainy_River", "America/Rainy_River"),
("America/Rankin_Inlet", "America/Rankin_Inlet"),
("America/Recife", "America/Recife"),
("America/Regina", "America/Regina"),
("America/Resolute", "America/Resolute"),
("America/Rio_Branco", "America/Rio_Branco"),
("America/Santarem", "America/Santarem"),
("America/Santiago", "America/Santiago"),
("America/Santo_Domingo", "America/Santo_Domingo"),
("America/Sao_Paulo", "America/Sao_Paulo"),
("America/Scoresbysund", "America/Scoresbysund"),
("America/Sitka", "America/Sitka"),
("America/St_Barthelemy", "America/St_Barthelemy"),
("America/St_Johns", "America/St_Johns"),
("America/St_Kitts", "America/St_Kitts"),
("America/St_Lucia", "America/St_Lucia"),
("America/St_Thomas", "America/St_Thomas"),
("America/St_Vincent", "America/St_Vincent"),
("America/Swift_Current", "America/Swift_Current"),
("America/Tegucigalpa", "America/Tegucigalpa"),
("America/Thule", "America/Thule"),
("America/Thunder_Bay", "America/Thunder_Bay"),
("America/Tijuana", "America/Tijuana"),
("America/Toronto", "America/Toronto"),
("America/Tortola", "America/Tortola"),
("America/Vancouver", "America/Vancouver"),
("America/Whitehorse", "America/Whitehorse"),
("America/Winnipeg", "America/Winnipeg"),
("America/Yakutat", "America/Yakutat"),
("America/Yellowknife", "America/Yellowknife"),
("Antarctica/Casey", "Antarctica/Casey"),
("Antarctica/Davis", "Antarctica/Davis"),
("Antarctica/DumontDUrville", "Antarctica/DumontDUrville"),
("Antarctica/Macquarie", "Antarctica/Macquarie"),
("Antarctica/Mawson", "Antarctica/Mawson"),
("Antarctica/McMurdo", "Antarctica/McMurdo"),
("Antarctica/Palmer", "Antarctica/Palmer"),
("Antarctica/Rothera", "Antarctica/Rothera"),
("Antarctica/Syowa", "Antarctica/Syowa"),
("Antarctica/Troll", "Antarctica/Troll"),
("Antarctica/Vostok", "Antarctica/Vostok"),
("Arctic/Longyearbyen", "Arctic/Longyearbyen"),
("Asia/Aden", "Asia/Aden"),
("Asia/Almaty", "Asia/Almaty"),
("Asia/Amman", "Asia/Amman"),
("Asia/Anadyr", "Asia/Anadyr"),
("Asia/Aqtau", "Asia/Aqtau"),
("Asia/Aqtobe", "Asia/Aqtobe"),
("Asia/Ashgabat", "Asia/Ashgabat"),
("Asia/Atyrau", "Asia/Atyrau"),
("Asia/Baghdad", "Asia/Baghdad"),
("Asia/Bahrain", "Asia/Bahrain"),
("Asia/Baku", "Asia/Baku"),
("Asia/Bangkok", "Asia/Bangkok"),
("Asia/Barnaul", "Asia/Barnaul"),
("Asia/Beirut", "Asia/Beirut"),
("Asia/Bishkek", "Asia/Bishkek"),
("Asia/Brunei", "Asia/Brunei"),
("Asia/Chita", "Asia/Chita"),
("Asia/Choibalsan", "Asia/Choibalsan"),
("Asia/Colombo", "Asia/Colombo"),
("Asia/Damascus", "Asia/Damascus"),
("Asia/Dhaka", "Asia/Dhaka"),
("Asia/Dili", "Asia/Dili"),
("Asia/Dubai", "Asia/Dubai"),
("Asia/Dushanbe", "Asia/Dushanbe"),
("Asia/Famagusta", "Asia/Famagusta"),
("Asia/Gaza", "Asia/Gaza"),
("Asia/Hebron", "Asia/Hebron"),
("Asia/Ho_Chi_Minh", "Asia/Ho_Chi_Minh"),
("Asia/Hong_Kong", "Asia/Hong_Kong"),
("Asia/Hovd", "Asia/Hovd"),
("Asia/Irkutsk", "Asia/Irkutsk"),
("Asia/Jakarta", "Asia/Jakarta"),
("Asia/Jayapura", "Asia/Jayapura"),
("Asia/Jerusalem", "Asia/Jerusalem"),
("Asia/Kabul", "Asia/Kabul"),
("Asia/Kamchatka", "Asia/Kamchatka"),
("Asia/Karachi", "Asia/Karachi"),
("Asia/Kathmandu", "Asia/Kathmandu"),
("Asia/Khandyga", "Asia/Khandyga"),
("Asia/Kolkata", "Asia/Kolkata"),
("Asia/Krasnoyarsk", "Asia/Krasnoyarsk"),
("Asia/Kuala_Lumpur", "Asia/Kuala_Lumpur"),
("Asia/Kuching", "Asia/Kuching"),
("Asia/Kuwait", "Asia/Kuwait"),
("Asia/Macau", "Asia/Macau"),
("Asia/Magadan", "Asia/Magadan"),
("Asia/Makassar", "Asia/Makassar"),
("Asia/Manila", "Asia/Manila"),
("Asia/Muscat", "Asia/Muscat"),
("Asia/Nicosia", "Asia/Nicosia"),
("Asia/Novokuznetsk", "Asia/Novokuznetsk"),
("Asia/Novosibirsk", "Asia/Novosibirsk"),
("Asia/Omsk", "Asia/Omsk"),
("Asia/Oral", "Asia/Oral"),
("Asia/Phnom_Penh", "Asia/Phnom_Penh"),
("Asia/Pontianak", "Asia/Pontianak"),
("Asia/Pyongyang", "Asia/Pyongyang"),
("Asia/Qatar", "Asia/Qatar"),
("Asia/Qostanay", "Asia/Qostanay"),
("Asia/Qyzylorda", "Asia/Qyzylorda"),
("Asia/Riyadh", "Asia/Riyadh"),
("Asia/Sakhalin", "Asia/Sakhalin"),
("Asia/Samarkand", "Asia/Samarkand"),
("Asia/Seoul", "Asia/Seoul"),
("Asia/Shanghai", "Asia/Shanghai"),
("Asia/Singapore", "Asia/Singapore"),
("Asia/Srednekolymsk", "Asia/Srednekolymsk"),
("Asia/Taipei", "Asia/Taipei"),
("Asia/Tashkent", "Asia/Tashkent"),
("Asia/Tbilisi", "Asia/Tbilisi"),
("Asia/Tehran", "Asia/Tehran"),
("Asia/Thimphu", "Asia/Thimphu"),
("Asia/Tokyo", "Asia/Tokyo"),
("Asia/Tomsk", "Asia/Tomsk"),
("Asia/Ulaanbaatar", "Asia/Ulaanbaatar"),
("Asia/Urumqi", "Asia/Urumqi"),
("Asia/Ust-Nera", "Asia/Ust-Nera"),
("Asia/Vientiane", "Asia/Vientiane"),
("Asia/Vladivostok", "Asia/Vladivostok"),
("Asia/Yakutsk", "Asia/Yakutsk"),
("Asia/Yangon", "Asia/Yangon"),
("Asia/Yekaterinburg", "Asia/Yekaterinburg"),
("Asia/Yerevan", "Asia/Yerevan"),
("Atlantic/Azores", "Atlantic/Azores"),
("Atlantic/Bermuda", "Atlantic/Bermuda"),
("Atlantic/Canary", "Atlantic/Canary"),
("Atlantic/Cape_Verde", "Atlantic/Cape_Verde"),
("Atlantic/Faroe", "Atlantic/Faroe"),
("Atlantic/Madeira", "Atlantic/Madeira"),
("Atlantic/Reykjavik", "Atlantic/Reykjavik"),
("Atlantic/South_Georgia", "Atlantic/South_Georgia"),
("Atlantic/St_Helena", "Atlantic/St_Helena"),
("Atlantic/Stanley", "Atlantic/Stanley"),
("Australia/Adelaide", "Australia/Adelaide"),
("Australia/Brisbane", "Australia/Brisbane"),
("Australia/Broken_Hill", "Australia/Broken_Hill"),
("Australia/Currie", "Australia/Currie"),
("Australia/Darwin", "Australia/Darwin"),
("Australia/Eucla", "Australia/Eucla"),
("Australia/Hobart", "Australia/Hobart"),
("Australia/Lindeman", "Australia/Lindeman"),
("Australia/Lord_Howe", "Australia/Lord_Howe"),
("Australia/Melbourne", "Australia/Melbourne"),
("Australia/Perth", "Australia/Perth"),
("Australia/Sydney", "Australia/Sydney"),
("Canada/Atlantic", "Canada/Atlantic"),
("Canada/Central", "Canada/Central"),
("Canada/Eastern", "Canada/Eastern"),
("Canada/Mountain", "Canada/Mountain"),
("Canada/Newfoundland", "Canada/Newfoundland"),
("Canada/Pacific", "Canada/Pacific"),
("Europe/Amsterdam", "Europe/Amsterdam"),
("Europe/Andorra", "Europe/Andorra"),
("Europe/Astrakhan", "Europe/Astrakhan"),
("Europe/Athens", "Europe/Athens"),
("Europe/Belgrade", "Europe/Belgrade"),
("Europe/Berlin", "Europe/Berlin"),
("Europe/Bratislava", "Europe/Bratislava"),
("Europe/Brussels", "Europe/Brussels"),
("Europe/Bucharest", "Europe/Bucharest"),
("Europe/Budapest", "Europe/Budapest"),
("Europe/Busingen", "Europe/Busingen"),
("Europe/Chisinau", "Europe/Chisinau"),
("Europe/Copenhagen", "Europe/Copenhagen"),
("Europe/Dublin", "Europe/Dublin"),
("Europe/Gibraltar", "Europe/Gibraltar"),
("Europe/Guernsey", "Europe/Guernsey"),
("Europe/Helsinki", "Europe/Helsinki"),
("Europe/Isle_of_Man", "Europe/Isle_of_Man"),
("Europe/Istanbul", "Europe/Istanbul"),
("Europe/Jersey", "Europe/Jersey"),
("Europe/Kaliningrad", "Europe/Kaliningrad"),
("Europe/Kiev", "Europe/Kiev"),
("Europe/Kirov", "Europe/Kirov"),
("Europe/Lisbon", "Europe/Lisbon"),
("Europe/Ljubljana", "Europe/Ljubljana"),
("Europe/London", "Europe/London"),
("Europe/Luxembourg", "Europe/Luxembourg"),
("Europe/Madrid", "Europe/Madrid"),
("Europe/Malta", "Europe/Malta"),
("Europe/Mariehamn", "Europe/Mariehamn"),
("Europe/Minsk", "Europe/Minsk"),
("Europe/Monaco", "Europe/Monaco"),
("Europe/Moscow", "Europe/Moscow"),
("Europe/Oslo", "Europe/Oslo"),
("Europe/Paris", "Europe/Paris"),
("Europe/Podgorica", "Europe/Podgorica"),
("Europe/Prague", "Europe/Prague"),
("Europe/Riga", "Europe/Riga"),
("Europe/Rome", "Europe/Rome"),
("Europe/Samara", "Europe/Samara"),
("Europe/San_Marino", "Europe/San_Marino"),
("Europe/Sarajevo", "Europe/Sarajevo"),
("Europe/Saratov", "Europe/Saratov"),
("Europe/Simferopol", "Europe/Simferopol"),
("Europe/Skopje", "Europe/Skopje"),
("Europe/Sofia", "Europe/Sofia"),
("Europe/Stockholm", "Europe/Stockholm"),
("Europe/Tallinn", "Europe/Tallinn"),
("Europe/Tirane", "Europe/Tirane"),
("Europe/Ulyanovsk", "Europe/Ulyanovsk"),
("Europe/Uzhgorod", "Europe/Uzhgorod"),
("Europe/Vaduz", "Europe/Vaduz"),
("Europe/Vatican", "Europe/Vatican"),
("Europe/Vienna", "Europe/Vienna"),
("Europe/Vilnius", "Europe/Vilnius"),
("Europe/Volgograd", "Europe/Volgograd"),
("Europe/Warsaw", "Europe/Warsaw"),
("Europe/Zagreb", "Europe/Zagreb"),
("Europe/Zaporozhye", "Europe/Zaporozhye"),
("Europe/Zurich", "Europe/Zurich"),
("GMT", "GMT"),
("Indian/Antananarivo", "Indian/Antananarivo"),
("Indian/Chagos", "Indian/Chagos"),
("Indian/Christmas", "Indian/Christmas"),
("Indian/Cocos", "Indian/Cocos"),
("Indian/Comoro", "Indian/Comoro"),
("Indian/Kerguelen", "Indian/Kerguelen"),
("Indian/Mahe", "Indian/Mahe"),
("Indian/Maldives", "Indian/Maldives"),
("Indian/Mauritius", "Indian/Mauritius"),
("Indian/Mayotte", "Indian/Mayotte"),
("Indian/Reunion", "Indian/Reunion"),
("Pacific/Apia", "Pacific/Apia"),
("Pacific/Auckland", "Pacific/Auckland"),
("Pacific/Bougainville", "Pacific/Bougainville"),
("Pacific/Chatham", "Pacific/Chatham"),
("Pacific/Chuuk", "Pacific/Chuuk"),
("Pacific/Easter", "Pacific/Easter"),
("Pacific/Efate", "Pacific/Efate"),
("Pacific/Enderbury", "Pacific/Enderbury"),
("Pacific/Fakaofo", "Pacific/Fakaofo"),
("Pacific/Fiji", "Pacific/Fiji"),
("Pacific/Funafuti", "Pacific/Funafuti"),
("Pacific/Galapagos", "Pacific/Galapagos"),
("Pacific/Gambier", "Pacific/Gambier"),
("Pacific/Guadalcanal", "Pacific/Guadalcanal"),
("Pacific/Guam", "Pacific/Guam"),
("Pacific/Honolulu", "Pacific/Honolulu"),
("Pacific/Kiritimati", "Pacific/Kiritimati"),
("Pacific/Kosrae", "Pacific/Kosrae"),
("Pacific/Kwajalein", "Pacific/Kwajalein"),
("Pacific/Majuro", "Pacific/Majuro"),
("Pacific/Marquesas", "Pacific/Marquesas"),
("Pacific/Midway", "Pacific/Midway"),
("Pacific/Nauru", "Pacific/Nauru"),
("Pacific/Niue", "Pacific/Niue"),
("Pacific/Norfolk", "Pacific/Norfolk"),
("Pacific/Noumea", "Pacific/Noumea"),
("Pacific/Pago_Pago", "Pacific/Pago_Pago"),
("Pacific/Palau", "Pacific/Palau"),
("Pacific/Pitcairn", "Pacific/Pitcairn"),
("Pacific/Pohnpei", "Pacific/Pohnpei"),
("Pacific/Port_Moresby", "Pacific/Port_Moresby"),
("Pacific/Rarotonga", "Pacific/Rarotonga"),
("Pacific/Saipan", "Pacific/Saipan"),
("Pacific/Tahiti", "Pacific/Tahiti"),
("Pacific/Tarawa", "Pacific/Tarawa"),
("Pacific/Tongatapu", "Pacific/Tongatapu"),
("Pacific/Wake", "Pacific/Wake"),
("Pacific/Wallis", "Pacific/Wallis"),
("US/Alaska", "US/Alaska"),
("US/Arizona", "US/Arizona"),
("US/Central", "US/Central"),
("US/Eastern", "US/Eastern"),
("US/Hawaii", "US/Hawaii"),
("US/Mountain", "US/Mountain"),
("US/Pacific", "US/Pacific"),
("UTC", "UTC"),
],
default="UTC",
max_length=80,
null=True,
),
),
]

View File

@ -0,0 +1,20 @@
# Generated by Django 3.0.6 on 2020-06-01 14:17
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("brutaldon", "0024_auto_20200601_0945"),
]
operations = [
migrations.AddField(
model_name="preference",
name="preview_sensitive",
field=models.BooleanField(
default=False, help_text='Show preview for media marked as "sensitive"'
),
),
]

View File

@ -5,51 +5,103 @@ from pytz import common_timezones
timezones = [(tz, tz) for tz in common_timezones]
class Client(models.Model):
name = models.CharField(default = "brutaldon", max_length=80)
name = models.CharField(default="brutaldon", max_length=80)
api_base_id = models.URLField(default="https://mastodon.social")
version = models.CharField(default="1.0", max_length=80)
client_id = models.CharField(null=True, blank=True, max_length=2048)
client_secret = models.CharField(null=True, blank=True, max_length=2048)
def __str__(self):
return self.name + ": " + self.api_base_id
class Theme(models.Model):
name = models.CharField(max_length=80, unique=True)
prefix = models.CharField(max_length=40, null=True, default="default")
main_css = models.CharField(max_length=1024, blank=True, null=True,
default="css/fullbrutalism.css")
main_css = models.CharField(
max_length=1024, blank=True, null=True, default="css/fullbrutalism.css"
)
tweaks_css = models.CharField(max_length=1024, blank=True, null=True)
is_brutalist = models.BooleanField(default=False)
def __str__(self):
return self.name
from django.db.models.fields.related_descriptors import ForeignKeyDeferredAttribute
def set_fields(klass):
fields = []
for n in dir(klass):
assert n != "_fields"
v = getattr(klass, n)
if not hasattr(v, "field"):
continue
if not isinstance(v.field, models.Field):
continue
if isinstance(v, ForeignKeyDeferredAttribute):
continue
fields.append(n)
setattr(klass, "_fields", fields)
return klass
@set_fields
class Preference(models.Model):
theme = models.ForeignKey(Theme, models.CASCADE, null=False, default=1)
filter_replies = models.BooleanField(default=False)
filter_boosts = models.BooleanField(default=False)
timezone = models.CharField(max_length=80, blank=True, null=True,
choices=timezones, default='UTC')
no_javascript = models.BooleanField(default=False,
help_text=_("""Disable all JavaScript. Overrides all other JavaScript options."""))
notifications = models.BooleanField(default=True,
help_text=_("""Display live notifications in header."""))
click_to_load = models.BooleanField(default=False,
help_text=_("""Click to load more toots in the same page, rather than using pagination."""))
lightbox = models.BooleanField(default=False,
help_text=_("""Use a JavaScript lightbox to display media."""))
poll_frequency = models.IntegerField(default=300,
help_text=_("""Number of seconds to wait between checking notifications. Default: 300"""))
filter_notifications = models.BooleanField(default=False,
help_text=_("""Exclude boosts and favs from your notifications."""))
timezone = models.CharField(
max_length=80, blank=True, null=True, choices=timezones, default="UTC"
)
preview_sensitive = models.BooleanField(
default=False, help_text=_('Show preview for media marked as "sensitive"')
)
no_javascript = models.BooleanField(
default=False,
help_text=_(
"""Disable all JavaScript. Overrides all other JavaScript options."""
),
)
notifications = models.BooleanField(
default=True, help_text=_("""Display live notifications in header.""")
)
click_to_load = models.BooleanField(
default=False,
help_text=_(
"""Click to load more toots in the same page, rather than using pagination."""
),
)
lightbox = models.BooleanField(
default=False, help_text=_("""Use a JavaScript lightbox to display media.""")
)
poll_frequency = models.IntegerField(
default=300,
help_text=_(
"""Number of seconds to wait between checking notifications. Default: 300"""
),
)
filter_notifications = models.BooleanField(
default=False,
help_text=_("""Exclude boosts and favs from your notifications."""),
)
bundle_notifications = models.BooleanField(
default=False,
help_text=_(
"""Collapse together boosts or likes of the same toot in the notifications page."""
),
)
class Account(models.Model):
username = models.EmailField(unique=True)
email = models.EmailField(null=True, blank=True)
django_user = models.ForeignKey(settings.AUTH_USER_MODEL, models.CASCADE, null=True)
access_token = models.CharField(null=True, blank=True, max_length=2048)
client= models.ForeignKey(Client, models.SET_NULL, null=True)
client = models.ForeignKey(Client, models.SET_NULL, null=True)
preferences = models.ForeignKey(Preference, models.SET_NULL, null=True)
note_seen = models.CharField(null=True, blank=True, max_length=128)

View File

@ -20,7 +20,7 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '6lq9!52j^)=m89))umaphx9ac%)b$k^gs%x1rkk^v^$u9zjz$@'
SECRET_KEY = "6lq9!52j^)=m89))umaphx9ac%)b$k^gs%x1rkk^v^$u9zjz$@"
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
@ -31,57 +31,58 @@ ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'widget_tweaks',
'sanitizer',
'django.contrib.humanize',
'brutaldon',
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"widget_tweaks",
"sanitizer",
"django.contrib.humanize",
"brutaldon",
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'brutaldon.middleware.timezone.TimezoneMiddleware',
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
"brutaldon.middleware.timezone.TimezoneMiddleware",
]
ROOT_URLCONF = 'brutaldon.urls'
ROOT_URLCONF = "brutaldon.urls"
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [],
"APP_DIRS": True,
"OPTIONS": {
"context_processors": [
"django.template.context_processors.debug",
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
"brutaldon.context_processors.bookmarklet_url",
]
},
},
}
]
WSGI_APPLICATION = 'brutaldon.wsgi.application'
WSGI_APPLICATION = "brutaldon.wsgi.application"
# Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": os.path.join(BASE_DIR, "db.sqlite3"),
}
}
@ -91,78 +92,68 @@ DATABASES = {
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
"NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator"
},
{"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator"},
{"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator"},
{"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator"},
]
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse',
},
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
'formatters': {
'django.server': {
'()': 'django.utils.log.ServerFormatter',
'format': '[%(server_time)s] %(message)s',
}
},
'handlers': {
'console': {
'level': 'INFO',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
},
'console_debug_false': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'logging.StreamHandler',
},
'django.server': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'django.server',
},
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
}
},
'loggers': {
'django': {
'handlers': ['console', 'console_debug_false', 'mail_admins'],
'level': 'INFO',
},
'django.server': {
'handlers': ['django.server'],
'level': 'INFO',
'propagate': False,
}
}
"version": 1,
"disable_existing_loggers": False,
"filters": {
"require_debug_false": {"()": "django.utils.log.RequireDebugFalse"},
"require_debug_true": {"()": "django.utils.log.RequireDebugTrue"},
},
"formatters": {
"django.server": {
"()": "django.utils.log.ServerFormatter",
"format": "[%(server_time)s] %(message)s",
}
},
"handlers": {
"console": {
"level": "INFO",
"filters": ["require_debug_true"],
"class": "logging.StreamHandler",
},
"console_debug_false": {
"level": "ERROR",
"filters": ["require_debug_false"],
"class": "logging.StreamHandler",
},
"django.server": {
"level": "INFO",
"class": "logging.StreamHandler",
"formatter": "django.server",
},
"mail_admins": {
"level": "ERROR",
"filters": ["require_debug_false"],
"class": "django.utils.log.AdminEmailHandler",
},
},
"loggers": {
"django": {
"handlers": ["console", "console_debug_false", "mail_admins"],
"level": "INFO",
},
"django.server": {
"handlers": ["django.server"],
"level": "INFO",
"propagate": False,
},
},
}
# Internationalization
# https://docs.djangoproject.com/en/2.0/topics/i18n/
LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = "en-us"
TIME_ZONE = 'America/New_York'
TIME_ZONE = "America/New_York"
USE_I18N = True
@ -174,13 +165,29 @@ USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.0/howto/static-files/
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = "/static/"
STATIC_ROOT = os.path.join(BASE_DIR, "static")
# Sanitizer settings
SANITIZER_ALLOWED_TAGS = ['a', 'p', 'img', 'br', 'i', 'strong', 'em', 'pre', 'code',
'ul', 'li', 'ol', 'blockquote', 'del', 'span', 'u']
SANITIZER_ALLOWED_ATTRIBUTES = ['href', 'src', 'title', 'alt', 'class', 'lang']
SANITIZER_ALLOWED_TAGS = [
"a",
"p",
"img",
"br",
"i",
"strong",
"em",
"pre",
"code",
"ul",
"li",
"ol",
"blockquote",
"del",
"span",
"u",
]
SANITIZER_ALLOWED_ATTRIBUTES = ["href", "src", "title", "alt", "class", "lang"]
# File upload settings.
# Important: media will not work if you change this.
@ -188,11 +195,21 @@ FILE_UPLOAD_HANDLERS = ["django.core.files.uploadhandler.TemporaryFileUploadHand
# Session serialization
# Important: whatever you choose has to be able to serialize DateTime, so not JSON.
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
SESSION_SERIALIZER = "django.contrib.sessions.serializers.PickleSerializer"
# URL to redirect users to when not logged in
ANONYMOUS_HOME_URL = 'about'
ANONYMOUS_HOME_URL = "about"
# URL to redirect galaxy brain users to
RICKROLL_URL = "https://invidio.us/watch?v=dQw4w9WgXcQ"
# Function to check if trying to add an account should trigger a special response
def CHECK_INSTANCE_URL(url, redirect):
if "gab.com" in url:
return redirect(RICKROLL_URL)
elif "shitposter.club" in url:
return redirect(RICKROLL_URL)
# Version number displayed on about page
BRUTALDON_VERSION = "2.10.0"
BRUTALDON_VERSION = "2.15.0"

View File

@ -105,6 +105,13 @@ emoji-link
font-size: 2em;
}
.content figure.attachment-image
{
text-align:left;
margin-left: 0;
margin-right: 0;
}
@media screen and (max-width: 768px) {
.media {
@ -233,6 +240,12 @@ a.navbar-item span:nth-child(2):before
content: " ";
}
div.poll {
margin-bottom: 1ex;
margin-top: 1em;
max-width: 90%;
}
/* Fix some rules that don't need to be there */
.content figure:not(:last-child)
{
@ -242,3 +255,14 @@ a.navbar-item span:nth-child(2):before
{
margin-top: 0;
}
.input,
.textarea {
color: inherit;
background-color: inherit;
}
input[type="text"] {
color: inherit;
background-color: inherit;
}

View File

@ -0,0 +1,237 @@
body > section > div.container {
max-width: 100%;
}
.reblog-icon {
position: relative;
top: -24px;
left: 40px;
}
img.fav-avatar {
display: inline;
}
.media-content {
padding: 1.25ex;
}
.is-max-128 img, .is-max-192 img, .is-max-256 img
{
bottom: 0;
left: 0;
position: absolute;
right:0;
top: 0;
}
.is-max-128 {
max-height: 128px;
max-width: 128px;
}
.is-max-256 {
max-height: 256px;
max-width: 256px;
}
.is-max-192 {
max-height: 192px;
max-width: 192px;
}
figure.media-left p.image a img
{
border-radius: 5px;
}
img.avatar
{
border-radius: 5px;
}
.active-context {
background-color: #FFF8DC;
}
h2.subtitle
{
margin-top: 2rem;
margin-bottom: 1rem;
}
article.media.user-info .content img
{
max-height: 1.5rem;
max-width: 1.5rem;
}
span.account-locked
{
margin-top: 48px;
margin-left: -16px;
}
.errorlist
{
color: #FF0000;
}
.emoji-box
{
padding: .75rem;
background-color: #FCFCFC;
border: 1px solid #CCC;
border-radius: 5px;
}
img.emoji
{
display: inline;
max-height: 1.5em;
max-width: 1.5em;
vertical-align: text-bottom;
}
emoji-link
{
font-size: 2em;
}
.content figure.attachment-image
{
text-align:left;
margin-left: 0;
margin-right: 0;
}
@media screen and (max-width: 768px) {
.media {
display: block;
}
}
#page-load-indicator
{
width: 100%;
opacity: 0.8;
position: fixed;
top: 0;
left: 0;
z-index: 666;
transition: all 500ms;
height: 2px;
overflow: hidden;
background-color: #ddd;
display: none;
}
#page-load-indicator:before{
display: block;
position: absolute;
content: "";
left: -200px;
width: 200px;
height: 4px;
background-color: #888;
animation: page-loading 1.5s linear infinite;
}
@keyframes page-loading {
from {left: -200px; width: 30%;}
50% {width: 30%;}
70% {width: 70%;}
80% { left: 50%;}
95% {left: 120%;}
to {left: 100%;}
}
#status_count
{
margin-left: 90%;
margin-top: 1rem;
background-color: #888;
color: #FFF;
float: right;
padding: 0.5ex;
border-radius: 5px;
min-height: 1.5rem;
min-width: 1.5rem;
font-size: 0.8em;
text-align: right;
}
#before-main
{
width: 100%;
height: 2em;
background-color: #DEDEDE;
color: white;
margin-top: 0;
padding: 0;
}
#before-main span
{
margin-left: 50%;
}
input#id_poll_frequency
{
max-width: 10em;
}
body.has-navbar-fixed-top, html.has-navbar-fixed-top {
padding-top: 5rem;
}
.card
{
margin-top: 1em;
margin: 0, auto;
max-width: 90%;
}
#username_autocomplete
{
height: 0;
}
.media-content .content a:not(.mention)
{
text-decoration-line: underline;
text-decoration-style: dotted;
}
.media-content a.level-item
{
text-decoration: none;
}
a.navbar-item span:nth-child(2):before
{
content: " ";
}
div.poll {
margin-bottom: 1ex;
margin-top: 1em;
max-width: 90%;
}
/* Fix some rules that don't need to be there */
.content figure:not(:last-child)
{
margin-bottom: 0;
}
.content figure:not(:first-child)
{
margin-top: 0;
}

View File

@ -2,7 +2,6 @@ body > section > div.container {
max-width: 100%;
}
.reblog-icon {
position: relative;
top: -24px;
@ -102,12 +101,13 @@ emoji-link
font-size: 2em;
}
.level.attachments
.content figure.attachment-image
{
overflow-x: auto;
text-align:left;
margin-left: 0;
margin-right: 0;
}
@media screen and (max-width: 768px) {
.media {
display: block;
@ -218,6 +218,14 @@ a.navbar-item span:nth-child(2):before
content: " ";
}
div.poll {
margin-bottom: 1ex;
margin-top: 1em;
max-width: 90%;
}
/* Fix some rules that don't need to be there */
.content figure:not(:last-child)
{

View File

@ -105,26 +105,26 @@ img.emoji
}
.modal {
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
display: none;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
overflow: hidden;
position: fixed;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
display: none;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
overflow: hidden;
position: fixed;
z-index: 40;
}
.modal-background {
position: absolute;
background-color: rgba(10,10,10,.86);
position: absolute;
background-color: rgba(10,10,10,.86);
}
.modal, .modal-background {
bottom: 0;
left: 0;
right: 0;
top: 0;
bottom: 0;
left: 0;
right: 0;
top: 0;
}
.modal-content
@ -139,7 +139,7 @@ img.emoji
}
.modal.is-active {
display: flex;
display: flex;
}
.card
@ -237,13 +237,13 @@ img.emoji
}
#username_autocomplete div.tooltip::after {
content: attr(data-tooltip);
font-size: 0.6em;
margin-left: 1em;
margin-right: 1em;
border: 1pt solid #444;
background-color: #FFF;
padding: 0.2em;
content: attr(data-tooltip);
font-size: 0.6em;
margin-left: 1em;
margin-right: 1em;
border: 1pt solid #444;
background-color: #FFF;
padding: 0.2em;
}
/* Remaining brutaldon-specific tweaks */
@ -308,9 +308,9 @@ img.fav-avatar {
}
.attachments figure {
border: 0.2ex solid #444;
max-width: 256px;
padding: 1em;
border: 0.2ex solid #444;
max-width: 256px;
padding: 1em;
}
figure.level-item > video
@ -319,6 +319,18 @@ figure.level-item > video
max-width: 256px;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
td, th
{
padding: 0.25em;
border: 1px solid #444;
}
td.empty-cell, th.empty-cell { border: none; }
@media screen and (max-width: 768px) {
.box {
max-width: 90%;

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,296 @@
body, input, textarea, select {
font-family: sans-serif;
background-color: #111111;
color: #CCCCCC;
margin: 1ex;
font-size: 11pt;
}
input[text], textarea
{
margin: 0 auto;
position: relative;
width: 100%;
max-width: 100em;
}
a {
color: cornflowerblue;
text-decoration: underline;
}
a:active {
color: lightcoral;
text-decoration: underline;
}
a:visited {
color: orchid;
text-decoration: underline;
}
img.is-32x32 {
float: left;
max-width: 32px;
max-height: auto;
margin: 4px;
}
.container {
margin: 0 auto;
position: relative;
}
@media screen and (min-width: 1024px) {
.container {
max-width: 960px;
width: 960px;
}
.container.is-fluid {
margin-left: 64px;
margin-right: 64px;
max-width: none;
width: auto;
}
.navbar,
.navbar-menu,
.navbar-start,
.navbar-end {
align-items: stretch;
display: flex;
}
.navbar-start {
justify-content: flex-start;
margin-right: auto;
}
.navbar-end {
justify-content: flex-end;
margin-left: auto;
}
}
@media screen and (max-width: 1279px) {
.container.is-widescreen {
max-width: 1152px;
width: auto;
}
}
@media screen and (max-width: 1471px) {
.container.is-fullhd {
max-width: 1344px;
width: auto;
}
}
@media screen and (min-width: 1280px) {
.container {
max-width: 1152px;
width: 1152px;
}
}
@media screen and (min-width: 1472px) {
.container {
max-width: 1344px;
width: 1344px;
}
}
main > div.container {
max-width: 100ex;
}
.level {
clear: both;
}
.title {
font-size: 3ex;
font-weight: bold;
margin-top: 1ex;
margin-bottom: 1ex;
}
.subtitle {
font-size: 1.5ex;
font-weight: bold;
margin-top: 0.25ex;
margin-bottom: 0.25ex;
}
.toot {
clear: both;
}
.image.is-32x32, .is-32x32 img, img.is-32x32 {
width: 32px;
height: 32px;
}
.image.is-48x48, .is-48x48 img, img.is-48x48 {
width: 48px;
height: 48px;
}
.image.is-64x64, .is-64x64 img, img.is-64x64 {
width: 64px;
height: 64px;
}
.image.is-96x96, .is-96x96 img, img.is-96x96 {
width: 96px;
height: 96px;
}
.is-max-128 {
max-height: 128px;
max-width: 128px;
}
.is-max-256 {
max-height: 256px;
max-width: 256px;
}
.media {
padding: 1ex;
margin: 4px;
overflow: auto;
}
.media.active-context {
background-color: #2C2C2C;
}
.field
{
margin-top: 1em;
}
label
{
font-weight: bold;
}
.control, .select
{
margin-top: 0.5ex;
margin-bottom: 0.5ex;
}
.account-avatar
{
display: inline-block;
}
.reblog-icon
{
margin-top: 32px;
display: inline-block;
}
.media-content
{
margin-top: 1ex;
}
.media-content > div > p
{
margin-bottom: 1ex;
}
.textarea
{
max-width: 100%;
}
.errorlist
{
color: #FF0000;
}
img.emoji
{
display: inline;
max-height: 1.5rem;
max-width: 1.5rem;
vertical-align: text-bottom;
}
hr.is-hidden
{
display: none;
}
.box
{
border-radius: 3px;
border: 1px solid #000;
padding: 1em;
margin-bottom: 1em;
background-color: #1C1C1C;
color: #CCCCCC;
}
.modal {
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
display: none;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
overflow: hidden;
position: fixed;
z-index: 40;
}
.modal-background {
position: absolute;
background-color: rgba(10,10,10,.86);
}
.modal, .modal-background {
bottom: 0;
left: 0;
right: 0;
top: 0;
}
.modal-content
{
height: 90vh;
overflow: auto;
z-index: 60;
}
.modal.is-active {
display: flex;
}
.navbar-item span {
padding-right: 1ex;
}
.card
{
padding: 1em;
margin-top: 1em;
border: 0.2em solid white;
}
.card-header
{
padding-bottom: 1em;
border-bottom: 0.2em solid white;
}
.card-image
{
padding: 1em;
margin 0, auto;
}
.button
{
border: 0.2em solid #CCC;
display: inline;
padding: 0.4em;
}

View File

@ -0,0 +1,296 @@
body, input, textarea, select {
font-family: sans-serif;
background-color: #FAFAFA;
color: #000;
margin: 1ex;
font-size: 11pt;
}
input[text], textarea
{
margin: 0 auto;
position: relative;
width: 100%;
max-width: 100em;
}
a {
color: blue;
text-decoration: underline;
}
a:active {
color: red;
text-decoration: underline;
}
a:visited {
color: purple;
text-decoration: underline;
}
img.is-32x32 {
float: left;
max-width: 32px;
max-height: auto;
margin: 4px;
}
.container {
margin: 0 auto;
position: relative;
}
@media screen and (min-width: 1024px) {
.container {
max-width: 960px;
width: 960px;
}
.container.is-fluid {
margin-left: 64px;
margin-right: 64px;
max-width: none;
width: auto;
}
.navbar,
.navbar-menu,
.navbar-start,
.navbar-end {
align-items: stretch;
display: flex;
}
.navbar-start {
justify-content: flex-start;
margin-right: auto;
}
.navbar-end {
justify-content: flex-end;
margin-left: auto;
}
}
@media screen and (max-width: 1279px) {
.container.is-widescreen {
max-width: 1152px;
width: auto;
}
}
@media screen and (max-width: 1471px) {
.container.is-fullhd {
max-width: 1344px;
width: auto;
}
}
@media screen and (min-width: 1280px) {
.container {
max-width: 1152px;
width: 1152px;
}
}
@media screen and (min-width: 1472px) {
.container {
max-width: 1344px;
width: 1344px;
}
}
main > div.container {
max-width: 100ex;
}
.level {
clear: both;
}
.title {
font-size: 3ex;
font-weight: bold;
margin-top: 1ex;
margin-bottom: 1ex;
}
.subtitle {
font-size: 1.5ex;
font-weight: bold;
margin-top: 0.25ex;
margin-bottom: 0.25ex;
}
.toot {
clear: both;
}
.image.is-32x32, .is-32x32 img, img.is-32x32 {
width: 32px;
height: 32px;
}
.image.is-48x48, .is-48x48 img, img.is-48x48 {
width: 48px;
height: 48px;
}
.image.is-64x64, .is-64x64 img, img.is-64x64 {
width: 64px;
height: 64px;
}
.image.is-96x96, .is-96x96 img, img.is-96x96 {
width: 96px;
height: 96px;
}
.is-max-128 {
max-height: 128px;
max-width: 128px;
}
.is-max-256 {
max-height: 256px;
max-width: 256px;
}
.media {
padding: 1ex;
margin: 4px;
overflow: auto;
}
.media.active-context {
background-color: #DDD;
}
.field
{
margin-top: 1em;
}
label
{
font-weight: bold;
}
.control, .select
{
margin-top: 0.5ex;
margin-bottom: 0.5ex;
}
.account-avatar
{
display: inline-block;
}
.reblog-icon
{
margin-top: 32px;
display: inline-block;
}
.media-content
{
margin-top: 1ex;
}
.media-content > div > p
{
margin-bottom: 1ex;
}
.textarea
{
max-width: 100%;
}
.errorlist
{
color: #FF0000;
}
img.emoji
{
display: inline;
max-height: 1.5rem;
max-width: 1.5rem;
vertical-align: text-bottom;
}
hr.is-hidden
{
display: none;
}
.box
{
border-radius: 3px;
border: 1px solid #000;
padding: 1em;
margin-bottom: 1em;
background-color: white;
color: black;
}
.modal {
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
display: none;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
overflow: hidden;
position: fixed;
z-index: 40;
}
.modal-background {
position: absolute;
background-color: rgba(10,10,10,.86);
}
.modal, .modal-background {
bottom: 0;
left: 0;
right: 0;
top: 0;
}
.modal-content
{
height: 90vh;
overflow: auto;
z-index: 60;
}
.modal.is-active {
display: flex;
}
.navbar-item span {
padding-right: 1ex;
}
.card
{
padding: 1em;
margin-top: 1em;
border: 0.2em solid black;
}
.card-header
{
padding-bottom: 1em;
border-bottom: 0.2em solid black;
}
.card-image
{
padding: 1em;
margin 0, auto;
}
.button
{
border: 0.2em solid #444;
display: inline;
padding: 0.4em;
}

View File

@ -1,8 +1,8 @@
html, a, div, div.notification, body, body div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, figure, footer, header, menu, nav, section, time, mark, audio, video, details, summary, h1.title, h2.subtitle {
font-family: Terminus, Inconsolata, Consolas, "Droid Sans Mono", "DejaVu Sans Mono", "Monaco", monospace;
font-family: "DEC Terminal Modern", Terminus, Inconsolata, Consolas, "Droid Sans Mono", "DejaVu Sans Mono", "Monaco", monospace;
color: #ff7700;
background-color: #000000;
font-size: medium;
font-size: 1.2rem;
}
@ -21,7 +21,6 @@ a, a.button, a.button.is-primary, input.button.is-primary, input, .input, .texta
background-color: #000000;
font-weight: bolder;
text-decoration-line: none;
font-size: medium;
}
a:hover, a.button:hover, a.button.is-primary:hover, input.button.is-primary:hover {
@ -204,6 +203,9 @@ img.emoji
display: flex;
}
.navbar-item {
margin-right: 2em;
}
@media screen and (max-width: 768px) {
.media {

View File

@ -1,8 +1,8 @@
html, body, a, div, div.notification, body, body div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, figure, footer, header, menu, nav, section, time, mark, audio, video, details, summary, h1.title, h2.subtitle {
font-family: Terminus, Inconsolata, Consolas, "Droid Sans Mono", "DejaVu Sans Mono", "Monaco", monospace;
font-family: "DEC Terminal Modern", Terminus, Inconsolata, Consolas, "Droid Sans Mono", "DejaVu Sans Mono", "Monaco", monospace;
color: #00ff77;
background-color: #000;
font-size: medium;
font-size: 1.2rem;
}
tr, td, ul, ol {
@ -21,7 +21,7 @@ a, a.button, a.button.is-primary, input.button.is-primary, input, .input, .texta
background-color: #000000;
font-weight: bolder;
text-decoration-line: none;
font-size: medium;
font-size: 1.2rem;
}
@ -208,6 +208,9 @@ img.emoji
display: flex;
}
.navbar-item {
margin-right: 2em;
}
@media screen and (max-width: 768px) {
.media {

View File

@ -1,11 +1,11 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<!--
2018-5-12: Created with FontForge (http://fontforge.org)
2019-2-18: Created with FontForge (http://fontforge.org)
-->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
<metadata>
Created by FontForge 20180321 at Sat May 12 14:32:04 2018
Created by FontForge 20180321 at Mon Feb 18 18:29:30 2019
By Julien Deswaef
The Fork Awesome font is licensed under the SIL OFL 1.1 (http://scripts.sil.org/OFL). Fork Awesome is a fork based of off Font Awesome 4.7.0 by Dave Gandy. More info on licenses at https://forkawesome.github.io
</metadata>
@ -19,10 +19,10 @@ The Fork Awesome font is licensed under the SIL OFL 1.1 (http://scripts.sil.org/
panose-1="2 0 5 3 0 0 0 0 0 0"
ascent="1536"
descent="-256"
bbox="-0.653061 -264 2304.01 1536.25"
bbox="-0.653061 -264 2304.01 1538"
underline-thickness="89.6"
underline-position="-179.2"
unicode-range="U+0020-F310"
unicode-range="U+0020-F32B"
/>
<missing-glyph />
<glyph glyph-name="space" unicode=" " horiz-adv-x="200"
@ -50,9 +50,9 @@ d="M256 224v-192c0 -17 -15 -32 -32 -32h-192c-17 0 -32 15 -32 32v192c0 17 15 32 3
c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h192c17 0 32 -15 32 -32zM1792 224v-192c0 -17 -15 -32 -32 -32h-1344c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1344c17 0 32 -15 32 -32zM256 1376v-192c0 -17 -15 -32 -32 -32h-192c-17 0 -32 15 -32 32v192
c0 17 15 32 32 32h192c17 0 32 -15 32 -32zM1792 608v-192c0 -17 -15 -32 -32 -32h-1344c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1344c17 0 32 -15 32 -32zM1792 992v-192c0 -17 -15 -32 -32 -32h-1344c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1344
c17 0 32 -15 32 -32zM1792 1376v-192c0 -17 -15 -32 -32 -32h-1344c-17 0 -32 15 -32 32v192c0 17 15 32 32 32h1344c17 0 32 -15 32 -32z" />
<glyph glyph-name="foursquare" unicode="&#xf180;" horiz-adv-x="1192"
d="M956 1102l37 194c7 32 -17 57 -44 57h-712c-32 0 -54 -29 -54 -54v-1101c0 -3 3 -4 6 -1c262 315 291 352 291 352c30 35 42 41 86 41h239c33 0 52 28 55 44s31 162 37 191s-21 59 -48 59h-294c-39 0 -67 28 -67 67v42c0 39 28 66 67 66h346c24 0 51 22 55 43zM1183 1324
c-37 -180 -148 -749 -158 -790c-12 -47 -30 -129 -144 -129h-271c-11 0 -12 1 -22 -10c0 0 -7 -8 -426 -494c-33 -38 -87 -31 -107 -23s-55 32 -55 98v1410c0 58 36 150 158 150h888c130 0 165 -74 137 -212zM1183 1324l-158 -790c10 41 121 610 158 790z" />
<glyph glyph-name="archlinux" unicode="&#xf323;" horiz-adv-x="1794"
d="M897 1538c164 -386 203 -504 682 -1397c-61 36 -138 70 -247 98c158 -81 236 -156 310 -214c47 -87 97 -179 152 -281c-281 162 -499 263 -702 303c7 31 11 64 12 98c5 182 -83 337 -195 347s-207 -131 -212 -313v-9c0 -43 4 -84 13 -122c-205 -39 -426 -140 -710 -304
c362 650 540 989 654 1226c60 -50 139 -99 256 -147c-109 76 -175 143 -230 201c89 190 137 318 217 514z" />
<glyph glyph-name="th" unicode="&#xf00a;" horiz-adv-x="1792"
d="M512 288v-192c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h320c53 0 96 -43 96 -96zM512 800v-192c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h320c53 0 96 -43 96 -96zM1152 288v-192c0 -53 -43 -96 -96 -96h-320
c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h320c53 0 96 -43 96 -96zM512 1312v-192c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v192c0 53 43 96 96 96h320c53 0 96 -43 96 -96zM1152 800v-192c0 -53 -43 -96 -96 -96h-320c-53 0 -96 43 -96 96v192c0 53 43 96 96 96
@ -143,6 +143,8 @@ d="M768 96v1088c-300 0 -544 -244 -544 -544s244 -544 544 -544zM1536 640c0 -424 -3
<glyph glyph-name="subway" unicode="&#xf239;"
d="M1088 1536c247 0 448 -143 448 -320v-896c0 -173 -191 -313 -431 -319l213 -202c21 -20 7 -55 -22 -55h-1056c-29 0 -43 35 -22 55l213 202c-240 6 -431 146 -431 319v896c0 177 201 320 448 320h640zM288 224c88 0 160 72 160 160s-72 160 -160 160s-160 -72 -160 -160
s72 -160 160 -160zM704 768v512h-544v-512h544zM1248 224c88 0 160 72 160 160s-72 160 -160 160s-160 -72 -160 -160s72 -160 160 -160zM1408 768v512h-576v-512h576z" />
<glyph glyph-name="unslpash" unicode="&#xf325;"
d="M1052 728h484v-856h-1536v856h484v-428h568v428zM484 1408h568v-428h-568v428z" />
<glyph glyph-name="chevron-down" unicode="&#xf078;" horiz-adv-x="1612"
d="M1593 728l-742 -741c-25 -25 -65 -25 -90 0l-742 741c-25 25 -25 66 0 91l166 165c25 25 65 25 90 0l531 -531l531 531c25 25 65 25 90 0l166 -165c25 -25 25 -66 0 -91z" />
<glyph glyph-name="location-arrow" unicode="&#xf124;" horiz-adv-x="1408"
@ -211,6 +213,9 @@ c0 -9 -1 -18 -2 -27c-116 0 -233 20 -349 20c-14 0 -34 -6 -48 -8c-63 -11 -125 -14
d="M1536 640c0 -424 -344 -768 -768 -768c-76 0 -148 11 -218 32c29 46 62 105 78 164c0 0 9 34 54 211c26 -51 104 -96 187 -96c247 0 415 225 415 527c0 227 -193 440 -487 440c-364 0 -548 -262 -548 -480c0 -132 50 -250 157 -294c17 -7 33 0 38 20c4 13 12 47 16 61
c5 20 3 26 -11 43c-31 37 -51 84 -51 151c0 194 145 368 378 368c206 0 320 -126 320 -295c0 -221 -98 -408 -244 -408c-80 0 -140 66 -121 148c23 97 68 202 68 272c0 63 -34 116 -104 116c-82 0 -148 -85 -148 -199c0 0 0 -73 25 -122c-84 -356 -99 -418 -99 -418
c-14 -58 -15 -123 -13 -177c-271 119 -460 389 -460 704c0 424 344 768 768 768s768 -344 768 -768z" />
<glyph glyph-name="sun" unicode="&#xf329;" horiz-adv-x="1707"
d="M1706 363c-3 -10 -11 -17 -20 -20l-292 -96v-306c0 -10 -5 -20 -13 -26c-9 -6 -19 -8 -29 -4l-292 94l-180 -248c-6 -8 -16 -13 -26 -13s-20 5 -26 13l-180 248l-292 -94c-10 -4 -20 -2 -29 4c-8 6 -13 16 -13 26v306l-292 96c-9 3 -17 10 -20 20s-2 21 4 29l180 248
l-180 248c-6 9 -7 19 -4 29s11 17 20 20l292 96v306c0 10 5 20 13 26c9 6 19 8 29 4l292 -94l180 248c12 16 40 16 52 0l180 -248l292 94c10 4 20 2 29 -4c8 -6 13 -16 13 -26v-306l292 -96c9 -3 17 -10 20 -20s2 -20 -4 -29l-180 -248l180 -248c6 -8 7 -19 4 -29z" />
<glyph glyph-name="cart-plus" unicode="&#xf217;" horiz-adv-x="1664"
d="M1216 832c0 35 -29 64 -64 64h-128v128c0 35 -29 64 -64 64s-64 -29 -64 -64v-128h-128c-35 0 -64 -29 -64 -64s29 -64 64 -64h128v-128c0 -35 29 -64 64 -64s64 29 64 64v128h128c35 0 64 29 64 64zM640 0c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128
s128 -57 128 -128zM1536 0c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128s128 -57 128 -128zM1664 1088v-512c0 -32 -24 -60 -57 -64l-1044 -122c4 -22 13 -47 13 -70s-14 -44 -24 -64h920c35 0 64 -29 64 -64s-29 -64 -64 -64h-1024c-35 0 -64 29 -64 64
@ -303,10 +308,8 @@ c-6 -25 -8 -66 -27 -84c-13 -12 -34 -14 -51 -14c-47 0 -94 11 -141 11c-14 0 -35 -1
c11 -40 64 -210 64 -234zM776 760c-17 0 -33 7 -45 19c-25 25 -26 66 0 91c24 24 37 56 37 90s-13 66 -37 91c-26 25 -25 65 0 90s65 25 90 0c48 -48 75 -113 75 -181s-27 -133 -75 -181c-13 -12 -29 -19 -45 -19zM957 579c-17 0 -33 6 -45 19c-25 25 -25 65 0 90
c72 73 112 169 112 272s-40 199 -112 272c-25 25 -25 65 0 90s65 25 90 0c97 -97 150 -225 150 -362s-53 -265 -150 -362c-12 -13 -29 -19 -45 -19zM1138 398c-17 0 -33 6 -45 19c-25 25 -25 65 0 90c120 121 187 282 187 453s-67 332 -187 453c-25 25 -25 65 0 90
s65 25 90 0c145 -145 225 -338 225 -543s-80 -398 -225 -543c-12 -13 -29 -19 -45 -19z" />
<glyph glyph-name="code-fork" unicode="&#xf126;" horiz-adv-x="1024"
d="M288 64c0 53 -43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96s96 43 96 96zM288 1216c0 53 -43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96s96 43 96 96zM928 1088c0 53 -43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96s96 43 96 96zM1024 1088c0 -71 -39 -133 -96 -166
c-3 -361 -259 -441 -429 -495c-159 -50 -211 -74 -211 -171v-26c57 -33 96 -95 96 -166c0 -106 -86 -192 -192 -192s-192 86 -192 192c0 71 39 133 96 166v820c-57 33 -96 95 -96 166c0 106 86 192 192 192s192 -86 192 -192c0 -71 -39 -133 -96 -166v-497
c51 25 105 42 154 57c186 59 292 103 294 312c-57 33 -96 95 -96 166c0 106 86 192 192 192s192 -86 192 -192z" />
<glyph glyph-name="biometric" unicode="&#xf32b;" horiz-adv-x="2304"
d="M1419 640c0 -147 -120 -267 -267 -267s-267 120 -267 267s120 267 267 267s267 -120 267 -267zM0 1222h2304v-521h-769c-29 185 -190 327 -383 327s-354 -142 -383 -327h-769v521zM0 579h769c29 -185 190 -327 383 -327s354 142 383 327h769v-521h-2304v521z" />
<glyph glyph-name="tasks" unicode="&#xf0ae;" horiz-adv-x="1792"
d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256c0 -35 -29 -64 -64 -64h-1664c-35 0 -64 29 -64 64v256c0 35 29 64 64 64h1664c35 0 64 -29 64 -64zM1792 832v-256c0 -35 -29 -64 -64 -64h-1664
c-35 0 -64 29 -64 64v256c0 35 29 64 64 64h1664c35 0 64 -29 64 -64zM1792 1344v-256c0 -35 -29 -64 -64 -64h-1664c-35 0 -64 29 -64 64v256c0 35 29 64 64 64h1664c35 0 64 -29 64 -64z" />
@ -388,9 +391,9 @@ c92 -39 167 -87 235 -152z" />
d="M148 1404h1236c82 0 149 -66 149 -148v-1236c0 -82 -67 -148 -149 -148h-1236c-82 0 -148 66 -148 148v1236c0 82 66 148 148 148zM736 1150v0l-161 -25l-133 -553c-8 -33 -12 -64 -12 -93s6 -54 18 -76s32 -40 60 -53s68 -19 117 -19l31 128c-18 1 -32 4 -42 9
s-18 12 -22 20s-5 17 -5 27s1 23 4 35zM985 902v0c-42 0 -80 -3 -116 -10s-67 -14 -95 -22l-174 -722h155l47 189c24 -4 47 -6 71 -6c49 0 94 8 135 25s76 41 106 72s52 67 69 109s25 88 25 139c0 31 -4 61 -13 88s-22 51 -40 72c-18 20 -41 36 -69 48s-62 18 -101 18z
M965 772v0c33 0 56 -11 69 -32s20 -46 20 -76c0 -31 -4 -59 -13 -84s-21 -47 -37 -65s-34 -32 -56 -42s-47 -15 -74 -15c-17 0 -32 1 -44 4l73 303c19 4 40 7 62 7z" />
<glyph glyph-name="camera" unicode="&#xf030;" horiz-adv-x="1920"
d="M960 864c159 0 288 -129 288 -288s-129 -288 -288 -288s-288 129 -288 288s129 288 288 288zM1664 1280c141 0 256 -115 256 -256v-896c0 -141 -115 -256 -256 -256h-1408c-141 0 -256 115 -256 256v896c0 141 115 256 256 256h224l51 136c25 66 103 120 173 120h512
c70 0 148 -54 173 -120l51 -136h224zM960 128c247 0 448 201 448 448s-201 448 -448 448s-448 -201 -448 -448s201 -448 448 -448z" />
<glyph glyph-name="foursquare" unicode="&#xf180;" horiz-adv-x="1192"
d="M956 1102l37 194c7 32 -17 57 -44 57h-712c-32 0 -54 -29 -54 -54v-1101c0 -3 3 -4 6 -1c262 315 291 352 291 352c30 35 42 41 86 41h239c33 0 52 28 55 44s31 162 37 191s-21 59 -48 59h-294c-39 0 -67 28 -67 67v42c0 39 28 66 67 66h346c24 0 51 22 55 43zM1183 1324
c-37 -180 -148 -749 -158 -790c-12 -47 -30 -129 -144 -129h-271c-11 0 -12 1 -22 -10c0 0 -7 -8 -426 -494c-33 -38 -87 -31 -107 -23s-55 32 -55 98v1410c0 58 36 150 158 150h888c130 0 165 -74 137 -212zM1183 1324l-158 -790c10 41 121 610 158 790z" />
<glyph glyph-name="music" unicode="&#xf001;"
d="M1536 1312v-1120c0 -141 -211 -192 -320 -192s-320 51 -320 192s211 192 320 192c66 0 132 -12 192 -39v537l-768 -237v-709c0 -141 -211 -192 -320 -192s-320 51 -320 192s211 192 320 192c66 0 132 -12 192 -39v967c0 42 28 79 68 92l832 256c9 3 18 4 28 4
c53 0 96 -43 96 -96z" />
@ -542,9 +545,10 @@ h-209v-209h-210v209h-209v210h209v209h210v-209h209z" />
<glyph glyph-name="sticky-note-o" unicode="&#xf24a;"
d="M1400 256h-248v-248c17 6 34 15 41 22l185 185c7 7 16 24 22 41zM1120 384h288v896h-1280v-1280h896v288c0 53 43 96 96 96zM1536 1312v-1024c0 -53 -31 -127 -68 -164l-184 -184c-37 -37 -111 -68 -164 -68h-1024c-53 0 -96 43 -96 96v1344c0 53 43 96 96 96h1344
c53 0 96 -43 96 -96z" />
<glyph glyph-name="moon-o" unicode="&#xf186;" horiz-adv-x="1471"
d="M1262 233c-36 -6 -73 -9 -110 -9c-371 0 -672 301 -672 672c0 127 37 251 104 357c-266 -79 -456 -323 -456 -613c0 -353 287 -640 640 -640c193 0 374 88 494 233zM1465 318c-125 -271 -399 -446 -697 -446c-423 0 -768 345 -768 768c0 415 325 752 739 767
c28 1 51 -15 61 -39c11 -25 4 -54 -15 -72c-114 -104 -177 -246 -177 -400c0 -300 244 -544 544 -544c79 0 155 17 228 51c25 11 53 6 72 -13s24 -48 13 -72z" />
<glyph glyph-name="fonticons" unicode="&#xf280;"
d="M0 1408h1536v-1536h-1536v1536zM908 1088l-12 -33l75 -83l-31 -114l25 -25l107 57l107 -57l25 25l-31 114l75 83l-12 33h-95l-53 96h-32l-53 -96h-95zM641 925c41 0 57 -15 56 -79l174 21c0 153 -105 181 -222 181c-174 0 -265 -70 -265 -240v-72h-96v-128h76
c10 0 20 0 20 -8v-382c0 -19 -5 -25 -23 -27l-73 -7v-88h448v86l-149 14c-18 2 -11 5 -11 25v387h191l38 128h-231c-10 0 2 7 2 15v80c0 60 2 94 65 94zM1248 96v86l-54 9c-19 3 -10 5 -10 25v520h-275l-23 -101l83 -22c13 -4 23 -13 23 -27v-370c0 -19 -8 -23 -26 -25
l-70 -9v-86h352z" />
<glyph glyph-name="comments-o" unicode="&#xf0e6;" horiz-adv-x="1792"
d="M704 1152c-312 0 -576 -176 -576 -384c0 -110 74 -216 202 -290l97 -56l-35 -84c21 12 42 25 62 39l44 31l53 -10c50 -9 101 -14 153 -14c312 0 576 176 576 384s-264 384 -576 384zM704 1280c389 0 704 -229 704 -512s-315 -512 -704 -512c-61 0 -120 6 -176 16
c-83 -59 -177 -102 -278 -128c-27 -7 -56 -12 -86 -16h-3c-15 0 -29 12 -32 29c-4 19 9 31 20 44c39 44 83 83 117 166c-162 94 -266 239 -266 401c0 283 315 512 704 512zM1526 111c34 -83 78 -122 117 -166c11 -13 24 -25 20 -44c-4 -18 -19 -31 -35 -29
@ -573,6 +577,10 @@ v128h-128v-128h128zM1536 384h-128v-128h128v128zM384 384h896v128h128v640h-128v128
<glyph glyph-name="briefcase" unicode="&#xf0b1;" horiz-adv-x="1792"
d="M640 1280h512v128h-512v-128zM1792 640v-480c0 -88 -72 -160 -160 -160h-1472c-88 0 -160 72 -160 160v480h672v-160c0 -35 29 -64 64 -64h320c35 0 64 29 64 64v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384c0 88 72 160 160 160h352v160
c0 53 43 96 96 96h576c53 0 96 -43 96 -96v-160h352c88 0 160 -72 160 -160z" />
<glyph glyph-name="weixin" unicode="&#xf1d7;" horiz-adv-x="2048"
d="M580 1075c0 55 -36 91 -91 91c-54 0 -109 -36 -109 -91c0 -54 55 -90 109 -90c55 0 91 36 91 90zM1323 568c0 36 -36 72 -91 72c-36 0 -72 -36 -72 -72c0 -37 36 -73 72 -73c55 0 91 36 91 73zM1087 1075c0 55 -36 91 -90 91c-55 0 -109 -36 -109 -91
c0 -54 54 -90 109 -90c54 0 90 36 90 90zM1722 568c0 36 -37 72 -91 72c-36 0 -72 -36 -72 -72c0 -37 36 -73 72 -73c54 0 91 36 91 73zM1456 965c-23 3 -46 4 -70 4c-344 0 -616 -257 -616 -573c0 -53 8 -104 23 -152c-23 -2 -45 -3 -68 -3c-91 0 -163 18 -254 36
l-253 -127l72 218c-181 127 -290 291 -290 490c0 345 326 616 725 616c356 0 669 -217 731 -509zM2048 404c0 -163 -108 -308 -254 -417l55 -181l-199 109c-73 -18 -146 -37 -218 -37c-345 0 -616 236 -616 526s271 526 616 526c326 0 616 -236 616 -526z" />
<glyph glyph-name="stop" unicode="&#xf04d;"
d="M1536 1344v-1408c0 -35 -29 -64 -64 -64h-1408c-35 0 -64 29 -64 64v1408c0 35 29 64 64 64h1408c35 0 64 -29 64 -64z" />
<glyph glyph-name="clone" unicode="&#xf24d;" horiz-adv-x="1792"
@ -608,6 +616,9 @@ d="M979 1395c25 25 45 16 45 -19v-1472c0 -35 -20 -44 -45 -19l-710 710c-6 6 -10 12
<glyph glyph-name="wheelchair" unicode="&#xf193;" horiz-adv-x="1629"
d="M1023 349l102 -204c-77 -238 -299 -401 -549 -401c-317 0 -576 259 -576 576c0 242 152 458 379 541l17 -131c-163 -72 -268 -232 -268 -410c0 -247 201 -448 448 -448c257 0 465 220 447 477zM1571 249l58 -114l-256 -128c-9 -5 -19 -7 -29 -7c-24 0 -47 14 -57 35
l-239 477h-472c-32 0 -60 25 -64 57l-96 779c-1 10 3 32 6 42c19 69 83 114 154 114c88 0 160 -72 160 -160c0 -91 -80 -169 -172 -159l37 -289h423v-128h-407l16 -128h455c24 0 47 -14 57 -35l228 -455z" />
<glyph glyph-name="bootstrap" unicode="&#xf315;"
d="M256 1408h1024c141 0 256 -115 256 -256v-1024c0 -141 -115 -256 -256 -256h-1024c-141 0 -256 115 -256 256v1024c0 141 115 256 256 256zM494 1020v-795h310c169 0 270 83 270 223c0 106 -69 182 -177 196v4c77 14 137 91 137 174c0 119 -93 198 -229 198h-311z
M593 933h190c97 0 150 -44 150 -123c0 -86 -64 -133 -181 -133h-159v256zM593 592v0h187c127 0 192 -47 192 -139s-63 -141 -183 -141h-196v280z" />
<glyph glyph-name="cutlery" unicode="&#xf0f5;" horiz-adv-x="1408"
d="M640 1472v-640c0 -81 -52 -154 -128 -181v-779c0 -70 -58 -128 -128 -128h-128c-70 0 -128 58 -128 128v779c-76 27 -128 100 -128 181v640c0 35 29 64 64 64s64 -29 64 -64v-416c0 -35 29 -64 64 -64s64 29 64 64v416c0 35 29 64 64 64s64 -29 64 -64v-416
c0 -35 29 -64 64 -64s64 29 64 64v416c0 35 29 64 64 64s64 -29 64 -64zM1408 1472v-1600c0 -70 -58 -128 -128 -128h-128c-70 0 -128 58 -128 128v512h-224c-17 0 -32 15 -32 32v800c0 176 144 320 320 320h256c35 0 64 -29 64 -64z" />
@ -639,6 +650,8 @@ h2048c70 0 128 -58 128 -128z" />
d="M892 167v-167h-248l-159 252l-24 42c-6 7 -9 14 -11 21h-3c-2 -7 -6 -14 -9 -21c-6 -12 -15 -28 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228c9 -14 16 -29 23 -42c6 -7 9 -14 11 -21h3c2 7 6 14 11 21l25 42l140 228h257v-168h-125
l-184 -267l204 -296h109zM1529 846v-206h-514l-3 27c-2 14 -4 33 -4 46c0 273 350 296 350 441c0 52 -47 87 -100 87c-38 0 -72 -18 -97 -39c-13 -11 -25 -25 -36 -38l-105 92c18 25 38 46 63 66c42 33 103 65 188 65c145 0 246 -85 246 -218c0 -240 -332 -260 -346 -403
h232v80h126z" />
<glyph glyph-name="pixelfed" unicode="&#xf314;"
d="M768 -128c-424 0 -768 344 -768 768s344 768 768 768s768 -344 768 -768s-344 -768 -768 -768zM707 472h141c133 0 240 105 240 234s-107 234 -240 234h-203c-77 0 -139 -60 -139 -135v-525z" />
<glyph glyph-name="tty" unicode="&#xf1e4;" horiz-adv-x="1792"
d="M448 224v-192c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM256 608v-192c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM832 224v-192c0 -18 -14 -32 -32 -32h-192
c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM640 608v-192c0 -18 -14 -32 -32 -32h-192c-18 0 -32 14 -32 32v192c0 18 14 32 32 32h192c18 0 32 -14 32 -32zM66 768c-37 0 -66 29 -66 65v129h514v-129c0 -36 -29 -65 -65 -65h-383zM1216 224v-192
@ -660,6 +673,9 @@ s384 -172 384 -384z" />
<glyph glyph-name="xmpp" unicode="&#xf2f9;" horiz-adv-x="1542"
d="M1536 1314c47 -398 -206 -904 -657 -1199c122 -101 261 -177 414 -216v-27c-165 14 -320 59 -461 128l-30 15l-1 1l-6 3c-11 6 -30 16 -41 22c-94 -51 -193 -90 -297 -116c-68 -19 -139 -33 -211 -42v28c145 37 279 107 396 201c-426 296 -682 805 -637 1192l93 -33v0
l273 -81c-1 -16 -1 -32 -1 -49c0 -296 147 -656 394 -917c254 262 406 628 406 929c0 17 0 33 -1 49l274 81z" />
<glyph glyph-name="moon-o" unicode="&#xf186;" horiz-adv-x="1471"
d="M1262 233c-36 -6 -73 -9 -110 -9c-371 0 -672 301 -672 672c0 127 37 251 104 357c-266 -79 -456 -323 -456 -613c0 -353 287 -640 640 -640c193 0 374 88 494 233zM1465 318c-125 -271 -399 -446 -697 -446c-423 0 -768 345 -768 768c0 415 325 752 739 767
c28 1 51 -15 61 -39c11 -25 4 -54 -15 -72c-114 -104 -177 -246 -177 -400c0 -300 244 -544 544 -544c79 0 155 17 228 51c25 11 53 6 72 -13s24 -48 13 -72z" />
<glyph glyph-name="pie-chart" unicode="&#xf200;" horiz-adv-x="1728"
d="M768 646l546 -546c-139 -141 -333 -228 -546 -228c-424 0 -768 344 -768 768s344 768 768 768v-762zM955 640h773c0 -213 -87 -407 -228 -546zM1664 768h-768v768c424 0 768 -344 768 -768z" />
<glyph glyph-name="align-left" unicode="&#xf036;" horiz-adv-x="1792"
@ -700,6 +716,19 @@ d="M866 1021c0 -32 -7 -63 -13 -94c-21 -100 -41 -200 -62 -300c-3 -14 -3 -14 -18 -
c-82 0 -156 -37 -226 -77l-2 2c16 107 52 202 52 313c0 159 -85 233 -242 233c-23 0 -46 -3 -68 -6c-197 -35 -317 -260 -317 -445c0 -196 113 -304 308 -304c4 0 25 2 25 -3c0 -2 0 -3 -1 -5c-4 -38 -16 -80 -26 -117c-15 -55 -67 -150 -134 -150c-29 0 -42 20 -42 47
c0 87 100 139 102 144c0 4 -5 8 -7 10c-31 28 -82 51 -124 51c-76 0 -117 -122 -117 -184c0 -116 73 -196 190 -196c173 0 299 182 338 332c11 44 19 89 30 133c2 9 5 13 14 18c71 36 146 60 227 60c44 0 83 -8 127 -18c1 -1 3 -1 4 -1c6 0 14 7 14 13zM1536 1120v-960
c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
<glyph glyph-name="gitea" unicode="&#xf31f;" horiz-adv-x="2066"
d="M366 1280v0c62 0 120 -8 160 -8v0v0c329 -18 502 -29 699 -29l1 -363l53 -27v390c171 2 371 11 709 29v0h1c15 0 28 -7 38 -17s18 -25 24 -43c12 -36 16 -85 15 -143c-3 -117 -30 -272 -75 -427s-107 -311 -182 -431s-163 -204 -259 -211h-615c-75 8 -156 85 -224 169
c-34 42 -64 87 -87 126c-21 36 -35 66 -41 88c-82 2 -219 15 -341 80c-125 67 -233 191 -242 414c-6 143 45 245 118 310s167 93 248 93zM388 1107v0c-90 -1 -147 -29 -180 -71c-36 -44 -46 -104 -38 -164c14 -113 61 -183 126 -229c62 -44 143 -65 231 -78
c-70 193 -106 325 -128 542h-11zM1118 893c-34 0 -66 -19 -82 -51l-172 -353c-22 -45 -3 -99 42 -121l354 -172c45 -22 99 -3 121 42l171 354c22 45 3 99 -42 121l-249 121l-45 -93c5 -5 10 -14 12 -20c2 -5 3 -13 3 -19v-4c30 -14 54 -25 74 -36c30 -17 52 -34 59 -62
s-1 -57 -17 -95c-12 -29 -29 -65 -51 -111c4 -5 9 -13 11 -19c2 -5 4 -13 4 -19c0 -22 -17 -46 -38 -54c-5 -2 -14 -4 -20 -4c-22 0 -46 17 -54 38c-2 5 -3 14 -3 20c0 22 17 46 38 54c5 2 14 3 19 3h2c22 46 41 82 52 109c15 36 18 55 15 66s-13 20 -39 35
c-18 10 -41 22 -71 36c-4 -4 -13 -9 -19 -11c-5 -2 -14 -3 -19 -3h-6l-77 -158c5 -5 12 -14 14 -21c2 -5 3 -13 3 -19c0 -22 -17 -46 -38 -54c-5 -2 -13 -4 -19 -4c-22 0 -46 17 -54 38c-2 5 -3 14 -3 20c0 22 16 46 37 54c5 2 15 3 20 3l79 162c-3 4 -8 11 -10 16
s-3 14 -3 20c0 22 17 46 38 54c5 2 14 3 19 3h1l46 94l-64 31c-13 6 -26 9 -39 9z" />
<glyph glyph-name="f-droid" unicode="&#xf32a;" horiz-adv-x="1676"
d="M47 1526v0c12 0 29 -8 36 -18l127 -164c10 3 27 6 37 6v0h1182v0c10 0 27 -3 37 -6l127 164c7 9 22 17 34 18h2h3c24 -1 44 -22 44 -46c0 -9 -4 -22 -10 -29l-133 -172c4 -11 7 -29 7 -40v0v-258c0 -61 -50 -111 -111 -111h-1182c-61 0 -111 50 -111 111v258v0
c0 11 3 29 7 40l-133 172c-6 7 -10 20 -10 29c0 26 20 46 46 46h1zM482 1212v0c-69 0 -125 -56 -125 -125v0c0 -69 56 -125 125 -125v0c69 0 125 56 125 125v0c0 69 -56 125 -125 125v0zM1203 1212c-69 0 -125 -56 -125 -125v0c0 -69 56 -125 125 -125s125 56 125 125v0
c0 69 -56 125 -125 125zM247 833h1182c61 0 111 -50 111 -111v-739c0 -61 -50 -111 -111 -111h-1182c-61 0 -111 50 -111 111v739c0 61 50 111 111 111zM838 740v0c-214 0 -388 -174 -388 -388s174 -388 388 -388s388 174 388 388s-174 388 -388 388zM838 670v0
c176 0 318 -142 318 -318s-142 -317 -318 -317s-318 141 -318 317s142 318 318 318zM838 583v0c-106 0 -197 -72 -223 -171h119c20 36 59 61 104 61c67 0 120 -54 120 -121s-53 -120 -120 -120c-48 0 -89 28 -108 69h-117c24 -102 116 -180 225 -180c127 0 231 104 231 231
s-104 231 -231 231z" />
<glyph glyph-name="shopping-basket" unicode="&#xf291;" horiz-adv-x="2048"
d="M1920 768c71 0 128 -57 128 -128s-57 -128 -128 -128h-15l-115 -662c-11 -61 -64 -106 -126 -106h-1280c-62 0 -115 45 -126 106l-115 662h-15c-71 0 -128 57 -128 128s57 128 128 128h1792zM485 -32c35 3 62 34 59 69l-32 416c-3 35 -34 62 -69 59s-62 -34 -59 -69
l32 -416c3 -33 31 -59 64 -59h5zM896 32v416c0 35 -29 64 -64 64s-64 -29 -64 -64v-416c0 -35 29 -64 64 -64s64 29 64 64zM1280 32v416c0 35 -29 64 -64 64s-64 -29 -64 -64v-416c0 -35 29 -64 64 -64s64 29 64 64zM1632 27l32 416c3 35 -24 66 -59 69s-66 -24 -69 -59
@ -732,10 +761,10 @@ h-1920v128c0 35 31 64 69 64h1782z" />
<glyph glyph-name="times-circle-o" unicode="&#xf05c;"
d="M1097 457l-146 -146c-13 -13 -33 -13 -46 0l-137 137l-137 -137c-13 -13 -33 -13 -46 0l-146 146c-13 13 -13 33 0 46l137 137l-137 137c-13 13 -13 33 0 46l146 146c13 13 33 13 46 0l137 -137l137 137c13 13 33 13 46 0l146 -146c13 -13 13 -33 0 -46l-137 -137
l137 -137c13 -13 13 -33 0 -46zM1312 640c0 300 -244 544 -544 544s-544 -244 -544 -544s244 -544 544 -544s544 244 544 544zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
<glyph glyph-name="weixin" unicode="&#xf1d7;" horiz-adv-x="2048"
d="M580 1075c0 55 -36 91 -91 91c-54 0 -109 -36 -109 -91c0 -54 55 -90 109 -90c55 0 91 36 91 90zM1323 568c0 36 -36 72 -91 72c-36 0 -72 -36 -72 -72c0 -37 36 -73 72 -73c55 0 91 36 91 73zM1087 1075c0 55 -36 91 -90 91c-55 0 -109 -36 -109 -91
c0 -54 54 -90 109 -90c54 0 90 36 90 90zM1722 568c0 36 -37 72 -91 72c-36 0 -72 -36 -72 -72c0 -37 36 -73 72 -73c54 0 91 36 91 73zM1456 965c-23 3 -46 4 -70 4c-344 0 -616 -257 -616 -573c0 -53 8 -104 23 -152c-23 -2 -45 -3 -68 -3c-91 0 -163 18 -254 36
l-253 -127l72 218c-181 127 -290 291 -290 490c0 345 326 616 725 616c356 0 669 -217 731 -509zM2048 404c0 -163 -108 -308 -254 -417l55 -181l-199 109c-73 -18 -146 -37 -218 -37c-345 0 -616 236 -616 526s271 526 616 526c326 0 616 -236 616 -526z" />
<glyph glyph-name="python" unicode="&#xf322;"
d="M759 1416v0c63 0 129 -4 193 -15c101 -17 185 -92 185 -192v-353c0 -103 -82 -188 -185 -188h-370c-126 0 -232 -108 -232 -230v-170h-127c-108 0 -171 78 -197 188c-36 147 -34 236 0 377c29 123 124 188 232 188h509v47h-370v141c0 107 28 164 185 192
c53 9 114 15 177 15zM558 1303c-38 0 -69 -32 -69 -71s31 -70 69 -70s70 31 70 70s-32 71 -70 71zM1183 1021h139c108 0 159 -81 186 -188c37 -149 39 -261 0 -377c-37 -113 -78 -188 -186 -188h-555v-47h370v-141c0 -107 -92 -161 -185 -188c-140 -41 -253 -34 -370 0
c-98 29 -185 88 -185 188v353c0 102 84 188 185 188h370c123 0 231 107 231 235v165zM975 127v0c-38 0 -69 -31 -69 -70s31 -71 69 -71s70 32 70 71s-32 70 -70 70zM1389 366c0 -17 -70 -30 -156 -30s-156 13 -156 30s70 30 156 30s156 -13 156 -30z" />
<glyph glyph-name="internet-explorer" unicode="&#xf26b;" horiz-adv-x="1792"
d="M1792 599c0 -35 -2 -70 -7 -104h-1151c0 -199 175 -343 367 -343c130 0 255 64 322 177h423c-114 -321 -419 -536 -759 -536c-123 0 -246 29 -356 83c-112 -57 -269 -116 -394 -116c-168 0 -237 103 -237 263c0 93 20 186 45 275c16 58 80 176 109 229
c123 223 285 437 475 606c-153 -66 -319 -232 -427 -354c84 366 410 625 785 625c15 0 30 0 45 -1c124 57 297 117 433 117c162 0 301 -62 301 -245c0 -96 -37 -200 -75 -286c66 -119 101 -254 101 -390zM1722 1239c0 112 -80 181 -190 181c-84 0 -179 -34 -254 -70
@ -807,11 +836,9 @@ c7 37 13 109 27 135s19 19 28 28s18 15 28 28s17 34 26 52s30 31 26 53s-36 37 -54 5
s-46 -30 -111 -30s76 103 85 112s23 17 27 27s0 18 0 27s12 22 8 25c-2 1 -4 1 -6 1zM1212 1096c-62 -8 -139 -10 -182 -26c-45 -17 -54 -36 -81 -54s-67 -28 -81 -54s0 -54 0 -81s-26 -68 0 -82s55 37 82 55s63 64 81 54s6 -7 0 -27s-51 -41 -52 -81s102 -73 68 -126
s-188 46 -232 17s-19 -54 -28 -81s-37 -52 -27 -81s52 -34 81 -54s81 -56 82 -58s20 -99 27 -135c14 -73 -27 -199 76 -231c31 14 78 41 106 60c13 34 24 72 35 94c22 44 71 123 80 161s0 37 0 55s7 30 0 54s-36 54 -54 81s-34 64 -54 81s-46 18 -54 27s-4 8 -4 13
s-4 7 5 14s34 8 54 0s36 -36 54 -54s25 -51 54 -54s54 36 81 54c25 17 52 56 76 55c-12 131 -98 312 -193 404z" />
<glyph glyph-name="strikethrough" unicode="&#xf0cc;" horiz-adv-x="1792"
d="M1760 640c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-1728c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h1728zM483 704c-19 24 -36 51 -51 80c-32 65 -48 128 -48 188c0 122 45 224 134 309s220 127 393 127c38 0 93 -7 167 -19c44 -8 103 -24 177 -48
c7 -26 14 -66 21 -118c9 -79 14 -140 14 -183c0 -14 -2 -29 -5 -45l-12 -3l-84 6l-14 2c-34 101 -69 169 -103 205c-59 61 -130 91 -210 91c-76 0 -137 -20 -182 -59s-67 -88 -67 -146c0 -49 22 -95 66 -140s137 -88 279 -129c48 -14 105 -36 173 -66c36 -17 68 -34 95 -52
h-743zM990 448h411c5 -28 7 -59 7 -92c0 -72 -13 -143 -41 -212c-15 -37 -38 -71 -71 -104c-24 -23 -60 -50 -109 -81c-50 -30 -100 -53 -153 -66c-53 -14 -120 -21 -203 -21c-55 0 -121 2 -195 23l-140 40c-39 11 -62 20 -72 28c-4 4 -8 11 -8 22v13c0 8 2 60 -2 156
c-2 50 2 85 2 105v44l102 2c37 -85 54 -136 65 -154c24 -39 51 -70 80 -94s64 -43 105 -57c40 -15 85 -22 132 -22c42 0 89 9 139 27c51 17 92 46 122 86c31 40 47 83 47 129c0 56 -27 108 -81 157c-22 19 -68 43 -137 71z" />
<glyph glyph-name="hashnode" unicode="&#xf317;"
d="M246 1408h1044c136 0 246 -110 246 -246v-1044c0 -136 -110 -246 -246 -246h-1044c-136 0 -246 110 -246 246v1044c0 136 110 246 246 246zM1153 23v0c87 1 158 71 162 158s-62 162 -149 171l-315 556c-46 83 -135 78 -167 -39c-28 -111 -20 -216 -28 -342
c0 -1 -1 -2 -2 -2s-2 1 -2 1l-281 560c20 16 37 50 37 75c0 52 -41 93 -93 93s-94 -41 -94 -93s42 -93 94 -93c4 0 7 1 11 1c118 -304 250 -659 297 -741c32 -78 141 -53 144 31l12 444c0 3 3 3 4 1l226 -537c-11 -20 -21 -55 -21 -78v-1c0 -91 74 -165 165 -165z" />
<glyph glyph-name="comment-o" unicode="&#xf0e5;" horiz-adv-x="1792"
d="M896 1152c-416 0 -768 -234 -768 -512c0 -149 100 -291 273 -389l87 -50l-27 -96c-19 -71 -44 -126 -70 -172c101 42 193 99 275 171l43 38l57 -6c43 -5 87 -8 130 -8c416 0 768 234 768 512s-352 512 -768 512zM1792 640c0 -354 -401 -640 -896 -640c-49 0 -98 3 -145 8
c-131 -116 -287 -198 -460 -242c-36 -10 -75 -17 -114 -22h-5c-20 0 -38 16 -43 38v1c-5 25 12 40 27 58c63 71 135 131 182 298c-206 117 -338 298 -338 501c0 354 401 640 896 640s896 -286 896 -640z" />
@ -979,10 +1006,13 @@ d="M915 450h-294l147 551zM1001 128h311l-324 1024h-440l-324 -1024h311l383 314zM15
d="M1005 -16c-42 59 -111 155 -153 214c-41 57 -75 102 -77 102s-66 -87 -152 -205c-82 -113 -150 -205 -151 -205c-2 0 -296 207 -297 209c0 1 65 99 147 217s149 217 149 219c0 4 -27 14 -234 83c-129 43 -235 78 -237 79s10 41 52 174c30 95 56 174 57 175
s112 -35 248 -80s249 -81 250 -81s2 2 3 5s2 118 3 257s2 254 3 255c1 2 40 2 180 2c98 0 179 0 180 -1c2 -1 4 -78 8 -249c7 -281 9 -285 13 -285c2 0 109 36 239 80s236 79 237 78c3 -3 109 -350 108 -351s-109 -37 -241 -82c-181 -61 -240 -82 -240 -85
c0 -2 62 -95 141 -211c78 -114 141 -208 141 -209c-1 -2 -293 -217 -295 -217c-1 0 -38 50 -82 112z" />
<glyph glyph-name="fonticons" unicode="&#xf280;"
d="M0 1408h1536v-1536h-1536v1536zM908 1088l-12 -33l75 -83l-31 -114l25 -25l107 57l107 -57l25 25l-31 114l75 83l-12 33h-95l-53 96h-32l-53 -96h-95zM641 925c41 0 57 -15 56 -79l174 21c0 153 -105 181 -222 181c-174 0 -265 -70 -265 -240v-72h-96v-128h76
c10 0 20 0 20 -8v-382c0 -19 -5 -25 -23 -27l-73 -7v-88h448v86l-149 14c-18 2 -11 5 -11 25v387h191l38 128h-231c-10 0 2 7 2 15v80c0 60 2 94 65 94zM1248 96v86l-54 9c-19 3 -10 5 -10 25v520h-275l-23 -101l83 -22c13 -4 23 -13 23 -27v-370c0 -19 -8 -23 -26 -25
l-70 -9v-86h352z" />
<glyph glyph-name="att" unicode="&#xf31e;"
d="M768 1407v0c144 0 278 -39 393 -108c31 -19 46 -30 46 -48c0 -73 -206 -150 -472 -150c-268 0 -419 70 -419 135c0 22 19 39 54 60c116 71 253 111 398 111zM273 1226v0c1 0 0 -1 -1 -2c-22 -27 -31 -53 -31 -79c0 -72 57 -185 362 -185c416 0 677 151 677 236
c0 7 -2 13 -5 18c-1 1 0 2 1 1c25 -23 48 -46 73 -74c38 -43 53 -66 53 -104c0 -107 -166 -228 -539 -228c-350 0 -725 108 -725 257c0 10 10 28 25 47c32 41 68 78 108 112c1 0 2 1 2 1zM1456 979v0s1 0 1 -1c18 -36 40 -89 51 -133c10 -40 10 -69 2 -97
c-43 -152 -307 -235 -646 -235c-556 0 -794 160 -841 260c-6 12 -7 20 -4 37c7 39 32 114 55 159c1 1 1 1 1 0c-4 -15 -6 -30 -6 -45c0 -153 253 -274 557 -274c281 0 837 129 830 328v1zM1534 683v0s1 -1 1 -2c1 -13 1 -25 1 -41c0 -67 -9 -146 -28 -190
c-26 -61 -154 -248 -714 -248c-411 0 -649 139 -744 238c-21 22 -36 49 -39 67c-7 36 -11 91 -11 133c0 2 2 2 2 0c34 -125 219 -308 612 -308c413 0 891 200 919 350c0 1 1 1 1 1zM1482 360v0c1 0 1 -1 1 -2c-13 -33 -30 -67 -47 -96c-29 -50 -61 -86 -95 -114
c-124 -102 -332 -154 -521 -154c-359 0 -649 111 -745 315c-1 2 0 2 1 1c103 -149 366 -227 610 -227c345 0 679 106 795 276c0 1 1 1 1 1zM1274 64v0c1 0 1 -1 0 -2c-135 -118 -312 -190 -506 -190c-177 0 -341 60 -471 161c-1 1 -1 3 1 2c84 -47 234 -100 470 -100
c272 0 444 89 505 129h1z" />
<glyph glyph-name="sort-asc" unicode="&#xf0de;" horiz-adv-x="1024"
d="M1024 832c0 -35 -29 -64 -64 -64h-896c-35 0 -64 29 -64 64c0 17 7 33 19 45l448 448c12 12 28 19 45 19s33 -7 45 -19l448 -448c12 -12 19 -28 19 -45z" />
<glyph glyph-name="folder-open" unicode="&#xf07c;" horiz-adv-x="1879"
@ -1162,6 +1192,13 @@ c0 -88 -72 -160 -160 -160h-1216c-88 0 -160 72 -160 160v1216c0 88 72 160 160 160h
d="M1280 388c0 14 -8 24 -22 27c-91 19 -160 83 -198 167c-4 8 -7 16 -7 25c0 45 124 36 124 100c0 27 -33 44 -57 44c-22 0 -40 -16 -63 -16c-4 0 -8 1 -12 2c3 38 5 77 5 115c0 34 -2 82 -17 114c-48 104 -140 165 -255 165c-125 0 -220 -47 -275 -165
c-15 -32 -18 -80 -18 -115c0 -38 3 -76 6 -114c-5 -1 -10 -2 -15 -2c-22 0 -41 16 -62 16c-25 0 -55 -17 -55 -45c0 -62 124 -54 124 -99c0 -9 -3 -17 -7 -25c-39 -84 -106 -147 -198 -167c-14 -3 -22 -13 -22 -27c0 -47 106 -64 138 -69c9 -24 5 -66 40 -66
c26 0 51 10 77 10c106 0 134 -95 256 -95c127 0 151 95 258 95c26 0 52 -9 78 -9c34 0 31 42 39 65c32 5 138 22 138 69zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
<glyph glyph-name="spell-check" unicode="&#xf327;" horiz-adv-x="2049"
d="M2049 700c0 -25 -10 -50 -28 -68l-724 -724l-136 -136c-18 -18 -43 -28 -68 -28s-50 10 -68 28l-136 136l-362 362c-18 18 -28 43 -28 68s10 50 28 68l136 136c18 18 43 28 68 28s50 -10 68 -28l294 -295l656 657c18 18 43 28 68 28s50 -10 68 -28l136 -136
c18 -18 28 -43 28 -68zM0 880v73h48l158 454h111l158 -454h49v-73h-199v73h52l-32 98h-167l-32 -98h52v-73h-198zM200 1127h122l-49 149c-2 8 -5 16 -6 23c-1 8 -3 15 -3 18l-1 5h-2c-1 -13 -5 -29 -10 -46zM569 880v73h63v381h-63v73h242c40 0 72 -5 95 -14
c24 -9 44 -25 58 -47c15 -21 22 -46 22 -75c0 -25 -6 -47 -17 -67s-28 -35 -48 -46v-1c28 -8 50 -24 64 -47s22 -49 22 -78c0 -35 -10 -65 -30 -91s-45 -43 -75 -52c-21 -6 -47 -9 -79 -9h-254zM730 1192h92c20 0 37 6 48 18c11 13 17 30 17 51c0 29 -10 49 -30 60
c-11 5 -27 8 -46 8h-81v-137zM730 958h98c15 0 27 2 37 6c13 5 25 15 32 28c7 14 11 29 11 46c0 23 -7 41 -21 55c-13 14 -32 22 -56 22h-101v-157zM1131 950c-52 53 -78 118 -78 196s26 142 78 193s116 77 193 77c18 0 39 -2 60 -5c22 -3 44 -9 67 -16s41 -18 56 -33
s23 -32 23 -51v-72h-88v41c0 12 -7 23 -20 31s-29 14 -45 17s-32 5 -48 5c-51 0 -94 -17 -127 -51c-33 -33 -49 -77 -49 -132c0 -59 17 -106 51 -142s78 -54 130 -54c14 0 29 2 45 4s31 8 46 16s23 19 23 32v41h89v-72c0 -18 -7 -35 -22 -49c-14 -14 -33 -26 -56 -33
c-22 -7 -45 -13 -67 -16c-22 -4 -44 -6 -64 -6c-79 0 -145 27 -197 79v0z" />
<glyph glyph-name="building-o" unicode="&#xf0f7;" horiz-adv-x="1408"
d="M384 224v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM384 480v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM640 480v-64c0 -17 -15 -32 -32 -32h-64
c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM384 736v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64c17 0 32 -15 32 -32zM1152 224v-64c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h64
@ -1330,6 +1367,8 @@ h-628l-376 -12v102l127 25c89 17 116 43 117 116c6 242 8 643 8 643s3 402 -8 645c-3
<glyph glyph-name="copyright" unicode="&#xf1f9;"
d="M1150 462v-109c0 -141 -225 -193 -366 -193c-274 0 -480 209 -480 485c0 271 204 475 475 475c99 0 358 -35 358 -194v-109c0 -9 -7 -16 -16 -16h-118c-9 0 -16 7 -16 16v70c0 63 -121 92 -203 92c-187 0 -317 -135 -317 -329c0 -201 136 -348 325 -348
c72 0 208 27 208 90v70c0 9 7 16 15 16h119c8 0 16 -7 16 -16zM768 1280c-353 0 -640 -287 -640 -640s287 -640 640 -640s640 287 640 640s-287 640 -640 640zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
<glyph glyph-name="pleroma" unicode="&#xf324;" horiz-adv-x="961"
d="M120 1408h262v-1536h-382v1416c0 66 54 120 120 120zM575 1408h386v-648c0 -66 -53 -120 -119 -120v0h-267v768zM575 254h386v-262c0 -66 -53 -120 -119 -120v0h-267v382z" />
<glyph glyph-name="terminal" unicode="&#xf120;" horiz-adv-x="1651"
d="M572 553l-466 -466c-13 -13 -33 -13 -46 0l-50 50c-13 13 -13 33 0 46l393 393l-393 393c-13 13 -13 33 0 46l50 50c13 13 33 13 46 0l466 -466c13 -13 13 -33 0 -46zM1651 96v-64c0 -18 -14 -32 -32 -32h-960c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h960
c18 0 32 -14 32 -32z" />
@ -1430,6 +1469,10 @@ s-29 -16 -64 -16h-69l293 -352h64l224 -64l352 -32c288 -64 288 -96 288 -96z" />
d="M620 416c-69 -40 -163 -64 -268 -64h-128v64h-64c-18 0 -32 36 -32 80c0 18 3 35 7 49c-77 2 -135 15 -135 31s58 29 135 31c-4 14 -7 31 -7 49c0 44 14 80 32 80h64v64h128c105 0 199 -24 268 -64h1113c74 -13 141 -24 187 -32c192 -32 256 -96 256 -128
s-64 -96 -256 -128c-46 -8 -113 -19 -187 -32h-1113zM1739 668c32 -22 53 -55 53 -92s-21 -70 -53 -92l81 -30c41 29 68 73 68 122s-27 93 -68 122zM625 400h1015s-217 -38 -456 -80c-128 0 -224 -96 -224 -96l-288 -288s-97 -64 -160 -64h-96l-93 464h29
c102 0 199 23 273 64zM352 816h-29l93 464h96c65 0 128 -32 160 -64l288 -288s96 -96 224 -96c239 -42 456 -80 456 -80h-1015c-74 41 -171 64 -273 64z" />
<glyph glyph-name="matrix-org" unicode="&#xf313;"
d="M40 1373v-1466h106v-35h-146v1536h146v-35h-106zM491 908v-74h2c20 28 44 51 72 66c28 16 60 23 96 23c35 0 66 -7 95 -20s50 -37 65 -71c16 24 38 46 66 64s61 27 99 27c29 0 56 -4 81 -11s45 -18 63 -34s31 -35 41 -60s15 -56 15 -91v-367h-150v311c0 18 -1 36 -2 52
s-6 30 -12 42s-16 22 -28 29s-29 10 -50 10s-38 -4 -51 -12s-24 -19 -31 -32s-13 -27 -15 -44s-4 -34 -4 -51v-305h-150v307c0 16 0 33 -1 49s-4 30 -9 44c-5 13 -15 24 -27 32s-31 12 -55 12c-7 0 -16 -2 -28 -5s-23 -9 -34 -18s-20 -21 -28 -38s-11 -38 -11 -65v-318h-151
v548h142zM1496 -93v1466h-106v35h146v-1536h-146v35h106z" />
<glyph glyph-name="steam" unicode="&#xf1b6;" horiz-adv-x="1792"
d="M1582 954c0 -135 -110 -244 -244 -244c-135 0 -244 109 -244 244s109 244 244 244c134 0 244 -109 244 -244zM812 212c0 139 -111 250 -250 250c-18 0 -36 -2 -54 -6l104 -42c102 -41 152 -156 111 -258s-157 -152 -259 -110c-41 16 -82 33 -123 49
c42 -79 125 -133 221 -133c139 0 250 111 250 250zM1642 953c0 168 -137 305 -305 305c-169 0 -306 -137 -306 -305c0 -169 137 -305 306 -305c168 0 305 136 305 305zM1792 953c0 -252 -204 -455 -455 -455l-437 -319c-16 -172 -162 -307 -338 -307
@ -1544,6 +1587,12 @@ d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -
d="M832 1024c0 106 -86 192 -192 192s-192 -86 -192 -192c0 -29 7 -57 19 -83c-26 12 -54 19 -83 19c-106 0 -192 -86 -192 -192s86 -192 192 -192s192 86 192 192c0 29 -7 57 -19 83c26 -12 54 -19 83 -19c106 0 192 86 192 192zM1683 320c0 -23 -92 -115 -115 -115
c-26 0 -107 94 -128 115l-96 -96l220 -220c18 -18 28 -43 28 -68c0 -56 -64 -120 -120 -120c-25 0 -50 10 -68 28l-671 671c-105 -78 -233 -131 -365 -131c-218 0 -368 151 -368 368c0 328 328 656 656 656c217 0 368 -150 368 -368c0 -132 -53 -260 -131 -365l355 -355
l96 96c-21 21 -115 102 -115 128c0 23 92 115 115 115c8 0 17 -4 23 -10c37 -37 316 -300 316 -329z" />
<glyph glyph-name="syncthing" unicode="&#xf311;"
d="M768 1408c424 0 768 -344 768 -768s-344 -768 -768 -768s-768 344 -768 768s344 768 768 768zM774 1254c-337 0 -611 -274 -611 -611c0 -10 0 -28 1 -38c-17 -10 -32 -23 -42 -41c-33 -56 -14 -128 41 -161c18 -10 37 -15 56 -16c97 -210 309 -355 555 -355
c108 0 210 28 298 78c16 -11 35 -19 56 -21c65 -5 122 42 129 107v10c0 14 -5 36 -11 49c87 105 139 241 139 388c0 57 -8 112 -23 164c14 13 25 30 32 49c21 61 -12 128 -73 149c-12 4 -26 6 -38 6v0c-6 0 -15 0 -21 -1c-112 148 -289 244 -488 244zM774 1175v0
c171 0 323 -79 420 -204c-10 -11 -17 -24 -22 -39c-9 -27 -8 -55 1 -80l-224 -186c-18 11 -39 16 -60 16c-22 0 -44 -5 -63 -18c-26 -16 -43 -42 -50 -70l-447 -41c-10 21 -25 39 -46 52c-13 8 -27 12 -41 14c0 8 -1 16 -1 24c0 295 238 532 533 532zM1224 792
c6 -3 15 -7 21 -9c15 -5 29 -8 44 -7c11 -43 17 -87 17 -133c0 -125 -42 -240 -114 -331c-13 7 -28 11 -43 13c-15 1 -28 0 -42 -4l-122 175c23 32 29 73 15 110zM783 516c2 -4 5 -11 8 -15c29 -44 81 -63 129 -50l122 -175c-12 -16 -19 -37 -21 -59v-9c0 -10 2 -26 5 -35
c-75 -40 -161 -63 -252 -63c-211 0 -394 123 -480 301c10 8 24 22 30 33c5 8 11 22 13 31z" />
<glyph glyph-name="picture-o" unicode="&#xf03e;" horiz-adv-x="1920"
d="M640 960c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600c-17 0 -32 -15 -32 -32v-1216c0 -17 15 -32 32 -32h1600c17 0 32 15 32 32v1216c0 17 -15 32 -32 32z
M1920 1248v-1216c0 -88 -72 -160 -160 -160h-1600c-88 0 -160 72 -160 160v1216c0 88 72 160 160 160h1600c88 0 160 -72 160 -160z" />
@ -1557,6 +1606,8 @@ d="M640 528v224c0 9 -7 16 -16 16h-96c-9 0 -16 -7 -16 -16v-224c0 -9 7 -16 16 -16h
s-192 -86 -192 -192v-320h-640v752c0 9 7 16 16 16h96c9 0 16 -7 16 -16v-112h128v624c0 9 7 16 16 16h96c9 0 16 -7 16 -16v-112h128v112c0 9 7 16 16 16h96c9 0 16 -7 16 -16v-112h128v112c0 21 28 16 41 16v391c-19 9 -32 29 -32 50c0 30 25 55 55 55s55 -25 55 -55
c0 -21 -13 -41 -32 -50v-17c27 6 55 10 83 10c41 0 80 -15 114 -15c31 0 66 15 84 15c9 0 16 -7 16 -16v-210c0 -24 -81 -28 -97 -28c-37 0 -72 15 -110 15c-30 0 -61 -5 -90 -12v-133c13 0 41 5 41 -16v-112h128v112c0 9 7 16 16 16h96c9 0 16 -7 16 -16v-112h128v112
c0 9 7 16 16 16h96c9 0 16 -7 16 -16v-624h128v112c0 9 7 16 16 16h96c9 0 16 -7 16 -16z" />
<glyph glyph-name="c" unicode="&#xf31c;" horiz-adv-x="1404"
d="M996 819c0 0 -23 211 -232 217s-317 -157 -317 -392s119 -423 323 -423s226 235 226 235l391 -24s22 -211 -141 -373s-364 -188 -504 -187s-334 -2 -522 190s-220 379 -220 563s36 427 259 611c152 125 306 172 460 172c643 0 685 -593 685 -593l-408 4v0z" />
<glyph glyph-name="commenting" unicode="&#xf27a;" horiz-adv-x="1792"
d="M640 640c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1024 640c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128zM1408 640c0 71 -57 128 -128 128s-128 -57 -128 -128s57 -128 128 -128s128 57 128 128z
M1792 640c0 -354 -401 -640 -896 -640c-73 0 -144 6 -211 18c-114 -114 -263 -192 -435 -229c-27 -5 -56 -10 -86 -13c-16 -2 -31 9 -35 24c-4 16 8 26 20 37c63 59 138 106 164 317c-191 117 -313 291 -313 486c0 354 401 640 896 640s896 -286 896 -640z" />
@ -1639,9 +1690,12 @@ c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM512 928v19
c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM1536 160v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM1024 928v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32z
M1536 544v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM1536 928v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM1664 1248v-1088c0 -88 -72 -160 -160 -160
h-1344c-88 0 -160 72 -160 160v1088c0 88 72 160 160 160h1344c88 0 160 -72 160 -160z" />
<glyph glyph-name="caret-square-o-left" unicode="&#xf191;"
d="M1024 960v-640c0 -35 -29 -64 -64 -64c-13 0 -26 4 -37 12l-448 320c-17 12 -27 31 -27 52c0 20 10 40 27 52l448 320c11 8 24 12 37 12c35 0 64 -29 64 -64zM1280 160v960c0 17 -15 32 -32 32h-960c-17 0 -32 -15 -32 -32v-960c0 -17 15 -32 32 -32h960
c17 0 32 15 32 32zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
<glyph glyph-name="handshake-o" unicode="&#xf2b5;" horiz-adv-x="2304"
d="M192 384c84 0 84 128 0 128s-84 -128 0 -128zM1665 442c-79 103 -156 208 -246 302l-125 -140c-110 -125 -307 -122 -414 6c-76 92 -76 224 2 315l177 206c-62 32 -137 21 -204 21c-59 0 -116 -24 -158 -66l-158 -158h-155v-544c44 0 84 6 119 -28l297 -292
c61 -59 140 -111 227 -111c45 0 93 15 125 47c75 -26 162 16 185 93c48 -4 92 11 127 44c23 21 53 63 50 96c9 -9 31 -10 43 -10c119 0 181 125 108 219zM1824 384h96v512h-93l-157 180c-42 48 -105 76 -169 76h-167c-56 0 -110 -25 -146 -67l-209 -243
c-37 -44 -37 -106 -1 -150c57 -68 162 -69 221 -3l193 218c46 51 130 3 109 -62c38 -44 79 -87 116 -131c50 -62 98 -127 147 -190c31 -40 54 -88 60 -140zM2112 384c84 0 84 128 0 128s-84 -128 0 -128zM2304 960v-640c0 -35 -29 -64 -64 -64h-434
c-36 -87 -115 -145 -207 -158c-43 -63 -109 -111 -183 -127c-55 -70 -144 -112 -233 -106c-165 -93 -351 -12 -474 109l-287 282h-358c-35 0 -64 29 -64 64v672c0 35 29 64 64 64h421c116 116 196 224 370 224h117c65 0 128 -20 181 -56c53 36 116 56 181 56h167
c190 0 269 -124 384 -256h355c35 0 64 -29 64 -64z" />
<glyph glyph-name="spinner" unicode="&#xf110;" horiz-adv-x="1664"
d="M462 142c0 -70 -57 -128 -128 -128c-70 0 -128 58 -128 128c0 71 58 128 128 128c71 0 128 -57 128 -128zM960 -64c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128s128 -57 128 -128zM256 640c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128
s128 -57 128 -128zM1458 142c0 -70 -58 -128 -128 -128c-71 0 -128 58 -128 128c0 71 57 128 128 128c70 0 128 -57 128 -128zM494 1138c0 -88 -72 -160 -160 -160s-160 72 -160 160s72 160 160 160s160 -72 160 -160zM1664 640c0 -71 -57 -128 -128 -128s-128 57 -128 128
@ -1743,12 +1797,21 @@ c31 -200 54 -325 66 -373c37 -166 76 -249 120 -249c34 0 85 53 154 161c68 108 104
d="M766 1408h5c211 -2 413 -25 531 -79c0 0 234 -105 234 -462c0 0 3 -263 -33 -446c-23 -116 -202 -243 -408 -268c-108 -13 -214 -25 -327 -20c-185 8 -330 45 -330 45c0 -18 1 -36 3 -52c24 -182 181 -193 329 -198c150 -5 284 37 284 37l6 -135s-105 -57 -292 -67
c-103 -6 -230 3 -379 42c-323 85 -380 430 -388 779c-3 104 -1 201 -1 283c0 357 235 462 235 462c118 54 320 77 531 79v0zM350 839c-64 0 -115 -52 -115 -116s51 -115 115 -115s116 51 116 115s-52 116 -116 116v0zM768 839c-64 0 -116 -52 -116 -116s52 -115 116 -115
s116 51 116 115s-52 116 -116 116v0zM1186 839c-64 0 -116 -52 -116 -116s52 -115 116 -115s115 51 115 115s-51 116 -115 116v0z" />
<glyph glyph-name="strikethrough" unicode="&#xf0cc;" horiz-adv-x="1792"
d="M1760 640c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-1728c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h1728zM483 704c-19 24 -36 51 -51 80c-32 65 -48 128 -48 188c0 122 45 224 134 309s220 127 393 127c38 0 93 -7 167 -19c44 -8 103 -24 177 -48
c7 -26 14 -66 21 -118c9 -79 14 -140 14 -183c0 -14 -2 -29 -5 -45l-12 -3l-84 6l-14 2c-34 101 -69 169 -103 205c-59 61 -130 91 -210 91c-76 0 -137 -20 -182 -59s-67 -88 -67 -146c0 -49 22 -95 66 -140s137 -88 279 -129c48 -14 105 -36 173 -66c36 -17 68 -34 95 -52
h-743zM990 448h411c5 -28 7 -59 7 -92c0 -72 -13 -143 -41 -212c-15 -37 -38 -71 -71 -104c-24 -23 -60 -50 -109 -81c-50 -30 -100 -53 -153 -66c-53 -14 -120 -21 -203 -21c-55 0 -121 2 -195 23l-140 40c-39 11 -62 20 -72 28c-4 4 -8 11 -8 22v13c0 8 2 60 -2 156
c-2 50 2 85 2 105v44l102 2c37 -85 54 -136 65 -154c24 -39 51 -70 80 -94s64 -43 105 -57c40 -15 85 -22 132 -22c42 0 89 9 139 27c51 17 92 46 122 86c31 40 47 83 47 129c0 56 -27 108 -81 157c-22 19 -68 43 -137 71z" />
<glyph glyph-name="ravelry" unicode="&#xf2d9;" horiz-adv-x="2080"
d="M1095 -197c-4 1 -7 2 -11 4c0 0 -329 193 -440 505c-37 6 -115 24 -175 37c87 -283 329 -499 626 -546zM454 409l168 -28c-57 171 -64 366 -64 366c-67 -65 -103 -154 -121 -224c3 -39 8 -77 17 -114zM564 1018c-31 -46 -56 -96 -77 -148c33 35 60 58 74 68
c-2 30 3 80 3 80zM2001 584c0 436 -352 790 -784 790c-200 0 -382 -76 -521 -201c-21 -41 -35 -93 -45 -160c213 181 593 136 593 136c95 -4 84 -88 83 -114c-346 29 -516 -70 -684 -213c0 0 33 -320 109 -450c438 -20 771 218 771 218c42 30 79 33 87 -19
c6 -42 9 -99 -39 -121c-146 -68 -307 -111 -467 -134c-104 -15 -162 -19 -317 -16c148 -344 518 -438 518 -438c116 -19 204 -4 263 15c256 130 433 398 433 707zM2075 621c-7 -68 -18 -147 -40 -212c-90 -267 -215 -441 -500 -600c-26 -18 -54 -35 -82 -44
c-51 -18 -106 -22 -163 -16c-24 -2 -48 -3 -73 -3c-381 0 -703 260 -800 615c-3 0 -6 1 -9 1c-23 -180 110 -423 110 -423s8 -12 54 -82c-255 135 -262 533 -262 533c-61 23 -273 95 -310 154c0 0 166 -91 309 -109c-1 1 2 32 2 32c9 122 51 217 94 290
c28 137 90 261 176 365c15 62 39 136 81 214c18 34 35 56 81 77c304 142 604 178 912 18c295 -154 455 -476 420 -810z" />
<glyph glyph-name="code-fork" unicode="&#xf126;" horiz-adv-x="1024"
d="M288 64c0 53 -43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96s96 43 96 96zM288 1216c0 53 -43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96s96 43 96 96zM928 1088c0 53 -43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96s96 43 96 96zM1024 1088c0 -71 -39 -133 -96 -166
c-3 -361 -259 -441 -429 -495c-159 -50 -211 -74 -211 -171v-26c57 -33 96 -95 96 -166c0 -106 -86 -192 -192 -192s-192 86 -192 192c0 71 39 133 96 166v820c-57 33 -96 95 -96 166c0 106 86 192 192 192s192 -86 192 -192c0 -71 -39 -133 -96 -166v-497
c51 25 105 42 154 57c186 59 292 103 294 312c-57 33 -96 95 -96 166c0 106 86 192 192 192s192 -86 192 -192z" />
<glyph glyph-name="hand-o-right" unicode="&#xf0a4;" horiz-adv-x="1792"
d="M256 192c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1664 768c0 68 -61 128 -128 128h-576c0 63 96 128 96 256c0 96 -75 128 -160 128c-28 0 -79 -116 -90 -139c-12 -22 -24 -44 -37 -65c-33 -53 -71 -99 -112 -145c-64 -73 -135 -163 -241 -163
h-32v-640h32c175 0 346 -128 540 -128c112 0 189 47 189 167c0 19 -2 38 -5 56c42 23 65 80 65 126c0 24 -6 48 -18 69c34 32 53 72 53 119c0 32 -14 79 -35 103h331c69 0 128 59 128 128zM1792 769c0 -140 -116 -257 -256 -257h-169c-3 -42 -16 -82 -37 -119
@ -1757,6 +1820,9 @@ c159 0 288 -87 288 -256c0 -44 -7 -87 -22 -128h374c138 0 256 -117 256 -255z" />
<glyph glyph-name="object-group" unicode="&#xf247;" horiz-adv-x="2048"
d="M2048 1152h-128v-1024h128v-384h-384v128h-1280v-128h-384v384h128v1024h-128v384h384v-128h1280v128h384v-384zM1792 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 -128v128h-128v-128h128zM1664 0v128h128v1024h-128v128h-1280v-128h-128v-1024h128v-128
h1280zM1920 -128v128h-128v-128h128zM1280 896h384v-768h-896v256h-384v768h896v-256zM512 512h640v512h-640v-512zM1536 256v512h-256v-384h-384v-128h640z" />
<glyph glyph-name="wikidata" unicode="&#xf31a;" horiz-adv-x="2048"
d="M0 1264h76v-1264h-76v1264zM152 1264h227v-1264h-227v1264zM455 1264h228v-1264h-228v1264zM759 1264h75v-1264h-75v1264zM910 1264h76v-1264h-76v1264zM1820 1264h76v-1264h-76v1264zM1972 1264h76v-1264h-76v1264zM1062 1264h227v-1264h-227v1264zM1365 1264h76v-1264
h-76v1264zM1517 1264h228v-1264h-228v1264z" />
<glyph glyph-name="anchor" unicode="&#xf13d;" horiz-adv-x="1792"
d="M960 1280c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1792 352v-352c0 -13 -8 -25 -20 -30c-4 -1 -8 -2 -12 -2c-8 0 -16 3 -23 9l-93 93c-157 -189 -439 -310 -748 -310s-591 121 -748 310l-93 -93c-6 -6 -15 -9 -23 -9c-4 0 -8 1 -12 2
c-12 5 -20 17 -20 30v352c0 18 14 32 32 32h352c13 0 25 -8 30 -20s2 -25 -7 -35l-100 -100c90 -121 263 -209 461 -236v647h-192c-35 0 -64 29 -64 64v128c0 35 29 64 64 64h192v163c-76 44 -128 126 -128 221c0 141 115 256 256 256s256 -115 256 -256
@ -1814,6 +1880,12 @@ l-83 -83c-25 -25 -65 -25 -90 0l-83 83l-83 -83c-25 -25 -65 -25 -90 0l-128 128l90
c25 25 65 25 90 0l83 -83zM218 19c-25 -25 -65 -25 -90 0l-128 128l90 90l83 -82l83 82c25 25 65 25 90 0l83 -82l64 64v293l-210 314c-23 35 -7 83 33 97l177 58v299h128v128h256v128h256v-128h256v-128h128v-299l177 -58c40 -14 56 -62 33 -97l-210 -314v-293l19 18
c25 25 65 25 90 0l83 -82l83 82c25 25 65 25 90 0l128 -128l-90 -90l-83 83l-83 -83c-12 -13 -29 -19 -45 -19s-33 6 -45 19l-83 83l-83 -83c-25 -25 -65 -25 -90 0l-83 83l-83 -83c-25 -25 -65 -25 -90 0l-83 83l-83 -83c-25 -25 -65 -25 -90 0l-83 83l-83 -83
c-25 -25 -65 -25 -90 0l-83 83l-83 -83c-25 -25 -65 -25 -90 0l-83 83zM621 1152v-128l384 128l384 -128v128h-128v128h-512v-128h-128z" />
<glyph glyph-name="gimp" unicode="&#xf31b;" horiz-adv-x="1792"
d="M1760 1453c243 -1827 -975 -1550 -1432 -1186c28 4 55 13 78 30c50 38 74 102 73 173s-25 150 -73 220c-6 9 -13 17 -20 25l26 588s159 -366 481 -358c674 18 794 417 867 508zM612 937c-97 0 -177 -85 -177 -193s80 -194 177 -194c16 0 31 4 46 8
c-67 3 -122 62 -122 133v0c0 73 57 133 127 133v0c56 0 112 -47 124 -104c1 8 2 16 2 24c0 108 -80 193 -177 193zM1031 928v0c-119 0 -216 -102 -216 -228s97 -227 216 -227c45 0 87 14 122 39c-17 -8 -47 -15 -66 -15c-90 0 -162 77 -162 171v0c0 94 72 170 162 170
c75 0 147 -63 160 -141v3c0 126 -97 228 -216 228zM158 822v0c79 -2 166 -58 227 -146c46 -67 70 -141 70 -206s-21 -121 -64 -153s-100 -37 -158 -16s-118 67 -164 134s-69 141 -69 206s21 121 64 153c26 20 58 29 94 28zM1042 804c-42 0 -76 -36 -76 -80v0
c0 -44 34 -80 76 -80s76 36 76 80v0c0 44 -34 80 -76 80zM615 787c-28 0 -50 -23 -50 -52v0v0c0 -29 22 -53 50 -53s50 24 50 53v0v0c0 29 -22 52 -50 52zM130 770c-47 0 -85 -47 -85 -106v0c0 -59 38 -107 85 -107s84 48 84 107v0c0 59 -37 106 -84 106zM1202 468
c0 0 44 -38 69 -72c-96 -78 -261 -141 -583 -73c163 -60 300 -88 406 -81c-64 -22 -146 -39 -250 -44c233 -23 407 22 468 117c16 -18 32 -49 47 -89c10 69 36 101 -4 155s-153 87 -153 87z" />
<glyph glyph-name="dashcube" unicode="&#xf210;" horiz-adv-x="1408"
d="M0 856c0 173 138 322 314 322h742l352 358v-1470c0 -174 -138 -322 -314 -322h-780c-176 0 -314 148 -314 322v790zM1232 102l-176 180v425c0 61 -49 112 -110 112h-484c-61 0 -110 -51 -110 -112v-492c0 -61 49 -113 110 -113h770z" />
<glyph glyph-name="optin-monster" unicode="&#xf23c;" horiz-adv-x="2132"
@ -1918,10 +1990,11 @@ c14 0 27 -9 31 -23zM736 1504v-224h-352v224c0 18 14 32 32 32h288c18 0 32 -14 32 -
d="M1024 288v-416h-928c-53 0 -96 43 -96 96v1344c0 53 43 96 96 96h1344c53 0 96 -43 96 -96v-928h-416c-53 0 -96 -43 -96 -96zM1152 256h381c-9 -48 -35 -102 -65 -132l-184 -184c-30 -30 -84 -56 -132 -65v381z" />
<glyph glyph-name="user" unicode="&#xf007;" horiz-adv-x="1280"
d="M1280 137c0 -146 -96 -265 -213 -265h-854c-117 0 -213 119 -213 265c0 263 65 567 327 567c81 -79 191 -128 313 -128s232 49 313 128c262 0 327 -304 327 -567zM1024 1024c0 -212 -172 -384 -384 -384s-384 172 -384 384s172 384 384 384s384 -172 384 -384z" />
<glyph glyph-name="php" unicode="&#xf30e;"
d="M768 1044c424 0 768 -181 768 -404s-344 -404 -768 -404s-768 181 -768 404s344 404 768 404zM701 934l-87 -418h83l50 239h67c21 0 35 -4 41 -12s8 -23 4 -42l-39 -185h85l40 194c8 44 3 73 -18 89c-20 16 -50 23 -91 24h-75l23 111h-83zM320 823v0l-87 -418h84l23 111
h72c25 0 49 3 72 8s44 19 64 39c16 16 30 33 39 53c10 20 16 40 19 61c7 45 -1 80 -22 106s-56 40 -103 40h-161zM1035 823l-87 -418h84l23 111h73c25 0 48 3 71 8s44 19 64 39c16 16 30 33 39 53c10 20 16 40 19 61c7 45 0 80 -21 106s-57 40 -104 40h-161zM416 757v0
c32 0 59 -3 80 -9c22 -6 29 -30 22 -71c-9 -49 -26 -77 -52 -85s-57 -11 -96 -11h-9c-2 0 -5 1 -7 1l36 174h12c4 0 9 1 14 1zM1131 757v0c32 0 59 -3 80 -9c22 -6 29 -30 22 -71c-9 -49 -26 -77 -52 -85s-57 -11 -96 -11h-9c-2 0 -5 1 -7 1l36 174h12c4 0 9 1 14 1z" />
<glyph glyph-name="php" unicode="&#xf30e;" horiz-adv-x="2299"
d="M1149 1245c635 0 1150 -271 1150 -605s-515 -605 -1150 -605s-1149 271 -1149 605s514 605 1149 605zM1049 1081l-130 -627h125l74 359l100 -1c32 0 52 -6 62 -18s12 -33 6 -62l-58 -278h126l61 291c13 65 4 109 -27 132c-30 23 -77 36 -138 37h-111l35 167h-125z
M478 914v0l-129 -625h126l34 165h108c37 0 73 5 107 13s66 27 96 57c25 24 44 50 58 80s24 60 28 91c11 67 1 121 -31 160s-84 58 -155 59h-242zM1549 914l-130 -625h126l34 165h109c37 0 72 5 106 13s67 27 97 57c25 24 43 50 57 80s24 60 28 91c11 67 1 121 -31 160
s-84 58 -155 59h-241zM623 815v0c48 1 88 -4 120 -13s43 -45 32 -106c-13 -73 -38 -115 -77 -127s-87 -18 -145 -17h-12c-3 0 -8 1 -11 1l54 261h18c7 0 14 0 21 1zM1693 815v0c48 1 88 -4 120 -13s44 -45 33 -106c-13 -73 -39 -115 -78 -127s-87 -18 -145 -17h-12
c-3 0 -8 1 -11 1l54 261h18c7 0 14 0 21 1z" />
<glyph glyph-name="ioxhost" unicode="&#xf208;" horiz-adv-x="2048"
d="M1463 704c0 -47 -38 -86 -86 -86h-702c-48 0 -86 39 -86 86s38 86 86 86h702c48 0 86 -39 86 -86zM1677 704c0 59 -8 115 -23 170h-982c-48 0 -86 38 -86 85c0 48 38 86 86 86h908c-115 187 -321 311 -555 311c-360 0 -653 -292 -653 -652c0 -59 8 -115 23 -170h982
c48 0 86 -38 86 -85c0 -48 -38 -86 -86 -86h-908c115 -187 321 -311 556 -311c359 0 652 292 652 652zM2048 959c0 -47 -38 -85 -86 -85h-131c11 -55 17 -112 17 -170c0 -454 -369 -824 -823 -824c-333 0 -620 198 -750 483h-189c-48 0 -86 38 -86 86c0 47 38 85 86 85h132
@ -1946,6 +2019,9 @@ l-76 -404c-19 -106 -112 -183 -220 -183h-688c-80 0 -157 39 -205 102l-384 512c-33
<glyph glyph-name="database" unicode="&#xf1c0;"
d="M768 768c301 0 603 54 768 170v-170c0 -141 -344 -256 -768 -256s-768 115 -768 256v170c165 -116 467 -170 768 -170zM768 0c301 0 603 54 768 170v-170c0 -141 -344 -256 -768 -256s-768 115 -768 256v170c165 -116 467 -170 768 -170zM768 384c301 0 603 54 768 170
v-170c0 -141 -344 -256 -768 -256s-768 115 -768 256v170c165 -116 467 -170 768 -170zM768 1536c424 0 768 -115 768 -256v-128c0 -141 -344 -256 -768 -256s-768 115 -768 256v128c0 141 344 256 768 256z" />
<glyph glyph-name="jirafeau" unicode="&#xf318;"
d="M1459 1408c43 0 77 -34 77 -77v-1382c0 -43 -34 -77 -77 -77h-923c18 109 27 134 50 210c31 103 92 108 92 108c49 11 74 31 224 -36s270 -72 270 -72v0c15 -19 71 -80 137 -85c90 -7 128 19 128 19s31 91 -38 176s-336 376 -343 403c0 0 -40 47 -69 58s-119 63 -135 130
s-42 168 -33 215s22 152 -32 130s-31 -74 -40 -137s-52 -190 -112 -190c0 0 -87 150 -145 132s-108 -181 -63 -275c0 0 -210 -295 -393 -772c-20 14 -34 37 -34 63v1382c0 43 34 77 77 77h1382z" />
<glyph glyph-name="user-circle-o" unicode="&#xf2be;" horiz-adv-x="1792"
d="M896 1536c495 0 896 -401 896 -896c0 -492 -399 -896 -896 -896c-496 0 -896 403 -896 896c0 495 401 896 896 896zM1515 185c93 128 149 285 149 455c0 423 -345 768 -768 768s-768 -345 -768 -768c0 -170 56 -327 149 -455c36 179 123 327 306 327
c81 -79 191 -128 313 -128s232 49 313 128c183 0 270 -148 306 -327zM1280 832c0 -212 -172 -384 -384 -384s-384 172 -384 384s172 384 384 384s384 -172 384 -384z" />
@ -1963,6 +2039,9 @@ d="M1151 1536c81 0 159 -39 207 -105l572 -781c77 -104 118 -229 118 -359v-355c0 -1
c-42 51 -65 116 -65 182v32c0 106 86 192 192 192h959zM1920 -64v355c0 101 -33 202 -93 284l-573 781c-24 32 -62 52 -103 52h-959c-35 0 -64 -29 -64 -64c0 -53 1 -90 36 -133c13 41 50 69 92 69h832v-32h-832c-35 0 -64 -29 -64 -64c0 -19 -1 -39 3 -58
c11 -59 65 -102 125 -102h731c53 0 96 -43 96 -96c0 -10 -2 -21 -5 -30l-64 -192c-13 -39 -50 -66 -91 -66h-443c-88 0 -160 -72 -160 -160v-32c0 -35 29 -64 64 -64h561c10 0 20 -2 29 -7l317 -158c32 -17 53 -50 53 -86v-197c0 -35 29 -64 64 -64h384c35 0 64 29 64 64z
" />
<glyph glyph-name="digitalocean" unicode="&#xf31d;" horiz-adv-x="1535"
d="M245 169h-191v190h191v-190zM473 -59h-228v228h228v-228zM769 465v-296h-296v296h296zM768 -128v298c315 0 559 312 438 644c-44 123 -142 221 -265 265c-332 120 -644 -123 -644 -438h-297c0 502 485 894 1012 729c230 -72 414 -255 485 -485
c165 -527 -226 -1013 -729 -1013z" />
<glyph glyph-name="xing" unicode="&#xf168;" horiz-adv-x="1408"
d="M597 869c0 0 -10 -17 -257 -456c-13 -22 -30 -46 -65 -46h-239c-14 0 -25 7 -31 17s-7 23 0 36l253 448c1 0 1 0 0 1l-161 279c-7 13 -8 27 -1 37c6 10 18 15 32 15h239c36 0 54 -24 66 -45c163 -285 164 -286 164 -286zM1403 1511c7 -10 7 -24 0 -37l-528 -934
c-1 0 -1 -1 0 -1l336 -615c7 -13 7 -27 1 -37c-7 -10 -18 -15 -32 -15h-239c-36 0 -55 24 -66 45c-339 621 -339 622 -339 622s17 30 531 942c13 23 28 45 64 45h241c14 0 25 -5 31 -15z" />
@ -2032,6 +2111,11 @@ d="M994 344c0 -66 -7 -132 -17 -197c-15 -104 -30 -211 -55 -313c-18 -73 -86 -90 -1
c3 21 6 43 10 66c2 16 4 32 6 47c1 6 4 10 9 12c208 106 352 322 352 571c0 365 -306 659 -675 639c-338 -18 -607 -306 -605 -644c2 -249 147 -464 356 -568c5 -2 8 -7 9 -12c2 -14 4 -29 6 -45c4 -24 7 -46 11 -68c2 -12 -11 -22 -22 -17c-297 116 -504 412 -487 753
c19 387 331 704 718 728c446 28 817 -326 817 -766zM994 800c0 -124 -100 -224 -224 -224s-224 100 -224 224s100 224 224 224s224 -100 224 -224zM1282 768c0 -165 -79 -313 -200 -406c-10 -8 -24 -1 -26 12c-3 28 -11 61 -29 92c-4 6 -3 14 3 20c76 70 124 170 124 282
c0 226 -197 407 -428 382c-177 -20 -321 -166 -338 -344c-13 -126 37 -242 122 -320c6 -6 7 -14 3 -20c-18 -31 -26 -64 -29 -93c-2 -12 -16 -19 -26 -11c-124 96 -203 247 -200 417c6 266 222 488 487 500c294 14 537 -220 537 -511z" />
<glyph glyph-name="hackster" unicode="&#xf326;"
d="M768 -128c-424 0 -768 344 -768 768s344 768 768 768s768 -344 768 -768s-344 -768 -768 -768zM517 887c-10 -3 -17 -13 -17 -23s8 -18 18 -18h113c17 0 31 14 31 31v9c0 3 0 5 -1 8c-4 16 -22 26 -38 22zM661 739v59v5c-2 9 -12 13 -21 11l-325 -88c-5 -1 -9 -7 -9 -12
s4 -9 9 -9h151c17 0 31 -14 31 -31v-86c0 -9 8 -17 17 -17h324c17 0 31 -13 31 -30v-59v-5c2 -9 12 -13 21 -11l325 88c5 1 9 7 9 12s-4 9 -9 9h-152c-17 0 -30 14 -30 31v85c0 9 -8 17 -17 17h-324c-17 0 -31 14 -31 31v0zM891 989c-13 -4 -23 -16 -23 -30v-176
c0 -17 14 -31 31 -31h101c17 0 30 14 30 31v203v0c0 2 0 6 -1 8c-4 16 -21 26 -37 22zM1013 386c10 3 17 13 17 23s-8 19 -18 19h-113c-17 0 -31 -14 -31 -31v-9c0 -3 0 -5 1 -8c4 -16 22 -26 38 -22zM639 285c13 4 23 16 23 30v176c0 17 -14 30 -31 30h-101
c-17 0 -30 -13 -30 -30v-204c0 -3 0 -5 1 -8c4 -16 21 -25 37 -21z" />
<glyph glyph-name="plus-square" unicode="&#xf0fe;"
d="M1280 576v128c0 35 -29 64 -64 64h-320v320c0 35 -29 64 -64 64h-128c-35 0 -64 -29 -64 -64v-320h-320c-35 0 -64 -29 -64 -64v-128c0 -35 29 -64 64 -64h320v-320c0 -35 29 -64 64 -64h128c35 0 64 29 64 64v320h320c35 0 64 29 64 64zM1536 1120v-960
c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
@ -2071,6 +2155,8 @@ d="M1278 -96v480h160v-640h-1438v640h160v-480h1118zM336 428l33 157l783 -165l-33 -
d="M1408 606v-318c0 -159 -129 -288 -288 -288h-832c-159 0 -288 129 -288 288v832c0 159 129 288 288 288h832c40 0 80 -8 117 -25c9 -4 16 -13 18 -23c2 -11 -1 -21 -9 -29l-49 -49c-6 -6 -15 -10 -23 -10c-3 0 -6 1 -9 2c-15 4 -30 6 -45 6h-832
c-88 0 -160 -72 -160 -160v-832c0 -88 72 -160 160 -160h832c88 0 160 72 160 160v254c0 8 3 16 9 22l64 64c7 7 15 10 23 10c4 0 8 -1 12 -3c12 -5 20 -16 20 -29zM1639 1095l-814 -814c-32 -32 -82 -32 -114 0l-430 430c-32 32 -32 82 0 114l110 110c32 32 82 32 114 0
l263 -263l647 647c32 32 82 32 114 0l110 -110c32 -32 32 -82 0 -114z" />
<glyph glyph-name="emby" unicode="&#xf319;" horiz-adv-x="1534"
d="M474 224l-62 -62l-412 415l356 356l-60 61l414 414l355 -355l58 57l411 -414l-352 -352l58 -58l-414 -414zM1091 633l-496 291v-578z" />
<glyph glyph-name="hand-spock-o" unicode="&#xf259;" horiz-adv-x="1920"
d="M459 -256c-103 0 -192 70 -217 170l-101 401c-8 35 -13 72 -13 108c0 23 0 45 -5 67l-116 477c-5 19 -7 38 -7 57c0 124 94 226 217 239c22 113 119 193 235 193c111 0 207 -76 233 -184l83 -348l103 428c26 108 122 184 233 184c119 0 217 -86 236 -202
c123 -14 212 -118 212 -241c0 -19 -3 -39 -7 -59l-123 -512c80 60 138 118 243 118c139 0 255 -113 255 -253c0 -84 -41 -162 -107 -212l-507 -380c-44 -33 -98 -51 -153 -51h-694zM1104 1408c-51 0 -96 -36 -108 -86l-164 -682h-127l-145 602c-12 50 -57 86 -108 86
@ -2156,6 +2242,9 @@ d="M152 1274v0h10c90 -2 180 -36 272 -79c4 -2 11 -5 15 -7c7 -3 13 -7 20 -10c116 -
c2 3 5 5 7 8s5 6 7 9c70 83 157 151 278 208c101 48 200 86 296 86h9c45 -1 84 -15 110 -44c80 -92 -8 -177 -39 -293c-41 -155 6 -321 -118 -429c-43 -37 -93 -47 -143 -52c65 -77 103 -183 82 -292c-4 -21 -10 -42 -18 -61c-6 -17 -13 -32 -22 -47l-9 -15
c-2 -2 -3 -5 -5 -7c-63 -94 -168 -154 -281 -161c-6 0 -11 -1 -17 -1h-9c-15 0 -39 3 -53 5c-19 3 -49 12 -67 19c-3 1 -7 2 -9 3c-69 29 -124 80 -159 143c-2 3 -4 5 -5 8c-2 3 -5 3 -7 0c-1 -3 -3 -5 -5 -8s-2 -5 -4 -8c-48 -81 -131 -140 -231 -157c-12 -2 -23 -3 -35 -4
c-6 0 -12 -1 -18 -1c-169 -3 -327 118 -361 292c-21 109 18 215 83 292c-50 5 -101 15 -144 52c-124 108 -78 274 -119 429c-31 116 -118 201 -38 293c26 29 65 43 110 44h9z" />
<glyph glyph-name="file-epub" unicode="&#xf321;"
d="M723 132l458 458l70 -71c24 -24 24 -64 0 -88l-483 -483c-24 -24 -65 -24 -89 0l-483 483c-24 24 -24 64 0 88l483 484c24 24 65 24 89 0l298 -299l-343 -343l-114 114l229 229l-115 114l-343 -343zM1468 1156c37 -37 68 -111 68 -164v-1152c0 -53 -43 -96 -96 -96h-1344
c-53 0 -96 43 -96 96v1600c0 53 43 96 96 96h896c53 0 127 -31 164 -68zM1024 1400v-376h376c-6 17 -15 34 -22 41l-313 313c-7 7 -24 16 -41 22zM1408 -128v1024h-416c-53 0 -96 43 -96 96v416h-768v-1536h1280z" />
<glyph glyph-name="chevron-circle-left" unicode="&#xf137;"
d="M909 141l102 102c25 25 25 65 0 90l-307 307l307 307c25 25 25 65 0 90l-102 102c-25 25 -65 25 -90 0l-454 -454c-25 -25 -25 -65 0 -90l454 -454c25 -25 65 -25 90 0zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
<glyph glyph-name="signal" unicode="&#xf012;" horiz-adv-x="1792"
@ -2227,6 +2316,11 @@ v66c282 -8 528 -159 667 -385zM1748 640c0 470 -382 852 -852 852s-852 -382 -852 -8
<glyph glyph-name="server" unicode="&#xf233;" horiz-adv-x="1792"
d="M128 128h1024v128h-1024v-128zM128 640h1024v128h-1024v-128zM1696 192c0 53 -43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96s96 43 96 96zM128 1152h1024v128h-1024v-128zM1696 704c0 53 -43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96s96 43 96 96zM1696 1216
c0 53 -43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96s96 43 96 96zM1792 384v-384h-1792v384h1792zM1792 896v-384h-1792v384h1792zM1792 1408v-384h-1792v384h1792z" />
<glyph glyph-name="inkscape" unicode="&#xf312;"
d="M755 1398v0c47 0 95 -17 131 -52l588 -601c234 -234 -259 -288 -401 -371c-50 -51 153 -85 132 -147c-42 -126 -157 -45 -280 -171c-50 -51 95 -46 45 -97c-93 -68 -285 -115 -300 -32c-21 117 -135 68 -185 119s101 104 51 155s-299 97 -349 148s191 88 141 139
c-138 68 -461 41 -269 278l567 580c34 35 82 52 129 52zM760 1343v0c-34 0 -68 -13 -93 -38c-49 -50 -140 -138 -219 -223c-45 -45 -40 -109 10 -109h123l80 139l49 -199l149 95l93 -49l22 131l111 -89c12 12 12 54 -9 76l-224 228c-24 25 -58 38 -92 38zM491 456
c-74 0 219 -119 279 -103c27 14 40 34 21 38c-56 9 -285 56 -300 65zM1390 297c43 -1 86 -22 100 -63c0 -54 -212 -36 -212 -7c13 47 63 71 112 70zM409 172c26 0 50 -8 64 -26c-23 -61 -101 -115 -151 -72c-57 50 21 99 87 98zM1251 168c71 -14 85 -65 71 -79
c-64 -38 -136 21 -71 79z" />
<glyph glyph-name="search-minus" unicode="&#xf010;" horiz-adv-x="1664"
d="M1024 736v-64c0 -17 -15 -32 -32 -32h-576c-17 0 -32 15 -32 32v64c0 17 15 32 32 32h576c17 0 32 -15 32 -32zM1152 704c0 247 -201 448 -448 448s-448 -201 -448 -448s201 -448 448 -448s448 201 448 448zM1664 -128c0 -71 -57 -128 -128 -128c-34 0 -67 14 -90 38
l-343 342c-117 -81 -257 -124 -399 -124c-389 0 -704 315 -704 704s315 704 704 704s704 -315 704 -704c0 -142 -43 -282 -124 -399l343 -343c23 -23 37 -56 37 -90z" />
@ -2245,17 +2339,16 @@ c-9 0 -18 -3 -24 -8c-7 -4 -10 -11 -10 -18l17 -621c0 -14 15 -25 34 -25h185c18 0 3
d="M1408 768c0 -283 -315 -512 -704 -512c-61 0 -120 6 -176 16c-83 -59 -177 -102 -278 -128c-27 -7 -56 -12 -86 -16h-3c-15 0 -29 12 -32 29c-4 19 9 31 20 44c39 44 83 83 117 166c-162 94 -266 239 -266 401c0 283 315 512 704 512s704 -229 704 -512zM1792 512
c0 -163 -104 -307 -266 -401c34 -83 78 -122 117 -166c11 -13 24 -25 20 -44c-4 -18 -19 -31 -35 -29c-30 4 -59 9 -86 16c-101 26 -195 69 -278 128c-56 -10 -115 -16 -176 -16c-181 0 -347 50 -472 132c29 -2 59 -4 88 -4c215 0 418 62 573 174c167 122 259 287 259 466
c0 52 -8 103 -23 152c169 -93 279 -241 279 -408z" />
<glyph glyph-name="moon" unicode="&#xf328;" horiz-adv-x="1471"
d="M1465 318c-125 -271 -399 -446 -697 -446c-423 0 -768 345 -768 768c0 415 325 752 739 767c28 1 51 -15 61 -39c11 -25 4 -54 -15 -72c-114 -104 -177 -246 -177 -400c0 -300 244 -544 544 -544c79 0 155 17 228 51c25 11 53 6 72 -13s24 -48 13 -72z" />
<glyph glyph-name="facebook-official" unicode="&#xf230;"
d="M1451 1408c47 0 85 -38 85 -85v-1366c0 -47 -38 -85 -85 -85h-391v595h199l30 232h-229v148c0 67 18 112 115 112l122 1v207c-21 3 -94 9 -178 9c-177 0 -299 -108 -299 -306v-171h-200v-232h200v-595h-735c-47 0 -85 38 -85 85v1366c0 47 38 85 85 85h1366z" />
<glyph glyph-name="clock-o" unicode="&#xf017;"
d="M896 992v-448c0 -18 -14 -32 -32 -32h-320c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h224v352c0 18 14 32 32 32h64c18 0 32 -14 32 -32zM1312 640c0 300 -244 544 -544 544s-544 -244 -544 -544s244 -544 544 -544s544 244 544 544zM1536 640
c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
<glyph glyph-name="handshake-o" unicode="&#xf2b5;" horiz-adv-x="2304"
d="M192 384c84 0 84 128 0 128s-84 -128 0 -128zM1665 442c-79 103 -156 208 -246 302l-125 -140c-110 -125 -307 -122 -414 6c-76 92 -76 224 2 315l177 206c-62 32 -137 21 -204 21c-59 0 -116 -24 -158 -66l-158 -158h-155v-544c44 0 84 6 119 -28l297 -292
c61 -59 140 -111 227 -111c45 0 93 15 125 47c75 -26 162 16 185 93c48 -4 92 11 127 44c23 21 53 63 50 96c9 -9 31 -10 43 -10c119 0 181 125 108 219zM1824 384h96v512h-93l-157 180c-42 48 -105 76 -169 76h-167c-56 0 -110 -25 -146 -67l-209 -243
c-37 -44 -37 -106 -1 -150c57 -68 162 -69 221 -3l193 218c46 51 130 3 109 -62c38 -44 79 -87 116 -131c50 -62 98 -127 147 -190c31 -40 54 -88 60 -140zM2112 384c84 0 84 128 0 128s-84 -128 0 -128zM2304 960v-640c0 -35 -29 -64 -64 -64h-434
c-36 -87 -115 -145 -207 -158c-43 -63 -109 -111 -183 -127c-55 -70 -144 -112 -233 -106c-165 -93 -351 -12 -474 109l-287 282h-358c-35 0 -64 29 -64 64v672c0 35 29 64 64 64h421c116 116 196 224 370 224h117c65 0 128 -20 181 -56c53 36 116 56 181 56h167
c190 0 269 -124 384 -256h355c35 0 64 -29 64 -64z" />
<glyph glyph-name="caret-square-o-left" unicode="&#xf191;"
d="M1024 960v-640c0 -35 -29 -64 -64 -64c-13 0 -26 4 -37 12l-448 320c-17 12 -27 31 -27 52c0 20 10 40 27 52l448 320c11 8 24 12 37 12c35 0 64 -29 64 -64zM1280 160v960c0 17 -15 32 -32 32h-960c-17 0 -32 -15 -32 -32v-960c0 -17 15 -32 32 -32h960
c17 0 32 15 32 32zM1536 1120v-960c0 -159 -129 -288 -288 -288h-960c-159 0 -288 129 -288 288v960c0 159 129 288 288 288h960c159 0 288 -129 288 -288z" />
<glyph glyph-name="hand-scissors-o" unicode="&#xf257;" horiz-adv-x="1792"
d="M1073 -128h-177c-104 0 -183 45 -226 141c-15 32 -23 67 -23 102v5c-82 40 -135 124 -135 216c0 11 0 38 5 48h-261c-141 0 -256 115 -256 256s115 256 256 256h113l-44 17c-99 37 -165 133 -165 239c0 141 115 256 256 256c31 0 62 -6 91 -17l628 -239h401
c141 0 256 -115 256 -256v-668c0 -118 -80 -220 -194 -248l-339 -85c-60 -15 -123 -23 -186 -23zM1024 583l-155 -71l-163 -74c-40 -18 -66 -58 -66 -102c0 -62 50 -112 112 -112c16 0 32 3 46 10l338 154c-65 14 -112 73 -112 140v55zM1344 272c0 62 -50 112 -112 112
@ -2450,6 +2543,9 @@ c13 -20 20 -44 20 -69s-7 -49 -20 -69c-119 -187 -293 -342 -497 -429c15 -27 110 -1
c-22 -5 -50 -3 -72 -3c-11 0 -56 -2 -60 7l-456 841c-29 -21 -56 -44 -82 -68c22 -39 404 -742 404 -748c0 -8 -5 -10 -11 -10c-17 0 -150 41 -155 50l-106 197l-224 413c-28 -34 -54 -69 -78 -106c13 -19 30 -39 41 -59c14 -26 176 -321 176 -327c0 -5 -5 -10 -10 -10z
M1165 282l49 -91c187 76 341 216 450 385c-111 171 -269 313 -459 389c89 -85 139 -202 139 -325c0 -141 -66 -274 -179 -358zM848 896c0 -26 22 -48 48 -48c55 0 108 -22 147 -61s61 -92 61 -147c0 -26 22 -48 48 -48s48 22 48 48c0 168 -136 304 -304 304
c-26 0 -48 -22 -48 -48zM1214 961l-9 4l7 -7z" />
<glyph glyph-name="camera" unicode="&#xf030;" horiz-adv-x="1920"
d="M960 864c159 0 288 -129 288 -288s-129 -288 -288 -288s-288 129 -288 288s129 288 288 288zM1664 1280c141 0 256 -115 256 -256v-896c0 -141 -115 -256 -256 -256h-1408c-141 0 -256 115 -256 256v896c0 141 115 256 256 256h224l51 136c25 66 103 120 173 120h512
c70 0 148 -54 173 -120l51 -136h224zM960 128c247 0 448 201 448 448s-201 448 -448 448s-448 -201 -448 -448s201 -448 448 -448z" />
<glyph glyph-name="wordpress" unicode="&#xf19a;" horiz-adv-x="1792"
d="M127 640c0 111 24 217 67 313l367 -1005c-257 125 -434 388 -434 692zM1415 679c0 -66 -27 -142 -59 -249l-76 -256l-278 826s46 3 88 8c41 5 36 66 -5 63c-125 -9 -205 -10 -205 -10s-75 1 -202 10c-42 3 -47 -60 -5 -63c39 -4 80 -8 80 -8l120 -328l-168 -504l-280 832
s46 3 88 8c41 5 36 66 -5 63c-124 -9 -205 -10 -205 -10c-14 0 -31 1 -49 1c137 209 373 347 642 347c200 0 382 -77 519 -202h-10c-75 0 -129 -65 -129 -136c0 -63 37 -116 76 -180c30 -51 63 -117 63 -212zM909 573l237 -647c1 -4 3 -8 5 -11c-80 -28 -165 -44 -255 -44
@ -2661,6 +2757,8 @@ d="M1280 1504c0 18 14 32 32 32h288c35 0 64 -29 64 -64v-288c0 -18 -14 -32 -32 -32
h-64c-18 0 -32 14 -32 32v96h-96c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h96v132c-288 32 -512 276 -512 572c0 136 48 261 126 359l-52 53l-101 -111c-12 -13 -32 -14 -45 -3l-48 44c-13 11 -14 32 -2 45l105 115l-111 112v-134c0 -18 -14 -32 -32 -32h-64
c-18 0 -32 14 -32 32v288c0 35 29 64 64 64h288c18 0 32 -14 32 -32v-64c0 -18 -14 -32 -32 -32h-133l106 -107l86 94c12 13 32 14 45 3l48 -44c13 -11 14 -32 2 -45l-90 -99l57 -56c98 78 223 126 359 126s261 -48 359 -126l255 254h-134c-18 0 -32 14 -32 32v64zM832 256
c247 0 448 201 448 448s-201 448 -448 448s-448 -201 -448 -448s201 -448 448 -448z" />
<glyph glyph-name="chevron-up" unicode="&#xf077;" horiz-adv-x="1612"
d="M1593 205l-166 -165c-25 -25 -65 -25 -90 0l-531 531l-531 -531c-25 -25 -65 -25 -90 0l-166 165c-25 25 -25 66 0 91l742 741c25 25 65 25 90 0l742 -741c25 -25 25 -66 0 -91z" />
<glyph glyph-name="asterisk" unicode="&#xf069;" horiz-adv-x="1428"
d="M1364 486c61 -35 82 -114 47 -175l-64 -110c-35 -61 -114 -82 -175 -47l-266 153v-307c0 -70 -58 -128 -128 -128h-128c-70 0 -128 58 -128 128v307l-266 -153c-61 -35 -140 -14 -175 47l-64 110c-35 61 -14 140 47 175l266 154l-266 154c-61 35 -82 114 -47 175l64 110
c35 61 114 82 175 47l266 -153v307c0 70 58 128 128 128h128c70 0 128 -58 128 -128v-307l266 153c61 35 140 14 175 -47l64 -110c35 -61 14 -140 -47 -175l-266 -154z" />
@ -2734,8 +2832,11 @@ c18 0 32 -14 32 -32zM1540 -23v-233h-584v90l369 529c8 12 16 22 21 27l11 9v3c-4 0
l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70z" />
<glyph glyph-name="area-chart" unicode="&#xf1fe;" horiz-adv-x="2048"
d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" />
<glyph glyph-name="chevron-up" unicode="&#xf077;" horiz-adv-x="1612"
d="M1593 205l-166 -165c-25 -25 -65 -25 -90 0l-531 531l-531 -531c-25 -25 -65 -25 -90 0l-166 165c-25 25 -25 66 0 91l742 741c25 25 65 25 90 0l742 -741c25 -25 25 -66 0 -91z" />
<glyph glyph-name="dev-to" unicode="&#xf316;"
d="M39 1403v0c13 5 121 6 735 5c717 -1 721 -1 734 -9c7 -5 15 -14 20 -21c8 -13 8 -16 8 -739s0 -726 -8 -739c-5 -7 -13 -15 -20 -20c-13 -8 -16 -8 -739 -8s-726 0 -739 8c-7 5 -16 13 -21 20c-8 13 -8 16 -9 731c0 490 0 723 3 733c5 19 18 33 36 39zM404 935
c-18 4 -53 6 -119 6h-93v-603h84c46 0 96 1 111 3c72 9 131 63 144 132c5 26 5 306 0 332c-6 31 -20 59 -43 83c-25 26 -50 40 -84 47zM897 886v55h-118c-92 0 -121 -2 -133 -6c-20 -7 -42 -30 -47 -50c-3 -11 -4 -89 -3 -254c1 -265 -1 -250 27 -274c20 -17 39 -19 163 -19
h111v109l-95 1l-96 1l-1 69v69h116v109h-116v136h192v54zM1081 933c-3 8 -4 8 -62 8h-59l3 -10c26 -106 136 -514 143 -528c11 -23 33 -49 49 -57c18 -9 47 -7 67 4c16 9 45 45 50 62c8 25 138 522 138 525s-16 4 -60 3l-58 -1l-52 -198c-28 -109 -52 -199 -53 -202
s-24 83 -52 190s-52 199 -54 204zM301 639v193l41 -1c37 -2 42 -2 56 -11c28 -18 27 -18 27 -178c0 -164 0 -166 -29 -183c-15 -9 -22 -10 -56 -11l-39 -2v193z" />
<glyph glyph-name="stethoscope" unicode="&#xf0f1;" horiz-adv-x="1408"
d="M1280 832c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1408 832c0 -84 -53 -154 -128 -181v-395c0 -212 -201 -384 -448 -384s-448 172 -448 384v132c-217 27 -384 187 -384 380v512c0 35 29 64 64 64c6 0 11 -1 16 -2c22 39 64 66 112 66
c71 0 128 -57 128 -128s-57 -128 -128 -128c-23 0 -45 7 -64 18v-402c0 -141 144 -256 320 -256s320 115 320 256v402c-19 -11 -41 -18 -64 -18c-71 0 -128 57 -128 128s57 128 128 128c48 0 90 -27 112 -66c5 1 10 2 16 2c35 0 64 -29 64 -64v-512

Before

Width:  |  Height:  |  Size: 453 KiB

After

Width:  |  Height:  |  Size: 470 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -72,7 +72,7 @@ function expandCWButtonPrepare()
{
var theButton = document.querySelector('#expandCWs');
if (!theButton) {
theButton = document.createElement('p');
theButton = document.createElement('button');
theButton.id = "expandCWs";
theButton.textContent = "Expand CWs";
theButton.classList.toggle('button');

View File

@ -4,7 +4,7 @@
define(["jquery"], function (a0) {
return (root['Intercooler'] = factory(a0));
});
} else if (typeof exports === 'object') {
} else if (typeof module === 'object' && module.exports) {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
@ -24,7 +24,7 @@ var Intercooler = Intercooler || (function() {
// work around zepto build issue TODO - fix me
if((typeof Zepto !== "undefined") && ($ == null)) {
$ = Zepto
window["$"] = Zepto
}
//--------------------------------------------------
@ -68,7 +68,7 @@ var Intercooler = Intercooler || (function() {
return false;
}
return adest.slice(0, asrc.length).join("/") == asrc.join("/") ||
asrc.slice(0, adest.length).join("/") == adest.join("/");
asrc.slice(0, adest.length).join("/") == adest.join("/");
};
//============================================================
@ -88,9 +88,10 @@ var Intercooler = Intercooler || (function() {
}
function hideIndicator(elt) {
if (elt.data('ic-use-transition')) {
if (elt.data('ic-use-transition') || elt.data('ic-indicator-cleared')) {
elt.data('ic-use-transition', null);
elt.addClass('ic-use-transition');
elt.data('ic-indicator-cleared', true);
} else {
elt.hide();
}
@ -259,6 +260,11 @@ var Intercooler = Intercooler || (function() {
document.title = xhr.getResponseHeader("X-IC-Title");
}
if (xhr.getResponseHeader("X-IC-Title-Encoded")) {
var decodedTitle = decodeURIComponent((xhr.getResponseHeader("X-IC-Title-Encoded")).replace(/\+/g, '%20'));
document.title = decodedTitle;
}
if (xhr.getResponseHeader("X-IC-Refresh")) {
var pathsToRefresh = xhr.getResponseHeader("X-IC-Refresh").split(",");
log(elt, "X-IC-Refresh: refreshing " + pathsToRefresh, "DEBUG");
@ -351,14 +357,19 @@ var Intercooler = Intercooler || (function() {
function beforeRequest(elt) {
elt.addClass('disabled');
elt.addClass('ic-request-in-flight');
elt.data('ic-request-in-flight', true);
}
function requestCleanup(indicator, elt) {
function requestCleanup(indicator, globalIndicator, elt) {
if (indicator.length > 0) {
hideIndicator(indicator);
}
if (globalIndicator.length > 0) {
hideIndicator(globalIndicator);
}
elt.removeClass('disabled');
elt.removeClass('ic-request-in-flight');
elt.data('ic-request-in-flight', false);
if (elt.data('ic-next-request')) {
elt.data('ic-next-request')["req"]();
@ -404,19 +415,19 @@ var Intercooler = Intercooler || (function() {
var names = [];
var values = [];
if (args) {
for (var i = 0; i < args.length; i++) {
names.push(args[i][0]);
values.push(args[i][1]);
}
for (var i = 0; i < args.length; i++) {
names.push(args[i][0]);
values.push(args[i][1]);
}
}
if (isIdentifier(script)) {
return window[script].apply(this, values);
return window[script].apply(this, values);
} else {
var outerfunc = window["eval"].call(
window,
'(function (' + names.join(", ") + ') {' + script + '})'
);
return outerfunc.apply(this, values);
var outerfunc = window["eval"].call(
window,
'(function (' + names.join(", ") + ') {' + script + '})'
);
return outerfunc.apply(this, values);
}
}
@ -439,12 +450,35 @@ var Intercooler = Intercooler || (function() {
return msg;
}
function getLocalURL(baseURL, paramsToPush, data) {
if (paramsToPush) {
baseURL = baseURL + "?";
var vars = {};
data.replace(/([^=&]+)=([^&]*)/gi, function(m,key,value) {
vars[key] = value;
});
$(paramsToPush.split(",")).each(function(index) {
var param = $.trim(this);
var value = vars[param] || "";
baseURL += (index == 0) ? "" : "&";
baseURL += param + "=" + value;
});
}
return baseURL;
}
function handleRemoteRequest(elt, type, url, data, success) {
beforeRequest(elt);
data = replaceOrAddMethod(data, type);
// Global spinner support
var globalIndicator = findGlobalIndicator(elt);
if (globalIndicator && globalIndicator.length > 0) {
showIndicator(globalIndicator);
}
// Spinner support
var indicator = findIndicator(elt);
if (indicator.length > 0) {
@ -479,17 +513,18 @@ var Intercooler = Intercooler || (function() {
}
maybeInvokeLocalAction(elt, "-beforeSend");
},
success: function(data, textStatus, xhr) {
triggerEvent(elt, "success.ic", [elt, data, textStatus, xhr, requestId]);
success: function(responseData, textStatus, xhr) {
triggerEvent(elt, "success.ic", [elt, responseData, textStatus, xhr, requestId]);
log(elt, "AJAX request " + requestId + " was successful.", "DEBUG");
var onSuccess = closestAttrValue(elt, 'ic-on-success');
if (onSuccess) {
if (globalEval(onSuccess, [["elt", elt], ["data", data], ["textStatus", textStatus], ["xhr", xhr]]) == false) {
if (globalEval(onSuccess, [["elt", elt], ["data", responseData], ["textStatus", textStatus], ["xhr", xhr]]) == false) {
return;
}
}
var beforeHeaders = new Date();
var oldTitle = document.title;
try {
if (processHeaders(elt, xhr)) {
log(elt, "Processed headers for request " + requestId + " in " + (new Date() - beforeHeaders) + "ms", "DEBUG");
@ -497,10 +532,12 @@ var Intercooler = Intercooler || (function() {
if (xhr.getResponseHeader("X-IC-PushURL") || closestAttrValue(elt, 'ic-push-url') == "true") {
try {
requestCleanup(indicator, elt); // clean up before snap-shotting HTML
var newUrl = xhr.getResponseHeader("X-IC-PushURL") || closestAttrValue(elt, 'ic-src');
requestCleanup(indicator, globalIndicator, elt); // clean up before snap-shotting HTML
var baseURL = closestAttrValue(elt, 'ic-src');
var paramsToPush = closestAttrValue(elt, 'ic-push-params');
var newUrl = xhr.getResponseHeader("X-IC-PushURL") || getLocalURL(baseURL, paramsToPush, data);
if(_history) {
_history.snapshotForHistory(newUrl);
_history.snapshotForHistory(newUrl, oldTitle);
} else {
throw "History support not enabled";
}
@ -509,11 +546,11 @@ var Intercooler = Intercooler || (function() {
}
}
success(data, textStatus, elt, xhr);
success(responseData, textStatus, elt, xhr);
log(elt, "Process content for request " + requestId + " in " + (new Date() - beforeSuccess) + "ms", "DEBUG");
}
triggerEvent(elt, "after.success.ic", [elt, data, textStatus, xhr, requestId]);
triggerEvent(elt, "after.success.ic", [elt, responseData, textStatus, xhr, requestId]);
maybeInvokeLocalAction(elt, "-success");
} catch (e) {
log(elt, "Error processing successful request " + requestId + " : " + formatError(e), "ERROR");
@ -531,7 +568,7 @@ var Intercooler = Intercooler || (function() {
},
complete: function(xhr, status) {
log(elt, "AJAX request " + requestId + " completed in " + (new Date() - requestStart) + "ms", "DEBUG");
requestCleanup(indicator, elt);
requestCleanup(indicator, globalIndicator, elt);
try {
if ($.contains(document, elt[0])) {
triggerEvent(elt, "complete.ic", [elt, data, status, xhr, requestId]);
@ -557,14 +594,24 @@ var Intercooler = Intercooler || (function() {
triggerEvent($(document), "beforeAjaxSend.ic", [ajaxSetup, elt]);
if(ajaxSetup.cancel) {
requestCleanup(indicator, elt);
requestCleanup(indicator, globalIndicator, elt);
} else {
$.ajax(ajaxSetup)
}
}
function findGlobalIndicator(elt) {
var indicator = $([]);
elt = $(elt);
var attr = closestAttrValue(elt, 'ic-global-indicator');
if (attr && attr !== "false") {
indicator = $(attr).first();
}
return indicator;
}
function findIndicator(elt) {
var indicator = null;
var indicator = $([]);
elt = $(elt);
if (getICAttribute(elt, 'ic-indicator')) {
indicator = $(getICAttribute(elt, 'ic-indicator')).first();
@ -612,14 +659,14 @@ var Intercooler = Intercooler || (function() {
return data;
}
function appendData(data, string, value) {
function appendData(data, key, value) {
if ($.type(data) === "string") {
if($.type(value) !== "string") {
value = JSON.stringify(value);
}
return data + "&" + string + "=" + encodeURIComponent(value);
return data + "&" + key + "=" + encodeURIComponent(value);
} else {
data.append(string, value);
data.append(key, value);
return data;
}
}
@ -727,6 +774,7 @@ var Intercooler = Intercooler || (function() {
});
} else {
processMacros(elt);
processEnhancement(elt);
processSources(elt);
processPolling(elt);
processEventSources(elt);
@ -846,6 +894,18 @@ var Intercooler = Intercooler || (function() {
}
}
function processEnhancement(elt) {
if (elt.closest('.ic-ignore').length == 0) {
if(closestAttrValue(elt, 'ic-enhance') === 'true') {
enhanceDomTree(elt);
} else {
elt.find(getICAttributeSelector('ic-enhance')).each(function(){
enhanceDomTree($(this));
});
}
}
}
function processEventSources(elt) {
if (elt.closest('.ic-ignore').length == 0) {
handleEventSource(elt);
@ -1024,14 +1084,15 @@ var Intercooler = Intercooler || (function() {
elt = $(elt);
if (getICAttribute(elt, 'ic-sse-src')) {
var evtSrcUrl = getICAttribute(elt, 'ic-sse-src');
var eventSource = initEventSource(elt, evtSrcUrl);
var evtSrcWithCredentials = getICAttribute(elt, 'ic-sse-with-credentials') === 'true';
var eventSource = initEventSource(elt, evtSrcUrl, evtSrcWithCredentials);
elt.data('ic-event-sse-source', eventSource);
elt.data('ic-event-sse-map', {});
}
}
function initEventSource(elt, evtSrcUrl) {
var eventSource = Intercooler._internal.initEventSource(evtSrcUrl);
function initEventSource(elt, evtSrcUrl, evtSrcWithCredentials) {
var eventSource = Intercooler._internal.initEventSource(evtSrcUrl, evtSrcWithCredentials);
eventSource.onmessage = function(e) {
processICResponse(e.data, elt, false);
};
@ -1069,7 +1130,9 @@ var Intercooler = Intercooler || (function() {
}
function handleTriggerOn(elt) {
if (getICAttribute(elt, 'ic-trigger-on')) {
var triggerOnValue = getICAttribute(elt, 'ic-trigger-on');
if (triggerOnValue) {
// record button or submit input click info
if(elt.is('form')) {
elt.on('click focus', 'input, button, select, textarea', function(e){
@ -1080,59 +1143,65 @@ var Intercooler = Intercooler || (function() {
}
});
}
if (getICAttribute(elt, 'ic-trigger-on') == 'load') {
fireICRequest(elt);
} else if (getICAttribute(elt, 'ic-trigger-on') == 'scrolled-into-view') {
initScrollHandler();
setTimeout(function() {
triggerEvent($(window), 'scroll');
}, 100); // Trigger a scroll in case element is already viewable
} else {
var triggerOn = getICAttribute(elt, 'ic-trigger-on').split(" ");
if(triggerOn[0].indexOf("sse:") == 0) {
//Server-sent event, find closest event source and register for it
var sourceElt = elt.closest(getICAttributeSelector('ic-sse-src'));
if(sourceElt) {
registerSSE(sourceElt, triggerOn[0].substr(4))
}
var triggerOnArray = triggerOnValue.split(",");
for (var i = 0; i < triggerOnArray.length; i++) {
var triggerOn = $.trim(triggerOnArray[i]);
var splitTriggerOn = triggerOn.split(" ");
var eventString = eventFor(splitTriggerOn[0], $(elt));
var eventModifier = splitTriggerOn[1];
if (triggerOn == 'load') {
fireICRequest(elt);
} else if (triggerOn == 'scrolled-into-view') {
initScrollHandler();
setTimeout(function() {
triggerEvent($(window), 'scroll');
}, 100); // Trigger a scroll in case element is already viewable
} else {
var triggerOn = getICAttribute($(elt), 'ic-trigger-on').split(" ");
var event = eventFor(triggerOn[0], $(elt));
$(getTriggeredElement(elt)).on(event, function(e) {
var onBeforeTrigger = closestAttrValue(elt, 'ic-on-beforeTrigger');
if (onBeforeTrigger) {
if (globalEval(onBeforeTrigger, [["elt", elt], ["evt", e], ["elt", elt]]) == false) {
log(elt, "ic-trigger cancelled by ic-on-beforeTrigger", "DEBUG");
if(eventString.indexOf("sse:") == 0) {
//Server-sent event, find closest event source and register for it
var sourceElt = elt.closest(getICAttributeSelector('ic-sse-src'));
if(sourceElt.length > 0) {
registerSSE(sourceElt, splitTriggerOn[0].substr(4))
}
} else {
$(getTriggeredElement(elt)).on(eventString, function(e) {
var onBeforeTrigger = closestAttrValue(elt, 'ic-on-beforeTrigger');
if (onBeforeTrigger) {
if (globalEval(onBeforeTrigger, [["elt", elt], ["evt", e], ["elt", elt]]) == false) {
log(elt, "ic-trigger cancelled by ic-on-beforeTrigger", "DEBUG");
return false;
}
}
if (eventModifier == 'changed') {
var currentVal = elt.val();
var previousVal = elt.data('ic-previous-val');
elt.data('ic-previous-val', currentVal);
if (currentVal != previousVal) {
fireICRequest(elt);
}
} else if (eventModifier == 'once') {
var alreadyTriggered = elt.data('ic-already-triggered');
elt.data('ic-already-triggered', true);
if (alreadyTriggered !== true) {
fireICRequest(elt);
}
} else {
fireICRequest(elt);
}
if (preventDefault(elt, e)) {
e.preventDefault();
return false;
}
return true;
});
if(eventString && (eventString.indexOf("timeout:") == 0)) {
var timeout = parseInterval(eventString.split(":")[1]);
setTimeout(function () {
$(getTriggeredElement(elt)).trigger(eventString);
}, timeout);
}
if (triggerOn[1] == 'changed') {
var currentVal = elt.val();
var previousVal = elt.data('ic-previous-val');
elt.data('ic-previous-val', currentVal);
if (currentVal != previousVal) {
fireICRequest(elt);
}
} else if (triggerOn[1] == 'once') {
var alreadyTriggered = elt.data('ic-already-triggered');
elt.data('ic-already-triggered', true);
if (alreadyTriggered !== true) {
fireICRequest(elt);
}
} else {
fireICRequest(elt);
}
if (preventDefault(elt, e)) {
e.preventDefault();
return false;
}
return true;
});
if(event && (event.indexOf("timeout:") == 0)) {
setTimeout(function () {
$(getTriggeredElement(elt)).trigger(event);
}, parseInterval(event.split(":")[1]));
}
}
}
@ -1178,6 +1247,7 @@ var Intercooler = Intercooler || (function() {
setIfAbsent(elt, 'ic-trigger-on', 'default');
setIfAbsent(elt, 'ic-deps', 'ignore');
}
if (macroIs(macro, 'ic-action')) {
setIfAbsent(elt, 'ic-trigger-on', 'default');
}
@ -1209,6 +1279,51 @@ var Intercooler = Intercooler || (function() {
}
}
function isLocalLink(anchor) {
return location.hostname === anchor[0].hostname &&
anchor.attr('href') &&
!anchor.attr('href').startsWith("#")
}
function enhanceAnchor(anchor) {
if (closestAttrValue(anchor, 'ic-enhance') === "true") {
if (isLocalLink(anchor)) {
setIfAbsent(anchor, 'ic-src', anchor.attr('href'));
setIfAbsent(anchor, 'ic-trigger-on', 'default');
setIfAbsent(anchor, 'ic-deps', 'ignore');
setIfAbsent(anchor, 'ic-push-url', 'true');
}
}
}
function determineFormVerb(form) {
return form.find('input[name="_method"]').val() || form.attr('method') || form[0].method;
}
function enhanceForm(form) {
if (closestAttrValue(form, 'ic-enhance') === "true") {
setIfAbsent(form, 'ic-src', form.attr('action'));
setIfAbsent(form, 'ic-trigger-on', 'default');
setIfAbsent(form, 'ic-deps', 'ignore');
setIfAbsent(form, 'ic-verb', determineFormVerb(form));
}
}
function enhanceDomTree(elt) {
if(elt.is('a')) {
enhanceAnchor(elt);
}
elt.find('a').each(function(){
enhanceAnchor($(this));
});
if(elt.is('form')){
enhanceForm(elt);
}
elt.find('form').each(function(){
enhanceForm($(this));
});
}
function setIfAbsent(elt, attr, value) {
if (getICAttribute(elt, attr) == null) {
setICAttribute(elt, attr, value);
@ -1222,7 +1337,7 @@ var Intercooler = Intercooler || (function() {
function isScrolledIntoView(elem) {
elem = $(elem);
if (elem.height() == 0 && elem.width() == 0) {
return false;
return false;
}
var docViewTop = $(window).scrollTop();
var docViewBottom = docViewTop + $(window).height();
@ -1231,13 +1346,13 @@ var Intercooler = Intercooler || (function() {
var elemBottom = elemTop + elem.height();
return ((elemBottom >= docViewTop) && (elemTop <= docViewBottom)
&& (elemBottom <= docViewBottom) && (elemTop >= docViewTop));
&& (elemBottom <= docViewBottom) && (elemTop >= docViewTop));
}
function maybeScrollToTarget(elt, target) {
if (closestAttrValue(elt, 'ic-scroll-to-target') != "false" &&
(closestAttrValue(elt, 'ic-scroll-to-target') == 'true' ||
closestAttrValue(target, 'ic-scroll-to-target') == 'true')) {
(closestAttrValue(elt, 'ic-scroll-to-target') == 'true' ||
closestAttrValue(target, 'ic-scroll-to-target') == 'true')) {
var offset = -50; // -50 px default offset padding
if (closestAttrValue(elt, 'ic-scroll-offset')) {
offset = parseInt(closestAttrValue(elt, 'ic-scroll-offset'));
@ -1352,6 +1467,19 @@ var Intercooler = Intercooler || (function() {
if (forHistory != true) {
maybeScrollToTarget(elt, target);
}
var switchClass = elt.closest(getICAttributeSelector('ic-switch-class'));
var classToSwitch = switchClass.attr(fixICAttributeName('ic-switch-class'));
if(classToSwitch) {
switchClass.children().removeClass(classToSwitch);
switchClass.children().each(function(){
if($.contains($(this)[0], $(elt)[0]) || $(this)[0] == $(elt)[0]) {
$(this).addClass(classToSwitch);
$(this).addClass(classToSwitch);
}
})
}
}
};
@ -1449,7 +1577,7 @@ var Intercooler = Intercooler || (function() {
}
}
function fireICRequest(elt, alternateHandler) {
function fireICRequest(elt, alternateHandler) {
elt = $(elt);
var triggerOrigin = elt;
@ -1628,9 +1756,9 @@ var Intercooler = Intercooler || (function() {
/* Instance Methods */
function historyConfigHasChanged(historySupportData) {
return historySupportData == null ||
historySupportData.slotLimit != slotLimit ||
historySupportData.historyVersion != historyVersion ||
historySupportData.lruList == null
historySupportData.slotLimit != slotLimit ||
historySupportData.historyVersion != historyVersion ||
historySupportData.lruList == null
}
function clearHistory() {
@ -1687,18 +1815,19 @@ var Intercooler = Intercooler || (function() {
storage.setItem(restorationData.id, content);
} catch (e) {
log(getTargetForHistory($('body')), "Unable to save intercooler history with entire history cleared, is something else eating " +
"local storage? History Limit:" + slotLimit, "ERROR");
"local storage? History Limit:" + slotLimit, "ERROR");
}
}
}
function makeHistoryEntry(html, yOffset, url) {
function makeHistoryEntry(html, yOffset, url, title) {
var restorationData = {
"url": url,
"id": HISTORY_SLOT_PREFIX + url,
"content": html,
"yOffset": yOffset,
"timestamp": new Date().getTime()
"timestamp": new Date().getTime(),
"title": title
};
updateLRUList(url);
// save to the history slot
@ -1724,18 +1853,18 @@ var Intercooler = Intercooler || (function() {
function updateHistory() {
if (_snapshot) {
pushUrl(_snapshot.newUrl, currentUrl(), _snapshot.oldHtml, _snapshot.yOffset);
pushUrl(_snapshot.newUrl, currentUrl(), _snapshot.oldHtml, _snapshot.yOffset, _snapshot.oldTitle);
_snapshot = null;
}
}
function pushUrl(newUrl, originalUrl, originalHtml, yOffset) {
function pushUrl(newUrl, originalUrl, originalHtml, yOffset, originalTitle) {
var historyEntry = makeHistoryEntry(originalHtml, yOffset, originalUrl);
var historyEntry = makeHistoryEntry(originalHtml, yOffset, originalUrl, originalTitle);
history.replaceState({"ic-id": historyEntry.id}, "", "");
var t = getTargetForHistory($('body'));
var restorationData = makeHistoryEntry(t.html(), window.pageYOffset, newUrl);
var restorationData = makeHistoryEntry(t.html(), window.pageYOffset, newUrl, document.title);
history.pushState({'ic-id': restorationData.id}, "", newUrl);
triggerEvent(t, "pushUrl.ic", [t, restorationData]);
@ -1748,7 +1877,12 @@ var Intercooler = Intercooler || (function() {
if (historyData) {
processICResponse(historyData["content"], getTargetForHistory($('body')), true);
if (historyData["yOffset"]) {
window.scrollTo(0, historyData["yOffset"])
setTimeout(function () {
window.scrollTo(0, historyData["yOffset"]);
}, 100);
}
if (historyData["title"]) {
document.title = historyData["title"];
}
return true;
} else {
@ -1771,13 +1905,14 @@ var Intercooler = Intercooler || (function() {
}
}
function snapshotForHistory(newUrl) {
function snapshotForHistory(newUrl, oldTitle) {
var t = getTargetForHistory($('body'));
triggerEvent(t, "beforeHistorySnapshot.ic", [t]);
_snapshot = {
newUrl: newUrl,
oldHtml: t.html(),
yOffset: window.pageYOffset
yOffset: window.pageYOffset,
oldTitle: oldTitle
};
}
@ -1897,12 +2032,11 @@ var Intercooler = Intercooler || (function() {
if($.zepto) {
$('body').data('zeptoDataTest', {});
if(typeof($('body').data('zeptoDataTest')) == "string") {
console.log("!!!! Please include the data module with Zepto! Intercooler requires full data support to function !!!!")
log(null,
"!!!! Please include the data module with Zepto! Intercooler requires full data support to function !!!!",
"ERROR")
}
}
if (location.search && location.search.indexOf("ic-launch-debugger=true") >= 0) {
Intercooler.debug();
}
}
$(function() {
@ -1922,27 +2056,22 @@ var Intercooler = Intercooler || (function() {
isDependent: isDependent,
getTarget: getTarget,
processHeaders: processHeaders,
startPolling: startPolling,
cancelPolling: cancelPolling,
setIsDependentFunction: function(func) {
_isDependentFunction = func;
},
ready: function(readyHandler) {
_readyHandlers.push(readyHandler);
},
debug: function() {
var debuggerUrl = closestAttrValue('body', 'ic-debugger-url') ||
"https://intercoolerreleases-leaddynocom.netdna-ssl.com/intercooler-debugger.js";
$.getScript(debuggerUrl)
.fail(function(jqxhr, settings, exception) {
log($('body'), formatError(exception), "ERROR");
});
},
_internal: {
init: init,
replaceOrAddMethod: replaceOrAddMethod,
initEventSource: function(url) {
return new EventSource(url);
initEventSource: function(url, withCredentials) {
return new EventSource(url, {withCredentials: withCredentials});
},
globalEval: globalEval
globalEval: globalEval,
getLocalURL: getLocalURL
}
};
})();

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,6 @@
/*
* Loading attribute polyfill - https://github.com/mfranzke/loading-attribute-polyfill
* @license Copyright(c) 2019 by Maximilian Franzke
* Credits for the initial kickstarter / script to @Sora2455, and supported by @diogoterremoto, @dracos and @Flimm - many thanks for that !
*/
!function(e,t){"use strict";var r,a,o={rootMargin:"256px 0px",threshold:.01,lazyImage:'img[loading="lazy"]',lazyIframe:'iframe[loading="lazy"]'},n={loading:"loading"in HTMLImageElement.prototype&&"loading"in HTMLIFrameElement.prototype,scrolling:"onscroll"in window};"undefined"!=typeof NodeList&&NodeList.prototype&&!NodeList.prototype.forEach&&(NodeList.prototype.forEach=Array.prototype.forEach),"IntersectionObserver"in window&&(r=new IntersectionObserver(function(e,t){e.forEach(function(e){if(0!==e.intersectionRatio){var r=e.target;t.unobserve(r),c(r)}})},o)),a="requestAnimationFrame"in window?window.requestAnimationFrame:function(e){e()};var i="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";function c(e){var t,r,a=[];"picture"===e.parentNode.tagName.toLowerCase()&&(t=e.parentNode,(r=t.querySelector("source[data-lazy-remove]"))&&t.removeChild(r),a=Array.prototype.slice.call(e.parentNode.querySelectorAll("source"))),a.push(e),a.forEach(function(e){e.dataset.lazySrcset&&(e.setAttribute("srcset",e.dataset.lazySrcset),delete e.dataset.lazySrcset)}),e.setAttribute("src",e.dataset.lazySrc),delete e.dataset.lazySrc}function d(e){var t=document.createElement("div");for(t.innerHTML=function(e){var t=e.textContent||e.innerHTML;return!n.loading&&n.scrolling&&(void 0===r?t=t.replace(/(?:\r\n|\r|\n|\t| )src=/g,' lazyload="1" src='):("picture"===e.parentNode.tagName.toLowerCase()&&(t='<source srcset="'+i+'" data-lazy-remove="true"></source>'+t),t=t.replace(/(?:\r\n|\r|\n|\t| )srcset=/g," data-lazy-srcset=").replace(/(?:\r\n|\r|\n|\t| )src=/g,' src="'+i+'" data-lazy-src='))),t}(e);t.firstChild;)n.loading||!n.scrolling||void 0===r||!t.firstChild.tagName||"img"!==t.firstChild.tagName.toLowerCase()&&"iframe"!==t.firstChild.tagName.toLowerCase()||r.observe(t.firstChild),e.parentNode.insertBefore(t.firstChild,e);e.parentNode.removeChild(e)}function s(){document.querySelectorAll("noscript."+e).forEach(d),window.matchMedia("print").addListener(function(e){e.matches&&document.querySelectorAll(o.lazyImage+"[data-lazy-src],"+o.lazyIframe+"[data-lazy-src]").forEach(function(e){c(e)})})}/comp|inter/.test(document.readyState)?a(s):"addEventListener"in document?document.addEventListener("DOMContentLoaded",function(){a(s)}):document.attachEvent("onreadystatechange",function(){"complete"===document.readyState&&s()})}("loading-lazy");

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -2,7 +2,7 @@
"lang" : "en",
"name" : "brutaldon",
"scope" : "/",
"display" : "browser",
"display" : "minimal-ui",
"start_url" : "/",
"short_name" : "brutaldon",
"theme_color" : "#CCCCCC",

View File

@ -0,0 +1,18 @@
<article class="media box">
<figure class="media-left">
<p class="image is-64x64">
<img src="{{ account.user.avatar_static }}"
alt="{{ account.user.acct }}">
</p>
</figure>
<div class="media-content">
<strong>{{ account.user.display_name }}</strong> ({{ account.user.username }})
</div>
<div class="media-right">
<form method="POST" action="{% url "accounts" account.account_id %}">
{% csrf_token %}
<button class="button" name="activate" value="1">Activate</button>
<button class="button" name="forget" value="1">Forget</button>
</form>
</div>
</article>

View File

@ -0,0 +1,29 @@
{% extends "base.html" %}
{% load widget_tweaks %}
{% block content %}
<div class="container">
<h1 class="title">Signed-in accounts</h1>
{% if not accounts %}
<p>No accounts.</p>
{% endif %}
{% for account in accounts %}
{% include "accounts/account_partial.html" %}
{% endfor %}
<p>
Or <a href="{% url "login" %}">log in</a> to another account to
add it to the list.
</p>
<p>
Or <a href="{% url "logout" %}">log out</a> of <em>all</em>
accounts.
</p>
</div>
{% endblock %}

View File

@ -31,6 +31,8 @@
<link rel="stylesheet"
href="{% static preferences.theme.main_css %}">
<link rel="stylesheet" href="{% static preferences.theme.tweaks_css %}">
<link rel="stylesheet"
href="{% static 'css/magnific-popup.css' %}">
{% if not preferences.theme.is_brutalist %}
<link rel="stylesheet"
href="{% static 'css/fork-awesome.min.css' %}">
@ -38,14 +40,13 @@
href="{% static 'css/bulma-badge.min.css' %}">
<link rel="stylesheet"
href="{% static 'css/bulma-tooltip.min.css' %}">
<link rel="stylesheet"
href="{% static 'css/magnific-popup.css' %}">
{% endif %}
{% if not preferences.no_javascript %}
<script type="text/javascript" src="{% static 'js/jquery.min.js' %}"></script>
<script type="text/javascript" src="{% static 'js/intercooler.js' %}"></script>
<script type="application/javascript" src="{% static 'js/mousetrap.min.js' %}"></script>
<script type="text/javascript" src="{% static 'js/jquery.magnific-popup.min.js' %}"></script>
<script type="text/javascript" src="{% static 'js/loading-attribute-polyfill.min.js' %}"></script>
<script type="text/javascript" src="{% static 'js/brutaldon-enhancements.js' %}"></script>
{% block page_scripts %}
{% endblock %}
@ -80,87 +81,82 @@
<div class="navbar-brand">
<a class="navbar-item" href="{% url "home" %}">
{% if own_acct %}
<img src="{{ own_acct.avatar_static }}"
class="image is-32x32 avatar"
alt="Brutaldon ('{{ own_acct.username }}')">
<img src="{{ own_acct.avatar_static }}"
class="image is-32x32 avatar"
alt="Brutaldon ('{{ own_acct.username }}')">
{% else %}
<img src="{% static "images/brutaldon.png" %}"
class="image is-32x32" alt="Brutaldon">
<img loading="lazy" src="{% static "images/brutaldon.png" %}"
class="image is-32x32" alt="Brutaldon">
{% endif %}
</a>
</div>
{% if request.session.instance %}
{% if request.session.username or request.session.access_token %}
<div class="navbar-menu is-active" id="navMenu">
<!-- navbar start, navbar end -->
<div class="navbar-start">
<a href="{% url "home" %}" class="navbar-item">
<span class="fa fa-home"></span>
<span>Home</span>
</a>
<a class="navbar-item" href="{% url "note" %}">
<span class="fa fa-bell-o"></span>
{% if preferences.notifications and not preferences.theme.is_brutalist %}
<span ic-src="{% url 'notes_count' %}"
ic-poll="{{ preferences.poll_frequency }}s"
ic-target="this"
ic-select-from-response="#notes-count">
<span
{% if notifications and notifications != '0' %}
class="badge"
{% endif %}
data-badge="{{ notifications }}">
Notifications</span>
</span>
{% elif notifications and preferences.notifications %}
<span ic-src="{% url 'notes_count' %}"
ic-poll="{{ preferences.poll_frequency }}s"
ic-target="this"
ic-select-from-response="#notes-count">
<span >Notifications ({{ notifications }})</span>
</span>
{% else %}
<span >Notifications</span>
{% endif %}
</a>
<a class="navbar-item" href="{% url "local" %}">
<span class="fa fa-community"></span>
<span >Local</span>
</a>
<a class="navbar-item" href="{% url "fed" %}">
<span class="fa fa-globe"></span>
<span >Federated</span>
</a>
<a class="navbar-item" href="{% url "toot" %}"
ic-get-from="{% url "toot" %}"
ic-target="#new-toot-modal"
ic-on-complete="$('#new-toot-modal').toggleClass('is-active');">
<span class="fa fa-edit"> </span>
<span >New Toot</span>
</a>
<a class="navbar-item" href="{% url "search" %}"
ic-get-from="{% url "search" %}"
ic-target="#new-toot-modal"
ic-on-complete="$('#new-toot-modal').toggleClass('is-active');">
<span class="fa fa-search"> </span>
<span >Search</span>
</a>
</div>
<div class="navbar-end" >
<a class="navbar-item" href="{% url "settings" %}">
<span class="fa fa-gear"></span>
<span >Settings</span>
</a>
<a class="navbar-item" href="{% url "logout" %}"
ic-get-from="{% url "logout" %}"
ic-target="body"
ic-confirm="Are you sure you want to log out?">
<span class="fa fa-power-off"></span>
<span >Log out</span>
</a>
</div>
{% if request.session.active_instance and request.session.active_username %}
<div class="navbar-menu is-active" id="navMenu">
<!-- navbar start, navbar end -->
<div class="navbar-start">
<a href="{% url "home" %}" class="navbar-item">
<span class="fa fa-home"></span>
<span>Home</span>
</a>
<a class="navbar-item" href="{% url "note" %}">
<span class="fa fa-bell"></span>
{% if preferences.notifications and not preferences.theme.is_brutalist %}
<span ic-src="{% url 'notes_count' %}"
ic-poll="{{ preferences.poll_frequency }}s"
ic-target="this"
ic-select-from-response="#notes-count">
<span
{% if notifications and notifications != '0' %}
class="badge"
{% endif %}
data-badge="{{ notifications }}">
Notifications</span>
</span>
{% elif notifications and preferences.notifications %}
<span ic-src="{% url 'notes_count' %}"
ic-poll="{{ preferences.poll_frequency }}s"
ic-target="this"
ic-select-from-response="#notes-count">
<span >Notifications ({{ notifications }})</span>
</span>
{% else %}
<span >Notifications</span>
{% endif %}
</a>
<a class="navbar-item" href="{% url "local" %}">
<span class="fa fa-community"></span>
<span >Local</span>
</a>
<a class="navbar-item" href="{% url "fed" %}">
<span class="fa fa-globe"></span>
<span >Federated</span>
</a>
<a class="navbar-item" href="{% url "toot" %}"
ic-get-from="{% url "toot" %}"
ic-target="#new-toot-modal"
ic-on-complete="$('#new-toot-modal').toggleClass('is-active');">
<span class="fa fa-edit"> </span>
<span >New Toot</span>
</a>
<a class="navbar-item" href="{% url "search" %}"
ic-get-from="{% url "search" %}"
ic-target="#new-toot-modal"
ic-on-complete="$('#new-toot-modal').toggleClass('is-active');">
<span class="fa fa-search"> </span>
<span >Search</span>
</a>
</div>
{% endif %}
<div class="navbar-end" >
<a class="navbar-item" href="{% url "settings" %}">
<span class="fa fa-gear"></span>
<span >Settings</span>
</a>
<a class="navbar-item" href="{% url "accounts" %}">
<span class="fa fa-id-card-o"> </span>
<span >Accounts</span>
</a>
</div>
</div>
{% endif %}
</nav>
{% endblock %}
@ -187,13 +183,16 @@
<a class="level-item is-size-7" href="https://github.com/jfmcbrayer/brutaldon">
Source
</a>
<span class="level-item is-size-7" >Bookmarklet: <a href="{{ bookmarklet_url }}">Share via brutaldon</a></span>
</div>
<div class="level-right">
{% if preferences.theme.is_brutalist %}
<img class="level-item" src="{% static '/images/lynx.gif' %}"
<noscript class="loading-lazy">
<img loading="lazy" class="level-item" src="{% static '/images/lynx.gif' %}"
alt="Lynx Now!">
<img class="level-item" src="{% static '/images/now9.gif' %}"
<img loading="lazy" class="level-item" src="{% static '/images/now9.gif' %}"
alt="Netscape Now!">
</noscript>
{% endif %}
<a class="level-item is-size-7" href="{% url "privacy" %}">
Privacy

View File

@ -0,0 +1,5 @@
{% if not forloop.first %}
{% if forloop.last %}, and
{% else %},
{% endif %}
{% endif %}

View File

@ -12,7 +12,7 @@
<th>Filter contexts</th>
<th></th>
<th></th>
<th></th>
<th class="empty-cell"></th>
</thead>
<tbody>
{% for filter in filters %}
@ -39,7 +39,7 @@
<span class="fa fa-times"></span>
Delete filter
</td>
<td>
<td class="empty-cell">
<i id="filter-spinner-{{filter.id}}"
class="fa fa-spinner fa-spin"
style="display:none"></i>

View File

@ -3,7 +3,7 @@
{% block pagination %}
<nav class="pagination is-centered" role="navigation" aria-label="pagination">
{% if prev %}
<a class="pagination-next" href="{% url 'local_prev' prev.since_id %}">Newer</a>
<a class="pagination-next" href="{% url 'local_prev' prev.min_id %}">Newer</a>
{% endif %}
{% if next %}
<a class="pagination-previous" href="{% url 'local_next' next.max_id %}">Older</a>

View File

@ -1,9 +1,10 @@
{% extends "base.html" %}
{% load humanetime %}
{% load taglinks %}
{% load sanitizer %}
{% block title %}
Brutaldon ({{ own_acct.username }}) - Notifications timelime
Brutaldon ({{ own_acct.username }}) - Notifications timelime
{% endblock %}
{% comment %}
@ -21,69 +22,99 @@ mastodon.notifications()[0]
{% block content %}
<h1 class="title">Your notifications timeline</h1>
{% for note in notes %}
{% if note.type == 'mention' %}
<p>
<strong>{{ note.account.display_name }}</strong>
(<a href="{{ note.account.url | localuser }}">{{ note.account.acct }}</a>)
mentioned you.
</p>
<br>
{% include "main/toot_partial.html" with toot=note.status reblog=False %}
<hr class="is-hidden">
{% elif note.type == 'reblog' %}
<p>
{{ note.account.display_name }}
(<a href="{{ note.account.url | localuser }}">{{ note.account.acct }}</a>)
boosted your toot.
(<span>
<small>{{ note.created_at |humane_time }}</small>
</span>)
</p>
{% include "main/toot_partial.html" with toot=note.status reblog=True reblog_by=note.account.acct reblog_icon=note.account.avatar_static %}
<hr class="is-hidden">
{% elif note.type == 'favourite' %}
<p>
{{ note.account.display_name }}
(<a href="{{ note.account.url | localuser}}">{{ note.account.acct }}</a>)
favorited your toot.
(<span>
<small>{{ note.created_at |humane_time }}</small>
</span>)
</p>
{% include "main/toot_partial.html" with toot=note.status %}
<hr class="is-hidden">
{% elif note.type == 'follow' %}
<article class="media">
<figure class="media-left">
<p class="image is-64x64">
<img src="{{ note.account.avatar_static }}" alt="">
</p>
</figure>
<div class="media-content" >
<div class="content">
<strong>{{ note.account.display_name }}</strong>
(<a href="{{ note.account.url |localuser }}">{{ note.account.acct }}</a>)
followed you.
(<a href="{{ note.url }}">
<small>{{ note.created_at |humane_time }}</small>
</a>)
</div>
</div>
</article>
<hr class="is-hidden">
{% endif %}
{% endfor %}
<h1 class="title">Your notifications timeline</h1>
{% for group in groups %}
{% if bundle_notifications and group.0.type in bundleable %}
{% if group.0.type == 'favourite' %}
<p>
{% for account in group.accounts %}
{% include "comma.html" %}{{ account.display_name | fix_emojos:account.emojis |strip_html |safe }}
(<a href="{{ account.url | localuser}}">{{ account.acct }}</a>)
{% endfor %}
favorited your toot.
</p>
{% include "main/toot_partial.html" with toot=group.0.status %}
<hr class="is-hidden">
{% elif group.0.type == 'reblog' %}
<p>
{% for account in group.accounts %}
{% include "comma.html" %}{{ account.display_name | fix_emojos:account.emojis |strip_html |safe }}
(<a href="{{ account.url | localuser }}">{{ account.acct }}</a>)
{% endfor %}
boosted your toot.
</p>
{% include "main/toot_partial.html" with toot=group.0.status reblog=True reblog_by=group.0.account.acct reblog_icon=group.0.account.avatar_static %}
<hr class="is-hidden">
{% endif %}
{% else %}
{% for note in group %}
{% if note.type == 'mention' %}
<p>
<strong>{{ note.account.display_name | fix_emojos:note.account.emojis |strip_html |safe }}</strong>
(<a href="{{ note.account.url | localuser }}">{{ note.account.acct }}</a>)
mentioned you.
</p>
<br>
{% include "main/toot_partial.html" with toot=note.status reblog=False %}
<hr class="is-hidden">
{% elif note.type == 'reblog' %}
<p>
{{ note.account.display_name | fix_emojos:note.account.emojis |strip_html |safe }}
(<a href="{{ note.account.url | localuser }}">{{ note.account.acct }}</a>)
boosted your toot.
(<span>
<small>{{ note.created_at |humane_time }}</small>
</span>)
</p>
{% include "main/toot_partial.html" with toot=note.status reblog=True reblog_by=note.account.acct reblog_icon=note.account.avatar_static %}
<hr class="is-hidden">
{% elif note.type == 'favourite' %}
<p>
{{ note.account.display_name | fix_emojos:note.account.emojis |strip_html |safe }}
(<a href="{{ note.account.url | localuser}}">{{ note.account.acct }}</a>)
favorited your toot.
(<span>
<small>{{ note.created_at |humane_time }}</small>
</span>)
</p>
{% include "main/toot_partial.html" with toot=note.status %}
<hr class="is-hidden">
{% elif note.type == 'follow' %}
<article class="media">
<figure class="media-left">
<p class="image is-64x64">
<img src="{{ note.account.avatar_static }}" alt="">
</p>
</figure>
<div class="media-content" >
<div class="content">
<strong>{{ note.account.display_name | fix_emojos:note.account.emojis |strip_html |safe }}</strong>
(<a href="{{ note.account.url |localuser }}">{{ note.account.acct }}</a>)
followed you.
(<a href="{{ note.url }}">
<small>{{ note.created_at |humane_time }}</small>
</a>)
</div>
</div>
</article>
<hr class="is-hidden">
{% elif note.type == 'poll' %}
<p>A poll you created or voted in has ended.</p>
{% include "main/toot_partial.html" with toot=note.status %}
<hr class="is-hidden">
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
<nav class="pagination is-centered" role="navigation" aria-label="pagination">
{% if prev %}
<a class="pagination-next" href="{% url 'note_prev' prev.since_id %}">Newer</a>
{% endif %}
{% if next %}
<a class="pagination-previous" href="{% url 'note_next' next.max_id %}">Older</a>
{% endif %}
</nav>
<nav class="pagination is-centered" role="navigation" aria-label="pagination">
{% if prev %}
<a class="pagination-next" href="{% url 'note_prev' prev.min_id %}">Newer</a>
{% endif %}
{% if next %}
<a class="pagination-previous" href="{% url 'note_next' next.max_id %}">Older</a>
{% endif %}
</nav>
{% endblock %}

View File

@ -29,7 +29,9 @@
<div class="field has-addons">
<div class="control level is-mobile">
<img class="image avatar is-48x48 level-item" src="{{ own_acct.avatar_static }}" alt="">
<a href="{% url "user" own_acct.acct %}" class="image avatar is-48x48 level-item">
<img src="{{ own_acct.avatar_static }}" alt="[{{ own_acct.acct }}]">
</a>
<input type="submit" class="button is-primary level-item"
name="toot" value="Toot">
<a href="{% url "emoji" %}" target="_blank" rel="noopener noreferrer"

View File

@ -124,8 +124,9 @@
<div class="field has-addons">
<div class="control level is-mobile">
<img class="image avatar is-48x48 level-item" src="{{ own_acct.avatar_static }}"
alt="">
<a href="{% url "user" own_acct.acct %}" class="image avatar is-48x48 level-item" >
<img src="{{ own_acct.avatar_static }}" alt="[{{ own_acct.acct }}]">
</a>
<input type="submit" class="button is-primary level-item"
name="toot" value="Toot">
<a href="{% url "emoji" %}" target="_blank" rel="noopener noreferrer"

View File

@ -3,7 +3,7 @@
{% block pagination %}
<nav class="pagination is-centered" role="navigation" aria-label="pagination">
{% if prev %}
<a class="pagination-next" href="{% url 'fed_prev' prev.since_id %}">Newer</a>
<a class="pagination-next" href="{% url 'fed_prev' prev.min_id %}">Newer</a>
{% endif %}
{% if next %}
<a class="pagination-previous" href="{% url 'fed_next' next.max_id %}">Older</a>

View File

@ -75,7 +75,7 @@ mastodon.search("<query>")
<h2 class="subtitle">Tags</h2>
<ul>
{% for tag in results.hashtags %}
<li><a href="{% url 'tag' tag %}">#{{ tag }}</a></li>
<li><a href="{% url 'tag' tag.name %}">#{{ tag.name }}</a></li>
{% endfor %}
</ul>

View File

@ -18,21 +18,19 @@ mastodon.status_context(<numerical id>)
<h1 id="title" class="title">
Thread
</h1>
{% for ancestor in ancestors %}
{% include "main/toot_partial.html" with toot=ancestor %}
<hr class="is-hidden">
{% endfor %}
{% include "main/toot_partial.html" with toot=toot active=True %}
<hr class="is-hidden">
{% include "main/toot_partial.html" with toot=root %}
{% for descendant in descendants %}
{% include "main/toot_partial.html" with toot=descendant %}
<hr class="is-hidden">
{% if descendant == toot %}
{% include "main/toot_partial.html" with toot=toot active=True %}
{% else %}
{% include "main/toot_partial.html" with toot=descendant %}
{% endif %}
<hr class="is-hidden">
{% endfor %}
{% if not preferences.no_javascript %}
<script type="application/javascript">
Intercooler.ready(expandCWButtonPrepare);
Intercooler.ready(expandCWButtonPrepare);
</script>
{% endif %}
{% endblock %}

View File

@ -38,8 +38,7 @@
<div class="around-pagination">
<div class="columns">
{% if next %}
<p class="column is-one-quarter"></p>
<p class="column">
<p class="column is-one-quarter">
<a class="pagination-previous is-fullwidth button"
href="{% url 'home_next' next.max_id %}"
{% if preferences.click_to_load %}
@ -53,8 +52,16 @@
Older
</a>
</p>
<p class="column is-one-quarter"></p>
{% endif %}
<p class="column is-one-half"></p>
{% endif %}
{% if prev %}
<p class="column is-one-quarter">
<a class="pagination-next is-fullwidth button"
href="{% url 'home_prev' prev.min_id %}">
Newer
</a>
</p>
{% endif %}
</div>
</div>
{% endblock %}

View File

@ -4,92 +4,107 @@
{% load taglinks %}
{% load static %}
{% if toot %}
{% if active %}
<article id="toot-{{toot.id}}" class="media box active-context">
{% else %}
<article id="toot-{{toot.id}}" class="media box">
{% endif %}
<article id="toot-{{toot.id}}" class="media box active-context">
{% else %}
<article id="toot-{{toot.id}}" class="media box">
{% endif %}
<figure class="media-left">
<p class="image is-64x64 account-avatar">
<a href="{% url "user" toot.account.acct %}">
<img src="{{ toot.account.avatar_static }}"
alt="">
</a>
</p>
<figure class="media-left">
<p class="image is-64x64 account-avatar">
<a href="{% url "user" toot.account.acct %}">
<img loading="auto" src="{{ toot.account.avatar_static }}"
alt="">
</a>
</p>
{% if reblog %}
<p class="image is-32x32 reblog-icon" >
<a href="{% url "user" reblog_by %}">
<img loading="auto" src ="{{ reblog_icon }}" alt="">
</a>
</p>
{% endif %}
</figure>
<div class="media-content">
<div class="content">
<p>
<strong>{{ toot.account.display_name | fix_emojos:toot.account.emojis | strip_html |safe}}</strong>
<small><a href="{% url "user" toot.account.acct %}">
@{{ toot.account.acct }}</a></small>
<a href="{{ toot.url }}">
<small>{{ toot.created_at |humane_time }}</small>
</a>
{% if reblog %}
<p class="image is-32x32 reblog-icon" >
<a href="{% url "user" reblog_by %}">
<img src ="{{ reblog_icon }}" alt="">
</a>
</p>
<br>
Boosted by @{{ reblog_by }}
{% endif %}
</figure>
<div class="media-content">
<div class="content">
<p>
<strong>{{ toot.account.display_name }}</strong>
<small><a href="{% url "user" toot.account.acct %}">@{{ toot.account.acct }}</a></small>
<a href="{{ toot.url }}">
<small>{{ toot.created_at |humane_time }}</small>
</a>
{% if reblog %}
<br>
Boosted by @{{ reblog_by }}
{% endif %}
</p>
{% if toot.spoiler_text %}
<details class="toot">
<summary><strong>{{ toot.spoiler_text }} </strong></summary>
<div class="toot">
{{ toot.content | relink_toot | fix_emojos:toot.emojis | strip_html | safe }}
</div>
</details>
{% else %}
</p>
{% if toot.spoiler_text %}
<details class="toot">
<summary><strong>{{ toot.spoiler_text }} </strong></summary>
<div class="toot">
{{ toot.content | relink_toot | fix_emojos:toot.emojis | strip_html | safe }}
</div>
</details>
{% else %}
<div class="toot">
{{ toot.content | relink_toot | fix_emojos:toot.emojis | strip_html | safe }}
</div>
{% endif %}
{% if toot.poll %}
<div class="poll">
{% if toot.poll.voted or toot.poll.expired %}
{% include "polls/completed_partial.html" with toot=toot %}
{% else %}
<!-- Poll form -->
{% include "polls/new_partial.html" with toot=toot %}
{% endif %}
</div>
{% endif %}
{% if toot.card %}
<div class="card">
<div class="card-header">
<div class="card-header-title">
<a href="{{ toot.card.url }}"> {{ toot.card.title }} </a>
</div>
{% if toot.card %}
<div class="card">
<div class="card-content columns">
{% if toot.card.image %}
<div class="column is-one-third">
<a href="{{ toot.card.url }}">
<noscript class="loading-lazy">
<img loading="lazy" alt="{{ toot.card.title }}"
src="{{ toot.card.image }}"
class="is-max-128">
</noscript>
</a>
</div>
{% if toot.card.description %}
<div class="card-content columns">
{% if toot.card.image %}
<div class="column is-one-third">
<figure>
<a href="{{ toot.card.url }}">
<img alt="{{ toot.card.title }}"
src="{{ toot.card.image }}">
</a>
</figure>
</div>
{% endif %}
<div class="column is-two-thirds">
<p>{{ toot.card.description }}</p>
</div>
</div>
{% endif %}
{% endif %}
<div class="column is-two-thirds">
<p>
<strong>
<a href="{{ toot.card.url }}">
{{ toot.card.title }}
</a>
</strong>
<p>{{ toot.card.description |truncatechars_html:500}}</p>
</div>
{% endif %}
</div>
</div>
{% endif %}
{% if toot.media_attachments %}
<br>
<div class="level attachments">
{% for media in toot.media_attachments %}
{% if toot.media_attachments %}
<br>
<div class="columns is-multiline attachments is-gapless">
{% for media in toot.media_attachments %}
{% if media.type == "image" %}
<figure class="level-item attachment-image">
<figure class="column attachment-image">
<a href="{{ media.url }}">
{% if toot.sensitive %}
<img src="{% static "images/sensitive.png" %}"
<noscript class="loading-lazy">
{% if toot.sensitive and not preferences.preview_sensitive %}
<img loading="lazy" src="{% static "images/sensitive.png" %}"
{% else %}
<img src="{{ media.preview_url }}"
<img loading="lazy" src="{{ media.preview_url }}"
{% endif %}
alt="{% if media.description %}
{{ media.description }}
@ -102,18 +117,20 @@
title="{{ media.description }}"
{% endif %}
class="image is-max-256">
</noscript>
</a>
</figure>
{% else %}
<figure class="level-item is-max-256">
<video controls loop
<figure class="column">
<video controls loop class="is-max-256"
poster="{{ media.preview_url }}">
<source src="{{ media.url }}" type="video/mp4">
<a href="{{ media.url }}">
{% if toot.sensitive %}
<img src="{% static "images/sensitive.png" %}"
<noscript class="loading-lazy">
{% if toot.sensitive and not preferences.preview_sensitive %}
<img loading="lazy" src="{% static "images/sensitive.png" %}"
{% else %}
<img src="{{ media.preview_url }}"
<img loading="lazy" src="{{ media.preview_url }}"
{% endif %}
alt="{% if media.description %}
{{ media.description }}
@ -126,70 +143,66 @@
title="{{ media.description }}"
{% endif %}
class="image is-max-256">
</noscript>
</a>
</video>
</figure>
{% endif %}
{% endfor %}
</div>
{% endif %}
<br>
<p class="is-hidden"></p>
{% endfor %}
</div>
{% if not confirm_page %}
<nav class="level is-mobile">
<div class="level-left">
<a href="{% url "reply" toot.id %}#toot-{{ toot.id }}" class="level-item">
{% if toot.replies_count > 0 %}
<span class="fa fa-reply-all">
<span class="is-hidden-mobile"><strong>Reply</strong></span>
</span>
{% else %}
<span class="fa fa-reply">
<span class="is-hidden-mobile">Reply</span>
</span>
{% endif %}
</a>
{% if toot.visibility != 'private' and toot.visibility != 'direct' %}
{% endif %}
<br>
<p class="is-hidden"></p>
</div>
{% if not confirm_page %}
<nav class="level is-mobile">
<div class="level-left">
<a href="{% url "reply" toot.id %}#toot-{{ toot.id }}" class="level-item">
{% if toot.replies_count > 0 %}
<span class="fa fa-reply-all">
<span class="is-hidden-mobile"><strong>Reply</strong></span>
</span>
{% else %}
<span class="fa fa-reply">
<span class="is-hidden-mobile">Reply</span>
</span>
{% endif %}
</a>
{% if toot.visibility != 'private' and toot.visibility != 'direct' %}
<a href="{% url "boost" toot.id %}" class="level-item"
ic-post-to="{% url "boost" toot.id %}"
ic-indicator="#toot-spinner-{{toot.id}}">
{% if toot.reblogged %}
<span class="fa fa-retweet has-text-warning">
<strong class="is-hidden-mobile" >Boosted</strong>
{% else %}
<span class="fa fa-retweet" >
<span class="is-hidden-mobile" >Boost</span>
{% endif %}
<span class="fa fa-retweet has-text-warning">
<strong class="is-hidden-mobile" >Boosted</strong>
{% else %}
<span class="fa fa-retweet" >
<span class="is-hidden-mobile" >Boost</span>
{% endif %}
</span>
</span>
</span>
</a>
{% endif %}
<a href="{% url "fav" toot.id %}" class="level-item"
ic-post-to="{% url "fav" toot.id %}"
ic-indicator="#toot-spinner-{{toot.id}}">
{% if toot.favourited %}
{% endif %}
<a href="{% url "fav" toot.id %}" class="level-item"
ic-post-to="{% url "fav" toot.id %}"
ic-indicator="#toot-spinner-{{toot.id}}">
{% if toot.favourited %}
<span class="fa fa-heart has-text-warning">
<strong class="is-hidden-mobile" >Favorited</strong>
{% else %}
{% else %}
<span class="fa fa-heart">
<span class="is-hidden-mobile" >Favorite</span>
{% endif %}
{% endif %}
</span>
</span>
</a>
<i id="toot-spinner-{{toot.id}}" class="fa fa-spinner fa-spin" style="display:none"></i>
</div>
<div class="level-right">
{% if toot.account.acct == own_acct.acct %}
<a class="level-item" href="{% url "redraft" toot.id %}"
ic-get-from="{% url "redraft" toot.id %}"
ic-indicator="#page-load-indicator"
ic-target="#main"
ic-select-from-response="#main"
ic-push-url="true">
</a>
<i id="toot-spinner-{{toot.id}}" class="fa fa-spinner fa-spin" style="display:none"></i>
</div>
<div class="level-right">
{% if toot.account.acct == own_acct.acct %}
<a class="level-item" href="{% url "redraft" toot.id %}">
redraft
</a>
<a class="level-item" href="{% url "delete" toot.id %}"
@ -200,22 +213,24 @@
ic-action-target="#toot-{{ toot.id }}">
delete
</a>
{% endif %}
{{ toot.visibility }}
&nbsp;&nbsp;
{% if toot.in_reply_to_id or toot.replies_count > 0 %}
<a class="level-item" href="{% url "thread" toot.id %}#toot-{{ toot.id }}">
<strong>thread</strong>
{% endif %}
{{ toot.visibility }}
&nbsp;&nbsp;
{% if toot.in_reply_to_id or toot.replies_count > 0 %}
<a class="level-item" href="{% url "thread" toot.id %}#toot-{{ toot.id }}">
<span class="fa fa-comments"></span>
<strong> thread</strong>
</a>
{% else %}
{% else %}
<a class="level-item" href="{% url "thread" toot.id %}#toot-{{ toot.id }}">
thread
</a>
{% endif %}
</div>
</nav>
{% endif %}
{% endif %}
</div>
</nav>
{% endif %}
</div>
<div class="media-right"></div>
</article>
</div>
<div class="media-right"></div>
</article>
{% endif %}

View File

@ -120,7 +120,7 @@ Brutaldon ({{ own_acct.username }}) - {{ user.acct }} timelime
{% endfor %}
<nav class="pagination is-centered" role="navigation" aria-label="pagination">
{% if prev %}
<a class="pagination-next" href="{% url 'user_prev' user.acct prev.since_id %}">Newer</a>
<a class="pagination-next" href="{% url 'user_prev' user.acct prev.min_id %}">Newer</a>
{% endif %}
{% if next %}
<a class="pagination-previous" href="{% url 'user_next' user.acct next.max_id %}">Older</a>

View File

@ -0,0 +1,19 @@
{% load sanitizer %}
{% load taglinks %}
{% load static %}
<div class="columns is-multiline">
{% for option in toot.poll.options %}
<div class="column is-one-quarter">
<strong>{{ option.title }}</strong>
({{ option.votes_count}} vote{{ option.votes_count|pluralize }})
</div>
<div class="column is-three-quarters">
<progress class="progress is-primary"
value="{{ option.votes_count }}"
max="{{ toot.poll.votes_count }}"
{{ option.votes_count }}
</progress>
</div>
{% endfor %}
</div>

View File

@ -0,0 +1,34 @@
{% load sanitizer %}
{% load taglinks %}
{% load static %}
<form method="POST" action="{% url "vote" toot.id %}"
ic-post-to="{% url "vote" toot.id %}"
ic-target="closest article"
ic-indicator="#poll-spinner-{{ toot.id }}"
ic-replace-target="true">
{% csrf_token %}
{% for option in toot.poll.options %}
<div class="field">
{% if toot.poll.multiple %}
<label class="checkbox">
<input type="checkbox"
name="poll-multiple"
value="{{ forloop.counter0 }}">
{{ option.title }}
</label>
{% else %}
<label class="radio">
<input type="radio"
name="poll-single"
value="{{ forloop.counter0 }}">
{{ option.title }}
</label>
{% endif %}
</div>
{% endfor %}
<input type="submit" class="button is-primary" name="Vote" value="Vote">
<span id="poll-spinner-{{toot.id}}" class="fa fa-spinner fa-spin"
style="display:none"></span>
</form>

View File

@ -0,0 +1,19 @@
{% extends "base.html" %}
{% load widget_tweaks %}
{% block content %}
<div class="container">
<h1 class="title">Follow requests</h1>
{% if not requests %}
<p>No follow requests.</p>
{% endif %}
{% for request in requests %}
{% include "requests/request_partial.html" %}
{% endfor %}
</div>
{% endblock %}

View File

@ -0,0 +1,21 @@
<article class="media box">
<figure class="media-left">
<p class="image is-64x64">
<img src="{{ request.avatar_static }}"
alt="{{ request.acct }}">
</p>
</figure>
<div class="media-content">
<strong>{{ request.display_name }}</strong> ({{ request.acct }})
</div>
<div class="media-right">
<form method="POST" action="{% url "follow_requests" request.id %}">
{% csrf_token %}
<button name="accept" class="button is-success" value="Accept">
Accept
</button>
<button name="reject" class="button is-danger" value="Reject">
Reject
</button>
</form>
</div>

View File

@ -2,155 +2,197 @@
{% load widget_tweaks %}
{% block content %}
<div class="container">
<h1 class="title">Settings</h1>
<form method="post" action="{% url "settings" %}" >
{% csrf_token %}
<div class="container">
<h1 class="title">Settings</h1>
<form method="post" action="{% url "settings" %}" >
{% csrf_token %}
<h2 class="subtitle">General Options</h2>
<div class="field">
<label class="label" for="id_theme">{{ form.theme.label }}</label>
<div class="control has-icons-left">
<div class="select">
{% render_field form.theme class+="select" %}
<span class="icon is-small is-left">
<span class="fa fa-paint-brush"></span>
</div>
<h2 class="subtitle">General Options</h2>
<div class="field">
<label class="label" for="id_theme">{{ form.theme.label }}</label>
<div class="control has-icons-left">
<div class="select">
{% render_field form.theme class+="select" %}
<span class="icon is-small is-left">
<span class="fa fa-paint-brush"></span>
</div>
</div>
</div>
<div class="field">
<label class="label" for="id_timezone">{{ form.timezone.label }}</label>
<div class="control has-icons-left">
<div class="select">
{% render_field form.timezone class+="select" %}
<span class="icon is-small is-left">
<span class="fa fa-clock-o"></span>
</div>
<div class="field">
<label class="label" for="id_timezone">{{ form.timezone.label }}</label>
<div class="control has-icons-left">
<div class="select">
{% render_field form.timezone class+="select" %}
<span class="icon is-small is-left">
<span class="fa fa-clock-o"></span>
</div>
</div>
</div>
<h2 class="subtitle">Timeline Options</h2>
<div class="field">
<label class="label checkbox">
{% render_field form.filter_replies %}
{{ form.filter_replies.label }}
<h2 class="subtitle">Content Options</h2>
<div class="columns">
<div class="column is-quarter">
<label class="label checkbox" for="id_preview_sensitive">
{% render_field form.preview_sensitive class+="checkbox" %}
{{ form.preview_sensitive.label }}
</label>
</div>
<div class="field">
<label class="label checkbox"">
{% render_field form.filter_boosts %}
{{ form.filter_boosts.label }}
<div class="column is-quarter">
<p class="notification is-info preferences-help">
{{ form.preview_sensitive.help_text }}
</p>
</div>
<div class="column is-half">
</div>
</div>
<h2 class="subtitle">Timeline Options</h2>
<div class="field">
<label class="label checkbox">
{% render_field form.filter_replies %}
{{ form.filter_replies.label }}
</label>
</div>
<div class="field">
<label class="label checkbox"">
{% render_field form.filter_boosts %}
{{ form.filter_boosts.label }}
</label>
</div>
<div class="columns">
<div class="column is-quarter">
<label class="label checkbox" for="id_filter_notifications">
{% render_field form.filter_notifications class+="checkbox" %}
{{ form.filter_notifications.label }}
</label>
</div>
<div class="column is-quarter">
<p class="notification is-info preferences-help">
{{ form.filter_notifications.help_text }}
</p>
</div>
<div class="column is-half">
<h2 class="subtitle">JavaScript Options</h2>
<div class="columns">
<div class="column is-quarter">
<label class="label checkbox" for="id_no_javascript">
{% render_field form.no_javascript class+="checkbox" %}
{{ form.no_javascript.label }}
</label>
</div>
<div class="column is-quarter">
<p class="notification is-info preferences-help">
{{ form.no_javascript.help_text }}
</p>
</div>
<div class="column is-half">
</div>
</div>
<div class="columns">
<div class="column is-quarter">
<label class="label checkbox" for="id_bundle_notifications">
{% render_field form.bundle_notifications class+="checkbox" %}
{{ form.bundle_notifications.label }}
</label>
</div>
<div class="column is-quarter">
<p class="notification is-info preferences-help">
{{ form.bundle_notifications.help_text }}
</p>
</div>
<div class="column is-half">
</div>
</div>
<h2 class="subtitle">JavaScript Options</h2>
<div class="columns">
<div class="column is-quarter">
<label class="label checkbox" for="id_no_javascript">
{% render_field form.no_javascript class+="checkbox" %}
{{ form.no_javascript.label }}
</label>
</div>
<div class="column is-quarter">
<p class="notification is-info preferences-help">
{{ form.no_javascript.help_text }}
</p>
</div>
<div class="column is-half">
</div>
</div>
<div class="columns">
<div class="column is-quarter">
<label class="label checkbox" for="id_notifications">
{% render_field form.notifications class+="checkbox" %}
{{ form.notifications.label }}
</label>
</div>
<div class="column is-quarter">
<p class="notification is-info preferences-help">
{{ form.notifications.help_text }}
</p>
</div>
<div class="column is-half">
</div>
</div>
<div class="columns">
<div class="column is-quarter">
<label class="label checkbox" for="id_click_to_load">
{% render_field form.click_to_load class+="checkbox" %}
{{ form.click_to_load.label }}
</label>
</div>
<div class="column is-quarter">
<p class="notification is-info preferences-help">
{{ form.click_to_load.help_text }}
</p>
</div>
<div class="column is-half">
</div>
</div>
<div class="columns">
<div class="column is-quarter">
<label class="label checkbox" for="id_lightbox">
{% render_field form.lightbox class+="checkbox" %}
{{ form.lightbox.label }}
</label>
</div>
<div class="column is-quarter">
<p class="notification is-info preferences-help">
{{ form.lightbox.help_text }}
</p>
</div>
<div class="column is-half">
</div>
</div>
<div class="columns">
<div class="column is-quarter">
<label class="label" for="id_poll_frequency">
{{ form.poll_frequency.label }}
</label>
<div class="control">
{% render_field form.poll_frequency class+="input" %}
</div>
</div>
<div class="columns">
<div class="column is-quarter">
<label class="label checkbox" for="id_notifications">
{% render_field form.notifications class+="checkbox" %}
{{ form.notifications.label }}
</label>
</div>
<div class="column is-quarter">
<p class="notification is-info preferences-help">
{{ form.notifications.help_text }}
</p>
</div>
<div class="column is-half">
</div>
<div class="column is-quarter">
<p class="notification is-info preferences-help">
{{ form.poll_frequency.help_text }}
</p>
</div>
<div class="columns">
<div class="column is-quarter">
<label class="label checkbox" for="id_click_to_load">
{% render_field form.click_to_load class+="checkbox" %}
{{ form.click_to_load.label }}
</label>
</div>
<div class="column is-quarter">
<p class="notification is-info preferences-help">
{{ form.click_to_load.help_text }}
</p>
</div>
<div class="column is-half">
<div class="column is-half">
</div>
</div>
<div class="columns">
<div class="column is-quarter">
<label class="label checkbox" for="id_lightbox">
{% render_field form.lightbox class+="checkbox" %}
{{ form.lightbox.label }}
</label>
</div>
<div class="column is-quarter">
<p class="notification is-info preferences-help">
{{ form.lightbox.help_text }}
</p>
</div>
<div class="column is-half">
</div>
</div>
</div>
<div class="columns">
<div class="column is-quarter">
<label class="label checkbox" for="id_filter_notifications">
{% render_field form.filter_notifications class+="checkbox" %}
{{ form.filter_notifications.label }}
</label>
</div>
<div class="column is-quarter">
<p class="notification is-info preferences-help">
{{ form.filter_notifications.help_text }}
</p>
</div>
<div class="column is-half">
<div class="field">
<input type="submit" name="submit"
value="Save" class="button is-primary" >
</div>
</form>
</div>
</div>
<div class="columns">
<div class="column is-quarter">
<label class="label" for="id_poll_frequency">
{{ form.poll_frequency.label }}
</label>
<div class="control">
{% render_field form.poll_frequency class+="input" %}
</div>
</div>
<div class="column is-quarter">
<p class="notification is-info preferences-help">
{{ form.poll_frequency.help_text }}
</p>
</div>
<div class="column is-half">
<h2 class="subtitle">Bookmarklet</h2>
<p>
<a href="{{ bookmarklet_url }}">Share via brutaldon</a>
</p>
</div>
</div>
<h2 class="subtitle">Filters and More</h2>
<p><a href="{% url "list_filters" %}">List filters</a></p>
<p><a href="{% url "follow_requests" %}">Follow requests</a></p>
<div class="field">
<input type="submit" name="submit"
value="Save" class="button is-primary" >
</div>
</form>
<h2 class="subtitle">Filters and Lists</h2>
<p><a href="{% url "list_filters" %}">List filters</a></p>
</div>
</div>
{% endblock %}

View File

@ -6,9 +6,10 @@ from django import template
register = template.Library()
@register.filter(is_safe=True)
def humane_time(arg):
'''Returns a time string that is humane but not relative (unlike Django's humanetime)
"""Returns a time string that is humane but not relative (unlike Django's humanetime)
For times less than 6 hours ago: display date and time to the minute.
For times less than 12 hours ago: display date and time to the hour.
@ -27,7 +28,7 @@ def humane_time(arg):
FIXME: work out how best to make these strings translatable
'''
"""
now = django_now()
arg = localtime(arg)
diff = now - arg
@ -42,13 +43,14 @@ def humane_time(arg):
return arg.strftime("%a, %b %d, %Y around %I %p") + utc
elif diff < timedelta(hours=36):
return arg.strftime("%a, %b %d, %Y in the ") + time_of_day(arg.hour) + utc
elif diff < timedelta(days=6*28):
elif diff < timedelta(days=6 * 28):
return arg.strftime("%b %d, %Y")
elif diff < timedelta(days=10*365):
elif diff < timedelta(days=10 * 365):
return arg.strftime("%b, %Y")
else:
return arg.strftime("%Y")
def time_of_day(hour):
"""Return a description of what time of day an hour is.

View File

@ -7,79 +7,88 @@ from pdb import set_trace
register = template.Library()
@register.filter
def pdb(element):
set_trace()
return element
@register.filter
def relink_tags(value):
'''Treat the text as html, and replace tag links with app-internal tag links
"""Treat the text as html, and replace tag links with app-internal tag links
Currently, this only works for tags in toots coming from Mastodon servers,
not necessarily GNU Social, Pleroma, or other fediverse servers, because
it relies on the markup that Mastodon puts on tags.
FIXME: handle arbitrary tag links
'''
value = value.replace('&apos;', "'")
soup = BeautifulSoup(value, 'html.parser')
for link in soup.find_all('a', class_='hashtag'):
"""
value = value.replace("&apos;", "'")
soup = BeautifulSoup(value, "html.parser")
for link in soup.find_all("a", class_="hashtag"):
try:
link['href'] = reverse('tag', args=[link.span.string])
link["href"] = reverse("tag", args=[link.span.string])
except:
continue
return soup.decode(formatter='html')
return soup.decode(formatter="html")
@register.filter
def relink_mentions(value):
'''Treat the text as html, and replace mention links with app-internal links
"""Treat the text as html, and replace mention links with app-internal links
Currently, this only works for mentions in toots coming from Mastodon servers,
not necessarily GNU Social, Pleroma, or other fediverse servers, because
it relies on the markup that Mastodon puts on mentions.
FIXME: handle arbitrary mention links
'''
value = value.replace('&apos;', "'")
soup = BeautifulSoup(value, 'html.parser')
for link in soup.find_all('a', class_='mention'):
parsed = parse.urlparse(link['href'])
"""
value = value.replace("&apos;", "'")
soup = BeautifulSoup(value, "html.parser")
for link in soup.find_all("a", class_="mention"):
parsed = parse.urlparse(link["href"])
try:
instance = parsed[1]
user = parsed[2][2:]
link['href'] = reverse('user', args=[user+'@'+instance])
link["href"] = reverse("user", args=[user + "@" + instance])
except:
continue
return soup.decode(formatter='html')
return soup.decode(formatter="html")
@register.filter
def relink_toot(value):
return relink_tags(relink_mentions(value))
@register.filter
def localuser(value):
'''Convert a remote user link to local'''
"""Convert a remote user link to local"""
try:
parsed = parse.urlparse(value)
instance = parsed[1]
if parsed[2].startswith('/@'):
if parsed[2].startswith("/@"):
user = parsed[2][2:]
else:
user = parsed[2].split('/')[-1]
local = reverse('user', args=[user+'@'+instance])
user = parsed[2].split("/")[-1]
local = reverse("user", args=[user + "@" + instance])
except:
local = value
return local
@register.filter
def fix_emojos(value, emojos):
'''Replace instances of recognized custom emoji :shortcodes: in value with image link tags
'''
"""Replace instances of recognized custom emoji :shortcodes: in value with image link tags
"""
for emojo in emojos:
try:
value = value.replace(":%(shortcode)s:" % emojo,
'<img src="%(url)s" title=":%(shortcode)s:" alt=":%(shortcode)s:" class="emoji">' % emojo)
value = value.replace(
":%(shortcode)s:" % emojo,
'<img src="%(url)s" title=":%(shortcode)s:" alt=":%(shortcode)s:" class="emoji">'
% emojo,
)
except:
continue
return value

View File

@ -18,51 +18,62 @@ from django.urls import path
from brutaldon import views
urlpatterns = [
path('admin/', admin.site.urls),
path('about', views.about, name='about'),
path('privacy', views.privacy, name='privacy'),
path('home/next/<next>', views.home, name='home_next'),
path('home/prev/<prev>', views.home, name='home_prev'),
path('home', views.home, name='home'),
path('login', views.login, name="login"),
path('oldlogin', views.old_login, name="oldlogin"),
path('logout', views.logout, name='logout'),
path('oauth_callback', views.oauth_callback, name="oauth_callback"),
path('error', views.error, name='error'),
path('local', views.local, name='local'),
path('local/next/<next>', views.local, name='local_next'),
path('local/prev/<prev>', views.local, name='local_prev'),
path('fed', views.fed, name='fed'),
path('fed/next/<next>', views.fed, name='fed_next'),
path('fed/prev/<prev>', views.fed, name='fed_prev'),
path('note', views.note, name='note'),
path('note/next<next>', views.note, name='note_next'),
path('note/prev/<prev>', views.note, name='note_prev'),
path('notes_count', views.notes_count, name='notes_count'),
path('user_search', views.user_search, name='user_search'),
path('settings', views.settings, name='settings'),
path('thread/<id>', views.thread, name='thread'),
path('tags/<tag>', views.tag, name='tag'),
path('user/', views.home, name='user_bad'),
path('user/<username>', views.user, name='user'),
path('user/<username>/next/<int:next>', views.user, name='user_next'),
path('user/<username>/prev/<int:prev>', views.user, name='user_prev'),
path('toot/<mention>', views.toot, name='toot'),
path('toot', views.toot, name="toot"),
path('reply/<id>', views.reply, name='reply'),
path('redraft/<id>', views.redraft, name='redraft'),
path('fav/<id>', views.fav, name='fav'),
path('boost/<id>', views.boost, name='boost'),
path('delete/<id>', views.delete, name='delete'),
path('follow/<id>', views.follow, name='follow'),
path('block/<id>', views.block, name='block'),
path('mute/<id>', views.mute, name='mute'),
path('search', views.search, name='search'),
path('search_results', views.search_results, name='search_results'),
path('emoji', views.emoji_reference, name='emoji'),
path('filters/list', views.list_filters, name='list_filters'),
path('filters/create', views.create_filter, name='create_filter'),
path('filters/delete/<id>', views.delete_filter, name='delete_filter'),
path('filters/edit/<id>', views.edit_filter, name='edit_filter'),
path('', views.home, name=''),
path("admin/", admin.site.urls),
path("about", views.about, name="about"),
path("privacy", views.privacy, name="privacy"),
path("home/next/<next>", views.home, name="home_next"),
path("home/prev/<prev>", views.home, name="home_prev"),
path("home", views.home, name="home"),
path("login", views.login, name="login"),
path("oldlogin", views.old_login, name="oldlogin"),
path("logout", views.logout, name="logout"),
path("oauth_callback", views.oauth_callback, name="oauth_callback"),
path("error", views.error, name="error"),
path("local", views.local, name="local"),
path("local/next/<next>", views.local, name="local_next"),
path("local/prev/<prev>", views.local, name="local_prev"),
path("fed", views.fed, name="fed"),
path("fed/next/<next>", views.fed, name="fed_next"),
path("fed/prev/<prev>", views.fed, name="fed_prev"),
path("note", views.note, name="note"),
path("note/next<next>", views.note, name="note_next"),
path("note/prev/<prev>", views.note, name="note_prev"),
path("notes_count", views.notes_count, name="notes_count"),
path("user_search", views.user_search, name="user_search"),
path("settings", views.settings, name="settings"),
path("thread/<id>", views.thread, name="thread"),
path("tags/<tag>", views.tag, name="tag"),
path("user/", views.home, name="user_bad"),
path("user/<username>", views.user, name="user"),
# next/prev are integers, but pleroma uses 128 bit integers
# ...encoded in Base62.
# aka a "flake_id"
# from baseconv import base62, but we don't need to decode it
# just pass it along back to pleroma but it is NOT an <int:>
path("user/<username>/next/<next>", views.user, name="user_next"),
path("user/<username>/prev/<prev>", views.user, name="user_prev"),
path("toot/<mention>", views.toot, name="toot"),
path("toot", views.toot, name="toot"),
path("reply/<id>", views.reply, name="reply"),
path("redraft/<id>", views.redraft, name="redraft"),
path("fav/<id>", views.fav, name="fav"),
path("boost/<id>", views.boost, name="boost"),
path("delete/<id>", views.delete, name="delete"),
path("follow/<id>", views.follow, name="follow"),
path("block/<id>", views.block, name="block"),
path("mute/<id>", views.mute, name="mute"),
path("search", views.search, name="search"),
path("search_results", views.search_results, name="search_results"),
path("emoji", views.emoji_reference, name="emoji"),
path("filters/list", views.list_filters, name="list_filters"),
path("filters/create", views.create_filter, name="create_filter"),
path("filters/delete/<id>", views.delete_filter, name="delete_filter"),
path("filters/edit/<id>", views.edit_filter, name="edit_filter"),
path("requests/", views.follow_requests, name="follow_requests"),
path("requests/<id>", views.follow_requests, name="follow_requests"),
path("accounts/", views.accounts, name="accounts"),
path("accounts/<id>", views.accounts, name="accounts"),
path("vote/<id>", views.vote, name="vote"),
path("share/", views.share, name="share"),
path("", views.home, name=""),
]

File diff suppressed because it is too large Load Diff

View File

@ -1,11 +1,12 @@
{
"dependencies": {
"bulma": "^0.7.1",
"bulma": "^0.7.5",
"bulma-extensions": "^2.2.2",
"bulmaswatch": "^0.6.2",
"fork-awesome": "^1.1.0",
"intercooler": "^1.2.1",
"jquery": "^3.3.1",
"jquery": "^3.4.1",
"loading-attribute-polyfill": "^1.2.0",
"magnific-popup": "^1.1.0",
"mousetrap": "^1.6.2"
}

View File

@ -1,43 +0,0 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
bulma-extensions@^2.2.2:
version "2.2.2"
resolved "https://registry.yarnpkg.com/bulma-extensions/-/bulma-extensions-2.2.2.tgz#d46f11d1242a3fdc60a983afaea0b5e6c137362d"
integrity sha512-6hV6SiRT7RZD5+scn/462Dz8RURRgxuvlCy+R5LH9U6FLn7Q/sInAA5VdK8c4DKpxZjfsipp72EAKM7yzgzRig==
bulma@^0.7.1:
version "0.7.2"
resolved "https://registry.yarnpkg.com/bulma/-/bulma-0.7.2.tgz#8e944377b74c7926558830d38d8e19eaf49f5fb6"
integrity sha512-6JHEu8U/1xsyOst/El5ImLcZIiE2JFXgvrz8GGWbnDLwTNRPJzdAM0aoUM1Ns0avALcVb6KZz9NhzmU53dGDcQ==
bulmaswatch@^0.6.2:
version "0.6.2"
resolved "https://registry.yarnpkg.com/bulmaswatch/-/bulmaswatch-0.6.2.tgz#5d102b1986d5f48d7f45ff68354c5fe367dc1c76"
integrity sha512-IMYjMqEnHQ1Yhtzkia3ojeFRvJr8DnLBiDMUuvLcGtJwyaAuZ8AQ4tT3TK21lcnt7cngeM3CKzBtkbQulWQI9w==
fork-awesome@^1.1.0:
version "1.1.5"
resolved "https://registry.yarnpkg.com/fork-awesome/-/fork-awesome-1.1.5.tgz#09370221ad752a5396beb62bcb7bd11dab09a132"
integrity sha512-AcyPBje/cBkNjLAqxs301XjWSTLcXyktXjo0zhyrXDiEbTFi48HqBYbcPL0QBdtRHXrEdj+1rR5KublMQDwPwQ==
intercooler@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/intercooler/-/intercooler-1.2.1.tgz#50e9727ef2643ef7d5130c8e58f2af78098aa01f"
integrity sha512-2/UV4RTZltP8tlV16fqu94aum4zO3uTbDcv843qjGInd+Lf2Pfm2gs2gIlCx5fYo6yUSz9cEwqc3r/+SddugMg==
jquery@^3.3.1:
version "3.3.1"
resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca"
integrity sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==
magnific-popup@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/magnific-popup/-/magnific-popup-1.1.0.tgz#3e7362c5bd18f6785fe99e59d013e20af33d3049"
integrity sha1-PnNixb0Y9nhf6Z5Z0BPiCvM9MEk=
mousetrap@^1.6.2:
version "1.6.2"
resolved "https://registry.yarnpkg.com/mousetrap/-/mousetrap-1.6.2.tgz#caadd9cf886db0986fb2fee59a82f6bd37527587"
integrity sha512-jDjhi7wlHwdO6q6DS7YRmSHcuI+RVxadBkLt3KHrhd3C2b+w5pKefg3oj5beTcHZyVFA9Aksf+yEE1y5jxUjVA==