Merge commit '73b64b89170cb72854a1709186c62ce31f476889' into glitch-soc/merge-upstream
Conflicts: - `app/javascript/styles/fonts/roboto-mono.scss`: Upstream updated the linter, which changed a few linter rules. Some of those changed lines are different in glitch-soc because we use different paths for the assets. Applied the same style rules on our version of the file. - `app/javascript/styles/fonts/roboto.scss`: Upstream updated the linter, which changed a few linter rules. Some of those changed lines are different in glitch-soc because we use different paths for the assets. Applied the same style rules on our version of the file.
This commit is contained in:
commit
95a1fde6b6
|
@ -32,7 +32,7 @@ export const AnimatedNumber: React.FC<Props> = ({ value, obfuscate }) => {
|
|||
const willEnter = useCallback(() => ({ y: -1 * direction }), [direction]);
|
||||
const willLeave = useCallback(
|
||||
() => ({ y: spring(1 * direction, { damping: 35, stiffness: 400 }) }),
|
||||
[direction]
|
||||
[direction],
|
||||
);
|
||||
|
||||
if (reduceMotion) {
|
||||
|
|
|
@ -4,7 +4,7 @@ import { FormattedMessage } from 'react-intl';
|
|||
|
||||
export const StatusesCounter = (
|
||||
displayNumber: React.ReactNode,
|
||||
pluralReady: number
|
||||
pluralReady: number,
|
||||
) => (
|
||||
<FormattedMessage
|
||||
id='account.statuses_counter'
|
||||
|
@ -18,7 +18,7 @@ export const StatusesCounter = (
|
|||
|
||||
export const FollowingCounter = (
|
||||
displayNumber: React.ReactNode,
|
||||
pluralReady: number
|
||||
pluralReady: number,
|
||||
) => (
|
||||
<FormattedMessage
|
||||
id='account.following_counter'
|
||||
|
@ -32,7 +32,7 @@ export const FollowingCounter = (
|
|||
|
||||
export const FollowersCounter = (
|
||||
displayNumber: React.ReactNode,
|
||||
pluralReady: number
|
||||
pluralReady: number,
|
||||
) => (
|
||||
<FormattedMessage
|
||||
id='account.followers_counter'
|
||||
|
|
|
@ -32,7 +32,7 @@ export const GIFV: React.FC<Props> = ({
|
|||
onClick();
|
||||
}
|
||||
},
|
||||
[onClick]
|
||||
[onClick],
|
||||
);
|
||||
|
||||
return (
|
||||
|
|
|
@ -108,7 +108,7 @@ export const timeAgoString = (
|
|||
now: number,
|
||||
year: number,
|
||||
timeGiven: boolean,
|
||||
short?: boolean
|
||||
short?: boolean,
|
||||
) => {
|
||||
const delta = now - date.getTime();
|
||||
|
||||
|
@ -118,28 +118,28 @@ export const timeAgoString = (
|
|||
relativeTime = intl.formatMessage(messages.today);
|
||||
} else if (delta < 10 * SECOND) {
|
||||
relativeTime = intl.formatMessage(
|
||||
short ? messages.just_now : messages.just_now_full
|
||||
short ? messages.just_now : messages.just_now_full,
|
||||
);
|
||||
} else if (delta < 7 * DAY) {
|
||||
if (delta < MINUTE) {
|
||||
relativeTime = intl.formatMessage(
|
||||
short ? messages.seconds : messages.seconds_full,
|
||||
{ number: Math.floor(delta / SECOND) }
|
||||
{ number: Math.floor(delta / SECOND) },
|
||||
);
|
||||
} else if (delta < HOUR) {
|
||||
relativeTime = intl.formatMessage(
|
||||
short ? messages.minutes : messages.minutes_full,
|
||||
{ number: Math.floor(delta / MINUTE) }
|
||||
{ number: Math.floor(delta / MINUTE) },
|
||||
);
|
||||
} else if (delta < DAY) {
|
||||
relativeTime = intl.formatMessage(
|
||||
short ? messages.hours : messages.hours_full,
|
||||
{ number: Math.floor(delta / HOUR) }
|
||||
{ number: Math.floor(delta / HOUR) },
|
||||
);
|
||||
} else {
|
||||
relativeTime = intl.formatMessage(
|
||||
short ? messages.days : messages.days_full,
|
||||
{ number: Math.floor(delta / DAY) }
|
||||
{ number: Math.floor(delta / DAY) },
|
||||
);
|
||||
}
|
||||
} else if (date.getFullYear() === year) {
|
||||
|
@ -158,7 +158,7 @@ const timeRemainingString = (
|
|||
intl: IntlShape,
|
||||
date: Date,
|
||||
now: number,
|
||||
timeGiven = true
|
||||
timeGiven = true,
|
||||
) => {
|
||||
const delta = date.getTime() - now;
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ import { toShortNumber, pluralReady, DECIMAL_UNITS } from '../utils/numbers';
|
|||
|
||||
type ShortNumberRenderer = (
|
||||
displayNumber: JSX.Element,
|
||||
pluralReady: number
|
||||
pluralReady: number,
|
||||
) => JSX.Element;
|
||||
|
||||
interface ShortNumberProps {
|
||||
|
@ -25,7 +25,7 @@ export const ShortNumberRenderer: React.FC<ShortNumberProps> = ({
|
|||
|
||||
if (children && renderer) {
|
||||
console.warn(
|
||||
'Both renderer prop and renderer as a child provided. This is a mistake and you really should fix that. Only renderer passed as a child will be used.'
|
||||
'Both renderer prop and renderer as a child provided. This is a mistake and you really should fix that. Only renderer passed as a child will be used.',
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@ export type SearchData = [
|
|||
BaseEmoji['native'],
|
||||
Emoji['short_names'],
|
||||
Search,
|
||||
Emoji['unified']
|
||||
Emoji['unified'],
|
||||
];
|
||||
|
||||
export interface ShortCodesToEmojiData {
|
||||
|
@ -38,7 +38,7 @@ export type EmojiCompressed = [
|
|||
Skins,
|
||||
Category[],
|
||||
Data['aliases'],
|
||||
EmojisWithoutShortCodes
|
||||
EmojisWithoutShortCodes,
|
||||
];
|
||||
|
||||
/*
|
||||
|
|
|
@ -12,7 +12,7 @@ if (!HTMLCanvasElement.prototype.toBlob) {
|
|||
this: HTMLCanvasElement,
|
||||
callback: BlobCallback,
|
||||
type = 'image/png',
|
||||
quality: unknown
|
||||
quality: unknown,
|
||||
) {
|
||||
const dataURL: string = this.toDataURL(type, quality);
|
||||
let data;
|
||||
|
|
|
@ -99,7 +99,7 @@ const initialRootState = Object.fromEntries(
|
|||
reducer(undefined, {
|
||||
// empty action
|
||||
}),
|
||||
])
|
||||
]),
|
||||
);
|
||||
|
||||
const RootStateRecord = ImmutableRecord(initialRootState, 'RootState');
|
||||
|
|
|
@ -35,7 +35,7 @@ interface PopModalOption {
|
|||
}
|
||||
const popModal = (
|
||||
state: State,
|
||||
{ modalType, ignoreFocus }: PopModalOption
|
||||
{ modalType, ignoreFocus }: PopModalOption,
|
||||
): State => {
|
||||
if (
|
||||
modalType === undefined ||
|
||||
|
@ -52,12 +52,12 @@ const popModal = (
|
|||
const pushModal = (
|
||||
state: State,
|
||||
modalType: ModalType,
|
||||
modalProps: ModalProps
|
||||
modalProps: ModalProps,
|
||||
): State => {
|
||||
return state.withMutations((record) => {
|
||||
record.set('ignoreFocus', false);
|
||||
record.update('stack', (stack) =>
|
||||
stack.unshift(Modal({ modalType, modalProps }))
|
||||
stack.unshift(Modal({ modalType, modalProps })),
|
||||
);
|
||||
});
|
||||
};
|
||||
|
@ -68,14 +68,14 @@ export function modalReducer(
|
|||
modalType: ModalType;
|
||||
ignoreFocus: boolean;
|
||||
modalProps: Record<string, unknown>;
|
||||
}>
|
||||
}>,
|
||||
) {
|
||||
switch (action.type) {
|
||||
case openModal.type:
|
||||
return pushModal(
|
||||
state,
|
||||
action.payload.modalType,
|
||||
action.payload.modalProps
|
||||
action.payload.modalProps,
|
||||
);
|
||||
case closeModal.type:
|
||||
return popModal(state, action.payload);
|
||||
|
@ -85,8 +85,8 @@ export function modalReducer(
|
|||
return state.update('stack', (stack) =>
|
||||
stack.filterNot(
|
||||
// @ts-expect-error TIMELINE_DELETE action is not typed yet.
|
||||
(modal) => modal.get('modalProps').statusId === action.id
|
||||
)
|
||||
(modal) => modal.get('modalProps').statusId === action.id,
|
||||
),
|
||||
);
|
||||
default:
|
||||
return state;
|
||||
|
|
|
@ -3,12 +3,12 @@ const easingOutQuint = (
|
|||
t: number,
|
||||
b: number,
|
||||
c: number,
|
||||
d: number
|
||||
d: number,
|
||||
) => c * ((t = t / d - 1) * t * t * t * t + 1) + b;
|
||||
const scroll = (
|
||||
node: Element,
|
||||
key: 'scrollTop' | 'scrollLeft',
|
||||
target: number
|
||||
target: number,
|
||||
) => {
|
||||
const startTime = Date.now();
|
||||
const offset = node[key];
|
||||
|
|
|
@ -30,7 +30,7 @@ export const store = configureStore({
|
|||
.concat(
|
||||
loadingBarMiddleware({
|
||||
promiseTypeSuffixes: ['REQUEST', 'SUCCESS', 'FAIL'],
|
||||
})
|
||||
}),
|
||||
)
|
||||
.concat(errorsMiddleware)
|
||||
.concat(soundsMiddleware()),
|
||||
|
|
|
@ -14,7 +14,7 @@ const defaultTypeSuffixes: Config['promiseTypeSuffixes'] = [
|
|||
];
|
||||
|
||||
export const loadingBarMiddleware = (
|
||||
config: Config = {}
|
||||
config: Config = {},
|
||||
): Middleware<Record<string, never>, RootState> => {
|
||||
const promiseTypeSuffixes = config.promiseTypeSuffixes || defaultTypeSuffixes;
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ const buildHashtagPatternRegex = () => {
|
|||
try {
|
||||
return new RegExp(
|
||||
`(?:^|[^\\/\\)\\w])#(([${WORD}_][${WORD}${HASHTAG_SEPARATORS}]*[${ALPHA}${HASHTAG_SEPARATORS}][${WORD}${HASHTAG_SEPARATORS}]*[${WORD}_])|([${WORD}_]*[${ALPHA}][${WORD}_]*))`,
|
||||
'iu'
|
||||
'iu',
|
||||
);
|
||||
} catch {
|
||||
return /(?:^|[^/)\w])#(\w*[a-zA-Z·]\w*)/i;
|
||||
|
@ -17,7 +17,7 @@ const buildHashtagRegex = () => {
|
|||
try {
|
||||
return new RegExp(
|
||||
`^(([${WORD}_][${WORD}${HASHTAG_SEPARATORS}]*[${ALPHA}${HASHTAG_SEPARATORS}][${WORD}${HASHTAG_SEPARATORS}]*[${WORD}_])|([${WORD}_]*[${ALPHA}][${WORD}_]*))$`,
|
||||
'iu'
|
||||
'iu',
|
||||
);
|
||||
} catch {
|
||||
return /^(\w*[a-zA-Z·]\w*)$/i;
|
||||
|
|
|
@ -55,7 +55,7 @@ export function toShortNumber(sourceNumber: number): ShortNumber {
|
|||
*/
|
||||
export function pluralReady(
|
||||
sourceNumber: number,
|
||||
division: DecimalUnits
|
||||
division: DecimalUnits,
|
||||
): number {
|
||||
if (division == null || division < DECIMAL_UNITS.HUNDRED) {
|
||||
return sourceNumber;
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
@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'),
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
@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'),
|
||||
|
@ -13,7 +14,8 @@
|
|||
|
||||
@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'),
|
||||
|
@ -26,7 +28,8 @@
|
|||
|
||||
@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'),
|
||||
|
@ -39,7 +42,8 @@
|
|||
|
||||
@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'),
|
||||
|
|
|
@ -31,9 +31,19 @@ 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 {
|
||||
|
|
|
@ -747,7 +747,9 @@ body > [data-popper-placement] {
|
|||
}
|
||||
|
||||
.no-reduce-motion .spoiler-input {
|
||||
transition: height 0.4s ease, opacity 0.4s ease;
|
||||
transition:
|
||||
height 0.4s ease,
|
||||
opacity 0.4s ease;
|
||||
}
|
||||
|
||||
.sign-in-banner {
|
||||
|
@ -3954,7 +3956,9 @@ a.status-card.compact:hover {
|
|||
overflow-y: auto;
|
||||
border-bottom: 1px solid lighten($ui-base-color, 8%);
|
||||
color: $darker-text-color;
|
||||
transition: max-height 150ms ease-in-out, opacity 300ms linear;
|
||||
transition:
|
||||
max-height 150ms ease-in-out,
|
||||
opacity 300ms linear;
|
||||
opacity: 1;
|
||||
z-index: 1;
|
||||
position: relative;
|
||||
|
@ -6935,7 +6939,8 @@ noscript {
|
|||
.navigation-bar {
|
||||
& > a:first-child {
|
||||
will-change: margin-top, margin-inline-start, margin-inline-end, width;
|
||||
transition: margin-top $duration $delay,
|
||||
transition:
|
||||
margin-top $duration $delay,
|
||||
margin-inline-start $duration ($duration + $delay),
|
||||
margin-inline-end $duration ($duration + $delay);
|
||||
}
|
||||
|
@ -6948,12 +6953,15 @@ 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;
|
||||
}
|
||||
}
|
||||
|
@ -9094,7 +9102,8 @@ noscript {
|
|||
backdrop-filter: blur(8px);
|
||||
border: 1px solid rgba(lighten($classic-base-color, 4%), 0.85);
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 10px 15px -3px rgba($base-shadow-color, 0.25),
|
||||
box-shadow:
|
||||
0 10px 15px -3px rgba($base-shadow-color, 0.25),
|
||||
0 4px 6px -4px rgba($base-shadow-color, 0.25);
|
||||
cursor: default;
|
||||
transition: 0.5s cubic-bezier(0.89, 0.01, 0.5, 1.1);
|
||||
|
|
|
@ -194,7 +194,7 @@
|
|||
"eslint-plugin-import": "~2.27.5",
|
||||
"eslint-plugin-jsdoc": "^46.1.0",
|
||||
"eslint-plugin-jsx-a11y": "~6.7.1",
|
||||
"eslint-plugin-prettier": "^4.2.1",
|
||||
"eslint-plugin-prettier": "^5.0.0",
|
||||
"eslint-plugin-promise": "~6.1.1",
|
||||
"eslint-plugin-react": "~7.32.2",
|
||||
"eslint-plugin-react-hooks": "^4.6.0",
|
||||
|
@ -202,7 +202,7 @@
|
|||
"jest": "^29.5.0",
|
||||
"jest-environment-jsdom": "^29.5.0",
|
||||
"lint-staged": "^13.2.2",
|
||||
"prettier": "^2.8.8",
|
||||
"prettier": "^3.0.0",
|
||||
"react-test-renderer": "^18.2.0",
|
||||
"stylelint": "^15.10.1",
|
||||
"stylelint-config-standard-scss": "^10.0.0",
|
||||
|
|
18
yarn.lock
18
yarn.lock
|
@ -5145,12 +5145,13 @@ eslint-plugin-jsx-a11y@~6.7.1:
|
|||
object.fromentries "^2.0.6"
|
||||
semver "^6.3.0"
|
||||
|
||||
eslint-plugin-prettier@^4.2.1:
|
||||
version "4.2.1"
|
||||
resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b"
|
||||
integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==
|
||||
eslint-plugin-prettier@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz#6887780ed95f7708340ec79acfdf60c35b9be57a"
|
||||
integrity sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==
|
||||
dependencies:
|
||||
prettier-linter-helpers "^1.0.0"
|
||||
synckit "^0.8.5"
|
||||
|
||||
eslint-plugin-promise@~6.1.1:
|
||||
version "6.1.1"
|
||||
|
@ -9320,10 +9321,10 @@ prettier-linter-helpers@^1.0.0:
|
|||
dependencies:
|
||||
fast-diff "^1.1.2"
|
||||
|
||||
prettier@^2.8.8:
|
||||
version "2.8.8"
|
||||
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da"
|
||||
integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
|
||||
prettier@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.0.tgz#e7b19f691245a21d618c68bc54dc06122f6105ae"
|
||||
integrity sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==
|
||||
|
||||
pretty-bytes@^5.3.0, pretty-bytes@^5.4.1:
|
||||
version "5.6.0"
|
||||
|
@ -10916,6 +10917,7 @@ stringz@^2.1.0:
|
|||
char-regex "^1.0.2"
|
||||
|
||||
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
|
||||
name strip-ansi-cjs
|
||||
version "6.0.1"
|
||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
||||
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
||||
|
|
Reference in New Issue