Merge pull request #2112 from ClearlyClaire/glitch-soc/merge-upstream

Merge upstream changes
This commit is contained in:
Claire
2023-02-18 22:05:11 +01:00
committed by GitHub
104 changed files with 1064 additions and 582 deletions
@@ -64,11 +64,18 @@ class Api::V1::StatusesController < Api::BaseController
application: doorkeeper_token.application,
poll: status_params[:poll],
content_type: status_params[:content_type],
allowed_mentions: status_params[:allowed_mentions],
idempotency: request.headers['Idempotency-Key'],
with_rate_limit: true
)
render json: @status, serializer: @status.is_a?(ScheduledStatus) ? REST::ScheduledStatusSerializer : REST::StatusSerializer
rescue PostStatusService::UnexpectedMentionsError => e
unexpected_accounts = ActiveModel::Serializer::CollectionSerializer.new(
e.accounts,
serializer: REST::AccountSerializer
)
render json: { error: e.message, unexpected_accounts: unexpected_accounts }, status: 422
end
def update
@@ -131,6 +138,7 @@ class Api::V1::StatusesController < Api::BaseController
:language,
:scheduled_at,
:content_type,
allowed_mentions: [],
media_ids: [],
media_attributes: [
:id,
@@ -6,7 +6,7 @@ import { setBrowserSupport, setSubscription, clearSubscription } from './setter'
const urlBase64ToUint8Array = (base64String) => {
const padding = '='.repeat((4 - base64String.length % 4) % 4);
const base64 = (base64String + padding)
.replace(/\-/g, '+')
.replace(/-/g, '+')
.replace(/_/g, '/');
const rawData = window.atob(base64);
@@ -1,12 +1,10 @@
import React from 'react';
import PropTypes from 'prop-types';
import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
import { formatTime } from 'flavours/glitch/features/video';
import { formatTime, getPointerPosition, fileNameFromURL } from 'flavours/glitch/features/video';
import Icon from 'flavours/glitch/components/icon';
import classNames from 'classnames';
import { throttle } from 'lodash';
import { getPointerPosition, fileNameFromURL } from 'flavours/glitch/features/video';
import { debounce } from 'lodash';
import { throttle, debounce } from 'lodash';
import Visualizer from './visualizer';
import { displayMedia, useBlurhash } from 'flavours/glitch/initial_state';
import Blurhash from 'flavours/glitch/components/blurhash';
@@ -32,6 +32,11 @@ export default class Upload extends ImmutablePureComponent {
render () {
const { media } = this.props;
if (!media) {
return null;
}
const focusX = media.getIn(['meta', 'focus', 'x']);
const focusY = media.getIn(['meta', 'focus', 'y']);
const x = ((focusX / 2) + .5) * 100;
@@ -1,7 +1,10 @@
import { connect } from 'react-redux';
import PollForm from '../components/poll_form';
import { addPollOption, removePollOption, changePollOption, changePollSettings } from 'flavours/glitch/actions/compose';
import {
addPollOption,
removePollOption,
changePollOption,
changePollSettings,
clearComposeSuggestions,
fetchComposeSuggestions,
selectComposeSuggestion,
@@ -1,7 +1,6 @@
import { connect } from 'react-redux';
import Upload from '../components/upload';
import { undoUploadCompose, initMediaEditModal } from 'flavours/glitch/actions/compose';
import { submitCompose } from 'flavours/glitch/actions/compose';
import { undoUploadCompose, initMediaEditModal, submitCompose } from 'flavours/glitch/actions/compose';
const mapStateToProps = (state, { id }) => ({
media: state.getIn(['compose', 'media_attachments']).find(item => item.get('id') === id),
@@ -25,7 +25,7 @@ const buildHashtagRE = () => {
'))', 'iu',
);
} catch {
return /(?:^|[^\/\)\w])#(\w*[a-zA-Z·]\w*)/i;
return /(?:^|[^/)\w])#(\w*[a-zA-Z·]\w*)/i;
}
};
@@ -4,7 +4,7 @@ import NavigationContainer from './containers/navigation_container';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { connect } from 'react-redux';
import { mountCompose, unmountCompose } from 'flavours/glitch/actions/compose';
import { mountCompose, unmountCompose, cycleElefriendCompose } from 'flavours/glitch/actions/compose';
import { injectIntl, defineMessages } from 'react-intl';
import classNames from 'classnames';
import SearchContainer from './containers/search_container';
@@ -12,7 +12,6 @@ import Motion from '../ui/util/optional_motion';
import spring from 'react-motion/lib/spring';
import SearchResultsContainer from './containers/search_results_container';
import { me, mascot } from 'flavours/glitch/initial_state';
import { cycleElefriendCompose } from 'flavours/glitch/actions/compose';
import HeaderContainer from './containers/header_container';
import Column from 'flavours/glitch/components/column';
import { Helmet } from 'react-helmet';
@@ -5,5 +5,5 @@ const urlPlaceholder = '$2xxxxxxxxxxxxxxxxxxxxxxx';
export function countableText(inputText) {
return inputText
.replace(urlRegex, urlPlaceholder)
.replace(/(^|[^\/\w])@(([a-z0-9_]+)@[a-z0-9\.\-]+[a-z0-9]+)/ig, '$1@$3');
.replace(/(^|[^/\w])@(([a-z0-9_]+)@[a-z0-9.-]+[a-z0-9]+)/ig, '$1@$3');
}
@@ -73,7 +73,7 @@ const stringFromCodePoint = _String.fromCodePoint || function () {
const _JSON = JSON;
const COLONS_REGEX = /^(?:\:([^\:]+)\:)(?:\:skin-tone-(\d)\:)?$/;
const COLONS_REGEX = /^(?::([^:]+):)(?::skin-tone-(\d):)?$/;
const SKINS = [
'1F3FA', '1F3FB', '1F3FC',
'1F3FD', '1F3FE', '1F3FF',
@@ -27,7 +27,7 @@ const makeMapStateToProps = () => {
};
const getFirstSentence = str => {
const arr = str.split(/(([\.\?!]+\s)|[.。?!\n•])/);
const arr = str.split(/(([.?!]+\s)|[.。?!\n•])/);
return arr[0];
};
@@ -6,9 +6,8 @@ import PropTypes from 'prop-types';
import IconButton from 'flavours/glitch/components/icon_button';
import Icon from 'flavours/glitch/components/icon';
import { defineMessages, injectIntl, FormattedMessage, FormattedDate } from 'react-intl';
import { autoPlayGif, reduceMotion, disableSwiping } from 'flavours/glitch/initial_state';
import { autoPlayGif, reduceMotion, disableSwiping, mascot } from 'flavours/glitch/initial_state';
import elephantUIPlane from 'mastodon/../images/elephant_ui_plane.svg';
import { mascot } from 'flavours/glitch/initial_state';
import unicodeMapping from 'flavours/glitch/features/emoji/emoji_unicode_mapping_light';
import classNames from 'classnames';
import EmojiPickerDropdown from 'flavours/glitch/features/compose/containers/emoji_picker_dropdown_container';
@@ -2,8 +2,7 @@ import { connect } from 'react-redux';
import { defineMessages, injectIntl } from 'react-intl';
import ColumnSettings from '../components/column_settings';
import { changeSetting } from 'flavours/glitch/actions/settings';
import { setFilter } from 'flavours/glitch/actions/notifications';
import { clearNotifications, requestBrowserPermission } from 'flavours/glitch/actions/notifications';
import { setFilter, clearNotifications, requestBrowserPermission } from 'flavours/glitch/actions/notifications';
import { changeAlerts as changePushNotifications } from 'flavours/glitch/actions/push_notifications';
import { openModal } from 'flavours/glitch/actions/modal';
import { showAlert } from 'flavours/glitch/actions/alerts';
@@ -5,7 +5,17 @@ import PropTypes from 'prop-types';
import classNames from 'classnames';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { createSelector } from 'reselect';
import { fetchStatus } from 'flavours/glitch/actions/statuses';
import {
fetchStatus,
muteStatus,
unmuteStatus,
deleteStatus,
editStatus,
hideStatus,
revealStatus,
translateStatus,
undoStatusTranslation,
} from 'flavours/glitch/actions/statuses';
import MissingIndicator from 'flavours/glitch/components/missing_indicator';
import LoadingIndicator from 'flavours/glitch/components/loading_indicator';
import DetailedStatus from './components/detailed_status';
@@ -27,16 +37,6 @@ import {
directCompose,
} from 'flavours/glitch/actions/compose';
import { changeLocalSetting } from 'flavours/glitch/actions/local_settings';
import {
muteStatus,
unmuteStatus,
deleteStatus,
editStatus,
hideStatus,
revealStatus,
translateStatus,
undoStatusTranslation,
} from 'flavours/glitch/actions/statuses';
import { initMuteModal } from 'flavours/glitch/actions/mutes';
import { initBlockModal } from 'flavours/glitch/actions/blocks';
import { initReport } from 'flavours/glitch/actions/reports';
@@ -5,11 +5,10 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';
import classNames from 'classnames';
import { changeUploadCompose, uploadThumbnail, onChangeMediaDescription, onChangeMediaFocus } from 'flavours/glitch/actions/compose';
import { getPointerPosition } from 'flavours/glitch/features/video';
import Video, { getPointerPosition } from 'flavours/glitch/features/video';
import { FormattedMessage, defineMessages, injectIntl } from 'react-intl';
import IconButton from 'flavours/glitch/components/icon_button';
import Button from 'flavours/glitch/components/button';
import Video from 'flavours/glitch/features/video';
import Audio from 'flavours/glitch/features/audio';
import Textarea from 'react-textarea-autosize';
import UploadProgress from 'flavours/glitch/features/compose/components/upload_progress';
@@ -273,11 +273,12 @@ const ignoreSuggestion = (state, position, token, completion, path) => {
};
const sortHashtagsByUse = (state, tags) => {
const personalHistory = state.get('tagHistory');
const personalHistory = state.get('tagHistory').map(tag => tag.toLowerCase());
return tags.sort((a, b) => {
const usedA = personalHistory.includes(a.name);
const usedB = personalHistory.includes(b.name);
const tagsWithLowercase = tags.map(t => ({ ...t, lowerName: t.name.toLowerCase() }));
const sorted = tagsWithLowercase.sort((a, b) => {
const usedA = personalHistory.includes(a.lowerName);
const usedB = personalHistory.includes(b.lowerName);
if (usedA === usedB) {
return 0;
@@ -287,6 +288,8 @@ const sortHashtagsByUse = (state, tags) => {
return 1;
}
});
sorted.forEach(tag => delete tag.lowerName);
return sorted;
};
const insertEmoji = (state, position, emojiData) => {
@@ -421,6 +424,8 @@ export default function compose(state = initialState, action) {
map.set('preselectDate', new Date());
map.set('idempotencyKey', uuid());
map.update('media_attachments', list => list.filter(media => media.get('unattached')));
if (action.status.get('language') && !action.status.has('translation')) {
map.set('language', action.status.get('language'));
} else {
@@ -4,7 +4,7 @@
background-clip: padding-box;
}
@mixin avatar-size($size:48px) {
@mixin avatar-size($size: 48px) {
width: $size;
height: $size;
background-size: $size $size;
@@ -22,7 +22,8 @@
}
@mixin limited-single-column($media, $parent: '&') {
.auto-columns #{$parent}, .single-column #{$parent} {
.auto-columns #{$parent},
.single-column #{$parent} {
@media #{$media} {
@content;
}
@@ -1,4 +1,7 @@
$emojis-requiring-inversion: 'back' 'copyright' 'curly_loop' 'currency_exchange' 'end' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'on' 'registered' 'soon' 'spider' 'telephone_receiver' 'tm' 'top' 'wavy_dash' !default;
$emojis-requiring-inversion: 'back' 'copyright' 'curly_loop' 'currency_exchange'
'end' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign'
'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'on'
'registered' 'soon' 'spider' 'telephone_receiver' 'tm' 'top' 'wavy_dash' !default;
%emoji-color-inversion {
filter: invert(1);
@@ -19,7 +22,7 @@ $emojis-requiring-inversion: 'back' 'copyright' 'curly_loop' 'currency_exchange'
&.active::after {
position: absolute;
content: "\F00C";
content: '\F00C';
font-size: 50%;
font-family: FontAwesome;
right: -0.55em;
@@ -1,4 +1,4 @@
@use "sass:math";
@use 'sass:math';
$no-columns-breakpoint: 600px;
$sidebar-width: 240px;
@@ -350,7 +350,7 @@ $content-width: 840px;
width: 100%;
height: 0;
border: 0;
border-bottom: 1px solid rgba($ui-base-lighter-color, .6);
border-bottom: 1px solid rgba($ui-base-lighter-color, 0.6);
margin: 20px 0;
&.spacer {
@@ -1147,7 +1147,10 @@ a.name-tag,
@for $i from 0 through 10 {
&--#{10 * $i} {
background-color: rgba($ui-highlight-color, 1 * (math.div(max(1, $i), 10)));
background-color: rgba(
$ui-highlight-color,
1 * (math.div(max(1, $i), 10))
);
}
}
}
@@ -1236,7 +1239,12 @@ a.sparkline {
.skeleton {
background-color: lighten($ui-base-color, 8%);
background-image: linear-gradient(90deg, lighten($ui-base-color, 8%), lighten($ui-base-color, 12%), lighten($ui-base-color, 8%));
background-image: linear-gradient(
90deg,
lighten($ui-base-color, 8%),
lighten($ui-base-color, 12%),
lighten($ui-base-color, 8%)
);
background-size: 200px 100%;
background-repeat: no-repeat;
border-radius: 4px;
@@ -1285,7 +1293,10 @@ a.sparkline {
@for $i from 0 through 10 {
&--#{10 * $i} {
background-color: rgba($ui-highlight-color, 1 * (math.div(max(1, $i), 10)));
background-color: rgba(
$ui-highlight-color,
1 * (math.div(max(1, $i), 10))
);
}
}
}
@@ -1431,7 +1442,7 @@ a.sparkline {
&::after {
display: block;
content: "";
content: '';
width: 50px;
height: 21px;
position: absolute;
@@ -1825,7 +1836,7 @@ a.sparkline {
&::after {
position: absolute;
content: "";
content: '';
width: 1px;
background: $highlight-text-color;
bottom: 0;
@@ -2,7 +2,7 @@
@if type-of($color) == 'color' {
$color: str-slice(ie-hex-str($color), 4);
}
@return '%23' + unquote($color)
@return '%23' + unquote($color);
}
body {
@@ -13,9 +13,9 @@ body {
font-weight: 400;
color: $primary-text-color;
text-rendering: optimizelegibility;
font-feature-settings: "kern";
font-feature-settings: 'kern';
text-size-adjust: none;
-webkit-tap-highlight-color: rgba(0,0,0,0);
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-webkit-tap-highlight-color: transparent;
&.system-font {
@@ -30,7 +30,9 @@ body {
// Droid Sans => Older Androids (<4.0)
// Helvetica Neue => Older macOS <10.11
// $font-sans-serif => web-font (Roboto) fallback and newer Androids (>=4.0)
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", $font-sans-serif, sans-serif;
font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans',
'Helvetica Neue', $font-sans-serif, sans-serif;
}
&.app-body {
@@ -30,7 +30,9 @@
border: 0;
padding: 0;
& > .account__avatar-wrapper { margin: 0 8px 0 0 }
& > .account__avatar-wrapper {
margin: 0 8px 0 0;
}
& > .display-name {
height: 24px;
@@ -379,7 +381,7 @@
&::before,
&::after {
display: block;
content: "";
content: '';
position: absolute;
bottom: 0;
left: 50%;
@@ -710,22 +712,22 @@
padding: 2px 6px;
color: $darker-text-color;
&:hover,
&:active,
&:focus {
color: lighten($darker-text-color, 7%);
background-color: rgba($darker-text-color, 0.15);
}
&:hover,
&:active,
&:focus {
color: lighten($darker-text-color, 7%);
background-color: rgba($darker-text-color, 0.15);
}
&:focus {
background-color: rgba($darker-text-color, 0.3);
}
&:focus {
background-color: rgba($darker-text-color, 0.3);
}
&[disabled] {
color: darken($darker-text-color, 13%);
background-color: transparent;
cursor: default;
}
&[disabled] {
color: darken($darker-text-color, 13%);
background-color: transparent;
cursor: default;
}
}
.flex-spacer {
@@ -181,7 +181,11 @@
&.active {
transition: all 100ms ease-in;
transition-property: background-color, color;
background-color: mix(lighten($ui-base-color, 12%), $ui-highlight-color, 80%);
background-color: mix(
lighten($ui-base-color, 12%),
$ui-highlight-color,
80%
);
.reactions-bar__item__count {
color: lighten($highlight-text-color, 8%);
@@ -286,7 +286,7 @@ $ui-header-height: 55px;
&::before {
display: block;
content: "";
content: '';
position: absolute;
bottom: -13px;
left: 0;
@@ -296,7 +296,11 @@ $ui-header-height: 55px;
pointer-events: none;
height: 28px;
z-index: 1;
background: radial-gradient(ellipse, rgba($ui-highlight-color, 0.23) 0%, rgba($ui-highlight-color, 0) 60%);
background: radial-gradient(
ellipse,
rgba($ui-highlight-color, 0.23) 0%,
rgba($ui-highlight-color, 0) 60%
);
}
}
@@ -435,10 +439,10 @@ $ui-header-height: 55px;
}
}
.layout-single-column .column-header__notif-cleaning-buttons {
@media screen and (min-width: $no-gap-breakpoint) {
b, i {
b,
i {
margin-right: 5px;
}
@@ -622,7 +626,8 @@ $ui-header-height: 55px;
flex: 1 1 auto;
align-items: center;
justify-content: center;
@supports(display: grid) { // hack to fix Chrome <57
@supports (display: grid) {
// hack to fix Chrome <57
contain: strict;
}
@@ -916,7 +921,7 @@ $ui-header-height: 55px;
p {
font-size: 16px;
line-height: 24px;
line-height: 24px;
font-weight: 400;
color: $darker-text-color;
}
@@ -32,12 +32,12 @@
.spoiler-input {
height: 0;
transform-origin: bottom;
opacity: 0.0;
opacity: 0;
&.spoiler-input--visible {
height: 36px;
margin-bottom: 11px;
opacity: 1.0;
opacity: 1;
}
input {
@@ -59,8 +59,12 @@
color: $dark-text-color;
}
&:focus { outline: 0 }
@include single-column('screen and (max-width: 630px)') { font-size: 16px }
&:focus {
outline: 0;
}
@include single-column('screen and (max-width: 630px)') {
font-size: 16px;
}
}
}
@@ -98,7 +102,7 @@
color: $highlight-text-color;
}
input[type=checkbox] {
input[type='checkbox'] {
display: none;
}
@@ -118,7 +122,9 @@
&.active {
border-color: $highlight-text-color;
background: $highlight-text-color url("data:image/svg+xml;utf8,<svg width='18' height='18' fill='none' xmlns='http://www.w3.org/2000/svg'><path d='M4.5 8.5L8 12l6-6' stroke='white' stroke-width='1.5'/></svg>") center center no-repeat;
background: $highlight-text-color
url("data:image/svg+xml;utf8,<svg width='18' height='18' fill='none' xmlns='http://www.w3.org/2000/svg'><path d='M4.5 8.5L8 12l6-6' stroke='white' stroke-width='1.5'/></svg>")
center center no-repeat;
}
}
}
@@ -137,7 +143,9 @@
margin-bottom: 5px;
overflow: hidden;
& > .account.small { color: $inverted-text-color; }
& > .account.small {
color: $inverted-text-color;
}
}
.reply-indicator__cancel {
@@ -159,7 +167,9 @@
padding-top: 5px;
overflow: hidden;
p, pre, blockquote {
p,
pre,
blockquote {
margin-bottom: 20px;
white-space: pre-wrap;
@@ -168,12 +178,17 @@
}
}
h1, h2, h3, h4, h5 {
h1,
h2,
h3,
h4,
h5 {
margin-top: 20px;
margin-bottom: 20px;
}
h1, h2 {
h1,
h2 {
font-weight: 700;
font-size: 18px;
}
@@ -182,7 +197,9 @@
font-size: 16px;
}
h3, h4, h5 {
h3,
h4,
h5 {
font-weight: 500;
}
@@ -197,11 +214,13 @@
}
}
b, strong {
b,
strong {
font-weight: 700;
}
em, i {
em,
i {
font-style: italic;
}
@@ -215,7 +234,8 @@
vertical-align: super;
}
ul, ol {
ul,
ol {
margin-left: 1em;
p {
@@ -235,13 +255,17 @@
color: $lighter-text-color;
text-decoration: none;
&:hover { text-decoration: underline }
&:hover {
text-decoration: underline;
}
&.mention {
&:hover {
text-decoration: none;
span { text-decoration: underline }
span {
text-decoration: underline;
}
}
}
}
@@ -321,7 +345,7 @@
font-size: 18px;
line-height: 24px;
text-align: center;
opacity: .8;
opacity: 0.8;
}
}
@@ -358,7 +382,9 @@
&:hover,
&:focus,
&:active,
&.selected { background: darken($ui-secondary-color, 10%) }
&.selected {
background: darken($ui-secondary-color, 10%);
}
> .account,
> .emoji,
@@ -396,7 +422,9 @@
& > .account.small {
.display-name {
& > span { color: $lighter-text-color }
& > span {
color: $lighter-text-color;
}
}
}
}
@@ -430,7 +458,9 @@
background-repeat: no-repeat;
overflow: hidden;
& > .close { mix-blend-mode: difference }
& > .close {
mix-blend-mode: difference;
}
}
.icon-button {
@@ -455,12 +485,22 @@
left: 0;
right: 0;
box-sizing: border-box;
background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);
background: linear-gradient(
0deg,
rgba($base-shadow-color, 0.8) 0,
rgba($base-shadow-color, 0.35) 80%,
transparent
);
}
}
.compose-form__upload__actions {
background: linear-gradient(180deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);
background: linear-gradient(
180deg,
rgba($base-shadow-color, 0.8) 0,
rgba($base-shadow-color, 0.35) 80%,
transparent
);
display: flex;
align-items: flex-start;
justify-content: space-between;
@@ -543,7 +583,8 @@
margin: 0 3px;
border-width: 0 0 0 1px;
border-style: none none none solid;
border-color: transparent transparent transparent darken($simple-background-color, 24%);
border-color: transparent transparent transparent
darken($simple-background-color, 24%);
padding: 0;
width: 0;
height: 27px;
@@ -604,7 +645,9 @@
flex: 1 1 auto;
color: $lighter-text-color;
&:not(:first-child) { margin-left: 10px }
&:not(:first-child) {
margin-left: 10px;
}
strong {
display: block;
@@ -621,11 +664,15 @@
.privacy-dropdown__option__content {
color: $primary-text-color;
strong { color: $primary-text-color }
strong {
color: $primary-text-color;
}
}
}
&.active:hover { background: lighten($ui-highlight-color, 4%) }
&.active:hover {
background: lighten($ui-highlight-color, 4%);
}
}
.compose-form__publish {
@@ -11,7 +11,11 @@
}
.scrollable .account-card__bio::after {
background: linear-gradient(to left, lighten($ui-base-color, 8%), transparent);
background: linear-gradient(
to left,
lighten($ui-base-color, 8%),
transparent
);
}
.filter-form {
@@ -39,8 +43,8 @@
text-overflow: ellipsis;
cursor: pointer;
input[type=radio],
input[type=checkbox] {
input[type='radio'],
input[type='checkbox'] {
display: none;
}
@@ -38,7 +38,8 @@ $doodleBg: #d9e1e8;
margin-right: 2px;
}
input[type="number"],input[type="text"] {
input[type='number'],
input[type='text'] {
width: 40px;
}
span.val {
@@ -52,7 +53,7 @@ $doodleBg: #d9e1e8;
.doodle-palette {
padding-right: 0 !important;
border: 1px solid black;
line-height: .2rem;
line-height: 0.2rem;
flex-grow: 0;
background: white;
@@ -60,14 +61,15 @@ $doodleBg: #d9e1e8;
appearance: none;
width: 1rem;
height: 1rem;
margin: 0; padding: 0;
margin: 0;
padding: 0;
text-align: center;
color: black;
text-shadow: 0 0 1px white;
cursor: pointer;
box-shadow: inset 0 0 1px rgba(white, .5);
box-shadow: inset 0 0 1px rgba(white, 0.5);
border: 1px solid black;
outline-offset:-1px;
outline-offset: -1px;
&.foreground {
outline: 1px dashed white;
@@ -34,7 +34,8 @@
}
@include single-column('screen and (max-width: 630px)') {
:root & { // Overrides `.wide` for single-column view
:root & {
// Overrides `.wide` for single-column view
flex: auto;
width: 100%;
min-width: 0;
@@ -43,7 +44,9 @@
}
}
.react-swipeable-view-container & { height: 100% }
.react-swipeable-view-container & {
height: 100%;
}
}
.drawer--header {
@@ -84,8 +87,14 @@
margin-bottom: 10px;
flex: none;
@include limited-single-column('screen and (max-width: #{$no-gap-breakpoint})') { margin-bottom: 0 }
@include single-column('screen and (max-width: 630px)') { font-size: 16px }
@include limited-single-column(
'screen and (max-width: #{$no-gap-breakpoint})'
) {
margin-bottom: 0;
}
@include single-column('screen and (max-width: 630px)') {
font-size: 16px;
}
}
.search-popout {
@@ -192,7 +201,9 @@
}
.drawer__inner__mastodon {
background: lighten($ui-base-color, 13%) url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-color)}"/></svg>') no-repeat bottom / 100% auto;
background: lighten($ui-base-color, 13%)
url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-color)}"/></svg>')
no-repeat bottom / 100% auto;
flex: 1;
min-height: 47px;
display: none;
@@ -240,13 +251,27 @@
@for $i from 0 through 3 {
.mbstobon-#{$i} .drawer__inner__mastodon {
@if $i == 3 {
background: url('~flavours/glitch/images/wave-drawer.png') no-repeat bottom / 100% auto, lighten($ui-base-color, 13%);
background: url('~flavours/glitch/images/wave-drawer.png')
no-repeat
bottom /
100%
auto,
lighten($ui-base-color, 13%);
} @else {
background: url('~flavours/glitch/images/wave-drawer-glitched.png') no-repeat bottom / 100% auto, lighten($ui-base-color, 13%);
background: url('~flavours/glitch/images/wave-drawer-glitched.png')
no-repeat
bottom /
100%
auto,
lighten($ui-base-color, 13%);
}
& > .mastodon {
background: url("~flavours/glitch/images/mbstobon-ui-#{$i}.png") no-repeat left bottom / contain;
background: url('~flavours/glitch/images/mbstobon-ui-#{$i}.png')
no-repeat
left
bottom /
contain;
@if $i != 3 {
filter: contrast(50%) brightness(50%);
@@ -2,7 +2,7 @@
font-size: inherit;
vertical-align: middle;
object-fit: contain;
margin: -.2ex .15em .2ex;
margin: -0.2ex 0.15em 0.2ex;
width: 16px;
height: 16px;
@@ -46,7 +46,7 @@
text-align: center;
padding: 12px 4px;
overflow: hidden;
transition: color .1s ease-out;
transition: color 0.1s ease-out;
cursor: pointer;
background: transparent;
border: 0;
@@ -174,7 +174,7 @@
&:hover::before {
z-index: 0;
content: "";
content: '';
position: absolute;
top: 0;
left: 0;
@@ -246,8 +246,8 @@
padding: 5px 6px;
padding-top: 70px;
.emoji-mart-no-results-label {
margin-top: .2em;
.emoji-mart-no-results-label {
margin-top: 0.2em;
}
.emoji-mart-emoji:hover::before {
@@ -370,7 +370,7 @@ body > [data-popper-placement] {
.ellipsis {
&::after {
content: "";
content: '';
}
}
@@ -480,11 +480,11 @@ body > [data-popper-placement] {
justify-content: center;
flex-direction: column;
scrollbar-width: none; /* Firefox */
-ms-overflow-style: none; /* IE 10+ */
-ms-overflow-style: none; /* IE 10+ */
* {
scrollbar-width: none; /* Firefox */
-ms-overflow-style: none; /* IE 10+ */
-ms-overflow-style: none; /* IE 10+ */
}
&::-webkit-scrollbar,
@@ -950,7 +950,8 @@ body > [data-popper-placement] {
overflow-y: auto;
}
@supports(display: grid) { // hack to fix Chrome <57
@supports (display: grid) {
// hack to fix Chrome <57
contain: strict;
}
@@ -971,7 +972,8 @@ body > [data-popper-placement] {
}
.scrollable.fullscreen {
@supports(display: grid) { // hack to fix Chrome <57
@supports (display: grid) {
// hack to fix Chrome <57
contain: none;
}
}
@@ -1014,7 +1016,8 @@ body > [data-popper-placement] {
transition: background-color 0.2s ease;
}
.react-toggle:is(:hover, :focus-within):not(.react-toggle--disabled) .react-toggle-track {
.react-toggle:is(:hover, :focus-within):not(.react-toggle--disabled)
.react-toggle-track {
background-color: darken($ui-base-color, 10%);
}
@@ -1022,7 +1025,8 @@ body > [data-popper-placement] {
background-color: darken($ui-highlight-color, 2%);
}
.react-toggle--checked:is(:hover, :focus-within):not(.react-toggle--disabled) .react-toggle-track {
.react-toggle--checked:is(:hover, :focus-within):not(.react-toggle--disabled)
.react-toggle-track {
background-color: $ui-highlight-color;
}
@@ -1654,8 +1658,8 @@ button.icon-button.active i.fa-retweet {
.icon-badge {
position: absolute;
display: block;
right: -.25em;
top: -.25em;
right: -0.25em;
top: -0.25em;
background-color: $ui-highlight-color;
border-radius: 50%;
font-size: 75%;
@@ -1688,7 +1692,7 @@ button.icon-button.active i.fa-retweet {
border-radius: 50%;
width: 0.625rem;
height: 0.625rem;
margin: -.1ex .15em .1ex;
margin: -0.1ex 0.15em 0.1ex;
}
&__content {
@@ -1797,9 +1801,15 @@ noscript {
}
@keyframes flicker {
0% { opacity: 1; }
30% { opacity: 0.75; }
100% { opacity: 1; }
0% {
opacity: 1;
}
30% {
opacity: 0.75;
}
100% {
opacity: 1;
}
}
@import 'boost';
@@ -11,12 +11,14 @@
max-height: 450px;
overflow: hidden;
label, legend {
label,
legend {
display: block;
font-size: 14px;
}
.boolean label, .radio_buttons label {
.boolean label,
.radio_buttons label {
position: relative;
padding-left: 28px;
padding-top: 3px;
@@ -58,7 +60,7 @@
cursor: pointer;
text-decoration: none;
outline: none;
transition: background .3s;
transition: background 0.3s;
.text-icon-button {
color: inherit;
@@ -74,7 +76,8 @@
color: $primary-text-color;
}
&.close, &.close:hover {
&.close,
&.close:hover {
background: $error-value-color;
color: $primary-text-color;
}
@@ -348,7 +348,7 @@
padding: 0;
border: 0;
font-size: 0;
transition: opacity .2s ease-in-out;
transition: opacity 0.2s ease-in-out;
&.active {
opacity: 1;
@@ -372,7 +372,6 @@
.video-player__volume__handle {
bottom: 23px;
}
}
.audio-player {
@@ -506,10 +505,15 @@
left: 0;
right: 0;
box-sizing: border-box;
background: linear-gradient(0deg, rgba($base-shadow-color, 0.85) 0, rgba($base-shadow-color, 0.45) 60%, transparent);
background: linear-gradient(
0deg,
rgba($base-shadow-color, 0.85) 0,
rgba($base-shadow-color, 0.45) 60%,
transparent
);
padding: 0 15px;
opacity: 0;
transition: opacity .1s ease;
transition: opacity 0.1s ease;
&.active {
opacity: 1;
@@ -655,7 +659,7 @@
}
&::before {
content: "";
content: '';
width: 50px;
background: rgba($white, 0.35);
border-radius: 4px;
@@ -725,7 +729,7 @@
position: relative;
&::before {
content: "";
content: '';
width: 100%;
background: rgba($white, 0.35);
border-radius: 4px;
@@ -762,7 +766,7 @@
box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);
.no-reduce-motion & {
transition: opacity .1s ease;
transition: opacity 0.1s ease;
}
&.active {
@@ -269,7 +269,8 @@
}
.onboarding-modal__page__wrapper-0 {
background: url('~images/elephant_ui_greeting.svg') no-repeat left bottom / auto 250px;
background: url('~images/elephant_ui_greeting.svg') no-repeat left bottom /
auto 250px;
height: 100%;
padding: 0;
}
@@ -989,7 +990,8 @@
font-size: 14px;
label, input {
label,
input {
vertical-align: middle;
}
}
@@ -1020,7 +1022,9 @@
width: auto;
outline: 0;
font-family: inherit;
background: $simple-background-color url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(darken($simple-background-color, 14%))}'/></svg>") no-repeat right 8px center / auto 16px;
background: $simple-background-color
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(darken($simple-background-color, 14%))}'/></svg>")
no-repeat right 8px center / auto 16px;
border: 1px solid darken($simple-background-color, 14%);
border-radius: 4px;
padding: 6px 10px;
@@ -1280,7 +1284,7 @@
text-decoration: none;
&:hover {
text-decoration: underline
text-decoration: underline;
}
}
}
@@ -85,14 +85,14 @@
counter-increment: list-counter;
&::before {
content: counter(list-counter) ".";
content: counter(list-counter) '.';
position: absolute;
left: 0;
}
}
ul > li::before {
content: "";
content: '';
position: absolute;
background-color: $darker-text-color;
border-radius: 50%;
@@ -17,8 +17,10 @@
font-size: 12px;
line-height: 18px;
text-transform: uppercase;
opacity: .9;
transition: opacity .1s ease;
opacity: 0.9;
transition: opacity 0.1s ease;
.media-gallery:hover & { opacity: 1 }
.media-gallery:hover & {
opacity: 1;
}
}
@@ -140,7 +140,7 @@
.scrollable {
overflow: visible;
@supports(display: grid) {
@supports (display: grid) {
contain: content;
}
}
@@ -67,7 +67,9 @@
margin: -3px 0 0;
}
p, pre, blockquote {
p,
pre,
blockquote {
margin-bottom: 20px;
white-space: pre-wrap;
unicode-bidi: plaintext;
@@ -86,12 +88,17 @@
margin-bottom: 20px;
}
h1, h2, h3, h4, h5 {
h1,
h2,
h3,
h4,
h5 {
margin-top: 20px;
margin-bottom: 20px;
}
h1, h2 {
h1,
h2 {
font-weight: 700;
font-size: 1.2em;
}
@@ -100,7 +107,9 @@
font-size: 1.1em;
}
h3, h4, h5 {
h3,
h4,
h5 {
font-weight: 500;
}
@@ -115,11 +124,13 @@
}
}
b, strong {
b,
strong {
font-weight: 700;
}
em, i {
em,
i {
font-style: italic;
}
@@ -133,7 +144,8 @@
vertical-align: super;
}
ul, ol {
ul,
ol {
margin-left: 2em;
p {
@@ -317,8 +329,12 @@
}
@keyframes fade {
0% { opacity: 0; }
100% { opacity: 1; }
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
opacity: 1;
@@ -381,9 +397,14 @@
right: 0;
top: 0;
bottom: 0;
background-image: linear-gradient(to bottom, rgba($base-shadow-color, .75), rgba($base-shadow-color, .65) 24px, rgba($base-shadow-color, .8));
background-image: linear-gradient(
to bottom,
rgba($base-shadow-color, 0.75),
rgba($base-shadow-color, 0.65) 24px,
rgba($base-shadow-color, 0.8)
);
pointer-events: none;
content: "";
content: '';
}
.display-name:hover .display-name__html {
@@ -397,25 +418,34 @@
padding-top: 0;
&:after {
content: "";
content: '';
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
background: linear-gradient(rgba($ui-base-color, 0), rgba($ui-base-color, 1));
background: linear-gradient(
rgba($ui-base-color, 0),
rgba($ui-base-color, 1)
);
pointer-events: none;
}
a:hover {
text-decoration: none;
}
}
&:focus > .status__content:after {
background: linear-gradient(rgba(lighten($ui-base-color, 4%), 0), rgba(lighten($ui-base-color, 4%), 1));
background: linear-gradient(
rgba(lighten($ui-base-color, 4%), 0),
rgba(lighten($ui-base-color, 4%), 1)
);
}
&.status-direct > .status__content:after {
background: linear-gradient(rgba(lighten($ui-base-color, 8%), 0), rgba(lighten($ui-base-color, 8%), 1));
background: linear-gradient(
rgba(lighten($ui-base-color, 8%), 0),
rgba(lighten($ui-base-color, 8%), 1)
);
}
.notification__message {
@@ -832,7 +862,8 @@ a.status__display-name,
bottom: -1px;
}
a .fa, a:hover .fa {
a .fa,
a:hover .fa {
color: inherit;
}
}
@@ -850,9 +881,9 @@ a.status-card {
cursor: zoom-in;
display: block;
text-decoration: none;
width: 100%;
height: auto;
margin: 0;
width: 100%;
height: auto;
margin: 0;
}
.status-card-video {
@@ -1063,7 +1094,7 @@ a.status-card.compact:hover {
&.unread {
&::before {
content: "";
content: '';
position: absolute;
top: 0;
left: 0;
@@ -18,5 +18,5 @@ $highlight-text-color: lighten($ui-highlight-color, 10%) !default;
$action-button-color: lighten($ui-base-color, 50%);
$inverted-text-color: $black !default;
$lighter-text-color: darken($ui-base-color,6%) !default;
$lighter-text-color: darken($ui-base-color, 6%) !default;
$light-text-color: darken($ui-primary-color, 40%) !default;
@@ -300,7 +300,7 @@ code {
max-width: 100%;
height: auto;
border-radius: 4px;
background: url("images/void.png");
background: url('images/void.png');
&:last-child {
margin-bottom: 0;
@@ -385,7 +385,7 @@ code {
flex: 1 1 auto;
}
input[type=checkbox] {
input[type='checkbox'] {
position: absolute;
left: 0;
top: 5px;
@@ -401,12 +401,12 @@ code {
border-radius: 4px;
}
input[type=text],
input[type=number],
input[type=email],
input[type=password],
input[type=url],
input[type=datetime-local],
input[type='text'],
input[type='number'],
input[type='email'],
input[type='password'],
input[type='url'],
input[type='datetime-local'],
textarea {
box-sizing: border-box;
font-size: 16px;
@@ -444,11 +444,11 @@ code {
}
}
input[type=text],
input[type=number],
input[type=email],
input[type=password],
input[type=datetime-local] {
input[type='text'],
input[type='number'],
input[type='email'],
input[type='password'],
input[type='datetime-local'] {
&:focus:invalid:not(:placeholder-shown),
&:required:invalid:not(:placeholder-shown) {
border-color: lighten($error-red, 12%);
@@ -460,11 +460,11 @@ code {
color: lighten($error-red, 12%);
}
input[type=text],
input[type=number],
input[type=email],
input[type=password],
input[type=datetime-local],
input[type='text'],
input[type='number'],
input[type='email'],
input[type='password'],
input[type='datetime-local'],
textarea,
select {
border-color: lighten($error-red, 12%);
@@ -568,7 +568,9 @@ code {
outline: 0;
font-family: inherit;
resize: vertical;
background: darken($ui-base-color, 10%) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 12%))}'/></svg>") no-repeat right 8px center / auto 16px;
background: darken($ui-base-color, 10%)
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 12%))}'/></svg>")
no-repeat right 8px center / auto 16px;
border: 1px solid darken($ui-base-color, 14%);
border-radius: 4px;
padding-left: 10px;
@@ -608,7 +610,11 @@ code {
right: 0;
bottom: 1px;
width: 5px;
background-image: linear-gradient(to right, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));
background-image: linear-gradient(
to right,
rgba(darken($ui-base-color, 10%), 0),
darken($ui-base-color, 10%)
);
}
}
}
@@ -996,7 +1002,7 @@ code {
flex: 1 1 auto;
}
input[type=text] {
input[type='text'] {
background: transparent;
border: 0;
padding: 10px;
@@ -152,7 +152,7 @@ html {
}
.compose-form__autosuggest-wrapper,
.poll__option input[type="text"],
.poll__option input[type='text'],
.compose-form .spoiler-input__input,
.compose-form__poll-wrapper select,
.search__input,
@@ -179,7 +179,9 @@ html {
}
.compose-form__poll-wrapper select {
background: $simple-background-color url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 8%))}'/></svg>") no-repeat right 8px center / auto 16px;
background: $simple-background-color
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 8%))}'/></svg>")
no-repeat right 8px center / auto 16px;
}
.compose-form__poll-wrapper,
@@ -205,7 +207,9 @@ html {
}
.drawer__inner__mastodon {
background: $white url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-color)}"/></svg>') no-repeat bottom / 100% auto;
background: $white
url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-color)}"/></svg>')
no-repeat bottom / 100% auto;
}
// Change the colors used in compose-form
@@ -332,11 +336,13 @@ html {
color: $white;
}
.language-dropdown__dropdown__results__item .language-dropdown__dropdown__results__item__common-name {
.language-dropdown__dropdown__results__item
.language-dropdown__dropdown__results__item__common-name {
color: lighten($ui-base-color, 8%);
}
.language-dropdown__dropdown__results__item.active .language-dropdown__dropdown__results__item__common-name {
.language-dropdown__dropdown__results__item.active
.language-dropdown__dropdown__results__item__common-name {
color: darken($ui-base-color, 12%);
}
@@ -490,7 +496,8 @@ html {
background: darken($ui-secondary-color, 10%);
}
.react-toggle.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track {
.react-toggle.react-toggle--checked:hover:not(.react-toggle--disabled)
.react-toggle-track {
background: lighten($ui-highlight-color, 10%);
}
@@ -522,10 +529,10 @@ html {
}
.simple_form {
input[type="text"],
input[type="number"],
input[type="email"],
input[type="password"],
input[type='text'],
input[type='number'],
input[type='email'],
input[type='password'],
textarea {
&:hover {
border-color: lighten($ui-base-color, 12%);
@@ -682,7 +689,9 @@ html {
.mute-modal select {
border: 1px solid lighten($ui-base-color, 8%);
background: $simple-background-color url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 8%))}'/></svg>") no-repeat right 8px center / auto 16px;
background: $simple-background-color
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 8%))}'/></svg>")
no-repeat right 8px center / auto 16px;
}
// Glitch-soc-specific changes
@@ -729,7 +738,8 @@ html {
color: $white;
}
&.close, &.close:hover {
&.close,
&.close:hover {
background: $error-value-color;
color: $primary-text-color;
}
@@ -746,11 +756,16 @@ html {
}
.status.collapsed .status__content:after {
background: linear-gradient(rgba(darken($ui-base-color, 13%), 0), rgba(darken($ui-base-color, 13%), 1));
background: linear-gradient(
rgba(darken($ui-base-color, 13%), 0),
rgba(darken($ui-base-color, 13%), 1)
);
}
.drawer__inner__mastodon {
background: $white url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-color)}"/></svg>') no-repeat bottom / 100% auto !important;
background: $white
url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-color)}"/></svg>')
no-repeat bottom / 100% auto !important;
.mastodon {
filter: contrast(75%) brightness(75%) !important;
@@ -1,5 +1,7 @@
.modal-layout {
background: $ui-base-color url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-lighter-color)}33"/></svg>') repeat-x bottom fixed;
background: $ui-base-color
url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-lighter-color)}33"/></svg>')
repeat-x bottom fixed;
display: flex;
flex-direction: column;
height: 100vh;
@@ -70,8 +70,8 @@
max-width: calc(100% - 45px - 25px);
}
input[type=radio],
input[type=checkbox] {
input[type='radio'],
input[type='checkbox'] {
display: none;
}
@@ -79,7 +79,7 @@
flex: 1 1 auto;
}
input[type=text] {
input[type='text'] {
display: block;
box-sizing: border-box;
width: 100%;
@@ -205,7 +205,7 @@
&:active,
&:focus {
background-color: rgba($dark-text-color, .1);
background-color: rgba($dark-text-color, 0.1);
}
}
@@ -273,7 +273,9 @@
width: auto;
outline: 0;
font-family: inherit;
background: $simple-background-color url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(darken($simple-background-color, 14%))}'/></svg>") no-repeat right 8px center / auto 16px;
background: $simple-background-color
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(darken($simple-background-color, 14%))}'/></svg>")
no-repeat right 8px center / auto 16px;
border: 1px solid darken($simple-background-color, 14%);
border-radius: 4px;
padding: 6px 10px;
+12 -6
View File
@@ -255,8 +255,8 @@ body.rtl {
padding-right: 0;
}
.simple_form .check_boxes .checkbox input[type="checkbox"],
.simple_form .input.boolean input[type="checkbox"] {
.simple_form .check_boxes .checkbox input[type='checkbox'],
.simple_form .input.boolean input[type='checkbox'] {
left: auto;
right: 0;
}
@@ -294,12 +294,18 @@ body.rtl {
&::after {
right: auto;
left: 0;
background-image: linear-gradient(to left, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));
background-image: linear-gradient(
to left,
rgba(darken($ui-base-color, 10%), 0),
darken($ui-base-color, 10%)
);
}
}
.simple_form select {
background: darken($ui-base-color, 10%) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 12%))}'/></svg>") no-repeat left 8px center / auto 16px;
background: darken($ui-base-color, 10%)
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 12%))}'/></svg>")
no-repeat left 8px center / auto 16px;
}
.table th,
@@ -346,11 +352,11 @@ body.rtl {
}
.fa-chevron-left::before {
content: "\F054";
content: '\F054';
}
.fa-chevron-right::before {
content: "\F053";
content: '\F053';
}
.column-back-button__icon {
@@ -134,7 +134,7 @@ a.button.logo-button {
}
.embed {
.status__content[data-spoiler=folded] {
.status__content[data-spoiler='folded'] {
.e-content {
display: none;
}
@@ -1,18 +1,18 @@
// Commonly used web colors
$black: #000000; // Black
$white: #ffffff; // White
$success-green: #79bd9a; // Padua
$error-red: #df405a; // Cerise
$warning-red: #ff5050; // Sunset Orange
$gold-star: #ca8f04; // Dark Goldenrod
$black: #000000; // Black
$white: #ffffff; // White
$success-green: #79bd9a; // Padua
$error-red: #df405a; // Cerise
$warning-red: #ff5050; // Sunset Orange
$gold-star: #ca8f04; // Dark Goldenrod
$red-bookmark: $warning-red;
// Values from the classic Mastodon UI
$classic-base-color: #282c37; // Midnight Express
$classic-primary-color: #9baec8; // Echo Blue
$classic-secondary-color: #d9e1e8; // Pattens Blue
$classic-highlight-color: #6364ff; // Brand purple
$classic-base-color: #282c37; // Midnight Express
$classic-primary-color: #9baec8; // Echo Blue
$classic-secondary-color: #d9e1e8; // Pattens Blue
$classic-highlight-color: #6364ff; // Brand purple
// Variables for defaults in UI
$base-shadow-color: $black !default;
@@ -23,10 +23,13 @@ $valid-value-color: $success-green !default;
$error-value-color: $error-red !default;
// Tell UI to use selected colors
$ui-base-color: $classic-base-color !default; // Darkest
$ui-base-lighter-color: lighten($ui-base-color, 26%) !default; // Lighter darkest
$ui-primary-color: $classic-primary-color !default; // Lighter
$ui-secondary-color: $classic-secondary-color !default; // Lightest
$ui-base-color: $classic-base-color !default; // Darkest
$ui-base-lighter-color: lighten(
$ui-base-color,
26%
) !default; // Lighter darkest
$ui-primary-color: $classic-primary-color !default; // Lighter
$ui-secondary-color: $classic-secondary-color !default; // Lightest
$ui-highlight-color: $classic-highlight-color !default;
// Variables for texts
@@ -1,4 +1,4 @@
@use "sass:math";
@use 'sass:math';
.hero-widget {
margin-bottom: 10px;
@@ -1,6 +1,6 @@
export function recoverHashtags (recognizedTags, text) {
return recognizedTags.map(tag => {
const re = new RegExp(`(?:^|[^\/)\w])#(${tag.name})`, 'i');
const re = new RegExp(`(?:^|[^/)\w])#(${tag.name})`, 'i');
const matched_hashtag = text.match(re);
return matched_hashtag ? matched_hashtag[1] : null;
},
@@ -8,7 +8,7 @@ import { me } from '../../initial_state';
const urlBase64ToUint8Array = (base64String) => {
const padding = '='.repeat((4 - base64String.length % 4) % 4);
const base64 = (base64String + padding)
.replace(/\-/g, '+')
.replace(/-/g, '+')
.replace(/_/g, '/');
return decodeBase64(base64);
+1 -1
View File
@@ -511,7 +511,7 @@ class Status extends ImmutablePureComponent {
<div className={classNames('status', `status-${status.get('visibility')}`, { 'status-reply': !!status.get('in_reply_to_id'), muted: this.props.muted })} data-id={status.get('id')}>
<div className='status__info'>
<a onClick={this.handleClick} href={`/@${status.getIn(['account', 'acct'])}\/${status.get('id')}`} className='status__relative-time' target='_blank' rel='noopener noreferrer'>
<a onClick={this.handleClick} href={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`} className='status__relative-time' target='_blank' rel='noopener noreferrer'>
<span className='status__visibility-icon'><Icon id={visibilityIcon.icon} title={visibilityIcon.text} /></span>
<RelativeTimestamp timestamp={status.get('created_at')} />{status.get('edited_at') && <abbr title={intl.formatMessage(messages.edited, { date: intl.formatDate(status.get('edited_at'), { hour12: false, year: 'numeric', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }) })}> *</abbr>}
</a>
@@ -130,7 +130,7 @@ export default class MediaItem extends ImmutablePureComponent {
return (
<div className='account-gallery__item' style={{ width, height }}>
<a className='media-gallery__item-thumbnail' href={`/@${status.getIn(['account', 'acct'])}\/${status.get('id')}`} onClick={this.handleClick} title={title} target='_blank' rel='noopener noreferrer'>
<a className='media-gallery__item-thumbnail' href={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`} onClick={this.handleClick} title={title} target='_blank' rel='noopener noreferrer'>
<Blurhash
hash={attachment.get('blurhash')}
className={classNames('media-gallery__preview', { 'media-gallery__preview--hidden': visible && loaded })}
@@ -1,12 +1,10 @@
import React from 'react';
import PropTypes from 'prop-types';
import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
import { formatTime } from 'mastodon/features/video';
import { formatTime, getPointerPosition, fileNameFromURL } from 'mastodon/features/video';
import Icon from 'mastodon/components/icon';
import classNames from 'classnames';
import { throttle } from 'lodash';
import { getPointerPosition, fileNameFromURL } from 'mastodon/features/video';
import { debounce } from 'lodash';
import { throttle, debounce } from 'lodash';
import Visualizer from './visualizer';
import { displayMedia, useBlurhash } from '../../initial_state';
import Blurhash from '../../components/blurhash';
@@ -1,7 +1,10 @@
import { connect } from 'react-redux';
import PollForm from '../components/poll_form';
import { addPollOption, removePollOption, changePollOption, changePollSettings } from '../../../actions/compose';
import {
addPollOption,
removePollOption,
changePollOption,
changePollSettings,
clearComposeSuggestions,
fetchComposeSuggestions,
selectComposeSuggestion,
@@ -1,7 +1,6 @@
import { connect } from 'react-redux';
import Upload from '../components/upload';
import { undoUploadCompose, initMediaEditModal } from '../../../actions/compose';
import { submitCompose } from '../../../actions/compose';
import { undoUploadCompose, initMediaEditModal, submitCompose } from '../../../actions/compose';
const mapStateToProps = (state, { id }) => ({
media: state.getIn(['compose', 'media_attachments']).find(item => item.get('id') === id),
@@ -24,7 +24,7 @@ const buildHashtagRE = () => {
'))', 'iu',
);
} catch {
return /(?:^|[^\/\)\w])#(\w*[a-zA-Z·]\w*)/i;
return /(?:^|[^/)\w])#(\w*[a-zA-Z·]\w*)/i;
}
};
@@ -5,5 +5,5 @@ const urlPlaceholder = '$2xxxxxxxxxxxxxxxxxxxxxxx';
export function countableText(inputText) {
return inputText
.replace(urlRegex, urlPlaceholder)
.replace(/(^|[^\/\w])@(([a-z0-9_]+)@[a-z0-9\.\-]+[a-z0-9]+)/ig, '$1@$3');
.replace(/(^|[^/\w])@(([a-z0-9_]+)@[a-z0-9.-]+[a-z0-9]+)/ig, '$1@$3');
}
@@ -73,7 +73,7 @@ const stringFromCodePoint = _String.fromCodePoint || function () {
const _JSON = JSON;
const COLONS_REGEX = /^(?:\:([^\:]+)\:)(?:\:skin-tone-(\d)\:)?$/;
const COLONS_REGEX = /^(?::([^:]+):)(?::skin-tone-(\d):)?$/;
const SKINS = [
'1F3FA', '1F3FB', '1F3FC',
'1F3FD', '1F3FE', '1F3FF',
@@ -27,7 +27,7 @@ const makeMapStateToProps = () => {
};
const getFirstSentence = str => {
const arr = str.split(/(([\.\?!]+\s)|[.。?!\n•])/);
const arr = str.split(/(([.?!]+\s)|[.。?!\n•])/);
return arr[0];
};
@@ -6,9 +6,8 @@ import PropTypes from 'prop-types';
import IconButton from 'mastodon/components/icon_button';
import Icon from 'mastodon/components/icon';
import { defineMessages, injectIntl, FormattedMessage, FormattedDate } from 'react-intl';
import { autoPlayGif, reduceMotion, disableSwiping } from 'mastodon/initial_state';
import { autoPlayGif, reduceMotion, disableSwiping, mascot } from 'mastodon/initial_state';
import elephantUIPlane from 'mastodon/../images/elephant_ui_plane.svg';
import { mascot } from 'mastodon/initial_state';
import unicodeMapping from 'mastodon/features/emoji/emoji_unicode_mapping_light';
import classNames from 'classnames';
import EmojiPickerDropdown from 'mastodon/features/compose/containers/emoji_picker_dropdown_container';
@@ -2,8 +2,7 @@ import { connect } from 'react-redux';
import { defineMessages, injectIntl } from 'react-intl';
import ColumnSettings from '../components/column_settings';
import { changeSetting } from '../../../actions/settings';
import { setFilter } from '../../../actions/notifications';
import { clearNotifications, requestBrowserPermission } from '../../../actions/notifications';
import { setFilter, clearNotifications, requestBrowserPermission } from '../../../actions/notifications';
import { changeAlerts as changePushNotifications } from '../../../actions/push_notifications';
import { openModal } from '../../../actions/modal';
import { showAlert } from '../../../actions/alerts';
@@ -184,7 +184,7 @@ class Footer extends ImmutablePureComponent {
<IconButton className='status__action-bar-button' title={replyTitle} icon={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? 'reply' : replyIcon} onClick={this.handleReplyClick} counter={status.get('replies_count')} obfuscateCount />
<IconButton className={classNames('status__action-bar-button', { reblogPrivate })} disabled={!publicStatus && !reblogPrivate} active={status.get('reblogged')} title={reblogTitle} icon='retweet' onClick={this.handleReblogClick} counter={status.get('reblogs_count')} />
<IconButton className='status__action-bar-button star-icon' animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} counter={status.get('favourites_count')} />
{withOpenButton && <IconButton className='status__action-bar-button' title={intl.formatMessage(messages.open)} icon='external-link' onClick={this.handleOpenClick} href={`/@${status.getIn(['account', 'acct'])}\/${status.get('id')}`} />}
{withOpenButton && <IconButton className='status__action-bar-button' title={intl.formatMessage(messages.open)} icon='external-link' onClick={this.handleOpenClick} href={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`} />}
</div>
);
}
@@ -276,7 +276,7 @@ class DetailedStatus extends ImmutablePureComponent {
{media}
<div className='detailed-status__meta'>
<a className='detailed-status__datetime' href={`/@${status.getIn(['account', 'acct'])}\/${status.get('id')}`} target='_blank' rel='noopener noreferrer'>
<a className='detailed-status__datetime' href={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`} target='_blank' rel='noopener noreferrer'>
<FormattedDate value={new Date(status.get('created_at'))} hour12={false} year='numeric' month='short' day='2-digit' hour='2-digit' minute='2-digit' />
</a>{edited}{visibilityLink}{applicationLink}{reblogLink} · {favouriteLink}
</div>
@@ -5,7 +5,17 @@ import PropTypes from 'prop-types';
import classNames from 'classnames';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { createSelector } from 'reselect';
import { fetchStatus } from '../../actions/statuses';
import {
fetchStatus,
muteStatus,
unmuteStatus,
deleteStatus,
editStatus,
hideStatus,
revealStatus,
translateStatus,
undoStatusTranslation,
} from '../../actions/statuses';
import MissingIndicator from '../../components/missing_indicator';
import LoadingIndicator from 'mastodon/components/loading_indicator';
import DetailedStatus from './components/detailed_status';
@@ -26,16 +36,6 @@ import {
mentionCompose,
directCompose,
} from '../../actions/compose';
import {
muteStatus,
unmuteStatus,
deleteStatus,
editStatus,
hideStatus,
revealStatus,
translateStatus,
undoStatusTranslation,
} from '../../actions/statuses';
import {
unblockAccount,
unmuteAccount,
@@ -98,7 +98,7 @@ class BoostModal extends ImmutablePureComponent {
<div className='boost-modal__container'>
<div className={classNames('status', `status-${status.get('visibility')}`, 'light')}>
<div className='status__info'>
<a href={`/@${status.getIn(['account', 'acct'])}\/${status.get('id')}`} className='status__relative-time' target='_blank' rel='noopener noreferrer'>
<a href={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`} className='status__relative-time' target='_blank' rel='noopener noreferrer'>
<span className='status__visibility-icon'><Icon id={visibilityIcon.icon} title={visibilityIcon.text} /></span>
<RelativeTimestamp timestamp={status.get('created_at')} />
</a>
+7 -4
View File
@@ -186,11 +186,12 @@ const ignoreSuggestion = (state, position, token, completion, path) => {
};
const sortHashtagsByUse = (state, tags) => {
const personalHistory = state.get('tagHistory');
const personalHistory = state.get('tagHistory').map(tag => tag.toLowerCase());
return tags.sort((a, b) => {
const usedA = personalHistory.includes(a.name);
const usedB = personalHistory.includes(b.name);
const tagsWithLowercase = tags.map(t => ({ ...t, lowerName: t.name.toLowerCase() }));
const sorted = tagsWithLowercase.sort((a, b) => {
const usedA = personalHistory.includes(a.lowerName);
const usedB = personalHistory.includes(b.lowerName);
if (usedA === usedB) {
return 0;
@@ -200,6 +201,8 @@ const sortHashtagsByUse = (state, tags) => {
return 1;
}
});
sorted.forEach(tag => delete tag.lowerName);
return sorted;
};
const insertEmoji = (state, position, emojiData, needsSpace) => {
+5 -4
View File
@@ -1,11 +1,12 @@
@font-face {
font-family: mastodon-font-monospace;
src:
local('Roboto Mono'),
src: local('Roboto Mono'),
url('~fonts/roboto-mono/robotomono-regular-webfont.woff2') format('woff2'),
url('~fonts/roboto-mono/robotomono-regular-webfont.woff') format('woff'),
url('~fonts/roboto-mono/robotomono-regular-webfont.ttf') format('truetype'),
url('~fonts/roboto-mono/robotomono-regular-webfont.svg#roboto_monoregular') format('svg');
url('~fonts/roboto-mono/robotomono-regular-webfont.ttf')
format('truetype'),
url('~fonts/roboto-mono/robotomono-regular-webfont.svg#roboto_monoregular')
format('svg');
font-weight: 400;
font-display: swap;
font-style: normal;
+12 -12
View File
@@ -1,11 +1,11 @@
@font-face {
font-family: mastodon-font-sans-serif;
src:
local('Roboto Italic'),
src: local('Roboto Italic'),
url('~fonts/roboto/roboto-italic-webfont.woff2') format('woff2'),
url('~fonts/roboto/roboto-italic-webfont.woff') format('woff'),
url('~fonts/roboto/roboto-italic-webfont.ttf') format('truetype'),
url('~fonts/roboto/roboto-italic-webfont.svg#roboto-italic-webfont') format('svg');
url('~fonts/roboto/roboto-italic-webfont.svg#roboto-italic-webfont')
format('svg');
font-weight: normal;
font-display: swap;
font-style: italic;
@@ -13,12 +13,12 @@
@font-face {
font-family: mastodon-font-sans-serif;
src:
local('Roboto Bold'),
src: local('Roboto Bold'),
url('~fonts/roboto/roboto-bold-webfont.woff2') format('woff2'),
url('~fonts/roboto/roboto-bold-webfont.woff') format('woff'),
url('~fonts/roboto/roboto-bold-webfont.ttf') format('truetype'),
url('~fonts/roboto/roboto-bold-webfont.svg#roboto-bold-webfont') format('svg');
url('~fonts/roboto/roboto-bold-webfont.svg#roboto-bold-webfont')
format('svg');
font-weight: bold;
font-display: swap;
font-style: normal;
@@ -26,12 +26,12 @@
@font-face {
font-family: mastodon-font-sans-serif;
src:
local('Roboto Medium'),
src: local('Roboto Medium'),
url('~fonts/roboto/roboto-medium-webfont.woff2') format('woff2'),
url('~fonts/roboto/roboto-medium-webfont.woff') format('woff'),
url('~fonts/roboto/roboto-medium-webfont.ttf') format('truetype'),
url('~fonts/roboto/roboto-medium-webfont.svg#roboto-medium-webfont') format('svg');
url('~fonts/roboto/roboto-medium-webfont.svg#roboto-medium-webfont')
format('svg');
font-weight: 500;
font-display: swap;
font-style: normal;
@@ -39,12 +39,12 @@
@font-face {
font-family: mastodon-font-sans-serif;
src:
local('Roboto'),
src: local('Roboto'),
url('~fonts/roboto/roboto-regular-webfont.woff2') format('woff2'),
url('~fonts/roboto/roboto-regular-webfont.woff') format('woff'),
url('~fonts/roboto/roboto-regular-webfont.ttf') format('truetype'),
url('~fonts/roboto/roboto-regular-webfont.svg#roboto-regular-webfont') format('svg');
url('~fonts/roboto/roboto-regular-webfont.svg#roboto-regular-webfont')
format('svg');
font-weight: normal;
font-display: swap;
font-style: normal;
+20 -11
View File
@@ -152,7 +152,7 @@ html {
}
.compose-form__autosuggest-wrapper,
.poll__option input[type="text"],
.poll__option input[type='text'],
.compose-form .spoiler-input__input,
.compose-form__poll-wrapper select,
.search__input,
@@ -179,7 +179,9 @@ html {
}
.compose-form__poll-wrapper select {
background: $simple-background-color url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 8%))}'/></svg>") no-repeat right 8px center / auto 16px;
background: $simple-background-color
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 8%))}'/></svg>")
no-repeat right 8px center / auto 16px;
}
.compose-form__poll-wrapper,
@@ -205,7 +207,9 @@ html {
}
.drawer__inner__mastodon {
background: $white url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-color)}"/></svg>') no-repeat bottom / 100% auto;
background: $white
url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-color)}"/></svg>')
no-repeat bottom / 100% auto;
}
// Change the colors used in compose-form
@@ -332,11 +336,13 @@ html {
color: $white;
}
.language-dropdown__dropdown__results__item .language-dropdown__dropdown__results__item__common-name {
.language-dropdown__dropdown__results__item
.language-dropdown__dropdown__results__item__common-name {
color: lighten($ui-base-color, 8%);
}
.language-dropdown__dropdown__results__item.active .language-dropdown__dropdown__results__item__common-name {
.language-dropdown__dropdown__results__item.active
.language-dropdown__dropdown__results__item__common-name {
color: darken($ui-base-color, 12%);
}
@@ -490,7 +496,8 @@ html {
background: darken($ui-secondary-color, 10%);
}
.react-toggle.react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track {
.react-toggle.react-toggle--checked:hover:not(.react-toggle--disabled)
.react-toggle-track {
background: lighten($ui-highlight-color, 10%);
}
@@ -522,10 +529,10 @@ html {
}
.simple_form {
input[type="text"],
input[type="number"],
input[type="email"],
input[type="password"],
input[type='text'],
input[type='number'],
input[type='email'],
input[type='password'],
textarea {
&:hover {
border-color: lighten($ui-base-color, 12%);
@@ -682,5 +689,7 @@ html {
.mute-modal select {
border: 1px solid lighten($ui-base-color, 8%);
background: $simple-background-color url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 8%))}'/></svg>") no-repeat right 8px center / auto 16px;
background: $simple-background-color
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 8%))}'/></svg>")
no-repeat right 8px center / auto 16px;
}
@@ -1,4 +1,7 @@
$emojis-requiring-inversion: 'back' 'copyright' 'curly_loop' 'currency_exchange' 'end' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'on' 'registered' 'soon' 'spider' 'telephone_receiver' 'tm' 'top' 'wavy_dash' !default;
$emojis-requiring-inversion: 'back' 'copyright' 'curly_loop' 'currency_exchange'
'end' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign'
'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'on'
'registered' 'soon' 'spider' 'telephone_receiver' 'tm' 'top' 'wavy_dash' !default;
%emoji-color-inversion {
filter: invert(1);
+17 -6
View File
@@ -1,4 +1,4 @@
@use "sass:math";
@use 'sass:math';
$no-columns-breakpoint: 600px;
$sidebar-width: 240px;
@@ -1147,7 +1147,10 @@ a.name-tag,
@for $i from 0 through 10 {
&--#{10 * $i} {
background-color: rgba($ui-highlight-color, 1 * (math.div(max(1, $i), 10)));
background-color: rgba(
$ui-highlight-color,
1 * (math.div(max(1, $i), 10))
);
}
}
}
@@ -1236,7 +1239,12 @@ a.sparkline {
.skeleton {
background-color: lighten($ui-base-color, 8%);
background-image: linear-gradient(90deg, lighten($ui-base-color, 8%), lighten($ui-base-color, 12%), lighten($ui-base-color, 8%));
background-image: linear-gradient(
90deg,
lighten($ui-base-color, 8%),
lighten($ui-base-color, 12%),
lighten($ui-base-color, 8%)
);
background-size: 200px 100%;
background-repeat: no-repeat;
border-radius: 4px;
@@ -1285,7 +1293,10 @@ a.sparkline {
@for $i from 0 through 10 {
&--#{10 * $i} {
background-color: rgba($ui-highlight-color, 1 * (math.div(max(1, $i), 10)));
background-color: rgba(
$ui-highlight-color,
1 * (math.div(max(1, $i), 10))
);
}
}
}
@@ -1431,7 +1442,7 @@ a.sparkline {
&::after {
display: block;
content: "";
content: '';
width: 50px;
height: 21px;
position: absolute;
@@ -1825,7 +1836,7 @@ a.sparkline {
&::after {
position: absolute;
content: "";
content: '';
width: 1px;
background: $highlight-text-color;
bottom: 0;
+4 -2
View File
@@ -14,7 +14,7 @@ body {
font-weight: 400;
color: $primary-text-color;
text-rendering: optimizelegibility;
font-feature-settings: "kern";
font-feature-settings: 'kern';
text-size-adjust: none;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0%);
-webkit-tap-highlight-color: transparent;
@@ -31,7 +31,9 @@ body {
// Droid Sans => Older Androids (<4.0)
// Helvetica Neue => Older macOS <10.11
// $font-sans-serif => web-font (Roboto) fallback and newer Androids (>=4.0)
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", $font-sans-serif, sans-serif;
font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
Oxygen, Ubuntu, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
$font-sans-serif, sans-serif;
}
&.app-body {
+88 -38
View File
@@ -387,7 +387,7 @@ body > [data-popper-placement] {
.ellipsis {
&::after {
content: "";
content: '';
}
}
@@ -404,7 +404,7 @@ body > [data-popper-placement] {
color: $highlight-text-color;
}
input[type="checkbox"] {
input[type='checkbox'] {
display: none;
}
@@ -423,7 +423,9 @@ body > [data-popper-placement] {
&.active {
border-color: $highlight-text-color;
background: $highlight-text-color url("data:image/svg+xml;utf8,<svg width='18' height='18' fill='none' xmlns='http://www.w3.org/2000/svg'><path d='M4.5 8.5L8 12l6-6' stroke='white' stroke-width='1.5'/></svg>") center center no-repeat;
background: $highlight-text-color
url("data:image/svg+xml;utf8,<svg width='18' height='18' fill='none' xmlns='http://www.w3.org/2000/svg'><path d='M4.5 8.5L8 12l6-6' stroke='white' stroke-width='1.5'/></svg>")
center center no-repeat;
}
}
}
@@ -647,7 +649,12 @@ body > [data-popper-placement] {
margin: 5px;
&__actions {
background: linear-gradient(180deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);
background: linear-gradient(
180deg,
rgba($base-shadow-color, 0.8) 0,
rgba($base-shadow-color, 0.35) 80%,
transparent
);
display: flex;
align-items: flex-start;
justify-content: space-between;
@@ -675,7 +682,12 @@ body > [data-popper-placement] {
left: 0;
right: 0;
box-sizing: border-box;
background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);
background: linear-gradient(
0deg,
rgba($base-shadow-color, 0.8) 0,
rgba($base-shadow-color, 0.35) 80%,
transparent
);
}
}
@@ -1080,8 +1092,13 @@ body > [data-popper-placement] {
cursor: auto;
@keyframes fade {
0% { opacity: 0; }
100% { opacity: 1; }
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
opacity: 1;
@@ -1827,11 +1844,11 @@ a.account__display-name {
justify-content: center;
flex-direction: column;
scrollbar-width: none; /* Firefox */
-ms-overflow-style: none; /* IE 10+ */
-ms-overflow-style: none; /* IE 10+ */
* {
scrollbar-width: none; /* Firefox */
-ms-overflow-style: none; /* IE 10+ */
-ms-overflow-style: none; /* IE 10+ */
}
&::-webkit-scrollbar,
@@ -2863,7 +2880,9 @@ $ui-header-height: 55px;
}
.drawer__inner__mastodon {
background: lighten($ui-base-color, 13%) url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-color)}"/></svg>') no-repeat bottom / 100% auto;
background: lighten($ui-base-color, 13%)
url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-color)}"/></svg>')
no-repeat bottom / 100% auto;
flex: 1;
min-height: 47px;
display: none;
@@ -2918,7 +2937,8 @@ $ui-header-height: 55px;
overflow-y: auto;
}
@supports (display: grid) { // hack to fix Chrome <57
@supports (display: grid) {
// hack to fix Chrome <57
contain: strict;
}
@@ -2939,7 +2959,8 @@ $ui-header-height: 55px;
}
.scrollable.fullscreen {
@supports (display: grid) { // hack to fix Chrome <57
@supports (display: grid) {
// hack to fix Chrome <57
contain: none;
}
}
@@ -3043,7 +3064,8 @@ $ui-header-height: 55px;
transition: background-color 0.2s ease;
}
.react-toggle:is(:hover, :focus-within):not(.react-toggle--disabled) .react-toggle-track {
.react-toggle:is(:hover, :focus-within):not(.react-toggle--disabled)
.react-toggle-track {
background-color: darken($ui-base-color, 10%);
}
@@ -3051,7 +3073,8 @@ $ui-header-height: 55px;
background-color: darken($ui-highlight-color, 2%);
}
.react-toggle--checked:is(:hover, :focus-within):not(.react-toggle--disabled) .react-toggle-track {
.react-toggle--checked:is(:hover, :focus-within):not(.react-toggle--disabled)
.react-toggle-track {
background-color: $ui-highlight-color;
}
@@ -3646,7 +3669,7 @@ a.status-card.compact:hover {
&::before {
display: block;
content: "";
content: '';
position: absolute;
bottom: -13px;
left: 0;
@@ -3656,7 +3679,11 @@ a.status-card.compact:hover {
pointer-events: none;
height: 28px;
z-index: 1;
background: radial-gradient(ellipse, rgba($ui-highlight-color, 0.23) 0%, rgba($ui-highlight-color, 0) 60%);
background: radial-gradient(
ellipse,
rgba($ui-highlight-color, 0.23) 0%,
rgba($ui-highlight-color, 0) 60%
);
}
}
@@ -4241,7 +4268,8 @@ a.status-card.compact:hover {
align-items: center;
justify-content: center;
@supports (display: grid) { // hack to fix Chrome <57
@supports (display: grid) {
// hack to fix Chrome <57
contain: strict;
}
@@ -5747,7 +5775,9 @@ a.status-card.compact:hover {
width: auto;
outline: 0;
font-family: inherit;
background: $simple-background-color url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(darken($simple-background-color, 14%))}'/></svg>") no-repeat right 8px center / auto 16px;
background: $simple-background-color
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(darken($simple-background-color, 14%))}'/></svg>")
no-repeat right 8px center / auto 16px;
border: 1px solid darken($simple-background-color, 14%);
border-radius: 4px;
padding: 6px 10px;
@@ -6154,7 +6184,12 @@ a.status-card.compact:hover {
left: 0;
right: 0;
box-sizing: border-box;
background: linear-gradient(0deg, rgba($base-shadow-color, 0.85) 0, rgba($base-shadow-color, 0.45) 60%, transparent);
background: linear-gradient(
0deg,
rgba($base-shadow-color, 0.85) 0,
rgba($base-shadow-color, 0.45) 60%,
transparent
);
padding: 0 15px;
opacity: 0;
transition: opacity 0.1s ease;
@@ -6295,7 +6330,7 @@ a.status-card.compact:hover {
}
&::before {
content: "";
content: '';
width: 50px;
background: rgba($white, 0.35);
border-radius: 4px;
@@ -6365,7 +6400,7 @@ a.status-card.compact:hover {
position: relative;
&::before {
content: "";
content: '';
width: 100%;
background: rgba($white, 0.35);
border-radius: 4px;
@@ -6448,7 +6483,11 @@ a.status-card.compact:hover {
}
.scrollable .account-card__bio::after {
background: linear-gradient(to left, lighten($ui-base-color, 8%), transparent);
background: linear-gradient(
to left,
lighten($ui-base-color, 8%),
transparent
);
}
.account-gallery__container {
@@ -6509,7 +6548,7 @@ a.status-card.compact:hover {
&::before,
&::after {
display: block;
content: "";
content: '';
position: absolute;
bottom: 0;
left: 50%;
@@ -6575,8 +6614,8 @@ a.status-card.compact:hover {
text-overflow: ellipsis;
cursor: pointer;
input[type="radio"],
input[type="checkbox"] {
input[type='radio'],
input[type='checkbox'] {
display: none;
}
@@ -6635,9 +6674,17 @@ noscript {
}
@keyframes flicker {
0% { opacity: 1; }
30% { opacity: 0.75; }
100% { opacity: 1; }
0% {
opacity: 1;
}
30% {
opacity: 0.75;
}
100% {
opacity: 1;
}
}
@media screen and (max-width: 630px) and (max-height: 400px) {
@@ -6658,7 +6705,9 @@ noscript {
.navigation-bar {
& > a:first-child {
will-change: margin-top, margin-left, margin-right, width;
transition: margin-top $duration $delay, margin-left $duration ($duration + $delay), margin-right $duration ($duration + $delay);
transition: margin-top $duration $delay,
margin-left $duration ($duration + $delay),
margin-right $duration ($duration + $delay);
}
& > .navigation-bar__profile-edit {
@@ -6669,15 +6718,12 @@ noscript {
.navigation-bar__actions {
& > .icon-button.close {
will-change: opacity transform;
transition:
opacity $duration * 0.5 $delay,
transform $duration $delay;
transition: opacity $duration * 0.5 $delay, transform $duration $delay;
}
& > .compose__action-bar .icon-button {
will-change: opacity transform;
transition:
opacity $duration * 0.5 $delay + $duration * 0.5,
transition: opacity $duration * 0.5 $delay + $duration * 0.5,
transform $duration $delay;
}
}
@@ -7677,7 +7723,11 @@ noscript {
&.active {
transition: all 100ms ease-in;
transition-property: background-color, color;
background-color: mix(lighten($ui-base-color, 12%), $ui-highlight-color, 80%);
background-color: mix(
lighten($ui-base-color, 12%),
$ui-highlight-color,
80%
);
.reactions-bar__item__count {
color: lighten($highlight-text-color, 8%);
@@ -7730,7 +7780,7 @@ noscript {
&.unread {
&::before {
content: "";
content: '';
position: absolute;
top: 0;
left: 0;
@@ -8258,14 +8308,14 @@ noscript {
counter-increment: list-counter;
&::before {
content: counter(list-counter) ".";
content: counter(list-counter) '.';
position: absolute;
left: 0;
}
}
ul > li::before {
content: "";
content: '';
position: absolute;
background-color: $darker-text-color;
border-radius: 50%;
@@ -174,7 +174,7 @@
&:hover::before {
z-index: -1;
content: "";
content: '';
position: absolute;
top: 0;
left: 0;
+27 -21
View File
@@ -299,7 +299,7 @@ code {
max-width: 100%;
height: auto;
border-radius: 4px;
background: url("images/void.png");
background: url('images/void.png');
&:last-child {
margin-bottom: 0;
@@ -384,7 +384,7 @@ code {
flex: 1 1 auto;
}
input[type="checkbox"] {
input[type='checkbox'] {
position: absolute;
left: 0;
top: 5px;
@@ -400,12 +400,12 @@ code {
border-radius: 4px;
}
input[type="text"],
input[type="number"],
input[type="email"],
input[type="password"],
input[type="url"],
input[type="datetime-local"],
input[type='text'],
input[type='number'],
input[type='email'],
input[type='password'],
input[type='url'],
input[type='datetime-local'],
textarea {
box-sizing: border-box;
font-size: 16px;
@@ -443,11 +443,11 @@ code {
}
}
input[type="text"],
input[type="number"],
input[type="email"],
input[type="password"],
input[type="datetime-local"] {
input[type='text'],
input[type='number'],
input[type='email'],
input[type='password'],
input[type='datetime-local'] {
&:focus:invalid:not(:placeholder-shown),
&:required:invalid:not(:placeholder-shown) {
border-color: lighten($error-red, 12%);
@@ -459,11 +459,11 @@ code {
color: lighten($error-red, 12%);
}
input[type="text"],
input[type="number"],
input[type="email"],
input[type="password"],
input[type="datetime-local"],
input[type='text'],
input[type='number'],
input[type='email'],
input[type='password'],
input[type='datetime-local'],
textarea,
select {
border-color: lighten($error-red, 12%);
@@ -567,7 +567,9 @@ code {
outline: 0;
font-family: inherit;
resize: vertical;
background: darken($ui-base-color, 10%) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 12%))}'/></svg>") no-repeat right 8px center / auto 16px;
background: darken($ui-base-color, 10%)
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 12%))}'/></svg>")
no-repeat right 8px center / auto 16px;
border: 1px solid darken($ui-base-color, 14%);
border-radius: 4px;
padding-left: 10px;
@@ -607,7 +609,11 @@ code {
right: 0;
bottom: 1px;
width: 5px;
background-image: linear-gradient(to right, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));
background-image: linear-gradient(
to right,
rgba(darken($ui-base-color, 10%), 0),
darken($ui-base-color, 10%)
);
}
}
}
@@ -995,7 +1001,7 @@ code {
flex: 1 1 auto;
}
input[type="text"] {
input[type='text'] {
background: transparent;
border: 0;
padding: 10px;
+3 -1
View File
@@ -1,5 +1,7 @@
.modal-layout {
background: $ui-base-color url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-lighter-color)}33"/></svg>') repeat-x bottom fixed;
background: $ui-base-color
url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-lighter-color)}33"/></svg>')
repeat-x bottom fixed;
display: flex;
flex-direction: column;
height: 100vh;
+6 -4
View File
@@ -64,8 +64,8 @@
max-width: calc(100% - 45px - 25px);
}
input[type="radio"],
input[type="checkbox"] {
input[type='radio'],
input[type='checkbox'] {
display: none;
}
@@ -73,7 +73,7 @@
flex: 1 1 auto;
}
input[type="text"] {
input[type='text'] {
display: block;
box-sizing: border-box;
width: 100%;
@@ -263,7 +263,9 @@
width: auto;
outline: 0;
font-family: inherit;
background: $simple-background-color url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(darken($simple-background-color, 14%))}'/></svg>") no-repeat right 8px center / auto 16px;
background: $simple-background-color
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(darken($simple-background-color, 14%))}'/></svg>")
no-repeat right 8px center / auto 16px;
border: 1px solid darken($simple-background-color, 14%);
border-radius: 4px;
padding: 6px 10px;
+12 -6
View File
@@ -229,8 +229,8 @@ body.rtl {
padding-right: 0;
}
.simple_form .check_boxes .checkbox input[type="checkbox"],
.simple_form .input.boolean input[type="checkbox"] {
.simple_form .check_boxes .checkbox input[type='checkbox'],
.simple_form .input.boolean input[type='checkbox'] {
left: auto;
right: 0;
}
@@ -268,12 +268,18 @@ body.rtl {
&::after {
right: auto;
left: 0;
background-image: linear-gradient(to left, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));
background-image: linear-gradient(
to left,
rgba(darken($ui-base-color, 10%), 0),
darken($ui-base-color, 10%)
);
}
}
.simple_form select {
background: darken($ui-base-color, 10%) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 12%))}'/></svg>") no-repeat left 8px center / auto 16px;
background: darken($ui-base-color, 10%)
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 12%))}'/></svg>")
no-repeat left 8px center / auto 16px;
}
.table th,
@@ -320,11 +326,11 @@ body.rtl {
}
.fa-chevron-left::before {
content: "\F054";
content: '\F054';
}
.fa-chevron-right::before {
content: "\F053";
content: '\F053';
}
.column-back-button__icon {
+1 -1
View File
@@ -138,7 +138,7 @@ a.button.logo-button {
}
.embed {
.status__content[data-spoiler="folded"] {
.status__content[data-spoiler='folded'] {
.e-content {
display: none;
}
+17 -14
View File
@@ -1,18 +1,18 @@
// Commonly used web colors
$black: #000000; // Black
$white: #ffffff; // White
$success-green: #79bd9a !default; // Padua
$error-red: #df405a !default; // Cerise
$warning-red: #ff5050 !default; // Sunset Orange
$gold-star: #ca8f04 !default; // Dark Goldenrod
$black: #000000; // Black
$white: #ffffff; // White
$success-green: #79bd9a !default; // Padua
$error-red: #df405a !default; // Cerise
$warning-red: #ff5050 !default; // Sunset Orange
$gold-star: #ca8f04 !default; // Dark Goldenrod
$red-bookmark: $warning-red;
// Values from the classic Mastodon UI
$classic-base-color: #282c37; // Midnight Express
$classic-primary-color: #9baec8; // Echo Blue
$classic-secondary-color: #d9e1e8; // Pattens Blue
$classic-highlight-color: #6364ff; // Brand purple
$classic-base-color: #282c37; // Midnight Express
$classic-primary-color: #9baec8; // Echo Blue
$classic-secondary-color: #d9e1e8; // Pattens Blue
$classic-highlight-color: #6364ff; // Brand purple
// Variables for defaults in UI
$base-shadow-color: $black !default;
@@ -23,10 +23,13 @@ $valid-value-color: $success-green !default;
$error-value-color: $error-red !default;
// Tell UI to use selected colors
$ui-base-color: $classic-base-color !default; // Darkest
$ui-base-lighter-color: lighten($ui-base-color, 26%) !default; // Lighter darkest
$ui-primary-color: $classic-primary-color !default; // Lighter
$ui-secondary-color: $classic-secondary-color !default; // Lightest
$ui-base-color: $classic-base-color !default; // Darkest
$ui-base-lighter-color: lighten(
$ui-base-color,
26%
) !default; // Lighter darkest
$ui-primary-color: $classic-primary-color !default; // Lighter
$ui-secondary-color: $classic-secondary-color !default; // Lightest
$ui-highlight-color: $classic-highlight-color !default;
// Variables for texts
+1 -1
View File
@@ -1,4 +1,4 @@
@use "sass:math";
@use 'sass:math';
.hero-widget {
margin-bottom: 10px;
+25 -3
View File
@@ -6,6 +6,15 @@ class PostStatusService < BaseService
MIN_SCHEDULE_OFFSET = 5.minutes.freeze
class UnexpectedMentionsError < StandardError
attr_reader :accounts
def initialize(message, accounts)
super(message)
@accounts = accounts
end
end
# Post a text status update, fetch and notify remote users mentioned
# @param [Account] account Account from which to post
# @param [Hash] options
@@ -21,6 +30,7 @@ class PostStatusService < BaseService
# @option [Doorkeeper::Application] :application
# @option [String] :idempotency Optional idempotency key
# @option [Boolean] :with_rate_limit
# @option [Enumerable] :allowed_mentions Optional array of expected mentioned account IDs, raises `UnexpectedMentionsError` if unexpected accounts end up in mentions
# @return [Status]
def call(account, options = {})
@account = account
@@ -72,14 +82,27 @@ class PostStatusService < BaseService
end
def process_status!
@status = @account.statuses.new(status_attributes)
process_mentions_service.call(@status, save_records: false)
safeguard_mentions!(@status)
# The following transaction block is needed to wrap the UPDATEs to
# the media attachments when the status is created
ApplicationRecord.transaction do
@status = @account.statuses.create!(status_attributes)
@status.save!
end
end
def safeguard_mentions!(status)
return if @options[:allowed_mentions].nil?
expected_account_ids = @options[:allowed_mentions].map(&:to_i)
unexpected_accounts = status.mentions.map(&:account).to_a.reject { |mentioned_account| expected_account_ids.include?(mentioned_account.id) }
return if unexpected_accounts.empty?
raise UnexpectedMentionsError.new('Post would be sent to unexpected accounts', unexpected_accounts)
end
def schedule_status!
status_for_validation = @account.statuses.build(status_attributes)
@@ -102,7 +125,6 @@ class PostStatusService < BaseService
def postprocess_status!
process_hashtags_service.call(@status)
process_mentions_service.call(@status)
Trends.tags.register(@status)
LinkCrawlWorker.perform_async(@status.id)
DistributionWorker.perform_async(@status.id)
+11 -8
View File
@@ -3,12 +3,13 @@
class ProcessMentionsService < BaseService
include Payloadable
# Scan status for mentions and fetch remote mentioned users, create
# local mention pointers, send Salmon notifications to mentioned
# remote users
# Scan status for mentions and fetch remote mentioned users,
# and create local mention pointers
# @param [Status] status
def call(status)
# @param [Boolean] save_records Whether to save records in database
def call(status, save_records: true)
@status = status
@save_records = save_records
return unless @status.local?
@@ -55,14 +56,15 @@ class ProcessMentionsService < BaseService
next match if mention_undeliverable?(mentioned_account) || mentioned_account&.suspended?
mention = @previous_mentions.find { |x| x.account_id == mentioned_account.id }
mention ||= mentioned_account.mentions.new(status: @status)
mention ||= @current_mentions.find { |x| x.account_id == mentioned_account.id }
mention ||= @status.mentions.new(account: mentioned_account)
@current_mentions << mention
"@#{mentioned_account.acct}"
end
@status.save!
@status.save! if @save_records
end
def assign_mentions!
@@ -73,11 +75,12 @@ class ProcessMentionsService < BaseService
mentioned_account_ids = @current_mentions.map(&:account_id)
blocked_account_ids = Set.new(@status.account.block_relationships.where(target_account_id: mentioned_account_ids).pluck(:target_account_id))
@current_mentions.select! { |mention| !(blocked_account_ids.include?(mention.account_id) || blocked_domains.include?(mention.account.domain)) }
dropped_mentions, @current_mentions = @current_mentions.partition { |mention| blocked_account_ids.include?(mention.account_id) || blocked_domains.include?(mention.account.domain) }
dropped_mentions.each(&:destroy)
end
@current_mentions.each do |mention|
mention.save if mention.new_record?
mention.save if mention.new_record? && @save_records
end
# If previous mentions are no longer contained in the text, convert them
+1 -1
View File
@@ -37,7 +37,7 @@
.dashboard__counters__num= number_to_human_size @account.media_attachments.sum('file_file_size')
.dashboard__counters__label= t 'admin.accounts.media_attachments'
%div
= link_to admin_account_relationships_path(@account.id, location: 'local', relationship: 'followed_by') do
= link_to admin_account_relationships_path(@account.id, location: @account.local? ? nil : 'local', relationship: 'followed_by') do
.dashboard__counters__num= number_with_delimiter @account.local_followers_count
.dashboard__counters__label= t 'admin.accounts.followers'
%div