refresh user interface icons, add card brand logos

- Drop icon fonts (Glyphicons and Forkawesome). Add SVG files from [Bootstrap Icons](https://icons.getbootstrap.com/) as replacements. (See [Inline SVG vs Icon Fonts](https://css-tricks.com/icon-fonts-vs-svg/) and [Stop Using Icon Fonts](https://www.irigoyen.dev/blog/2021/02/17/stop-using-icon-fonts/) for the reasons to drop icon fonts. In short, they're an obsolete hack.)
- Add logos of payment card brands (copied from Stripe) and use them in the payment method selection page.
- Refresh the icons of social platforms, optimize them, and give them text labels. (Closes #2117. Closes #2309.)
This commit is contained in:
Changaco 2024-02-16 16:09:03 +01:00
parent 76712b7882
commit 5f3a11a5dc
173 changed files with 664 additions and 3859 deletions

View File

@ -140,7 +140,15 @@ For our styles we use [SASS](http://sass-lang.com/) and [Bootstrap 3](https://ge
We compile Bootstrap ourselves from the SASS source in the `style/bootstrap/`
directory. We do that to be able to easily customize it by changing values in
`style/variables.scss`. Modifying the files in `style/bootstrap/` is probably
not a good idea.
a bad idea.
### Icons
An icon can be included in a page by calling the `icon` macro from `templates/macros/icons.html`. That file contains a mapping of icon names to file paths.
For user interface icons we use [Bootstrap Icons](https://icons.getbootstrap.com/). A new icon can be added to Liberapay by simply copying its SVG file from Bootstrap Icons into the `www/assets/bootstrap-icons/` directory (and not forgetting to `git add` it, of course).
If you don't find any icon in Bootstrap Icons that fits your use case, you can try to search online catalogs like [Flaticon](https://www.flaticon.com/search?type=uicon), [Icons8](https://icons8.com/icons), [Pictogrammers](https://pictogrammers.com/), [SVG Repo](https://www.svgrepo.com/) and [The Noun Project](https://thenounproject.com/). For brand icons, [Simple Icons](https://simpleicons.org/) is a good resource.
### Testing

View File

@ -77,7 +77,6 @@ def parse_as_xml(response):
class Platform:
fontawesome_name = None
has_teams = False
optional_user_name = False
single_domain = True

View File

@ -9,7 +9,6 @@ class Bitbucket(PlatformOAuth1):
# Platform attributes
name = 'bitbucket'
display_name = 'Bitbucket'
fontawesome_name = name
account_url = 'https://bitbucket.org/{user_name}'
# Auth attributes

View File

@ -8,7 +8,6 @@ class GitHub(PlatformOAuth2):
# Platform attributes
name = 'github'
display_name = 'GitHub'
fontawesome_name = name
account_url = 'https://github.com/{user_name}'
repo_url = 'https://github.com/{slug}'
has_teams = True

View File

@ -8,7 +8,6 @@ class GitLab(PlatformOAuth2):
# Platform attributes
name = 'gitlab'
display_name = 'GitLab.com'
fontawesome_name = name
account_url = 'https://gitlab.com/{user_name}'
repo_url = 'https://gitlab.com/{slug}'
has_teams = True

View File

@ -14,7 +14,6 @@ class Mastodon(PlatformOAuth2):
# Platform attributes
name = 'mastodon'
display_name = 'Mastodon'
fontawesome_name = name
account_url = 'https://{domain}/@{user_name}'
single_domain = False

View File

@ -7,7 +7,6 @@ class Pleroma(Mastodon):
# Platform attributes
name = 'pleroma'
display_name = 'Pleroma'
fontawesome_name = name
account_url = 'https://{domain}/{user_name}'
single_domain = False

View File

@ -8,7 +8,6 @@ class Twitch(PlatformOAuth2):
# Platform attributes
name = 'twitch'
display_name = 'Twitch'
fontawesome_name = name
account_url = 'https://twitch.tv/{user_name}'
user_type = 'channel'

View File

@ -8,7 +8,6 @@ class Twitter(PlatformOAuth1):
# Platform attributes
name = 'twitter'
display_name = 'Twitter'
fontawesome_name = name
account_url = 'https://twitter.com/{user_name}'
# Auth attributes

View File

@ -9,7 +9,6 @@ class Youtube(PlatformOAuth2):
based_on = 'google'
name = 'youtube'
display_name = 'YouTube'
fontawesome_name = 'youtube-play'
account_url = 'https://youtube.com/channel/{user_id}'
optional_user_name = True
user_type = 'channel'

View File

@ -103,17 +103,26 @@ def _assert(x):
assert x, repr(x)
return x
def soft_assert(x, msg):
if not x:
try:
raise AssertionError(msg)
except AssertionError as e:
website.tell_sentry(e)
return x
website.renderer_factories['jinja2'].Renderer.global_context.update(builtins.__dict__)
website.renderer_factories['jinja2'].Renderer.global_context.update({
# This is shared via class inheritance with jinja2_* renderers.
'assert': _assert,
'b64decode_s': b64decode_s,
'b64encode_s': b64encode_s,
'Bold': Bold,
'Community': Community,
'Country': Country,
'Currency': Currency,
'b64decode_s': b64decode_s,
'b64encode_s': b64encode_s,
'generate_session_token': Participant.generate_session_token,
'soft_assert': soft_assert,
'to_age': to_age,
'to_javascript': utils.to_javascript,
'urlquote': urlquote,

View File

@ -37,6 +37,18 @@ class Website(_Website):
def link(self, path, text):
return self._html_link % (path, text)
def read_asset(self, path):
try:
assert '..' not in path
resource = website.request_processor.resources.get(
f'{website.www_root}/assets/{path}'
)
bs = resource.render().body if resource.raw is None else resource.raw
return bs.decode('utf8')
except Exception as e:
self.tell_sentry(e)
return ''
def respond(self, *args, **kw):
# Run in a new (sub)context
return copy_context().run(super().respond, *args, **kw)

View File

@ -605,15 +605,15 @@ def accounts_elsewhere(app_conf, asset, canonical_url, db):
platforms = PlatformRegistry(platforms)
for platform in platforms:
if platform.fontawesome_name:
continue
platform.icon = asset(
'platforms/%s.svg' % platform.name,
platform.icon_16 = asset(
'platforms/%s.16.webp' % platform.name,
'platforms/%s.16.png' % platform.name,
)
platform.logo = asset(
'platforms/%s.svg' % platform.name,
'platforms/%s.png' % platform.name,
)
platform.icon_32 = asset(
'platforms/%s.32.webp' % platform.name,
'platforms/%s.32.png' % platform.name,
'platforms/%s.svg' % platform.name,
)
return {'platforms': platforms}

View File

@ -9,6 +9,7 @@ else:
response.headers[b'Refresh'] = refresh_header
[---] text/html
% from "templates/macros/icons.html" import icon with context
<!DOCTYPE html>
<html lang="{{ locale.tag }}">
<head>
@ -18,14 +19,13 @@ response.headers[b'Refresh'] = refresh_header
<link rel="icon" href="{{ website.asset('liberapay/icon-v2_black.16.png') }}" type="image/png">
<link rel="stylesheet" href="{{ website.asset('bootstrap/css/bootstrap.css') }}">
<link rel="stylesheet" href="{{ website.asset('base.css') }}" type="text/css">
<link rel="stylesheet" href="{{ website.asset('forkawesome/1.1.7/css/fork-awesome.min.css') }}" type="text/css">
<meta name="theme-color" content="#f6c915">
</head>
<body>
<nav class="navbar navbar-liberapay navbar-static-top" id="navbar" aria-hidden="true">
<div class="container">
<ul class="nav navbar-nav">
<li><a class="navbar-brand"><i class="fa fa-liberapay"></i></a></li>
<li><a class="navbar-brand">{{ icon('liberapay') }}</a></li>
</ul>
</div>
</nav>

View File

@ -20,7 +20,7 @@
.actions {
position: absolute;
right: 10px;
top: 8px;
top: 7px;
& > button {
-moz-appearance: none;
-webkit-appearance: none;

View File

@ -136,26 +136,6 @@ div.account {
margin-left: 0.5ex;
}
img.platform-icon {
height: 16px;
}
i.platform-icon {
display: inline-block;
font-size: 16px;
width: 16px;
text-align: center;
vertical-align: middle;
}
img.account-type {
height: 32px;
}
i.account-type {
display: inline-block;
font-size: 32px;
width: 32px;
text-align: center;
vertical-align: middle;
}
a.account-link[href="#not-available"] {
color: inherit;
cursor: default;
@ -240,15 +220,15 @@ p.summary {
max-width: 320px;
text-align: center;
width: 320px;
.platform-icon {
margin-top: -3px;
}
h4 {
margin-top: 5px;
line-height: 23px;
max-height: 2 * 23px;
overflow: hidden;
text-overflow: ellipsis;
.icon {
vertical-align: baseline;
}
}
.summary {
height: 3 * $line-height-computed;
@ -302,7 +282,7 @@ p.summary {
margin: 0 1ex 0.6em 0;
}
}
.glyphicon-star {
.star {
color: $gray-light;
font-size: 80%;
}
@ -744,7 +724,7 @@ p.event {
margin-bottom: 0.5em;
}
.glyphicon + span {
.icon + span {
margin-left: 2px;
}
@ -768,31 +748,39 @@ span.help-title {
.payment-methods {
margin-right: -10px;
& > div {
& > .panel {
display: inline-block;
margin-right: 10px;
min-height: 145px;
text-align: center;
vertical-align: top;
width: 350px;
max-width: 100%;
}
.payment-icon {
font-size: 2em;
& > .panel-body {
min-height: 165px;
}
}
.muted {
color: #888;
.payment-icon {
svg {
color: #ccc;
}
}
small.text-warning, small.text-danger {
h4 {
margin-bottom: 0;
}
small {
display: block;
font-size: $font-size-medium;
font-weight: bold;
line-height: $font-size-medium * $line-height-base;
margin-top: 11px;
}
}
.card-brands > svg {
margin: 0 2ex .3em 0;
}
@media (max-width: $screen-sm-min - 1) {
.col-right {
clear: both;
@ -818,7 +806,6 @@ span.help-title {
}
.payment-icons {
font-size: $font-size-large;
text-wrap: nowrap;
vertical-align: middle;
}

View File

@ -78,10 +78,10 @@ button.corner-icon {
font-size: 18px;
line-height: 24px;
margin-left: 5px;
opacity: 0.2;
opacity: 0.5;
padding: 0 5px;
&:hover {
opacity: 0.5;
opacity: 0.8;
}
}

View File

@ -1,11 +1,22 @@
.fa-brand-color {
// https://logo-colors.com/
&.fa-bitbucket { color: #0052cc; }
&.fa-github { color: #24292e; }
&.fa-gitlab { color: #fca326; }
&.fa-mastodon { color: #6364ff; }
&.fa-pleroma { color: #fba457; }
&.fa-twitch { color: #6441a5; }
&.fa-twitter { color: #1da1f2; }
&.fa-youtube-play { color: #ff0000; }
svg {
vertical-align: top;
}
.icon + span {
margin-left: 2px;
}
span.icon-16 {
display: inline-block;
line-height: 16px;
& > svg {
height: 16px;
width: 16px;
}
}
span.icon-32 {
display: inline-block;
line-height: 32px;
& > svg {
height: 32px;
width: 32px;
}
}

View File

@ -78,18 +78,10 @@
margin-left: 0;
}
.navbar-brand {
& > img {
border-radius: 4px;
color: #000;
height: $font-size-base * 2;
line-height: $font-size-base * 2;
margin-top: -$font-size-base / 3;
}
& > .fa-liberapay {
font-size: $font-size-base * 2;
line-height: $font-size-base * 2;
margin-top: -$font-size-base / 3;
}
height: 50px;
line-height: 32px;
padding: 9px;
width: 50px;
}
}

View File

@ -126,22 +126,18 @@
// Toggles
.icon-prev,
.icon-next,
.glyphicon-chevron-left,
.glyphicon-chevron-right {
.icon-next {
position: absolute;
top: 50%;
margin-top: -10px;
z-index: 5;
display: inline-block;
}
.icon-prev,
.glyphicon-chevron-left {
.icon-prev {
left: 50%;
margin-left: -10px;
}
.icon-next,
.glyphicon-chevron-right {
.icon-next {
right: 50%;
margin-right: -10px;
}
@ -237,8 +233,6 @@
// Scale up the controls a smidge
.carousel-control {
.glyphicon-chevron-left,
.glyphicon-chevron-right,
.icon-prev,
.icon-next {
width: ($carousel-control-font-size * 1.5);
@ -246,11 +240,9 @@
margin-top: ($carousel-control-font-size / -2);
font-size: ($carousel-control-font-size * 1.5);
}
.glyphicon-chevron-left,
.icon-prev {
margin-left: ($carousel-control-font-size / -2);
}
.glyphicon-chevron-right,
.icon-next {
margin-right: ($carousel-control-font-size / -2);
}

View File

@ -1,307 +0,0 @@
//
// Glyphicons for Bootstrap
//
// Since icons are fonts, they can be placed anywhere text is placed and are
// thus automatically sized to match the surrounding child. To use, create an
// inline element with the appropriate classes, like so:
//
// <a href="#"><span class="glyphicon glyphicon-star"></span> Star</a>
@at-root {
// Import the fonts
@font-face {
font-family: 'Glyphicons Halflings';
src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot'), '#{$icon-font-path}#{$icon-font-name}.eot'));
src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot?#iefix'), '#{$icon-font-path}#{$icon-font-name}.eot?#iefix')) format('embedded-opentype'),
url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff2'), '#{$icon-font-path}#{$icon-font-name}.woff2')) format('woff2'),
url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff'), '#{$icon-font-path}#{$icon-font-name}.woff')) format('woff'),
url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.ttf'), '#{$icon-font-path}#{$icon-font-name}.ttf')) format('truetype'),
url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}'), '#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}')) format('svg');
}
}
// Catchall baseclass
.glyphicon {
position: relative;
top: 1px;
display: inline-block;
font-family: 'Glyphicons Halflings';
font-style: normal;
font-weight: normal;
line-height: 1;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
// Individual icons
.glyphicon-asterisk { &:before { content: "\002a"; } }
.glyphicon-plus { &:before { content: "\002b"; } }
.glyphicon-euro,
.glyphicon-eur { &:before { content: "\20ac"; } }
.glyphicon-minus { &:before { content: "\2212"; } }
.glyphicon-cloud { &:before { content: "\2601"; } }
.glyphicon-envelope { &:before { content: "\2709"; } }
.glyphicon-pencil { &:before { content: "\270f"; } }
.glyphicon-glass { &:before { content: "\e001"; } }
.glyphicon-music { &:before { content: "\e002"; } }
.glyphicon-search { &:before { content: "\e003"; } }
.glyphicon-heart { &:before { content: "\e005"; } }
.glyphicon-star { &:before { content: "\e006"; } }
.glyphicon-star-empty { &:before { content: "\e007"; } }
.glyphicon-user { &:before { content: "\e008"; } }
.glyphicon-film { &:before { content: "\e009"; } }
.glyphicon-th-large { &:before { content: "\e010"; } }
.glyphicon-th { &:before { content: "\e011"; } }
.glyphicon-th-list { &:before { content: "\e012"; } }
.glyphicon-ok { &:before { content: "\e013"; } }
.glyphicon-remove { &:before { content: "\e014"; } }
.glyphicon-zoom-in { &:before { content: "\e015"; } }
.glyphicon-zoom-out { &:before { content: "\e016"; } }
.glyphicon-off { &:before { content: "\e017"; } }
.glyphicon-signal { &:before { content: "\e018"; } }
.glyphicon-cog { &:before { content: "\e019"; } }
.glyphicon-trash { &:before { content: "\e020"; } }
.glyphicon-home { &:before { content: "\e021"; } }
.glyphicon-file { &:before { content: "\e022"; } }
.glyphicon-time { &:before { content: "\e023"; } }
.glyphicon-road { &:before { content: "\e024"; } }
.glyphicon-download-alt { &:before { content: "\e025"; } }
.glyphicon-download { &:before { content: "\e026"; } }
.glyphicon-upload { &:before { content: "\e027"; } }
.glyphicon-inbox { &:before { content: "\e028"; } }
.glyphicon-play-circle { &:before { content: "\e029"; } }
.glyphicon-repeat { &:before { content: "\e030"; } }
.glyphicon-refresh { &:before { content: "\e031"; } }
.glyphicon-list-alt { &:before { content: "\e032"; } }
.glyphicon-lock { &:before { content: "\e033"; } }
.glyphicon-flag { &:before { content: "\e034"; } }
.glyphicon-headphones { &:before { content: "\e035"; } }
.glyphicon-volume-off { &:before { content: "\e036"; } }
.glyphicon-volume-down { &:before { content: "\e037"; } }
.glyphicon-volume-up { &:before { content: "\e038"; } }
.glyphicon-qrcode { &:before { content: "\e039"; } }
.glyphicon-barcode { &:before { content: "\e040"; } }
.glyphicon-tag { &:before { content: "\e041"; } }
.glyphicon-tags { &:before { content: "\e042"; } }
.glyphicon-book { &:before { content: "\e043"; } }
.glyphicon-bookmark { &:before { content: "\e044"; } }
.glyphicon-print { &:before { content: "\e045"; } }
.glyphicon-camera { &:before { content: "\e046"; } }
.glyphicon-font { &:before { content: "\e047"; } }
.glyphicon-bold { &:before { content: "\e048"; } }
.glyphicon-italic { &:before { content: "\e049"; } }
.glyphicon-text-height { &:before { content: "\e050"; } }
.glyphicon-text-width { &:before { content: "\e051"; } }
.glyphicon-align-left { &:before { content: "\e052"; } }
.glyphicon-align-center { &:before { content: "\e053"; } }
.glyphicon-align-right { &:before { content: "\e054"; } }
.glyphicon-align-justify { &:before { content: "\e055"; } }
.glyphicon-list { &:before { content: "\e056"; } }
.glyphicon-indent-left { &:before { content: "\e057"; } }
.glyphicon-indent-right { &:before { content: "\e058"; } }
.glyphicon-facetime-video { &:before { content: "\e059"; } }
.glyphicon-picture { &:before { content: "\e060"; } }
.glyphicon-map-marker { &:before { content: "\e062"; } }
.glyphicon-adjust { &:before { content: "\e063"; } }
.glyphicon-tint { &:before { content: "\e064"; } }
.glyphicon-edit { &:before { content: "\e065"; } }
.glyphicon-share { &:before { content: "\e066"; } }
.glyphicon-check { &:before { content: "\e067"; } }
.glyphicon-move { &:before { content: "\e068"; } }
.glyphicon-step-backward { &:before { content: "\e069"; } }
.glyphicon-fast-backward { &:before { content: "\e070"; } }
.glyphicon-backward { &:before { content: "\e071"; } }
.glyphicon-play { &:before { content: "\e072"; } }
.glyphicon-pause { &:before { content: "\e073"; } }
.glyphicon-stop { &:before { content: "\e074"; } }
.glyphicon-forward { &:before { content: "\e075"; } }
.glyphicon-fast-forward { &:before { content: "\e076"; } }
.glyphicon-step-forward { &:before { content: "\e077"; } }
.glyphicon-eject { &:before { content: "\e078"; } }
.glyphicon-chevron-left { &:before { content: "\e079"; } }
.glyphicon-chevron-right { &:before { content: "\e080"; } }
.glyphicon-plus-sign { &:before { content: "\e081"; } }
.glyphicon-minus-sign { &:before { content: "\e082"; } }
.glyphicon-remove-sign { &:before { content: "\e083"; } }
.glyphicon-ok-sign { &:before { content: "\e084"; } }
.glyphicon-question-sign { &:before { content: "\e085"; } }
.glyphicon-info-sign { &:before { content: "\e086"; } }
.glyphicon-screenshot { &:before { content: "\e087"; } }
.glyphicon-remove-circle { &:before { content: "\e088"; } }
.glyphicon-ok-circle { &:before { content: "\e089"; } }
.glyphicon-ban-circle { &:before { content: "\e090"; } }
.glyphicon-arrow-left { &:before { content: "\e091"; } }
.glyphicon-arrow-right { &:before { content: "\e092"; } }
.glyphicon-arrow-up { &:before { content: "\e093"; } }
.glyphicon-arrow-down { &:before { content: "\e094"; } }
.glyphicon-share-alt { &:before { content: "\e095"; } }
.glyphicon-resize-full { &:before { content: "\e096"; } }
.glyphicon-resize-small { &:before { content: "\e097"; } }
.glyphicon-exclamation-sign { &:before { content: "\e101"; } }
.glyphicon-gift { &:before { content: "\e102"; } }
.glyphicon-leaf { &:before { content: "\e103"; } }
.glyphicon-fire { &:before { content: "\e104"; } }
.glyphicon-eye-open { &:before { content: "\e105"; } }
.glyphicon-eye-close { &:before { content: "\e106"; } }
.glyphicon-warning-sign { &:before { content: "\e107"; } }
.glyphicon-plane { &:before { content: "\e108"; } }
.glyphicon-calendar { &:before { content: "\e109"; } }
.glyphicon-random { &:before { content: "\e110"; } }
.glyphicon-comment { &:before { content: "\e111"; } }
.glyphicon-magnet { &:before { content: "\e112"; } }
.glyphicon-chevron-up { &:before { content: "\e113"; } }
.glyphicon-chevron-down { &:before { content: "\e114"; } }
.glyphicon-retweet { &:before { content: "\e115"; } }
.glyphicon-shopping-cart { &:before { content: "\e116"; } }
.glyphicon-folder-close { &:before { content: "\e117"; } }
.glyphicon-folder-open { &:before { content: "\e118"; } }
.glyphicon-resize-vertical { &:before { content: "\e119"; } }
.glyphicon-resize-horizontal { &:before { content: "\e120"; } }
.glyphicon-hdd { &:before { content: "\e121"; } }
.glyphicon-bullhorn { &:before { content: "\e122"; } }
.glyphicon-bell { &:before { content: "\e123"; } }
.glyphicon-certificate { &:before { content: "\e124"; } }
.glyphicon-thumbs-up { &:before { content: "\e125"; } }
.glyphicon-thumbs-down { &:before { content: "\e126"; } }
.glyphicon-hand-right { &:before { content: "\e127"; } }
.glyphicon-hand-left { &:before { content: "\e128"; } }
.glyphicon-hand-up { &:before { content: "\e129"; } }
.glyphicon-hand-down { &:before { content: "\e130"; } }
.glyphicon-circle-arrow-right { &:before { content: "\e131"; } }
.glyphicon-circle-arrow-left { &:before { content: "\e132"; } }
.glyphicon-circle-arrow-up { &:before { content: "\e133"; } }
.glyphicon-circle-arrow-down { &:before { content: "\e134"; } }
.glyphicon-globe { &:before { content: "\e135"; } }
.glyphicon-wrench { &:before { content: "\e136"; } }
.glyphicon-tasks { &:before { content: "\e137"; } }
.glyphicon-filter { &:before { content: "\e138"; } }
.glyphicon-briefcase { &:before { content: "\e139"; } }
.glyphicon-fullscreen { &:before { content: "\e140"; } }
.glyphicon-dashboard { &:before { content: "\e141"; } }
.glyphicon-paperclip { &:before { content: "\e142"; } }
.glyphicon-heart-empty { &:before { content: "\e143"; } }
.glyphicon-link { &:before { content: "\e144"; } }
.glyphicon-phone { &:before { content: "\e145"; } }
.glyphicon-pushpin { &:before { content: "\e146"; } }
.glyphicon-usd { &:before { content: "\e148"; } }
.glyphicon-gbp { &:before { content: "\e149"; } }
.glyphicon-sort { &:before { content: "\e150"; } }
.glyphicon-sort-by-alphabet { &:before { content: "\e151"; } }
.glyphicon-sort-by-alphabet-alt { &:before { content: "\e152"; } }
.glyphicon-sort-by-order { &:before { content: "\e153"; } }
.glyphicon-sort-by-order-alt { &:before { content: "\e154"; } }
.glyphicon-sort-by-attributes { &:before { content: "\e155"; } }
.glyphicon-sort-by-attributes-alt { &:before { content: "\e156"; } }
.glyphicon-unchecked { &:before { content: "\e157"; } }
.glyphicon-expand { &:before { content: "\e158"; } }
.glyphicon-collapse-down { &:before { content: "\e159"; } }
.glyphicon-collapse-up { &:before { content: "\e160"; } }
.glyphicon-log-in { &:before { content: "\e161"; } }
.glyphicon-flash { &:before { content: "\e162"; } }
.glyphicon-log-out { &:before { content: "\e163"; } }
.glyphicon-new-window { &:before { content: "\e164"; } }
.glyphicon-record { &:before { content: "\e165"; } }
.glyphicon-save { &:before { content: "\e166"; } }
.glyphicon-open { &:before { content: "\e167"; } }
.glyphicon-saved { &:before { content: "\e168"; } }
.glyphicon-import { &:before { content: "\e169"; } }
.glyphicon-export { &:before { content: "\e170"; } }
.glyphicon-send { &:before { content: "\e171"; } }
.glyphicon-floppy-disk { &:before { content: "\e172"; } }
.glyphicon-floppy-saved { &:before { content: "\e173"; } }
.glyphicon-floppy-remove { &:before { content: "\e174"; } }
.glyphicon-floppy-save { &:before { content: "\e175"; } }
.glyphicon-floppy-open { &:before { content: "\e176"; } }
.glyphicon-credit-card { &:before { content: "\e177"; } }
.glyphicon-transfer { &:before { content: "\e178"; } }
.glyphicon-cutlery { &:before { content: "\e179"; } }
.glyphicon-header { &:before { content: "\e180"; } }
.glyphicon-compressed { &:before { content: "\e181"; } }
.glyphicon-earphone { &:before { content: "\e182"; } }
.glyphicon-phone-alt { &:before { content: "\e183"; } }
.glyphicon-tower { &:before { content: "\e184"; } }
.glyphicon-stats { &:before { content: "\e185"; } }
.glyphicon-sd-video { &:before { content: "\e186"; } }
.glyphicon-hd-video { &:before { content: "\e187"; } }
.glyphicon-subtitles { &:before { content: "\e188"; } }
.glyphicon-sound-stereo { &:before { content: "\e189"; } }
.glyphicon-sound-dolby { &:before { content: "\e190"; } }
.glyphicon-sound-5-1 { &:before { content: "\e191"; } }
.glyphicon-sound-6-1 { &:before { content: "\e192"; } }
.glyphicon-sound-7-1 { &:before { content: "\e193"; } }
.glyphicon-copyright-mark { &:before { content: "\e194"; } }
.glyphicon-registration-mark { &:before { content: "\e195"; } }
.glyphicon-cloud-download { &:before { content: "\e197"; } }
.glyphicon-cloud-upload { &:before { content: "\e198"; } }
.glyphicon-tree-conifer { &:before { content: "\e199"; } }
.glyphicon-tree-deciduous { &:before { content: "\e200"; } }
.glyphicon-cd { &:before { content: "\e201"; } }
.glyphicon-save-file { &:before { content: "\e202"; } }
.glyphicon-open-file { &:before { content: "\e203"; } }
.glyphicon-level-up { &:before { content: "\e204"; } }
.glyphicon-copy { &:before { content: "\e205"; } }
.glyphicon-paste { &:before { content: "\e206"; } }
// The following 2 Glyphicons are omitted for the time being because
// they currently use Unicode codepoints that are outside the
// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle
// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.
// Notably, the bug affects some older versions of the Android Browser.
// More info: https://github.com/twbs/bootstrap/issues/10106
// .glyphicon-door { &:before { content: "\1f6aa"; } }
// .glyphicon-key { &:before { content: "\1f511"; } }
.glyphicon-alert { &:before { content: "\e209"; } }
.glyphicon-equalizer { &:before { content: "\e210"; } }
.glyphicon-king { &:before { content: "\e211"; } }
.glyphicon-queen { &:before { content: "\e212"; } }
.glyphicon-pawn { &:before { content: "\e213"; } }
.glyphicon-bishop { &:before { content: "\e214"; } }
.glyphicon-knight { &:before { content: "\e215"; } }
.glyphicon-baby-formula { &:before { content: "\e216"; } }
.glyphicon-tent { &:before { content: "\26fa"; } }
.glyphicon-blackboard { &:before { content: "\e218"; } }
.glyphicon-bed { &:before { content: "\e219"; } }
.glyphicon-apple { &:before { content: "\f8ff"; } }
.glyphicon-erase { &:before { content: "\e221"; } }
.glyphicon-hourglass { &:before { content: "\231b"; } }
.glyphicon-lamp { &:before { content: "\e223"; } }
.glyphicon-duplicate { &:before { content: "\e224"; } }
.glyphicon-piggy-bank { &:before { content: "\e225"; } }
.glyphicon-scissors { &:before { content: "\e226"; } }
.glyphicon-bitcoin { &:before { content: "\e227"; } }
.glyphicon-btc { &:before { content: "\e227"; } }
.glyphicon-xbt { &:before { content: "\e227"; } }
.glyphicon-yen { &:before { content: "\00a5"; } }
.glyphicon-jpy { &:before { content: "\00a5"; } }
.glyphicon-ruble { &:before { content: "\20bd"; } }
.glyphicon-rub { &:before { content: "\20bd"; } }
.glyphicon-scale { &:before { content: "\e230"; } }
.glyphicon-ice-lolly { &:before { content: "\e231"; } }
.glyphicon-ice-lolly-tasted { &:before { content: "\e232"; } }
.glyphicon-education { &:before { content: "\e233"; } }
.glyphicon-option-horizontal { &:before { content: "\e234"; } }
.glyphicon-option-vertical { &:before { content: "\e235"; } }
.glyphicon-menu-hamburger { &:before { content: "\e236"; } }
.glyphicon-modal-window { &:before { content: "\e237"; } }
.glyphicon-oil { &:before { content: "\e238"; } }
.glyphicon-grain { &:before { content: "\e239"; } }
.glyphicon-sunglasses { &:before { content: "\e240"; } }
.glyphicon-text-size { &:before { content: "\e241"; } }
.glyphicon-text-color { &:before { content: "\e242"; } }
.glyphicon-text-background { &:before { content: "\e243"; } }
.glyphicon-object-align-top { &:before { content: "\e244"; } }
.glyphicon-object-align-bottom { &:before { content: "\e245"; } }
.glyphicon-object-align-horizontal{ &:before { content: "\e246"; } }
.glyphicon-object-align-left { &:before { content: "\e247"; } }
.glyphicon-object-align-vertical { &:before { content: "\e248"; } }
.glyphicon-object-align-right { &:before { content: "\e249"; } }
.glyphicon-triangle-right { &:before { content: "\e250"; } }
.glyphicon-triangle-left { &:before { content: "\e251"; } }
.glyphicon-triangle-bottom { &:before { content: "\e252"; } }
.glyphicon-triangle-top { &:before { content: "\e253"; } }
.glyphicon-console { &:before { content: "\e254"; } }
.glyphicon-superscript { &:before { content: "\e255"; } }
.glyphicon-subscript { &:before { content: "\e256"; } }
.glyphicon-menu-left { &:before { content: "\e257"; } }
.glyphicon-menu-right { &:before { content: "\e258"; } }
.glyphicon-menu-down { &:before { content: "\e259"; } }
.glyphicon-menu-up { &:before { content: "\e260"; } }

View File

@ -73,20 +73,6 @@ $headings-line-height: 1.1 !default;
$headings-color: inherit !default;
//== Iconography
//
//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
//** Load fonts from this directory.
$icon-font-path: "../fonts/" !default;
//** File name for all font files.
$icon-font-name: "glyphicons-halflings-regular" !default;
//** Element ID within SVG icon file.
$icon-font-svg-id: "glyphicons_halflingsregular" !default;
//== Components
//
//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).

View File

@ -14,7 +14,6 @@
<link rel="apple-touch-icon" href="{{ website.asset('liberapay/icon-v2_black-on-yellow.200.png') }}">
<link rel="stylesheet" href="{{ website.asset('bootstrap/css/bootstrap.css') }}">
<link rel="stylesheet" href="{{ website.asset('base.css') }}" type="text/css">
<link rel="stylesheet" href="{{ website.asset('forkawesome/1.1.7/css/fork-awesome.min.css') }}" type="text/css">
% block head_alternates
% if request.method in constants.SAFE_METHODS and response.code == 200
<link rel="alternate" hreflang="x-default" href="{{ website.canonical_url }}{{ request.line.uri.decoded }}" />
@ -29,7 +28,7 @@
% endif
{% block head %}{% endblock %}
</head>
% from "templates/macros/icons.html" import fontawesome, glyphicon
% from "templates/macros/icons.html" import icon with context
% from 'templates/macros/nav.html' import nav, nav_about, nav_explore with context
% from 'templates/macros/search.html' import search_form with context
<body{% if page_id is defined %} id="{{ page_id }}"{% endif %}>
@ -55,7 +54,7 @@
data-target="#navbar-liberapay-collapse" data-parent="#navbar"
aria-expanded="false">
<span class="sr-only">{{ _("Toggle navigation") }}</span>
{{ glyphicon('menu-hamburger') }}
{{ icon('list') }}
</a>
</li>
% block navbar_alternates
@ -65,30 +64,30 @@
% include "templates/layouts/components/navbar-logged-in.html"
% elif response.no_navbar_sign_in|default(True)
% from "templates/macros/sign-in-link.html" import sign_in_link with context
<li>{{ sign_in_link('glyphicon glyphicon-log-in', 'navbar-btn') }}</li>
<li>{{ sign_in_link(icon('enter'), 'navbar-btn') }}</li>
% endif
</ul>
<div class="collapse navbar-collapse navbar-left" id="navbar-liberapay-collapse">
<ul class="nav navbar-nav">
% if page_id|default('') != 'homepage'
<li class="hidden-xs">
<a class="navbar-brand" href="/">{{ fontawesome('liberapay', _("Homepage")) }}</a></li>
<a class="navbar-brand" href="/">{{ icon('liberapay', _("Homepage"), size=32) }}</a></li>
<li class="visible-xs">
<a href="/">{{ glyphicon('home') }} <span>{{ _("Homepage") }}</span></a></li>
<a href="/">{{ icon('homepage') }} <span>{{ _("Homepage") }}</span></a></li>
% endif
{{ nav([
('/explore/', _('Explore'), {
'icon': 'glyphicon glyphicon-globe',
'icon': icon('explore'),
'dropdown': nav_explore(),
}),
('/search', _('Search'), {
'icon': 'glyphicon glyphicon-search',
'icon': icon('text-prompt'),
'form': True,
'role': 'search',
'dropdown': search_form(autocomplete=False),
}),
('/about/', _('About'), {
'icon': 'glyphicon glyphicon-question-sign',
'icon': icon('info-sign'),
'dropdown': nav_about(),
}),
]) }}
@ -123,11 +122,11 @@
<li><a href="/about/legal">{{ _("Legal") }}</a></li>
</ul>
<ul class="icons">
<li><a href="https://medium.com/liberapay-blog">{{ fontawesome('medium', 'Medium') }}</a></li>
<li><a href="https://mastodon.xyz/@Liberapay">{{ fontawesome('mastodon', 'Mastodon') }}</a></li>
<li><a href="https://github.com/liberapay/liberapay.com">{{ fontawesome('github', 'GitHub') }}</a></li>
<li><a href="https://twitter.com/liberapay">{{ fontawesome('twitter', 'Twitter') }}</a></li>
<li><a href="https://www.facebook.com/Liberapay-472128142945598/">{{ fontawesome('facebook', 'Facebook') }}</a></li>
<li><a href="https://medium.com/liberapay-blog">{{ icon('medium', 'Medium') }}</a></li>
<li><a href="https://mastodon.xyz/@Liberapay">{{ icon('mastodon', 'Mastodon') }}</a></li>
<li><a href="https://github.com/liberapay/liberapay.com">{{ icon('github', 'GitHub') }}</a></li>
<li><a href="https://twitter.com/liberapay">{{ icon('twitter', 'Twitter') }}</a></li>
<li><a href="https://www.facebook.com/Liberapay-472128142945598/">{{ icon('facebook', 'Facebook') }}</a></li>
</ul>
</footer>

View File

@ -1,11 +1,11 @@
% from "templates/macros/icons.html" import glyphicon
% from "templates/macros/icons.html" import icon with context
% if request.method in constants.SAFE_METHODS
<li class="dropdown dropdown-hover locale">
<button class="dropdown-toggle navbar-btn" type="button"
data-toggle="dropdown"
title="{{ _('Switch to another language') }}">
<span class="glyphicon glyphicon-map-marker" aria-hidden="true"></span>
{{ icon('locale') }}
<span class="text">{{ locale.language_name }}</span>
<span class="caret"></span>
</button>
@ -24,8 +24,7 @@
<li role="separator" class="divider"></li>
<li><a href="https://hosted.weblate.org/engage/liberapay/?utm_source=liberapay-navbar"
target="_blank" rel="noopener noreferrer"
><span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
{{ _("Help us translate Liberapay") }}</a></li>
>{{ icon('external-link') }}&nbsp;{{ _("Help us translate Liberapay") }}</a></li>
</ul>
</li>
% endif

View File

@ -1,4 +1,5 @@
% from 'templates/macros/avatar-url.html' import avatar_img with context
% from "templates/macros/icons.html" import icon with context
<li class="dropdown dropdown-hover">
<button class="dropdown-toggle navbar-btn" type="button"
@ -30,10 +31,7 @@
<form action="/sign-out" method="POST" {% if method_is_unsafe %} target="_blank" {% endif %}>
<input name="back_to" type="hidden" value="{{ '/' if method_is_unsafe else request.line.uri.decoded }}" />
<input name="csrf_token" type="hidden" value="{{ csrf_token }}" />
<button class="btn navbar-btn" type="submit">
<span class="glyphicon glyphicon-log-out"></span>
<span>{{ _("Sign out") }}</span>
</button>
<button class="btn navbar-btn" type="submit">{{ icon('exit') }} <span>{{ _("Sign out") }}</span></button>
</form>
</li>
</ul>
@ -43,7 +41,7 @@
<li><a href="/{{ user.username }}/notifications"
title="{{ _('Notifications') }}"
class="{{ 'navbar-warning' if user.pending_notifs else '' }}">
<span class="glyphicon glyphicon-info-sign"></span>
{{ icon('exclamation-sign') }}
<span class="sr-only">{{ _("Notifications") }}</span>
% if user.pending_notifs
<span class="pending-notifs">{{ user.pending_notifs }}</span>

View File

@ -1,3 +1,5 @@
% from "templates/macros/icons.html" import icon with context
<!DOCTYPE html>
<html lang="{{ locale.tag }}">
<head prefix="og: http://ogp.me/ns#">
@ -11,9 +13,7 @@
<body>
<header class="text-right">
<a class="btn btn-default btn-lg print">
<span class="glyphicon glyphicon-print"></span> {{ _("Print") }}
</a>
<a class="btn btn-default btn-lg print">{{ icon('print') }} {{ _("Print") }}</a>
</header>
<div class="sheet"><div class="page">

View File

@ -1,3 +1,5 @@
% from "templates/macros/icons.html" import icon with context
% macro admin_form(p, reload=False, style='columns-sm-2 block-labels')
<form action="javascript:/admin/users" method="POST" class="js-submit"{% if reload %}
data-on-success="reload"{% endif %}>
@ -20,7 +22,7 @@
unsettling
% if p.is_unsettling.__and__(1)
&nbsp;
<span class="fa fa-check-circle" title="This account has been marked as unsettling by its owner."></span>
{{ icon('ok-sign', "This account has been marked as unsettling by its owner.") }}
% endif
</label>
<label class="text-warning">

View File

@ -1,14 +1,14 @@
% from "templates/macros/icons.html" import glyphicon
% from "templates/macros/icons.html" import icon with context
% macro find_donees(base_cls='btn btn-primary', extra_cls='btn-lg')
<a class="{{ base_cls }} {{ extra_cls }}" href="/explore/"
data-toggle="tooltip" data-placement="bottom"
title="{{ _('Find great people to donate to') }}">
{{ glyphicon('globe') }} <span>{{ _("Explore") }}</span>
{{ icon('explore') }} <span>{{ _("Explore") }}</span>
</a>
<a class="{{ base_cls }} {{ extra_cls }}" href="/search"
data-toggle="tooltip" data-placement="bottom"
title="{{ _('Whose work do you appreciate? See if they\'re on Liberapay') }}">
{{ glyphicon('search') }} <span>{{ _("Search") }}</span>
{{ icon('text-prompt') }} <span>{{ _("Search") }}</span>
</a>
% endmacro

View File

@ -4,7 +4,7 @@
% set platform = account.platform_data
<div class="account">
<a class="account-link" rel="me" href="{{ account.html_url }}">
{{ platform_logo(platform) }}
{{ platform_icon_large(platform) }}
<span class="sr-only">{{ platform.display_name }}:</span>
<span class="account-username">{{ account.friendly_name_long }}</span>
</a>
@ -42,20 +42,12 @@
</form>
% endmacro
% macro platform_icon(platform)
% if platform.fontawesome_name
<i class="platform-icon fa fa-{{ platform.fontawesome_name }} fa-brand-color" aria-hidden="true"></i>
% else
<img class="platform-icon" src="{{ platform.icon }}" aria-hidden="true" />
% endif
% macro platform_icon_small(platform)
<img class="icon" height=16 width=16 src="{{ platform.icon_16 }}" alt="{{ platform.display_name }}" />
% endmacro
% macro platform_logo(platform)
% if platform.fontawesome_name
<i class="account-type fa fa-{{ platform.fontawesome_name }} fa-brand-color" aria-hidden="true"></i>
% else
<img class="account-type" src="{{ platform.logo }}" aria-hidden="true" />
% endif
% macro platform_icon_large(platform)
<img class="icon" height=32 width=32 src="{{ platform.icon_32 }}" alt="{{ platform.display_name }}" />
% endmacro
% macro user_lookup_form()

View File

@ -1,5 +1,7 @@
{# Docs: http://docs.fineuploader.com/features/styling.html #}
% from "templates/macros/icons.html" import icon with context
% macro fine_uploader_template(cls='qq-uploader', dropzone=True, edit_filenames=True)
<div class="hidden" id="qq-template">
<div class="qq-uploader-selector {{ cls }}" qq-drop-area-text="{{ _('Drop files here') }}">
@ -27,7 +29,7 @@
<img class="qq-thumbnail-selector" qq-max-size="64" qq-server-scale>
<span class="qq-upload-file-selector qq-upload-file"></span>
% if edit_filenames
<span class="qq-edit-filename-icon-selector qq-edit-filename-icon" aria-label="{{ _('Edit filename') }}"><span class="glyphicon glyphicon-pencil"></span></span>
<span class="qq-edit-filename-icon-selector qq-edit-filename-icon" aria-label="{{ _('Edit filename') }}">{{ icon('text-prompt') }}</span>
<input class="qq-edit-filename-selector qq-edit-filename" tabindex="0" type="text">
% endif
<span class="qq-upload-size-selector qq-upload-size"></span>

View File

@ -1,16 +1,61 @@
% macro icon_span(classes)
<span class="{{ classes }}" aria-hidden="true"></span>
% endmacro
% set icons = {
'advertise': 'bootstrap-icons/broadcast.svg',
'bank-account': 'bootstrap-icons/bank2.svg',
'change-image': 'bootstrap-icons/images.svg',
'create-profile': 'bootstrap-icons/file-person.svg',
'direct-debit': 'bootstrap-icons/bank2.svg',
'disconnect': 'bootstrap-icons/x-lg.svg',
'discontinue': 'bootstrap-icons/stop-fill.svg',
'donations': 'bootstrap-icons/gift.svg',
'enter': 'bootstrap-icons/box-arrow-in-right.svg',
'external-link': 'bootstrap-icons/box-arrow-up-right.svg',
'exclamation-sign': 'bootstrap-icons/exclamation-circle-fill.svg',
'exit': 'bootstrap-icons/box-arrow-right.svg',
'explore': 'bootstrap-icons/globe2.svg',
'feed': 'bootstrap-icons/rss.svg',
'homepage': 'bootstrap-icons/house.svg',
'index': 'bootstrap-icons/list.svg',
'info-sign': 'bootstrap-icons/info-circle.svg',
'integrate': 'bootstrap-icons/gear.svg',
'liberapay': 'liberapay/icon-v2_black.svg',
'locale': 'bootstrap-icons/translate.svg',
'manual': 'bootstrap-icons/hand-index.svg',
'mark-as-read': 'bootstrap-icons/eye-fill.svg',
'markdown': 'bootstrap-icons/markdown-fill.svg',
'mastodon': 'bootstrap-icons/mastodon.svg',
'ok': 'bootstrap-icons/check-circle.svg',
'payment-card': 'bootstrap-icons/credit-card.svg',
'pledge': 'bootstrap-icons/balloon-heart.svg',
'private': 'bootstrap-icons/eye-slash.svg',
'public': 'bootstrap-icons/globe2.svg',
'ok-sign': 'bootstrap-icons/check-circle.svg',
'pay': 'bootstrap-icons/cash.svg',
'print': 'bootstrap-icons/printer.svg',
'question-sign': 'bootstrap-icons/question-circle.svg',
'refresh': 'bootstrap-icons/arrow-clockwise.svg',
'remove': 'bootstrap-icons/x-lg.svg',
'secret': 'bootstrap-icons/incognito.svg',
'secure': 'bootstrap-icons/shield-check.svg',
'set-up': 'bootstrap-icons/sliders.svg',
'smile': 'bootstrap-icons/emoji-smile.svg',
'stats': 'bootstrap-icons/bar-chart.svg',
'team': 'bootstrap-icons/people.svg',
'text-prompt': 'bootstrap-icons/input-cursor-text.svg',
'twitter': 'bootstrap-icons/twitter-x.svg',
'users': 'bootstrap-icons/person-add.svg',
'warning-sign': 'bootstrap-icons/exclamation-triangle-fill.svg',
}
% macro glyphicon(name, sr='')
<span class="glyphicon glyphicon-{{ name }}" aria-hidden="true" {% if sr %} title="{{ sr }}" {% endif %}></span>
% if sr
<span class="sr-only">{{ sr }}</span>
% macro icon(name, sr='', size=16)
% set svg_path = icons.get(name) or 'bootstrap-icons/' + name + '.svg'
% set svg = website.read_asset(svg_path)|safe
% if svg
<span aria-hidden="true" class="icon icon-{{ size }}" {% if sr %} title="{{ sr }}" {% endif %}>{{
svg
}}</span>
% else
<img aria-hidden="true" class="icon" {% if sr %} title="{{ sr }}" {% endif %} src="/assets/nonexistent" height={{size}} width={{size}} />
% endif
% endmacro
% macro fontawesome(name, sr='')
<span class="fa fa-{{ name }}" aria-hidden="true" {% if sr %} title="{{ sr }}" {% endif %}></span>
% if sr
<span class="sr-only">{{ sr }}</span>
% endif

View File

@ -1,4 +1,4 @@
% from "templates/macros/icons.html" import glyphicon
% from "templates/macros/icons.html" import icon with context
% from "templates/macros/postal-addresses.html" import postal_address_form_v2 with context
@ -63,7 +63,7 @@
<span title='{{ _(
"Your main professional activity."
) }}' data-toggle="tooltip" data-placement="top">{{
glyphicon('question-sign')
icon('question-sign')
}}</span>
</span>
<input name="occupation" {{ required }} maxlength=200

View File

@ -1,12 +1,11 @@
% from "templates/macros/icons.html" import fontawesome, icon_span
% from "templates/macros/icons.html" import icon with context
% macro nav(items, base='')
% set current = request.path.raw[len(base):].strip('/')
% for item in items
% set slug = item[0].strip('/')
% set options = item[2] if len(item) > 2 else {}
% set icon = options.get('icon')
% set icon = icon_span(icon) if icon else ''
% set icon = options.get('icon') or ''
% set dropdown = options.get('dropdown')
% set subnav = options.get('subnav')
% set togglable = options.get('togglable')
@ -69,7 +68,7 @@
% macro nav_admin()
{{ nav([
('/', fontawesome('home', "Index")),
('/', icon('index', "Index")),
('/admins', "Audit Log"),
('/cron', "Cron Jobs"),
('/debug', "Debugging"),

View File

@ -1,4 +1,17 @@
% from "templates/macros/icons.html" import fontawesome
% from "templates/macros/icons.html" import icon with context
% macro card_brands()
<span aria-hidden="true" class="card-brands">
{{ website.read_asset('card_brands/american-express.svg')|safe }}
{{ website.read_asset('card_brands/diners.svg')|safe }}
{{ website.read_asset('card_brands/discover.svg')|safe }}
{{ website.read_asset('card_brands/jcb.svg')|safe }}
{{ website.read_asset('card_brands/mastercard.svg')|safe }}
{{ website.read_asset('card_brands/unionpay.svg')|safe }}
{{ website.read_asset('card_brands/visa.svg')|safe }}
</span>
<span class="sr-only">American Express, Diners, Discover, JCB, Mastercard, UnionPay, Visa</span>
% endmacro
% macro describe_payment_methods(tippee)
{{ _(
@ -11,7 +24,7 @@
"({list_of_card_brands}), or by direct debit of a Euro bank account "
"(for donations in Euro only).",
username=tippee.username,
list_of_card_brands=["Visa", "Mastercard", "American Express", "UnionPay", "Discover", "Diners", "JCB"],
list_of_card_brands=["American Express", "Diners", "Discover", "JCB", "Mastercard", "UnionPay", "Visa"],
) if tippee.payment_providers == 1 else _(
"Donations to {username} are processed through PayPal.",
username=tippee.username
@ -20,7 +33,7 @@
"({list_of_card_brands}), a Euro bank account (SEPA Direct Debit), or "
"a PayPal account.",
username=tippee.username,
list_of_card_brands=["Visa", "Mastercard", "American Express", "UnionPay", "Discover", "Diners", "JCB"],
list_of_card_brands=["American Express", "Diners", "Discover", "JCB", "Mastercard", "UnionPay", "Visa"],
) }}
% endmacro
@ -28,20 +41,20 @@
<span class="payment-icons" title="{{ describe_payment_methods(tippee) }}"
data-toggle="tooltip" data-placement="bottom">
% if tippee.payment_providers.__and__(1)
{{ fontawesome('credit-card', _("Credit/Debit Card")) }}
{{ icon('payment-card', _("Payment Card")) }}
% if not currency or currency == 'EUR'
{{ fontawesome('bank', _("Direct Debit")) }}
{{ icon('bank-account', _("Direct Debit")) }}
% endif
% endif
% if tippee.payment_providers.__and__(2)
{{ fontawesome('paypal', "PayPal") }}
{{ icon('paypal', "PayPal") }}
% endif
</span>
% endmacro
% macro payment_method_icon(method)
{{ fontawesome('credit-card', _("Credit/Debit Card")) if method == 'stripe-card' else
fontawesome('bank', _("Direct Debit")) if method == 'stripe-sdd' else
fontawesome('paypal', "PayPal") if method == 'paypal' else
{{ icon('payment-card', _("Credit/Debit Card")) if method == 'stripe-card' else
icon('bank-account', _("Direct Debit")) if method == 'stripe-sdd' else
icon('paypal', "PayPal") if method == 'paypal' else
'' }}
% endmacro

View File

@ -1,4 +1,4 @@
% from "templates/macros/icons.html" import glyphicon
% from "templates/macros/icons.html" import icon with context
% macro postal_address_form_v2(prefix='postal_address', saved=None, required=True)
@ -19,9 +19,7 @@
<span>{{ _("Region (state, province, island…)") }}
<span title='{{ _(
"You can leave this field empty if your country does not use regions in postal addresses."
) }}' data-toggle="tooltip" data-placement="top">{{
glyphicon('question-sign')
}}</span>
) }}' data-toggle="tooltip" data-placement="top">{{ icon('question-sign') }}</span>
</span>
<input name="{{ prefix }}.region" class="form-control" maxlength=100
value="{{ saved.region|default('') }}" />

View File

@ -1,5 +1,5 @@
% from 'templates/macros/avatar-url.html' import avatar_img with context
% from 'templates/macros/elsewhere.html' import platform_icon
% from 'templates/macros/elsewhere.html' import platform_icon_small
% macro profile_box_embedded_wrapper(participant, path, style='default')
<div class="inline-box">
@ -61,7 +61,7 @@
% set p = e.participant
<h4><a href="{{ path }}">
{{ platform_icon(e.platform_data) if show_platform_icon else '' }}
{{ platform_icon_small(e.platform_data) if show_platform_icon else '' }}
<span>{{ e.friendly_name }}</span>
<span class="sr-only">({{ e.platform_data.display_name }})</span>
</a></h4>

View File

@ -1,4 +1,4 @@
% from "templates/macros/icons.html" import glyphicon
% from "templates/macros/icons.html" import icon with context
% macro show_repo(repo, donate=False, edit=False, unlist=False)
<div class="repo {{ 'edit' if edit or unlist else '' }}">
@ -8,7 +8,7 @@
{{ _("(fork)") if repo.is_fork else '' }}
</span>
% if repo.stars_count != None
<span class="inline-block text-nowrap"><small>{{ glyphicon('star') }} {{ repo.stars_count }}</small></span>
<span class="inline-block text-nowrap"><small>{{ icon('star') }} {{ repo.stars_count }}</small></span>
% endif
% set last_update = to_age(repo.last_update, granularity='week')
<span class="inline-block"><small>{{

View File

@ -1,10 +1,8 @@
% from "templates/macros/icons.html" import icon_span
% macro sign_in_link(icon_cls='', btn_cls='link')
% macro sign_in_link(icon='', btn_cls='link')
<form action="/sign-in" method="GET" {% if request.method not in constants.SAFE_METHODS
%} target="_blank" {% endif %}>
<button class="{{ btn_cls }}" name="back_to" value="{{ request.line.uri.decoded }}">
{{- icon_span(icon_cls) if icon_cls else '' -}}
{{- icon -}}
<span class="text">{{ _("Log In or Create Account") }}</span>
</button>
</form>

View File

@ -1,3 +1,5 @@
% from "templates/macros/icons.html" import icon with context
% set CLASSES = ('info', 'success', 'warning', 'danger')
% macro get_cls(m)
@ -70,8 +72,9 @@
locale.format_money(nominal_take, format='amount_only') if nominal_take.amount >= 0 else ''
}}" placeholder="auto" />
<div class="input-group-btn">
<button class="btn btn-default" title="{{ _('Update my nominal take') }}"
><i class="fa fa-edit"></i></button>
<button class="btn btn-default" title="{{ _('Update my nominal take') }}">{{
icon('save')
}}</button>
</div>
</div>
</form>

View File

@ -1,4 +1,4 @@
% from "templates/macros/icons.html" import fontawesome, glyphicon
% from "templates/macros/icons.html" import icon with context
% from "templates/macros/payment-methods.html" import payment_methods_icons with context
% macro tip_form(tippee, tip=None, disabled='')
@ -216,7 +216,7 @@
% elif tippee_p.payment_providers
<p class="text-center">{{ payment_methods_icons(tippee_p, new_currency) }}</p>
% elif not pledging
<p class="text-muted">{{ glyphicon('info-sign') }} {{ _(
<p class="text-muted">{{ icon('info-sign') }} {{ _(
"{username} hasn't configured any payment method yet, so your donation "
"cannot actually be processed right now. We will notify you when payment "
"becomes possible.",
@ -235,17 +235,17 @@
% endif
% endif
% if patron_visibilities == 1
<p class="text-info">{{ glyphicon('info-sign') }} {{ _(
<p class="text-info">{{ icon('info-sign') }} {{ _(
"{username} has chosen not to see who their patrons are, so your donation will be secret.",
username=tippee_name
) }}</p>
% elif patron_visibilities == 2 or paypal_only and not patron_visibilities
<p class="text-info">{{ glyphicon('info-sign') }} {{ _(
<p class="text-info">{{ icon('info-sign') }} {{ _(
"This donation won't be secret, you will appear in {username}'s private list of patrons.",
username=tippee_name
) }}</p>
% elif patron_visibilities == 4
<p class="text-warning">{{ glyphicon('info-sign') }} {{ _(
<p class="text-warning">{{ icon('info-sign') }} {{ _(
"{username} discloses who their patrons are, your donation will be public.",
username=tippee_name
) }}</p>
@ -299,7 +299,7 @@
% endif
</ul>
% else
<p class="text-muted">{{ glyphicon('info-sign') }} {{ _(
<p class="text-muted">{{ icon('info-sign') }} {{ _(
"{username} hasn't yet specified whether they want to see who their patrons are, "
"so your donation will be secret.",
username=tippee_name

View File

@ -24,7 +24,7 @@ subhead = _("Avatar")
[---] text/html
% from 'templates/macros/avatar-url.html' import avatar_img, avatar_url with context
% from "templates/macros/elsewhere.html" import auth_button with context
% from 'templates/macros/icons.html' import glyphicon
% from 'templates/macros/icons.html' import icon with context
% extends "templates/layouts/profile-edit.html"
@ -66,19 +66,19 @@ subhead = _("Avatar")
<div class="buttons">
<a class="btn btn-default" target="_blank" rel="noopener noreferrer"
href="https://www.libravatar.org/accounts/login/">
{{ glyphicon('edit') }}
{{ icon('change-image') }}
<span>{{ _("Modify your Libravatar") }}</span>
</a>
&nbsp;&nbsp;&nbsp;&nbsp;
<a class="btn btn-default btn-sm" target="_blank" rel="noopener noreferrer"
href="https://www.libravatar.org/">
{{ glyphicon('info-sign') }}
{{ icon('info-sign') }}
<span>{{ _("What is Libravatar?") }}</span>
</a>
<br><br>
% if participant.avatar_url and request.method == 'GET'
<button class="btn btn-default" data-action="reload" type="button">
{{ glyphicon('refresh') }} <span>{{ _("Refresh") }}</span>
{{ icon('refresh') }} <span>{{ _("Refresh") }}</span>
</button>
<noscript><span class="text-danger">{{ _("JavaScript is required") }}</span></noscript>
% endif

View File

@ -55,7 +55,7 @@ title = participant.username
subhead = _("Currencies")
[---] text/html
% from "templates/macros/icons.html" import glyphicon
% from "templates/macros/icons.html" import icon with context
% extends "templates/layouts/profile-edit.html"
@ -101,14 +101,14 @@ subhead = _("Currencies")
% endfor
</table>
<p class="text-info">{{ glyphicon('info-sign') }} {{ _(
<p class="text-info">{{ icon('info-sign') }} {{ _(
"Accepting foreign currencies can increase your income by convincing "
"people in other countries to donate to you, but international payments "
"usually result in a higher percentage of fees, and fluctuations in "
"exchange rates can lessen the stability of your income."
) }}</p>
<p class="text-warning">{{ glyphicon('info-sign') }} {{ _(
<p class="text-warning">{{ icon('info-sign') }} {{ _(
"Stripe automatically converts funds into your main currency, but by "
"default PayPal holds payments in foreign currencies until you tell it "
"what to do. If you have a Business PayPal account, you can choose to "

View File

@ -9,7 +9,7 @@ subhead = _("Linked Accounts")
[---] text/html
% extends "templates/layouts/profile-edit.html"
% from "templates/macros/elsewhere.html" import account_elsewhere, auth_button, platform_logo with context
% from "templates/macros/elsewhere.html" import account_elsewhere, auth_button, platform_icon_large with context
% block form
@ -47,7 +47,7 @@ subhead = _("Linked Accounts")
% set disabled_msg = None
% endif
% call auth_button(platform.name, 'connect', btn_cls='no-default-styles', form_cls='btn btn-default', participant=participant, disabled=disabled, disabled_msg=disabled_msg)
{{ platform_logo(platform) }}<br>{{ platform.display_name }}
{{ platform_icon_large(platform) }}<br>{{ platform.display_name }}
% endcall
% endfor
</div>

View File

@ -181,7 +181,7 @@ subhead = _("Descriptions")
class="form-control profile-statement vertical-resize"
placeholder="{{ _('Full description in {language}', language=locale.Language(lang)) }}"
>{{ statement or '' }}</textarea>
<p class="help-block pull-right">{{ _("Markdown supported.") }}
<p class="help-block pull-right">{{ icon('markdown') }} {{ _("Markdown supported.") }}
<a href="https://daringfireball.net/projects/markdown/basics"
target="_blank" rel="noopener noreferrer">{{ _("What is Markdown?") }}</a>
</p>

View File

@ -64,6 +64,7 @@ email_locale = website.locales.get(participant.email_lang) or website.locales['e
[---] text/html
% extends "templates/layouts/settings.html"
% from "templates/macros/icons.html" import icon with context
% from "templates/macros/select-lang.html" import lang_options with context
% block content
@ -133,7 +134,7 @@ email_locale = website.locales.get(participant.email_lang) or website.locales['e
</div>
<button class="btn btn-default">{{ _("Save changes") }}</button>
<br><br>
<p class="text-info">{{ glyphicon('info-sign') }} {{ _(
<p class="text-info">{{ icon('info-sign') }} {{ _(
"Some types of notifications cannot be turned off, so they are not "
"listed above. For example you will always be notified when we are "
"preparing to debit your bank account."

View File

@ -146,8 +146,8 @@ next_payday = compute_next_payday_date()
% extends "templates/layouts/settings.html"
% from "templates/macros/avatar-url.html" import avatar_img with context
% from 'templates/macros/elsewhere.html' import platform_icon
% from "templates/macros/icons.html" import fontawesome, glyphicon
% from 'templates/macros/elsewhere.html' import platform_icon_small
% from "templates/macros/icons.html" import icon with context
% from "templates/macros/payment-methods.html" import payment_methods_icons with context
% block content
@ -182,7 +182,7 @@ next_payday = compute_next_payday_date()
% if show_automatic_renewal_hint
<div class="text-info">
{{ glyphicon('info-sign') }} {{ _(
{{ icon('info-sign') }} {{ _(
"Liberapay now supports automatic renewals, do you want to switch it "
"on for all your donations?"
) }}
@ -204,7 +204,7 @@ next_payday = compute_next_payday_date()
% if show_visibility_hint
<div class="text-info">
{{ glyphicon('info-sign') }} {{ _(
{{ icon('info-sign') }} {{ _(
"Liberapay now supports non-anonymous donations, do you want to "
"modify the visibility of all your donations at once?"
) }}
@ -227,7 +227,7 @@ next_payday = compute_next_payday_date()
% endif
% elif show_incomplete_profile_warning
<div class="text-info">
{{ glyphicon('info-sign') }} {{ _(
{{ icon('info-sign') }} {{ _(
"Since you've chosen to make a public donation, we recommend that you "
"complete your public profile."
) }}
@ -310,7 +310,7 @@ next_payday = compute_next_payday_date()
}}</a>
<button class="btn btn-default btn-xs" name="tippee" value="{{ tip.tippee }}"
title="{{ _('Discontinue the donation') }}">
<span class="text-danger">{{ glyphicon('minus-sign') }}</span>
<span class="text-danger">{{ icon('discontinue') }}</span>
</button>
</span>
</div>
@ -329,42 +329,42 @@ next_payday = compute_next_payday_date()
% endif
<p>
% if tip.visibility == 3
{{ fontawesome('eye') }} {{ _("Public donation") }}
{{ icon('public') }} {{ _("Public donation") }}
% elif tip.visibility == 2
{{ fontawesome('eye-slash') }} {{ _("Private donation") }}
{{ icon('private') }} {{ _("Private donation") }}
% else
{{ fontawesome('user-secret') }} {{ _("Secret donation") }}
{{ icon('secret') }} {{ _("Secret donation") }}
% endif
&nbsp;&nbsp;
% if tip.renewal_mode == 2
% if tip.tippee_p.payment_providers == 2
</p><p class="text-warning">{{ fontawesome('repeat') }} {{ _(
</p><p class="text-warning">{{ icon('repeat') }} {{ _(
"Automatic renewals are enabled for this donation, but are "
"currently impossible due to payment processor limitations."
) }}</p>
% else
{{ fontawesome('repeat') }} {{ _("Automatic renewal") }}
{{ icon('repeat') }} {{ _("Automatic renewal") }}
% endif
% else
{{ fontawesome('hand-pointer-o') }} {{ _("Manual renewal") }}
{{ icon('manual') }} {{ _("Manual renewal") }}
% endif
</p>
% if tippee.is_suspended
<p class="text-warning">{{ glyphicon('warning-sign') }} {{ _(
<p class="text-warning">{{ icon('warning-sign') }} {{ _(
"Inactive because the account of the recipient is blacklisted."
) }}</p>
% elif tippee.status == 'closed'
<p class="text-warning">{{ glyphicon('warning-sign') }} {{ _(
<p class="text-warning">{{ icon('warning-sign') }} {{ _(
"Inactive because the account of the recipient is closed."
) }}</p>
% elif not tippee.accepts_tips
<p class="text-warning">{{ glyphicon('warning-sign') }} {{ _(
<p class="text-warning">{{ icon('warning-sign') }} {{ _(
"Inactive because the recipient no longer accepts donations."
) }}</p>
% elif tip.paid_in_advance and tip.paid_in_advance >= tip.amount
% set weeks_remaning = int(tip.paid_in_advance / tip.amount)
<p>
<span class="text-success">{{ glyphicon('ok-sign') }} {{ _("Active") }}</span>
<span class="text-success">{{ icon('ok') }} {{ _("Active") }}</span>
&nbsp;&nbsp;
% set delta = timedelta(weeks=weeks_remaning - 1)
{{ _(
@ -380,22 +380,22 @@ next_payday = compute_next_payday_date()
</p>
% else
% if tip.tippee in has_pending_transfer
<p class="text-warning">{{ glyphicon('exclamation-sign') }} {{
<p class="text-warning">{{ icon('info-sign') }} {{
_("Pending payment completion.")
}}</p>
<br>
% elif tip.payment_providers
<p class="text-danger">{{ glyphicon('exclamation-sign') }} {{ _(
<p class="text-danger">{{ icon('exclamation-sign') }} {{ _(
"You need to initiate a new payment to fund this donation. "
"Click on the button below to proceed."
) }}</p>
<a class="btn btn-primary"
href="{{ participant.path('giving/pay/') }}?beneficiary={{ tippee.id }}">
{{ fontawesome('repeat') }} {{ _("Renew") }}
{{ icon('repeat') }} {{ _("Renew") }}
</a>
&nbsp; {{ payment_methods_icons(tippee, tip.amount.currency) }}
% else
<p class="text-danger">{{ glyphicon('exclamation-sign') }} {{ _(
<p class="text-danger">{{ icon('warning-sign') }} {{ _(
"Cannot be renewed because the account of the recipient isn't ready to receive new payments."
) }}</p>
% endif
@ -436,7 +436,7 @@ next_payday = compute_next_payday_date()
}}</a></div>
<div class="col-2">
<a class="username" href="{{ e.liberapay_path }}">
{{ platform_icon(e.platform_data) }}
{{ platform_icon_small(e.platform_data) }}
{{ e.friendly_name }}
<span class="sr-only">({{ e.platform_data.display_name }})</span>
</a>
@ -461,7 +461,9 @@ next_payday = compute_next_payday_date()
}}</a>
<button class="btn btn-default btn-xs" name="tippee" value="{{ tip.tippee }}"
title="{{ _('Cancel the pledge') }}">
<span class="text-warning">{{ glyphicon('remove', _('Cancel the pledge')) }}</span>
<span class="text-warning">{{
icon('remove', _('Cancel the pledge'))
}}</span>
</button>
</span>
</div>
@ -526,7 +528,9 @@ next_payday = compute_next_payday_date()
}}</a>
<button class="btn btn-default btn-xs" name="hide" value="{{ tip.tippee }}"
title="{{ _('Hide') }}">
<span class="text-danger">{{ glyphicon('remove', _('Hide')) }}</span>
<span class="text-danger">{{
icon('remove', _('Hide'))
}}</span>
</button>
</span>
</div>
@ -538,7 +542,7 @@ next_payday = compute_next_payday_date()
timespan_ago_2=to_age(tip.mtime)
) }}</p>
% if tip.paid_in_advance and tip.paid_in_advance >= tip.amount
<p class="text-info">{{ glyphicon('info-sign') }} {{ _(
<p class="text-info">{{ icon('info-sign') }} {{ _(
"This stopped donation still has {money_amount} paid in advance. "
"That advance will be consumed every week until it reaches zero.",
money_amount=tip.paid_in_advance
@ -562,7 +566,7 @@ next_payday = compute_next_payday_date()
}}</a></div>
<div class="col-2">
<a class="username" href="{{ e.liberapay_path }}">
{{ platform_icon(e.platform_data) }}
{{ platform_icon_small(e.platform_data) }}
{{ e.friendly_name }}
<span class="sr-only">({{ e.platform_data.display_name }})</span>
</a>
@ -587,7 +591,9 @@ next_payday = compute_next_payday_date()
}}</a>
<button class="btn btn-default btn-xs" name="hide" value="{{ tip.tippee }}"
title="{{ _('Hide') }}">
<span class="text-danger">{{ glyphicon('remove', _('Hide')) }}</span>
<span class="text-danger">{{
icon('remove', _('Hide'))
}}</span>
</button>
</span>
</div>

View File

@ -176,7 +176,9 @@ if user == payer:
title = _("Funding your donations")
[---] text/html
% from "templates/macros/icons.html" import fontawesome, glyphicon
% from "templates/macros/icons.html" import icon with context
% from "templates/macros/payment-methods.html" import card_brands with context
% extends "templates/layouts/base-thin.html"
% block thin_content
@ -194,7 +196,7 @@ title = _("Funding your donations")
% endif
% if currency_conflicts
<p class="text-warning">{{ glyphicon('warning-sign') }} &nbsp;{{ ngettext(
<p class="text-warning">{{ icon('warning-sign') }} &nbsp;{{ ngettext(
"You have {n} donation which needs to be modified because the "
"recipient no longer accepts the currency you had chosen.",
"You have {n} donations which need to be modified because the "
@ -213,7 +215,7 @@ title = _("Funding your donations")
% endif
% if n_payments > 1
<p class="text-info">{{ glyphicon('info-sign') }} &nbsp;{{ ngettext(
<p class="text-info">{{ icon('info-sign') }} &nbsp;{{ ngettext(
"",
"Due to legal and technical limitations we are currently unable to process "
"all your donations as a single payment. Instead you will have to make {n} "
@ -246,7 +248,7 @@ title = _("Funding your donations")
"Your donations to {recipients} are awaiting payment.",
recipients=payment.recipient_names
) }}</p>
<p class="text-success">{{ glyphicon('ok') }} &nbsp;{{ _(
<p class="text-success">{{ icon('check-lg') }} &nbsp;{{ _(
"We are able to group these donations into a single payment."
) }}</p>
% endif
@ -263,12 +265,12 @@ title = _("Funding your donations")
% if provider == 'stripe'
<div class="panel panel-default {{ '' if allow_stripe_card else 'muted' }}">
<div class="panel-body overlaid">
<p class="payment-icon">{{ fontawesome('credit-card-alt') }}</p>
<h4>{{ _("Card") }}<br>
{{ icon('payment-card', size=32) }}
<h4>{{ _("Credit/Debit Card") }}<br>
% if not allow_stripe_card
<small class="text-danger">{{ _("Currently unavailable") }}</small>
% else
<small>Visa, MasterCard, American Express, UnionPay, Discover, Diners</small>
<small>{{ card_brands() }}</small>
% endif
</h4>
% if allow_stripe_card
@ -281,7 +283,7 @@ title = _("Funding your donations")
% set warn = payer.guessed_country not in constants.SEPA
<div class="panel panel-default {{ '' if possible else 'muted' }}">
<div class="panel-body overlaid">
<p class="payment-icon">{{ fontawesome('bank') }}</p>
{{ icon('direct-debit', size=32) }}
<h4>{{ _("Direct Debit") }}<br>
% if not allow_stripe_sdd
<small class="text-danger">{{ _("Currently unavailable") }}</small>
@ -301,7 +303,7 @@ title = _("Funding your donations")
% set possible = allow_paypal and payment.currency in constants.PAYPAL_CURRENCIES
<div class="panel panel-default {{ '' if possible else 'muted' }}">
<div class="panel-body overlaid">
<p class="payment-icon">{{ fontawesome('paypal') }}</p>
{{ icon('paypal', size=32) }}
<h4>PayPal<br>
% if not allow_paypal
<small class="text-danger">{{ _("Currently unavailable") }}</small>

View File

@ -129,6 +129,8 @@ title = _("Funding your donations")
[---] text/html
% extends "templates/layouts/base-thin.html"
% from "templates/macros/icons.html" import icon with context
% block thin_content
% if payin is defined
@ -256,13 +258,13 @@ title = _("Funding your donations")
</ul>
</fieldset>
<p class="text-info">{{ glyphicon('info-sign') }} {{ _(
<p class="text-info">{{ icon('info-sign') }} {{ _(
"Liberapay does not store money, the entire amount of your payment will "
"go immediately to the {payment_provider} accounts of the recipients.",
payment_provider='PayPal',
) }}</p>
<div class="text-warning">{{ glyphicon('warning-sign') }} {{ _(
<div class="text-warning">{{ icon('warning-sign') }} {{ _(
"PayPal reveals your name and email address to the recipient."
) }}</div>

View File

@ -260,10 +260,11 @@ if user == payer:
title = _("Funding your donations")
[---] text/html
% from "templates/macros/postal-addresses.html" import postal_address_form_v2 with context
% extends "templates/layouts/base-thin.html"
% from "templates/macros/icons.html" import icon with context
% from "templates/macros/postal-addresses.html" import postal_address_form_v2 with context
% block thin_content
% if client_secret is defined
@ -445,7 +446,7 @@ title = _("Funding your donations")
</ul>
</fieldset>
<div class="text-info">{{ glyphicon('info-sign') }} {{ _(
<div class="text-info">{{ icon('info-sign') }} {{ _(
"Liberapay does not store money, the entire amount of your payment will "
"go immediately to the {payment_provider} accounts of the recipients.",
payment_provider='Stripe',
@ -506,7 +507,7 @@ title = _("Funding your donations")
class="form-control mb-3" placeholder="{{ _('Jane Doe') }}" />
<div id="stripe-element" data-type="card" class="form-control mb-3"></div>
<span id="stripe-errors" role="alert" class="invalid-msg"></span>
<p class="help-block">{{ glyphicon('lock') }} {{ _(
<p class="help-block">{{ icon('secure') }} {{ _(
"This data will be sent directly to the payment processor "
"{name} through an encrypted connection.",
name='<a href="https://stripe.com/" target="_blank" rel="noopener noreferrer">Stripe</a>'|safe

View File

@ -81,7 +81,7 @@ if action:
[---] text/html
% extends "templates/layouts/settings.html"
% from "templates/macros/icons.html" import glyphicon
% from "templates/macros/icons.html" import icon with context
% block content
@ -170,7 +170,7 @@ if action:
<input type="date" name="new_date" value="{{ sp.execution_date }}"
class="form-control" placeholder="{{ _('YYYY-MM-DD') }}" />
</div>
<p class="text-warning">{{ glyphicon('warning-sign') }} {{ _(
<p class="text-warning">{{ icon('warning-sign') }} {{ _(
"Delaying your payment beyond its normal date will result in your donation "
"being inactive during that time."
) }}</p>

View File

@ -92,6 +92,7 @@ show_income = not participant.hide_receiving and participant.accepts_tips
% extends "templates/layouts/profile.html"
% from "templates/macros/elsewhere.html" import account_elsewhere with context
% from "templates/macros/icons.html" import icon with context
% from "templates/macros/profile-box.html" import profile_box_embedded with context
% from "templates/macros/repos.html" import show_repo with context
@ -111,7 +112,7 @@ show_income = not participant.hide_receiving and participant.accepts_tips
<span class="btn-sm">{{ language_name_in_current_locale }}</span>
% endif
<button class="dropdown-toggle btn font-lg" type="button" data-toggle="dropdown">
{{ fontawesome('language') }} <span class="caret"></span>
{{ icon('locale') }} <span class="caret"></span>
<span class="sr-only">{{ _("Show the list of languages") }}</span>
</button>
<ul class="dropdown-menu dropdown-menu-right">
@ -221,7 +222,7 @@ show_income = not participant.hide_receiving and participant.accepts_tips
% if patron_visibilities > 1 and n_public_patrons
<h3>{{ _("Patrons") }}
&nbsp;
<small><a href="{{ participant.path('patrons/public.csv') }}">{{ fontawesome('download', _("Export as CSV")) }}</a></small>
<small><a href="{{ participant.path('patrons/public.csv') }}">{{ icon('download', _("Export as CSV")) }}</a></small>
</h3>
<p>{{ ngettext(
@ -244,7 +245,7 @@ show_income = not participant.hide_receiving and participant.accepts_tips
</a>
% if participant.hide_receiving
% elif p.hide_giving
<div class="text-muted">{{ fontawesome('eye-slash', _(
<div class="text-muted">{{ icon('private', _(
"{username} doesn't publish how much they give.",
username=p.name
)) }}</div>
@ -263,7 +264,7 @@ show_income = not participant.hide_receiving and participant.accepts_tips
% if n_public_donees
<h3>{{ _("Donees") }}
&nbsp;
<small><a href="{{ participant.path('giving/public.csv') }}">{{ fontawesome('download', _("Export as CSV")) }}</a></small>
<small><a href="{{ participant.path('giving/public.csv') }}">{{ icon('download', _("Export as CSV")) }}</a></small>
</h3>
<p>{{ ngettext(
@ -282,7 +283,7 @@ show_income = not participant.hide_receiving and participant.accepts_tips
</a>
% if participant.hide_giving
% elif p.hide_receiving
<div class="text-muted">{{ fontawesome('eye-slash', _(
<div class="text-muted">{{ icon('private', _(
"{username} does not disclose how much they receive through Liberapay.",
username=p.name
)) }}</div>

View File

@ -80,10 +80,11 @@ if request.method == 'POST':
title = _("Invoice {someone}", someone=addressee.username)
[---] text/html
% from "templates/macros/currencies.html" import currency_buttons with context
% extends "templates/layouts/base.html"
% from "templates/macros/currencies.html" import currency_buttons with context
% from "templates/macros/icons.html" import icon with context
% block content
<noscript class="alert alert-danger">{{ _("JavaScript is required") }}</noscript>
@ -129,7 +130,7 @@ title = _("Invoice {someone}", someone=addressee.username)
placeholder="{{ _('Details of the invoice (e.g. the breakdown of the amount into its components)') }}"
maxlength=4096>{{ invoice.details or '' }}</textarea>
<p class="help-block">
{{ _("Markdown supported.") }}
{{ icon('markdown') }} {{ _("Markdown supported.") }}
<a href="https://daringfireball.net/projects/markdown/basics"
target="_blank" rel="noopener noreferrer">{{ _("What is Markdown?") }}</a>
</p>

View File

@ -57,7 +57,7 @@ if participant.join_time:
years = list(range(current_year, max(participant.join_time.year, 2018) - 1, -1))
[---] text/html
% from "templates/macros/icons.html" import fontawesome, glyphicon
% from "templates/macros/icons.html" import icon with context
% from "templates/macros/payment-methods.html" import payment_method_icon with context
% extends "templates/layouts/settings.html"
@ -186,7 +186,7 @@ if participant.join_time:
% if show_id
<td class="id">{{ event['id'] }}
{%- if event['remote_id'] and event['payin_method'].startswith('stripe-') %}
<a href="https://dashboard.stripe.com/payments/{{ event['remote_id'] }}">{{ fontawesome('external-link-square') }}</a>
<a href="https://dashboard.stripe.com/payments/{{ event['remote_id'] }}">{{ icon('external-link') }}</a>
{%- endif -%}
</td>
% endif
@ -328,7 +328,7 @@ if participant.join_time:
</div>
% if year == 2018 and had_wallet
<p class="text-info">{{ glyphicon('info-sign') }} {{ _(
<p class="text-info">{{ icon('info-sign') }} {{ _(
"To view the transactions processed in the past by Mangopay "
"{link_start}go to the Wallet page{link_end}."
, link_start=('<a href="%s">'|safe) % participant.path('wallet/')

View File

@ -36,6 +36,8 @@ participant.render_notifications(state, before=before, limit=limit)
[---] text/html
% extends "templates/layouts/settings.html"
% from "templates/macros/icons.html" import icon with context
% block content
<form action="" method="POST">
<input type="hidden" name="csrf_token" value="{{ csrf_token }}" />
@ -71,12 +73,14 @@ participant.render_notifications(state, before=before, limit=limit)
% endif
<span class="actions">
% if notif.is_new
<button class="glyphicon glyphicon-eye-open hover-info" name="mark_as_read" value="{{ notif.id }}" title="{{
_('Mark as read') }}"></button>&nbsp;
<button class="hover-info" name="mark_as_read" value="{{ notif.id }}">{{
icon('mark-as-read', _('Mark as read'))
}}</button>&nbsp;
% endif
% if not notif.hidden_since
<button class="glyphicon glyphicon-remove hover-danger" name="remove" value="{{ notif.id }}" title="{{
_('Remove') }}"></button>
<button class="hover-danger" name="remove" value="{{ notif.id }}">{{
icon('remove', _("Remove"))
}}</button>
% endif
</span>
</h3>

View File

@ -35,7 +35,7 @@ subhead = _("Patrons")
[---] text/html
% extends "templates/layouts/settings.html"
% from "templates/macros/icons.html" import fontawesome, glyphicon with context
% from "templates/macros/icons.html" import icon with context
% block content
@ -67,14 +67,14 @@ subhead = _("Patrons")
"be turned on or off, but at least one of them must be enabled."
) }}</p>
% if participant.payment_providers == 2 and new_patron_visibilities.__and__(1)
<p class="text-danger">{{ glyphicon('exclamation-sign') }} {{ _(
<p class="text-danger">{{ icon('exclamation-sign') }} {{ _(
"Secret donations aren't possible with PayPal. You should either disable "
"secret donations or {link_start}add a Stripe account{link_end}.",
link_start=('<a href="%s">'|safe) % participant.path('payment/'),
link_end='</a>'|safe,
) }}</p>
% else
<p class="text-warning">{{ glyphicon('info-sign') }} {{ _(
<p class="text-warning">{{ icon('info-sign') }} {{ _(
"Secret donations aren't possible when the payer uses PayPal."
) }}</p>
% endif
@ -113,10 +113,10 @@ subhead = _("Patrons")
% if patron_visibilities > 1
<h3>{{ _("Data export") }}</h3>
<p><a href="{{ participant.path('patrons/export.csv?scope=active') }}">{{ fontawesome('download') }} {{
<p><a href="{{ participant.path('patrons/export.csv?scope=active') }}">{{ icon('download') }} {{
_("Download the list of currently active patrons")
}}</a></p>
<p><a href="{{ participant.path('patrons/export.csv?scope=all') }}">{{ fontawesome('download') }} {{
<p><a href="{{ participant.path('patrons/export.csv?scope=all') }}">{{ icon('download') }} {{
_("Download the record of all patrons in the last ten years")
}}</a></p>

View File

@ -103,7 +103,7 @@ title = participant.username
subhead = _("Payment Processors")
[---] text/html
% from "templates/macros/icons.html" import fontawesome, glyphicon
% from "templates/macros/icons.html" import icon with context
% extends "templates/layouts/settings.html"
@ -137,7 +137,7 @@ subhead = _("Payment Processors")
"supported payment processor. This page allows you to do so."
) }}</p>
<p class="text-info">{{ glyphicon('info-sign') }} {{ _(
<p class="text-info">{{ icon('info-sign') }} {{ _(
"Donors do not need to connect any payment account below, they are only "
"necessary to receive money."
) }}</p>
@ -152,7 +152,7 @@ subhead = _("Payment Processors")
link_close='</a>'|safe,
) }}</p>
% elif not accounts
<p class="text-info">{{ glyphicon('info-sign') }} {{ _(
<p class="text-info">{{ icon('info-sign') }} {{ _(
"We recommend connecting both Stripe and PayPal if they're both available "
"in your country."
) }}</p>
@ -172,10 +172,10 @@ subhead = _("Payment Processors")
<form class="card card-default" action="" method="POST">
<input type="hidden" name="csrf_token" value="{{ csrf_token }}" />
<input type="hidden" name="account_pk" value="{{ account.pk }}" />
<button class="corner-icon fa fa-close" name="action" value="disconnect"
title="{{ _('Disconnect') }}"></button>
<button class="corner-icon fa fa-refresh" name="action" value="refresh"
title="{{ _('Refresh') }}"></button>
<button class="corner-icon" name="action" value="disconnect"
title="{{ _('Disconnect') }}">{{ icon('disconnect') }}</button>
<button class="corner-icon" name="action" value="refresh"
title="{{ _('Refresh') }}">{{ icon('refresh') }}</button>
% if account.display_name
<h4>{{ account.display_name }}</h4>
{{ _("Account ID: {0}", account.id) }}<br>
@ -190,14 +190,14 @@ subhead = _("Payment Processors")
</p>
<p class="text-muted">{{ _("Added on {date}", date=account.connection_ts.date()) }}</p>
% if not account.charges_enabled
<p class="text-warning">{{ glyphicon('exclamation-sign') }} {{ _(
<p class="text-warning">{{ icon('exclamation-sign') }} {{ _(
"This account cannot receive payments. To fix this, log in to the "
"account and complete the verification process. After that, reconnect "
"the account if you still see this message."
) }}</p>
% endif
<a href="https://dashboard.stripe.com/{{ account.id }}" target="_blank" rel="noopener noreferrer">{{
fontawesome("external-link") }} {{ _(
icon("external-link") }} {{ _(
"Manage this {platform} account", platform="Stripe"
) }}</a>
</form>
@ -206,11 +206,11 @@ subhead = _("Payment Processors")
<br>
% elif country in locale.countries
% if country in constants.PAYOUT_COUNTRIES['stripe']
<p class="text-success">{{ glyphicon('ok-sign') }} {{ _(
<p class="text-success">{{ icon('ok-sign') }} {{ _(
"Available in {country}.", country=Country(country)
) }}</p>
% else
<p class="text-danger">{{ glyphicon('exclamation-sign') }} {{ _(
<p class="text-danger">{{ icon('exclamation-sign') }} {{ _(
"Not available in {country}.", country=Country(country)
) }}</p>
% endif
@ -241,8 +241,8 @@ subhead = _("Payment Processors")
<input type="hidden" name="csrf_token" value="{{ csrf_token }}" />
% for account in paypal_accounts
<div class="card card-default">
<button class="corner-icon fa fa-close" name="account_pk" value="{{ account.pk }}"
title="{{ _('Disconnect') }}"></button>
<button class="corner-icon" name="account_pk" value="{{ account.pk }}"
title="{{ _('Disconnect') }}">{{ icon('disconnect') }}</button>
% if account.display_name
<h4>{{ account.display_name }}</h4>
{{ _("Account ID: {0}", account.id) }}<br>
@ -257,18 +257,18 @@ subhead = _("Payment Processors")
</p>
<p class="text-muted">{{ _("Added on {date}", date=account.connection_ts.date()) }}</p>
% if not account.verified
<p class="text-warning">{{ glyphicon('exclamation-sign') }} {{
<p class="text-warning">{{ icon('exclamation-sign') }} {{
_("The email address '{0}' is not verified.", account.id)
}}</p>
% elif account.charges_enabled == False
<p class="text-warning">{{ glyphicon('exclamation-sign') }} {{ _(
<p class="text-warning">{{ icon('exclamation-sign') }} {{ _(
"This account cannot receive payments. To fix this, log in to the "
"account and complete the verification process. After that, reconnect "
"the account if you still see this message."
) }}</p>
% endif
<a href="https://www.paypal.com/signin" target="_blank" rel="noopener noreferrer">{{
fontawesome("external-link") }} {{ _(
icon("external-link") }} {{ _(
"Manage this {platform} account", platform="PayPal"
) }}</a>
</div>
@ -277,11 +277,11 @@ subhead = _("Payment Processors")
<br>
% elif country in locale.countries
% if country in constants.PAYOUT_COUNTRIES['paypal']
<p class="text-success">{{ glyphicon('ok-sign') }} {{ _(
<p class="text-success">{{ icon('ok-sign') }} {{ _(
"Available in {country}.", country=Country(country)
) }}</p>
% else
<p class="text-danger">{{ glyphicon('exclamation-sign') }} {{ _(
<p class="text-danger">{{ icon('exclamation-sign') }} {{ _(
"Not available in {country}.", country=Country(country)
) }}</p>
% endif

View File

@ -44,7 +44,7 @@ recent_donation_changes = website.db.all("""
[-----------------------------------------------------------------------------]
% extends "templates/layouts/settings.html"
% from "templates/macros/icons.html" import glyphicon with context
% from "templates/macros/icons.html" import icon with context
% from "templates/macros/team-members.html" import team_takes_table with context
% block content
@ -111,7 +111,7 @@ recent_donation_changes = website.db.all("""
% if recent_donation_changes or participant.receiving > participant.taking
<h3>{{ _("Details of Donations") }}</h3>
% if participant.taking
<p class="text-info">{{ glyphicon('info-sign') }} {{ _(
<p class="text-info">{{ icon('info-sign') }} {{ _(
"This section doesn't include data on donations through teams, it only "
"shows the donations that you receive personally."
) }}</p>

View File

@ -65,7 +65,7 @@ network = request.qs['type']
title = _("Add a payment instrument")
[---] text/html
% from "templates/macros/icons.html" import fontawesome
% from "templates/macros/icons.html" import icon with context
% from "templates/macros/postal-addresses.html" import postal_address_form_v2 with context
% extends "templates/layouts/settings.html"
@ -87,7 +87,7 @@ title = _("Add a payment instrument")
<div id="stripe-element" data-type="card" class="form-control mb-3"></div>
<span id="stripe-errors" role="alert" class="invalid-msg"></span>
</div>
<p class="help-block">{{ glyphicon('lock') }} {{ _(
<p class="help-block">{{ icon('secure') }} {{ _(
"This data will be sent directly to the payment processor "
"{name} through an encrypted connection.",
name='<a href="https://stripe.com/" target="_blank" rel="noopener noreferrer">Stripe</a>'|safe

View File

@ -66,7 +66,8 @@ title = _("Payment Instruments")
[---] text/html
% extends "templates/layouts/settings.html"
% from "templates/macros/icons.html" import fontawesome
% from "templates/macros/icons.html" import icon with context
% from "templates/macros/payment-methods.html" import card_brands with context
% block content
@ -98,8 +99,8 @@ title = _("Payment Instruments")
% for route, last_payin in routes
<div class="payment-instrument{% if route.status not in ('chargeable', 'pending') %} text-muted{% endif %}">
<span>{{
fontawesome('credit-card', _("Credit/Debit Card")) if route.network == 'stripe-card' else
fontawesome('bank', _("Bank Account")) if route.network == 'stripe-sdd' else
icon('payment-card', _("Payment Card"), size=32) if route.network == 'stripe-card' else
icon('bank-account', _("Bank Account"), size=32) if route.network == 'stripe-sdd' else
''
}}</span>
<span>
@ -207,24 +208,24 @@ title = _("Payment Instruments")
<div class="payment-methods">
<div class="panel panel-default">
<div class="panel-body overlaid">
<p class="payment-icon">{{ fontawesome('credit-card') }}</p>
{{ icon('payment-card', size=32) }}
<h4>{{ _("Credit/Debit Card") }}<br>
<small>Visa, MasterCard, American Express, UnionPay, Discover, Diners</small>
<small>{{ card_brands() }}</small>
</h4>
<a class="overlay" href="{{ participant.path('routes/add') }}?type=stripe-card"
><span class="sr-only">{{ _("Add a card") }}</span></a>
</div>
</div>
% set warn = participant.guessed_country not in constants.SEPA
<div class="panel panel-default {{ '' if has_euro_donations else 'muted' }}">
<div class="panel-body overlaid">
<p class="payment-icon">{{ fontawesome('bank') }}</p>
{{ icon('bank-account', size=32) }}
<h4>{{ _("Bank Account") }}<br>
% if not has_euro_donations
<small class="text-warning">{{ _("Euro donations only") }}</small>
% else
<small class="text-{{ 'warning' if warn else 'info' }}">{{ _("Euro bank accounts only") }}</small>
% endif
<small>
<span class="text-{{ 'info' if participant.guessed_country in constants.EUROZONE else 'warning' }}">{{
_("Euro bank accounts only") }}</span><br>
<span class="text-{{ 'info' if has_euro_donations else 'warning' }}">{{
_("Euro donations only") }}</span>
</small>
</h4>
<a class="overlay" href="{{ participant.path('routes/add') }}?type=stripe-sdd"
><span class="sr-only">{{ _("Add a bank account") }}</span></a>

View File

@ -16,8 +16,6 @@ title = _("Close Account")
subhead = participant.username
[---] text/html
% from "templates/macros/icons.html" import glyphicon
% extends "templates/layouts/base.html"
% block content

View File

@ -2,9 +2,12 @@
title = _("Contact")
[---] text/html
% extends "templates/layouts/about.html"
% from "templates/macros/icons.html" import icon with context
% block content
<p class="text-warning">{{ glyphicon("minus-sign") }} {{ _(
<p class="text-warning">{{ icon('warning-sign') }} {{ _(
"Do not contact us if you are trying to reach one of our users. We do not "
"relay messages, and we cannot reveal the identity or contact details of "
"our users unless you have a valid court order."

View File

@ -175,7 +175,7 @@ title = _("Frequently Asked Questions")
"well as SEPA Direct Debits (for Euro donations only). If a payment is "
"through PayPal, then it's possible to pay in various ways, however "
"the donor needs to have or create a PayPal account.",
list_of_card_brands=["Visa", "Mastercard", "American Express", "UnionPay", "Discover", "Diners", "JCB"]
list_of_card_brands=["American Express", "Diners", "Discover", "JCB", "Mastercard", "UnionPay", "Visa"]
) }}</dd>

View File

@ -2,23 +2,23 @@
title = _("Follow Us")
[---] text/html
% extends "templates/layouts/about.html"
% from "templates/macros/icons.html" import fontawesome
% from "templates/macros/icons.html" import icon with context
% block content
<p>{{ _("You can get updates from us on the following social networks:") }}</p>
<div class="buttons">
<a class="btn btn-default btn-lg" href="https://medium.com/liberapay-blog">
{{ fontawesome('medium') }}&nbsp;Medium
{{ icon('medium') }}&nbsp;Medium
</a>
<a class="btn btn-default btn-lg" href="https://mastodon.xyz/@Liberapay">
{{ fontawesome('mastodon') }}&nbsp;Mastodon
{{ icon('mastodon') }}&nbsp;Mastodon
</a>
<a class="btn btn-default btn-lg" href="https://twitter.com/liberapay">
{{ fontawesome('twitter') }}&nbsp;Twitter
{{ icon('twitter') }}&nbsp;Twitter
</a>
<a class="btn btn-default btn-lg" href="https://www.facebook.com/Liberapay-472128142945598/">
{{ fontawesome('facebook') }}&nbsp;Facebook
{{ icon('facebook') }}&nbsp;Facebook
</a>
</div>
<br>

View File

@ -2,7 +2,7 @@
title = _("Introduction")
[---] text/html
% extends "templates/layouts/about.html"
% from "templates/macros/icons.html" import fontawesome, glyphicon
% from "templates/macros/icons.html" import icon with context
% block content
@ -45,10 +45,10 @@ title = _("Introduction")
<p>
<a class="btn btn-info" href="/about/feeds">
{{ fontawesome('feed') }} <span>{{ _("Follow us") }}</span>
{{ icon('feed') }} <span>{{ _("Follow us") }}</span>
</a>
<a class="btn btn-success" href="/sign-up">
{{ glyphicon('log-in') }} <span>{{ _("Create your account") }}</span>
{{ icon('enter') }} <span>{{ _("Create your account") }}</span>
</a>
</p>

View File

@ -3,6 +3,8 @@ title = _("Logos")
[---] text/html
% extends "templates/layouts/about.html"
% from "templates/macros/icons.html" import icon with context
% block content
<p>{{ _(
@ -49,32 +51,21 @@ title = _("Logos")
<div class="card text-center">
<p><img src="{{ website.asset('liberapay/icon-v2_black-on-yellow.svg') }}" height=150 alt="{{ _('Liberapay logo, black-on-yellow') }}" /></p>
<p><a href="/assets/liberapay/icon-v2_black-on-yellow.svg?save_as=liberapay_logo_black-on-yellow.svg">
{{ fontawesome('download') }} {{ _("Download the black-on-yellow SVG") }}
{{ icon('download') }} {{ _("Download the black-on-yellow SVG") }}
</a></p>
<p><a href="/assets/liberapay/icon-v2_black-on-yellow.200.png?save_as=liberapay_logo_black-on-yellow_200px.png">
{{ fontawesome('download') }} {{ _("Download the black-on-yellow PNG ({x_y} pixels)", x_y="200×200") }}
{{ icon('download') }} {{ _("Download the black-on-yellow PNG ({x_y} pixels)", x_y="200×200") }}
</a></p>
</div>
<div class="card text-center">
<p><img src="{{ website.asset('liberapay/icon-v2_black.svg') }}" height=150 alt="{{ _('Liberapay logo, black') }}" /></p>
<p><a href="/assets/liberapay/icon-v2_black.svg?save_as=liberapay_logo_black.svg">
{{ fontawesome('download') }} {{ _("Download the black SVG") }}
{{ icon('download') }} {{ _("Download the black SVG") }}
</a></p>
<p><a href="/assets/liberapay/icon-v2_black.200.png?save_as=liberapay_logo_black_200px.png">
{{ fontawesome('download') }} {{ _("Download the black PNG ({x_y} pixels)", x_y="200×200") }}
{{ icon('download') }} {{ _("Download the black PNG ({x_y} pixels)", x_y="200×200") }}
</a></p>
</div>
<h3>{{ _("Fonts") }}</h3>
<p>{{ _(
"The Liberapay logo is included in the {fa_link_start}Fork Awesome{link_end} "
"font in two forms: {fa_liberapay_link} and {fa_liberapay_square_link}.",
fa_link_start='<a href="https://forkaweso.me/Fork-Awesome/">'|safe,
fa_liberapay_link='<a href="https://forkaweso.me/Fork-Awesome/icon/liberapay/"><code class="gray">liberapay</code></a>'|safe,
fa_liberapay_square_link='<a href="https://forkaweso.me/Fork-Awesome/icon/liberapay-square/"><code class="gray">liberapay-square</code></a>'|safe,
link_end='</a>'|safe,
) }}</p>
% endblock

View File

@ -4,6 +4,8 @@ title = _("Privacy")
[---] text/html
% extends "templates/layouts/about.html"
% from "templates/macros/icons.html" import icon with context
% block content
<p>{{ _(
@ -18,7 +20,7 @@ title = _("Privacy")
'stored on your machine, and resent by your browser to that same '
'website in every subsequent request.'
) }}"
data-toggle="tooltip" data-placement="bottom">{{ glyphicon("question-sign") }}</small>
data-toggle="tooltip" data-placement="bottom">{{ icon("question-sign") }}</small>
</h3>
<p>{{ _(

View File

@ -216,10 +216,11 @@ else:
title = "Email Domains"
[---] text/html
% from 'templates/macros/nav.html' import querystring_nav with context
% extends "templates/layouts/admin.html"
% from "templates/macros/icons.html" import icon with context
% from 'templates/macros/nav.html' import querystring_nav with context
% block content
% if domain
@ -311,13 +312,13 @@ title = "Email Domains"
% for ea in p.addresses
<span class="break-word-anywhere">{{ ea.address }}</span>
% if ea.verified
<span class="text-success">{{ glyphicon('ok-sign', "Verified") }}</span>
<span class="text-success">{{ icon('ok-sign', "Verified") }}</span>
% elif ea.disavowed
<span class="text-danger">{{ glyphicon('exclamation-sign', "Disavowed") }}</span>
<span class="text-danger">{{ icon('exclamation-sign', "Disavowed") }}</span>
% elif ea.blacklist_reason
<span class="text-danger">{{ glyphicon('exclamation-sign', "Blacklisted (%s)" % ea.blacklist_reason) }}</span>
<span class="text-danger">{{ icon('exclamation-sign', "Blacklisted (%s)" % ea.blacklist_reason) }}</span>
% else
<span class="text-warning">{{ glyphicon('warning-sign', "Unconfirmed") }}</span>
<span class="text-warning">{{ icon('warning-sign', "Unconfirmed") }}</span>
% endif
<br>
% endfor

View File

@ -237,7 +237,7 @@ title = "Users Admin"
[---] text/html
% from 'templates/macros/admin.html' import admin_form with context
% from 'templates/macros/avatar-url.html' import avatar_img with context
% from 'templates/macros/icons.html' import fontawesome, glyphicon
% from 'templates/macros/icons.html' import icon with context
% from 'templates/macros/nav.html' import querystring_nav with context
% from "templates/macros/payment-methods.html" import payment_method_icon with context
@ -276,7 +276,7 @@ title = "Users Admin"
% for account in elsewhere
<div class="account">
<a class="account-link" href="{{ account.html_url }}">
{{ fontawesome(account.platform) }}
{{ icon(account.platform) }}
<span class="account-username">{{ account.friendly_name_long }}</span>
</a>
<br>
@ -297,20 +297,20 @@ title = "Users Admin"
% if row.email
<strong>Email address:</strong> <span class="break-word-anywhere">{{ row.email.address }}</span>
% if row.email.verified
<span class="text-success">{{ glyphicon('ok-sign', "Verified") }}</span>
<span class="text-success">{{ icon('ok-sign', "Verified") }}</span>
% elif row.email.disavowed
<span class="text-danger">{{ glyphicon('exclamation-sign', "Disavowed") }}</span>
<span class="text-danger">{{ icon('exclamation-sign', "Disavowed") }}</span>
% elif row.email.blacklist_reason
<span class="text-danger">{{ glyphicon('exclamation-sign', "Blacklisted (%s)" % row.email.blacklist_reason) }}</span>
<span class="text-danger">{{ icon('exclamation-sign', "Blacklisted (%s)" % row.email.blacklist_reason) }}</span>
% else
<span class="text-warning">{{ glyphicon('warning-sign', "Unconfirmed") }}</span>
<span class="text-warning">{{ icon('warning-sign', "Unconfirmed") }}</span>
% endif
&nbsp;
<form action="/admin/emails" method="POST" target="_blank" class="inline-block middle">
<input type="hidden" name="csrf_token" value="{{ csrf_token }}" />
<input type="hidden" name="email" value="{{ row.email.address }}" />
<button class="link" name="action" value="lookup">{{
glyphicon('search', "Look it up")
icon('search', "Look it up")
}}</button>
</form>
% else
@ -323,13 +323,13 @@ title = "Users Admin"
<br>
% for account in elsewhere
<a class="account-link" href="{{ account.html_url }}">
<span class="symbol-3ex">{{ fontawesome(account.platform) }}</span>
<span class="symbol-3ex">{{ icon(account.platform) }}</span>
<span>{{ account.friendly_name_long }}</span>
</a>
<br>
% endfor
% else
none. <span class="text-warning">{{ glyphicon('warning-sign') }}</span>
none. <span class="text-warning">{{ icon('warning-sign') }}</span>
% endif
</p>
% endif
@ -352,9 +352,9 @@ title = "Users Admin"
<br>
% for account in row.payment_accounts
<span class="symbol-3ex">{{
fontawesome('cc-stripe', "Stripe") if account.provider == 'stripe' else
fontawesome('paypal', "PayPal") if account.provider == 'paypal' else
fontawesome(account.provider, account.provider)
icon('stripe', "Stripe") if account.provider == 'stripe' else
icon('paypal', "PayPal") if account.provider == 'paypal' else
icon(account.provider, account.provider)
}}</span>
% if account.is_current
{{ account.id }}
@ -363,11 +363,11 @@ title = "Users Admin"
% endif
({{ locale.countries.get(account.country, account.country) }})
% if account.verified and account.charges_enabled != False
<span class="symbol text-success">{{ glyphicon('ok-sign', "OK") }}</span>
<span class="symbol text-success">{{ icon('ok-sign', "OK") }}</span>
% elif account.verified
<span class="symbol text-danger">{{ glyphicon('exclamation-sign', "Disabled") }}</span>
<span class="symbol text-danger">{{ icon('exclamation-sign', "Disabled") }}</span>
% else
<span class="symbol text-warning">{{ glyphicon('warning-sign', "Unconfirmed") }}</span>
<span class="symbol text-warning">{{ icon('warning-sign', "Unconfirmed") }}</span>
% endif
<br>
% endfor
@ -435,7 +435,7 @@ title = "Users Admin"
<br>
% endfor
% elif not p.public_name
none. <span class="text-warning">{{ glyphicon('warning-sign') }}</span>
none. <span class="text-warning">{{ icon('warning-sign') }}</span>
% endif
</div>

View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-arrow-clockwise" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M8 3a5 5 0 1 0 4.546 2.914.5.5 0 0 1 .908-.417A6 6 0 1 1 8 2z"/>
<path d="M8 4.466V.534a.25.25 0 0 1 .41-.192l2.36 1.966c.12.1.12.284 0 .384L8.41 4.658A.25.25 0 0 1 8 4.466"/>
</svg>

After

Width:  |  Height:  |  Size: 349 B

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-arrow-left-right" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M1 11.5a.5.5 0 0 0 .5.5h11.793l-3.147 3.146a.5.5 0 0 0 .708.708l4-4a.5.5 0 0 0 0-.708l-4-4a.5.5 0 0 0-.708.708L13.293 11H1.5a.5.5 0 0 0-.5.5m14-7a.5.5 0 0 1-.5.5H2.707l3.147 3.146a.5.5 0 1 1-.708.708l-4-4a.5.5 0 0 1 0-.708l4-4a.5.5 0 1 1 .708.708L2.707 4H14.5a.5.5 0 0 1 .5.5"/>
</svg>

After

Width:  |  Height:  |  Size: 451 B

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-balloon-heart" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="m8 2.42-.717-.737c-1.13-1.161-3.243-.777-4.01.72-.35.685-.451 1.707.236 3.062C4.16 6.753 5.52 8.32 8 10.042c2.479-1.723 3.839-3.29 4.491-4.577.687-1.355.587-2.377.236-3.061-.767-1.498-2.88-1.882-4.01-.721zm-.49 8.5c-10.78-7.44-3-13.155.359-10.063q.068.062.132.129.065-.067.132-.129c3.36-3.092 11.137 2.624.357 10.063l.235.468a.25.25 0 1 1-.448.224l-.008-.017c.008.11.02.202.037.29.054.27.161.488.419 1.003.288.578.235 1.15.076 1.629-.157.469-.422.867-.588 1.115l-.004.007a.25.25 0 1 1-.416-.278c.168-.252.4-.6.533-1.003.133-.396.163-.824-.049-1.246l-.013-.028c-.24-.48-.38-.758-.448-1.102a3 3 0 0 1-.052-.45l-.04.08a.25.25 0 1 1-.447-.224l.235-.468ZM6.013 2.06c-.649-.18-1.483.083-1.85.798-.131.258-.245.689-.08 1.335.063.244.414.198.487-.043.21-.697.627-1.447 1.359-1.692.217-.073.304-.337.084-.398"/>
</svg>

After

Width:  |  Height:  |  Size: 972 B

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-bank2" viewBox="0 0 16 16">
<path d="M8.277.084a.5.5 0 0 0-.554 0l-7.5 5A.5.5 0 0 0 .5 6h1.875v7H1.5a.5.5 0 0 0 0 1h13a.5.5 0 1 0 0-1h-.875V6H15.5a.5.5 0 0 0 .277-.916zM12.375 6v7h-1.25V6zm-2.5 0v7h-1.25V6zm-2.5 0v7h-1.25V6zm-2.5 0v7h-1.25V6zM8 4a1 1 0 1 1 0-2 1 1 0 0 1 0 2M.5 15a.5.5 0 0 0 0 1h15a.5.5 0 1 0 0-1z"/>
</svg>

After

Width:  |  Height:  |  Size: 422 B

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-bar-chart" viewBox="0 0 16 16">
<path d="M4 11H2v3h2zm5-4H7v7h2zm5-5v12h-2V2zm-2-1a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1zM6 7a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v7a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1zm-5 4a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1z"/>
</svg>

After

Width:  |  Height:  |  Size: 389 B

View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-box-arrow-in-right" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M6 3.5a.5.5 0 0 1 .5-.5h8a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-8a.5.5 0 0 1-.5-.5v-2a.5.5 0 0 0-1 0v2A1.5 1.5 0 0 0 6.5 14h8a1.5 1.5 0 0 0 1.5-1.5v-9A1.5 1.5 0 0 0 14.5 2h-8A1.5 1.5 0 0 0 5 3.5v2a.5.5 0 0 0 1 0z"/>
<path fill-rule="evenodd" d="M11.854 8.354a.5.5 0 0 0 0-.708l-3-3a.5.5 0 1 0-.708.708L10.293 7.5H1.5a.5.5 0 0 0 0 1h8.793l-2.147 2.146a.5.5 0 0 0 .708.708z"/>
</svg>

After

Width:  |  Height:  |  Size: 548 B

View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-box-arrow-right" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M10 12.5a.5.5 0 0 1-.5.5h-8a.5.5 0 0 1-.5-.5v-9a.5.5 0 0 1 .5-.5h8a.5.5 0 0 1 .5.5v2a.5.5 0 0 0 1 0v-2A1.5 1.5 0 0 0 9.5 2h-8A1.5 1.5 0 0 0 0 3.5v9A1.5 1.5 0 0 0 1.5 14h8a1.5 1.5 0 0 0 1.5-1.5v-2a.5.5 0 0 0-1 0z"/>
<path fill-rule="evenodd" d="M15.854 8.354a.5.5 0 0 0 0-.708l-3-3a.5.5 0 0 0-.708.708L14.293 7.5H5.5a.5.5 0 0 0 0 1h8.793l-2.147 2.146a.5.5 0 0 0 .708.708z"/>
</svg>

After

Width:  |  Height:  |  Size: 547 B

View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-box-arrow-up-right" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M8.636 3.5a.5.5 0 0 0-.5-.5H1.5A1.5 1.5 0 0 0 0 4.5v10A1.5 1.5 0 0 0 1.5 16h10a1.5 1.5 0 0 0 1.5-1.5V7.864a.5.5 0 0 0-1 0V14.5a.5.5 0 0 1-.5.5h-10a.5.5 0 0 1-.5-.5v-10a.5.5 0 0 1 .5-.5h6.636a.5.5 0 0 0 .5-.5"/>
<path fill-rule="evenodd" d="M16 .5a.5.5 0 0 0-.5-.5h-5a.5.5 0 0 0 0 1h3.793L6.146 9.146a.5.5 0 1 0 .708.708L15 1.707V5.5a.5.5 0 0 0 1 0z"/>
</svg>

After

Width:  |  Height:  |  Size: 528 B

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-broadcast" viewBox="0 0 16 16">
<path d="M3.05 3.05a7 7 0 0 0 0 9.9.5.5 0 0 1-.707.707 8 8 0 0 1 0-11.314.5.5 0 0 1 .707.707m2.122 2.122a4 4 0 0 0 0 5.656.5.5 0 1 1-.708.708 5 5 0 0 1 0-7.072.5.5 0 0 1 .708.708m5.656-.708a.5.5 0 0 1 .708 0 5 5 0 0 1 0 7.072.5.5 0 1 1-.708-.708 4 4 0 0 0 0-5.656.5.5 0 0 1 0-.708m2.122-2.12a.5.5 0 0 1 .707 0 8 8 0 0 1 0 11.313.5.5 0 0 1-.707-.707 7 7 0 0 0 0-9.9.5.5 0 0 1 0-.707zM10 8a2 2 0 1 1-4 0 2 2 0 0 1 4 0"/>
</svg>

After

Width:  |  Height:  |  Size: 555 B

View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-cash" viewBox="0 0 16 16">
<path d="M8 10a2 2 0 1 0 0-4 2 2 0 0 0 0 4"/>
<path d="M0 4a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1zm3 0a2 2 0 0 1-2 2v4a2 2 0 0 1 2 2h10a2 2 0 0 1 2-2V6a2 2 0 0 1-2-2z"/>
</svg>

After

Width:  |  Height:  |  Size: 328 B

View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-check-circle" viewBox="0 0 16 16">
<path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16"/>
<path d="m10.97 4.97-.02.022-3.473 4.425-2.093-2.094a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-1.071-1.05"/>
</svg>

After

Width:  |  Height:  |  Size: 369 B

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-check-lg" viewBox="0 0 16 16">
<path d="M12.736 3.97a.733.733 0 0 1 1.047 0c.286.289.29.756.01 1.05L7.88 12.01a.733.733 0 0 1-1.065.02L3.217 8.384a.757.757 0 0 1 0-1.06.733.733 0 0 1 1.047 0l3.052 3.093 5.4-6.425z"/>
</svg>

After

Width:  |  Height:  |  Size: 321 B

View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-credit-card" viewBox="0 0 16 16">
<path d="M0 4a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2zm2-1a1 1 0 0 0-1 1v1h14V4a1 1 0 0 0-1-1zm13 4H1v5a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1z"/>
<path d="M2 10a1 1 0 0 1 1-1h1a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1z"/>
</svg>

After

Width:  |  Height:  |  Size: 383 B

View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-download" viewBox="0 0 16 16">
<path d="M.5 9.9a.5.5 0 0 1 .5.5v2.5a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-2.5a.5.5 0 0 1 1 0v2.5a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2v-2.5a.5.5 0 0 1 .5-.5"/>
<path d="M7.646 11.854a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V1.5a.5.5 0 0 0-1 0v8.793L5.354 8.146a.5.5 0 1 0-.708.708z"/>
</svg>

After

Width:  |  Height:  |  Size: 422 B

View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-emoji-smile" viewBox="0 0 16 16">
<path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16"/>
<path d="M4.285 9.567a.5.5 0 0 1 .683.183A3.5 3.5 0 0 0 8 11.5a3.5 3.5 0 0 0 3.032-1.75.5.5 0 1 1 .866.5A4.5 4.5 0 0 1 8 12.5a4.5 4.5 0 0 1-3.898-2.25.5.5 0 0 1 .183-.683M7 6.5C7 7.328 6.552 8 6 8s-1-.672-1-1.5S5.448 5 6 5s1 .672 1 1.5m4 0c0 .828-.448 1.5-1 1.5s-1-.672-1-1.5S9.448 5 10 5s1 .672 1 1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 525 B

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-exclamation-circle-fill" viewBox="0 0 16 16">
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0M8 4a.905.905 0 0 0-.9.995l.35 3.507a.552.552 0 0 0 1.1 0l.35-3.507A.905.905 0 0 0 8 4m.002 6a1 1 0 1 0 0 2 1 1 0 0 0 0-2"/>
</svg>

After

Width:  |  Height:  |  Size: 318 B

View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-exclamation-circle" viewBox="0 0 16 16">
<path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16"/>
<path d="M7.002 11a1 1 0 1 1 2 0 1 1 0 0 1-2 0M7.1 4.995a.905.905 0 1 1 1.8 0l-.35 3.507a.552.552 0 0 1-1.1 0z"/>
</svg>

After

Width:  |  Height:  |  Size: 341 B

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-exclamation-triangle-fill" viewBox="0 0 16 16">
<path d="M8.982 1.566a1.13 1.13 0 0 0-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767zM8 5c.535 0 .954.462.9.995l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 5.995A.905.905 0 0 1 8 5m.002 6a1 1 0 1 1 0 2 1 1 0 0 1 0-2"/>
</svg>

After

Width:  |  Height:  |  Size: 397 B

View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-exclamation-triangle" viewBox="0 0 16 16">
<path d="M7.938 2.016A.13.13 0 0 1 8.002 2a.13.13 0 0 1 .063.016.15.15 0 0 1 .054.057l6.857 11.667c.036.06.035.124.002.183a.2.2 0 0 1-.054.06.1.1 0 0 1-.066.017H1.146a.1.1 0 0 1-.066-.017.2.2 0 0 1-.054-.06.18.18 0 0 1 .002-.183L7.884 2.073a.15.15 0 0 1 .054-.057m1.044-.45a1.13 1.13 0 0 0-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767z"/>
<path d="M7.002 12a1 1 0 1 1 2 0 1 1 0 0 1-2 0M7.1 5.995a.905.905 0 1 1 1.8 0l-.35 3.507a.552.552 0 0 1-1.1 0z"/>
</svg>

After

Width:  |  Height:  |  Size: 638 B

View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-eye-fill" viewBox="0 0 16 16">
<path d="M10.5 8a2.5 2.5 0 1 1-5 0 2.5 2.5 0 0 1 5 0"/>
<path d="M0 8s3-5.5 8-5.5S16 8 16 8s-3 5.5-8 5.5S0 8 0 8m8 3.5a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7"/>
</svg>

After

Width:  |  Height:  |  Size: 296 B

View File

@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-eye-slash" viewBox="0 0 16 16">
<path d="M13.359 11.238C15.06 9.72 16 8 16 8s-3-5.5-8-5.5a7 7 0 0 0-2.79.588l.77.771A6 6 0 0 1 8 3.5c2.12 0 3.879 1.168 5.168 2.457A13 13 0 0 1 14.828 8q-.086.13-.195.288c-.335.48-.83 1.12-1.465 1.755q-.247.248-.517.486z"/>
<path d="M11.297 9.176a3.5 3.5 0 0 0-4.474-4.474l.823.823a2.5 2.5 0 0 1 2.829 2.829zm-2.943 1.299.822.822a3.5 3.5 0 0 1-4.474-4.474l.823.823a2.5 2.5 0 0 0 2.829 2.829"/>
<path d="M3.35 5.47q-.27.24-.518.487A13 13 0 0 0 1.172 8l.195.288c.335.48.83 1.12 1.465 1.755C4.121 11.332 5.881 12.5 8 12.5c.716 0 1.39-.133 2.02-.36l.77.772A7 7 0 0 1 8 13.5C3 13.5 0 8 0 8s.939-1.721 2.641-3.238l.708.709zm10.296 8.884-12-12 .708-.708 12 12z"/>
</svg>

After

Width:  |  Height:  |  Size: 797 B

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-facebook" viewBox="0 0 16 16">
<path d="M16 8.049c0-4.446-3.582-8.05-8-8.05C3.58 0-.002 3.603-.002 8.05c0 4.017 2.926 7.347 6.75 7.951v-5.625h-2.03V8.05H6.75V6.275c0-2.017 1.195-3.131 3.022-3.131.876 0 1.791.157 1.791.157v1.98h-1.009c-.993 0-1.303.621-1.303 1.258v1.51h2.218l-.354 2.326H9.25V16c3.824-.604 6.75-3.934 6.75-7.951"/>
</svg>

After

Width:  |  Height:  |  Size: 435 B

View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-file-person" viewBox="0 0 16 16">
<path d="M12 1a1 1 0 0 1 1 1v10.755S12 11 8 11s-5 1.755-5 1.755V2a1 1 0 0 1 1-1zM4 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2z"/>
<path d="M8 10a3 3 0 1 0 0-6 3 3 0 0 0 0 6"/>
</svg>

After

Width:  |  Height:  |  Size: 338 B

View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-gear" viewBox="0 0 16 16">
<path d="M8 4.754a3.246 3.246 0 1 0 0 6.492 3.246 3.246 0 0 0 0-6.492M5.754 8a2.246 2.246 0 1 1 4.492 0 2.246 2.246 0 0 1-4.492 0"/>
<path d="M9.796 1.343c-.527-1.79-3.065-1.79-3.592 0l-.094.319a.873.873 0 0 1-1.255.52l-.292-.16c-1.64-.892-3.433.902-2.54 2.541l.159.292a.873.873 0 0 1-.52 1.255l-.319.094c-1.79.527-1.79 3.065 0 3.592l.319.094a.873.873 0 0 1 .52 1.255l-.16.292c-.892 1.64.901 3.434 2.541 2.54l.292-.159a.873.873 0 0 1 1.255.52l.094.319c.527 1.79 3.065 1.79 3.592 0l.094-.319a.873.873 0 0 1 1.255-.52l.292.16c1.64.893 3.434-.902 2.54-2.541l-.159-.292a.873.873 0 0 1 .52-1.255l.319-.094c1.79-.527 1.79-3.065 0-3.592l-.319-.094a.873.873 0 0 1-.52-1.255l.16-.292c.893-1.64-.902-3.433-2.541-2.54l-.292.159a.873.873 0 0 1-1.255-.52zm-2.633.283c.246-.835 1.428-.835 1.674 0l.094.319a1.873 1.873 0 0 0 2.693 1.115l.291-.16c.764-.415 1.6.42 1.184 1.185l-.159.292a1.873 1.873 0 0 0 1.116 2.692l.318.094c.835.246.835 1.428 0 1.674l-.319.094a1.873 1.873 0 0 0-1.115 2.693l.16.291c.415.764-.42 1.6-1.185 1.184l-.291-.159a1.873 1.873 0 0 0-2.693 1.116l-.094.318c-.246.835-1.428.835-1.674 0l-.094-.319a1.873 1.873 0 0 0-2.692-1.115l-.292.16c-.764.415-1.6-.42-1.184-1.185l.159-.291A1.873 1.873 0 0 0 1.945 8.93l-.319-.094c-.835-.246-.835-1.428 0-1.674l.319-.094A1.873 1.873 0 0 0 3.06 4.377l-.16-.292c-.415-.764.42-1.6 1.185-1.184l.292.159a1.873 1.873 0 0 0 2.692-1.115z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-gift" viewBox="0 0 16 16">
<path d="M3 2.5a2.5 2.5 0 0 1 5 0 2.5 2.5 0 0 1 5 0v.006c0 .07 0 .27-.038.494H15a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1v7.5a1.5 1.5 0 0 1-1.5 1.5h-11A1.5 1.5 0 0 1 1 14.5V7a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h2.038A3 3 0 0 1 3 2.506zm1.068.5H7v-.5a1.5 1.5 0 1 0-3 0c0 .085.002.274.045.43zM9 3h2.932l.023-.07c.043-.156.045-.345.045-.43a1.5 1.5 0 0 0-3 0zM1 4v2h6V4zm8 0v2h6V4zm5 3H9v8h4.5a.5.5 0 0 0 .5-.5zm-7 8V7H2v7.5a.5.5 0 0 0 .5.5z"/>
</svg>

After

Width:  |  Height:  |  Size: 555 B

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-github" viewBox="0 0 16 16">
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"/>
</svg>

After

Width:  |  Height:  |  Size: 708 B

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-globe2" viewBox="0 0 16 16">
<path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8m7.5-6.923c-.67.204-1.335.82-1.887 1.855q-.215.403-.395.872c.705.157 1.472.257 2.282.287zM4.249 3.539q.214-.577.481-1.078a7 7 0 0 1 .597-.933A7 7 0 0 0 3.051 3.05q.544.277 1.198.49zM3.509 7.5c.036-1.07.188-2.087.436-3.008a9 9 0 0 1-1.565-.667A6.96 6.96 0 0 0 1.018 7.5zm1.4-2.741a12.3 12.3 0 0 0-.4 2.741H7.5V5.091c-.91-.03-1.783-.145-2.591-.332M8.5 5.09V7.5h2.99a12.3 12.3 0 0 0-.399-2.741c-.808.187-1.681.301-2.591.332zM4.51 8.5c.035.987.176 1.914.399 2.741A13.6 13.6 0 0 1 7.5 10.91V8.5zm3.99 0v2.409c.91.03 1.783.145 2.591.332.223-.827.364-1.754.4-2.741zm-3.282 3.696q.18.469.395.872c.552 1.035 1.218 1.65 1.887 1.855V11.91c-.81.03-1.577.13-2.282.287zm.11 2.276a7 7 0 0 1-.598-.933 9 9 0 0 1-.481-1.079 8.4 8.4 0 0 0-1.198.49 7 7 0 0 0 2.276 1.522zm-1.383-2.964A13.4 13.4 0 0 1 3.508 8.5h-2.49a6.96 6.96 0 0 0 1.362 3.675c.47-.258.995-.482 1.565-.667m6.728 2.964a7 7 0 0 0 2.275-1.521 8.4 8.4 0 0 0-1.197-.49 9 9 0 0 1-.481 1.078 7 7 0 0 1-.597.933M8.5 11.909v3.014c.67-.204 1.335-.82 1.887-1.855q.216-.403.395-.872A12.6 12.6 0 0 0 8.5 11.91zm3.555-.401c.57.185 1.095.409 1.565.667A6.96 6.96 0 0 0 14.982 8.5h-2.49a13.4 13.4 0 0 1-.437 3.008M14.982 7.5a6.96 6.96 0 0 0-1.362-3.675c-.47.258-.995.482-1.565.667.248.92.4 1.938.437 3.008zM11.27 2.461q.266.502.482 1.078a8.4 8.4 0 0 0 1.196-.49 7 7 0 0 0-2.275-1.52c.218.283.418.597.597.932m-.488 1.343a8 8 0 0 0-.395-.872C9.835 1.897 9.17 1.282 8.5 1.077V4.09c.81-.03 1.577-.13 2.282-.287z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-hand-index" viewBox="0 0 16 16">
<path d="M6.75 1a.75.75 0 0 1 .75.75V8a.5.5 0 0 0 1 0V5.467l.086-.004c.317-.012.637-.008.816.027.134.027.294.096.448.182.077.042.15.147.15.314V8a.5.5 0 1 0 1 0V6.435l.106-.01c.316-.024.584-.01.708.04.118.046.3.207.486.43.081.096.15.19.2.259V8.5a.5.5 0 0 0 1 0v-1h.342a1 1 0 0 1 .995 1.1l-.271 2.715a2.5 2.5 0 0 1-.317.991l-1.395 2.442a.5.5 0 0 1-.434.252H6.035a.5.5 0 0 1-.416-.223l-1.433-2.15a1.5 1.5 0 0 1-.243-.666l-.345-3.105a.5.5 0 0 1 .399-.546L5 8.11V9a.5.5 0 0 0 1 0V1.75A.75.75 0 0 1 6.75 1M8.5 4.466V1.75a1.75 1.75 0 1 0-3.5 0v5.34l-1.2.24a1.5 1.5 0 0 0-1.196 1.636l.345 3.106a2.5 2.5 0 0 0 .405 1.11l1.433 2.15A1.5 1.5 0 0 0 6.035 16h6.385a1.5 1.5 0 0 0 1.302-.756l1.395-2.441a3.5 3.5 0 0 0 .444-1.389l.271-2.715a2 2 0 0 0-1.99-2.199h-.581a5 5 0 0 0-.195-.248c-.191-.229-.51-.568-.88-.716-.364-.146-.846-.132-1.158-.108l-.132.012a1.26 1.26 0 0 0-.56-.642 2.6 2.6 0 0 0-.738-.288c-.31-.062-.739-.058-1.05-.046zm2.094 2.025"/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-house" viewBox="0 0 16 16">
<path d="M8.707 1.5a1 1 0 0 0-1.414 0L.646 8.146a.5.5 0 0 0 .708.708L2 8.207V13.5A1.5 1.5 0 0 0 3.5 15h9a1.5 1.5 0 0 0 1.5-1.5V8.207l.646.647a.5.5 0 0 0 .708-.708L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293zM13 7.207V13.5a.5.5 0 0 1-.5.5h-9a.5.5 0 0 1-.5-.5V7.207l5-5z"/>
</svg>

After

Width:  |  Height:  |  Size: 415 B

View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-images" viewBox="0 0 16 16">
<path d="M4.502 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3"/>
<path d="M14.002 13a2 2 0 0 1-2 2h-10a2 2 0 0 1-2-2V5A2 2 0 0 1 2 3a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v8a2 2 0 0 1-1.998 2M14 2H4a1 1 0 0 0-1 1h9.002a2 2 0 0 1 2 2v7A1 1 0 0 0 15 11V3a1 1 0 0 0-1-1M2.002 4a1 1 0 0 0-1 1v8l2.646-2.354a.5.5 0 0 1 .63-.062l2.66 1.773 3.71-3.71a.5.5 0 0 1 .577-.094l1.777 1.947V5a1 1 0 0 0-1-1z"/>
</svg>

After

Width:  |  Height:  |  Size: 516 B

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-incognito" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="m4.736 1.968-.892 3.269-.014.058C2.113 5.568 1 6.006 1 6.5 1 7.328 4.134 8 8 8s7-.672 7-1.5c0-.494-1.113-.932-2.83-1.205l-.014-.058-.892-3.27c-.146-.533-.698-.849-1.239-.734C9.411 1.363 8.62 1.5 8 1.5s-1.411-.136-2.025-.267c-.541-.115-1.093.2-1.239.735m.015 3.867a.25.25 0 0 1 .274-.224c.9.092 1.91.143 2.975.143a30 30 0 0 0 2.975-.143.25.25 0 0 1 .05.498c-.918.093-1.944.145-3.025.145s-2.107-.052-3.025-.145a.25.25 0 0 1-.224-.274M3.5 10h2a.5.5 0 0 1 .5.5v1a1.5 1.5 0 0 1-3 0v-1a.5.5 0 0 1 .5-.5m-1.5.5q.001-.264.085-.5H2a.5.5 0 0 1 0-1h3.5a1.5 1.5 0 0 1 1.488 1.312 3.5 3.5 0 0 1 2.024 0A1.5 1.5 0 0 1 10.5 9H14a.5.5 0 0 1 0 1h-.085q.084.236.085.5v1a2.5 2.5 0 0 1-5 0v-.14l-.21-.07a2.5 2.5 0 0 0-1.58 0l-.21.07v.14a2.5 2.5 0 0 1-5 0zm8.5-.5h2a.5.5 0 0 1 .5.5v1a1.5 1.5 0 0 1-3 0v-1a.5.5 0 0 1 .5-.5"/>
</svg>

After

Width:  |  Height:  |  Size: 969 B

View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-info-circle" viewBox="0 0 16 16">
<path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16"/>
<path d="m8.93 6.588-2.29.287-.082.38.45.083c.294.07.352.176.288.469l-.738 3.468c-.194.897.105 1.319.808 1.319.545 0 1.178-.252 1.465-.598l.088-.416c-.2.176-.492.246-.686.246-.275 0-.375-.193-.304-.533zM9 4.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0"/>
</svg>

After

Width:  |  Height:  |  Size: 460 B

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