Merge branch 'master' into patch-2

main
shel 2017-03-31 10:34:14 -04:00 committed by GitHub
commit f20f6b25b9
1880 changed files with 2362 additions and 83 deletions

View File

@ -1,9 +1,35 @@
import emojione from 'emojione'; import emojione from 'emojione';
emojione.imageType = 'png'; const toImage = str => shortnameToImage(unicodeToImage(str));
emojione.sprites = false;
emojione.imagePathPNG = '/emoji/'; const unicodeToImage = str => {
const mappedUnicode = emojione.mapUnicodeToShort();
return str.replace(emojione.regUnicode, unicodeChar => {
if (typeof unicodeChar === 'undefined' || unicodeChar === '' || !(unicodeChar in emojione.jsEscapeMap)) {
return unicodeChar;
}
const unicode = emojione.jsEscapeMap[unicodeChar];
const short = mappedUnicode[unicode];
const filename = emojione.emojioneList[short].fname;
const alt = emojione.convert(unicode.toUpperCase());
return `<img draggable="false" class="emojione" alt="${alt}" src="/emoji/${filename}.svg" />`;
});
};
const shortnameToImage = str => str.replace(emojione.regShortNames, shortname => {
if (typeof shortname === 'undefined' || shortname === '' || !(shortname in emojione.emojioneList)) {
return shortname;
}
const unicode = emojione.emojioneList[shortname].unicode[emojione.emojioneList[shortname].unicode.length - 1];
const alt = emojione.convert(unicode.toUpperCase());
return `<img draggable="false" class="emojione" alt="${alt}" src="/emoji/${unicode}.svg" />`;
});
export default function emojify(text) { export default function emojify(text) {
return emojione.toImage(text); return toImage(text);
}; };

View File

@ -4,6 +4,7 @@ import emojify from '../../../emoji';
import escapeTextContentForBrowser from 'escape-html'; import escapeTextContentForBrowser from 'escape-html';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import IconButton from '../../../components/icon_button'; import IconButton from '../../../components/icon_button';
import { Motion, spring } from 'react-motion';
const messages = defineMessages({ const messages = defineMessages({
unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' }, unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' },
@ -11,6 +12,47 @@ const messages = defineMessages({
requested: { id: 'account.requested', defaultMessage: 'Awaiting approval' } requested: { id: 'account.requested', defaultMessage: 'Awaiting approval' }
}); });
const Avatar = React.createClass({
propTypes: {
account: ImmutablePropTypes.map.isRequired
},
getInitialState () {
return {
isHovered: false
};
},
mixins: [PureRenderMixin],
handleMouseOver () {
if (this.state.isHovered) return;
this.setState({ isHovered: true });
},
handleMouseOut () {
if (!this.state.isHovered) return;
this.setState({ isHovered: false });
},
render () {
const { account } = this.props;
const { isHovered } = this.state;
return (
<Motion defaultStyle={{ radius: 90 }} style={{ radius: spring(isHovered ? 30 : 90, { stiffness: 180, damping: 12 }) }}>
{({ radius }) =>
<a href={account.get('url')} className='account__header__avatar' target='_blank' rel='noopener' style={{ display: 'block', width: '90px', height: '90px', margin: '0 auto', marginBottom: '10px', borderRadius: `${radius}px`, overflow: 'hidden' }} onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}>
<img src={account.get('avatar')} alt={account.get('acct')} style={{ display: 'block', width: '90px', height: '90px' }} />
</a>
}
</Motion>
);
}
});
const Header = React.createClass({ const Header = React.createClass({
propTypes: { propTypes: {
@ -68,14 +110,9 @@ const Header = React.createClass({
return ( return (
<div className='account__header' style={{ backgroundImage: `url(${account.get('header')})` }}> <div className='account__header' style={{ backgroundImage: `url(${account.get('header')})` }}>
<div style={{ padding: '20px 10px' }}> <div style={{ padding: '20px 10px' }}>
<a href={account.get('url')} target='_blank' rel='noopener' style={{ display: 'block', color: 'inherit', textDecoration: 'none' }}> <Avatar account={account} />
<div className='account__header__avatar' style={{ width: '90px', margin: '0 auto', marginBottom: '10px' }}>
<img src={account.get('avatar')} alt='' style={{ display: 'block', width: '90px', height: '90px', borderRadius: '90px' }} />
</div>
<span style={{ display: 'inline-block', fontSize: '20px', lineHeight: '27px', fontWeight: '500' }} className='account__header__display-name' dangerouslySetInnerHTML={displayNameHTML} />
</a>
<span style={{ display: 'inline-block', fontSize: '20px', lineHeight: '27px', fontWeight: '500' }} className='account__header__display-name' dangerouslySetInnerHTML={displayNameHTML} />
<span className='account__header__username' style={{ fontSize: '14px', fontWeight: '400', display: 'block', marginBottom: '10px' }}>@{account.get('acct')} {lockedIcon}</span> <span className='account__header__username' style={{ fontSize: '14px', fontWeight: '400', display: 'block', marginBottom: '10px' }}>@{account.get('acct')} {lockedIcon}</span>
<div style={{ fontSize: '14px' }} className='account__header__content' dangerouslySetInnerHTML={content} /> <div style={{ fontSize: '14px' }} className='account__header__content' dangerouslySetInnerHTML={content} />

View File

@ -43,7 +43,7 @@ const EmojiPickerDropdown = React.createClass({
return ( return (
<Dropdown ref={this.setRef} style={style}> <Dropdown ref={this.setRef} style={style}>
<DropdownTrigger className='emoji-button' title={intl.formatMessage(messages.emoji)} style={{ fontSize: `24px`, width: `24px`, lineHeight: `24px`, display: 'block', marginLeft: '2px' }}> <DropdownTrigger className='emoji-button' title={intl.formatMessage(messages.emoji)} style={{ fontSize: `24px`, width: `24px`, lineHeight: `24px`, display: 'block', marginLeft: '2px' }}>
<img className="emojione" alt="🙂" src="/emoji/1f602.png" /> <img draggable="false" className="emojione" alt="🙂" src="/emoji/1f602.svg" />
</DropdownTrigger> </DropdownTrigger>
<DropdownContent className='dropdown__left'> <DropdownContent className='dropdown__left'>

View File

@ -41,7 +41,7 @@ const GettingStarted = ({ intl, me }) => {
<ColumnLink icon='sign-out' text={intl.formatMessage(messages.sign_out)} href='/auth/sign_out' method='delete' /> <ColumnLink icon='sign-out' text={intl.formatMessage(messages.sign_out)} href='/auth/sign_out' method='delete' />
</div> </div>
<div className='scrollable optionally-scrollable'> <div className='scrollable optionally-scrollable' style={{ display: 'flex', flexDirection: 'column' }}>
<div className='static-content getting-started'> <div className='static-content getting-started'>
<p><FormattedMessage id='getting_started.about_addressing' defaultMessage='You can follow people if you know their username and the domain they are on by entering an e-mail-esque address into the form at the top of the sidebar.' /></p> <p><FormattedMessage id='getting_started.about_addressing' defaultMessage='You can follow people if you know their username and the domain they are on by entering an e-mail-esque address into the form at the top of the sidebar.' /></p>
<p><FormattedMessage id='getting_started.about_shortcuts' defaultMessage='If the target user is on the same domain as you, just the username will work. The same rule applies to mentioning people in statuses.' /></p> <p><FormattedMessage id='getting_started.about_shortcuts' defaultMessage='If the target user is on the same domain as you, just the username will work. The same rule applies to mentioning people in statuses.' /></p>

View File

@ -36,34 +36,62 @@ const UI = React.createClass({
this.setState({ width: window.innerWidth }); this.setState({ width: window.innerWidth });
}, },
handleDragEnter (e) {
e.preventDefault();
if (!this.dragTargets) {
this.dragTargets = [];
}
if (this.dragTargets.indexOf(e.target) === -1) {
this.dragTargets.push(e.target);
}
this.setState({ draggingOver: true });
},
handleDragOver (e) { handleDragOver (e) {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
e.dataTransfer.dropEffect = 'copy'; try {
e.dataTransfer.dropEffect = 'copy';
} catch (err) {
if (e.dataTransfer.effectAllowed === 'all' || e.dataTransfer.effectAllowed === 'uninitialized') {
this.setState({ draggingOver: true });
} }
return false;
}, },
handleDrop (e) { handleDrop (e) {
e.preventDefault(); e.preventDefault();
this.setState({ draggingOver: false });
if (e.dataTransfer && e.dataTransfer.files.length === 1) { if (e.dataTransfer && e.dataTransfer.files.length === 1) {
this.setState({ draggingOver: false });
this.props.dispatch(uploadCompose(e.dataTransfer.files)); this.props.dispatch(uploadCompose(e.dataTransfer.files));
} }
}, },
handleDragLeave () { handleDragLeave (e) {
e.preventDefault();
e.stopPropagation();
this.dragTargets = this.dragTargets.filter(el => el !== e.target && this.node.contains(el));
if (this.dragTargets.length > 0) {
return;
}
this.setState({ draggingOver: false }); this.setState({ draggingOver: false });
}, },
componentWillMount () { componentWillMount () {
window.addEventListener('resize', this.handleResize, { passive: true }); window.addEventListener('resize', this.handleResize, { passive: true });
window.addEventListener('dragover', this.handleDragOver); document.addEventListener('dragenter', this.handleDragEnter, false);
window.addEventListener('drop', this.handleDrop); document.addEventListener('dragover', this.handleDragOver, false);
document.addEventListener('drop', this.handleDrop, false);
document.addEventListener('dragleave', this.handleDragLeave, false);
this.props.dispatch(refreshTimeline('home')); this.props.dispatch(refreshTimeline('home'));
this.props.dispatch(refreshNotifications()); this.props.dispatch(refreshNotifications());
@ -71,8 +99,14 @@ const UI = React.createClass({
componentWillUnmount () { componentWillUnmount () {
window.removeEventListener('resize', this.handleResize); window.removeEventListener('resize', this.handleResize);
window.removeEventListener('dragover', this.handleDragOver); document.removeEventListener('dragenter', this.handleDragEnter);
window.removeEventListener('drop', this.handleDrop); document.removeEventListener('dragover', this.handleDragOver);
document.removeEventListener('drop', this.handleDrop);
document.removeEventListener('dragleave', this.handleDragLeave);
},
setRef (c) {
this.node = c;
}, },
render () { render () {
@ -99,7 +133,7 @@ const UI = React.createClass({
} }
return ( return (
<div className='ui' onDragLeave={this.handleDragLeave}> <div className='ui' ref={this.setRef}>
<TabsBar /> <TabsBar />
{mountedColumns} {mountedColumns}

View File

@ -24,4 +24,17 @@ $(() => {
window.location.href = $(e.target).attr('href'); window.location.href = $(e.target).attr('href');
} }
}); });
$('.status__content__spoiler-link').on('click', e => {
e.preventDefault();
const contentEl = $(e.target).parent().parent().find('div');
if (contentEl.is(':visible')) {
contentEl.hide();
$(e.target).parent().attr('style', 'margin-bottom: 0');
} else {
contentEl.show();
$(e.target).parent().attr('style', null);
}
});
}); });

View File

@ -21,7 +21,7 @@
text-decoration: none; text-decoration: none;
transition: all 100ms ease-in; transition: all 100ms ease-in;
&:hover { &:hover, &:active, &:focus {
background-color: lighten($color4, 7%); background-color: lighten($color4, 7%);
transition: all 200ms ease-out; transition: all 200ms ease-out;
} }
@ -54,7 +54,7 @@
cursor: pointer; cursor: pointer;
transition: all 100ms ease-in; transition: all 100ms ease-in;
&:hover { &:hover, &:active, &:focus {
color: lighten($color1, 33%); color: lighten($color1, 33%);
transition: all 200ms ease-out; transition: all 200ms ease-out;
} }
@ -79,7 +79,7 @@
&.inverted { &.inverted {
color: lighten($color1, 33%); color: lighten($color1, 33%);
&:hover { &:hover, &:active, &:focus {
color: lighten($color1, 26%); color: lighten($color1, 26%);
} }
@ -105,7 +105,7 @@
outline: 0; outline: 0;
transition: all 100ms ease-in; transition: all 100ms ease-in;
&:hover { &:hover, &:active, &:focus {
color: lighten($color1, 26%); color: lighten($color1, 26%);
transition: all 200ms ease-out; transition: all 200ms ease-out;
} }
@ -771,6 +771,7 @@ a.status__content__spoiler-link {
padding: 0; padding: 0;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
overflow: hidden;
overflow-y: auto; overflow-y: auto;
flex-grow: 1; flex-grow: 1;
} }
@ -1639,7 +1640,7 @@ button.active i.fa-retweet {
margin-top: 2px; margin-top: 2px;
} }
&:hover { &:hover, &:active, &:focus {
img { img {
opacity: 1; opacity: 1;
filter: none; filter: none;

View File

@ -97,6 +97,15 @@
a { a {
color: $color4; color: $color4;
} }
a.status__content__spoiler-link {
color: $color5;
background: $color3;
&:hover {
background: lighten($color3, 8%);
}
}
} }
.status__attachments { .status__attachments {
@ -163,6 +172,15 @@
a { a {
color: $color4; color: $color4;
} }
a.status__content__spoiler-link {
color: $color5;
background: $color3;
&:hover {
background: lighten($color3, 8%);
}
}
} }
.detailed-status__meta { .detailed-status__meta {

View File

@ -20,7 +20,7 @@ class Api::V1::AccountsController < ApiController
accounts = Account.where(id: results.map(&:target_account_id)).map { |a| [a.id, a] }.to_h accounts = Account.where(id: results.map(&:target_account_id)).map { |a| [a.id, a] }.to_h
@accounts = results.map { |f| accounts[f.target_account_id] } @accounts = results.map { |f| accounts[f.target_account_id] }
set_account_counters_maps(@accounts) # set_account_counters_maps(@accounts)
next_path = following_api_v1_account_url(max_id: results.last.id) if results.size == limit_param(DEFAULT_ACCOUNTS_LIMIT) next_path = following_api_v1_account_url(max_id: results.last.id) if results.size == limit_param(DEFAULT_ACCOUNTS_LIMIT)
prev_path = following_api_v1_account_url(since_id: results.first.id) unless results.empty? prev_path = following_api_v1_account_url(since_id: results.first.id) unless results.empty?
@ -35,7 +35,7 @@ class Api::V1::AccountsController < ApiController
accounts = Account.where(id: results.map(&:account_id)).map { |a| [a.id, a] }.to_h accounts = Account.where(id: results.map(&:account_id)).map { |a| [a.id, a] }.to_h
@accounts = results.map { |f| accounts[f.account_id] } @accounts = results.map { |f| accounts[f.account_id] }
set_account_counters_maps(@accounts) # set_account_counters_maps(@accounts)
next_path = followers_api_v1_account_url(max_id: results.last.id) if results.size == limit_param(DEFAULT_ACCOUNTS_LIMIT) next_path = followers_api_v1_account_url(max_id: results.last.id) if results.size == limit_param(DEFAULT_ACCOUNTS_LIMIT)
prev_path = followers_api_v1_account_url(since_id: results.first.id) unless results.empty? prev_path = followers_api_v1_account_url(since_id: results.first.id) unless results.empty?
@ -52,8 +52,8 @@ class Api::V1::AccountsController < ApiController
@statuses = cache_collection(@statuses, Status) @statuses = cache_collection(@statuses, Status)
set_maps(@statuses) set_maps(@statuses)
set_counters_maps(@statuses) # set_counters_maps(@statuses)
set_account_counters_maps(@statuses.flat_map { |s| [s.account, s.reblog? ? s.reblog.account : nil] }.compact.uniq) # set_account_counters_maps(@statuses.flat_map { |s| [s.account, s.reblog? ? s.reblog.account : nil] }.compact.uniq)
next_path = statuses_api_v1_account_url(max_id: @statuses.last.id) unless @statuses.empty? next_path = statuses_api_v1_account_url(max_id: @statuses.last.id) unless @statuses.empty?
prev_path = statuses_api_v1_account_url(since_id: @statuses.first.id) unless @statuses.empty? prev_path = statuses_api_v1_account_url(since_id: @statuses.first.id) unless @statuses.empty?
@ -117,7 +117,7 @@ class Api::V1::AccountsController < ApiController
def search def search
@accounts = AccountSearchService.new.call(params[:q], limit_param(DEFAULT_ACCOUNTS_LIMIT), params[:resolve] == 'true', current_account) @accounts = AccountSearchService.new.call(params[:q], limit_param(DEFAULT_ACCOUNTS_LIMIT), params[:resolve] == 'true', current_account)
set_account_counters_maps(@accounts) unless @accounts.nil? # set_account_counters_maps(@accounts) unless @accounts.nil?
render action: :index render action: :index
end end

View File

@ -11,7 +11,7 @@ class Api::V1::BlocksController < ApiController
accounts = Account.where(id: results.map(&:target_account_id)).map { |a| [a.id, a] }.to_h accounts = Account.where(id: results.map(&:target_account_id)).map { |a| [a.id, a] }.to_h
@accounts = results.map { |f| accounts[f.target_account_id] }.compact @accounts = results.map { |f| accounts[f.target_account_id] }.compact
set_account_counters_maps(@accounts) # set_account_counters_maps(@accounts)
next_path = api_v1_blocks_url(max_id: results.last.id) if results.size == limit_param(DEFAULT_ACCOUNTS_LIMIT) next_path = api_v1_blocks_url(max_id: results.last.id) if results.size == limit_param(DEFAULT_ACCOUNTS_LIMIT)
prev_path = api_v1_blocks_url(since_id: results.first.id) unless results.empty? prev_path = api_v1_blocks_url(since_id: results.first.id) unless results.empty?

View File

@ -11,7 +11,7 @@ class Api::V1::FavouritesController < ApiController
@statuses = cache_collection(Status.where(id: results.map(&:status_id)), Status) @statuses = cache_collection(Status.where(id: results.map(&:status_id)), Status)
set_maps(@statuses) set_maps(@statuses)
set_counters_maps(@statuses) # set_counters_maps(@statuses)
next_path = api_v1_favourites_url(max_id: results.last.id) if results.size == limit_param(DEFAULT_STATUSES_LIMIT) next_path = api_v1_favourites_url(max_id: results.last.id) if results.size == limit_param(DEFAULT_STATUSES_LIMIT)
prev_path = api_v1_favourites_url(since_id: results.first.id) unless results.empty? prev_path = api_v1_favourites_url(since_id: results.first.id) unless results.empty?

View File

@ -9,7 +9,7 @@ class Api::V1::FollowRequestsController < ApiController
accounts = Account.where(id: results.map(&:account_id)).map { |a| [a.id, a] }.to_h accounts = Account.where(id: results.map(&:account_id)).map { |a| [a.id, a] }.to_h
@accounts = results.map { |f| accounts[f.account_id] } @accounts = results.map { |f| accounts[f.account_id] }
set_account_counters_maps(@accounts) # set_account_counters_maps(@accounts)
next_path = api_v1_follow_requests_url(max_id: results.last.id) if results.size == DEFAULT_ACCOUNTS_LIMIT next_path = api_v1_follow_requests_url(max_id: results.last.id) if results.size == DEFAULT_ACCOUNTS_LIMIT
prev_path = api_v1_follow_requests_url(since_id: results.first.id) unless results.empty? prev_path = api_v1_follow_requests_url(since_id: results.first.id) unless results.empty?

View File

@ -11,7 +11,7 @@ class Api::V1::MutesController < ApiController
accounts = Account.where(id: results.map(&:target_account_id)).map { |a| [a.id, a] }.to_h accounts = Account.where(id: results.map(&:target_account_id)).map { |a| [a.id, a] }.to_h
@accounts = results.map { |f| accounts[f.target_account_id] } @accounts = results.map { |f| accounts[f.target_account_id] }
set_account_counters_maps(@accounts) # set_account_counters_maps(@accounts)
next_path = api_v1_mutes_url(max_id: results.last.id) if results.size == limit_param(DEFAULT_ACCOUNTS_LIMIT) next_path = api_v1_mutes_url(max_id: results.last.id) if results.size == limit_param(DEFAULT_ACCOUNTS_LIMIT)
prev_path = api_v1_mutes_url(since_id: results.first.id) unless results.empty? prev_path = api_v1_mutes_url(since_id: results.first.id) unless results.empty?

View File

@ -14,8 +14,8 @@ class Api::V1::NotificationsController < ApiController
statuses = @notifications.select { |n| !n.target_status.nil? }.map(&:target_status) statuses = @notifications.select { |n| !n.target_status.nil? }.map(&:target_status)
set_maps(statuses) set_maps(statuses)
set_counters_maps(statuses) # set_counters_maps(statuses)
set_account_counters_maps(@notifications.map(&:from_account)) # set_account_counters_maps(@notifications.map(&:from_account))
next_path = api_v1_notifications_url(max_id: @notifications.last.id) unless @notifications.empty? next_path = api_v1_notifications_url(max_id: @notifications.last.id) unless @notifications.empty?
prev_path = api_v1_notifications_url(since_id: @notifications.first.id) unless @notifications.empty? prev_path = api_v1_notifications_url(since_id: @notifications.first.id) unless @notifications.empty?

View File

@ -23,7 +23,7 @@ class Api::V1::StatusesController < ApiController
statuses = [@status] + @context[:ancestors] + @context[:descendants] statuses = [@status] + @context[:ancestors] + @context[:descendants]
set_maps(statuses) set_maps(statuses)
set_counters_maps(statuses) # set_counters_maps(statuses)
end end
def card def card
@ -36,7 +36,7 @@ class Api::V1::StatusesController < ApiController
accounts = Account.where(id: results.map(&:account_id)).map { |a| [a.id, a] }.to_h accounts = Account.where(id: results.map(&:account_id)).map { |a| [a.id, a] }.to_h
@accounts = results.map { |r| accounts[r.account_id] } @accounts = results.map { |r| accounts[r.account_id] }
set_account_counters_maps(@accounts) # set_account_counters_maps(@accounts)
next_path = reblogged_by_api_v1_status_url(max_id: results.last.id) if results.size == limit_param(DEFAULT_ACCOUNTS_LIMIT) next_path = reblogged_by_api_v1_status_url(max_id: results.last.id) if results.size == limit_param(DEFAULT_ACCOUNTS_LIMIT)
prev_path = reblogged_by_api_v1_status_url(since_id: results.first.id) unless results.empty? prev_path = reblogged_by_api_v1_status_url(since_id: results.first.id) unless results.empty?
@ -51,7 +51,7 @@ class Api::V1::StatusesController < ApiController
accounts = Account.where(id: results.map(&:account_id)).map { |a| [a.id, a] }.to_h accounts = Account.where(id: results.map(&:account_id)).map { |a| [a.id, a] }.to_h
@accounts = results.map { |f| accounts[f.account_id] } @accounts = results.map { |f| accounts[f.account_id] }
set_account_counters_maps(@accounts) # set_account_counters_maps(@accounts)
next_path = favourited_by_api_v1_status_url(max_id: results.last.id) if results.size == limit_param(DEFAULT_ACCOUNTS_LIMIT) next_path = favourited_by_api_v1_status_url(max_id: results.last.id) if results.size == limit_param(DEFAULT_ACCOUNTS_LIMIT)
prev_path = favourited_by_api_v1_status_url(since_id: results.first.id) unless results.empty? prev_path = favourited_by_api_v1_status_url(since_id: results.first.id) unless results.empty?

View File

@ -11,8 +11,8 @@ class Api::V1::TimelinesController < ApiController
@statuses = cache_collection(@statuses) @statuses = cache_collection(@statuses)
set_maps(@statuses) set_maps(@statuses)
set_counters_maps(@statuses) # set_counters_maps(@statuses)
set_account_counters_maps(@statuses.flat_map { |s| [s.account, s.reblog? ? s.reblog.account : nil] }.compact.uniq) # set_account_counters_maps(@statuses.flat_map { |s| [s.account, s.reblog? ? s.reblog.account : nil] }.compact.uniq)
next_path = api_v1_home_timeline_url(max_id: @statuses.last.id) unless @statuses.empty? next_path = api_v1_home_timeline_url(max_id: @statuses.last.id) unless @statuses.empty?
prev_path = api_v1_home_timeline_url(since_id: @statuses.first.id) unless @statuses.empty? prev_path = api_v1_home_timeline_url(since_id: @statuses.first.id) unless @statuses.empty?
@ -27,8 +27,8 @@ class Api::V1::TimelinesController < ApiController
@statuses = cache_collection(@statuses) @statuses = cache_collection(@statuses)
set_maps(@statuses) set_maps(@statuses)
set_counters_maps(@statuses) # set_counters_maps(@statuses)
set_account_counters_maps(@statuses.flat_map { |s| [s.account, s.reblog? ? s.reblog.account : nil] }.compact.uniq) # set_account_counters_maps(@statuses.flat_map { |s| [s.account, s.reblog? ? s.reblog.account : nil] }.compact.uniq)
next_path = api_v1_public_timeline_url(max_id: @statuses.last.id) unless @statuses.empty? next_path = api_v1_public_timeline_url(max_id: @statuses.last.id) unless @statuses.empty?
prev_path = api_v1_public_timeline_url(since_id: @statuses.first.id) unless @statuses.empty? prev_path = api_v1_public_timeline_url(since_id: @statuses.first.id) unless @statuses.empty?
@ -44,8 +44,8 @@ class Api::V1::TimelinesController < ApiController
@statuses = cache_collection(@statuses) @statuses = cache_collection(@statuses)
set_maps(@statuses) set_maps(@statuses)
set_counters_maps(@statuses) # set_counters_maps(@statuses)
set_account_counters_maps(@statuses.flat_map { |s| [s.account, s.reblog? ? s.reblog.account : nil] }.compact.uniq) # set_account_counters_maps(@statuses.flat_map { |s| [s.account, s.reblog? ? s.reblog.account : nil] }.compact.uniq)
next_path = api_v1_hashtag_timeline_url(params[:id], max_id: @statuses.last.id) unless @statuses.empty? next_path = api_v1_hashtag_timeline_url(params[:id], max_id: @statuses.last.id) unless @statuses.empty?
prev_path = api_v1_hashtag_timeline_url(params[:id], since_id: @statuses.first.id) unless @statuses.empty? prev_path = api_v1_hashtag_timeline_url(params[:id], since_id: @statuses.first.id) unless @statuses.empty?

View File

@ -0,0 +1,34 @@
# frozen_string_literal: true
class Settings::ImportsController < ApplicationController
layout 'admin'
before_action :authenticate_user!
before_action :set_account
def show
@import = Import.new
end
def create
@import = Import.new(import_params)
@import.account = @account
if @import.save
ImportWorker.perform_async(@import.id)
redirect_to settings_import_path, notice: I18n.t('imports.success')
else
render action: :show
end
end
private
def set_account
@account = current_user.account
end
def import_params
params.require(:import).permit(:data, :type)
end
end

View File

@ -36,11 +36,14 @@ class XrdController < ApplicationController
end end
def username_from_resource def username_from_resource
if resource_param.start_with?('acct:') || resource_param.include?('@') if resource_param =~ /\Ahttps?:\/\//
resource_param.split('@').first.gsub('acct:', '') path_params = Rails.application.routes.recognize_path(resource_param)
raise ActiveRecord::RecordNotFound unless path_params[:controller] == 'users' && path_params[:action] == 'show'
path_params[:username]
else else
url = Addressable::URI.parse(resource_param) username, domain = resource_param.gsub(/\Aacct:/, '').split('@')
url.path.gsub('/users/', '') raise ActiveRecord::RecordNotFound unless TagManager.instance.local_domain?(domain)
username
end end
end end

View File

@ -9,8 +9,6 @@ class Formatter
include ActionView::Helpers::TextHelper include ActionView::Helpers::TextHelper
include ActionView::Helpers::SanitizeHelper include ActionView::Helpers::SanitizeHelper
AUTOLINK_RE = /https?:\/\/([\S]+\.[!#$&-;=?-[\]_a-z~]|%[\w\d]{2}]+[\w])/i
def format(status) def format(status)
return reformat(status.content) unless status.local? return reformat(status.content) unless status.local?
@ -39,6 +37,7 @@ class Formatter
html = encode(account.note) html = encode(account.note)
html = link_urls(html) html = link_urls(html)
html = link_accounts(html)
html = link_hashtags(html) html = link_hashtags(html)
html.html_safe # rubocop:disable Rails/OutputSafety html.html_safe # rubocop:disable Rails/OutputSafety
@ -59,12 +58,23 @@ class Formatter
def link_mentions(html, mentions) def link_mentions(html, mentions)
html.gsub(Account::MENTION_RE) do |match| html.gsub(Account::MENTION_RE) do |match|
acct = Account::MENTION_RE.match(match)[1] acct = Account::MENTION_RE.match(match)[1]
mention = mentions.find { |item| item.account.acct.casecmp(acct).zero? } mention = mentions.find { |item| TagManager.instance.same_acct?(item.account.acct, acct) }
mention.nil? ? match : mention_html(match, mention.account) mention.nil? ? match : mention_html(match, mention.account)
end end
end end
def link_accounts(html)
html.gsub(Account::MENTION_RE) do |match|
acct = Account::MENTION_RE.match(match)[1]
username, domain = acct.split('@')
domain = nil if TagManager.instance.local_domain?(domain)
account = Account.find_remote(username, domain)
account.nil? ? match : mention_html(match, account)
end
end
def link_hashtags(html) def link_hashtags(html)
html.gsub(Tag::HASHTAG_RE) do |match| html.gsub(Tag::HASHTAG_RE) do |match|
hashtag_html(match) hashtag_html(match)

View File

@ -60,6 +60,12 @@ class TagManager
domain.nil? || domain.gsub(/[\/]/, '').casecmp(Rails.configuration.x.local_domain).zero? domain.nil? || domain.gsub(/[\/]/, '').casecmp(Rails.configuration.x.local_domain).zero?
end end
def same_acct?(canonical, needle)
return true if canonical.casecmp(needle).zero?
username, domain = needle.split('@')
local_domain?(domain) && canonical.casecmp(username).zero?
end
def local_url?(url) def local_url?(url)
uri = Addressable::URI.parse(url) uri = Addressable::URI.parse(url)
domain = uri.host + (uri.port ? ":#{uri.port}" : '') domain = uri.host + (uri.port ? ":#{uri.port}" : '')

View File

@ -4,7 +4,7 @@ class Favourite < ApplicationRecord
include Paginable include Paginable
belongs_to :account, inverse_of: :favourites belongs_to :account, inverse_of: :favourites
belongs_to :status, inverse_of: :favourites belongs_to :status, inverse_of: :favourites, counter_cache: true
has_one :notification, as: :activity, dependent: :destroy has_one :notification, as: :activity, dependent: :destroy

View File

@ -3,8 +3,8 @@
class Follow < ApplicationRecord class Follow < ApplicationRecord
include Paginable include Paginable
belongs_to :account belongs_to :account, counter_cache: :following_count
belongs_to :target_account, class_name: 'Account' belongs_to :target_account, class_name: 'Account', counter_cache: :followers_count
has_one :notification, as: :activity, dependent: :destroy has_one :notification, as: :activity, dependent: :destroy

14
app/models/import.rb Normal file
View File

@ -0,0 +1,14 @@
# frozen_string_literal: true
class Import < ApplicationRecord
self.inheritance_column = false
enum type: [:following, :blocking]
belongs_to :account
FILE_TYPES = ['text/plain', 'text/csv'].freeze
has_attached_file :data, url: '/system/:hash.:extension', hash_secret: ENV.fetch('PAPERCLIP_SECRET')
validates_attachment_content_type :data, content_type: FILE_TYPES
end

View File

@ -10,11 +10,11 @@ class Status < ApplicationRecord
belongs_to :application, class_name: 'Doorkeeper::Application' belongs_to :application, class_name: 'Doorkeeper::Application'
belongs_to :account, inverse_of: :statuses belongs_to :account, inverse_of: :statuses, counter_cache: true
belongs_to :in_reply_to_account, foreign_key: 'in_reply_to_account_id', class_name: 'Account' belongs_to :in_reply_to_account, foreign_key: 'in_reply_to_account_id', class_name: 'Account'
belongs_to :thread, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :replies belongs_to :thread, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :replies
belongs_to :reblog, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblogs belongs_to :reblog, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblogs, counter_cache: :reblogs_count
has_many :favourites, inverse_of: :status, dependent: :destroy has_many :favourites, inverse_of: :status, dependent: :destroy
has_many :reblogs, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblog, dependent: :destroy has_many :reblogs, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblog, dependent: :destroy

View File

@ -23,12 +23,12 @@
.counter{ class: active_nav_class(short_account_url(@account)) } .counter{ class: active_nav_class(short_account_url(@account)) }
= link_to short_account_url(@account), class: 'u-url u-uid' do = link_to short_account_url(@account), class: 'u-url u-uid' do
%span.counter-label= t('accounts.posts') %span.counter-label= t('accounts.posts')
%span.counter-number= number_with_delimiter @account.statuses.count %span.counter-number= number_with_delimiter @account.statuses_count
.counter{ class: active_nav_class(following_account_url(@account)) } .counter{ class: active_nav_class(following_account_url(@account)) }
= link_to following_account_url(@account) do = link_to following_account_url(@account) do
%span.counter-label= t('accounts.following') %span.counter-label= t('accounts.following')
%span.counter-number= number_with_delimiter @account.following.count %span.counter-number= number_with_delimiter @account.following_count
.counter{ class: active_nav_class(followers_account_url(@account)) } .counter{ class: active_nav_class(followers_account_url(@account)) }
= link_to followers_account_url(@account) do = link_to followers_account_url(@account) do
%span.counter-label= t('accounts.followers') %span.counter-label= t('accounts.followers')
%span.counter-number= number_with_delimiter @account.followers.count %span.counter-number= number_with_delimiter @account.followers_count

View File

@ -47,13 +47,13 @@
%tr %tr
%th Follows %th Follows
%td= @account.following.count %td= @account.following_count
%tr %tr
%th Followers %th Followers
%td= @account.followers.count %td= @account.followers_count
%tr %tr
%th Statuses %th Statuses
%td= @account.statuses.count %td= @account.statuses_count
%tr %tr
%th Media attachments %th Media attachments
%td %td

View File

@ -1,11 +1,11 @@
object @account object @account
attributes :id, :username, :acct, :display_name, :locked attributes :id, :username, :acct, :display_name, :locked, :created_at
node(:note) { |account| Formatter.instance.simplified_format(account) } node(:note) { |account| Formatter.instance.simplified_format(account) }
node(:url) { |account| TagManager.instance.url_for(account) } node(:url) { |account| TagManager.instance.url_for(account) }
node(:avatar) { |account| full_asset_url(account.avatar.url(:original)) } node(:avatar) { |account| full_asset_url(account.avatar.url(:original)) }
node(:header) { |account| full_asset_url(account.header.url(:original)) } node(:header) { |account| full_asset_url(account.header.url(:original)) }
node(:followers_count) { |account| defined?(@followers_counts_map) ? (@followers_counts_map[account.id] || 0) : (account.try(:followers_count) || account.followers.count) } node(:followers_count) { |account| defined?(@followers_counts_map) ? (@followers_counts_map[account.id] || 0) : account.followers_count }
node(:following_count) { |account| defined?(@following_counts_map) ? (@following_counts_map[account.id] || 0) : (account.try(:following_count) || account.following.count) } node(:following_count) { |account| defined?(@following_counts_map) ? (@following_counts_map[account.id] || 0) : account.following_count }
node(:statuses_count) { |account| defined?(@statuses_counts_map) ? (@statuses_counts_map[account.id] || 0) : (account.try(:statuses_count) || account.statuses.count) } node(:statuses_count) { |account| defined?(@statuses_counts_map) ? (@statuses_counts_map[account.id] || 0) : account.statuses_count }

View File

@ -3,8 +3,8 @@ attributes :id, :created_at, :in_reply_to_id, :in_reply_to_account_id, :sensitiv
node(:uri) { |status| TagManager.instance.uri_for(status) } node(:uri) { |status| TagManager.instance.uri_for(status) }
node(:content) { |status| Formatter.instance.format(status) } node(:content) { |status| Formatter.instance.format(status) }
node(:url) { |status| TagManager.instance.url_for(status) } node(:url) { |status| TagManager.instance.url_for(status) }
node(:reblogs_count) { |status| defined?(@reblogs_counts_map) ? (@reblogs_counts_map[status.id] || 0) : status.reblogs.count } node(:reblogs_count) { |status| defined?(@reblogs_counts_map) ? (@reblogs_counts_map[status.id] || 0) : status.reblogs_count }
node(:favourites_count) { |status| defined?(@favourites_counts_map) ? (@favourites_counts_map[status.id] || 0) : status.favourites.count } node(:favourites_count) { |status| defined?(@favourites_counts_map) ? (@favourites_counts_map[status.id] || 0) : status.favourites_count }
child :application do child :application do
extends 'api/v1/apps/show' extends 'api/v1/apps/show'

View File

@ -12,6 +12,15 @@
.content-wrapper .content-wrapper
.content .content
%h2= yield :page_title %h2= yield :page_title
- if flash[:notice]
.flash-message.notice
%strong= flash[:notice]
- if flash[:alert]
.flash-message.alert
%strong= flash[:alert]
= yield = yield
= render template: "layouts/application", locals: { body_classes: 'admin' } = render template: "layouts/application", locals: { body_classes: 'admin' }

View File

@ -0,0 +1,11 @@
- content_for :page_title do
= t('settings.import')
%p.hint= t('imports.preface')
= simple_form_for @import, url: settings_import_path do |f|
= f.input :type, collection: Import.types.keys, wrapper: :with_label, include_blank: false, label_method: lambda { |type| I18n.t("imports.types.#{type}") }
= f.input :data, wrapper: :with_label, hint: t('simple_form.hints.imports.data')
.actions
= f.button :button, t('imports.upload'), type: :submit

View File

@ -9,8 +9,10 @@
.status__content.e-content.p-name.emojify< .status__content.e-content.p-name.emojify<
- unless status.spoiler_text.blank? - unless status.spoiler_text.blank?
%p= status.spoiler_text %p{ style: 'margin-bottom: 0' }<
%div{ style: "direction: #{rtl?(status.content) ? 'rtl' : 'ltr'}" }= Formatter.instance.format(status) %span>= "#{status.spoiler_text} "
%a.status__content__spoiler-link{ href: '#' }= t('statuses.show_more')
%div{ style: "display: #{status.spoiler_text.blank? ? 'block' : 'none'}; direction: #{rtl?(status.content) ? 'rtl' : 'ltr'}" }= Formatter.instance.format(status)
- unless status.media_attachments.empty? - unless status.media_attachments.empty?
- if status.media_attachments.first.video? - if status.media_attachments.first.video?
@ -39,11 +41,11 @@
· ·
%span< %span<
= fa_icon('retweet') = fa_icon('retweet')
%span= status.reblogs.count %span= status.reblogs_count
· ·
%span< %span<
= fa_icon('star') = fa_icon('star')
%span= status.favourites.count %span= status.favourites_count
- if user_signed_in? - if user_signed_in?
· ·

View File

@ -14,8 +14,10 @@
.status__content.e-content.p-name.emojify< .status__content.e-content.p-name.emojify<
- unless status.spoiler_text.blank? - unless status.spoiler_text.blank?
%p= status.spoiler_text %p{ style: 'margin-bottom: 0' }<
%div{ style: "direction: #{rtl?(status.content) ? 'rtl' : 'ltr'}" }= Formatter.instance.format(status) %span>= "#{status.spoiler_text} "
%a.status__content__spoiler-link{ href: '#' }= t('statuses.show_more')
%div{ style: "display: #{status.spoiler_text.blank? ? 'block' : 'none'}; direction: #{rtl?(status.content) ? 'rtl' : 'ltr'}" }= Formatter.instance.format(status)
- unless status.media_attachments.empty? - unless status.media_attachments.empty?
.status__attachments .status__attachments

View File

@ -0,0 +1,54 @@
# frozen_string_literal: true
require 'csv'
class ImportWorker
include Sidekiq::Worker
sidekiq_options retry: false
def perform(import_id)
import = Import.find(import_id)
case import.type
when 'blocking'
process_blocks(import)
when 'following'
process_follows(import)
end
import.destroy
end
private
def process_blocks(import)
from_account = import.account
CSV.foreach(import.data.path) do |row|
next if row.size != 1
begin
target_account = FollowRemoteAccountService.new.call(row[0])
next if target_account.nil?
BlockService.new.call(from_account, target_account)
rescue Goldfinger::Error, HTTP::Error, OpenSSL::SSL::SSLError
next
end
end
end
def process_follows(import)
from_account = import.account
CSV.foreach(import.data.path) do |row|
next if row.size != 1
begin
FollowService.new.call(from_account, row[0])
rescue Goldfinger::Error, HTTP::Error, OpenSSL::SSL::SSLError
next
end
end
end
end

View File

@ -85,6 +85,13 @@ en:
validation_errors: validation_errors:
one: Something isn't quite right yet! Please review the error below one: Something isn't quite right yet! Please review the error below
other: Something isn't quite right yet! Please review %{count} errors below other: Something isn't quite right yet! Please review %{count} errors below
imports:
preface: You can import certain data like all the people you are following or blocking into your account on this instance, from files created by an export on another instance.
success: Your data was successfully uploaded and will now be processed in due time
types:
blocking: Blocking list
following: Following list
upload: Upload
landing_strip_html: <strong>%{name}</strong> is a user on <strong>%{domain}</strong>. You can follow them or interact with them if you have an account anywhere in the fediverse. If you don't, you can <a href="%{sign_up_path}">sign up here</a>. landing_strip_html: <strong>%{name}</strong> is a user on <strong>%{domain}</strong>. You can follow them or interact with them if you have an account anywhere in the fediverse. If you don't, you can <a href="%{sign_up_path}">sign up here</a>.
notification_mailer: notification_mailer:
digest: digest:
@ -124,12 +131,14 @@ en:
back: Back to Mastodon back: Back to Mastodon
edit_profile: Edit profile edit_profile: Edit profile
export: Data export export: Data export
import: Import
preferences: Preferences preferences: Preferences
settings: Settings settings: Settings
two_factor_auth: Two-factor Authentication two_factor_auth: Two-factor Authentication
statuses: statuses:
open_in_web: Open in web open_in_web: Open in web
over_character_limit: character limit of %{max} exceeded over_character_limit: character limit of %{max} exceeded
show_more: Show more
visibilities: visibilities:
private: Only show to followers private: Only show to followers
public: Public public: Public

View File

@ -8,12 +8,15 @@ en:
header: PNG, GIF or JPG. At most 2MB. Will be downscaled to 700x335px header: PNG, GIF or JPG. At most 2MB. Will be downscaled to 700x335px
locked: Requires you to manually approve followers and defaults post privacy to followers-only locked: Requires you to manually approve followers and defaults post privacy to followers-only
note: At most 160 characters note: At most 160 characters
imports:
data: CSV file exported from another Mastodon instance
labels: labels:
defaults: defaults:
avatar: Avatar avatar: Avatar
confirm_new_password: Confirm new password confirm_new_password: Confirm new password
confirm_password: Confirm password confirm_password: Confirm password
current_password: Current password current_password: Current password
data: Data
display_name: Display name display_name: Display name
email: E-mail address email: E-mail address
header: Header header: Header
@ -24,6 +27,7 @@ en:
otp_attempt: Two-factor code otp_attempt: Two-factor code
password: Password password: Password
setting_default_privacy: Post privacy setting_default_privacy: Post privacy
type: Import type
username: Username username: Username
interactions: interactions:
must_be_follower: Block notifications from non-followers must_be_follower: Block notifications from non-followers

View File

@ -9,6 +9,7 @@ SimpleNavigation::Configuration.run do |navigation|
settings.item :preferences, safe_join([fa_icon('sliders fw'), t('settings.preferences')]), settings_preferences_url settings.item :preferences, safe_join([fa_icon('sliders fw'), t('settings.preferences')]), settings_preferences_url
settings.item :password, safe_join([fa_icon('cog fw'), t('auth.change_password')]), edit_user_registration_url settings.item :password, safe_join([fa_icon('cog fw'), t('auth.change_password')]), edit_user_registration_url
settings.item :two_factor_auth, safe_join([fa_icon('mobile fw'), t('settings.two_factor_auth')]), settings_two_factor_auth_url settings.item :two_factor_auth, safe_join([fa_icon('mobile fw'), t('settings.two_factor_auth')]), settings_two_factor_auth_url
settings.item :import, safe_join([fa_icon('cloud-upload fw'), t('settings.import')]), settings_import_url
settings.item :export, safe_join([fa_icon('cloud-download fw'), t('settings.export')]), settings_export_url settings.item :export, safe_join([fa_icon('cloud-download fw'), t('settings.export')]), settings_export_url
settings.item :authorized_apps, safe_join([fa_icon('list fw'), t('settings.authorized_apps')]), oauth_authorized_applications_url settings.item :authorized_apps, safe_join([fa_icon('list fw'), t('settings.authorized_apps')]), oauth_authorized_applications_url
end end

View File

@ -51,6 +51,7 @@ Rails.application.routes.draw do
namespace :settings do namespace :settings do
resource :profile, only: [:show, :update] resource :profile, only: [:show, :update]
resource :preferences, only: [:show, :update] resource :preferences, only: [:show, :update]
resource :import, only: [:show, :create]
resource :export, only: [:show] do resource :export, only: [:show] do
collection do collection do

View File

@ -0,0 +1,13 @@
class AddCounterCaches < ActiveRecord::Migration[5.0]
def change
add_column :statuses, :favourites_count, :integer, null: false, default: 0
add_column :statuses, :reblogs_count, :integer, null: false, default: 0
add_column :accounts, :statuses_count, :integer, null: false, default: 0
add_column :accounts, :followers_count, :integer, null: false, default: 0
add_column :accounts, :following_count, :integer, null: false, default: 0
end
end
# To make the new fields contain correct data:
# update statuses set favourites_count = (select count(*) from favourites where favourites.status_id = statuses.id), reblogs_count = (select count(*) from statuses as reblogs where reblogs.reblog_of_id = statuses.id);
# update accounts set statuses_count = (select count(*) from statuses where account_id = accounts.id), followers_count = (select count(*) from follows where target_account_id = accounts.id), following_count = (select count(*) from follows where account_id = accounts.id);

View File

@ -0,0 +1,11 @@
class CreateImports < ActiveRecord::Migration[5.0]
def change
create_table :imports do |t|
t.integer :account_id, null: false
t.integer :type, null: false
t.boolean :approved
t.timestamps
end
end
end

View File

@ -0,0 +1,11 @@
class AddAttachmentDataToImports < ActiveRecord::Migration
def self.up
change_table :imports do |t|
t.attachment :data
end
end
def self.down
remove_attachment :imports, :data
end
end

View File

@ -10,7 +10,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20170322162804) do ActiveRecord::Schema.define(version: 20170330164118) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
@ -44,6 +44,9 @@ ActiveRecord::Schema.define(version: 20170322162804) do
t.boolean "suspended", default: false, null: false t.boolean "suspended", default: false, null: false
t.boolean "locked", default: false, null: false t.boolean "locked", default: false, null: false
t.string "header_remote_url", default: "", null: false t.string "header_remote_url", default: "", null: false
t.integer "statuses_count", default: 0, null: false
t.integer "followers_count", default: 0, null: false
t.integer "following_count", default: 0, null: false
t.index "(((setweight(to_tsvector('simple'::regconfig, (display_name)::text), 'A'::\"char\") || setweight(to_tsvector('simple'::regconfig, (username)::text), 'B'::\"char\")) || setweight(to_tsvector('simple'::regconfig, (COALESCE(domain, ''::character varying))::text), 'C'::\"char\")))", name: "search_index", using: :gin t.index "(((setweight(to_tsvector('simple'::regconfig, (display_name)::text), 'A'::\"char\") || setweight(to_tsvector('simple'::regconfig, (username)::text), 'B'::\"char\")) || setweight(to_tsvector('simple'::regconfig, (COALESCE(domain, ''::character varying))::text), 'C'::\"char\")))", name: "search_index", using: :gin
t.index "lower((username)::text), lower((domain)::text)", name: "index_accounts_on_username_and_domain_lower", using: :btree t.index "lower((username)::text), lower((domain)::text)", name: "index_accounts_on_username_and_domain_lower", using: :btree
t.index ["username", "domain"], name: "index_accounts_on_username_and_domain", unique: true, using: :btree t.index ["username", "domain"], name: "index_accounts_on_username_and_domain", unique: true, using: :btree
@ -90,6 +93,18 @@ ActiveRecord::Schema.define(version: 20170322162804) do
t.index ["account_id", "target_account_id"], name: "index_follows_on_account_id_and_target_account_id", unique: true, using: :btree t.index ["account_id", "target_account_id"], name: "index_follows_on_account_id_and_target_account_id", unique: true, using: :btree
end end
create_table "imports", force: :cascade do |t|
t.integer "account_id", null: false
t.integer "type", null: false
t.boolean "approved"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "data_file_name"
t.string "data_content_type"
t.integer "data_file_size"
t.datetime "data_updated_at"
end
create_table "media_attachments", force: :cascade do |t| create_table "media_attachments", force: :cascade do |t|
t.bigint "status_id" t.bigint "status_id"
t.string "file_file_name" t.string "file_file_name"
@ -220,6 +235,8 @@ ActiveRecord::Schema.define(version: 20170322162804) do
t.integer "application_id" t.integer "application_id"
t.text "spoiler_text", default: "", null: false t.text "spoiler_text", default: "", null: false
t.boolean "reply", default: false t.boolean "reply", default: false
t.integer "favourites_count", default: 0, null: false
t.integer "reblogs_count", default: 0, null: false
t.index ["account_id"], name: "index_statuses_on_account_id", using: :btree t.index ["account_id"], name: "index_statuses_on_account_id", using: :btree
t.index ["in_reply_to_id"], name: "index_statuses_on_in_reply_to_id", using: :btree t.index ["in_reply_to_id"], name: "index_statuses_on_in_reply_to_id", using: :btree
t.index ["reblog_of_id"], name: "index_statuses_on_reblog_of_id", using: :btree t.index ["reblog_of_id"], name: "index_statuses_on_reblog_of_id", using: :btree

View File

@ -9,7 +9,7 @@ Some people have started working on apps for the Mastodon API. Here is a list of
|mastodroid|Android|<https://github.com/alin-rautoiu/mastodroid>|[@charlag@mastodon.social](https://mastodon.social/users/charlag)| |mastodroid|Android|<https://github.com/alin-rautoiu/mastodroid>|[@charlag@mastodon.social](https://mastodon.social/users/charlag)|
|TootyFruity|Android|<https://play.google.com/store/apps/details?id=ch.kevinegli.tootyfruity221258>|[@eggplant@mastodon.social](https://mastodon.social/users/eggplant)| |TootyFruity|Android|<https://play.google.com/store/apps/details?id=ch.kevinegli.tootyfruity221258>|[@eggplant@mastodon.social](https://mastodon.social/users/eggplant)|
|11t|iOS/Android|<https://github.com/jeroensmeets/mastodon-app>|[@jeroensmeets@mastodon.social](https://mastodon.social/users/jeroensmeets)| |11t|iOS/Android|<https://github.com/jeroensmeets/mastodon-app>|[@jeroensmeets@mastodon.social](https://mastodon.social/users/jeroensmeets)|
|[Amarok](https://itunes.apple.com/us/app/amarok-for-mastodon/id1214116200?ls=1&mt=8)|iOS|<https://itunes.apple.com/us/app/amarok-for-mastodon/id1214116200?ls=1&mt=8>|[@eurasierboy@mastodon.social](https://mastodon.social/users/eurasierboy)| |[Amaroq](https://itunes.apple.com/us/app/amarok-for-mastodon/id1214116200?ls=1&mt=8)|iOS|<https://itunes.apple.com/us/app/amarok-for-mastodon/id1214116200?ls=1&mt=8>|[@eurasierboy@mastodon.social](https://mastodon.social/users/eurasierboy)|
|Albatross|iOS||[@goldie_ice@mastodon.social](https://mastodon.social/users/goldie_ice)| |Albatross|iOS||[@goldie_ice@mastodon.social](https://mastodon.social/users/goldie_ice)|
|Tooter|Chrome|<https://github.com/ineffyble/tooter>|[@effy@mastodon.social](https://mastodon.social/users/effy)| |Tooter|Chrome|<https://github.com/ineffyble/tooter>|[@effy@mastodon.social](https://mastodon.social/users/effy)|
|tootstream|CLI|<https://github.com/magicalraccoon/tootstream>|[@Raccoon@mastodon.social](https://mastodon.social/users/Raccoon)| |tootstream|CLI|<https://github.com/magicalraccoon/tootstream>|[@Raccoon@mastodon.social](https://mastodon.social/users/Raccoon)|

View File

@ -62,4 +62,23 @@ namespace :mastodon do
end end
end end
end end
namespace :maintenance do
desc 'Update counter caches'
task update_counter_caches: :environment do
Rails.logger.debug 'Updating counter caches for accounts...'
Account.unscoped.select('id').find_in_batches do |batch|
Account.where(id: batch.map(&:id)).update_all('statuses_count = (select count(*) from statuses where account_id = accounts.id), followers_count = (select count(*) from follows where target_account_id = accounts.id), following_count = (select count(*) from follows where account_id = accounts.id)')
end
Rails.logger.debug 'Updating counter caches for statuses...'
Status.unscoped.select('id').find_in_batches do |batch|
Status.where(id: batch.map(&:id)).update_all('favourites_count = (select count(*) from favourites where favourites.status_id = statuses.id), reblogs_count = (select count(*) from statuses as reblogs where reblogs.reblog_of_id = statuses.id)')
end
Rails.logger.debug 'Done!'
end
end
end end

View File

@ -23,7 +23,7 @@
"chai-enzyme": "^0.6.1", "chai-enzyme": "^0.6.1",
"css-loader": "^0.26.2", "css-loader": "^0.26.2",
"dotenv": "^4.0.0", "dotenv": "^4.0.0",
"emojione": "latest", "emojione": "^2.2.7",
"emojione-picker": "^2.0.1", "emojione-picker": "^2.0.1",
"enzyme": "^2.7.1", "enzyme": "^2.7.1",
"es6-promise": "^3.2.1", "es6-promise": "^3.2.1",

View File

@ -0,0 +1,2 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#d0d0d0"/><path d="M57,45.7c0,4.6-3.7,8.3-8.3,8.3H15.3C10.7,54,7,50.3,7,45.7V12.3C7,7.7,10.7,4,15.3,4h33.3
c4.6,0,8.3,3.7,8.3,8.3V45.7z" fill="#fff"/><path d="m49.4 24.9l1.6-6h-6.1l1.6-6h-6.1l-1.6 6h-8.1l1.6-6h-6.1l-1.6 6h-6.1l-1.6 6h6.1l-2.2 8h-6.1l-1.6 6h6.1l-1.6 6h6.1l1.6-6h8.1l-1.6 6h6.1l1.6-6h6.1l1.6-6h-6.1l2.2-8c0 0 6.1 0 6.1 0m-14.4 8h-8.1l2.2-8h8.1l-2.2 8" fill="#9aa0a5"/></svg>

After

Width:  |  Height:  |  Size: 596 B

1
public/emoji/0023.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><circle cx="32" cy="32" r="30" fill="#4fd1d9"/><path d="m49.4 28l1.6-6h-6.1l1.6-6h-6.1l-1.6 6h-8.1l1.6-6h-6.1l-1.6 6h-6.1l-1.6 6h6.1l-2.2 8h-6.1l-1.7 6h6.1l-1.6 6h6.1l1.6-6h8.1l-1.6 6h6.1l1.6-6h6.1l1.6-6h-6.1l2.2-8h6.2m-14.4 8h-8.1l2.2-8h8.1l-2.2 8" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 363 B

View File

@ -0,0 +1,2 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#d0d0d0"/><path d="M57,45.7c0,4.6-3.7,8.3-8.3,8.3H15.3C10.7,54,7,50.3,7,45.7V12.3C7,7.7,10.7,4,15.3,4h33.3
c4.6,0,8.3,3.7,8.3,8.3V45.7z" fill="#fff"/><path d="m45.5 33.3c.4.2.5.5.5.9 0 .5-.3 1.2-1 2.3-.6 1.1-1.1 1.7-1.5 2-.4.2-.7.2-1.1 0l-8.6-6.2 1.2 10.5c.1.4-.1.7-.5.9-.4.2-1.3.3-2.5.3-1.2 0-2.1-.1-2.5-.3-.4-.2-.6-.5-.5-.9l1.1-10.5-8.5 6.2c-.3.2-.7.2-1.1 0-.4-.2-.9-.9-1.5-2-.6-1-.9-1.8-.9-2.3 0-.5.2-.8.5-.9l9.7-4.3-9.7-4.3c-.4-.2-.6-.5-.5-1 0-.5.3-1.2.9-2.3.6-1 1.1-1.7 1.5-1.9.4-.2.8-.2 1.1 0l8.5 6.2-1.1-10.4c-.1-.4.1-.7.5-1s1.3-.3 2.5-.3c1.2 0 2.1.1 2.5.3s.6.5.5 1l-1.1 10.5 8.6-6.2c.3-.2.7-.2 1.1 0 .4.2.9.9 1.5 2 .6 1 .9 1.8 1 2.2 0 .5-.1.8-.5 1l-9.8 4.2 9.7 4.3" fill="#9aa0a5"/></svg>

After

Width:  |  Height:  |  Size: 902 B

1
public/emoji/002a.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><circle cx="32" cy="32" r="30" fill="#4fd1d9"/><path d="m45.5 36.3c.4.2.5.5.5.9 0 .5-.3 1.2-1 2.3-.6 1.1-1.1 1.7-1.5 2-.4.2-.7.2-1.1 0l-8.6-6.2 1.2 10.5c.1.4-.1.7-.5.9-.4.2-1.3.3-2.5.3-1.2 0-2.1-.1-2.5-.3-.4-.2-.6-.5-.5-.9l1.1-10.5-8.5 6.2c-.3.2-.7.2-1.1 0-.4-.2-.9-.9-1.5-2-.6-1-.9-1.8-.9-2.3 0-.5.2-.8.5-.9l9.7-4.3-9.7-4.3c-.4-.2-.6-.5-.5-1 0-.5.3-1.2.9-2.3.6-1 1.1-1.7 1.5-1.9s.8-.2 1.1 0l8.5 6.2-1.1-10.4c-.1-.4.1-.7.5-1s1.3-.3 2.5-.3c1.2 0 2.1.1 2.5.3.4.2.6.5.5 1l-1.1 10.5 8.6-6.2c.3-.2.7-.2 1.1 0s.9.9 1.5 2c.6 1 .9 1.8 1 2.2 0 .5-.1.8-.5 1l-9.8 4.2 9.7 4.3" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 679 B

View File

@ -0,0 +1,2 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#d0d0d0"/><path d="M57,45.7c0,4.6-3.7,8.3-8.3,8.3H15.3C10.7,54,7,50.3,7,45.7V12.3C7,7.7,10.7,4,15.3,4h33.3
c4.6,0,8.3,3.7,8.3,8.3V45.7z" fill="#fff"/><path d="m32 13c3 0 5.3 1.1 7 3.2 2 2.6 3 6.8 3 12.8 0 5.9-1 10.2-3 12.8-1.7 2.1-4 3.2-7 3.2-3 0-5.4-1.2-7.2-3.5-1.9-2.4-2.8-6.5-2.8-12.6 0-5.9 1-10.1 3-12.7 1.7-2.1 4-3.2 7-3.2m0 5c-.7 0-1.4.2-1.9.7s-1 1.3-1.3 2.5c-.4 1.6-.6 4.2-.6 7.8 0 3.7.2 6.2.5 7.6.4 1.4.8 2.3 1.4 2.7.6.5 1.2.7 1.9.7.7 0 1.4-.2 1.9-.7.6-.5 1-1.3 1.3-2.5.4-1.5.6-4.1.6-7.8 0-3.7-.2-6.2-.5-7.6-.4-1.4-.8-2.3-1.4-2.8-.6-.4-1.2-.6-1.9-.6" fill="#9aa0a5"/></svg>

After

Width:  |  Height:  |  Size: 788 B

1
public/emoji/0030.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><circle cx="32" cy="32" r="30" fill="#4fd1d9"/><path d="m32 16c3 0 5.3 1.1 7 3.2 2 2.6 3 6.8 3 12.8 0 5.9-1 10.2-3 12.8-1.7 2.1-4 3.2-7 3.2-3 0-5.4-1.2-7.2-3.5-1.9-2.4-2.8-6.5-2.8-12.6 0-5.9 1-10.1 3-12.7 1.7-2.1 4-3.2 7-3.2m0 5c-.7 0-1.4.2-1.9.7s-1 1.3-1.3 2.5c-.4 1.6-.6 4.2-.6 7.8 0 3.7.2 6.2.5 7.6.4 1.4.8 2.3 1.4 2.7.6.5 1.2.7 1.9.7.7 0 1.4-.2 1.9-.7.6-.5 1-1.3 1.3-2.5.4-1.5.6-4.1.6-7.8 0-3.7-.2-6.2-.5-7.6-.4-1.4-.8-2.3-1.4-2.8-.6-.4-1.2-.6-1.9-.6" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 569 B

View File

@ -0,0 +1,2 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#d0d0d0"/><path d="M57,45.7c0,4.6-3.7,8.3-8.3,8.3H15.3C10.7,54,7,50.3,7,45.7V12.3C7,7.7,10.7,4,15.3,4h33.3
c4.6,0,8.3,3.7,8.3,8.3V45.7z" fill="#fff"/><path d="m38 45h-6.1v-23c-2.2 2.1-4.9 3.6-7.9 4.6v-5.5c1.6-.5 3.3-1.5 5.2-3 1.9-1.5 3.2-3.2 3.8-5.1h5v32" fill="#9aa0a5"/></svg>

After

Width:  |  Height:  |  Size: 485 B

1
public/emoji/0031.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><circle cx="32" cy="32" r="30" fill="#4fd1d9"/><path d="m38 48h-6.1v-23c-2.2 2.1-4.9 3.6-7.9 4.6v-5.5c1.6-.5 3.3-1.5 5.2-3 1.9-1.5 3.2-3.2 3.8-5.1h5v32" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 266 B

View File

@ -0,0 +1,2 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#d0d0d0"/><path d="M57,45.7c0,4.6-3.7,8.3-8.3,8.3H15.3C10.7,54,7,50.3,7,45.7V12.3C7,7.7,10.7,4,15.3,4h33.3
c4.6,0,8.3,3.7,8.3,8.3V45.7z" fill="#fff"/><path d="m42 39.3v5.7h-20c.2-2.1.9-4.2 1.9-6.1 1.1-1.9 3.2-4.5 6.4-7.6 2.6-2.6 4.1-4.3 4.7-5.2.8-1.3 1.2-2.5 1.2-3.7 0-1.4-.3-2.4-1-3.1s-1.6-1.1-2.8-1.1c-1.2 0-2.1.4-2.8 1.2-.7.8-1.1 2-1.2 3.8l-5.7-.6c.3-3.4 1.4-5.8 3.2-7.2 1.8-1.5 4-2.2 6.7-2.2 2.9 0 5.2.8 6.9 2.5s2.5 3.8 2.5 6.3c0 1.4-.2 2.8-.7 4.1-.5 1.2-1.3 2.5-2.3 3.9-.7.9-1.9 2.3-3.7 4.1-1.8 1.8-2.9 2.9-3.4 3.5-.5.6-.9 1.1-1.2 1.7h11.3" fill="#9aa0a5"/></svg>

After

Width:  |  Height:  |  Size: 775 B

1
public/emoji/0032.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><circle cx="32" cy="32" r="30" fill="#4fd1d9"/><path d="m42 42.3v5.7h-20c.2-2.1.9-4.2 1.9-6.1 1.1-1.9 3.2-4.5 6.4-7.6 2.6-2.6 4.1-4.3 4.7-5.2.8-1.3 1.2-2.5 1.2-3.7 0-1.4-.3-2.4-1-3.1s-1.6-1.1-2.8-1.1c-1.2 0-2.1.4-2.8 1.2-.7.8-1.1 2-1.2 3.8l-5.7-.6c.3-3.4 1.4-5.8 3.2-7.2 1.8-1.5 4-2.2 6.7-2.2 2.9 0 5.2.8 6.9 2.5s2.5 3.8 2.5 6.3c0 1.4-.2 2.8-.7 4.1-.5 1.2-1.3 2.5-2.3 3.9-.7.9-1.9 2.3-3.7 4.1-1.8 1.8-2.9 2.9-3.4 3.5-.5.6-.9 1.1-1.2 1.7h11.3" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 556 B

View File

@ -0,0 +1,2 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#d0d0d0"/><path d="M57,45.7c0,4.6-3.7,8.3-8.3,8.3H15.3C10.7,54,7,50.3,7,45.7V12.3C7,7.7,10.7,4,15.3,4h33.3
c4.6,0,8.3,3.7,8.3,8.3V45.7z" fill="#fff"/><path d="m22 36.1l5.6-.7c.2 1.5.7 2.6 1.4 3.4s1.7 1.2 2.8 1.2c1.2 0 2.2-.5 3-1.4.8-.9 1.2-2.2 1.2-3.8 0-1.5-.4-2.7-1.2-3.6-.8-.9-1.7-1.3-2.9-1.3-.7 0-1.6.1-2.6.4l.6-4.9c1.6 0 2.8-.3 3.6-1.1s1.2-1.7 1.2-3c0-1.1-.3-1.9-.9-2.5-.6-.6-1.4-.9-2.4-.9-1 0-1.8.4-2.5 1.1s-1.1 1.8-1.3 3.1l-5.3-.9c.4-1.9.9-3.4 1.7-4.5.7-1.1 1.8-2 3.1-2.7 1.3-.6 2.8-1 4.5-1 2.8 0 5.1.9 6.8 2.8 1.4 1.5 2.1 3.3 2.1 5.2 0 2.8-1.4 4.9-4.3 6.6 1.7.4 3.1 1.2 4.1 2.6 1 1.3 1.5 3 1.5 4.9 0 2.8-1 5.1-2.9 7-1.7 1.9-4.1 2.9-7 2.9-2.7 0-5-.8-6.8-2.4-1.8-1.7-2.8-3.8-3.1-6.5" fill="#9aa0a5"/></svg>

After

Width:  |  Height:  |  Size: 918 B

1
public/emoji/0033.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><circle cx="32" cy="32" r="30" fill="#4fd1d9"/><path d="m22 39.2l5.6-.7c.2 1.5.7 2.6 1.4 3.4s1.7 1.2 2.8 1.2c1.2 0 2.2-.5 3-1.4.8-.9 1.2-2.2 1.2-3.8 0-1.5-.4-2.7-1.2-3.6-.8-.9-1.7-1.3-2.9-1.3-.7 0-1.6.1-2.6.4l.6-4.9c1.6 0 2.8-.3 3.6-1.1s1.2-1.7 1.2-3c0-1.1-.3-1.9-.9-2.5-.6-.6-1.4-.9-2.4-.9-1 0-1.8.4-2.5 1.1s-1.1 1.8-1.3 3.1l-5.3-.9c.4-1.9.9-3.4 1.7-4.5.7-1.1 1.8-2 3.1-2.7 1.3-.6 2.8-1 4.5-1 2.8 0 5.1.9 6.8 2.8 1.4 1.5 2.1 3.3 2.1 5.2 0 2.8-1.4 4.9-4.3 6.6 1.7.4 3.1 1.2 4.1 2.6 1 1.3 1.5 3 1.5 4.9 0 2.8-1 5.1-2.9 7-1.7 1.8-4.1 2.8-7 2.8-2.7 0-5-.8-6.8-2.4-1.8-1.7-2.8-3.8-3.1-6.4" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 699 B

View File

@ -0,0 +1,2 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#d0d0d0"/><path d="M57,45.7c0,4.6-3.7,8.3-8.3,8.3H15.3C10.7,54,7,50.3,7,45.7V12.3C7,7.7,10.7,4,15.3,4h33.3
c4.6,0,8.3,3.7,8.3,8.3V45.7z" fill="#fff"/><path d="M33.7,45v-6.4H20v-5.3L34.5,13h5.4v20.2H44v5.4h-4.1V45H33.7z M33.7,33.2V22.3L26,33.2H33.7z" fill="#9aa0a5"/></svg>

After

Width:  |  Height:  |  Size: 479 B

1
public/emoji/0034.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><circle cx="32" cy="32" r="30" fill="#4fd1d9"/><path d="M33.7,48v-6.4H20v-5.3L34.5,16h5.4v20.2H44v5.4h-4.1V48H33.7z M33.7,36.2V25.3L26,36.2H33.7z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 260 B

View File

@ -0,0 +1,2 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#d0d0d0"/><path d="M57,45.7c0,4.6-3.7,8.3-8.3,8.3H15.3C10.7,54,7,50.3,7,45.7V12.3C7,7.7,10.7,4,15.3,4h33.3
c4.6,0,8.3,3.7,8.3,8.3V45.7z" fill="#fff"/><path d="m22 36.3l5.7-.6c.2 1.4.6 2.5 1.4 3.3.8.8 1.7 1.2 2.8 1.2 1.2 0 2.2-.5 3-1.6.8-1 1.2-2.6 1.2-4.7 0-2-.4-3.4-1.2-4.4-.8-1-1.9-1.5-3.2-1.5-1.6 0-3.1.8-4.4 2.3l-4.6-.7 2.9-16.6h15.1v5.7h-10.8l-.9 5.4c1.3-.7 2.6-1 3.9-1 2.5 0 4.7 1 6.4 3 1.8 2 2.6 4.5 2.6 7.7 0 2.6-.7 5-2.1 7-1.9 2.8-4.6 4.2-8.1 4.2-2.7 0-5-.8-6.7-2.4-1.6-1.6-2.7-3.7-3-6.3" fill="#9aa0a5"/></svg>

After

Width:  |  Height:  |  Size: 726 B

1
public/emoji/0035.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><circle cx="32" cy="32" r="30" fill="#4fd1d9"/><path d="m22 39.3l5.7-.6c.2 1.4.6 2.5 1.4 3.3.8.8 1.7 1.2 2.8 1.2 1.2 0 2.2-.5 3-1.6.8-1 1.2-2.6 1.2-4.7 0-2-.4-3.4-1.2-4.4-.8-1-1.9-1.5-3.2-1.5-1.6 0-3.1.8-4.4 2.3l-4.6-.7 2.9-16.6h15.1v5.7h-10.8l-.9 5.4c1.3-.7 2.6-1 3.9-1 2.5 0 4.7 1 6.4 3 1.8 2 2.6 4.5 2.6 7.7 0 2.6-.7 5-2.1 7-1.9 2.8-4.6 4.2-8.1 4.2-2.7 0-5-.8-6.7-2.4-1.6-1.6-2.7-3.7-3-6.3" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 507 B

View File

@ -0,0 +1,2 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#d0d0d0"/><path d="M57,45.7c0,4.6-3.7,8.3-8.3,8.3H15.3C10.7,54,7,50.3,7,45.7V12.3C7,7.7,10.7,4,15.3,4h33.3
c4.6,0,8.3,3.7,8.3,8.3V45.7z" fill="#fff"/><path d="m41.4 20.8l-5.6.6c-.1-1.2-.5-2.1-1.1-2.6-.6-.6-1.3-.9-2.2-.9-1.2 0-2.2.6-3.1 1.7-.8 1.1-1.4 3.5-1.6 7.1 1.4-1.8 3.2-2.7 5.3-2.7 2.4 0 4.5 1 6.2 2.9 1.7 1.9 2.6 4.4 2.6 7.4 0 3.2-.9 5.8-2.7 7.7s-4 3-6.8 3c-3 0-5.5-1.2-7.5-3.7-1.9-2.4-2.9-6.5-2.9-12.1 0-5.7 1-9.9 3-12.4 2-2.5 4.7-3.8 7.9-3.8 2.3 0 4.2.7 5.6 2 1.6 1.3 2.5 3.3 2.9 5.8m-13 13.1c0 2 .4 3.5 1.3 4.5.9 1.1 1.8 1.6 2.9 1.6 1.1 0 1.9-.4 2.7-1.3.7-.9 1.1-2.3 1.1-4.3 0-2-.4-3.5-1.1-4.5-.8-.9-1.7-1.4-2.9-1.4-1.1 0-2 .5-2.8 1.4s-1.2 2.2-1.2 4" fill="#9aa0a5"/></svg>

After

Width:  |  Height:  |  Size: 889 B

1
public/emoji/0036.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><circle cx="32" cy="32" r="30" fill="#4fd1d9"/><path d="m41.4 23.8l-5.6.6c-.1-1.2-.5-2.1-1.1-2.6-.6-.6-1.3-.9-2.2-.9-1.2 0-2.2.6-3.1 1.7-.8 1.1-1.4 3.5-1.6 7.1 1.4-1.8 3.2-2.7 5.3-2.7 2.4 0 4.5 1 6.2 2.9 1.7 1.9 2.6 4.4 2.6 7.4 0 3.2-.9 5.8-2.7 7.7s-4 3-6.8 3c-3 0-5.5-1.2-7.5-3.7-1.9-2.4-2.9-6.5-2.9-12.1 0-5.7 1-9.9 3-12.4 2-2.5 4.7-3.8 7.9-3.8 2.3 0 4.2.7 5.6 2 1.6 1.3 2.5 3.3 2.9 5.8m-13 13.1c0 2 .4 3.5 1.3 4.5.9 1.1 1.8 1.6 2.9 1.6 1.1 0 1.9-.4 2.7-1.3.7-.9 1.1-2.3 1.1-4.3 0-2-.4-3.5-1.1-4.5-.8-.9-1.7-1.4-2.9-1.4-1.1 0-2 .5-2.8 1.4-.8.9-1.2 2.2-1.2 4" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 674 B

View File

@ -0,0 +1,2 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#d0d0d0"/><path d="M57,45.7c0,4.6-3.7,8.3-8.3,8.3H15.3C10.7,54,7,50.3,7,45.7V12.3C7,7.7,10.7,4,15.3,4h33.3
c4.6,0,8.3,3.7,8.3,8.3V45.7z" fill="#fff"/><path d="m23 18.8v-5.8h20v4.5c-1.7 1.7-3.3 4.2-5 7.4-1.7 3.2-3 6.7-3.9 10.3s-1.3 6.9-1.3 9.7h-5.6c.1-4.5 1-9.1 2.6-13.7s3.8-8.8 6.6-12.5l-13.4.1" fill="#9aa0a5"/></svg>

After

Width:  |  Height:  |  Size: 525 B

1
public/emoji/0037.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><circle cx="32" cy="32" r="30" fill="#4fd1d9"/><path d="m23 21.8v-5.8h20v4.5c-1.7 1.7-3.3 4.2-5 7.4-1.7 3.2-3 6.7-3.9 10.3-.9 3.6-1.3 6.9-1.3 9.7h-5.6c.1-4.5 1-9.1 2.6-13.7 1.6-4.7 3.8-8.8 6.6-12.5l-13.4.1" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 320 B

View File

@ -0,0 +1,2 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#d0d0d0"/><path d="M57,45.7c0,4.6-3.7,8.3-8.3,8.3H15.3C10.7,54,7,50.3,7,45.7V12.3C7,7.7,10.7,4,15.3,4h33.3
c4.6,0,8.3,3.7,8.3,8.3V45.7z" fill="#fff"/><path d="m27.1 27.5c-1.5-.7-2.6-1.6-3.3-2.7-.7-1.1-1-2.4-1-3.8 0-2.3.8-4.3 2.4-5.8 1.6-1.5 3.8-2.3 6.8-2.3 2.9 0 5.1.8 6.7 2.3s2.4 3.5 2.4 5.8c0 1.5-.4 2.7-1.1 3.9-.7 1.1-1.8 2-3.1 2.6 1.7.7 3 1.7 3.8 3.1.9 1.3 1.3 2.9 1.3 4.6 0 2.9-.9 5.2-2.7 7.1-1.8 1.8-4.2 2.7-7.1 2.7-2.8 0-5.1-.7-6.9-2.2-2.2-1.8-3.3-4.2-3.3-7.3 0-1.7.4-3.2 1.2-4.7.8-1.4 2.1-2.5 3.9-3.3m.6 7.4c0 1.7.4 2.9 1.2 3.9.8.9 1.9 1.4 3.1 1.4 1.2 0 2.2-.4 3-1.3.8-.9 1.2-2.2 1.2-3.9 0-1.5-.4-2.6-1.2-3.5-.8-.9-1.8-1.3-3-1.3-1.4 0-2.5.5-3.2 1.5-.7.9-1.1 2-1.1 3.2m.6-13.4c0 1.2.3 2.1 1 2.8.7.7 1.5 1 2.6 1 1.1 0 2-.3 2.7-1 .7-.7 1-1.6 1-2.8 0-1.1-.3-2-1-2.7-.7-.7-1.5-1-2.6-1-1.1 0-2 .3-2.7 1-.7.7-1 1.6-1 2.7" fill="#9aa0a5"/></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

1
public/emoji/0038.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><circle cx="32" cy="32" r="30" fill="#4fd1d9"/><path d="m27.1 30.5c-1.5-.7-2.6-1.6-3.3-2.7-.7-1.1-1-2.4-1-3.8 0-2.3.8-4.3 2.4-5.8 1.6-1.5 3.8-2.3 6.8-2.3 2.9 0 5.1.8 6.7 2.3s2.4 3.5 2.4 5.8c0 1.5-.4 2.7-1.1 3.9-.7 1.1-1.8 2-3.1 2.6 1.7.7 3 1.7 3.8 3.1.9 1.3 1.3 2.9 1.3 4.6 0 2.9-.9 5.2-2.7 7.1-1.8 1.8-4.2 2.7-7.1 2.7-2.8 0-5.1-.7-6.9-2.2-2.2-1.8-3.3-4.2-3.3-7.3 0-1.7.4-3.2 1.2-4.7.8-1.4 2.1-2.5 3.9-3.3m.6 7.4c0 1.7.4 2.9 1.2 3.9.8.9 1.9 1.4 3.1 1.4 1.2 0 2.2-.4 3-1.3.8-.9 1.2-2.2 1.2-3.9 0-1.5-.4-2.6-1.2-3.5-.8-.9-1.8-1.3-3-1.3-1.4 0-2.5.5-3.2 1.5-.7.9-1.1 2-1.1 3.2m.6-13.4c0 1.2.3 2.1 1 2.8.7.7 1.5 1 2.6 1 1.1 0 2-.3 2.7-1 .7-.7 1-1.6 1-2.8 0-1.1-.3-2-1-2.7-.7-.7-1.5-1-2.6-1-1.1 0-2 .3-2.7 1-.7.7-1 1.6-1 2.7" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 833 B

View File

@ -0,0 +1,2 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#d0d0d0"/><path d="M57,45.7c0,4.6-3.7,8.3-8.3,8.3H15.3C10.7,54,7,50.3,7,45.7V12.3C7,7.7,10.7,4,15.3,4h33.3
c4.6,0,8.3,3.7,8.3,8.3V45.7z" fill="#fff"/><path d="m22.6 37.2l5.6-.6c.1 1.2.5 2.1 1.1 2.6s1.3.9 2.3.9c1.2 0 2.2-.6 3-1.7.8-1.1 1.4-3.5 1.6-7.1-1.4 1.8-3.2 2.6-5.4 2.6-2.4 0-4.4-1-6.1-2.9-1.7-1.9-2.6-4.4-2.6-7.4 0-3.2.9-5.7 2.7-7.7 1.8-1.9 4.1-2.9 6.9-2.9 3 0 5.5 1.2 7.5 3.7 1.8 2.4 2.8 6.5 2.8 12.1 0 5.7-1 9.9-3 12.4-2 2.5-4.7 3.8-7.9 3.8-2.3 0-4.2-.7-5.7-2-1.5-1.3-2.4-3.2-2.8-5.8m13-13.1c0-1.9-.4-3.4-1.3-4.5-.9-1.1-1.8-1.6-3-1.6-1.1 0-1.9.4-2.6 1.3-.7.9-1.1 2.3-1.1 4.3 0 2 .4 3.5 1.1 4.5.8.9 1.7 1.4 2.9 1.4 1.1 0 2-.5 2.8-1.4s1.2-2.2 1.2-4" fill="#9aa0a5"/></svg>

After

Width:  |  Height:  |  Size: 885 B

1
public/emoji/0039.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><circle cx="32" cy="32" r="30" fill="#4fd1d9"/><path d="m22.6 40.2l5.6-.6c.1 1.2.5 2.1 1.1 2.6s1.3.9 2.3.9c1.2 0 2.2-.6 3-1.7.8-1.1 1.4-3.5 1.6-7.1-1.4 1.8-3.2 2.6-5.4 2.6-2.4 0-4.4-1-6.1-2.8-1.7-1.9-2.6-4.4-2.6-7.4 0-3.2.9-5.7 2.7-7.7 1.8-1.9 4.1-2.9 6.9-2.9 3 0 5.5 1.2 7.5 3.7 1.8 2.3 2.8 6.4 2.8 12 0 5.7-1 9.9-3 12.4-2 2.5-4.7 3.8-7.9 3.8-2.3 0-4.2-.7-5.7-2s-2.4-3.2-2.8-5.8m13-13.1c0-1.9-.4-3.4-1.3-4.5-.9-1.1-1.8-1.6-3-1.6-1.1 0-1.9.4-2.6 1.3-.7.9-1.1 2.3-1.1 4.3 0 2 .4 3.5 1.1 4.5.8.9 1.7 1.4 2.9 1.4 1.1 0 2-.5 2.8-1.4.8-.9 1.2-2.2 1.2-4" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 662 B

1
public/emoji/00a9.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><g fill="#4d5357"><path d="m32 2c-13.8 0-25 11.2-25 25s11.2 25 25 25 25-11.2 25-25-11.2-25-25-25m0 45c-11 0-20-9-20-20 0-11 9-20 20-20 11 0 20 9 20 20 0 11-9 20-20 20"/><path d="m25.4 19.3c.9-1 2-1.8 3.3-2.3 1.3-.6 2.6-.9 4-.9 1.7 0 3.4.4 4.8 1.3 1.4.8 2.7 2 3.6 3.3l3.6-2.7c-1.4-1.8-3.1-3.4-5.1-4.4-2.1-1.1-4.3-1.6-6.8-1.6-2 0-4 .4-5.8 1.2-1.8.8-3.4 1.9-4.7 3.2-1.3 1.4-2.4 2.9-3.2 4.8-.8 1.8-1.2 3.8-1.2 5.8 0 2.1.4 4 1.2 5.8.8 1.8 1.8 3.4 3.2 4.8 1.3 1.4 2.9 2.4 4.7 3.2 1.8.8 3.7 1.2 5.8 1.2 2.5 0 4.8-.5 6.8-1.6 2-1.1 3.8-2.6 5.1-4.4l-3.6-2.7c-.9 1.4-2.1 2.5-3.6 3.3-1.5.8-3.1 1.2-4.8 1.2-1.4 0-2.7-.3-4-.9-1.2-.6-2.3-1.4-3.3-2.3-.9-1-1.7-2.1-2.2-3.4s-.8-2.7-.8-4.2c0-1.5.3-2.9.8-4.2s1.3-2.5 2.2-3.5"/></g></svg>

After

Width:  |  Height:  |  Size: 811 B

1
public/emoji/00ae.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><g fill="#4d5357"><path d="m32 2c-13.8 0-25 11.2-25 25s11.2 25 25 25 25-11.2 25-25-11.2-25-25-25m0 45c-11 0-20-9-20-20 0-11 9-20 20-20 11 0 20 9 20 20 0 11-9 20-20 20"/><path d="m32.3 14h-9.3v26h4.2v-7.7h7l4.4 7.7h4.4l-5-9c7.7-3.4 7.7-17-5.7-17m.5 15h-5.6v-11.7h5.6c8.8 0 8.8 11.7 0 11.7"/></g></svg>

After

Width:  |  Height:  |  Size: 394 B

1
public/emoji/1f004.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="m64 30.8v-8.4h-5.7v3l-17.9-14.4c-.9-.8-2.5-.8-3.4 0l-31.3 25v-2.8h-5.7v8.3c0 0 0 0 0 0v.2c.1.4.3.8.7 1.2l22.9 18.4c.9.8 2.5.8 3.4 0l36.2-29.1c.5-.4.8-.9.8-1.4" fill="#b69467"/><path d="m27.1 53c-.9.8-2.5.8-3.4 0l-23-18.4c-.9-.8-.9-2 0-2.8l36.2-29.1c.9-.8 2.5-.8 3.4 0l22.9 18.4c.9.8.9 2 0 2.8l-36.1 29.1" fill="#efdec2"/><path d="m46.5 13.5c.8 2.1.3 4.2.3 6.3-1.8 2.1-3.7 0-5.5 2.5 3.8 2 9.1 6.4 6.6 10.5-4.1-.6-8.3-1.6-12.3.6 0-1.2-2-2.4-3.5-3.7-6.4 2.1-9.5 10.3-16.3 11.3.3-4.6 11.3-9 13.4-13.6-1.6-2-3-1.1-4.6-2.8 4.2-3.6-3.1-7.6 3.4-11.1 2.1 1.6.1 3 1.3 4.5 2.5 1.5 4.9 1.9 7.4 3.3 3.8-2.6 3.2-5.3 5.3-7.9 1.5-.3 3.1.6 4.5.1m-8.5 10.5c-1.6 1.3-3.2 2.6-4.9 3.9 3.6 2.2 7.1 1.5 10.6-.2-.2-2.1-3.8-3-5.7-3.7m-7.9-3.8c-.9 1.9-2.3 3.8.8 5.9 1.5-1.5 4.8-2.9 3.2-4.4-1.4.2-2.7-.9-4-1.5" fill="#b70000"/></svg>

After

Width:  |  Height:  |  Size: 909 B

1
public/emoji/1f0cf.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M13,62.5c-3,0-5.5-2.5-5.5-5.5V7c0-3,2.5-5.5,5.5-5.5h38c3,0,5.5,2.5,5.5,5.5v50c0,3-2.5,5.5-5.5,5.5H13z" fill="#efeded"/><path d="m51 3c2.2 0 4 1.8 4 4v50c0 2.2-1.8 4-4 4h-38c-2.2 0-4-1.8-4-4v-50c0-2.2 1.8-4 4-4h38m0-3h-38c-3.9 0-7 3.1-7 7v50c0 3.9 3.1 7 7 7h38c3.9 0 7-3.1 7-7v-50c0-3.9-3.1-7-7-7z" fill="#262626"/><path d="m43.6 55.2l-7.3-12.8c-1.2 1.3-2.7 4.2-4.4 4.2-1.7 0-3.2-2.9-4.3-4.2l-7.3 12.8 8.7-7.3-.9 7.3 3.9-7.7 3.9 7.7-.8-7.3 8.5 7.3" fill="#333"/><path d="m39.3 26.9h-14.6c0 0-3 5.8 2.6 15.3 1.8 3 3.3 4.5 4.8 4.5 1.4 0 3-1.5 4.8-4.5 5.5-9.6 2.4-15.3 2.4-15.3" fill="#fed0ac"/><g fill="#333"><path d="m35.6 39.6c0 0-.1.1-.3.2-.1.1-.2.2-.4.2-.1.1-.3.2-.5.3-.3.2-.7.4-1.2.5-.2.1-.4.1-.6.1-.1 0-.1 0-.2 0-.1 0-.1 0-.2 0h-.1-.2c-.5 0-.9-.1-1.3-.2-.4-.1-.8-.3-1.1-.5-.3-.2-.6-.4-.8-.5s-.3-.2-.3-.2 0 0 0 .1c0 .1 0 .2 0 .3.1.2.2.6.4 1 .1.2.3.4.5.6.2.2.4.4.7.5.3.1.6.3.9.3.3.1.7.1 1 .1h.1.1.1.1c.2 0 .3 0 .5-.1.3-.1.6-.2.9-.4.3-.2.5-.3.7-.5.2-.2.4-.4.5-.6.1-.2.2-.4.3-.5.1-.2.1-.3.1-.4.3-.1.3-.3.3-.3"/><path d="m30.3 33.4c0-.1-.1-.1-.1-.2 0 0 0-.1-.1-.1-.1-.1-.1-.1-.1-.1s-.1-.1-.1-.1c0 0-.1-.1-.1-.1-.1 0-.1-.1-.2-.1-.1 0-.1-.1-.2-.1-.1-.1-.3-.1-.5-.2 0 0-.1 0-.1 0 0 0-.1 0-.1 0-.1 0-.2 0-.3 0-.2 0-.3 0-.5.1-.2 0-.3.1-.4.2-.1.1-.3.1-.4.2-.1.1-.2.2-.3.2-.2.2-.2.3-.3.4 0 .1 0 .1-.1.1s.1 0 .2-.1c.1-.1.3-.1.5-.2.1 0 .2-.1.3-.1-.1.1-.1.3-.1.4 0 .5.5 1 1.1 1 .6 0 1.1-.4 1.1-1 0-.2 0-.3-.1-.4.1 0 .1 0 .1.1.1 0 .1 0 .1.1.1 0 .2.1.3.1.1 0 .2.1.2.1.1 0 .1 0 .1.1s0 0 0 0c.1-.2.1-.2.1-.3"/><path d="m37.6 33.5c0 0 0-.1-.1-.1 0-.1-.1-.1-.1-.2 0 0-.1-.1-.1-.1 0 0-.1-.1-.1-.1s-.1-.1-.1-.1c0 0-.1-.1-.1-.1-.1 0-.1-.1-.2-.1-.1 0-.1-.1-.2-.1-.1-.1-.3-.1-.5-.2 0 0-.1 0-.1 0 0 0-.1 0-.1 0-.1 0-.2 0-.3 0-.2 0-.3 0-.5.1-.2 0-.3.1-.4.2-.1.1-.3.1-.4.2-.1.1-.2.2-.3.2-.2.2-.2.3-.3.4 0 .1 0 .1-.1.1s.1 0 .2-.1.3-.1.5-.2c.1 0 .2-.1.3-.1-.1.1-.1.3-.1.4 0 .5.5 1 1.1 1 .6 0 1.1-.4 1.1-1 0-.2 0-.3-.1-.4.1 0 .1 0 .2.1 0 0 .1 0 .1.1.1 0 .2.1.3.1.1 0 .2.1.2.1.1-.1.1-.1.2-.1"/><path d="m46.4 14.9c-7.5-4-12.6 5.1-14.4 9.2-1.8-4.1-6.9-13.2-14.4-9.2-2.4 1.3-4.7 3.8-4.7 3.8s10.5-1.3 11.2 10c2.2-1.4 4.8-4.1 7.7-4.1 3 0 5.9 2.6 8.1 4.1.7-11.5 11.2-10 11.2-10s-2.2-2.5-4.7-3.8"/></g><path d="m39.3 26.5c-.5-1.8-2.5-9.3-7.3-15.8v-.1h-.1v.1c-5.4 7.5-7.4 16.2-7.4 16.2-.4 1-.7 2.2-.7 3.6 0 0 1.2-3.6 4.4-3.6 3.2 0 3.8 3.6 3.8 3.6s.5-3.6 3.8-3.6 4.4 3.6 4.4 3.6c-.1-1.6-.5-2.9-.9-4" fill="#94989b"/><ellipse cx="32" cy="10.6" rx="1.9" ry="1.7" fill="#333"/><g fill="#94989b"><ellipse cx="12.9" cy="18.7" rx="1.9" ry="1.7"/><ellipse cx="51.1" cy="18.7" rx="1.9" ry="1.7"/></g></svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

1
public/emoji/1f170.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#ff5a79"/><path d="M41.7,46H47L35,14h-6L17,46h5.3l4.2-11.2h11.1L41.7,46z M28.3,30l3.7-9.9l3.7,9.9H28.3z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 328 B

1
public/emoji/1f171.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#ff5a79"/><path d="m43 25.3c0-5.1-4.2-9.2-9.4-9.2l-12.6-.1v32h12.6c5.2 0 9.4-4.1 9.4-9.2 0-2.6-1.1-5-3-6.7 1.9-1.8 3-4.2 3-6.8m-9.4 17.6h-7.7v-8.4h7.7c2.4 0 4.3 1.9 4.3 4.2s-1.9 4.2-4.3 4.2m0-13.4h-7.7v-8.4h7.7c2.4 0 4.3 1.9 4.3 4.2 0 2.3-1.9 4.2-4.3 4.2" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 479 B

1
public/emoji/1f17e.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#ff5a79"/><path d="m32 48c-8.8 0-16-7.2-16-16 0-8.8 7.2-16 16-16s16 7.2 16 16c0 8.8-7.2 16-16 16m0-26.9c-6 0-10.9 4.9-10.9 10.9 0 6 4.9 10.9 10.9 10.9s10.9-4.9 10.9-10.9c0-6-4.9-10.9-10.9-10.9" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 417 B

1
public/emoji/1f17f.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#4fd1d9"/><path d="m34 12h-13v40h7.4v-14.5h5.6c7.2 0 13-5.7 13-12.7 0-7.1-5.8-12.8-13-12.8m0 18.2h-5.6v-10.9h5.6c3.1 0 5.6 2.4 5.6 5.5 0 2.9-2.5 5.4-5.6 5.4" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 381 B

1
public/emoji/1f18e.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#ff5a79"/><g fill="#fff"><path d="m28.1 45h3.9l-8.8-26h-4.4l-8.8 26h3.9l3.1-9.1h8.1l3 9.1m-9.8-13l2.7-8.1 2.7 8.1h-5.4"/><path d="m52 26.5c0-4.1-2.2-7.5-6-7.5h-10v26h9.2c3.8 0 6.8-3.4 6.8-7.5 0-2.2-.8-4.1-2.2-5.5 1.4-1.4 2.2-3.3 2.2-5.5m-6.8 14.4h-5.6v-6.8h5.6c1.7 0 3.1 1.5 3.1 3.4 0 1.8-1.4 3.4-3.1 3.4m0-10.9h-5.6v-6.8h5.6c1.7 0 3.1 1.5 3.1 3.4s-1.4 3.4-3.1 3.4"/></g></svg>

After

Width:  |  Height:  |  Size: 581 B

1
public/emoji/1f191.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#ff5a79"/><g fill="#fff"><path d="m23 43.1c-2.4 0-4.3-2-4.3-4.6v-13c0-2.5 1.9-4.6 4.3-4.6s4.3 2 4.3 4.6h3.7c0-1.1-.2-2.3-.6-3.3-.4-1-1-1.9-1.7-2.7-.7-.8-1.6-1.4-2.5-1.8-1-.4-2-.7-3.1-.7s-2.1.2-3.1.7c-1 .4-1.8 1-2.5 1.8-.7.8-1.3 1.7-1.7 2.7-.4 1-.6 2.2-.6 3.3v13c0 1.1.2 2.3.6 3.3.4 1 1 1.9 1.7 2.7.7.8 1.6 1.4 2.5 1.8 1 .4 2 .7 3.1.7s2.1-.2 3.1-.7c1-.4 1.8-1 2.5-1.8.7-.8 1.3-1.7 1.7-2.7.4-1 .6-2.2.6-3.3h-3.7c0 2.5-1.9 4.6-4.3 4.6"/><path d="m49 43.1h-8.3v-26.1h-3.7v30h12z"/></g></svg>

After

Width:  |  Height:  |  Size: 691 B

1
public/emoji/1f192.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#4fd1d9"/><g fill="#fff"><path d="m15 37.7c-1.4 0-2.5-1-2.5-2.3v-6.9c0-1.3 1.1-2.3 2.5-2.3s2.5 1 2.5 2.3h2.5c0-2.5-2.2-4.6-5-4.6-2.8 0-5 2.1-5 4.6v6.9c0 2.5 2.2 4.6 5 4.6 2.8 0 5-2.1 5-4.6h-2.5c0 1.3-1.1 2.3-2.5 2.3"/><path d="m27 24c-2.8 0-5 2.1-5 4.6v6.9c0 2.5 2.2 4.6 5 4.6s5-2.1 5-4.6v-6.9c0-2.5-2.2-4.6-5-4.6m0 13.7c-1.4 0-2.5-1-2.5-2.3v-6.9c0-1.3 1.1-2.3 2.5-2.3s2.5 1 2.5 2.3v6.9c0 1.3-1.1 2.3-2.5 2.3"/><path d="m39 24c-2.8 0-5 2.1-5 4.6v6.9c0 2.5 2.2 4.6 5 4.6 2.8 0 5-2.1 5-4.6v-6.9c0-2.5-2.2-4.6-5-4.6m0 13.7c-1.4 0-2.5-1-2.5-2.3v-6.9c0-1.3 1.1-2.3 2.5-2.3s2.5 1 2.5 2.3v6.9c0 1.3-1.1 2.3-2.5 2.3"/><path d="m48.3 24h-2.3v16h8v-2.3h-5.7z"/></g></svg>

After

Width:  |  Height:  |  Size: 865 B

1
public/emoji/1f193.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#4fd1d9"/><g fill="#fff"><path d="m34 41h8v-3h-5.1v-4.5h5.1v-3h-5.1v-4.5h5.1v-3h-8z"/><path d="m54 26v-3h-8v18h8v-3h-5.1v-4.5h5.1v-3h-5.1v-4.5z"/><path d="m23.9 41v-7.5h1.1l2.5 7.5h3l-2.6-7.9c1.8-.8 3.1-2.7 3.1-4.9 0-2.9-2.2-5.2-5-5.2h-5v18h2.9m0-15h2.1c1.2 0 2.1 1 2.1 2.2s-1 2.2-2.1 2.2h-2.1v-4.4"/><path d="m12.9 41v-7.5h5.1v-3h-5.1v-4.5h5.1v-3h-8v18z"/></g></svg>

After

Width:  |  Height:  |  Size: 571 B

1
public/emoji/1f194.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#c28fef"/><g fill="#fff"><path d="m48.2 20.9c-.5-1.1-1.2-2.2-2.1-3.1-.9-.9-2-1.6-3.2-2.1-1.2-.4-2.6-.7-3.9-.7h-10v34h10c1.3 0 2.7-.3 3.9-.8 1.2-.5 2.3-1.2 3.2-2.1.9-.9 1.6-1.9 2.1-3.1.5-1.2.8-2.4.8-3.7v-14.7c0-1.3-.3-2.5-.8-3.7m-9.2 23.7h-5.4v-25.2h5.4c3 0 5.4 2.3 5.4 5.2v14.8c0 2.8-2.4 5.2-5.4 5.2"/><path d="m19 15h4v34h-4z"/></g></svg>

After

Width:  |  Height:  |  Size: 543 B

1
public/emoji/1f195.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#4fd1d9"/><g fill="#fff"><path d="M11,39V25h2.5l5.2,9.3V25H21v14h-2.6l-5.1-9.1V39H11z"/><path d="M25,39V25h9.8v2.4h-7.1v3.1h6.6v2.4h-6.6v3.8H35V39H25z"/><path d="M40.3,39L37,25h2.8l2.1,9.6l2.5-9.6h3.3l2.4,9.8l2.1-9.8H55l-3.3,14h-2.9L46,28.5L43.3,39H40.3z"/></g></svg>

After

Width:  |  Height:  |  Size: 471 B

1
public/emoji/1f196.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#4fd1d9"/><g fill="#fff"><path d="m44 42c-5.5 0-10-4.5-10-10 0-5.5 4.5-10 10-10 2.6 0 5 1 6.9 2.7l-2.3 2.4c-1.2-1.2-2.9-1.8-4.6-1.8-3.7 0-6.7 3-6.7 6.7 0 3.7 3 6.7 6.7 6.7 3.1 0 5.7-2.1 6.5-5h-6.5v-3.3h10v1.6c0 5.5-4.5 10-10 10"/><path d="m26.7 22v14.3l-14.3-14.3h-2.4v20h3.3v-14.3l14.3 14.3h2.4v-9-11z"/></g></svg>

After

Width:  |  Height:  |  Size: 519 B

1
public/emoji/1f197.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#4fd1d9"/><g fill="#fff"><path d="m12 32.1c0-2 .3-3.6.9-5 .5-1 1.1-1.9 1.9-2.7.8-.8 1.7-1.4 2.7-1.7 1.3-.5 2.8-.8 4.4-.8 3 0 5.5.9 7.3 2.6 1.8 1.8 2.7 4.2 2.7 7.4 0 3.1-.9 5.6-2.7 7.3-1.7 1.9-4.1 2.8-7.2 2.8-3.1 0-5.5-.9-7.3-2.6-1.8-1.8-2.7-4.2-2.7-7.3m4.3-.1c0 2.2.5 3.8 1.6 5 1.1 1.1 2.4 1.7 4.1 1.7 1.7 0 3-.6 4.1-1.7 1.1-1.1 1.6-2.8 1.6-5 0-2.2-.5-3.9-1.6-5s-2.4-1.6-4.1-1.6c-1.7 0-3.1.6-4.1 1.7-1.1 1-1.6 2.7-1.6 4.9"/><path d="M34,42V22h4v8.9l8.1-8.9h5.4l-7.5,7.8L52,42h-5.2l-5.5-9.4L38,36v6H34z"/></g></svg>

After

Width:  |  Height:  |  Size: 718 B

1
public/emoji/1f198.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#ff5a79"/><g fill="#fff"><path d="m23 34.6c-.4-.8-.9-1.5-1.5-2.1-.6-.6-1.4-1.1-2.2-1.5-.9-.4-1.7-.6-2.7-.6-1.9 0-3.9-1.9-3.9-3.7 0-2 1.7-3.6 3.7-3.6 2 0 3.9 1.6 3.9 3.6h3.2c0-.9-.2-1.8-.5-2.6-.3-.8-.8-1.5-1.5-2.2-.6-.6-1.4-1.1-2.2-1.5-.8-.4-2-.5-2.9-.5s-1.8.2-2.7.5c-.8.3-1.6.8-2.2 1.4-.6.6-1.1 1.3-1.5 2.2-.4.8-.5 1.7-.5 2.6 0 1.7.8 3.4 2.2 4.7 1.4 1.3 3.2 2.1 4.9 2.1 1.9 0 3.7 1.7 3.7 3.7 0 2-1.7 3.6-3.7 3.6-2 0-3.9-1.7-3.9-3.7h-3.1c0 .9.2 1.8.5 2.6.3.8.8 1.5 1.5 2.2.6.6 1.4 1.1 2.2 1.4.8.4 2 .6 2.9.6.9 0 1.8-.2 2.7-.5.8-.3 1.6-.8 2.2-1.5.6-.6 1.1-1.3 1.5-2.2.4-.8.5-1.7.5-2.6 0-.7-.2-1.5-.6-2.4"/><path d="m39 24.1c-.4-.8-.9-1.5-1.5-2.2s-1.4-1.1-2.2-1.5c-.9-.4-1.8-.5-2.7-.5s-1.9.2-2.7.5c-.8.3-1.6.8-2.2 1.5-.6.6-1.1 1.3-1.5 2.2-.4.8-.6 1.7-.6 2.6v10.4c0 .9.2 1.8.6 2.6.4.8.9 1.5 1.5 2.2.6.6 1.4 1.1 2.2 1.5.9.4 1.8.5 2.7.5.9 0 1.9-.2 2.7-.5.8-.3 1.6-.8 2.2-1.5.6-.6 1.1-1.3 1.5-2.2.4-.8.6-1.7.6-2.6v-10.3c0-.9-.2-1.8-.6-2.7m-6.4 16.8c-2.1 0-3.8-1.6-3.8-3.7v-10.4c0-2 1.7-3.7 3.8-3.7s3.8 1.6 3.8 3.7v10.4c-.1 2-1.8 3.7-3.8 3.7"/><path d="m55 34.6c-.4-.8-.9-1.5-1.5-2.1-.6-.6-1.4-1.1-2.2-1.5-.9-.4-1.8-.6-2.7-.6-1.9 0-3.9-1.9-3.9-3.7 0-2 1.7-3.6 3.7-3.6 2 0 3.9 1.6 3.9 3.6h3.2c0-.9-.2-1.8-.5-2.6-.3-.8-.8-1.5-1.5-2.2-.6-.6-1.4-1.1-2.2-1.5-.9-.4-2-.5-2.9-.5s-1.8.2-2.7.5c-.8.3-1.6.8-2.2 1.5-.6.6-1.1 1.3-1.5 2.2-.4.8-.5 1.7-.5 2.6 0 1.7.8 3.4 2.2 4.7 1.4 1.3 3.2 2.1 4.9 2.1 1.9 0 3.7 1.7 3.7 3.7 0 2-1.7 3.6-3.7 3.6-2 0-3.9-1.7-3.9-3.7h-3.2c0 .9.2 1.8.5 2.6.3.8.8 1.5 1.5 2.2.6.6 1.4 1.1 2.2 1.4.9.4 2 .6 2.9.6s1.8-.2 2.7-.5c.8-.3 1.6-.8 2.2-1.4.6-.6 1.1-1.3 1.5-2.2.4-.8.5-1.7.5-2.6.1-.9-.1-1.7-.5-2.6"/></g></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

1
public/emoji/1f199.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#4fd1d9"/><g fill="#fff"><path d="m12 22h4.1v10.7c0 1.7.1 2.8.2 3.3.2.8.6 1.5 1.2 1.9.7.5 1.5.7 2.7.7 1.1 0 2-.2 2.6-.7.6-.5.9-1 1.1-1.7.1-.7.2-1.8.2-3.3v-10.9h4v10.3c0 2.4-.1 4-.3 5-.2 1-.6 1.8-1.2 2.5-.6.7-1.4 1.2-2.4 1.6-1 .4-2.3.6-3.9.6-1.9 0-3.4-.2-4.4-.7-1-.4-1.8-1-2.3-1.7-.6-.7-1-1.4-1.1-2.2-.3-1.1-.4-2.8-.4-5v-10.4z"/><path d="m31 42v-20h5.9c2.2 0 3.7.1 4.4.3 1 .3 1.9 1 2.6 2 .7 1 1.1 2.3 1.1 3.9 0 1.2-.2 2.3-.6 3.1-.4.8-.9 1.5-1.6 2-.6.5-1.3.8-1.9.9-.9.2-2.2.3-3.8.3h-2.4v7.5h-3.7m3.7-16.6v5.7h2c1.5 0 2.4-.1 2.9-.3.5-.2.9-.5 1.2-1 .3-.4.4-1 .4-1.6 0-.7-.2-1.3-.6-1.8-.4-.5-.9-.8-1.5-.9-.4-.1-1.3-.1-2.7-.1h-1.7"/><path d="m48 42v-4h4v4h-4"/><path d="m48 22h4v12h-4z"/></g></svg>

After

Width:  |  Height:  |  Size: 896 B

1
public/emoji/1f19a.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M62,52c0,5.5-4.5,10-10,10H12C6.5,62,2,57.5,2,52V12C2,6.5,6.5,2,12,2h40c5.5,0,10,4.5,10,10V52z" fill="#eda454"/><g fill="#fff"><path d="m26.3 19.7h5.4l-8.4 24.6h-4.9l-8.4-24.6h5.5l5.4 18.7 5.4-18.7"/><path d="m38.4 36.8c.2 1.1.5 2 .9 2.5.9 1 2.3 1.5 4.4 1.5 1.2 0 2.3-.1 3-.4 1.5-.5 2.2-1.5 2.2-2.9 0-.8-.4-1.4-1.1-1.9-.7-.4-1.9-.8-3.4-1.2l-2.7-.6c-2.6-.6-4.4-1.2-5.4-1.9-1.7-1.1-2.5-2.9-2.5-5.3 0-2.2.8-4 2.4-5.5 1.6-1.5 4-2.2 7.2-2.2 2.6 0 4.9.7 6.7 2.1 1.9 1.4 2.8 3.4 2.9 6h-5c-.1-1.5-.8-2.5-2-3.2-.8-.4-1.8-.6-3.1-.6-1.4 0-2.5.3-3.3.8-.8.5-1.2 1.3-1.2 2.2 0 .9.4 1.5 1.2 2 .5.3 1.6.6 3.3 1l4.3 1c1.9.4 3.3 1 4.3 1.8 1.5 1.2 2.2 2.8 2.2 5 0 2.3-.9 4.1-2.6 5.6-1.5 1.7-3.9 2.4-7.1 2.4-3.3 0-5.8-.7-7.7-2.2-1.9-1.5-2.8-3.5-2.8-6 0 0 4.9 0 4.9 0"/></g></svg>

After

Width:  |  Height:  |  Size: 861 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="m2 32c0 11.5 6.5 21.5 16 26.5v-53c-9.5 5-16 15-16 26.5" fill="#2a5f9e"/><path d="m62 32c0-11.5-6.5-21.5-16-26.5v53.1c9.5-5.1 16-15.1 16-26.6" fill="#c94747"/><path d="M32,2c-5.1,0-9.8,1.3-14,3.5v53.1c4.2,2.2,8.9,3.5,14,3.5s9.8-1.3,14-3.5V5.5C41.8,3.3,37.1,2,32,2z" fill="#ffe62e"/><path d="m29.2 17c1.2 0 2 1.2 3.3.9 1-.2 2.5-1.7 3.3-.3.3.5.2 1.1 0 1.7-.2.5-.7 1.2-.2 1.6.7.6 2.2.4 2.9-.3-.6 0-1-.7-.5-1.1.2-.2.4-.1.6-.2.1 0 .2-.2.3-.3.1-.1.2-.1.4-.1.2 0 .4.2.5.2.2 0 .6-.3.8.1.1.2.3.1.5 0 .3-.1.6.1.8.3.2.2.3.2.6.3.2.1.3.5.5.5.7.3.7.8.4 1.5-.4.9-2.5 2-1.7 3.2-.1-.8 1.1-.4.8.3 1.6-1 3.3 1.2 3.3 2.6 0 1.4-.6 2.5-2 2.8.4.2.8.6.5 1.1-.1.2-.3.3-.6.3-.4 0-.5-.3-.7.1-.5.8-.2 2.1.5 2.7.2-.3.7-.6 1-.2.2.2.2.7.4.9.2.3.4.6.1 1-.3.4-.6.2-1 .3.9.9 1.3 1.8.9 3.1-.3 1.2-1.3 2.1-2.5 2.6-1.2.4-2.5.5-3.8.5-1.3.1-2.6.1-3.5 1 .4.3.7.7.5 1.2-.1.2-.2.3-.4.5-.2.1-.5.1-.7.3-.3.5-1.1.3-1.4 0-.2-.2-.3.1-.5.3-.2.2-.5.5-.7.5-.2 0-.5-.2-.6-.4-.2-.2-.4-.5-.7-.4-.4.2-1.1.4-1.4 0 0-.1-.2 0-.4-.1-.2-.1-.4-.3-.5-.6-.2-.5.1-1 .6-1.2-.9-.9-2.1-.9-3.3-1-1.3-.1-2.8 0-4-.6-1-.5-1.9-1.2-2.4-2.2-.5-1.2-.3-2.4.7-3.3-.4-.1-.8-.1-1-.5-.2-.5.2-.7.2-1.1 0-.3.4-.7.6-.8.2-.1.5 0 .6.2.2.2.3 0 .5-.2.4-.7.7-1.9 0-2.6-.8.7-1.8-.9-.8-1.4-.3-.2-.7-.3-.9-.6-.2-.2-.4-.5-.6-.8-.4-.7-.4-1.5-.2-2.2.2-.7.6-1.4 1.2-1.8.7-.4 1.2-.3 1.9-.1-.1 0 .1-.6.2-.7.3-.3.6 0 .7.3.6-1.1-1.5-2.2-1.9-3.1-.2-.4-.3-1.4.4-1.4.2 0 .3-.3.5-.5.1-.1.3-.1.5-.2.1-.1.2-.2.3-.3.2-.2.5-.2.7-.2.4 0 .2.1.5 0 .3-.1.5 0 .7 0 .2 0 .3-.3.7-.2.3.1.3.3.5.4.2.1.4.1.6.3.5.5.1 1-.4 1.2.5.4 1.1.6 1.8.5.5 0 1.4-.3 1.2-1-.2-.8-.6-1.3-.5-2.1.2-.8.7-1.2 1.3-1.2" fill="#c7b37f"/><path fill="#c94747" d="m24 23.9h7.6v7.6h-7.6z"/><g fill="#fff"><path d="m27.5 29.9c0 0 0 .3-.1.5-.1.3-.1.3-.2.4-.1.2-.2.3-.4.4-.2.1-.4.2-.6.2-.5 0-.7-.6-.9-1-.1-.5-.5-.7-.7-.6-.1.1-.1.3 0 .4.1.2.4.3.4.3l-.3.3c0 0-.6-.1-.7-.7 0-.2.1-.7.5-.8.5-.2.8.2 1 .5.2.4.3 1.2.9 1 .3-.1.5-.5.5-.7l.2-.2h.4"/><path d="m28 29.9c0 0 0 .3.1.5.1.3.1.3.2.4.1.2.2.3.4.4.2.1.4.2.6.2.5 0 .7-.6.9-1 .1-.5.5-.7.7-.6.1.1.1.3 0 .4-.1.2-.4.3-.4.3l.3.3c0 0 .6-.1.7-.7 0-.2-.1-.7-.5-.8-.5-.2-.8.2-1 .5-.2.4-.3 1.2-.9 1-.3-.1-.5-.5-.5-.7l-.2-.2h-.4"/></g><path d="m28.5 26.7c.3-.3 1.2-.9 1.1-1.4-.5-.1 0-.2.1-.5-.1 0-.2 0-.3 0 .1-.4 1-.7 1.5-.6 1 .4.3 2-.5 1.3.1-.4.7-.2.6-.6 0-.3-.4-.5-.7-.4-.4.3-.1.9-.5 1.2-.3.5-.9 1-1.3 1.4-1.2 1.3-2.5 2.7-3.7 4-.7-.4 1.1-1.8 1.4-2.1.7-.6 1.5-1.5 2.3-2.3" fill="#ffce31"/><path d="m25.5 27.1c0 0 .2 1.2 1.1 3.1.4-.2.7-.3 1.1-.3s.7.1 1.1.3c.9-1.9 1.1-3.1 1.1-3.1l-2.2-2.9-2.2 2.9" fill="#fff"/><g fill="#ffce31"><path d="m28 25.2l1.6 2c0 0-.2 1-.8 2.4-.2-.1-.5-.1-.7-.1l-.1-4.3"/><path d="m27.5 25.2l-1.6 2c0 0 .2 1 .8 2.4.2-.1.5-.1.7-.1l.1-4.3"/><path d="m32.4 23.9h7.6v7.6h-7.6z"/></g><g fill="#c94747"><path d="m33.5 23.9h1.1v7.6h-1.1z"/><path d="m35.6 23.9h1.1v7.6h-1.1z"/><path d="m37.8 23.9h1.1v7.6h-1.1z"/></g><path d="m24 38.2c0 .1.1.4.2.6.1.2.1.2.4.6.2.2.4.3.6.4.2.1.3.2.6.2.6.2 1 .2 1.5.1.4 0 .7-.1 1-.1.4 0 .6-.1 1-.1.2 0 .4 0 .6 0 .2 0 .4 0 .7.1.5.1 1 .3 1 .3v-8h-7.6v5.4.5" fill="#ffce31"/><g fill="#c94747"><path d="m24.9 39.6l.3.2.5.1v-7.5h-.8z"/><path d="m29.1 39.9v-7.5h-.8v7.6c0 0 .5-.1.8-.1"/><path d="m30.8 32.4h-.8v7.6c.3 0 .6.1.8.2v-7.8"/><path d="m27.4 32.4v7.7c0 0-.6 0-.9 0v-7.7h.9"/></g><path d="m40 38.2c0 .1-.1.4-.2.6-.1.2-.1.2-.4.6-.2.2-.4.3-.6.4-.2.1-.3.2-.6.2-.6.2-1 .2-1.5.1-.4 0-.7-.1-1-.1-.4 0-.6-.1-1-.1-.2 0-.4 0-.6 0-.2 0-.4 0-.7.1-.5.1-1 .3-1 .3v-8h7.6v5.4.5" fill="#ffce31"/><g fill="#c94747"><path d="m34.3 33c-.3.2-.4.5-.7.7.2.4.6.3.9.5.2 0 .4.6.4.7-.3.3.1 1.2.2.9.1-.3-.4-.9.3-.7.2.1.3.8.1 1 .1.3.4.1.4-.2-.1-.5 0-.8.5-.8.6 0 .5.2.8.2h.3l.2-.2c0 .3-.4.7-.6.9.4.2 1-.6 1-.9.4.2.1.9-.1 1.1 1 .2.1-1.8.4-2 .9-.5-.5-.8-.9-.8-.8 0-1.9.4-2.6.1.2-.1.2-.2.3-.3-.2-.2-.6 0-.9-.2"/><path d="m34.3 36.4c-.3.2-.4.5-.7.7.2.4.6.3.9.5.2 0 .4.6.4.7-.3.3.1 1.2.2.9.1-.3-.4-.9.3-.7.2.1.3.8.1 1 .1.3.4.1.4-.2-.1-.5 0-.8.5-.8.6 0 .5.2.8.2h.3l.2-.2c0 .3-.4.7-.6.9.4.2 1-.6 1-.9.4.2.1.9-.1 1.1 1 .2.1-1.8.4-2 .9-.5-.5-.8-.9-.8-.8 0-1.9.4-2.6.1.2-.1.2-.2.3-.3-.2-.2-.6 0-.9-.2"/></g></svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M2,32c0,13.1,8.4,24.2,20,28.3V3.7C10.4,7.8,2,18.9,2,32z" fill="#ed4c5c"/><path d="M32,2c-3.5,0-6.9,0.6-10,1.7V22h38.3C56.2,10.4,45.1,2,32,2z" fill="#699635"/><path d="m60.3 22h-38.3v20h38.3c1.1-3.1 1.7-6.5 1.7-10s-.6-6.9-1.7-10" fill="#f9f9f9"/><path d="M22,42v18.3c3.1,1.1,6.5,1.7,10,1.7c13.1,0,24.2-8.3,28.3-20H22z" fill="#3e4347"/></svg>

After

Width:  |  Height:  |  Size: 443 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="m2 32c0 11.5 6.5 21.5 16 26.5v-53c-9.5 5-16 15-16 26.5" fill="#3e4347"/><path d="m62 32c0-11.5-6.5-21.5-16-26.5v53.1c9.5-5.1 16-15.1 16-26.6" fill="#699635"/><path d="M32,2c-5.1,0-9.8,1.3-14,3.5v53.1c4.2,2.2,8.9,3.5,14,3.5c5.1,0,9.8-1.3,14-3.5V5.5C41.8,3.3,37.1,2,32,2z" fill="#ed4c5c"/><g fill="#fff"><path d="m35.8 37h-1.1c0 .5-.1.9-.4 1.2h2.2c-.4-.3-.7-.8-.7-1.2"/><path d="m35.9 30.8l.6-.7h-2l-1-.7-3.1-.1-.9.8h-2l.6.7z"/><path d="m30.6 29.2h2.7c.4-.2.5-.9.5-1.2 0-1.1-.7-1.6-1.4-1.6-.1 0-.2-.1-.3-.2-.1-.2-.1-.4-.1-.4-.1 0 0 .1-.1.4 0 .1-.1.2-.3.2-.9 0-1.5.7-1.4 1.6 0 .6.1 1 .4 1.2"/><path d="m34.5 37.4l-.5-.3v-.6l-.3-.2v-.6l-.5-.2v-.5l-.4-.1v-.5l-.6-.2-.3-.2v-.4h-2v-.3c0-1 1.3-1.9 2.1-1.9 1 0 2.1.9 2.1 1.9v1h.1v-1c0-.9-1.1-2-2.1-2h3.6v-.1h-7.6v.1h3.6c-.6 0-2.1.7-2.1 2v3.6h.8v.7h-1c-.1 0-.2-.2-.2-.4h-1c0 .5-.3.9-.7 1.3h3v-.8h.8l.2.8h.7l-.3-.8h.7l.5.8h1l-.7-.8c0-.3 1.1-.3 1.1-.3m-4-1.3h.6l.1.7h-.7v-.7m1.4 1.3h-.6l-.1-.7h.5l-.2-.7h.1.1.1l.4.7h-.5l.2.7m.7 0l-.4-.7h.6l.6.7h-.8"/><path d="m34.1 34.7h.1v1h-.1z"/><path d="m28.3 35.8h1.1v-1.3h-1.1v.3l-2.2-3.8.1-.2c0-.2-.1-.3-.3-.3-.2 0-.3.1-.3.3s.1.3.3.3h.1l.1.1c-.2 0-.4.5-.9.9-.3.2-.5.9-.6 1.3 0 .1 0 .2 0 .3v.1c0 .2 0 .3 0 .5 0 .2-.2.6-.1.7.3.2.7.8.9 1 .1.1.3-.6.4-1.1v-.1c.1-.4.1-.9.4-1.2l.1-.1c.2-.2.6-.4.8-.6l1.3 2.3-.1.6"/><path d="m28.3 27.3h1v.2h-1z"/><path d="m28.3 27.7h1v2h-1z"/><path d="m28.8 26.2c-.2 0-.6.4-.5.8h1.1c0-.4-.4-.8-.6-.8"/><path d="m28.2 31.4h1.1v1.6h-1.1z"/><path d="m28.3 33.9h1.1v.3h-1.1z"/><path d="m28.2 36h1.2v.7h-1.2z"/><path d="m28.3 33.6h1l.2-.3h-1.3z"/><path d="m30.3 31.5h-.7v.9c.2-.4.4-.7.7-.9"/><path d="m39.5 33.8v-.1.1c0-.2 0-.3 0-.4 0-.4-.2-1-.6-1.3-.5-.4-.8-.9-.9-.9l.1-.1h.1c.2 0 .3-.1.3-.3s-.1-.3-.3-.3c-.2 0-.3.1-.3.3l.1.2-2.1 3.8v-.3h-1.1v1.3h1.1v-.7l1.3-2.3c.1.1.6.3.8.6l.1.1c.3.4.2.8.3 1.2v.1c.1.4.2 1.2.4 1.1.2-.2.6-.7.9-1 .1-.1-.1-.5-.1-.7-.2-.1-.1-.2-.1-.4"/><path d="m34.8 27.3h1v.2h-1z"/><path d="m34.8 27.7h1v2h-1z"/><path d="m35.8 27c0-.4-.3-.8-.5-.8-.2 0-.6.4-.5.8h1"/><path d="m34.7 31.4h1.1v1.6h-1.1z"/><path d="m34.7 33.9h1.1v.3h-1.1z"/><path d="m34.7 36h1.2v.7h-1.2z"/><path d="m34.5 33.3l.2.3h1l.2-.3z"/><path d="m34.4 32.4v-.9h-.7c.3.2.5.5.7.9"/><path d="m42.6 33.2c.4-.2.9-.5 1.2-.8.3-.5.2-1.4.2-1.4s-.7.3-1.3.6c0-.4-.2-.9-.4-1.3.3-.3.8-.7.9-1 .3-.6-.1-1.4-.1-1.4s-.6.4-1.1.9c-.1-.4-.4-.8-.7-1.2.2-.4.6-.9.6-1.2.1-.7-.5-1.4-.5-1.4s-.5.6-.8 1.2c-.3-.4-.8-.9-1.2-1.2.2-.3.2-.6.2-1 0-2.2-3.4-4-7.7-4-4.2 0-7.7 1.8-7.7 4 0 .3.1.7.2 1-.4.3-.9.7-1.2 1.2-.3-.6-.8-1.2-.8-1.2s-.6.7-.5 1.4c.1.4.4.9.6 1.2-.3.4-.6.8-.7 1.2-.4-.5-1.1-.9-1.1-.9s-.4.8-.1 1.4c.2.4.6.8.9 1-.2.4-.3.9-.4 1.3-.3-.3-1.1-.6-1.1-.6s-.2.9.2 1.4c.2.3.8.6 1.2.8-.1.4-.1 1 0 1.4-.6-.2-1.4-.3-1.4-.3s.1.9.6 1.3c.3.2.9.4 1.3.4.1.4.2 1 .4 1.3-.6-.1-1.4.1-1.4.1s.3.9.9 1.1c.4.1 1 .1 1.4.1.2.4.4.9.7 1.2-.6.1-1.3.4-1.3.4s.5.8 1.2.8c.4 0 1-.1 1.4-.3.3.4.6.7 1 1-.6.3-1.2.8-1.2.8s.7.6 1.4.5c.2 0 .3-.1.5-.2l-.9 1.2h12l-.8-.9c.2.1.3.1.5.2.7.1 1.4-.5 1.4-.5s-.6-.5-1.2-.8c.4-.2.7-.6 1-1 .4.2 1 .3 1.4.3.7-.1 1.2-.8 1.2-.8s-.7-.3-1.3-.4c.3-.3.5-.8.7-1.2.4 0 1 .1 1.4-.1.6-.3.9-1.1.9-1.1s-.8-.1-1.4-.1c.2-.4.3-.9.4-1.3.4-.1 1-.2 1.3-.4.5-.4.6-1.3.6-1.3s-.8.1-1.4.3c0-.7-.1-1.2-.1-1.7m-15.7 7.6c-.3-.2-.7-.4-1.1-.5.1-.3.3-.6.4-.9h.9c0 .3-.2.9-.2 1.4m8.9-.4c-.1.3-.1.7 0 1.1l-.6-.7h-6.5l-.6.7c.1-.4.1-.8 0-1.1-.1-.5-.6-.8-.9-.9h9.4c-.2.1-.6.4-.8.9m1.3.4c0-.5-.2-1.1-.2-1.4h.9c.1.3.3.7.4.9-.4.2-.8.3-1.1.5m4.1-6.4c-.5-.4-1.2-.9-1.2-.9s-.3.9 0 1.5c.2.4.8.8 1.1 1-.3.3-.5.6-.7.9-.3-.6-.9-1.2-.9-1.2s-.5.8-.4 1.4c.1.4.5.9.8 1.3-.3.2-.7.4-.9.7-.2-.6-.6-1.4-.6-1.4s-.7.6-.7 1.3c0 .1 0 .3.1.5l-1-.9h-9.5l-1 .9c0-.2.1-.3.1-.5 0-.7-.7-1.3-.7-1.3s-.4.7-.6 1.4c-.2-.3-.6-.5-.9-.7.3-.3.7-.8.8-1.3.2-.7-.4-1.4-.4-1.4s-.6.6-.9 1.2c-.2-.3-.4-.6-.7-.9.4-.2.9-.6 1.1-1 .3-.6 0-1.5 0-1.5s-.8.4-1.2.9c-.1-.3-.2-.7-.4-1 .4-.1 1-.4 1.3-.7.5-.5.4-1.4.4-1.4s-.8.2-1.4.5c0-.3 0-.7-.1-1.1.4 0 1.1-.1 1.5-.3.6-.4.7-1.3.7-1.3s-.9 0-1.5.2c.1-.3.1-.7.2-1.1.4.1 1.1.2 1.5.1.7-.2 1-1 1-1s-.8-.2-1.5-.2c.5-.8.7-2.3.7-2.3s-.1 0-.2.1c1.2-1.4 3.9-2.4 7-2.4s5.8 1 7 2.4c-.1-.1-.2-.1-.2-.1s.2 1.5.7 2.3c-.7 0-1.5.2-1.5.2s.4.8 1 1c.4.1 1.1 0 1.5-.1 0 .4 0 .8.2 1.1-.6-.2-1.5-.2-1.5-.2s.2.9.7 1.3c.4.2 1 .3 1.5.3-.1.4-.2.8-.1 1.1-.6-.3-1.4-.5-1.4-.5s-.1.9.4 1.4c.3.3.9.5 1.3.7-.2.3-.4.6-.5 1"/></g></svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="m56 14h-48c-3.8 5-6 11.2-6 18 0 16.6 13.4 30 30 30s30-13.4 30-30c0-6.8-2.2-13-6-18" fill="#ed4c5c"/><path fill="#42ade2" d="m20.5 39h23l7-14h-37z" id="0"/><use xlink:href="#0"/><path d="M50.5,25L56,14C50.5,6.7,41.8,2,32,2S13.5,6.7,8,14l5.5,11H50.5z" fill="#3e4347"/><path fill="#fff" d="M20.5 39 32 62 43.5 39z"/><path fill="#ffce31" d="m36.2 22.2l5-6.4-6.4 5.1 2.2-7.9-4 7.1-.9-8.1-1.1 8.1-3.9-7.1 2.1 7.8-6.4-5 5.1 6.4-7.9-2.2 7.1 4-8.1.9.4.1h25.2l-7.7-1 7.1-3.9z"/></svg>

After

Width:  |  Height:  |  Size: 620 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path fill="#2a5f9e" d="m12 12h20.4v20.4h-20.4z"/><path fill="#fff" d="m18.9 8.1v5.9h-7.3l14.4 18h6v-7.5z"/><path d="M32,2v30H2c0,16.6,13.4,30,30,30s30-13.4,30-30S48.6,2,32,2z" fill="#2a5f9e"/><path d="m11 18.9h-6c-1.9 4-3 8.4-3 13.1h12v-18.1h-3v5" fill="#fff"/><path fill="#ed4c5c" d="m32 27.1l-13-16.1h-6l17 21h2z"/><path d="M18.9,5v6H11v3h21V2C27.3,2,22.9,3.1,18.9,5z" fill="#fff"/><path d="M32,5H18.9C12.9,7.9,7.9,12.9,5,18.9V32h6V11h21V5z" fill="#ed4c5c"/><path d="m50 33.4c-1.6 0-3-1.4-3-1.4s-1.4 1.4-3 1.4c-1.5 0-4-1.4-4-1.4s.4 8.8 2 11.8c1.8 3.2 5 6.2 5 6.2s3.2-3 5-6.2c1.6-3 2-11.8 2-11.8s-2.5 1.4-4 1.4" fill="#fff"/><path d="m42.9 43.3c1.2 2.1 3.1 4.3 4.1 5.3 1-1 2.9-3.2 4.1-5.3h-8.2" fill="#b4d7ee"/><g fill="#ff8736"><path d="m47 35.5c-.9 1-.4 3.6-1.3 2.7-.9-1-.9-2.5 0-3.5.9-1 2.4-1 3.3 0 .9 1-1.1-.1-2 .8"/><path d="m44.8 40c1.3.3 3.2-1.5 2.9-.2-.3 1.3-1.6 2.1-2.9 1.7-1.3-.3-2-1.7-1.7-3 .3-1.3.4 1.1 1.7 1.5"/><path d="m49.6 39.7c-.3-1.3-2.8-2.1-1.6-2.5 1.3-.3 2.6.4 2.9 1.7.3 1.3-.4 2.6-1.7 3-1.2.4.7-.9.4-2.2"/></g></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><circle cx="32" cy="32" r="30" fill="#f42f4c"/><path d="m48.9 41.9c-.9-1.6-3.4-.4-4.7-.4.7-.6 2.5-1.9 3.5-1.9-.7-.6-2-.1-2.5.5-1.8 2.1-2.9 1-5.5.2 2.1-2.2-6-3.8-3.4-5.6.5-.4 1.4 3.1 2.8 2.5.6-.2-2.3-2.5-.8-3 .5-.2 2.5 5.7 3.9 3.3.5-.9-3.1-1.7-2.1-3.5-.7 1.3 8.8 6.2 7.6 3-.6-1.5-6.4-.4-5.9-4.3-.1 1 6.7 4.2 6 1.3-.2-.7-6.9-.2-5.7-3.4.2-.5 5.9 3.9 5.7.7-.1-1.2-6.1-.3-5.5-2.9 0-.1 6.2 2.6 5.5-.2-.1-.4-6.9.4-5.6-2-.6 1.1 8.1.6 5.5-1.6-.9-.7-4.7 2.7-5.5-.3.1.4 7.5-.6 5.4-2.7-.5-.6-5.2 3.1-5.3.7 0-.5 6.2-3.4 5.3-4.9-1.1-1.8-7.2 3.2-7.9 3.5-4.7 2.2 0 .9-2.3 3.7-1.4 1.6-2.5-.9-2.1-2 .8-2.3 5.6-2 5.8-3.5-.7.5-1.4.4-2 0 .1 0 5.1-.7 3.4-1.4-.2-.1-.8.3-1.4.6.1-2.4-6.4-.6-7.1-.5 2.7 2.3-2.2 1 .6 2.2-.7.1-1.3.4-1.9.9 1.3.1-.7 1.6-.7 1.6s-2-1.4-.8-1.7c-.5-.5-1.2-.8-1.9-.9 2.8-1.2-2.1.1.6-2.2-.6 0-7.2-1.9-7.1.5-.6-.3-1.2-.6-1.4-.6-1.6.7 3.3 1.4 3.4 1.4-.6.5-1.3.5-2 0 .2 1.5 5 1.2 5.8 3.5.4 1.1-.7 3.6-2.1 2-2.4-2.8 2.3-1.5-2.3-3.7-.7-.3-6.8-5.3-7.9-3.5-.9 1.5 5.3 4.4 5.3 4.9-.2 2.4-4.8-1.3-5.3-.7-2.1 2.1 5.3 3.1 5.4 2.7-.7 3-4.6-.4-5.5.3-2.6 2.1 6.1 2.7 5.5 1.6 1.2 2.3-5.5 1.6-5.6 2-.7 2.8 5.5.1 5.5.2.6 2.7-5.4 1.7-5.5 2.9-.2 3.2 5.5-1.1 5.7-.7 1.2 3.2-5.5 2.7-5.7 3.4-.8 3 6.1-.2 6-1.3.5 3.9-5.3 2.8-5.9 4.3-1.2 3.2 8.3-1.7 7.6-3 1 1.8-2.6 2.6-2.1 3.5 1.4 2.4 3.4-3.5 3.9-3.3 1.5.5-1.4 2.8-.8 3 1.4.6 2.3-2.9 2.8-2.5 2.6 1.8-5.5 3.4-3.4 5.6-2.6.8-3.8 1.9-5.5-.2-.5-.6-1.9-1-2.5-.5 1 0 2.8 1.4 3.5 1.9-1.3 0-3.8-1.2-4.7.4 1.1-.5 3.6 0 4.7.1-1.2 1-3.4.3-3 2.8.6-2 6.6-3.5 7.3-.7.7-1.3-2.1-2-2.7-2.2.4-.1 5.1-.1 5.1-.1s2.6-5.1 3.8-3.9c2.8 3-4.6 4.7-4.9 5.3-.8 1.9 3.8.2 3.6.1 1.2 1.1-3 2.1-3 2.4.1 2.1 3.5-.8 3.7-.8 1.6.4-2.3 2.8-2.2 2.5-.3 2.2 3.4-.7 3.3-1.2.4.6.4 1.1-.1 1.8-1.3 2.3-.1 2.6 1.4 5 1.5-2.4 2.7-2.6 1.4-5-.4-.6-.4-1.2-.1-1.8-.1.5 3.7 3.4 3.3 1.2 0 .3-3.9-2.2-2.2-2.5.2 0 3.6 2.9 3.7.8 0-.4-4.3-1.3-3-2.4-.1.1 4.4 1.9 3.6-.1-.2-.6-7.7-2.2-4.9-5.3 1.2-1.3 3.8 3.9 3.8 3.9s4.7 0 5.1.1c-.6.2-3.5.9-2.7 2.2.7-2.9 6.7-1.3 7.3.7.4-2.5-1.8-1.7-3-2.8 1 0 3.5-.5 4.6 0m-7.9-23.6c-.6.3-1.2.5-1.6.4.3-.5 1.1-1 1.6-.4m-3.2-.4c1 .2 1 .5 0 .7-1-.3-1-.5 0-.7m-14.8.4c.5-.6 1.3-.1 1.6.4-.4.1-1-.1-1.6-.4m3.2.3c-1-.3-1-.5 0-.7 1 .2 1 .4 0 .7" fill="#3e4347"/></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M32,2C18.9,2,7.8,10.4,3.7,22h56.6C56.2,10.4,45.1,2,32,2z" fill="#ed4c5c"/><path d="M32,62c13.1,0,24.2-8.3,28.3-20H3.7C7.8,53.7,18.9,62,32,62z" fill="#f2b200"/><path d="M3.7,22C2.6,25.1,2,28.5,2,32s0.6,6.9,1.7,10h56.6c1.1-3.1,1.7-6.5,1.7-10s-0.6-6.9-1.7-10H3.7z" fill="#2a5f9e"/></svg>

After

Width:  |  Height:  |  Size: 387 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M32,62c16.6,0,30-13.4,30-30H2C2,48.6,15.4,62,32,62z" fill="#3e4347"/><path d="M32,2C15.4,2,2,15.4,2,32h60C62,15.4,48.6,2,32,2z" fill="#ed4c5c"/><g fill="#ffe62e"><path d="m27.5 24.5l-1.3 4 3.4-2.5 3.5 2.5-1.3-4 3.4-2.5h-4.3l-1.3-4.1-1.3 4.1h-4.3z"/><path d="m48 48.6c-.5-.8-1.1-1.4-1.9-2.1s-1.9-1.5-2.8-2.3l-1.6 1.8c-.1.1 0 .3 0 .3 1.8.3 2.3.9 3 1.5 1 1 1.3 2.1 2 2.6 1.2.7 2.1-.6 1.3-1.8"/><path d="m33.8 41.7c-1.7.6-3.6.8-5.5.6-2.5-.3-4.8-1.2-6.7-2.8l-1.9 2.3c.8.7 1.7 1.2 2.5 1.7l-.6 1.2c1 .5 2 1 3.1 1.3l.4-1.2c1 .3 2 .5 3 .6l-.1 1.2c1.1.1 2.2.1 3.3 0l-.1-1.3c1-.1 2-.3 3-.6l.4 1.2c.5-.2 1-.3 1.6-.6l-.7-2.7-1.7-.9"/><path d="m42.3 31c-.4 3.4-2 6.3-4.4 8.4l3.6 2.5c.5-.5.9-.9 1.3-1.4l-1-.8c0 0 0 0 0 0 .7-.8 1.2-1.7 1.7-2.5l1.2.6c.5-1 1-2 1.3-3.1l-1.2-.4c.3-1 .5-2 .6-3l1.3.1c.1-1.1.1-2.2 0-3.3l-1.3.1c-.1-1-.3-2-.6-3l1.2-.4c-.3-1.1-.7-2.1-1.3-3.1l-1.2.6c-.5-.9-1-1.8-1.7-2.6l1-.8c-.7-.9-1.5-1.6-2.4-2.4l-.8 1c0 0 0 0 0 0-.8-.7-1.6-1.2-2.5-1.7l.6-1.2c-1-.5-2-1-3.1-1.3l-.4 1.3c-.9-.3-1.9-.5-2.9-.6l-.3 3c6.9.7 12 7 11.3 14"/><path d="m37.3 41.2c-3.4-2.4-6.8-4.8-9.8-7.6l.2-.2c2.9 2.7 6.4 5.2 9.7 7.5 1.7 1.2 3.4 2.4 5 3.6l.6-.5c-5.6-4-18.8-13.2-19-16.5-2.6 5.1.7 8.1 2.8 9.4 5.4 3.1 9 5.1 14.7 8.9l.8-.9c-1.6-1.4-3.3-2.6-5-3.7"/></g></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><circle cx="32" cy="32" r="30" fill="#3a7dce"/><path fill="#fff" d="m17.6 30.7l-.3-1.4h-.3l-.5.5-.1-1.3-.6-.5-.4.2v.2l-.7-.3-.5-.6 1.2-1-2-1.6-1-3.7 7.4 5.3 4.6-1.2-.2-.7.9-.2.4-1.5-.1-.5.3-.4.2-1-.2-.4.7-.6-.2-1.5 1.6-.7 1.3-1.3-.1-.7.9.5.8-.5.3-.8.4.6 4.3.2.9.8 3.5.7.7.7.5-.2.5 1.7h.3l.4-.5 3.2 1.1.2.5.8-.2.9.8.9 4.9-.8 2.7 3.4 1 .2 2.3-.7 1.7 1 .8-.5 2.9-1.7 1.3.4 2-1 .7-.6-.2v1.9h-.8l.3.7-1.7.7.5 1-1.1 1.2.3.3-.7-.2-3.2 1.9.2-.5-1 .2-.2-.5-.8.6-.3-.1-.5.6-3.6-.5-.5-.3-.6.3-1.3-1 .6-.6.9-1.8v-1.1l-.7-1.6-.8.8-4.7-1.2-1 .1-.8.5-2.3-.2v.4l-4.8-1.7v-1h-.8l-.2-2.9-.6.2-.9-2.1.2.5-1.7-1.8h1l-.3-2 .8-1.4h.5"/></svg>

After

Width:  |  Height:  |  Size: 714 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

@ -0,0 +1,2 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path d="M32,62c5.3,0,10.3-1.4,14.6-3.8l0.1-52.3C42.4,3.4,37.4,2,32,2C17.1,2,4.7,12.9,2.4,27.2v9.6
C4.7,51.1,17.1,62,32,62z" fill="#2a5f9e"/><path d="m62 32c0-7.7-2.9-14.7-7.6-20-.9-1-1.8-1.9-2.9-2.8-.3-.3-.7-.6-1-.8h-3.7v-.4l-43.2 21.5c-.1.8-1.6 1.7-1.6 2.5 0 .8 1.9 1.6 1.9 2.4l42.7 21.6v-.4h3.8c.3-.3.7-.5 1-.8 1-.9 2-1.8 2.9-2.8 4.8-5.3 7.7-12.3 7.7-20" fill="#f9f9f9"/><g fill="#ed4c5c"><path d="m50.5 55.6l-48.5-23.4c0 1.6.1 3.1.4 4.6l44.3 21.4c1.3-.8 2.6-1.6 3.8-2.6"/><path d="m2.4 27.2c-.3 1.5-.4 3-.4 4.6l48.5-23.4c-1.2-1-2.5-1.8-3.9-2.6l-44.2 21.4"/></g><path fill="#9c3900" d="m44.7 37.9l-1.6-.3-.1-2.3.2-.9-.2-.9-.1-.9-2.1-.7-1.6-.1-1.3-1 .4-2.9-4-.7 2.7-2.2.1-1.9 2.2-1.1 4.3-1.8.2.6 3.7-1.6v.6l3.2-.8 3.3-1.2-.3 3.6-1.1 1.5-.7 1.7-3.7 2.3 4.8 1.9-2 2.3-2.1.1 1.2.9-1.2.6.9.1-.6.7 1.2-.2-1.5 1.3.2 1.2-1.2-.5.8 1.3-1.5-.4.3 1.4-1.1-.3-.1 1.1z"/><path d="m53.9 18l-.4 3.4-1 1.4-.7 1.7-3.8 2.4 4.8 1.9-1.8 2.2-2.4.1 1.3 1-1.5.7 1.2.1-.7.7 1.1-.2-1.2 1 .2 1.1-1.3-.6.8 1.3-1.4-.3.2 1.3-1-.3-.1 1.1-1.5-.5-1.5-.2-.1-2.2.2-.9-.2-.9-.1-1-2.1-.6-1.7-.2-1.1-.9.4-2.9-3.9-.7 2.5-2.1.1-1.9 2.2-1 4.2-1.8.2.6 3.7-1.6v.6l3.3-.7 3.1-1.1m.3-.3l-.4.1-3.2 1.1-3 .7v-.2-.4l-.4.2-3.4 1.5-.1-.3v-.4l-.3.1-4.2 1.8-2.2 1-.1.1v.1l-.1 1.8-2.4 2-.4.4.5.1 3.7.6-.3 2.6v.1l.1.1 1.1.9h.1.1l1.7.2 1.9.6.1.9.2.9-.2.8.1 2.2v.2h.2l1.5.2 1.4.5.3.1v-.3l.1-.8.7.2.4.1-.1-.4-.2-.9 1 .2.6.1-.3-.5-.4-.7.6.2.4.2-.1-.5-.2-1 1.1-.9.7-.6-.9.1-.4.1.2-.2.4-.4h-.5-.2l.6-.3.4-.2-.4.1-.8-.6 1.7-.1h.1l.1-.1 1.9-2.1.2-.3-.3-.1-4.4-1.7 3.4-2.1h.1v-.1l.7-1.7 1-1.4v-.1-.1l.4-3.4.1-.3z" fill="#3e4347"/><path d="m46.4 42.9c0 0 0 0 0 0" fill="#ffc221"/><path d="m46.4 42.9c0 0 0 0 0 0m0 0" fill="#3e4347"/><path d="m41.5 44.4l.5.9-9-4.2 1.5-1.3.2.3 5.1.5-.1-.3 1.1-.5v-.3l-2.2.5-.1-1.2-2.5-.5-.1.7h-.7l-.2.6-1.3-.4.3-1.4-1.9.9-3.3-2.7 4.2-.8 1.3 1.5.4-1.3 1.3.3-.2.6.7.1-.2.8 2.5.6.4-1 2.5 1.6 1.4-1.1.3.1.6-1.2 1.1.2.3.9-.4 1.7.3.4 6 1.4-.3 1-.6-.1.1.8-12.7-.9-.3.4 4.5.2-.3.4 3-.4-.2.7 2.8-.2-2 .8 2.2 1h-2.6l1.4 1.3-2.7-1v1l-2.1-1.4m7.4-3.1l-4.1-.9-.9.5 5 .4" fill="#ffce31"/><path d="m32.9 35.4l1.4 1.6.4-1.4 1 .3-.2.6.7.1-.2.8 2.7.6.4-.9 2.5 1.5 1.4-1.1.3.2.6-1.2.9.2.3.9-.3 1.4.3.5 5.9 1.4-.2.7-6-1.4-1 .5-.1.3 6.4.5.1.8-12.6-.9-.4.7 4.5.2-.3.4 3.1-.4-.2.7 2.1-.2-1.4.7 1.9.9h-2.3l1.2 1.1-2.2-.9v1l-2.5-1.6.6 1-8.5-3.9 1.2-1 .1.3 5.4.5-.1-.3 1.1-.5v-.5l-2.3.5-.1-1.1-2.7-.6-.1.7h-.7l-.2.6-1-.3.3-1.5-2.1 1-3-2.5 3.9-1m.1-.3h-.1l-3.9.7-.5.1.4.3 3 2.5.1.1.1-.1 1.6-.8-.2 1v.2l.2.1 1 .3.2.1.1-.2.1-.4h.5.2v-.2l.1-.4 2.2.5.1.9v.3l.3-.1 2-.4-1 .5-.2.1v.2l-4.9-.4-.1-.1-.1-.3-.2.2-1.2 1-.3.3.4.2 8.5 3.9.7.3-.4-.7-.1-.1 1.6 1 .4.2v-.5-.6l1.9.7 1.2.5-1-.9-.7-.6h1.7 1.2l-.9-.4-1.4-.7.9-.3 1.6-.6-1.7.1-1.7.1.1-.4.1-.3 5.4.4h.3l-.1-.3-.1-.5.3.1.2.1.1-.2.2-.7.1-.3-.3-.1-5.8-1.4-.2-.3.5-1.3v-.1-.1l-.3-.9v-.1h-.1l-.9-.2h-.2l-.1.2-.5 1h-.1l-.1-.1-.2.1-1.3 1-2.3-1.5-.2-.1-.1.3-.3.8-2.3-.5.1-.6.1-.2h-.3l-.4-.1.1-.3.1-.2-.2-.1-1-.3-.2-.1-.1.2-.3.9-1.1-1.2-.3-.2zm11.3 5.7l.6-.3 2.3.5-2.9-.2m-6.6 1.1l.1-.2 6.6.4-2.4.3.3-.3h-.5l-4.1-.2" fill="#3e4347"/><path d="m32.4 35.1c-.5-.3-.8-.6-.9-1-.1-.8.8-1.6.8-1.6l.2-.1v.2c.1.4 1 .5 1.4.5 0 0 .1 0 .3 0 .3 0 .6.1.9.4v.1.1c-.5.8-1.3.9-1.8.9-.3 0-.6-.1-.7-.1 0 .1-.1.2-.1.6v.2l-.1-.2" fill="#ffce31"/><path d="m32.4 32.6c.1.6 1.5.6 1.5.6s.1 0 .3 0c.2 0 .5.1.8.4-.5.7-1.2.9-1.7.9-.4 0-.7-.1-.7-.1s-.1.1-.2.7c-1.8-1 0-2.5 0-2.5m.2-.3h-.2c-.2 0-.9.8-1 1.3-.1.5 0 1.1.9 1.6l.3.2v-.3c0-.2.1-.3.1-.4.1 0 .4.1.6.1.5 0 1.3-.2 1.9-1l.1-.1-.1-.1c-.2-.3-.6-.5-1-.5-.2 0-.3 0-.3 0-.5 0-1.2-.1-1.3-.4v-.4z" fill="#3e4347"/><path fill="#fff" d="m32.3 32.6l.4-.6.2-.9 4.4-2.2 1.4-1.6-.5 1.5 1.8-.4-1.5 1.1 2-.4-1.7 1.1 2.1-.2-1.6 1.1 1.4.1-1.7.8-2.3.6-1.6 1.1h-2.3z"/><path d="m38.4 27.9l-.4 1.1 1.4-.3-1.4 1 1.8-.4-1.5 1.1 2.1-.2-1.2.8-.7.1 1.8.2-1.3.6-2.3.6-1.7 1h-2.1l-.4-1 .3-.5.2-.9 4.4-2.2 1-1m.6-1.2l-.8 1-.9 1.1-4.4 2.2h-.1v.1l-.2.9-.3.5-.1.1v.1l.4 1 .1.2h.2 2.1.1.1l1.6-1 2.2-.6 1.3-.6.8-.4-.8-.3h-.6l.9-.6.9-.6-1 .1-1.2.1.8-.5 1.1-.7-1.3.3-.7.2.5-.4.9-.7-1.1.2-1 .2.2-.7.3-1.2z" fill="#3e4347"/><path fill="#fff" d="m50.8 31.2l-.7-.9.6-1.5-.3-.5.2-1 4.1-.7-.6 1.2 1.3 1.1-.9 1.6.7 1.6z"/><path d="m54.4 26.8l-.6 1.1 1.4 1-.9 1.6.7 1.4-4.2-.8-.6-.8.5-1.5-.3-.5.2-.8 3.8-.7m.5-.3l-.5.1-3.7.6h-.2v.2l-.2.8v.1.1l.2.4-.5 1.4v.1l.1.1.6.8.1.1h.1l4.2.8.5.1-.2-.4-.6-1.3.9-1.5.1-.2-.2-.1-1.2-.9.5-.9v-.4z" fill="#3e4347"/></svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><g fill="#ed4c5c"><path d="M32,2C18.9,2,7.8,10.4,3.7,22h56.6C56.2,10.4,45.1,2,32,2z"/><path d="M32,62c13.1,0,24.2-8.3,28.3-20H3.7C7.8,53.7,18.9,62,32,62z"/></g><path d="M3.7,22C2.6,25.1,2,28.5,2,32s0.6,6.9,1.7,10h56.6c1.1-3.1,1.7-6.5,1.7-10s-0.6-6.9-1.7-10H3.7z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 376 B

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